pax_global_header00006660000000000000000000000064150665275640014532gustar00rootroot0000000000000052 comment=5cf8b2fe16349d8b95948443e796dccd817e9068 yoshimi-2.3.5.1/000077500000000000000000000000001506652756400133615ustar00rootroot00000000000000yoshimi-2.3.5.1/CHECK_ON_RELEASE000066400000000000000000000033341506652756400156600ustar00rootroot00000000000000 ***** VERY IMPORTANT ***** Test headless build. Test clean build with clang. Ensure all new files have been added to commit!!! Don't forget to create and push the tag on releases! use /usr/bin/appstream-util validate {file} to check metadata. Get images from: https://yoshimi.sourceforge.io/docs/user-guide /src/CMakeLists.txt Ensure version number is correct. Disable extra compiler tests. Before the commit (but after build) run the python file: run 'sh set' to update build number and guide. This will ensure the guide has the correct version number. /desktop/yoshimi.1 Ensure version number and dates are correct. Check for any changes in info or commands. /desktop/metainfo/yoshimi.metainfo.xml Ensure version number and dates are correct. Check that urls for images are correct. Check contact details. /dev-notes Ensure these notes are up-to-date - especially ToDo.txt /doc Ensure these are up-to-date - especially check yoshimi-user-manual is up to date and has the correct version number. Move Yoshimi_2.n.x_features.txt into doc/Histories and replace with new one for the current version. Changelog Make sure the top line is the current release, not rc! README.txt/README.md Update! set tag to release version. push to both github and sourceforge. Some of the Yoshimi Pi units out in the wild are set to the 'yoshipi' branch. This is synchronised with the latest release version, so allows those users to update without needing to know anything about the code. Therefore, switch to the yoshipi branch and rebase this to the current release pushing it to both github and sourceforge. After commit release Update wikipedia entry. Tell everyone :) yoshimi-2.3.5.1/COPYING000066400000000000000000001426541506652756400144300ustar00rootroot00000000000000Foreword: For a time there was confusion over the precise license version applicable to Yoshimi. It has been confirmed as Version 2, or (at your option) any later version. ========================================================================== GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ========================================================================== GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . yoshimi-2.3.5.1/Changelog000066400000000000000000010274601506652756400152050ustar00rootroot00000000000000yoshimi 2.3.5.1 2025-9-29 Will bn 2408 BugFix: Banks not showing Yoshimi type instrument colour. BugFix: Off by 1 errors in CLI - envelope code. Set bugfix version 2.3.5.1 2025-9-27 Will bn 2407 Replaced rotary knob change with improved version from Jesper. 2025-9-26 Will bn 2406 Some final cleanups and doc. updates. Set release version 2.3.5 2025-9-25 Will bn 2405 Corrected rotary knob scaling for fltk 1.4 Bugfix: not showing correct colour for yoshimi instruments. set version as 2.3.5 rc3 2025-9-21 Will bn 2403 BugFix: Main window top controls partially obscured. 2025-9-18 Will bn 2402 Final preparations for the next release. Updated docs. 2025-9-17 Will bn 2400 Made small adjustments to tooltip sizes. Min. is 12 point, and large sizes track a bit better. 2025-9-3 Will bn 2399 Merged in SubSynth LFO work from Kristian Adjusted Mixer panel VU limits for FLTK 1.4.x compatibility. Updated User Guide. 2025-8-30 Will bn 2398 Added missing include file to LV2 cmake file 2025-8-27 Jesper bn 2397 Adjusted tooltip positioning to handle cursor placements close to bottom of screen. 2025-8-27 Will bn 2396 Added scale tracking to Random Walk window 2025-8-24 Jesper bn 2395 Added scale tracking and tooltip size adjustment based on window under cursor. 2025-7-23 Will bn 2394 Added Slow Cymbal instrument to Drums bank. Preliminary work on CLI reading freemode points. Updated various docs. 2025-7-17 Will bn 2393 Merged in freemode midi learn from Kristian. Clarified MIDI learn action in the HTML user guide Merged in user guide image optimisation from Jesper. Added Slow Cymbal the Drums bank. 2025-6-10 Will + Hermann bn 2392 Corrected tooltip for "Enable Part Reports". Corrected some log requests using numbers instead of labels. Fixed erroneous clearing of partsChanged flag on config changes. Fixed regression - MidiLearn not recognising older files. Re-ordered grouping of some part controls. Updated Control Data. Set bugfix release version 2.3.4.1 2025-6-9 Will bn 2391 Final cleanups Set release version 2.3.4 2025-6-7 Will bn 2390 Implemented new control "Warn parts changed" defaults to disabled. Set version 2.3.4 rc2 2025-6-7 Will bn 2389 Changed wording of Hide Non-fatal Errors to Hide Non-essential reports. Corrected accidentally changed Part label in globals.h 2025-6-7 Will Tested LV2 for Ardour and Qtractor. Prepared background doccumentation. Further adjustments to user guide. 2025-6-6 Will bn 2388 Updated HTML user guide. Set version 2.3.4 rc1 2025-6-6 Will bn 2387 Merged in changed parts warnings from parts branch. 2025-5-26 Will bn 2386 Fixed Omni CLI off by one error and clarified messages. Added Fl/platform.H to MiscGui.cpp and WidgetPDial.cpp for FLTK V1.4 compatibility. Removed some long redundant commented out code. Updated some theme example files. Added Fiddle Kit to Strings bank. Added Hollow Pulse to Will_Godfrey_Companion bank. 2025-5-9 Will bn 2385 Removed redundant and commented YoshiWin code. Removed unnecessary FL.x entry in WidgetPDial. 2025-4-8 Will bn 2384 Merged in Omni control from Kristian made a couple of minor updates. 2025-2-26 Will bn 2382 Added tooltip to main window menu bar. Set bugfix release to 2.3.3.3 Added canaries (currently disabled) YoshimiLV2Pligin.cpp lines 293 - 298, 634 Interchange.cpp line 1840 2025-2-7 Will bn 2381 BugFix: Cmake failing on Suse building. 2025-2-3 Will bn 2380 Merged in LV2 updates from Kristian BugFix: Reports destination changes not being saved. 2025-2-2 Will bn 2379 Display labels defined in TextLists, global.h and described in Control Data 2025-1-23 Will bn 2378 Further work on new Display controls Currently only stand-alone and accessible from zread. Now checks for GUI enabled, and valid part level. 2025-1-21 Will bn 2377 Renamed new Geometry section to Display. Added theme control placeholder values. Implemented mininum controls to report skeleton use in interchange.cpp Partially updated Control Data entries. 2025-1-14 Will bn 2376 Installed placeholder for new Window Geometry code. Added new bank entries to Drums and Pads. Further adjustments to textlists.cpp 2025-1-3 Will bn 2375 Cleanups and consistency adjustments to textlists.cpp. 2025-1-3 Will bn 2374 Bugfix: formant filter graph - wrong response to R mouse click. Bugfix: formant filter graph - wrong response to mouse wheel. 2024-12-30 Will Minor code cleanups - removal of redundant code dev_notes updates and corrections. 2024-12-27 Will bn 2373 Changed Main window instrument display format to Bold. Saving a Bank Root can now create a new directory on the fly. New CLI test entry 'zset' creates a SubSynth instrument. CLI test entry'zread' formalised. Updated min. cmake to 2.12 Updated dev_notes. Updated HTML Control Data. 2024-12-03 Will bn 2372 Merged in further improvements from Hermamm. Set bugfix release version 2.3.3.2 2024-12-02 Will bn 2371 BugFix: Startup fails on pristine installs. 2024-11-30 Will bn 2370 BugFix: Not clearing 'old' config status unless change made. Minor corrections to HTML User Guide. 2024-11-20 Will bn 2369 BugFix: Loading a preset via the CLI not checking file exists so might crash. Minor adjustment to TextLists.cpp 2024-11-15 Will bn 2368 Resolved further MasterUI/VectorUI inconsistencies. Resolved more direct calls in MasterUI and MiscMasterUI. Updated HTML Control Data. 2024-11-13 Will bn 2367 Further work on interaction between MasterUI and VectorUI. Still a few anomalies regarding number of parts :( 2024-11-12 Will bn 2366 Added formal method of testing CCs against known ones. Enabled reading vector X & Y features as groups. Resolved 2 overlooked direct calls in VectorUI. Updated HTML Control Data. 2024-11-10 Will bn 2365 Implimented new part control to discover active engines. Used by VectorUI, PartUI, Master() VectorUI no longer makes direct calls into the synth. Updated HTML Control Data Established full sync between Main window and Vectors. 2024-11-8 Will bn 2364 BugFix: Main and Panel windows getting out of sync. Removed GUI 'active part' and instead kept npart in sync. Mostly in sync now, but Vector control not correct. 2024-11-6 Will bn 2363 Minor doc updates. 2024-11-2 Will bn 2363 Parts only respond to MIDI CC input if enabled. However the MIDI GUI may still respond as it is set at channel level before part selection. Ensure manual search gets most recent version. Doc Updates 2024-10-1 Will bn 2362 Created 'non-install_README' and 'copydocs.sh' to give self-builders wanting to run without installing the means to get docs and banks in a place Yoshimi can find them. 2024-10-10 Will bn 2361 Commented out manual search in 'home' directory. 2024-9-25 Will + Hermann bn 2360 Included bugfixes from Hermann. Corrected some minor doc typos. Set bugfix release version 2.3.3.1 2024-9-23 bn 2359 Final testing and doc updates Set release version 2.3.3 2024-9-21 Will + Hermann bn 2358 Initial preparations for release. BugFix: init audio/midi device names before opening the backend. Set version as 2.3.3 rc3 2024-9-20 Will bn 2357 BugFix: Not honouring last seen mixer panel format. Further updates to mixer panel control. Set version as 2.3.3 rc2 2024-9-19 Will bn 2356 Revised panel window control, reinstating link between MasterUI and ConfigUI for this. 2024-9-18 Will bn 2355 Set version as 2.3.3 rc1 Made corrections and updates to HTML user guide. Updated /Util/ programs and notes. Included BugFix from Hermann. 2024-9-16 Will bn 2354 Added missing conversion for note time reporting (only seen when activated at build time) clarified Build time labels Removed System Effects C/P buttons de-activation Corrected history location comment in globals.h 2024-9-15 Hermann bn 2353 Rework main() to introduce an InstanceManager. * Instances of SynthEngine and MusicIO maintained with lifecycle state * Start-up, GUI connection and post-boot-hook rearranged * request to start a new instance always via command system * remove FLTK messaging and locking, rework LV2 plugin top-level 2024-9-7 Will bn 2352 Updated HTML User Guide images to reflect current appearance. 2024-9-5 Will bn 2351 BugFix: mixer panel not updating with correct colours. MasterUI was duplicating MasterMiscUI and hadn't had background colours changed. More work on high contrast theme. 2024-9-2 Will bn 2350 Revised theme colour control, providing better bank colours. Also started development of high contrast theme. 2024-8-25 Will bn 2349 Most keyboard shortcuts (alt+underlined) at the first couple of context levels now working. User guide partly updated - not graphics. 2024-8-22 Will bn 2348 Theme tab now changes its own display when setting 'Monochrome'. Removed non-working event handler in PartUI. 2024-8-16 Will bn 2347 BugFix: temporary fix for segfault in SubSynth See src/Synth/SUBnote.cpp/initparameters( Changed new drum sound name from: Pitched Bass Drum to: Soft Bass Drum Updated HTML User Guide 2024-8-6 Will bn 2346 Corrected State menu options. Further adjustments to zread. Improved and added to keyboard shortcuts. Updated User Guide. 2024-7-30 Will bn 2345 Revised CLI zread - now includes offset. Updated dev_notes 2024-7-22 Will bn 2344 Revised and simplified CLI Y/N query code. A few updates to User Guide. 2024-7-18 Will bn 2343 BugFix: Config code not correctly readingXML getPar( 2024-7-15 Will bn 2342 Removed redundant CLI common controls list. Updated User Guide. 2024-7-12 Will bn 2341 Added synTaiko to banks/Drums. Uodate User Guide (miscellany). Cosmetic changes to some windows. 2024-7-9 Will bn 2340 file::isDirectory() now reports the last change time. Adding or removing themes now updates the window. 2024-7-1 Will bn 2339 Corrected minor errors in HTML Control Data files. Added red-tint-clr to doc/examples. 2024-6-27 Will bn 2338 Some minor GUI cleanups. Clarifed some comments in FileMgrFuncs.h Doc updates. 2024-6-21 Will bn 2337 Removed some redundant UI 'damage()' calls. All spinbox arrows now show correct colour. Arrows also rescale nicely. Corrected UI/WidgetSpinner copyright info. 2024-6-20 Will bn 2336 Theme changes now auto-detected. 2024-6-19 Will bn 2335 BugFix: Scales->Center *doesn't* need microtonal to be enabled. Temporarily disabled delay in PartUI->fxRtext() Temporarily disabled delay in EffUI from line 2691. Theme changes no longer close and reopen windows. Revised some theme labels for improved clarity. 2024-6-16 Will bn 2334 Config->Theme 'monchrome' button now takes immediate effect. Updated HTML guide. 2024-6-9 Will bn 2333 Merged in crossfade branch. Updated CmakeLists.txt for min version 3.5 Moved project name down below primary cmake commands. Further refined crossfade action. Changed internal note velocity to float. Added internal note volume. Performed initial separation of crossfade multiplier from fade type. 2024-6-2 Will bn 2332 BugFix: Not saving root and bank changes. Updated Control Data. 2024-5-26 Will bn 2331 Changed crossfade ID to uchar crossfadeType ready for alternative types, reading and retaining old saved xml bool type for backward compatibility. Added superFat instument to 'companion' and updated user guide. 2024-5-24 Will bn 2330 Updated some dev-notes. Clarified microtonal error reporting. Commented out test messages in updateConfig. 2024-5-6 Will bn 2329 BugFix: Not updating 'banks_checked' in config file. 2024-5-3 Will bn 2328 Updated config images in user guide. Re-ordered early guide entries. Added a proper 'Monochrome' button to themes. Adjusted EQ window sizes to match others. 2024-4-24 Will bn 2327 Applied instrument change GUI bugfix patch from Hermann. Removed some now redundant config change notification code. 2024-4-21 Will bn 2326 Removed all reference to singleRowPanel. All currently defined config setting now immediate. Updated GUI. Disabled automatic config save on exit. User manual location now properly integrated into config. 2024-4-19 Will bn 2325 Structure of UpdateConfig now complete. Just details to fill in now. Added missing Control Data entries. Corrected some Control Data labels. Collapsed config numbers from 'defaultStateStert' onwards. 2024-4-17 Will Further revision of base config for better isolation and correctness. 2024-4-13 Will bn 2324 Reorganised control values for config so all base ones are together and order in files matches list order. Removed 'check_pad_synth' from config. It's not been relevant for years! Most of base config now changed immediately. Updated Control Data 2024-3-30 Will bn 2323 CLI startup disabling GUI is now temporary and not marked changed. CLI startup disabling itself is now temporary and not marked changed. Started work on immediate saving of config changes (not yet active). 2024-3-24 Will Added missing .xiy file needed for Dooo Flute. Added True Drawbars instrument. Updated User Guide. 2024-3-22 Will bn 2322 Added more instruments to Drums and Noises Updated User Guide System effect sends now show percentages MIDI CCs now show percentages Master window volume panning velocity show real values 2024-3-17 Will bn 2321 Split off config state loading from LV2 **Reverted this change** BugFix: "Enable Single Master" accesssable on secondary instances. Removed (now redundant) disabled code from SynthEngine.cpp Also removed long unused SSE code from Config.cpp 2024-3-11 Will bn 2320 BugFix: CLI not recognising 'type' returned by limits code. BugFix: Master detune not identified as float type. BugFix: CLI not checking XML copmpression range. Forced type to integer for all CLI config tests. Moved config limits from SynthEngine to Config. Don't seem to be used anywhere though. Transfered Vector load/save from SynthEngine to new /Interchange/Vectors 2024-3-7 Will bn 2319 Merged in new GUI/core interface from Hermann Cleaned up some doccumentation Set CMakeLists for (usually) faster GUI compilation 2024-2-19 Will bn 2318 Final cleanups Set release version 2.3.2 2024-2-18 Will bn 2317 Some small CLI text corrections Updated HTML guide Cleaned up some coding style inconsistencies No code changes Set minimum C++ standard as 17 Updated copyright notices 2024-2-17 Will bn 2316 BugFix: From Kristian: Missing file in LV2 code BugFix: From Kristian: Incorrect Kitmode GUI setting Set version 2.3.2 rc2 2024-2-14 Will bn 2315 BugFix: Wrong default for insert type chorus volume. BugFix: New echo separate button text not scaled. BugFix: Effects text not rescaled if opened at large size. BugFix: Sys/Ins not rescaled if window resized when hidden. Updated Yoshimi Control data. Finalised integration of separate L/R Echo repeat rates. Revised some of the User Guide. Added some instrument patches. 2024-2-11 Will bn 2314 Merged in Kristian's improvements Updated Yoshimi Control Data 2024-2-9 Will bn 2313 Build option ReportNoteTimes now working properly. Various small GUI refinements and cleanups. 2024-2-8 Will bn 2312 CLI can now handle master volume and master detune as floats. Completed conversion of normal SubSynth controls. Paste function correctly positions all controls. 2024-2-6 Will bn 2311 Working through conversion of normal SubSynth controls. 2024-2-4 Will Added "Major control updates on window refresh" to dev_notes 2024-1-29 Will bn 2310 Trial of SubSynth slider bank update. Forgot a bit! 2024-1-21 Will bn 2309 Completed conversion of LFO inserts. 2024-1-17 Will bn 2308 Some small cleanups in EnvelopeUI. Removed unused duplicate freemode button. 2024-1-17 Will bn 2307 BugFix: Filter UI not displaying Q real value. DynFilter no longer needs 'spare1'. Updated Control Data. 2024-1-14 Will bn 2306 Completed AddSynth conversions that don't redraw waveforms. 2024-1-13 Will bn 2305 Fixed regression: noise labels not updating. Simplified noise label function. Further conversions. Now working through AddSynth Global 2024-1-11 Will bn 2304 Moved duplicated code on voice and voice list to header file in MiscGui. Added missing voice waveform updates. 2024-1-8 Will bn 2303 Converted some of the more complex Voice controls 2024-1-6 Will bn 2302 Reverted changes made with commit aae021c4 2024-1-3 Will bn 2301 Created new read-only control for unison spread in Cents. Updated HTML Control Data. Working through voice list refresh code. Removed some duplicated code. Identified other seemingly duplicated. 2024-1-2 Will bn 2300 More reads converted. Created new read-only control for updating voice detunes. Updated HTML Control Data. 2024-1-1 Will Most of addSynth voice gui done, but found earlier bug :( Bugfix: Wrong command used for modulator source Bugfix: Wrong offset for Octave More reads converted. 2023-12-31 Will bn 2299 Continuing work on addSynth GUI reads Also finding and removing duplicated error checks. Adjusted voice GUI detune so numbers don't spill over. 2023-12-28 Will Continuing work on addSynth GUI reads 2023-12-26 Will bn 2298 More removal of direct GUI reads from addSynth 2023-12-23 Will Revised coding style of addSynth GUI for consistency 2023-12-22 Will Further removal of direct GUI reads from addSynth. 2023-12-21 Will bn 2297 Started removing direct GUI reads from addSynth engine. Replaced some magic numbers in GUI with labels. 2023-12-19 Will bn 2296 Revised read and write controls in MiscGui.cpp 2023-12-11 Will bn 2295 BugFix: using copy/paste leaked text messages 2023-12-10 Will bn 2294 Added test for max text messages used (disabled) Re-implemented text message clear on hard reset (ctrl+Reset) Updates to Control Data and User Guide 2023-12-8 Will bn 2293 Removed redundant code that was generating warnings in clang. 2023-12-4 Will bn 2292 Finding the HTML guide now handles versions with M or rc suffixes. Further updates to dev_notes. 2023-12-2 Will bn 2291 BugFix: Rather obscure build failure - not finding inline loadText() Only happens on a headless build. Updated ParamCheck.cpp/.h copyrights. None of this code predates Kristian's work. Spelling corrections in User Guide and Control Data Set bugfix release 2.3.1.3 2023-12-1 Will bn 2290 Removed errant CR from text, disrupting manual discovery. Commented out some canaries. Set bugfix release 2.3.1.2 2023-11-30 Will bn 2289 Revised HTML guide discovery. Also provides guide location to CLI Updated Control Data. Set bugfix release 2.3.1.1 2023-11-26 Will bn 2288 Added missing details in Control Data filter section. legacy PDF now held back (available from me if needed) Typo corrections in Control Data files. Updates to files in dev-notes. Set bugfix version 2.3.1.1 rc1 2023-11-24 Will bn 2287 BugFix: AddSynth Tabs not updating on 'Paste' action - never did! Small Control Data updates and clarifications. 2023-11-17 Will bn 2286 BugFix: Numerous PadSynth controls not updating on preset Paste BugFix: AddSynth slider not updating on preset Paste Fixed speeling Eras in guides :p 2023-11-17 Will bn 2285 Properly fixed CLI AddSynth voice number affecting PadSynth controls Paste clipboard button disabled if no entry for that section Small style cleanups in copy/paste Updated Yoshimi Control Data/toplevel.html Updated HTML guide for preset 2023-11-15 Will bn 2284 Changed Presets internal name "presets" to "params" Changed "PresetsUpdate" to "ParamsUpdate" Changed "changePresets" to "changeParams" Changed "presetsUpdated" to "paramsChanged" Changed source file Presets.h to ParamCheck.h Changed source file Presets.cpp to ParamCheck.cpp Some small GUI cleanups Completed changes. Presets is now ParamBase 2023-11-14 Will bn 2283 BugFix: copy/paste not recognising effect numbers Title of copy/paste now indicates section Some GUI display cleanups 2023-11-13 Will bn 2282 BugFix: copy/paste GUI 'Type' field only correct on first call Removed all of old presets code except PresetsUpdate( Some cleanups and extra comments in UnifiedPresets 2023-11-11 Will bn 2281 Added 'design Notes' file to Yoshimi Control Data also a few more clarifications 2023-11-10 Will bn 2280 BugFix: copy/paste assuming text returned in text message 0 Resolved ambiguities in Yoshimi Control Data Added copy/paste details 2023-11-09 Will bn 2279 HTML "Yoshimi Control Data" now complete to replace .ods file. Removed ambiguity in CBtest default is to *not* display text from miscMsg Forgot to disable effects patch in Interchange :( 2023-11-07 Will bn 2278 BugFix: Wrong spelling in lists for amplitude LFO. BufFix: Ucopy/Upaste type text not updating GUI unified presets done for LFOs GUI unified presets done for Envelopes GUI unified presets done for Filters GUI unified presets done for Effects Some UI cleanups 2023-11-06 Will bn 2277 GUI unified presets done for Resonance and Waveform. Further work on Yoshimi Controls. 2023-11-04 Will bn 2276 Changed midi CC conversion names from ~Inner to more meaningful ~Adjusted Further work on HTML Yoshimi Controls (not now updating old .ods file) 2023-11-03 Will bn 2275 GUI unified presets complete for AddSynth, AddVoice, SubSynth, Padsynth Started building HTML version of Control values to replace .ods version (with additions and corrections) 2023-10-31 Will bn 2274 Further revisions to unified presets, now also applied to Padsynth. Human friendly preset group Gui field in window now done Outline code in place for deleteing entries from the Gui [presets] revised unfied presets so it can return human readable preset groups applied this to GUI code also addsynth global. window/text sizes now correct [presets] bn 2273 Trial of GUI unified presets with subSynth Not yet done: delete title bar preset group 2023-10-22 Will bn 2272 Merged in 'presets' updates. Disabled CLI direct swap across sys,ins,part effects - causing confusion! CLI now gives reminder to route insert effects before chosing the effect. [presets] bn 2271 BugFix: Formant filter reporting wrong vowel numbers (off by 1) Fixed regression: CLI and MIDI-Learn not setting formant frequency Set specific type entries for presets "list, copy, paste" Corrected metainfo icon type local->stock [presets] BugFix: CLI attempting to copy/save nonexistent addSynth Mod elements! CLI has more checks for sections being active. [presets] Removed overcautious section disabling and re-enabling. Changed all references to 'MIDI-Learn' in this file to the same format. It was getting hard to keep track of them. 2023-10-14 Will bn 2270 BugFix: unified presets 'load addvoice' clearing whole of addsynth :( 2023-10-02 Will bn 2269 BugFix: Command line prompt position not working. BugFix: CLI not enabling scales but seeming to do so. Add CLI warning when scales not enabled but scale action attempted. Improved some CLI failure messages. Added detail to CLI scales messages. Updated docs. Updated examples. Set release version 2.3.1 2023-9-26 Will bn 2268 Revised and simplified CLI scales code. Register and save formal octave size, but unused. Improved CLI handling of scale name and comment fields. Set rc version 2.3.1 rc3 2023-9-20 Will Updated HTML user guide microtonal entry. No code changes. 2023-9-18 Will bn 2267 Further refinements to microtonal code. Keymap size now explicitly set (not defined by map entries). Updated /dev_notes/Yoshimi Control Numbers.ods Set rc version 2.3.1 rc2 2023-9-9 Will bn 2266 Forgot to update banks version :( Fixed regression: version change not updating bank details, Yoshimi now reports instrument file minor point versions. Small XML cleanups. Set rc version 2.3.1 rc1 2023-9-8 Will bn 2265 Added instrument 'type' corrections supplied by Alex 2023-9-7 Will bn 2264 BugFix: Had inadvertently deleted a line in mapping :( Further general Microtonal cleanups. 2023-9-6 Will bn 2263 BugFix: Left some test code in place. 2023-9-5 Will bn 2262 Moved setting global fine detune out of setting part maps. It only needs to change when the control is moved! Testing for first and last note now done in part. You no longer need to do a retune if these are changed. 2023-9-3 Will bn 2261 Enabling or disabling microtonal always disables the keymap. Removed keymap array swap - wasn't any benefit, just confusing. Zero mapsize 'safe' but can be weird, so not actually correct :( 2023-9-1 Will bn 2260 Corrected behaviour of 'Invert keys' button. Enabled keyboard import if microtonal active but keymap inactive. Now correctly identifies map size zero as no map, not an error. 2023-8-29 Will bn 2259 Small microtonal related cleanups. Importing/loading keymaps into the UI now uses text messages. Still a lot of direct calls :( 2023-8-27 Will bn 2258 BugFix: Importing keymap not setting 'last' note value Both keymaps and tunings do setAllPartMaps() directly so SCALES:control::retune is now redundant, and removed. 2023-8-26 Will bn 2257 loadkbm now uses getLineFromText Removed (now redundant) loadLine() and associated functions Removed a number of redundant .c_str() conversions Created inline SplitLine() Made validline() inline 2023-8-25 Will bn 2256 linetotunings entirely C++ strings tuningtoline entirely C++ strings tuningtotext entirely C++ strings Implemented getLineFromText() to replace loadLine() loadscl now uses getLineFromText 2023-8-24 Will bn 2255 texttotunings and texttomapping immediately convert to C++ strings linetotunings entirely C++ strings tuningtoline entirely C++ strings tuningtotext entirely C++ strings 2023-8-23 Will bn 2254 Revised error handling loading both .kbd and complete scale files. Further corner cases importing and exporting fixed. Rationalised some labels so they reflect their function better. bn 2253 {branch microtonal} Removed frequent swaps between variabe 'x' and variable tmp'x' if there's an error the complete default is set so it's pointless. Extended recognition of comments active text. All operations seem correct. 2023-8-19 Will bn 2252 Merged in microtonal branch. Added CLI list entries. Updated user guide. 2023-8-18 Will bn 2251 Scales GUI now has a 'Clear All' button. CLI can now export tunings and keymaps. Some additional microtonal cleanups. {branch microtonal} BugFix: Tuning/Keymap import not recognised. Revised and simplified Scales error reporting. Revised much of microtonal.cpp Enabled partial recognition of extra comments in files. Implimented .scl and .kbm exporting (currently GUI only). 2023-8-12 Will bn 2250 Further improvements to window titles. Removed code for looking for PDF manual. 2023-8-11 Will bn 2249 Unified window title creation Revised metadata and added hicolor png icons Improved error reporting in Data2Text 2023-8-3 Will bn 2248 BugFix: Crash in legacy PadSynth 'apply' code. BugFix: Some windows not recognised as Yoshim by some window managers. If V keyboard visible, selection from bank now gives it keyboard focus. Updated docs Set bugfix release 2.3.0.3 2023-7-27 Will bn 2247 BugFix: MIDI-Learn using older number format instead of decoding the text. Changed ID in metainfo file to make it unique. Some small code cleanups. Doc updates. 2023-7-20 Will bn 2246 BugFix: Crash trying to paste mod waveform preset from CLI. 2023-7-19 Will bn 2245 Made some improvements to Copy/Paste GUI updates, particulalry from CLI. 2023-7-14 Will bn 2244 BugFix: Visible freemode windows not recognising theme changes. 2023-7-13 Will bn 2243 BugFix: controllers breath switch not updating across parts. BugFix: controllers knob colours not indicating default status across parts. Bugfix: humanise slider colours not indicating default status across parts. BugFix: SysfEff send knob colours not indicating default status across parts. Corrected LV2 CmakeLists.txt 2023-6-16 Will bn 2242 Forgot to set release version of CmakeLists.txt Set bugfix version 2.3.0.2 2023-6-15 Will bn 2241 BugFix: Array bounds error in themes code and incorrect terminator type Changed Histories archive to ordinary directory. Revised Util directory Updated some docs. Set bugfix version 2.3.0.1 2023-6-14 Will bn 2240 Removed non-free copyright content from dev-notes and histories. Returned to development. Merged pull request (spelling errors). 2023-5-29 Will bn 2239 Set release version 2.3.0 2023-5-28 Will bn 2238 Corrected 'Mono' button colour. Corrected envelope 'E' button style. Added theme control to AddVoice tab 'unused' colour. 2023-5-27 Will bn 2237 Fixed regression. Formant amp dial not updating graph. 2023-5-26 Will bn 2236 Resolved dynfilter freqency defaults. Cleaned up MiscGUI button 3 actions. Set version as 2.3.0 rc10 bn 2235 Resolved dynfilter formant defaults for all except frequency. 2023-5-25 Will bn 2234 BugFiX: previous dynfilter regression not reversed! 2023-5-24 Will bn 2233 Added two drum sounds from Lorenzo Some Dynfilter cleanups, but more needed later. Set version as 2.3.0 rc9 2023-5-22 Will bn 2232 BugFix: Dynfilter not setting filter knob colours or postions. bn 2231 BugFix: Not setting default preset when effect type changed. 2023-5-17 Will bn 2230 BugFix: Effect preset text not setting 'normal' colour. Set version as 2.3.0 rc8 2023-5-17 Will bn 2229 Changed MIDI-Learn 7bit NRPN warning colour to warning background. Created "Midilearn activity indicator" entry in themes. Correction to User Guide AlienWah Delay description. Added instruments to banks from Art Horan. Set version as 2.3.0 rc7 2023-5-16 Will bn 2228 Applied patch from Hermann for correct Envelope behaviour. Changed Master volume and fine detune to parcombi. Changed Default and Current theme boxes to unresponsive buttons. Updated Envelope Limits. Updated LFO Limits. Updated Filter Limits. Applied corrections to User Guide. Set version as 2.3.0 rc6 2023-5-14 Will bn 2227 BugFix: adaptive harmonics parameter not updating GUI. Reverted some recent envelope changes. Added missing knob default indicators in oscilgen. Changed ambiguous warning re. use-as-base button. Set version as 2.3.0 rc5 bn 2226 BugFix: V.keyboard not showing velocity setting in tooltip. BugFix: Formant filter frequency reset not using float. Formant filter now stores current frequency as pseudo default. Small adjustment to yoshimi.desktop file. Reinstated appdata file for older distros. Updated docs. Set version as 2.3.0 rc4 2023-5-11 Will bn 2225 Found some missing envelope settings :( Finalised Envelope pointer colours. Changed some LFO controls to floats and new combi storage. Knobs show correct colours when loading instruments. Changed slider large step range for higher resolution. Changed Resonance sliders to floats and new combi storage. Improved formant filter centre frequency and octave stepping. Updated docs and guides. 2023-5-9 Will bn 2224 BugFix: Sliders not returning to default on right mouse click directly over the peg. Added greyscale tint to themes. Adjusted knob and slider colours for better contrast. Changed some filter controls to floats and new combi storage. Knobs show correct colours when loading instruments. Merged in envelope adjustments from Hermann. 2023-5-7 Will bn 2223 Added missing right click action for formant freq dial. Added hidden totally grey colourmap (min & max greyscale as 127) Removed confusing theme (non) error messages. Updated CLI info. Updated docs (incuding User Guide). updated metainfo files. Added Ride Crash and Soft Shaker to Drums bank. Set version as 2.3.0 rc1 2023-5-4 Will bn 2222 All effects show correct defaults for all presets and set appropriate colours - completes all knobs/sliders. 2023-5-2 Will bn 2221 BugFix: GUI not updating when part loaded betweeen 16 and 25 2023-4-30 Will bn 2220 Added export feature to theme control. Updated docs. bn 2219 Defined formant frequency psuedo default for individual formants the first time they are set - saved with the instrument. bn 2218 Updates to user manual 2023-4-29 Will bn 2217 Theme colours now fixed and order rationalised. Extra reserved entries added. 2023-4-28 Will bn 2216 Changed freemode from light button to check button. Changed postions of Resonance C, P, Close, Apply. Changed colour of 'Close' buttons. Removed 'save and close' from presets window preset dirs are not part of config. Updated User Guide 2023-4-26 Will bn 2215 Confirmed LV2 bugfix from Kristian. BugFix: Part volume control wrong colour when stepping to default with mouse wheel. BugFix: Blocking right click formant frequency default was blocking all right click filter controls. BugFix: Mixer controls not setting default value. Found more buttons not using new styling :( 2023-4-23 Will bn 2214 Merged in Legato bugfix from Kristian. BugFix: Format freeqency zeroing on right mouse click it has no default value! Almost all magic numbers now properly identified in envelopes, filters, LFOs. 2023-4-20 Will bn 2213 Completed updates to user guide images. Provisionally updated guide text. Set missing Midi CCs knob colours. Removed some confusing (redundant) tooltip colours. Theme label 'Current' and 'Make Default' button now deactivated instead of being hidden. 2023-4-18 Will bn 2212 Added formant filter sliders to new limits system. Set pointer colours for random walk controls. Improved error detection of theme files. Added missing theme colour for current bank background. Started adding new screenshots to user guide. 2023-4-16 Will bn 2211 Completed theme list. Changed PadSynth 'apply' button to gtk thin up type. Created a brief theme instruction file in /doc Created new backward compatible XML parcombi element Envelope controls now use floats and new combi storage. 2023-4-14 Will bn 2210 BugFix: Some envelope freemode controls inactive. Reverted initial effects limits work. 2023-4-13 Will bn 2209 Reinstated right click default of system effects. Format filter knob pointer done. Started work on Effect defaults. Set MIDI-Learn to auto correct old control numbers. 2023-4-12 Will bn 2208 Rebuilt GUI System effect sends. Their knob pointer colours now track. 2023-4-11 Will bn 2207 Freemode knob pointers now partly done. All filter parameter knob pointers done. All filter knob pointers done except freemode. 2023-4-10 Will bn 2206 Completed all LFO knob pointers. Also started developing new limits setting. 2023-4-9 Will bn 2205 Changed PadSynth 'Apply' button type. Improved links between Addsynth voice, and list. Improved links between Addsynth list and Frequency LFO. Controllers Knob pointers done. Midi CCs pointers done. Note most refreshes on part load not done yet. 2023-4-8 Will bn 2204 Made including globals.h explicit in effects All addsynth, subsynth knobs now recognise the default position (not their inserts) 2023-4-7 Will bn 2203 Main window knobs now recognise the default position. From requests, changed link buttons to gtk style up buttons. 2023-4-4 Will bn 2202 All slider peg colours done. Starting on knob pointers. 2023-4-2 Will bn 2201 BugFix: WidgetMWSilder doubling callback entries Almost all slider peg colours converted. Resonance window being difficult - as usual :( 2023-4-1 Will bn 2200 BugFix: Envelope freemode sustain was set Learnable. Corrected freemode add/delete button types. Controllers pitchwheel & threshold not marked Learnable. Adjusted amplitude envelope panel width to match others. Started marking default slider position with peg colour. Only a few bits of AddSynth voice done so far. 2023-3-31 Will bn 2199 Error check on theme files now very pedantic reporting the relevant line number. Bank and Instrument 'lights' themeable. Close buttons themeable. 'about' heading text themable. midi/solo text themeable. 2023-3-29 Will bn 2198 The native colourtable is now stored at startup. This can be set with '@' begining the greyscale line. On any other line it makes just that one native. Added example file search to FileMgrFuncs.h Used for copying in 'demo.clr' but may be extended. More small tweaks. 2023-3-27 Will bn 2197 All open windows now update when the theme is changed. Theme change no longer needs a reset. 2023-3-26 Will bn 2196 Themes can be entirely managed within the Config window :) 2023-3-25 Will bn 2195 BugFix: both bank and instrument windows could have two buttons highlighted Some considerable refactoring of BankUI.fl Bank windows have colour bars under buttons, not radio buttons. More identification and unification of colour numbers. 2023-3-23 Will bn 2194 Added Formant, and Formant ghost markers to themes. Applied missing change to LH overload markers. Removed (pointless) change of Unison size label colour. Found more adjacent colour numbers - unified them. revised kit item positions and added bold italic 'On' labels instead of using pale blue surrounds. More notes at the top of the 'Themes.h file. Started work on a 'themes' tab in configUL.fl 2023-3-21 Will bn 2193 Learnable check boxes, numer roller etc. now identified with strong blue bold italic text, not with a pale blue surround. Kit edit window not done yet. 2023-3-20 Will bn 2192 Made changes to style of link buttons, also all action buttons. All of these themeable. 2023-3-19 Will bn 2191 Cleanups on theme management. Rationalise panel colours. VU colours controlled. 2023-3-18 Will bn 2190 Remote sourced themes can now be loaded from the CLI at startup. Most slider tracks now match general text and numeric entry arrows. 2023-3-17 Will bn 2189 Improved knob appearance Changed effect preset colours Copy/Paste colours done Note: Many buttons use relative colours so will inter-relate 2023-3-15 Will bn 2188 All parts of knobs are now themeable :) :) 2023-3-14 Will bn 2187 Moved theme definitions from MiscGui.h to (new) Themes.h Commented user theme line now sets 'classic', not default Added greyscale range control Added tooltip colour control Improved theme lists, with some error trapping 2023-3-11 Will bn 2186 Theme control now entirely within ConfigUI.fl Related data stored in .local/share/yoshimi/themes 2023-3-10 Will bn 2185 PadSynth graphics theme complete, others partially. Revised PadSynth drawing code. 2023-3-8 Will bn 2184 Themes can now now be manually changed by copyiong and editing the 'classic' theme in: /home/will/.local/share/yoshimi/themes Then changing the last entry in: .config/yoshimi/yoshimi.config bn 2183 All 'normal' text theme done. Also most graph colours. 2023-3-6 Will bn 2182 'classic' theme now run directly in Master and only saved at startup if it's missing - purely to provide a template. 2023-3-5 Will bn 2181 Further work on colour themes. Now saves and reloads (incomplete) 'classic' theme. 2023-2-23 Will bn 2180 BugFix: If an instrument is loaded with an empty 'original' name there may be undefined behaviour and possible crash when saving. 2023-2-22 Will bn 2179 BugFix: sys/ins text not resizing Further conversion to fltk tables, no definitions in globals.h Initial code for colour themes BugFix: CLI list sections LFO and Envelopes error BugFix: GCC specific include file in Text2Data.cpp Most direct RGB colour settings changed to equivalent fltk table values or labelled version in globals.h 2023-2-15 Will bn 2178 Out of sequence so patched manually # 2023-2-11 Jesper Added copy_if_different step to fltk source generation to speed up rebuilds. Set labels to filter types in code - easier to see what they are! 2023-2-13 Will Updated docs Set release version 2.2.3 2023-2-12 Will bn 2176 CLI paste now updates adsynth voice correctly. Set version as 2.2.3 rc3 2023-2-11 Will bn 2176 BugFix: formant filter window not updating centre frequency and octave range numeric entries. Set version as 2.2.3 rc2 2023-2-8 Will bn 2175 Small code cleanups. Commented out various code 'cout' lines. User Guide updates. Set version as 2.2.3 rc1 2023-2-3 Will bn 2174 Formant filter counters now start at 1 (not zero) Improved CLI access the formant filter. 2023-2-1 Will bn 2173 BugFix: MIDI-Learn and CLI mixing up EQ filter bands. In CLI Changed EQ Band control name to Number to avoid confusion with Bank controls. BugFix MIDI-Learn changing the GUI of whichever part is visible while correctly changing the actual parameters. 2023-1-31 Will bn 2172 BugFix: MIDI-Learn saving but not recognising saved effects controls. 2023-1-29 bn 2171 Further cleanups on CLI EQ Band numbers now start from 1. Halted further improvements to deal with serious fault with MIDI-Learn and all effects. 2023-1-28 bn 2170 Revised and simpified CLI format filter commands. CLI now identifes editing and unused vowel. Fixed desktop metainfo error. 2023-1-26 bn 2169 BugFix: LV2 needed UnifiedPresets.h but doesn't use it! Finally solved effects window text resize issue. Updated User Guide. Various doc updates. 2023-1-21 bn 2168 Formant filter unused vowel warning now same style as legato mode warning. Added the following instruments Wood Block Finger Snap Cello Various code cleaups Corrected date of previous build 2023-1-15 bn 2167 Resolved issues with effects formant filter. 2023-1-12 bn 2166 Brought in latest work from copyPaste branch. 2023-1-7 Will bn2165 Revised formant filter GUI so unused vowels are identified. 2023-1-3 Will bn2164 BugFix: When filter type is analog low 1 or high 1, filter Q knob was switching to active when changing other filter controls. 2022-11-9 Will bn2163 Reverted default Audio to Jack as workround for pulseaudio issue. 2022-11-8 Will bn2162 BugFix: old preset list was overwriting new one. bn2161 Instances now have independent preset directory choice. Previously these were all slaved to firstSynth. 2022-11-7 Will bn2160 Merged in copyPaste so branches don't get out of sync. Fixed CLI regression - not importing Scala keymaps. BugFix: scale imports not reporting names when loaded. Modifed TextMsgBuffer.h to provide non-destructive read. 2022-10-22 Will bn2159 * moved down top few control values for MIDI-Learn * moved partBusy control from part section to top level * removed some (now redundant) code * forgot to update Control Numbers file :( 2022-10-15 Will bn2158 * BugFix: System effect dynfilter filter window not resizing text. 2022-9-26 Will bn2157 * applied temporary fix for wrong EQ graph on loading. * added some additional code comments. 2022-9-12 Will bn2156 * Applied riscV64 patch from debian. * Changed text 'distorsion' to 'distortion' in code. debian was reporting this as 'spelling error in binary' * Set bugfix release 2.2.2.1 2022-9-8 Will bn2155 * BugFix: disabling a part in the panel window marked the main window as disabled when that was pointed to a different part. 2022-9-1 Will bn2154 * Updated meta-data * Updated HTML guide * Set release version 2.2.2 2022-8-29 Kristian bn2153-a * Removed redundant (time wasting) code from LV2. 2022-8-27 Will bn2153 * Re-ordered retry attempts in MusicClient.cpp to avoid occasional lockups. 2022-8-21 Will bn2152 * Split harmonicPhaseBandwidth label SubSynth -> harmonicBandwidth Add/PadSynth -> harmonicPhase 2022-8-20 Kristian bn2151a * BugFix: phase randomness not recognised by modulators. 2022-8-17 Will bn2151 * Fixed MIDI-Learn regressions. Settings saved, but not received. * Suppressed clang compliler warnings. * Doc updates. bn2150 (branch tempeff) * Effect control labels now taken back out of inserts and as a group now sit immediately above kit numbers. 2022-8-16 Will bn2149 * Increased size of char array to suppress compiler warnings. * Changed direct comparison to strcmp( to suppress compiler warnings. * Commented out #include to suppress compiler warnings. 2022-8-12 Will bn2148 * Attempt to improve EQ graph display. * Small code cleanups and doc corrections. 2022-8-4 Will bn2147 * Minor GUI updates. 2022-7-25 Will bn2146 * Updated HTML manual * Updated docs * Set release version 2.2.1 2022-7-20 Will bn2145 * Disabled 'Escape' key if main window has focus. * Added Hugh's 'Nostalgia' to Synth bank. * Added 'Ride' to Drums bank 2022-7-14 Will bn2144 * BugFix: kitmode GUI engines not upodating correctly. 2022-6-22 Will bn2143 * Applied Hermann's dynamic symbols patch. * Minor HTML guide updates. 2022-6-18 Will bn2142 * Enabled whole part reset for part button and dropdown menu. (holding down Ctrl) * Updated HTML user guide. 2022-6-17 Will bn2141 * Added reset button to part edit window. Re-arranged the window's layout to accomode this. * Updated User Guide. * Changed defaultPart to more accurate defaultInstrument. 2022-6-1 Will bn2140 * BugFix: Changed effects not highlighted. * Corrected some window title bars. * Part kit window and part effects window visible status now remembered over Yoshimi shutdown and restart. 2022-5-31 Will bn2139 * Merged in part UI improvements from newGUIpart. 2022-5-28 Will bn2138 * Moved master/mixer engine updates from partUI to masterUI. * Consolidated partnew/updatepart duplicated settings. 2022-5-24 Will bn2137 * Partially reverted last change in main.cpp. 2022-5-23 Will bn2136 * Small refinements in Main, SynthEngine, MiscGui, LV2. 2022-5-21 Will bn2135 * BugFix: GUI not updating key shift, key limit, portamento when changing part selection. 2022-5-20 Will bn2134 * Metadata updates. 2022-5-18 Will bn2133 * BugFix: Mixer Panel not clearing previous selected part. * BugFix: DynFilter filter insert not keeping in scale on resizes. * BugFix: Main window not resizing DynFilter filter text. * Adjusted some effects control positions. 2022-5-15 Will bn2132 * Final cleanups and adjustments. * Commented out cmake testing definitions. * Set release version 2.2.0 2022-5-13 Will bn2131 * Corrected some entries in textLists.h Adjusted User Guide to match. * Set release candidate 2.2.0 rc3 2022-5-11 Will bn2130 * Changed cmake policy CMP0072 from OLD to NEW. * Added tooltip to Edit button. bn2129 * Applied patch from Hermann for compiling with clang. * Changed randWalkWindow_retext() to randRtext() * doc updates. * Set release candidate 2.2.0 rc2 2022-5-9 Will bn2128 * Merged in altmain with adjusted main window. * BugFix: CLI drum mode control in wrong place. * Suppressed compiler warning in BuildScheduler.h * Updated docs and User guide. * Set release candidate 2.2.0 rc1 2022-5-1 Will bn2127 * Minor tweaks to the main window. 2022-4-30 Will bn2126 * Included Hermans updates to the User Guide * Minor adjustments to User Guide and various text files. bn2125 * More additions/corrections to notes. * Added Theatre Organ to Companion bank. 2022-4-29 Will bn2124 * GUI main window adjustments. * doc updates. * User Guide updates. 2022-4-28 Will bn2123 * Reverted Resonance undo speedup test - caused odd issues. * Further Adjustments to User Guide * Initial preparation for Release of V 2.2.0 2022-4-27 Will bn2122 * BugFix: previous change caused lockup of partUI insert. 2022-4-26 Will bn2121 * Small GUI cleanups. * Updates to Yoshimi Control Numbers.pdf * Moved buildpush and incbuildnumber.py out of repository. 2022-4-24 Will bn2120 * Added undoRedoClear() if deleting a kit line. Removed this from overal kit enabling. * Added warnings to various GUI actions that could disrupt undo/redo behavoir. 2022-4-23 Will bn2119 * Adjusted position of Random Walk controls. * Updated User Guide Image. * Swapped order of some of these entries. Makes more sense! bn2118 * Changed Random Walk window to horizontal layout. * Revised Config window layout. * Initial update to User Guide for new features. 2022-4-23 Will bn2117 * Bugfix: New FLTK commands not disabled for headless build. bn2116 * Bugfix: Missing random walk exit branch when loading instrument. 2022-4-22 Will bn2115 * Revised position of new controls in PadSynth window. * Completed text rescaling in Retrigger window. 2022-4-21 Hermann Landing "padthread" feature * Extensive rework of FFTW memory management * rework and clean-up of Legato / Portament notes * Notes and parameters mostly use unique_ptr for memory management * PADSynth wavetables now built in background thread * crossfade on playing notes when new PADSynth wavetable ready * PADSynth may self-retrigger PADSynth wavetable build with random walk * ability to cover Legato, Portamento and XFade with automated tests 2022-4-21 Will bn2113 * Switched keyboard undo/redo fro main.cpp to MasterUI.fl 2022-4-20 Will bn2112 * Bugfix: unable to cancel envelope freemode. 2022-4-18 Will bn2111 * Placed copy of Yoshimi_License_History.txt in doc * Removed 'library' from all licenses. 2022-4-17 Will bn2110 * Fixed regression (not reporting effect types) * Removed invalid class link in MasterMisc 2022-4-14 Will bn2109 * BugFix: previous fix didn't get the root cause. Repeated key handler creation. 2022-4-7 Will bn2108 * BugFix: filer window becomes slow to respond after many calls. 2022-4-2 Will * Added tooltips to Undo/Redo * Modified GUI resonance window event handler. It was interfering with Undo/Redo actions. * Corrected GUI oscilator window event handler. It was always capturing mouse events. * Refined SubSynth Undo/Redo * Refined Resonance Undo/Redo 2022-4-1 Will * Changed some names to make effect controls clearer. * [Ctrl]+z and [Ctrl]+[Shift]+z now undo/redo as well as [Alt]+u, [Alt]+r. 2022-3-31 Will * Completed moving effect type identifiers to inserts. Actual control still with kit. 2022-3-30 Will * Bugfix: Dynfilter not reporting internal filte results to CLI but performing them correctly. * BugFix: analog filter type defaulting to High 1 Should be Low 2 2022-3-28 Will * Working through effects initially just reading types from the insert labels instead of the kit ones. 2022-3-28 Will * Moved insert numbers to make space for effects. 2022-3-26 Will * Added key based undo/redo patch from Jesper. [Alt]+u, [Alt]+r * Refined redraw action for resonance window on undo. 2022-3-25 Will * Moved Vector control base channel from insert to paramater. Done to avoid possible centention with real inserts. 2022-3-24 Will * Completed undo/redo for envelopes and tidied code. * Corrected Xpoint reporting (been wrong for some time). 2022-3-23 Will * Envelope points now working correctly. Had to create a special case for this :( * Separated add/delete envelope points. * add fully correct, delete not quite on undo/redo. 2022-3-19 Will * Undo done for SubSynth clear harmonics. * Completed Undo for resonance. * Started Undo for waveform - but disabled. 2022-3-18 Will * Reduced undo/redo messaging spam * Group undo/redo now in blocks of 16 Runs faster without risk of Xruns No change to setting groups. * Further undo/redo refinements 2022-3-17 Will * Can now group undo reset all controllers. * Can now group undo resonance set random. 2022-3-16 Will * Simplified Undo/Redo Groups still not done :( 2022-3-13 Will Revised GUI main window Updated User Manual 2022-3-10 Will Merged in undo branch Merged in default BPM from Kristian Added CLI code for default BPM 2022-3-9 Will * Corrected envelope info in user guide. 2022-2-15 Will * BugFix: CLI not correctly listing part contents. 2022-2-11 Hermann * Changes to make Reverb computations completely reproducible * Ensure InterpolatedValue stops when passing beyond interpolation-length * Allow to forcibly push InterpolatedValue to the next target; used for Effect::cleanup() * Fix spurious AnalogFilter recalculations due to float comparison glitches 2022-2-5 Will * Added copy of MPE spec to dev_notes. * Corrected spelling mistakes here! 2022-2-4 Will * Improved update system for User Guide version 2022-1-20 Will * Swapped order of bank and main controls in commandSendReal() also put comment in for suggested undo/redo location. * Made Undo and Redo buttons in main inactive to avoid confusion. 2022-1-17 Will * Set placeholders for Undo/Redo. * Made additional small adjustments to main window. 2021-12-7 Will * globals AddVoice1 offset is now defined as NUM_VOICES * globals AddMod1 offset is now AddVoice1 + NUM_VOICES 2021-12-6 Will * doc corrections. 2021-12-4 Will In CMakeLists.txt: * added (disabled) option to compile with Clang. * added suppression of deprecation warning. Resolved warnings shown in Clang. 2021-12-3 Will * Includes compatibility fix for Clang compiler. * Set minimum C++ version to 14 * set bugfix version 2.1.2.2 2021-11-30 Will * BugFix: failed to link using recent cmake versions. Thanks to David Runge for a timely fix. * set bugfix version 2.1.2.1 2021-11-29 Will * Filer window path deactivated if in favourites. * Disabled difference reporting in MIDI-Learn. * Final doc and user guide updates. * Set release version 2.1.2 2021-11-24 Will * Improved recognition of Apply Parameters from MIDI * doc updates * Rationalised more Data2Text and Text2Data names. * CLI can now read midi source and audio destination. * Set version as 2.1.2 rc2 2021-11-23 Will * Completed unification of padsynth apply status * CLI can now read CLI and GUI current status. * Doc Updates. * Set version as 2.1.2 rc1 2021-11-22 Will * Bugfix CLI sub and pad stereo set but not read. * padsynth applied status now correctly set. GUI still not fully in sync. * CLI can now read padsynth applied status. 2021-11-21 Will * More small GUI tweaks. 2021-11-20 Will * Added instruments from Hugh across various banks. * Updated User Guide * Adjustments to names in Data2Text and Text2Data * GUI text position adjustments. * Filter tracking check box label now reflects its status. * Filter label changed to 'Parameters' and position properly scaled. 2021-11-16 Will * BugFix: CLI padsynth waveform and resonance not setting 'apply' * New MIDI-Learn style enabled. 2021-11-12 Will * BugFix: Crash loading scala keymap file * Dat2Text Ocsillator controls now independent of list position. 2021-11-12 Will * All Dat2Text engines now independent of numeric positions. * Unified control names for MIDI-Learn. 2021-11-11 Will * BugFix: Data2Text making assumptions about control numbers. 2021-11-5 Will * Updated user guide. 2021-11-4 Will * Loading a state file now always clears the MIDI-Learn list. 2021-10-27 Will * BugFix: crash with corrupted history file. * added Default_Maths.txt to dev_notes. 2021-10-26 Will * Rationalised some PI calculation variations. * Added old (commented out) jack MIDI check. 2021-10-17 Will * Reverted VU changes 2021-10-16 Will * Minor adjustments to VU metering * Extra check when loading history lists * Doc updates 2021-10-15 Will * BugFix: Missing jack midi entry in CmdOptions.cpp 2021-10-12 Will * BugFix: Not recognising no FLTK on first time start * Set bugfix release 2.1.1.1 2021-10-11 Will * Final updates to user guide and docs * Set release version to 2.1.1 2021-10-9 Will * Bugfix: Vectors not save to correct locations. 2021-10-7 Will * Created separate button for MIDI CCs in main window * Updated user guide * Set version as 2.1.1 rc2 2021-10-6 Will * Updates in doc and dev_notes * Additional comments in globals.h and interchange.cpp 2021-10-5 Will BugFix: Not resetting part effect number to zero when loading a new instrument or clearing one. 2021-10-4 Will * Updates to User guide * Small GUI cleanups * Doc and build instruction updates. * Set version as 2.1.1 rc1 2021-10-3 Will * Further improvements to bank management Mostly addtobank() and orphan/duplicate files 2021-10-2 Will * Corrected wrong years here! * Changed search list terminator from "*" to "@end" Makes it easier to see and consistent with other lists terminators 2021-9-30 Will * Moved userDir definition to FileMgrFuncs.cpp from config.cpp * Moved localDir definition to FileMgrFuncs.cpp from config.cpp Also renamed confusing duplicate names in bank.cpp * Rationalised string manipulation in bank.cpp * Moved configDir definition to FileMgrFuncs.cpp from config.cpp 2021-9-29 Will * Removed controls to enable part on program change. It was only relevant to MIDI and always on regardless. * Made new bank version numbers positive starting from 10 to clear trial versions. 2021-9-27 Will * Removed redundant references the checksynthengines 2021-9-23 Will * Merged in latest banks updates * Updated build number 2021-9-15 Will * Double click in filer favourite paths window sets it directly. * Updated User Guide. * update_guide_version.py no longer adds M/rc{n} suffixes. *BugFix: textmsg leak loading instruments. 2021-9-14 Will * Commented out CLI test message in interchange. * Updated build dependencies. 2021-9-11 Will * BugFix: Crash when trying to clear or save inactive part. * Added missing ALSA connection type to config list report. 2021-9-10 Will * Commented out legit filename test in MIDI-Learn.cpp This was falsely adjusting valid filenames. 2021-9-7 Will * BugFix: Corrupted instrument Copyright and Comments entries. 2021-9-5 Will * Replaced logging type numbers with labels. * Added (commented out) test massages in main.cpp. 2021-9-4 Will * Revised Config.cpp to streamline and improve readability. 2021-9-3 Will * Merged in revisedArgs * Code cleanups. No changes to logic. * CLI load file at start can now specify part number. 2021-8-30 Will * BugFix: crash when trying to import bank. last seen code not trapping out of range values. 2021-8-29 Will * Cleaned up history vector implementation. * Separated last seen files from history. If history was locked so was last seen. 2021-8-28 Will * Reverted manual code to minimise load time. 2021-8-25 Will * Improved manual search. No longer uses tmp and reinstated PDF. * Moved all popen commands to FileMgrFuncs.h * Improved single master detection. * Started separating startup options from Config.cpp Currently disabled. 2021-8-24 Will * Slight speed up for user guide search. 2021-8-23 Will * Final cleanups * General Doc updates * Set release version 2.1.0 2021-8-22 Will * Last minute bugfix :( If HTML manual couldn't be found it went into loop fetching old pdf one and opening pdf reader so commented out pdf section. * Added LV2 correction. 2021-8-21 Will * Made guide headers HTML5 compliant. * Applied corrections and style improvements from John. 2021-8-20 Will * No code changes (so no version update). * Revision of complete New User Guide. 2021-8-16 Will * Set release candidate 1. 2021-8-15 Will * Some small code cleanups. * Added NRPN control to send part to system effects. * Updated guide. 2021-8-14 Will * Bugfix: MIDI-Learn not loading/saving files. Not handling spaces in path or leafname. * Various doc updates. 2021-8-13 Will * Expanded EQ Band, Type, Stages labels. Why were they ever abbreviated? * Bugfix: Virtual keyboard not seen on first startup. 2021-8-12 Will * Doc updates. * Changed Banks ID placeholder. May be using it soon. 2021-8-10 Will * Further Guide updates and improvements. Also some doc cleanups. 2021-8-9 Will * Changed FR to RR in CLI LFO to resolve contention. * Various guide updates and wc3 compliance checks. 2021-8-8 Will * Util cleanups. 2021-8-7 Will * Added an appendix to guide. * Added a MIDI note lit generator in Utils. * Removed now redundant similar information from docs. * Removed PDF version of guide. The on-line copy is now referred to. 2021-8-6 Will * Improved manual's CC/NRPN descriptions. * Clarified guide text in navigation. * Added more links. 2021-8-5 Will * Improved reporting when loading manual. * NRPN send system effect No. to No. now works! Undated manual accordingly. 2021-8-4 Will * User guide more detail and cross links. * Various Doc updates. * Made string to int conversion safe. * Activated search for new manual. * Developed way to auto update manual version. 2021-8-3 Will * User guide corrections and improvements. 2021-8-2 Will * Further work on User Guide. * Changed filer from fixed array to vector. 2021-8-1 Will * Revised console window code. text size independent of dimensions. * Updated user guide. * Reverted part of config change from 2021-7-25 One line error. * Added more comments in misc funcs. * Considerable expansion of CLI in guide. * Completed CLI guide. 2021-7-30 Will * Added filer images to new user guide. also many spelling corrections :( * Further work on manual CLI page. also more images of filer headings. 2021-7-29 Will * Updated PDF manual. * Added links for new manual. Currently disabled. * Updates to new user manual. * Added version text to numeric value. Not currently in use. 2021-7-26 Will * Completed user guide CCs/NRPNs * Started CLI user guide section. 2021-7-25 Will * Small cleanups and doc updates. * Started CCs/NRPNs on user guide. * BugFix: not responding to NRPN sys/ins effects. 2021-7-21 Will * Further updates to User guide * Added FLTK_event_keys.txt to dev_notes 2021-7-18 Will * User guide formant filter done except graph usage. 2021-7-17 Will * Initialised LearnBlock in MIDI-Learn. * Capitalised some GUI filter/effects control names. * Corrected spelling in User Guide. Also made small additions and adjustments. 2021-7-15 Will * Implemented Effects BPM control for CLI. * Updated Effects in new user guide. * Refined and unified BPM reporting. 2021-7-14 Will * Merged in Effects BPM control from Kristian. * Adjusted to CLI waveform list. * Added (disabled) command block reporting in Interchange->resolveReplies() * Started work on User Guide Envelopes and LFOs. 2021-7-1 Hermann * New Feature: support for automated tests via CLI. 2021-6-29 Will * BugFix: Loading state not adding to history. 2021-6-25 Will * BugFix: headers still including jack/ringbuffer. Only appears in jack engine midi struct but doesn't seem to do anything! Replaced with uint_t 2021-6-22 Will * Waveform in guide mostly done. There is a lot of detail missing. It was never doccumented :( 2021-6-21 Will * BugFix: GUI scale kemap label not resizing. * Completed Scales in guide. 2021-6-20 Will * Small improvement to vector and MIDI-Learn in guide. * Completed Resonance in guide. 2021-6-19 Will * Filer now correctly sets default path in favorites. * Small doc cleanups. * Improved PadSynth Base Type layout. Profile menu named. * Added further details to filer in manual. * Various small adjustments and spelling checks. * Added new PadSynth image. 2021-6-17 Will * Manual now points to correct version. * Prepared for minor release. * Set release version to 2.0.2 2021-6-14 Will * Moved examples directory into doc. Required by debian. 2021-6-13 Will * Selecting directory from filer now needs double click. 2021-6-11 Will * BugFix: first synth not seeing default state on resets. 2021-6-8 Will * Added more cross-links in guide. 2021-6-7 Will * MIDI-Learn guide almost complete. * Small corrections to Vectors. * Further small adustments and corrections to guide. 2021-6-6 Will * BugFix: solo not restoring chanels when turned off. * User Guide solo mostly done. * Further manual corrections and adjustments. * Completed Vectors. * Completed Solo. * Started MIDI-Learn guide. 2021-6-5 Will * More work on User guide vectors. 2021-6-4 Will * User guide work on MIDI-Learn and Vectors. 2021-6-1 Will * Merged in user guide updates from Lorenzo 2021-5-28 Will * Implemented reseeding from CLI. * Implemented Note On/Off from CLI. * Changed 'Note' to 'Tone' to avoid contention. Note is used at part level, and expected in a short form, but could still be typed in full. 2021-5-17 Will * BugFix: lockup importing corrupt scala files. Also adjusted fileMgr for odd text line ends. 2021-5-16 Will * Small refinement to GUI Bank Root Paths window. 2021-5-15 Will * Bugfix: GUI 1st slider wrong on waveform clear. * Further work on User Guide waveform. 2021-5-13 Will * Sub/Pad overtone par2 disabled if position is Shift. Avoids user confusion. The control not used here. * Completed User Guide SubSynth. Started PadSynth. 2021-5-10 Will * Tidied up Limits code. Included missed 'magic' numbers Rainer saw. * Completed Midi Controls in user guide. 2021-5-9 Will * Added new user guide to repository in 'doc' * Completed Part in user guide. 2021-5-8 Will * Made small range check in CLI formant filter. * Added CLI option to start scripts from any level. * BugFix: Earlier Effects fix not handling no FLTK. * BugFix: MIDI-Learn FLTK not checked. 2021-5-6 Will * Replaced ringbuffer with improved code from Rainer and applied his other fixes. * Added small adjustment to MiscGui.cpp * Removed Ringbuffer.cpp stub and adjusted cmake files. * Adjusted copyright notices. 2021-5-5 Will * Further bugfixes in CLI filter controls. For AddSynth, filter category only shown for the Voice 1 and the formant filter didn't recognise size limits. 2021-5-4 Will * BugFix: CLI PadSynth waveform fails if voiceNumber > 0. Forcing voiceNumber to 0 fixes this, but shouldn't be needed, and is incovenient for users. 2021-4-27 Will * Bugfix: Lost CLI startup load options. config test moved to wrong location. * Re-applied history cleanups. 2021-4-18 Will * Filter Q dial deactivated if analog and < Low2 * Corrected reporting Zyn comatibility of Yoshi files. We sometimes had V3.0 quoted, but are really only 2.4 * Set release version 2.0.1 2021-4-17 Will * Added Stick Hit patch the Drums. * Set Zyn patch compatiblity to version to 2.4. There never was a 2.0. * Commented out direct key actions. It's not ready for release. 2021-4-14 Will * LV2 config cleanups. * Started per instance key only rescale to screen size. Ctrl + Alt + 'R' 2021-4-12 Will * Further refinements to GUI filer 2021-4-11 Will * Suppressed missing argp warning in LV2 Config.cpp * Small cleanups in masterUI * Added Forced key exit if any window has focus. Ctrl + Alt + 'H' 2021-4-9 Will * Applied provisional fix for LV2 argp issue. 2021-4-9 Will * Rationalised Config startup sequence. LV2 now exits as early as possible. 2021-4-8 Will * defined our own max size used only by manual search. PATH_MAX not fully portable, and ill defined. * Improved tooltip in Scales - inverted centre. * Moved loadCmdArgs( below LV2 exit. 2021-4-7 Will BugFix: Importing keymap not updating GUI Ref. Freq. Made small change to config initial sequence re argp. 2021-4-6 Will * BugFix: Crash on oversize filer directory listing. This is a provisional fix, increasing max size to 1000 entries, and ignoring any over that count. 2021-4-3 Will * BugFix clearing part not clearing original name. * BugFix: history locks not marking config changed. * Re-enable CLI part level current instrument clear. 2021-4-1 Will * Reenabled buffer size setting for LV2. Also tooltip warning about buffersize V sound changes. 2021-3-27 Will * BugFix: Filter correction (2021-3-9) altered settings. When window opened wrote values instead of reading. * BugFix: GUI SysEff send-to not seeing set default. 2021-3-21 Will * Made CLI wavform filter type show text to match input. Was previously confusingly numeric output. 2021-3-20 Will * BugFix: GUI out of sync on MIDI-Learned mod type change. * BugFix: Right click on mixer Edit using wrong part entry. * Added 'Scaffold Pole' to Companion bank. 2021-3-17 Will * A few spelling checks in the Gui. 2021-3-11 Will * BugFix: crash when locking MIDI-Learn history from GUI. Caused by placement of presets in the XML list. Now moved after MIDI-Learn. 2021-3-9 Will * Completed GUI filter frequency correction. * Clear changed original part name on reloads and resets. 2021-3-7 Will * BugFix: GUI Filter frequency not showing correct value. * Added 3 new instruments to Companion bank. 2021-3-3 Will * Added TextLists.h to Interchange.cpp Fixes potential issue with GCC 10.2.0 * Reapplied filer window location independence. Got lost somehow :( * Phaser feedback control deactivated when analog. It does nothing in that mode. * Set correct type to Companion/Hoover. * Reinstated Resonance to Companion/Hollow Ghost Ensemble. Don't know how this got lost - makes a big difference! * Added Surf to Companion. 2021-3-1 Will * Master window stays in view with resolution changes. * Added extra error check in CLI BPM ratio entry. * Added extra comments in various files. * Final doc updates. * Set release version 2.0 2021-2-27 Will * Enabled LFO BPM ratios in CLI. * Unified CLI and GUI BPM reporting. * Allowed delay in scripts up to 30 seconds. * Made filer window location independent of source. 2021-2-25 Will (additional) * Fixed regression: Named instrument load shows time again. * Swapped order of filerfave and fileradd * Doc updates * Set version as 2.0 rc5 2021-2-25 Will * Now includes new filer updates and additions. * Removed Miscellany/Images directory. It's redundant. All images appear in usr guide. Significant ones are also on the website. * Set version as 2.0 rc4 2021-2-19 Will * A few more instrument type changes. 2021-2-17 Will * Had to revert some bank changes. This was resulting in multiple copies with slightly different filenames :( * Refinements to instrument types. 2021-2-16 Will * Revised all remaining banks. Internal/file names consistent Many now properly typed. * Small improvement to patchset instrument names. Now keeps a copy of the source file leafname stored in the info section. * Doc updates. * Set version as 2.0 rc2. 2021-2-15 Will * Cleaned out a lot of redundant code. Mostly commented out test print. * More doc updates * set version as 2.0 rc1. 2021-2-14 Will * Increased MIDI-Learn list limit to 400 lines. Added 10mS sleeps every 32 lines on loading. Still less than 1S for a full list and estimate less than 200uS for actioning ones at the end. * Doc updates. * Moved audio/midi defaults from CMakeLists.txt to globals.h * Changed both defaults to Alsa. 2021-2-13 Will * Aftertouch saved in Yoshi instruments and patchsets. * Panning law saved in patchsets and states. * Disabled automatically pushing main window to top. It hid startup warning messages. * Disabled printing of tooltip sizes 'tipset'. * Echo exit warnings to CLI if set for console window. * Started updating docs. * Set min config to 2.0 * Set version as 2.0 prev 2021-2-12 Will * Revised GUI for AddSynth Voice. * BugFix: Generating new bank root not updating GUI. 2021-2-11 Will * Disabled call toe Gui thread messages in UI/MiscGui Now redundant * BugFix: AddSynthModuator gui state of sync. * Further work on completely new bank roots. Still not updating Gui till rebooted. 2021-2-9 Will * All remaining 'SetSystemValues' made non threadmessage type. 2021-2-8 Will * Revised messaging for bank root add/remove. * Started changing 'SetSystemValues' to non threadmessage type. * Reinstated and updated list in docs 'NRPN_System_Settings.txt Corrected control numbers. It hasn't supported list displays for some time. 2021-2-7 Will * Improved search for user guide. * BugFix: new GUI files not copied to LV2 cmake.txt 2021-2-6 Will * CLI no longer directly handles bank removal. * CLI no longer uses gui thread message for bank root access. * Improved handling of missing bank roots. 2021-2-4 Will * Properly integrated adding a new bank. 2021-2-2 Will * Another attempt to resolve standalone lock up issue. * Removed (commented out) engine colour enable code. This is now *required* for other functions. Also updated file dates. 2021-2-1 Will * BugFix: Panel window not handling part group changes * Commented out some redundant routines. These will be removed once sure they are redundant. * Small simplification in new checkbox resize. * Properly integrated adding root paths. still not quite correct for empty dirs 2021-1-30 Will * recoded formatTextLines() in FormatFuncs.h can now handle embedded newlines correctly. * Revised the following banks: Will_Godfrey_Collection Will_Godfrey_Companion * Improved layout of part Edit window. *Merged improved FLTK widgets from Jesper and adjusted to fit laterst build 2021-1-29 Will * aftertouch window can be opened from part edit window right click close reopens correct parent. 2021-1-28 Will * Another attempt to resolve LV2/Main conflicts. 2021-1-27 Will * Reverted startup to threadmessage style. 2021-1-26 Will * Converted logging various switches to report on/off. 2021-1-25 Will * Swapped masterU wincheck() and read_updates(). 2021-1-24 Will * Moved process messages from LV2 and main to misc_gui * 1st trial of direct instance start from main. 2021-1-23 Will * BugFix: used invalid type offset (-1) goes into endless loop * Moved console log read from LV2 and main to misc_gui also cleaned up code * Disabled some redundant threadmessage code. 2021-1-23 Will * Revised the following instrument banks: Choir and Voice Misc Plucked * Modified main->GUI refreshes. corrects high GUI CPU load from previous change. 2021-1-21 Will * Small code cleanups 2021-1-20 Will * BugFix: failed to check CLI after code change! * Revised timing for GUI updates. Should resolve LV2 crash. * Moved GUI process messages in main to be per instance. seems to resolve long-standing VU corruption * Unified CLI instrument type lists. * GUI unified for instrument type lists. * Instrument types are now extendable. added following types: Bells and Chimes Single Voice Choir Wind (other) Warm Pad 2021-1-19 Will * Improved end of text lists ID. * Revised CLI and Data2text for BPI reporting. Setting CLI input as ratio still to do. * CLI code for setting ratios in place (disabled) Don't yet know how to convert to actual value 2021-1-18 Will * Merged in MIDI LFO sync from Kristian. * GUI: Small Adsynth voice adjustments. * GUI: Voice resonance enable now resizes. it had been completely forgotten :( * BugFix: no LFO delay. lfoelapsed increment too big * Further work on handling occasional LV2 crash 2021-1-17 Will * Cleaned up ConsoleUI * Disabled YoshiWin code * Possible fix for LV2 first startup crash 2021-1-16 Will * Merged in new denormal code. * BugFix: attempt to access nonexistent window. DynFilter internal filter window 2021-1-15 Will * Revised the following instrument banks: Pads Strings Synth Internal & filenames match Instrument type specified 2021-1-14 Will * Revised the following instrument banks: Bass Brass Drums Guitar Organ Reed and Wind Rhodes Internal & filenames match Instrument type specified * Made instrument/ban list frames bigger. clicking near edges not always recognised 2021-1-13 Will * Minor update to GUI. * Updates to docs. 2021-1-12 Will * Started revision of part effects window. Now uses sanity check * GUI part effects dynfilter fully integrated. Nothing now uses YoshiWin, but if the header link is removed from ConsoleUI it fails to compile. I have no idea why! 2021-1-10 Will * BugFix: GUI Part effects text not resizing when changing effect type * BugFix: GUI oscsize/bufsize not seeing lowest setting. As these are always powers of 2 it was simpler to just use bitFindHigh and make an offset adjustment. 2021-1-10 Will * Removed ring mod sideband code. Proved to be unnecessary. * Fixed spelling errors! 2021-1-7 Will * Improved GUI sanity check. * Removed some redundant code from Interchange. it was doing nothing but still being processed 2021-1-6 Will * Unison Invert made dynamic. * Oscil phase random now label resizes. missed these earlier :( * Small AddSynth position adjustments. * Suppressed invalid history group warning. called as filer opens but don't know how * Stop Preset dirs creating just '/' 2021-1-5 Will * Merged in resize branch * Corrected date below 2021-1-5 Will Temporarily disabled ring mod sideband feature. Skipped over missing build numbers. Set release version 1.7.4 2020-12-27 Will Added recommendation to set inst. type when saving. 2020-12-23 Will BugFix: secondary instance banks not fiding local dir. 2020-11-15 Will BugFix: GUI not setting kit item names. 2020-10-29 Will *Updated docs. * Set release as 1.7.3 (mantenance) 2020-10-27 Will * BugFix: base func mod not enabled for triangle wave. 2020-10-25 Will * BugFix: Failing to load some .scl files. Microsoft format text generating blank lines. 2020-10-24 Will * Bugfix: Voice enable not recognised from voice list. 2020-10-8 Will * BugFix: Addsynth Global detune type range wrong. 2020-9-20 Will * BugFix: Indirect vector not being called. Copy and paste error :( 2020-9-20 Will * Removed very old commented out WidgetPdial code. It was a bit hacky and was long since superceded. 2020-9-16 Will * Split out engine processes from commandSendReal. * Found and replaced 2 magic numbers. Don't understand how sustainPedalEnable can ever be relevant in addVoice! (InterChange.cpp line 1969); * Split indirectMain out of indirectTransfers. * Cleaned up indirectMain. * Split indirectBank out of indirectTransfers. * Split indirectConfig out of indirectTransfers. * Split indirectPart out of indirectTransfers. * Split indirectScales out of indirectTransfers. * Spilt indirectVector & indirectMidi from indirectTransfers. 2020-9-11 Will * Fixed some confusing CLI info typos. * Corrected CLI anomaly with instrument default copyright. It was possible to set it outside the part context and sometimes this only worked for part 1. 2020-9-6 Will * Major revision of virtual keyboard. Controller values match existing settings. Displayed values updated when changing channel. RH button defaults recognised. * Updated Docs. 2020-9-4 Will * Slightly increased splash times and moved timeout point. * Moved Interchange Init to end of Synth Init. Ensures everything set before Interchange threads run. * Disabled all parts at start of default setting. 2020-9-2 Will * Simplified GUI code for button 3 use. * Temporary fix to virtual keyboard default controller. 2020-8-25 Will * Click on mixer volume clears all overloads on that column. But overload warning only set for currently visible row. * Small clarifying change to part send text in main window. 2020-8-24 Will * Enabling part kit items now goes through indirect transfers. Stops Xruns, but part is now silenced during this. * First time enabling of PadSynth applies parameters. Has to silence the part in the process. 2020-8-19 Will * Commented out 'Warnings as errors' in CMakeLists.txt Was causing problems for less experienced builders. 2020-8-19 Will * Reverted removal of lv2ext/programs#Interface Needed by Carla to identify banks. * Ensured last fix was applied to both yoshimi & yoshimi-multi 2020-8-18 Will * Bugfix: Segfault on LV2 due to untested thread join. * Cleaned up some warnings from lv2lint test program. Two warnings remaining. Also one fail I don't understand :( 2020-8-16 Will * Final doc updates. * Set release version 1.7.2 2020-8-16 Will * Doc updates - no code changes. 2020-8-12- Will * Merged in pull reqeuest for Kristian. Completes SubSynth frequency correction for all detune cases. * Further bank startup enhancement and enabled. Copies new default instruments into .share * Set latest Advanced guide. 2020-8-11- Will * BugFix: GUI kitmode entries updating wrong items. * Started work on Banks enhancement. Currently disabled. 2020-8-10- Will * Provisional fix for SubSynth frequency bug. 2020-8-8 Will * Removed references to Jack in LV2. Used time_t instead of jack_nframes_t * Applied patch from Hubert. Removed jack reference from LV2 cmake file. 2020-8-2 Will * Clarifed CLI 'solo' controls. * Further refinements to 'solo' NRPNs * Updated docs. 2020-7-30 Will * BugFix: NRPN 'Solo' not working. Changed actual control numbers. * Revised NRPN recognition, particularly shortform ones. * Updated docs. * Started ODF format of full list of CCs and NRPNs (in docs). 2020-7-26 Will * Merged following fixes from Kristian Avoid out-of-bounds phase when moving the phase slider of live voice. Fix unison phase randomness not being respected in sub voices. Optimize: Avoid running a full note update when only one part has changed * Reverted union for 'value' in command block. Not using the int version, and seems unnecessary. 2020-7-18 Will * CLI can now restore full key range for part and kit mode. * Unison enable button now correct when set from CLI. * Updated docs. 2020-7-16 Will * Updated user guide to include latest changes. * Changed AddVoice delay slider to not show boxed value. It makes the track longer and it's already in the tooltip. 2020-7-16 Jesper * Added dynamic tooltips for AddSynth phase offset sliders, waveform editor per-harmonic phase offset and magnitude sliders, and SubSynth per-harmonic magnitude sliders. * Changed direction of per-harmonic phase offset slider in the waveform editor to make it consistent with other phase offset controls. 2020-7-14 Will * Manual correction NRPN History MSB 2020-7-8 Will * Updated Advanced User Manual 1.7.1 +. Still carries 1.7.1 version in the filename. 2020-7-6 Will * Corrected dynamic tooltip for engine level pan controls. * Implemented dynamic tooltip for pan width controls. Repurposed the (now redundant) panningRandom type. * Framed and highlighted engine level Vol/Pan control groups. They now look like the stock inserts. * BugFix: Messed up voice selection with above changes :( 2020-7-5 Will * BugFix: Part edit SubSynth button showing wrong colour. * BugFix: EQ effect not showing correct controls active. Particularly when loading patch/instrument. * Default bank ID correction. * Doc Updates. 2020-7-2 Will * System Effect Enable now MIDI-Learnable. * Part Effect Bypass now MIDI-Learnable. * Unified all float to bool conversions. * Some minor style cleanups. 2020-6-20 Will * BugFix: New stand-alone startup crashing on some window managers. Now using a different (non-threaded) structure. * Small bank cleanups. 2020-6-19 Will * Moved bank refresh thead message from SynthEngine to main. doesn't seen relevant for LV2. * Moved NewSynth thread message to end of startup code. * Moved Fl::lock to early in main(). * Early start message now in detached thread. 2020-6-18 Will * BugFix: banks doing unnecessary rewrites to local/share A minor banks issue also seen - to be fixed. 2020-6-12 Will * Applied patches from Marco for additional LFO types. 2020-6-10 Will * Further work on random pan for compatibility. Should be complete now! * Found some magic numders used for 'type' :( 2020-6-8 Will * AddVoice Listitem now sees mod oscilator. Not yet fully updated. * Fixed regression: listitem freq slide now correct. 2020-6-7 Will * Random pan width enabled for CLI. * Unified CLI panning controls. * Updated docs. 2020-6-6 Will * Trial of PadSynth random width control done. * Trial of SubSynth random width control done. * Added forgotten PadSynth random load and save :( * Trial of AddVoice random width control mostly done. Voice list not included yet. 2020-6-5 Will * Added line in AddNote.cpp ring mod code for amp mod. Commented out, but there for trials. * General cleanups and removed reduntant code. * BugFix: Request for invalid root reports, but still sets it! 2020-6-4 Will * First trial of AddSynth Gobal random width control. Has partial legacy compatibility. 2020-6-3 Will * Unified random panning, with variable position and width. Fixed values until parameter setup and control done, but follows pan law. 2020-5-30 Will * CLI only shows GUI sys/ins effect changes when visible. Updates the settings but doesn't change selection shown. 2020-5-27 Will * GUI and CLI fully in sync for Add, Sub, Pad enables. Includes correct action for kit mode. 2020-5-20 Will * Separated out CLI SubSynth and PadSynth overtones. * Separated out CLI de-pop and punch. * Separated remaining CLI controls and deleted partCommon 2020-5-19 Will * Fixed regression CLI not enabling PadSyth. * Separated out CLI engine detune controls. 2020-5-17 Will * Moved CLI part specific controls from Common to Part. Don't know why they were in Common anyway. * Changed CLI kit mode Disable to Normal. Clearer, and less chance of confusion. 2020-5-16 Will * Separated out part, engine, kit enable controls. This actually slightly reduces the code, and reduces complexity significantly. There may be some GUI anomalys when CLI controlled. 2020-5-15 Will * Separated out CLI engine level volume, pannning, velocity. This results in doplication but less complexity, and less chance of control additions causing problem, 2020-5-14 Will * BugFix: Reverb type to bandwidth not resetting BW control. * Corrected some controls still using direct numbers. * Note On/Off fully respects multiple same note in Poly mode. * Added 'Cracked Chimes' to Companion bank. * Moved '.config/yoshimi/yoshimi.history' to: '.local/share/yoshimi/recent' This is for XDG compliance, as it is not a config file. 2020-5-13 Will * Reverted PART_POLIPHONY and POLIPHONY to single limit. * Refactored noteoff code. * Refactored and changed setnotelimit to enforcenotelimit. This still isn't corrected when changing the key limit downwards by more than one as it only removes the oldest. * enforcenotelimit now loops to remove all older notes :) * BugFix: GUI Part volume control not working. It was still using direct numeric entry so failed when the recent change of control values. 2020-5-9 Will * Merged GUI fixes from Kristian. * Reinstated ocsillator window saving. Fault was due to missing window test in PadSynth UI :( 2020-5-9 Will * BugFix: Disabled oscillator window saving caused segfaults. * Reorganised several enable control values for consistency. * Doc updates. 2020-5-4 Will * BugFix: CLI not responding to engine on/off. Caused by aftertouch controls shifing part enable. Temporarily fixed by swapping the list order. Need to sort out properly so CLI uses correct controls. 2020-5-2 Will * Added waveform to remembered window positions. 2020-5-1 Will * BugFix: new highlight not recognised for higher numbers. Loss of precision. * Removed highlight from MIDI - possible race. * Added switch in config to enable/disable highlighting. Default is 'off'. 2020-4-30 Will * Latest instrument now recognised by CLI. * Saving to bank also recognised as latest. * More refinements to BankUI. 2020-4-29 Will * Initialisation and memory leak fixes found by Stefaan. * Reverted hidden buttons in instance > 0 bank windows. It was causing confusion especially for LV2 users. * Added bold highlight for last instrument load from bank. 2020-4-26 Will * Further work on incompatible file recognition. 2020-4-23 Will * Confirmed Modulator improvements from Kristian. * Started recognition of default and changed zyn files. 2020-4-20 Will * Added Resonance to managed windows. Forgotten earlier :( * Final doc updates. * Set release version 1.7.1 2020-4-19 Will * Includes GUI SysEf Send GUI bugfix from Jesper. * Reinstated aftertouch modulation. * Fixed foldback at zero for channel. Might not be correct at zero for key. * Added tooltips to aftertouch controls. * Set version as 1.7.1 rc5 2020-4-18 Will * BugFix: Segfault due to change in commit 817fbc6ea91a064839eebae1f54efc20753cb927 Only seen by 1 person so far. * Trapped rogue dir in file list for directory copy. * Confirming Bugfixes. * Further doc updates. * Set version as 1.7.1 rc4 2020-4-17 Will * Changed PART_POLY to PART_NORMAL. It could be confused with PART_POLIPHONY. * Changed POLIPHONY - 20 to PART_POLIPHONY. * Moved default poliphony for parts from Part.cpp to globals.h * Yet more doc updates! * Set version as 1.7.1 rc3 2020-4-15 Will * Minor correction to AddSynth Voice/List window position fetch. They were refetching last saved position even when moved. * Removed some redundant code. * Cleared pedantic error/warning traps in CMakeLists.txt * Further doc updates. * Set version as 1.7.1 rc2 2020-4-13 Will * Doc updates - no code changes. 2020-4-11 Will * Aftertouch Modulation temporarily hidden. Not satisfied with it's operation. * Set version as 1.7.1 rc1 2020-4-9 Will * Adding new bank roots will offer to create them if missing. Not CLI yet. 2020-4-8 Will * Corrected Part panning range. Didn't quite reduce extreme left to zero. 2020-4-7 Will * Corrected direction of Pan Law Boost. 2020-4-6 Will * Added presets broweser to remembered positions. * Disabled aftercouch emulation. * Added Stefaan to Yoshimi_Helpers. 2020-4-2 Will * More refimentments to the text messaging and actions. Not yet available to the CLI. * Added Volume to channel aftertouch. 2020-4-2 Will * BugFix: MIDI-Learn initialsing killing GUI startup warnings. * Imroved first time startup messages and bank actions. 2020-3-31 Will * fftw3.h now only included in DSP/FFTwrapper.h All other uses refer back to this. * Fixed sample step size now only calculated in one place. Previously done in many places requiring two indirect fetches and a division. Now just one indirect fetch. * sent_all_buffersize_f renamed to fixed_buffersize_f The previous name was confusingly incorrect. * Applied similar optimisations to oscllator code. 2020-3-30 Will * Completed transfers to improved GUI windowing. Some tidying yet to do. 2020-3-29 Will * Fixed regresssion. Loading MIDI-Learn not displaying. * MIDI-Learn and Vector added to improved GUI windowing. * Mixer, Banks, VertKeyb added to improved GUI windowing. * Console, Scales added to improved GUI windowing. * ADnote, PADnote, Subnote added to improved GUI windowing. 2020-3-28 Will * Merged in panning law control. * Added 'Yet Another Flute" to 'Companion' bank. * Temporarily disabled hiding engine type colours. Related code will be removed later if no objections. * Unified GUI numbering of config window files. * First trial of improved GUI window positioning. Only controller windows so far. * Create GUI window directory! * Moved panning law from config to patch sets. 2020-3-26 Will * Aftertouch fully MIDI-Learnable. Also blocks normal control action by default. * AT GUI follows standard right button close practice. * Updated docs. 2020-3-22 Will * Added Filter Q to aftertouch. * Re-enabled negative filter cutoff. * Updated docs. * Made channel AT emulation in MusicIO.cpp configurable. 2020-3-21 Will * Enabled CLI access to aftertouch. * Updated docs. 2020-3-20 Will * Move aftertouch CC selection fully into 'part'. This enusres all parts independently see it. 2020-3-19 Will * Stop state file opening an empty MIDI-Learn window. 2020-3-18 Will * Merged in revised legato code from Iain. * Implemented Channel aftertouch. More to do on this. * Completed Channel aftertouch. * Second attempt at completion :( 2020-3-17 Will * Implemented Modulation PolyAT. 2020-3-15 Will * Created GUI for PolyAT. Can't yet run two effects at the same time. * PolyAT saved in patch sets. * Temporarly hid PolyAT negative filter cutoff. It doesn't work at all well :( * Both PolyAT effect can now be run together. 2020-3-12 Will * Small refinements to PolyAT. 2020-3-10 Will * Merged in first trial of PolyAT. Currently fixed as filter cutoff. * Corrected Mixer channel colours for Solo. * PolyAT can do lowering as well as raising filter cutoff. * Defined some PolyAT types in globals.h 2020-3-7 Will * Installed full placeholder for key pressure detection. * Provided emulator for key pressure in MusicIO.cpp. 2020-3-6 Will * Patched in additional Solo type 'Channel' from Matthew. Made a few minor corrections. * Applied some optimisations to Solo Channel mode. * Updated docs. 2020-3-4 Will * Revised Solo switch selection for performance and clarity. 2020-3-3 Will * Merged in various fixes from Iain. * BugFix: not closing directories after use :( * Revised file/directory copying. Options are now: always write, only missing, only newer 2020-3-1 Will * Improved code for spacing new bank IDs. * BugFix: LV2 not updating MIDI-Learn GUI. Reinstated original window control, but now with correct action being set! 2020-2-17 Will * Implemented Hyperbolic Secant Waveform option. * Converted waveshape numbers to labels. * Adjusted some CLI text. 2020-2-14 Will * If no banks are found at startup a new one is generated. This will be in the .local directory and will contain one subsynth instrument. 2020-2-13 Will * BugFix: MIDI-Learn crash if accessing non-exisitent effect. This need more work to correctly report to the CLI. * Suppressed test message in filterUI. * Updated docs. 2020-2-11 Will * Corrected MIDI-Learn save title bar. * New bank structure almost complete. There is a workround for an anomaly where startup seems to create phantom empty banks. 2020-2-9 Will * More revision of banks code. Still some startup anomallies. * Provisional fix for CLI part setting oddity. Need to do more on this. 2020-2-8 Will * Corrected CLI not setting bank from top level. * Further improvements to missing root/bank handling. * Transfer of default banks to .local in place. Still some corner cases to be sorted. 2020-2-6 Will * .local/yoshimi now changed as /local/share/yoshimi * Copyfile can now copy only if newer. Also passed through copydir. * Copying defaults to .local/share/yoshimi uses 'newer' 2020-2-4 Will :rebank: Basic structure mostly complete. :rebank: Testing for defects and redundant code. :rebank: Removed considerable redundant code. :rebank: Define bank root at strartup restored. This appears to have been lost some time ago. * Completed merge of rebank. * Found and removed aditional redundant code. 2020-2-3 Will :rebank: basic structure now in place. 2020-2-2 Will :rebank: started new root/bank structure. 2020-2-1 Will * Building bank root uses new listDir( * Revised bank and file permissions. * Revised & simplified fresh population of banks. * Removed redundant code. * Revised and sinplified loadbank( * Further revision of bank population. 2020-1-31 Will * Changed .bankdir references in Bank( to validBank label. * Added 1st version .bankdir file to all default banks. * importbank, loadbank use new listDir( * BugFix: Segfault changing LFO type. * Set bugfix version as 1.7.0.1 2020-1-30 Will * Added std::list for directories in file manager. This will mostly be used by Bank( 2020-1-29 Will * Started pulling direct file access out of Bank( 2020-1-28 Will * Created new presets dir in .local/yoshimi This will be populated from non-writable default directories, and new build ones. * Doc updates. 2020-1-25 Will * BugFix: GUI 'Save External' using wrong name. 2020-1-23 Will * Revised essential config parameters. Main no longer needs complex saved hidden files. 2020-1-21 Will * Unified xml pointer names. Makes code a bit easier to follow. 2020-1-20 Will * BugFix: AddVoice GUI update not right from CLI/MIDI. * Combined definition of sizes in Bank.h with globals.h 2020-1-19 Will * New master mute system now in place. * Moved location of Fl::Lock() in LV2 As suggested by Rob to resolve odd CLI output. * Some minor adjustments in indirectTransfers. Gets rid of magic number. 2020-1-18 Will * Added explanatary comments to code. * Doc updates. * Set release version 1.7.0 2020-1-15 Will * GUI no longer changes part when changing bank. * Removed redundant bank code. * CLI now tracks part number when set elsewhere. * Set version as 1.7.0 rc8 2020-1-13 Will * Mod. oscillator warning number out of field. * Fixed compiler warning from PadSynth. 2020-1-10 Will * Final doc updates ready for release. * Set version as 1.7.0 rc7 2020-1-9 Will * Corrected jack autoconnect. * Updated user manual. 2020-1-8 Will * Fixed regression. Some startup arguments not seen. * Other refinements to config files. * Set version as 1.7.0 rc6 2020-1-7 Will * More MIDI-Learn refinements. * Corrected wrongly reported NRPN values. * Set version as 1.7.0 rc5 2020-1-6 Will * BugFix: Editing MIDI-Learn lost NRPN status. * Removed legacy NRPN detection. * Revised MIDI-Learn internal data blocks. Uses resolveAll function, not embedded text. * Removed redundant MIDI-Learn code. * Set version as 1.7.0 rc4 2020-1-6 Will * BugFix: State load not updating MIDI-Learn GUI. * Removed legacy min/max double check. It created a corner case error when min/max are reversed. * Set version as 1.7.0 rc3 2020-1-2 Will * Merged in filter bugfix. * BugFix: MIDI-Learn window not auto opening. * Included new user guide. * Set version as 1.7.0 rc2 2020-1-1 Will * Updated copyright notices * Updated local copy of advanced user manual * Set version as 1.7.0 rc1 2019-12-31 Will * Made slider knobs respond to mouse clicks. Why was this missed for so long? * Added names to Yoshimi Control Numbers.ods * Doc updates. 2019-12-28 Will * Removed modal from instrument search window. Should never have been set! No need to block. 2019-12-23 Will * Resolved warnings given by GCC V8. * Corrected appdata errors reported by debian. 2019-12-21 Will * Small adjustment to User manual. * Updated ToDo list. * Set version as 1.6.1 M 2019-12-15 Will * Minor text/info corrections and updates * Changed Anote, Afreq to refNote, refFreq saved XML label NOT changed! * Set release version as 1.6.1 2019-12-10 Will * Updated documentation. * Reinstated undocumented "zread" CLI time test. 2019-12-02 Will * yoshimi.state auto-moved to yoshimi-0.state. * Updated local copy of user manual. * Set version as 1.6.1 rc1 2019-12-01 Will * Found way to defer UUid message after setup. * Some final? cleanups to session management. 2019-11-29 Will * State fully integrated in session management. * Jack session almost completly done. Seem to have broken saving :( * Temporary fix for Jack session save. 2019-11-28 Will * Began state machine for all session managment. * Default state done with lockin prevention. 2019-11-27 Will * Added version numbering to the banks file. This will be relevant with coming changes. * Reinstated instance control of Sample Rate. * Reinstated instance control of Buffer Size. * Reinstated instance control of Osc. Size. These are actually needed for Jack session control and startup state. * Rationalised state/session files. Still not correct though :( Placed too late in the startup sequence but segfaults if put in the 'logical' place. 2019-11-26 Will * Updated local copy of User Guide. * Removed test messages from ALSAEngine.cpp 2019-11-25 Will * Performed major reoganisation of config files. yoshimi.config only has base parameters there is a new yoshimi-o.instance file no instance files include base parameters no state files include base paramters * Removed extra redundant config code. * Further refinements to startup config. * Fixed potential memory leak. * Small code cleanups. * Doc updates. 2019-11-23 Will * ALSA search connects to all ports, not just 0. 2019-11-23 Will * Implemented search feature for ALSA MIDI input. * Updated docs. * Updated local copy of User Guide. 2019-11-21 Will * Removed redundant code. * Improved CLI bank info. 2019-11-20 Will * CLI code refinements. 2019-11-19 Will * Revised text reporting of on/off values. * Revised text reporting of integer/float values. * Further reporting improvements. * More CLI named entries (not PadSynth yet). * Updated local copy of user guide. 2019-11-18 Will * Corrected some minor errors in CLI lists. * Updated local copy of user guide. * Removed redundtant CLI command. * Further updates to user guide. 2019-11-15 Will * Applied experimental optinisations to OscilGenUI. * Minor correction to CLI info lists. * Further small adustment to OscilGenUI. Confirmed OK on Raspberry Pi. * Revised CMakeLists.txt NEON changed to RasPi4. (it never worked before anyway!) * Disabled all references to fl_line_style. Now always solid lines, can't see dots and dashes anyway, and they slowed down the raspberry pi. 2019-11-13 Will * Revised CLI part controllers code and messages. 2019-11-12 Will * Confirmed mxml fix for LV2. * Set bugfix version 1.6.0.3 2019-11-10 Will * Fixed forced shudown failure from GUI in ALSA. It's rather a hack in UI/MasterUI.fl Look for 'if (force)' for details. 2019-11-8 Will * Mixer Panel format can be changed from config. This alows control form typical 7in displays. * GUI suppress change warning on force exit. 2019-11-7 Will * Proposed fix for mxml 3.1 failure with LV2. 2019-11-4 Will * Code cleaups after merging in locks branch. 2019-11-2 Will * Finding bank name needs specific root ID. * Revised CLI bank removal code. * Query message goes to current destination. * Reverted 'A' note limits and corrected terminology. Note range is now 24 to 84. Frequency range 30Hz to 1.1 kHz. * Added more labels for new bank commands. * CLI reports Ref. note and numbers. * CLI reports on/off for scale switches. * CLI can read scale name and description. 2019-11-1 Will * NRPN can shutdown with exit value 16. * Updated docs. 2019-10-29 Will * Restored original ALSA audio thread. We need these messages for Raspberry Pi. 2019-10-23 Will * Further CLI test list revision. 2019-10-22 Will * Instant (forced) exit also available from GUI. Hit ctrl with menu exit, just before with WM exit. This will not save any pending changes. 2019-10-21 Will * Revised CLI lists for consistency. * Added 'CMakeListsOLD.txt' Done in case of unexpected issues with merge from Iain - cmake has a bad rep for that :( * Forced CLI exit from Yoshimi returns 16 instead of 0 2019-10-18 Will * BugFix: segfault changing scale name or description. * Added instant close of all instances to CLI exit command. * Improved CLI description for scale/keymap imports. * Set bugfix release 1.6.0.2 (includes Kristians oscillator fixes) 2019-10-16 Will * Missing include in main.cpp when compiling headless. * FLTK ref. in Misc/config.cpp when compiling headless. * Changed CliFuncs readPartPeak to allow left/right. Not currently in use. 2019-10-15 Will * Revised SubSynth and Oscillator Harmonics GUI. Central numbering and wider subsynth spacing. 2019-10-14 Will * Ensure report to stdout when running headless. * CLI can now save to banks slot. * Revised instrument save to bank. * Updated docs. * Removed redundant labels in globals.h * Corrected docs. * Small revision to BankUI instrument control. * Replaced all refs to "Simple Sound" and "No Title" with constants. 2019-10-12 Will * CLI can now change bank instrument names. * Revised GUI bank instrument names. Previously a rename performed a complete bank refetch. Now set the name in place. * Corrected accidental variable name change. * Revised example presets. * Further small refinements to CLI. Also added comments to globals.h 2019-10-11 Will * Minor corrections for headless build. 2019-9-26 Will * Refined data2text to clarify structure. * BugFix: CLI not selecting which kit item effect from the three part effects. It was changing the actual effect instead. 2019-9-25 Will * Reverted cmake change from Iain With GCC it breaks on readline :( * Reverted change to 'data2Textfrom Iain In the CLI kit items > 1 don't report the waveform as text. 2019-9-24 Will * All CLI effects correctly reporting. * Corrected anomaly CLI with sys/ins send. 2019-9-22 Will * Most CLI effects switches reported as text. * Updated docs. 2019-9-21 Will * Further refinements to listing / text lists. * Rationalised detune type values. No more shuffling between CLI, GUI and engines. * Updated docs * CLI reports LFO text instead of number. * BugFix: CLI alienwah missing random entry. This could cause a segfault. 2019-9-20 Will * BugFix: CLI detune type inconsistencies. * CLI reports waveform text instead of number. * CLI filter category/type also reports text. 2019-9-19 Will * Improved CLI bank controls and lists. * Removed requirement for CLI 'read' suffix. Some contexts can now give useful information with a simple 'read'. 2019-9-18 Will * CLI can now set bank names. * Converted GUI bank name controls. * Updated docs. 2019-9-17 Will * CLI conversion done for select bank & root. Listing not done. * Activated CLI bank lisiting for defined entries. * Converted GUI entries for bank & root selection. * Implemented change root ID for CLI. * Converted GUI entry for change root ID. 2019-9-16 Will * Started revision of bank controls. Some CLI stuff not yet done properly. * Updated docs. 2019-9-11 Will * Forgot CLI 'return' for default copyright :( 2019-9-10 Will * CLI can now set copyright field. * CLI can now load/save default copyright. * Corrected config list values. part and channel numbers off by 1. * Updated docs. 2019-9-9 Will * ALSA can autoconnect to multiple MIDI inputs :) Now uses a comma separated list. * Moved Jack MIDI aoutconnect to correct place. It doesn't work (in either location), but nor does V 1.4.1 where it used to, and was first implemented. * BugFix: Config.cpp orphaned cout, cerr, endl when 'using' changed in header. * BugFix: Config.cpp orphaned to_string when 'using' changed in header. * Improved CLI part instrument type controls. 2019-9-8 Will * BugFix: Loading files failed with mxml V 3.1 :( * Set version as 1.6.0.1 * CLI can now set instrument comments. 2019-9-7 Will * CLI can now set instrument type. * Removed outdated 'Yoshimi Control Numbers.txt' * Updated 'Yoshimi Control Numbers.ods' 2019-9-6 Will * A corrupted config file no longer aborts. A message is given stating defaults are used. 2019-9-1 Will * Final doc updates. * Set release version as 1.6.0 * Merged in bugfix for BSD. 2019-8-30 Will * Small GUI correction for AddSynth. * Manual Updates. * Set version as 1.6.0 rc5 2019-8-24 Will * Doc updates. * Minor correction to CLI test list. 2019-8-24 Will * BugFix: CLI effects out of sync with GUI (and actual) 2019-8-23 Will * Fixed resonance regression (not recognising point 255) Found by Jesper, caused by clash of numeric control numbers. 'parameter' now used for point number. * Improved effects handling/reporting for CLI. * Set version as 1.6.0 rc3 * BugFix: Crash when cancelling part >1 effect bypass. * Added missing CLI effect bypass control. * Set version as 1.6.0 rc4 2019-8-22 Will * Fixed effects regression (not MIDI-Learning) Found by Jesper, and caused by the change from numeric a value for the learn flag being changed to an enum with a different value. * Identified MIDI-Learn GUI message control number. * BugFix: CLI not setting resonance point 1. Further resonance issues to resolve. * Set version as 1.6.0 rc2 2019-8-19 Will * Added shortcut and ellipsis to GUI Instruments/Search entry. * Improved CLI instrument group comments. * Added error check for CLI bank/root CC selection. * Set version as 1.6.0 rc1 Yay :) * Set and updated manual version. * Updated docs and metadata. 2019-8-18 Will * Implimented formal calls for instrument Engine/Type checks. * Implemented CLI access to instrument Engine/Type checks. * Updated docs. 2019-8-17 Will * CLI osc and mod types show names not internal values. * Cleanups around CLI mod types. * Added missing merge reference to this file. * BugFix: segfault on CLI attempt to change modulator panning. It doesn't exist! 2019-8-16 Will * Merged extensive refactoring from Hermann into master. 2019-8-15 Will * Doc updates * Updated Miscellany/Images 2019-8-12 Will * Updated Miscellany/Images/PartEdit.png * Removed incorrect attribution in Effects/Reverb.cpp * Corrected wrong CLI reporting of voice oscillator. * Updated docs. 2019-8-9 Will * Added Rainer to people list in GUI. * Updated dev_notes. 2019-8-6 Will * Further refinements to ring buffer code. 2019-8-4 Will * Reinstated Cormi_Sound bank. This seems to have been lost at some point. * Revised specimen presets. * Updated user guide. 2019-8-2 Will * Created new CLI directory. Moved main command line files there ready to split them up. * Moved buffered read and write from CmdInterface to MiscCLI. * Most utility functions moved from CmdInterface to MiscCLI. 2019-8-1 Will * Adjusted new instrument group controls to Yoshi standard. * Implemented CLI access to group controls. * Moved static lists from CmdInterface.h to TextLists.h * Moved reply enums into dedicated namespace. 2019-7-31 Will * Small bank refinements. * Bank search window first starts with Piano. * BugFix: Part not setting instrument labels. * Updated Miscellany/Images * Added protection against overlength lines in CLI. Max size is set to 252 chars but longest Yoshim1 command is less than 180. * Disabled bank search window if not showing engine types. * Added warning if no entries in bank search window. * Re-enabling system effects does a cleanup first. this is so you don't get any stale data sounding. * Cleanup also done when clearing bypass. 2019-7-30 Will * Applied work-round so paste updates GUI effects. * Small optimisation in mediate. * Implemented bank search by type. 2019-7-29 Will * GUI offset added to collect_readData. * GUI offset added to collect_data. * GUI offset added to fetchData. * BugFix: Memory overrun in ring buffer. * Moved envelope 'X' from miscmsg to offset. * Updated docs. * Corrected date. * Moved formant vowel from miscmsg to offset. * Updated docs. 2019-7-28 Will * Copy-paste cleanups. * Started separating miscmsg from other controls. * Renamed all GUI par2 labels as miscmsg. * Fixed regression CLI off by 1 history list loading. * All CLI changes complete. 2019-7-27 Will * Moved (now common) preset lists to base parameters. * Considerably re-factored copy-paste. * Added preset error reports to GUI. * Enabled management of old and new preset types. 2019-7-26 Will * Managing preset roots now use standard Yoshimi calls. Not yet accessible to CLI. Add root failure not yet reported to GUI. * Updated docs. 2019-7-23 Will * Corrected preset store save - was wiping out others :( * Added placeholders for better preset directory controls. * Corrected date of last changelog entry! 2019-7-22 Will * Preset directories now unified across instances. Selectable without re-ordering but a lot of code cleanup still needed. * Updated manual. 2019-7-21 Will * Failed to actually add manual to commit :( * Preliminary ideas for preset roots. * Converted envelope type numbers to labels. 2019-7-19 Will * Temporary install of provisional 1.6.0 manual but named as 1.5.12 2019-7-15 Will * Made more bank calls require root and bank. 2019-7-14 Will * Revised LV2 code Re. buffer sizes. * Included corrected full explanation in code. * Made more bank calls require root and bank. * Further bank refinements and removed redundant code. * Partially resolved LV2, Carla/Ardour now consistent. * Updated /Miscellany/Images. 2019-7-10 Will * Implimented formal calls to read current root and bank. * All instrument name bank calls now require root and bank. current values no longer assumed. * Applied minor buffer size optimisation. Size could have been needlessly greater than incoming. 2019-7-9 Will * NRPN for load from history now includes MIDI-Learn. * Found more magic numbers to convert in Resonance. * Improved Resonance CLI responses. 2019-7-8 Will * Resolved potential ambiguity in GUI switch switch exit. 2019-7-1 Will * Implemented non-destructive system effect on/off. * Updated docs. * Some code cleanups. * Replaced more numbers with labels. * Added 0059 Rich Bass to Companion bank 2019-6-27 Will * BugFix: GUI not exporting banks. CLI was working fine. * Improved some bank error reports. * Made most filemanager methods static. Used static calls instead of class in bank. * Most calls to bank now require implicit bank/root. 2019-6-27 Will * Removed remaining bank message transfer conversions. 2019-6-26 Will * Added in missing new files :( * Refinements to data->text conversions. Specifically so that MIDI-Learn text doesn't include the current value or such as 'on/off' responses. * Removed some bank message transfer conversions. These are now entirely within one low priority context so there is no need to use miscMsg functions. * Added copyright notices to Data2Text files. 2019-6-25 Will * Moved data->text conversions to new file 'Data2Text'. 2019-6-24 Will * Swapped menu entry Yoshimi/MIDI-Learn ~ button-Reports. * Improved MIDI-Learn internal links. * Partially separated text replies from respondents. * BugFix: voicelist enable calling MIDI-Learn. 2019-6-22 Will * Clarifed system mute controls. Also added extra sanity checks. * Implemented new NRPN for load from history. Not MIDI-Learn yet and Instruments only 16 parts. * Updated NRPN docs. * Improved history NRPNs. Easier to use and greater flexibilty. * Updated docs (again!). 2019-6-21 Will * Revised message handling in indirectTransfers( More compact and easier to adjust. 2019-6-20 Will * Implemented recent file history locking. Currently CLI only. * Improved string list searches. * Completed locking including GUI controls. * Modified indirect controls for direct reads. * Updated docs. 2019-6-18 Will * Extended 'CommandBlock' Changed value to union of float F & int32_t I i.e. union{ float F; int32_t I; } value; 2019-6-17 Will * BugFix: instances loading wrong default state on reset. * Refined FLTK locking in UI/MiscGui.cpp * Added recognition of files seen this session. Currently only applied for enhanced Instrument save protection but likely to be extended. 2019-6-16 Will * Unified XML and history types. 2019-6-10 Will * Corrected actual ringbuffer sizes. It was still multipying by blocksize after previous correction to size calculation. 2019-6-4 Will * Completed CLI bank slot deletions. Also integrated GUI controls. 2019-6-3 Will * CLI can now delete bank slot instruments. Notifications not complete yet. * Updated docs. 2019-6-3 Will * Applied modulation patch from Kristian. * BugFix: Message list clearing was too agressive. This prevented state loads from including MIDI-Learn control names. * BugFix: Load instrument by name failed for yoshi type. Unless there was also a zyn type. 2019-6-1 Will * Corrected ringbufer size calculation. 2019-5-31 Will * Merged in bank and program improvements. Separated out: Load instrument by name Load instrument from bank Set current root or bank Updated docs * Additional code and doc cleanups. 2019-5-29 Will * BugFix: Several bad integer types for BSD * BugFix: CLI not seeing MIDI program changes. 2019-5-27 Will * BugFix: Start message lockup only on Gnome or KDE 2019-5-26 Will * BugFix: CLI load MIDI-Learn list from history failed. * Moved some parameters out of par2. * Updated docs. 2019-5-25 Will * Enabled part level sound cutoff instead of -40db. * Doc updates in dev_notes. 2019-5-22 Will * BugFix: Midi CCs not updating GUI. 2019-5-21 Will * Fixed regression not muting when loading patch sets. * Resolved spurious EQ setting message when loading. * Rearanged 'type' bits removing doubling up. This also permitted streamlining of much of the code. * Remove or commented redundant test routines and info. 2019-5-20 Will * GUI updates almost complete. * Corrected date of previous commit. * Fixed regression effects preset colour not changing. * Updates completed :) 'parameters' no longer doubles up for routing. 'type' no longer carries sources. It currently has three spare bits but they will be used to remove the doubling up of some functions. 'source' has up to 14 unique IDs + all and none. It also now carries routing information and has one spare bit. The control block has three spare bytes. One will be used for misc messages, separating them from par2. Another may be used as scratch space for private controls applying only to specific sources. 2019-5-19 Will * Some minor corrections to transferred controls. * Completed conversion for CLI. * Almost completed conversions for GUI. Still to do UpdateAfterSet and returns detection of gui source - fiddled for now. * Applied New Modulation patch from Kristian. Corrects several mistakes. 2019-5-18 Will * Low prio and Loopback transferred in Interchange. Copied across in CLI and GUI. * MIDI, CLI, GUI transfered from type to source. 2019-5-17 Will * Started transfering Low prio and Loopback from control block parameter byte to source byte 2019-5-16 Will * Added CLI access to extended modulator control. * Added CLI access to Spot noise. * Updated docs. 2019-5-12 Will * Moved hidden filenames from globals to main. Only place they ever need to be identified. * Moved instance start out of loop. Slightly improves timing. * Added extra message when loading manual. * Edited docs. * Set release as 1.5.11 * Added missing Manual :( * Set release as 1.5.11.1 * Merged in Foward commits. * Made Instance control and Spot noise permanent. 2019-5-11 Will * Further work to improve multi-instance. * Additional changes to thread code. Also removed some poorly performing ideas. 2019-5-10 Will * Final tweaks to code. * Applied rough fix to startup overloads. Only applies to secondary instances. * Updated docs for release. * Updated meta-info. * Set version as 1.5.11 rc4 2019-5-9 Will * Added code to ensure hidden gui enable is in sync. * Moved some mallocs to prevent memory leaks. Would only occur under abort conditions. 2019-5-8 Will * Trial of startup display Currently disabled. * Some cleanups. * Corrected previous changelog message. * Startup display now working. * Set version as 1.5.11 rc3 2019-5-7 Will * Further improvements to instance behaviour. Time delays are almost entirely due to GUI slow startup. This has been an issue for a very long time. * Put Autostart back on direct call. Still problems with GUI when threaded. * Set version as 1.5.11 rc2 2019-5-6 Will * Improved new/multi instance behaviour. There is still an issue with the gui causing occasional crashes :( * Set version as 1.5.11 rc1 2019-5-5 Will * Completed padSynth parameter conversions. * Enumerated history lists. * Improved history list internal structures. * Moved most additions from synthEngine to Interchange. This was done so that loading (say) a state file didn't falsely update/corrupt other history lists. 2019-5-4 Will * Added CLI access to spot noise. * Linked spot noise appearance to single master feature. * Rationalised interchange parameters for setpadparams. * Updated docs. 2019-5-3 Will * BugFix: Primary definition of singlePath in wrong file. * 'Enable Single Master' now always hidden for LV2. It's not relevant to it at all. * CLI can now handle single master control. * Updated docs. * First trial of spot noise. 2019-5-1 Will * All Interface files have no 'using namespace std' * All MusicIO files have no 'using namespace std' * Single master instance now properly accessed. Not CLI yet. 2019-4-30 Will * Single master instance now switchable from GUI. Also made some refinements to code allowing this to be hidden until certain it's safe. * BugFix: Crashes on some systems when opening the GUI. * Refined instance startup tests in main() 2019-4-25 Will * Added PART_POLIPONY to globals It had been defined numerically in two places! * Added PART_POLY, PART_MONO, PART_LEGATO, MIDI_LEGATO MIDI_NOT_LEGATO to globals These had been set numerically in multiple locations. * More transfers from 'using namespace' to 'std::' 2019-4-24 Will * Added tooltips to master and part VU meters. * Single main instance now seems correct. A first start double-click will still start two separate instances, but all other combinations will start just one, without risk of a crash through tring to start multiple instances at the same time. 2019-4-23 Will * Removed redundant 'detach' thread element. * Started entering 'std::' not 'using namespace'. This removes potential ambiguities, especially as we are now using local namespaces heavily. * Some code cleanups. 2019-4-22 Will * Internal 'no action' moved to new source byte. * Adjustments to new placeholders. 2019-4-21 Will * Set placeholders for new type/source bytes. * Applied warning patch in main.cpp from Hermann. * Doc updates * Click on mixer part VU now cleared limit warning. 2019-4-20 Will * BugFix: Adnote voice modulator damping incorrect. * Further work on auto single main instance. * Changed control block from 12 to 16 bytes. This will enable us to split source from type and miscMsg from par2. Also gives 2 spare bytes. 2019-4-19 Will * Implemented separate L/R part VU metering. * Removed some direct calls from VU GUI to synth. * Added new miscMsgClear() function. Called on major resets in case of message leaks. * Some code cleanups and doc updates. 2019-4-18 Will * Made 'A' frequency entry box wider. * Master VU now fully cleared at startup. * Removed fake peak indication from disabled parts. 2019-4-15 Will * Added first time start info window. * Further small CLI refinements. 2019-4-15 Will * Implemented CLI MIDI controllers. This had been forgotten :( 2019-4-14 Will * CLI part common control text copied to sections. Being separate was confusing in some situations and not particularly helpful generally. 2019-4-11 Will * Fix 'A' note range as 329 to 660 Hz. * Added note info to /doc 2019-4-9 Will * BugFix: CLI not setting effect numbers. * Added named effects controls replacing some numbers. * CLI now shows a '?' for changed effect presets. * Some doc updates. 2019-4-8 Will * Removed /Misc/FileListItem.h It was never called, referenced or included. * A few minor cleanups. 2019-4-6 Will * Disable GUI Analog Phaser controls when not set. * Revised Gui Layout to make this more obvious. * Further adustments - Phase disabled for Analog. * Re-ordered controls. * L/R also disabled for Analog. 2019-4-3 Will * Converted Bank root control to MSB, LSB, OFF. * Undated docs. 2019-4-1 Will * Added more informative tooltips. 2019-3-27 Will * Completed GUi updates for effect controls. * Implemented master mono/stero switch. * Resets and state/patch loads clear mono/stero switch. 2019-3-26 Will * BugFix: MIDI-Learn now learn correct effect numbers. GUI still not updated correctly yet. 2019-3-23 Will * Corrected code indentation and missing bracket in UI/MiscGui.cpp 2019-3-22 will * Further adjustments to suppress GCC7 warnings. Some global enums changed to const unsigned char. CmdInterface/helplist() changed to char. * Added more warning/error traps to CMakeLists. * Removed some switch case dropthroughs. * Final GCC7 warnings suppressed? 2019-3-21 Will * Bugfix: Insert effect part list out of step. * Sorted out potential GCC7 build warnings. 2019-3-20 Will * Dynfilter insert done for local changes. No idea how to set for patch loads :( 2019-3-19 Will * Most effect warnings now correct. Still incorrect when loading :( * All part warnings correct. * Sys/Ins warnings done too. CLI not done though! * BugFix: Error loading instrument effects. Preset and parameter in wrong order. 2019-3-18 Will * More work on effect warnings. Still more to do CLI test messages in place 2019-3-17 Will * Temporarily disalbled Hi Res LFO. It will change! 2019-3-16 Will * Effect change recognises intstrument loads. * BugFix: CLI distortion not seing preset change. * Effect change sets now sets colour of field. Still some corner cases to correct. 2019-3-15 Will * LFO conversion done but CLI/GUI entries need improvenment. * Corrections in LFO conversions. * Effect change warning in place but not yet exposed to GUI and CLI. 2019-3-14 Will * Initial conversion of LFO speed toint32_t. 2019-3-12 Will * Waveform window now warns of lower voice edit. Doesn't yet say which one! * Voice and Modulator warnings done. 2019-3-10 Will * BugFix: Limits default wrong on DynFilter. System/Insert volumes reversed. * Set up label for lower voice oscillator warning. Not yet in use. Need to work out how. 2019-3-8 Will * Small improvement to CLI 'list' command. 2019-3-4 Will. * Updated docs. * Set release as 1.5.10.2 2019-3-3 Will * Applied mxml patch from Adam. * Temporarily disabled startup instance control for bugfix release. * BugFix: Instrument window not showing controls only first instance and called from bank window. 2019-3-2 Will * Moved gzipped loading from XMLwrapper to FileMgr. Used pointer to string to return error reports. 2019-3-1 Will * Added endian check for PadSynth export. * Revised ALSA endian check. * Made (obvious) improvement to endian detection. * Moved gzipped saving from XMLwrapper to FileMgr. This also fixed memory leak if saving failed. * Found several memory leaks in XML code all triggered by file errors. * Improved gzipped saving. 2019-2-28 Will * Added data block saving to Filemanager * Revised PadSynth export. WaveFile.cpp is now redundant. 2019-2-26 Will * MasterUI now only references files in widow code. * Removed file extension references in MicrotonalUI. * Removed file extension references in MidiLearnUI. * Removed file extension references in VectorUI. * Removed file extension references in config.cpp 2019-2-25 Will * No more direct file access in 'Cmdinterface'. * New string parser in 'MiscFuncs'. * Improved 'XMLwrapper'. * Most file extension definitions now standardised but fltk filer calls still fixed strings :( * No more direct file access in 'Microtonal'. 2019-2-24 Will * All direct file access removed from 'Bank' except two directory scans. 2019-2-23 Will * Installed placeholder FileMgr in /src/Interface This will eventually handle all actual file operations for consistency and simlifying porting to other systems. * Started moving file functions from MiscFuncs to FileMgr. * Completed transfers from MiscFuncs to FileMgr. Other calls to find in other files :( 2019-2-20 Will. * Added missing LFO intensity control description to CLI. * Adjusted CMakeLists.txt for better 'native' recognition. * Copied in Rob's FLTK fix. * Moved cairo tests inside fltk build option. 2019-2-14 Will * Now only the main instance can change bank structure. Others can read/change their current selected ones. * Updated dependencies. 2019-02-10 Rob * put FLTK sources & libs back in old places in CMakeLists -- tacking the libs on at end of the list sometimes broke linker command line. It's an empty string when GUI_FLTK=0, anyway. 2019-02-10 Rob * put FLTK sources & libs back in old places in CMakeLists -- tacking the libs on at end of the list sometimes broke linker command line. It's an empty string when GUI_FLTK=0, anyway. 2019-2-6 Will * Almost completed GUI detachment for headless. * Applied patch from Rob - completes headless builds. 2019-2-1 Will * Enabled headless build (Not LV2). Not fully tested. 2019-1-27 Will * Enabled full CLI start sequence .state .xmz .xiz .xly but can be either jack session or state not both. 2019-1-24 Will * Complex float rounding towards zero now just int(n). Rationale: This in most cases restores the original Zyn 2.2.1 method. Also, the assembler hack used to get faster performance is not portable across CPU types. These conversion were all for positive only values so there is no +- zero issue and the int+truncf combination is *much* slower than just int, yet does exacly the same. 2019-1-23 Will * Removed all remaining mutex references. Already almost entirely commented out. 2019-1-22 Will * BugFix: missing 'else' so CLI filter not seeing L1/H1. * Implemented loading MIDI-Learn fro CLI. Currently it seems you can only set one command line argument. Observed priority is .state .xmz .xiz .xly Need to see if this can be made recursive. * Minor adustments to startup handover. 2019-1-20 Will * Sending SIGUSR2 to running Yoshimi starts new instance. * Yoshimi hands over startup if there's a running instance. 2019-1-13 Will * Confirmed previous fix and set release as 1.5.10.1 2019-1-12 Rob, Will, Hermann * BugFix: Changes to CMakeLists.txt failed fedora build. Directly setting CMAKE_CXX_FLAGS overwrote previously defined flags the distro package required. We now add our settings as a prefix to existing CMAKE_CXX_FLAGS so the distro values take priority. * Changed Examples/synth_prelude files to link to original. Done to avoid possible licensing issues. * Added new warning file to dev_notes about spelling errors. * Set bugfix release as 1.5.10.1 rc1 2019-1-6 Will * Modified 'main' to remove stand-alone/LV2 build contention. * Bank.h, Config.h, Config.cpp no longer different builds. * Added warning about XML names in dev_notes. 2019-1-3 Will * Fixed regression - Resonance deactivated 'Close' button. * Added 'Multi Rushes' instrument to 'Will Godfrey Collection'. * Corrected some file dates. * Final updates to docs. * Set release version as 1.5.10 2019-1-2 Hermann * Refactored the PRNG code into a class. * Extracted the source code of the random_r() function from C standard lib, which Yoshimi relied on previously. * Simplified and adapted this code to our usage, verified it produces exactly the same random numbers as Glibc 2.24 * re-integrated all further float->int optimisations done by Will while reworking the PRNGs. 2018-12-22 Will * Frequency LFO regresion fix from Rob. * Set version as 1.5.10 rc3 2018-12-21 Hermann * While RC testing, spotted subtle sonic changes to some complex layered instruments. * Investigation indicates a different fluctuation patterning of the Jenkins PRNG algo as reason, while, on average, both the new and the old PRNG algos perform similar. 2018-12-18 Will * Changed PRNGs to specifically use uint32_t * Updated most docs for release. * Set version as 1.5.10 rc2 2018-12-9 Will * Some minor code cleanups. * Doc updates. * Set version as 1.5.10 rc1 2018-12-6 Will * Fixed GUI regression Resonance Apply button inoperable when resonance disabled! * Added 'Echo Multimod' to Will_Godfrey_Companion. * Also added 'Cathedral Pipe organ'. 2018-12-5 Will * Added CLI warning when insEffect is unrouted. * Fixed CLI regression. Set part program blocked if part was not enabled - should auto-enable. 2018-12-3 Will * BugFix: CLI Solo not accessing twoWay mode. * Doc updates. 2018-12-2 Will * BugFix: readAllData() not returning indirect value. * More details available in CLI list part. 2018-12-1 Will * CLI List part gives detailed current status. It gives further details if in part context. 2018-11-30 Will * Prng behaviour now confirmed and reseeds removed. Quite unnecessary. Needs many hours of continuous playing to begin to get anywhere near pattern repeat. 2018-11-28 Will * Inplemented a new prng with no external libraries based on "A small noncryptographic PRNG" by Bob Jenkins 2018-11-27 Will * Randomness can now be disabled for test purposes. Enabe #define NORANDOM in globals.h This makes subSynth and padSynth sound strange :o * A bit more work on unified presets placeholders. 2018-11-25 Will * Moved all static CmdInterface strings from .cpp to .h * Corrected some CLI EQ text. * Changed CLI internal names to avoid potential clashes. 2018-11-24 Will * BugFix: Limits tests not finding dynfilter-filter. * Completed CLI access to dynfilter. Phew! * Some extra CLI code cleanups. 2018-11-23 Will * All CLI effects help lists done. * CLI EQ controls done. (band and stages don't update GUI yet) * Some code cleanups. * CLI dynfilter mostly done. Not the actual filter editor. 2018-11-22 Will * Revised CLI effects code. * BugFix: SysEff 'send' returned wrong value. * CLI help effect lists complete to distortion. * No top level CLI help data when calling by name. 2018-11-21 Will * CLI Reverb and Echo controls completed. and created new help lists for these. * Added help list of all effects (by name). 2018-11-20 Will * Small adjustments to NRPN effects in synthEngine. * Started defining CLI effect controls. 2018-11-18 Will * Created placeholders for unified presets system. 2018-11-17 Will * Changed CLI formant filter formant number for clarity. * Improved CLI filter help list. * Added CLI display of filter's current vowel/formant. 2018-11-11 Will * Improved CLI kit mode controls. * Added CLI min to last note and max to last note. 2018-11-10 Will * CLI fine tuning. * Added dummy Part entries in limits for text entries that have no 'value' to prevent errors when tested. * Changed CLI Velocity 'Offset' to 'Level'. This prevents a clash with ON/OFF commands. * More CLI adjustments and conversion to sendNormal(). This provides better error checking and reporting. * Corrected CLI Voice Modulator type message. * BugFix: CLI Voice number blocked if current disabled. * CLI kitmode is now a pseudo context level. It emulates normal 'back' actions. 2018-11-9 Will * All CLI part contexts checked for enable. * Substantially revised CLI part level controls. No need for KMode, KItem as names unique and numbers assumed to be kit items in this mode. Effect and Name no longer need 'K' prefix. 2018-11-8 Will * Further revision to CLI AddVoice controls. * BugFix: CLI waveform change only setting voice 1. * Improved CLI waveform selection. * CLI checks part enabled before other controls. 2018-11-7 Will * Added missing controls to CLI voice modulator. * Simplified CLI voice modulator type setting. * Revised CLI common controls. Detune types now names, not numbers. * BugFix: limits test not seeing AddSynth Modulator. 2018-11-4 Will * Completed all CLI waveform controls. I think! * Adjustments to CLI minimum abbreviations. 2018-11-3 Will * Added CLI waveform access for modulators. 2018-11-2 Will * Completed CLI AddVoice controls :) 2018-11-1 Will * Enabled formal CLI access to AddVoice Modulator. Envelope inserts and common controls not done. 2018-10-31 Will * Fixed regression - disappearing waveform Mag Type. * Removed Harmonic Shift Reset. It's function is performed by a right click on the Harmonic Shift up or down button. * Implemented CLI voice unison controls. * Implemented CLI remaining voice controls. Not modulator ones. 2018-10-30 Will * CMakeLists.txt improvement from Hermann. * GUI waveform deactivation adjustments: harmonic randomness. waveshape. spectrum adjust. filter. modulation. adaptive harmonics. base type parameter. base modulation parameters. * Further adjustments to GUI waveform deactivation. 2018-10-28 Will * PadSynth GUI 'apply' button updates when exporting. * Added 'wait' command to CLI scripts. * Added read/write part kit item name to CLI. * Properly resolved PadSynth segfault. Due to invalid error check! * Minor adjustments to CLI PadSynth text. * Added ID for context level for AddSynth Voice Modulator. 2018-10-27 Will * BugFix: GUI segfault exporting padsyth samples. Only on kit items > 0 and fix is temporary hack :( 2018-10-26 Will * Implemented CLI PadSynth Controls. 2018-10-25 Will * Found missing PadSynth overtones option. * Deactivate PadSynth overtones if set as harmonic. * Small revision to PadSynth GUI. * Deactivate SubSynth overtones if set as harmonic. 2018-10-24 Will * Deactivate PadSynth amp group if Multiplier off. 2018-10-23 Will * Started defining CLI PadSynth Controls. 2018-10-21 Will * Implemented proper resonance limits. * Corrected 2 AddSynth tooltips. 2018-10-20 Will * Added Lorenzo's synth_prelude to examples. * Possibly cured occasional GUI corruption. * Completed CLI AddSynth base controls. 2018-10-19 Will * Most #defines in globals.h changed to const. * BugFix: CLI not reading resonance points. * Completed initial trial of CLI resonance entry. 2018-10-18 Will * Some cleanups to Resonance GUI. 2018-10-17 Will * Deactivate resonance GUI if not enabled. * All mutex code now commented out. Will eventually be removed if no problems. 2018-10-15 Will * Minor code cleanups. * Doc updates. 2018-10-14 Will * BugFix: wrong defaults for resonance. * Resolved more magic numbers. * Set max buffersize to 8192. * Revised and unified MIDI controllers. * Moved CC definitions to globals.h 2018-10-13 Will * Created global YOSH namespace. * Implemented common F2B (float to bool) function. * Updated docs. 2018-10-12 Will * Converted remaining truncf calls to FR2Z2I. Behaviour is now entirely consistent. * Temporarily disabled assembler FR2Z2I code. It screws up in LV2 :( * Unified DynFilter Filter/Effect controls. 2018-10-2 Will * Changed F2I to FR2Z2I to clarify behaviour. i.e. float round to zero to integer. 2018-10-1 Will * Completed F2I adjustments. * Started populating with new F2I. 2018-9-30 Will * BugFix: AddSynth FM mod was cogging notes. Only that mod and at notes close to sample rate. * Improved note/mod oscillator frequency calculations. * Reinstated a more advanced version of F2I. Some misinformation earlier :( 2018-9-27 Will * Accepted typo checks from debian. * Some doc corrections. 2018-9-24 Will * Bugfix voice list out of sync with voice editor. * Copied in new user guide. * set new README.txt * Set version as 1.5.9 release 2018-9-23 Will * BugFix: CLI not setting MIDI-Learn mute. * Enabled comments in CLI script. Also added more error checks. * Typo corrections:( * Corrected CLI 'expand' info. * Updated docs. * Added Sub Choir to Will_Godfrey_Companion. * Set version as 1.5.9 rc3 2018-9-19 Will * BugFix: Failed older manual if current missing. * Revised CLI status to compress line length. * Set version as 1.5.9 rc2 2018-9-18 Will * Most important parts of CLI waveform done. * Set version as 1.5.9 rc1 2018-9-17 Will * Started work on CLI waveform controls. 2018-9-16 Will * Added contributors list to About window. * Made some startup entries stdout only. * Removed some instance startup dublication. * CLI envelope freemode done. Some reporting errors and missing checks. * Improved CLI filter help list. * Corrected CLI freemode reporting. * Added CLI freemode error checks. * Improved CLI envelope help list. 2018-9-15 Will * Completed CLI scripts. * Implemented CLI context report control. * Further CLI clean-ups. * Implemented CLI formant filter controls but needs more testing. 2018-9-14 Will * Refactored CLI internal messaging. * Implimented CLI scripts. 2018-9-13 Will * Set up CLI list entries for formant filter. Not implemented yet. 2018-9-12 Will * Added CLI placeholder for formant editor. * Added filter category to prompt. 2018-9-11 Will * Added CLI placeholder for freemode envelopes. * Added freemode status to prompt. 2018-9-10 * CLI lfos & envelopes remember last type used. amplitude, frequency, filter bandwidth * CLI prompt now shows type and status of these. 2018-9-9 Will * Optimised some CLI selection routines. * Improved CLI prompt information. * Further refinements to CLI controls and messages. * CLI LFO & Envelope enables inplemented. * Simplifed ON/OFF controls in CLI lists. Can still actually use any of: ENable, ON, YEs or DIsable, OFf, NO * Corrected wrong CLI kitmode help entry. 2018-9-8 Will * Added CLI placeholders for LFOs and filters. * Completed CLI controls for LFOs. * CLI filters done except formant editor. 2018-9-7 Will * Found and mitigated cause of major memory leak. In XML - needs more work to resolve completely. * Startup now counts banks and instruments seen. * All instances now use a single bank file. They can still get out of sync per session but there is no longer a risk of bank corruption. 2018-9-6 Will * Bugfix: Occasional segfaults starting new instances. Caused by call crossing threads :( * Moved currentRoot and currentBank from Bank to Config Where they always should have been :@) 2018-9-5 Will * BugFix: Reverb type not updating bandwidth control. Thanks to Jesper for finding the cause. Also some GUI effect 'switches' not set by CLI. * BugFix: (ancient) Reverb bandwidth control *value* GUI not set to default when enabled. 2018-9-4 Will * BugFix: instances not showing correct root list. GuiThreadMsg for banks in wrong place. May have caused crash when opening instances. 2018-9-3 Will * BugFix: Crash if instrument name just 4 digits. Thanks to Kristian for the hint :) 2018-9-1 Will * BugFix: GUI not setting resonance points. 2018-8-31 Will * Added CLI SubSynth bandwidth envelope. * Adjusted help lists. * Added more CLI error reporting. 2018-8-30 Will * Added common envelope controls to CLI. Not freemode yet. * Updated help lists. 2018-8-29 Will * Made CLI help lists more consistent. * Added CLI overtones entries for sub and pad. * Added pad 'apply' control to CLI. * Updated query lists. * Completed CLI SubSynth main controls. Not envelope/filter inserts. 2018-8-28 Will * Completed CLI part common controls. * Moved Voice enable down to 8 for compatibility. * Moved Voice amplitude envelope enable down to 7. 2018-8-27 Will * Improved CLI fault and context sensitivity. * Aded more info on CLI prompt. * Some settings now checked on each CLI loop. Will be for checks against external changes. * Implemented new part 'common' controls list. * Updated ? lists to include subsynth. Also more flexible for later additions. * Changed NRPN 7 bit command to remove ambiguity. 2018-8-26 Will * More refinments to CLI command structure. * Added common stereo, octave, detunes. * subSynth CLI harmonic anp and bandwidth done :) 2018-8-25 Will * Identified engines and kit mode in CLI prompt. * All CLI kit mode controls active. * Extended CLI parts help to include new controls. * Improved many enable/disable settings. * Revised and simplified CLI MIDI-Learn section. 2018-8-24 Will * Temporary fix to banks selection anomally The whole of bank needs review. * More work on CLI part level controls. 2018-8-20 Will * Implemented CLI placeholder function fo AddSynth. * Implemented CLI placeholder function fo SubSynth. * Implemented CLI placeholder function fo PadSynth. * Implemented CLI placeholder function fo AddVoice. * Implemented main CLI kit mode controls. Enable engines, kits and kit engines, not AddVoice. * Implemented CLI Volume, Pan, Velocity for engines. Includes kit engines but not AddVoice. 2018-8-19 Will * Added GUI warning when active part disabled. * Removed some redundant test code. * Added "Simple Bass" and "Hollow Ghost Ensemble to "Will Godfrey Companion" bank. * Set up enums for further CLI control levels. * Improved high bit detection in MiscFuncs.cpp * Added high bit clearing to MiscFuncs.cpp * Revised CLI sys, ins, part effect settings. * Revised naming for CLI context levels. 2018-8-18 Rob * Initialise and freshen MasterUI->activePart. 2018-8-18 Will * Improved patch load behaviour crossing CLI / GUI. * Started work on CLI kitmode. * BugFix: Saving to bank not updating GUI. 2018-8-17 Will * Implemented read most CLI min, max, default for formally defined ones. * Implemented most CLI MIDI-Learn initialisation for formally defined ones. Can't cancel from CLI though and non-learnable ones appear to learn. * Added CLI help info to new controls. 2018-8-16 Will * BugFix: CLI not setting some values and not reading any :( * Started on CLI for reading min, max, default. 2018-8-15 Will * All GUI default requests now set by limits. This is a major refactoring, considerably reducing the duplication in the GUI and adding more functionality. Some switches don't yet update, but are correct. 2018-8-14 Will * Added missing conversions in FilterUI.fl * Added missing conversions in EnvelopeUI.fl * BugFix: EffUI.fl updates incomplete :( * Added missing conversions in LFOUI.fl 2018-8-13 Will * Separated system and insert control names. * Updated docs. * Added missing conversions in EffUI.fl 2018-8-12 Will * Reorganised and combined XML & history types. History lists now identified by name. * More 'type' and 'control' conversions in CLI. * Small GUI updates/corrections. 2018-8-7 Will * BugFix: Corrected wrong operator use. Was || when it should have been | * Envelope limits done. 2018-8-6 Will * Found more missing conversions :( 2018-8-5 Will * Updated addSynth limits. * Updated padsynth limits. * Updated subSynth limits. * Updated controller limits. * Completed sys/ins control change. Envelope defaults still to do. 2018-8-4 Will * BugFix: MIDI-Learn Cancel. It was only pretending to :( * Updated Microtonal.cpp limits. * MicrotonalUI.fl converted to enums. * Updated SynthEngine.cpp limits. * MasterMiscUI.fl converted to enums. * MasterUI.fl mostly converted to enums. Still some control values for MIDI, System and Insert effects to do. * ConfigUI converted to enums. * BankUI converted to enums. * All MIDI controls now done. Effects still not complete. 2018-8-3 Will * OscilGenUI.fl converted to enums. * Completed limits in Synth/OscilGen.cpp * PartUI.fl converted to enums. * Some minor cleanups. * VectorUI.fl converted to enums. * Vector limits now same format as others. * ResonanceUI.fl converted to enums. 2018-8-2 Will * ADnoteUI.fl converted to enums. * More clarifcations in MiscGui.cpp Also found more missing conversions :( * SUBnoteUI.fl converted to enums. * PADnoteUI.fl converted to enums. 2018-8-1 Will * Partly implemented envelope limits. Not defaults. * MIDI-Learn test now using limits and not the GUI version. 2018-7-31 Will * Implemented filter limits. * Added MIDI-Learn to filter limits. 2018-7-30 Will * Implemented LFO limits. 2018-7-29 Will * More work on Limits. * Converted limits error checks. * Updated limits doc. * Improved encoding in UI/MiscGui.cpp * More work on limits. * Picked up a few more stragglers. 2018-7-28 Will * Cleaned up some missing conversions. Also corrected previous date! * More identification of anonymous 255s. e.g. NO_MSG, UNUSED, NO_ACTION * Converted bank controls to enums. * More missing conversions :( * Started identifying types and sources. * Still more missing conversions! * Rationalised limits in Interface/CmdInterface * Started converting limits to enums. 2018-7-27 Will * Converted effect type controls to enums. More work needed :( 2018-7-26 Will * Converted envelope controls to enums. 2018-7-25 Will * Converted MIDI-Learn controls to enums. 2018-7-24 Will * Revised enum namespace terminology. No intrinsic code changes. * Converted resonance controls to enums. * Converted LFO controls to enums. * Converted filter controls to enums. 2018-7-23 Will * Converted oscillator controls to enums. 2018-7-22 Will * Converted main addSynth controls to enums. * Converted addVoice controls to enums. * BugFix: CLI not setting GUI Bypass GobalFilter. * Revised build dependencies. 2018-7-21 Will * Completed scales enum conversion. * Converted subSynth controls to enums. * Converted padSynth controls to enums. 2018-7-20 Will * Completed vector GUI enum updates. * Updated docs and images. * BugFix: scales CLI keymap entry wrong controls. * Started enum conversion of scales. * BugFix: scales CLI keymap not updating GUI. 2018-7-10 Will * Corrected GUI Vector/Part/Mixer/Bank anomaly. This whole area needs a *major* refactor :( 2018-7-9 Will * Started conversion of Vectors. 2018-7-5 Will * Separated common main/part controls. Makes enums properly independent. 2018-7-3 Will * Improved fade/mute/loopback isolation. * Added 'muted' enums. * Changed some names to improve clarity. * Restored lost main control conversions :( Too many local branches? 2018-7-1 Will * Caught more missing conversions :( 2018-6-30 Will * Added some missing enum conversions in 'interchange'. * Implemented control routes as enums. 2018-6-29 Will * GUI config controls converted to enum. * Defined 'insert' enums, and converted all occurrences. 2018-6-25 Will * BugFix: GUI mixer controls not setting part window. * Forgot section changes in resolveReplies. * Interchange config controls converted to enum. * CLI config controls converted to enum. 2018-6-24 Will * GUI part controls converted. * GUI main engine controls converted. * Further work on addVoice/addMod controls. These no longer need to be fixed values. 2018-6-23 Will * Added engines to globals.h * Further work on Interchange.cpp * CLI Part level mostly converted. * Corrected multiple commit/merge failures :( * Further adustments to Interchange.cpp 2018-6-22 Will * Moved CommandBlock from MiscFuncs'.h to globals.h * Set up part level controls enum in globals.h Converted actual commands in Interchange.cpp * Implimented small optimisation for reads. * Minor doc updates. * Completed part controls move in Interchange.cpp 2018-6-21 Will * Instruments can now be swapped between banks and roots. * Small doc updates. * Created new globals.h file. Transfered definitions from CMakeLists.txt 2018-6-13 Will * Small optimisation in 'zread'. Also shortened read loop usleep time to 10uS. 2018-6-13 Will * implimented 'zread' CLI test for command structure. 2018-6-11 Will * Bugfix: Wasn't reloading solo-twoway. Saved OK, but reloaded as loop. * Formalised manual search and opening. GUI now only calls via command block. 2018-6-5 Will * BugFix: Clearing kitmode key ranges was resetting. * BugFix: Bank renaming now working across roots. Disabled instrument swapping across these for now. * Improved banks swap error checks. * Added gzipped manual patch from Hermann. * Set as 2nd bugfix release :( 2018-6-1 Will * Set as bugfix release. 2018-5-31 Will * Corrected GUI handling of part saves. Also improved label colour handling. * Corrected Envelope freemode delete point. 2018-5-28 Will * Changed lstat to stat in MiscFuncs.cpp * Finalised code and docs. * Set release version as 1.5.8 2018-5-24 * Re-implemented autoloading instances. Seems completely correct now states corrected. * Set version as 1.5.8 rc5 2018-5-24 Will * Revised Config.cpp so instances get base config. Previously they had the system defaults. * Corrected anomally with loading saved states. Loaded the wrong one under some circumstances :( * Set version as 1.5.8 rc4 2018-5-23 Will * Corrected minor anomally in channel switcher. * Solo modes except column use blue for highlight. This is in the mixer window and easier to identify. * Set version as 1.5.8 rc3 2018-5-19 Will * Cleaned up 'solo' interaction between CLI & GUI. * Fixed regression: GUI not exporting banks. * Code optimisations between Interface & Bank. * Set version as 1.5.8 rc2 2018-5-18 Will * Implemented universal bank swaps. * Banks no longer private to SynthEngine. Too much access from Interchange needed and was getting silly always routing via SynthEngine! * Updated docs. * Improved banks swap error reporting. * Temporarily disabled auto instance loading. it wasn't stable enough for release :( * Set version as 1.5.8 rc1 2018-5-17 Will * Changed Solo choice name 'Recoil' to 'TwoWay'. * Reduced debounce time to 60mS. * Improved CLI reporting. * Improved instrument swap error messages. * Updated docs. 2018-5-11 Will * Completed universal instrument swaps. * Partially updated docs. 2018-5-9 Will * BugFix: GUI swap instrument with bank now ignored. Would segfault previously. * Preparing for universal instrument swaps. From any root/bank to any root/bank :) 2018-5-7 Will * Non relevant GUI settings now deactivated for LV2. 2018-5-5 Will * CLI can now clear a part. set 'clear' instead of an instrument number. * Bugfix: GUI failing to clear correct part. 2018-5-4 Will * Added 250mS de-bounce to solo loop and recoil options. 2018-5-3 Will * Added 'recoil' mode to channel switcher (Solo). Incomming CC value: 0 ignore 1 to 63 decrement active part MOD 16 64 to 127 increment active part MOD 16 * Updated docs 2018-5-2 Will * Further improvements to CLI handling of instances. * Started preparation for possible singluar set of banks. * Minor cosmetic update to main GUI. * Updated docs. 2018-5-1 Will * Improved CLI handling of instances. * Fixed regression: Had killed LV2 again :( 2018-4-29 Will * CLI can now close instances. * Minor improvements to CLI instance controls. 2018-4-28 Will * BugFix: Mixer Panel 'Edit' right click sometimes fails. Should open part editing window. * Transferred instance generation to new controls. * Added Instance generation to CLI. * Updated docs. * Formally implemented CLI current instance swapping. Still can't yet delete them. 2018-4-27 Will * BugFix: External instrument load always went to part 1. 2018-4-26 Will * Almost all part-level changes check for "Simple Sound". Just *entering* the editors doesn't now. 2018-4-25 Will * Code cleanups. * Added error checking and limits to scales (microtonal). * Enabled MIDI-Learn for some scales settings. * Doc updates and corrections. * Added highlights to learnable controls. 2018-4-22 Will * 'autoInstance' disabled by default, set in config. * Default state files handled correctly. * BugFix: Build 1287 had broken LV2 :( 2018-4-19 Will * Second attempt at autoloading :( * Corrected changelog. Previous two were one commit. * Still not handling user state files correctly :( 2018-4-18 Will * First trial of autoloading other instances. * Started refinements to MiscMsg. 2018-4-8 Will * Minor code cleanups. * Enabling a part now always makes it current. Disabling doesn't change which is current. * Mixer Edit button now always opens the part window. 2018-4-1 Will * BugFix: SubSynth detune type off by one error. GUI only, CLI was correct. * Corrections to 'Note_Envelopes.txt'. * BugFix: Base Func Parameters not updating RH graph. Actions were correct though. * Corrected a bad reset :( 2018-3-30 Will * Included 'AddSynth Morph' instrument in companion bank. * Added 'Note_Envelopes.txt' to docs. 2018-3-27 Will * Improved reading text values (especially for CLI). * Updated docs. 2018-3-25 Will * Direct access can now set/read part and kit names. 2018-3-21 Will * Final Updates. * Manual import and update. * Doc updates. * Set release version as 1.5.7 2018-3-19 Will * Corrected dates again :( * Improved Add, Sub, Pad click response when not enabled. * Changed 'Mod. Oscilator' to 'Local Oscillator'. * Updated docs. 2018-3-18 Will * Improved scales error checking. * Improved instrument renaming. * Set version as 1.5.7 rc5 2018-3-17 Will * Improved detection of user guide. * Code cleanups - Compiler warning suppression. * New 1.5.7 features list added to doc. * Remaining warnings suppressed. 2018-3-16 Will * Implemented Tabbed AddSynth Voices. * Changed layout as workround for bottom edge bug. Needs sorting for contol knobs anywhere :( * Set version as 1.5.7 rc4 2018-3-12 Will * Bugfix: Ext voice and modulators editing wrong. GUI still not completely correct - never was! * Set version as 1.5.7 rc3 2018-3-11 Will * Fixed regression. AddVoice modulator not changing. * Clarified GUI voice and modulator selection. * Set version as 1.5.7 rc2 * Bugfix: Sometimes setting the wrong XML doctype. * Added Voice/Modulator info to docs 2018-3-10 Will * Reverted incorrect change to DynamicTooltip.cpp * Renamed overloaded show( to dynshow( * Completely revised copyFile( function. * All part areas now show kit status, number and names. * Set version as 1.5.7 rc1 2018-3-9 Will * Refined Window title names. * GUI correct when MIDI volume and expression disabled. * Vector UI tracks changed number of available parts. 2018-3-8 Will * BugFix: Vector control not working. Off by one error :( * Improved Vector GUI behaviour. * BugFix: Config GUI was getting out of date. New switches and controls not updated with state. 2018-3-4 Will. * CLI direct access can now read VU levels. 2018-3-3 Will * Quieted some unused code till it's developed. * Small improvements to Add and Pad GUIs. 2018-3-2 Will * Small change to shortcuts. * Added entry point for dynamic subnote harmonic change. No idea how to actually change it though :( 2018-2-28 Will * Implemented defaults for part author and copyright. Normal left button loads, Ctrl + left button saves. * Implmented shortcuts for add, sub, pad editors. Left key - only if enabled. Right key - enables and opens. Individual voices not done yet. * Implmented shortcuts for part kit and effects. 2018-2-26 Will * Added missing attributions to previous commit :( * Optimised part compute. Removed unnecessary memory clearing and made per-part temporary allocations general ones. * Minor code cleanups. 2018-2-25 Will + Kristian * Merged in effects interpolations from Kristian. * Changed instrument name font to Helvetica (not bold). 2018-2-23 Will * Reverted LV2 buffer size change pending investigation. was commit: cf7c6e746239e90069a599a966aecbd5ba4f9f6e * Distortion and Alienwah limits now track preset number. * Remaining effects limits now track preset number. 2018-2-21 Will * Implemented note on/off test routines. 2018-2-18 Will * BugFix: Dynfilter presets not updating GUI :( * Small adjustment to 'Modular Sines'. * Further refinements to Dynfilter limits. * Changed all occurrences of p_buffer to sent_buffer. More descriptive and easier to follow in the code. 2018-2-16 Will * Added 'Modular Sines' to Companion bank. * Further adjustments to EQ effect controls. 2018-2-15 Will * Minor tweaks to banks. 2018-2-13 Will * BugFix: EQ GUI frequency wrongly zeroed. * Phaser and EQ effect limits done. * Some effect limits cleanups. (more work needed on CLI access) 2018-2-12 Will * Alienwah and Dynfilter effect limits done. (not filter insert for dynfilter) * BugFix: Phaser d/y wrongly reducing default insert level. 2018-2-11 Will * Improved bank import error reporting. * Implemented bank export. * Chorus and Distortion effect limits done. 2018-2-8 Will * Started major upgrade to effects limits. Reverb completed others begun. * Code cleanups surrounding effects limits. * Echo completed. * BugFix: Segfault on creating new bank (empty string). * Some small GUI improvements. 2018-2-7 Will * Some small improvements to 'reads'. * Corrected wrong dates in Changelog! The dangers of copy-paste :( 2018-2-4 Will * Merged in new limits code. * Considerable updates to dev_notes. * BugFix: Importing keymap not updating GUI. * Further refinements to data read function. * Small improvements to master reset behavour. * More doc updates. 2018-2-3 Will [LIMITS] First refactoring of this. Quite a few ommisions. Seems to be correct for MIDI-Learn but may still be some errors. [LIMITS] Made some corrections and optimisations. [LIMITS] Last? optimisations. 2018-2-1 Will * PadSynth 'busy' also reported to the GUI. * Removed redundant 'apply' code from Part. * Doc updates. 2018-1-31 Will * Applied extra safety features when changing PadSynth. Attempting to read or write to it at this time gives: "Part [n] busy" 2018-1-30 Will * Master Reset and Stop! now clear the VU meters. * MIDI buffer full reports to selected destination. * Some doc updates. 2018-1-29 Will * BugFix: Part effects not MIDI-Learned correctly :( This is a quick 'n dirty fix. The whole of the limits structure needs refactoring! 2018-1-28 Will * Made VU still read if very slow part load blocks. Need to improve this :( 2018-1-27 Will * Rationalised PadSynth calls. 2018-1-26 Will * Removed no longer needed VU ring buffer. * GUI VU meter display now fully detached :) * Updated docs. 2018-1-25 Will * Corrected VU meter update for multi-instance. * Enabled reading from CLI (direct). * Detached update system from GUI. 2018-1-24 Will * Improved VU behaviour - better attack/decay. Adjustments no longer made in GUI and will be easier to be made available to the CLI. 2018-1-23 Will * Removed incorrect reference to MIDI event 0xff. * Padsynth apply no longer uses flags. * Part clear no longer uses flags. * Code tidyups. 2018-1-21 Will * BugFix: CLI abort if query on top list. * Refinements to thread safe async read. * Part reads in CLI no longer change GUI part. * Further refinements to thread safe async read. 2018-1-20 Will * Minor bank optimisations. * Started new thread safe async read. 2018-1-19 Will * Cosmetic changes to panel window. Improves clarity and consistency. 2018-1-17 Will * Added range checks on kits, engines and voices. * Started work on change current root/bank. 2018-1-13 Will * Rationalised use of file extensions. Especially in Banks.cpp * Minor doc updates. 2018-1-7 Will * Removed redundant direct setting GUI LFO frequency. 2018-1-4 Will * Corrected message for unknown MIDI event. Also now as hex and obeys 'Log incomming events' 2017-12-31 Will * Removed some redundant threadmessage code. * Listed proposed new root & bank commands. * Last 2017 bugfix! MIDI-Learn block didn't :( 2017-12-30 Will * Moved all key shifts out of RBP thread. * Moved master fine detune out of RBP thread. * Removed (now redundant) RBP thread. * Updated docs. 2017-12-29 Will * Revised old config warning. Now centred on master window an only recognises config files. * Moved other use of message window to master ui. * BugFix: MIDI-Learn init was killing message window. 2017-12-28 Will * Reinstated safe version of localpath(). * Applied PATH_MAX patch from debian maintainer. 2017-12-27 Will * Refactored bank removal code. * Improved bank import reporting. * Updated docs. * Master reset can now clear MIDI-Learn. * Moved panic stop out of RBP thread. This will eventually be cleared completely. 2017-12-26 Will * Removed dependency on PATH_MAX * Removed inclusion of local path in banks/presets. * Removed redundant localPath function from MiscFuncs. * Improved response time finding/displaying manual. * Completed CLI bank import. * Moved build number to ConfBuild.h * Corrected and added instructions to INSTALL. * More doc updates - I was bored! 2017-12-21 Will * Implemented import of complete banks. * Updated docs. * BugFix: duplicate entry test in wrong place :( Wiping out paired .xiz and .xiy in exiting banks. * More doc updates. 2017-12-16 Will * Included current manual. * Yoshimi now looks for specific manual version. * Set release version 1.5.6 2017-12-15 Will * Tidied up microtonal reporting. * Improved MIDI part/channel decoding. * Implemented breath control enable switch. * Set version as 1.5.6 rc1. 2017-12-14 Will * Merged in BSD bugfixes from Tobias * Changed source location of user manual. Separate lines in CMake no longer needed. * MIDI-Learn now has a threshold setting for switches. * BugFix: More missing GUI messages found :( * BugFix: CLI not updating scale name or description. 2017-12-13 Will * BugFix: argp return still wrong for HURD :( Tried casting the return int to error_t instead. * Applied better resolution of splash timeout. * Bugfix: Importing scales was not updating GUI. 2017-12-12 Will * Bugfix: argp return type was error_t should be int * Bugfix: Missing #include in WaveShapeSamples.h * Bugfix: Missing #include in CmakeLists.txt * Possible resolution of splash screen problem. 2017-12-11 Will * Set max MIDI-Learn lines to 200. * Included current Advanced User Guide. * Added wildcard for .xiy and .xiz files in FLTK. * Updated docs. * Set release version 1.5.5 2017-12-10 Will * Bugfix: Some loads and saves were leaking MiscMsg. * Banks Instrument ops now recognise new format. Tested for load, save, delete, swap, rename. * Set version as 1.5.5 rc7. 2017-12-9 Will * Further refinement to legato fade. * Improved splash screen behaviour. * Revised bank slot saving. Still some details to correct :( * Enabled CLI direct access bank slot saving. * Set version as 1.5.5 rc6. 2017-12-8 Will * Resolved anomalies with new instrument type. GUI name colour reverts to black when cleared. GUI name colour updated on saves as well as loads. Bank structure identifies .xiy if either/both there. Bank entry instrument colours update. Loading instruments always looks for .xiy first. * Set version as 1.5.5 rc5. 2017-12-7 Will * Made GUI Settings windows consistent. * .xiy doctype changed to Yoshimi. * GUI now shows .xiy parts with mid-blue text. * Set version as 1.5.5 rc4. 2017-12-6 Will * Implemented extended (.xiy) Instrument saves. * Set version as 1.5.5 rc3. 2017-12-5 Will * Reverted change in Cmake linker for tests. This may affect BSD so this availability will not be mentioned in notes for next release. * Set version as 1.5.5 rc2. 2017-12-4 Will * Bugfix: CLI program change not updating GUI. 2017-12-3 Will * Set version as 1.5.5 rc1. 2017-12-2 Will * Improved legato fade behaviour. * BugFix: History not removing files when list full. 2017-11-30 Will * BugFix: long standing silent legato note :) This is an interim solution needs improving. * Further improvments to legato mode. Another old bug found (not fixed yet) :( * Bugfix: Drum mode not clearing legato. 2017-11-29 Will * BugFix: Channel switch not loading correctly. * Added specific older X86 CMake build options. 2017-11-28 Will * GUI legato mode turns red if drum mode. * Master reset reloads the saved default state if it exists and is set in config. 2017-11-26 will * Refined legato/keymode code. * Part code cleanups. * Minor optimisation for mono/legato renote. * Removed redundant code from part NoteOn and VirKeyboardUI. 2017-11-25 Will * Improved protection for channel switch. * Implimented CC 68 - Legato pedal. * BugFix: CC 68 brace in wrong place :( 2017-11-24 Will * Channel switcher was activated by Ardour! Temporary fix in place. 2017-11-23 Will * Improved internal message system. Now possible to send plain non-blocking messages, such as warnings, to CLI & GUI. * Updated docs. * Fixed regression. Mixer not updating :( 2017-11-22 Will * Further refinements to history lists. Instruments now included. * CLI instrument load can use '@' history. 2017-11-20 Will * Improved GUI & CLI instrument saving. * Updated docs. * BugFix: Failed right click on bank window. 2017-11-20 Will * Small improvement to history lists. Ready to include instruments. 2017-11-19 Will * Simplified history lists. Last used is now always top of its list. * All main file loads/saves offer last used. 2017-11-18 Will * Note on/off swap now in MusicIO. * Resolved channel switch Gui issues. * Consolidated SetSystemValues as NRPN only. Still not completely thread safe. * Updated docs. * More refinements to CLI. * Tidied up some MIDI-Learn messages. 2017-11-17 Will * Added error reports to several I/O ring buffers. * Revised channel switcher. Still some GUI anomalies to sort out :( 2017-11-16 Will * BugFix: New Vectors weren't being saved. 2017-11-15 Will * Finalised jack part destination changes. Vector control now sets these correctly! 2017-11-14 Will * Refactored indirectTransfers. Was 'transfertext' but used for much else. * Improved jack part destination changes. 2017-11-13 Will * NRPN direct part control now threadsafe. Only NRPN system values to do :) 2017-11-12 Will * Corrected Vector GUI anomalies. * Improved CLI part channel change. * Started work on NRPN direct part access. 2017-11-11 Will * BugFix: GUI Insert effects failed to update. * NRPN effect changes now threadsafe. Some GUI anomalies to sort out. * Code cleanups. * Rationalised system value ranges. * Updated docs. 2017-11-10 Will * Code cleanups around incomming MIDI. 2017-11-9 Will * GUI copy/paste now threadsafe but needs much improvement. * Removed sse from 'BASIC' compiler build options. * In SynthEngine the build defaults to NOLOCK. This means *all* mutex locks are disabled. 2017-11-8-Will * CLI effects code cleanups. 2017-11-7 Will * All remaining CLI writes thread safe :) but some effect controls don't update GUI and code tidying needed. * Doc updates. 2017-11-6 Will * Vector GUI writes now thread safe :) 2017-11-5 Will * Significant re-factor of vector control. Stable, but some details to be improved. * Further refinements to vector control, and improved error handling. * BugFix: MIDI zero velocity not sent to noteoff :( * Running vectors now correctly update GUI. 2017-11-4 Will * Vector CLI controls fully thread-safe. Some GUI and MIDI ones to complete. * Corrected JACK / ALSA GUI selections. 2017-11-3 Will * Restored MIDI volume GUI action. * Some more Vector controls now thread safe. 2017-11-2 Will * Major split up of midi controls from audio thread. * Unification of CC from any source. * More on unified root/bank/program. 2017-10-31 Will * Further inprovments to unified root/bank/program. * Added 'Root_Bank_Program.txt' to dev_notes. * Corrected anomally with GUI bank list entries. 2017-10-30 Will * MIDI controllers done for CLI direct access but disabled until rest of system done. 2017-10-29 Will * Unified root/bank/program change complete for CLI direct access. 2017-10-28 Will * MIDI note on/off routing much simplified. * Further work splitting up MIDI routing. NRPNs partially separated out * NRPNs can now be completely ignored. 2017-10-26 Will * Corrected GUI panel anomally when changing parts. * Started implimenting unified root/bank/program change. * Applied mutex lock corrections suggested by 'blubee'. * Corrected implied cast in jackengine. 2017-10-24 Will * Revised parameters for direct midi controls. * Virtual keyboard now uses these, so threadsafe. * Updated control numbers. 2017-10-23 Will * GUI improvements to mixer panel. * Direct access to NoteOn, NoteOff, SetController. * Updated dev_notes/Yoshimi Control Numbers.ods 2017-10-22 Will * Improved GUI behaviour on part changes. * More doc updates. 2017-10-21 Will * Minor adjustments to musl patch from newbluemoon. * Further code cleanups. * Doc updates. 2017-10-20 Will * Doc updates. * Added missing limits.h include to MiscFuncs. 2017-10-16 Will * Finalised and cleaned up bugfix code. * Rationalised GUI updates (only one Fl::check() call). * set as V 1.5.4.1 release. 2017-10-14 Will * Bugfix: Main part controls were responding to all remote input channels but upper panel rows weren't. * set as V 1.5.4.1 rc2 2017-10-13 Will * BugFix: Instrument loading now synchronised. * CLI enable/disable now updates panel. * set as V 1.5.4.1 rc1 2017-9-27 Will * Merged in noboost branch. So no dependency on boost. Resolves a long standing very rare segfault. * A few more tidy ups. * Included "Yoshimi Advanced User Manual" as a PDF. Can be launched from the 'Yoshimi' dropdown menu. * Set Version 1.5.4 release. 2017-9-24 Will * Removed orphaned and disabled code. * Unified coding style * set as V 1.5.4 rc1 2017-9-23 Will * Improved part change display behaviour. * CLI part enable state can now be read as well. * Changing part enable state updates all of part section in main window. 2017-9-22 Will * Updated cmake policies. 2017-9-21 Will * BugFix: MusicIO was passing LV2 MIDI to ring buffer. * Improved example build instructions. 2017-9-19 Will * Further CLI conversions and code cleanups. 2017-9-17 Will * Mute now uses the same structure as partonoff. Only a few mutex locks left! * Paste no longer locks, but audio loop lock needed. 2017-9-16 Will * Removed redundant mutex from OscilGenUI. * Added check for old config file. * Improved Bank/Instrument window stacking. 2017-9-14 Will * Reinstated and improved ALSA MIDI ring buffer. * Started converting Vectors. 2017-9-13 Will * BugFix: reset not clearing master bandwidth. * Master bandwidth added to MIDI controls. * Master bandwidth now MIDI-Learnable. * Docs updated. * Corrected MIDI controls tooltips. 2017-9-11 Will * Improved AddSynth Voice controls code. * Corrected 'minus' tooltip. 2017-9-10 Will * Envelopes converted. 2017-9-9 Will * Corrected NRPN wrong displayed values. Actual values were quite correct. * Replaced splash screen png with svg version. * Finally got envelope graphs under control. Tidying up and full conversion tomorrow :) 2017-9-8 Will * Most of envelopes transferred. Only graph points to do. * Improved add/delete point controls. * Updated docs. 2017-9-7 Will * Completed filter transfer. * Improved formant tooltips. 2017-9-5 Will * Corrected last three dates here :( * Created noboost branch. [noboost] reverted note-offs to delete. [noboost] removed all references to boost. 2017-9-4 Will * Effects transferred to lock free. Noticed long-standing anomally with some dynfilter control only working on release. * Filters mostly transferred to lock free. Some formant controls not done yet. 2017-9-1 Will * BugFix: Oscillator phase was screwed up :( * Removed redundant code from PadSynth UI. * Preparing Filters for conversion. 2017-8-31 will * Cleaned up Sys/Ins controls. * Added cleanup when Ins destination set to 'off'. * Yet more doc updates :P 2017-8-30 Will * BugFix: Disabling a part was resetting all controllers. * Doc updates. * Sys/Ins effect controls now transferred to lock free. But could be improved. 2017-8-29 Will * All rotary controllers now MIDI-Learnable. 2017-8-28 Will * CLI can now save PadSynth sample sets. * Failure to save PadSynth sample sets now reported. * Updated docs. * Removed reundant code. * Removed unnecessary mutex lock in Pad apply. * Fixed regression 'apply' in GUI oscillator. * Oscillator converted to lock-free (phew!) Alse corrected ancient anomally where base function wasn't changed with 'Use as base". 2017-8-26 Will * Adjusted logging on memory error merge from Iurie. 2017-8-25 Will * Removed duplicated effects command from GUI. * PadSynth conversion completed. * Fixed regression - AddVoice bend adjust not working. 2017-8-24 Will * Corrected GUI value for CLI resonance centre freq. * Resonance converted to lock-free. * Preparing PadSynth for conversion. 2017-8-22 Will * More speeling chucks :( 2017-8-21 Will * Final clean-up. * Final doc updates. * Set Version 1.5.3 release. 2017-8-20 Will. * Improved state saving extension checks. This whole area needs looking at. * Set Version 1.5.3 rc4 2017-8-19 Will. * Further minor updates to CLI - mostly messages. * Set Version 1.5.3 rc3 2017-8-17 * Minor correction to CLI vector level. * CLI now updates most of envelope graph. freemode still to do. * Revised CLI MIDI-Learn for own context level. * GUI test reports are now specific to button 2 & 3. * Set Version 1.5.3 rc2. * Further small updates to CLI. 2017-8-17 Jesper * Don't crash when autoconnect "fails" due to preexisting connections. 2017-8-16 Will. * Doc updates. * Set Version 1.5.3 rc1. 2017-8-15 Will. * Updated appdata and moved to metainfo. * Other doc updates. 2017-8-13 Will + Rob * GUI DynFilter updates and learns correctly. * Learn bug sorted properly! * Code cleanups. * Doc updates. 2017-8-12 Will * Added shortform NRPN to shutdown Yoshimi. CC 99 & 98 both set to 68 (0x44). * BugFix: CTRL pressed *after* any mouse click learned. * Doc updates. 2017-8-11 Will * Implimented CLI naming of vectors. * Corrected some CLI help entries. 2017-8-10 Will * Further improvements to command test list values. Hex and Dec shown, and in columns again. * Expanded CLI DynFilter control to include sys/ins but not currently active. 2017-8-9 Will * Most of DynFilter updates on CLI direct access call. Just the filter window itself to do. Difficult :( * Command test list values now hex and just 2 lines. 2017-8-7 Will * Part effects now display on CLI direct access call. 2017-8-5 Will * Master reset no longer needs threadmessage function. * Further cleanups and doc corrections. * Started revising sys/ins effects & replacing callbacks. This will help make CLI and GUI consistent. 2017-8-4 Will * Properly integrated all patchset saves. * Improved patchset load operations & messaging. * BugFix: segfault if CLI load with garbage filename. * Fixed regression. LV2 not loading patch sets. These are now properly contained, but I forgot to update (LV2 only) putalldata :( * Patched in Jesper's improved Console scroll behavoir. New entries now at bottom and always visible unless scroll bars moved. 2017-8-3 Will * BugFix: Insertion effects were always on. * Minor date corrections etc. * Removed redundant internal part mute. Never activated and partonoff more sophisticated. * A few more cleanups. 2017-8-2 Will * Small add/sub memory allocation optimisation. 2017-8-1 Will * Removed mutex locks from patchset save. No longer needed, so patch sets and states now save silently. * Fixed regression. Vectors update 'recent' again. * Added 'Microtonal Ratio Scale' to examples. 2017-7-31 Will * Improved config save operations & messaging. * Minor doc corrections & speeling chocks :) 2017-7-30 Will * Corrected minor XML LV2 anomaly. * Optimised 'returnsDirect' access. * Loading scales from GUI now updates it! * Added microtonal demos to 'Examples'. * Console window now monospaced font. * Scales can now be loaded from histories. * Doc updates. * Improved scales load & save operations & messaging. * Further restructuring of Vectors. 2017-7-29 Will * Improved vector saving management. * Reset & state load now update Vector name :p 2017-7-28 Will * Refactored vector data structure. * It hasn't been purely nrpn based for a long time! * Further vector refactoring for overall consistency. * Updated docs. * Bugfix: Missing 'break' stopped patchset loads :( * Vector name now editable and saved internally. 2017-7-27 Will * Improved state save error reporting for GUI & CLI. * Tidied master GUI code. * Bugfix: Reports button not correctly responding. * doc updates. * Improved vector loading management. * Started making vector name editable. 2017-7-26 Wiil * Resolved Vector display issues. * More refinements to Vector controls. * Improved messaging with state loads. * Fixed non-fatal XML warning messages. 2017-7-25 Jesper * Bugfix: Fixed segfault from edge cases when float->int conversion was very close to zero in formant filter transition calculations. * New formant filter editing tools - visual parameter manipulation on the frequency graph, primarily mouse-driven. * New tooltips for the formant filter control knobs and amended related tooltips in filter envelopes/LFO's to show the differences between formant filters and the other types. 2017-7-24 Will * Started refining loads and saves (state first). 2017-7-22 Will * Minor optimisations and clarifications. * Updated man page. 2017-7-21 Will * Removed some redundant code. * State load is now 'silent'. * Implemented lock-free state load & save. * Fixed potential memory leak in session save. * Doc updates - of course :) 2017-7-20 Will * Improved CLI handling of delays from slow actions. Has a switch that only releases when action completes. * More doc updates and corrections. 2017-7-19 Will * transfertext() now checks GUI exists before sending. 2017-7-18 Will * Bugfix: Bank dropdown list was showing wrong entry on bank root change but actual contents correct. 2017-7-16 Will * Refinements to CLI. * Direct access to loading and saving scales done. More enhancements planned. * Updated docs. 2017-7-15 Will * Completed conversion of CLI config controls. * Reorganised CLI code. * Config GUI also converted. * Reformatted config GUI code. It was getting very untidy :( 2017-7-14 Will * Created new 'config' CLI submenu. * Converted some 'normal' CLI config controls. 2017-7-13 Will * All Config limits defined. * Updated docs. 2017-7-12 Will * Values can now be corrected for range by the CLI. * Controls can be set to defaults by the CLI. * CLI can now test and report 'occupied' CC ranges. * doc updates. 2017-7-4 Will * Resolved GUI to CLI miscMsg problem. Back on course :) Was due to CLI reporting blocking some 'Resolves' that use miscMsg to return text messages. * Adjusted saved keymap to retain compatibility. Internally now starts from zero. 2017-7-3 Will * Temporarily disabled Jack/Alsa GUI to CLI IDs. Cause of strange MiscMsg behaviour :( 2017-7-2 Will * Config conversion almost done. Still some non-fatal anomalies to clear up. * Updated docs. 2017-7-1 Will * Config switches converted. * Config jack & alsa converted. Discovered odd behaviour from the GUI with miscMsg. Not a disaster but needs to be sorted. 2017-6-29 Will * Bugfix: CLI history was not being updated. * Removed empty virtual keyboard menu choice. * Started conversion of config for direct access. 2017-6-27 Will * Fixed regression GUI can load full scales again. * Simplifed GUI scale loading code. 2017-6-25 Will * Transferred scales to new controls. * Scale name now the leafname for .scl loads. * Changed scale 'Comment' to 'Description'. matches Scala format better. * Doc updates. * Further code refinements. * Added new scales info in the doc directory. 2017-6-24 Will * More revisions of CLI help lists. * Implemented all CLI microtonal functions. * Updated docs. 2017-6-23 Will * Added delay to CLI return so most ops complete first. * Small improvement to Crossfade smoothness. * Removed redundant & commented out code in PartUI.fl. * Improved range checks in Part.cpp. Also removed redundant kit range checks. * Fixed key range regression caused by last commit :( 2017-6-22 Will * Fixed regression kitmode effect select works again. Also improved numbering. 2017-6-21 Will * Revised CLI help menu for greater clarity. * Implemented CLI list tuning and keymap. 2017-6-19 Will * CLI can now write or load tunings and keymaps. 2017-6-18 Will * Tuning error reporting completed. * Keymap error reporting completed. * Updated docs. * Scales code cleanups and optimisations. 2017-6-16 Will * Added loopback for low priority functions into 'returns'. * Direct access writing now possible for all scale data. * Improved scales error reporting. More to do. * Updated docs. 2017-6-12 Will * Further refinements to scales accuracy (no longer needing doubles) * Full XML float compatibility with ZynAddSubFX. 2017-6-11 Will * Improved scales compatibility with old files/ versions. 2017-6-9 Will * BugFix: miscMsgPop wasn't checking index range. * Loading patch sets always zeros 'Solo' channel number. 2017-6-8 Will * BugFix Loading scales wasn't updating name/comment. * Direct access - more scales controls available. * Direct access scale loading in place. 2017-6-7 Will * Scales no longer suffer from cumulative errors :) * Removed some (now unnecessary) mutex locks. * Direct access tunings and keymaps now CSV, and reformatted to standard scales. 2017-6-5 Will * Improved accuracy of scale number<=>text conversions. * Added "Musical Scale.odf" to 'doc'. 2017-6-4 Will * Tunings and Keyboard map implemented. * Most Scales controls now available to direct access. * Added new Scales.txt doc to 'dev_notes' * Updated Yoshimi Control Numbers.ods file. 2017-6-3 Will * Made Invert center key status clearer. * Identified more scales controls ready for direct access. * More doc updates. 2017-6-1 Will * More part map optimisations. * Part maps now double buffered. 2017-5-31 Will * Reorganised part map setting to remove multiple calls. * BugFix: Reverse scale centre was being set as type bool. * BugFix: Scale ratio values were limited to 127. 2017-5-30 Will * Improved error traps and reporting. * Set default full XML saving to 'off'. Done for previous consistency. 2017-5-28 Will * Revised Scales GUI layout. * Added sane limits to key maps. * Discovered XML saving anomaly so created new Config switch. Forces *all* data to be saved when set. * dev_notes updates. 2017-5-26 Will * Started implementation of CLI scales access. * BugFix: neither .scl or .kbm were checked for no file :( 2017-5-24 Will * BugFix: LV2 state restore was not setting partmaps. * Yoshi can now work with both CLI and GUI disabled. * Doc updates. 2017-5-12 Will * Merged in Robs SubSynth Overtones/Legato fix. * Finalised all code and docs for release. * Set version 1.5.2 2017-5-11 Will * Reset all controllers now clears the portamento switch. * Added SubnoteUI correction from Rob. * Minor change to saved MIDI-Learned files. Supresses artificial top bit when saving, making file more understandable, but loading restores it for learn comparisons. * More AddSynth Voice & SubSyth switches learnable. * Updated docs. 2017-5-9 Will * BugFix: Modulator amplitude envelope wasn't enabling. 2017-5-8 Will * Made Add Voice & Sub filter enables learnable. Now labelled as 'On'. * Removed unnecessary Gui checks from Add & Sub. 2017-5-7 Will * Improved MIDI-Learn loading behaviour. * Gui Updates no longer called from synth. * MIDI-Learnable switches now have colour IDs. * Set master as 1.5.2 rc2 * Updated docs. 2017-5-5 Will * More 'switches' MIDI-Learnable: AddVoice enable and modulator selection. All engine stereo and octave. * Set master as 1.5.2 rc1 * Updated docs 2017-5-4 Will * Small alteration to Andrew's State Changed patch. This catches controls that still write direct. 2017-5-2 Will * Fixed Gui anomally when loading states with MIDI-Learn. The way we fetch Gui updates needs improving greatly. Currently we use the VU timer and call across from synth. * LV2 state now includes MIDI-Learn data. 2017-5-1 Will * State load now correctly updates main window title. * More float -> int range adustments especially MIDI-Learn limits and conversions. 2017-4-30 Will * Improved float -> int conversions. * BugFix: some of the new controls had the wrong limits. 2017-4-29 Will * Corrected some Gui engine enable/colour anomalies. Needs more work to rationalise duplications. * Enabled engine switches for MIDI-Learn. * Enabled some controllers for Midi-Learn. pan width bandwidth depth pitchwheel range portamento time portamento time stretch portamento threshold proportional rate proportional depth * Updated limits * Small adjustment to controllers window. 2017-4-28 Will * Fixed dynamic tooltip margins at 3 for all FLTK 1.3.x. May reinstate the margin setting at a later date. * Small change to crossfade example. 2017-4-23 Will * Reverted MIDI-Learn Gui change again It was just moving the problem to any window that was open :( 2017-4-22 Will * If State file has MIDI-Learn data it closes the window. This evades the issue rather than solving it :( However no other load source shows the problem. 2017-4-21 Will * Reverted MIDI-Learn Gui change - caused other problems. 2017-4-20 Will * Improved handling of Vectors in state load * Loading large MIDI-Learn lists was overloading Gui so reduced Gui update rate. * Misc image updates. 2017-4-18 Will * Corrected AddSynth sound/noise display. * Included AddSynthVoiceList in new controls method. * MIDI-Learn data added to saved state file. 2017-4-17 Will * Implemented Gui change can redraw *after* command set. * Transferred AddSynthVoice to new control method. * Updated docs. * Transferred SubSynth to new control method. * Fixed regression - scroll wheel had stopped responding. * More doc updates. 2017-4-16 Will * Part 'kit' is no longer ORed with 32 for some controls instead 'insert' is set to 32 for these. * Added more error checks and warnings. * Updated docs. * Increased max buffersize to 4096 frames. * Fixed regression - Cli had lost part effect control :( 2017-4-15 Will * Implemented Gui access to 7 bit NRPNs. * Revised MIDI-Learn window. * Corrected some Cli numbering. 2017-4-14 Will * Revised Gui new instance selection. Only 1 menu entry needed now. * Revised MIDI-Learn min/max - now percentages. Resolution is now 0.5% :) 2017-4-13 Will * Revised Cli access to MIDI-Learn. * Implemented 7bit NRPNs (not Gui changeable). * Updated docs. * Bugfix: Loading MIDI-Learn files was setting learn mode. * Bugfix: CLI error when changing MIDI-Learned channels. 2017-4-9 Will * Bugfix: Wrong size buffer used for jack audio causing overwrites if internal < nframes. * Set version 1.5.1.1 2017-3-30 Will * Finalised all code and docs for release. * Set version 1.5.1 2017-3-29 Will * Edited ccmake option names for more logical sequence. * Created INSTALL_CUSTOM info file. * Removed unused, and commented-out code. No fuctional changes. 2017-3-26 Will * Corrected anomaly with some float to bool conversions. Changed varable in 'interchange' to make this clearer. * Activated MIDI-Learn for portamento enable & rate. * Set master as 1.5.1 rc5 2017-3-22 Will * Doc updates and moves ready for release. * Added two new instruments to Will_Godfrey_Companion * New splash image included in Utils. * Merged in jack latency fixes from Rob. * Re-instated '03' Neon ccmake option. * Doc updates - again! * Set master as 1.5.1 rc4 * It's ohh three not zero three !!! Now done right. 2017-3-22 Jesper * Master window: Added subclassed Fl_Menu_Bar which only draws the bottom border. Now it is not necessary to use negative coordinates to hide the edges. * VUMeter no longer swallows all shortcut/keyboard events. * Added missing hotkeys/mnemonics and fixed conflicting ones. 2017-3-21 Will * Added correction for startup part connection status from Rob. * Set master as 1.5.1 rc3 * Readjusted main menubar. * Removed '03' from Neon ccmake options. 2017-3-21 Jesper * SubSynth ui: persistent margins for the harm. sliders + non-clipped labels Adjusted some misaligned/off-center widgets and added forceH tooltip 2017-3-20 Will * Bugfix: setExtension got one case wrong. * Bugfix: State load wasn't setting partmaps. * Small adjstment to Insertion Effects tab. * Set master as 1.5.1 rc2 2017-3-20 Jesper * Reverted min/max button style and relative positions * Reverted mistakes: wrong tab selected, perceptual spinner size and moved button grid one pixel down to huge effect. 2017-3-19 Jesper * Bugfix: stored window positions were read with wrong buffer size * Visual: menu bar positioned left of window + overlap by frame beneath * Even alignment and distribution of widgets in MasterUI & PartUI Exact centering required resizing effects windows by 1 pixel * Tooltip fixes in MasterUI and PartUI one inconsistent description and some inconsistent capitalisation. * Renamed m-R-M to Set-R-Set and placed the buttons next to their spinners 2017-3-19 Will * Bugfix: Rotary controls were making pairs of calls. * Installed new splash screen and updated notices. * Set master as 1.5.1 rc1 2017-3-18 Will * BugFix: Direct access Eq.T. dial deactivated in error. * Implemented forgotten direct access subsynth bend and offset. * Updated docs. 2017-3-17 Jesper * AddSynth gui - sync voice list when changing detune type * AddSynth section labels now consistent with the other synths. * Minor graphical corrections - overlapping margins etc. * Bugfix: Sliders behaved incorrectly when min>max specifically when using control-mousewheel to change value 2017-3-17 Will * Part naming now goes through ring buffers. * BugFix: Recent state loading failed due to missing lines in ParametersUI.fl * Small adjustments to messageing. * State reload now clears all parts before loading new ones. 2017-3-16 Will * Bugfix: part volume was not being activated on load but only if the saved value was 95! There was a similar less important issue with panning. * Small optimisation in Gui freemode enable switch. 2017-3-15 Will * Added correction from Jesper to tooltips code. * Direct access now enables envelope freemode in Gui but still doesn't do redraws. 2017-3-14 Will * Updated auto window position control. * Removed some auto window opens due to conflicts. 2017-3-13 Will * Enabled Gui updates for dynfilter controls 7,8,9. * Doc updates. 2017-3-12 Will. * Updated /dev_notes/Effect_Inserts.txt * Removed boost dependency based on ideas from Rob. * Made EQ reporting more human-readable :) * Corrected EQ band selector reporting/adjustment. It's not a parameter. * Reverted boost change pending further investigation. 2017-3-12 Jesper * Bugfix: Segfault from tooltip text handling in slider when creating new instances of yoshimi. * Bugfix: All dials on the EQ effects can now be MIDI-Learned. 2017-3-12 Will * Added more reliable way of detecting MIDI-Learn NRPNs. * Bugfix: Splash was ignoring switch settings :( 2017-3-11 Will * Splash timeout is longer and doesn't block user. * Fixed regression - exit was always claiming config changed. * Fixed regression - wrong font sizes in 'settings'. * BugFiX: Cli wasn't seeing value for freemode X offset. * Bugfix: MIDI-Learn led didn't work if channel set to all. * Version colour in Splash window now defined as RGB. 2017-3-10 Will * Monitoring incoming CCs switch now saved in config. * Implimented 'Open learned editor window' switch. Also saved in config. 2017-3-9 Will * Improvements to Cli part limits. * Successful MIDI-Learn now opens editing window. * PadSynth limits done. * Reduced internal multiplier for all limits. Just one went over short int size :( * Small optimisation in Controllers limits. * Updated docs. 2017-3-6 Will * Cli limits now report the full name as well as the values. * Bugfix: Cli Add/Sub text not identifying bend & offset. * AddSynth limits done. * Doc additions and corrections. * SubSynth limits done. * Corrected wrong AddSynth coarse detune type. * Added 'solo' to limits. * Optimised limits code in SynthEngine. 2017-3-5 Will * Controller & Midi control limits done. * Complete limit definitions for main & part include type. i.e. integer/float & whether MIDI-Learnable. * Doc updates. * Bugfix: missed a couple of 'break' statements in a switch. * Added a special case for enable default on part 1. 2017-3-4 Will * Merged in Jesper's latest tooltip improvements. * Voice list panning now syncs random LED in main window. * Updated direct access doc. * Corrected last few dates in this file :( 2017-3-3 Will * Changed confusing naming referring to voice list vibratto. Also improved comment. * Improved float/int and float/bool casts in interchange. * Gui Addsynth base parameters now go through ring buffers. * Reinstated Addsynth base random pan button behaviour. * Reinstated random pan button behaviour to all others. 2017-3-2 Will * Main part limits done (not controllers) * Master limits done. * Bugfix: Gui changing available parts requered two clicks. * Fixed new regression. Cli was never just reading values. * Gui LFOs now go entirely through ring buffers. 2017-3-1 Will * Started identifying default and limit values for part. Cli direct access uses "lim" instead of value and type. * Small adjustment to part label display. 2017-2-26 Will * Fixed instrument background colours. 2017-2-24 Will * Added ARM options to CMakeLists.txt * Restored commented out AdNote cubic interpolation for future examination (currently would segfault). * Updated copyright notices and dates in various files. 2017-2-23 Will *Merged in Rob's live LFO controls. 2017-2-21 Will * Merged in Jesper's latest tooltip additions. * Minor change to freemode Envelope text to remove overlaps. 2017-2-20 Will * Remaining Cli inputs converted. I hope! 2017-2-19 Will * Bugfix: MIDI-Learn wasn't reloading the correct ranges. * Found more Cli numbers to adjust :( * Started changing Cli *input* numbers to match Gui ones. * Got as far as 'commandPart'. 2017-2-18 Will * Vectors now soft-load :) 2017-2-17 Will * Cli effect presets now numbered from 1. * Improved Cli listing of effects/presets. * Bugfix: Solo wasn't seeing 'Loop' when reloading. * Bugfix: Mute not cleared if patchset load failed. * Cli can load patchsets and vectors from list numbers. * Cli loading vectors updates the Gui. 2017-2-16 Will * Improved readline behavour. Still needs more work - sometimes multiple prompt lines! * Converted reported Cli numbers to match Gui ones. May have missed some :( Entries still zero based. 2017-2-13 Will * Spash screen onptimisations. * Small Fadeout improvement. * Doc updates. 2017-2-12 Will * Separated out temporary Gui Write -> Read per section. This enables us to do conversions section by section. * Improved Cli messaging. * Re-implemented silent panic stop. * Re-implimented soft master reset. Hopefully all OK now. 2017-2-11 Will * Reverted unsafe changes from build 952. * Small optimisation in main audio loop partonoff read. * A few Gui tidy-ups. * Mixer as well as main window now show current patchset. * Cautious 2nd attempt at just soft patchset change. 2017-2-9 Will * Global and part keyshifts now go through ringbuffer. * Code tidy-ups and improved comments. * Bugfix: Part kitlist wasn't deactivated on start. * All sources now use ringbuffer to load patchsets. * Bugfix: Segfault if reset from CLI while GUI running. 2017-2-8 Will * Commented out redundant code from LV2. * Added mlock to all ring buffers. * Ensured all locked pages unlocked on exit. 2017-2-7 Will * First trial of async MIDI buffer. * Changed miscMsg from mutext to semaphore. * Bugfix: miscMsg buffer not being cleared. Only when no GUI. That was supposed to get them! * Bugfix: Return messages killed for CLI when disabled for Gui. 2017-2-4 Will * Changed interpolation for part volume and pan so no more zipper noise. * Removed unused and commented out code. * Corrected code copyright and 'Modified' dates. * Bugfix: FLTK choice windows gave "yes" on Escape. * Bugfix: Regression when loading vectors from CLI would crash if no channel given :( * Bugfix: GUI not updated on loading vector file. 2017-2-3 Will * Applied AddSynth Voice tooltip patch from Rob. * Main volume now interpolated. No zipper noise :) 2017-2-2 Will * MIDI-Learn files now include the text of the command name for each line. * Removed remaining forced 'part enable' except in part. * Improved and extended partonoff options. * 'Set part to default' now uses new method. Direct CLI access and the GUI now do this silently. * Updated docs. 2017-2-1 Will * Corrected NRPN warning message. nHigh had always been reported wrongly :( * Corrected GUI activity light error. * MIDI-Learn can now operate in place for LV2. * Updated docs. 2017-1-31 Will * Small clean-up in GUI panel controls. * Removed unnecessary callback in GUI part kitlist. * MIDI-Learn NRPN's done, but some non-harmful GUI activty light errors. 2017 - 1 30 Will * Initial prep for MIDI-Learn NRPNs :) 2017-1-29 Will * Bugfix: Some limits wrongly set for MIDI-Learn. Revised defaults settings. * Bugfix: More wrong limits :( 2017-1-28 Will * Merged in Jesper's edit button in AddSynth voice list. * Adjusted positions/sizes to match general style. * Made other style adjustments to AddSynth GUI. * Set right click closures in bank GUI - long overdue. * Changed highly confusing code window names in bank GUI so they match up with everything else! bank -> instrument root -> bank path -> root 2017-1-27 Will * Transferred most CLI main and part level controls to new method and added in 'solo' and 'detune'. * Changed resolve thread's timer to 60uS. * Corrected GUI max parts display anomaly. * Added missing 'c8' in GUI voice list :( 2017-1-26 Will * Modified splash screen creation utility and files and made them formally available in a new 'Util' directory. * Another attempt at error checks for attempt to access kit when not in kit mode. Think it's right now :) * Commented out some redundant code. 2017-1-23 Will * Channel switcher/Solo now ignores zero in loop mode. It responds to an on/off pedal press but not release. * Added instrument "Smooth Organ" to "Companion" set. * Added error checks for attempt to access kit when not in kit mode. * Reverted new error check - it was wrong :( 2017-1-20 Will * master: pulled in corrections and upgrades from (no longer) brokenReset :) * Corrected dates in this file! 2017-1-20 Will * brokenReset: CLI stop and reset now use direct access. * Improved CLIresolvethread flag system. * All master resets now handled via CLIresolvethread. * Set up proper Init function for InterChange.cpp Threads could fail to start if poor general init. 2017-1-19 Will * brokenReset: removed 'UpdateConfig' from 'resetAll' This seems to conflict with 'UpdateMaster'. * Clearing config tab 4 now integrated into 'update_master_ui' at GUI level. 2017-1-18 Will * Temporarily made key pressure do channel pressure. * Made minor improvement to pitch wheel handling. * Transferred master GUI controls to new method. * Improved direct CLI to GUI Pad params apply. * If audio thread muted incoming Midi now ignored. 2017-1-15 Will * Updated app-data file. * Added French translation to yoshimi.desktop.in from Olivier. * More general doc updates/corrections. 2017-1-14 Will * Corrected Midi noteon velocity zero action and made noteoff command more obvous! * Implemented Midi controlled system reset. * CC 1/11/71/74 now update Midi controls window. 2017-1-13 Will * First experiment unifying alsa/jack/lv2 Midi input. 2017-1-12 Will * Improved reliability of window positioning. * MIDI-Learn window now remembered. * MIDI-Learn messages now placed by relative control. * AddSynth voice and voice list now fully in sync :) 2017-1-11 Will * Improved GUI part label and colours sync. 2017-1-10 Will * Improved GUI part/mixer synchronisation. * Added error check for out of range part numbers. * Updated docs. 2017-1-8 Will * Transferred main GUI part controls to new method. * Enabled GUI control of Modulation, Expression etc. * Updated 'Controllers' tooltip. 2017-1-7 Will * Bugfix: CLI direct access not setting audio destination. * Bugfix: Mixer GUI returning wrong part numbers if > 16. * Bugfix: Mixer GUI volume & pan controls not responding to CLI when displaying different parts to main control. 2017-1-5 Will * Removed redundant startup messages from splash screen. * Exposed the following to MIDI-Learn and direct access. Modulation Expression Filter Q Filter cutoff * Created new GUI window for these. * Updated docs. 2017-1-4 Will * Bank tag (.bankdir) now aways contains the Yoshimi version number from when the most recent instrument was saved to it, or when the bank was created. 2017-1-3 Will * Added part number to invalid kititem warning. * Midi now recognises channel aftertouch. * Prep for NRPN MIDI-Learn. * LFO titles no longer overlap C/P. 2017-1-2 Will * Enabled MIDI-Learning of pitchwheel. Comes in as CC 640 but seen as 128. * Optimised MIDI-Learn editing to reduce line moves. 2016-12-30 Will * Improved layout of Filters GUI insert. 2016-12-27 Will * doc updates and corrections. * set version to 1.5.0 M - no code changes. yoshimi 1.5.0 2016-12-17 Will * Added warning for undefined kits in MIDI-Learn. * Finalised all code and docs for release. * Set version 1.5.0 2016-12-16 Will * Changed MIDI-Learn spinboxes to number entries. * Adjusted MIDI-Learn window dimensions. * Corrected tooltips, spellings and acromyms. * Set version to 1.5.0 rc5 2016-12-15 Will * Changed virtual keyboard key map labels and tooltips. * More doc updates. * Set version to 1.5.0 rc4 2016-12-13 Will * MIDI-Learn can now be cancelled. * Set Yoshimi (instance) in MIDI-Learn message windows. * Corrected tooltip for oscillator harmonic randomness. * More doc updates. * Set version to 1.5.0 rc3 2016-12-12 Jörn * More tooltips updates. Distortion Phaser Chorus Reverb Echo System sends * Set version to 1.5.0 rc2 2016-12-12 Will * Doc updates. 2016-12-11 Will * Implemented message window for MIDI-Learning. * Corrected GUI access to MIDI-Learn general opps. * Set version to 1.5.0 rc1 2016-12-10 Will * Bugfix: CLI was trapping the wrong MIDI-Learn control. * CLI now change MIDI-Learn mute, limit, block switches. * Added load/save messages to MIDI-Learn. 2016-12-9 Will * Bugfix: CLI load MIDI-Learn from list had missing return. * Implemented CLI MIDI-Learn line & list removal. * CLI can now list individual MIDI-Learn lines in detail. * Sent MIDI-Learn general ops through ring buffer. * CLI can now change MIDI-Learn CC, chan, min, max. 2016-12-8 Will * Implemented 'activity' LED for MIDI-Learn. * CLI history lists now numbered. * Implemented CLI MIDI-Learn load & save. * Updated docs. 2016-12-7 Will * Added new file to dev_notes: System_Values.txt * Added list file leafname to MIDI-Learn window title. * Updated docs. 2016-12-6 Will * Started implementing CLI access to MIDI-Learn. Also replaced 'changeLine(' with 'generalOpps(' as it is more appropriate now. 2016-12-5 Will * Small optimsation in crossfade. * Tidied up code in Interchange and MIDI-Learn. * All sliders/knobs mid-learnable except 'Controllers'. 2016-12-5 Jörn * More tooltips updates. 2016-12-5 Will * Bugfix: MIDI-Learn scroll bar wasn't working. * Most sliders/rotary controls now available to MIDI-Learn. 2016-12-4 Will * Implemented full MIDI-Learn save, load/recent. * Set windows of vectors and MIDI-Learn to Yoshimi defaults. * Simplified history type selection in parameters window. * Bugfix: segfault clicking empty parameters window :( * Updated docs. 2016-12-3 Patch from : Alexander * Bugfix: state load wasn't setting keyshifts. 2016-12-2 Will * Started defining a standardised limits routine. This will return min, max, default for any control. * Bugfix: LV2 was trapping unknown CCs instead of allowing them to be passed on to MIDI-Learn! * More work on limits. 2016-12-2 Merge from : Jörn * Extensive tooltip upgrade dynamically giving real values. * Some code style consistency adjustments. 2016-11-30 Will * First draft of MIDI-Learn saving. * Bugfix: Had to remove fltk MIDI-Learn warning. It goes into a loop on spinboxes :( * MIDI-Learn load and save both working with default name "testmidi" in /home/{user}. 2016-11-29 Will * Corrected anomaly when changing MIDI-Learn channel numbers. * Changed 'doublefreqtrack' to 'freqtrackoffset'. 2016-11-28 Merge from : Jörn * Added button to filter tracking, offsetting range for 0 200%. 2016-11-27 Will * MIDI-Learn menu changed to buttons. * MIDI-Learn clear all implemented. * Running learned controls can now go 'in_place' for LV2. 2016-11-26 Will * Small MIDI-Learn / Interchange optimisations. * Direct access global fine detune now goes through ring buffer to stop Xruns - particularly with MIDI-Learn. * Enabled MIDI-Learn of part effect sends. * BugFix: reinstated direct control of effects. GUI not updated :( * Enabled MIDI-Learn of effects. * Effects GUI now updated for all except some dynfilter knobs. 2016-11-25 Will * Implemented the 'delete' function in MIDI-Learn. * More doc updates! 2016-11-24 Will * Enabled all MIDI-Learn editors except CC and channel. * All MIDI-Learn editors now working :) * Bugfix: Odd control combinations segfaulted - cured. * Bugfix: Curing old bug in direct access that segaulted on invalid kit access stopped all access to kits. Now done. * Doc updates. 2016-11-23 Will * Adding new learned lines now fully updates to the Gui. * Removed test button. * Number of lines temporarily limited to 128. 2016-11-22 Will * Enabled MIDI-Learn from CLI direct access. * Normal CLI can also list current learned lines. * Implemented (forgotten) AddSynth direct -> gui envelopes but still not freemode. * Updated docs. 2016-11-21 Will * Partially set up routing for MIDI-Learn messages. * BugFix: Wrong ID for kits allowed part messages to drop through causing a segfault. * Some optimisations in Interchange.cpp * Filters and envelopes can now be MIDI-Learned but envelopes don't update the GUI. 2016-11-20 Will * MIDI-Learn window now accessible but non-functional. * MIDI-Learn Gui now has some internal test structure. * Updated docs. * Resolved issue with learned controls not all updating :) 2016-11-19 Will * Made a few corrections and extensions to MIDI-Learn. * Started documenting this. * Bugfix: reverted change that had killed MIDI-Learn :( * More MIDI-Learn refinements. Tested limits & status (but no interface yet). * Created potential GUI based on part kits. 2016-11-18 Will * Started MIDI-Learn. Basic entries in place - not active. LV2 behaviour not tested yet. * Bugfix: Vector window wasn't updated on part change. * Many controls now MIDI-Learnable - can't be deleted. 2016-11-16 Will * Added 'CoolSound' demo vector definition file to examples. * Small change to ID GUI controls as MIDI-Learnable. * Updated docs. 2016-11-13 * Direct -> gui filter done (not dynfilter). * Direct -> gui envelope basics done (not freemode). * Updated and corrected docs. 2016-11-12 Will * Bugfix: direct filter gain was changed by wrong control. * Started direct -> gui filter control. * Updated docs. 2016-11-11 Will * Finalised CMake ncurses correction from Giovanni. * Add more explanatory detail to earliar changes made to Bank/Program change in MusicIO.cpp * Re-instated 'in place' for jack freewheeling. Wasn't in use when program load issue arose :( * Small optimisation to drum mode note base frequency. 2016-11-7 Will * Improved crossfade dynamics. * More docs. * Added 'CrossFade.xiz' instrument to 'examples' files. Included 'CrossFade.txt' description. * Added compiler switch for Note-On time reporting. Needs 'Log Load times' checked in settings. 2016-11-6 Will * Enhanced part onoff control for internal routines. 0 = off 1 = on 2 = inhibit and store last 3 = restore last * Direct -> gui LFOs done. 2016-11-5 Will * Direct -> gui part kits done. * Direct -> gui part system sends done. * Direct -> gui resonance graph done. * Corrected errors in docs. 2016-11-4 Will * Direct -> gui oscllator done. * Bugfixes: some oscillator direct access errors :( * Updated docs. * Direct -> gui resonance mostly done (not points). * Minor direct access optimisations. 2016-11-1 Will * Cmake fix: nucurses now compulsory, but ncursesw optional. 2016-10-30 Will * Implemented kit item crossfades (in pairs). * A couple of small bugfixes on the new crossfade. * Docs updated. 2016-10-29 Will * Microtonal GUI now only needs 'Apply' button on text fields. * Setting an invalid root now leaves root and bank unchanged. * First time bank root IDs now start at 5 spaced 5 apart. * Added '*' to current root/bank in CLI lists. 2016-10-28 Will * Separated key shift from main tuning. * Oops - got that wrong :( * Microtonal optimisation using a key map table - better! 2016-10-27 Will * Direct access Bugfixes: Oscillator waveshape parameter read returned wrong result. Addsynth voice would crash if addsynth GUI not seen. Subsynth hamonics GUI slider move reversed. * Revised GUI data sending to allow reads as well as writes. 2016-10-26 Will * Started separating out CLI replies from main direct entries. * Completed separation up to voice level. * All done! 2016-10-24 Will * Implemented mising direct modulator 440Hz switch. * Completed direct -> gui addsynthvoice. * Updated docs. 2016-10-23 Will * Bugfix: direct -> gui 440Hz wasn't correct for sub/pad. * direct -> gui addsynthvoice done apart from modulators. 2016-10-22 Will * Added Loop mode to Solo feature. * direct -> gui padsynth completed. * Updated docs. 2016-10-21 Will * direct -> gui part kit mode & drum mode done. * direct -> gui addsynth main completed. * direct -> gui subsynth completed. * Updated docs. 2016-10-16 Will * Completed direct gui system/insert effects. * More done on direct gui part. * Gui tooltip correction. 2016-10-15 Will * Changed GUI channel switcher name to 'Solo'. * Corrected GUI anomalies with channel switcher. * New Solo.txt in doc. 2016-10-14 Will * Moved vectors entry to its own button. * Rearanged icons. * Added channel switcher to 'Patch Sets' files. * Moved Channel switcher GUI control from config to Mixer Panel. * Added channel switcher controls to direct access. * Updated docs. 2016-10-13 Will * Direct gui part base controls mostly done. * Doc updates. 2016-10-12 Will * Completed direct gui main controls. * Starting to populate direct gui part level controls. * Updated docs. * Direct gui Add, Sub, Pad vol/vsense/pan controls done. 2016-10-11 Will * Proved direct gui updates correct for main & part controls :) 2016-10-10 Will * Ringbuffer size corrections. * Docs punctuation corrections. * Started to implement direct access -> gui updates. 2016-10-9 Will * Gave direct access CLI & GUI independent 'from' ring buffers. * Improved direct access data transfers. * Small correction to Vector GUI. * Improved simple message system. 2016-10-8 Will * Direct vector access almost complete. * Updated docs. 2016-10-7 Will * Small corrections to GUI. * More work on direct Vector access. * Updated docs. 2016-10-4 Will * Started implementing direct access to Vectors. 2016-9-28 Will * Added more info to /dev_notes and /doc. * Added three new instruments to "Companion" * No code changes. 2016-9-26 Will * Bugfix: AddSynth Mod Amp Env enable now works. * Applied Jespers batch to make scripts bash/dash compatible. * Corrected and updated docs. 2016-9-25 Will * Temporarily reverted actual splash screen to original. 2016-9-24 Will * Merged splash updates from Jesper. 2016-9-23 Will * Removed duplicate enable Freq Filter command. * Bugfix: All AddSynth osc commands were going to the modulator. * Upgraded and tested build instructions. * Updated docs. 2016-9-22 Will * Bugfix: direct access SubSynth Freq Env En was quite wrong :( * Updated docs. 2016-9-21 Will * Implemented direct access for AddSynth (not fully tested). * Setting direct access type bit 0 now only echos byte stream. * Updated docs. 2016-9-19 Will * TEMPORARY fix: pad apply parameters wasn't working headless. Should probably use a list, not single integer. 2016-9-18 Will * Implemented Oscillator direct access. * Updated and corrected docs. * Small correction to Resonance. * Minor code optimisations. 2016-9-17 Will * CLI now strips trailing spaces. * Implemented PadSynth direct access base controls. * Updated docs. * Implemented Resonance direct access. 2016-9-15 Will * Bugfix: direct access wasn't updating SubSynth overtones. * Replaced HTML version of control numbers with text version. * Bugfix: GUI wasn't sending kit number on envelope freemode. * Optimised some direct access code. 2016-9-11 Will * Further updates to docs * New HTML copy of "Yoshimi Control Numbers". * No code changes. 2016-9-10 Will * Completed direct access envelope free mode. Oh what fun :( Switching from fixed to free and back still to be finalised. * Revised docs. 2016-9-9 Will * Revised direct access, now needs 8 unsigned chars. * Implemented envelope direct controls (not free mode yet). * Updated docs. * Implemented LFO direct controls. * Direct access now recognises floating point 'value'. * Updated docs. 2016-9-8 Will * Applied spelling patch from Jaromír Mikeš * Added warning to dev_notes/Direct_Access.txt * Now identifies SubSynth bandwidth envelope. 2016-9-5 Will * Setup for next master version. yoshimi 1.4.1 2016-9-5 Will * Changed three instrument patches to the Gzip compressed form. * If readline can't read its history file an empty one is created. * Finalised all code and docs for release. * Set version 1.4.1 2016-9-4 Will * Added two new sounds to Will_Godfrey_Companion, Thin Trem Pipe & Pulse Reed. * Updated docs for next release. * No code changes. 2016-9-3 Will * Regression: Part volume knob sent mixer slider in opposite direction. * Removed redundant code from Config. * Removed Tests directory. There are much more sophisticated test files now! * Set version to 1.4.1 rc7 * Bugfix: Listing banks from CLI was enabling all possible ones :( 2016-9-2 Will * Rationalised max & min key limits to remove overlap - and silence! * Removed redundant threadmessage tests. * Minor optimizations to threadmessage process. * Reporting GUI commands now a build option. * Set version to 1.4.1 rc6 2016-9-1 Will * Bugfix: Threadmessage was issued at startup (SynthEngine defaults) before threadmessage routine fully initialsed. * Set version to 1.4.1 rc5 2016-8-29 Will * Changed priority settings so that adjustment is specific to LV2. * Pushed program loads out of RT prio completely. * Added CLI to channel switcher control. * Updated docs. * Set version to 1.4.1 rc4 2016-8-28 Will * Bugfix: Parts failed to load from Bank window if part MIDI number was not the same as the part number (MOD 16). * Vectors now fully obey channel switcher in 'Row' mode. 2016-8-27 Will * Bugfix: If Startup had to change MIDI or audio engines it didn't set configChanged, so change was made permanent without warning. * Commented out unused code in Config. * Bugfix: 'Reset' wasn't clearing channel switcher GUI. * Made channel switcher and vectors play nice - mostly! * Set version to 1.4.1 rc3 2016-8-26 Will * Bugfix: GUI was being disabled on close with multiple instances. * Corrected settings messages for higher instances. * Revised shortform NRPNs for channel select. * Implemented channel select setup via GUI. * Set version to 1.4.1 rc2 2016-8-25 Will * First time startup now correctly sets current bank. * Updated short guide. * Set version to 1.4.1 rc1 2016-8-24 Will * Moved current root and current bank to instance config files. * GUI button numbers no longer shown in direct access. 2016-8-23 Will * Separated out instance settings from main config file. * Added GUI and CLI enable/disable to 'Switches'. * Pushed gzip, splash, GUI enable & CLI enable into base params. * Base params now hidden in secondary instances. 2016-8-22 Will * Sample rate, buffer size, oscillator size now settable by first instance only (but visible to others). 2016-8-21 Will * Commented out Config::showQuestionOrCmdWarning( never seems to be called. * More doc updates and clarifications. 2016-8-20 Will * Bugfix: Part change was calling for gui update before loading had completed :( 2016-8-18 Will * Bugfix: If part kit items were enabled but the whole kit was 'off' the items were correctly saved, but not reloaded. * Added 'Pad Kit' to 'Will_Godfrey_Companion'. * Added missing copyright notice to some instrument patches. 2016-8-16 Will * Loading untitled instruments now uses the filename. * Loading "Simple Sound" changes the name to "No Title". * User prevented from changing name *to* "Simple Sound". * Bugfix: xml minimal had been set for patch set saves. 2016-8-15 Will * Removed redundant (duplicated) part number settings. * Improved vector control consistency. * Vector data now stored in patch sets and saved state. 2016-8-14 Will * Moved buffer size, oscillator size, sample rate into config BASE_PARAMETERS. 2016-8-13 Will * Moved LV2 root/bank/program change into ringbuffer and adjusted RT priorites for best results when loading *huge* instrument patches. 2016-8-12 Will * Inproved direct access to filters - Only dynfilter to do now!. * Updated docs. * Completed direct filter implementation. * Updated docs (again). 2016-8-11 Will * Bugfix: CLI wasn't loading upper set instruments (128+). * Tidied up NRPN vector control. * Added more error messages to 'non fatal' category. * Implemented most of the direct access for filters. * Updated docs. 2016-8-10 Will * Implemented simple internal text messaging system. * Added autoload state to CLI and NRPNs. * Added instrument load time to CLI and NRPNs. * Updated docs. 2016-8-9 Will * Slow program load no longer freezes GUI * Bugfix: Very obscure! Made some program load ops fail if number was less than 4 digits and there was a space in the name where the first character would otherwise be. * Updated LV2 for new MiscGui files. 2016-8-8 Will * Defined direct commands for 'set default' and 'MIDI-Learn'. * Activated CLI ID. * Updated docs. 2016-8-7 Will * Created src/UI/MiscGui.h to become only link between synth & GUI. * Bugfix: Effects 'home' on right click had failed. * Bugfix: AddSynth resonance wasn't showing on GUI button 2. 2016-8-6 Will * Started actual direct control of filters. * Added root and bank load times but in uS! * minor doc updates. 2016-8-4 Will * Bugfix: At startup all enabled parts were registering direct O/P when not actualy directed to part/both. * Load time reporting now has its own switch. * Added 'Switches' tab to Config window and moved them from 'Main'. 2016-8-4 Will * Added load time (mS) to instrument load message. * New feature: Auto-load default state. 2016-8-2 Will * Applied gentoo build patches. (doesn't seem to make any difference to other distros) 2016-7-31 Will * Updated docs - no code changes. 2016-7-30 Will * Optimised parameter handling in direct access. * Updated docs. 2016-7-28 Will * Implimented direct access to effect inserts, but not the actual filter (sub) insert in dynfilter. * Added 'Effect_Inserts' file to dev_notes. * Updated other direct access docs. 2016-7-27 Will * Bugfix: System effect sends wasn't reporting scroll wheel use. * Added system and insertion base effect controls to direct access. * Updated docs. 2016-7-24 Will * Bugfix: Direct access reading harmonic values returned the wrong result. * Added missing direct access part controls. Dunno how I missed them :( * Updated docs. 2016-7-23 Will * Completed Subsynth controls (not the inserts). * Corrected doc errors :( 2016-7-22 Will * Started implementing direct access to SubSynth controls. 2016-7-20 Will * Minor doc corrections - no code changes. 2016-7-15 Will * Bugfix: hadn't included new Interface files in LV2 :( 2016-7-14 Will * Changed virtual keyboard roller to slider. 2016-7-5 Will * Small doc updates - no code changes. 2016-7-1 Will * Small format change in GUI access reports. * doc updates, including new file /dev_notes/Direct_Access.txt 2016-6-29 Will * Implimented direct access to part controllers and up to Kits. * Updated docs. * Completed kit level direct access. * Revised some control values. 2016-6-28 Will * Adjusted some GUI engine numbers so they all match. * Implimented direct access to main and basic part controls. * Bugfix: Ring buffer count was wrong. 2016-6-27 Will * Created new Interface directory. * Created new InterChange file in Interface directory. * Moved GUI ID files from SynthEngine to InterChange. * Moved CmdInterface to Interface directory. * Implemented direct CLI access to some part controls. * Implemented ring buffer between interchange and final sound. 2016-6-26 Will * Added GUI warnings when audio or midi not availalble. * Corrected and improved new user guide. 2016-6-25 Will * Created new quick guide as ODF in doc directory. * Updated notes. * No code changes. 2016-6-18 Will * Implemented missing 'home' function in formant filter controls. * Minor adjustments to formant filter GUI layout. 2016-6-17 Will * Added format test to CMakeLists.txt - commented out on pushes. * Reinstated identification of controls. yoshimi 1.4.0.1 2016-6-16 Will * Bugfix: missing format string in VectorUI :( yoshimi 1.4.0 2016-6-13 Will - Set version to 1.4.0 for release. - Implemented shortform NRPN channel change. - Bugfix: Vector X CC didn't enable lowest part. - Added extra sanity checks to vector control. yoshimi 1.4.0 rc6 2016-6-10 Will - Bugfix: 'home' on some controls updated the GUI but didn't send. - Bugfix: Missing 'includes' in LV2 CMakeLists.txt :( yoshimi 1.4.0 rc5 2016-6-10 Will - Bugfix: Subsynth & Oscillator harmonics fundamental homed wrongly. - Bugfix: Virtual keyboard controler showed wrong home setting. - Made all forms of vector incoming CC initialising consistent. Available parts incremented if necessary & parts enabled. - Setting GUI incoming CC only set to 14 if a lower value entered. - More adjustments to knobs and sliders. - Modified '64ft Organ'. Sounds the same but Extreme LF balanced. - Modified 'Tomita Whistle'. Attack time was too short. yoshimi 1.4.0 rc4 2016-6-7 Will - Brought in extended slider controls from Rob's ideas. - Modifed knobs for similar mouse wheel behaviour. - Bumped rc version. - Added existence check when saving vectors. yoshimi 1.4.0 rc3 2016-6-7 Chris - Replaced buggy file extension test. 2016-6-4 Will - Effects knobs home correctly. - Removed now unnecessary reset buttons. - CLI histories reporting now includes vectors. - Added fix from Frank for c++11 issues with older compilers. - Bugfix: default l/r cross for Echo and Distortion effects. 2016-6-3 Will - All knobs 'home' on right mouse click except effects. yoshimi 1.4.0 rc2 2016-6-2 Will - Bugfix: vector 'Clear' was removing all vector names. - Added 'Clear All' to vector options. - Forgot to ID the mixer panel controls :( yoshimi 1.4.0 rc1 2016-6-1 Will - Completed implementation of pitch bend adjust and offset. - Corrected wrong opening tab in PadSynth window. - Vector window now fully in sync with rest of GUI. - Voice list controls identified. - Docs updated. - Master version set for rc1. 2016-5-31 Will - Reviewed instrument name boxes to make them clearer. - Partial implementation of pitch bend adjust and offset. - Vector name box always now has text. - Updated tooltips. 2016-5-30 Will - Bugfix: Default resonance was showing 30dB but was actually 20dB. - All horizontal sliders now home on a right click. - Made GUI sliders clearer and more consistent. - More doc updates. - Added brackets to some code to remove possible ambiguity. - Vector instruments now have the engine colours. 2016-5-29 Will - Implemented Zyn. compatible AddSynth modulator fixed frequency. - Updated some docs. - Implemented Zyn. compatible PWM modulator. - Bugfix: MORPH modulator is now correct. 2016-5-28 Will - Vector control 'Clear' implemented. - Improved Vector GUI structure. - Identified vector controls. - Updated docs. 2016-5-27 Will - Mixer sliders now right click to home position. - All vector options implemented except 'Clear'. 2016-5-26 Will - Initial implementation of GUI vector control. 2016-5-25 Will - Refinements to system and insertion effect selectors - Updated docs - Added auto build update. 2016-5-24 Will - System sends now identified :) 2016-5-23 Will - Added aftertouch recognition to LV2 (not actually used yet) - Identified part to system effect sends. - Identified insert and system effect controls (not system sends) - More adjustment to control ID numbers. - Yoshimi now has a build number :) 2016-5-22 Will - Bugfix: Kit level IDs were wrong. - Updated docs. 2016-5-21 Will - Effects controls now mostly identified. - Yoshimi now only sets a single client if jack is both midi & audio 2016-5-20 Will - Rearanged some control values. - Corrected amp/freq lfo anomaly. - Changed engine numbers. - Updated docs. - Started Identifying effects controls. - Reviewed files to remove GCC6 warnings. 2016-5-19 Will - Completed moving controls ID text from GUI to main code. - Corrected dev-notes/Yoshimi Controller Numbers.ods - Completed Envelope control IDs. 2016-5-18 Will - Started moving controls ID text from GUI to main code. - New sound Pad Organ :) 2016-5-17 Will - Identified controls in Part Controllers. - Updated dev-notes/Yoshimi Controller Numbers.ods 2016-5-16 Will - Updated some tooltips - Documentation now covers all implemeted controls. - Identified top level controls. - Adjusted some control numbers for conformity. 2016-5-15 Will - Changed Resonance interpolation control to clarify two types and reorganised layout of neighboring controls for uniformity. - Bugfix: Filter control had wrong ID - Bugfix: LFO had wrong insert parameters. - Bugfix: Got interpolation button names the wrong way round :( - Documented most of the defined controls in dev-notes - Bugfix: SubSynth wrong control ID. - Bugfix: PadSynth missing control ID 2016-5-14 Will - All Identifed data now passed to synthengine in uniform manner. - Bugfix: Right click on mod oscilator didn't close AddVoice window. - Mostly Identified Envelopes (not fee mode). - Identified most of basic part controls. 2016-5-13 Will - Identifed Resonance controls. - Moved max resonance points definition to CMakeLists.txt and changed to more obvious name. In future we want to check this size outside immediate resonance code. 2016-5-12 Will - Identified AddSynth & PadSynth oscillator controls. - Included Adsynth Voice & Modulator controls. 2016-5-11 Will - Improved SubSynth ID code. - Corrected swapped controls in filters. - Identifed AddSynth global controls. - Identifed PadSynth controls. 2016-5-10 Will - All of SubSynth identified (except embedded envelopes). 2016-5-9 Will - Bugfix: Different versions of CMake require different ways of specifying C++11 2016-5-8 Will - Filter params complete. - Small improvement to the way we return control values. 2016-5-7 Will - Yoshimi now requires C++11 - All parts of LFO now respond to test. - Filter params mostly responding to test. 2016-5-6 Will - Tests slightly improved and will now display in the GUI or CLI whichever is selected. 2016-5-5 Will - Added GUI recognition tests (displayed in the CLI) Volume button on any Addsynth Voice Freq button on any LFO 2016-5-4 Will - Bugfix: offset could be uninitialsed in history saving routine. 2016-5-3 Will - Implemented setting jack autoconnect status in both GUI and CLI. 2016-5-1 Will - Completed right click to and from resonance - First-time startup now opens the virtual keyboard. - Fixed master and part key shift range limits to +-36 semitones. - Implemented master, part & channel NRPN key shift. 2016-4-30 Will - Implemented right click on child window button closes parent and right click on child close button opens parent. To and from resonance yet to do. 2016-4-29 Will - Bugfix: file not added to end of history list if copy had just gone over the maximium, so was still technically there but wouldn't have been saved. - Reinstated missing XML instrument parameters, although never used. 2016-4-28 Will - Implemented CLI read/get for vectors. - Improved CLI vector listing. - Improved sync between CLI and GUI for effects. - Removed temporary 'test' command from CLI. 2016-4-27 Will - Code cleanups. - History optimisations. - Made history variable names consistent. - More work on CLI read/get. 2016-4-26 Will - Refactored 'history' so only one common file is created. 2016-4-23 Will - Added 'get' alias to the 'read' command. 2016-4-22 Will - Started to implement CLI read values. - Rationalised some error messages. - Detached some direct part access from gui. 2016-4-8 Will - Bugfix: CLI vector Y fetures now correctly set. 2016-4-5 Will - Extra CLI error check when loading vectors. 2016-3-30 Will - Improved CLI error checks when setting vectors. 2016-3-29 Will - Rationalsed allowable sizes for sample rate and Oscilsize so all input routes have the same limits. 2016-3-28 Will - Bugfix: Min Oscilsize is 256 but would allow less at CLI resulting in a segfault. GUI seemed to accept 128 but silently changed it :( 2016-3-27 Will - Bugfix: Setting default preset path was being indicated in the GUI but wasn't being actioned :( 2016-3-26 Will - Added "Ignore reset all controllers" to MIDI config. 2016-3-25 Will - Added error check for invalid vector files. - Bugfix: if jack not running and ALSA not available yoshimi sometimes segfalted. - Splash screen can now be disabled. - Added 'Tomita Whistle' instrument patch. 2016-3-23 Will - Implemented CLI Vector save and load. - Minimum CLI abbreviations capitalised. - Reorganised CLI vector features setting. - Giving no channel number for vector load now loads to the same channel as it was saved from. - Now ensures the channel numbers are correct for all four parts. 2016-3-21 Will - Bugfix: All file loads incorporating scales now correctly tuned. - CLI can now load and save scales. - Small adjustment to scales window. 2016-3-20 Will - CLI can now load and save states. - Whenever scales are loaded via GUI tunings are also now applied. 2016-3-19 Will - Reorganised startup so that bank and history loading doesn't slow down intial stand-alone display, as this had made some users think it had failed, so tried again. LV2 startup as before. - CLI can now list recent histories. 2016-3-18 Will - Patched CMakeLists.txt to make it more distro agnostic. 2016-3-16 Will - Fixed regression: LV2 gui now displays correctly again. 2016-3-13 Will - Minor doc corrections and updates. 2016-3-10 Will - Reorganised CMakeLists.txt files for better integration with different distros, and to recognise LV2_PATH. 2016-3-8 Will - Bugfix: CMakeLists.txt now recognises both ncurses and ncursesw. - Bugfix: Default presets were only being set if there were none in the .config file, but not if there was no config file! - Max preset directories set to 128 (same as roots and banks). 2016-3-5 Will - Console now adds entries at the start. - matchWord now case insensitve to reference word as well as input. - More messages can be suppressed. 2016-2-28 Will - Updated docs. yoshimi 1.3.9 2016-2-28 Will - Effect preset number is now included in prompt. - Removed duplicate instrument "0085-old_pad.xiz from Mysterious bank. - Set version to 1.3.9 for release. 2016-2-26 Andrew - Bugfix: in 'main' another GCC6 issue. - Set version for rc3 2016-2-25 Will - Bugfix: another GCC6 incompatibility resolved. - Set version for rc2 2016-2-21 Andrew - setCurrentRootID properly fixed. 2016-2-21 Will - Reorganised CLI root and bank commands. - Implemented creating & deleteing new banks in CLI. - Bugfix: deleting bank failed if there was no .bankdir file. - Set version to 1.3.9 rc1. 2016-2-19 Will - Corrected desktop file. - Updated docs & screen images. 2016-2-18 Will - Bugfix: CLI can again list current bank/root. - Bugfix: on debian testing GUI was locking up if you reduced the ID of the last root path in the list. 2016-2-17 Will - Instrument file changes are now individually checked after the attempt instead of tested for writability in advance. - Path window no longer offers save/not on close - always saves. - Bugfix: above changes didn't update gui correctly :( 2016-2-15 Will - Fixed regression. Moved bank and history loading back into config. Previous change didn't improve startup behaviour and messed with LV2. - Created 'stateChanged' variable for future use. 2016-2-14 Will - Removed jack/alsa tests from CMakeLists.txt It's now redundant. - Re-enabled up to 128 roots and banks and removed redundant maximum test - MIDI can't send > 127 and command line does it's own check. - Updated docs. - Added 'Muted Synth' instrument patch. 2016-2-14 Andrew - Removed ControlInterface (obsoleted) + fixes for gcc-6 2016-2-8 Will - GCC 6 fix? 2016-2-7 Will - Corrected man page. 2016-2-1 Will - Fixed regression. Config was being resaved when nothing had changed. - Refined message hiding. Applies to Reports console and CLI. Hiding is also independent from those forced to CLI only. 2016-1-31 Will - Small gui correction to remove unnecessary scroll bar. - Recent Scale/State now greyed out if empty. - Bugfix: Wrong name in CMakeLists.txt failed in some environments. 2016-1-30 Will - Corrected some GUI text and tooltips. - Added check for ncurses in cmake. - MAX_HISTORY now set to 25 in CMakeLists.txt - Banks file now follows compression schedule. - Current available parts now stored in 'MASTER' part of patch sets. - .config & .state now marked as yoshimi only. 2016-1-29 Will - Added scale list to history file and recent scales to GUI. - State list and recent states also added. 2016-1-28 Will - Bugfix: Loading saved state now correctly sets buffer size. - Duplicated calls to state XML data removed. - Initial implementation of non-fatal error report hiding. 2016-1-27 Will - Reorganised grouping of main .config file - New config files that are unique to Yoshimi now carry the yoshimi doctype instead of the ZynAddSubFX one. - minor doc spelling corrections. - Fixed regression. Alsa can have sample rate selected again. - Trial of 192000 sample rate. 2016-1-26 Will - Patch Sets History no longer in main .config file but in new .history file, subsection "PATCH_SETS" 2016-1-25 Will - Added correct licence details to CmdInterface files. - Synchronised Exherbo cmake. 2016-1-24 Rob - Furhter improvements to cmake workround. 2016-1-24 Will - Minor reorganisations. - Only relevant XML files now carry base parameters. - CLI no longer sets configChanged when altering the new banks file. 2016-1-22 Will - Set bugfix version 1.3.8.2 2016-1-22 Rob - Workaround to avoid cmake 3.4.1 bug by using our own routine to generate .cpp files from .fl ones and not using fltk_wrap_ui 2016-1-21 Will - Started splitting up yoshimi's config files and separated out banks to their own files within .config/yoshimi/. - Changed confg save to banks save in banks UI. 2016-1-17 Will - Bugfix. Quick patch from Csaba so Addsynth vice presets are recognised. - Patch from Csaba to hide extension in presets window. 2016-1-15 Will - Bugfix. Format string missing from sprintf :) yoshimi 1.3.8 2016-1-14 Will - More doc updates. - Set version as 1.3.8 rc3. - Resolved minor ambiguities in command line syntax. - Final tidy up of docs. - Set version to 1.3.8 for release. 2016-1-13 Will - Updated docs. - Set version as 1.3.8 rc2. - Corrected part number (CLI numbers *must* start from zero). - CLI Y axis now uses up/down instead of sharing left/right with X. 2016-1-12 Will - Created Yoshimi man page. 2016-1-10 Will - Set version as 1.3.8 rc1. - Moved banks & roots to end of config file. Will eventually be separate file. 2016-1-9 Will - Added gui state to config file - All major startup arguments now trigger the config changed message for both gui and command line. - Command line environment status now saved and cross linked with gui status defaulting to CL if attempt to disable both. 2016-1-9 Andrew - Reconfigured main so first instance can access saved config before gui. 2016-1-8 Will - Synchronised config change warning between gui and command line. - Implemented saving current part to external instrument. - Updated repositories. 2016-1-7 Will - bugfix, Yoshimi now exits correctly with '-c' argument and trailing '&'. - Help now context sensitive, and list reoganised. - Command line can now load individual external instruments to the current part. - Tiny optimisation to SubSynth filter. - Updated appdata and desktop files. - Updated Command_Line.txt - Implemented alsa/jack preferences within command line environment. 2016-1-6 Rob - Completed Program Change improvements and defined common point in SynthEngine for all Program Change calls. 2016-1-4 Will - Subsynth bugfix. Buffer size no longer has to be divisible by 8. 2016-1-3 Will - Improved cleanness of program load from various sources. 2016-1-2 Will - Program change no longer mutes the whole synth. 2015-12-31 Will - Disabled jack/alsa tabs if running as LV2 - Allow mutiple instances whith alsa audio as they can now be set to different backends/soundcards. - Root/Bank/Program thread now lower than both jack and alsa. 2015-12-30 Andrew - Revised music clients so that Yoshimi can always start. If the wanted backend is missing it will try the other option and if that fails, set a null backend. 2015-12-29 Will - Updated docs (especially command line) - Moved Drum kit 2 so it is MIDI accessible - Added Moor Drums - Added Choir Stabs 2015-12-27 Will - C/L system and insert effects now report to the gui 2015-12-26 Will - Ported pop suppression feature from Zyn 2.5.2 - Changed default XML Zyn instrument compatibility version to 2.5 - Bugfix. NRPN insert and system effect changes only worked correctly on the lowest value effect number. 2015-12-23 Will - Small improvements to command line access. 2015-12-22 Will - Bugfix. Had screwed up vector Y control. Now better error checked too. 2015-12-21 Will - More code cleanup. 2015-12-20 Will - (MusicIO) hooks in place for key and channel pressure. - Implemented Y/N query for command line. - Command line can now change part names. - Added reset capability. 2015-12-19 Will - All base level part controls available to command line. 2015-12-18 Will - All command line effect sends in place (no gui update). - All command line effect presets available. - More code cleanups 2015-12-17 Will - Implemented major effects settings for command line. Effect number, type and send. - Some code cleanups. 2015-12-15 Will - Vector control now has it's own level on command line. - Setting audio destination is now by names (not numbers). - Part volume, pan & keyshift now available. - Can now change jack config as well as alsa. 2015-12-14 Will - Audio and midi preferences can now be set in config window. - More improvements to command line interface. - Updated docs 2015-12-13 Will - Bugfix segfault when doing a reset via command line if gui active. - Command line part change now updates gui - More reoganisation of cammand interface. - Started to implement command line level sensing. 2015-12-12 Will - Applied possible Install fix to CMakeLists.txt. - Re-organised command interface files ready (hopefully) for a big push on implementation. 2015-12-10 Will - Enabled AddSynth voice formant filter Q to respond to settings. This brings it into line with the recent Zyn. upgrade but shouldn't change any currently existing patches. - Completed Root, Bank, Program change thread & ringbuffer incuding full error checks, and allowance for future expansion. 2015-12-9 Will - Corrected jack/alsa MIDI behaviour and added user defined source name for jack MIDI in gui. - Updated docs. 2015-12-7 Will - Humanise settings now saved in patch sets. - Reverted CMakeLists as problems now worse for fedora and some debian installs. - Added lv2 makefile and install to cmake distclean. 2015-12-6 Will - Bugfix MIDI not responding to CC2 sometimes. - Removed jack MIDI ringbuffer now served better by guithreadmessage and root/bank/prgoram thread and ring buffer. 2015-12-5 Will - Improved 'Humanise' feature and changed to a slider. - Small code clean-up arond root,bank, program code. - Improved gui timeout delay on fault. 2015-12-2 Will - Minor improvement to Root, Bank, Program selection in ring buffer. 2015-12-2 Rob - Corrected gui update method for banks and roots. 2015-12-1 Will - First trial of combined thread and ring buffer for Root, Bank & Program Changes. 2015-11-28 Will - Fixed regression where renaming instruments failed to actually write to the file. 2015-11-28 Andrew - Added '-c' option that disables command line interface 2015-11-27 Will - Resolved instrument name anomaly. Part name is now always internal instrument name, regardless of file name. - Minor optimisation. No need to reload same bank. 2015-11-25 Will - Applied cmake ARCH and LV2 patches. - Added notes on audio direction in'doc'. - Changed CC logging channel numbers to start at 1. - Improved some command line responses. 2015-11-21 Will - Implemented logging of incoming MIDI CCs. - Fixed crash bug caused by new kit item name being called before it was created - only when trying to enable a kit item with no engines already defined. 2015-11-21 Will - Re-enabled 'minimal' in XMLwrapper for all except presets. - Presets wasn't showing 1st character (array offset by 1). Corrected. - Clarified copyright notice. - If in kit mode engine window title bars now display the kit number and name if any. 2015-11-20 Will - Fixed regression where sending CCs would close part windows and streams of them blocked the gui. - Discovered previous bug was hiding 'inappropriate' gui calls :( Now fixed properly. 2015-11-19 Will - Ported pink noise feature from Zyn 2.5.2 - No longer clears part output buffers, as they are completely overwritten when in use and ignored otherwise. 2015-11-17 Will - Minor display corrections - Changed XML minimum Zyn instrument compatibility version to 2.4 - Activated addsynth voice filter velocity sensimg. yoshimi 1.3.7 2015-11-16 Will - Added experimental breath control CC2 - Set release version 1.3.7 2015-11-14 Will - Rationalised window titles. - Consolidated internal filenames. - Bugfix kit item label now updates correctly. - Set version as 1.3.7 rc1 2015-11-13 Will - More windows under control. - Improved save and load code. - More windows show the instance number in their title. 2015-11-12 Will - Now ensures session files always save with the .state extension. - Remembers the last positions of major windows and reopens them if shut down while they were still open. - Added different file for each instance. 2015-11-10 Will - Directly setting channel numbers 16 to 31 will now allow a note off while blocking all other MIDI messages to that part. - Preset directory changes no longer need a restart. - Part key shift extended to +- 24 semitones. 4 octaves should be enough for anybody :) - Default state file location is now fixed - users can change it as they wish. - Removed redundant Pnoteon code. 2015-11-8 Will - Minor adjustment to command line - single characters can be used for unambiguous commands. Spaces between them are still needed. - Adding or removing root paths via command line now updates the gui. - gui master refresh sets system and insert to 1 and selects system. 2015-11-7 Will - Bugfix reset all controllers missed some and didn't update the window. - Multiple instances disabled if running with ALSA audio output. 2015-11-6 Will - Bugfix state save and load didn't identify 'empty' instruments. - Reorganised top menu bar again and added 'clear' to scales. - Enabled logging XML header versions. 2015-11-3 Will - Prepared XML wrapper so that meaningful data can be put in 'INFORMATION' not just instrument settings. - changed menu bar 'Show' to 'View'. 2015-10-31 Will - Added 'Show' to top menu bar. - Rationalised top menu bar entries. - Created 'Reset' button in place of 'Clear all parameters'. - Added reset to command line. - Added number of available parts to defaults resetting. 2015-10-29 Will - Loading scales or state now performs a retune. 2015-10-27 Will - Fixes microtonal tuning regression. - Moved old README.txt file to histories. 2015-10-25 Will - Added command line history patch from of F. Silvain. - Corrected bank listing regression. 2015-10-24 Will - Moved cli output call to make it more generic. - Removed duplicate report code in synthEngine. 2015-10-23 Will - Implemented unix style paging for command lists from ideas of F. Silvain. - Implemented command line listing of parts with instruments installed. - Updated some docs. - Cleaned up error messages and logs. 2015-10-16 Will - Implemented load and save of patch sets. 2015-10-12 Will - Added paging to banks list. 2015-10-11 Will - Implemented paging (not banks yet). 2015-10-9 Will - Changed mode return behaviour. - Changed some command names. 2015-10-8 Will - Fixed segfault when changing command line mode. - Added command line history. 2015-10-7 Will - Brought Andrew's thread and readline into older style command line. - Further enhancements. 2015-10-6 Will (command) - Improved readline exit behaviour. - Added exit command. 2015-10-5 Will - Further improvements to command line control. - General code tidying. 2015-10-3 Will - More improvements to command line control. - Extended command line vector control. - Auto generate .config/yoshimi/presets directory. 2015-10-2 Will - Set up bugfix branch to track only the current release. - Set version of this to 1.3.6.1 2015-10-1 Will - First time config search was getting confused if zyn or old style yoshi configs were there, so they are no longer accepted. - Added definitive search for bank dirs launch directory parent. - Added definitive search for preset dirs in launch directory parent. - Identifed preset bugs. Only gui updates needed now. yoshimi 1.3.6 2015-9-28 Will - Some code style corrections. - Final LV2 fix. - Documentation updates. - Snuck in a new instrument patch. - Set version as 1.3.6 for release. 2015-9-26 Will - Pulled in additional command line controls. - Pulled in Andrew's further LV2 fixes. - Set version as 1.3.6 rc5. 2015-9-20 Andrew - Fixed LV2 plugin buffersize setting in case of smaller internal buffersize. 2015-9-14 Will - Fixed bug that let an invalid instrument be stored in a bank. - Changed 'Parameters' to 'Patch sets' - Set version as 1.3.6 rc4. 2015-9-13 Will - Merged stable version from command branch. - Set version as 1.3.6 rc3. 2015-9-10 Will (command) - Allow buffer size down to 32 frames. 2015-9-7 Will (command) - More extensions to command line access. - Improved error checks. 2015-9-6 Will (command) - Extended and improved command line access. 2015-9-5 Will (command) - Started new command line access. 2015-9-2 Will - Set version as 1.3.6 rc2. - Overall key limit increased to 80. - Part max key limit increased to 60. - Part default key limit increased to 20. - Added demo midi and parameter set to examples directory. - More doc updates and moved some files to Histories directory. - License corrections. 2015-8-31 Will - Set version as 1.3.6 rc1. - Untangled preset counters from bank counters. - Improved NRPN listing of roots and banks. - Small GUI adjustments. - Updated docs. 2015-8-25 Will - Corrected command line regression :( - Added command line entry to define new root path. - Improved some default settings. - Now correctly scans for banks on first time startup. 2015-8-23 Will - Improved command line options. - Updated docs. 2015-8-20 Will - Completed new NRPN extensions so most system values can be changed. 2015-8-18 Will - Extended NRPNs to list dynamic system values (to current report log) some of which can also be changed. 2015-8-13 Will - Added failure messages to splash screen and increased timeout. 2015-7-20 Will - Merged in ALSA updates from 'buffers'. - master version now displays an 'M' suffix. 2015-7-20 Will (buffers) - Hopefully completed Alsa updates. 2015-7-20 Will (buffers) - Implemented Alsa endian changes. 2015-7-16 Will (buffers) - Alsa now recognises 32, 24 & 16 bit formats LE only. 2015-7-15 Will - Added sanity checks to vector feature CC settings. - Small correction to alsa audio. - More doc updates. 2015-7-11 Will - Fixed bug that would crash if a bank or instrument rename was cancelled. 2015-7-10 Will - Added exclusions to CC designations. - Improved vector control error checks. - More doc updates. - Implemented redefinable vector features 2015-7-5 Will - Minor gui bugfix 'Simple Sound' correctly set to 'No Title' in all windows when actually edited. - Vector control individual features can be reversed. - Enabled NRPN part destination setting. 2015-7-3 Will - Merged in corrected buffers - still some work to do on alsa audio which has been incorrect for a long time but should be OK on motherboard chipsets. - More documentation! 2015-6-24 Will (buffers) - Set up and tested separate buffers for JACK only, very untidy. - currently breaks ALSA and LV2. 2015-6-19 Will - bugfix set typecast in BankUI to enable build with fltk 1.1 - bugfix changed MasterUI so that main window is refreshed when 'State' is loaded. yoshimi 1.3.5 - Finalised for release and tagged. - Added more details to docs. yoshimi 1.3.5-rc4 - Fixed failure of Insert Effect part list length to update when number of parts changed. yoshimi 1.3.5-rc3 2015-6-13 Will - Fixed regression that was messing up pitch change. yoshimi 1.3.5-rc2 2015-6-11 Will - Fixed gui bug, disappearing 'Bypass Global F.' when Addsynth Voice Filter checkbutton clicked. - Vector checks and sets related part channel numbers instead of assuming default values. yoshimi 1.3.5-rc 2015-6-7 Will - Jack port only registered if direct part output is set as well as the part being enabled. - Mixer panel refresh button hidden (redundant). Will eventually be removed if no problems seen. 2015-6-5 Will - Improved engine colour sync, and also responds to kit part edits. 2015-6-1 Will - Common Add,Sub,Pad colours now defines in CMakeLists.txt 2015-5-30 Will - Vector control volume 'swap' now uses an inverse square law to keep the overall level fairly constant. - More improvements to instrument engine colours. 2015-5-30 Will - Bugfix! Only part 1 was responding to gui instument selection. 2015-5-29 Will - Fixed regression that stopped mixer panel updating on MIDI program change. - Moved max part control from parameters menu to alongside part number. - Refactored part gui calls to improve updates. - Implemented colour based engine IDs in mixer panel window - 'Clear All Parameters' now resets NRPNs and vector control. 2015-5-27 Will - Trial for colour based engine IDs in main window. - Fixed bug that caused banks to be initialied twice on startup. - Hid (redundant) refesh button from instrument banks window. Will remove it completely if no problems show up. 2015-5-23 Will - Small improvement to synth ID discovery. - Prompts at foot of window. - Removed old style new bank creation. 2015-5-21 Will - Implemented identification of all three synth engines. - Made workaround for corrupted instrument headers. 2015-5-15 Will - Implemented max part & part group control. 2015-5-13 Andrew - On-demand jack ports registering (only if part is enabled) 2015-5-12 Will - fixed asString bug that still appeared on some architectures. Thanks to Stephen Parry for identifying the cause. 2015-5-7 Will - Improved bank root and extended program change CC setting method. - Corrected NRPN gui display issues - Updated Docs 2015-5-6 Will - Implemented Zyn-compatible NRPNs with extension for effect type and destination part number change. (some gui improvements needed) - Updated Docs. 2015-5-2 Will - Improved NRPN handling of 14bit NRPNs and 'full' NRPNs with reversed data byte order. 2015-4-30 Will - Fixed regression in distortion level. - Added voice number to AddSynth oscillator editor. - Implemented NRPN data increment and decrement. 2015-4-27 Will - Fixed bug that stopped some rotary controls responding to mouse wheel. - Re-orderd part effects window to more closely match system & insert. - Made 'panic' stop fade at a fixed rate so it is now click free even for very high sample rate and small buffer size. 2015-4-25 Will - Added part number and name to editing window title bars. - Made it possible to silently disconnect/reconnect a part from all MIDI input. - Improved config settings for Bank Root & Extended Program Change. 2015-4-24 Will - Implemented 14bit NRPNs - Implemented scroll wheel control of knobs - Implemented X as well as Y knob control 2015-4-21 Will (vector) - Some more small optimisations 2015-4-19 Will (vector) - Fixed regressions caused by mixer gui changes! - More adjustments giving greater flexibility to NRPNs 2015-4-18 Will (vector) - Added NRPN and vector error checks and warnings - Updated docs - Very specific segfault with Rosegarden V12.4 and 'RootBankChange' test file has cleared! Confirmed it is still there on yoshimi 1.3.3 puzzling :( - Rationalised mixer panel gui, removing duplicates 2015-4-17 Will (vector) - Implemented direct part channel change - Corrected license anomalies - Updated docs 2015-4-15 Will (vector) - Implemented direct part CC change - Corrected and updated Docs 2015-4-3 Will (vector) - Implemented direct part program change - Vector controls only enabled if NUM_MIDI_PARTS set to 64 yoshimi 1.3.4 2015-4-1 Will (vector) - Bugfix corrected merge errors 2015-4-1 Will - Tidied up for release on such an auspicious date! 2015-3-30 Andrew - Share async gui process function between main and lv2 mode 2015-3-30 Will - Ported padsynth wavetable saving from ZynAddSubFX 2015-3-29 Will - Fixed root dir length bug - Fixed add root no-show bug - Fixed remove root still showing bug - Removed root path tab from Setup window as it was getting too complicated syncing 2 copies - Changed 'Reports' menu item into a separate button fltk problem :( 2015-3-28 Will - Reports can be sent to the console window or stderr under runtime selection in the settings window This setting is saved, per instance - Lots of small log message rationalisations - Removed some old commented out code - Reinstated search for ZynAddSubFX config search if no Yoshimi one can be found 2015-3-26 Will - Bugfixes in setup CC selections - Removed auto close checkbox from Banks and instruments - Reports menu item greyed out if not enabled. 2015-3-25 Will - MIDI volume control range now saved to parameters per part as "volume_range" - Updated XML headers to include author and yoshimi-major and yoshimi-minor version numbers - All pan centre buttons now red, not just main one 2015-3-22 Will - Rationalised MIDI volume control - Implemented MIDI volume control range setting - Implemented missing resets in 'Reset All Controllers' 2015-3-18 Will - Pulled remaining program change gui calls into gui thread - Root path window now correctly tracks 'save' changes 2015-3-15 Will - Used new gui updating so that MIDI volume and pan changes are shown in both the main and panel windows 2015-3-15 Andrew - Added asynchronous gui update ability from arbitrary threads 2015-3-12 Will - inserted missing ";" at line 60 of yoshimi.ttl found by Holger Marzen 2015-3-10 Will - Panel window bugfix 2015-3-2 Will - Added patch from Jakub Cajka to furthur nail asString ambiguities - Added SVG icon image (renamed alternative) - Set up for release 2015-3-1 Will (vector) - Moved all NRPN and Vectore code to MusicOI - Added 'Brightness' control - GUI freeze still not resolved :( 2015-2-28 Will (vector) - Further separated out controls, and also enabled setting instruments however this is very experimental and *not RT safe* - improved this now, but discovered a gui bug if the panel is open when a vector program change takes place - gui freezes :( - got rid of a warning message in jack engine :) yoshimi 1.3.3 2015-2-27 Will - Added and updated Docs & Images - Prepared for full release 2015-2-27 Andrew - Updated splash screen 2015-2-26 Will - Some fine tuning - Updated documentation 2015-2-25 Will (vector) - Separated X & Y to independent NRPNs NRPN msb = 64, lsb = 1 for X NRPN msb = 64, lsb = 2 for Y DATA lsb = CC, msb = operation(s) 1 = volume 2 = pan 2015-2-24 Will (vector) - Seems stable now - crashes were due to mixture of channel and part limits. - Mixer panel now shows groups of 16 parts. - Volume sweeps implemented but need balancing better. 2015-2-23 Will (vector) - First attempt at vector control Setting NRPNs and vector CCs seems fine. Only implimented volume control. Getting a lot of crashes in use though when changing settings via the gui. Panel window only shows 1st 16 parts. Part control (rather than channel) works much better. GUI problems probably due to some use of NUM_MIDI_CHANNELS where NUM_MIDI_PARTS should be in the original code. 2015-2-19 Will - Small gui code optimisations - Removed some confusing, duplicate, redundant & disabled code 2015-2-18 Will - Implemented bank rename - Added gui buttons for this and instrument renames - Close on selection now righthand mouse button - bug was slowing down bank swaps -fixed 2015-2-16 Will - Added middle button close of banks and instruments as if auto close has been set 2015-2-15 Will - Implemented bank complete removal 2015-2-14 Will - Bank swaps/ID changes now in place but not checked for unwritable locations - Now checked - Added highlighing of current bank - Implemented adding banks - Corrected bugs in bank swaps 2015-2-13 Will - Basic structure complete and working but changing IDs etc. not yet implemented 2015-2-12 Will - Developed window selection/swapping and forward link from config - Fixed bug that created empty banks - Added format string to 3 fltk alert calls to silence gcc warnings 2015-2-6 Will - Unified root bank instrument log messages - Updated MIDI test files 2015-2-3 Andrew - Fix png image creation on fltk < 1.3 yoshimi-1.3.2 2015-2-2 Will - Final updates to files for full release yoshimi-1.3.2-rc2 2015-1-31 Andrew - Start guis only from main gui thread 2015-1-28 Will - Added check to prevent attempt to change non-writable instrument files *before* GUI entries written 2015-1-27 Will - Allow instrument name of just 3 chars - Bumped version number to rc2 - Clarified text of error messages 2015-1-27 Andrew - Added splash window showing current loading status - Ignore midi bank/prg change if no bank/prg found 2015-1-26 Andrew - make new bank id search start from 127 downwards - do not reload bank on id change 2015-1-24 Will - Un-numbered instruments now handled as before (placed from 160 downwards) - Bumped version number - Bug fix in CC tests - Removed unnecesary instrument prefix tests when indentifying banks - Added early startup comand line message 2015-1-24 Andrew - New instance now gets first available unique ID - Added menu item to start instance with given ID - Sort banks on first start or if mappings are not defined - LV2 plugin now uses new bank interface 2015-1-23 Andrew - Added per-instance config files support - Now saving bank ids in config file too 2015-1-22 Andrew - Rewrited Bank/Root handling algorithms to support numbering - Fixed PADSynth_used detection algorithm 2015-1-15 Andrew - Don't change floating point rules in case of lv2 plugin. Hosts should do it. 2015-1-14 Andrew - Fixed lv2 plugin crash on midi event loop transition (frame X to zero) 2015-1-12 Will - Applied patches from Harry MIDI channel selection now in sync between main window and panel and right click on panel 'Edit' opens the actual edit menu. 2015-1-8 Andrew - Fixed segfault on exit if Alsa audio engine is used 2015-1-5 Andrew - MIDI bank root dir change algorithm now uses low priority threads - MIDI bank root dir and bank changes are synchronized now - GUI is updated accordingly to bank root dir changes 2015-1-5 Will - MIDI bank root change now in place :) but not currently updating GUI :( - Setting of both root and extended program CC now error checked but have to use the spinner up/down arrows - can't seem to reognise the 'Return' key :? 2015-1-3 Andrew - Started control interface implementation (logging this for history) 2015-1-3 Will - Added warnings if loading patches named 'Simple'Sound. - Applied patch from Harry Nakos Volume & Pan now synchronised between main window and panel. 2015-1-3 Andrew - Corrected target lib suffix detection for lv2 plugin 2015-1-2 Will - Bank root IDs can now be changed in GUI. - Cleaned up code. 2015-1-1 Will - Settings->Bank root dirs now displays root IDs and marks current root and MIDI banks changes only see current root. 2014-12-21 Will - Changed concept of default root dir to current root dir. current root is where new banks are saved to. changing current doesn't alter list order or root ID. ID will be used for MIDI root dir setting & bank access. 2014-12-11 Will - Updated parameter & instrument load & save will not save 'empty' files inserts "No Title" when loading untitled instruments 2014-12-9 Andrew - lv2 plugin: fixed ringbuffer write when midi message should be splitted into chunks (this is a very rare condition) yoshimi-1.3.1 2014-12-8 Will - A few optimisations in Reverb and Phaser - Released V 1.3.1 2014-12-8 Andrew - Separated LV2 plugin instances. Yoshimi - stereo mix, Yoshimi-Multi - stereo mix + 32 individual mono (16 stereo) channels. 2014-12-6 Will - Corrected long standing bug in unison. Reverb bandwidth OK now! 2014-12-6 Andrew - Added multi-channel support for lv2 plugin 2014-12-5 Will - Reverb and Phaser additions Reverb bandwidth control sending right numbers but not changing the sound produced :( Phaser additions work correctly, but GUI controls Analog, Hyp., Dist. not sychronised :( - Phaser done (silly mistake) 2014-12-1 Andrew - Enabled cross-instance copy and paste. yoshimi-1.3.0 - Made LV2 plugin ON by default - Removed command line control. The reason: useless, not thread-safe code - Just a few GUI improvements - Made support for variable length runs. This provides sample-accurate midi processing for offline rendering and lv2 plugin. - Removed strict requirements of Subnote on 8x multiple buffer size. Adopted SUBnote::filter() method for variable-length runs - Initial LV2 plugin support (OFF by default)! Tested in MusE, Ardour 3, Carla and qtractor - works both plugin and gui. - replaced all calls to lrint() with (int)truncf(). When fesetround(FE_TOWARDZERO) was called, lrintf() behaves exactly as (int)truncf() with that difference, that (int)truncf() returns always the same result not depending on external factors. - Made command line control for yoshimi instances (OFF by default) - Added error message if midi bank changs too close - Ported portamento rate and depth to controllers from Zyn. - Added state interface support for lv2 interface. now saving/restoring yoshimi lv2 plugin settings works. - Added per instance ability to change panel window between 2x8 or 1x16. Haven't decided on best way to store setting. - Fixed bug in wide panel window. - panel settings saved to yoshimi.config. - patch provided by xnakos fixes part enable sync between panel and main window. This revealed it wasn't done properly for MIDI so that's been added too. - removed spammy default midi messages. - patch provided by xnakos to fix bug in Simple Sound representation. - better resolution yoshimi icon. - instrument updates. - separated out examples from presets and put in their own directory. - a few more GUI adjustments. yoshimi-1.2.5 - Made yoshimi support multiple in-process instances: 1) Added "New instance" menu item in "Yoshimi" submemu. 2) Jack/alsa midi/audio port names are named "yoshimi" + postfix (empty for the first instance and -1,-2,-3 etc.. for the next). 3) Windows names (main window, panel, keyboad) are named according to instance number with unique postfix. 4) Only main window of the first instance exits process. Other windows deregister instances and closed. - CMake policy change to stop warning message - Small correction in part peak representation - Copied some ancient history into Docs - Part name always shows at least the words 'Simple Sound' so new users will know what it does. - Bank selector always shows a name. - MIDI Bank changes now refresh the bank window contents. - There is now a compile time switch to direct errors to the console window instead of stderr. - Moved all global variables to per-instance ones. - Implemented multi-instance support: Updated all constructors to take SynthEngine * as last argument and store it in synth member variable. "Runtime" global var (of type Config*) and "guiMaster" (of type MasterUI *) are moved to SynthEngine and accessible via SynthEngine::getRuntime() (which returns reference to per-instance Config class) and SynthEngine::getGuiMaster() (which creates, if not already created, and returns per-instance MasterUI class). PresetsUI class instance is moved from global var to MasterUI class member var and accessible via synth->getGuimaster()->getPresetsUi() method from UI classes. - Jack client instances will be named on per-instance basis. Default one is "yoshimi" + "->optional tag" (as before), next is "yosmimi--" starting at "1". This may never be used (but who knows? Anyway, this is the more proper way), because the default behavior for the yoshimi app is to create one global SynthEngine instance to go on with it till exit. From the user point of view nothing changed. - Gui class destructors made virtual to make recent compilers happy - Started initial LV2 plugin interface implementation (cmake option is OFF by default) yoshimi-1.2.4 - ALSA MIDI can now auto-connect. - Changed x.x.x.notes to Changelog as requested by packagers. - Jack MIDI auto-connects too! - VU meters disengaged from synth via ring buffer. - Failing to load parameters or instruments at startup is no longer fatal. - Yoshimi accepts un-numbered instruments in banks again - under protest! - Some more small UI and CL message refinements. - In settings added Enable/Disable MIDI program change - some seq's don't play nice :( default is to enable. Compatible with Zyn's 'ignore program change'. - Settings layout tidied up. - Incremental DSP improvement - we now only fill/copy buffers that have a destination! - Bugfix - when a part's audio out was directed to part only, system effects were still being generated and sent to main. - Correction - audio to part *does* carry insertion effects if they are set. - VU calculations now completely separated from sound generation and outside the mutex lock. - Changed envelope cut-off to -60dB (was -40). - Another addition to Will_Godfrey_Companion bank :) - Bugfix - missing 'include' in main.cpp stopped compilation - but not in all environments! - Changed unison size highlighting. With no code change, it stopped working for some reason! - Improved VU displays. - Updated INSTALL instructions and removed duplicates of this and COPYING in /src - detached part outputs from main volume and added clip indication in panel (doesn't clear with 'Stop' so fundged) - some more minor adjustments - VU updates completed - and we're away! yoshimi-1.2.3 - Some more minor bug fixes. - INSTALL file now refers to V1.2.2 - Enabled saving audio destination in parameters file only relevant for jack output. - Ported SubSynth overtones feature from Zyn. 2.4.4 - Ported Unison phase randomisation control from Zyn. 2.4.4 - Added checkbox in 'Settings' to allow a MIDI program change to enable a part if it was previously disabled. - Ported AddSynth & SubSynth processing enhancements from Zyn. 2.4.4 - Changed part's key limit from a list to a spinner so you can set any value up to the maximum poliphony - 5 This is error checked when parameter files are loaded. - Changed unison size from a list to an enable button and spinner giving you finer grained control. Values that match ZynAddSubFX are highlighted for compatibilty - Added experimental 'naturalise' small random detune feature at note-on. - Performed lots of tiny optimsations. - Disabled part audio out selection if not running jack. - Put some more info in Docs - much more to do! - Updated copyright notices. - Temporarily disabled ALSA MIDI auto connect till I can find out why it crashes - seems it's never worked. yoshimi-1.2.2 - Started some documentation. Much more needed! - Improved config saving. I think we're there now :) - Fixed bug that caused segfault if MIDI voice changed with no GUI. - Fixed bug that stopped MIDI bank change with no GUI. - Added panel option to direct a part's audio to only main, only part or both. - Cleaned up panel display. - Added memory lock to jack ringbuffer (probably not needed). - Restored PADsynth highlights and made them more distinct. - Refined PADsynth and general boolean XML detection a little. - Enabled reporting to console. It doesn't seem to affect CPU usage. - Improved error reporting for missing bank or program. - Added Test directory with MIDI and Rosegarden bank and program change files. - Reinstated gzip compression on voice and parameter files. - Added compression level to settings. 0 = plain XML save. - Bug fix. Controllers window would sometimes freeze - thanks to Rob Couto for the fix. - Added appdata as requested in the sourceforge features tickets. - Revised 'make install' to make sure everything goes to the right place. - Changed position of Pitch bend roller in Vkeyboard to make things clearer. - Small update to Will_Godfrey_Companion bank. - Reinstated part Pan Depth control, but calling it Pan Width as that's more descriptive. yoshimi-1.2.1 - Added alternative robot icon as an SVG. Thanks to Andrew Ter-Grigoryan - Added option to enable a part if not already enabled, when doing a MIDI program change. - Set Vkeyboard default velocity to 100 same as for ZynAddSubFX. - Stopped settings asking twice about saving. Will do more on this! - Rationalised linker flags. - Added drumkits from Dario Straulino. yoshimi-1.2.0 Added circle and spike AddSynth Waveshapes. Added MIDI bank and program change. Bank change can be selected as MSB, LSB or disabled. Included CC for patches 128 to 160. Also CC selectable and can be disabled. Finally resolved trailing zeros in detune bug. Fixed microtonal saving bug. Corrected parameter loading regression (that mainly affected the Overdrive sound). Corrected regression that stopped the -K option autoconnecting Other small bug fixes. Added and updated voice patches. Special thanks to Kristian Amlie and Tito Latini yoshimi-1.1.0 * Optimization patches provided by Kristian Amlie. * Added The Mysterious Bank by Florian Dupeyron aka My?terious. * Virtual keyboard AZERTY patch, thanks to David Adler. * Yoshimi has shiny new knobs! Thanks to Alessandro Preziosi aka licnep. * Multiple JACK outputs implementation by Andrew Deryabin. * Expand state file path before any check by Nikita Zlobin. * Some minor cosmetic changes (placement of Close buttons, resized the panel window). yoshimi-1.0.0 * In memory of Alan Calvert who passed away exactly one year ago. Cal, we're pretty sure it's only angel horns you hear and no devil trombones! * Modified INSTALL file and added instructions on how to build Yoshimi outside the source tree. Thanks to Jimmy for the instructions. * Previously when microtonal loaded .xsz files, it did not convert the tunings back into their x.y format, which was displayed to the user, this patch corrects this mistake. Thanks to Mark McCurry for the patch. * Renamed Yoshimi icon. * Applied patch from SourceForge ticket #3487751 (Simplify desktop file and install it and the icon file). Thanks to Tim harder for this patch. * Yoshimi likes GCC >= 4.7 again. yoshimi-0.060.12 * Fix for the keyshift/microtonal issue, patch provided by RPD (Rob). Thanks! yoshimi-0.060.11 * Fix empty functions, fluid no longer produces (empty) implementations for totally empty functions in .fl files. More info: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=633476 and http://www.fltk.org/str.php?L2259 Thanks to Frank Kober for pointing out this issue and thanks for the patch. * Dynamically switching to legato mode using a footswitch has been made possible by Kristian Amlie. Thanks for the patch! * Renamed Yoshimi icon file in the desktop directory and modified desktop file accordingly. Packagers, please use this icon file, it has been designed specifically for Yoshimi. If anything needs to be changed in order to have this icon included please let me know Jeremy Jongepier yoshimi-0.060.10 COPYING file updated yoshimi-0.060.9 licence anomalies corrected. yoshimi-0.060.8 Nothing too adventurous, just an incremental advance on 0.058.1 adding Paul's Unison and Reverb enhancements, jack session support, panning inversion corrections and assorted other tweaks and bug fixes. yoshimi-2.3.5.1/Dependencies000066400000000000000000000025271506652756400157000ustar00rootroot00000000000000Packages known to be needed to build in debian jessie and later. Some of these will pull in other ones. automake build-essential * we now require C++17 cmake-curses-gui * 3.0 or later fluid * not needed if compiling headless libcairo2-dev * not needed if compiling headless libfftw3-dev libfltk1.3-dev * not needed if compiling headless libglu1-mesa-dev * not needed if compiling headless libjack-jackd2-dev * not needed if not compiling for Jack libasound2-dev libmxml-dev libncurses-dev libreadline-dev libxft-dev libxml2-dev pkg-config xutils-dev zlib1g-dev If compiling for LV2: lv2-dev * libjack-jackd2-dev also required for this Other distros may have slightly different names or version numbers, and may even have these installed by default. If in doubt try looking for just the main part of the name, but with the -dev extension where appropriate. For experienced builders: Optional alternative, instead of libncurses-dev. only needed for wide (unicode) character recognition. Note the 'w'! libncursesw-dev Optional alternative to glibc, part of build-essential musl This also requires argp-standalone which is not available from debian and must be built from source. Note: argp-standalone is also needed for BSD builds. yoshimi-2.3.5.1/INSTALL000066400000000000000000000076751506652756400144310ustar00rootroot00000000000000---- Installing yoshimi ---- Before doing this, check the "Dependencies" file and make sure you have all of the entries in place. You will need to do this as the root user. If you are running a fairly reacent debian distribution simply enter: apt build-dep yoshimi It's a normal CMake build. ---- Sample instructions to compile/build using ccmake on Linux, outside-source-tree ----- This uses "yoshimi-2.2.3" as an example, and should work fine with all other versions. It is an easy way to build/compile using ccmake, in a separate build directory. This way, changes to source code can be readily compared without combing through the build-related files. We will assume you have a home directory called 'user' and want Yoshimi to reside in a directory called 'software', but downloaded the archive to /home/{user}/download. Working from a terminal window, extract the source code archive: mkdir /home/user/software cd /home/user/download tar -jxvf /home/user/download/yoshimi-2.2.3.tar.bz2 -C /home/{user}/software Now there should be a directory: /home/{user}/software/yoshimi-2.2.3 First move into this with: cd /home/{user}/software/yoshimi-2.2.3 Now create a 'build' directory with: mkdir build and move into it with: cd build "/home/{user}/software/yoshimi-2.2.3/src" is the source code directory. "/home/{user}/software/yoshimi-2.2.3/build" is now the current working directory, and will have make-related files (when ccmake is done with configuring and generates the files). Run ccmake: ccmake ../src Note the two dots! Within ccmake, type 'c' (without the quotes) to generate a default configuration. At this point, unless you have specific requirements we suggest you use the 'down' arrow to move the cursor to 'BuildForThisCPU' then hit 'Return'. This will optimise for your machine. Type 'c' again to actually apply the current configuration data (repeat multiple times if needed). If there are any missing pre-requisite libraries and/or software (dependencies), it should prompt you with such info. You can install such dependencies and try these ccmake configuration steps again. When ccmake configuration is complete, there should be a new option displayed: 'g' to generate (the make-related files) and exit. In other words, if you already have all dependencies in place, then when you run ccmake, just try 'c', then 'c' again, when 'g' appears as a choice, type 'g'. The make-related files are created in the current directory, and ccmake is done. You are now back at the command line. Next is to compile (build) the application: make If you have a multi-core processor, and know how many cores there are you can speed up compiling by entering: make -j{n} where {n} is the number of cores. When compilation is completed successfully, install it (as root) with: make install By default the yoshimi image is then copied to /usr/local/bin Yoshimi will in fact run anywhere in userspace, which can be convenient as an alternative to installing it - especially when comparing different built versions. In this case banks and presets will only be in the yoshimi directory. For more fine tuned building see INSTALL_CUSTOM ---- Build and command line options ---- Yoshimi builds with both Jack and Alsa audio and midi options. Alsa is the default for midi. Jack is default for audio, however if this is not available Yoshimi will try for Alsa. These, and other options can be nominated at runtime via command line parameters, and via the Graphical User Interface and Command Line Interface. ---- Instrument banks ---- Yoshimi installs its own copy of the instrument banks (installed by default in usr/local/share/yoshimi/banks/). On first time startup, it also looks for the standard zynaddsubfx bank directories and includes any that may exist there. You can tune your choice of bank directories via "Instruments" or "Paths". ---- Help ---- If you get stuck, ask for help on LAU or . yoshimi-2.3.5.1/INSTALL_CUSTOM000066400000000000000000000054451506652756400155140ustar00rootroot00000000000000---- Customising yoshimi ---- There are a number of compile-time options that can be set or edited. These are presented when you run ccmake - after the first time you press 'c'. Many of these are 'switches' which you toggle on and off. You do this by using the up and down cursor keys to reach the option you want to change, then hit 'Return' to actually change it. The first of these are the build choices. If these are all off, a basic all-purpose build will take place. Also, these are exclusive, in that you can only have one of them on at a time (even though more may seem to be set). However, if you know the details of your machine architecture, switch the appropriate one on. Many current desktops as well as laptops are 64 bit Intel ones, so for one of these you would select 'BuildForCore2_X86_64', whereas for the raspberry PI V3 you would chose 'BuildForNEON'. Alternatively 'BuildForThisCPU' will try to find the best fit for your particular machine. After these, there are the actual compiler flags that will be used. These should only be changed if there is some specific feature you want enabled or disabled. You select as before by moving the cursor, but this time pressing 'Return' enters a line editor and you move sideways to reach the item you want to change, typing in the new flag, or removing the unwanted one. Pressing 'Return' again puts you back in selection mode. ---- Locations ---- After the main build information you will see the location of the Curses directory (used for command line access). This is where cmake found a valid location and you shouldn't change it unless you have a specific need to use a different library. ---- Other Options ---- 'BuildWithFLTK' (normally on) - If disabled you get a headless build with no references to graphical libraries. There is a switch for building in jack session support. Yoshimi can be used as an LV2 plugin if switched on, otherwise the code will not be generated. Once again, there is also an editable location. The majority of installs want this located at 'lib/lv2' but if you need something different you can change it. 'ReportNotes' is a developer's tool that counts note-on and note-off events passing through the system to check they tally. Finally, there is 'ShowNoteOnTimes'. This is an option to display the time it takes for a note to be generated and is again for the benefit of developers. ---- Build for 32 bit ---- Sometimes you want to build for a machine that has a 64 bit processor but is running in 32 bit mode. This is what you need to do. cd to yoshimi source directory and before and: mkdir build-32 cd build-32 CC='gcc -m32' CXX='g++ -m32' cmake ../src make Remember all lib32- dependencies should be installed prior to building. ---- Help ---- If you get stuck, ask for help on: . yoshimi-2.3.5.1/README.md000066400000000000000000000012631506652756400146420ustar00rootroot00000000000000## Yoshimi Yoshimi is a software audio synthesizer, currently only available for Linux. ### Current version Version 2.3.5 * New feature: A set of LFOs for the SubSynth engine. * New feature: Popup tooltips scale to match the parent window. * Various code refinements. ### Building Full build instructions are in [INSTALL](INSTALL). ### Source Yoshimi source code is available from either: * Sourceforge: https://sourceforge.net/projects/yoshimi * Github: https://github.com/Yoshimi/yoshimi ### Community Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org ### License GPLv2+ see [COPYING](COPYING) for license details. yoshimi-2.3.5.1/README.txt000066400000000000000000000006641506652756400150650ustar00rootroot00000000000000Version 2.3.5 New feature: A set of LFOs for the SubSynth engine. New feature: Popup tooltips scale to match the parent window. Various code refinements. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/Util/000077500000000000000000000000001506652756400142765ustar00rootroot00000000000000yoshimi-2.3.5.1/Util/1stReadMe.txt000066400000000000000000000034641506652756400166330ustar00rootroot00000000000000The following are utility programs and files that are outside the main Yoshimi build but can be run from a terminal window to add to, or modify some features. The file 'ControlModel.svg' is the source file for the PDF version in dev_notes. It is somewhat out of date! MakeSplash.sh Command: sh MakeSplash.sh This converts any .svg or .png image to a hex dump and embeds it in the Yoshimi source so that on the next 'make' it will become the new splash screen. SVGs are preferred as they can be easily edited. The file 'splashdefault.png' is the oldest released screen - it was created before SVG capability was available. 'YoshimiSplash.svg' is one created by Jesper that can be used as a template, and is the current one. You will need to give the full filepath for both "MakeSplash.sh" and your image file. midiListgen.cpp This is a source file used to build a program that generates an HTML formatted list of MIDI note names, numbers and frequencies. It is highly accurate and was used to generate the list used in the guide. incBuildNumber.py This is a python program that picks up the current build number, increments it and resaves it. updateGuideVersion.py Thi is a python program that reads the current Yoshimi version details and extracts just the number, discarding any suffix, then embeds it in the HTML user guide. It does this in a manner that doesn't change the file size. Three bash scripts in parent directory: comp enters the build directory, compiles the code, then returns to the project directory. run enters the build directory, runs the compiled code, then returns to the project directory. set enters the Util directory, runs updateGuideVersion.py, then runs incBuildNumber.py, then enters the build directory, compiles the code and remains in the build directory. yoshimi-2.3.5.1/Util/ControlModel.svg000066400000000000000000001225201506652756400174220ustar00rootroot00000000000000 image/svg+xml CLI GUI Synth Mediate ActionCommands ResolveText LowPriority Simplified Control Model PostResults Trigger MIDI learn Sync Freewheel or sync FetchandReturntext Buffered Direct (under development) Read Only Limits MIDI already yoshimi-2.3.5.1/Util/MakeSplash.sh000077500000000000000000000043651506652756400166750ustar00rootroot00000000000000#!/bin/sh # Generates a png hex and associated parameters used to build the splash screen. # Not part of the build process - should only be used after modifications to the splash screen # Input files can be .svg or .png depCheck() { if ! type "$1" >/dev/null 2>&1; then echo Could not find $1! MISSING_DEP=true; fi } echo echo Splash screen export if [ -z $1 ] || [ ! -r $1 ] then echo Needs a valid filename! echo exit 2 fi DEST=${0%/*}"/.." FILE=$1 HEX=$DEST"/src/Misc/SplashPngHex" CODE=$DEST"/src/Misc/Splash.cpp" EXTEN="${FILE##*.}" MISSING_DEP=false if [ "$EXTEN" = "svg" ]; then # Requires inkscape (pref. v 0.91 or higher), hexdump and sed depCheck "inkscape" depCheck "hexdump" depCheck "sed" if [ "$MISSING_DEP" = true ]; then echo One or more dependencies missing! echo exit 1 fi # Extract width and height values from the svg - somewhat reliant on inkscapes svg formatting WIDTH=$(sed -n -E '1,/\s*width=/ {/width/ s/.*width="(.*)"/\1/p;}' "$FILE") HEIGHT=$(sed -n -E '1,/\s*height=/ {/height/ s/.*height="(.*)"/\1/p;}' "$FILE") echo svg - Width x Height = "$WIDTH"x"$HEIGHT" echo $PROG FN="/tmp/splash_screen.png" # export png inkscape --export-png="$FN" --export-area-page "$FILE" > /dev/null &&\ echo exported png elif [ "$EXTEN" = "png" ]; then depCheck "hexdump" depCheck "sed" if [ "$MISSING_DEP" = true ]; then echo One or more dependencies missing! echo exit 1 fi # Extract width and height values SIZE=$(file $FILE | cut -d ',' -f 2 | sed 's/ //g') WIDTH=$(echo $SIZE | cut -d 'x' -f 1) HEIGHT=$(echo $SIZE | cut -d 'x' -f 2) echo png - Width x Height = "$WIDTH"x"$HEIGHT" FN=$FILE; else echo Invalid file type fi # hex array generation hexdump -ve '1 1 "0x%02x,"' "$FN" > $HEX && \ echo hex data updated #update width/height values sed -i -E \ -e 's/(Width\s*=\s*)([0-9]*)/\1'"$WIDTH"'/' \ -e 's/(Height\s*=\s*)([0-9]*)/\1'"$HEIGHT"'/' \ -e 's/(Length\s*=\s*)([0-9]*)/\1'"$(du -b $FN | cut -f 1)"'/' $CODE &&\ echo "parameter values updated" # cleanup if [ "$EXTEN" = "svg" ]; then rm -f "$FN" echo cleaning up echo else echo fi yoshimi-2.3.5.1/Util/YoshimiSplash.svg000066400000000000000000012207251506652756400176240ustar00rootroot00000000000000 image/svg+xml yoshimi-2.3.5.1/Util/incBuildNumber.py000066400000000000000000000011301506652756400175450ustar00rootroot00000000000000#!/usr/bin/env python def increment(line): numbertext = line[len(endstring):] if numbertext > " ": return str(int(numbertext) + 1) else: return "0" f = open("../src/Misc/ConfBuild.h","r+") line = "start" found = 0 endstring = "#define BUILD_NUMBER" text = "0" while line != "" and found == 0: mark = f.tell() line = f.readline() if endstring in line: found = mark text = increment(line) if found == 0: found = mark f.seek(found) f.write("#define BUILD_NUMBER " + text + "\n") f.truncate() f.close() print("BUILD_NUMBER " + text + "\n") yoshimi-2.3.5.1/Util/midiListGen.cpp000066400000000000000000000050241506652756400172130ustar00rootroot00000000000000/* * High accuracy program to create HTML formatted * list of musical note names, MIDI note numbers * and actual frequencies. * Only covers the useful range of note numbers * not the full range. * * Note: * you can get an approximation of 12root2 with: * 196 / 185 * this gives: * 1.05946 * * 07/08/2021 * * g++ -Wall midiListGen.cpp -o midiListGen * */ #include #include #include #include #include #include #include #include #include using std::string; string asLongString(double n, size_t digits) { std::ostringstream oss; oss.precision(digits); oss.width(digits); oss << n; string value = oss.str(); value = std::regex_replace(value, std::regex("^ +"), ""); if (value.find('.') == string::npos) value += '.'; while (value.length() <= digits) value += '0'; return value; } int main(void) { // we use doubles for greatest accuracy then reduce the result. // this minimises accumulated errors from repeated multiplication double twelfth = 12.0; double two = 2.0; double multiplier; multiplier = pow(two, 1 / twelfth); std::cout.precision(10); std::cout << "twelfth root of two = " << multiplier << std::endl; static string names [] = { "A", "#", "B", "C", "#", "D", "#", "E", "F", "#", "G", "#" }; int stringcount = 0; int octave = 0; double result = 27.5; int precision = 6; string currentNote; string fullString; std::vector ourlist; for (int i = 21; i < 109; ++i) // practical MIDI note range { currentNote = names[stringcount]; if (currentNote == "C") ++ octave; if (currentNote != "#") currentNote += std::to_string(octave); ++ stringcount; if (stringcount >= 12) stringcount = 0; fullString = " " + currentNote + "" + std::to_string(i) + "" + asLongString(result, precision) + ""; ourlist.push_back(" "); ourlist.push_back(fullString); ourlist.push_back(" "); result *= multiplier; } size_t idx = ourlist.size(); std::ofstream midiList; midiList.open("midiList.txt"); if (!midiList.is_open()) { std::cout << "Failed to open midiList.txt" << std::endl; return 0; } while (idx > 0) { --idx; midiList << ourlist[idx] << std::endl; } midiList.close(); return 0; } yoshimi-2.3.5.1/Util/splashdefault.png000066400000000000000000002472461506652756400176620ustar00rootroot00000000000000PNG  IHDR7|FmbKGD pHYsodtIME9-{a IDATxYey^{EZHղMn6 wOF?=1oh؍q{3Ӳ%(R$EY{%bι'ofr*J$2+ԹqD|o'O2??ORu],BdLdLdLưò,<A)@a)l&c2&c2&c!,lƶmRieYT** 硔BJ9Yɘɘl'IBX븮 SSSضM(&611C )%i`cnl6/ZOf2&c2&c2Fq Y7Vvŗb6111@FHX1h}F^ɘɘvÊݰz0dLdLd|FJY|=<lz 6[$IRNBɘɘ}"\z^8eY5iJEu677ؠlv ar211OtýK), )LMMQTðHٲp5v5y!Z-$5Wg7dLdLӵn=LOOsqN8QQKm(nKVceen[<̠wf8I&ɘ8\9p g uݢXM4}+SzBYZ6i&M Ҕw cL/e49xB6>령b!sŰebF~S \!wc<a wKs'zJmwi4|',--!333Tբ`+i62b3N<4I&{IJutZm:&VnC& he)lC0$KA ˲Q78Z1v_;v&b +8%bc"~">h u 1C}!F1Ҿ,C !zAk394O!Fz] p>ok"z<2"(*{dz5z//{.u}FJY֔J%"D83KuBҍtژ鐤 qniRJee"Ry!3ЋJa"Gpj~,Y}ChHBD Ẇ8bD8 @|0@o58B&[@#zp8"c:F4MZvt:DQTQJ.ƘT.}uBc!m܍$6ec6Zk|Gy>J-3-MHvIIIIp%wlۢE,-sm.u̵[$GLO9.(gvy9y꽯Raw`ٰ;糯/Ý:7Y7OHnK`ss()YXX(O6Mܹŋjjm9sss۶=rj 2$ IG"2Rg[mjV =U[-Vݣu2ssgVXƠ!1`(qiRZ-6-f<,0IJF:fG4M~Ν=+/k<\  \e#D 0"{Ba·"ΨV߸4~fXpn+̢izN(Γߌ'~9)qֳj4E9@ti3@q]!DaѠncY;vY~W|M޽[R(Xo;lF/H8DQF'嗿3(Jk.v#;{k׮ɕ+DQ //}5޾+˔*Ur#VWW9C:/_WÇ,--gqdi&/a $x413SU~.#I]?!fwbaZѣܸq2SO2vFF^8c^3ֆ5 .A:Aaс \fHF8fTa9 4Cq7 QF? ӍW[uh>"ܹ۶IӔ'OnKʄ09ya~sqU\BK,,,2=kae$RdEeYܼs_eD??{$TÇy7qqL: G٤W!H$9Ɔ3pGF'3}V15NƷ,s|0s8g}4cfPOz޹}nH) Ð0 yWyw|6Y,d}})%׮]`nnӧOsݻG+t:jj6eoczfJ ,)h<Ē։X^=pW^ymW׹to&Q LOODV#=N8鴉:Tuz]|>.!bpaXp|p۝p8dt3 !w|5V3:l ;83;x}ڭ6w)re:.ow… 8Ãh۽/?ڵk `zzuuVcǎqqZzVEǻW>TFʌ f j8VB[^[ÖY(+&oݿOOsQ077Rj\ɓI&8uXFΛmGC7~c8Ásû/3jl?~b yƈߌ:ӝj(c|ql s c ] q߻G,//s0?!+++\~'ܸq7xjZaaaVVV,SNIv{ /f٠$I)8M T*8KKK1z󘝝e}}%VWWsgΜٳaHR(EM) EHs?a hc2/qWu7}+ v>00sSaӚ9~nlq/C<0#NȽ>iyi.VaHի=|_{.7VErg:ǎѣ|E1Q g#UVr&:- u nTy&WE$xիWY\\_:ۿymqzjqm)lq=أٰPtJ!lINî0t>{}!WN [q-#`cc!./g+pկSN{{\p=VՊbF8^NϨFJ=L8xwilllpQ?#;pU (R&f0 )٢2W- %&1m]a$|mׯvQ,эb-\ BlR )`vX7! @L:!  ^g03EH4u8R)E}o|ܺuo-LW_ezz:S;.] J)* A`ӣUbA&yFpI~kkk<~['}˗9y$Ǐ/__nZs1VVV0oh4ZsYmVV? ~|A.g00&?nLfBAi !ocuamuVBjLOOs._7Mx 1[t]{9\ڵkܾ}u2SSSY.!o;_X8rPZN^<wF__lQ ?q]4-$_?jQTxŗ7AT"NRMT2~Xq<,K!M'qvRa`yv秵oWCTa>S0`Fqm#П9{4MӧiZ,//jx뭷x饗m|;ELΝ;k_ R0==3_lr9~wjeYDQD$T*2Ri[󵝆nlk_ůsMt_2+:.wE#5gAJ3Ϝ7-9s:Aw:"P3˶3@CMsSLFw OYn)=hByߞ '1=^zex n߾͋/ȯnyVܺu@m#Gq^zSNVMŶm*jhP`-'\F&J5TSڷ~o~!W9s=E*yqR u_Xk5JA1Zmjna9 T JeC)Ykj#pBp&JYn)=~,2{~+rEn߾MZs?OFYe}K+purN>G{Dyv7xMP*e@HK!vn#i@;N00^N˪ dz;?F)/,?xMVVVt:(X[[}ffg9q/"?<))qy>R Fnj:iR/eJ2r'<|Ǐ3==7*nrؠjknSza;6ʲzB}_rE:O_[7y&(%q]rR c qtZSTVpJB\0eHZC75b\%9sY~Ƿ'i\W_+.#hNW@+ϫQ*cI)Ga䟤y*->|Z[J8Rzpxg}u"/{]t<~8338~)eJKӔnKӡjeJq1fg-ay!cuu'Yn؎B^&S zep,Bbayĺ)| U82&5B>hM5Hi@2`ĖسhPa`ZٰE5V]ݛۑ;! |:OBLo O6&qD/ܹQzv비a(+^Y4W?<8=RN+%JTRd):S4l~(m]ن~8[0[;\ooXڢykoe-.'Oa7S'& |Z7pdfK"خÉ'z&, W!GlW OƲ>w.\hHRH.ǠMZMhm0yŒP'DH2l=Ά-Jdi>/3Њoe?+qA0УvB a`Bx8%bG-kP)/:^{6c޾VFP.(6s'xR2L^OQe v70?le |["Ijt&cck 9m % 4[-޹ڦ˔ĒJR88ly$ <NoZ3_iƥUD9A3͙i !%vk 0xc#lP.'D0l_HԝW;OcY}bwkzN;7ڰA /r-n>Ibi|T8V =q+ q=lJR9`Mnq]ƕ",z4o`*Doӵ9n!b>sN/Q< S)E[m:WK:>hc} ݄€{M 1y vu\Ct;ZOXqX.O5a`DOȰlQ'RHK_Y޹ū>?G82J-aIdiynDբ1id~+&)?x>kHO#,؏$1w)'K8xAxfRV8XYf_ٯw\2@y3\ %c0iI$14#hřv:y4+M@A[к_#5#G\[tRH45ڭ&N$IҤÁz?f55sfVk77&w7!E[;d5ZmQ$ItrLw Yfw@a#ec % GYVfթ*/~׹vot6>3i)_08,;K(dqdb:+\hb5:Z'WYo _AS^%&1FTWn8?  ,!c;RYy~>Oy]fo %K T#-klC#T~c Qp 1p$u$Fkv+ŋꅐm# Rgr:}iDP@'t]KsmYU4J5q*FmB օ;XH2*/t>wNSk\~ J43,7=ے4-pZڍ2Kϕ ab}g,83cRflr/|Vy㻤wyL̅cgh56i6W7' Xܲ)j y,sBUznV,I!TH2aB\&q\˲3AMx*\iBjv`Noh $pߚ f)n`z3vG;h Oc,-?]ACHdvR)lƶ-,kLO0fW12 P( z^0=3ˋ_|Mn/-o^;eNOSvmiwttR"@hj+XG&k#Qo[04ʟJII#"sKA8ER?Y5RY>ۋ=҇jwגW9c(Z[f-%L;5^~)E7Iq>c]ib /"Ls,"e1LjyA<0$NRW]00Y0q׏NqRǏcΜ=yF>b*wLr RTgRzNUX8R*6Yߚj&)o]H^UplDtA1_^|D\!,,V#,҇asО; [ E(9>ԲDD#\6f}OqĺGgMu֚Ԥ(·|* [ctF.G=L{=a&E2A9h)^=Xd*NM&b{'M?Lymlw) -6쬵ek5Ru)/v! t>I`) (+ض)GB b_`_F %#Vް[^8xO\Ncql°D\\fٌOB@;(vqR {6]+E|%9r,:*ڪ, d$Zso?~Jq M0&p~Y5 ~X m95ۄ6["16;Z#燽'D~|=R,o0GfQI\vWH_7&`Imt)}2jFٟ#z={vZ ,n(-H0Hi|0y]e*,{a[O!v6./^wΞ/OjFlkH!JBd`86ucmK!~AytJKAܲCzUxyA[*e;8^TyYZ*z&ޮrjzk39 ѭ,f,1Fj]dV[.H:: ͌}Tgs*mkڐfЎ JepU LQJZdIuz%Z8mͫKUN`Wc[zϰΙ]uc @XbGFVo+MXfՠB} -s seKX^yL;,q:1y"rC) F*M˪bS,v X>n{G%_d1^)QR֍zA)Ee -Ky^^@B3(PѠ5m%'˒%+(9d |jnQ2R:@G'_鐭J fD=a~srUZKeOXJeq,sFMm F'4dRfֈ(k45PJXJl 32VRf#D2\K^mF?|Ij$FxǬ[<  $ȸp/c^TG P6%[Rv{JN|I77-IÒY2ƱL|]ehǠ%LDϒ*):!D,;p N n8.^R`p̶x(g07Ol̐ lv5"^_\OћHVy>3xEry Me# noX7@3Y>R@йl e+rTC\G夀bCk)͔oԢ*Z$[uYDO;eJhT]l&{XcYj|vlFf+ ?gNʮfY"p"P[%+eW%Hl :+Df]g)jZ Dx2+(%;mY#WȠΞ)bNqŶ]>ʱ Ƴ6/N)0O7꠻YՀ4E%նSo~p V1S)pkA2?Y2wVal=Qૈ)ŬV(yhWJPrWd (L3KY2DTb)YTTޯ'wʝs4l%#pj_>k\E{"S$iJ:x߭;F{Bx:>jNa`ˇ,+kC!S33 ָLzN8GwJ fS4i5!x9ʚCX'c5.IjHvo|+IS*HaC5I6Ŕ; A%١3R`"C!rMB^O#vcVegUlrc~Ž}?Yz8d$(pyIsmXĞ`Q}[;W RPouQlGĈ1W,75%VVl,JEoZ%VStnwK \7 ;=dk$el1c"NM L "Z7pU"Rru*6?i)tY,M3BɆv'z;f)SL\ye mxltnVH۳u 4²TCV?$QԵKZ&"0u\ı|YX:7TVRݵZ~!%2`u֙ũ n![Į  A:Np̓M% ̽1v\\?!(93ܹ^][D\9~Z JX)ܕ%6Ј_^` 0 'cn;?,e 9 ֡hw6Մzꂭ|1:: E0fɪxE2J'-+6I7-d'`Dk5I-#:Dx>V:d]%S㴵bSu f6f$ 6yoR)UWފd֤ZO3T_oY5C8VAeWeT*eO#)ڸM[*Y> v~ 6;1Hfp}=Gz[S$]C@)Ree!!Hؔ 1?Hl<BNV}\&ݴD$ֆNb NlhǂvY+%-whA+[?BӦ:*P$QJf["#(Tyttns7:61v#B_%W܂1*QgfN ("^_i?Ri,Vr[]93! +QRPo'Iטk~@EJ2Y7'H295V˼u=}\`)IkXG&j&ngn# Rqy1J IDAT+Y; *+(m$Fm*=hM&ow6h"(ycM32Ժ <+.#$B*r %%I :5кh$BS+l4LcLael0z;a]L0iFC=ceə)Y),iV|BHhVibtO lNX[`epTJ}iSy ]21E3-tpK*6|[Q<11\אJa;:J//=Fubo GЮDlm)151swqHXMƜsh"W; \ F; 91Utg:&jB4Se"i.><Υ;gʹi~i_R!,-]5c?= G:{ ˲sι[rz !@M0a I9d`LHPBR$44 EͰ0S=Mמ{|9RUt7_GFeUgwy}//o~*<@$tبqGlS ,@kWֲfoy/x7娋 ;$k<dlZa@$k2]` h&W](Kl>Bg[|-~H?hZ2=לOy=T‰zEL+Ùldf)X~H,]/RlT(☪,Zqvzu]c1&FdmnluDXpN{|[`$$u~f>鄂PF l疵AE16&Bbƚ0S>?Js"ygx\XPG?`Cڻ]o%21DU'Ϭ,1{)+C kf|9 s:a~oDޮ% 8]}4MᩧU_L9 „IA1Cs )k!,e [%/5.k,7JNѹ8M7,eW?{_D 0UM{Y϶;ǭv+dqB"H0"u2^dyQ<8R:K{^b@5ec o_bkk V9&aF-l1*Ú1ݘaX1;B29H9}5}{͉X]Qc*]a[:6aΛ  E{/>~ˇzoI h-\`KSPeq՜xu*tE{iJ'Sb3eMJKMf1ErY%&aFk6–#,S*P!"l!yi2^@E]ZqH'TzjcF;:svUHP>O7 |e v1}`K "g95%ܫi6 8S[eEvfUk 4%i91{,bVO]oS" ]e{N'owc)=)y6 1:iw<Ӭxzݻ*XYpٓe̵B/5D-'hEE s1<uBG6w&@fU+,y=QN[B_b( qzd}I5^ 0 .g}]~J=Gb [T=BhߌM\[*%2| \Fkl]`1CDV).r ,Bق:LIÖkф$ wZ9VrPH/Gl n" x!9 +Du1l{ms> h-`~ߕsk[`i]c&-P@ion]ujƚS:-DֱYsNtB"'x>v0NFmgY]P6cszQA~-ye4y*spZm2{oJSu.jד Ee43zo)wK76;0FZyxr3MKh?F }QXKm-Rnc~ekā m&Ik&|W:1WCƋaCח9J" C8rMWsUͣe8y6׶S#la4&%CHp⡋\y Gk֚/zt47:0H4,I~nG9{⠛uc lG,q? qJհ-|y#b>}%%^Zގ2OQiJoۛeh>>L'G)cOMjV8=S^k4L1&aY)[@`k2W\ɍss-BuϳfinnEnL`|DAHc~jK\3$UZaMlHxm.P* z7ݠ؞Kgh2A4GcB8 w?h$t3!nT<o¥ԣUAXe[ZUC_ˀ(#iT̟M5z WVFmDv2^=B< $ n9EQ2NS,ca~7 Vi?BqEI:'ngcGRՕڊB\edKk|/PIڷmݙBJۡ$F LrО 6R2QB-@"O{a8# Z)Mo6mh>iw|KTGbJR#\*b6[DFH].  2$0ğaZS ůnqc%sQ/џ 0 †.߬ݤ?!0ӆk^hFHIߟ|,8і"!ɃQgk mn8T€{Oo!#o-a`rsJZk}O3^GD6@0pĨii<&Q+M%nw)f̗ؠ?#Žˠ@\?1n% AjY_"m!Q,ep0PݹnͿu+k3 ځsƥF>q)Dh>ﱷKn2z/*Yl$A6- Iд#͗->si-L̇(4; ȫhfzw=w 0 ݄l'I'_a]yc댺I)G7X_UD"Ij&4a40Z󅗮1aO)c8~%LzDQBjJZDh\Ge3# - јx8b8ĭ6emWzWۯٯb@;D~,Ҕ9$v+T]`m\mo[=Oh5e r}܎u -eG>Xjjs.u2;bߎNbTq#t xV ? 6 )V׎j>ui ӿNuV9 Yy/5rJÑHxͺ1p0k JN.ML.Ar#iP>asnYW$-(β(h۔g`"ME'3s.Qtζ˫=.}uñ{1 .5gT+sv՞$eY+l 2DgvhEF4Tbu؇8q77JZ̽#Uab@j/f y}Csu1FԀ1̵#- ؚ$y#<=7/}kVݜ[d#Q_>r07!Qj,ކjЩCcL&(IZ-9 :,њ*)hȳ^^,YE5X啧9ȳa=4 ʹR\8* g$BPxb"PaZt_X-<ߛTeEQ䤣E-paPK<%ִOve$ "`]izۣ5u|'#@'T5diG%|Dp ѿ+gxxɶ}7_Ú0M<&2wJ@>L67'Zg /p:IM;Ggne7Ӏ)"/|WFtz(b)H#^"UYR5.~;M)MJVP);t榲ɨu E& V*>7JeN-x 8v~,y ,͐ @20 )IG-݄̓735M1769(m'!@ӲWiwt,,t|*M^0tF(C(HxDΞp%Ōָ1`yTGQeYF(5ϜZ+*lWbw߻bOppbIUn!YL8x('PON/-5gQ˿ 7b7ٍAN&$6DHmؔ}Sf6˛"G اH0HDJޑ3Z'n9Aʲ(B5,<!BP4qy\zQM7XgtG 7((W-]XïUO:\็+BA D8G9-jD]mH8QxLii14vYM;!I'y>Ab3@42p [bؐWHQ+UQ9 ȥ%J|9RTs|UjfȳҝLI]Kg@'<#b* |oGҸ`buDs"JPVQQUUYRWu8aLKx:{x*<`ARzoS_% HW 0NP](r=g=,)@FQ<+ˣRW5kی $G4m#T)tHU 3}݈yj 6 u]?abÚaa =qZS{];u^!ҥ(F+` u]`m>]%Sl$brf4$h'!6sR=*Wݬ1(A}.am*mse\&0ّ!6VEؙLvr/ S]e켓+IWD Pɨ¦"u|R9F$dHI6n̫ˆVdڕjKA-Sf6D7v7|ݳ\|4/z7lߦFt7"G$XncId$gǎ{Sk'DEd2ǰwt4F:~A7M`g~]er$ƄKyn ˣFZPЀ4Np &!c5%i%1Пb$92mAMѐ@č,6m[C!=]d!6aml^G~PLp7ԺR:B tOޒv`TWLJ1?@kI;PǜȇJT)7SMu=S2ES* ڥiJQ){Z1RyMaXЦ1I5AwR| yI67rskk#E.1 "C$Ǹrϟ#>p6c-E+X:kZc"=sz"4ۙ~ޮm?xdwn>.޷^Jnd4NZm4s)rm|A=i3Gcw(Gw7VF+>ϪMYl`b:1Z/o.DRD"m+Hf6u VMF „) IDAT01& lrѵ.K…hu%'iZSU^S kԑ@]F}g: FX}RQF$@c`)}oYfs wqzO&.bI]TPb2F&2E=^}cf7T͗,g'npE8Ns}k*vRB@ 0P;}dW\ @#ēST"<ߣ6!C"=Ԗ6تe%Rxƒ!v-<#R R<,ry\A\[GشϐNyt"3y0Y:%M! /fmzgqٰ%H{9隉o#v|Ǒ0wWO֧xLTdQp3糿?'BN~`6P2KPZwQQnL&uUSU1qUReSUE9"lgRj;sj_..Ѝ'ڊx4\q#&r7R"|1YÞ]kQ^e:04`gIx\; k% ܿyP l7"E9&__`U)_}xN=7W?qO7K̵c|.F|@VX37@)|ô"a0x B<?p5ցX;b8PB*IYjy#k -f)p@$H_bSg^M),,(p[e璄cKk|K[oRoc>/ gپũCn^+i<#OC=Gw{0(ʫwR.'P'rў٫Gx@i1cIn7mf?]c]b :Wcg,nPj<#/_Z,P/-rLS]x7>s%pZN;Cz:R0?7RQ(4d%]~ܙ@6̭*Hi[̄ x+*]y-Rt"nn\Zo0\3sP?D #g՘)a{@){=(98w8`󻄁Bx3dh 4D)$-Ȭla0f@Iƥ7^ȖxƘ+) ܷ}oh׫鎷3$3 ~>H vͭ^=ƽԵU}%$^a,ZSݝ#6V{xß_^YFTGT=IVYƅ!4{{&;IUuYϕ2n*)QjL">5y9*XK505twdu1r_组0A'W~̃6Z/s}o꜓|7r}M?k8>z[k`V\~?r燥ӧю}loō"O8tťlm\uEѨbCx@XY&/ Cߢ DiN>i Pcr Fӭnl8Tx_cMH]U qS K\M5s,qk̑mRd)uաkjQ;F=f8;gw~uЇ% F;y7 \FS.i> >_ ^N;=34뇭[_~?xJ]ɏwNU6Mv)\}qq3'vsrپ'yTȉ'>@Uʔ"Ow \F?Oc'!lF~ﲈ= sqD2axpFg~0Tg{t~4+ȿHUkPcK)1ְNmTXIxr m"ZkLԌ$}{LC?B9~&w · ׿yh8-A/:꘱5U]W O#?sY5~1}9"CA+XN}nޚRO?0qw׮=̥I/pS\z"/J 3g'.Sg k #SZMG1s£WZP^$%~r?;O \l<}x?+H֚ `2I6N@n?!!xdP5rFaϩW;{喡vhyq-\tpmpn>λ0p׽{r0aΥ[N|*&px^Bb1n-\_7~gou5?8?ړ c9u5xyj9w <gyR%W~(n}hw,8S:s??rx_C*|,6b>}NNSXdq#z5ohL d͜xA(楠P=ʢy__Kk' w [n0V>GanCoW^}_Cl^%gg oكRAXJphou>`ڻ,/yp"vo=%ҡ_}'F PsIg_irwI9϶V~|[09#&׮>ZGo+|1-S'>P>7AUE?i i(#NZxc9o\6ƿ^•FW9~=d1{Da0osfq\Lr [h N1b,(RR6#yZY64BZT#u5f;r&PJn1s rMXڡvfؽQ9@8xs(fPru`)n 2k{p4Ո]k ҿ9NF8|Aކ2S\`;/^R%h[#'cʔ:Q dJ/M?*,Jɰ#H %srce+°*Pd57Gp%ytJl1z'`eS){<`{(i>wm|^f)qg3?9tKd~*6"\Mp!v$ ܾV*D%`c8GijM8rk-A RRnfebAp+KV9~7v ?P24nz |j%@o|(G?h#8_;\**l= y>pl:[!52]dejͼDI0Nv_zsoP2dratW19jOkbe-Ep#ÍAި AJk,Z;mNfFO˽E \&u9yM^[j!ƳER+\(lRR8ug32+ݗw6DNePjPfFw o]njmM}O)oj)[P76RApmAZjGO}az7WoE %U*c(Ϝ`"> ২꘼UQijC'& -2&TU'9ݿAO+b aH'$6Q8ih/0[L(HaX$+[5eŘFZ|%PQNԝnYe@()L=e9opoPauN/ twG qMRuvfI+tЋ%a6PkKZYFf+5E2BR'ŖG(Zr}'1M7kfWz-hбvWg|h2l0|ȵ Et'wSa*q Oqo]NKlQd#PH:%8ݩ`׬uN])|iY2s+=7V)hBeip}@afO7Z:4,!1Npe0z6wHO=];pZs-w vb)ˊ^ R]N YvANl' JI?Я0nmI32fXmp+\o-kEMeEeJQ3f29=/T~pT ?JH:]N(I|7hKnb**ŤܐCAW7H w|k@z a1-#˩=*˻3&WB-[ؼreMQ8c}:3w-.%45nnQN+IWQΞD[K*}ڔeY1)OӜO9\FnsV(aտkm( llv<$,HwV5ہ:దs2l֣sO(d n`Wiy~t[VtUH޶Rrbr63}70̓" <-7^(npe^.:7ZEYO߿3!T&#+ =0UbcmY`">QV>a6uY˼766z)2FVdQE01u3l9lV)J[W虂EIEH?@!QC%nLP՚^zlk@}hMe8 E("6YVKl-4{+[H7@xԧHyξ s3AWݚf=L XO3#%8Z66,/c+o Q J}YOU]5&%v_')DsޟLϊXbFkrp>LvifB"_<}Ne[n-Y&b׽VVɯFI/n#9y/MYe刓O,\XhqV/&36Ak )nFsZ].M$aL=MyX/6dTUl$<~HH *c-KN mɢ?'?A;B' qKYJkWX[Ė#$[ @z!gC`gY*$b3)@/"'.b8ŒϐeJHD52HfOr!w=0BΜeͯEV7(!+XOa&7ǹ Kw8qί~;rRaE^N,ui$_feB"ʾN%hƭ^iXo:Wko.]' "x2~y}<*[HA NMV{xHIryOUUSu:C}ߓlBH"l2T9$ LJxvJ][w2-rX@ D!q{oڀg@YTjY.3d~ cOqV2W#Z73W5QAE<{tE(iL&I$ \/+!g$ }` J8!BT$T KNT4Uq]|ߞEv#rS)1޸.\buLE~G36w6S-7K0D*IF(g> ucLr3]/J)\OixG#%JJ9q> ]l['V0ƐH$lnjk#/ĖXrJs Cr9< ?<ۏ1j00m[ر3L{6pZ ?ԭbG;#GÐB0Oz}}  pYR]s2Tl x髻K6~a849%DN(E.E8/-dGp*>RD@ȟ*vIҸ7I)zˁ 'up]7g]HDu0m6#P*0)}@: <5}|?~S8-M8.ҩ'T 4w,$ab&eZ݄bILid𓖚uJ0qp=d*eF*d 5RJO*ݳ-:YC\gxOn2 R8%H$(عdL{3NddP#"vn:BJbM MV>hLxN$:)IϠbBܮ~x~DT m9Z|uLJ-eAR 厍$Z 8!JNL&'CSG4 z1zjʑ#޻ǷS*Pҡ+* lA88H d,( T5}kgD ]Rخa='0 "NQ(jwI-u >D A*}!B=}R㾘r߽$ 8R)pVs~K^R!0Rх0%n7hyԅ/CB)Ihbjȧz#Xe0l} R)<' Qp )7hlDz!]ZTZ' c ac Z_BJܺN֭kԅ~um?H؜v6[U[ $ɸ kn5XZ ! ޣ+* !ƎbM6T$>APcH$1]B;n=#imbpNԂ%HzO8t'V% 瑌۷ 㬦PgQZLVt԰$Dw}!4ZѼ6 IG9AFn$1Оiu^ɣR0ϳ},XK=PrYz{VuLG6] ΝݳR빴e>B*2rrhۺW*%\k(ˎ45Z7z['%ft<7وLjByW8 K$!aw)88xx$HhB$^E~H gPeBh{ɤO2Xh#h!O"JJȴRz6 zGO*(NHw R/?g]GV+$e+8/#VGLXI!qz^FqY;Rq1 V$QY-p]+6%@ []aQ,,i[V+[-.0ЄEE:?"ZYɷ"WU|9.^"?mu Ƶ}ښq"$*v=hD::`Ax"WsiƮ,/&i=^]7VH'Z3b{.rOyxa**vuz^l}{yj.6 8WIatQٳ#ӁIx>aNdy J*"#V@qΒLcnN c]Rc7$|[nl 3뮞>jcy*~ԙG !Qtf|;@_)?ŵa Co YPr Rx*CŋQKUiX3=7%QD_NTiK@;nnr;)~BNgug QѳnSןŗ\ʃKVZ)YQ 2 r ۿ۶N2=g-'/dK%qtscTr9XwW_(iMGvS|Ek{$R0l瞪YhXqILjB JjfeݺQ}pr &BZ^*zxo4Q|J!lgBNS}3^}UZ R6J"-L5.r@h3oƪ&uÃC 1O[ :Ts9GFHתx|ߧZ(?R9 I2VR 63R0 ) g?c޽T+0P(P*esTU OCaZ)# +RB8':v~aΫ͸3_2YfKs.Q(/ ̊7\=o` -X£bn x+<9_T-ȉ@=A'/R_QYORDJq\ k: y9c7cV-5 /GWG6n>ëP㳋hT8{%ࡔn~8NW*|l0S? ɍ !0^W&@ņ9*w UK>rG>x[ZK0fR2h=i憠uוbPN:x ;-ڏ\BN.,>\O4,^cCNEt>rXpJi8$;6I2f1  ($h v}QcAq@d g-19ETY{{PM`.A?AhP9!`$%]qj|7v}7v}6ՍLw^@}`%HIҩ1`K<ܪ8[^ОJ71׎K*T843b("6q~-e ^/yHDŽXm6߽pN@qh5gH`_CaAΖ\X߇ \}+$C7I`S-}oPӰ:>w_(Y+; ۑί|C݃mpjɫuB0Z1|ȶ<}Y{59GrR9sJ=v2<:|};`߰fYm+/D<.sX)yj哚NWTM͐vw 6ٶ'xۿWXfwΩk}nnWKڼN_XlucVHZ!-) QFq‰UUfGxj3-4H1Z?'GܶC%5ظDS;BfW.y965\y$纍[wD2Q0MK/l86jwP-\ 4U_q^ XIn`E;#^s/+&'MKZ){6JN޻`"ɑ.8+<,_2hûoR ?SZ$ &\\ea <~d{nS:i;JQP)5Y1۔[`A(ũEL5,)AEI0F"ހ`޿wڗ1c& "c 4H%БAGIFQo-PCQv<6`+%TUaMU3l&7^ޅhl۶:$ k8aV0p<`΄JB>^{gq`Bp$lv(2u}ǥx¾Kb)lNi YETFFGL_n{o@0)Dc\>GL͹=&ì-] WƱqwpˎ7JMF3T5$:X׳,;I(!Zd({FIZC$rcUTL~982H#2v?ɢy\̪TՍ0X"ZYO- #'[-v"}f6ir]߆.A rƟFTcN<=5bB$)iA%gTCLHt"|ihS6iwtKz4%CvI+1Mt4vԀ0=|S֍{cږhqcG?Zk=;c4-[}kSWoukܞ,?|eGMZ̝0pkΘL 3%~r511NC;SkYq$|JgFC|"?TXWn!pSs땜;TtogwҼ/|*UjdzW)jjYK$_o2zJH0N\aHCeO( =im>r\QBP *wyi\XDY ǞVXoKXu;>̭eat:=6A(Iɡ#llGk5]xVz^|ΛDZxug#m8jz- +T+yq@3N4heD2 _~sYd˷)"ZKM*F";zifV3Sj~ϹwأU+#unNnƷx~mYb#D7'.p !izw~; 8͎*5;|z曙֩%#po{K$͙K籼δʲ:Gʲ}plGy^qsH$Pơ)A(x"{[L].ZL=$ C2FFٗP()p0B"/@mCIZ38ߗSoد,L.CSO-@S͑^CMQɇ\Fv,W{yLUj։Lu t2Ż8,nOL=VӲ&8?5lU^_ۅwpG{ہܴ0вKM\Z׬/Y%f'l=M3sryW,-J7a@ d$ <ɮAn=+F Ǹ\{il]@cjvFR +]{OJy\WqA FB ʒ[jCa^x*;T6ZH]emUKl?<ȭ;w'sGȏPT/"T-֘m>]n6{LUʃd B;/ql +YpWcMarKB%K"2=RS7!8"B%vD#iD)p\ )*`3e!˙{BQzSKcй,eב1[vX`ѽ@/BS-Ov㱎f s+9Wso5uNi9tNW8>`m3A.r-x/HyW%ㇹg | \muho;c,u >JyL/?v%[C ov?NʑFI lK<$$>gfV Qdd4ߕe3A~`{6Jl4ԉJ|USf/l:?u*~\tZ jw+0xJ0Oz<ÿli( !_K.#cF?u1[xxy3F9n8t[z~qnnoL9nx57-;[7t[cS?'uofvZS "?L_ zܵ+pP4OuQ v$maoHnkIa %ozB/3FZ" >rKk_[Cp1 ;,ty7H21N)nZviq464_݃ fA# `ؤPh^6oue'w|'l^cp"^ݑ)]a^]qIV .J ww2PNMqϟ.-rEOeƹ?{e-\xq'!ٗ. ta(fjMRy{h=8hi7-;0Eœ='  D" [*?:Dw;Ǣi]<9)^WZv6^ eYgGyclIgKIհ@v~6Y=yGsz9kNYDdc a0B0/ɚYY77^wC^ús۰]a)X+n^6eLu33fѾ|(͗٤^?Sf']; 7M}|t,Vv* :-<:d;7-;H_m;↑fnZ~#~3g3KhXJ8T3u"R# oO%7chۖ-«/#J EL#XlPj5bT ÐLcIGUxj> Aؘ)wnZKN]LIHiC {'EiGM@CIњZXTW/hi~);>z!Ƿ'նy*D rؘ Cca}`j`Em= CH1$V8 N^ ]㞭˻y9JD3h˽3iA~2E~G ]|wq$~s?NsVASB# 8J9- xlxm()9S;XpBHeuҢ RAl\m4FCQ=\x>uGI)^e+r΢.?cj`PCqQ5xNlfb/ !UkTjy3no hLSa,.b1(/'!||d8b#xcTzk[y9LE bM񝁰>{KWv"6=2}Ew;'GxK_/gk>vBu ~3@8鄁wMqDX(JP#$\V;+2\fQAHF(9()GH{tH5 %HS% p=+|X"Jb&쵄H Jp ! F ci(9NTu;:b\O *(sYw4ZX aTRPdZ0FGt/M=- ̌2';Sٚg 3֙){yӎn^Wniҋ8Wݸg>%˻YԌ- {fwҲ[j+Y_/jNВ`ϘBB1_kaLnI0"kש%<%IJHJ24q^Ց#m~8U66AAD4j*"F: E~E"&Η4(nV5ں H$FGH()6dP 0E)6'ۚz?cn4a ?hmj"ʛYKKm c"°JVRˣ8*A9PpGm#h'hu_N5đOYee3ޒ`.Lh۪|Zny/޹鼺 7>.5ŵrOj<>6Q;{OM>M![oZ:3Kw48Gܫ_~pJ8Z nM7O(oaױaA5UM8kht$PB"Dƺ5\ YܳUMm#"[ 34Ꞑ@#:D 0ҁu*4Z 2GrC<ǣIϸe3&6=0Cja7}i78G 6;HTk~r-T5OP Ɏf(~FFs&X9R(teMp6uE@c6:k YCm^Wn{g^i sW0ۿ9fU?pɲn}AGKMqg}Y_445ysLǴ`V,9X!3$ாa$^dc,릲LoL;@K'BZs~fW DD'.YHa}/3)N7 7S"dBIFkww#[ "é=+ٴ4\|0lXKVlr#lK1?Dy #$m1aBi"!m\#P?e]#sJ"֤@$ߩ;"? zgz%X^fx a~ |g5{zxM0r@nVURҿSMX6C.EE%'jaC("s@M0)}o\RK?P3q<(×74-8R]}è;09kQa3H(!&6$_8׉ ؀I$m0 JH,mjs<]; ]vzj['œT?j% H9liH$WWa /w}h、>N? tlt!8pTV45Θ2q%EAGS؄LZҁXҦ-݆fۼuU |%CO\tr @5[['NOQNӶ&Աmdҡ3gÁzZu X4hPD!}qx#q;Uqlgg h}I4-l'I,I( 9咽l\aBBqƹ8w#ơY IDATM4u-:0n"um;鿩5&{{ +0rd+GAv^8]p,ۤrkg\'9_$}MKFc% ׅ=5$d/UO )\]UF>և0p>a02=Uvdv K+Si dh /(_{hr,Z1tf~TNC#Ũ`FMcR<2KH،)儱sHFڴ?B]GeL)*8[nvlZq4VW" 2Ns ƨ{2̺_x=YSLsك㥋(f[^Yf6[5#?9`S0U6W#Q/M*[dB=# Eg*1!/_LGZ30 t,[H,^jPz{k;m|f:vWW13{>XTd Jr9cM܊z3i Ũn`MSeJIg"FUk lj5J(pBQ7X*KђKWM`I4{';;hݺN)0|GtbmmgMM*jj'$4|"gM\ȼq 2cwV4AM#g8RvEh@c۩I;N<⻫'$8Y/?=ϓ.u 5mw8}M\]UƂ\]t ᘔ5XZ6)`loYFA\ЈY0͑81Ǧ4X3_Ȓ)5z> 'Edͯ a<5[}%lnxuw5\4GcbGt&"B| #e3q1 'KUI+X2Iv%ڷpҫivTM㖳;‰%OIZQ|JDZu:q4/bׄk!E:o+oB|[ ^%ڃDa+XOݼ4<=um+nDZI"5wJG'CGHl$,,JacJ?{Z2:XN#M$$$KMXDzhBGJsS3&CEw!G;ql4a$/QȞ_ RhD#ywMW$Xϓv8hat[ttv pB 4C07HѤ,F_%0Og R)qF<<LXnzS_@[8 Ջfo.੶_T/8%HqwaoDHe}Sr+3ܓj0a%fűl)ml Bg2gX攌aDV 8qפuZG A3c ɥ&F%H i!Uy ē1E(WqAώtd4|hB6}=t[$(sљGt7?rؿqRx'4} #]_'GꔕRjxcXC>_}#YcY}ƛ?R |0O&+GF88({%]g9X{4`qY>jZ"F4pq7/v͂|Ak 00hMɨq%<6AJmH8^M R,,z>[#tHZH%eWM+h2!u: E@xY8ca*cF[ivM&yLr|AJgռBK9]2Umx(e}@v_{a{Xc pҊtT7`MU##\52j;]ܿ?)Y-}$׫[k̸Lּ׆KlRjɃ q@F6n 5,v !|)}d~ƉlbA%%-14çx5ta(ÖL'u 6eGiu^%Wz,#nY`'8gRG&-5I GhxKPX[lA4ޞYk8gt3c{ ,6<N)xZy{.1Mz,;,I0t(mǫgm1'>Iϥpd??;,6&АV!'6 ~:?$hh^ M[!=oW`6NtCɫ?.l wv>ROPЉ/ _9Ϣ1 &~!/i>3$0{+WW*++Gsۨ-Ca ~2DO00h%ʷh2M ħeh`;*[jh`%]W"; (H}vJSH.4t2>!jh{oCvδ=|7ˍ^.E-',b`I1ǍtKO!D27(Ipm#gc'̒ӭ'#āNBi;vj;+[=l-@s˞~8n|\Xx{UڴK[iREeeoiиb?WU$reH*jU`#0@8*YR70w\? p5eb*1\RZaj H6iWs@sbYtZWkOsi$k@c ՟cʿ ݒ!^M+9a%?n{J Åo+' ݃Xg._"7;y1D>_ C!$aEۙAπ#:8IB^.u|]L, K/O}^yN,O>NoǑp'3oVygy|ZcU_XuV״8]9 \YF,߁Wy~U͠RC**E_c!nIp?& -JjݣLH \-]`[8 t4CWqWC8)~eeѕ%N{H9$6-;~7?w.A}6Om㿔+Lr5˓| }aS5lcKtIJcmĒC2e_&`OQ5TO| @XqR+-.1׷9슨mj3ǎ\ѥsKy8igS_8ZD`,tAMm$ e,c7\oBD,%KN |TKJ7O 6.N;j*#$t2;k:B8HFvnhJRHBs]l[9hBKUF1ԥDJ5h EwaƖ8AJri1;l p(s_߽?g0/k8fo(/=4__/ 1}^K1 {^A:6X+H?\;mY!6u~st.SkG cPZ-;@%|KbF~#O<߹AA Hp5Тg)ukƋR\. U㹿k5Zw ,8``0Q0),HARw؟humC"iX!'dK%R8Ha>qKȤ퀣+RUΎԄMcxtS$m[[ !p2IN HYN)'PG(`pbkuWs \I7m7gN4ηgU fFVm~arυ8Xpޜ2M#οHl?sA sȻ0JiqR'3oo6<6ǭPlIo!>(/ې<>[}w)EUCt!KcmޮzW)͉VI݄htں6_*+&t4:qʟo%P4=&)@Chh)IIp@.ƩJ ,#>~?q5@9ֵ}M=NdE,m6c#oH֤[rwu@.y>Yt!l#lX8Rf_wMe]5/Wz!q4W9v"y9L7#Gbx :#QGkcyEE=aK^,A3tǦWϴ() h"Fee UUDB3~$r1u VsBvN6ǏgĈhQUkWމF(!X>iͦH~ۃ ~Uo頵Mb>R=@z}@8Bgpn+}P}\ NXz8!A|->vhA8Eѕ3a(~W}[ -P@|xe7|;6 4' vLg`OC V(uX<j;=Fm&G/:$|0Q @j]# 4 E铦rgr 'PU[Ʒ6ϰ&q'dfƳOm7#`\uٕuQ:Bxu֦f?xPY)l2&N@n0Hiv׷vFe,ZO$a9IQ6mx a3<}oć6_{ ҡoyW8wϵ2̻LtfŘNj%k&gz *@F>d`@ݱt;G:; ޛ3PCϓ~+c9c񬺂⚧S-zrbז׫j{0'i%Vn3Ϝ-U+&ytv!߉n]c޴\< \mgN_ڔ|W+<ҐwtHsxh8 #!icz|8FKvCרS@V\ rHXvQ w /)eGBA07M4C#P61*(/ a%OU  +f$I@' 5q,A V!>~a!_koO|JÇfkz CD:pH@)Ƕ[roa\zAªO"f-Ķތm vS .LRqOqo]@ٯG^ʴvRe&zo('0p1O*M;y7dwWUe*8v+a~ӂ]s>̀Gdkp6sXjD哗GVv`l~~M]#KvN.DfSnY>a&X@ ihad!XI)nd2^`v\LÃ[:8naz!P釟?D"Btw;Xϓ5dcx3_]h)hi D\j9@beQ\'sA۪oň[;g&&Y7b 6ywzZM7oOhc-#>ΥO&pv,ۤs[{u* *Wi93߅#I~2m斺 <ww0K1DFq2ԫu(5%-DDzwLG"1tRTAGH7(@(uJ,m [2њK.iA4CO ['IX N`ea%-U(M&!paì׉&:~#Ǹ4r\e1lcD2J4tc<1n>In3f_f3&Ànqh9W|9bli$c997S?1#4"vE?~IXar,$9I~0>t:MO\ogMvTQQ}C߄ɾ)i*FB.ߛfR:Z |j+P pBvw:]%lD2AkkUUl߾C7ٿj:::B3DMM 7o&;;D"iTIA8bϞ=D5ֶ68@4EJIgga&Xk.B! 9wۊ8@m-8bА"\>܌v$khܼIE|&:Z4]kOKzBfGڪؚ+ +PDrEboD[i߃!I&mѲy/M_olүF(::(GxU׍ʟr+?*Zfјul#n1v*NՏwQFP5?9\WroFÐտO@_gW0'zyC7k:щx/hݡ|MX$uuul޼p8ػw/-[sb]m$I4[oF<G4"v˲hjjbRԵ֎6mD$A146UMb4#8G4@pwH7<+^Y<.ԥ~ =*[7Cpd#Fݏlh:k,Y*#0sZ=LW{#*a-h23&6%]܄KVL)T{Ho\Tc2qdbgťقU &|J 6M׿c6 e}^ݧluN %ɹF9|[_~-Q( IDATಽio [t#  h8RBTvr ,+X}&h"N-7&YßzFRqu '_SGA" ҡV֬YضZP(g!8`6PP(D26 @X!܌444ҿ^5k|*uiP1ؚ%k!G,خu78囋Թ~ɰIī|6щ~ 94H=p_ 70 >C@YKtk%$mzLݹ#|!U:fkBw֒=e.7X\R'O<5lh{cy-H0?8+]z<k7A{JKެIO!)qJаȆa$K/~nw}jsӁiݲX}aoNV$!f<=-"0nT\h~y_i_ Z4EH$ IR%x!dp8eY8;$Dz,Bh|DQlƶmbBLLSumL$4wc+*Q>pJ)Nˡ5N5=k203ѯ6ӄ#5~(S`4UUPZzh pƮhn;>=@`MЌ=(8krut_ʥ+JSn7?VnK}olN}eYsK.@`cJ+բfûSlp|g==cjKoL"n-_W~V A |5hK Fo V& j4Gz:~ӝA52If0$ެ߇0d4W1-[z˪{8dF'Í= +7۶8ޥA:,yDEI↌MGx.'֤5~Q=K<% !sfOgވ4xhͶB> %K l]}Wۣ)<<02、LU{nH>]t#^Ws8_]5-Nǥ?K_p///0B̻Wx<镝L tts׸e Qe,^sߢ;w.#77˲0 _|^z M(,,d̛7P(㡵]ש! 1b,Y„ Q2y%;/Ysb<xRUSŻmsiu4Ul -C9 ̴*. Ey0O t8lݢ$kΝb1. k$`px֪fde 3XoyJflmN&{.׿1^@2v'ǾH V^Ҕz~B,y7MH~F{j2*:׽Mv:馉!ff[TJ?Gq\3)$tZs4XEou +&t~6^^ƺ[AR$҅W/jCZ>&k?'>AȆ s7sjW/Wۭ1jMP&JbCO4$WXFaՒc :8O#{lqN\["9:J *8]QkRTXĄ 9s&>,q$`1cpQGK"0 mۖzo47? d8irIfی,8Q0ʃ.١X͒;s򙱡up:Է6od?BZ,~4M大(]Wyꨴk H&YR:eNsܗ &|&= FڼR߇5̱<0I!~ԜJmrWh /01;p >y׽wXz8GiOL,?dw !͌I*:Ÿz")$9ޭʂߺ㯛\6*5 n$(}4-9{/d'}Jy$o3Mm'q$k^4MzA^a >*} @44MsWaömL: t]xRp|mtM4Lp4cb:* )8/6rۗ>33ixP ^"~$30 <@T\I[oOvn|m_O0f,s4g'i25BSH6m?@-,[ee"kjTVK TwmׯXk[[*mi٥ttV|S`Z<\׭PX`Hqs 4%mşeur9Sgʶ Kgη֓oI#~53%;-AG\> feӽ,ުmqM]=H|q_Dl =LMFmm[Mt:z>"N'{8MУ< X&瑧07<1`y7{_Mٟoһ+Y#|M˵IZMO}y:JruyUrw>H_I^Ȯ+e/=c{T8MU6sWܲ_n.2q&`LZ\W]$e`MKβmE?vexv;Ufj[*h@*z藹D u2r[R1k7KFZ o\ c;ezyXZ0g ~ט һ :;%+JK3W5abX~߼ n\imb9 VzP{@r۶b \~̞OR渁e:?`Cl~𶡕=*&>BuY3MX{K[F,urk@U=?Luq+N,z83c4}hU!sÎ,t,(/HrH9%y @s&)zo>ΥMIyEkZ^)qZ{ELSԊ]:$.bk8 o%؊ۆC3Lvtfx?cABPy6'\JK//#̬_ǁxFh6j\cc6dx,N_~Bk32g$))#TM! (G?7~HڇriUI6o_ _ 3g0u9@,@"{G͓㎗|Up2@C0(S9 ] o^ڴԩljÂK{Q-68$(kVïn**}>0lݢ `RvPƼy9էR#&Nk/|-m>OK"YqZZ)%L9AJaR"t{L|gIcؒ~* *7O : nWZzcq($m'|P{{k=w;8c$V$Q&IW0Q!{_ ,0hI4aI"lZH>ަ}E2Op;m~ֶ)\U8P[5396|B1` .œ;f`sG-PiB%ٳ{7;vpܢ;''Mhmm,AuS!MMM۷h4aى`0TMWHtcc#i466{| @{}TWUS__G<o98nhR~Y163^DWd 8?PC"v542 Ǝ=&]0ie.(Pfx\ M0gJּ!ΆP?!C l1+@-IƍU>LxhZ}_[߂Ys0q wVz1ȗԒyIO@շT}[}ּ[UiKwiz>M?$^l?AZ%XyN{ւapZloPh~z.Oty9 h͌𲉎4ϵ1#vKE&ŘmS=ߢAJ|Ȱ%TQ{wnxca8ǯd 2cw-+DHM7 b:YYY׳o^byanJ,0 l4LvInn.H$ظq# * o^, زe xLOJihl cYu+a6hjnb= aDZA"o}se@h} ɬv+qt@t]'.)v,?֚ WT6fҁ}$l"YP inW$P{^/XnhB7fϑtض(Oۉ dҕ٩|:]Joc` Y\ ;ﱪ N<>iع~X" 6B#E0ztfҁ<&YzlO-)Seq Sv^CxzN\z ύSqKL }%YOv0'ɤW/Ŗ(K"uPo!.;o7tcNxvISuܽߕCC|q-L&I!Yժ7K_ӂhYEk9VpWSX$I2Ěe˙͝/0 j=8T'f < (ogM;~MA%3slTg\cb|yLL??=ʸ8g=LrYwuO@6|&mɥt#e$EMttwo0)0{8Rb$O(A#%2)m=kD .KSBX|OQVuKdL"6nr j +ѐD 'ؠ!vJGNkZ-{@C7˕{ps^O M<'8P txޤs^/Z^/L"iLK @Pw|~xe$pYWp@WBg~7s;]O7V5縼٣Ώj~TSc9kW ?RY\3h!7N/pK@ /M+c9|}H;܋Xr/z:OV꧙ehN?w+qt_:51)&XSl}jN?ZA/Aib@Y?洔$b:f8rxp)XW h7DtP%2.a*p#@:~F=HR[.?0?Kgʒs cG$Dh](z%)iY$`X-quMgzn8@sfI%N=~J}TQzkjp0` i f2]=)&灡C# 3ZTBhJ(ՏȂϜiJK/5G>q{=t.W`U~٭aLAц1c&L}MKH}Jܱ]p yF%7']Dǽg?A2 ݧLq_H%{[Ri5]];$#ਹ 5_foiIq;̦sZ&''J0%[QOtk`NZL…+i31_G9xM|gW1F9T/ڧ]upKׇT`0ڤ)eZqmۚ-U8#qBfvpӹqH(\g@- LM#42idL)pN)б$8 ,|BˈyMHa#`_QNw>@V:=s2R3=$É$UNȓ NyC> kȮ['Ty#fz$fh.FǨ3X~FNV)5gqF.Kr޿v2O94g aaېhh$hdlr@͑hJjG8`kI?$ڈn%@: h*d4 i+m ≸CTX !tq97H~` V@xzX2LvXI90h-( pI4"(*\tIlp)MK%ֻ4@]*9viw\wc(MUBn2^$ywww 7mZ3 cuUqUU)lN;MkʤvݲJ*{'U-Swzf[[r0 $ /8!NGqB1L1۸,Kd+Y}L8Sv{;^ڝ=ss|9#غ ~ɗ%eۅ 7v  Su3̷s#p#SD湬ȄO#\b(Hmu IDAT.C=ak\̞ 6xMG~E1Z1h |@Ep(`c[ӿU\#9yHmpfC1/|7˕pR7a@qKTssp!'G\ǐRcbh.n+@:B !l )x7UH]G{]5B/tt4\]"u n>Cps?7sR:XI9~gmu9eI=i+bV&vdhzdʰ4uر@Զ%}ߟx4t}r Le4'k66>(&صK7(Y87I )ݒ mη}I6n,p%K z} 8|~IoJχ+P쳰ud5 &ɧtB6^ *'Y: =ߋr n77r%3M,=G"~D;1pr .}Jily}v\AyZIY]hX _oN ~ה0P %Ow?bp6@ ԕ#puuXRSk͕!GG: LYhc-c G;pzkT 8F;n8yU XvcJΒ#RnX%,;K=B Bًp{Moz@pϫS-p඗S̃p>PBxHѧUThlWWׯW9qJt` Uছo}+P<|Xr%RܣI.,-xb۶KƐ$3 _? Ӝzm!Wx|*wM|!֡4R⨧êUИ*?~,FWkS3C.v6Iruġ6RMhM3I^ `I:;uQFIXo^kqR9doshCђM!ai'Hc֤@uFYe7#L$H"EVaFj5Q1D5MhCJQ2!2!r';[H1/|KEO݄xt])qVSkp::`Pp*x[߂/|AyӛX;%˗13vfaF3}Ql'=O^9~% #jϮhΖD tĂ,>ڷFoTеB{o۹Y˂ו5ΡC luP֟WwJܩ g~8xHըzw,\C?#_7IKZM--M`)4d*ɋ^rK/0:2J>DZ-Ǧ]֊sErLaV>544MP( ]t&,\D2"Q`Qvj]G@ot+Ǖ)@J 4)R*@+.%N@ßBV&ܔ#@.bUipH 555JC*VGo jd W?ZXvdӉF=ɗnuHgN0%?,֧@AD3h&?]WZc+ݾCk-j!Y\!Ikxnv畅$o`fe]`Y;5^M5j,+,FtSJO[JW Nbg#@ l IZ44Rr9BCJ={pZwk躎1Fc$ RF D"D0{6Jd >~Mӈ&P%]8ò2 m_z>7NL9V]/:_&}pSLyBxqH R95Mvv9*QQPᶦiG]6n\plG8lF- K_{vU랿"^o;dVL H4JԬl싘l8jyبMuL$FDDLMO?pMIpWrYOQ4@tu\oĥ>Ȓ*r2Kp0/xRƮ\#m/<;߁|GbLNCCSp2mSR.}L9<{: _d P˖M(z݃OI^uZc?uEP`\y*0U7?yClqjMyƷ?Z@5j\h|*T8M=dG@7tt]Gtt8ū9eQlJ@@jV w}$ͼoWr}daT )Lpd z-70>sWv*l~Bw -ݣa8^hp^*8g`˓{>'?O|D l|F$Z;c~1a`¼b?2('2Yɵ/Kij1r=2Q43fkM_ʡ9mfl@ ;՟:NDoSmr2aj*PJIk^ld׳\\tx탗|a*EKot*iުJ'TO~eݩˊ傿+sJ>9}6wyි}ʠz@Qɖm.+1a79tS`STrL^BL8_] $s19y@6VBT,dZ3C품)s&/kPm`jɽ_"h>n*&VmO>*9|>>c!] tצkVj7S[7'ݍ'Xǒ0PM`sX1 _uwGzY1vz؜,BY&8zLU:XuzӟsI61hWuj!{?lx Yӄ=7j@<wUhಋ5φeP^p%hBuñ.Rn1XT>?,ʼnǠMdod7nP.5L~a,͒ 5K];S-vUߥ6Zo-[% |PngOK߿h+ߒz_幽[[\>Y?N2ngKRܤ*/m4y=:Nh*' ös2vrk:iփ0pĕM6=W?cb׿k񃟗eN{?ò?:wdA[ SG|97\/pyU>`#.v;$ /S}N8`::3ugk#J^s45:%<*ܭma-]pjرaӃ*S_x n]a<Η|[6Z KT~NHOM{dyjp Aހ3 k:kv~TZ.+x^qh1m 10~mk/XP=7-+/uaWjccGV>/;꒥g?Oc*C_orI&a*vy._y&}?rT4tx]ݢ[\ ׾erYۤubۧ9{?!oW_mzߌr䮿ɓNK֬H%P6<0[%;5&_/ku/Wuq=ZzWyJNKcqz!|~Efzs6UN7>NHx~ 3\s1{8풼U>lz]˛ߠyV[%J@ZyR_s5Y#xlK: _M:8od4-yu/+9KУj>=Ǒ|3Q._-tHIU^JWܠO>_݇\-(>2*YLɖl.~bR;o7hhPݑcnI1|χ;_al><(PkH zɿ&9k:ExKE8FţSWJ;}yK( Tyrb*=\\Oz.ǔV&'Tbk }FS!wos#ry:G]L֟u;WpכRRg\A#s t/Cp]9<\~W@%ǔYHBj˗ tWS=˖Mi|_8*=|6qo|A_?B}BM)QqK 1-7H Whkuk4 6.7]t 7;l,TX?W%/G$W?lqYsFSPX±7KnV1otF5',{e7_[w6 +;Oڽ>ל_S#$ ބo{)ҔK/?E7 .8_g$='yU2?wZtyßۜRt` XPpK&kMު >)c%Q8pP{ ֬RTO,y=#J[Rklܯ8 B!h| \q`W=ֳ9%nQ Kn1'r?kvN, ,=g g9CނP/޷S?e꘦2^ry`v:NK\QfiSeM;]ݒq8tĥ[uqg+: ?[=疇o4a`OI Bd]W~yVysWc?; gvI야:-k˗G7.t%P\v(zLCQ7vxL}&W%o%R~+/Jׅ6ǎMUHcɌh԰=rMjmQg:].DAp \6JO~ks+ 4 $t\q՗k|OlS_Ïas﷬ҳ,+kW ;]:m'-fa``g]^{N"*ew_ ?U ]W?_pΕ-&'z%vĢv.>_s,1o(M:Y~v>n[30PwR#$ 300iKIDvBRuD(Aѝ:{ݪLϜ9b` 7ohg3>V Im0<,Kybf:udqm:C]c'$ޤ9˖hSzN$s;Y^M{f3j*xMJ=67 >Ie\LCʧS{6^Jb pCÛ%?* TfO dzNǗQwхfm\'x ^)8{5]u>/:>*ynG)^aŀ[9~pp<ظ@9ˆƲ`6T-ђIfexua25gMI {eM{?rx2'O_ْE/}"b$SFoc_ KZxg-*cV9캅т)z ^7!aYA≯^%XJxV"W<_'S)ݪNK Ӑ,[ $WPs(5nTNgtT>ۇUتEjCFu^'Q]wܰANАZ/ ZLѻ##% _}\K^j pjz&VӜMpZp\;$ TOH\L>,S;XCc/xPZHOB)gc ĩ+.XFɨ=|%sGs;TxlJK#D6_5֭h]8܋|/_7k.SDѠi9Mz vH00[7uv*nGOD#g'={ݘ7G0o<|}҅tԄOa~[ _j'^_@-7A^5=Y ]}|Ɖ#'󞟽`o!' ix!N9Xy7c 'ʯ\^)C?ߵ's\v8ﮬȀ >0UkUa8yz N]a;8OlNĂη>Nzp})=}:+ LgK]:!v^U.Mj NZlXw=NSJ*imWݮ122ǽ{yNH*)Xez0*KfçV8 lEd{_p7?8@—>cc2jez^uD'` _Ve,^ހSC5Suf uByX?Sp NNj n`^o^  >)Ht0PMp#FR̳ 3K*E00QtNo@XlH8T!apkHt@=? 3Uة:wCS'քp&[0qghU&xC@H#!a $ pB@H.3)zw ؐ08!a $ fO=!a`>ؐ0wH 4$ Ԟ00}`۝ bj'$ xnHf0Ǹ ' LL#bXOً 0@Hgkhtj)0B€G!إO pB€yZ1<BCt36u0pzO !a6{ة Ex5DiYG37!aNK_zSB@rN 5vfjTNFxXBC-B@uӴM-6bX/AP!a0XC€7` ՜0Poք: !a($ `# ͳ>oKb08n)]qB0 8uf&L`C@PONB@H̘-Q 3Bt=)$ {݃\6 A;zg"a`V 8'€DH ԉf/atW֐0Po6\[@В;$ x[_o>65z v0KZ` U)wlHpf$S0P-a`;_]H 8ry SYNUan`S bVl]50PN~ga`f<*t& ؐ0_z!$ ΄i 00[+D0P+&D`г b.!a& x+SM0 A 8>M;$ B?|H8 ʅ@vEJYkv6cJ=C@Hi($ TfCh7'/ו߉[JyM ,p=LtUgɇj,!a3[ SC@-CN`.I Q'Px5bO,T4kcF !?SzoYscAL%ƔVa'ϓnPY=<{>ؓy4O|B/!*:H+8R :k2t!()y3+ ]c#rp7Mut@44'˒%NerQ h4J4#HH$D1"niH@"0_J\Jŵ&`eiQ V6m[HAk(xxh"I,$K`&i tu+M`zlw-Wƣ%Hᜆ@w0dWo['_dj8od=6'S_ʂoɦIahpё24L+ñ9@5L$HҐJLcs F$x0ǥ4ųGus, ;#%;2Bzx t|m+c۸&alj%S445ji%D,@D1" ǟ%B@5SM9ࡣ00Lu W`1}18MʓexhA"űmtM#HzQDV::h蠥M)OnjʧOoF Z6V.KntdGGgӴD#k'3&y+h^te3c$ sNL8apKL# T>N7ՂSH=aRQmI2<4`C3Z,N24 (LI.={q 3<4D6}\dk ")XFh/H ccG3:at$0l1N+xX$`&istn*:̣#]d3"!Є L܍t'<Y箍Uu|Ic岴%mt4&i@J,#5hd2ɢ9,V'?l) /!44`~V !a' 80 $ b.tq,l&G>Ih.xx4122(I*v]]ϖF 05=p@aIb[v!d1א,NiI5 fh&4ң#ؖ& 0nZ洶_cGBCu DuH""2$ $ $7/1DAM*D#زOvDuFGGB7M,[NG[Dz{ؽ'BGG;˗/gI&qVt]ÌDŢD"Q4]/EF+NHQ4gסUf4ǣHץpk=i<{-^Exȑ#,_+V᲋DL3xf,F$LjMpr8-XN&$ x ' TRQ75*(000!873c2[c*Ϣ王8ضEn:LXpx 44|>ϼyp]v=ʖ-[eʕ\s  ĎuLH44pl{r6A j XnV,cI >o!׬4ٴi#\~eDQΙC[{]d2[֟KOc LOD膉/ ^V300f27a@-&g vw'J8C,Y8qe˲e駟fΝhʕ+9@}='hnn!ِ.Ц4oFɡ&@+/$34DtL$k=zL1 Q6oLSS=z&"A{[g< 5^E H22Gzh|.b l>wudC3Ӓ`ھgBKӹBî-jI +A}*DXӒ@N$8e{ɍ F1 KšU5~q}e:'Haܹ3MkK3W\z L>ɤGy T6AXL $q%H$R\qGaH)ٶmq4M㡇߿,Yʾꢩ!ɵ_ϓ$=4M sl 0ԺBo\UgbKӹB_yTa@KJQ{f- DHiHNڏ.xıcHaƍCr-###|cc``sN49s.#Ͳr2vt0edxL:m[k yn1Pt ka DQ{ؿg7msw0|}Yx˾}xضmM0 ΝKww7===bQZʫ  elN%LM#k!H&رn{9t]UVq4MN~! cY-kkk^-Ŷmr lN_j)wi[MKiߊSȇ"Ϸ?K޿™p8n)rmߏiXJl+mYBs{Ի_%9V Oٙi)]{YpjRZp]ɨd,:Q^)h8\B tM0ߋTCD"}Y>1::'> :::uV\ 8`6d< dP)T9Քzɦ1th4@o?z#ɉ'dΝ ֆeY,ZK.UVa&m300mDQ[ZQgq1StR젬ӹl=YyLm+ + Կ@Eu}|VLs`#MWd@B$l&C<+9H}׼pfX,իyrDQ1M]yѐL~: 0ae4i*ԕϗ6i{n;t:MKK { ,"rq=J:=U\*!DɫrJ2$ >-B@Hxb ]rRJt]'˓ϫ ,ɤjp <ȡCD"] .t:֭[q app'N022Rz$xp^1g3pL]CʟcY6`dp}}}dYt];v/RPd|^#-Jbh2 u# :S1h<L0B€+0VBƕB ]*М5M#ʞ={HR&{Jֲ,z{{exxT\GB3 4Tuş5CHhϳ|r9vl\.Ǐ~#?%+y6#4i"[hfFpĩn # :ܒp&00J +0 mc6 |Kggg6Z{{;W\q_|1ٺu8ѣtuu144D,+aGDc1"]\ٜ|AR(M r$R)-ZDCC202aFHr@cr5#:Xdh/%o;H34'Jtb\CDc $XP 0KC!a[!$ y /go*-Ό `,)tr4Mĉ sellbxXxqn݊뺥s4=۶m#ȹˉbdr9F$I )b8al|BRJB!-C7#tww 3vU{QMyO?M6%hn}iin0 2Yd&'D14vu" t&$ ;$ zD%R=+%p"`՚5 9\x4s,u]o^:i6 K<gҥp4550ɐu\RMTR2y{\J XzX,e$Bgg'o>v'سgM.ѣISkWlKL&I &b )HMM1oS+:lN € 0P>:.W#eˈ?p#Gp5WsEI$I$Jzzzضb8pD}^d /~KY`aH'46АRt<,y6]KXwhll%b t68~8eq 5wbZ;ph 8m3hXCD*E,,4MIUK9$ 0#T\0Iv*@6# o:J MUWo_Ϯ]0 S)=ˇ v-@hlƦ&\ I%!dmi4Ɠ465hHbFT?^' 4RJW"Kܑģ1^p?d׮]hƵ]̼9sonF8C6kH4$l%WjVtgF]&'RM|MDC=f; JuH" HKi|U+_!DIB`K@%?Ǐufvj⺫bݚl~r+οǺD R̛7 ? l.%HQ )BӌN/l钱CT04|õ<ؾ}l%K);=q}$uYq٬^-*#4#Cc1$1bdÌh:YHo\tKjdpjRگgwq0=}hj:B01-h 讃@ai!G#(;uؐ0CV| T8ga@J!qq%jnO&p \qOwq6ÌD4456w>F4z+k&Rd7~4%H-֦*`xbM0M0@4Hq%XK1H:&hy 6 dX-%.(1(>C hDs*.ePo 0PoXC@HG(z7%Az̸8Rbin,[qKqmuu-A@ B*`463DfZZZhhh42(VH$ m Eڒ-pmЉDqUVKD$NT8jvBhΞꂍo?u<$J4{Ա^SS?VaD\N\M2O>{{k2%|ID'4v"Ex {6℟{@L~E'X )_&'W N{pdJdE7`x eZ}]bѢ,1RX9s~ r&7`eq~x,8~PJ{.31mY\ŧmϩ99 ~~ax~~^FlN'hRȠPu@,j{.Ի+aC)@cmtCq]| !?P.>P`*m@).sˋxg^B!ݲ/E]!B̴m Q5LLB!c|X8s(}RLȬ:B%Iu]idYB{sC!#6yC[kQ%kdY6;e4!#"XVEQEQ@+xsnVNB!obf1&D1JjbTIENDB`yoshimi-2.3.5.1/Util/updateGuideVersion.py000066400000000000000000000012051506652756400204540ustar00rootroot00000000000000#!/usr/bin/env python def scanfile(f): ID = f.readline() f.close() ID = ID.strip() pos = ID.find(' ') if (pos > 0): ID = ID[:pos] doc = open("../doc/yoshimi_user_guide/index.html","r+") line = "start" tofind = '

The Yoshimi User Guide V' while line != "": linepos=doc.tell() line = doc.readline() if line: if line.find(tofind) > 0: doc.seek(linepos) doc.write(' '+tofind+ID+'

\n') line = "" f = open("../src/version.txt","r+") if f: scanfile(f) yoshimi-2.3.5.1/Yoshimi_Helpers000066400000000000000000000012251506652756400164070ustar00rootroot00000000000000Some people who have helped Yoshimi in various ways since Alan Calvert started the project. Chris Ahlstrom Kristian Amlie Jonathan Brickman Jeanette Claassen Rob Couto Andrew Deryabin Jörn Eichler Csaba Erdei James Fraser Will Godfrey Stefaan Himpe Alexander Hirsch Art Horan Alex Hunt Tillman Jex Jeremy Jongepier Iain King-Speir Jari Kleimola Tobias Kortkamp Tito Latini Rainer Hans Liffers Jesper Lloyd Lars Luthman Holger Marzen Matthew McGuire Thomas Mitterfellner Lieven Moors John Murphy Harry Nakos Iurie Nistor Stephen Parry Sebastian Ramacher David Runge Adam Samson Hugh Spiller Lorenzo Sutton Marco Uibo Hermann Voßeler Nikita Zlobin newbluemoon yoshimi-2.3.5.1/banks/000077500000000000000000000000001506652756400144575ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Arpeggios/000077500000000000000000000000001506652756400163775ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Arpeggios/.bankdir000066400000000000000000000000061506652756400200060ustar00rootroot000000000000000.0.0 yoshimi-2.3.5.1/banks/Arpeggios/0001-Arpeggio1.xiz000066400000000000000000000050371506652756400213340ustar00rootroot00000000000000\Ks8WhuȤUIYQ-y%yjDB6'%)Ǟ_M 6H=bO<: __7 #/?խ_.5;^>j:\|\w[^qҘ³Oņv]/ '4rhmɣ~_xhGgQ\5,=Q>c>lgUŎ'`1N[ek>ݰOUǏd1VM;EZSH|70 }Y_h6Ϧkg\O1,/*߼x1DdBQ6U^"Djei ` *ArD4S̈́xNpμE5d {As$[FH\ss'$4 eˤR=k$'mW4_BAB[b|.h]g*bt[C3.&0HweG׵?Tmvڅ{>^r)JI&XvhC]s3pUC)}adu 9|(d adp{w3^_S/^jK} 3tg 1q!r?t/)W[yRZ܄тr.d#%owHƘƞ"nQ^lwWz&=d)"a&-`4}t3ao[}V ?xIV^$@ԓVU(;jT tKBf4FZI=& y({r_BzRw@ q#!]y>מf7o,IMrNk[k "j$m]Z}ޞ'MRmd`4l&QUiJ֫h{t]{θi(u%wVekZ MJ'cwҍJ6vK=݊Up׳GײeWG4)PZf=u-!X"?78WQ=M1 Y)FsU#T:DY! uCә15j?VǨvu},FۖՃ;QWGmld P1HU(^Rezi%l:R  ږKu{lrlT AȍM!u -Sʔ0X"&s<əK#Ky8zQqoM["R}qP* Tq_^ȕk:[V!&9b,FQߵWEY"0ڼ̔!8sLBZ`24b-">1O };ߋy)pO"#h~7RFMd\;iy?Gl8'TKMRZZ'ޛ4!_Π>ybW-y.qeރJ%P W+r}(=Qv}l8ֽc8c 7DÆ'o zC%WIFpC?=#!S/vi?Юfcv}#7A>pdq x&lpRO|ĴLIt"5N'Ba\j> i|"k1jB r"}|)}nf+O׾i~Z9~Zy'7VIʚWyqU!~Z/XxR;q@ށ]&=}9t-Myoshimi-2.3.5.1/banks/Arpeggios/0002-Arpeggio2.xiz000066400000000000000000000045451506652756400213410ustar00rootroot00000000000000[[s~ϯ`y*E-ul:9/S46HbuqےFHN%~#zZ=}/= B>4_,vjr1j_WwfOضz F~+?]/?4KE4v -ژ[}p׸׹ȉ{ <F+ѣf#'*X,se4Al2_܎W wYQ}h'/ڑ8d6HM1<}baOjߍus*֧$w\ej.KGƅ4k%/ND!98^ eԃ6׷)5xXQ7= 5 |aT{6O1\ PI[h4@YP儈`@GLr^# ?rQrO~ƈsT\"JX(Qҵx򱒐f2g+g^ZbQ9bhJREb@/mT 1,p{(<{'%hkw$elgFGDQ s9gW܏(Z?+ME V9!4BU>9Qh'gL9`NEǂCD swbEO2I*QUҷabYawKZ.p?Qi6Qr0vurB:{8jUdꛌztT㪁Cn(FѷqHNP(dIk 6J xOV$/uݺd*H[_E)[4DŽW)x*e_#* :C3t4#:b2@U<( 9^xejť$jz!#,W&ۻ_ nDUbq.)6=DxIN`(%YA(YhB.ywv>^%49H'(Q5 N=re:'0̋mr?:GAcO!z5c9S9 mi#V>32z$̵ vnI2DuSaT@89 i|:&Ӿl$g(޲r9/K᠇<}/ɤV W¹I֩0C+ DŐl![ŐƏ[1 fPT<`@ù`8˧i2‚[^@R/`}); `HW)rsݷ^)Mׯ_j=?^Nu9}1H%A۟5{/[˖ux}j}*t[\>E]S g>4wk>c},=Y~}|<֣s<֗.r̘1^1W H#xŐ4ALw6db^.5z(F(s9elLxJ||]i0kGhוz0H.w%]ޯ׮D.F4.^CNL֊nH'fe}&j̇ҹ'| b*/KHE?h\ ^??8{T+8zuZ-AG~[NyyMt Q] \܎1SEʿ;yoshimi-2.3.5.1/banks/Arpeggios/0003-Arpeggio3.xiz000066400000000000000000000046501506652756400213400ustar00rootroot00000000000000r}= 6bNY [;E%l%oHrBrTO!v"/OM㹟jg;Sa~sխǟ'an߶g+e讶OT5O L>:ԭhS ֹJx5]af< +eTf2G1>Yxަ-T__n&Qln"x̂jg_4ЮP5/ِ|8%Ssl!(8F0 m@v'~e.ppX –KfIs4uSRhs|COm;aX 8y j4ͧwA9cbYW?[񱖼͂% W1+B)|1f#Y^{RF1b\,g`, %`sHS@2*[(wFgJL6 %:.ƞ˗Z0NVq$$ʦ*?(]%82:,SF3pYѿsۀi FQumo =L@;\ qxdrg,dPƚ ¥Q*^ċ\kM@H4[Y=`H` -iȟ%rAKZS빎E¦E;gLoA0=Oeh!1L\D8,DFdZzl PҼq vVCrX۵d?_7 nĤ#g{DT;xxB FN1[MA+I +qO9|wj'C $F_=aOZ13f[ Se]O#T6ccd"(J[*+Z'B睲9O&S*۠ECl78j)Mik{(JJ, }j}\]Iˀ=+92KR;0 g9W  *b i(FmWjC\T#c$e.b'lV=)H=3넇^\gm;akP#.ڌ[obe5_tC%2osI+ye&/ny+蓮Wmpo'sf޿YEn֏n5{KP1ͮ7{F6M2fnݶ f8qyeۗ dxk ;/J:}JOI_,\/`Yyt.sR׎˜5ҏKUICQO?f`R KY"@DBx '9e:^}9>\=T53xWN JJyoshimi-2.3.5.1/banks/Arpeggios/0004-Arpeggio4.xiz000066400000000000000000000054121506652756400213370ustar00rootroot00000000000000][s۶~ϯѻ+r&IGز-wNIf#:$] pJr,WSjq v] ~^.O4N(Դ~j74"?>5f'ϟ?|K8O|)dI~OM)!n~u>OIƕk^4?|`D4CSFNTX4[g5ah6¿V$vhɒ~jΒ0}t ad/4i6Z:#]9qK֗ؽ݌.dzm64<\$~1D-H ] $KŽU6K^hz]) |'mSx|ުvvsw98X74QA~-el݋l+B)}YQV 7{)1-#_#(ID5\W; ՉLCӐ/tz]iJ:\R҄s B})N,_keIhi$ <6MUqpoNg ͔ʼn)]^_LfwgF~E҆ U$4/Q@LB?Zu&s>d}ݐ!h@."/H_\D&8e0Au*FF<^C4%\0di 휉zrbΌKh$^Faن¡q^[[ O_\]cJ*  @fyr)C+a4 l3 7Ey{wc$Bj:AHd@<$3q0B{& 5 3rA +dlhr7--Njo"&8`8G'9F+,O}nw6 }&^s: 05M++LG͒jGrݑ,W ]k4ޟDb>]%]i/ SpB jL挣q;n<=j|CRCAE$N[D[ud3}s}.jI ̓Njdi d5OXG Ifq}nKF} ö8=}|cEG[mPت5Pe |r1:!s,yF*'TA!+̺r ]|s$A,k78逖F! =goKΔ77o( =S)L$6s^"cKT[57۫hz HDm~l 8u$%U '*9* @HvŴnql4V׭Aum$Sn.S3:'=^L JIQؤ$1"ùfL6x˷. *PYT#JVqvG +p}mwgg֨cG^3oʣ 4iG|ڀB: phSV26J9TC`#8dQBdž7cC;=غH\CCr-K 娱#r୰7olau߫U2\Tч55z5͠EZQ0%ds^0ͥвQg`m ]ȆTtJ,Mfa[:MWJ(k:Yg :)d1X]mu&`*gX=DyLCযW ܆Cti[̇mRTiltQ(nsz_Wh:n+~&n˫dܪNյeBqnTvPGE-][p+KLՑc%܎E^Z}LBW\v{: w o0DAsY i ねNjތ-Bv*LB8MLT4DETZ\5Ѳq 6VCAAlʽB Vtw@n#&]NMؼax&Hc9nٵ-ŲCF3JKcunc{Nݕms`4J p c]bVFXzmCQ nk/w4 ܁Z1Git.I'c wҌJ6vs=׊Umݏ&ïe/Mg: #F \P_s e3}u|Bi'&|2B%T"gS,@(A?.BG!h$UՂ3`2b\$Ë."= ԪJ5OT$!^Hrd;S,BQpaJpFUN9u6@KvtK1-IM, u[ &N6NC^3NVeRP@1y#ysw>_E#@uTɪVb+/(Vy,DySq|2"xwu$ hiXiؒhgN0I'KM lZ[(__#qPm@B>5`0SXZ>1 Dߠ>7&i1!VN1a01!poYzL4Әi5Ϝ6-0cv_)n+j~ Cfsʒߩg6pVM-•bM&we5Tn7~r[Agv[քmݷM(m=SyW{^Pmk8q5Ly9^= r^vvFCj] 9J?(=ΎTU!c,Y-mON*~83p2hf*+.tLjW*nбj^5|'3#jy] a**E@ϫ PU%l?vfxҭK}[U{xŘ\ОjgdNyoshimi-2.3.5.1/banks/Arpeggios/0006-Arpeggio6.xiz000066400000000000000000000053401506652756400213430ustar00rootroot00000000000000r8=_ջG&uW%RdF; 9H-I9|6I)I<|C5G}m[4]6~9mg}j߮OF_?tjϓ7q'V;ّ?Sl/9mCt^&x+rض?|{wd@-4 <F)ңv+ġ،6ڰ|y}9Y͗ ߞ-,|{RVMDvonԀp{~#ff]M'&-rG|`el _͍,7r0 ; Bd͆=hGpUIOwl y|q-V8LLIww?I-wQS ɲ5Zb|Tp_ f~nS4bW˖"zdU tC+ew‚3u=}ʏo_k0E X/0pj{O0r`laHj4Dߓ`{m Rha84ﳋ &T-\AP5Oeh#1LL\h x&5"2lXRr&][ףp>~!E"X !U~#wQ8_J(9_p %}rQe`Ǧqjf{$v'6XN3GLiT]gߋd4 SۍoI:A nuJQ">&`ѡ[R5#S "EK_ΞshtH1T'AH$:w.UA3f+}uDSҨ' =P(A ϯjc~ꏍ9vt7'0Ց~:=3&Xccd"h[ HҎF/i-d̵Sƣ5hAVl[Wcė"0ԝX"/$+ s| ل6-\:0"~=C"~e;@d( *M hhʖl)Vb]ܖ@eFr%l{`8:H cgМ7`2{fflu̬©vM \2g7d1UxPDn|c~_Χ1M Y) ! Ѭ"0t= #mjͮ,AS PN2JPߤ= ^;(*t˛B24͎U m}EܛGa!{ ;b9݈x"@\~eL*76 caV/CW,[w@HD0L}DƣTA2UL((8Rn -g]X쵂K#zJ"/$blrF:Ս lm ,3ʉC \J)RC+D0`y1ɢM/4Nf'Aӈ<Ƞy'XD#a[H="Gz< u 2=cf_䜑5%{`'Fe Y;=8zm5QeR7߼q1MV3ӷ,S!^s BOio>߬ˍLwoDToSҐgMlo#t7[o+LCᷙuJӉMP'l60VM۠%АmMoolPnc!?^m4{sۺ1͑cۅt"6PT6^چ^m8Yh%J_6eÇ9c7B7k&BK:Vz(jz{s]hIgobd1|~m m،{mTutOWiˡz Du.n?_PއFԴ -"*)y1м@YEw}v=nVk%}Ckve ;RĹV)#AϥWJ)@\I>&FLԵ zRȫXu-Zc=ԙuC=cC m/_>X&mCr Uyoshimi-2.3.5.1/banks/Arpeggios/0007-Arpeggio7.xiz000066400000000000000000000074241506652756400213520ustar00rootroot00000000000000]]s۶}ϯ{*iQmyi,J )Dꊔw)$@ kSX8X,?}۬O]CuwOOuo翽u؁ʏxqo7]'~<ވJ>Oϝh\.cw+gnF˅&ki (>9uPu…r&x[Z-l~~y}1Y.ٷa> 59;G v{xE*} Tͅr~Lb^ߤ:now}P 7+~cۏMdoQoZ U#P[ 6zU&P@">҈guPU릍ˤ#gզoן.E7:k['wwepߗ&iH()~zE3[P-^GYRB/M0"+-waAV>z]. gʼn&#TŻ8qQѺBf e7]" P|R`o <_|PFX .;&WgOgqahc彷N`ob (V`ne }>( `dxҏmhH+ Po}KN6 2A0:IeWD nNȾۅӏWSuvW=N ?q<dJ$2 P*6U[z֞͋k?`^Ta8b*RLuZL 37J+ە\Xs[TR|2?X j7"@6K:z T'GaEZ1q-݅1l ګ}>Z;냞W8xQ8+/^!H1Mqu9/'>K|5ʇޢuYQEOQPEyLQ?O@E˜EEBEE$)(mNBD~$c&f$A56i -} kZ&FA؝[6mM ee#c! F`FC6vzeaC wlTFƓBj#3+#`)E |"˷w6 ?AAŒ !̨LA$]EAP{1apF`08FLA)Xն:Y$RlS@fAhMMm ,XJQlSfuHX5IX5lj&a 6ZX5jN05IXc$jԜװ|@ $aIXfX>6 kX>m_5lZ.i풰̭jhj&a N51@&aGZ5,`>imGmjԜ> kX>FIX5l%̶@ mְ@ $ HX$6 a K k>$5,9P6im0$amH 0mZ %,"D$EX#_렔&a $Tm6)]`ɥJJIX# 1 kG(F)oHyFk7 ccPOG # ئ5F0Rހa# vm_c=)~ J0RހamN0Rހ1HyD&5HyF0AS5#a5A $7`# XGHyFr_# )oHyF0Rހ G`- S_/gi5\ >n e^L(nG[*H>U^OW42vq۶x$ Zyr.]c(ZReKjI~%+jvK{!K:s*ӷ_Uˬ6FC1FT Idw:L(/hȤV։*IJ9}bĜUpxn^*eBBT!Setv4C/kL/ NӃ ,QyBT{Y,+pѽ#GQL}2} )ͳ+_J$8eB p_! J d( &sm+ |oR6wF6$\9Jv: ΧBY~lv @uP0NZkCpPJ]fjg% /ERg1E %Nt_xHʹeU:D=,vT ǃjLH,.dud4&4ixBN9|kh-cExK)?yj *).,gUEY/Qv+CO_θ~uDaLevz~>=]$-a*-mJwW;yi~>-FdP"vb 9)ӚV]+][R+r]?lXVb/?YWɿWWb0-v`s{>Jxم`az#dBB^PBkVh)~G-J]'µ? 6GB"ppuo翽uy/"jAyoshimi-2.3.5.1/banks/Arpeggios/0008-Arpeggio8.xiz000066400000000000000000000046361506652756400213560ustar00rootroot00000000000000\[s~ϯ*q-ulur^T4`m@buq#43|IDtfݶ@ OMvA}'p=y:6.g/.O\(w#f)x>{n~H߳S91sbqKm× vIN4OЧQܸ [XzlD c#t&,v2oFl ړ^]^FO~|o'uad'5-L;Pvecv4݌"{5_<;lx"~Z^LwQ&;ÉUEO0tS+@( | 'C9L|\x dXn%W7t< tVk,3gNcG)BOӞc`9]VFNT \ 1>FADk0> ՅؓCS:Мth%%$CZpnoOщv-XAp"vHύM#U06۸K{e y,'e^OwF~=} a{:Tf1ɍ mDpF Du:ԵC$6j [ϧX` b;ٮEHosW >Xa~_(kPf*ZOm9 `|°]2:mjr U }SHW*q!1a+rl qK6RiE$;UN(PzQg#fs:yu ~TrEɞ*" +!$x䫹Pye$e? !8S0u@;/fBS ;EP}6oTߋyIͬ^8Q@M%'V!c]VT6=(UQc:6J~ˇT( GL|G_X>5A1DݫYbց3Jxqb3z'FGo/ Wlq1Vc#iy -!6Z2֔B7E:29{hخ<&kボuQu^͡իUU)Vx{[˞;g7..S?St-;\RXu-'}]v뉮eDײzQHTOYO'.p>c?Zo|3yC^'ჟҗ>҃b&衸ё)i2mD=i{!_=L t#| B}\4X|̗F|-iߛ[Z<5|Czjra˯C+3BuKW.uHva8Z8|C5Чs %Nw9&JuLww*sצnnϿU%zt|y¢[&'kJSh|`֚B!kE7zJac5ǙE;uHWUXy*Ty|0$[?D@yoshimi-2.3.5.1/banks/Arpeggios/0009-Arpeggio9.xiz000066400000000000000000000052641506652756400213560ustar00rootroot00000000000000r6}vXS t}[$MmM=Ʋ%H6&I'My,>:Uzܬk4]T7~<רg}.gO?|b6\|x3-ǿ9$"-SlCOuqqESڤ6#vMv~xnܳhOaT5,=Rll؆X lLdzb2$ydC?[:jO4z~@ y]_u=\y27[}UZxk[>bA&k.E[ mir $=ԇDɏD]ɔv ̼j+PW2d:VCV&$/PPCz#?G26pWH%xE4^@&ܫTx4\ĥGsIIxP9] KcHM'N= k|P)ǥ즘/;PKIc(Tv *8Ÿ!@9aB&a)ϳ@g| UُIQgN@3^T~eza~M߽x ",q\ItU)4c.)cp/-XbP ?198Tyoshimi-2.3.5.1/banks/Arpeggios/0010-Arpeggio10.xiz000066400000000000000000000047541506652756400214210ustar00rootroot00000000000000\[s~_= 6"@j@}Q [w&?m,[[6˩&cZ?-Om_/jg;Kaqsխ ŷQgo+~>Jѿqy /x2_FW7 &uk߳ZsV.׼-oeHE{&֙Qy%$G"<[X_$f^$c}6]4T'BƋ]ű#\CҢelw> 'v;{NNlؒav0&'Y<6M2ܷt oo5.s|x0uGo 6lrS=m|"Kppʵ B/.F2ֳa,KA?ֆa1w-0G.tktZ"<}% wX$^Nؔ^fFGϘO>0'12"LLaHG!X`yMWmj϶Fvƭ2Ya -6#kusn F4<\Mnm^ӪY<=¿&hc1N1[Mɳ}F$KLn d{V'WOh]#``4 6d, G#VGro4:OA h--|զspÃpsߥlYJzW?[^!V>cx ѩU O $lÛ|ҪY<,ƧVmyk=!Z->A>41>*JBU PYrf| 39sF!mТ![{~+ -孱FlJDnmH$]K(QH*`"aZ̒eu8vqE8a'6S@ɤ'8ӢLRXI1av@pnM F*BO<[cp>{H;ͧd,Y8lz뚯kz]w^Ҽv {J{6}N]C_E6] e]_du}]_E6YK鲮{5\;6=y!wH]x^dt!=܌z(4BJ@9oY3n\O>~kBE_&eU*v#r$nӶKTg Դk[.8M;ρk&u(?J*ƫ*dO}Q%禁l-8SkrY;^}AkZ.}+r~M৵#5roe/39 Lyoshimi-2.3.5.1/banks/Arpeggios/0011-Arpeggio11.xiz000066400000000000000000000047711506652756400214220ustar00rootroot00000000000000\[s۶~ϯPʤ3I:,O5ǖ|lsr^0 l$R%)ί R/˧8b~ =n֍F^jZ6w>5o'o?|l>^|4\f<߉Kc ϊ? v'g~jM'6?.O~ȡ+[7?| {oMBEqcLװD :V;ϯ/G|Ґ,`}j΢'?'jO,j6ZW#kAҗet3!Wd1ɦkG\O1,/*߼x1DdBQ6U"Djei ` * A 9_ofB~<'Q_8g¢n׷ق@s$n~[vw=.ek~.{DF!?m\t]b?dr\Mʱ`%dNDъ*%sA:SA/Lˆ&&|\ ^Eh#b`['S.:*1%q Uu6Rwd* (:tq{VjlS#FcK} = pуq!rt=d(W[?yRZ}[>gTP.uElw w ȩd_-vE-cVN}J4L+E. v[$&?& 6UȘP%8#P^$@ԓ(@O@ªL}D*撐$H˶Ƶ3Za+w#3=VxGP lavQNjKmE{(2*ⓄV={8Sk1#udIr>=@.@i\]3aLOMy !(A7۵[RI^r1h]cQ:CtfT{.\yVԨw-r;v2- \|: #F Hs]/UsɕBiO&dJS>靺ɪvO=uk{k,Oݡ5{{Bv-k lNϬ?ByAU(^wP H2˼S1"8I`+oeP6̌3 kzr3fcC*XC䑧:t<9`SRBo{T"R*Bq;)86- rd`[4emZX3TJA2aveVa b;欚GA~@Np rd!{ɶwX._ LuCdQUHN]=@')%ɡڕea!Gחt it>&,'fo;̇(y\ťۨS&bKQ-w^' #߄7o:& wo$DTo|۲gMl,*o{b+뼭p^E; y}:ovb'4 w'6TQmu_onPn'C~v۰Cmc%?8ovmn۰k@|"ڞygݶY[~B7f]flx9[^-=rr_НޣF׼Czd}HzLGapB G8Ga8G8Ga8HA8c,8pn l8{v 7H Mz/i>09??,i /:@[]y{cJ*~!NlnS$sٴczRqC} ڹ{Mj,tFF/Ďж l~X^Oֳw!S}hN..G?ޑ$bHM <}dQԫOj?0LL3.֧jJn&t=]ҭ}  *_ܘ1"r`!q(ecn3mL=|TB.d@]=uTksCVlZ/o07 -mb%zJRk~,{oWeQH;ŏ&,hXS&G48' T-q>3uAl=nP̧).*(k^+3u}=*jP[!:âEwH(/Up:RdyE(dE \\ַ}!Dq'@F@*@H}'%V :.'@&>D@HpƏTcKa3b :Ƈķww%t(nP,EߒnZEC8D@ O |&:h]$UBifm2fW ̿/p9d>>DdJ@@N̘ B9$d{F#e8 'Qz/Է~R}C;!{qJ{ouF-ë9 6k&NvhpZ`?:qj[1-euFVQe60Àz25jե^P.Ħ9!dV&lT'&[7rrC삛d$ bZj`Ym`X~ʆebb>;czpE7Pp8*Sfo?)JqH25$QSaV*%!oIfF.`֌ˣ7yK3K;, Z㭛#&ĨMVdwW诎}4X4wbL.lI `Q8\q)1CX+@@ɚ!<#з!/"jf@͠x+[2H󫷒!-JC 8~Њᅒl|^-wSuI/xI} 8Y ߶gywCS7QK-]tX^}JLֵpBZ>Xu-Ǻc]˯뱮XS=c N_fXp'~ň^1$IFwʃ|衜ʧDZ]!SB "E5Z~ D+L.s7~4¸_fúR  +*uՕ3C̠ɰ׵0D 2YU<<~Z}Pɬ\ztSY@})Yf##{̛y10lry}1ZL/g X5|Y6.FF SoN4~%Xg-uX'ؾ].Ƌ<횏qMz6|a`|w+~bۋ:74=?b͢tGW0 A 97uuE~< 3oᥚ뛋l A0Y7[tJ- ʲ&Nf5HBtӆMD4)hǤ\T (ZD]PiFĞ. eFMv3͂K"zK<g7/u)kǁd\4\屁٥aϿ!cY-Bѝ.ΧRSV`y!&Fa  0^dNsB6 L|0A]?ٰQ5)ST-qF:x[߹A'.*Ŏ4[4MiqCxOu{.'R}ۍ|8B˫16eHL{hNch"&E&4X^YC];+J"e;)tCX G+6Q\3g$kAzd Vhَ'se Z|Ӄ?~>c̩}"}AQ"Pnު/g٩syQnt|xҦ$S,g{"/)Uܶ9QUűO6I r8w8ljJ`M|S)pEe# <Ea%gCa 'ih<29c;O@_=r,a T2*$[IXLo6$( {T.s%ȓ6kr"%$[&%dXƻ<ݢL}NӀ/%lWD^=s̏Z艵cE4WpX;@qv}梎jWw@(92>Q%6-#!2j2vRp/R*׋l=Q2'ߩ0 [nP(\ZTFU!9q&@IvŴvjq({e`UXާC/.gSVGIAT,&w歌cyewahe>|g X!1߿B"uɷB]G1dP|$J,Cv1oiY"LH1\ ?(&|%{lq8~D 6cCk IpZ,¸ '5~<܆Ve)vVy5p/ u-/nUZ^ 1żWnCq򽀛e ~f6BGnVwA 46'F:{G5urfruʳ!L!MEa+nuMNOJJMpC.>)YxhxC='%S~4f44$>FFui\zOJfQqyܺ{඼|в˚ӼF}Oo~@IzL~*yk =%^3YSZ}&}3Yw* =Az}t0փC0÷c ~g=ᔷZ& y 6XxfP0LƧ v }S"X#p[~G()n(yG>.Ojv+mcvjr;3{Q_JqxejigҎ3SM.Ѯ[dQ O=:du8=H?uQjsvP(u:J[O4\CiNh;#1蓌>ʼnq7C٧86PORr&f,!WKTB`;xHlp$GfŶ}:yw?~-@qT<ְ#I6jx+MOR3W|ێ5t$ c=!u8+Dzθa'Og'lz^8W1uޝNGKM:XECyKR6 S_R9 NT^H**6\ȑcBLWU(5MFrU6cI9TC9)WQj6D>)RmJh9_2/NPzz/َL0vƔQ9h "~|ݐT٫Uw;\+FYY'5UB{ȴp- ̗=Q#șF@bc\׍cMTp888)(ʲEw*e*e3%Qsxd2}=i=*㬀nQPHz]q7aM2jBZQdS/4"֗Tbo&i]PNBI1NjLW`uݚRnjonK7, v P(ޙ US20ǝ#%zr긣ƑCvBvj{Eڊ dlqN4%?:ɩc3SM6LO NhK1˪Ɯ sZ^?apcDT#X_5L`>w! tQZ7YXJL:픹Zv{Pjвږ1WHnؗWkjHҡ.)3hpN]0&(y>Sls*cϢ~x|g9{r!ͲX;mhj/c}vc}c}c]TX-+%fڣuBNh Ml}N9]95TNJ'*Z? bbAtyv=bo>ҁ;x\7|U>|^o.^+\߱vU SgXAԫx[7=K[ix,jt [T([1+۪f'l~3\NfSkOmͣ;> hC9k ^]=(|;4M 7m] #r;oF|,-d:.GlLle*_݈ۅdza;JO! "lfFǴL & q$6SI67ظU5.t) {bGƯH~ %p.w\&!=T2xʇM;$]q`;ߑc bv*s2Ynjyt5yI9.}u==eZPX~=!  $#/ A__{S x O Ûй-g6/# z' sPgd1D!uM&Cnx!x`[v'*UIe ƥΟqiTBFǞ!/+;,\Es"[y[iɢM\$ꄃ)$ :M]nGcfw0`  Aԕ @x:U)g6sHE0?CBCJ~?wщ3$HGWG~_hHfna|x}89M6v(0(\VϽ`вGjG|?-:Gn+&~ZaA۵OsYGo(6ld qh(mߋ B.z-]ow嗢aQI:Sm!#9Iw.+` ɝ:AsDPh/&{>e>^a9?uʌN"~vfaO ׺GHrW#AM(`"vCyT dMiֵqv6QF ; QJzV8HPL ! }, bU^Pg|ZCbYB+C%s1*t k$۽AےQBm i;IxtqIvrϛD=S{k|MKC6Dd:rTrSPB=7^ԴBYN=DctC#*Q$+r05SM.()R!9RR~؇ΝTE0P1lsf-(1dxwCLj,;Ls4L`ŒQ}ӵ[A.WO{4X=*tZ 3͎`Wk( wqEL$tY([͎ W4/?u8ޔI*A'Ƶ zʻHc%K}`$P6ZT1l}dZ:b2)U©S0(1b|)|\;I25i0S\l@G7&/4צҡ60YAXS#@4eIqxePe0XoyʂՈ7 CT$ʚi&F:#g+5R=0Α&NPN뽨WwA 3 ي{"2>N%iÑ (G#BDIuƛq .r$a&K\oQRiA'UgN29ֳ֠TZe~ MuPjz\ToC6~Znk6`Pܬ:`a=qKDMܐ1힛]v$*r$On6m/۰:MM[Ki>(h ^-oS|Oj+a%{ԕpf]J6u%|VvM] զjSWqjSnjOwKg ܆x!7H ]z/hr(Frɻ衼i};epA%J4#׮aF-,XKrSAaͰ^z8.iMQW7Lqb(td040Yyoshimi-2.3.5.1/banks/Arpeggios/0039-Soft Arpeggio1.xiz000066400000000000000000000047451506652756400222500ustar00rootroot00000000000000\[s8~_!6@UwOфP@-`se$6ek*NGG|:Ͽ>wG~i\6̵z6Z~7m{n}aӐ»죔Ş_fS81F>$ @F$2٨מo1lh l4ow9.&PbCBzwH"!]_(5طjo/ D,׾2V9MCV/=s00KcaxqrԾ1GF{iX`3~H[Y=$##9vNiw4"ukَ~je<71ny{Jf>x:,\Q-#J$佪k@A}]7':|B֪'},O9|!:u(')-8u )/#ڏB /6K4pS.d$Bk]P?( ʩMfdiIsze~qy΄fol:}cxplʝDQOpJ9fEqC[\?xi5HYj$rT$I R\#VՄ T,+"EJK <0-ğxsCU;0 z J1gk'%"R&7ȸї4D 9\[_k^!yE6'_K UsGssy10Wu:>_(wGSnj Hub^h0~s[u^y 1HiaIVCiamBi+B,:+Ya%5yRXW39[\S̱WmiM\v~^UW Ϋ6^ m:oyݼ D7Vmq?BλmN]bhi[>ٗӂhݦ _7w{^mkqmt7:}_dx[ Jw{6}NI_Ⱥ j}Vc]vdXWjUܩkp?BÆ'xG4%7I/]H772>; =P-8Mnp=OuV\u=n|\\2G&qiܦ/Uf$5<֎KN3θS,?rRDKUPMUrn|E^f<ܖyS{-;kzYk)U5ִvǫ\h\kbҏнw`9V~M/o9rLyoshimi-2.3.5.1/banks/Arpeggios/0040-Soft Arpeggio2.xiz000066400000000000000000000047411506652756400222350ustar00rootroot00000000000000\s߿ <M`R ţ"qljlҿGlI>lH:?i?Y7hQxѴ~l74"?.w٠ӧ].?ߎ{ ݏ{擔oO =/vS| B "}#[[7?|`D54CKFATXg5ax6.')kKb>֍lEsxu飻K&|}Iԋ5a%X-uY?#v8ތ"qCM.|Jaa|VV"nMniaƻ AbÒt4GW70 򁁜wts!?EΙ&r~w3.74 u"ZaAdl$UꚟL{ц3Q(җ-G`f);[[P?X1mb,GI"}Pʴ TNF37FOCr9FĒ*٥iۗ["~znIV-NU8׸K@wy'U^OwWF~@ǪnjKBw 7 Џ6a } $!/&!x@0Dב/.sJm<z7^~6Eu>Mw O"'ԭP"翫zA*C Љ(}4d'>_ OH j'=tt{#̪շ\OWaiS%7'Bɫ*mhD@u\Ǎr4S}`PRz&f4&KTD`aZ%T68y#B,R.\'oo(/ةHJI:(Q#á8w=I\ kH0Lj~{A+Dzθa'߿MYsQb6N/5`Q 1&6%l@I+c5PB  IT Z'*#7قE2,؂mVmA8Sp4J`Mr>TM&adɕT2ʄ(5:JɇIsav"+9u DڬYmel&93fAFgW9˖$$f9Wlq9V┲!jdyϴ+k5 +헤TZ(DL4M+luXW'47U>N{ݷzn*e '&DadXH?F!QgTu.BL]pf!=vP+&md@TmT8NY\]_UPU'u1=6 HqsЮ1{*~Y6Jf4}k*պ122̦Kx,EpP6aDW@ӀуyXeǻ00ǭ#W *-Z!&g^)U?{Gސ-jvNSA_;b fFl}J/h@00amcmPƫ/CQ 0 "W* cu8s4}qy}.de gCUTUNVi-bZN{9նBjeqÌ.FJ>5Yap6kً)ڄ̢d>4dTPdzFY}27Yl,UN?4} Me'iHܤf<%n=9q lԖ%n Ҝَ8̣PC|=SV~M9 oibDb,f/[^LZ| ^z"?]^  !=W>$%lPF GqXeDZ>c]TX;xq{4lzG#wtI |ތUIFrɚE裸)Ѫo~b*__V~ #O"tr. #n|\x4*ьS읞nVТW fçWi\*AZ:uRqƌlM.SS*fW|^fg] ?Tox׭wZ)N wS!Os?~rC|𞴘o; U y W GnAyoshimi-2.3.5.1/banks/Arpeggios/0041-Soft Arpeggio3.xiz000066400000000000000000000044741506652756400222420ustar00rootroot00000000000000[[s~_cU3E6,`%6--ȥΜ9yj_]{zyo;S~9O׳嗻Q?OжjM# 2v.>[u'ymxJCfVDh[u.2^Q@^ˈe.߱XFLdzp9M= w5S}x}>yі!Aj ^_j=_K|7ԱΈXň r4_[s]H\v<@0.ͷ:q"dxa.@c§^3Kڣ {yˀM=Tc%s tߎKnn+&u_Gag)I6&  aiτ>Ȗ J~$Šu\k!,5Yk*іx Wf d; Ṣ.84*V47$:ʞrՉϗ["0Z̳IK^=NUNq+!CŗW2 A(&dy]3_C" B "׬b6 ؎Phs<+琒 !yv-msu8C!(\^dZ ÛC"`OkuRhf5 "4P=R+JI9nVE xMQEv "ʆ2 w'#Eu;'G|d uh6OP$QZA8*9=W{7z^-*]՗fQ쉠O%Ry^ rdB&$}]B8ASOMP8FKau~Mg;qP:mlM Fyit['i=A!MPE6J2xr@,;!y *stOh6~P֕HlC$U@HtWp(5M`U{ʔqGKePE0P1,=1 wKLj૧YGl ؕ"FK,Zl%u:^=ii\5{1TfɍRfn Ub5wyE!K:9)IwT\lEX#~U뒡L)8o8D')"hIRVɫRVI>0nқ-ܙd2l}dսNtdꃳ`ДcDQ,'#~)S];L)oZ8$#[d{wk]P6*1Y;AXUS#$['r(%iġBIb)*/u8M'W088 @IkZd8&,yFg93 )sd!3g< YT)`=}0V>*eQuO=IEb-A ScHPa0.qiLNmu1h6Uí7a(X5 mc=d] }pjqlAprSw@n(`6ԢmGUuR6 q pV;p{n2`,4|nj.n|mnl3芛;m>k 7hs/[~˖w_ƫS[,{oK܇^N} {&LsݻB|c?'c=x;pO3pxa@o 1 ?)fFz0GWd)2SK\ Ik &H~„FאЮM_vcU.s%:#3sݺv4 MheIWou uC+oJnȞF=w5ߓBߑXIdKOQL=:yoshimi-2.3.5.1/banks/Arpeggios/0042-Soft Arpeggio4.xiz000066400000000000000000000050411506652756400222330ustar00rootroot00000000000000\[s8~_!6 6!@E%lM:_GlI>\v{%|:>nֵF^[kw˳^>f8z;\w_qҘ»⣬ +?|yڈѓ.b.wEZKO(|;0u 7a}LGvp7FwbH6x NYE/flYHvuk=m?`d#T F*QD+3ة ȼ0~ReV`Ru&PK%DC|ܹ&h", {gK#_W's"Wvѱ.z9 wz},,Toڝn '}fG~^wwTk?3 ) shz3LhȝO7MI y);ߋ y+ɬ"dPh n̢b˺M%H!c]Vm* TEqOb$ё}gb-c`karA3ΰ r<ebI7{#T +  [QQ_-QZWtu!5)Tw34G#lrO;Z^@Jgs-hG,nMZA"ǸjNj2ivvM2)odxuɪ~D+ZWPŰ~F!BhʤTՄ3`2b$+/"GXi  r>(Q>0\׽c鸮o5܂6=y 7H Mټx. ?t<]^3~=R!z?Y28v☝)Ln% *nW81Tb24˯#]v,#/Cnh')5L*51~M䎁 f&HV:Xf?a]Mh3EQbliXw`Wr+i`+Zs?tt?.,#>PEFdG4^a!ݪu-}ݰgä\~۫?1YWNyoshimi-2.3.5.1/banks/Arpeggios/0043-Soft Arpeggio5.xiz000066400000000000000000000047241506652756400222440ustar00rootroot00000000000000\ms6~=%6/pL&E#lA&we$yet9{b}v%>YXynx^1 \_}ͯκ>d0z;]w[\~Ҙ»죴 3?|yڈ{xL#&NL[Ek>ݰOed1fM;xĢzgw_ ~`훺NgCr۟ot -渡dG1LLLUy1bȖ8m+V,za%s1Z!SPX戋9 InpExF|zw3υn0h0\ϳ`ᖭV^HD?w _HʊLsK'J~v\om- Ŝ0%Uds,띦Dh>y.wSļ9 K,Z6XCpjOW[심DwI(V/,Ы `q$+!x3rO ds{=]:CFne?jK} t̆R 6/BBϐHl8^D`#UԲ qKR]kPd~;߹'`X_)S̑=eubG\i\']/&=$ SDVa۪+!, `8mx=b[T <<2,2`5QըA0lh$m4ow\{>PParCBʽTvOE<~7naT|xM_#9ɋNn\aipY `?v^϶έmԉtyrؼEFý4.W0&{Ute@ t]{θ UG -ִtVڴ1;F9bAH9Ѩ@ ޮ_׼eWa h1DKZPeP_hW ɼS>Nbx oJ OGFxk,Sgu펺SmY]'>_Z}ld@!jJ5NXSjW!mС1[ak -խmvPS0B. !ub -Jɽ`\FL58YY,ú$W׋K+{ZA-N<x8QfœbzVs=)DbBٻYf`{!8ϖz5gq<0pl/T6 69Y*};ߋ y+CN-CvO q`B[4enZFfJ)WXOb칑BeCGSQwS1jA<p rt/?v$$ ʵm@ko2fKW,wHtO\2U kdžB!Q*)P^F& HmVZ3i~-ی)KBu+qIGO$]7e‡$Js-eOsSmճZ.[ 7lz-\I5rٶƞJbꁹ5芸%u{ nW#̪8ȭx[S3 ׊嬈[ET3oRmzo_ѵpүms/:%amvox[aYmodǻU d.ET* n=Y :ZohGܘy3ks5!c]n{V 6C׶.>YYg^yAyk;ź˚_ּi8nq-ŗl}dt]ZR>v̮O캔 .h,H),u)-u).u)/u;v]=7ip~C#7tI|~"Sʃp0 Cy ҪځXpI7@ߐ^WOZ` a]裩ola4n3KUbh^2K1Ю-n4ۥghgƆ)|^ЂGx VCbGc?ys@-u?cNuW<߿fH-*fšD+rq?kw{09fw^;pW32Lyoshimi-2.3.5.1/banks/Arpeggios/0065-Hyper Organ1.xiz000066400000000000000000000051761506652756400217330ustar00rootroot00000000000000\[s~_= s-BH u&C֙}Q $cL~X$l\vsjO}ݶ{/f,vOٰu]O?yc۾9/{fӈ»#lGONS9a7j_u9qKfJt5]$]1#ٹKQc4iw7"nBwzav3V,| q6ǒ0u]Sh"搳1 v2kł`g[xfj:_1q/nPh61<4 K\s{ų*BTt}QǁQ⑊fv-Mj/&? 7TQ?2@l5jvlX: }zvlK1!JZzN Y%3Qx6|IipGr?| CY BJW_gۋ\3`i=i$,dFõx`%BtɄl}ˍLy(m$XmAF (uY!vs#W:[dIߋko\$3 TH炍Gtz n8l\8(W3%1ML],3Ta;˓2TZorl8[BKVʭ9B&bM[,NHpo.1#^3K-Vr "L s:=S&r%K3u1ZQ<؁i?v/;YĆ+(M,>'rd'YntЮpL%#vT/+{xaG9zC`*9@.NoyDO!K|P)OޫrAրTg#}uBƩ(:F9#gS Z>zm4bKi84)|"|2 c1hJ0>uQci+.g_!C7DN\hҥ Z4r@:FY"X61(ԝi1k.Qs(nP &tc;3Cjd8zb%~e?@(P"Ba :+ihR}2(LD3| zC?< }s?Y'bhN"vA8O(+uX,DfiPnb6VO䤭q<;$t>*F$C"RlDp?FH`SPkGJ8һ'o2ё*NF*ܙ6B$ ċӢ)#⇖+"_=fWJvdS &T.7dTVHw GYG}P4Filj0-n&lv$]R@R(NwK2BEby*-}[G:"b~EM+8֮ܤSEД^,JY4!=UsC$" 5%-qO1}V@GA Zq_KFU+L#T ]jP'蒇2ިda[Nm\NRLKC++ :<1Ʃ\?GIfz")ˉ^I\cMjy"+`.Ƀ? lk/)NU@:rjՄ$V1!C6N{yyõ\WyNMQ8r+[`:OvdF`xI\Աx{( KZ,:A,i,^nI:3uܦof?;޼dQ :6ȭ̎m~m BjfH5&rd_T;dmaْܲ!P>ĴZn]>{gn|nZ? ءOA/>t3^=ޏ,P)Wѧf)n~P43۴1ҠqOS1~̅F4'kI 3|1c#&;M拻j:_;uzsstsdKҘ9`5RF /N4Ynf]cr?Zƫb-l ]%)H_~s&̏ɎE $J}j0[gB=H|P!.l@]MB=#[m92cj&>}:(4yi1X^`qȘtgYȂ9TfFP룺X5'qPl E AfBj9q>Yqr rYР$/ m7pjH6"c]mAFcK` Â'?"W\F[b+6 |rI"2Ʒ{C A'8,x|;A\&QW X6sH8nː*6,wQA}@ec4S6MSՔm/O#.e#. q$M95^pɃ`Jɂv[Z_DPޝQU<}iHoLxXG'b~ +e񥞃^op noi>3*/spesWZfc[Tε[*T1ׇvS^*Ga' Nu~vB&OTϧ|S=GZ_uELũz?ZB83]eÐ J%'+]h74y+c/ήhDv01qX׺%\1Ηix~fJΕy`S2AH|d˝~Gc|*K|srw,99bݷU94 v5h<璯k~Kf$w.r^w Xǫ؞xS# jȼ80᠆Wre qVvJ2.yoshimi-2.3.5.1/banks/Arpeggios/0068-Glass Arpeggio1.xiz000066400000000000000000000047301506652756400224020ustar00rootroot00000000000000\s8= 𑪙" .{Q [wlI--O[-YSzUydAާKZa;T}ޜu~ף~^q&Qx};[?SQO\?W?6ZCڴ2#RrO/~tYB[~0\,=VttZX l  oFt064 3_U}L,:蓖4Xkx?d "u'x#oG}la1J|`#ˁ'Q2!&]TpΞ:59$`+FCy0hX{đ'۵`^y?PfldP3 Z>R 2;f:Wl;`4R8_ڍU.s{vݖSa7Bd6Nx "YVFjCQL7+74OO`[O8HmߋGJC9>g5RE̱Dv3?9,zҨNۧAHmy^ R@UɕbB(TBʑ pV((Ŕ(l9d|ZVmuA B.>]>'np>' Zxi-nkS"y (iX )6!1~ت.-W<cS,~r=! hh^l&"Mc~ S69y*[ !*ɬ\Q긓pNLbK% tg"]L6һ'o3v,DE*ZƆS6"@r< M;SDvekc*`0jǣ[>g$`э&W[H36kθ)\FSuZnWTT.o/~ExU&N>D!"i^,ZNYopI\ *>v c-NEDcTEG!6/fU \= ;ܓH67& ϖ/T̡6:1AXSn"$'1(%šܕ@(`7#4F[o|7x0{*j)Q& M3Y#3O'QK@|o,eU(ztrkUZE 0zrk\3GNxRMEӑₒ,#{cqˤV;m H::oے|)nHR:UzNVzNx+?MROu-4bޡ7c|#-4KoZ놷^7᝗ ؐZP-NI)')! YAChrKn9֥R:_u9c}vf zC{ u^LsӿA衼 ivQkj׆]ߞݻWtԂnZ&x3wL`u+u\r8.%BCDqS8.OøpŒ1Knq$B͵I8ЕD-Ԇ$B߼:IT3xG~u".jљ s np_niwˤѨ DHӴl *kpc/qXL Qq7r|`ں}ڊ.gu/g)ϕ=E @˛EAmpwwYEJoKyoshimi-2.3.5.1/banks/Arpeggios/0069-Glass Arpeggio2.xiz000066400000000000000000000047261506652756400224110ustar00rootroot00000000000000\[w8~_CC@lx۬/d~lI.`twfyJb.VU}J_M{/zzo;Sa~s֯\O_>{۞ŋ$".(%z.8{Ҭ8ZcZ6"vOM?\;s 6jx4jWdST(1kkeadz7&ckKsG\>hm!adgk ,={H{V~:nӺ̆`:·Y24KLױE01>I + ~u"Ӊ[FARVYB#.Ԓ8  zx@ɷuĶE~)OwK5Ӈx ?0]?sC°6trF"N̮lACEBh+zR wM.hh ~1A&f~.$[`6^4T'bûc3?VO=CҢ<͍#i©:>gK'>_nIhR6#_2{nr^e3  œ}C)wP< oGB~7Y [[_AW8}LY''IczJBNÖz?@G0OjdCLLah;!X5mj̀n( mǣ` b;ؑޮT~m`3eZE @tf:o, ۺhM"6F[O훖qs0?J&ZV5ܙ7KTv8%8Qx4hm!pU[G#lTRsQn? W_hMN70tZ> Bj$ђ'U XTp#YtC(=*}O= @@!S V|f1 _Av rO @uxinFkSy!J4R-ѕ`z)pľI$XJ 0Ɍb} (N_.C* f>+օՁb% ~eFdOAbZh>-+ʼnIZz?DFc;D!v:Mƃ&g"jX=eSBK{N SJf…2n[ ".v,AH v$tMlS*zcI!LTQdl(,1,}`$Th6fO釖#^+foHAw=:8Je"xB$]n2*,#ظd']0-/!%RŹE(J7D\Q 6hخڱL(8oFo2fJW,7HpM\DY kSFS!ܐNBKMG-Vz=K& Źzv@''moT8e .u(Í*l. ,&+I AKePh!4!ʊ wUw`Wk"ImѼ]HhV9~"Zz ThS|. ~uVN$iнy rMg#} JGK'2H`}D D/?K\5z QZϲпrvRc]է~+Dybi}Y=2 D%{hw9:$iH=&ߋcʚN>8‰ԧycN&HzU\&nquh o{ƹTb.wfلz47/njOg|kV$n;Uc^s Ɯ7|՘SvƔ9y՘˩"qZI1H}vJ r_ּݗ5ӼqॹxqhsK=.|rw]w)!ߑ]WAΒdպdպdպdպWqj]_]pe# xC4!ۭ > s٥Û՜DBŁDH2a:tR7+IĤ|3\N4Eu sǦt`m4'R[ҴKjۥԵRԴsmb]z[{mt"\9]qۧn3o~ۇ݇cm|C5ny?C]5s:c~c⒜qwRwSצn%nU-a+KG7^JXt䗖R6r|dֺ}֊u[k3kIUEJeAw0ȸ_H)Kyoshimi-2.3.5.1/banks/Bass/000077500000000000000000000000001506652756400153475ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Bass/.bankdir000066400000000000000000000000061506652756400167560ustar00rootroot000000000000002.3.0 yoshimi-2.3.5.1/banks/Bass/0001-Bass 1.xiz000066400000000000000000000041221506652756400174710ustar00rootroot00000000000000[s8_C ai2e.^4-؜?h_+IZ7IᩍZK]w֫ږy:uiӵl~?>xWnPg,kί>h@[~(ew_\ެ#7$K>6i|P2 #"Pvr!p=Yc+F}ᢺqe; NVXCʄ {ĒzBDs}Ͻ}|7HBBC;bwZ)@"4ݦqj@`O <>Y@6d|lI>fɧ5.. )_|møH%+BnqL>RY|jhC]0Z:`r4`W?Pkk#ΪG(D1Y" fN&QUZ^x}9W)ɾ0c@x˲Pxg8$#'f?;?wUd0z~AdQy<7S4 $б}hw,'D&sĐ%e509J@ ֞{4DGQX3~DNQ"ʼnO9]tQ:fqT- lt-bz/YfoqS;m} ,^x 4PKLz>TӍፂ 6ʚ>* s< ogB5\Q98 ?)±[$q^mTVֳr16=yƨ#j,"jW ;%"R0~?_Ĉ 'q-LK\۲n˸g485*/'ZGcF!OV6Ize (߃!UT ꏠ^~W-Y^ZK??{̺&h=o󦷟7ܛ1mq{p~hZ~w=wEq#C*d] H]XWj+u5֕|*TuX Y+# Z4]]_;`QuBW znDbGGyxAGb0M MZ]4~%Ict[L=lB#ĺ b}̆r0\ ,Zȸd{>G &tmo~Bca85 @[X0Wcߴ0 # J }B.wF|zu1υnpfn4[U&G{7\s=4Ra2g"?F\Fkzr)D8q <δ !{<2ެL1Vl& 'Eq|cTVaubx$ ffp7bVHdv=bSe1H1<ͯN} 8˅}QM(c@*@D/\C~J^Xɂ%˒ 0 <$wl~@@J8+z_8Py{VBj%H|S'1&QF0]NFaQ5!đ0O.8chYw>>41( (XIOdJ.e؊Xh\6PR!ӨSMhg@ k\t9Ըc4|xҚ`FRÃno_pZtS7p{wuGH#4%dTͬ$"$!]oV~5Oc+Z O[ TQ ǪRϫچ<# i3RDJG,TI“Ϟ|СaJ>HTS1KL==p-8W>q7$;GǑ. ߖ|z=9@%Sg-(fM򩚫c2gsm b6[O݆҄QM> Cm:ᬺUjB5I"~33sʌ0\,b& ,**)"I^$oWGxO˲ή!C@=>桧XY qYl%BWOl2O Z;PbFu͗dؼbi !}C-Hh *47p˶&,۬QwMDDv *#ƏBBBt,DCH[V]닟u,Wnٴ$ۄߙ !_0[Hlƚ:1YQ\G7nRiӒ=O$ Ҭq`BEG`qG|z5mĻu#7,}oK_ m6Z(̈́[['ۉw=_N擛ۃǍmeO8V8K0,ؤ6H0Jd "h-T-}NA V`!֙B9P#^Ȼuryh8\Q8^Rj:|Ewan~:Ӵ6G:ۇA*|\x7h*IʞAsP}g}czr6A`.H4]KzP&(;MḞ u&.gP#k\6$o 낀Tba)U @O[ieE`J x2?icZ* ql|THho bDeYj#BePA D0Nug<EELLh΂^pQ#B²P]2* `bk'8 ޡ=aJ$mŖ(~\\]OJ~r# R\&FC4&g'`%:SQ\Z(!Dco)LOJ)cnj[7=N #; |bey:N _d?wng @M>J3$f>,b$W'vJla鼒;X">.VAƴ&N.(rV.S'/2v0CgE'iU$<]nt UBz$w>ʰ >Y0Ԍ~!r3=n?7t݁D|]u]=hAX >9ΕoG|"]-M9^~QyOCe]0lJς8A4Q(O\J ^%*c4/n sɽ`Z_+{qIŚUK)=~^+cxJJK[ޕAGNN}T,&vxy]3({Ey-]sqG찅t6*=k1 ($e8czrREOQsPUC km.)$9$9$9$ABj$9$s8wh!aCZ5XBRZ5%)IX됰撰撰撰撰撰?B$$$NP. kӦ&aKS<'aKl-)%a N HX둰#aGZ5ؚQڜLQX3iA;Ro656565656565656 k}$ HXHX6 am@ڀ kֆ$A! kCֆ$ IXHXi #F$$HXxIX6"amDš& .7QZi }Is$9p3< sN:MCB0-:<`V"PishS fQԱ &L(npsp_DEYuŅ:::({C(kE:۹w z`DѴ{( cICB::v;:vQP3y u01ԵE%-B~-`Iu">T¢dC,9M`kRGPm6:X雴Yh#=6FFaYTJ,BXJAl#hcml֌@Dz p`j5k"&Rok9eqGbrw mTokpgFg&m$YhcX3⼏a͈s,纆zcY8S6i#XFf`B65 mk095 mk0FY2@`2XhcX3ưfkX]zcX3FE,y:m kƘe ?iaװ,DLm,ڤ`o贛 Mƞ g,`ak,f`h[%'Zp1XhcX3Ŗaalk1mcX3kcX3kcX3jcsa mְmְmְmְ fXBBXhNM:6 k $a̶46 k zϱ Is(:6i^'X&͡Xl{`Mk ۤ%a {`9 k]R\^'=ڤ ,l:Xf{_95< . źsb%*{l8ͧÊ) F!%~q?B" EV>4K{.S~:,Chұ{==e^.BV/RPL= 9CA.:H=oPW=^HK%ƿ7 U'ԱTiet4rC kL/g >!'s E]x}M˒$7`_bdi:^QL}Q˸Va6( J)NB\۪i09=x`>Tkg'ҔUٔY az<(-zp8% (/rWWj _7WiNl8, aV}0ovF*.KVX_UW0ɘqd.`@ Q  2j;5&ͤshJ|I**dBN`99􁄘3+C=LM~ݡmOpvvΞ wJ _[Ⱦ3pF@D6BV!tN;$R:Z jm9"[G'caW]frmO&,<ړ)(mKd nKf4׷-a lEۖ%SmO'n{2҉J_>۞oq)+Ca~Yճ&/U7,Bu|:K6Px:Km޲d뫟'~=l.>e{aG?0x\G󸢏qE> rV鸢٥W(exG·k#$~ Ø6V(09?#p2ugh9\f&-]\?{|@^ @5}dwwyoshimi-2.3.5.1/banks/Bass/0004-Bass 4.xiz000066400000000000000000000041521506652756400175020ustar00rootroot00000000000000[ms8_=%LMs tE"K ˖L$7+i/]w֫=b? Nfnif~qk~xo瓳a`y&ޕ0:m'7 &KxLc6&nB}4ijKBF]I II/&ӫ|4_0\5fy$K*,n6ZXzv Fi\q0tp5li>%P9.U ɆE$J,kUcDb\e#0)",B$1Sˌ|.wP\L¦gp<!a?8nke2Y5޻1$ +TfߵV\?Lj(qwCOL4s0T'uEh>jL,+SN<Ų,[2v~@~jd+N:1 y212[!0jR.e؊Xmg\PxfTsTMT}FR"rwi628Ahr HI5O;'9As=P7prйh;G B lx& Q%dT jmCI]oV~761"?2ZV PT&RRϛ쳍y,I1=ú(f$t;2ǷE%\$}qB; &2s YHP@z!v"NB ,VPǎ#`@ݮ#:^Mƣ3~qRnvdÌ|F~ФʁvCt'UeIaҙj}UL EC3O*keY;ɻOy#ZP|Sg^yEWrMاTx?8u83ԭкV ֛V|֛V֛V\כVכW'MT ^OWHSy_=~<^\ !sLH;*4 rp;c w1YmTZn'ǁi/d_Y16yoshimi-2.3.5.1/banks/Bass/0005-Bass 5.xiz000066400000000000000000000041401506652756400175010ustar00rootroot00000000000000[s8_C ai&d\9 ˽h-[9$dpnxj#VoWçղȂ^c;p^^?}|_kgϮ(qs|GLH8'? T58Wf d0\G&uRhe88Ibgz;J=["E ȗ\>u7 W9^!=pŦB'`٣ws{=]#_Bp(#k_@G,@@=_A~r^X)׉9YG!(PxdKv 2ie$`[|HICMdu żIJ* aJk'Kplih3 qKm+smN<~5nN8@=8Uly.>pL]p$-hX։;٧~`3lh(|t4.] wHa8iTRz:?7,q'wcbz{k!O;fD pZwn:מqy8`9~j]5` 4Dd,%us(Ҏt^Q=R~5d DF-iT6I"@%UeWwŽ 9,=/gVE d@|W;,TH' I_V C>x8!gMu(@7@% D˃ 24rFy$rR}aFǀePExg$$#f?;?;ViYtܟᅦ@+6r(:\R #sC跅O,D9&sĐ%c_ rRGw( EJ`ͤޅ"&el  N|ʙ@ԳnZ:w&0}ڮ(E4N-YBUrK8z2.- 'aE) g1ReD)Dm~vCw}Zh0-P l3Es ts@S%&s76u:rMy" bZ(YMLVmﳠl7 "/XMK~!; }6odR#K;/ g:ߺWLQ / @e,le=+A#Yz߳ o1.zN?A^qu:w3""Uc=QE!dp*68lpjU^W5ζPj[4%P}yTo'$^ lښ1wߺ~sD+wDC>BEqz znD4xAǓrO' mx-I{xv=$s@b%0Ȣv5~%XU\ gb4gK2YK`(r!~DՍuD6,$af>hvZ$–KfKk~D~l e@:z8ϙwƓbv}9,rs?op\1Cz]ZidUM`)V㆕N%+$b:pTHq2; hI%Z9`xiA BƋeuxbg>t@['Ppc'_cF %{Tu)rp `A7'2 $Tdxyu1^\> T}oO6OYNK^X97׉W%Y$0!JB{?PyTOʽlK/I+{M|{Eɘ'Ih]Iqf-e.jiyT枸:]d)"waldE&GӫeȘ>fV0T@>O@. B9$dpQ9>s8hBv;3s7G[!ܳ-w ̴ :ZC0b 1Gޡ!Eiwo }{vy:CJ:, Ӹ]k˜lV%=[D9uƉ|I| 52:̣[ɫ!QLD Y\Q,|6z491%o_ukh1Rz2UƷE\ϽIHN!QuO} d}~zd#6"Bi,7}n o^ϲ 7Gf [`:@Z}E (T_@hj.C0cښҝk*Mcv58zwD-kZɓeDb;9*4)Ae.kOmYIY6 Q#T,059h527)r-&Tu.AʈvS} ogM-~P./0A%"5KM˕ 7wK]SO,0KC7 ^RTiIrduQeA0Ei8NƧr;ڥvMQ杂cy mt zQ`W]]`d\Ȧ t Efe#*wME|׃G#oP%}J5 x.RwDD*o2TWZ(޲B|Q*8} ɤk;Wo:i%Jd/&_K5G^bܒy4bъaKN_^V YZ1hP1 bx%UUId^>&v"_kI`_(*;Ϭ~s{?7sӧ6:;Lnw7t|wٯxmK5pԍ|Fٌu#mƺ_7c盱>nNX54ht|)?ʅ+x5'sՓf#+:ʓlų&(:_N׃h264"wajt5S,I34>hatosᖮևlHnp>βkH־xbBI[,~'l IY֪?0ł%`R0?DYąH$O=/3CBq1y j4ͧ\`n.hme/RY5޻[2$ +d_V\Cۈk)qCO\4s0T>'uEh>nM,w+SVgRDKQ<^? SaAi5}VIB%EfUQBX >翢TAA7W5$h1_ &yЕI* ׀A16{ɲ4IH)pBO?\v6dp }ZC,a5tNu6tl38AaqެZ]AhC2!1or<5 ̥  <6 ڦl|bg^1bث85I"~64s%b3I0eWIUnVaٗx@) j h(aʚ0\=I:eS,~ w~YwF4_Qt:MƃD+w ʨ8S,-$d4chW,B&6sĹOm` q@BhȎ΢$L͔Uއ"6cl mN4pծ؛`BۓzG>&$]_fzvY&Y8mWqE&}jE V/pdv>DFYU4lohb]^e6; 9x_T8Sz741џ}E^W }`$^Ra a#O.RU'RG!%]~";,]|í@(PcBl~aU)T$0-$y63M],(ԣć0IA6Ų$9RrڈﳠꙜ:^Oƣs~KqRlVT |F~̤ʑvCd'TeIayj}UL EC#O2*keY; ;n~\[{h޿~{fF=(EOqVO#ݴ^Xmrn1{~Z z_?{78x9C# 2vg[|hw+wC46mM툾k=x~=ˈ5<F;ѣv+#+Zʕtś6: q1N;oZݲ}Ek&o,l:z@FǾuFԟc<]Zȸd:.K&e/nD܈mCcq0 -@[o!$ۀ,ߑ{uvhVpZ~vsWjG\\^^ e'm)8 Ҩ"٭U3+yF0ڬ|msH;J@nFqgj12:lC+_A4i^a,(ɊRf_O粒aQxY8> BF H}]ȾKB.WnFDܒҔ)(.U 덥>D@~4[es@q:%f!;p-# pQEQ^P0X[LNLvibia;.]顿 $RM6bN ` vBs4'Hv5-UhޚiNRᝰi~tݭS,: ]6RKϰ5 szW 3*cFT @̇ l:-ZbnꡟbntJՆ'j{k4`hZ5h@?/i}B'o7@ z#ٗbmξKӘIm,5;5Sg~1/b{_uN8c}{:d,POl=NFu'4Λ پzOMnr;og[ 8shD^RlCvS^q=~N}e9^e`3xOcE8MJ$|L .ЉRK?Cf4.Z?] s(a8rKBvS^SȴRQ=!Xw{ϴ$352h -/lsqݾTB;`4-S8`?un:PP;bж.7P  n4*ɮ5AD+J^DuڍvƽMSK -akZ y{;HYU7bT:L=Ƿ6E;OIVš d$Gו컀<“GO?h0$)KSP1\g<=`A1Y^,O>W]ݱ,颐Օe@z%;w'B^= K,J=:4jo97v0FJSj]T.OJo&Q@/B@+q2&ːɢ,OjUj%=ȫe\ajE%"# ?ewVigi6Ʒ-d5m:R"!}<7-t%*QVNp D7q͒ D v" y]%G һ@^HqǢ4PQ( TL=;h8BwKݗnL%*`Wi[#ܫ^&ԋ-%A^ 2eC n%5y.52:-`5]>6uJ9>(IjA-@!r:e:e_3#jVJvh$U AWeR(oADD{>O]|-hDgɌlee/ &.wBeF^* 0BlFs3!f^QCxaK:.|a2ϵ7ʹ .֊aBe,XZ5p 6E+ѿX^[7ӪŠ/S>ci;&wDjeg* F'aN] uuqγjjS<w7>*协_!;xőܙƒ[Z~``8ؖ(_QE}B~YW3Ç+JXWj+n5֕J>_Mpƺ{: Y NFu ;GEy.!~:cC@_%}[7=gW~RI׾g^oMyoshimi-2.3.5.1/banks/Bass/0065-upright bass.xiz000066400000000000000000000163261506652756400210760ustar00rootroot00000000000000][s8~_wKڙ-Jθ63-ѱvd#Qx~iH4(юe& Cw{|MWr)'b_~>t;>OO?ϋp:܍}6M1ryZ2[_ӟXd=П/$9dY8l?}^fP8Vt 94=;=) U_,}:_/KS"yL> G"{7t -N9]7ҋPVuQ_o uxF7Om|Lŏ,2hXH▟e >Y>tlyL0Zy BqzNoزO@0(A(o'n.g:yP_^.o@й>e}yo]o*Y4 >݄*d ],'-0'g'ߟ.lOC:Y/7.Ͳtcj&>{~J;~6s"l; 8#T}q9>z@{ZlZ SV)^iQސ68M>5*eH)رq1u0 .l>c\u]QLbz />~84Rj[TV*JӲZ|n .A1-Q 9fe1WXPVdUBP>_r2˞c5^"&7wjYLbV´~3t.Rv3ʔ]~K1Cz\.fx7` rĎDޜ oчWi*_H_3 BˬaYB0X`1u\MiJ)RM)tї"xZA|K&Y/0#V̅٦-K5+gm~CڤpR9IC}цimڗ²^Uq^G wmFҤphٲv{ 656=SlACWYˆ6_5K/ 3ǧ,Mvv2ڀHw<9D_M "~S"r(X#z;1?uOfQ%,:´>͹eY\W-}q/2*rRywDo/לet\kTU2[{|]En}g 5F@Zi kQðưP;@nւVX P4.dVhbMgkZik:D t\Fu10:W]P910i 59u>!G0M SE|ܩT{ڎc^czuqV;NZ`_P Arm餱vddAkS>NT4UnX"8:3NT@UgnXr!| NDt҈^mq\K@|P'XRM@ ZaM;cXZ@,/G*Rn25H#XsKu 5,=hW(kd4AE*!jE4EŚ&G@Z% H,i& h@kD^M.::<1C`n"Z|Mhm"nA3c)FsZ݂% `D57UϷ^ZEX@oKAikzK},{@k5X󰽁X@+zִ8} ?h aM`FZV{Ú G~Oq,NǰAVP[Y`5cH#X]HcXÚVtp oF621{Lr kziLi HczMkAoczMm_}joWhR@lYxPs XU*'HEBʢ-YP\.ɋݭ,EE$T2l3`jTec/+RU`-Pٖ7eiĐ~,v&ҝ}z2eŶHS+ՉT70%Rky' GF\|\ ?ԠZ>&_,wPnaBitbW<٧J~:V}Q~r]CѠ/[_/^k58lc i*uX)S%8t9ٓ/Cx"x|,3VP~Ɯ+Q7li%\t!Rs% )EbMhs6V&"kx}quy>loΏǘ-Z :E|U\|@n*srpôgݜ]Di۳nΫc\QvsZtٺS 7a.r\غ)CvoeG'&I=ǭϨxGz,ZbI=+FBG(_0bع:|C1tk%ntXF85A<' ln[!/3]ٟٻ<>PGB1S*> {zF0;/ĵ{]q(etU> "P6ۍOFC!- pߒ|2r.X2z w =apFi܋ѧUW=~lwabi1 .n Iً /Ժhѭ汣&ct H[w[4[/6?6*%WXcՀ&Srb񘒫/S="' H^fZd$;Ϊ kymNc;y|V%~H^98V^\a`K33o3 rg±3p 3A髠pCxtd/03-oo1=41=E{#U2hѳ,;mJ78 hX>^ pT vzo%Z >Cl<AzF%k5b(sLǡ'1\ A̟ҴH>#c _@` FA`rʆ%wTc\c *p0#AMzCI^uܾ7y8?"Sl߳ Le(`a+1CL=Zb"j2plIl > @[lZ i}D;.@fS'p:2ȆgKPm[9Ѵfp|ضbг ǰ`]ty73#m9ÚiZ66K̞e +댍eu]/X0̏:C3t]T(fp<ݬ=gin@ 9,kn$@iX`$"#C&Ǡ׆04?baD’yBftz z`MU 0m@;Ca4a$~FGk.`"3pD-_Fk[0!|9t=XvzŸh5O#,_a4(/ek^ ΂|-X#H6jTۣژ_ Q3TVn/_c>$%p-MWbX(iAz& lA$QQ36|k[wGjS^lR P[=NJYPxA/#6BP-͖bIl|,2 7\,B)^m A3 0h<J̢G[YA8([+Oem@vmD5G aӽ M]YA8%fvzzi`8GճUQ+ZmDkk-,b xYfZho84q3Ŭ Q( f!wp-"rXBhkEHkItl'5P{qK:|D{vT DϟiPh_Xd w`Nl=̄8ГwlDn!Nu|8^OމM Y8W 4WGGO}G,?0((>-xQѵt̲x. *%gfZE0'S]7+^=^;Irn[;#[?.Aȯ/Q~Z đu|I;1qJ&vKWUlkG.AI̒q>; m:OήWu:9:0-RH7cƜД8(=I66F!YK846/oc,B "~U^"^ϗ.RPrKI+РO*(c5) EDEd+/vCE.Mm %M i+Ygލ#Y*T6ufl8B8ѓBC]]>7Cpw\Z|B)ޮ?[d 4v|ZYo3/b@m)ޮ__w1 q~HoFϱ/鼒8To ~4ۭY"V  >0gBm /iS4h@Xh M_`͍BmFptVm]v0&d\2yI{l"ڃ>i.%ѣa)-Xa^`{IieXf;I!c{MM&qh:Jcn'P1?TңfAy|ps")k%J^MI/RB˒tA|Y'"0__F#1 3s~0l5җpʗ%:^2v50W.Nà %6TvjR_)`.BL̓䎼{G=0rZ!xN6{MWt nDtj}yP\\"^>2sxa{d/#G%}-ld,?t?o[kf%}Wig^gW)lgzz3v/^<*0li\mWwYRh5s ]PbKb /fW7jڛqۆcŅcs{__,ho%WZz,:)w||;57rzs5qg>;{mS;fہa7g؎xhbBX+ #*}wd:'^;Wj]]Nx?x`\7?Y[ƽTx槱4>|LοݎU+wo~5d566Mt֍+ ^\v o=8Gpe9\>RYV}ب`A#vch8ƃ@yz*.gYeyL%>aM;À bLxHm\oe gUYX`ա2Eufl#^:FG ^+uu놗*յd2(ʍYr@J+x 5l*J}mIq%4WgC1aMAbјZDQX2va} aԪd۔1OcӢv֩=,=S '-S 0jajw/0$^0aE+MlsߜPX"Q qu)"ja CaZrA=b֦ mА+qq)%:€FAրejq+eF*Ē+2:ac+ mPIȨ>fcYjm-0RF֣PaQe5 ZjXGq {D~Z2RTb]zuIi D.T,!KH#z4JH#X+!5ztDHJ}ޥg uLQNE{FC*:XX9fCYY\bVR<$\Qk5UXa9 zS6-ii,YN*GZ.~fOCS@6qTK;&XV9UޤkfaX{~ 4Ui,/@+cPr[ഠk$R54;@T4=@5,?\V#4!H.KR0nrm_#g 9 XV/5jX̃b灥 _ȁ7,I=l(Xt1X^%X90AtlK$\|cyOrY#\,a@԰3a ČaXʀc9娞#X#Xր`iuP=nKG,t,o@Z"w ӱAֱA ؞ JH#zQ৘AB D EIc\ձb4⯕hk%F JQX82װ/ѱuiKtױu0furu,o@kd,o@~cΩXހn hހXހzt,oPBk%Q7@t]j{"҆by2ޢcȼyyAP>&cyߍPtXޠ4⯕ưF7v΃`yY fK?_' WpW?3:12|\({n{D؊"jCnbq8="/d{fdd"M\qR8rUey~<`,ze\, Dt:98o;0A2ؙHo3rFy͎,V#a 3~F:ZP尚Q%2B ⑹̿HJQ3JC bŠQIg,q61f3 |dL ٲVy#\.' ?KkJCaz/.|ɬTɬafV/&ξH(A:G%,ȹ)KNrTQU Rwo?eHI%b 10biь o. cO?ny+*OZj%dO-#ܣ3oB8?%QI264IF$#_$WL{vQ+G&UTڱ92Yr~K5@#q\消C/ZI^}D9 u`T/Ao󄱹? 3T( CrEJ$rF0dvJs`)p<9zII&z3{˄($!۸D`5y# ȗ?1<ͬr,# C OoK) Gz/ TM~Sꑍ/Uc# BNN:a|DP%eo2 fAsFJ@j"o$`b{84E$Nd-ExQ㎺hK}ϵI,NHM!yFDŽG~Ǿ{{+pyJm mӄ d @@L j,j6sHVBM)rz R,!ECl=HY N~NM-=( Ly1S ]&5lv;Wf%ӴR"i4K ^q~xrz5hZf`5K FDdA[-|d:#zr6%I|[D xt؊nA5j}9P۾A~fyuIJU c|T9,zRLn> BFrH{UHOr!=Q% ]Aꢏ1DCI>8ӫE쀆UxX|NՑ\Ai_7;%^(Xf & U& YN>V?y5 f0V| Bk~]k*9̦{\+v#r^yD6$ YW S"d,U˳\VbidrIr8{*R=r*e^i=+ WIhHJN~xo] h#8nƺJuTvl2o5MZȪFym:bX QVPp̈́83 D|+!qE^]h!Q7bƮg:qwb|A !` b76[h8Lw׈~TOX)b*NmڢKVR#Pa/b꧷ q$u%äژnJ)k\X>q-/s&s+d6HQiݮ2;29h?iı]%q_ml'w}"hʸW)U)8B_ T̰d2}\6ZRvD%*K6:npA cD[ lX^<thvdɌlaj‰B:S%& 7mM䂑DAŴ$8)Y Vm]v2t4o^]q`%.Ɇ5k3ZF^ңɂ*' ͝җt y"ZYQH aphX"4a4 (,tDDjbqdq'N[a 5n "qZUugS\KH/;(&|Xgy b5ۧϟ&*_Ď/+r周Ag2u,(.ËcB=A7J&w$As\7-I+ލJvڃ՘DOЖ45-ܖq-ܗP}iCN@Aj0thjr2^;c{Qe#(QxkMK3~yXI7̜Kd _[AҒ%}ӂ3.Po$Po*~c(T͗hp='p*©rZs{\8==é tS's?W<9-3_ 6;݌ثÆ>lxởy[?{~A}цեn`?>WN]4MPu%6u%6u%ۭ6u%6u%6uw6馆 R@5uB/ O'u?o0z(O#t{CC?;| lf=;w%0) ?S Kyoshimi-2.3.5.1/banks/Brass/0003-Synth Brazz 1.xiz000066400000000000000000000045651506652756400211560ustar00rootroot00000000000000\[s~_Axw@ܩƸBy( _fF=hmKZVߦ>ۮnڬטc<|߯/>|r7Y¢{K =>[uqvf=[~yF}f@mqW޾HF;51݁Ao4+ut:/nG|:P]wWs}g'ؒ,pZS//5Ԏ%X' UrBFd5Y,W2ۖMRBW; v>90؎x=s@[>sK˘ Cؒ:S\DۻmH@sYS&?'7 ǘ>jE`#ͳPeK8Zd4,+w"1 '[)w`{H);XbqB*﶑Ġp]}MYh4vo@LTnGH JIiE [FBD̀ SetZ +x Ӡ x9le;v(tQłI#Ph-թ%TmNQQZe%U)Ӯ?'bё1DahP"}FU#^kHCNHE. We}ݓ|r =cJۯ}p$VO^ OkH>PӼ2F8!Fjχ j\K=:4CsnxuNe3i\ !++ UͮYbk{.HDx+ŀSf3QA.4RDWϲWʲ\JF-h4ZZ*Tmk]lnʱOwF6R(;&x(V3;^/[%TRbFei(?|:o䴒P^;:8.jK1QZOXB9qђ {e^{4DGQX3 KoD`$O!dyⴐ cbzpUS@\ߴl'B6'YDrq;8|؛z|>Nr}nOo" \V@; GNqG/1~]Ds$ϵQiuηSҫEE~[tГɰqhq"v&TEʈ09风 i!e*ԊK)"8ma<Δ~cR!~inkF%&mjC`$ωTiIrdP-yXn7uH&*>Zg1%Ձ]نhk:lH8oFhOlA?JRlAJ/. cf&"ew`FHPA$I őG 9o$ t.0Ƨ;!"KEG PLDhl,Ng z9h :rn30F^yc,Li3NMm5B8Q$;`Y_&qb*Tn*.a+TПaXZ2 ULP+(Se- N;{Ω!&(k (oҀV-(@YDiGe(NƻU d6U_ʆbsrRVa2>I*8flcL|wq<6 )V_x_L8c=|;ְĆ Ao xÈ40$WIxH&דDQH)74t ٖ/˝rKzO/e?X\i]9Iyoshimi-2.3.5.1/banks/Brass/0004-Synth Brazz 2.xiz000066400000000000000000000045441506652756400211550ustar00rootroot00000000000000\[s:~_6WW)BHj9/*πIן--KTVK}Qn,]4~k7̳}4oWg_?}|v3i92C# 2vg[|iMvxFC6vD]5nhi~=ˈFx5 <F1݀Q#ғ&:]ףt>h@|}i..g/z qnbxfjߌt3*h9!7z,Sl]%(R!~>DݍmHv, FAeVgs^3[ a y*wmTy /t\-n'Un Ɯ. usmφ( or UcHbDLL)U|Ƶ)88am9xiF Buubg\|nGCǏ]|g2\"0AѐB9$%HOU`|t,lT8R $cj(G*{G=G!j$o!Zx9/)׉r>rH`⁗ 1dGm7z&Lj-(:aD%O6VƼ{IȕV_,K-[sm_O؟BrN^Taٟ:`L"X0A(324N"SW>!İ69$`FCael0X#&ʷ m E/_*5AfeYhEdO{JOIӫ>zDmX|ju,i3>=k5auSUԗ@>+@eb?ex`6ؽTdeiaK;^K9)KHPȕJ P&z2^N2q[ oe.ǫe83TSr!zYTP,jg((Yޡ8k{]nY˩DXc`XT )X=`Sz面LJh]Lh6`b} OoOǓUJkP ݟ"D4 w%D'-ۤQJݻFy`/*Pk&ՀJ]-FY$ .J8, zj|3>EmWQ=z{,as])gv7qT*IS 1t-ԓ TuxzyeK;5jx :_so(dt.WTZ(pG&WplU~A1s4W)U)$A R1NLo FZ]HTUՌ3`V YDAFҊ/R6-TKHy`Ȝl`ƒhBn+F%&k7m]䂕d߉VӒˡa"Ek>VmPKVUcϦcN# QkTѼq,27_y7F+fBȪmuߔ' eLt7ZT:MY}؝#/f%(RY3k7#"H#<nϊX@5( }EP[9IAZ-ue!9-ɤ7>.jHpl`=eQ]vҶ b>@ ` e !/0|Կ/b >'A![2ȉtBVsL^x 9q \-TJ4"|e9Dh̰^0<`14, ʒu98r }4Bʲj y$kٝq'P&F}uʠap'Pb G_ц;>e씝04'2G%?&@E48MiZF2 $z}we'H+>YJf>rzjlic?{;ݱg vx.W"?|L󅬏/d]5W+}c]v뱮eXײzuܩkXõQp$xCa]x)H`ry9;P4)u-іG~Է,wY/eb}BRN`*?}?7l!Gyoshimi-2.3.5.1/banks/Brass/0005-Synth Brass 3.xiz000066400000000000000000000050501506652756400211320ustar00rootroot00000000000000]Ys8~ϯ#YgJڲג6‚ID"$!uvyHl \-k4?55;Iuv5}\w;Kb2v'+W:JA|lY,zㅽ >Ѩ^k`g(*qC`:7lt3M^ʸ"s=. X*_+~bۋ*4=?͊0ZEOֵ%xg`_5u=R $ @9/<)7ύ9Y 018 t8^dÐG"i2CMKqD:^o|ga]Q^PC{uJŎH/4:bj sd8aF0جŁHM]\]CJn <v2Ch"dq@o`1Qy:ԵC$Oaf`B)vlLBzn)p`َS"(4/W((c.fcuvK퐒,Ea<1}h*#qb&YֹiAł0?K+M녨j!Ԥ[[v ҋ79-'P@ Z"KdDJ'cH7ܓ򌬨.ARfv~3h2K\o|! 0 h<#A *Ԓд?HTUi&i]@ ?(H(?x֑ÏЩ~jRbyVe .tndEt(-Bs׫KB4W(k8B9Ba^@>cm!qr3#RyDybǽYe&ʳڟ$hK'-RA#Z E9b\"ym;RmۂSW KA[ ILtRJnFӫ`2Tb OgGR4#4ߋy(Ϩh 9/n%cb rR.$q؋ e -(`lAy%"J)7X2 vc;R5|lf'@KISڗ&Þ'wOkTEWIUw5/"dyǴsVh'Ƅ zLs5-hu(u .sFVwզM苔r E~ c 72"[xrd;m/. UQ:wP5 V3j'7ʟ=-Z(zΒ,29R^ 0Nj^ `M> t;Cȸk,wڷ|9Ϧtߴ *J#Pp s/Up/>~Kv)&LnbBYY^Yar˪?$OMZʩY~Crt}@V:m^y*Ye=i6aa 3$7MɡK/՗ H+HYjW\\ Ct+Hu+H| y^k ?]g*Hmr/DVn<Cz.Ԛ* HgCV]ҵբj UNܫk- ]`6[,>~sNl%B] _˪ [zDRߪ|)dէvU}Oòpdէ4V|(팊SC{?xdvnGGRc}o~.ݾw-+-=gّY'w$}5G5 U\ƃ0a{a/No< &hC/ > G`.G;]y%DR6|P 5g+rRnK7$%Y'үh_cFcyoshimi-2.3.5.1/banks/Brass/0006-Synth Brass 4.xiz000066400000000000000000000051651506652756400211430ustar00rootroot00000000000000][s۶~ϯPJ3q:-O5ǖ|,sr^80 l$R%)ίB PoM\%6{~ oeFufF7~=?;/ӓQfy$!(hE ]O=i?ȍ&c'$vIm&'Al__Gp FQ@vB0^ˈ$W'gӫ|SP,4 7KjhXZ6ԇ4LrJ/D`ٽ4$d˛W9Ư̾L#唻݉(X^\קFվyޠQk8P(AWh<^}ED|/ɺHCP #pO',y,)T-ĉbl&p+J34%pݒWZ4tP`%D0]']Nؑb6 7ky!tG?FVED^My=HN&cCM L|!h["X`yMfF..)vƥPY ٖxb7B|;߶+5`x?Sk̕ ~iiKQy(VX_``[M ,} n\C̶v U`Al&%&Jip-o;Jz'Gn-GT6J7  7Br.cvv5hry4` !b(zEG;T\L_]Cg~TuѺ:cuLoCـȀ(*7?xQ͏\3?X Ggp;v+mt`M֧ӷ^ >VvcB(2?>6g|d{pK(KIvLe sIBoè"+[ e[![ r+BmNb F-aXTx%lnU,|]7?̶g(fs_m!$Y qeg;|얹^w-:?*bZFd89Ѡb 6L'#)ZMt¹D.'j'^v.Biɺ09R]N~D$IDkQRHDhĴ["Aq"P)^,kqo4fRW,7rO(1 ss-Qp,Te)JG!!#t", B$5;7*g["zQe6:AHvŴNq(dghm5P ob:d^9x%OmX&7捬G\k|gYM'LOpەS_98cWNJ5i*OSi 8UyͷW3NOf7us5JW4nEs9_Į{bk>]$Kx\A2XC鰮55`hBZ+: HF'svz(JoBIۮ#*ci7 Tqxݩۂ7oWcvikXi7(k@MXviYB.^gft 'l*y'7܄%Kp.zy .y͸{YnE%^7ʟh?W7dyoshimi-2.3.5.1/banks/Brass/0007-Synth Brass 5.xiz000066400000000000000000000052721506652756400211440ustar00rootroot00000000000000][s۶~ϯPJ3I:-O5ǖ\KLB6TIʱAIl%6X ݯ;~|[657Wӣ~>r2= =o>G2vG+W}uؓf܈l[xBbԦnB|.fY5o j4Njd CO굌hIO{uxr:< &sZ@VS}xr?ɭ#& <}qԳ/ _ u3:/ȹ^G,횏qEDK'.]&>pμj:3P4 Kih&X6Cp~|̉ϗU["^QwbxNJ:MUvo+?88e`;/Pthw3o?jMg #  W dNۜl`9; ]?yp`ctHl&N?d#7{^F.0K\kN_ԃe"[wt:aE(ܬMM/Fz3w>s;a41L2o`9ѻEs"$jZ~@ae %jv"mחk0=~8K-V yaiKQE(Vx_``[M <'nB}Զv UaAm&%&J,ip-oH:Iz'I#7ѣKR V ĆaHy@V$T%0;q55kM6XdnH:J4{uґ||:$1gw?hй4TiwbPv 6r ^tT#4@Y<}NJ 8}nlBձJ/_08@D)F2v-aq\/Oi撄ބQKV ʺC:!< FZNXc ^֝-aXT%oqU6-|^P$a?BZM0W]HRr<#,SdR .Gd89b 6NǣS)MǐuDtb,NGN\6qԒ&192]N~_G$ID[QXS) dD"8b-hs+ SLWyz /;}ℱ @Yvmh)3"9K$R_S_?!}ZdދE7ϔ"Odyͤ\ ; ˗@$,Y;R9h:c.k$)?,I] -|W)ƫR;N|KY2>('!2AUQP@~R"p./R*Aq[p9t@[G˜l~ 7_(-t)=ۨpxd$Y;sЌbZ'8Tlbw[}:T> uM( *OHDxI} R>~]7 ۯP2=[ +L.vY6$*$y}H'Brim@v귻y*eVl. 'F4$(mJ3(]QHe+H8YW\މ|!vJ$Y/2U<=3A_|e럮L޷$"kOs5{֟c8?"$ϷPh ]UnvUkwUWta{U]UY9 x۪+HL;9kz+WYML[_Է> YicmUl[<*Yi:Mv?huV2*uYg :X<Ώ3vwsSu|{sᴞm{c^7]|t|^tIwed>Gާ^HG>Hw5) >A:!t˱}xÆm=Z/h Z&i=M• إq R"%E]%eoB07k-zvkEnW1DwL$qje>P.;m98M;oж˼ס&]evͲ谡*h p͖.u n@n/RL_|Q ^oޝv?EN27`^ՙ I\,̍eiyoshimi-2.3.5.1/banks/Brass/0009-Wah Brass.xiz000066400000000000000000000047431506652756400204350ustar00rootroot00000000000000\s8_{֑{c˳k\mHr-$9M_P_$Jd.ͨ/meIקhmvvMr܇rv2lM&oFgwlY' );ҿ<eOzO &m]!}tۺM7/X;[$%o'w lMDۭϘ=gAbvus9^ίɽmZ.t<fO`ۻ )*)qGb|kX7ԉ[Dx` V m@vO7vaJ "je=4 }WEO-+G1A$';xݥX& Aag_n]4>w_dnz[D)|yi%1VΦ@H"ӕj8wv[3*T+*!3M eA|i\},*gCK7*x9v}(0$Oqw9i~׳v-z}$* MR\%b2dؙoȻnZ X2W0d;꒝ f.X!>u-o xMN~8V^ )a<tg[hR}JNKGۻ暀 b];7(arG. hM:&<~'D"Wcm[mQ#Tdh!&MW$|D,<ߴ-\Eэp Pgb5\,HyfH9}jyNv#æ){1ۀj`4N!o#d)oQj%5oηl==#4- HNZKwk=}t9P *ZA۬<"l ]QN ۯ=,ײ7qyEmgznP~Eב| XyvcXLЖ]Fۙ(ѱƿgx݃] pI_ɣY >^cOM^Wrztggq9/rz*]uR+r'iC} s%N״!8ysmNڸ;_tf]4^RyE+F\|>*' X3cc)S qL_@1a5׊_+8xU`pG"8N1`Q4 Hq и ̡*JWF*M vi-Hԩ蠒q"ߙ}Bz`75N"(eeo4S$ zD#tzq1> zc֛sb"IR-Ѝq{/&Q>wU#1_'FloA"9P;9 C$! / v9KFUD\}B4 y>6jrӅdPh3<$Fjڰ5չ%8n4Ve;)$^`:(%šb5 TcWO$m|syOXOB(8ВRpVue@EU;)<^ S3&bN`T]"QTWCGT ъ<&W}?XB޻Yɤ0,8ľp(pa!IoG;5^jG:{/_sϐyA͡9u'N1t"C)lhC܄ *p,`8җGW `һ 1Ï!p h>(bh8炃&O_# ޶P>U;QUX/͈7AskA,atGgdZbQ;6M|Y'-Wkޡ@z 4٠*US~R4 !ԇ)?5hQUG^P~٠Mo %:M(y_h1$v?P(_I}uS5F}}_GU+`I+?icWBXd-og퐸6$6K_6eώީ>ja>8>CP|$*I#YA'J6~c]Kw뱮Xzu̩۱W$kxzb o R{C$WILc3c63&K,7b"ZU(OtirgRFZI78j_ULyoshimi-2.3.5.1/banks/Brass/0010-Solo Synth1.xiz000066400000000000000000000042161506652756400207310ustar00rootroot00000000000000[sF_Ayw@`I!X2irsFHT{;In=H{{~~ܺ}l,vyO>t1ܘ?m/?NlQxW~;ҿcO?ɋhm -ښ[}p׺~79ɉ.2QkB]=jrlGCzxAzg ȝ-n"| Cfԍ ۭ^~P{fcwT>&/\,ӭ3l!(2!aDՉmHv, FAehvY"kfI{~D~^Aɀ:zj۩|Ϙwjq{mVnpL1OK[KIߗ Swkzo[Pv ȕ I~rA2nodVJgU9*c㝬Lasy51q+2 rCiBP2u "PpNdZl0Ph:36!v1űv!=Eޠl1܋={MYht@lTy6Rh 71Z.e8C9:, Ө&mdCK&|wC֑Bnw-'Q󏌡f.XRQ%U.olpY{RR7F(-!#%JtP)g$$}N ]AK?"TT=?|Ǩ>y"h,'=;=5<30FT)(tݱ>rcyS6@M>+U\W.=̢|(g)2]%xb&Q@:@p2!됉,rQkS%x}Q}x(i(5޾,;@JRkbxgYd⎗~cŝb,r,0x6@rw(5ϧyG{N.*KtfDE5M)g409 h%fRH2"pݡ*tQzfv1.ޤ,;cDrӬ{6{YJ*Qr9.X*uJ}!NNrsnL hlTyǭ> o>: 7 Zh.U#Slpu$E_vȷ.JY'JY'7HJ +@&e_̑LP}p *#ڏBBBP$L-4?pk @)YoLDޮ_حu<9ݨda]Mm|H:H!:JFͩ46l(&)2^\g 'Ձ[kl9oS'O{'osCdNM`8ix8IH>l5b%9=x-ctvr""X|X:')&5 _YU9ojNqmzg~O״Y;:h]k+y6Y'Ac*^c#*Kd(;2-*CԗUXZz֪x c#(;2{3ziz 9i UseQUqeXkW y[>||ne#W]ݡŷo2R-n2~u#?ܴ6c?nX7f|3M©뱆+n @3WGnN^1$IyR*Ҝ=R"eԫu4tp>c,wY/eo^ĿߐXɸI V\"-r8yoshimi-2.3.5.1/banks/Brass/0011-Brazz 1.xiz000066400000000000000000000046171506652756400200650ustar00rootroot00000000000000[[s~ϯ`ysJEl ^['ej, 6 8v~fF=lr~#zZ=}2=춍{}hZ پzɰw9_?_M{Ǝo=qhDɎ|zIN]D?Ц{z+o>᝻sOR~ ݂Q7Zʓ䍃&:Oz4 7mxt>4ݑ8dHL1<}daԫOj7_MS.֧jBd=YW w\%(V?{Bō]H, FAchtY"6f+^LA9|X@.d@]=uDksCVlZ//'07gn~oV[(qǢmjJ!Y2̸rwREq2;pCs:ӔP֓ˆ0帓: AԕN?Uf6sHE$UΡ` v1qdBf;Wϧ(ӌ `}nAhgҜ`gR`d C:MkN+~ m?@ËCwjM !5 BFriXB+ @Q>Hi_P0!TPrea,S@Ie>u;1e @ԴEB: *"2c1(%Mީ1FJPYK6Dp"^rt섄B_LՀZ:s!f2YVR28^P8Cl9^鍐JD)M# #lw4G]Kna-Sě|:|KV)üOUjK[NVx~f3pTMS H((b ad}\_e55 Oȹ&.ZR1"G#ݛF{(Qḱ ]"QCRCۢ4rƉgDE\0P1ls+z{d\>DmWf(ف-v-X MB}!nȹ0bu6*lGzn k̹x Yh5R;rE`}ыc.[ǏH:Hb]eǧE^,W,+g$Ԭ"H%e_S GL&6q#M!'Y6O]|Rëɺ.H]XWj+u5֕|apzzV&6W H#zŐ^ &ዙWʃt:9[15z("RkЇpz^ =d(QQ3xn|b]Ӽ.wp$慹m8`3/LS4,̮Uuc)U]3hb)jT7*ܒƺZ*t.\XWݺZ*܁G\Wsa]Ir7jV[&p5᳟G{fD$s:Xqp*-qt$f״0eIJ/ȸeٵ%9P>a_F=毩 t/U87[;N ?yoshimi-2.3.5.1/banks/Brass/0012-Brazz 2.xiz000066400000000000000000000054011506652756400200570ustar00rootroot00000000000000]Ks8WhuHUq[Qm,{myjLB6'%)ί$v&sIB6?~7 hû:84=zs{#$e_atܴ';$.i\ yIи$e0WQF4^«I8i%L=i62">%=IG4ax>$rnpȊ7ǧS;z0c'7-L}}QCZ˱댸Nz\:qE9o3M4 KQhX+``M"!M8Y?pЧse,{PԚsM*?hcJ dr`5/:h2o8wο{Mg [' W/dN: 02 ]?yrL:BLQAk'כw@hp'@%%h/'* |I kQEf-3OG2sr lQ7ShZ3F/tӖ,DjaRω蒒XhiM\5ݐ\L-'!.-~clDuOwVk̕V  BTLs ^W툒,8a…ַG#j[#h9=H!7N j%^j䖋Q8$&jvMI#7|ѣKR Z< aIy,V$T%&;f2;l (k*%>HHL D&$S(^,9w cTOX$vTН)k!^ԷOkc$[ \t'OJ gSVneR^@%y%),*-$`7KTԂ XuY;V#I1asxZAk*e|Uʲ~%ԉ7! ɰqhy+ Ό^: ΧiP*CQ344:@1dNRa@X=s:BJ,(. G։J>q:še򔦱V{/fV ,^j"߮I:y+عm|fw8+ZYۨ^$+. Y˜A5$ JgDͲ Z_#we2 sR !ͯ@q~FH/4QEl[ɲWȋZ[#j(yQ:RIURgKlo}5Ow^Ȁ(j_r ?6>Q9GW_ ǯkF3arJCfgud.1Eо\uz??$$a'kږiNn GF45$*}2+_j y!yd_Cry+wWkHy7S!9VV!9y3Ao ?i?]|hkHp/D=G:(*'B|au9^WY*kzSvSu jH'V6UאtgmvoW\C&ۉP|>x\e53m}w> YiSmul<)Yi:M~7h}T2gE}Qsoh}Q}gu-.sSi= l֞׽nn=&rYgB=`q;>*v>]S>b:1ׇu}s:u 7ܼ_"4Il/\.=MN P)фr _QVAHwruX~ 8Ĩֶ ji#Q]F#fZiv~L 4 в&:r̼avia35 #uSjՎhH|i7,jy7UDWakoņUکUTr[ݪ\V*lƜnUFlP~l K!K0_Vqj^g[-3x{i4-;Jdsiyoshimi-2.3.5.1/banks/Brass/0033-Analog Brass 1.xiz000066400000000000000000000042061506652756400212270ustar00rootroot00000000000000[s8_񞂁@I!1@Hr/a؜?h_+l#kI:Omj?ŧ]0Ϸ\粪}W+1\r/yǓ߮Ý^{Ls4-=;]/wYmTňzDD`ɇG7heltcQrGCzKke&D=>ҧ6T+ Q&D+v p4On{xGkWbu% }fatjWԎI|bTzS&[}Oұ+DVi @XH_V"j 'k/\1U80ł%)<2 f=5H2!bc5h:Yln +ۺP}\y+E-"IFWpW\B!l m-1䲊il+S!"3 *8 W& d8o+#(Z ;"PlYL1Q_hIi[sHݰGLq8!]_[D|,ߧ d2eY NaN0?C!f4ZRh{& vZ]BD3SsZs5HONsV>Z1#u`dY yZgVY@~WO}N.ji{I* o^̃tC0 c}nM3h]run#N<g|zJN' Y1t,:p]c}:M5ωsk -E)J`ͤP.$E򔱫X:\ KT4AYDr8l8{׋z]C'C%6x(ľ94Qx\ PiT\.o_د+|/7Rx^ً9$JY$JY$7a_Ra&u?8ɰq1EL&6N#Gn[x> SV\A3o7С%dk_[ddQltX$<9HD:JZ 3&YPKS7}~hbCt3`^K8\F^B_,HKH]ڗ)"+R''k qyA$ <`xc47E̱D~Q=˸8]X X|w}% &GSmiPgug (NjdK$Iɽ6<&kuze ]N .N9}Tü59=nsz)<&Ǥ^~WNg<&e.j|N3?&hlze^6黧֩gEp3Sk_oJOgUx YǺRrKg9֥|R~]u)/L8c};D .ߎaHj#/}03G<"Rn tjt;8{+LY=l)w^;+4?:'E6yoshimi-2.3.5.1/banks/Brass/0034-Analog Brass 2.xiz000066400000000000000000000043051506652756400212310ustar00rootroot00000000000000[[s۶~ϯPJ՚Iґmj9#ɝ/,6g.HqIs\,{w[,6~[̳|>6/߽jytkxg4<;?C#Gw$G;>E[K+Z4v>;g9ԅOf0j]RDڭ([ѐFmt-W7|h@}myt>WWH2$n ,l:z}w|-T:'b]L&7\ӥ3!0`ƨXV"Dĉ>$ 3U;-|aa-5%)<Wg2 vG߱!23bYݘMfn Μ)ۺqQh]4 [Lz\cws} 0V|`HdnD\N9ULf q@Nf~nD[6X^eƼi96P̣.6hu88Jx3{.(!{D`eW gȗB s? WH.b+URh2o*#w!X@ }GPYz ^Xǎv$0 L„G=Py(=`\jK=dCY;nƼI ȑ47aYvfE+4cM5Ɏ{s,N<~|5#\f^/oMoۀ1} `#Q(w2N# egI\FCU'x NZ!!"v)v%+?S!XWGYitvi &k.p vhpZ`?zIHqyx}zƠw"iT4AD;dXn}v:RDuX{e$jm-N]E*"l.ɨJ6[37E' dD~W{0T̓}ЩC$ѧ"J֣Q>|f3<`(j *b> cԻ(|Ho}l/i@E5ԋUSNc"+sgɚ fш=A +'@T"'N]*gMZu5sʄnC&x5`Oe5/8G.QYwrc*к2tq"i_*$dsBh"D4 pF'NZrI #Fy0*Qk&* Q1Rd qĠSU@(}*w1]YYwsݧrTO%K-R*`WY)gQ"ަhִ`rd[/J QQH]yϭF oBWw@2m S]; TwСHȒDՊ{'JLN֥Ԧ' AŴ$8R2z_螲5ل_b~ɯ\ j4`9oR'٣W+O]-kf(݈JӴDFUsS! }CF+ [T7Ճ JӭG"KG\YHap*8]TfYq# I:vFؘt-|]l<8B )3`zC5ʐ.}NR",^9*/~ߪLVU eW)3ط,-B oE 2η*_tm b}^Ғo5x#tdŵJEiI{'`-⚠郗Mleӓ򥇺=\u_O/]x|Juԍ|Fٌu#mƺ_7c盱>oNXO^54h\ͲK+('-8 X4NXO(ђ#dz6')kM#rF@W9:=lbtO,n6Z泆:ė#]9qKezL.GW||u񸢏d{>G 01ia%¯~Bbf86+lU6bhDb\in4 SK'!].z~us13q_ݠpY7? # c+%)Ӧdz+>B!<bzZ'*qBO4( 's0T5(W; UFd>hP,KmhfX6ԇp~@b˺-Xv<1 Ia04p7[/`xG8}LHzj'ٶ,@NY%H "}ZC"M%drE*eEv[.jxٜQx\"BuJHL-@ cj$)?|NA>"hvqRVRVq>0S%iE$a/E;D&>87 `G!%'HmZV. {kΡ:Cdճ0_-D'dGqUM=N|P9hF1-I-, =5 %kb6r^{XYmd&w歼GGj~vgMV4<╒A]4dDzWYM'L[_w꠾q:OVm|:M])3SQg\YgTNv;z {Vǩz|{9s鴞m>zkX7]S|tI|c\t>wez}rzz35>tWsqú>Hzp9 m=Zh+Z&iMµ;ҥ㳳ɜq;R"%>kid d\nr?xw(WS byoshimi-2.3.5.1/banks/Brass/0036-Analog Brass 4.xiz000066400000000000000000000046341506652756400212420ustar00rootroot00000000000000\_s8O%jfR@ξ[&짿--쐽)?Mn__63 B>5_Λ پzO毟?|j~:|xǙC# ﲏvg|j' V6mL>kݺ܍{ jx,Wt KHh)OMXxr3 yuã9_hEv!s`t,l6Zz@FuBҗe8lx7Zfxj }!q <`abV/V!Fč&$[ `aHpX –Kf+stMSS?X"!k@=uXϾksE -,d=܍& nYyѵ0lt?b,mlqymjRY떡%s]{*qm|G4 '? T1@43MbtpG&0HXY6H,81]#k*9m+V5y|1 ~%2:YSe01/s}_{J~ԖzdK/ITP7! :*%!'&8@Q}ۍ^ <,& _0QxbޓU+`עo'>1W4kXB*~l0fvS VN+m-~OΑjRK?Cf4&׮ `J f8$LGHo.z=^3${}\{o23#Q>K};:EWqpZ~un P;sӶKAp7 +XMJUi寗>Ҏt]Θ? hpU۾8IGJYV]R5dv3a4<%[䇶O %g^:q(Ӆ%ɕ
'W-H!:jT:Byn-["KQId.ؙ"GH?"^LһP?R$OEew@ԳծZ\o7'0}ڮ,F4A=YLr8-k8j{eLiA fϺPt~5DFЧU#4x\H=:-t^wkqG&7OEh#reqIsh:ezuʢ~ό+5̰T2}a At@e`P2b(H6 vLfpP)S)fK閦vmtbtmSn#$'c(%ǡK `c&T~KރK챤nh7y+ӿL$x+tn?L) Q.*&=QƓx*Um$cS#wͅ9o"iZZӥ o0r Gq)LVL: ͜RWeoj'G =>[U=5W"WPw11}\ԘPNH5Az<,qAE7lOC2'kT_†~ݩ7vkTpݩO3ԝzS_U_|G |^z|Q.FAݫO?W?<>=Ã[ݷ xۆ 3WՂAq֘H;Bqz^b6.k'g* -<_ڻa`ro8.sG09Xn01TÄ+4}hgLgIt,=0}e ^0] Uڮ*U8`9ikڨG8Vm`TWT;Uک*NUvJ[UݪRrح*n)L]<Cts\MdiJ2b-zߐ czE^W3ƞIzrM8.D38Ǖ28C kr\:=d tv*ioBݯ[Jyoshimi-2.3.5.1/banks/Brass/0065-Simple Brass.xiz000066400000000000000000000041041506652756400211400ustar00rootroot00000000000000ZYs6~ϯ`JaY39FJr "! E<+ %);NP=>.5Yr{2 پýjrq۟n׫;2^O~phDLŞZݖ|=z.qg41#ȩgm;hOV02 G-#o4'-Pt:wt>h@־ݳwMxCԍ鑅-ˇ%h/ߏDgථ"ZYeT=}"{p"P,UҼ_Cr`^y`e1Em6V/{C U<{ex8}n GTrxf95u.3>4 ߶@[}ﶿ A{N(bhl}18kEtft<0% 'ճ}_b/rpwRؒ0;pClE: +B+`̣k,wJ<0o]>jVH:v(f0bsH+)gTU7/3 Y~~AT FmwM%<.$spA9s)XU O\6r ʝh.QʂI"g<2׷yt$`P]\[]C;aƼb..kE]䥕[±dGq$,$%RudXO +Z{0 CL  VmR<?C2:I]18A>ˆ8 ĩ;nԟȭ :r&to~/aEvq >k*^A_ѬXIa?_vG1GP=Q;ԛt~ Ө^!jvID;wp6(.=Ry Zl2FGv zTW0{ԒL+KqVMosU}(<}ȞёCRO#IjeT}1TT>}pY>٧ة R7ˇgȧ7 fg0:Î ;Ccm%>]Wx6<3BGY=B`>vS;lHFFn?*cm-SӭF$IP,+j@f2YeVUUڹYR|woyghv8(VQ`4Yyhv;虃aG)ek?t 'g`p<muLj;W/na-캤G+Q]i>U*FIb0 7YZ+4 pA(Y2#J|(3E$f ϡDH1N҈ˡ(未A001~7m[w}}\v,$lw@\et]8|U)z}g/sN{Y+}d$QmbL?fzlQ{ɼۙD-xYD, *܇WJ`pd=UsO!o ȑlܣQ$V" ^7L\%1D ݷ8^!1/pVꍝsz S1 %,oUT:/>5o+˖_|/[~Y˷yu/?ԫ ;@޻7э⬙F1Ltl&Q6(nD_5IfG'.c@3az_1!WHS9 >RXu1z(t HI5|tbXK.?>5F7m3YC+yoshimi-2.3.5.1/banks/Brass/0066-Fat Brass.xiz000066400000000000000000000046761506652756400204400ustar00rootroot00000000000000]s6CBuLHtz}(MKw?${%&bCە_ B>խ5پzQ]Lj=y]Ǚw?QxW~uwz.r\ 7q4珇4imdG^Ƌ~8wQF]^0]kQ:%=IF<a4N!EͣK޽ hN91]ZSOn(=_I|Uu7l}Nz;^$:qIu\"`,ejJ܈[dzaKlU6 BhDlli)L?h"hS}KEO'ߵ Rxt|{NSq?ݠpY?iT0Hޖeֽ%ʰ@!=▋yU"m͸Ė#1*tف3*jt;w]snXݙG*PL4g%[ƑԇpG|j-XͳބsHKꚢWA׈+7Wdr`7Pv뛫Rk,S( 2 “}whA'@L=o)espڦr q|Px{^1^PCĵ+:lk~9 $NXBrJ!覇 l06SZrN$SWb~MYf~`3lh(TT,.\ rH>a8b%Brߞcu 5]&XO Nf젡xxB ͳvyz"vhpZ~n7ϛֱu##W[u@T4APnQw "˂R yrA""-d^-TNׂOQ8vj4Nc7r՛1Q?RuҘTI0ꫢؚZQ4IտT</?5QMT-{8!or&Worbfᄼـc6T[ހy 8Ґ&Q}/M,?ETߝZo/b+d[m{Ê;WŅfaxflzfTs6]׊+4d'߭.[n ƶG{h-|Mo~5Cz{S~z(nbL ϩ+5tp794|=\kroK<\/ET@@hyoshimi-2.3.5.1/banks/Brass/0067-Brass Pad1.xiz000066400000000000000000000043741506652756400205070ustar00rootroot00000000000000\Ys8~ϯ#QUdJڒW6ID"<{~6x؞l;u7>G}jZ پzw毟?|bvϳ7ve|3Fӝ~i'ǟA466m>kx7=ˉ[x5 <F ֣f#'V'&0:]7t>i@}}j//g/ڐ8dpL1<}fa˻/jߎuS-/܎jXKg<ٹKQeLZò77"nv!ٳ^y as[--r<wuqR!?1M¢Ζd w1gn~0ru.g{qY PTg]焭G)S * ި1>Nf~Dk0>NjrpޙG:($HL<_#ABKVgXy|3*:b\du <xP z4:nO=+ @@=Asa!gD]'aXbG/(N*ZZLu7]|56E'Euki2RDL߫BG8T% N_=mC~uX0Q[9@(/qE|$2D5S1GagOnfӈ=AImR@(e}@H<(aj&Հ.$(1 #XD\:q}Ȕ?(u"Ow1]FyX CݧlTO%K9T01S>w G/^{(`d// 8QvHZyϵB =+  RTRio2;29h?Kñ]㭒4}6`v6)"hqRRq>2nR1ɰ1Km@ ΝAʈm G-R&7\s2$PY@3@xBnF%&k76u>rHq" bZz(Yԥ Vjxq3M/xG/;Vn9t6D]SoV>#L~C [v%3a!esJɠ5ixO:PZA#yԭ; /!A*M?A ^ɖqrvs""%x #:N%Tl,ٚ eQ:/(pRUWUNR (ՎA ̃C Pc߰), yA=2?鏠rTc41& 0=5A|GUDž%kP/Nt߁a/9?N}Aӗ%^{ o}.S7oN}kNuRV'eѢmIT2FK~+%ˤFqW'euRV;͓"(eN%+:-ՓNgvK%IYwۣsȫPRv1u;'$eǏ IYr[UuOH'p lxrpοu5ԮKdFjrSCO{ԧd?8u%܌-H%6u%ۭ6u%6u%6yw6C@5vsCZo > ?P jr[)z(DY]/ |fsX2w%ph`bmEyoshimi-2.3.5.1/banks/Brass/0068-Brass Pad2.xiz000066400000000000000000000041151506652756400205020ustar00rootroot00000000000000Zms8_=;R 7n% ²%ye 2k)^V>گ=(nnk,pB /EWo\AugbK ʏrugk).v]>Yi4vhm$ɣA펦~Cw }x5'+I -I6c?MkC#C5mH3,~ O^k`&[gYO`:63Y{GQÅV0R%K:&/(]wXaa%s9Z)@)/*ą H$O]7S9]p]5x. `fckidro;2$d!sywf6?GN9lr(d}\̉8^RE.D]W ꆐ|p[\, _ɋ*>+:M̹ g-<'Zn81 \  Z*+\cE7k-|@fa/F+`قMVV9"@>v2]d8h]И  Ë|2bP|d=4 #]1L!WLPh=GҺ k0,I]X4s0́McxͪYG4 @,QÀjtadEuxYi/,FHbrfyU!#8}:@7p8@9똵o.^]r_#n@G]z>$ !-mpȤԾ [#E!hx4NX[V!Fe.V@K&Ll~Q5{EB/=хҋb9D)9չtx|l0!YE^:d}(j31 @ޮz)KRE"sP[6+X ba=ʛ(e4rfq|%Z8:Fևl$^#Z߀2]6= о-$Wٔ& on}f4JYk32R7 DJh|i 1n UFוȧЇ=`rdC 'p EMhBHpJ6 _=1?tdK*C_#MDFncE`ÂG;K'i >5N0Y>ٝȝs#ifs޵-^w^϶l3un4χղ/Pُh+_*L/&ΧQqGwO.Au9aQb*(,\o8|3$7I.dۓ ~ ჷNE4Xn9szT; mut8쏇W#`~; M~>у)ؙ'7ҷEz[ӿ7ۦ>./›z6QǒN]R"wKwe{~ קقbSHB;fQT)M?!G)O;vo/D:U`4NM`N&&^'g:1^׷­VI'3̔HW*zZ1YMD/߆qOSx4Xd̑j7uV* f;bǃoO͋vpu$U']`ݧ,3!\*`+v?sڧ)I%Hƽt|{ۡM+ǟ R.uBi+Vv#U&IK(ѝ/ziCPיJ2E^ɃMs{r'\TM*6R'}pV&v>8*X/H`0}znulڦ? X )˄4Ɏ@M<'jg&^s S]2T?C҇* 4Knʟo?wI۴tϙf^en +.t㇍-Hדô1[Mio\G8+qT6{=6Z/${//օi4ͮ 6>z%Ԭ"{ je4v)#m g{Ѻм%IA}s!j~Dn:HKz\(TZJ?dܸ?Fgtԍ־{V*t\IeʷϮ;RU9-WPe)PJWKk(zV$gjr v JݣT鏌~jm˴RY'itHGd[Pz PA嗴DqSUe.!ZJtfNȽV@g썢#3ln~!^3}WmG+gw;!;qM`6 ԷQ]{7RK(_] WQUMSŒXdUqS Uۭ'rys9LvwV nFYA4=Ȟ NvZR V1`F9٫/,WADGlOT͏F.9a;Gf+9Ǥƙ(aQP.<c!j/j/<^uhxͱzBM{hxQ2G('Jka HS,Ube8Y:*QW,+ p8>>\W,Ub=}beXYAb-XY+B W,nnh>\&adYad9#j!S Ar֡+V9XtYadqڶ #q: #q-0NmXa0NqXa0NXa0V!Ӟ-0V L䃵ӵㅑGiOʰ #FN=za&+  n#q0V!F,F!FcXa0tXa0V!"a0B+ #apu8 #q=03!qƝ0h ٪@i@9qp] L:4ҷ.@X=0q2?kqQm4|SP&`fعκZۙF vs5vJqaT/O,^A~d:7nf ][.`(/80 N/83b1G Gq&t?ή;:7Cfd`C!9it&KuykkȜx3LnQ>5t/Vz5t/_U ]>л0Q#N+M̜[(ĹɆK|ē0kk(@A 3k(M5^3\f\ב5%G֔WtALoQhf# J PMPn`: ߘYkkbms䷱+R&Uuq3NN(E#.2 J1 (/m"`[&uR[QB= ٕh uV:a0uF.+\Rw.:[EGk0 :Y2AJKUatwB):b| #PM0K>4J9PeoqB#{rn\{n\;(W Io\iJ8ݕTWi 4y 3kפЈŮpѵ Gt$fMh9K˘V HTR]4+ >R`KŤ[ə:#T(sNI1(Ѽgm92o.Fó]Z?eHe+uQc㕩F,ērQz=>W9Uڇ* #V6bUrk2yi6iƻ1fYy0nbTB3O%5@,[*mf?L_x٢nKPtjHwcҹCgTW:; KhZՠ Mqt^|g0O8hgMJD=*\Xă3ӸP}y:=*.Be:Vaa!a awQǷ Ֆ_@T _hP6Q}V9?{"5)"Z- Wgq[2ο2Ͷx=A?fFtZzxMq Wq[#s 6qVm-2U>dR*n4IUq=ټ*niy_)nBE4}θMjү pF/-nkҵt2o:YF.(q*ߖ$܇KE*nfUqx ۪Y%{u s7%*ndWj?O[ݓW۪|($=Wݓ\x+m6ȼ(vw}[_ zqAmN0{q4Ϸ]n|`N[ܓ4F/o3'LRȅʍ&Eo'MT[U[h;*VHReܪ[qS]M%<9"Gnjj+Ny(1 QĊ$xf4SntKtZwzQqGUBzF̻)0Tڳ*r(rG=H??o?MrP|i:\˖tzv|r0ۿ pGV}0XՂ'W }ȓ gܑOsc~?՝/ۚ]KxҨQM(hLcw[wF? i(>pv& %-Zʓ]ut4LF7c];a8 ܥ6Dތz.6ًjgu JaaAQղp=ۭCvp7Nw>./ҟ=cI'ξY~v כXTiUUJ'h{I͢lSSO@$O*'wI2?zos1ֵw.C}f_/[iʌ2%ґW޾4#H4 g,buEsW)kߌ=[,3 :}X͌M&VS.1^&T+,GQ3''+U5:1/P.u@eTy[]v(}t0N6EuYHpPkشM/x"Ii/"DdO1u~[ԛ9koQPXC\|Y.5Tni?ߩ?whO,r>{+^8۵ Pnv;ͮn)s{YeS]maXGx//+j=M'1Oc`^ 6Y=CDyd;mt9.W ?.oI}JirFAg…RN &7q$JZjT݈*2nO&nś V=i#ɕT=;.V~V"udeOɁjbvd (A~~>sO~Ӵ)Di]0'euFћiɺl%쓭A2PZ[hCZ7X8M)91WXs%Ak3NYϬ7̬={NM D}VLmxN/r'T[ K}ݲ|V3^/ɠ9K]žf\E򘰯LX咽2ɸWNpc9Lfw oƃEA8h܉ V-Sڬmqh#{^+VZ1m:M0] v[^EaS/dTq{3O2{QrEQBdeyZF2VU *wLE[Nj/VOQ{Nj%[':P N9 *Mi PXW,\uOW,+ p8>>\W,Uz p\W l3(F\W2fZ(3\WI(g+ p%s `Yabi#8Ƽ0-v-.^Je/^Ze0V!-0V!n#qf #q #q母 #al#a0%y6F}`4sv2fךd,I9ܬPC6-bF~=g;ȱ޹ F sXsтת.9lw{NLo9lj i||$7\{a]0<{a=$=>gv93D,s˜22 b}5C mT ͍ub m:GR fL0fՀa%/ƆV8Z qlxj5 8j5 xq:n[ :Vm[y[gg,_FS,^!8++^J^G8 w,_F:u:yns}ɸMi snS_[֢ͦ0m~h]-vAi82įmWO 6yW۪-=*YmUV!:a OJVq[}IUIVqۚIz:'Y5ǟ{NӦoMDC%Nc{^9+f:'QC-n쪸۪MV۪|($VT~[^_uDtmMWw6Z͢ kF|[5쾈f+iwZ>F,@9~s ;fw;Úf"HvxǢM2U[U[5*VQeܪ[q)^M%(^V$ 7ѓЯ7F$nM]-rG%II2J.>ҏJJ"T_#t|J[WEnEn2=H>t?'zX|h:у 9Yn'7l4Է.HEYl~ގr4Nr+oSDK*itJ "ۋUhݍaٮ\z O!bΤ2EEP%y_<*JN~ Y<Iœ̛jW'ӛϗ4n?j79xF?={>nςUܙa&E:R=f@H*&ji{4mS[6A.)~sl"a"x:z1 RQ܎ r!6<}e2LS9 EAޑ /?ϵ1X]]ɶظnMtG 2!q:R(%,̝w:a Q"|Yʟ!CC{K2nʟo?N4tϙf^en 3htZ'i5{]gv޸جiSC Lhڼ}ufQ\xj]F+S`WB&HK&E`g;et)K/.oI~R긑[ڌ:ݥES?m6HnR|4~l.nF<}n%o : MڹJwr~?[ZӿC)+KRZCiW2R*;R?s#:v2,h6z䣨e2έa2vPJ[Cx'8u)Ug.!-:8s">YoY{JH>u/ř<3h;!o㔻bF{3-C$;ⷱUT]ml B+nsXs]~I{I$f3YO{3 'gѠ$"{28KAeAafSW7&]zDtDh/NY[#7 |ǟ$W4s%V)3'dl6q Z[U]S[vwQޭ\?+*ҡ8a !5Fb(ߝ3k#t^O_m/73 a1@)8S-yc03mLכa1BX Է!5FKCmǙ5F6zYc0Za1B,0 Lq,·avyc0 L4h; a=a1B[2B=aq!5FcXc0!5Fc¸#aBGzƭU]0n SÈVm Hapka a Fm G;D~hJH0rٵ$qΠFڂ&W !$jSm l&% qӊc4L\hWཏNZFXkPōec1\1~phm17i)/[.i =!7șq81hfWn3Izk B~ڠhu3Zhh?bjhQys~vnhώ"Lnc(]à+N?1AB*Geҗ"PV&>5[stϞt6_k|xk5޺JX3+a Mǯ(+a 1%ʮ5 LհZ#P̑Έh[#F\o]l2P׼%+aS kJ~\X FsD4G|وbOe@H5Z5 X@5DXl#ʀgriPoAA^Cgx7`ϑMcDs:f"ހVgl缃x6osP6o@~5e#ހo7 h}jPqֈbтxpT&=5yۍb(6`g( 茙5zKmɭc&|+[56Ru Ԑx5 _ ?E) EA,NїPL ]'b pi x .F׉9/ϠT{5xktuFX5ַ ހSL#ޠ5Ɩ kTqy~~xlt`F%Qy=z)n_(=ItxxnkҡIv%Cmz-]g$TS?ԉceDcBݼ篷)pH™JYdlX}*NQQdB^KA ا{Z;a,2$Ԝ0f2tWgOU rʹxIXa2bQCRU$4FK'9E\l1Z{mhIT2mIpϦDͦD5D5Aw s˜r:uU9=H^̘HSYkJ$yY}2ͧ1"&ցA$v)lsH-0Iz:ef o"(g#p"RO:E~[`mw|=;"ۈÛ˫,VvWѰȑ2?{\RSZVZʹiF>V:WۜޯOF~N%&fiֲc'Waae HhFD&t긭긭vͷojx|[ͷ|*z|[S|$s:r#7op;f$f QpQ2')>VI5B7'GnBEnP2=ʼ9.2^uNY96xfG> e-}_|B>|%.#L~i<|[B4:lK J?*g*'66Jt%4r9ro;iɴۻ_ON|x?!f@yoshimi-2.3.5.1/banks/Choir_and_Voice/0004-Voice OOH.xiz000066400000000000000000000052721506652756400222700ustar00rootroot00000000000000]S8}~E.lbjLpjR a^Tv;__ܲNjuKusOofvMrܻrz2l-&F?OزwX4[SdCӦ_}6?.g40icanO?8')x ?kacB@zl@|Ku-oFpa&'@+)]P  ŃL'|"@!P&cowyO@lN.tKZD`zW)U`ϧsHgN-QBw> 9%Ǥ}%1  #;2Q- O)8:wBy+ E[߉1^{ʘ$6wfgC#4H@eXFJѓBJdBP_Tc}/94+cXrQ/dݚJؑ`&u8V捋$:Mz^_&="}?!b߳e **[p6$xl\NnBʆqf܃ɔ%Fքy ="Cg lZ Vud+D}*^/ƃ0aaG^gqh}=_Q#ᅐףtE/\Ԙ,c#,bRՁ[ 8x?3 ^0S38zTE.-wmIhyoshimi-2.3.5.1/banks/Choir_and_Voice/0005-Choir Pad1.xiz000066400000000000000000000036571506652756400224350ustar00rootroot00000000000000Zms8_=%L%f\)}[% /2kS{Z>̛w/xfQi>o6Xp Y7L{6<]{4loz Bh+; Y4ӓfw'َWM0t<Mgwx:64"KFHv0Y4f.XLha&[g[Ysf;{a޹}!z%<7Һ,T?{ d"q [{Z1G´(rxF<wLu3/?s ϕƓbpgOy879wupͽZoZ\ۺ/cMB*n3$@]0T1 +B:'Ĝ*5Xu!BP7]sEzbij.}%1Jܫ8dAl[N_"`ȉY蒄+fЪTOY8]+Xk;`2,>W |Pr f>[ɺTqVV ``v7~6om K3Am'3IdV;%A'X M}HWSʕK$ɀ.]I2g7.xLlçڗbܽJw60/rZbt&0lBH {.Qe@*mvU&\Ʈhv{>i!VP r.sг,8rJw J|xɖScUs1@q6YX1X5r8rQzan]展'ط{C-Av8,|xzb, =2I.hzW3ϏP撈L%S9B% ,*5m7  @x?wfT2Z>M5h,ͼ\J1Z\: Y弾lmDZ$ѸtFmC*F$\gdD 1ٹ+~WȸbR"k3|:k(a}L} ,:n4?>ؓc-{C[c a2c,223jI%i(J#p8Hb%4`q)])$%nJпdĢ]i1qE۶B4Y>Oݾk_Z2:bkY= D<"kAE7#jD[5𥢎 }x`6_hVw')# Z|zY'eP0l$Cwqj3NGUJ2Ǔ ni~ɃyњvTqъ֚*DUiMzkz<g9Ttզדj̓['V7$~e}C'ꨫoS>kbf}՝ө8T_NϹ߆TOy:a>B}:O S9Y.l.%5'ZSk{o"8vCc|7]j6[COo?S]?'yoshimi-2.3.5.1/banks/Choir_and_Voice/0006-Choir Pad2.xiz000066400000000000000000000036731506652756400224350ustar00rootroot00000000000000Zms8_=%Js @n.E#lKoeKʐ܄v>W|''^^5 ǫr|o~o׳n V\RxW}T; (j'w"xJ6fNJ<6h7=D Bh+;Y6Ff;Zʓ|^ Ldzp9M-*FHv^_'0ݐ,a.XL Q‹/4Xnf}.lr7o=_{ LΦƓ&h70Yc0n2(>;d~m}՜Μ4b]-FL Rj'hv#E hY.BθDs`^~b6 p]]8C2C-0fFȆAz KBr7T}+8$Q1ev3ZKru2 [Q`b8 B˭! 'F B!BSʰ+iZu.MPJ)׵b(fx*d /%W5L# \@ȑ=Km]Z 2_'0Y{q"`j.ݦX4J,ɳ(3x#:GL`ZͥXP o׋[)KRe"P\8 kɱ|XPwjL;p:eYm:Fl10peBO !K{R BQ2#-\ onl~x3Y>h'Ő%MD8aJ dDqf?`²֊ɍ,kȇ9MI[pe(F2OUC+Pf'G85QE \ C 9+jҠm1X4'{S׭RGiQMkO87;C1A8,|xz|,J=2$.h"8Oʘ\3 K`2 +ɾjEh!h#{ύ ZHˇ7>Mn׾1ډʦ}=s #L[θm]ȣq遡`\\ᯣ#BNprبi\Q]ӃGMZNpLW)a#<.s˽==ӭgH.=-d3uTo3r0]넥d@r,BYW!V\qꕮysNDEĉ(=Lhn[k(@QƈaF%m75h |xA Ѳ@XD3ʅ_30b5+AXQGNP=ڨ׶_H=Д=F:2.@-}D8P;ʨVRtO^]kHsRGeJRǣ ni~Ays"~UDƽ)n>5&f;zcL|!(M ߔuzM"Z;ڪ{W\Uu/XYs:S}y:өE~uNt]?G=&uŒNdtc{__]kMe#qő8v[R=*z+8POʊB'yoshimi-2.3.5.1/banks/Choir_and_Voice/0007-Choir Pad3.xiz000066400000000000000000000075171506652756400224400ustar00rootroot00000000000000][s۶~ϯ{jn3I:-O5'v4}"Hr.%`649OX\|X,vo~ZGY9yɧ7G߽z󯓋㛏Ӄ?I^onOEϚ?^?m_y% <ż 9 6Ϋi~׼d Yq^jIZvӋ[˃$XEo;!)M`_spK—SQP/9MoW׻>*c~*@$ԝ ~ ?.U̏6(mbCB~XDs#SP)YW}L0i>祺Wꪚ_\}8T ̕bʱ;K 7ygMdJwR 1v:9Qge߅\94d,ͳ4TV g7ӳ8,g> $]JsFAJyơ'VjBX 0o,GI4 *joiQim[tֺc_` n"b"^Q$TRf޲(pU6ZY_JQ\|M^m!:L_!ڬ/՛/ TW͉Z_Y.Dt%\N~JnCr4 7iP~c},=xn\}ຬeaMlൗ-rC{58W<VMhb֯9x0J%#K˭\[ɽZgi!8I, cc%4 98i\4zj[(l}0>KB=NS]jm WkU;;1 ֖08[=0嵶<„+8[ǘ0ΌLVbƺL.c0f.lL!`ʘ12gcjj1gc f0AوRlUu=c#j^zF܆TlvnI! C6!R (SC6X{A؀RXA- FF #(ma#1Haal0RC)!Z{EF njI#xϪ>0ZAP[FF #1Q3j`#1Ha a00RC)!Ǚ.6 |-CCY!J*I}/ݦVɡ* nej0VIR[%)g}0Qc!a'lCE c_LH|9c, lQj>$)%IaaCʒ@8Τ00j! q G-c#a0fHă˜ Lͺ.+2a]]p Ҷ Xj =b(HƜ[555,⽝*8a E[Hcvs' Öchvq,<c^)ic1ZH#v4bZHc%ZNX9a!`='aZGB kGNX-z#'9a KЫK&aim,Bi ;kX*^N|&HTإ45m,!@mczi kt1QS%ȓ mZCthi k45Z-58d%t.9& ȶ,-5Z khn kX-XCeuArq=T]eZS. q.He4RC]H0YLדSn4/IXm~mnZUbgWH(Nfm%lւZ-[b"nmÝ7 WseJ Dy\?D8ٿis5=4(7 GWnkGR~/u_R~ڧ2sh,Oc):tl"ⳇ9=T/lj~shU{CB6y'Nft㌬0''!CM!G~_/63%;4R6ۇu뇖~5{EwRW'xH&ax=uW&yoshimi-2.3.5.1/banks/Choir_and_Voice/0008-Choir Pad4.xiz000066400000000000000000000036421506652756400224350ustar00rootroot00000000000000Zs8~_CBL%0e.^4mq?$yeHewӧ6jەěwaxbq>m6XrϏeWo~w_ۨyt9ģ·P$x|l7Ոɑ+}MZOhɧQ㎦AO~B> %1.B(_F/`x2ntmhLٿNX4aXLF#l˅6[d[Y!p6m 3 }'0$`zn-? ٰQ"4dxkd$V+jkٖ~@m@ |Pr v>[{b]:ȱ?gx@ffhvIF [ԃ \$1Yϖi MxTTSʕK$mɂ.]"f䁽[dy2#oV̺ ূA@GieAt>Y8>)4re])WCY\!&!vӭJS1 ҺX_$\شsz^Sj}RK1#]!'hdާ4_60گH}? 9LM؆CL`hWTi)LV~)ZI-ΣLyZg[ E$˹v2J0k$(V[}QI`).5EXyXWjD;Χde=uMK8|:Qn0Qv Rh BOrjEF8 x`DB_3C&BI ;|*VE##upL+l(9W9RSeZ\QzP;D%~~bw}%D!em~ƉƁ }EZZ#'|q=ʄ(ݢ;kpfzg>%hǀEOO_&BL2 *DUGa.HQx/})?C4?c.Լw ά Z@ Y̋n}~1ťU]nk;N.ឩ+=q?}Yy`#N92jbAE2{GMƵEcݻ5Hu_܄O sQm͆C-2CB01,22s UYݓiʥCrC+UJj5?QQ"JKF,Ev#[qE۶BY 's:ԡ:B?T~AQyέ\6\Oux[?G##tdz1%2v8  ?d5}PAwonvo+µ?}]#n0|)#J9XUIMX ch3@t*&;@x(BoZr];Ȩf1O!`E@?h/t4[IHB+=I#o$YaBoTZ QhyF [马G-enAyFH]T-EWZuє@I1ү1"C 1y vT>\ԯן7ÇWW6K,t{^{f[UVn Yi C~q)T; (lvr JJDS81u8}hظ|u%k/N 8d o fh)+ϛ`x2ntmhLQ7B*ن|M҄`1SX fw/|;0i޲$Sz?v0 {6ޝ'xG`HW~88 a1„iBm6MVQqfz(rxF<ɟf^~W |Pr f>[|]cK!#~nΦ񵭡vIF4ԃ \$1YϖϽx"7)b]-FL)W/"iOt#ݸ&p_Q~b֓$?tĢ5WՀ Ș·k !kQ9$A* QWʷ,aY&* Q*C)UMb1,4)*> :nLIUO~$k"kbU k}<HQG b.V-bt\jVQ̈TL PRSJkFW ǟ@DLl}QV!<>eC3-LKPtaDnQJjAv.p`RS:j(%YCvQ(\c^h׋Z)+oE&lpՒbŰU̞O'0/j,:Grt>Qn0Q2 O)K!'{"# nnmnp=^k&%WL4`؄("1*cRf7_eerh!#U0Imh* ˅*!:)( ##[^MT L -gMDhf >( lW* gr':σ+CiO^NQmq X4YTzdI]ԓD5j'ROg 9%18jߧ nK@?DYlYĕT#p>>CQ6z> zWϵ׻^cNLicFk'!+׽Ej[G'pahOu#6܈{fM̉HUt[nR="3 |:k8ωB~̤ ~ ,ʂv!7n=Avmg!CL<8ی*j0N_$xҷ.8Hb%4oDTGL9@QF~JĄB4Y.',K Q!vBb"X&DƏb5AVQdžFP<ЬVO)S!m3Z豬J2*PMxLχnD fd,RU%ʋ7ͧF g9TtզIpɭm+|nT3>_qSˣSyĢNOxS;o(*tk!㩾8j֏>bFZGLIr]:ڣ=\JjdGZSk}o~[q'&nDlrʟ"+Ue7F'yoshimi-2.3.5.1/banks/Choir_and_Voice/0033-Choir.xiz000066400000000000000000000023121506652756400216530ustar00rootroot00000000000000Xr8}W~g2PdpY.[}Q [k&o dKl [jVV_㨱!=8WN<8ixq[g؞>?[d=}\y(3wo4RK94E4%@+ Dc€V"D {TmF~P+,*<=Nɭr\oTxSn1+bd侹)CBsKEcnWDS ڗxR'}db교ʓ B,i/̀EGPo4i025h^ʩ EUvlZq]ouDͭBǪ.haڵ.0 [9!hEPQ mȷ"!驼S2-EKXCS}v+v4!iO%f2I@BR&Xu0e%Q6 FacNXl\V{Dv b#|14Ь 1Zh׺cϙ?h?[ := EBDj67~!"EǹPS#0=\H(+/m07}w%NЌȢ8& MhIhVK<7GnV٬{w⡑;vOvw c0,p0ҹ(U) Ss$ )OUL(xp8|N|sįją IkoByKwUo0`* ?f,$b/V%˅^0i턪;wu>3 WYmem妢?z\,$0XAl/+ˆ[a%{B,Rң@|?U\IxS.GsH)\)ݡ]pN/x(eJ DW׸fh ` 4yL6?+8a\$f4QQ ]K@UF"c/?俗b]8zYhR_fh #nCT~Z~`s]͞_5(zg$iNUވ=^`2=/!PE%]x"OW/1EK&U"K0 X qz t!sN+BӲRyM"rUZp7= GsׇYY̽5 _Gl҄|R6gOh#cQH 4|hJynkșڽA.a%Js9ثlr_-!+U`H(ٷY^!yoshimi-2.3.5.1/banks/Choir_and_Voice/0035-Wah Choir.xiz000066400000000000000000000025521506652756400223630ustar00rootroot00000000000000YmW8`Ţx:r3~ mm6{ i6mUIMnܷx9k ٭e~fsGzvO结:q޲Mֳ_0հ eʙuh/pqmFxC1ڷNXҀ&B-#mmeߚkC4ܯ1[-h-c [)8Qs3``?TB(V]~=Tjt|>$B_HfMq(I:x( &HoG_؀IfCn?-" ɠLz]YuAK e˕aT@+ i|w"/ۻlf|pqD?>b|jϮOΛ?}˝94_qӔ»ɚş|i:f?ģǀ;D2X'`8dIڸ+=m6 "1I#ۅF@_F_PX, jb_Nۻԏ R:7ZdIXTiGkH V rGGLB I"/H <& _Yjךޒ_ABROY-Zf;uEg@: ꄽ(!qmTEq3L,|/x)| -$dH@o@.b$f+F颶Mq 6UCI ėە9D}3 {T{oH2#6K{J1vvhQpZ~/.ΩsR./VN:m>GwXpiEvSYV2""]oVA4O̠g+ZڋLeo(*f-<Ъ۽;b+|f ^Dㄑ%Ry^ r9R&%} bה e., bOZ&(d4|Xzy8EaW^q!?A3 ☠PjLPe,zx -;!r@2[Sj۠GSY]nPԶFf-.SD9oj*'B (b0YA͊m#JZ+ElBT`cAʳ0HK(lAI@b)nDr  1MSD 5YTQcSƶ5R:~a֨hx 3բ? M?w)%Q5,{ɶl9v.r&M/NJxz9ʌb{97 !l۱;ҞRXr'[Q;9'ǎ]5@AqPqT~å))$FITT2l}\>Z Gc2IU"( z#-LZui/)Wt Tg&dv t,8*ɩO7i^RIӒ<xan \#2܎GK~^X-q;C[2V]L"=xgɋ}՝8x ͐PU:AX9,ZD%hQ?ܯԸ]Q:]<ȳ-yLT䒷J-,ogTZŠr].:HJH)#1r7AbEimS찑N:]`;y{qa`A;p@6xB_29#L0kk۾n*bV}z#wDmѮʠ?v{=}vuc7]<]zC@[.ū᱋DԻxͱ;l2 n;)>M*;mከ~t5G&}|t^6ὗ lf յ4#o(DPKxg G~IskK k`=ֵZ[u-Ǻc}^'걾x;pF'עN7H Cy&KK*krCy1.'Үl t=WcL%Ug[|RnI@yß >yoshimi-2.3.5.1/banks/Choir_and_Voice/0037-Voiced Synth.xiz000066400000000000000000000072761506652756400231300ustar00rootroot00000000000000]rF}WhUqRLUTk]VS}AA$(!&.*V~$`0bea,s> 4b~0>4Z 0zp~w?×ٿ^tz~]#5{p'a}jәu}|'f/yݗ8y{E4WU$ٹ?3Ehlg7d7wW˛k_yqxCnG-`oxӳl[*olOE&ͤDQ*}]6ެL-eԂ/"b5&8IfFkT_T]>if&יF5UlN1+䆑5x݉ؾmqU$A4X|Qu x~0N}U ^>FW.>K<1 ^ #嘪wGx!"ڍe 9'#;a2H$QPSx $L_=y:-C+REuk(y&Ϟ+%ZP\ Nm;uK}9rKwqN쇞;NJ͟z}:w`ث&3W*Ϻ{+qv4ykܔ4lkA܇[(Z[I K˅L55o5}P.<>b A 8CV'JBi|}Y/WUbEGK2Z!H5^rPvP}iTC:ݮvASqa_k'g8]\T}:F 8̧{\ceeM\TUM/$WMDεo'-? )# (ΎIa8KWk]DQ rCfIP7fg ͝\r|w_Ń|wM-9iθkaxkzs?LكpM<K̍i7ף 5QN NwNmDZIRIͫ~%]BBLrfh*(r^u8IPD7:Q˜J)z9EJNa={>s(ge|lSi(g $ @X.L0, l@227$[=dnh7!sC/)b@v-1BEzbc-*s[c)ᥒq;-xmZ`GxWS;B:-9Ug5A>C1CwĠ%d=r$>uO9(/Cqv:QǼl=QGQQ&QB_g#ԩ⑯q`GS"#P;BgGEgve8y4numxRoӆ6ujC_"i}RXh4-Z-*2t:҇'eƦ/oh1iOuһ;OhbY{[ӷԋIX\-(fڃlK%YBElK`hdꈹn/?®]"3-KI\D5ݑj izF-"Ksd qlNNI2pޤ69r6+M,SehHk /yK}!u2SG!Zjd6⸤1SP%H "het[ M8zm? :Mye>UOI&ݑ-?‚v+ gEc.Hebo ʟ4(>sU&59ȭafc]M._GwW7חYj&8iZ3vlWRՃO }6ʉFw9oڝ]=qK%}ţNy)-fEmM6!7ic[dv)Ӻ0}zLo{}ɍphM<K T\OcUɮ[G+q$ɮ\G*gy{s}-}雽ֵ_Do zlR `pvaaCÆ>ׇ }Ze2ÆV7zW|w5ѷXZ䮞6)?LRE!ߖ(Lԓ`m1b#zBbDv%GdoJ^aQٺ*YUoW㫔#u>"u>||rduuZ?,!F~;#e|cIa׬rUܐK4?1Εalyoshimi-2.3.5.1/banks/Choir_and_Voice/0039-Ohh Choir.xiz000066400000000000000000000037001506652756400223620ustar00rootroot00000000000000Zs8~_CB`i&0e.^4p²%yeH:a7ӧ6jO6?>A%GMI"7y5?~xvg $fe!}".qX.te70%?Jy,l]nSXDj\GSH? je Ⱦcg1].t©Op`fQzݸ\~߭`k~ơHejX:톩4:*b$Ej(Y{j-t}M4]QͶTtZbx=ѝ,@jIXq{o#mԩ y8)<',rPQ O@)-$^AwoGk]0E#Ib*e:&YDh@N53/tM70cU/#ʲO'426}6mXZ-*Nn yN7,ZƀI@D&lר+JGՕ:d'Zzt}@IN-[B?>bjd ZNHu*ŋh٬a/%ŊVA|:L.PkQgZXd:5434UK}=V)>զp>/wޘ7,l"b,::cvܸ:i[(HxqwU{{8)heCc$Z}@jޓF颍HoL,]o $5M-*,sR4x"m@ 0XWuk3*)?vGJ_魥@'׀EPO_%N=(lRHU5wFi#0\摄Ld~] <ʬlfS\F

E{H$ =SqB3hjFcys>;մwhI*ΉG#D].3j;Rwq|ϑ`pb.J&Z^"We39WnuxOx7z 2~AQ[~e{s?kG(>bC:GH-BOVh$h4\/Zko. Qk-]O+a.=ۣܡr_(J` ? XB'yoshimi-2.3.5.1/banks/Choir_and_Voice/0065-Vocal Morph 1.xiz000066400000000000000000000061611506652756400230550ustar00rootroot00000000000000]s8~߿Y3U&N&v. E0Nر8_-D ti&OD7|em=aen=eua/vZ}O_vloK; lmvɕn}9vkg;m-!liQܺ0ʄhw%qԆ7j_{;`{ٞ\_G~d"w #FVK/.D:}Zwt5_]1k= .00:HcxŖڻQvlFr7˺09H|\ Nǀ{2y{N'9b:pj6_N+jnN u ?T"/:\SN# VeSM/u2lgd1.X$bNDd p f@jz$Bϻ 3 !rq\ (I믭8"zD+}V-ZXo(TyI ua?[c S{۷ !O~ԅ' Ql"&LA³ /~`#^?Q,l?ΓN bBYpwvZxG#XhTRO|]{N'O=?t8G&t]y2pgPcFLl{!9]jBwsѢr.,8 '֚Mn}=ebA*<d :RCŀlh>ڡ VW,C_Ņit o/}ݘF'܆i@W0O9#nKXuwI<Uqnm-Tj'c`HK~3sjQn2_}+"xk7>, U'ȵrhE x>u66 -,2BC!T=ħ 5@e^1ZOR3%dn}POQhFdaRO}: @}& 3l:)φ, &«B 5۸Oat} B데6`IW>nrW?{5+>kOkّmYF6+z52@5uDRW8GO[cE"u*w29#W*|-vldt^Ѿ- cuB5,i` %0 l5Jַ z-U=*&6"I˰*i-DJ8h19B#ۺXF= {KN`*DjRSKyjeBhmA6Rh]h}dfXKoc>^,ZRAH +I4EXɷ]MO+(DǃEPk)(бrŠ͖=oڤX #Ch1nÁ.p{P+N&#)NjTE"BŜ SlQ†T> "cGrͮT,QSZJŠ!?ےT|cA&~x\0e˫-c~,ُ%D#nf8a# Cak  =zZr[ՎTǧZGg-Uɔ^TWT[ѓ-TG Ű}\b2 T7E %)4H@AK>狔Ω$XYQl&Cc;6MpDakㅑ*^7ڱ|d4PaS+Xo[C2|vE^?M%lrN×WmQ܅\H-+ T\ 57˄,/ami={ dzK8*PqZR}uq-u x |,ny$i:ze.P֟KKx5>Ŕ܆n5$! URoIRL _@NI}d!7 !nW6GQ}CꛓzaRߐ*NI}&ِԳ 7ɷ*oɿ2Rߐ%Q~tIl77B냮 Ug5K*R;Yҙͳ 3gI'5TjߵE(\JPl3UWy&s*;3U䟒o/)$=MI~}|4 *ia U:tkGCc@N(:͔_}kI"\Sp܅jEEVe ,C(@YP.93?US9xK;n~@%rrBr=}}]:Z/3W ͷ媟&^  ˾XP;5ئ}oFx;%`ULVBjuyoshimi-2.3.5.1/banks/Choir_and_Voice/0066-Vocal Morph 2.xiz000066400000000000000000000060331506652756400230550ustar00rootroot00000000000000]sH_$[Ƶ38w, H${F̌z4B\|.K6ݿuO>^՞0KY,yҬ_y<#ǮM~lvkoWO߃[{gp?BߍڅZFDG4'鈽:Lt< C!V5^_Տm.`j O_ݨ^k`ķC댸!N|8Yûh>C9k-< 01:I#ŖڸQn׮|-z%].]- ~9o"s )ުd6MTn uW <ύ"O*\kN& LVe[Mח:Z6Oc2W:Xw"% HȜ0($/2ʼnX-bw}a% ;36rn^f/I/8,j+}V-d< Lȃz<,4`_ML쓟@h` pxMD?E#"&> @Nj_-' 'Z nX@%x' q]V֒Z85jTpc )`7N46ގ-Cו, -e:Bh"dc:&{"ǝe: ݕkGLC]tDCk\S ~MZ` ͽ,}&.;)Tu ((J*/F]!,B|4dT鐂t} B w Rp]4mb;z2M40amšE|M(`\Ͳ)%'%96!TV ~`t7¦৻ȱ w)2^8Mvv8 G8n$e6%tB) qH},SLZƏj\W6m0P>D F5MaQNGm)m#%:6lG1,NخbT՝jSL%v6j_1*SuR'S:ATW}5RO*꣣c63,t2-[O@7H*6X*Ag>@͖U *&G7 ͩvX=m鎾`N|hcD+$[ -ZUt%U}mu 2ֶ*&e ma4|ХJn($žNh* ϝj*j Q6'hSI [2_fNO*6p ֩U/:0e?Nw_8Z9 \BKH֧K*T]I刃R5@knQQQt[[>8)0g_> {ڬJyСmT%B`aeMQ4\>>*? 3JN:)O30}zҚM׊X-# Yrs>c_I70K+~:Փu.ι%%R>9G|eA2uɁ,}/,㓃Mć*z`ym_yeYUcW~E+N^ > P;@{ȟaQGZ?rBbW¶[Bv/]\[兰[ځ+zO䕰in4NF;v-;ߦQ&A?n}/K؟'h׌mұȑRg!㘵%v9]HA=)ڌCkRms.l !։zf m65uGv^b+uiRMi7NJ v*eoEy}˔ucse¸Fs.Ƥionm?=)/1w dUC)H ە-G:W Ob#-iV{k>ka4e)U)U3 EVd -$/:( j% 28QV 5%]$Ci lyCxq4|2Id&fBx= K oF{aob${5'UDk&z HZ~Fsyd'7 n!$wUN&N4[^ +?;*MxXHv.q&*%H6T(dICEf[`=#Yaz"oVl̅#)<4),GNo&'I*%#/#'|9Gޖ|#oatm}3Ų.okw~M8oMr-\qwSy[vvqڗlzVqYƁgcTzۇ}O66ѓ5 ]G'?u%=ߪu%ƺ~Vc]IwXWj:̩PR]1hHUʤ( & MvG]=]].czJkR"!}mHb޸2~;Y&Zg%䣣p{;AA`yoshimi-2.3.5.1/banks/Choir_and_Voice/0067-Vocal Morph 3.xiz000066400000000000000000000062641506652756400230650ustar00rootroot00000000000000][s~ϯѻWݫlimVubǒs6Ba@6 t96= bbyIaOm|u>_i;ڷ˳q>byv=kLMsu~_J;ާڦWl\?7\^辡F?ںӺo`DhfcA\Ѓv+{T+Q6 t\\M=u-GYӋ o0b}{ϖnu7rNvXMW3zz3g7x;I٦R2@kk{lr`>ܤYe0}y]@0`9H|\ xiFQD<b-ֱ/xn0xb۟m]؉$?n;2~F*x[t u-9+m^H1s}3h泍&فheC[~3s!`dFرh߭t\((oIZ2[UGVߑM'y`BLW_ۋBGtuGۻ%T;pҶ$B?l3xHņ#܄JA=Z[װg gE'HX-V7:AT1402˹gFX  xN hZ앱%>ulC'_Þx8Tٗ {Ƴ,RGPbcAC!`vNq=25ZO-hڎ,"©fҥFxGjaƶ;{Q*;dn t's:Ѱ7R}Ƶ= ֭(^!~t oOԻT:(k`6Mx`5 M<2nw}cC ѴV])#,wRF͑F Hf[QgZap_ G0\--'<=dwU9؏vB POF}h3^>ZO\5Ӌb|L:Tj,`(c'>u/i'e @< Pyv r"tGCZ0/,XGQAfAY(9fudOIZw^4D2t7ߢ |l0pb8@2aN}o$h=գjtd_"A^LLe\.Xξ3~LɋpTe0>L8ZNz} {UT@ZW=A}utu;tv(UExSWf6H'ױux9 b9K{ZEOcHY) btye7 78STyeazN=݊@Z(U\]݊@z ͗E ="&7y2XHy%ʮ#hyk.BS!NUizh^4W%3/ҞUHD˃-a-mE=@Thi+GfXѰA(ˊ]/(r :B4Y24DK D=umd'XEכ6Uٺ*hUK ^bXE+R K"~E 'T;e9 WUAz$-Mn JKS兖0U Z- Zں B4nQ^Qt_Z"waSy"I*Q-oGM҂wF4FKD2SBQ0rTP^Q!͠ ]oΐb4}GJFVQ\1RY"l%k`VBMr+'\l{#/ܣvb/m'ਝ֤$vIs@t<9DĆ^N_\YU_Iy-Wq]\Z(L>".3+9b>{(ͦKE%͆5$,.<=( ;[NŻPMFPaW"H6gpyq@!T  2]XL)' i;*e{K z<&{L0h-ƪ[ŒZ{ʛ%4; 帘#TiʣD kVxi\#~Lv-0#qA߇_Ty*S6hYI@?$`Űq~dbBZl%*RN‚{K>$A1dyi֤E0 !Pt!k{KNiP<6狈$OLZqA`s+3dr1?'9$D;IsIpir"9veڱLr%Cgg]";S\.83@1yoshimi-2.3.5.1/banks/Choir_and_Voice/0068-Vocal Morph 4.xiz000066400000000000000000000062561506652756400230700ustar00rootroot00000000000000][s۶~ϯѻ+$騶<4|,% )Dꐔcw.R6Ѧ)Z .ǧþhvv߼rvٝZ괹2C~_J8{ަW\߰7\^l-n{sp.R~KsCۭT(Qc=0zyw3]ϗ [yߵWW>`W`ǟҮ'N;~fnz3[Vqqp,ǀK! ,6̺e8!0o8nlIo ɰw;{u qx2$ɛOlB$Oਗ਼/V뻏7:Yn 9oxۉ%µd:NU|T'u4t/s2VzYg{" HĶ;-P@ Vo4b׳c :of/3f8gtS4Ȍ>c5<ҹ`Q^۵c, >A,  ha>/?#SeKmd{ό@.tJ ӢƝ>Zb&>sO'ӑd8tgOobXaTЃ&tGB0윈qg[2|{o"?w\,"+:`â ksU+w W^ya>3 RaO&*'sԻֵ>Xb^Am8>K@M238wV p;Ii'H%c)}^ r!'jIts< ,e9^Q]q\YvxrY խgm$єǿT`XDHk(YDj*X"~rBM8PZ @(l$\fz2B> p4v>i}:@IGiEP(T~I;Ht=Yg:!yow31Tqܚ}pG(&~ uPIF/p d$vMc,lpM ٫X A v0j"a{+ G[ !B %=;2=ŚK;E!N2hͰqGW9%ɮ!Ҽz%jpjhT'[J]ۗۺ:u:SM'HP|Cr]:2{H+&0)֔zqc^7QUWh"t_MIZGNGhs-t /(hes,hf#qͯnVdWFk@z⻺fXcB+HRk5HG8UkLUVZ2)sʲ oeS2;>u*C色hKZ* Vl]S,hCQW2ֺhӤnSPR:*D@dHga^e.SajeT2+ ](OL]S,iugRV7R+ 7_l*Hc}hғ5RUH5ի RҚ,tWPZ.|KZKQZ AZճJ1z:l*Fk kie4. .e .]e{PZy(lRvYd vd =PjHAz,tEsWmFAS\1Sӧ6,  +QEI\PObF0 j'YvrI樴$vRIs@Dɡ&j'pVѪNV^)/)/0s(JG%%!_Lq$ɺ7M*yr&VH9.#q|Z/g hOs(H26=̌J8kHT"l|3 ) ZN](gO�+Y]ha#0&D0B&pRl95ąCGbݡT,jKAsJٓ<ӱ-7G)ƮzϷ,ru9'5fT3/m*GHŜ7N(JyY`ޞ&:R;HG >‘ZCug2e%e%e# EF`rIbxq~rFZ%KFd !|(4H-!'ؒY&Ⓥ)Ӱ)eIR&j@X=3sv 1´c耒QjމAFlqBask*rf_GA.y-1w l)Tr\r49<;L WLLu!%r\5!L"Oz>'wO@h7B7ShlPSEME7A^E7Cl1/Sa7A}TVivꛝzT3Jn1 0Pc *j@'}A}z ,r̺Hxgީ)Ӧ*h2{f}p}~ MWzaU׼*Y >KwM,Yz}^gyMtU2NRtvޖڣ 5 疞qLyj`ܷ֙ 0Ez~K,ą :9sX%4qg-Gi7?HQ &z\%ٝZ괹2C?:Qm2yoshimi-2.3.5.1/banks/Choir_and_Voice/0069-Vocal Morph 5.xiz000066400000000000000000000064571506652756400230750ustar00rootroot00000000000000][s۶~ϯѻ+$騶<4|,%m¡Df#:$gA!&e^Pew?삻۟ƃF^k? _߽k~\\ ??I'83ǎm-(cw wMɞx>ynѽ2~ōs{ChpOMrv{=^\ͦZ 4|{k/.'?>QH@J|3Έ[~'v|=YLnit[zgFir_bwY;7.),?h"1 vtoEANR]Mۏד邊y2Ӆ!nM:wVJ'MU% LVeKM:Z6N+2V֎m8-XD * hms E8j1nxPo/728asFCn{}:#[ ^95)r}NJIgNš.~EʳK ]\->^C[=4پ I}m ^dJsYY$0Lwɂ%x"%Z Q,d{ p}x 0pFԨURMm{++]N؟". ;~!p'O ureXLDMl{L"X`~M丳•Xqih>|Y"Om&$ .el *4sw Jf?$'Wl~g`i.[Bh7G#h0u^d<āi?v.Mk'Ԇi@WК0v9#٬Kt8QIUq7r V*c̐ ns*Q]Nq2=\9nU 2U`k(ђrA*>U66 m,2BC}1Bȳ69 F PT-@a-'#dn a[(§6g9!Ed(J*/V]^}ސo3.Ti>c.#8:G?} uDžcڊC{EN7L:rkz:’,a[w"V o0BૻVґsFANFT9qZ>~|`A&u\lAX>&LZ/5Wƺ^h^ME?n 'Qt;ж]EYj{*cz+z Ukr) \UC #@ۑۮ6m,^bC:w;DnKָ 3:,Bc%)#Tի ՝h jJֆZ*=\\UWBWkǼ rT=Ԧj6GJ6+5 D'(Uu]JjmKV*R!4>頻WBZ*6(rTbZb%DzUA*1Mݯt%FY灨0zP6UzUatҨ b*[VP#X/8StvvBZbH;6S%VtW_i|J@:ݲ %)}]@ 9b@UUzNU(*6 mfBi}gi]ZDim+i]sUb@#PY6yaV e]i-@Z3tAJk;TSHHJis(]-,TGBFGf'696">+=:j">tG<'ϖW+b9WC͌<$qV?@G b:,~exZ~t42DخuF*v49ĉ/o 럗;@>\EK Pjbd>a9^w(|]ON/+D>"(V2P>aE;HfN@&k%Ǭ ZX]HA=)ZB+RՋes., .xne64@vc+V>ӬG6GqR*`WX#$){ϛs,(X˧e zsϯHC־;RF$R^Ca)9.xH4#E#B~c ܑ ikU;R!kCu{]f.EJxEJBB$x2,}$4JtDdJ5(\Hw- W<5=tD T(#]v31y0_a-F$^"l(I֎U&Dk* ⼍vogӫsrC9Ŕ~]K歌cy.x2VG؟_.)~f:[,)ܶkBPX ee]bȶh>Tt[^FdqLxs$w-E\DY+\}먋b^P [PNjNNR&ASӆ?zJlwhl>N,DB˖S(ĂIEEf[`-#uLu@c"s!lC熄G6O+puHhCB,:$TxPZ,PDŽ(cĄuܖxۄCإ/zuq[g }.D4n݆c;.:qh-닮mىZV֯~Wmʫ6pV^ͫ:nks3uV˫߷I3߷<}m<-޷ 8YuN=KЫک/z jv#KQ;S' be3vkv *k(Oz0RtSgXeWr۫n :VGg7C.E奃F{44$'pKi;Q&[s&)F0)_]Cą S6C~ /~ʮkϲ]n.W.+՞\.w0T s /H{][&k֮%[fP!|;f73 nPUrJsL$tf.@ h'83ǎoN+&yoshimi-2.3.5.1/banks/Choir_and_Voice/0070-Vocal Morph 6.xiz000066400000000000000000000060221506652756400230520ustar00rootroot00000000000000][s8~_¥P@6}Q9F$M:_GlI> i{pt|:'>Y7hin6K{Լ[\ ~כq/h/s#vwONS|zvE:vcDk{{n~ꇏ=IFkjx45ђ>IF7az̦{_7<{C?5G=]H0c{O_hl7koFS:F1ݎNj<qc?t |$^6$͍MH4 FnC=ЖYB#BW+HctuC@~$>(s@:y{L38%U5w邛gan~;qFc+ȋ&\o:CEB*zRj|㩥$vl)BDj9+[-p%X^4T'B&u]>O=~4 .:fo%ӣЅ蒀=)ޒD4ʀG Ђ̿NPH (`BLF7WEa?kլa!)O ƕȥ1롐^$ZcF *u;y$d{&X z"GzXoɠOԇEG%G;D>!w[ʄ/G*T+^2J} = Aɶ+|M>:$]S;ZN]: oHC}DbiBfV{@ F:(~|&wmZY|x˜`M$~+u@aJ&+^g8Xmk۳Dl>,{i?^vng 3,F#>fƁ^DYvx7۵EqA2j㒮m#.]E&DM,}[T]ގu7-4y"ũAHIN<^ r{sg3Т'4{diB6&U O8F Ikfa > ΩpQX Z}3 >YA9&V Py rr;"tʧB96QiF?CYoF*kFX8{:z6hd7&6"3o& UHEf93K7>.F? rڇpKpg!y5q c*B]8JPC: Mo1*җٿWbSrRi}bw7}Z|,5yTotuԴQ;QȖUzjBUv Z說a vj3l0*NztSI !:jԁIð'to2*t*^U*LtVe[14C j-,R%kh|QME+rU0z2F5Aծ͟LNzVD[#F DkіUݯԡ4Ծ]AR%[&VFDF׷4AծͰ<AJf-0bRk0:Ƌ}1zPi׶7zq_rPWT5 ݝʆ5t,N6*!ʮ%GuBK@*i9L6) ?E9#JX𘕉i|@_I'PU?JJBW{xՒ='$~RIs0ΔCM7hsp!۾JKDU+qI)ǯbԂ}Q+b-|ءV5R߿$6)~,gt%MsV+^otH9.m&9tATVtf2p b%i1a #O}`G`@IBTZ ] !I2bĻ21FېHsц1S3\x:`eVRR>N"w*ew*z4*R0h=rVc&=m"= xyq\LxSS:=p`.nޑ˩l _1|B:yDH{/-4[)dLl [&@x,|ᒆ)*LVnF.8I@M$8!:h Zue62p>M'89m)L[iy7l)<#\9W1vewJB OHXA P#)ayߥ Be8 F꺩Fxc!${+-a-? KSoK7PĬ-u qp|\&i)%'tu yzecNڜ$6'@EvqRt:}9 {L˴cR ˡ*K!4\ԯ|)#Qy8Rǟ/OzgǓcR_A1>xP/IJy1Wo[$.HҔgq뤍 Hh|5%]bNGzx1Yy7w,%Pϖ1+H ױnvC-kC /rϙ<, Q~d>0ˀ-Xd|sy۸Ɠh2˛ ΜW iֻ[\DIM;(fzWA, hNLfPWe`28}: žSv O[/\DkpkHf6ꑐH݄Z HW>P^@}>5 fD;h;_^L=j\,"¡Cv3.jkg}Cs>~̵0Ï`@cZ̾m^[ƭlBl)bcR2|Mk`N;, 馉]kc[A$erjKx*Hv-O& I? Ga3HCfiELzO闪 Ov!UAZOfsiuQ3>uΌ㓅:(cUnv?Blȭ3G,ap%m@>pCA}=4e&ʙ&[oh:νej-O6xsB*&3WP?!9=vOnƫ+ˋ?>9LȺ P3́bW6YY/KF)LWd&3tf89(/mJyfP 6[#红l{\1۬)DT,WMڕ䊇ʦrr=NOhX['tturHrCzS:\mM Z]xl$G#ݸ3iA\-^.e07ss43GZ\v>ҞT2+HES*農Wxo!Q`QBxo":6ddD UMeZY%X52)BʧʪXѦ2 讲a`%)/:ܒt_NȦц:+ESȧϣSĨ +_JN؏(L{f\e+iKY2([beTZٷJϤ lt: =e-I;L]e~&he5,I+[CaP fRV Me$]V֪R&|OS*_hv=P֓em+Zݸ Chu:RV֩d(lHף&0L*KR̋`t_hg!PF7+[ȕi\ ASQ"hX4:.\~4l4r8Xc:lkJ`۝r 񴣳q8ga&Eףda^ɾr|::^CW!Dz0Aoɍh"nl:"TJKp]d I]i`IO*#0+m"j·*` #>Aفʆ(Sfl[F<#r},M'*U;\r"ecVbYSk2ηPC-e-e% 1n|qIDXaPdF,w}q+|]W!/)|.=Pڲ5hyӰ",f Ma_8aIEb(o.m,Ex o%{T]u9 4L8_[!xŚ)9ȡtvP"aK"r%&>@s8}>+T?^8U{J9JIZ϶,;2ffpF(ք楪7aTK:#V M97tsF.#e£#9k!:>(DwKƽe'(a+Dul㤂0Q}ҴՁzJtxmZ#b=%HZ]WN @S=EA g{`)#fg$B|>`m>㪞SkN(gHO䄸~~J닣g _('l1k2u^ҼtvrO$gQexq3] VΙ5@(SKhViŶӼѽ<`i("Ke[y{y 6<oc,v~f/uMoY&s{Yt".Fm gֈm<_ ׼M6ymce{/0S6WN}U<[mo[dOP<'tL6^%80[D*=^'Bym)h~ocszMﷁ2HXַ1mZF1{M]lkN^;sUż29):89mFgx7>Ai榙fn 竐7'VHI}1{ 7QsL$lrw$jۏp3:-74sɲL8`JH>bq|)uc?s+M374s̍c%u,?s4nLZCAHf]t|KcnZ&8˪SaF"XD7M4qM7M҃sg@K`F%8 &n?4qs S҈5{=1ks]됳6q$lF-7D~̝~>WHMB6ޢvd:t13w<])w/K/;.:gh>2:Ǽ<2:JG&]'TI}duVtq9+nVQ\":< P#a?r0hO,yNgd͜[C9nz#XRq#[}R^ݗ2﨔 hxtws녗x^ Lqyoshimi-2.3.5.1/banks/Choir_and_Voice/0097-Dooo.xiz000066400000000000000000000052001506652756400215200ustar00rootroot00000000000000\[w8~=[sq{g'8ВhjKIe~%$[Mz}i H ̗_Wڽ׍z,vl|Яӗ^ g/G>y۾,bTV]~q=S$<{W]ׄMti,XŠؽ˼%,럾᝻rR~4 <'jCQI5/m)HѪÔ&`6,0羿ylݙбanlONX50 A$7tN#rp58FWB{4W)ńF/V!F9\;zalVKX>d:c)ct!@( " }g,Z|#Bx/dz=9Mgb/7X4i].k"p>zyVVkd1[/r~#͹zlᰫ=֎ wu}_[Mƫ/xj~hآidm҄ aX)O`Nj\mBϟ,$60|W]\'gZ6+vm^~j٢EH_Ku*B`ґq` ׋j5>+_'El^,W,;fx4 S%ûĤaD!o2IU6)wR˽N&{[]*̃2Vg Nl. ,0#$A-)5CBU?Yk8 Wt2 ߬*+DT"ϨՑiZ}~SM$Ȋ'M'\/8ԋsB]o(e "i]R՚?𽺠|kB`dCNW>?fq2lUz8Vx)5" rtZdDyl$ 83.9޶|U_qp0T}bDڝ,ZUGv]eUQ,hU 8U9%yD^ݪ /jwWQ+$h"eeUq 1L ~ lOՈ`5hEOJc@ҡjDtT+W-Z[K^EӦR'JKQͻ4mɍӛ bpA{`  paN{\O c`p.sȼDž {\8.YUŅ.8X[[?$t{V# x4u0Gc{/XbMi5O%Gh[@rc8;{+F'[fJ:~{eݗ^~ƎT7 Kn ?UϘq|S Lѕx\u%&}V]vdDWjUܩ裷 *jjoP;#!Cy;_'G~qa43̓>ʮ߄Hs,oH\x c碶uD]4/[:v2/57b$!RS"C%E򥁊K;{I4 -|i!A/h@(MK&/ G#D~IV~fĴV%Gf?xy(Q_9?V[Jyoshimi-2.3.5.1/banks/Choir_and_Voice/0102-Vocalise.xiy000066400000000000000000001346501506652756400223630ustar00rootroot00000000000000]w5z~'"k=yEIԊVlibk&g -A63Ǔ_Vh4{@hcbϽ|}K,V˿{SY.=:O6ηs{0j7RoN,v?ΟO2l:m..ϯ޿^_\]ҿ65=OC7߻?7{?=~A?}}sIoe~D3ݼ/'_/W<]Z~y7_}+noq=_~uIKoe}ݧ{MO3 })ÐA})>.Ժ➞~)?TwKqޏ m5w E|wj~[˩XMj-i}k}9qٻ{SzO)=Ӷ$aL~O,L/FIv,ݐwwͶooѶI>vyu6tpwo/91ic K=Η㊔5hWnW %Xn? HY R?uzYlLo?=6_8RRZ6[FO˛ )TTzBvwEÍ?Rޔ|w|#OsjIv&^==?D8fg^}ɒ!Z8MnIӯmV rQ&x sWޗwo·lL3Y {?g ~Bqoֳ߱ymv#υQo<Oϛu:׎mӟ_G1_yxʨlYW,|xR6y\VXe0+* /mbT:?g2k=ަ}|FQDeWfܒodQ1=?/Bg'y?OMYכ4q~6>rG2љ(nQYy|`=5}61\.[ +gk1l? i}Sȫ**U L|h|3SL\폴+}d d d' d#]JG9&5QnEM`5/g5D&5Q0*q hXD&70JE7M4,naq hXhXhWi5na&oaW6na&6ha&6@Wꠉ hhq ~laǔrS>}Px4L|ga0а< 30Yhwvg 48/y۰00iWQ$htWL#a#ic$.c@Fz5~lQh|ga00]* iQq4L`Häu= KFTXXUd!dR!&~mdäw;Iv{0@& Hl 4l"ie=,IGXX1P'1вk {,I'YV{$5%U-JU(S(<95Y,tM&~5kzGԝ LRUGkқ+Dڣ%_XـOyP)Y6e&(>%ۤvbG(/S|-[I(5Ey(/Ki`*HVA5W kQ_iku@ =G1Ca @% z}9>:*>zJa Ti#}:q#:o$q丩nK&D0̰@*0R *DtIcQP S;*CM*Dzb1CuQtZ(< N\! PEp%+-uq1#8:ڠ-L%* TZ'j . TFPAPdqux*;*)T򨨠"aaPYANE #TZӧ*.T*QyA QAfhQAPAGcTYTdg#2U*HbPT PAË=9Tf-@GDg*xqqZAZik]i&9l|X I!Gj b6F5ѶĨ ZlyLup^L11MJ11H!5qPdc8U 1+_ LJ~KLY1-W ճdi`^vj A6Wިv*Kک,j4@*|5`*H@~F֨A?ᤁ,Eg didD z3p@Jp@FqxYg(9:ԁ,d n4w7<8V,%1*)F M[axd%F{++Uzuq:ej1 rAf_>0 .ԗͰDݟp?Y_րK%0D^ |R׃i@? 2͖p +`iMֺBB}[Wg:P7P7Artn%G5#'Qϻ0e1q\Mփ;" C߃>񁒝(YLO=3qڄf!ހonGL_±@w x#1s iӲljʘc0:(tغ!*(jlbٟ(p0$#4wM)Ѹ X]*~h^>Űr= 4 CqсiYt> |fZj0]Z t@KO|'Yɻ> )jEvyxབྷS&a^E_8} ӭbfAN2Bq}rC9\BKL2&>U+{Ui?3^kd38?Ω] =)q2;Rau*lz 8_`E_6/GN <򿀓j{?OY~5WwQ2 kp2 \;Df/-UްU LȢgJ-lDek䚜5 KjѲ@5peJͪYO^R7hOF-PA̭(xDR%͜4q?19Fj{*^ǜ`#S:GyJj؉G-;䐧Pf{=<%jm/m G<ײE~%VN|H#7)@ղ%@~jIbKжxI{{e"T,R{)eҋr w&SxdMDŽ/U{udŰBIUzQgu \%erTg[0.9{WRe~P@-{*)4|ce*qnNݲ%/h[yȐtL'.в%^Œo?%ex)eI)V3tnr"7ɓWeiPRC~C^6rǾkCwl t I'x\:[t)$uI.oը܋mIwijxznF?VequJhi10/Y Nc;dC {}ʂ(u$t#нFѸu\@:TV^GHqx]/zB3zTrBɩQǴ*GJ2y~nv={ Z60$Ք29:m'W\v#pwWg^_!?sp^= 8Edؗ ADl!mx2šJ _h {h `C(h gi@ͽ~E.,@C@;( 0k!@ i@Genak>9@ T%Cz׼6@ N}mKLWp䆠e<;01RM/TQ.f%wMj@o1+ zkq,w)P>@W z !;K;wu^5WA?k^ϛ, <,|ϻ^~=;:(Zήa1Epb;^D_p}~hzc!/.1eYUxƸfVZgb݋YB/( g'ۛ,@o,_{sYUŸe:'h0'|5j/`* Ʉ|4 ,_go~V% F, [ST#KW1n}!R8|aȱ~r ׯSޘ /=\T| &()yC|L 2F9P$T~i>ՄMUr SPYt?jB/_jb5* )F6)*8d ^<^^"jo:bz3(HJ3iWfm~p9[]4~G4#u9o!iFڮ6ijG@ՃyieMɗ|]%UQWһX6R ?~e) jhX^ɚ(J\IVEztq/f?.;5c`"JH eXMt>tA䵃 ͗4ev$sӫXnKA71gBϪcבW+]cl?ǽxXr&`4V0G<~g*D s'$\Y{+K|Ϟ68:IDLV4F)XhOѺnH13|?y|)~T7_g ~S\qs8W#GɄ66d;֍N颡؀-i_P!Kż4g.Đ+0;"ؓ6dM[ἢ*cfx_l_ҍ-?Et|nnznr$Szv]\4+Ԙ>W^XkW#r בuȺud]:.WpY_ukɺhPMt+j\.#Cn^4a/1c70֝]FzMHPM4R375naԞM4Z*b\ipFywna&F hA #fwnaĢHjQ_%Vwna| 4 3A1R@Î5+^Ph, 4Ls?!Yh& h&  ;րFeHä]EזB0=`#aI*, 4Lw9@daa00YhX1ROJ5l$m ( kIlΒ$k6٩p|02g2aaq 6a;S*$hfXX3а(D`D45ulP@ z{zj%zA-TZzr_M2 4Ez*{@" _ ,tMF&KC]5iՈX2IU&e"x`]7W6 l=l@XZ KKl@0 e[MjG汿+or`?F4DMEi=<"z]Q濂4е U&zEE(/ˊ)5lD=G1(A+PX1TUD>cp xK9'XFTΨ6$PࡅQQ FxwTP$Mi]q)^ 8D`AZ'p\aQ … P䇇Z'C`*Q8:PS|y1¦{#quݡPdqu8*(TXwTRpC['zè '"TX4_EX҂>PqW PAf̎Z H8# Tdg#2U*HbPT Pa(j**3}@e (?""pVxopViikUF8I[h&9l[|X Q.NrcTc311%F5*ƨ 6tQAlRaA11j WVréQA#mj 䯆Z&M)Y1-W ճdi` *zCi &*10poT;j4е OZiOHb8h 14Q#h[ଁ,hᴁIp@JĨ@Np@<ā,Zݤ(3 ]ԁ,d n4w8Ƀ M[bTR=l2̷&.1?5Qg`wFt5 d K(AS1?"e6@'g;vjl#cc3+?%Nd~]}8xkumq_ut#~C4/H (_ wmF(-(}݈C/G+59+Laql+4niǔ0d{C + AF52߈ݏnJtL,hkz`o;j`d#wuyqyCZ+.ɹYo]PNO+kS_0ITu$?`7A$7v@tcU]0wc}7SLA_ŏfW~xX>1-UGVV{pzzLG(C'IPGh!tpB#{6rXJzd4֙=,44& N h=?xlCa v5Q:ZA!bPUzq?spܟ ;(ٱDO &h,>99a@494G:9JޥeOg'Nt~ݔȭvhVnkI1>!˭~lWXd*a'c}rs%TC$1p7ssUso׫ޚwe|(v=)0ByL|3Jq5i%/B6G S/>>.yėt:-NRPy?e _9/N,{Sp2 Ј!ǰyT!NV!ߪNȢgsDxZN |,krLW0D/ENFzYZDNF)}I+g}W:^ qZDGDq(eFdR&l朦4ZlLfoO  )Q'>C|r_ z yJ ^ ,&{@uWy8Z`_vI [!ٌܤ -['$mwaZVJ$fxJY\&{5BGyJdx"{o>&|oA3@Nڴ”!aMa`Y{(y=3jQF9JՃ7BD - OIGqWeyI(fO띴l Gi3m{8n.blQte'M|ӖO:́$3CoT@o&Fnax*W-N@^Y,F^{^e&,y^ :n !/ bNR]eK$ߠ~Kie/I#RX7rx!SW_+ptIb 1\U/I 1#Dt|İ $=鼖kCwl t I'x\likg'Mty& 0?ۮbMA)@48{ /z6=ca_f!^ 9:..{=I']Et1]Xu4tҽF,u\4}學^Ȍ\@r?r,GɰebXmvbM7fr,I8dLr[!ۀ:*%.tL Qb÷"P-@?- n0Iݬd<,Y903^Ȗbd [0dJ@.o=0{ۅ$ӠGfi'W .yd a`C d`yB!p~1d`1d`* ;uwXo Ǩv]|I +jpx kc[VT X]fa1K_5P™#tH o3*78}u%zt@?Q::wJ;p:i7Qx:y\ssN7"s)WRpo@;ony]œ{&4\^5p?k^͛, y;<7%\+KCY,Gxov°AI|4׉_(4寳W?SbaXݚ'>qE& p)wP5Xف)a aBh%a<&&O!>&f r<6¿WpϓŵA Mg ~뀻wˣ*%ƓXz8:A!I kٴLQp66_wŜ ٞQ4WuiS:r?QC G8>N9P+z~@Kp<ힵ,HWW9Ⱥ WI-y*!_HsP&ɢd܋PMϓ=WWhhRD1RtGhY jcו͍I̾$5kR 7X@u +߇(5^aNOj!.EݪwpzQe ]fUM"yf̌p>RWi'D'{Zn˕wlEھs+ f,4H0UC G{x|>0 Kn[&^-<!=WMH#{ՄcW)!PfVw&yCi4gZaQy{.FW<%ĩ$yzצNМ Ί1yҔiw0.I4H:kkz'q_N+>,&SjgV!~n~6]^t)eeq=nW %M Ë%AtnjKvf*SSE: TR2aha8PJ (P'XW `VcJ]6kèr׏ZOdJQue׏u~SqOUF!e1l9uxOq%~4=;K>vyw8ܾyHZ?o?=pwC<jMҼb)Y)xoi=X&&23q/xKFMS0X3.rww4'5_`oT[mNW#XiA@Q{:uL؅T2n(Q/vbn߅߈cu&|Z,*>|]E[l 29-~^0247m[<aܣ.~^EMg=M5ςb:i?u?b zG^OOy0XWpOFi{]*fKyAdSFe% ?/J.X:GgnLQsGsղx~Ot.s#?\{PkVò`s+6^u0A7g檲cX 9UKq܋%*lF<H)+,gZ}PL|UƳK|Rkƽxz M/s7JNNyG\|taC"e,Ax:0Uͧ6yLqōs^ '`5X7&:vnEC! Îtb}Sg.ĿA԰Ҧ WyR 7Kv˦bj`:JXeuIwqL L\qR7{Z*=МXX絋f%|ڝgh\kd-ʺ,ud]:.[qYJ\Ge"#בuZˁN }-YWpr$ݹn;w&E- D\>zD\>Zwv 71^.A;70JE$q wnb&w|j-9@ B;70hp&oa&FyDÈ7hؠ 9ɐJ!@wnaa(@ r0'Yviw&  ӌcF+wsw@Î5m𱑆00iWQ$r4l?hJf١wc@tq@4~~Xh, 4L&  +BKERIš~3xga%= kc# v3TȆ_0) 4XkwgXX3аk x-,,ik bڠ :J$@XཥON@Z:&@ 7'pppoIMIHUP$M}C]W (HjxqI&n$MڤKvQYFPC)VG=uLD(q&*ry (6[2E[ {RI\5 ԭ½Uʦz#]W dmAY &CE}(@P)@'khx`*(ˋ* ȞLJwGZGWG*^Ii]qtjr@e~GZWAi]q)#P»B:{C:YjaQ eaC%HCquRAC *D, PCš։ GbCJ:j$NqChdquA *JTR"N<(]<&( Hj|wu8:Y J Td)։*4T*QKLE&<*7TFPa"s?Mp_LPA PAG.ӈ *Tva:b UOm:FSQ@M6jPTTxMo ZAX @*H] t4k4M)m (Q١4k.QсCQ^-1U~ /#,-;1*8hQAl[QAlQAC}F?A3#dDB({X0f/;p ;d!ŗ?18fbf8Pw{ڛ㟏ˋ]]2?خ>^Jr0$`"ZŗbuarwI@”% +cX #%S2\)ʦj ,@N_^>N(0em_+(p~咼b(ЎVN>uKDmz]We)aU$-&J<azi-qr1qL!HڎcV59S@KScoBX.rtO8[>Xq)p :؀U+еL&qMDr✒-]/@X>= eF 8_=U %  >'Q@UF(ۃ&{6r4YYd4S3>E > ?lpg:%}NX(\3iùՏC3?>>0@x0.ۆ.}M;&܏WXmː }WLmԛ14mi84'>fgaATfm : 49дBaWLS\ZxOitvB]u ~ݔȮvneO e!˭q~lWX*aox2A3`>Oku0|hL/<(A u`d{{xJh OI5ie/3}B5ȶi~pzQ*3G kَ"?Ir+ԲCI 'j ?IUT -ށ~އ^gE8BlO)_T^PM{5TCűkOdM眏7bUɊc%b#WE}78r-;琫DSԞ x^<؟}=oJyWR}ce/\%?]t(7'n`O-ZYIc)]ޤf4Me~ + %sfq#~KޤM8|,oo740ק,H ^GOIqhD:.R{ h#]u!Ou4,twr++Z3G!W.\]܏,7߯8eb,mvbM7fr$II9bLr[!`:*%.tTV$"-88 Iݬd<,Y902^Ȗ!` [0`Jo?` Ӄ` !`;e 00GӖͽ`~+\>6 ] O ?/%uljYz]]^f! <{cP3P m-CY0'Wf1!S勇pU]8 ~Ł*^-2Gڝ8*YGCIxg[r(w)P^rN9 )uK(7{ysw?Fa|{,\^5X?k^˛, ay6[þ/T,-@WԴ{yk:߯렟\x'krU}s +\ėv2vuSa &6S4 'VNakxX;D`ᒊRUgk.guqY`wTr݋YG/(؞͟O"nof\:MkAr>lśdϪ.Wu=B~ Y~rͭ'k]\ .&$p^z2y\@/o.8_m?φ4E(tbi8KxB)8eg^2JnNaukʪD>`ր" Eld?)5+Zv:%L?uRbIE5h45|M10cxVx4ӄX,f;mh:W%X}[xªb(J7Q#bk;nQt;7ݳVU*J:; I<ld"Ը:,5CUV*7=1yyy4牭sv=Oh):+h8ި6&OOR<9BZ|JEOR_|19fI&&kM5KXЏ܅Rv?ƈA!e9uxOq%~4=;K>vyw@_#a!Ta|ztq/f?.;55A]\{` ~$I=X&&ԣyP0X3.rww4'5_`oT[mNWTDqGUY:/˜ygR|ցo>es`+njh8qf6t2.r&uh_wZnՓiðS:}.uSJ~4hx8:M)P.]gB\1 1's>uIwqIp Ll?׫-%p%q=v.\ciw/J立k/q wY5+eu[yHe.#בuȺud]&:.pYžF& # ӣbF&9A}a2tg*$9?hW  HM̼ǞH9&  HMǖta䇅% |XX0N KFA@$CA )7'iIǨ4P2j7hA 7P'Yԓ(ZxŀT2+&i( uM&m1J́PDik45Q$Mߜ@HC]^'&bkIHXEikM< dωٳ45ᡦJpoQ:&ck45o!^y4&}wErwQ9@ڜH{si{PN% %аrJ>9tXZ:Ғ(;,-iR<|簴+ 2(QB K8PX`K;mIz(\hQDmQ$}sk 7е+XD M'&Kz½QA4k] ZikUF&kD˄*: U kضHԑ> DD]aiX5)D&ZJ jp>kH90W T)(S( bP 6 < B5*GQhqjjQ $ +6tPA=ːi]AtK+? 8Һ HdqXA 8uQx3#5Nܰ#hdqhDqXK,&TGZ'[Z 'Au4(P/XZ\ROf52/ * !(ӏⲡxQN~r99F TVX ᝆ {", d|mAu9 vB9NG9j r& *H] r#3 ۠A2Fqip[VcT_wI 1CcT_P#0ҍa}A1/P!V7ꞔlKLIh1/1/Tnrƨ bT_ jYG8F߿&M oT_xqtMch½Qy^ b4t@猠-hꠂ45(+K#]Q}A~oT_ tM~r "K75T_s1*01 ߺ aA(Ű K#{ mO8 UVb8 zM {pApApAb4 *,TFGuAe΅U*Hdž(V߿p_a1=$x/~Š0{p23Y'7|m]:dN` /տfoM;0>S 5 4'm`ɝ|rF)κ?Y b7#tx {tZ(ڟk7z/zj̃4aȁg/B*>nP!'b/!A˖iI@ZNYyEon"'e-S"'mfʛ ¸ VgONZn^ZGdyJ[QSSUòOIup  i)y.m`,^A8SR7}l!<%_(IоgT3#aʶ* Gieh}-Q'9*nZvH#7ILy1-['D 3L^5xJY\ɨ+ 8Sne _.bUɊJ*Gҋ:zUͶB!WIue/sJA|޲J-{+1N ݲ@Vu$Si>9Sv˖{J->oA3ڴ”!@9J^,r"o4ZVAҋuDvC #KeAru\`@:zN G^GC3JqaPhxI:.l{ r)]tqY Zqtךm=*Zõ; tFSV)pt9xQ5N}م6Zܘ=8mf(6B/oWw@yetL!ɐ0 e|| 3~MoS]Z}5-7 Y0fJ!D+WFL,4z/%H0w aj`]@0f``a_uwXoLg~;.I(Y{/VFT+C2?j>9@ T%CWP"(\z_勇pU2czY󄾋%o1YY~Ge7u()#lRWy렧}xޚ&tZ)2Gr!%n [fOԴT!Uc`o2r>*8>KY~Q [dIŅ٧-18=,O3V=o!C[0ugQru&<%+7 p"vN#Yx07I%a<&&2)>&f ru0+8MQކ}?XYj"z,USUai#G0#ʈDl'FѼR)x0@bGgMEx܏Td7#GtՃB_ϚT/؟g#gs~n(CŜl36)R<ힵ;ԏ}N]?!TWO*)`# a霮~]v'{'Fd牭zTt#Ԗ jc ͍ZmIׅٸ* ӳQ"JpzRJ  -}ljꉡCoQ.}mLB <}*s^#(얒(tZ=hpoχprs KgJ!w:ūs, ,&tY, C}7,arJQJQVS^'ow͟T~]gY f}$mPd\9P{FNWFmsns8%!EI`kw$dA9|hAv6E^G Ux)4^[Bޖ#5#JBݨ:/c=bNK:@C9[Nv{B~TjM"(I}܊}L XmmVsUߒ]pNݡzݮJ x"/]z`>06qNʚvǦ^GCuDF] F/c#_ 2tbA|)!Zh~(WlZe.ǽY ;q~مRb50~u}g:ljBJmvywXna?} 8 c_\~~˻uzv_3:Z!:R'][zip/=-繁o FͿڿ*-HbID(mݥ7X9Pm>]q | )9͖L@e؅4f@xz5ۭ1@ȲYhoSZ]VICa b|n%vQFZhbATLa?WOo?Y}=w/F AY aEWo}}0=]ـX%nY`> Qo<O)BD:2|=f`$x==Gci Уˁۧ>Ouo QjY rry)-DmIL<[mxv+όΉ=Ω{9:F2˗eU3&׶ i =mS]ʪ?q܋ `4Vηrgϡ?tuSf*O6Z['RkFᐵiD;UpN, tyŧG>(O^i1_g?.q (lT79/k^yp2a }X㎵ˋ׳II's-킡]؍9KQL ad˹\?Pcs;gP;`xPH;#vHbCx#H$a}ZgQi((4LF& # iŠQ\^*Yh, 4L #bl)( 4L30YiHDaa00Ij4L30 ctHDaa00Qi(4LFQ1CKE$a HDaay+xLGEaa00 \*a00Qi$Lז0QiRO%rq iȂnS!xgr9g@𰰴%G@t1"@ LƠnn>6em’>6, Ѫ,6$_bk Ӽ4`< h.dž 4ݙl$F&[’n'hX2cac񱁆M$F}VMhD`@&~cKG,}@&❁@4L\*= 0I&@ƒ1 ]EHaaI=[XZzi6D[ID{KljFN ̄M="S K+4MӶ=t\_ >7wه-NA:&D.p{#],tMF&K7q͢隸KP_"GZo23Hxe-[cgKukIOtMӇ{]@M%9&s䥉zRw-EvZ/BYc^1 OfFK( 5$"P_t#H\ȄDIX +6hkkJ H v(*(]p؆\mɕJr*DGCT6DWp"6CԜ ـ8jϨ 4dqT*#}yqATU8:qǡ2A/LPݛi*Tq`PEjhQ *Tup"gPC['cu)CaK[G 5pbQAC04*!!hLpoTD$!)5peQ( ScMDi䰴hQ-䨘&aK ?K._*((j""* r**H#]54hIsh QMJJĨPM 1,*H65EY%z%â,4,*Hv-EY, "65tTLNaXZ1EMFEYIGܨâ䰨 K#]ҍt;"@1**Tnk *H#&7**Tw#]CE nk=@SQQ“75TT **Tw#]CE nkPލPTT Avt#]>*DO_7%&%!an_$3~>Ok>/1}4x1+_&{|IȲ6q1;JA=?6/dm H_ j;5U_)X/0⧴^- 'IAdx@aA1Pl:;K (/S27!7;N@oI78k8eI Tek$>5^"}:tҲ%p;5)Ѩo@t!m<̯))TK([(5X-4v~Y4&zUO4^`42=\p4*Ld"Vp,{xJ d@Yz/%jdZ`_vI{-;Dl#? ')+O2-R{)e ҋW6ݫh|d'CPVE`߃Jj$^jT <@I%5CXSt TZ'&[WR@ܼ ղ@#8b*q -|A[tY3Iڴ”!aF=Dp/[eBvL-h G zFĞ n*?SR`kY^%hNZ H ڛaK0l. ]W><~Rv"T@LytI (TU&z۵D`\-DhY Ko[p("ց$5[ZK"\VxI=%)p^ kFn8dkU/ <%&EnkC WKN\61l&$O:e5ܡ;ZO:$^r.i ATaL.od϶t{gSb ށƍ:73fevy:K~M ..cqaQ::.`{ A.]Džsa븀utν?(^.tgҽf<5S5w@P-f׳T8م6Zܘ=ȡݾoҙs -4Yp.;TØg]vz}ߦۧeܭWIFu)]#FߗL&3pH_d}~xu j[aT/dMzPط I$[Br%Hr.6Q $3ĥ3ϫC4OX ?F }|;>;`;oŗ4NBV>*s [A ~n1(lw7f+_!_,.y~gƲ^֑ORxG٠1O5ѕ\ju[uY-#GZؐp~/4vt9;EIPi%9OȶtBg^Br=s69[CD/R[a/s皿aF.ݹ5,p!IubtiMrB5}3z5, hK;W ]%j^!W3k n}HS ~'\Q 䖋H0Zi ƚ~TF;IֵC!K]E{YA?~=Keh~sA%k+DvOCZ"-ߓπxu}۫UvÍiPp`"eVNqEhі"a. o 3(ُx)^"&%$·-fK- K [nnLn{ovjo+UepO:p=I~i/,H?XC9~Q P3Þ:[̱Ȣ~(!fcYFخF $7Fux:ʇFy<`kIJ]Z fWaiK|Y9X@XH )qbꉡ@S@gGU81o(R+S9#D Y-rf˕2/?94pg(2AS) mU/ >OgSÆ4O=dR*tA 3S2F]*d?}#B2s|#B,?d.J8{<X\̭c;w7b"\}Z,*(tTl?v"Q{ShPhx0 in[Ѩo*QW Ѐ'82e5D=OM}Wueg4ls`,xNd#tʑPj$=x>G:o87@ٟ4kq4WqE H=[m}%,{Tl-+7Um}611-N<{>zWɸuMW+KnU0@}8$=/Lg٧ 8bK ::p*|~Z-=k5p\h84pzzY8N984C"8y"$~\>`D"1eK}s?k缬qz9祇( llw}^2̵ vnYb`hITKH~rJ\+U {h(kz ]4f'l\hX?GgV7tW1D9f.ՖӒ2Y*+.\D!riwjL立k/{M GOiWe) ʺ,5ud]f} =FSGe#ԑuf:heH74}VK'4Kzj<ޝnwF% #zņ6F% #I.x΢00Q/Qi(4LF&  hac4L&  =˭a00Yhn ~m9Z 5\SZ004LF& #  4L#H(a00Qi(4LF& # i RQ'oXDaa00Qi30Qi(4LTi(4LF& S$aR8B& # Aj ?oS.00r9v=!%5]`Xh  ň0а)Δ Tm&d $KBH;KMɠ30=Vh.dž 4Jy 4l$FDڤx?4#)l 4Lم-IW~(MXXڒhaaqM<6X(w&  ?0=TI َhs; w,KK*!+&@m6Pb؂J{:5I(=Ӑ))\ii#q)KR'yKd0Hp?5tM~rk45Y,5\뛋v %ENM#whhd<,-ږ5qD*OtMt-S tMitJJDzsLK5i)O#,-|Oį7{#gM~oQS/bRDSJP&"^X؛H7 "biǨ ];5Ңy!*=JgȕJr۔Yh#(e  5^AC;* Dđ։KEP QCN\8T&iEM2MQ@PP JUmhmP ҭݡ։6HSfV _QF%1坥{"ި DuCu9HEZMe6áhQ-A8*&hrm /E~oq)(j""* {|5`*H#]54hIsh QM ybTTp&E$â,m{(+K( â,tMvM,"䗅G Y䘐Hd& qB â,tMF&K75TT 9qHPQ½**FE Ȯ덊 Hר-e"4&ҍt *|F QQt#]CE nkPލt *ܻ QQ4*̋ *ܻ ]Ӯج`P_\l[{A&G̻Ͽ,>ۭ/i k5Kʸ0C~ >1œ<EmC'hm"+@Rx Ga5x~Kc=K橣oc@,%bi34tewڝr{bh+reg\HW h3A)6+$z˥\-"hg,{Y/O]g3JktuE]CwbK/Rڀ4~wsF. K3^E! ~X,`Umxg!0[Rz8OD,j)xأbTă>ǡJ}H'#BbǪC2OcB=saQ-Q\mkzkuF1cݾ/JAOEǎwg;J(Ԃ/qAB5" Ihv,0Aը|%{:"H2=gecƲz~#CS.]auwI 7ȟ Û&9z 2 wSbR I/"Ny/&ymdsCǘ02^#OnںL}!|0}:tҲ%p;5YQ (6RWT*gJ q9]_)vi WI<:ML@,{dp@`2UXE<%5@glBTyJ ꘽@["G} [`_vI4 i!$b<gI@?) kCGjFUOE+d4>c2J^(kA\%5S^< *L[v!WIxҲ9%Ow >? _Iybe/|%P-{* ;_>#6*)N^Dk`OJ˞O);ӪzJ ML,L)yi[\FIhO 9JۍPB-z(DVVhSmYyJ :z-KI6rI_]{S=l -Q"P ]GON~A{)bs 7<jlTV!&шǾ:_yI~;K"X ye*u`:Iw-&y/)$Ka-ML^%@5ܤM{mzI#"k&DI絬;|YI~z>na VøIO*0yJ7iY7 %mmsK xzn >V92CquJ]ȗi0/Ynjpapt,H S^GIqhr:.t{ .]Lt'pvu4tDqr;+m6G)W/U1޿CoR.$V5N}م6Zܘ=ۻƑd~~ʼnyŒΉ0`b^`<) Mw%T<0N]JYYyIoқsQvK3gI<{I H{}s`fyZܾ߹8Sߓ;ߟ@A] .7_5Q\ڊ)m 0raC}2y&9fiD'4 +^CF½6!Ws~/Xu,T={.5M¹hp >y+ @:uP&03U 1gՋ3۳33TAQEl v=iLV#5 f\1koTaޫa-ː3y$ َp ^6pIe7$>)Er |7"3Z[8(~Cqj}8m7to/b 8Eape&$QuԖ"pBd_$mS 8ۧu*WnyPF5C E8`9ήv=zqZh0ĂF6]Γߠ|u/Ƭ.Fk*oKUepg~w8Nkij],W41qI?]fش ־$? ]?s(D?Dr{ZE 13w$QSe{A!H )\jq]6HD~-d6ٵߨ9~ !IKk*~4Ǥ-v@2ӗAm,\QH )||P)Ee8*BLJ}vS EB!:<+!y> p. p?X=tf>nnA}SsP,?[S'vaSq1 oixvc^tI>WOB\f͇]e?`6JachJ@o6F>D4Jl!5ST7 )7/2eu7`j 87EG=Զ~4|mz32=IOQ+0oBҖ塡a}f?u W2afrok5B'~)1{#2c@/>5dZ5`r6zF|c3gIkxּߛQ# `+Jp[FGq/XnLIL|HaRx?둘𸅳횭>Ygq_F J6n^bБמ 4כּ6Z;GUQLGEORɊcG\j:k6 @pF- #*)ɚf HeT7:h^90˘/`GxB/DX't?dhQ5'P`_Nt5 -7B ͽtJ YN8O3Q.kqGT$0LFgcvC֫-$pU{4uⵋ0S|ڝò~LY끟Uҫ 7,>ڝu:jwn]QM+j`>^ 70$@C@A*hT,ܹoh;=Joa౛hܹ|;7Ѱ~  n&Ќ Dhb[s$UhoM40||lF ,0[Yf4HCh,hF .Yf0>3a8,hؑ >6a&(iR^m)26d 6d4l('[f4L0=f4Lf4Lf4Lf4'$wßJP֬;s&Yس5 EXX"0iWyO0q9&3BžX 6P5;3];164 5wzґly&0NH_Q'c--93҉5f 򱪐soIMAH3VY]ߛ5qY]Y]g>j7gMڤ "zIFFwgUNrƣsmUyx!W$R3E2ȧn%TlO [2Oz`j4m%Q朮\@֖o5xa&+S\ +p`7f͛hڹbEs%ٓ@Aܝ:0s*^IӺܡw̯ܡZBӺ+'\@=8iZsbgNk/!Xp|b0" 'nEHv@Cq X⎙Cw ~~l)VRDWCuA;prkI~n;VAV)>N>rkeI]0NoS@Mj'@o!sƒ+wB WdW>MKr2@Ni&]E;%vBN \e 4Ew=@EEf ^Zh)rt%bQ%y}mq :^ha_Z_Rzl?S ƞW7O$;Oŋg=8^{N"v - >QBb=&dO> F%0zi1Oha(|7`8L'=f dY0Τ ̣Ɇ3oQc0yZ n!܅h)-5 yPfz Q?$?EtzVK@!c]2GkG;hCM#ziA9`ϏVyhZ%[2ql@A=V6i|bK'uȠWpayXW=L.3$gW'vE}/B<Ζ[bw"<)*Aox<C:[;P x2^0Xa.P~WB=uB1?9E7^lJ : TR @#^ Gl^ɤPj)qU쿒k{^y2ĘSr%_S Ql"~^U!en6Dh;/}8)a~y, T3;ZD^E-Vˈ sO^~J-P"  (eQQ,}vr?Ve34 @g4=OZ/PSfáI<%դ#rP}v󔠭@PLv/9J[E$Z`_m;I 0[Ҝ78m'$UQE/жxjƵ2*p=O)_~)`j<,Bpu ̯=s tdhK*\Ds̶\%U)S" c:v+2>[ipmŌ-{UR[+^`]%5ʍI[ xO mie=%鍿ML,Rڇ1[|S8+Ȭ=(*zPY=zqeSRQkY^s1[pB'((Cڶxߵ7euTgۄe(;p~Xǽ:- #8?i/6&)!JR5Iֳ&ܤ@Kv^Pe4%:8- 7Q 8{p^^:l:IMw}KRx Z^RfOK{IZ97 W2zsn%{&텅$"kC gKR3~=_61 D:eߡD- IOx>ZYI osK/dۋy/@dhrf&oW=2/N)mca~^LOnhpa`t-@_GOIh4K:>R h#]ǧ!Ou4,tRK~/ݵfF[!WFNM*WnQZ[&G.\,I1Ierpݓ+0`|/SX=&poa\6bH$7[x$/Q>s`dUŸAe^0}0`J%?` ` +rWԽ D7'0yy]@1``` ~Z 0 &ng ` P0sZ]pm b`6a؉g0Uɰѵ@4+X;{սكs{-[0.Mh]|jNcnցPB| ٤AO(7! y[A 0o 腰s{[TpXrQrqXlօ!<`xppgOnqr |ۀ?|sɝog=\ͳX0o}.ikyk:v~"G;e|s52vuSל  l>|L+Xj+vk.Q i%#{ }r ъsV:OT}JK5,əݩ#ٞwDϗklP]hlΓ#$ϊq\/>s񦇐i_\sw(М0\Fb7!9( q;~z'Q!)0JF<|`#~.FF<OPn`ׯS9B`%`<lM`t!>d Om9h梦YF Mu*WniU3Q;nkG=+X ǦF=<uXasWWϺ J*w@ y IC觪nzB!DvVx5~ƤX =O{MG]S=va\Q]Oʢ2d:wxs2Hr DU'7'Nn6.ICLfHpOEƤw*r/HM",,dBرZyht !3RBƷdj&;zx܅{v959v5cB hpbO/BHMf͔=ʹvLfR15n2*,Z?Cx2 *I ퟸ6;λϮͪ4tqf4K6\"aaT u6\IT=֛CrЭq~. ӰMmJzLɏмjp0m"SWap DfJACAiABcҳMY=^& [gFh%!“sn~\kYMfmyi;³6vhPMeץKy\veMyy0ܢKW7teuqm wW$~`ܭ^Z!ڒyOPNO-{F#*t']FlFt.ޕ.]闦K猺WW_/Vz1uE <*IJvKv761! ܅/R8EٵvTbS'ǀ:o\S\0U?&׿_<4`elկ7?oG!;yƅϹ]>2_A-R ^ qQ&b P$O$/A(| ]aO`N4(& <9> }[̷_jp%|Q 6axsԖ>vz$ "-F[?]:xQn QOCto70Ɵ7N.7sx_,DH:z1Ɗ=&KZ>c.%Ӻ n[;(/YB.5ՎuCr˹wt6 8:2J:zT Tkbses=#_ͱ@]zza7 BՍujIu]?Žx`Uap8Rz$G`gRN4T+y¼/# w'O𑋽ķ-Pqӱ?0%qYO=\Eko5W 7,LڝOQM Z읤e;7ѯd 'S&D|2jwf4 ZM|ŒŒŒŒ깨16L{C>w Sz`象72eaN;s& si(ioޙ0Q0 3(;œ9 \jAaNDaN$ӰU@^mQѰR,`AaFҖG ,h6 6\=|gIo3,,6@ i66?VQtA~$H-xC hչRA|w6+i+gNlD2\zDaĕLa7/*PFMwgsnm GDabBΕT*|8PB(;/)ߝ)hpNጆh(‘xs5A$ً;<]؜)P)%(+WS["F[5D=LWS(CzmuDJic56j  _)@,I3Mcއm˘ѵXܡ\M!-Tk^BѵҌft4k4`0&}) vI `K)WSmjAc1WS_^na5ɮlMA|r qb1ӂ)j b.&j `/IҌ]+!صO3ғ3vMTHbPе0Çs5݅Uj G\Wb{ N.y1M@7;)Js5sJH3gh iV*?9k%51B i./P [Yˋv)=1WS(!͵^WS(qoή~*WSGaƍtM~rNē+('1WOs=1WN(!hɃ3+%PJ ՙn8fZPD  fsMR0VwxL2b%v".!丼1wupvh>,2!-LN>19Zv2(ҮEՆ`%RpbНBL3WX<0bHQ4K<"X2ԯgfWh^*#WL>+لE?Vi-5[+h7_ҵ~"),z~CKfϺvBBNS΅.]B7-#g+~v k3̯:zbv3tm/D4+{gEzV(hC&Ӈ_O9W~uGCK𫀾:C3s2xx8!;a)mu"psO}ئ1‚ۧ$'A@{:wHPfWuDK`'g,3`aӠ{"ZjΌEGo%V|::>S 9mQJNa' [k3hm&c9pvyqPdϏ <Ζ[sc/7L@Mې3 Cr%)K(A~0Y|e(RE=%.3R)%'n,ȟ>^iyVĺH/sPX=EUI\@-NI xh<=7BxcZGBП:DT_@|/mWPeKx߀:O^i"/3b]ShDXo *ɉ,)~?v/D:oA-~[ (% \$8]%=-TDit»JY+B448WI& |{f&WUR 5i t!SRd?*{JjN} ZS&a"*#SCo[qݲ=I SܤPF]n'3 ~¯p2-b)e UvљOTJ?=9WIMcJ43k,TRv8i 9%0>#_&bWRlGe_sh"Rvfu|&n'=%*hZRv 6-3lJiRl @"Ki'g9J [9M9J{co sZV<%E]%`lp_e/ko wgV[YGIH eOR(ݼea'$dI޳v9T+BiKR0_H-9/ 01hYɖވZp%EæԀnah'`$ߠ~%esD'q7&CXp^^ysތ^iQ> ! k HZJApڲoI{$z>j Vqqk.d7.M6 3?ۮݗb @tx49+@xyqu5]oR}̯uzq2M>]^ScxM 8:>N=J']Gqgxu4VtϿcxu|dۺǂ,ton=\IP65"(5 Srv@(q~jq 3*م6Zܙ=q龮c Y 5;'#=(t)_?Ln.ib{y xrct^a@l|{{Ĕ{@^~xy y9^~}H~AT{HB'm`mT=~CW) y@)=XBAiVk:m>{.F$.MvČ>8pmsP&bP/wY9S'UF;ߟA]_}@!c?Y#j9s˅ )^K7uѾ !c326{m=ÜŠ^AC9ưy̭Sz]lVny0P9?-0S^6\ԁ~]%]WN5ec5#Vŕ+c΄x]1RfP5`hMtXt[S]W0(z ں;Lm&@M?\~R&WC2x`Zl,- -y50+8@)S@C% ael$ฑyje &2 N`[qrx2,v4MIj<0aTIHLd.VvEQ|"OK/4wR!nS)976Ǯ]2X{VUS,M*6Y%>]:@ ܬC4GHoT70~OPDOgۗC]r?I>LPHY%|{E)~t >{ubt >|:|;ɴWֻ!\=>^^d\}<3@R ,r"S ^0I!gqbNzgzmX> NN!ѢA8^-Цr@=-B%=9H?)p 7Gg/sjtFgI ,}48 ,d?y,Ԍ/^fEHЉ@O:M.12`qȥ+rIqnHkEZ[7GB6lE'$)PR5[?U6]kvn57tٝCIi6M|q fՠCT77tUGUd3Wv+1b]٦\F1d[Ql3as$a)B3|(uFs3Vjw\Ϯfs8#|Իoj6Ӈ5DE>w۶plzrP_hvL8\CU2x/Wv&שMu/W\U.5rE%9rzb9uP@y(*gtt{uCyA=/H.hE;*z,+x@CG<9'(W[3V:KKSO緭e]zQ/EdEMgw:`z?/OcrieFH:7ϧنk,7œ &GOw~%C̖K@=4vlߪz 7.L7u:~I拍~1N./n.?|昑:oo_Rx_5\ I\5`NR8s`9O[e첿{BQ_!bJxȗ'p9WcL!oC:Py9UnوRU[8&$Q|S<[YnWvaA1,P+"[Y2ſ֫>?W> F]+u6n 3􍾼xuKF@-9}x\m>hyoshimi-2.3.5.1/banks/Cormi_Sound/000077500000000000000000000000001506652756400167005ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Cormi_Sound/.bankdir000066400000000000000000000000061506652756400203070ustar00rootroot000000000000002.3.0 yoshimi-2.3.5.1/banks/Cormi_Sound/0001-Bassoon.xiz000066400000000000000000000116221506652756400214200ustar00rootroot00000000000000][s~ϯ{*4ȶ<4slCKV"UJu(ڭs"${X?}ݬO>{QCupZOŧӓߟjuM\#޵Vؗ^ OGyKj}78֭7oB5i^kz:) U-_-l~qu}9Y̮֍0\{ךOAbo=v;ŭZF]AUu::'דbz}wr~u6wS={i NrOMl8v/B[rmtM@0P={IBn G Ź4_lf k@7ˏfs#+a7ce[7pai;*C ʺI }WcYlY$TPgo.Ɂ) ]|VǺ  %>7qdɍV6m8!Ƚ|#H|tMK'Na-?yw~8U7}ymZ/ (*0 a]€LaNxH݇[9ܸIY 88Fp*42qz( zΓ@VJt={rցy:: )#S&K&PGZC oB[3D\uZXV?ҪB Y5Awh{#L?F5&EܚtjϷe b#&/k*tPMAYFS 9#h=cqM+UYz^ZgFQx(댓DZګCi }Uں? ˹j g>@ 1:cQb2ETdx *N精v<1CQzzs54#Rt7JYnvlM,t㫆C(Fa. ~$:P<4k^ndÙ,0f`.3%A ^!Z\CG2f^n6ҦjysU/Oi{ h h h hG h h k^$j- Y$*hɖl Ib\pn AӬqb^uȼ| n#ύhba410AM &n0 &bMCXn2K8Q[Nƍ-Lr F..9hba0Du)]ֹ QCF*~=a#jfRA3SKk@+5\hfSuFfS >c+c,n#)hl C6" UpZ3v{Lm5 FV9x% IcYx3]20a69aMx3BC !0c((~ 6$f0FAsJCma,oAM!6h10&:#1km 7AK#jQ`|·3q2J[=xM13-hK7f'5 SrgY)plXL-#W νqӳ qnwdʛ3Q"Qc|nk45hj@S77Y1 kt1(BM$oAm$?Y&ǍYI#3sqv ! A;sh¬$0?MfI54D`aKda2fi=D~  L@$(8g)jA`mj@mcf4mRKScZj$5o<ǂ`F*7AIdHu =ǰFJ1-@S7ctXg`j|{i 1F=@ScX1FZ % "=cay `5c5r0?N<{$VCsY@'sSgqcrc>skEKMx @ǍiSvjK(bc^һnw06fɥ1}Ƣ(͉ۘHsaưFb rr0HHb0i1DPm#XSy ,+h !G|jA)&qi67 cl9u6DSn!LMI2l(5G`g}[* ^H9Ȕ/ǿ4yiUZW=|NMۣu"OT?Zåg26?PϮ7t pгf̙h`Z뤡w/BxkRHJIF"<=GfǏtԵHяĞ:ߗ\&zˋLŔ'EĔd=zL {ܣjGI-/D}Vޣ${h=zLocB=&G #֎Ѡn1tP_Pđb2B[ޔɋ`ɋI%$/"oOϝOJ_O3Gܞ7R҃k5ne@UQ Þ4DsᄄqƸg$Z)/T^^7QҤX('B]U;s5)Dyq[KPlh !r6|C㋯" 5qV`/(؞ta j9JZu|{.Jm g a|rwQaWҫDԑ\ZZtwO^Y\ /*yn)l,Kw]q;fFᄬ 'M6>,ר`K7&(T|j8cv[aAY>3?xȭtQ])Ǫ\QlHkȂfܭT4h3w V{6P8 ݊mRXH^Vmf#h`rOԣ2Z?bL' fsi@ֵ@ ISdP ~nAVgtp~-bz PU^յuWuykU] _ZzUyc^|EjLu[Zvb%;z-Y&/l0'bz`W>Vs5IP@Wx=-W{jT-9T= kC`f=nM']L<]IG&jɘB^Iuy:Hk tE=)Y@W ::)٤0-E jmТpT^/5$_BXQ0WY sH&h^OɮoZ.̋w5='(jx`Qfw-{eK׆r[]ùkal9ؕo2*_N !>T&a `Z.~{ryoshimi-2.3.5.1/banks/Cormi_Sound/0002-Bassoon2.xiz000066400000000000000000000100531506652756400215000ustar00rootroot00000000000000][s6~=Hgv[zˮ/}PeH-I9q}$;Mۙ䥍߹?e<{ 4 V,f<7. ?9t;>k47OVINn'n%/w*ɞ?g7 ,}pFKqivv/iYL*W,~٭nF&7wף m'4g 7Fk={4ӎ~Y|fk֎M]n0{a|w[fj -B Ż4y&GO^͏9g?YQ8VA` M%T~]L΅Αmϧe,\q4;9p&wx]ܮ};>w <)x/Nvt}42*$!i%^9)F #oZ["$?+hQ}s -h$s|| ,^=T:edxǛ۱Ikr z]L4LnH leI͔'/Rm'`?-,( ' (JQ`9楶.y96Z_v -suLğߩt.z|PG7[Jnj6F{}EbZY KWa82  xbhMTO 0^, :MTbw ~^emE|G':bhfҶUV"Mh=]COIs4b+1e,P(}=Oڴ`#E;6?YG۴{T V/6Sv8n5O;CҚ؎c>{5i]<ؖ۶b'$U7%"R,^6DxVea3\ofgq+̅cʁ i5C_β 1&#p$ۨ%ݛ.XMhg*ITqs~Q 61XYlH ABB[F _O`T$:4-hQUCWJ}6kgwQD;쿐}VoH|&6CJA,^CRa"#pغ2CZD6(&1̢ŰuYU ΣSm>[ߙa?YH0tecdUZ)#YC?cu4V,q1pg5bS }j=pm[ q 7Hݘ镁R Mi7&Ʒzz6~>-pΨ6ޜQ{ ƢDkogքSR+Gd:R r,LX[Q %![<1O x_\g6 s+b]f:Ux9a<1@tF@վ2@X.@PPzT{TaI\0 p k)2L&Fv iq$a`̑(쏍@ύPS#ԔK\vNx8 wƟXa 5N%uֆPcpYLND:h2'V<fOE;1,&gzb=$nYㄺ|~9,1@mJ+{a=Ε"+#*l۝XN0z^ αԜsDs5W5'Ԅ;u>d,1>{}X$Pn7Fl%Pt E#kqꛜ ơϮ(r84elt%'tͺ!۳s!㞙v)Jإ;*ʮ]`gF9Xb (O 2Q 1HB]p䩑&㩑&㴉BlOepXqHۥ9Z<ӡc3e6wš8P~ Fw9Jgͣ|99 20GY@u: ,{PA 5@Ԩs `m%Xcm5VQ=FT"#%" /s&eqT`:Ne8wi4Oh<5 XjTๆj{P5sT@8G5⚗ (; ty T[gCYxjt[}nX!3{ Af0hA6?7J'*ŭP_vPiBl!d|P:*eT*ҀGw̵JsRsT* 3"GYbՐAxT?Xg @s;G(O(KJQ`jta9k5󣰆{*$w|v e]6T; H(,z UHQu~k6Q\z?S"' p%̎SveTbN㯻Rݾo| .*:& ύK1WQnpԨI{\E6t&=cEڏg:Pjua݀9Gu6sQ݀5C.Un~],GG,_mYh*uwXdزth n,ݮ ȲV}ٺpF2QͲ@3-KgU|7k$ knՌ> F5WK\2݇.egW>3axY~?պzΰ?EK{Q\4> -@f1;X+ f1kb2[f- &;. @V,n43lfI0݄K=OOJ[a&l;W>P?lw_?.'$}jcT)nGkhZ@RƵ1i,Y_U-cM- 'ZVN0,`jYg;r L-K'Z֑O0uqUsP7OJdqC 2YѸ_^DvEy~,[PEeu1Wf\k ʫ>h@YwE~[7ڥ ʯ6?Z'RYvyoshimi-2.3.5.1/banks/Cormi_Sound/0003-Bassoon3.xiz000066400000000000000000000121421506652756400215030ustar00rootroot00000000000000][s۶~{*XiQlyi,CKV"uH*B$vEɎT~ILcq?\} 4 V(f<6ngoN/N/GG>Ez}{Ǜ'^ݛWm %ؗN_gOg,?~tt>C BiDA z8D嗼v::]\ 6G 6S=x4C>i㨩y_vz]:oT[wܭ 86c~:/h6,ΗFV Q8h-VTA.Lɰ$[sΤ:swTί{\E[Ds/]R P7@g%d*`%B /?7Vf)^~. ڸW~bmzbHh/De]$>,v-T~%4)Xij0{`S(*?kf rك {rY(M\,IƲ4j1}F,'8 g^>p}WD?>pq97]m*C}AqiaeRd?:)lRwq2 ^,?0 8a8,z:-SS˄ d:(њ){@koӜ;^+-fjiDasX @73qkݎć"++=w0p3V}:TW0xJ-`?ɼՃ W/\])ҎE{~JհZp߅δ),2ׂYR;$8>(跛M:| 4n7$ JImYk},3yl61y&&o'-<޲;Z;,HLww5q&8}8bG`cݮɃFWY56U3dUIhTGl*{+CxN&g6 gg} "h" LRij̼{ɎB/KߵWE*65wwi u] 5˹=|ZQ󙕢hPNcFNL4]Y+)c@A!yU[;(DﰟBP9%F`<-U< ٭*;Ct<8xӍy>|8w`2PU #?U--0T|s!B2tx,MNWhjn-t3+kn+!&[mAݣ=dc;-Ziv>Dw`uZ,hᴨ[N&-|9BвA؀B@W-#c|/# zeeܽk'F`F-4t++(!EF"*\{>#bV#t]\̆#j˄{cEcb1&MLScbaZw~((1 iQ;@fmkij}jsk]/9;hncŁf(A@ۖ0QkXa$10 XggA3gGAwZ`A1H>aAB/V(#N.&Q<\PaoYt%A,]$[F@H$~zĀ?cFR ƾ1c1E)Z 1eL#16Fc\m!jq3#U}L8IATL~bPdS,Ƅ}A1e#:f`$C-NMz?PS8`l̥2M12d45fĈ`P-ؚQYQia,;1FS#x㱟Ȣcg뤓J3[i+2إ윍'5A܃;՟D*fg[j|/]qC;vԘIRcM-mAnCUr 6P=(q1IHOƄ6rۘm&b1W}`Xmkd:$R1Wi.u%r ] i$1iIs0]=$dkVlmmsLh W!| .~gb.>;`r4.AL.nww۸bBr VVE-C@\8iJqb-ƍ0-1ưFRc$v @{ s j ƴRa237&ԘFSc9]:bbr`z0J 1^^b|2:g)ܐJ r.wηT[G!>LU*/{ r,zJK^&٨V\K}R&~zΜJI:ZˇQK)*ߤrf z&W-!n/=hԒ,pY썞/1tt2wKئC B5h^ sF yY**-IڊҷO+Hd$֫5Kwq}22ҿ'R$޲Ud 3Ql^cljYȒ^Jl!X"k@ףt }VRn3QZZgVz vedbD)l|S0: Lp2 WKfysdjbtnJR<]F,`YȜDJe('W2 eR8%IJs-GYYy=vĘSւKZKnNV7c6ّtۄ٤#dWBSAkE<" TWyT8̉n[W"Mɮ-.Y"Q+;]!Kbonȃny\?߂nn{P6ʹs}p{PA9S:ssɃr[?_nWU :6aӒ(tvr2y +@9/r[^<ϴxJ^4[D4I%HR̢t4>$EROt_Idgc+ 5R\n, \瓮3O,曱q'z/ xxb"O\]92~'f6u(1C@9xƃLLz<_L '_N'8e!,,ɸ娽KkwnӏJSvu,㍔-9.+3_j)V͐Sq =XvI/m Ϻ댪fUs~WqVXh"_;4{Ccc:^ WP\KBpǦ AF0n#˖E>蜻ʱRÓxXbf PO&xmof4gBeC' %JUTsxf`@nׁ -pe,֩3IHFYa$ Q_eg-9 R~#1 +z;SFdȶ WK4L%dSJz.AP%\*9~`>_ mvh=qA#'f뱣Mŗv^NS@AD^ '~ͦpIx/_5irO\tB۵MeEr\*0duaDE{i3Ѵ8|4zx::3|UlPmnHzU׊Wu(zU׊ЭWuzU׊W5O9_2KԽMʿ7M<%;|% {qUf;:;LY ikEwҏ4K4t{r˚ͽܠzO&b۟Op>^ߞBw?%g4yoshimi-2.3.5.1/banks/Cormi_Sound/0004-Volo.xiz000066400000000000000000000057221506652756400207420ustar00rootroot00000000000000]s6_{*ӑ1՜-l9CF"u$oAHQnK$ `Xo|em<;AESl8ۮxѼ_??_dfaGیL]S.z}q=724Cl|vMqc_ݹS~5 <'s C}Iz4a|u{=^/VK 6E00:Hu~s#Í]hp0 ;i6 _Chd8cq}te]S?h"*}GFov"gߵBЁS-,n}{=[r0oPf*_"OYX~c*bYwi Cڸ[ ZNJ$l97#Adx%ȕn|CQ͛֍}896D^OlS<@x`^y#EߡSDϸB<~|UEж<晆;71rhYߋkwj:%bC=G۳ϣg-;/ 5r.w"z$Sq,3r*hž,东*B: 'ë#DTKQM85 ;!Ξ%&a֔|@ͫ4  u,3#fA~`N/^$66nxLG.hIڎ9$RLk$&`vIcqNpGGz\LHIB8<( @rwJ9jC C,>*x,Z/\'*/O|/ˀk(``)tWgp;>+ Zn99ĉӮ~Ygv!@ygÙ8/wVMs{:LK ~~_kpZ] 9GZ)LcCB)i(8EɈ .*XyJGA8w22:8 P}Lirs2)o]8 r]%`#;-LH-.*$/tA*GeЅ<Q?ՐGN(TZ hyT2i)*ʬPՕtuX VB Jq$ !Wb)Aq*T,eim,= `GtK^MtP!)@j'GU1)0L)jTo@-I٦.j0u@0N`@E(_l|2Ȼ[E*yΖTn~+ٴbx`4GS '6),Q_Ʃ({ ^ IAb$*  ӫeP Cʌz gQ}.+>PWJ,כK ڽQݐ/!(=Hpmԙj^ K$$ڲGS[5~|xPxA~ 2.ޗA6x"aY FzI|a>_/* 0HVXx(k,ڥ2QAJ}LT_&]&OX]HtCia‰ڃx`iu‰Nu䣥tFQ7ܓk[1'g7p F]IXWj+u5֕taszvwO ގ{qEjoh=$}ɚ܈F/ P'\±>] 2 OBwY5NSOEB.tF_N@R,]IҊti\}6D.FZ^.uzv4%"mz4I zEX`=XQ.L)Sts hJfyoshimi-2.3.5.1/banks/Cormi_Sound/0006-Arpeggio 01.xiz000066400000000000000000000070471506652756400217650ustar00rootroot00000000000000]Ys8~_{F"E]UId5ed7¢%D"$ JQ2ͺhfvq5? ?&Wry -O)7/ԛeA.|`?ϭ`a5.Xnڭ}gIFkA[kzlD/;M|vy}1=m-߼uõ6h2 flw4-L}v=jDN[F7Sjt=NoG'sXOY:&ĒIj'4M B]-9AZ ` }x=gLx1&Aan[mm+omZTiZ+g]8H?k3yD!`ń2h v "3M 剘Ӌ|l3YZwkʞ{'f < 9c|M.ݥz$JJpJjyy~'hoՇۏBDbl-zrz 6U܌諳 22a{RP\vsohCԺ1bYP@OGP>|=7`yR> X1N+뙀ۨ/c ]ZVծ=]38Pv֝Yߞjg]}4ɬmf}\}W =}^u=<87qE3[c~=R9 +=GTM@>h*wHA>.{? \)$5ًqXxU`sԎAuugl㿘=bQ }CȪX=1{H^@N4JV#JqHkS)لtrTar4v+HSDOr`t to6DLFJK6ɌfF 3J2IV(7|Lԑ5̬=!ty>V/Qzs P/þ(K|` ޲Y6*"r s[aiQk[S;PBu͈Bc\F(h6l.\&8vE5vɞgO ׹hf/YĆȵӘ  RhQq*$aVX{*CwL+(&vZqV"cm@^WC-7C%qG*W4=Y^ƱoK8@ɰeiM^˔)U3j=f`IE}gYE:,}5zOY@Zqj6m\.nq̚qfleJԒJ#PB>A^9=ȶWwfpa.E1ّ͕ZZ-IqvӚšگ#/@ ׭:85Fp5|)t+oWڙRy溊9b><;[F+u{{*Tc%DkU,v';t`o6E+jLGI\C]aD L[xe.F8)ğ(K% Re)T)pb'bƏ {kߊxk'{F7t(hȲNUDU t Њ20(1NAO׌!>d?oƀ4چЄ=[DWaa5ah~c€% x|J0DË$ ܗwxu ~H{~>Tf*TpRsf\1oCJ)ݕM>.M/DgU~Lw JzFPP̺Vc]I?XWj+|5փ*TX ڴG R{A^$`p+wKa:MǷN~MHCJ :stVu{K'[?bqNZTAɊq*${r\&ĸ+EK5.1Dj[RKM3 RJS<.İjG)--J%OΆ}y\2ŧ#Ҽ}Ɓ:9HRÍ#=Pi8bIU`g \a+fj9}jH9Kp:?Jzkڒ\*uMaи2y +W+ p\Kp:oMB.C+KPBak+{ȽG8L6pݕ  xܑոhcM%;C!6h&mf.A,yɴRikh">u[k@|8rVZ8[@/ȗuK_>sqGN6"o9%-@ө@!_WD˸d/Dsr?YA.E߮_,e!@V0#dPw5@p* Qt*-IQU,Lp'xdD `N'Lb'=؆(N k&NPީn@OT8T0fY"&Q^~ %! h5B{`eƓY&BB `RT#88OU$5KU8»XB*dP ItC*t P.z ke5' է&QV0AYIQ_&u(3j$\M{y>zyC]/ :]-q @?'>>9$'&v:⓾`\hE|[J+h+ɯo~;~Bl-}sXc~yoshimi-2.3.5.1/banks/Cormi_Sound/0007-Arpeggio 02.xiz000066400000000000000000000047771506652756400217760ustar00rootroot00000000000000[sH_pU-E-u6lu H${FH oK-}ym<0in6篯Űq=/Y#}8,'pILoG#x 3Cag$rHc#~_hh?YO1&[zldDbIb &b:$AmdGŏ7!.lFF S?<~Pnm}=X~tk-tiyw(M|Y^LwQvԇ۪d^"`jEi S a 9릗xS8W5=,oقs0]7?=]|l/pk~B'h0WF;vQD!쩸u#=-V8NLջk@Ȝ0hK@ZT{n{l3+Xr'VԻmsw%҆3{w,/ۃD`tEEw8 T#U.=%8lhY\Hu}fx.OLZEx=} ,/L@H|7؁WsY97ύ79$_5*(6pņ+d!R *薸Xq^w66ki]$4%=bG:.r# qK!.=NXdగooGn,laR @'!DkVAP閒H@,n=B<[blW0<'鴟fb>iezf- #FC- cВKZ{mia)$Jߩ "C, cv;1&]kpYyX 'b~#涫VB=ddzA'S 9u閜Wt\m!+?gT,;$8(Yף5)K]|)x9 #j(^NjF?%,'bӣZV_Ktzw]@:Yӟ4XO_GOoSR择#/<5O%,!1](TJÌAu?"]2uK*qHoƶivƪx93`qJk_~#QuuoRRsH5UO6*Qʼn˥ц$Zج4M^pxʨ8CgB<,jiP0;e3{AᲬ]e0T"0fcM̧2ت-#=^Sj兯 &64&]VD='!cіb8MDSM]JA .#FHBq @H኉[rNzjl꒯wK"m.=jw,鼨Ӕ 0S|I]ʩ/{ij`p%%[;>Z2-̦iMZMs.0:l"A-=V*>6MGTuQ}Qͱͫb*e'jG @4$E:"%:2w:qf֞ iæ|hsdEjg9K%s} ^@XEhQvTb{QUC\=@I'|QLkzFy zn:հ^ol:f(d'ɁUL5W3oe;U5ẻɪ*LV圎ЙUtH%AQƑ+ױ^։{^>L8H^G!O)] g*v] Dg=ѵ[Ot-\] DS=їo'NmxC{4 7H M6 zX5^.5z(F)(z Y|攊-2?c~ ];BW|=~"-_%>_`3)-[ ermweTǗhl԰wJrrʵtx§OKGcƁƑWY Z%urX V:`8c.MC[L2T>nO I&@yoshimi-2.3.5.1/banks/Cormi_Sound/0008-Arpeggio 03.xiz000066400000000000000000000152301506652756400217620ustar00rootroot00000000000000]w6}_Y%[ݣOck+6CKͭLi%*P"% MKC`߿<>U8~8t><|F?~;9}gWOÃ=Gv}wwS?ߪ?e{{= 䗣B:~L~p5ϡ\w)|5䟆(XLdwl{@/FW7H|>;9*ʈZ~}V-\z*v]nvw:'NCO~ed(ޮB_ i-Fx~ ".(z^BG.2y:}GޟNyN/<}xKp4NG[МNL,C8?hwomp/d~p:_*45̟]Xhyl_4pf"yS?ͧy'5MM/5v*h)?4kXw1^", f*+.Χu\xFa5xqPhUhBIAyjqlRUOOʊ.>B2QU:gF}y>%+tGb^ޢ8MOUݳINN]p!2l> gO|&@oO^%*x&* #4Im tj|c1~BL/Q8)vl=,Eq"8ez.ei賠 LT1E6+d?1 ~H&0'EHϗ`-Yr ,1ҁ-Uinw?t鴿l((v'mS^7%ߑɐJ2P0 􅂷o e㇍'E>ǽα=*(eg^X6׷봝.sבLmiޙ(Ϫ.)yG# X)3X+g+کע2+n9q{(qLJuQ򲫫L{} : Jm**Zm~~Ab$& _=CN7'>Kď?K~bgJ^OS{oJG:u<b)MKk##6O߯[Wvzܧ mW5@ël3qDUL7D7DInCTYVfx{5N5#cಜslAw'g'Cɺ5XI"(X5/rKû_GS G?ZI>g+'_P0c!#lsa2. 0ƅĸ0@a\ qa?Aj-ckqƲ 9@&A,lG3n͋W4Y)Q93J(xo\FpޑVwG~Z~w;9(g%NQ8Q(@aJԐx%9Rq|Q ϹM P !mn ))#&ȅs,S H#ָ4FM*$,\wH#šWmFn5 Fdk}S wQ@<bPsP@bjHx]%bm[16r59]Q2't[RӔ:psyv;cCe 6;.w38o@ț0͵1 [t7Yp,,M\rAfiOPjn6EkFA-ك6:CaC 8{cr&Jh" ĭPJ 4+5 Δ+lau%inV\8fС":m(pDG CwQrA"L%+ /Fg%^l3l.J.>̚R o0gąW 76]& st@/1izjHƥaF7(pi]@xoQ}[a ,1r+B֨N(G7ۚ(-($:؎c(PC1}K\愮+f>eK g@7(Fz5,t]zE"x%ݍ_.NK : & /PVyFj!|I9 O=v4WhLû9ըSi) ԫ7*yP0sn\U!0.Z^}-0 SϾ|5 sF}'l `tJjTxJDP"6{^+-^:7}=PRh;'%Y& EBRǖ z$t$?&QN-Cx39TNΥTaKކ7V~Vb3S[b / \?q((rL.9%9VY,{'ktM4]&o'/.>oeO>{݇Wf6H"Vf#(]y<|ԙ7d#/t9ԋ)-պT_ĵ>8_՝^WLyg %&"G^V͝PN8O>8~l*i')Ol4%2 ;xckw;tRk+iwzv?UG@U|s7чן={_a&7/ﯾHJ%wfMIl ]ng˨=Ʒe67&F;f PBPp0(BH^R&kLy ^ XL7I~$Ӕ4'޶%joƤ $&^zjm(Т.,5d/|yu`|ҨbKG Hucs&odUj&c >ƪe ƚ'3Brp͈SrH4VggDXKʱ7 ߶VUu?Z<{|y/8ѳϗ8功HJ/.O'Gl9;}xa-gK'slkRt.:oM^}ˑ:o(V#sU&Yo':orr ^ Ytpi}Y.l iۜM̮Jkp4>Z:+i}yLYARN:=b_4묏U6Nfj`ݝ!SYJٍgIg/n<5o μOOѻsV뻺|zPotNWTϝܦ-ƏGtիqFjtO[/~7K6؂w}s%mZq>8_(@bJ!%b;*޼r SflUv*}k|wWJZm"dL2x:Ethdͣ쾚i2'_-_O4o6~z5[^xN_nyƭܣ޻-rT2q5>_j$壔˼I%K%uXX-V勦q]u /. z5pG\-r,'Kp2Wq(;C,5:J4EPL8g!EcLQ1YDCWVܯ0J9k+Fn>60r00"G' ӧF>FH*Ta|mljaq\aB"ofUöA\-~9۸#03tZwGL&P85IQUΨPqaTqP P8ZyA6fW~*wF 0Tz66~x}O_ ,gĚ]2$q; ՐF(`ƥθ4AʬƜ[a R$5m¯cuP!qi5.ƥ֨4*!m5TF6~GրϹքئo+IxQȟ1!m5ѷ EqnP࿆ E}[P*GՐP}[k0a%`Ge;PnHfLk(PCfHz`kRwV|,CeFiZ"ҁ s`%G\t#>mN9L s\ k0;ڱ` k0EJ}R4b4Ax6#Jxo+JFVz e r2!F=.47ۦ@tEK3]775.Fk.mX\Eyź(o 7r^X! &,ַ us.@wcpq3.d=|\5oqQ@gk.Zv7ZV3HUYw7|}DKɜ=»,b42袼x7!m_sj.NQi7ೆ\E>z ~Y=kc<9KA25LQ'8\ q=#Buā-#@WGh:u`j4m 7W㋫Q B˽q.î%k$+3&?>>\?FJbU{*]_ {z~@yDڍKՇAJaE~ ]jӄ)z @:!b*0:ɣAPRrvq,{X<)nf,tN).L BT$RʡP_fPk_jYQ,ٰ)toJrZABf[WJECg/- ֟W)jCJiN8"NJzqޫEۃIv}$<*uUf~aKRk Kˎ9- ePn ڸF}*Zk .mI%IB7Ka Pu G ?\]D%bYI,j- +vӬn.*ҰI0,Dú¬4 @doQ) KF%:)LhQiP96* Z-*EsEH]hV`ßewf$UgIaG2):ՖԗݛߔT2،mS(Dm h|l6Wɱ$;qOu*_BɶD}?9c֋F.rDg*ȷxh} k>n%_oJ2LtU}OiW2SfUb&+Q`{JR-A?X{Qvl&7$XχJ)xvۮ{w/1}{|pm+̠RI6NF9׷Ǩ3 f~ItGr)z}W d,ě}ܭT}ȓ M#]viyJ+s㶆=K<-}bt;x9/xx)uCoZAG7э,4{t ݨ:CG7э:4{tU0٣|<'1~?ۿeKn9_2zy]N_(7+e9 p[z菉wfu yoshimi-2.3.5.1/banks/Cormi_Sound/0009-Glass Arpeggio2.xiz000066400000000000000000000051561506652756400227020ustar00rootroot00000000000000\[s۶~ϯPJ3q:,ڲ-w``HJR_$H\eNZ >ZYwR~lk̳}OѠӧ8?_k<{CǹM~?rhDVO?8/nyFC.>ԫ]Ͳ>+(%.Ɓ¨6KXzTDrK2c &r[Ӏ;g/z 9bgk L}s{j|#4tJЗu:b<_$S5YKS zٴ 7"nV!Y^J[,1Mr\ѷMqC~]_Xj:_^gsq7Y 4 k`]?yͲ5jYЈwn:[[^؀WNf~.B[W !:'&@1-Mds62GUQPV?y|EF> *I w |A¬0yu3:o UiG־`u ‡,NLSz F)Gm7z&pJz FBV*-u܄Z~ +++l#Frr"[.L2XhK4Xk<>7k$ $ƳWc,a1JG˵T 2N)SW->&.8S ?Cd4-Kc`a@21đ{*OԎS-.Le`NVZ]4_ L|C$M r b>BdfUr26Ҕ #.^IDʣVRkuҞ,8B!)r2@9W+f v?A,W;rޣUdK7F{u*ڀv4#RU{x | $| Δ<v<}.rm<?O%G}3BJ_]#lRh&5ov) |}&<b,v@xuN˛TZvfFTʏ[|j6ݾt(TMP5wu@~!V,j. W 2kSy)xR$E:>U̧$Rsql{?( A5:+8 Ѐ+{%pF_*C#EȤ{5ت'C^b^`Tbr\6*BZ`TO 6Vd3vtZyϛ =2 2LT( wsxe!2"ux= g#C)J*oѸz t!BoDe S2 NUD4 tE2!dME^2G C3%A]HBv %#NC(YBYk#mʼnz4^jU >EmW淎4VxCEw*f ; 8y 7̞qu7fIߒ㷼,2/g52^̦BahrE|"Y1x7VW𵑛^$Ͷe)V>2>P-Ei >D'+ TeNAȠm^-Sƀ^BqyXQnedk+Zntbp,]G.$J)%ȡBj. /.gLH?,Qꮲhy#'wՙZ6zbsc>)BgN-RAHڮK j7Q{גT,2"N,[DH$wm%= i Q׫GR?8:[r'A7c'rnz)W]ם[<"-pp<>͌^ozY.흝A9Yp[o&-[0v -.ܞ4O^[0vo|y=:AY9_هA/?}t|ʬ-ٿ?,ȆSʺVzN';۵<]۫]U~hdFGZFGIFla瓳|:mUͳ4|k: ¯_50 ~qBjDuS7yfu5]7,<~µKgiqondXFvx]fK,gtjX 9 6Eo/6?mn:ުҜܤ Ӎa]b^?>5W ~t_An_ _Fk0?VfGḰ?ea'-a Rl^[D`qF60\m<,N3By"yYsM&:}/yhDoK|F2gx +JU0`K"75:HQxpad Bg;X;%芩Lo$r:93t~MHSKv&Yj߱"зzJr׽T5i0l{FW7Xz7p,t+bvsc{皲c_(K=!'!E x?s alʟыbtv|{a8b878#e8DdMvڑhDQDsa+Ж~0wch0l-kE *y瑕2Gubsjk]CIPoĦv 8 <}mÙ0Vh3^^sm)*k[s2/3 p5̉,3;f_HrЉCJM~l 'z{ܷбJ4'!rsp86XIϔRìA'd<7P3" ʫ:Y<]b3d !s ِ(M^6ӵH]ڵ^W~`oDooHON \$#s*݂S;0c¡ Y3g x,"~QhUSBmR,KMLl-@:q6 SLk%aSPbh,{M5]>Q)$A ![ŝ3H{.wxXy7$ þmdڜM'ɘ>b,l]Mg<˘*Z)PLMT:q w%v> s#R6:d_sK daaDeBK|jh1`9%X>ET| C,{Hf%HZ{=1m^S*\!π&N c 4ONb!26n}EmD9Dv#g7Ngc5& )>kE!jC8^Bgt-lwݬ~ M&\ "^Ւw0+ Is(^YZ<#UVЕ2AT q(qERܷV0GE2w  ˔3wsfFqŤPfIqtǕF `9Tױ+TK!>GZCJ}jSS:"A{e;RSFnx o,J;wz#מ'PxgJBR:{I-1NɴxH *:!8)6ʻ$v '+f'3rZDEu8i:ԣ'0*`@Uԣ:dzq:"ìp.'t>zDAY5qRlvIF9wg^pRu!x:ԦFxK\646fPY keV]AwLkCJ%b;iR2 g6+ިV2u<.b.VQ!( j M+ Uʨ PzHOy{1=]DyM%)@x Т$bFl+%"S# `I@6ԥn'u*/o'U+]KW ~kn[bH!H{hU v@b,HqhUstt i+2a.RbHbպwx,I{< tV ]Ǯ GIS0)ݴ8R#}&Rlao6̒P8:{g+ezABC~P?G !Տb^=L~ϴKtO BٺӊIKG1p].Gqw=BU+/\Y}$塔SҘզ^PA)ᭂ=ڽ͛;9F%K?&Jl a &&RCMmaM5kBX=gkk )i\loyV}=N/?G%_eun뮠.i @יzs}P!6U]V*n_5r@ fȤU5 ,(GZ&>* j̑K7&u2OYƜPYT&~uxyoshimi-2.3.5.1/banks/Cormi_Sound/0012-Ghost Whistle.xiz000066400000000000000000000061251506652756400225040ustar00rootroot00000000000000vڸ_X,J$$'y2Ofl&g˖-ڲ4vt[niܺaql2ph@_1~n06ܜWt[zgO1y6vnhy~qE Yj.5z@XG*$.o;Nzʷ$7A7N䣚ήWٜ7 ڋBASk?eИaF\ p06Iл|{X7xMcB˳F;vC$~粛""|۔|JU!d'b{JN-Ad82(eD`3-<&ōXӹyffۋ &]Njvs4 gB7>?e}Ty)Q$r}NJN(k#Tk[ʯ]d]O4tAUl:t"A8]m@hN]C@='^`I܁2 $}sn[pz$aT[słH\[WP{ JKkoIUw&k;Y7aAߜ}6..MY@5]#:-1CLl{'@p™YuݸvXTe798}grw2zΤ ~ @%û b^&7&[@^EWgih$ 0rt鿋"(ZTG#Q}WLѳRR1,NoX (T gU? ѫIS_^Lgs̛9^6hL1e 'Prܹw0=w-ڒ7QnB*r9:yj90 ch;<5&G~jJՐOgt_-ǐAJe>A%4\U엁&k R+7AX ^dX'&fK# nH@n ҂fš6H$*rY0$[>dV~_,wD^IN-oD7pG@"<4:IC&PgYHQg%5ʝ\|ZZ|Zu%Gη߽Y_l[׊ֶP-qGsTgBB̵Џ;ⓚlZ {Pt9Kr ?A`hʊ5s]-\~!dܥFeػ.bCRFW# 1N)tB:F'A!qگjʼQ,/$xCvV++گ`- LJi5z|Q0ZY$( uDH@xwP*rȼʁ,.G! ł]:I f:%ji9^9Q\C+ @Xz(!-20HVUR17(F^g2~7u:yo~Wޔ, /O݆n7.]]R GmHu92zFOJz FŻm} o>`/H2b`F+Bىd~o:i4NNMRҜ+aHJ/ė69#LVᕠ~ cC?zz~1bŠ_6 gêډa՟,e4$W8"5b;l-KCQIUtL>(%uiM%LL3ZWDFChg}:]&`2mLՙVeŅ_l,5+։K^~%Nc1?%z%JӘ]l4+GIހt 069V4 h T5@I4쩇-x^@'oQ5ygd#IZspO<9Ǭ@KwZ|:ו380z0~Nט)ؓ9#S5Y)!9W8V%qOlMJ)P`!!(<QAiǙ ԰?L :RxmP@1<{&Cӗɽ?)!۵VXV^YVYV>ZVZP' Gzt!Ѩ\m $D¯AZ3F7cWS<,y*6Ϙ{]&v)p2&9ܒ?d[yoshimi-2.3.5.1/banks/Cormi_Sound/0013-Spazio1.xiz000066400000000000000000000025231506652756400213450ustar00rootroot00000000000000Ys8~_=4 3I:)s܋F"g lKdX~Z}\x6=qm9 Rt<,W·7׿'o}`^w_!N0|V^]DoV(+獾 \c$Hb֘yŚF"363"Foz42#1_9E|x0p2߶8FK7 #rx8dvovʸh;;Yu}4f_)v1(!E@{ ?фDmI(Il&6!Z@ѱ~`a~Uab0q4MΛfb0Nj?879Mkv_)wF'9#qB2x$*^;UD==l؊n8&;m(Oˋx@ [8+͂ šmCJifX ԠӒV)rUS^ ;[{Efd }&D2]M9=g4@~B)WR73%8yF'E'py>V31,r43e睔88w_B)M*x7K⯲n;nw\o4.fѹ } &R-=@K-Fb\)wFRǘW|ZKP΢"W EcɄ\^1H\qa;?\_v`W#6}vOymA Y%E_k&LնWW*zQ^_f)-lV`x#Yq )@-X_xfLjhs_1e/D#A_0j~'lu6+dCH Cݭ5(lmsk|&+ҭ$?$EE#&E¬o{6-v1^jyb&P0(QOR'⁶ pS$ڒyoshimi-2.3.5.1/banks/Cormi_Sound/0014-Spazio2.xiz000066400000000000000000000030141506652756400213430ustar00rootroot00000000000000Yr6}W|w%җ3q2DM4dWۺ/l&"c뻐$@vyIL EY Íe"!j@OِRYeBPn4T(Uy8Mc{T0%xS1p< tԿ+w[^ڹb8V} ̈́J:!W@ߩ>l>h0om$F0w.RJq1=Pxa &fՒQA7W9pE^?ĢB*;Bp?.=K&*pLF~b"Jg'6͒mnyj4!kmլf#jR;iw`Z50}]j`en6X؁3F$DM0 1dG rr?VOR;#QuۏzV },֌QAZP))zuWn\zMKTykEڢTT gb;U_u;cs=Kz)ȦĔwK݇;s;Qn ?,u]WCo\͔yoshimi-2.3.5.1/banks/Cormi_Sound/0015-Space Synth.xiz000066400000000000000000000055031506652756400221430ustar00rootroot00000000000000]s8}~Ygd׺.su/8aL~[ ,`^&̄VϿ>o֍'7?oj ׷Λw٠Ou9/ޘ?^,v9$&l 3ϛz|$"~&'[7?} Goe@5 }7cf#++M@t:oG|mIhᓍ{]^F/~h"z__ܨha݅7#pKFb0\ti<[,b I_VŖںQ6*D0rW+訖I9|Pp@ 8NJA0-Ll6gKvubKlsnrvaF^l(eIlA=x>Y78/2o7~$LO:~ٺ1K;Yy$,P #)% _r&p" >`vDъ|ɓf2"ti^7<٦bD'k*R(Λ],! I[ܗ=E4+b|U *%!ku )q mWS뛫P<k}:ķ|NEDf@='~܃$> @]X@HPN%Ο(yG  bO\d6.Z>K&I |϶Rz鋬0mEJ0t8ͫ%lZN~p'`*F(LD&g|i5 ] ݵK"΢E&x.pCЖ"|f-.Lb~N~ukahܭ+47PQ$1@q DVLtZrbXkɖ1ǫ`qߔa3贇\[uM]7 U/}c8>kn/ĸ]`lNJ,FHQdY3<*$clk/V@>Hϝ9-7\7 !Rxv@ȵrXӿg=(dZcZG+tB#GGy\_ Hcwc$](ծ585O$}|GeCdzf>-%Ϟ#ي*Ji@Lt t9tDWez@B/F :|Cl&DvR\aEºyY}-B$>HTR[$)[L lrXUɿL|< (T+Hd9T0>ܢ9KVL5%Ei}B"ǭ 0J5Cz d<XqHoEѣS$3UUb_d=XuTϛpPA*LY v^. ώm2]T8Fd"4]Mr""*ٌ@ZMƠ"_2N-~CHH'!z:$!bb̘ZG vJB &+2|?gBb %Syk.l8tl/^g@3}Ɋ %ٴII3CǼ"*X]&TAF􊈑$S¬6`4$\H`: U pVb/[)sY.J׹";b<\}]eC*WP=QIUz^F ݚH#+Ae ehsFPo|lvv^8L2d2dɓkEDq`SrG c,.q gBB̵-uB}Z {PҘah+@ % KTeŢ{m" 0x./ 8d{&8uM1*h:Q jl FtL'A. ny+SĕZlFܻ&ad;$DsHX&Vع RsHV>8RB'$]R{jd lhLyiD"f$ǿJS`u{8IFu:bܡ)[r> c/î>]88a'%8iPϝB+JMض0:'3{!"Sv 'Ӷ~~piqcɊx>Ei~IdQY$N);aP0 ݢE\ׄ5O$ӅҏNڰˮ!d:z>p1&"xJU)Dr*)x2<œ2OS<)3NIH|)e֨NSq}*Nvc=wq_|ND1>+'µ6q!0/FouNG_eWt J\Y42ۑókhG.9 *hځ%I#8 ZSv8rZWorhsnV(%ʽ('̛ԋ,O3le *yd2!Fkr >hϰ~f%:eK5}Í; е~tYU-[MI9ɢMdF5~2M$LdV-N+?%$%JjTY|yȓ?_4k: \<, yi Ml e7(BrG{Sjj{$֭ Y;yD -r\sRD,3̇/jPiTXf$<ԩ2"U@SGaJţVt=!`xM&"rIPH~:K(f'NE+{s;Q-z>U4 OԘ@UvaESefٍsr[mw [3{vp62ɧ+۽t=~H68,"/κDGө{wH~&3p}1B_0Bb08!|gbV9|z;Wk` nyC$~GI`Ad ň]P<FE6IҀ_Me4Px7w[v^ kqը},V{ջuzW]^vIZ}6t+ZSs_Wk(.ܻ{pϚ;Z~.m?͜il1L2{44$"`l;M%O3)%>%4HbeE42q٪l(MUtl@ʦҫqլ#M6Eae<a7Xb5ؕ~xEGWmDFn<%JHm9֮0>ts5KU*DR^,J욤 R??h>kC$f蕮}C ϟͧQbV=эnwnam ^ 쟛6wϘm=VHsAYlj#=Qe6ŕsEex`b Qw!gfaz<\'pY|fQDw7!.ɬo:?8THP%풍;1ͬvy'VXAD,"U+C(CY \If_itXo1!흕 [Ec6Oh=%(ϩ$ĊiF yG 1i- x 3Rk,x- Z8ʂٷ$hmOQK0`VL?Lc{U&z'" Nh9dQǖo22%dcX-C&m:},(9`t[Sj d۹ C&tmWt&D.m˰e"JXByGNVPjbaY:ƘPc4g'chZ&ƶk7Q&2bWaL0pm7̂ < sl`疙Xʜzx=d_Iܿ~)q#J'4&kbYNϘPrSel۸vnxJ ٜ+,*-5f[ L2&~fYBĔ0TF l;_bdJ{k<} @ML|hLDe.ȓX6%la0peUJvȪmA>FZe(a#8@ V<]yoshimi-2.3.5.1/banks/Cormi_Sound/0017-friendly sines.xiz000066400000000000000000000063761506652756400227530ustar00rootroot00000000000000][s~ Hܫl) *f_T [!puF=blrϽg|ieWMϷ\*}W+p ˹͆ꯟ?|?vV:aL7]Vjrȗf]HXzf菖Tn]u)6I*}݆JB~ZlTfrF7cm{u튣˪2['x6i@u{__0 qķ ꄸv2U[e\3u2ҟeX| cq'v,E 4+0W6=r۬Lfkg1C!\.FT Ȼq}GF4ɏ wTHU?_[­]/0}"ꅻ"U{|[Y?Xp=Cg lf:x/-{WC& ǜLۈLBᇕkdVp6![x/u `)҄6˸Fm=6oq>z6UdOXܦӜ 4$w\hK9}N G G~ϾmOW3Ar}{5 ƣkþO и׺l{Nw]qҺ$D?,#xHhwC%츌GvV`a"% kmp2Yԕے(  VK @\,<Т3m < ptHJ_5|R Q|٫Dm27Cean=nϐ{ɤJ9n9d!xAWU5˥ofu|Ҭ}'?0Ot`X-jN0ǪErݾ81A3)˜œ1 (ښP"b ɞuz3V}|G.S]Q_=-сq, O!$&J]_Í2`/6W915 X|CQB&N[m!xh2B3F{&L,H\|4b,X;| 4_XuYp2:pF Xq1|}.R`6˙2⥻GWm0xW@hNVy 2/2b!܁`!g%HC|])G Ñr\f,{R/K?GSt@XGwC1ў%˨v 8&;N`S&&VAd2ԻYvhufJvvP;a)/ =K--ߥ膾,\&tДbZ-rddf-aW5#2ā!x;bpjtL{+_ג KTK^h|(eL`TK>ݩȢ RXa$Ƶy zYa lշ8 8g'[B$-]>)IO }2aQO^%4ϦORﻝ+$~R.XE/O2Sv CcuWʫhvZr*0R!9]i}il9 ,y}]EHORxi@%"@PL ԉ0 sOk0Ty~Ѭ >Z)" rU?!ݞ*E w N,9l6:?" "B NR!@@,sW@)E|`DH)!gs*m y6C%M.Σ{'- >ϴMx75).:yѴuF_S4O*5r" n D568ϪN TR!! }E$UxE109~HM vLkuN깴.f6.[F!im4&wx6iz q2z4}G<$rdesYuGV]&ȪxYuȪ%#=_u?;ݖ<@|lϸ!!t=UC?#Pp-Wa05nL?)5߮uG.tӚ 2WK<?b|DžHI"ۧyoshimi-2.3.5.1/banks/Cormi_Sound/0019-Acquoso_1.xiz000066400000000000000000000064301506652756400216600ustar00rootroot00000000000000][s~_jwS, _eJDtGif=%ݰ/{O_qi<8AއCprۛQws6|7 Wx1ʎl[S>4;M^Ȏ{yfK1_Fk{K;4}{weD ixN5F51mDbx3ෝou>4ggݳ8tV0c{''l6ZS ai-}bcv9^oWb[mݕSSӴNY*s#g0 :Wi)FY2F:A}Rjn.Q[x뛫ۋF8 ,6vpg>޷ҿRvk~pA䄮xo͏ّ%zU|ʌ®?n~BZ\)|zs{f nm/oω [[,^eA]E9 ЉJR l=1P%Os*=#MuZcoyπN.r;),Z*Ek%Wt PDv=wewFH~/ǡ穀\r11Z amW|Bl~tV,p6J5iՍ9a`EXb6`Σ<Ǟkō?SShvP4ިO7Sn0iGL !͵E2x(,NVtO;=EcVN:Aj[c:}x\D:(C#?^X.2yry<xfy|lY}P5;iY.d-|g 7sz1(,z< 3 㗑N15q a;?(q5 ip͞PܧeK#Bv {G-@󫠋 aGNu*D+VYyes@)QbSzI'YO8kh#!d~quhZ8+yLz)ҥe[Q9U\zp5G&Ԙ,cBMK^lDDQLH6Χq!DP!dhB/%L\AGXRfpt46 \#r["HFP%ow!l7H;JUqVxDZ%p`moI9z<%A~.]7<"iJ"GS*ǼB N; ^<쐌􈭁ыWEz4=׬J@\UTd_݇Z:陡2 M<91'f̆O/t)`dV JɭXTE$ÍCT!.ǔ&dњJ+ k2qE@wE!VCM~L5GGKGٌz*ᅦ+7@A 5\2BNTωP4A`r<;f  mlnxbH!_P 1LRNW[hb(?V(1C!n"ޡ_> qu(·8hw(M^6+:Up8y)mw!9jZPJ?qxA>eӠ6 `;*]I xC}*3kzo}*~)TקiDF&ss])C}j1{ЕLK3EIp5/oӰi`En[wweݤЉUvLQ ׌8U-*^TL^Do7/ku] _ZeU2PZUjPZeשp7jԛ\zy፴J*{RO& T!(MHײP@UOX\ ~GԲZBPGyѮPI i7WBml *Ur fCڙuI礫s73:gwsfv;/w,w~Jaj4Q9KoAMܝA~뇰^(Y?<+ii65XsM:_OQb[QL輫/nyr~,6 p.vl>J"wS7jnwAN΢8xmٺ&wR?~ډKw~oTl,S}:B=mCI65[Q_>R7B.õFQ)`jUԵ~%0L]}؅*ߙ]޼_,?[9§hZSw^"qxF$3pmeg*>l6.t¡-4D }vadXT\o}*>\=,?|fhiʍҕڷA_4־ɋQ|9A%cwB_sfT?( >I`@`wFs5 (^k77ڄ&}0Cb: gZH1veR8;_N?چdn띲?OzD7cSRA&z 2b!/ol4d׈KL^ D_p qUQo:9TE&Nu匫4@'cܹC*^[{&HЮ9O^{kBgɬa)\Y &$8~P.|_}ݧ~g8S߭"/N|Rս׀y";# fڄ˜Tb>gj;[6@.?4끑*l195<hf m3tsZ*e蛄3BuTtzBѝ$pud7X$zI4|yaBs/Wk"S;ňnܸ4 '"i`0g3б8xQ2Ui\Mco[#@ѫ!&+J*74֌9pT.~]DUUFW8ޢɨEdt*gq罋tuLuMnސ&s5q*bv~w}5:3XVa$2?gskA80HAUJSJ)auwmh)4nPi ]>f-Ffߑ̯~{4^29O`d,/%@z5`h-|uZbL )\I`j

{#Zn*7+N~-7B-r!n@u5SIi40 n-l/e?Lzn=6`׀W/lJNC)54,}N)FC06- \Y~aaf ct`ÿM`&F0FٱB&FF#¨}X0 a<}d`G lXR ivbaCꛡx}dALw0a#@C6AiAؘfacj UϺZi610zda410AM &FF#Đw8HFmmgt#a$!9Vf[JL UCudR`#c0j@~2^vbJAyd'3VPjY+$1MR LpUa`0f0$uR[5$ &%ɑ1)I]'€< <$nàN>Nk٬C`HiA0rdL$1]$Ƭ$1fY͊M@Fϼ XfSshi9`"m(`~`~^nv=sLfHu0urk<nO] ZGUc\s?$NXVI5zHa.%PpUSS&h` lx~c&Gdh jk5ՠF6f'mNZO3; +aư)rQΪVx~Φ45f?#Rm`Ǽ4t䫘`HmCIϜ+`@7 c-n73ǰF-hn; +=sF ЗM)PZ jL= :1v+ 3o`ߍadwOc(`52\5VZ j,9x<noSFq瘫?dj+ uԘ45/1:yE<d̈x+iN\1QԘ*J[ /Pb"s~ǜeܟ`h[ӢZJNN1B\s ߤscc1ia2~9HObf:r0BƜUc=KAu)5ƜUؘƜU45"1j5g9hVX7S=́PcZa s Мr0=sp1m[a MW ks ^܁?%0=@P0ڭ45"wl9(Os/\$yPccQs}F451hjLjš"/\-+i C;l[{lU ޱsfˏʌVWwԊq:!yZ"^W-P ?o,A$TV4URJ %Vp@|3OP5Xa. RY8}ҕK`Y%rpg|NQf(e:T*I3ۡVmj,v<\uhqMU8>[=[%z|2R^RVU5/_՟>K^>+*UWx/AoW̔&7A{d&mw=QejeP! "L; ^`T6OaGo[T_ғ2RԙFK@ ?PoJ\~gi"qz̸^ V|E,96ox[7IAΞ5$Np $q"SFE힘r{e꽙Z"+U5gkyְ:`UxӼ c+pT52SJE8,k8E Еw'e4V)5l>yѲ?zx-׾(F!, hP41xӡ71Be&ゑ}kIN+a@Q;`) Tήί/-^<G|8w55묛s*rGKm-3!ʷ2@Y|wqup9Z.b93z}U~=լF5ѣaͺnX=6֬F5{^|ܭ ]AZ+25'.yp\/.g;ӏKFvG<$&ſݸd0C;)Mɛ3t/LWf*iG#*i;iDte  he)~T>׬?$tS%$&?<1WB,2{!DР@ q7Vf3I U Vr6=y3r9\9E÷ Ǵ`d}7NNB__l֠g`zv9}Yk(|{{s豳nX;˥o"-|5N ׳:XzpaM>.қ{6AǒNgxE2W0ZoEV CdwwLF 4 #O ob|;7c t ̉(RwzphI]x &>!(KY [1X~:NN#ZK2Xτ}e {XRf+q=OxbO-|>YGx+.~ v]4uR rFKciMez3eAI_G^X1K.3^Z[a;‹6Y]B3l6ٟ2ܹpRHT o6* dʙC8}&oExzFkї,p֡kJJ˺Ky >g;-{ZE͋TP9=/gLK}<) |>Q˷1uBnFH=gp@.+jl2DD[ČF7۔7g$焤9`J5y5_`ɝ0 ;QaNH߷}7uti2[LI*XEosڴ{4˙ Yyv"ۙ?2(:E73qNFӈ+'[*K/VPJ *IiڙQ`9VAq ]|N.ncW"_ɕ8 $CV *6*E hZgNO鋣.cz6F=t3~(̢_LSDPivwY*Cym\N!wAgC ) Gq^RB;gT@M]RqɻnNq_ r%iWq(n&#XA ]bǟnxj~J 3pqGroěunKAs )`ŋORq儨'|~$kwy3<; }|ne|z,e*ȖfTi`M,E_bXP}VzRO8?1c)lIْT8;P<bcV,YԞJ7 3F%).Ђ3=O"a{>_iy]*|sWlpۿq &[ؾ!uq*@Jz\HS*[N򨃿%o0qq#d3rr6d 7G-\abr sۻQS%7W|*\-|2u[GNmき}N1'!`/ \o*nbچ:Dx7,Utp?F,f=X8f'{fv7>5'V@tY p[@rtU_:bqc4{|9~BL -{Kvl+![Mِn_{7c;Ky ᔧ Em,]b ^r?dB)k oK埨 rR'cAwXPxjCmB ڰ$_kD;}8^:bv~Jݡ懻g.S<O$cdoL.t!^[ tJQ2{J.)zm83`LIQ0t\4`fCdP\ylYG-AAKЦ1ƊCmgXƃ.ՈS@@=4pO Wp9E7 & m'yIao;9.\NθJ$Om'gvʮWҔ]$9eqZB28 7b~@ߣHSH!ȑjqHZBxZ.T AQG#bYQ-"saï|!|Hs:j٧[+>;" !bﴄWZ#DD^hZ#$ї ~#+D{{GBĔ\gBDݔG䮽s>$)/@ {TR׃*qǍ q" =}vt)W GJCOD4K]҂ʋ:VT𣘐E7a$Z4}9 bv)&?\"y];t.LT1vLD2FnY;+8:9ms9@to2" 9 X7I#f!(5zA8BIZ0i I}%k*<=L? D:t%Q6t`դ`7I(aᏑbt'ɉiĎycT;p$-ޙIS!\JD9Fo>HJD%WIZM9Uw)n 'g_1_ 'iAM&Fl(F4C$-NJc C "K]Pe\RD=թ";t)P%%f)G!%-GJ:("zU _ڡj깬5U3scd:l12^VR@yìtC1wyӁ8J,S@qcK0TlЯaOՂ O U=U,zK &]J 8Y?Dղ,{VbGV"Fjp= Šґѷ۵E\-#1Y7?Y#+q"/k)͑1O >"Y7ós%pC۫ m($IU*Vdo%vh'8 05>ҵ.=ڡ 2H.NхoJ|j#Ŗ{ V| V 'bsЧ@F<ܞDRp_u"[P) Od=bJ*}z|9N! bhƜK8SMD@ ,N^;!߁LIߘڊWTb|7 mЅm^f|,Eԛpx#'Dl5k2J $ƉOGND8A,'bbə2F.6oƒ1=(?Z Y}ZՎwt$:"a^6&5- Oˋ¤٤:d4XR~K<QL2F<3nS4ZLH&|nV"LC$8TLR4d24RZ7uɤcd 󶗽KW '}pR ݦbIZ =s"a hNJ1R0I;$LO˙&Y1NA %aGBe-sT}.-we,=0W]y3DYR[q;)X+EEa@xLKA,9RC=Vv'aK0P@%3f*V\VYDq$Տ/Njcb? *HRD9ޠH(I $ux#!}/T %6#"=: ;HP]SȆR8Db[ҟC̄JCmL. 'AFg'aHR̩Jݰml*f 踛친Z*鐄KyY?BJZ<@.+A%,h*f)L@1#G%>6v\먆2(hS[S#!cۛ.!

K/'K9a [u"FԗOGBDkxlmKֲ#.lo '0v~< ""DL7§¹'VOWӅ~bHT^Fͷ7Il']s@Lh &7djljM ȯJ5LUk sNP5]I5]I>5]Iv5]I5]I5W3 M\f+GxDC6+8U+H{27UYekpʸ1ֿ1R=e2|Uj톮9fd#S"ez/N DLz9 E$?^uGWgmV _7._ ?]\>寯nҿJ{vv#/wS7g;wj|!*-4Z?g7BY_-j4\Oow܅,p"z gy 걻ѯ^8ko)F|~ݎwx6=4q~rw觘:t ǎ{x[x[{#rқKmttMP4PiY7\,w@[͕g6"TxF7?;:W~ 0~xǑ$ _~d0'bYb"k6|Fҕ +M ;Lf3ۭ[鶖f3'o.:"? g×TEE^pٞIU1sa:Iri]{;0vQp{&6Q/rnפ`c]$'CeeS%D>zpǏMy$լ@*-}9EfR b_,KU7jRd'&P|p0a>Hm3t'xÖ[L?xG/U 2e LD s" e{ g<7@j:\Iuzt8S I[@9<'w;i}:;QVBrn? u@'7]mEp/艂4y9֏RM-0 M}ۑtsSLTzph[-k}i[{`׋`.J;Jb࿍̓ X3Kj:^Y[iӻʏwSd?j|z?e o"WTeHV 0De`mʉ$3釜 }y3ɲ^x.4*V[WU))ZN̾hr~'0"YE,2`2AiKK"ٱ{D&ur0KtdL^OGsM w@ފ{iޜb䔉ȝov`(B^T]^>60 JWw5O/ 7{Mb4'Y.Rj%'~3 !'l%sp5f~e9lsa6vlre5d{@>Mc@S"k5X"6ldZl[|\d[]5D/V6X'VF IB7 [-n6FmY^ o}0kNf%JHH+! KxBX!ָP]·] kZXkZknCqGE^2$N`6zFunH:4:ge0/ 0 ӌ! a0@X;a%'˶ &rk2<` 6$2m-aN{R30u|g5[ɆO(Y SCVm#Fn%/J^Yti_I7]jD.t3jC;@uV &"itZm|xi6V-^i6^i6^i6vhl (%M(I58fw(͹`]' %ff %XBk%ɢŮAv(įX&JrHmFrkmh=8iS Fsµ]'@kD@=Q"i[(k&(eO7b56oT]1zdcv3% gbQuvSLps7J bf UrVBbCym#_1mXQr4;kZXJ78DKH#:]$5V,Q?}0kd ާ-)Q Z(WPBN(ׂp~`&(c`'}rS:{M |,(= ZQDQ\|f m!.dM[4(PMf(:!r)Sy?kn4B/K.{Du2\F6&l ZmA`52ldFr(^Q5"lJ*OڔaLzD_.fηp Q( lD`CV6m/z rFI6Tg$$^9:%(ǵ]ɊMyYNf醏nE;HxFiv`k]Q" B KYDx (`N6J$ɵV4JZuV6J$7JZ%(9J$PlFO h  lFֹѳ:YC.{<QFy5G(6m/]ni/דqu6Sӫ¬ |zRD_B:Pw Q'e*YeZGT)0$?w[qUg$UID*uNR'GG4{= 3*VIZ.# 6}sNfGbXJ)vhg425[l_Y0Oz(EթiV@ 9NCǍiU&mH={N,3Q0w4WLp^gT'_w+7W9hOHDU`#9Au~ &GȥNDQb,xKKINxk[@bqC?:#ݵ]m69[LOGWßILKOT~*ioֳ%K+>s)R$=J f ni)/vb5(R'*,~;'Q/Bw@%m a%ȯ%$׊ɜs(N@q_W`&I〇Oz^D^.~*usg ~j\]_;]'|c/ecE!E,WpSkX!.*ҮG92L3| ;?fv-#bUuF|g9 U?,(xѷMM߈9- +F7Atɫr}p)͢'Ȓ!%h =d`1ud--w^^>I*%wo rK2_ǹYSfdMߌ.yp57tJ[Bʡoh[Jɣ:=(fM \Ic[/|)\7x œlw_nV'u RB=Ge'n#sw!s d3_^gřTcƖp{}hjm] sex.X{T~8_P/ ޿<̦X`X.}pcw3-Rfyoshimi-2.3.5.1/banks/Cormi_Sound/0024-Fagotto_02.xiz000066400000000000000000000111451506652756400217250ustar00rootroot00000000000000][s6~ϯeLjKSMck˝/Zl%)7 8I՗& 7g/08oXi5μ`.q?4]^_?݌~} Faoşxu7oatް/~~4މB.yb?x]/wwnO O(]Cד/rh݀Ng۫|z=myYn2~ 'g{K豻/^8kДBmᛑj^)wعݎݡ鴏?%бV/kV(8~mbgEIx* x蚀Ja9Jx|[W]. iʛTMgwl.7 `N'u} $tZw?pG"/MMlpӿ㳟pB| $]8+m*a:?MP٪oelh ~YEȕrG||u/-  ܇nkiH9qnvPa|?p~^·/n e؋`<=US7c%l*`Eh]|/9\ʸnl|-v redu_&O9= yO^X,YTX\w.N$Ef'B _RY fo8>NLF0a>H(mřH`/{z^N+{H6AH%iVJZY%<3-*Z˗zq[@jjQ+=MLJ۵(y ޞ.Q[AIɗ{N%_ęFYO?BĤvK1ϋNmJM0B\P.P k,.t[n*Uhy"+i:$*Pžp\WG Y3W?0_1t`[T ҉ם|-$tb2CTd!y[;9D,Q!@A(hvcrb,V:^@Fexm0KHW(;͚x,b|՛l.E!~Vz7( IJCa5f~e| Pjse;lze5d{,5}D6} bQ^Y#j5.;ц-Y0-e[tɶ0t[׼1xn#S$C:5iPFaE F fQ,@/oY{0kNe%FpVBZ ii%m k0(֨P]B] kZXkZ(֨FFA#zKfQq@Gi.mh, g 0hac0̨b00ZA- C] a'K eQlCr6%a\斩nCd020ZA؀Ҟ"0a=aC tN0F=LQL c:t%f C9[}LQ ?Q lHN`R p lHM1FF FF #F c$DISC4Au|-j U\Gs+ `Nۘ[I4V+f~%scXqmٔQg0Qۄ!͓N@V Cs m46R [4hiLҘf#W f^o8 5Qҵp μUisK%&f K%JH#X+!9$Z:1 vߜ$9mDAZk4S` jN]dLftrKtK@̛X52oab:g( `605p  0殓5dc丱l!bֺb# `6V.]Dذ@1^1k%FVB-%JHcX#gW kZX%ƍ%1:#\IH݂f H #F&2xFm> еe Y p JH Zh4\tbh&X'} ,t9@,a(:-JtO/Ua 4(=Xt,y2̛!гFKc`.yDu 2ǩȋeȘeHjcRXX'0A /X4"lH*OڐBɑ91q#r9\5tmuA%Ȑ [v)dcI2TgcIhx?l,8:OVl8Mt0 7|l,`Y6A/VXHZm,!KIc🨶1Q%ƒV4$l,PbXҊܥX" ĜcPؓ*Zgc d scc f ss#z#X4vG(6tEw\WWe܉?s1z+-Pw-'*U%v"WLC.BY( U{ JQa3MƞkỎUVHqWZ6}lwbUω ?'qԗYmbj425TjF [oy^nK/VlwӏqnG-3P0,sT*sx*#ڕjW0g` A)G lLhër)7J%/{$_$?É\"SW_e:`TR==dy)lih =G;(D<%%&p_,-AZ͌ U%fVl ;Hi.ۿ8u5F.(xܥM|@ ˕2jY |FXwvW%ǥNF5쏣۫?̓q; b;R _SJ\Y14U]Ī|*]7ź9j.fUbRZLFO*[t3L6L2}][ Mr#R|:D@r|k#[*Sl!(DJa_F: M.^*$]ұڗZ¿sk@Hɋ}0Sg.g T 9jo>E9lӟTZAW~`6z2TZ-RNA#֫/LTmi0}3*?E 0}k*&"1Q4ՀUWW0v@_wK{hHOZ Ni_ꄮL)ԋ46hٰ׊~kd&y{s u?<xp׋ӐOLd墪7R{Z|D+V:vm M@ 1-b W ɃbEub$Gn)_Zy/ccn1b*f_K_gė *yу7OG]%w?PrܒS'51)w>~g5+ed3eȚ]*Fsp56tL[Bʡw mQǿ6q%y+y׬{_+i} IW؝Ko<ygt \')7?n/peѾ^I^N|X0=y'>[eu8uYxӷy!X±ޤƮ/T1>$f+#K#c#yFxsty}TĻ|/y:_gsܙW*=)5jUq3TU] ժjUWu+aZ< \oPuF uIi26![dSlǓb^ ?l K%K@1sϠV B!53EG*32Ŧk ES'Wxg)]lL o(nrF \}\F,\/`"-\iס@|( f:4?JH] 2@} "?ð{F᜿DД2CoKuoW)f%-w/n~xsfnyoshimi-2.3.5.1/banks/Cormi_Sound/0025-Fagotto_03.xiz000066400000000000000000000114041506652756400217250ustar00rootroot00000000000000][s~_yڀPoظBe8͋Ja+:>= i]vzeӏ?}Z-O>$CqDxFg~7~Op>_z>S^g9k K_:WM?'׳;lz'*|.F(Hғs ]O'y!b˾v::\^\ mo8^D*8k /.(}I0-$^gC(6~74Unyx; oWvtǕ[ЃRXIW4++L0 V6^%f "-T,yJ@ `&15r}KZ?'CBd*oS5NoFi?79֍7CjZnƛp3OM$,^Mo.?}or[/H(0}ZH.Y>L1**&`Cˊ6q,|s\i^P7NYŶȿ_aj uΑF_S1| 8$ Zž^=(Ax'_-V{oQª>K݅@ڏu7Qh?+P0QQ>Y<}X0T%4%!XƳ0}`aURaq$v=V=]KCazHeL6QNvbGp{۵8Yw8FFoߍyrD!V9ȴ2 Lrh D\5Tx3 &X~Aj;\Aup8C A[@zs~1?Kl>VBrmNAy+uA$7d]&3t@[ݺhM^cdL݁Oi}v;.~n\si9m,K}G]/9+tzGLg\"^[[a2L]B5l`2ySU@)U,R0ѷ\YJ;q& З7ݍ&m(yio_.a[CQɗ{M%L@o!bb]釮ejE/wmJOx]֒30Y? 7n*Uhy"+i:W%U2] b\׭ Yg?01t`>[T ҉yj:FI~d엣C窷vtXC$,tJތn'ɹ!~d]}qțj;Cu<9!Ӎex7q Y oRPv #?jf|wT~FqZy%@YHN:7A]k=;.C[ e6UfGU[CR|f}DS,k kD8Eb5ڰ ƠE`n5lw"/Rm`8!>j Oڴ(tӢ"sZԨ]c=5'JH#8+!4h6%a\nCd0>20ZAXҞ"a=aC tN0F=LQL c:t%O1F)lb:U6v7a&Ԅ Iaathaa00ZA-!m a00jKB11@CT[٢fyH)Ru1 괍tۘ[IKcn%b\٬W=:K8܌uZءIN AKuN CMX>0=FKch#CKc4-i6r`l@șJ X`%]+ ܡX *m}`urDĬaҷwD@ ik%1D['ۓsbX" cGjk,'F%5l#X9ڮuD@^BNh.Xvxej})N' 4( 1?Ȼ 4Vl׷㷒Zp-3P0sT*9<vKkID6&Lj`R3)7J\\GG_boYepO,/ 8+ua1g5p<{NUm@AZsĩk7raon˟4r\hS[NiqT 򸋻*&Ad\]O猐?d3?Ix>$dNsכ$ L6x2%#WL4X(C< BXvvR#쎉׽0r~ivn9#%W-34aΖ]O@/4j0/ vDǿ#I:.~`z2TZ-RfA#$sp[W qo? 7ӔP 7%:ENE5mS{xoH {T-]5`3YP7]"%4}Ң[,wB1K0/ 3zJ3݁*i6h?- +A}!Y5p}T ^kNʈ|'?c=b8 W6rQUU\7HY>qru}qv8θ/b& Xo8pOqjX!<(ۭ'9}}iDW@$#cT#͈/#x?E|5%p?|^S?NH089Ei'j4wI{p;x>w;ij=nQ|6T^c>wL9"':IK} %Ofk,c}V,g~3e і}1Tjll -Cf_6mp%QWx<׬{߀+i| IWؽKo=ygx L')7?n/Cez y 7D/O.d?߱A%QKB滽9b=I=՗+8ׂ, <[^2#a ֿp7iG>G^tם GםGh̼;,3L"pvФ͞w2Q·hOt6G{/v3*uyq!G49kMc@YJŅw~2E{H"֓l>eYs vzsw5L_So<]ADPjDժ.J,VZeV] z] ժjUW|/.ȅ_2WDvK~YPDaO6evty9:2GλbZj}5!_؈)k,]L?T^$CoB\$H̹eMr ӎ\AnTO*HDKuP(E6¦ ُ665]WwDOD~a3wzyPrٯX ~yEyoshimi-2.3.5.1/banks/Cormi_Sound/0027-Delicato_01.xiz000066400000000000000000000100011506652756400220360ustar00rootroot00000000000000rF=_ջ-;UI@׎/k{R;Ba $hrF\@SI$/O[~f}(Mȅ49 Ewss~{3{t5 oOrdn"O/QLI>{t,% `)IMt^'oiv6 z69+;V_;*z~swe?\\m$8؄&릯qp =|} ٔ}AF :Ɩ.O`9w.`M|`Dee~߆;?l߄1`wZ$?\mrfn_hA/X|ʣwP\7 \ E%D~x hHf. Өk"P̦*cFWn6u'h9G*ހ^&Y֛'#K-vIfl.bY|7(8+5S4qf1k0$ok,O0l. dQ3KAȪ,l@~)A~渚]nhGS&$k`jŝ{6GY`d%\ =Zf0c^X$Gp%\'({iPJp}5̟u/}0~b E ŲsZ,| F,(9m8Zt*K]߲(߻ps څ!Φx Ƹ1) 9j;p’*-¥ a$ڥSQN 8iɓ/k5F-" ֑>.e:p{9qB@q/pO\aDv4ps'"[F8,_q4]QAN q%$-F?nG۬R\C\Iz2 qc כc!._9A7-7O}hG7{<#9>^B?}|0y@ӍG*HYpel'Cq@\oP~{t?IS;]Jհm{ACm@Nsviߋ'X,*)bC)??%2uG&7M65G1}wus}9 )BUص"!W\OMgE3YWӂ ~Ji u"Q*@V҅ɦbI8sC\\SB8L^3X%ifj:N/ZUtCW3sw*6O`ϥ XIp<ym&t[DA:3ge`U1B$Chfs4`z)h"&\01\uaW,kOg\.1,w:sY5i)% pl>Tb ̲4]h sOpkL,EP6s_ =.dߛ$(À5ŸQ >7R%@(CUT8,1jM"[ +}^0H 4b2H\WS bCh:r5CBtЁ-ωc +T=:͒uEW,Tɼ{U(DP-A^N)$ieRiӖN^'`E75ɰLD;H:M" Ι.٦S= M :hݫ `7. q25ڤD7MND5DPWF U(h˒SPUJMV:*Nu=-΁aabӫj]U:e4lpTp|2']^UEqtGO B82Cߢ?H+W v'-W 3N\#I_h@)~5udىKlOWetn0yHƳ* G+|^*%6W"M:e3Vd B^czU@«?4BbUo[j‡ҫW MRQ^%>y86E3ykmwp{HfÑK(Dz d}[z[z][z͏[VN㖮R~+jdȺ++$ԙ}1NZ|so@\pàF[D,?'X*WJj6Ib^+%sOy5;O.Ky-C_i~aJ2)Eye90 g)yVF ؆A&zyvُ)F/dhnŒ~E8簋m&$z4;ϼ+sR` uBzYZidò=Zvɩ5^"zO-\PE%7k\&g&>ACxe˗Tz7rU'd?釖ϔtz*eLk"js1_?>'"Tnyoshimi-2.3.5.1/banks/Cormi_Sound/0028-Delicato_02.xiz000066400000000000000000000057421506652756400220600ustar00rootroot00000000000000][s~_= Nd.I '3elxlm2mے5T)/3qZRKjZ}?՞M׳֬L[w ~?gW_>}d9^j cu{ehK>k9uUO,7NO ̭ru6v\4aٓ_Vg3U8j[kZ`#A>t6+Y`DLwjl`1| :_Ookq]ouXYmv5%~?L‘[|ǘv]'3mC%4TAn`jj/ohUUsMpI3&> Qzzt) m8{,v\PeOX-^Ć5E%x6wn* -J V3:z>ZG[RL0EηeTLoQ_A=.4wؖ2O}tP:şӛ/keJ݃i?XIE6:Bd<d͢6`1Mj븺i35hڞldh GA1hKR; :\j|ݳz&QQ[IՂ+`Ptm> +j~`ӡVØkjQ$Fd[JSg-^IX9*>~WOYpv[GzdL̚=L5dWa*>DGRBa#Nv<"?[Z@mѦi L5!w~an'p PM,rHUG)^>e>+:[w"OyyEPN)Eg{"K/ <+ U҇N;T@veNv ؞5'ʨX:qϯvX#7(Iɰ\ś.s IdE8O07hPXhT"(I݌(/;<"n=8dެ?7Jmg>nvs1!6>x<v ,2Bnb,H%310s9O˧xSh9ږ0gMOcL ];@DI‹ H9Pڸl,PdS-mB`I&GHF! 0Ě3qacه#B |:|U-ݺlbA5 2=IAu83#)@)0)@o^'LHc'J-W 9޽ڐiB i'F:/ q ԆvZK~O0jrp ˵Q\/ŵ%%4=q|<Xm4; Lp(LSq 59v6i&dWf,vp~Y+(^>r`rfh+Q˪%J | v0$1].cBPJǨ+؝7Inm9\Xtp Djg:] ls(5,\ˀc= S@8Ӎ:ca;Z)Ś;D AYFP Z[c1r6H4a]! c ТMF^W? F,jQx$Xn"F&'7S)9㒅 (nc!'1ω-Bc1EtEbyb^ +BJ? VM;`!KBrS4iS0,Itj!Дr%#O-ۢ!'S!4}&.P" 2 bJ`^ pjF#9]vZ=&2D7},E#=EOf'2S0/h mv<b>cm$3-](Ix˃. x@89\GÎ=I25'3Eo0NjI+Q=i$=#R#sE$(Jn }MSBJ~.K/ݦ60bd‰(]NnFeaˇ\ | QxRT-tbṢHJNi)A!L I$HBB I|*H`Frm8MRjG e7{mq8RA$1@ޑڑg*̎72hAKt^2;$C2;(>Cgo_2h g$_@CIpXPAn#paK83t"Jv\/""v\2JG&IzG[?$P{;QQ|U@m2;Dي_W*V2a%VNXF"Dl5j-/P ϏoI <]-2hA˅%V'w Sd[Un҄tdZBZ1zŮd|/95/_C8>5HFfxu `nH|]DL.KW,]sXW<oqSRAa~)TBQ;.حXu)|)c@JgKnKuK|eSމU\p=§.Wr%aMcLgxM^ ww7lwܥakkX2%`bS?yatyoshimi-2.3.5.1/banks/Cormi_Sound/0029-Delicato_03.xiz000066400000000000000000000161501506652756400220550ustar00rootroot00000000000000]Ys6~ϯ}bd*--W\ξhHD͌onRtyIFq4泝/r]NMi=|ܽ90?􏣋Ûϗ?Ez}wS?>ˏnK_wu(~>Wb_B?ڹ׳>ǫp~fOeCCOvwF_6_@OΏ/F7'𷅿xh%zLal >ݝ=S֗#=u`Fcrt5:ߌ7F9ypzSCˆQJ /L[K/Vr="X/l"/&7MNawPy6ԾkjOeR_\ݞo Q0 '~{O{nnp9weB[I<+:O~{<-bTvάcK$S>A1bffeZR(66˨ Ձx'7㳝pq#vȿakԵ|H}Hy>?bˇBj:׭h_%TC؀S=,Axןo~AZN2]E*38{G".O<~4 Z/Y4y,N"8Te $>x&O,n*֟gJ ⹮ɣ|D-PZ>Y2fH?j f/qNr6[yx"Nǧc|A`>x/R96+Xd?,y >m ,YI0,W%ڴ,?$,1iƺo$:G_#nF+3 \FbH!@X%šiMC7=#[?ڪ>+ẽNg(8`?DRvCuǽqol `r!TEh;?ExV̊7=EӣHGޟ/faVUvqJ݈Zپt߆NUHV68J6_b-HI̷3r>v;>?l3AJtGnUi-^Mu]݁g#h]#mh%eO=~?w tN**M;0ҽr2ۣ7re#-{Cgg`OY e]NyB׾ڜQ}@;g,e~u Po?XP3(Qq%XbJĔ!S`_mb,1%XbJ_M8lЄvV}napv/pؐ0N)6ғSCuՐgppHp̗ c-x4AѮ&3 ɻFTЌ65)cf<5hм"L8PƝMtg :T@Iܡ2Ze$oYG.0&x GM U&x5Mm~%ZoSr sVk.k u)*#_(or49︔rC*PV U"Q! iTN_s*'PSƞ1*'ƿ}/`e*haҡC7 @zrA+SNhr @N:*i(~<ON<* yT ''lΡ-@gGv3CZTTd9RYۧT*KMe <5*)S7RT 9TM8T5e5pv@8_ 53;d5km*1SSQ]kMȵ Ux7k&v\21L#B556FdK O:7q9gyY_8ON^WjN{%ooֽ!JbGw"$k%[IRBbl%tHЬ! ;"p=b|@f [a[v7;gOhI7\bb\o&a ~6K1 xV%4p蠀l=-/[e6ÓSlsÃmP nț k[Vm _B|&bƶ}I x=:]˗ 8*̥ՖxՖRz([r 45blEM8kuNS'C/"7H*#/Jki`(@4Ke%>Z4[_K.3ίػ+ ˟$6$${}ڸ9s%Gc)V6\VD"@)/CΟjhܐVX+0ЅT{U1L8켸g8 DSNߞ!ueO)֡nΐ S\vvNT_sXQ"jseל:ؐ"xMWSeYcTԭBQFƶhe7\(Vbq.5:Wegc7YuYXAZP},[ s}/VuuPٜR|9H{i~,FAmA\aøK#)uE-eTA>B#O<.X0LR Dxh$|Z)_jVLHD=ؙC/6F[AI$ cއy#OBMGɝV 6񐕱^G:(CbC&+,uP:y4%2(:>|y^Η׫T*YUW*`Fa0&K 0yHXVr9rdr-3(;ITw0lAe( md(uZ beQJJ6w2pMe;@YJ'ж $v!pZ毑$Q~Ði.0JJl*8Ӳe* h_4iJ%>-Pdͤ{-Ҥte( 3L;0lYևd|ܲC@Jx;?o$0|e;@JPa`m2oqh.NJje;M?F-`3&$cj$QiOee'A |jě9l QvupjB$]ݞn.60[pD| 0xb2p>=7m.ܲbԁx02Fv6ci ._KeYmP%,J8v%*k`iHtz~Q0m9dHJ3t<5+mV0L{-[ʖ乏%ylI{$[H-ёwd+hx}EGBZ^˳_nYOVyTq̆ fw_Қ?Ef=ꍛ@?ͫҭ \fuŸǸ&D%+`ʸRǭS;rJD %G"Щnh|0>+[iYyC qhHH?,Mi!De0n|KMv)qqSqkDvS nE8H}ZV!oh]V)Һ,T3YwPCk8M]֩h&yr&| @--%rtnj, 7~QRU@;6Xȫ8^zh*`qrȳcjpB%l^γy 7禗')gd˽zĔ[.,yOxd/XeFrtp,:*z'nۉփlCˠҦPI筒ˀnʅ:gaܗ\ly>"ߧDҫO{㳵cx2 ?. ۽U?%4`{/]r/{X۽? b @pS]^]q#%vT;bq\<gGkJE2rJBSIC2}m[V'd`O`]\SULIOF )}Zq*[O>}OhjήG'٫3`YY.xS̘Cog_7<Ǽ ..Ç*+^7Yps,FЋ2~R:ļ~>Ğb zr܌` Sz]zVZOu][k=ugs_BUzW].`^<Ⱥ[nr}gǭI\U؎LJ76FZ͏%*T&OG䫝tߩF }O![Sq+(rksk+]r65N`WWY\ޥNl8)6G{5!%Pүo~F_F~r:yoshimi-2.3.5.1/banks/Cormi_Sound/0031-Wah_dolce_1.xiz000066400000000000000000000051341506652756400221250ustar00rootroot00000000000000\[s۸~{֑b'LחYi X[[\P7%n';M_( |ͺ i|'p=y7t?_ifl~Ҙʟrv'g^5KADwȡ[7?| Nr~5 }ō>]q/gMt<Mo{t?miHAntî zEz_Yl0MOR-UϽِn{vΝ OdO1HIiBJ߼x1DdBQ6̇=G09mTw+3nϘV'p2u6g7"nv>ߗ S}k~B'h0fWEQ쑱HW8yKV[zJ=I{)#Y (ZR6ǒa5*ӜP^5O0.:ҜunvC8W{'sb]H}QV.`2epee%Bf_'_e,B^|z7_A_x`K-6t.Y l/ѣƫ00 l8^L`ˣzRpsŊZw"W̿$=ikŎZm2i. 1 79$N"r8__7Cl`ː1 ;\B8ML=H6bOdZ\5PѪu .fCrX {W[tNtyXk)S>[yA~W7ER$hNi=rL1phPF)[Z$וP?PV\]؝BFp ӹ}yi[%Zȶ` ys+:d{On rӣlnk/ީwrJl~ r?f.[c<-]1;*Bv#IR=>(v*vYgZ9 #FJX߫gstwf& $}q7ngGܼ>yu[u/oiYxy }:7NfRKc\Z]ܲEA$P;ꂓgӁ;CZ{Ng6N~*_ t( f'dN%qh&Ut(Qϥ.n"T2h!ʹ@tqaHRQ",:|c7k{ryхi6(7jUOɋoLb̾'Dyz^"^HQ\ [v8Nz>*#EqBtC7pvA)!B `.Q r ȑEHX8B(Qk&ӕ`[^ڌ0BQ=5 4`葸,4^t);SLYn%l4 T#3B)NA)iFxHGd[M%;?DĻ{?%`ȼV]Px]Wi*[SbN?Xfx7-T/wCr*e*ehE0oLvg:Z-fD{LP-87 #E!NEެVG*ͣ}.{,ȶ#~a4F%&K/m쁖A[iIjrlTw Vm҃nk8wt2It`e*ޛr0<,# KY}Z$"$R0%[8bz8 JS{:Jy.v+O}E^'=Z{Fjoxc*-S1%oV2tj";H`lZHNQZh<䗨a;7 ..5mJnE8~5;71 . y}Mj"i;7N o{dJح %Ri:KL0H";D[-ojk쳶]Ij2(.WśQwP+i]-?RpL5]jB-jSpᤋ"(u1$KiJQܛ ~ŋ/$rv3a *ZA%w3L80-ګU]%uqtDj+H]?=!RqZ ԳwDM(rG^h hMzXjoF7o\)ȱ*aV9KS6g_ttFGj9QY$!:Zwh^y?RL;"}QF$](6ǥb iw6FBB^9k^m6cm6Xfu3F;bҤX`b}"!WGx`zrEZh $9/=6> GaΫ裈8R"/J4t6aKଗ27/eoHJ\';pDyoshimi-2.3.5.1/banks/Cormi_Sound/0032-Wah_dolce_2.xiz000066400000000000000000000070251506652756400221300ustar00rootroot00000000000000]wڸ򽿂{؁|vMY&/:L.\clْ<h4zոs M뗃fgo?6o&O~z?ó^~w>o}?wbV|{v Mɟx>}n9xIh4عqlWw_h魽Pwꅾō3gFg̟36b8NqB2 Uwf@_wKqd>w=ruzhNΨ\;d=b iT {1bwϏpv}XacX3aj @ O4wtoFΐR7 ཁn~,I^+{G{'O|pKfaE G%FFʄwΗ;ӕd)vG^:񔮷C 8c{'υ`EƋ\N@80YXEڀY-A7tEpBv(}Wח͹V.+8S'#~EBǟk.~ /22;Bp8 w*y#%A):Q, 1֟- jbOXdLx[.dR-"ĥߛt9Bml7B0r.=|몏)\QAz ";D| YA8s$tWqݬ+wf 9aٰK*z˃3 ;:m8ǵmk$;huvץ$I@hN)}4c"Д=;MR%x\WEKq|txlwڂ$ ]'(,٧u`w9-XB_Te#1,Esǝ[-"ho37+/wt hzmAuݕq* PDh~ K# 2ݬ}$0_gI{ ξo}.NS$fF.)@mM.=b)Ɏtb*1HUyF|﨤u[)u%)o)Y;Hy ~>V o- Bj)?,S>,~@ NDzN@ȃyWXËs{;=ߧ/_D'j9`1:H4AXbJzg$Tq|>S)n\U2hA˹*6Đ8tf( b\]hoTJV/EF"nncwd=.oLbdOj(3ϋZm "2&nQo<tg QsI8agхB rs (wIl /C8W8 ΛNso, Zx|[Ƚ[ !y{p.,Ԟ8xf 4t{Ç-5b] Q8\di gFJG.yIʠ'R#ţ¶n8>_J`];)i0MhĻ.BThrLt"}&1_fh7S;DZ.;2d2dΝK#9`;>r"2U١pK!BpF,VSErZB ?UHʊ9sMpB B5(č L^;pI6 G|-pA5F5GWj8v`ptQ@EU-[FQ32A[}AO9T+h9]H*'RH\n4:f'wG=@|P|`"")ݧAb,D JdkI4نVZ}vnE) Vf1+ꑁZo Z$4Z_ZOMZj}jj= V<]/(L)ZZ=MeP+еZ}~7i4ĈC"|@)^f2[z"a!BGGc/i eA+M y+G&$A0yÝkҴo}!I{$Vʷ-PAvuAB_RYrd匊t5s; lW e9ܭOꌌ}Wd,zB)RG$OZ6J)Up ٫Bhy5sG6hOz:L]uYU!e8yu9K@,F购N2ͧzZ*[FUY-OáAEuw7yÏ2cIv7F ;6y0s ]YbI]b6 #+-  tH 0vN8@9KN)Z?CAQe5ĝ"ne;;b $ qgO émW svi$ k"鳋vIdUoc)E0= ڊ&!20pJlGo)X@=%J4/RZ@zZKQ/BK"n hr 4ϳW}ʅt^Ot`sֹ!:I w~οϡ_+ 'V \:Qdz?sݓE\iXSn.ը,.Bl(C5}ttV {R`edrDI{b'3/PVD- J?HY X+9P#Omm6ت25:BE Iǎr~a*DD1JH[(I5L1iO((^P޵І=(&hV9{v͆Z 4r=sJ t\$P~>@^iޮb EXh1(Jp!)j6Y]6hDzUR|1ʺS)`C_=5ZjQ,]yg@|]Bw]]R^hj1UWh/Bf#o?ʯv<ֲ9PYy"[8 =J A"zBy2CeqBIȜ&-Dde1}b\dv~-ƿ|,Ȍ6ٞ|ǯ^S7 -Q'7,\YIݝ'hM;uwr_U^VKiuwrZ_Ww'gM}#D \SwC`Fu̯ןkV? l]6"_^,ӭл- &_>Ҕ(58Fj^O6a@?ޙfx;8'X3 -M*~4&<(*. 13FkfPռ63CmT+gڨ uVSuS?3ԐkPUi#|n~ip& Wل!}Sߥ*Ra:Uʄ+< !*S>oC:ݿ=ȿyoshimi-2.3.5.1/banks/Cormi_Sound/0033-Long Space Choir 2.xiz000066400000000000000000000041151506652756400231020ustar00rootroot00000000000000Zms6~=GL32\B&4-\ ˖M҆]2jgW}| #GvE.}nquoOӋ6z<[^vєoաBQH}V#~$FoI4KbxBnJ}nidQ!4 Q$m]LOۭB\[{cǓfO'߆dyЊh޷6J$KV ш[,<|ۡM%i֧|Dnh1󵥍!}"R.tzW?%~„lXL(I,dxqZM`as5NmKRkĥ H&O=/#].iTOh?otu5u~bUyu<>M taG "A+?g #?:"!Z 17Il =4 !{"q.-J[¢9aړl[Zm_OMW#)2EԢU'@)ƥI|bQ~B7 8f_2k!#}uw"!TB\&#y8Nv6_ .iˆ"(n;XQɏdV1#µ%a&Y܀eMylň)J$mɂ.]i1={Nr2=#Jw^{ g)7nY`U Hǂb|m dMGKB\ ePڥۺ,x^G,[}yPRe%44ZjVX%WGF5@QQ*ʰ'?T[ EI(Rشs|ԎCRjVGQt>V*itsaB+ɨ*;FO))^(Ûnx=^&%ʙH5O:qqN+H\fw,˅I #epS(Fn(8W)RSEVx\PyRV(-&/,hc@7 0X5r9נ,uV=_vG2*ɯ%Oԛs=B<}q,<2I$.h W黳#1 N8zקsHG X@?DY; j֥) ̘=pH j(y{~fUбZ ^ %*Xy;9jwhqW%dU α[gOM=o?~::>jq6"҆3&N(*\Wv )O &K3ڸ5(L%R} Š<ڀqw5r7\]'H.3U,+TSșRUԤ*a)YِKH++i TE+*׼:%2bDk7hU43"hˈm!Dk`3! ~8 ~Pq@yDǗ$STFSC}p/utXm,{25Ҕ=𸡎'|׋q 55M&iLݯD 椎ʔ,rSEՉ?қL|0qyZeoJE\~Lnh;5oHب2ۣz+.uw2g&} } PybzէS}v8սé>?T9`>B}8SypIBk4O.hYUe&Q\ zx:+tF\DΫe<{^7z)zEH^jgyE_g] 8z|fWe<&\M؂* >r %\Bםz+õOkA|tҪvîi^Q-vZ;[7qYʞwܵ+E!\? PT",yoshimi-2.3.5.1/banks/Cormi_Sound/0034-Choir Pad4.xiz000066400000000000000000000040531506652756400216370ustar00rootroot00000000000000Zs6~#n1M E#l|g[?rlI^6Nj+>4 oyCjG,I4f*g,rFv`h|5 iL9L6Q"Y<2@KLjX7_ƼwuU.G\}{—!n֬4H0dulX y$؆Ss@Z`*ܘ'ɒj5B4ÛTƙ"*an J2YjO~DMb|=4}VEX"\ JV(&⹢k!"0ۘ_,)GkaقF7KWn[*Dl2ӛxtAn@&Hf3(TfA;,)M1\TAҦ,!ؕfӌܳv됚,Ѱ㾺1TE~r3 Հ,Ș.FBV4y$A2\QPoU UZ˂ptj6GX뜾d*.D57 R*,ļ>2 R.V(ƒ* h" Q F-R n#I[뢐5tZRK{J>Cw̔7k12}:Me'0Yqh:SPRS !)%9 jl-ce јRES_ᶑrd#U6/*,eJ+v1Sp6(롨gZHmѻ::oEU1zJ]R )6J2p6w(6,+g" DZHah~wY|l#h"y4J(<)T E D &hyMX)ض X`A^kR_s\w:a+:U^On-mޛ-gQIB&wQ_EUJ_}%eYtћ>C?bp!e@"Z%VBUyuNDuƉ(=2'ORb/*0(M.#⾭aVwi鵻සOOGx| :?&!FUC}p7utX,mJFuix[׋qVB}ж $T4}gqllsRGeJQǃ JJȠ:GSTD &hN11>3{Jw7E7)M ˰ߔJ?^SjюjQe^GuWT=eϸM,Z\1yé>=TNupS 0>H)BNV$b.5O.FSk;}oYb_VaYvVnQJ|3e9W?| 0.x -`*W.W$e>GAm8/`j˸6_A6;{d-.-N@ M3^A݇CVT^_ט|)yoshimi-2.3.5.1/banks/Cormi_Sound/0035-Ancient_Echos.xiz000066400000000000000000000024411506652756400225240ustar00rootroot00000000000000,`Y[s6}_AL'YR mEƖ%gC}`|dI}I@:>G'1Lɥa6ZxҸ[OO 7{G_ī_'>PUt'!JK6L&@ CҚ80>S!@N ܈ [70h@يc[gd8h:߶0+J!܃1C%h2xqwSgNY6Y`̝t=[Jgb1Ydue G(d`" Q"B~'?L>1ApPj*wYwg<-[a"D~xl)ܮAPlFR7MN(5 !BYUKF0iEq'ә+ۼRoJ< 1;^$ D/v/ !Xi!@!e$F"*:g"ڵӃyq/eb&g##s弩LiΝv?&9 ծVF <$QtfͿ5$n:j̣0bTY+E %mdŌ]h=z[\RWBg"c1@\tLN[Gdͺڙ  đKUbIR).:?DzTR,K*b=PV4n<enŧZٲ@@hTs(5QISc>בJr~i0A5ܫfM<;1qwZqRcũ my\P82H}ogRʽݓv7F$6b,P[7/6;Wx#u9Ϛ6Gkysk^~lHlIz2\^ݛB5ןGD.1?|BjɘVZ +JypQM?HΞyoshimi-2.3.5.1/banks/Cormi_Sound/0036-Campane.xiz000066400000000000000000000047101506652756400213700ustar00rootroot00000000000000[[s~ϯKU-Zjm>#l™~[s4-q񆤲yI8|C ~*ؽatSo7_w"K6+ZҠ@w^So\}_ <,NjCIV/َWut<Mgx:4"0jM}p{dCv1s@bkk L<!޳XK0б.\s< f{{a湐>}%>%Y.)? qd"q|.1,"lf+in `  <_dj~ Wn.xμU5{{ssˮRKJaލVamF ]*V%3?deB`Zxkӊb$=Rq>똟Q0퇎LY]N8^Sրs2-UAxa\V1-Х'U|ͨz %z, 3ۗǗmB"Z*b8$ %cɁ*@%STT2,~19#Nd 964]>rH%de0NCz+w[Y3eļ嗒FʼGy7upr~xxݪ|">Ws^BhIGrO!P{h>@gr/l&x0g+7w,s8ؓw:bLF,xӻJDA;+Ύ%KV+ab@01Eb }"bVt8aX}H^*!9:m7OՅ* A Gڅ3yaҬuL {|F7.+;U7LΓUIF3G{2|BS p4K"UH l! yJۈQgrҁQs([Cͳ,W>7/uv4U\%Oar\문D|/ rҩbG7`(=©QARA/m9A[0g lƌ JCr^4$[l|"xٽTPn l j˃[) b!Xx%².9vP8w,QNhFUר *)-Dj9dr%"i(*C@U-۴FBIݸ?Po]u?e(c:ʜQke V*f"WJAUq(UZ<]c:2wBEOJu{8aO9ҟ.J)$BHB_ np-GU>G.'R_:tA9ՒÄP6BYsPːRP΀p)#ۆ_$+ zk]J'G7HJp@M\IN?Hd]I)(h続<ԭu.U}E_){(>‹t2 5E1׈a:qy0h7ܡBA,9eRydxRY#-3 eJy^BVZM{SjW47j $֏ՁѸsd\Yg,c6JgGdK\u9uo`nj)us=p2߾Fԋ:J"C"5 Nx)r g2s',vڏD`> >@InVV7^ 8 =t;ThYBvhۯ]ArݷzeYr}mY=*PDTjԼWDyTqCQYUĚ(cPfc %ZAȘ#vfuImC"uڶ?I"|V6 L9dcgyh~ԛ#"}>+ _{ [#]wu0i2ӆۉ nGEXxv̦*sUo6E@l mwa5)ђ]J '}MOx5ת߳SP=,rs-wC}~ (Ngz"AOpC($ #q9*V U x*?JM߂h1R Xȏk-J3Ҿ˱\ur{cݿkWoDe!^-ҺIZ_&+Fuhdݳ<wR 64tQ5EvƸI*]rKJ)23SgXW?\| L6yoshimi-2.3.5.1/banks/Cormi_Sound/0037-Chorus.xiz000066400000000000000000000030011506652756400212600ustar00rootroot00000000000000Y]W6}_ {L) 4 m鋎b+ŶRKaI.i2]^LRNYrḿvI¹ ΜO>ҿo j> wA9tMc: c6<<@g-^E·{iLJ#/4!\z8iFrj$_f2fÛ1|ZZ Ʌ|G$8ZhœV4]Yׄ[om:+o[o?kcbRC*@jY D9Zфtu_sbAec1 agF,y pȩf,SͿV݂cݹ[伾}o^MkeG'Ώ~;R?;Zot{=2?%P 58gA!,΍ Z2%j*$d1ԲVn 4[F' H>Ɂg5I__-RB("3f5 Q<3drFZoDJD wJW-X h&X(Eʮ\t#y@;:/LJ^~༌y^6o̓Jo̻ʦy$g։8'Bi1WlNPVb*Z8޽QP4 -$0"?J(eflDo[R4$bH'uZ eė)P6Ukeuu`p[|C24Y%eYCPJW*h02 p 橕]y>4:ﮮF1EH\]h(HU\~>=j&jMNZ'hM]Q',(K RUZ>\/ ,r.\hMy6IJTw%b|A"NuCyR)k0ңm >\E}aЕˈr>*._]ޯ?%ܦ#Wvܞ]YuK$wr}7#a|P#{@}?s 돯IlhG{ p1%økڥ?Yr>({ZjkA{+s.ffَrʟ?J(mEkyoshimi-2.3.5.1/banks/Cormi_Sound/0038-HellVoice.xiz000066400000000000000000000072571506652756400217110ustar00rootroot00000000000000][s~_}jwS`C+68={^T$$|ɯOns uhӯϫes?W_Պμ?v~?׃^|>L8B FVڄ̬xZVͲ<8+cJ[ŸkaZj%%=f=60Ћp|sջ֖oN=oYq;?^Fl-7U+5L</v@R_(uMW7׽vp3;O͕3wL)ΒQ_O'4^M B]X.m%FX30Ad I[y̏3c Ɖ*^;C;+%[|ˋۻs}D }^S zWr͵y* -w׹?NzKy 0q#Bh/H_r|=vm6my?wH 6:ˈ(pFN\ܴ f[ߚzR7^R7'kRdxAIjnlP6@$'sk4B%ؖV"҃Bfiޓ`l*e U˅#+/2p|!GmZIڎgњbZ3ֹw1DcyvT؜( Meb%HZjio7:#ry՚&-V/$'If P|M#,?ΪdD(U$x> z!9C(mš ܸvyd/d~93tPq  %*J5  4,#LL-mr#dv3Q99dn %2"+ RC^9rTTJpiX>Pj q")VvF6 ?C!C)H%.GL.8] V@$p0oKKuˤO dsC8^0,tBJAb9۽bQRij^< Է+2zBU7Z(?"O5Sa,A5 beUVZF}iwxP6J6:n.hNlح4s,{+I)9үc2 P"V#TrK_DHhg}J[:ѭIT:RH׭,Lr ,'v*f!4gp ,qd$hoK~~5Y@ :QU~qܺdؠL44Ȑyvnʱ_48v7&`K J&C'"d@:T"w@z`Q<LR_2I BI>iQu_2I J%t8igt8+D:Is^ɬ&/N(`_I r.L\raԠPưdQv!IrdlHU (/rJI]E4"t0FdJINaj|$pxIv8I-J% JXR1d9풅 Z @ y0(1:d4(,$v92=u8C^ rEqaPPuPt(5)%l:ԡo4$*iR񳅇R:6dP81,Y 6й(R:s :t&EA FqtgLHD(z^2I;w8/I] 'Kt8ɨSK:t[J1mڂ 7a'E(N}XS`{ga@ Rbi]E(+QGU8J5N&QIa#+H0EkS:Iv.) &L8r|{|=0D<1"Glki:!`?GAOim >7[(`I6a+ŧ#>楸V'JixRMJ|߯U.uO'ukEW&R~Pދ7 MC9+{cߞn%܎;[1=\蒛D勴IѝIߚȿ93UI5յ3-#":ʽnr7)Buc:6{`=NX=N=}ޣ>'۟;LՌQ#!qN*K%p88eW 3KߔK7 '|[|c$1‹Q,u9u=szr'픈p;%B۱dJ(3dC%Ol T)uJ ըI~vP*f;(dhS$._/w'i'݉n;L$w:+"W5ʾ\ەL|"&>)p%ZEM+363 d|yoshimi-2.3.5.1/banks/Cormi_Sound/0039-Chorus2.xiz000066400000000000000000000123071506652756400213550ustar00rootroot00000000000000][sF~_}b$.̤W18E%l+E3ίӠV2<$vS4P~׎dNCv|Ssvu:|?9Maxs_Cͯ_Ҭ+< Ixt5ç8Lլs==/ԛ$pCkGec ϯn.{"\wi:;Jy;;˞1XeFVk֎£OZ~M>Fwӻ7M`O~ʡz1H]R*wqͳ`-8j%Zh9JAtM>.QX~@Q(^(߰*?-W1cs? ya{]x p[eǛ6P}4]Q O9[Ռ*?/rTvϬ[c=>hm< [0ˊMi݇RYQ^PH0/Z0LEIx7NSy˞&*H8 ӗOTOteQ2 T:&D-c,K-V˵q>?RBe«82emI!S]Ll}b,lY( 彉Es_T(׋?n.|pW}fQ 8nHe`bG˲)jRm5$UYA!5|rqV 0|%NUEY1tȠmb_9$xP]Zt6dFT;t6|rl鏮ia*iN^Xk8ɃB׿6NQ6C"Q=ev^_b |(OrḌ4 ki&{Vap^_ cū( KcWQj'CtՀ-p쪫Z*g] Jb#u[*wvmR6qU闪EK3rEȋ, B{h){6`j1tK` >2z! 됓F0FX @ŃNM@MɃVᦺU b$¸g6&(] ydea'>7)lC`=l2&ĨʠrBXAW/aw>#}Ě#@Mb] M bV\B vB! g6!) }jLtLJ}ps&YbUx@@l2. ݽ`de aԩs0 ۠G=PR {Δlcvga]jؐ_W` g@q6>=c2!'-z)u֩[ C! -?LQr'waܻOUw!rΘOCLRQ`PD?&E2 ^W7],&F }ABVFFXb 3I])xv Wؓ[P ݵ1Qf!Nwߔ(bhѵ5#@k}#H?^3)c~rX皐?5yXQdO4r&[;`%P=,OW+;資?dD=y|,AyjNhz!Y%!䪡Q\?-$u(=r kgm}cr6fr ?-? 퀆ڈEߘ\56Rg Kߨ9o, @f=,A `-X2CJE-tm,A5sQa icsrͱ6 O(7MK<%7Y IK 'w!ɑ!v?fc2}3%2L ǝ={X?qo,K> qB4Wg1h21߀ܿ!e ȫX2 ox]XjHbiڳ@.aE},oXW}+W4:5Ru,o@1~ocy2cykA77k"|,o@Ƒ},o!yc5!9*gOQHP! h K>7tc9*rIX,`j/Y|,qĥzN$`oMb/MU,YI eTl/ TQ̤HUHbw/ mߋy `FқaF{aSGB;H V Dh(b4fPb%¶V0'V5t! `1 ^y^ o,Tt|Д-֭tŒ$ )05y Iű̫zbHJzTJ\vA͂U*j$UHZm$ƶblMb %ؤš_9YI@d賊u(r^`$p~Ų%>"`S+6^C^bz,FRjWP#M#Q#f^\Hq迫(Dc tb\5Z~X6"x?506@s5={Z?EEMюAÙvtxΜO\pvQ[MoVQ\z;3jG[wtN-?Yg|s>oG4[ޡ cn6շՄU(!5b: %ĚLXB*'#d21X&TC; U"Q rB|>eX@ NC%PHns_?ol_hAp 2ӣ$C;l2cJ3x tw(,+Alb1TNa Ϯ.{lm\ݭ ⇇h)3<>(LJCpR9P}<DhbBHc泷;R2++q|; FUp4/q0/a,*Oe)J»2ڱin@ty5Ms6 4͠h;/4wQ_{|m,?r~#Y~XqkbQxdQ8B +dp-LSx|f Ҥ Im~,RgOoHٟ_TWbIm9r=Ov9rsx4OW~VO g)3ƹ Kߕݴ3CXpQY D ?G-ӕD m';{^SI)L5~FuM~o|9ޮgxގgy'3Z0 N`~:n-_)F$>(%c| W-֧wrUthԾpL_ %% 'Wf0?ڙ/yoshimi-2.3.5.1/banks/Cormi_Sound/0041-DarkNight.xiz000066400000000000000000000115721506652756400216770ustar00rootroot00000000000000][s۶~ϯ{*lyIG婦ZJCKF"UJ ɤ|X^}~}fScoWqǯlM"c[Ef㚛WNs5¢ x|ֽZdr宻6wK!"بYr0?+/6alRa=#wdaLװ$TV/'1ࡒWP[E\<*sEc1Z=e _A*XN& Nqeq});rsn~xO}hNf7.Ke6Yf+j}j6j:}h=GmKz-gagZ >P{֙ B렳![٦m3{?[Uۑ3tRNy}AAVGA-kkYQ,GfmiXG6X[Z)E):>iM:+ҝM,U$Kw$MjXzGSuY nrL+ѝCw6AwgR߅O;XϿ A[,s2ug;4d[EGwoʈn^I(>llh|)p?"::;%$Ag:ߙwK.Gwgo18eEqig:I;3A("Ag Em I;@83qzuPtj Vnehڪ6 mKg2}e٢(<;>Î@LQ9l)ʠwenHG <{ q8#ez4҈|U}1.1;E"cd[)rӵbٞW96۸Xn(.紋%vl)b)$pS({7m>KXaqҕ;4qwR;T4rxtMp{w 8y,P8~{'58"Ue'!vt^oWafjNdA; "fB6T 5SnQfdYH֢6z~T̶Ez}Sz㺪" 7$v@,dB@+m;J)0Pŗdjr,҇a*sYŦI󀸒! }:}z$^$tOF'ó=B;\S&JX0}i;7b]A<ȵ2 W, r X5W6`5'Z=`ZE-<ęÄe)b  +6,;Pdo%BP IsƷ1ZSbgTD|`)X~V}ȕ]!s־ukgrxXv#}vOk+W"{Pn#88 ̀@cy/lUD!-h1,-`sa;O$E20ˢa xvY׳sa Eh\dQf;ҭ00fanaanaanaanaanaan&;m08zAX@&4Aؠ A |hn0؃^350(`۟þcp0e30K: 9M ;xZ7:8ճ؅S30kL}K,ZzA]eЀe`!~,/A(hasssכEȮٵ )s )s}}jO!0zA)sqА@TLkFkKaaNޅoܺ)s-M`F Րl~92ح~IǼ&\L]B>lNj\v|cvA?w:us3;&j&VC[ iF=jj&斦kHVCӮ橉t#6i#A&n5ߍt#Q5t7uPCw#Qw5t7u M]ԐnkE@ ݍx B*F]@@7B:bs}H9[h98'ة{G],gD˛yU1ѣ x*{˩r NìM]Ԑ 8. j覜ݺ)F4햦\źKڧncSW5)?mw˛`?irCxׯ1 |Ƙ7Oujn52(FXj NνFX猁pMO|?:J&Xs߅MU|@'QX2D[;:8:8:x 'p<PSڙ )Y q uΓVpzT\86 ZY nff,]%K "!΄w}!#q^`4A38$9gI":Y!@|yRo^@zRMd2c=H閇Q>at)q,*]>.t=nȝ.8)ڰD drzڽ_F_BH#bڌ$ rV&"!ud{3 {NؐiJJ2Z 8#eՊ$h2-Ҥt+R@I5zOnt= 3j˓r/R}+ِ q.pSU քP:xu  /\! b5󧉡i=i{ b!m8?qc)I&/RS3Sڊ٧9qp S's`yl'9r/9@߀YoUYMs+IFDAVuPd⣉"{VG"ɩSNV-{*N"`(a0ۈKiE&(F:yT"c[M\%b!&sƌ=bVOr Mo?=> >ؙvGsۙ߉x?|dt6{=΃_&`2_C_w|MX5?Yj~AqUgTϝ;߄tPuwE*汋vw"lE[X-d;?tOy\nlsϛ0ǧ#rͭܡ_݆/j%`W?r9_r#yoshimi-2.3.5.1/banks/Cormi_Sound/0042-LightDawn.xiz000066400000000000000000000161631506652756400217070ustar00rootroot00000000000000]]sξT&mYL3-O=vړsá%DHT׿X~h? bSsFY>__gӽrϓޏ{Q2O۳7Owzurh?Op2Yߝ$LC7󧲻7}_'◣Tp>/8ܻ8L>x) Oeҽp SOFr/0˳%m.|tzM`t >En}]d}b7zx1]_Y<)7TAFUAz%_$iDAt1lC@wPy1>Lm8 \l?KS'WYn?_|dLUj<ľʯ>-"p.gieL\`X^||"l]lV6[OeNˆD^ϧp蚋ZIӵ32L&dїx>n $p6-!9qԦHFoN^7^c|% XٸctM0Թ^qQ} y|;A|P7G>_F13pA,Tch! 69%g`=K |9&2FJKN$ s(0H=օ8 s?>̣py&׵]tǶGbJݒF1qhȳmڱ2}$\nEw$ 5&J?ށ7@k9<#\T>/`rJ~h pZWt#k 6˝Dp:ST"U6I Z# r!0_g|v=ˤD:Q7@o<(0ZzC16GyBPŘr\#mh6YoM~jJLҒB$m%}W^u+叴yT>z".~h\zm7gD?;7m+^|`(3a$nmtf lVǻґMfeX:[P1 ]?k z߯"icAtҬs.GNJS\rԳzY.G],ReUh[ycg S_X&*3F Slڲ[P H#g= ^rX/FRR׊ףŏta!Fb!q"0ӫh"IN˳I#Ӆ î~:՜९Sy~&WxЭą*qq&rga2U!p#ˀk]-xй^~AZXtHy`.`.`.b.#{wMˣk;O1+C+nBpXsST njJ~75) MM0wR\V`3_7gnM#t˻ hG^uv.h<\eT=2fv?$v`21`100!6HSƎLqKLq8(+%άsJ׭#vd08"8l!l fμ6Җ]X%xǮ1Vv)UɎLjJF[u c(q٥1f`;`/`.-nk|6|#; = Iߣ#KLpVӪ=iU v`avCN(ӋvWsP )cGL/2Xbʸg)%{0x@qK܄ = pu Fna` 7 pؠ DFML8̼ yM;i(u]LW5O<$ㄡHjp L+#=1Q~|AX=ysLb8b=aîܧ<52 8;2u`KLXb*SK XT%,1dpl\vyd=$X 8grV7Pd-/hGzY .}a[ãS^5906k ^@M/F9+MEd6TϯrWBAcuÛ&ԍx c݈@4Q[@FF*݈ Cfވר@Ǧ0v#^7~#oy\7>u7`&5fA XT5k}> xM<1T?T{' )Ggv3ƧR T6?sBU U&Zj݁}*^O @3CJ8jBlp8P > 9%=k" b4>*yͬ S~\.SHf$iȇtp>! 97S>,nlxj*bPl ^@Mh M>606knkTTnkGqOE?ΜP*r⨩ ~&>9=͜J&&bǦ"S3 @5J ֭l.R`3*Eޒޒ@VA7Nm>yT6?{'"W00Au1=LxJ'OCJfMK$Ons~6^m1}\Q]$\1pII'R6ȏ[p[uofQdM @D![vq){4;7|sBfƍSr#T̏aiI&n\!K| yM,B|NXt]TuscTK}` ͠"DbGգكP*A X 0}<٪ |=б\ 9fTx<&H=&*Hpk[E ٫,zLռǤ zQ|e}W% @K(QfǴ:YT 2:UTZ.4QN!A Pؔ=6DhGkl*cS,-\2sƦ]M!BlJ0L5=6B%%ĨVxP2dЫ߾Jܜ|imC%:Zk}*G?'H`yv6|q W^0I;U$Pj:D3,R-]Dhp|#핽WKbg4@e.QbYNLRr%bސidXjُ-^j rp(*w_n%VgU%Z$-x̬-J/0%JV|C`< |px/`>i xhÖ!QO?ŢZe+0ЯSl[@x F/=i)6a[S`CÖ}ԜfA <){tQJUQP)qK(Y˸l7Te2HYJa-[e)y&l9-P$L%QJzViTXOld9~e,DYJ;qg&-,[ʌ4,֪RʔrUKؖo\cYJǬ6oSV 1Λ߹~ cc7SmcV7)s1o EGYk5dX>QM44N &#QR{6U;lfv*]5mj|i~8 *O?}^/FY X7P) qZ0ł+Any܈Cp^I~ b~ȆS>Dz1 S9(BK2fAո &JOvS9i E)Z-EyV@AڎQdC\Gob3]=e|!\T$EHWD[hfa\%ҽ0O-sY$n,03C]|7kꈺdU/:<3Ĺd:u-kq\"t3U}K1V"NdytS6켻" U8j )H,ylX0hx.( Ѭ8]H^WCz¡Mp)Z0Cnﰸua@R)Ck(u=^񮇅$\1pc9Q/5wyWK}|YRgO56n'>5;7sjL;@ !i2P|:ף!8*Ū4^9=&Mj0^8@IwشJǢ a)V}?y% v ++u.ߓ,@M&SuUBB ʉ9$^8}ԴS.Yjl/c`5˭+Q_f{%tջDpmҁIYa4I'4tf[/Y}++@Sk,MI5\mKDU( Bp҄D:*_i)z-W %f߭E}uslJ#U{u*ݮA\óSo(tURNUL> @%gU Tsk<05 pft*8Hύb:XKjR"!ױD *#{Jy $o֋pjV^V7Y-W_aEwk15}j\] 2[S-%nNq%7eG@}"UChM+fblk(Zw8r2:7/FP vtg5 tUT^׵ V1z]*WZEu]_g`2-;ę\qIvZԨSKWq 'ٿ@Bw.myoshimi-2.3.5.1/banks/Cormi_Sound/0043-Fiiuu.xiz000066400000000000000000000104601506652756400211020ustar00rootroot00000000000000][s~_ûsn5BedAʂđw_ZHs陑%_6,ݕz ) TĜ-~Ee̷D]~4]܌m`gѸwk<[zt-wmI܌dBYYmV`N-썷tG<ГF kk!Xm<ֽ7Al顂.tiKfh,Qp葍H$,d: ;؉ ݡ?>ty7ڷm6` NMD4LP@`sŠmTDUqm8'=:cݡ8{]#Ft9s7Zn_@SO@S~owϘVD~굇6t fn-èÑv޹hg2MOC gW"gr u̞gPG܃ªX!熠JNR-Rfe~഼o&/*oe{1DaY~`% piND J )JTM8P3PޣRkJǧ{AE>u1|Skl:H,\]O2GU$jC&r,xJE&w .о| s Hh"gh‰wB#f[˯2mS2& |X,f6/?q:UW)%䀸V-2Y)TDn9z2fˠh̊7_M' 6 C` ~4BfZxJ`m3&%7UtQMF|3bnP{ ga-w)Wp̥KzO4m.Y&P;u; &->@zE#s͋{j~>ifk_oe^I(EܧȀ19p<#K~cqЩ ?lw&1u6 =O/O76{3 `#R), 86\ymS:(k@֋tt*k 1Vll}u;(A\S[Nn]耔QASid!FB#* 0mlzA:Z%97S"0K]v쩼4IT9']5sSj}$4q_hw6h.2s0yC5ZWbDž"No ,~ TUe0Zqca\L-g'w\\]?mDqj'V!*UU͵:7&)3,ć3\ۺ XT5ÂkWU(jN+ZX^lmS,Txk +ZZCOF{<qeqE1W6 |}-q[QV5XHZՁ)ց$KPUJ^qߪƪ _p(ݪc* ӆQΥ=St@.FU-q~vU`yULkaJckUc8qfu4.VUZo9t}(\),Qc(n5xH!>2=U Vҝ.m:ff ƪU_kaJwk)֡4Q*u5xNm;pDGW: kY]m\o Att[ViUk۳Z]W̩jZԶjU:FEa* YkFݬ7L&:icţpsU5VEt^mJkkU8ڴub4~Jf/!hZI%H W=(R2[6ߐyv/mx}5>͓'/zSWsY`Cw1HPGNć3|F|Gdću.b4&o~D|h<> ^Yt(Wӫv^؇5.Um qE[9~ FȾLfn~QUIguYQn\+~?O񁟧xlο,`~^`~QXآLҷ-D0K.+ʗ4oHQo(S)QBy|\q,ܢʵeq: 5yz{fY _<xbBTct~ ze\;0T3>g9Qȿ=.pMEͩB+Rsj[eu+$_o*P n ֆΔ*eE6̤'>f?c8+ >ee𣬀{b:,#BFh 9H=XMJ7=.SH=%65zs|y:/o.'taNK$r<r9EJdrKAʱ.u?)ǺݥRrKyʱN5_jTuf9wnI5HV_+ؓM^y\\Lѣ U#'Ͻʥ"Bx-SM?a '397#p=2;\;~>&%mOߥlY7K/YZPڜ`eK+HlwUYO}Ze n"nZ"M09A}( q$\d",XŜbNvr5xpz)#xIgPvR)WyaSo$^Y])` J=ST)M?1G+>~_p.+x^>Uۇ>_nMd'Fu;M/h; K9p&u'Yx-7m8 MژJY&@!XP2\^8b1^ 1fيXu-d,͓8MRB1ZiQ~z !w5I "qX) N*mfB+x-'Z_$Lhe"<9q }#zQZ4>Zt뵖sGJƻ4MjHTZ.H%ZQ1fsG"{. Y+ yΉEkry Y^].Niޏ~xUIAEhd쬦ŖI-Wo]efIY|s&^lW~'z5ҪNXQM˶4Wk s966Catl;Z*= d{W:N Ը;POqνT-mvlZn0fnֵRP@#JPP- \~#z+MTEIcD=^oȪW믭eR Bk!YJ.Pɼc3Jd0m1PZOBOa-mϊ Z0Ks5jao&(77>d!Ѥ 6zYo/;2Ե֐WSX<)aՕLp w9H)0s64MLJ-[ܵW7ݳ׭4X1;_av{=xI.<{y<0x琦UpdNGK( jH֪螏:Ov*=^h}'A]&|n';˺x,zDDə"e+DB:UG%8Fҷ6aAc+% 89?P-uNzs}1xIҢ+J6'z+&pm-UWVrM7iy\!oI&`pMpk u89dNo14`ِ7)[+ ;g6`ـ6` W x0` &n0 8ƃŊm]`0 ƃ}}̈a,1#q.b F cMm°nu0VuÊ=ugg[ +'0`X37=0 M0 *=8޾Ta.kv[8)ȜDnx0` a<1[>b n°~ 0lF P0aH8FgV"StYI&`!0c3g膀aCF"NeUCxbYzљö-mtjѱc  ƸY#6ُ؃:Fk N#qH5gԈj#D5v@o_n݈jcH5nƐj6e ƭ7U| FF{3eD48-b}vqv:gQF<шg<OtF:G#h5 Oyt#SF\]8(3jɡ˸MFZg1Buh?eEV<猐"oFơegEl+f5.Ku\pL\dvl;pP8@Йlnx8ܵp:Y!xx3֡! ׌ufS&"B3Eaa|8x#A9Z#oCґá; (w0Gh@%w+*q 9}E:*`@#m#h5ƣx4FzG7 "lAQЍtH $1$\scU\ˡ=n>[g b L(Qv(x4Ќ 3CRE šrP\~FQo3m܁tPB\|]Qc;(eF(Rڏ_=&̪12#s;Y{y42<mxt;nmո9w;'nG9seyf<!`xxg_p{ؓ FQqQHU(mt_3t5R`/x(pM6EWqےrEU(@xhh5m5B |Q$4s5ƣ\|QB<pE F E{r9ܸ\5rK:\V5`ךּ{R;}$7KT̜;{ãy-$|$/\]dsJ"-# w%L) .e!&PkMn.ˋOOEJ|La$[y;i{|U^ ofnx_ϹuRt̚1%^Q;H˔#z/+9HD"I|:2тP-AD*pZ`գde(>K%_qgU.={e-^Z},T&Bes%>]e9b?7t 2` 5zLJ+i3GB4Uѩ<`A 9VGEMh_Q@'Zf%![6MK~1e/Ι'hcτ,$= 7J&K*@qAK+b rOĔ/wyt%r&Ƨ5mK%I;t싖@6FE^eڌhAIe !'90j3:^&NU:;Jj\V-h,̓>=,K0Ek($[ic, 7rz" LS>TĞNxN?r./ Y Lٶ,"-ȤZxL{_[6y$b5;32mJ:ne͋fL% ̋9źXHd3..^o[HX70qŶ3m[Ď@VbdmK܁S%Ivb5B-$m9PQ;ݶkiA6A7-(濯ebB(.%"`oS8&\#\MQm)z=whG<) 5/:e?4hAUjYm M͓&WqR}`~;Mc15ݫڥ2ޘ8pWUZ۫Z7uTu(bǸ'zc_m19ՙsS(søH9yoTM` dvv}krj)q(!r>=)[c.'7˓GcoYD\kQ"e̬2'%Pb4q((l2"z.G}"{."GpZǨX?F(cdMV|zz/+sQ&U\%1Z`Թz|~H+^ K}_Ͼ>:nyoshimi-2.3.5.1/banks/Cormi_Sound/0046-Spazio_Profondo2.xiz000066400000000000000000000054731506652756400232310ustar00rootroot00000000000000\[s~ϯq*RK ,2%`# on3Y*yI,zzD=vK\ڵl|a6,urz8F{o >JؽߛMVOl=i߉ce'6Ku`>٦S]݃o>!WCϡ~P;=("c$ڱ^AǓt~[`zd庻cM7''ؒO-KL >Q_I=XYOŐzp9/c!3ۖMQRt_;{Gl:eɇEn6t-PmLA`:!e@uiY\{͔ 3`U'n8Y {5NJa]8_mfwaǿw-\m)3h5voLBY2^JuSj1W;ᒥ7AqR ?ꋚ\!)U4}F5B: \Ć*KoQ\!T!gaM8?07]^HdC_n:+J-mG.=[}I Z?$̍p[BWmwUvFFVb=zq6_{WbVEQB7r,[pF5Z7ZzʢTz ܻѱ3Gӻݎ ~2Bb_'wIK2鐃˓Oĭ<=$^*9L\DŶ-wuJ@ݹk;8@D3pt6qvQܜoo%"0cwG Csl\oM-6AM.dvQ$X<|1#: yTF &u{usq]NehIhaG# .`phǖreV)<*|p@x63X Xs'"et73/'r7d+X48:gW(֬])ɐ"\Vź%&dbPH "ƉgM;YA北ޫ \O8D|* >Ɏ-wHsm&GKS79@}{UğWdJJ*T,~mؿ + uFM|n b[S;cpMʛ3]`_r6OK U gS @eRtIP:Tb-GXL./JQS)uʬ0 paHaf()/2 }z$Rx&XƷ' چKVof@]MP'E'[)La=1ۛ EZJc˴>d3ן/J&9ȣ:BkVsQ% \. k8~iT;j`ɩQ"@hhśJ%Sxq M̕9]Η|ye< OsؚÈ ӏs|I;jE!EDRȒ ͌zA^"KoҬU3 5Edl UKl21؞ Ùi3I>1)%NbrS,TFp6L|Df(.جVQI<|NzCÈ+!%ḃWbPa ۱Dy,%B@!p<$yς!Q| BH8 ecB썼VM8"> !N;$.wC*.)(!ф+JB5lCy. ]` 8+{2$t7ja49t;RAǸHnW:>z#eZWim8UςV]k6Q2(ުjnͨ`G]꣚ѨuP p`7TFΨA6nCmR''&糱|d9֮Laal,4$1 Ww&6*ʄTg8΀56 xcdPӛ"/oMtBJn5:!Lx.4с{Qu``f. ,FӏXvv!ZW;Ai)ꪼ'eBQΆG 2(7Qη;^0b8̋B@KQUX b -+UUrAj6aaO~VbbuddJ{S@;g#]ÆAiHjeBj o+,kB+&*? AC/ӒXiNfخ:K%uⅺN>s7.W`|r֝: Rnל/4+^H.WI߫xGa0WyFrVNǝRQZ*߼}!)OO3MXByoshimi-2.3.5.1/banks/Cormi_Sound/0047-Spazio_Profondo3.xiz000066400000000000000000000056431506652756400232320ustar00rootroot00000000000000\s6_{*SߞIґ%y-} )DHʱ߂ jrsyIL/_@>50cpMxaO>c6gu\_c6)c~oKNd'ynGg;kDO{viQ;=n62"9c%Agvt?[ᧃuw?6GIOHl&^=\įnDRߍ(9uKjrt;.WBȽ1dBJϫ~b>b7dqakݺe.50 \Ȁ;8oÕ+[XU~p;ߋ``B1|V0t>R"ujtO^  3o=Wo4qLqR{&ە Ll_>pLp Kd0ҙf lv?mx?wz +P=cLx>抖WB`E\aqaWU6[V\AqHs̰/&s$mGŪ.Cwy+Xdn !۽ m3KO2ʝ8R:rywKF{Yw7[902¿oL+3Y-J_"]Ur 1=4ˍp 7;Cfv0.|ՈNXs(J"Ȃ V m<T)&D_='~IMCS(SfR`ů \Z^ 9YMކKy \V0(S" Nxrh{8t㍲rJݴmn\Av$<߅&(#H8{3a/SLQ 2t vH$QKmeTȲqqaXڛ/p(MjTi-BPaH \TaQ6V˛#œ=Y8CEȊؕ- !3ZzLe!!'S [2J_­J%j?CFdVJvDVAcSAڅEZw *P"*P4/] |Uk)?ЖRPtbBL#۱fEDSL3݂rB maJQJe%»Rfek}TW[2_NWh>&JængKb50iGn@r7`̉6'B(ŃIW9e=}Yewp! Pnm@ r( \i[)q~pnƸDb:t62eU@sb @ڵ6>d<%QibOKZb-dRcλ O'3J tUc"Zc_B@y93"ݘw՘z\PRGg2v\JVEvO]]^#"Dgz50xA9cXCK0 +mPj #xٍ!t6\ӝCԛ@ذ feg!>Q)TvV!(PXnZ! NdKoהo-: 25+ 5ښ[-)J`wtBu{~IJ% p+Vz=ZDms}1Fdحn*vnhg5;,G&V)T$T+0}pDHJauAE 'A=Ӭ0^Aиyy8-.  TTl8zTG|&/#Ts)[Π**޲N0 oUmuCt$oI&D 0&-n_j@dAW"˺IcBd ]^d@9X5?s~̞b!CKDp3v/T蝗|^T'h,c=9XgOd:ku\ g`=8mX/r꧔Y|VFx"3IAuRP?R3(@?kn-B+VzSx ]kKR@Vh~ T"er\ᑤ6_ 2JW|z\_Rm`W׃jPiMd')K TORByoshimi-2.3.5.1/banks/Cormi_Sound/0049-DolcePiano_01.xiz000066400000000000000000000042031506652756400223420ustar00rootroot00000000000000ZmsF_Abax&NGep[!FQ8&{z; pN'X{vݓ,<4/ 8rw g>]wƿuiLoG[o|IF]Dx#OỉG=MGm}( X7f;O/`d:d6v4$+F@i>7$ S?o6ZXxt{ۤyϢLuK7냽{{nߍ";qK_s=bXiJ#^Lm#c!(- ZE^3G٣cB9H_#ۀ/Mu(?s ϕp&rp7.osqC;0ɅITE35y,|7h6yy~)dkV=)`R gOArHk(ZSE.GWZꆐrtܛHJ|%40<5YIlN^@>}d龚 վ"0bKbdNZV6@-zY(Y*Xk;0d8] juȠYTV ƛREݭ"Pn#x#XD/rl:l<i^ш-"xۻںٟ ݞl?vBJ|P,wV晘ǡRQb%ԝG'e\dq>qA}$mh)\<`dCuB-4fVȆ[xҧSNG0Y}HU T́ rEÈvpB%)n.y^]򐅟3#ц*Vk%Cԑ(#:2)u\jk`;@R Dm['I8s!X0;<3;^'谨hcaJ6`el:,xRS;,vdO+.ݴ֣lIng샢m:%3`3'ᢍ@H2z4Q AjSp\2L*Uq p,+ ,:1ۣ5?\:R a\]ׇٶi-L8Zد1 .SfA[Gf_eL6 $y"Cqջjw; 2Z\ Y}k__ F/iѤ0"֮*kb##O<9͏ZY5҈h7=u̧_&\HMv1\'Ƭv[t變/Ù@G??Ǻ۵J(eemo(=zl>\'$uinEٔx/!CՉ1XPҚ|AZ+5BZ=t'-i2NIoӊhfz_ǀ-#*ìҽelޣU]@"VZ%B7VAJg uVK:JnaOrާh35M9a`*w7{E Sœ2*!qHꗵqT2E]lF h5kC:a~I+oNIp&+&o)Z_ ɷ6lF0m4 hrnO;}S[;搭χwn@86B-YYj܅\|A[KBz/V\,h|__lJw_}'"ŴJWgs>S;OTl~ۧ/u||v1#3rRb;Gx.]L_@ r!|hHUKf+STL8}}]`Ѹ-yoshimi-2.3.5.1/banks/Cormi_Sound/0050-DolcePiano_02.xiz000066400000000000000000000076031506652756400223420ustar00rootroot00000000000000rF=_DGΊ* e)_3PdXPOtt̞}x*gQLWq~~w?_sʛ%VýU6-ݿKI'|Qx0[e>a2 1'5_y$n|>76O7s ¿>n./]t3Km~nn!V@q9ӗ(4̀͝NR&5zAe[7^pe][ޭw}S"r>x(**Ey/{qm`8a%eKh;+)D7z+(xV%xv"BYuvqs{}w]V i6{M7 , ݢ肖7pIy}tx?ܤ|&(1v]Bx3@e!0|>}mjzcܧY11^Hk@;ūsi]GϢ$߰4M$pmr Fp-q4Ln?W @fQ ӜJjXq@jޯ3|Rqh>cҵBdz;@<fI}.L]ڪ5N8݂I\4+*l4JIBP)ڤ8 0(Tp! k&zHU<`18mYľ]/VXIcߦI Jvc˂}zጨi߻xy G[M[%O 1WQ`2`r2@_{x:/U6Q"a7qp`C+X> /2*gjC]|BS$I@uT}u"PTcʅ7 G8 \??5YTD(2SM2MIDٗD`/rdUr}qEsmi@zjo1MH=N B|*ڄYDz<a&9 -0+ {@˝w|ꋮWQ~HZd&eiϢImk{r){ 3S<;=J#´VEB֤wv؁ йx',\>)|%@Q`H,ju:\khx_#xsvIE:L#EGQZ&'Q}<֎"Tk"Bj!$wsya]8Q7sY[3ǛɀS*Mޢn lK7t F[$W)pWO>6KGH@a^r[TzE:sMx>ɒB8 /Ns2n[l Va$\Ȕi  K;N{.̘5T[wy}$&Ż 8 {k!8_'a.t؄~JVW֛u\VU^N1'!%!(>EA|8tH^4qT4&(sZ-"HD(" .Qp$ =,(N'8l~4`hFX!uφN<*1HI5;KiؠT9*+JT n.>`e~//ԮPĪܔ]: ʶ#7©Z:l?`O5-p*)IqdO-l;+p$Pl/,R**յr,-FҪ@0" E?U85uY7duPbMoEKE? R+! QtBvEQPV^rEEV$%׵ \EW/yiv,ZQAp<]tAD>NE3uduEC%M1t6] P Z#ֵuP Hhl m3U۲J:Jkۉq* [m jxTe`T`l b4n ںfɲQ}*pRd&d]]E֙c)NSYժHi߉v 4u(OD'a)8|q*;kImSl6<<m"xbr=Vn4uT0>]81UOۆ 9 Œ\9M<IUJc$Ձ'KJT(6VNYrꘈBC&80G.ǁULǙ#x# rE.2j` Є'; ;eGMچLzc`?tT)vJȁօ{ys9+o>~xJTTF ,Z5Yu%o<`OD,ײְN-_XaD5> MMnEOjzR4ԓZKv2 i'LC=eԘ.iЛ;P-oO6/ӿ_P%7Ɏ%s3`BV>l8?AV)sq %홨`fSYH7Oe!4`OOOfyoshimi-2.3.5.1/banks/Cormi_Sound/0051-DolcePiano_03.xiz000066400000000000000000000043151506652756400223410ustar00rootroot00000000000000ZKsH`x"=!!^* 0̯,, av0t[2̔,m? ہ/ͧO_1YϏV?GtUCc ;}TmO\?5?ɋh9lX1}uxD;w~.Ld>Ƙz`zlBbIc \s@C =mItI"K4-,z\i>(SRͺ3Wy4惵l=}#{q ˣ\-=drm]'ޕ*mR@.ɦtS$`!)4b.٘<.ٽ{C#F("p2`R6dMdx{\78%N8U= RܡT;@Zut 8Ky% !ŁCtЪ53+1ā `ch|&{r Vos*) 1)Xe9.V`yf'N{9q\n*Yg*YgwH +k}dȟg )aLH8ڰm2= EiDkO!B%$eΧL|-RPoEժdTauH,طHv=.X'K,2ASPKbP)s ,[ieeWY(аaAaRXޠ;LV9,g%I|,7PC8 v)ꂬ %w2xoߞYᛈ!tg r-ͯ 6iO w2=[?M*PTJȬ!^E ]+;_ZWT0v% jŶ(U&\qQ~TKy|  uyZP=*LNTB૊CB19ȕ,> l,50&qD`F%LsZLuGѬ[nMRR-pp W4-ﲵxxN,Ds&\q3t=Y-&s\Ve? :Qhiu@ j 0"V'~hd?aF0I^xs68Seƙ)) NI .L00p 8"9aRtT12h8+/Ù@NoO|\5`ݺoTI+K2KTmbQqXea;!'U@"\Ă[G,(huĢ+x@?H+=:^EЊq FߟM+9yP,Gd--*zV鏌ag`"Zb~0*0ŘU4NoVY/A3xMeyjG+@^UqiMym`&{*5 yQU+LJiU.IgfQ7͒f碿scHRۻ fdQ 9Zg̏kFbiȆMy #3:h3J':፶T[ |7g"P0g.ߨS5l k]Hz0Mh 8U3{0dyT)qi'/׌7!$/BEz'=}opIj%K}ǗYQz`-hU<<*gkb$};|Q[:07"?w=\OTzt=М_ }Z}ň4IR5Z5*%-]itMWK#Qۙo6TԬ2E_!+97i%^-yoshimi-2.3.5.1/banks/Cormi_Sound/0053-Ding_01.xiz000066400000000000000000000045101506652756400212020ustar00rootroot00000000000000[sF_AywA2L1ej $_=}ݝt&yI"ݶĂcb;x~X>{h6\~ZxYīg()gwMl/ǿE466m>kx~7=ˉ[x,ZCѣv+';_ d:l Ӏ|ݴQE6/,l:zQCZuNQ8XX~0YKkHdgs˄4.m%nD܈Bgq0 @[/!,"lfGO0 ~y&?SI67D&xƼU5.;k 3p[?;D?ܹ~Э"j QE/{V)Qhn%n"?e%xs |G*'? TUDeҺkMCḶ.4P&.$^ a UB9$|SU |Tr Y|.F,8 drN4o!{ꑽ/RD,@@=A2 ^X׉6%W`A( 0ַ腀äQ3#%ggo% +"WRf-elZy+(yY f\"2qoӇH{/pyn} ӄd @'D .9$`[FCUetz 0l!%JśgjG$ s+ :iv:3}ݺI =3Yą e$á-ǖhR|Mʕp?pѿ&BWWEODyiEҼ6qr>6 PQx9*R  "(xn`MzhE'2S߸Fi2RDfM9 }vf! $}4.#Qui^QVd {/tٺͺJ74#<?_idyzx8_\}0DDA'P/. Ins%#cp{?&Iި&-`#Uܖ\t Q֠NɞJcӈ=( Zq|7*5hy0T͸0$ Q4"!:Fm6OA^`޽Q|kQoP*敮܋Nqn8jVCXV̺f曲KfN>˗!>pd*Ern-ftAe16 oM! BoqCWp `/g`]4%f8]IЅ*e$Q QA*1 i|Rw/Cf%Kh1Mf4') X/'2˞Z<" l_vprtĻy 2 ##XqwOIRia,o]VYƞ}hf@l9j5gu n*! 'F U|LcE3'UPQ6;@%N|yX0xў %ȃ6fӚ(L-4Vo8dYgA0Bx"Zk*1YAxC\p|H;X1P_Dvb>HɆ#q~fɐ?J4F6.Ʈbz']yNjkSڗL^wxz̩!Fe->ըl+,Q+( B " $ާcb:D Grێ*P45NNCӢ#@33k0"YԢڧ̌.Xm Ulo ` heM_!4B^w%SފFia+Xz:_v3v[Ћk,IV'qߵ&ggK?,\~Il|%̬o&mu]&wSfr;Oov\_u|)Uzj^QGyMQv@.[A'?\.ù4G6 G][`ؑ9朸&.o.Wy%aaޟ~}MoZd )-S_6a֒n"ʺ ..NE=>0OX omvQwxFysivR.t.|DdѸ*CP0E /j胠/c^әL,߭܏#ژo—qiY+;)3BԘ|j~ULӫOYo}^kqe,~8a$e.|yc'If4֔p7C?ۤaL68ˀXqК;sxAxZ.*MUCm|3:D1GB%U|~kہ`ãXuMy #nb"50:1k'̀1ΰ8< $>!v08JPٶlv0|W*G?XoVQrѷ7_bƹ F->hׅ6m9U4 ڀSsFnaLX/Rh۫Yv) Pp3rɗ3[ pn V+"f7ޥ]"-({%v/z#.aZT36, ORuҰkPL{2~rvQ8ػOm8 %bq(N/YGE9x#r5LKj1P5e' ]Cyt;`"*غQfs7֯6E.p{1pQWc3ZQF]xv&`3XOffΎ]tQt(4 J}̈b<*sieH{F\!HT5$eqkPb`c,m2J%ӌ_`Gѯ45;ڣ&J2KgufE5}MAqH̘ܓ5qȡ!6zCx徜47'azHĺgt*xpR;& !o猇b?`9nkGδ!DrD@ vi0z)C?^?ќ2O:"e@sW]u;\Zbhz-c1S|c=[MsFָNS[)weLo+ rߤI6p;"΃(44̒8P_tսrg@Y`[D)5'̄K%V.WoW;ך52vPKՌ 0&S H"=ĆppPrgaRQ@k\\OFچ茀k lZxg_©sό l@C&n.` A؈bH lH! bZWĈ#]cb*930A,730ݝR/E.0F50;#ܝU\E6s& H9;"kQa2g-U$E0T:)9NbP]A0 z FmH%Ir AX 3&(S "nƠGd; qgtbaK8Ha>[dyT #;c2Z69@FE`0J3EAAMmJ݀LZa^סti 1[R& _/|0vwfnUG1%$ܝbz2@9X/93Aԓ#L3c#I ap؆Ȁ)xsh< IamUcz:*1T8}n@AB\}pw& E\)1^& 7O31ӈ bb-E-(MVEÄݻ4#J6R['eP(y(ybw]Rp΍TJz觩`N`~';7J7ςXdC?͡i[TÂDsݍshП<1,OL!ybp}۽oz\{c1 Ra:Wnt15]7'cnk{HkK17%Z= 9 <, sXdeodV҃h-!$m`n,%@ ƒP² wލ|,/qjF~( &rLPe8Iy%'+nɄehK>cX>1L4o䇂scI6e D5 _#"}\LTa& XT*pӜ썥 hзI-[ma)rLŒt|e H K Hy]'K7 ʰy#ayR0,o@z cɰ`pc-[(uKXXހ7أ7v[|(fXހ24o@b yJ1,o@JdaX9 +Xހ7 4G'ɰx[հ jdd,a EccXހC7J`y=ƾy"N9 }1ʛ\#bXހ3Rt)}8 >1u#r4uм=7C }ay2m#cyZВ >S}.i7w7x(>jZV#([}/ ??L'E'd[Ey٣y>7۔5!ivjmcF WqKETwE(|oSQ <~j;TݬX6^+U[K]~VKIq8?:Z{qt;f2.ZzvX]ZVh-a!{J5V?oEG.2Aw`T@mq:R݀ nJ~` J=!R_%Z&D-+ Pf)μ?a̢zWd>@H=8O^K56kԶT+W"k#5"_QnD':dO׼aQSQ, 6g[禄CCk)'Z+)T١OtXY+Hb7(UsM̺*Mbqv[·GB^a-$otM~W21=Q^=P wn6W3LTg{kͥm{TWLvZ^(aya+6i^8nP5=%0f֗Zn'Wgח&K&i8F+(|FRM{ Ey|ꑲ֊})5̠Z)>u21~"UJD *?Z s*ΑwJ0Hah=S# -GZ$0ahF>Ec}D~>?ƺȑc+&Ua;=?B$ 3%3ۖviOP[L&8jd* T~,7Jү_ēn;;-<'13,yoshimi-2.3.5.1/banks/Cormi_Sound/0056-Senza_tempo.xiz000066400000000000000000000124341506652756400223140ustar00rootroot00000000000000][s8~_wۼ_&٢(Ƶc+[}akGtD*ϯ? )fj& vot/7ٻ~.lY,/FfKo?pct,X,O^."TuwNٽe~FDɾxa?%<e]|L/7r+hyq&+`]T_##`nzpn.~lVYNߍ$͊x 8Y4]\?%@u8xCp͢%[^.1Tc%S5}Y"]6,/vujdkDqι1,),? Gh)<MYd8.r6dZ\çnVn7 `.c0w6z7fWRxYGguJkl_MI3nq\);0jo4َ7f 8f&ϟ MӪaf^,F;jÕfJv$^:peKL?\plXX?~&l 8w$HW?>Mbf'&yo,n4g`dKV%.rx9N28VM A|MWxas)*m>/Z2/1*;pڊF" Lnފ97]Pi*ul+Hddy|\OPgyeo(yn#p1O.M紑i`d0a&UN  Dn.H$oVZWW, :8i)0*ߒygGfinԄ'af]:Ö=t:@81=g>F<8H8z-f㇃jf)\t pKcm{o s1nh9+EKt/nzr?gtC'f 08R!O۵8q2~*zM lIvywZ z |ўh8}s9/H&Ver^nS*ļb?ϔL D\rZő2*})t:UKQ y=ƄS@%m[=pl9&z` ()䅥R鴿Z!ͧ7[]<.w%*Mz~re̓"!WP.hY=LRӘJ-3iC+ Ud(c&.vwfANw^ó.=lEs  uƿ|I E C y,DgtJTirzɇ!t" <%$9`qńȇ:=/56zP#xAyHbn8-X$'+K M 4@>m/ʰsB9 559x' a!$SԘǗsgF,B1⡯Hb: /:X?dYBlfC~Q/M~Ip=2慣䔁*Plh&GQG_|P#G7.GHIyl 950Ha'@> WNݧlB@q&!F4JEpDF7 A(/jӰGccc?bМcqijnݤ5拣|q45拣1_IUb =H4烰zp>kqsK{ְ3hقN~c@٭b db U"BOXXXXnAԎa:Ĺ~GcAXAɪ7 3T3!5@dP30:=˩"fa-[8_<"lT[HԤ,(EBr˧]RMBR1EN%tr Z헐QȯZC>.KfSL*8dUKs<_/IuK1=ڷ"eQyM6;t#8c+NLM()dfI\=O$f+vYcx::BD|b ,4ɭ,6cr#WIu* 6L/*Bc ЏO\IWŝ\=̗H/I+|3qŤTGhq*[{Vh͸lB4J̗L#,s1e1}8YOP -1f)v# i ^5rcIE-;’mRշi]Hi8aS%-x Y v I5Dz?履²xK-ι d0ug?wHE8VQ=ɝKii.d9wMYͫm^ȳ6TjWLٷB,׷I]VOmu3WsA/D)IhYQLˀLQN"ݘLQyEu-Kb45"X\g'*[ݴ4H8(f}3'][r|,z:^/n@; =Wg߉TgxgI$C$x_Ú!7}cDėޕ㺶;~zٝ؞ۋkÐO ŒJԇtBys}M,WGRW^4RCu )]!5aWRWXg{A"XNߥsK黐7dFWgWpjZ:P!Rb;fk> t8>#ua4xq`cpIzS;rMDf@C'} Tǔƒ5X2Ǔ 8~ lh u_QàDC5- SvB uB0C$džXpZ@&蹇"\tLO,wQAlikd(eyݺZdMk\z9qE[ȏBLQT+ )izyPfBv^,=!}r]m)ǔ0LU>$.q~سbXD$)S=2bmh,GVWO|VoGqT{1[~Ċ c28.d;E 7~al1 > cl;l#Hp@ND`FVeu8}?X̧+-☖nGw rdZY'\?MQ.qؠD,bݮ@6b $ 8o{0p:3 ~|rkB=L^*_lURvU )XEK?ԱN9Hskˋ,jPK○$^gY셕DQ d֎~TbRe(ʲPV j }]?TtW{ˀ"khԡR(j^% DB*p D"(qr"тo^HV8uᎦQWW.Lǯ\n>JgjJ–r[HVQfJ\k1iC**9 U^RI=J ߨvQyķLBūz; 5M+^4}{G!\VY ͱX_5r߮,]hz_A=Jo@r{?!ݗy AٶqQR4j6u;O7jU>>lJtw)<>TPz*>嫞(|{k^]wc x|4Q̹˄ "Q ׯ#c`j_In`Fz u]0sN2;ຉ=u"w;ߢ|=˹ Y"˄d8!rB{# B]fS^&GG0 D-ǖd% qfr2_& A!]o0wj}lyX.jcQޖmPt.`a$c[;"UF{FJ{ , h2`T%s{ᙦ h\$-vj#['ݧ}`N5q)d:|vk0F׽v-z̞IU• )G ->ϗe{Ϸ0b=Wo;k8ƽ.ytfky[00nKcYOąE)#`o< LyPLJ[샐c-q{׼GW{H aR &3Za,Sp&1{o=1Q-;ܻ2 `Lr²^Pٙl*ͼp:̼ =JW3|Wf;RYyCΨ`{Rcu;R|wh Z=à; <v cFnx93Ҟ6ύQ[⣑F>g6F~vxr$̅(qKo'ӨO1qhy~ sz2l,sܨтs*iFA/Z+^6uEooZF6/EZ息E}7w/:u2rmx!"a]8%K;%o&h>Gy2Om'Mo6&I쾋x4hCLl#pU  }B|=%tZI% *#iFDO6L1vM9>F.Y'1D^`:ݒӬd /dLDdF2R!\"!_=p ${%Yxvƻw%Њ,@dPS/82,yZ 7X;mA:OتH;éz஗k nrT,,+~Qp94_':Z-&D%KFn I%.& &S4q u,3#y__BXs .t@KvS*Ңx b 1 kđctsy5IB{I80$ʛw#e(y[/{Ue﫹 bşCT91`s(k*'=, uH6gw azHq12;\ؽ4bZecD6Q^촆Pi. K`/EɲrjȪ0T:"HΈf dũ*4kM8cH+ph4m", O*I*-"Ņ+XP=Vx^ gKؽzS`bœERߏ5 ʔ>A8jQ9Z#EՒ孧kl叨V Q ~Q-63T5rY.^ t&-H_ -P{fP̼yv:}?4z 1.;s#e Uͻ4v]-%8B9oNs2wdd_:-KSJwяy#oQQA3fWF3f5Q|2m4Y#/2E΢)5@&HⱯ; ?@,MP44yYh+Wn6~itOhmf~qm` ں;x_ЧQ\kH}IOlׁt<~!YWno7?ޒCD^<~100Π:__yhHLWs\ZWٹ W7&nLwӐ~A\GѢlZ9c:Aux&xqR1 3Ή7&rx?.{_pof.  \sF M5 Am1"ucꟗz4H۞fw۸UIn&I~ثGm`( l;8:Q3B&}unMfo9  @T;b} w}eBWMCZy݋8Pl뫁+߲@a@3{!"?{DxY[;&;hzDn!`~?NkoYbY[}iyWngҾ.mP>V<7n|[U!e ~7-}ν} iBwD a[H<$zFv^D*hkha=&gAۻ !`h+#CKRmpMAH>MQ\BrPtGK^uLn4_kd*5&\+#/ހ=>B1<&V+ubèW-G<'5mq_AY@{6 N|" ,=ʭ&1~?bV>u`%9H˹hRӔB%[9OY&M)N拾 ^StJW ]'8b 385?`grF^'wPAբlam%A' s= RdAjB2Nu=B@"Gt0jŒSő)l1zDt M OͧfPJgdP҃D"vՓ#zAOD,wBd5`Hc 4ŭ+sOIXY4iCr{ȽI>5KcdOn'VЈOZfk+m6) gWWI+oZᵍxZ{VgCmV!r6w`KTLd{}վnu;JzObvښ\մ@rwi[VC ɬmkc(|b%9hڣwDV2OS!{jb­2a12-;wUnXm?Oo궯:'wh 5 qMNUr)uRɦE9 e4̾.[lYi tzdbnz3>@Iڻwz8+bkZ5և/JC&kb! kPaZk N˘6 'ʉbtZa8u_(2l /t0qV~a4-/wMSMfaϖ\FڹYF CnNQ'LiΈᴉ8`-wn4&\vR=xߚF-YLDM,B.$ QƔ)jxEW6oWie.h8[~l gI #q(OHÝa%hrs|ӻd$2PʞOմeJWE8PG $Ejk=Y&jiԻ,۽l{^8(qq͢+]#L#Zʡ -0 #274Y>ܚsH tLE&Q"d_XMHEqiqdQ7vTN9c<|gGB_-["o]!A@/+h3YkN2%BCm ^u{FL U&FJ7)=Ajei%j1ȆhhߥkD=\ a)oȪPyb>mx &V69V'N =ϚEdmoeut2(KqEZ^uD"k'ݚ? jJPMD2Ԗ\~X(dwQP wK@TDEZ%}Χ7(@|/#}Xnsi9"Zzٶ5QKhɹ"^k\"2e/ {톷Uo1,5ߊBZ**`)~N#u8CnxUj.\S.0NhrG H8*vFUݦbŞ V X̸uvw|z܉&܉֨s抳jΛlU]4UTMY֗/ _~1fd\φk:צ#=,yknc|4\|`_2 oU˿iZ{m;#yoshimi-2.3.5.1/banks/Cormi_Sound/0062-Sospirato_01.xiz000066400000000000000000000050371506652756400223110ustar00rootroot00000000000000\[s~_{d1I ֙Rl6kL~[Irgd愼iZR߾n{ڬk=k65Z_Ӈ\F7Fжl[QlC^O=i?.\SX6BvCv^r6YJ4\ß ߥAX5k)1{تxv{=\LfSmK|5ly}xy<zOiP50BAzJ⛡uJܐź fx;6<:qC̍c;&< ADHM+~qB &077݆[Ât0G[50ADDRێ7s,v ުt6X7(s1^u|z)c}v|˫7嬋~+ț'f <Sw\ }6/_ @{y k'L lf*ȲE`x>=뛫/A9)ST8[b Bɉx;ZW}$(B ۈ.t0 -ah-1+o<ױx;!F$7WҧTm=Pa~*1F&>" .QoQ隒hQ\];. rдy(7O vOmnO/q-XFq⸞P2$+*'|40rqhʱRjS6^E~Ni\@KH1Zqzj{s5gn%Ѡʎ:4?4+QeƨM݃!d; Ґ$AbUHΘ>%6 w.N}m|?fHwYȡ|~.~&KztW"#Q^V}館P5lsB#<}G!:qo+8^at]ׅwtM7}Zf;Ҍu|~6\y5 xr"MwT`%Sr,/ARj TIHxWGWx*+2a'֗J)E[.sv?c7kd{#@ e/A"`}Iah|qrdU 4ýShqR9`ƾHPDICeiAtK0Q7N_8#j5R9ĘJ xǐ6i.ACxkgt(!嫗YBl22y %\'vB$ Qx` %o2^6*"rG!!G P.w E!:!굌aǧĵո$qi{>X/p)id|5b*`k3FSQY&[(ySI6z6Md0+nÞ=;%ԑYCg[v F`Fܽđwk"1GW4WZc߸Zm$8V!k4))$JTG% =c}./-&j8UzSPۡrMHHpk&ݚ=Eʦ\  ]'̙m.^EVebsA!6ن(I:֌-|5uuk83W$rK$BK"!6)F LIRNp2N( Ox-'; S'798T,xolg-w )U7sue)W޴L{ꫜ HWy ) {/}Y n+/׼R<5ԣx*pj/o7ohG7Ƿmxۆwmx%~cw譩-_>#~%x !#^2 YWAdJ6~Vc]IwXWjU̩뱆<&x=_"W4I6 }7Kx`h1]HzCuuUމ(wY-e?~@R fz >/GoWF'wh۳'6 .iɊuο8.ҮMx>OI`ڥ+Y?}{glK4k#ږ~Glab8\N5[[\y&6̘,7ZSnԮ$7i gy5^szqE͕c;&| ab$n:@ M'\St 7+n6 hdłZm)l?p"'s@-=x}P"3=GZT^V=TwTR EJe%TYEdKXw:ϙ;>6ZqinE:O~h=_frZ>gu>|I&*J0N)y9 P5@F|*lR[]jGǣ+  d'R.o(ٱK'ڬ}rGGh0{3 z L$L{VsE-Pó w NХu n`n4GkY.߉1Q!QmzUS]Tژ]Nӑ"^ Q>̛G*a:o&IRkkp(yFVD|BB Y d(k*DsoCfDa!N#(8z-#y)l1q-u4.|whKF\'Jj'YM6[1tc3DSQX>&ԷOk(YQI6r6|4̻"w;BBGf 5m؁@))RR,8Ysqy-8pIpuQ;ځcQZِNk2e|eʢ  G! =c~.-&l8Uz"A!CM$AZ,͛dkv6K-246"=c̔l\~pG.j* :tIA[iXPWQ]X^=sUAt6NFߑo%)4󀊔Z7=8RcfwEfSN֊/8 =\up|WBg)O 2MkFsqw)@O^"N^v[yHOV^v  ٲJG!c^TJ { ;E8~Jo.gf/VwlU>(6R|zjEI+/Sj[n dst䑲kW )S}83=K~w{ѻn9`}221}cEPu-RzYV++_BE\*'^}g%}\_+_;vU^D_Q%J{#}ޖ4+|ᦪt#23~ݟk;ycڶ}cMp%]XX8*:j"R<+:}>.ş{]wu]u]u/#N<_א_ܝ98gG#|~FԞQ$#$ԛ>1#IeQTO :(fSEwڳzWYFf7/rdyoshimi-2.3.5.1/banks/Cormi_Sound/0064-Sospirato_03.xiz000066400000000000000000000134031506652756400223110ustar00rootroot00000000000000][s6~=Hg(4ԷM_8Dl%R+RN_$!p)ى(/m~)X'a?v~n,]?N/OFGb&:_^ _{wq8exxzjon?ZGf] &-yO)̬ݎ+5+L0 ^%z "X.,yN 4F4t 5[sڷL<_8(&^tЗjrq3=]Lw7 6כ8Yk?_yr˜=׳$^A%[N^ 3evB.7zOwؖ/{Y:N{_jk9p)oNěLGGq "na:XQO>M*!M}yE/ ʌKcjU0gJ.Njoɖ@l2=ʅxG{K8о{G*'+<%HhۗEO<}6j:Xy ,L=Xo֟IREn٣|D -PZ.Y:VU6zXp⣿^Q8}xxſGgW#ݯ|Lx')cڇ6 , &5D>J2OY0"6ͺ43!K\3\>+Os7ٟʟteb))ǠX[!q 9)^k'Fm6gb%4nyَi+Nգ̰LdVܸ}))ON:rӍKyJݰڀ(̃/\04*,fqbܭF/g4~_u;8h3Ah;Mb^!_՞S (^S&I1IқJlbVļcR1 t_[W9{q]O#5\)~|gÙ_ָy [b^2|i1g];͎N3D.k\:21T_SҗyMHUO fbeD򋊳B:)lLΙi?TVl`46-C Vҵ? `d=I vݦR5kJܣZJ󅝣ܠhNAkéqsV8w RuΆgđ͂r|XիT s#B 9Na68 Sw"v!db`:6B)7w0bj䮝_8Ybg};m$2 Zi-5.x}S h'.5Po;{ɑjW:[l@~3aNbO(0"L֣E<.d<7dPa%]Z7#L#&i#L֢Er6VkQ S]0~4xƺ-LM0ӓN˶S#L0=-*P#l1?jlL /"̨ oc5jT ! 3>i#|%ae.FG-LXW&FXx@/NVNL-X5ɡP.iDb3Hbȑ3W]X]Ũ G~Juc#7#Ap؉1a^zAڍ*j kШ}!֧ Mp۠S0RB+h=w;1)C8 \7A!ٍ)0j`c>%5.RRwQO1W33Jr {L Sj bSN!T 䠪ͮ!g%&c'W _$1x%a1zHNMWl&oR+4>h2jXHr`q쇄rL]ˎYda~2ƒ6[fkj Fe)nkQZq C=ݶgɩh̟5!J(d2t"KH|"0s% )Ԉp0s,8K3)k#RbIV o, j,mNJe, #w Kd%Q^u %NsDAbSǒNFGNc)fz `xpXZ.[d&n!AHR`f11S z+I%ehxy]cҙw~JHe IVxFOb QGT*XѱTrPXuPMzFJe,a,j.%yvϒ9naI0HI-De NN52CњZ]kEB GS>˲O/gU nX_a7wO;h"@hj,@vpU#+z\,Pzj"bVTa}\,_&(P Z'@9%9&k4-X6審ttYbeɀ[w.N`!a`W hbK qIIb,AcIRX*,@cQrX$I9{e9>&]% PEi((2d᲋% TK2:AƊ>Hͅ%h%LiH}99Շ/j(*( ^-p4l>A 8Tk͟;MҨ{Sj ]}rm12|= R먬nvᛋaH$X:ԋY(p/fY7,A4o頃/`PFk`W~bD+F/X|Lg[ҥi}vf (Z`rHxS<,|s| &`7:[Ry^KWm`pxɣ 77_;K⠙E#bD+l01//` /9Z_/Y esl ҇_׿\fThw ˟4.tBh}z[/?r$ S+I [gW0$jxόR. ¼{,w^2_Ǵwۯ`k*H*~72xP/0DfZ 2͎-F0(o,e@٨aQq0;1@;8;n~0"kmt،3X\ [8Ŷ3@+b:'aP"{!h@<8{Qگ +mi%6c۰VY՞I(Ou`pzY@0a9z%Tq9@yoԁ7:<->er>>a_}RGv :i/dIJɿ4{i Y5Z¡#nb|Kb11q9 ʟ9|x!`BkjfLTO CQ}#v^sߥyN}t(_p Wғ:i" ㋥R WV蔞8d J r"PF7lOf>s 4&94{>K`+BQBj(е~[tq(>ޠB.\2i!xاn"WRZ}&1BbvJ@x]t-%C2K.o&b6 x0Dm#Ln $Ƃ-$(&xF޿ngGe S;keŒƳ`boy2zgC$ GM,`K(Qڲ2 9 e )u/9E)wU. bmި>py' ` )斫u 2R1PWa)8hL.n׷磋dMsX8ïʝJruw[RZ0U(SZE4U`SZ7y|!>}Wq@M.A_cޯx"OƼ_L$*lGd*󥣑(Nf1vx#%VQAy۞ͳ̸274K}g v-yoshimi-2.3.5.1/banks/Cormi_Sound/0065-Synth_Piano_3.xiz000066400000000000000000000037631506652756400225120ustar00rootroot00000000000000ZmsF_A`0'Cl1ejܩD/T/ɯJ:'af&s[O,j-[Wl݇_n뇅m{l&4PwѯAxOɋh3Y5bP~D;s gQܺ.[Pc;Bc|y7^O3kOC S]77w$ VS7~nu˅crլI\U7ѣsls#Ai$͉3/"{Ǐ0k\"XDv,i BAqnm^~ +u7+`WMgΜy87;&u*ӺKTEsе?ֽ/ugHXŇ=ΏuS2Td(ND~;[j*fAm$[l0*-UCtm޵;ģWʢXHdL,@;NǗ@0UE̷IH*@TOY(ټTtOw@#d0[A6 7d@Z#;n:dW[!;zXģG!eVZPRRW,8>ōn N:׭ !hBIB$ M~OD;r\dGGB xI\HɚQ=B)@\jöAȈPhVZ|5#VeHPJq qfwk~eCPTauH,Jju6X'BCR$K\-Jp@Y\97T>_P`Z)Re"@S[;8(N^J*RyA9"WZ>hPn ;tQNQj>Ϯy"Tu^G^#J|5WLKA5@ K#jRH,T|$_ǷR`wj@i7z &%yl;pוG{  ɡO."sR#P˅Mڒ䉹גHe?yP]|Vhv^{tIg#7P--W\H]N "wv$ 6tOP'-Z*#‰$'/l2\,wIJ NYÌ&7[@ߏی p9~Gh[jwqoi0"Saw_i1KeU;usbƞdޤk\ta4Y&mpʹ&)mVI7-6sijSVF1 NG5CsR)yDPs4ܛ뇺YyRCB|٤C) _F,& a8E]#DV@C1+X7gDTtCLjfkeƒ0C\kQf#cR@a oqb7n?#Jʟ1pJOV)MDF=Sc62PlJ} 1} x!^Mg`N x"y;_xPޜ߮7}qkJozL#GGHAa+U>pRuJ8p+h|?f=gY5h|:_GT^gTC89@2o{lwYoeʟ ?7_ſD(yoshimi-2.3.5.1/banks/Cormi_Sound/0066-Synth_Piano_2.xiz000066400000000000000000000042531506652756400225050ustar00rootroot00000000000000Zms6~ v!33e@ mE#l K.w7I^HzLۙ/71j>>g'^^u §wv]h"[ޥ)ߚ*uG_uͮˠNDt?OiIG=(x|ɎC1۩ČbƳ.:wr2_[Uk]_'0ݐ,a.XL Q‹O [:;{YMug/1/$\FHI/eAB,&^qwXK`a5s9)@)G- HL'O]s9]vdXn `.qkE+$؉:(NY ;Q}t?Jbݖ kUZ{r+G~%n+f@9q$k*ɶJ+A2YwϽy5tK!U_1 T⽐|fbrHHy\B+%N5Ze&X-ZkAN!G*d czQ)}sMZ@Wx(սpБl !~)5M'cr?Lnm+0D\Vf\^6wx?3 2?fZQ4bU-Vr~ C50ؕf*a䁵k(HLfh( _ %@4Rb2 xrdC =%6OG@-:DCs9uQ!D)^+Բg|JB9&(ЄHJkB%!ЌIt`Iі:lƋZdK[iOog\M`3l;T\aevz _ɫ;1+a.#~ d`g]Ƌ0{NJ) HՏZ`.qFqIɶh`>Nc.YqҞm~Z!S@|]W8ъyyi}⡱#`*gG毣P 2!u3%7PtP7 EeF`:վ/73&܈1r6ҡрkGm^Q0иv>2YcAɽ tsJt %L`Ձ@ʿ`?U T5ݑ_۟ ުnc<.bI@jrr!|OWV^8O2zjZ6J^=wo*ГҢ:?(u#qT+ΟaxFՃө>?T_Nt/O8ug0$,"~tBL6rl{䗠R,>nJ[{,vi:zoN`.ף޾?gק7ӣߞbq?]OYuͱ}\+Y+7G}ݭ_} MVOmEѩGY}cdvq}E۸[> WGO΢ ~pvEG5P[f:+)wԹN.ݾ鴏kC?Ա oV*;~#gm?n4ZP,zHKo.5Ar#CJX1b"Ҏwԡݾ^wӁs}~Kho/<<: p-4R,f-~xŠ?ԩt*E79?_*jSEz5`0T\iVb6<oOڪ&/pWu il+wT ~=[|=-IUNLW,WA mʨͻ3x Ws7p6ab;uE&mu_y`VSQB*CC4]~.?8+/(P.ʷlF_4=/]): Nھ"6m䁰RO~ l<2-ԃ< |2)"D4Ȯ_`@|RXXkv-ܨi]G05@Ԥ É.ɝNvN>މS3YnWD'w+ i˩gOurѥ*PG>SԢ0#smv,~|V(bd {+ ˆ_lot{c:ohbWg@.J\ j;Ba֜2tJ[2Ғwכ[v~JՈڑ]x+9rUPgf1B,Zَ$q&P2o}?:`^ 4Ɗ6JIVHyS%^,{TϮ Z镾4ި2^k?K(TIhnI @YC\EvQҢϢ묿h鵰,~Ě?Fe4}oY#=?9&]ƭA_IWMsGy%(]'odncșVSOc =d|")nq; +󢊤pfWMjN>-9G{\/ tʈ3EA~LV38U=ӲI+-MsRt:(S2~p~=N"rU#ŞkwnSH'Nﮯ&W 1~Yf o=O18 ȋ w c1.XP?URaw<( `Ugv?ZhTo/fxfFHQ&dd ;8@vx>,1A+[Cv=. + 5fknةBK cˤF$slai2_TH- Xa>;a=n=wzfj.@X.@m>7]0va}n=wXE{$;UHơyqr- 0 M0a@)@-gg$zi[G0vh3} y&Uc'm0V1M}$&!,m7}8e@l 0N9lc澙Lhs9™lTC^,<Hqv ,;`6@kPlּcƖj!u­h:el{!&!"- ٜ"evS1xD qGFful}N>st#Ĭ?=cF 3UaE#p6kYռYIP$-o8.R)o*%jOJj,SF%ii0zR"UYgnk4`"sp^쵚S/26,lMr})N7R ,r(< 2O7ҦKdžVZwJ ;O\v?h)\6'hȊT gl,:ޭ&!4_ lSKBNd0o&Gz0I5j|KޗKKI7-U@.VcSH3I@f,ԽG =GQ"-8 L~ji i%i3/ /_ٸI˅P/wnbPJGѴjYgt,dO&fWV4jbId ~^^_]D'Aq$퇶6g5V+dӥԴ25KMWLRYL(F1U^+t )՝T0u3rS~YxŊ5dH]5z'X 3aN&]?QR35 9RNLe܋(ϝ(3k:;y>\iy?ONrK%Uo*%!fOHfN-TWK_hG?!QW'bx痦"-|S69G |t^M]G\7^pU #ɖ37J|:-=ݴ[z(3)…/]dkjHFjyQ6xnVݿ"x{qGߑ7N2$T#9-䝪Fn,o)G)TFK9NJ9&VTWkj!Z;pK9_ZʱxJ\39ޮėr JK9R&z%9GiJԼ%APzE:gZ3>:ْ3w3#V򃟚̓ɹƖt$[%y(Nԗ9 dJrY 5k-wXz3ND^K:*=ԒI2hIG1>AK:;%ߵc4pc1;ܒ݈l9~  ǹ]ϸ*&cM%K^D_{کsgRWzQ9P%lzRJ9JPkTKykT;KPnq.Q} |bv} 9cvAgg|)m$ޙ9wf?)Wz}Iwaxqu7}99?_̜j~-cEͪX@iVu# 6>UͪnfU7|/ T_\sD_pER}gX2vz~>={REK9Mtg;rpD"!f}/T~L6'!),w__/}Kuyoshimi-2.3.5.1/banks/Cormi_Sound/0069-Pianola.xiz000066400000000000000000000151541506652756400214210ustar00rootroot00000000000000]s۸{"ߜ%Qsvj;/ZlR\ܿ  RGr p%]"唽5NO|^,/nfoӿ^Nn>Nv7L?ݽyH]~95O_b$%3"Yϓy|ɒ}?c=doF=Suy2IaIݨe7u =]^7geo$O_Nt:] OOFrcEP6~Q> ϣz7t5LJk-~*ab$ +4=+L2]Y.W4B֏k ӻt.aNa9Rs_ӼRO")9߈jU#y.o>G7v>=O~h_ϳռ82]gZks2m~eʉmѱ⿝kP, + ˛Wz}m5]V nl˩OXLyr{:M=ַæ&\=fyOЀ^n4_e! ^E_ ,%xqt.อR`}wva_{8 a }2eў=VI(M_"W禙+[$նƗgc Kƛr&oeunp柄jڕp.Y9VvPy X!sz(l:*6Kq!]#zw>*MǴeiPqUcLf d-okD]xާɺNgy pRa/d^1Z3>ltlT]t/SP7 ;#n94,Rjl|W-9ks-tlҤxۖu 0>6}_w@9*eGdG3@Er9p#3<,rӕ)tk!HCTZ"5̋|r# r|΄::*bQJ/rgEZq[]jN$U|^ϫUJ l\Qk[v;l)6 ОR<|k6{ڗ+Qsy'`2)Pt\q՚SZ\^BN\ށDzy,K]FTid7fGř'eX!7Ўb TD*-9[$drKhŶn/$1@`fv|3ߋ@CGbz*+׹%&DeLVoD];ވi7jvBWEx1Q؏ˮaqny3i*9Бn{hEQ\%1M^&f3]yӾt*g ˳V"3*2)YtYe9W`D-Vzvk7Z4<նd-VyzZƨ=Zi!6;'j7$5P#c1dpe$NC`Ƹm=WRr>=7@V_W\ ڵ\HM&F@F#BR41UM¨3ia#1Hb a$10j- a>[JVZLJVZj׭^-e%$1QI} 7OAMiZM ! a1F~3ic<"w^JR QA#1QAf:Ș"F~3#c ?I)<aa}AKLT=1mFF2@AM Xl .083z[SӇ돞{R ä$UQCS!#MKe1hjhAScF 3ZԘ1aYhuPAǐF1`9ڑI{ *v2C\4@Pgg#֋ZN@$G1>FNCe _ĘO#30iIY-Hba63cb lA`̢F@YmJ2:0BS3yT/@~65Rp u |nzI@pWKr|Lxn:z͔92KS10jo cs9y CUpJ(b#@z c N'L?zR7 ̲FssxfΊy Snb2 40IJR dx<hA711' l&1 Mc0`PF< aJ212 1@>DGG_XTǀca1:Crt'U` ay˖}E/hrFHes#0f0?uXy̑357N̑@:L̑j짼41Gy0!RWB3ǜV!z#ρDCm-&ymzԒJ0ڔC7Mȟ⊓忍I Â61X,f  W8k⛓iL _ƹL`GJvpڊ`9&$0T;x MV)D\PPaxX"CX3(6zJ6e 6~k&g9}sl0 8VNCo[@kf;tji4]iMz8BdU~AԗPn% C9KJPb5Wj%;U"_CE6TOQ!qQoRiT6QD8UŠ^_p_/*7u5C_ %;wY(a^ukk KwkEt/[ENSCrMmUtw^ĒPaIv7%((VXڣM’ +,ɦ ~Fn*GUԬ\׬W)YGg)ʹGĮ[YC)j!<$1ۺ}vfa rWtҼEb^tP;2Zf .Œ;$zQ$\Vb=$:NJE PؤmpKQP8#$zJF#p)8q;d[gWO;p(g8;ו7HxZΜo_IV~4+wls#͍s x#2w9#hz}1guV =$m*k ?k8B n.;uU@U^Tj'^w2 "^@zʦ "34_gc3 O?#//)?O/.v,V1>+76jaFJή~]r}aϋB'Bv G} ?&恵o7ZѽsB L_^g8 / ݲ#ƻ,@V8plSU=l;,;hk6ԗ< Ki!zd&ΣdD%GffuMW(cRxPjk !ë R:6I QTnl̏t#Yؘi>/ "=Az1C^}9􎞠mWi:16Wo_N!WX{ 16n  BL1uW <Շ&M|vCԆNYE,uHu=$Xz/| {aw~]n 9Nudl/T>"-l~^HB/e6o]ff?[Z~ly[yn*ߘ躐Wz,F2y%doG\E$]/*YIK+5ՈTNJtUܵrz'B[ٮ۪Y ښUTt5_TեTt5SVTt5GS5QۉT`~mUlSeGS^~a5̷`.^va^0E<005>V7x3>9-w_.إ+vvn5F_:72S7g}ݭo>ѣߦF+6]Y(10bAL/oFqCwk.. ~tvEGM 6N7qt7vnFl|{w:O1M,ˆǎ{x[x[{$#"rқKcttCP<Ҿk.M~ 8dIMu&ӻx:KC&0'#κ~"ͽ o[xoy75kQDHo/?ò S\+`ٯ-]D,6@:\Kk,ͷa-] NӴaq"d6:-p%ac.Nf.&b?l!5~},8&AWynXǸJ0'.ɑ]|/)\gCe7p6aF l`IY_&'c֬p1uo-1¹?;n*Jg.~EqAZw!\y'iv/m\tϥ*k5O0a$,aϝvNOp7"N~/7c[ӳi.P abLYh&~eFXZQ solF9B ffꞠ!J#gk3a|v籓0Nr2Y_NOeÍČ 7iB»ˆ7LZH?~kyM}ۑsSkLew={85T}i[{/a-(qAT;GBXV<2t Z^9Yfǻ8O_;2_܅r_BWf*[$+ydrAd$p&P/oO?\* "桻a=Øgާp ςa(3ԙ?]n+ut2K/$EU*&[wG-UV}ryd_fl D)B^E-ul:$7/k'H s KAXpnw\92-ɇC Ḓl[#q<8 ʍHyQ}zYmaL g bw4k^n0A3d]hWo'Y!RDz0s3 ӡ@l%1s-q2Fĉ63cq'EA4wCn]3mjieei;iztL0nz9Zrc4`pr3Gepu8pY]<1Wc buQu9|k$%1n#%Y31@O1 vxan5wΤJ,3ZfbP K GM pXjN¿I:̑;Fa8@spƚ'=3@́e H̆-aC,, A&.@G{,5 qg venǩ9álPF1rlPF,ˌL2Hܘ #n!kӅ!1ȝ $ 0f ʮ(k%FcXb0eL09-&+ޗj ,'BqjO9 '4&'Qc#1B[(T8%c8-ia?kkf=mOE28"l³Ԕ="gogpAb9[N E+gy&wKG,`-f}J6ǘ}C7 FAZP.Y(@gnHXٙ#k@Xcstoب'=M^{b(!@):G'O}i@Ofmں7,5 .-(3@-(5,9J׬Ġeلns:LX حK!ǘ/t?(S#7twFc8Lp2 XTOnoF@c\7-`o6Y(]@i2F!|8jǍ|% 4W;"jolL#e HVs=`BflCGJJT!g%dECG ȁ/yY(`XMHpx0D17nA1R (`Q2!{ .o!w"9Ӳ6J(ɦfi*9}nRæƙ,,elR G}]؛ 6J)P䚛9 q) =#`jX)N20GaJ9K9KF)Y8Bqp>Q>jtB(mN@. =,06  dD!nltNcq tX͆ X.AJ'I*u@yG Hw6J'x{x ؐ l܋{P:A%Bg05xU;R6"iOw UMʫ%*nCJ1u86V)=OzWړj`qʬJ#Mimf_[9+QHQY8kV9vhmkپMUbIC+N-?Y)  u7KF/ |kSA2_f5[lKUw+N9N?)P4ё KR k>bK4bK4?(=b*~Q\?3iY -8e JzvQ"!8̓Z ˭1E)'\̘YM8(_,TՈbcgo#T]'tQTmXN"MY4ug1$kRtr. J>#?ҼHg/Fj].ZfY[2\S,E.\Phkr*#ihP=+ 3h7[Jg93ʭǝkq\WMzU .L Ő UTPK-9RaGE?/)JP<|[PQ4-阊^ AgD"pO2T]]_ͮz2}R6{Nu>@sG'GjU$.Wtԏ fʎ (#7iGJ)F|('OjU'UpJ5MK{iKAjo$5.]r)[1j]JV 8oڔ5~d4avtp{P˦A8Rt Kad3NvnO,7Z$L<,CQ؎//3qXju1t{u!ת87J7pUMaIJׯ+ӕ ts[x{2]V+UGW# eutL ֑^:dmi~MnRMaCchpϲ"3&0cyYroh_,[,s0Z,v]Pjyoshimi-2.3.5.1/banks/Cormi_Sound/0072-Zufolo_1.xiz000066400000000000000000000100521506652756400215160ustar00rootroot00000000000000]r8}WhO Խj)őw]_v6¢%DjEoC"ENR2ڊ_h\}?}^.:MSn6x̢Ma󧷯~O7//x6<,[QQek~(OWPɞ ih(}Jߢ̏ppGq70قbKJB~8S c:}0wll7I4 w,*5Ʋk9|#H| $n:ɜ:٬ԉȻSɇ뛉0oR=3 1Y&IF緅hsBj_0HK"CCє& 4ekL3?:ύݏU)׭*lh.iѮtH;ŭ3˩&.5P }7MusWD_~+3􆁶iz6Mow*ޱGMawWS"'P!0 =ZPPlRˊ!v׊Ű= w1k`仢?gk}h uE&.-_u}*IgO(65/gdcP70ll^ǻ3VK5ZJ`pTdglLjb[C2a鲛z`Yk?_/n1٨GP?2 ӷ;Q|dvųRdQPTѫ(~(4i" d-j|uf !9:1{|u1S  Y/P֗WMjdDjM<# ΂ŶBlxi4Fϼ^μЬ\_\k‰P?݂(udE;Z.Y-;?:eXjh{lyg'w9geݲgpʎܲ锥Cs\@J2V %1'Vuba[vq H;=H̊[ 9R =fNp A}gm1Ѯc @XRu[*0v0I )@/ c ^1Ke[qp)4.b[2 N6W0Ruؖܮ"ŭz9I>۟)F7@XI 7F 57=>@Xےtr63f8CGz a01&nS=aܮ" 8 }*C~gn øu&anWOasܳ>:Pr# 7at䖊C'mZ00:@28J9nSaYInw7D=c#-tFv*va=3[KtIg֜^eb(_\0v#ɳgH 긏,z qT=g=G~y 3S RrX{NA@! ?BҬb(g{AS%*+f'HPyl4sg9LyQZEjvO!2bϏ|ϑ^b ] b- `y +NW r\6֖ N"^}`C)I#fL8rq˵ 7W EC YCU9itFhc7 " 仿,`&{x^4|Ґ*WB |$`\B)S2' 9itXuO6AҀsF!g|#Sh9mA8A{-U@?`D H7Sz>"X+!S̨"g58#!m3.@=ŽJ&mD E@ X;mĉrC`t{\!!@ۆwkqm6AV%# {>A!">b ؀qDԤ ϚAz?!ש>߷C[}p4&b 1cgJI\t84*f$ _?E*(jIBFs*jfC%˪|D94y&Sr]I F>:K uJ5Ss|6R&{m8I:,2%[l[%qsW33 ZFJeAK+ Rkb|nj]ߝ]|N\l +LeVhw^f e)fԩ HL`Zr2.%x=9s9r"M〱{$^wJO֜C 1KVBK=02iV'fp_-!-Sq߸t`*~Hu8kk)r oocڇY[G5Ԉxyoshimi-2.3.5.1/banks/Cormi_Sound/0073-Zufolo_2.xiz000066400000000000000000000055411506652756400215270ustar00rootroot00000000000000\Ks8WhuٓG,QgJڲז6sAQ$ds"Zr C~$/F4קHܳqE]˳} ۿ~Wigwl۷G6KAldyaٺB1ֵߴ?|gD i4[sVJ{̾=Abvus9^ί6-ҳנc]/fݑf-Džj,dyywNAT|C 0ԵI ;&V(h+ю XlmϢ̋R'9!CFWv00qaoq ń<ҍg93)Iښ XW޵u 5t#L\Yh UƲ:Վh`M|0:~'ND"_T`kR|r@GTǔ0&t(GD09UjO7 N֍R8PRj8&6?HOd?'?bwr]ݍخ{7bH&P:!V1pJ)M=Y;^qTs>ɠ{,OcF]؀37YuF~A˙U ׶(Sd *,Wnt+{6Nr l|u?d6ݘ,@=Fd*瑠| $yv3t1m]nHwg%9J㸫ϘD^~E7W`s'v>pa_+4fQ1K;CY)f{ 3*z(*=@65 T];j%Xlǽp$V hiyv~0<:zgҟ~>hE/1YkNԃW%Nz %Sr,3_p |嬑2cc$dͥ(OR/IJXHD^-Ƌ !,B!j>ևy5r]'xBodʥ$!$؁KɁaKFBYfrDVr |KtN#8*zߧ0Ŧkh\8npdçxp YoK"6"æ1SdK EBzޙ J$sJvWf8ּ/AVl$>!P`.Bhh1p-XGV[kBq@^;pv'\e,ե))$f>R<NHVa-%TEN7tP*1)Q4s u,3#yh/!ebvc.t@Kv(SҒx)UHcy,ɻcXְko. THF"<D]qsI92|W쩓h>ys-#B) k u!12bk)4V΂?Z~#R#ͅUVFMCj]Ud:^DÙ0J`i9OҖ:ZgDD@3b&1cgᯂ8"@X M' W^e*w&oůiGX 璎=AZN$J D4A_1i P1rp)&WSŘE}DB]G#t .]3DA蔃A&"Csl5]4#:!j\EBPCEՄ^@tQ0 g4]/9 DWX0~@tBVT/zؠԺyeO_ּCw*VbW8)N_̗\E_[U𤿒˻_,w)Ŵ9C^ݠӭ΀|0}rȤ$١Z&x҄ ZCh礔w~!>g*I-e*/) G?P+'F?S `)C^ {( =X! w5]_%i~O3יjryDb򸺡$5O-򖒴PO %iB)7YHT_޴fi HњM fNzR!E!TTA;yRቒ8BxIFyqTtz b8Uʏ>Va=p<ר>թQv vW_qf")䪤0 /)/EL Xׂ^I] ǺdSu-8ZPO=ֵ`zuzrp^[75@zbo7ܐH { =*|fɒo)ywL$b^4 ˞#ۊrgq)#᥌R`Wf5Zyoshimi-2.3.5.1/banks/Cormi_Sound/0074-Zufolo_3.xiz000066400000000000000000000101041506652756400215200ustar00rootroot00000000000000]Kwϯಹ 7d&c I&$" _UGg SGuW_UwvSy0]rOUzbKgew7^lz5dVvǕoɟ>nSQX6U 2=yjxK2[ƃeؕ+c~x 6O#6=246tZ_lVxv}9XLfSp[Tlck~Ͻ'ۿ=dzJ Koi!ʪkr~5\y[QZ+K|hYJs on=}ge{ߚ6 A!\ͥ TRģ6 &%oV(?8֒DtM|ߠɮ~mv6cR*TK]:g /-VyqoVUƛo~J9v'Rֆnb(AN_&r6[g?P_&t[l@mJcA!d1XO:[meZY&- +_Bcl0F7yitVLDb@[^y_`Dgpyu1Yܜgkΰ#,!T װW̋} r$ZZP kZh2̍'E;0E5V=_b ׽ALNhao QT/ޢ `ֱ'lh~:8Qs?.fW#֮i˔~-u ux0Ȇu5>NQ׎4WknL*n,ۄ>!XJ}2[GKX =pVQgu-kZڰG&ehh#̂s鋁C>dKE]qs‡iv@P#cL:~50}i !2.̪fSG@]_݋ lRΙ۬] k6a̍r"4,|(h?/3 >G?݌ïize{[Gng I@3-UmДGM,= *S }ʔ>η)" d53@TKc؞T#zh֫a;u}:nsa (0&iV> ub#CߔP;U86@{|8Rå "Y=CvD#Ӝc;FvWv C7D[_(}`ee] oH'#-}wb=EN D),x=Ϧ鐠elkbg8͛B#S- ȐS |^uaL+G>n]9#BB6:U~ Q iO#8F\Hpn VMdRKaHb,(A3ydY 7Fy !xcN+Ba@X9,rM%eIU{eIU @1H(cʸ01uSp\PoZLPuAl|3U+~!a-{# kT2vZF )%_DaT0t2d @+QWڜ+~h2),@K}'+ZMñaXR>l#ϊh~`SA;)`Xo )VJa`/4H0tk'TR],(-BQ٬AHX/,$kȀܙ~b{v bPXL%)TTN4DmJv\o x$MvRvӲwb8t$̴$F$jeb89i$nInJW`iQ_ : 4|b81'T!gD0s9CCpqJqF<GIi⭗oxeŻ)^˙%M5TKANN'G uiw?Ǵ_7Qu,T-; qZ7 Encx(uCԤI2=ʓC<Г E$i%~C|xL@pcAآʋN+Z4fmMTR\4?SDЧ> wRV0a%D_g$Ǵ5T8Gf<'KƖRpts`C$$,m mo첈Bbr7nb`(=%\u$À=爐~2'y֒v-OZ@:kan8r΄բf#v ( -VR , R| hRIh@qЙԠ c>^7Ճ|:Gީ(jl?Ձ>aRrHm9^zrdF^u@S+0#چrMԧH wI\1H $gWhCOIEWqD,g{^T0ya %iu `yX:}M &iul̰dJIM*w8cT8@tHX C%[Jԧ,鐤7JDyZ,)"7Pv~ٔK`OQI'ሪpRb]B}V2ImmJ:)n!tR۾LTt\ &u i+aSI,Џzw,0)¤&e`CtQ|YtKk/g`0rJ6DRݨ=_`A*TZ*j $):]2V^ MsT pO1UȭKY^THI%((,F``;ȍN)Vܨhhٸ0FCs\p"QYRTG-WDS )1J\HZrKFF*1R )KC*D^hMsS0JԥAl%D8ZNgUҪB*V/`Rb%p%D &DNJ"p^`%Jl!a eV) $H%HjSyUlS]Vx ByK<17 { Oxs=TxL|6N=-B|X'P=ZV= 9\Y$tjOKzcIl騞&zEzܳ+䝯 ?zJOwHI7Bxҝ H:\zMM1iҝY7W.zM9S/+:ޙf>C׽ I'W_0T |k[ɩ ٥KxV-5o1r;za :J@ ዘi'%-s7~QX69#1Gr7um2/o.Gp—B,F0pįD?/VuыU]bUSXՅ[/Vu؋U]bU^(_쟾A-.Aц 6P7\.Idv4 0ܱ .Ŧr_ JySlfV~xdVvGx!bryoshimi-2.3.5.1/banks/Cormi_Sound/0075-Zufolo_4.xiz000066400000000000000000000173711506652756400215370ustar00rootroot00000000000000][sF~ϯeDqG$S&<5EB67!)O4~&qs@v<1SCwݧϽ?pXo叧bdjX~,.gՠf{NAԼeF^\N޽o..u~Zݟ,ŏxy^n?ObO؜'˕vXjy$Mv޿a[/ra%¯_b/&,bٮ%Vy`R^;\+P,?8G4(|_OLnDIxsu..o޽]ޔۍȽ>OwU|Q{^;b=[,Lgӟn>dr-~hMhpXC^OOvU}c ? p5+֫nk`9j`&{sxjɳ;]rz{;W[>`Y"b2x׷h vgMU̪yj60knJ˛('uҗ=?_ܼ§=vVw?N9A~seY?K]rпz`j1ߞZ?tɻg/&z^ld EȻjyolE|t_[,%u^!U'FAr lW+x;^h^ KZy{ Իtҹ+i9XQ˴1`/B+ r>$Ax(L3ZgLLRom9Ez(;;Vl->քڱ ]ӱ|"Ց:1jq>+"ɷ׃L؎G잰ɮZ>+!Fi 8SQ}{_|tE߈w9Xe*"xSaRBv52L5!$cֺ@g]Zx9v[ɤP9|~[=W[$5yvz{`qD'L\X,Vf حeUcdԡ @ఀcO0%0v=`\0GA0)$GpX3a!ڰO qd# dS*SɍCN&7/w$}"I|ʡdOz% ()Ɲh87􉆌4OF@k 'YAƈο`!9*X TlQ\7$KoՐ *_ݱ1g,?iT_p@̯.p5)vMq?b6~6%5rƟάQI6+,ܻ 3T"Of:tA%@jƯ9ʔJ]?gS?ٯT>?%TB*#s*B/bKPlPPYi3JL'm!cAWvqJfY=H&XJe[$Pc6|*@P<`k)#s^+T-CT *[8WDrYD d8SNERr*ƚTƀWHTʀ-saI@A=,s =&H?Qhi]eB'PEe;}D;)EM%X6Wm *\,{E"j9BśY.\"_r|UCT7˩厲J#u6F` mܝ2vad"nU76F`7FO F`"Fe4-T7W_u,3J/1k~hAHK Br+fhL*7#Sz7T?-nUoz#jlgZ^ %VAY: o.L/O@x3m p~;l ` t? SA5_ `@5txo-^6x}RN/~a; ȅ6CvIk9;OC̐/$*c$I\=Ja{yUA `c ;;_7Zu~4lf9ٲfE(EpA $yC}4'D%z_u pFtwΧeIձ), X5E3ݲp{g5sZ8KE*?̃^=zb=;p {WWBE6»u3GBGV\c幪0 Ƣ3@n|Bkz: V=v{'7~PS=6htC%K X)1 3r (/gnQ [@ xMMhC?+4p R(K p;Nrw P EU+`*Xol0QrC`W1*UKgeuLH|"E8:`^G{O.Ё6ޟQp 8˱8R+K¦8hA1E mwJk`4t4F^L@ K;ƨ+ϵEvۘ7W?7W%zKnTT?Ǫ]!WM]UsCs.bxsgU6xUuןt2-;&\Kn7ę49( = 3Y׳:qbQݖ._:*Zlwfp&yBVinE(VZ։MU5{AϷ+$Zﻓ0qqJ]RD QUIKEANUY$qJ9Eq쨓dYYmC|JK0[X 7%ܻ^;Usj*Z_MvkHw`34a #"9 c# L H2d@-t+Ja Rw0?V~$ˌ;r3M$Mabad`[:s/K|','Xr x2LX&( DdKℵ;_k*,D@vܫkcˬb u`TcAIj@o4X\fD& RP3Bhρ73Dd ͊ 1,%|GW S580L`?r!uA&IJ.]xw`&h'Mad7'U2Gmd(5!#>uD r&{$#6PnhD "*t2b[\`n I4"it#(YQZ'@;M.l-w(aLDAX)| 4\LMRyָTdI$YچFrF*h^TXa8ۑiy $4f ,v܄k.JAV+<4?kzޘ2 cE}gIbW]|~˦/yy<׿\Ei^ӭqy=/.o޽]/n7P5_;aAyأs>a>?{A{أ}xأCNan>?Pg%x< ! g8] l2қkݏM~P!uF}gaU,WZE5T4Uɂ^Qb{^ќ;:;JWy_e(W@lWu\i\[Gwo$Y kh1F}sӀ-Teқ|9n_^ԼJj@R5yt_.[B:׵:dqMZ̷Nwq)Y{vOXݵ\u<8v>eIdo%wL.!.%1)˿[(3Ngn{_ejpáV_m4HWy$ވyoshimi-2.3.5.1/banks/Cormi_Sound/0076-Pinkollo.xiz000066400000000000000000000031101506652756400216100ustar00rootroot00000000000000ZS8~ Lg&pw܋FbK9ۡM['%YrWSZǧo>|I3ٕ yDÕ7_>һݏ Ft=u÷Tw1u_ﵺ>`v9VWBwJl`&=~*ѕBT_OKܲ3(X9=PGq fw=S '%@ DNڵp0C+XJG2'dӄ7K#%a'Zf Q F_nǁz/RB@Ō'=-xE l /Uw»SniH"LpBScP~>hJVEړhewOܱ.0?_Xz#{O3q*h9-G~n-~Cv'"ʫ֛;/xBz(o_,2=HfZ\WN9N3g0^tR4 Xyt0ZH"Ifka`d̅)CDxH HȞK ;֐e]zz@_,uAEdI[2fY,un"&f2\#n`S%{ 58HsSLZ@nU db26{twVAQхZ psJ?or٩9 JWX~UL6Pzu!J0wJ6Hު(\5ܪ_\7љ>3ێI`>JWJeՀjC5Z8P-TF?c)ۊ&EsL8<Ys,H4gw%YN~"O*Iom7b8nQ w? \L85جq<zɑH`P}Q$O})OS-׾ʀUFu^ej)!Ζb`8~2߬pfH.(SÝ>JyyẌ́zŪVR/3D yoshimi-2.3.5.1/banks/Cormi_Sound/0078-Tremulo_01.xiz000066400000000000000000000051371506652756400217650ustar00rootroot00000000000000\Ys8~ϯ#LɲTZ[f_X ٜHcϯ/l}$]% h4>n󯏻m{'mvzIv5??.WYQhGO\=?HݳKڤuiG%^~xܣhQkJ znD|Ic .jqI`}Ȏ'gg[qHlcxDvonOԞ$XY̺\O.fMu&!֜R?ctKIUTVuR˰(,N,G2<;29~lЅzZ31)׵Xiy\7a"IF~ AF1phL(? Bj(ѵ?\K3\W(<<U)k^r=KnP3Lו~oER+j/#s`y~0FƱgƤ{3q>|}s|Ym/BEeb$ "C]~9eI$Y#x=\NST/t@(ĞB3!tJ2= eQm"r3w(,J x 垺H`& ^ˊ˱m pij`\>4]xׇ凶#%fWKQ@.rR;(LG(ͨO{*h`dWwy3]K`] $f  >cC4Wf3tn'u^juٲu]'.K/SV+SVIt>L֜-Pde0#g9Q"O<"Õج_ yxVUpPo.X\Fj44\pÿGQhSpjUT{UhqM\byGxyw3=F;~=uo- |{*L֍LqpԍtFٌu#mƺ^7cH盱λS3yC XA <`3[ sow&oh{yJaAx0gB|,6%wdQ'QoЌ(rR&QK;p2 Α8ScGyoshimi-2.3.5.1/banks/Cormi_Sound/0079-Tremulo_02.xiz000066400000000000000000000051621506652756400217650ustar00rootroot00000000000000\s8_{֖=tuYv.qv%:֖|&(Q")&}i Ͽ>F^׭_jz6\,ǫoW$&LَV]<|S$3C|/H҉ɃG9l럾ѽ2~4 }ŵ1قq7O7l1]^Grۓ^=..'?uAc='k L}sUCZ⫑NtFP:W|\ߤ:ȣ\φG1(ƕzk%^l{1EGqxQU=Ed͆:;:WP0?x"ȹ'!\q.M5[ܬoŊo7ga{] fs#q.:Am1<aTz $R}Ӟ8KVx[z$ʖhsƖ)xwQ!w]pUhF*bVysMj>Youatr$CR8zϷӧbrXHV_Rp_Hu_b|[~C- )dbͯ.g cZx9{O|{h;H.~. >'!>ā@ nNjl0yTNXa-փWԿ44Şd^ؑVֲO^j\Q@I |ϱSsiwapˆ,~\.&86!0KT0L<H lR tktKI$\tBp, 9dpd$cE#qbNAz!aNkiŸ~]+|o0JJFg2(oB`7v KƆ-ߙD)d^k8lYMkҞNk89K*r"alee čn[9J!Ov#D=%1^(۟\nst ~ A$#Cq$9_gv^Ou;YJj_$5D HQ@51א G'gyt8N#?;K?.DX}\ d*f-ƚQqC2xRkh{ ; 'vR5Mz%zNCǢ+%RsHAk LHRP@7qJZ[DGLP-8 jkdAa9ErfeB?.IGޙ,5hJlo0*c$IiȡBY]7嘎G5,z\lD!wR8I}6od;f0Ww{)y,[تC7Q %Yh*ѼRU%9X/B|Jm*sڥU/ּ]DMmWK{XFa@O4e< S y0*Ed[ybOmb3\Է+]ڈ,< ~=`̪Ǵt=7*.'Y͗Ւ2?ڄ09I@;Nl~w?z1Mp~zII^;.bͣ|5Gm#A$L-2=k>=xUyߞLL]qW5j{?>?KC*#ѕJ>XMt%&V]ɯDg`ITMt&CPo -+$| ]Zz0N'C1):`j<̡T A9~Wکv?挅2H7+`2_jZP*epj|L+`/GF=:p.FE;S JG@`:P}'r,3O5Z&N0uf4oxx6(%Fyoshimi-2.3.5.1/banks/Cormi_Sound/0081-Organetto_01.xiz000066400000000000000000000124051506652756400222660ustar00rootroot00000000000000][s۶~{*4ȶ<4slCKV"uH*ς ]R'a^(X>,e:{o[ϝ։-=m/ތZ_?~MşovdÿJ{-z^'^FO.Edrm䃽]~O}əGPbˮn :z9/gX:59?چzlNrۻ ?LTu{د0\Mӛ]I'k.] ~gI/AI?ndXFvx0\X<<8 #i'}wUr7ʟ|wf"xRy[j:' 4'&:x='|c( əDN /5ڰE+$n+aq/I>[⃻w1KmZ_`y#f6W6eau,:biA#|zu.߶:ljq<~Z])ǎ_mu8žY8/a oi{GLsx.SV)ƤaeBd1 u>.R~pV;!]W 88m)pb-;勽dtLˍab1IF3r܄uIXR#e LH-ԟXm%.U?.C4QةM 9Fǐ{a=s!/@9*dGj@Y'LcՃo [fF[q.O6^[0ܥSijxհlm4&f-Gv8~L苛靈:zD[/L#c,黅ocJJӺwq%`ރNH@Ճyi{Vy*=6)5j^3{jJbjyC!ggRkk ھV212/)0tZ7hy8{97&] ōJ}Z3|./喼r'B''q#(nfXer*VtZׁȹV$:cE*XPE\:.flwc|<҆ysQ4碡 E#%sQc2KTdKs"JE{9HD.y3Mfg u) ^P_6PlF1ﳸþ8.~+~a a-!E*P<5+ܝN{p3^`T?\_;5"xObS85k!|'^ ~ A a Q q Y8')11E c"1lHa ]0/R)F C$eufAYafufAD-kLUu֭nu Nvºu֭nu ByN<ڍλzHF6$[F6Jo 0 i zaachaa00ZA) -haa00ZC5} aphcKnڅ!Fz p Ou{ O)@v) A4jaG0!FmdXĠ!(3,ƥūryBaP\ҷݡ{ mDMAڐR szE 4Ҽ"8H2Z=6B F F+ap ,ݮ0޶:kB5Z08hd ,\}N9Fc.6 ћtNI7Pft>5hq2+:flqFc#o`YQԑglvĸ[:}k^upANX @zeZ:,PzeZ:,(Pu,,PFun 8,6aòXpqmDё^& H1[ԱXO7إd`!v[r@^=F҈~+!`4JH#X+!j2z֨ nCKc)+֟y趱=jXĀhȀb44) Ҍ&>%s,6EKcXkamkamP kpR {hNH݂h{ 6'FX1fb{(skŅ,Y}T M5Fؽ!`/%{]"m,jV+D HN|MOK-0I :90`kM,v@L,PTױ(-Ȧ1F cQ*R3F 6Pp8' Zç\Uz WIW͑k͊5>$KlZTC*1l=ɭ7HBYnn2)'&I*jcPd6" Pʔ9Iy%=`4{ fQ,sJF r W29'W$ΊϾD.ܜQ]aMQP RP=R` f sų+~C%^26|ddo. +c1]ۏ$L3/,it"=CCZ] |pex%$XC ; lL(ë5S^Y[2TŒXŒX?#>_<|1yeʩF,iY&',/}pRCR~IЂ Ff\߽e^?-gce%=I&Ŵv7_bb"{|Ԑ_pJOKwt|dɹ*RC$Gh 7: "[5q%澸Qȗ%&)0}nj@$Xy{>PZرrq iU_r`z4xd~pO3yMi̫^R~IRѥ(Jdq2Uܸ9Z2nNd3w57޸0M{7]»FOgV#~n Xwm[hw?i<$Jg&'M%݀y^4_"x 9|a6/WΛlaCCsosRDKĊWϨ`1"M0{F)kd.TGVU\s%)6]$h4tƊ(ӞWGYGɧO|ooKD %o3%%}Xy˪{{Ho7~Wrh XP=n@ƭʦyaU݅z(zPƺv8H]517`W p)W*MI;)RNS{z_E*L&^YiJm(&&nI*A;IZ{EEY_OBY@8f^(פ:/O87aӹ )35E_,W!k{b^JeXCfH>iEK OTO 嫈(rJ BN~2BX@`灳r sHʱ9emYE+/d*&gN(-bt@)xni]!q @(/qP}4K/6o^dv9FOl͖F~s#_ˁsΞ͍dD|epM/T{[0MXsT8(qff8 CE72=ݿ rFY4z]g$}W4s`՞))j%ܺ8&qA{=sݩd򀦹?\_ Mk^x#UvY"2"< [Xb:]ݸ+'On,~$%vNiw㍄hŹ؍T[4뉇U;;Ec 12w83e)hK;Q4̴KV?PFtF3h s?\  0|S2gg|ޥ_!I(_Q:g+S:LbzM`ه2zBDIX^J?aEfМ{jɥB<;\9~}F1-ҕ!Ŝ fG/m~#Lb IP@.q!G?% ;H ޟɋX:jdRPO6k V7.g󛻫ln~9.+P_RgjUI|ժ.߳JjuVu%L+ykU>yiyc]OrOdgOG\ٳd[lӳ9{ۉ+18twHUmEF~4o8jV2Feἢ^1_d_fiGSkyoshimi-2.3.5.1/banks/Cormi_Sound/0082-Organetto_02.xiz000066400000000000000000000115471506652756400222760ustar00rootroot00000000000000][s۶~ϯ{*4(<Էc˝/ZmTןE 쒂$K bwǟG$ ]uDxFZwOӫxܟvg>[+8yr[0bt[oD!=/t]3SGGfz1NU,4^?M(H ]ZGe!mttzyvus1M.ok?xy]k|z>GٓI_n mҷwmm_Ʒz|3&7۶N/*\Aϊ^:]'f*AQ%Upbs B^̅6&RR|h(^A)ѕ(9Emu嬘o|76٭WɣY{mj-Z/dI<^M[,[Gy Bi>:}IR¥9Xo+?e>7}/x#5fIPeeu,:reA#t68 ZlUj "~[])N\M&!t~yϻ1/.Kh<)U 3~%geyUKP U 4>NS)߽#oekZ@Gx*&եrQsȞv*J"X[F>xf ye@lLdhQ衡\ G**߲5~vb!H|Uso;co@?ur~u=QCeC}LYS>Iac@|^0&"d,$X~!j]a 8mp-~l/5s,6EKcXStVX[a /^ XF xPmưF,v@kX<8h􀴙 8a5z`6C#X-.,@`G MuXTOeq8KbCE@cRmcC4=DJcX44F-aƲhi+a1cn5,@ ׏MP*T,FkϿY+R{C#X?\; [FN,JsR8w!욥vuR=G dh0]mn2B 5I̘`Lhr@Qm#X+oW(F =d.ܠ7obAm,PCȞc jemcXVVm+am,rPC bqH%7!aǬnR+b ؍Nwbq:Ů8$o8IRV1yaQ(XldӘj#()lG#mb8ӅcZÃIEe@ɤrTs$Yƙ dҜ0l.{i7SHB^$KrTJqɤ()O|E:+%@_U)s!7*yYLNQR*Fnۤ%r.ևz\ZxWJ%trF}Y,F((snKAu*K,*T kE絟j ֫5su{2=׎t?l{a(9V#cTVh7K_]\;` G$*19Fq% o&B,(KbKb= ^KlWƹ3 SKa\. OQJ'A yAFLZZ:^Ж嚒hsWl Rۭ_\fO$P {ab^_g!JGR]r ?*aYwed41[SmyZy+oK]1ĺ!iWw]m\ލvT&ӹ."R\b[wx!sR̄"DMzdF8w,0aglv嬒p]Itz,TiD*0i龂qɮ{j |lc&k9;c~{Le {KeKl2௚(z}K=K\mdF]b:{0!tv $g&Jz'8]B#򡊃ELړj5v[ћ#-Qo}YUwaxvU0x/xx;&7_V\pgQRq*qseV_!R`~CD|e끹?8DD# J@It,h^:S^ɣEXh[jxT#DHD eܹy ʨ*B"~{tus@!@dDG*5tѫQn*ʀ9ι.8!VH! (=o9>p*/`W 8Rs*ٽ]){ǻx'ZE]3n'ɮ(kWq p'#+U_~ֿYwtOڃNud֎9ΨR9hqOht> ӳ7w/+ܛuոʬ.CBmz"vJ"9pX>awpo2bNF7u--:5ZEGҮjܺO`@ޗ6K4G@8dh%Wc|>#yunM~!@>&Mҭ $M2[Cd=C=2!+ӗr4x|61e_W5 XfU0j}\:1NwE*)(*e7x/ Sp =2չ-KRꟓC ּ]=^-ű/>wo}mӞWk$䆆K5Bh'Zg1Eo‹+\Uu7Hp/ҷۦAMwůh4ƿX&)bU򈰧xyS$YSYi$z/g?+XO7kۻ*T+zY$1~w0)+ -$XV.!o #W[rQ= ;ܕkr廧hMu#ټ%_KS6v(R7Uݏu7{õTvYdd. }ٓdwA$ #~\u-2K7O,@Mܠ7jxGNg,GIue=ppeČg)%"hA%带)oJ)cBރubI.et/ӤC 0D*IƋ:ٶ75`Xvvsw1yLgt6j~ZkxͪYͪnd7ެF|ͪnthVu +i_k]ٞf~c~~lˠlr2c{Pj#]5x霳X~j2G7|zpNyŇhXn~{3kyoshimi-2.3.5.1/banks/Cormi_Sound/0084-Organo_01.xiz000066400000000000000000000047551506652756400215650ustar00rootroot00000000000000[[s~ϯŃ $[kcČ0H#iZɩ<%V__jY{fIǺY"?cazSӻ]M?Q/&QT~Ef]}F;}d >>4Ͳ1N*|/zKD,jWt K5)TX [k^7]o: 5M,z:FقlRrFq“_,[Z{6Յt\/Iƽ?䓋E YAH &ż0#aV)YQ%*63_6(|x!.րm4c~CXPG5Nㇻp* `Fbr}hߖr?݅׮$ci?״_lQzMZ0ۮY gc}pX&]-6vnU-b~jS4B]- ca-5*o1yp67%È|fuew)ŚZk.GnfH8-d8#e>4YQ}"Б*EeH5ߍ+} LrhҐ=6'Gnu{\ Jl#u_u|[wݮ8\eźz& oܑzw5z0:C5x y俦Y*]J+U< xDd+wdBKd Ȃ$4|]y3[~m T튐?Ovtid0fOFj"=C!"Ppt/T{GQ`'%,+UqⳀMi\2T0VhBV$Ђsk M4Gd&ޒKV Of?zD0@oaTѩx@?D0S_l)8t.$e$5fc~݉#Fu((z)6QuE;!! ˅ bc0 WE匎Pءh͛-\*,F9ӌ=IEU[):ȘaL4vwYBχc'M>1(-7%HęW4X`Aj vc)d=Gߑ6nofz&ZChv70Aq%/pi MU܏Gp+&UufPqJ%i(-YmY^I8zY;Q Kͼ5Q=]mQ=lbX :8A]cT.[b3Z.X8;Vc4yb&9\r ,{d"t0цÊz~; (,Pq:wA^U('ī8|d g(St]}%Űq'=N.dc Q/SFtXsNsȔiIڀ428 ~_sD:[4_ЅMB(0v}[uL8u[GgeIs2}heo u˴J9D喼^^ɼļ^EՐa|ܟᕅq }*FjpapФ/j %Tt hlrAbjMo=|d ]y egJm.NG*4].\5"̢2D(CK@N4k49xPh,v^,ԸV|gY4@.缬^ Ax z}_FTvU6uU^/ NP>e0nyЊb/8)^oE8 9IUpN!.N>MWzSuX鹴Lmژj\陳1N<+S=ձG6^m(/BGyj{EdvU,|,J3) .%;yoshimi-2.3.5.1/banks/Cormi_Sound/0085-Organo_02.xiz000066400000000000000000000031011506652756400215470ustar00rootroot00000000000000ZMs6W2qfdhI$u/d&$w)@a4=nj^y^АE1\yɥ݋ g˻h[:p[}I;Ig]ygZir7]~_,O1qo!ƴww8O OAF {8s'm8/=0v<ro4ˣMvmoGFr"ON:@"$jBDK 󭴹mJ4Џ0X euU:4!5{̮#)P%aU#$aap,7Dҕ>&3:#ĝT$nXh- 䡺;YA4IL ԝ0J-czE/, ϗ'Z9|ȦsU̓ouW^Z\Y !P@]5>{b*ezI|GH}yz*|]2qjQhs%o3FKG88XPS}" l$]4`Dd̹w%E*Yxpp*Zg![0T;:]Y+ E]ɪ6UCtufAWveչ@Lta;t!#VtsFOЯRUc3T5Zd2X<`A-Y:!ɰQx,)7z:.'CK +7@8&q:ayxʣj-D b(n"8jpf~+}s8009j"a]TՇk-jfw`l:P-TT@@Aљc5#0$AO`Rc\l(^cE5,6*2޲fz#R]R暪}"Tʄ{}\j4}l}ҕDjR~!yYa(Wվ dh<`LW-jz$"ݡ*pms{vdiu.M۾ڠZwWmd~t;N&ymw=pc*v;P+Z[-~_* yoshimi-2.3.5.1/banks/Cormi_Sound/0086-Organo_03.xiz000066400000000000000000000061051506652756400215600ustar00rootroot00000000000000]S8}~E.lpB f+ 6u{Q9I0ZdInI0[yiZC}^-O~Qxt~9l6ЋApڼ85'g_|>.s0wS~+V_Q|l7ŗ _A&}n⹍O6Ͳ>JUpKi~6%6b36bbGv4nLfQl?mϓ0}$ğr__hao5V-! Ûi>9r>U0|J4Fs\P)~ R*!k?&Af凰gaKX4Ǒn @ LA=8wt|oSxpj4] ǷDm v$~pÈv>_`5\5΢8E+I!tNE4ДF,]NbPcR0/dJaH9J5V?tgK2inM*RlX >)ZsF0`i$UE!Hek\(h %hs1ֽvC p. [0O c$eh< [Ao_$UVuz$ pi mܱYIEkYgWtSD&n#v98ڬ`/'C`j*̃>:qC 0 l@g@=EjŞ?'D0]1L!J,2^ψ7n9*hߧ#sE2Z|'#Aq=T;]PXa~9nm郟z):9ϝs9=jZ+HMh0_.";J2H7#ᓠ"7ZhK׺ڋ<ʍP$9[)؜sTz7?{ 8M(z'>)A-WD`d JBEg: w Smb(ehOݾk;Q8Lu'}:lzk5z;4-;sJ ĭWXUeh*o93^1XQ|C B^n˪X7.'׬܇ry! 7"0ķTXnnbϮXM3q4 _ kB<[L^ V = >$ytl 3BPA\)|D(ޮ!CyBd*vgEಐYʊ9 uͷiPF\HCmC& Nl;wiR Ò\P D4ceܟndix\d<:Fw8,SOD@_,r[iqem3>ĝeyd nftqpD5Z6AIx[6"j& ᯥt;?y81T8fenSEmq/2?1j9&T:h;Ll|-0s 2a,G&W#KQ5}9OpXW㗁Jld}!r}3`b,N,H{>~\miR$kXDהa8 hNc="T(1-QCڼFS̔.RB0Ҁ"j墜H++I4!mBb>m)jϖR!m}vz3=vч9mfNf4%-hEDBilRkTӭOǼ2KGZWfA}aߚ5eȯ NMًIA'RzkզC]nZ5mPתwV-\=ԵmWWZ5*^5TeU=#E{ Y 晴j^,jló[I! YQEW$G~9[)-*wNZ=ؖqM]ǝv\)#kK| )R7<q-& 5)ӠO%e*DC/>oWkâO@w~в"6Hi+_!Ҏ+xSn?QcШߦژ&)st/YIUJ.XI^YWx[vEx+NZ-RXNAяA?~c5[* .C[yoshimi-2.3.5.1/banks/Cormi_Sound/0087-Harp_3.xiz000066400000000000000000000061131506652756400211450ustar00rootroot00000000000000,`Ys8}~YU5- f_\wfl Wdc2ڇjj)J/mTV~K1]v>f׽zWN۲FI+ %?]?/~?Н2x?oҭ9;?<=@iyR\GwۍXLL&;oo@1qYAsLpw -2k4[+K=z̀v\&]z\Os{3޸w?`"Wcn[A>RK~73l;AJ7NNI` R\o5< ^\yj0nzdL"[/[ʦ) nzmKD>]~4+MVvc0ݔl+bX:Tj42`kޮvoxX>#6 >v,#p]%14q8FA.˵/t߱|cFTיkcsbi@?l+xe&HD֐Yk $i`J(g1/la牚^c6E9]-0]qKzFulГoݭۻØјy!b`;"Ȏ@e%i2ejz& 01v0B \6,j_M%|k lI ݔQLٽsSZHĔJ#R~BtDh>뭖Zmt ]˫W?7}@0"5L+͉xx i3Flx(@= B\VXx@ٖtxK?U'9t>3Z34XoeT,I[EGPG En0M6 M4B3MDdW_[ʔ1` 4pq=Mǁ"Yh؄~~Buw-K1 onΈy( **ۚWvÑ*;Cz̑JD©oԘs)N=*<},=⚠zGK;y;kxVvQ @ hC:/BWՆJ*/5VzVKS0HH:28;WXwWkB)c%Uƒ"~.TM7q>~F2G̑̑̑,92)Sg'] mkA8Ϲ& ṼJ`\oD"|-Ys9i'0·Z@J?d/VbÝ W[y{@ e a>[o@2H*tY~x>P}aeE ҇PzC^#o§Q~,BȒ(%! 9_ax+13H QIyU^m)VWefn kzӇ0xT(]~N,aULq\SM׼*P!U+^O1e>4\~/Rq`~)e?RJ7Ӏ]xa-.H2+ӾE}e}]t" ]ʚRn ܵ >Fy+Ur { jrd|pvIs'rT'si?5oM4xI.8ޒ$R4S9e\,̨SG-d`?D3SNYyVg?'X l9<ݖdTN/j|XfN2sZ̩|8GT]iy< |8g}0Eo9/K^:YqI^}L K`^=Ccn=˾`kp !z=~=Z~=,MDWDUq仿^~}=Ad  4Ƞ q1d c3Ș TbX)c I]c8_Ni,t7 `ܻ!_3Ɯ<\u˱9Qgˉ: VNYܜC:US>>*'THP%#ds|^G ei{lWmg ڭA7Ǎ=)[;*{OODj~u~_K>% fUd C=wllT(W, 㱸Uߪ`@__^T)(MqFގͼV+KU5/UռTURUKU-/UTRUKU-/UTRUKU=/UTRU?۶,99,Qk+mYוt?]zAyyoshimi-2.3.5.1/banks/Cormi_Sound/0088-Harp4.xiz000066400000000000000000000053501506652756400210120ustar00rootroot00000000000000\[s~ϯ̥*Poj[8p#43ꑐs!/ID\ߟ֫#sou-v||ҫ\̆ף_oNl-)idMz.8.Ү6|`$Hmf!nlWwY;' `?|amHV0^KD闸V:g7Wd6mo.ۀ0bgk L}{QCzZ끮鄸vd^nW6qM̵c;&| a`|F'V"Ωu`no:n5ua قL\RK꣭ ^9omNj9>px/dz;M|/7/ Oߴ7_$1jCi[ޚiPu νUMxm񬢺!]jSlqD*3X:+ "EsNcAl:ٌ X66@Jm4!TbN棫cO fDd fEx 6'2.,4fQP6CO&dMf,A󘷟OH&@*} %WחExV )cI|T}uAI74 4G,'|6aɃbRT[b BE5o`{/,0tZt GN}מXfpm7J.g#,aKR @GÔY24F*GwFEDu-j>]Q+ǥphCIMbL[s̤y"Vhr9}~^l=8f2|S';hG|ݡobi;ؗVa,27:lhA)>^FNRvGJ#`.@gNN.b٬h/9g7v;үxCg4Kx]]-[25kU%ECɟ۝V%$ \%o.(z02Ag HKgG-_\z[-Z#G'HSYħnWv:'qc{~Q̞3,5$.H`'֗J֫|ij&2ZmTgtƿsxEРlh={du;]z::F-ډ1T>2ce$a%y`;zD}GkHDΦP<.ąl2Uсu pЩĉR 6`RdN'(ȑ<: JSnJg(i*smBި(!F&SXbZ@nIc >XnidQ3s9r(("rڀDY&nv;\*`]%DY-?4aJWBQZG`sݍq]qD,8<&9s5zh*eGjD --r[&&>5^R,cjvTB-C uK6W*DdCuR5hJl.?(rxM60IAkiXPhY]ClLڧl:ߑy`ptY@MUIƛtzfn;͢hlBUqI'Lb͘I;+1T;߶J/Iܕ=x0Iq}%Y]@D \0)82)y}A!' ˢ9U7' N64"WJ N'\2yPb.2 ^ccaWG!Y <Pl'~j8C(щo0QYoU%)ujmѨzA[3>>ŏFk&c4y~iQ1 \;4Ѩedԗ$Qw ?F3룝U^l*6Z^xt)\>6zͨгR|qN[w\qַ*4'x/tOwjvqw9xQw~]@sP }S) \)T_QU^)NJ*l\.+/J5 55ы;;H+qIHeg/c,{; E H/Dcij-e*tlL`Ϧ+aPbMTg+aZӕp]Jt8Ukny Xm8@Hȩn_A&ቮ\҇x<Y1(.UD=?WzU^7r=uua v_nΗ).ٖ͗ܙlf<ߦeKvR7=~Z˗N]wE|^VVګ/Qz>L5t{?*x7]/\t"Q Њne=P]^q+@krP˗(RUVtvE0G}gf5W]ZUw]w{?8`q\T:#C?Q"x&S 3o&@Y)o6{m³Xyoshimi-2.3.5.1/banks/Cormi_Sound/0090-Dolcino_01.xiz000066400000000000000000000115441506652756400217160ustar00rootroot00000000000000]]sܸ}_wQA`zSbK${}_X eMv4ԝ_r!#l6Nwnyy^o9qz5kէ7 ~_~nPżVOtߚse?U̪ٶVgiK)_,}{~ xFzAw5ZM<[U86_Wۧr琸Z9?T}H~fZoS_J⻼|VK/J㭐$< ) u-ySrl׻zm>CeXϤwW`RQsVe<Ս?7PW+x;v?nUX_f9.J|yyXϚYo4x< nynouF+R HX$#eaW_/=k+fXIc `7ICAʫbvb_zXJuĿf}y[gŪzTqeHNWrH&U3,Z~Aԡ/:Qwp-?+C Z9>-9=dZ=To8E*=*mt_ G?fs|*-WoM]lH#H.1ws_rxY.dnYmpZZqRePVϐkz!-߮}>bQa3Bvf U]>U .z;@S~nVY\}j&"G]7P@G[B:zgMҨM9JLxa]AƦ~t#s]n%l,.Y?jQcKG) ڼ8]l-Ҟ<J1^$wjh =]3qHѷsweLzVRƖOEI) <k2-8z)I9w js|4"p.AR)I u/$SqsSwqqCC!/,fiǶq=z(',NĨUQ׍" u7pCSDSg~GQt9wrH#x,˄rKB\8,S4hL 0<|-C4km(|kpQؓС>e`zESᥲi%"u`H<yV;1 RLt`3BA\`zIƬ[q58Is`!=d¢Ru`PHD XHblHw (b9eط iiԃ-Nsԏ n(hFCE.HeSkD%ܴf<+[ g^&m6mHQcTpbQ}i@$mZL0f$_,1@ZˈҔ1  c՜$&45$bWFKXPvpjz0gĤ`ҖbRhm#,h 7@4LlZxd]&x`͵k)!j1)ͧc:>V 1vl,kD)nfT)i"6}JxH,P|#|I b=X8Hp֊62Sf- 1aAN> 5X[Q ߇aA0^O 6@ŷkqYSA 2+V",=,ؕ5d(Ntg_BCB$N ELɢM%9c:B$vM} Aa5 *{((छؼraK-dWb]669X}9K-HNlN &ȆL_hBS#c6ؠB `B  5씹]i!8`=SnLtG'v'Y[5$)I.m3G>rCl℞!8Rʉ~;!DHM5b+ .*V:n:m$SޥL߄tswwG[z~f7M~8k9aBNy۫~hBoVWt=YOinD϶ԡLѾfߊ||<؍"Cfl,|H:.KBI߃`hK])3&s4l}&Y}lZB8e=֩$%zn͖\vߊFʹԩi]H G&O X/5~QE+_wUNGUX>cA׺kTS(lJn 'ta9 Zn/]%xYjVAwVu梬M&?[ܾ8ywy+?85鞋EΠODPJmgʾ%EW~бCEpe.4bI,Lhd:H $)pK:n):jVBTQt{d)4:Nɍ_݂\jNm ƾ,3 :|7}Ϩ8y(NLஂ.m-Z>6^C+-wNSFmU.zY}ToSgjkBv}1\#3.mut pҏ)k]l-8Љzwy|#Mz[ -.Jh=C@ҫ5Aڠ0o dk0IV`,y^QrvAE}bZj@{:rEexT "q*nh:D&UNq&qU0SH94Q^M+;j;~>5 K&DK[{n T^TnWCdq?!*'=.?C9-EgD[$T{D9Ȍ~t-=㹥dߜfblvʜ?2[ql @8`uv_to]?K\^|4v([NZCg8K{/ד<~lw*e՗u-|m8L߻jtSM2k?*Ҫi>xR jq]%U\4u:_{_P!npR Kiҍ2aM6bIeBLW&.uPoѺ-ߖ˶TucF6룁xo 6#V'FdâzFgkl=6fsѽn1Ύ\MwN1Wo;ÄfE@E~$Sdyoshimi-2.3.5.1/banks/Cormi_Sound/0091-Dolcino_02.xiz000066400000000000000000000271571506652756400217270ustar00rootroot00000000000000ksWWpV/mO5ev<_ J& V} ,-x7ݳۖ UY7~9XW?>-V޿kϞOկw?n˪z9};gß,W'ѳ??n>_.g.7w?>-o7UsZ7ggE]?|Ym>WHpk .=,VWzgvu(:{Kat~A0/?_X=6=Ӥ"|߮WHFK­Ċfa-޼|uq^ѷݯǁ>~qΌkD >R|^ܬ//3ūز]/}<Tr\-x2RKyfS(2zHbͧ g߽N4kJ]!"};9A=-G_b(l4\T?<ʑ,E]:%·m٧آW꠽z~=ҏpd֒1Wbcxz5ٟ-%٦{c޾۱ v&&fFE?q6M59f >I}(=HFhWd*TKrJ_avo}_e܎:݂'6ǡ;-9iC+kOFC0)/fۻqݩ˟I ;ѩYlڕ#hK>کчׅ0dGGt7ܱwxI42~]?L$0;C~w_|=$q:{{w%c)cG%G[3XG/Ǜ㲸?1zozPLuC4r.{.@+'GGZ} 9=9J7CI)%L4~ׁjz[8_| =]?.8h >ծhks^I")mE||*(6 X?)ΪC::IēO 8h, ގX;lEUqHEvvJ,ˌX/a(l]U׺qg"C"C+J3.Iᄆv67aj*Q>/!ȐQ]kOi$S! 7aY{LdvypMX^YG'> ϵ:,)1i%zC?D3U~:F}B?-0hz#M8 &,&|iev)G,=-2$A\K]kER]7U3zNH Kkgacp乲8Um bױ%4$Nh),S"[m1HQm6^M݉Q>H]b/KTdwyLVa0$~aՅ-y}'lb%ݯҰ&ttJ,AИ C|Gr?Mj?^c!uk\ESC p1 /K5Ӻݝ1O)*۠mm848؋QbvJ]֟EM+*PBiNMOܪUaZ>U N9#vE9UȲ.R?n~b~&64*u9X*&ɭ.  JDBuyi$]$tMxl2 zI9du{qFl:QFxV~Q3'Tָ*ts!$4c' Yzro=?K$QIJʳ"t鶙qL-Mq-x=6,y]Ԋi(XqYWa(tWvrn؊-/GJ`)v%E^t*}O٦q]>a0aj7 Gq8Oy׻(۵GA*+(^ʋ:7)/ idpy(0^I*$ANzEp*TENg0EmrnX wщ̊yQf=٥.ׁ,VAcM,>$bsXK%aa.]^o믨B~ТG@ GTEpU]^Of5j BG1w0Ot-vzt^t$|<AbCZDeLk2n 4żT8;[vy!SWRucՎ`UC.o,b+"hamb 9AM (~6<"s1aP t.6tcb(a_mb{#DZ8AӛRZKUQMhm,ʡ< .km\LJVUVN\~ 5|F5UkbRh4jgĞ dqYe@Sݰ6. ˅I0DEYHr)J)Bh^Q@wCL?5v0:@_lY{!ԳPaat@=>N 6b >۾]W@&:YBoBX7#'&~N_8c\hmk}pR&Y+ ¢+.:%N<<[ NM1ERxR\2W1Hepie \COV:ɺ%N s HgAB!UQn|O9'ARil'q%"]E \=[BR'yT)$՞¼1@C=-#c\KЭ>fRFؤ–)~(H >X!"B>ALxeֶ;xLccJ⦕AGhP)@΋CʑNuk%D[:<"9^˪)jET`l|(d$2[d '%?7@0<6\8*+=ڎȃ2[ ZY]uW"}ZjSA/8$HQZS?ʭ 1F%[ty?p2T,:X~T2$h1c+y8d'KB2GlHe~2BY L)䡪i%4dO\)Vup06UiQtȸm $h{\3ʹLX%ȲQ]>sT!FZڝecxJUU1(ʳ_*]mms'0aVn#: TQŘx^KizYtu}6[Hd.۫k+wK_ ||iQ|`Y i+-4F]hT7nHʑ'j$Ъ.'e3YUĔm ,ʬB Yg-doζ6e8ȜƷLpM>[HfzTFxxi#иMO,Ncv= 綝Hxk;L/Qe -^x "U cΆ%hbВM2hk,1QHPJC_p'?m~&AoK(hCTtc}s 0|֒n=pQh$Ifα h[z% Ạ-w+,RsKYA3KVEZ0ab6Jh.ؔnd L,V +Ģ&TT:ʣe(nSO ->Pn"Kѻt#k-!58TD NA1ttU)lg(lh8]%U?) n1VlΞbp2`եB cGחP(P,^ ^O3eLH(g6[Y)0 jȒJʠnVZ5:˥)]xA}wUMŕmo# 1ukS6.szJW,ؐI-*qY?nº{zLItFԶ;mƛ!]:XDQ#x0n C8[l6t `jb695T ,ba*(ؘ'ٸsm¸GYȶj%TYE JgE jEG$ 8ۖ)rrʴ$ˌiK kxb93;;Se7B*c9e;*}|f5ww4J-=S,_DET|ȋ37)rʂڐl@m44"1 RAI[AY̖,(N%C >:_ T]ʞ5ٶ ArDy!;HC>&RV'QtK2s %g%:RpN֝y2ʬ᎚;N(^4a<ׁBgcD߇nYP}UdD 6B$e.MPZ ئq9lA%'EBQ-I OMƵUmjE\.G*jVc78b7dl>`kQQZ[2_PP=c5'90BDZ{\rpIB " zڹ'la%jNU´c\9"06eӛgH'YV,ѠYL(^j:IwRo L-̡)Sg;u3FIJdZ@SjK(vD6J4^jiz IHP.ţ z tȈ2nRu[gXJZיauo ॑bj^6NZ6"LJ=KAP ~޷S].p1H(O8]2 i$*(|s<6BrXt qAݗ2RNdSZi6 InjG:9o Ч/4l'^8u3;,H#Yb2CzX)ˏtI&->R 4ŲP9]}HeOtl" &1zi\sS-"Uf { nQ#ݠ--5 ]wkrMElȦtY3A̰ni9.gwY8̂"@IH1HFɑ9EԎ-y\[Zm@qFFej=zlI(Ŵ"UԖMeZjxlz@愹ùn*­QXa58&W [f)XcߡO #ic\eSN%]2ZiK5lI]':,h6oqF-51P0kWR6EIs#'-K n01HvfLɾqsXθpIv[?#պOPVq|~ÃΙ+"Ġ[;MB!@HζmiAZjhF,h41V?O`rfZTcckb9hZ[Q 4> CtޢTma頗/ ƹdΣyuffwRuyXq~o,,B Y' I1[f"P1isJuǨhqƪ+k@ge63ײ mWvTRN7Ip&ztg?'9ۇq?A➻h7죍VTM.?mlqr$dCp|JF(o؁ i۪Z}nB )-cm5 CЬP{?zRYqm%Nd9Np݇Ȫa`P u2s5v fGk./(cO-:ܠ/T;gFI_isV IjPGG {Aj*\:v`m'34O1&-M0BvTp(Lr^B;gtyqgO}ҹx Q7f Hm461J- ,.Sg`ZԐoyN2z16z?YYqp FpyyA,me 04юa첌e IAiMfĤ,32 &Dt{lpt\S~/HOZ<_ILqSvp0ڛ\°luG" G t-i -\H\uHj#IkS蕮B5]ɇS%API@>6TN nwQ(*nH=*/ʼ:uy9xWJLZ 6p() RۺL]ʂ~2`Baxs;kڂvNctd‡cxy짠;f" j1}q+ҀmoʱO(#(pn mhh,I8ǮR gH̖w]VEiS1yhLnxYiC˗(tCqDqZƮ0接3KgkdfjSe 9cHDXԭooj93236g؂l!SjQ/qېd tsʎt/}A N}Cl;B^?eLW [!"o91%\ _5f2hiPhJk  ]abE6$Bs@W6b;M>`}7SbRq,u+KjQ*Y'm)\tα+ۆeK(<‰>ua2eDᕥ=9zLqkct+MQpQn1α+2o_1q䜶H&F#n'Ι+A#,ל[C'43jm HB&He$Ih rltk\hC.Hx|qn- Z{R8QکFFϖ+ӏfeV6 Fp.tkW~ ,6E9Wo7WEj~b5pzvy~ȿֻ8_7/_]Wׯޞnnrvu"pwQ_i|[|}7=a~{wxX ']aX7+ fy?fvm/~z"u3{])^67ody=hp~-WAַj ˌ֊'r2cQJbP俞_-jsXr=.?6ǁmgv^nmC|rſ7/^Vvb1]_gb-VIvd?X5G(7 drq9 7 v~hj1qߥ]>RFS~7 NZ~G{3RtTq3 ̑:?A?# TA=QyEڵW'>W/WG JHY#kN N$X;-F:l ?3bfvibz=;cݳ5Lr8ص㐈|EUmdWw AY;f c%FW}#9/U0R[twXw>D:q8o;70DLv~=-,} W>2.<]bu`R$_YriwmBcҳ??N}l?S[wxXD#zR !|%1I5!m Nf]Nngib,bK]̟6%x-̶: #QݧSw]xΝSo[yeVF9D)ڐ86"1Dkt&Dk+6z&-IAgF}ByGdXlY\7sF,S');g֐%Mglj_PCb-iy|! 3jia`)oqR_\ziـ_!',MXm{+-뎠қZ4OE5x*U%~S4rsv1FvUPn LIoWR($G~D5i!UCKVŝOog V|T2!{%p^HT1(k t\8ul}Qہ{~C؋uw7H8* $ aB-ąV68F&)DB$,*paN$$I|w2>UE/fx7wk3;JC$~SQ" jh2rʳkY p_9T^ښ%> T^M[Ҙ@C (JRlP ٢{ 9*qs)4Sj;5u}su@o(i\R=oܸYtͤ3kLe?lՓ^ Ϟ[WBHh\ gٴi-![Sӿ{R4 |K -'|;;X J7 PnL;ESio, ?#^M:?[]ph슼\w9_L)}fi*Jxmo#@#[+vg?'#uޝa`bX-?ŋAFy{1sF«1^ ۇfDs=" ԾN '7RK|o11',ojFmfwG -f4!ҌAxoUZa^Nj40;z]*{QCeOo7q~Y`Z]n翽^ V#޴6/+% 7^e~ݠݭۯ>_kYxq:q0*_{m|8mȹ u+p7ޛ4~{g{+^nu70Yy^3jz>[̮Inܯ_YZrB?o;[/r N `P!"ǻ})?|lhAiӵwWl?D>Tg׋"o|7ps0loOd\m[-I%^/ [ظvMZW굮ڹCͭÅ^&[o i)\|[?cMcA5k8sV Ih(O9[[Mˎa/po׺#7y%B„ΟC#4Q%c/X9I(5s6v_ rǹxY9bp$#EU,M??[ܜ%p InlC~1"7X;Aٗy/*/ px >du<Z]eW溫?vq"7[.X;X^I] +7D:K*2IzF0NbSJ 0uL=aw) >LL|k">gei#X`qMlJd0Zz+'֞s5ܵxaAZ|8uV\ 彯2qڷ.SL*+n ܬMSxS6%~ `Չj<ݗZ"l\ڹ^5eLTaq/hك>gA0X[.rړmu-u{sۂV 9+*K({%^a[߅Cnk?Z͝Z0ěiGfI,imF B[伌QV4<YVZj wՠFl@0"68BXȑ&r,D&!l#C23i#,Fnp؈:(fINKȔ =hbLAR!6FA4aELpؐ:=hbhbØ煪aCJ[A^,(&#֧s$лqڰA"LLp12aE}SG8T7}(SR. nZmXU,kfbABMcvŞeG]ld&fp!26%ǀD(c 4Sȑ16#W Sb%1F)!Tff*(_I?`$fG8LcFbEb-' ZŘExcLxQbER6יRcL=Rz0LGipiuNbu}49¨qbVȘOI _d`g0)2'Q9846`wZ}`QQvN#ͬ\ijHwb `fS Y] ӓPCia}ҋ~ C} _Db .U!mXvK tݠ~l_f)t8X5fQVBvsJ!2"E:âdPӲ1FRef>'O /. w נDeX=,DSc&MQk45 O(#X-bl4i@M?)]mMyJLj0^#{,u@֥uJDK$\/FN(ekXrXcm,y|m,yS ҫv@Fs1N#K18`QFoPgdJѶb4zDrm,q@ڸ67 Ȩe HƲ`܂e ],װGl,k7jl,Ni!@m,k@hրnV16{K@6o,k@Fl,k@Vhր53wc^(=6?zl,K96v] {oVXրmmbYԘJr*5 -{65ߘF54k@ZX$1s,kPYy 5 v{5Vo5_/NfI ȭ 0.z F.Fms'G!V'nSXPM7Fnp⦕2%t @v>2*xHpKVAT4Qq_ ۜ߇ p j5qxsTF} ,F(_ S5_  'bu[7kWī%8D6’!D2n(1dk@J@ڕzWxNS`sL"EF3|FÁɊHQSLWOܒOj @l8+Ъ͇BE,ſA3NL]ļ/h?o=%g6[ap0 BSj-b KSXd$,m/?Bp\; \&Qȍ;?1.wnp۠u3`bjf5haSx?O//N~}P&1zy)zv^ AH+Jaߕ`طZAM#Ӽ+4oYxbp砲 Ң(ְ!]`ݰJDl3b"īds}nVb*s%ƢT yy& C&Oԯxc)<]IHM1eЍEQ!޴8F>=h =9}DȹA)daP/GF !lכw';1 ,i"klzCsT}98 Up;h^\3ԍbSdHm4{E87c re苭3 ,`acLY{V=ǫ*KYBYR*X.h|OS/85:r+V&RD:I9^j(ϏRRk`βY|n5Թp̲|; Fi41PbYyAQƛH*\UbIP}L$ {KU,K->Y"{V"3Y4Pʸ'>9Xnů|?GzB@XmIG,\lo\3xū}M,R'yqrO^Fsb)w.7 ]])V@rCx?(VL[~QRFk|\Nq9ذoR!_.KKFiS ,gh˼YH/ n׹wd(h1 @چp߸Wj*%"Nj+ebXSJ{2%&8JGCn"3덪@JFYIjx+@,ɐA M^GmH]MkFӚײ[@ ⯒{Σ8]2UBS:nJ~ r2Sa,7w!؃2 LklrUfש{)4|{y?--l:im+~ [,qr xO*5DTko=Ko m>{ѣ*4-|Đȓ,;W$nUe鼞]\/ng 痳sݪUI6N)Þn7u#OY׍ͺn!huA ܥ'`v .Q:<4%S OdSdGfzYɂG 9mw)yw4p|q y=gr%5K ^GɺQA(Q"nEa^?:?]MLLWtUD]GWȓX: 4^UjKNw'2dr3+̳k fI5juz&WCyoshimi-2.3.5.1/banks/Cormi_Sound/0095-Accordian.xiz000066400000000000000000000065671506652756400217300ustar00rootroot00000000000000 ]r8}WhXUI4Z[f_XHۜHx~mQޚڧq(4@4@_~n֝'?N(tb}tpyA}ۗYnwwz﹩GSYGS'K_B.}>/dvVaݭOr_-_[7vh ݍz%yGg5wONN*v\Oo6ht68)M" u$֏ LxK% 8Z74@UqJ67.5w=/(X@W}ZvyrX֠P #e8<]#}<Ջv>| =Sw*dE^'H0k-[󫟤}:~x;Fw] O:E_ B>`{;[<뽐0ԪҴ;6GŠݝjF,vwr^-"USdn׼ :0e7;(ے6RrQ-8 6mc?B7\QٞAZi拥I(xbi`(ڴ{׈j5ڌ{@kD5\FtZ-&h>@i5.FN@Şre8Y|a"HqS,'P"XqW,ZeqP"\q-pej̸tj̸ Z:a\o\8{W=]_G.Uݙd*h%X\Qgg#~p0x\ @ؤsbeXY+VbeXY+}+<"Ո$m̲L$Js,jȵ pUP6F_G;%Ŷ, pYW 6W:D ci/B1UҸF:F<^jaZ #p]06/ Y"f0D׵Aؤ &a@1!˵ 6fv,3F8\qvX_ᑖEf<4ԲZV`mYíl ;x.K?YmYV \Y-pE+cWjn \Y-pwξv \هG"Y[ԃ틈wVgtì x6bދqp(( qwgl:X}3,C;EnB\- 6іEa9pŖiE4"ⳅHoE4 )8b i 7>:Ed{Χ ^;1:$̓VV玸,s;FD>.`ѡ67??ZD=LFmt3"ٙIJO5!qv$>+Mˆg #bF+^{GnU }Ϫ{^ }Ϸaoh9[t"\*d4=+k*xTeDR6)w;9^̗d9\$SO$gBz-ބ)UK$ܘIhc ,>.tKMMLc2JbEiƤ4nl O:ZCK`-yt(Ô>Hyj-yC%JW"#RݜU+i!+=n QF0-+P79r24FrǪrZp='׾BJ$^Oiv6`x"HFt+QȪYn_BvoKz 6V|اdr>e)ɄAjkP!{jnFVS1}fiJ!mB?I*KAdib+z͞O ٹt6'ZEaJwgUY1,dK/ДdPZǾ撤8~%GvKz5k.\2ǯ$_s ~YXݾo7c7кL\]g糳eARrG<16p w[7]۬m_EE,+ מbyoshimi-2.3.5.1/banks/Cormi_Sound/0096-padNice.xiz000066400000000000000000000220531506652756400213750ustar00rootroot00000000000000 ]]w7}ϯV7{O9[>3ɼPbD"5$D/6><)h4BխŗrY?셯r5_,?ޟ~?`>?xvwfokXhvl|<\^\ng_=cv^V/o6ݦ\~?N??MO[1}g fS޼||}˺\59x7ޭeuشˇ{v\BؚR^.)>[^~bg$׏mʆ Ѿj{پi_Xygrq9]ϖͲl֫oi'w'wEj]rX.LoW 1:NydsW`b7ڸ+'We9ri`A0!x=V!mq0=.k1ԳS)>z:|tq?{{b{]ΜmbWYTQ8$[2ݵմtwvs{ލh:1o^^Ϥ`]\-6w;2Bÿ}<<~ݲIX wjޔC=S,OtůyGe_*bTPTĨhvwq "sOA_{ b _ށmhѶvFBۨYoԶF޶25oN6{B zJ>TXwK4~@DB|vi?}VJd>OaCcj_c'LU2)Q,<,8}Ky$RBէ)fH>O G%L>38B,"C!> )EMJ>ےX(x^+?6>]'DHbYPQ$LFRh=(79WbY|m$`GIϒ7ILl2,~ %O? &{/LHQ0}T"O,I]*Al?Z^bCI>ݣ gI>c#OxJ d-).ԛk'gKV*)E+E²#طi]%3GGDOSb)&:>N=Kq$VU$b >m, 0;˙yJMnwuO6˝1x=UdPhA^o+T6BN]v{>zەM-'V~i6=,pNSpFQ׻=_Ӎ)(Yy)!5,n#hJ5ϳ^>;Vj u<$ >tQS9N[Tk0gœâ CmQaI ܩJ6Oݮ~-U[nLbi[g5:Hz{픿p irhrp赩0N1aiX37||v_[,W zgU ><}z_=TLWBWw}ߙ ZZsX:Ӧfc޴iC(-y g4+8:+6CŞ ;j\@v5.wLvcH|s \Ϩ`Smrv 6*31oD+>i9mad=VRfd>ݓ E ;rs;ܜg#u ꊴ>ȱFcjq=YTĹ wlؙ mbgNWZgoJ6.wۺ{lv<Ձ9w@%EeG75FAz7C~YE/[~?ئ?I߷C_Ѿp[9]kw ݑ%[o7;~o1{9VW)>=ܭjBO;*ggg.n~i{ھ9RWLAw΍)ν~NҊq=~wq|a]vo2FvX.o]>wObi40 F^HuۏǯM~;M6~(x QmO`6c hicZx,iHO"s^]o/WIEPBAKTuI0Zu.\ trի,kmrWH] i1[U1Fcp [c;-DǖBXx_G搂68cp0]`8Jg,8.q#*lk/< .ubf qzN8ln'Xk 떩 @!qҖn0ĪtB|:TCF͔Weu2w*`ZO!J"4# / 1L+;߭0dEq-"-E':GQ \ "0@tQP i!nG<ˮ$|B5i'Զ9ҙ,qC#vEP.-lƆV L pf(q";RGct=3-VܨdM 0v?+~Hn km\4dXۿu-A67IΣ Me6 2NI6i 'fh|g`tm6Q q*5óԚ p@9S_5Dϭk@2{[{HȆ%p8KY 2) gJEp"@6w9fB]~Iݯ!4zf'mU(4@(Yf Jf1s'@:q>p\'%ăssSBk=ugP2bUK/ef:,s)m|R" obf3l+]LUc\KFB}꺦A~ZJaOB7oPCiD,@[911*uЄWxMʗ\ ñ 6H͸U1ӘJ`1ȷrUx ̏`Er&(jR8B鑓9A814Fc2JC՛)BqL +U78R*+D3kݑ$T* ֹwH!& ~t,il0pl+%Z*TVtX:4n%FcD1tN&ArAW3+-D.bT')DES"T搂 m`tPt爧kְ-ӝ4ھz(K 4T.55b"n}e¨)wt;p>Іj鶪99d]ׇIYvj@dX9ug`vG] oGÂ,|#y[f8>|ف1BJڤzWcanM(2†W;B)eJQ F!iLj0TAƹ bPe}E?T&2)HHV&J* &^m~V9WcF ].;X U-R#(z~0#713XV* QWנQ% Ҡ2ďjg@ۂE3c5Br-ø1p8ˢJ$$ZmMKxjlPP4!rEڵk8vZz#PEBa]#YGEZpa]B d+Mι&0&aJN*F )Ά(8JALUVŨͶ/8U)T_Ce:)bۛXVbͼFδZu\!NvD,vr .|x7Omb9)ػ-FcX_Vw7e),jum_S?5Y,[b{?ݔKܷڹ~yvZ.m]\KMv?;phZEW63]-sX;HnunnH3u|i'fMe9Gu9۴e׋eh޽3|ڂ#yof>>~] yYugmӱkjGDtoO;;W߰L'}fZ?y[+ա]fM9<8}4@kH陵G\3Yo.gj}ppQ5ȊHo-AL_g?A]|A i]O]NtؗmV`բj%N,tr(/ C6nxT?uC/=n26Ğb8{s}Cao~>燽!77F=(ۅmۇmw~_?xvw & yoshimi-2.3.5.1/banks/Cormi_Sound/0097-k.xiz000066400000000000000000000062171506652756400202710ustar00rootroot00000000000000][s~ϯ{U-Z|lur^T2[8pGfFݣ (/IDE3==_3vS{|>Z| W?Wf`oGIu߮aOwb!s<3_20mө]MgDhƞcAmdnAO[ut6__ 3=u75Zs ofO-^k`3BqI!Uu"ܐu6Wx15 x@NjC;0 ob kBm 4q|7Wh]{&"x\ytvt_ޠ=M)Yӥ-˷UKwӯ61 |҂S'Sk{T+$c9eīeӻuWZ3d +Mf>֛l]nC!b&vuNTv/adk@^Z|Y+,X1ZžbʷCb|-@XgHۙtq{tWK/]-XPX諽 b]XV@ڸK;x6`lQ0HKw =T0p݌ʂ]va7ꁿ=Fu{iD 7=wBJ_̯x=ˢ)7Z`3z& 6PX1&J]oi XUTC7c@9phbz{kkMst9NJrR9\M.I$,]'p|M"mS05.OFUQ 7O}m5=2Rh@GyF_vZT{Փ{)cJ{:Tzńi;nz(L}qM} u]ι4H-}g%w:Kuk<׆-)Si3Ǵi=Q GT&> ۢ8LݣL60giֽelC)Qaǀ4y"B]#m$:xKV@a z[Jm 53E{LoYbvܥ$"I=F0) _h\Uhqۇo#i ':l{ Q%O`0/6Y82}AqY%$jK6\gP FFh!O` -,bYҘ\nK{wOK\z+VC /2xIAu!R)0jp>wO@op7ޭy ݱi^rhL$r@, ,S;/AVتX9~/.BLw){Y2dV?@+0#"ϙ Je/dY0J=LI:['څ2̓je`^6ֶgmz̕ lВ7:hH-9EvH,UF5 c|61jB0<\!D6獤t庺GJh~qe!9DdYPθdY+:n"}ߝcU~w7ۂfw|݉5U x<ˌɡ&96^+/4[2s@b":Qk]"MNr # (w[Y  ", NIX^!@9E -_NJu&\6NGRIZc 0J랎y pL\u%9J*K=cZ9ɩCr V.ve:{5F ׽گ^쯧`Xng?_/ą+wzFokvV(nčTL,}q  ,[X ' Rӫ86c|KP$7e]0o'C6ԺogivvKDk/߷Ksd[-gPδJ"̟S g i=n ɾ+ެd+=)tk N!V!r: @Ma'6k LArG7 'MKL=yFZ*˺wy`@˶jd+y<2V׻5oX|DKZnH-oi,[t%-y]SU-E%ճ;ŷ&-n[V1Z`M\աX̾[rQl1wHdӉ(?k7w"@iH" o&ɹ&~d ]ʉŬ,\Z28$Va,ESr, $*P>5k^n0ʡ3aVƓΝ!ӇEϒ5P'S E'c~)a0懑a[F3mURPuP'5FE֣f G.9 IqƬ9pcVR]d@F`aCqy'# cG&arKAY 2jsPQؤyFc6 T¹(lS 5Bfa }c1YaIac `̦ :Sj 1jK3n^,*Dd50\~ 8}AZ+k Lb.Bf$Ў=uPHQ̲ òљלb)elY]z\pkYhCddļb~"MR`!r̻ v¢{HcC-,cXYCF,0f Nb L 33Ic'da gA̬]H͆tGM--iIymX"Lm$:ÂCu:j3(u Ihqkk >pK@~lI ~̬c Nԛ#cFZb,?Y# _y##"$&M9'8+1qP5h>.kK`́1׍-A9. +l,,_@XXփQgXrԳ:b]HJ"K˸rb\XҀvYSt ev49>bh\o,w!Ș&e >c AZ2,'vz-u4@E,@>ZX"t Qj2 X&!'=1e&2 p$J!mm,@֕ذwlo *g,Mt"@lX1,@7EP zE +m,1l,@?"I*G\6x`cYF|C\;,Y)bc1r,@9hi k5dƲp\#f "!};!Ia9l}9! 17 l(5?<=hD*C!Xal(=rib2e1{\%d㜍6? =@P:4dq:_U>wb+SVF5t';gV(nSPBZ5g$ZTe)=jF+4)@xIUVHcWEi?l^Lg_'>gjԷYfi7@s Si5o l@#ihwvgO7ֲes/wE n$V{pƖx/ .nvJs XDEILіHɁ&j vwrKlrKl}É\Vd_fYl}+ t!{=L ZĴ:aʒxfl~RW` _r..vˍ}p70Qt9%8hdO\sDDU-o˫N݃Rf꼞fO犖.Sxu{I o9 L<ΪюR^)=]\SE#} CuSmU*'D(r4jh#hCmsgJ;SQ_ 1h3)~vvKZy#GpT.儝_P(.wLW,%]8DWJtRMvfNWZbDW?]iZ\/OÈ;41wJ&3z 7|xXy(|feߓQ{'$įr0wP<o*ɳ˫UF -=2o'#a!\=8)GsihRXoz[M)ܔ+:6ܤ/ܤX MMVx#T Px,jhKH4@M)Mƃϒ&3ϒeJӢ6Kd@N^ ?eɐ:S쥓d/$S?WOpZ\RL嗣ɠ3pRߥZ9&JϔavOx)x<7kOjk6TJ>fOa?qKݫ=W9prSPdCS)SiTch<>՘\cj8d;̧S91ى_LVnKBTc/9NZ)+7rR'n\/*U*;*YfxC\oR)^o TK з7{JҪpʼrRVcx\P<''}'V|}-@m8 @6-*%pkZ A-uV%-.۔ܟ/~iīY'+LIC. q8@;FjwgF uc"L/'ӛd>:W*^C>³u%Zוj]Wru]u%'Z9 /y &Ǘ{7M~Y0HĸaOev8 ϧ̻Z~LGK. Uj-1';QOA(*eG\` b [1hhJAQy%2&9+1r]ߨ{^'Lz?EngwFOHjwvy%_jȝb ԐEbryb|z1uԳmG}!IoTiS8GݷeQү)f), 7q߽?3 yoshimi-2.3.5.1/banks/Cormi_Sound/0099-a.xiz000066400000000000000000000075301506652756400202600ustar00rootroot00000000000000][s~_P6 l^T$$Hͥ[rKlOϭ/tzu↑jwڙσ?}=>\}~ '_Fgb]qgqj͚/c';gyxvlW_[{9`4 }7. =q"cKc_Moד1m,Vgv?a6r0bg_vV ՍH:LG~p;zOγAo[x6Cg(nޯD^#{ㆶGq]>,YA#].ݹG ^y6Dߢ"]1㥺OoGl?0olaf>;_N-aP_7n>ʏٮ(/hퟮ[`!XRaEKG-ʔFgStHwf+I_r&]ZSz:ǥ?|eeq.O/8 Al@m}Kmg4_0"a?y,gӊC,勻 ^jRF2i?XH;;\uy5;m} E"26Nc3IЃNi@.oaBU܉ݧ  U$(ѣVb|r 5b[,Ol/4ٔ8tkC~e]k vD/s.-lgYyV:O𶙸TAӧ}5/3gZ̶wgA5)ܗ.ؒP\/>*wUh Sp+ ^bi"iFc #T;H+&^zet !W{]X76ٮ8U]aCζk&ݓ ME#( x&ZFGdl@E āggqQ~zdc2Q|~D"+˭?gC=' BdYUL d4LX8S-zb>k'hH ޣWiJiW1e2v8F:eeǖ *ӄ3 (I!6(gFԊH)f4;NU9&*[ .KQHJl/P:vp6bۉ xLk:ǽ(|K4VATDMG(jqe,vP AsJ6D9{}M,7vql\qw _$%ywypܚt/{ż;HK5igQso?Nƃ%-ʓ6TG!;àg$e-Toqc:Znc[B8J]7>;ڪfUDY?]E mYܲ${ncذg"k v 4 ULb$6fiqNtɦa1ThmQbYwK%|".~q4GJuz왂3D._iGi*^*_ @o̳6KD=)iv$P;[9d?ϜKR)DW:}Z-v,$O7o]5֠[)L*̗VdȤQ&]g2m)K*cI٫+QL۷ݕiowN;+X>9F2.3ޑeYRYZp 96QJg VYr NYBFZɭoZНmBIJ!J\ "\-A3|jU30`W6ںbwN gc+Q/( E"neēl XXXXXXXXmďeUfLo}@}Xo5:JZNj%(nNWeJ"ߑ ]8)\%-A&&Y;6avZف܎CiiE S;-[/d;-/Y~e{9EYjQbe6-hGE@n]8{8 >wMP#]=ҏ|%ݨWA/r~n$U&G#aڿ*or$lb `(I\;ƫ,(jey9*W./7; 228PpeFVB2ut#^2Tz)qIvJ>W#z6l4kLE]?NU, }4bj 4H":"8i +6 ) ɻS$͚o==`2> )P޶Y!Qx|C)qb2zUc_ԣ&vQ1a !wk-0$1FRoJT bNepRzS1 kI:u]i 'O34m7~L,JFx30&1j"dI=ʐ*fH8ST+DNJ|8@EL0I"Q %Yz7* 0Fj *h)XJb) AmJP@u*&B&tg3N*GCFDhU#)ԦjpR^6/NSX4O"b )x}A,D&Ԣ"VŶP: *QSBJQ8|wb1R*hT0W0ms<:.Ti'u(5nW8)qHoHU7&)ƨP0wkPvX1 kIPt&tSD$ƈR2Dp+0S&tNSҫOlܫ9 Խ׾Uܧ84$8.P1FP"&t0F:*zFjQ(5}O:fDyhC_dz&ĞaȗnzT bfԈ|UxBdI?1x+JQߒFwA}꺕oB}4|r2.ߥ=~UnѲqּb.>@|9uć*ux4ߊdw\ܛK4@(Uz"I.ճ~Q`}s;lqM)w؃@pD64<nvhz4&gE_~t;#|oP ʤyoshimi-2.3.5.1/banks/Cormi_Sound/0100-Steel Rhodes.xiz000066400000000000000000000064021506652756400222750ustar00rootroot00000000000000][s~ϯ qJE0ԺoJ# _=H3]dݐ[OwOw3>G,T~i7r֖}y ~?=Zoֆo%;9dX6Ek~<3ј|2Ƶq6?|ukgED-ĵMo-Lo6""6bK8b M7W|tm6v{k=Ϧl0 HG#8/ۉ~=]Mph:ǝוּO>LNRr,_|s{-δ[ͼgfc14)$R}GFo!kE6Nv¬.n&n2uo̓6 I[宜q}ӳ҈WΎk~޸ήֽeYF \Gl{/DڦO?`/#D&vxPwtxhS{ b%v/leLi˭L$'2W&egyLϴ׺pE9 z*_gߐtM1I4XܝGg ްTkkgǎLD߭dCڠwGs,Y{WF$ΫK{VB.q(KHYkプG`LYyQA|4dvK)=zAƐLF]c+EЃx&رCχ>'C#qIɗ H0)i!GJ`8TbhD|xp$mdAܠ'S14ʕ1Gf7BsNؐT:ybZGEQ ꨈD? B pLLnl,I!%1c~1Oщs-d(*DqЫ{{)Cv1uX9Zﳜ,vеS-oCڬL'd_`^&ذWl},{tfj'_w2\gR.,Fu72pzFR@T`Qb>%(IQr ARp4θ -.o L0tC #X!"i:l2d Yj\D8\˵v&YKًY)fx4u ]|)2J,-}~R! Bly/|5zE9; FIͣ|K|bˢz M*B{З}u۱.V캔|J>R[Rr]R2_(\Hu=,庆Ǔ8}E,>B*'H*A'mq?LxAYݐH 5 Qe#˗[)2JF_-4*],P͔֑x7Ӕa$%fad#Fֱ 4O 35UV*T>ƪ\BuFVj3,,\bb֨UVZUjUeUUT dƝ(t_>(g,>VypϭL^ѓVj'3xJeH^7\<fN#]7yb-^BWA;2g5zܯo;Ӌ{yoshimi-2.3.5.1/banks/Cormi_Sound/0101-Sweet_Night.xiz000066400000000000000000000111661506652756400222400ustar00rootroot00000000000000][s۶~ϯ{*$(<4}lCKF"uDʉB"HvEɎV}iF`oݯQ~UNpM}f|SÛw_\N| {쏷S/ߊ?.S BKF䭓{ȋ'$/<ʛ/Q|,Po4X~zszR9_=+07^oKoF$Jߏ]FWNz뛏ad,|35- Wa}]U|0\]oNǸ𾻋`SKZYRAݥr0NVl*lO>.Q~xR<Vn*MI~ _tiU}`4N œN _ʇo>yW{V*΃$:9V“hg6|J˖<.l*s6ioCyy|46Afy*'EmTTǃ`R[лaQԩbHmHW1 `N(oN$I*V屁֯^?iZnQT9Mߪ9bW(8|Xy4ZR IN } }V[h$픗ǃ?&A”xQ.u(ѿuN]+?Fh)ĵƒڷ,7Z /݈${Ew;`bnD0}ro4W~Rp$dL^&I\o sjej&]sߋsy`I[rs woީ}?h_ijNW vg m8ޟa{VVzt`Y=ǫrC2\"a>V4&Zpx\r]XW`Yq@ʹVIcwy/+ט;.|זVb9jw 5|ԟ{+j]H (L)_.=o+g|v5`tKOd抩úD*BImY&U)C>'Wu6ym&5o(-J޲{Nc<_QP9 ( h[mJ~:eQ*q%첎b,Qؔ|X< ^?YIQJ(gU6?~MrW7ҁ('dۧLĿVT 4;x=]ԤrWaYf]^ΝKt(RޫC,so]wͪܧ E JHb1&)EO9-&wDuL9Dy8@B(t5F5rbWDN4K28 u#u|qq ?.__6EUBa7 fCӏ '~1r4xp4Vb‰B?^`UT?+uY77m Vױm:kH,n9$3ֺ dihZԅ:W-{:5m.o+j{.T1G`HV;=T{FDzʈluȞC pTPjK3"aT[Y' m I}i{ψA8"b]J9Q "֤nFDC.)%{ꈈ]GDE}3ĝKU PꘄQ)1gJR̷ušɀ}WQ%k6%ZHX6&al70 To0s0jW}VJ<_W@keLbx #5I0鸿 ;g5ļ|r #G8cYݥA51GfLQhvH&a6I .a7"a-LF$ 8b%LoURaF wmJRnlSK.25amD8FژQjYIn(H|!JQ $OIL-$)نs hu a}( QM{de,IiHL:pZ?"uh9lL¨ Q!:{cd.H t_l2gEd 2 N3m7db!Uz)k2g;LiGtq-wzzDfaoPWKbUKb#Tn|)<׹2brO,Y^ ԭ̄k(m'<&F[,4'A 63+/P$Levg*ƨLQ/W:ڔeӘWxZa*3w#^}]_U_y+P2hx!~!7.rFr]v]y6}5^ʍ[Y"¡On[!lm $;3_ڪl$z ]$H$/Zw3iĹڃN4}M9l cG; yk!@9!s,=oĮuo*4qaju'C7֟S]Y,z):߁^a=f(J_>~Y-ͦ{7j[@*Q3ub`b6k UX7L dJD!׭K !"vv NE"A >ND\D738gO>h/)<#"v!$*A`G پbbw^?Ȼ|׉'EN`t~A>u2jTf_yg t"զR_v)Ao<~mzΤ4p%Lg6bSWqH^== Y1g!NCI^ϸ1FrxQB?×> z CϽE,_?[kp oOqK{Q舂l \pሂ V䈂(E# AD1嫲&gygd+8xݐPt2OaoS7* :n(ԍӒ1uCzE:߶WS7gL Qc$jzpEÕðjrwآ-y:3 }ԍ,3`wnՖQ. ŵfժuo-Aeɴ5f57gpfmƈ?Do{^鲆Z-IK9k5Sڐ}ڴ,!4g5ndx#SZݻocZ?B!g?/pe\"Kmݝ.-4?M S{ ]Z'ictt]\Omo֭oO<{oMG/脭XcҗYݞ]Ժ\MΧ;s׮?Eг $Wo7م , s<.T,| Ar6gŵѓ5t#EB^gwWK$O*oS5_\/nΧe0n@s21c>\qZwщKX\ևs7X'~9*wlnDǽu?k_w+HZ}mKq)6W9S1tfiSOs<61ҝF(gZ%*4f/V `ּoPUNSvSf{x\)\NG8~(8γn*zD/L#c,軕ocJ o/}v&K 鳫y:ԼU{ -OT}Q˃gy!3LZ3o@XCU^x\ճ+m)*q%#s`O@}rw93&]ōM%_Ƣ8J×rK4܆(Y'dYpVv-)x=cQdRO;."P+ ߵW³*&trw]`=|}Q-ۢh(X̡ E#) b2GTdK!Jeކ+y5XL2rY;o3[oeؘH!PnY2 h2[Cߋm\aq,v:)G~pY/wDpƩT\5DPYS-ktYp-WDŽnt:#ᱎ0eʠf@ fhi e g^:41W I]oi]JzW$ԘMfoDPF # haal#KJ¨EF³ 2AK KPʅA..!maCr )EF #°U~!EJ4ݤDXAXW #S&in)Zuhaa53zFa_G֥ ]sƒC-jF"$ j..R`է1<}[]jII 1lQ+Z PKb:R`ql?IKc45TUOpY41IHRC)l$)HR0(z:F: l!REu<]APCCm a00J<ꧏy!lC)!A¨=C2O[m13aI XP3*^a@`Uo(h8,_n(XxXxD5ʞiifPm#0ѳ3mLQii jc r`~vOLJKS3XvTXs!X] s(,;ʯ6$Z kyct,'Ƣ]rKS[`~v _&XĔ4f@YC֣UFVA-+Hc%rְVAQlZ)bXcXB݄4 ḮܘZW6S6ɤ2}\IfFk9TFlhi-;3kZXƭ@hǍ*Hkam58G3kZXi[ kpBm-a -XְAe *5heְT=kXzI/NI?%|152re RZ ,5zְ5kp P; `(%2;:)KTNrdL,oP:PX98 5C kؽ =9aL `.4HE#lb첿8;"u4u eC]D!MRJcen7[T[0v–0%FEM8N-#[H6ncn ha, J}g2%[FF ґFF& ݲ° 2e'\a.~1?!Uд (υ VS YI~(gy&jcPFpo;rPƦTv8 Uey*ٌtgߑu?aȞsNb-CZTdIDU[Pbk9껞x\slXDz 8Kb=Vxog __d:"s%'KaN%IP+FB {+rKQ xXS YW\~!S ĕbak!Fe}JR9mŲq +@XA8nvf$ Emru~2ϱwP̖\˕.]*ug7|UuB!Z/ym|xUsUK?_y=QUQN.9|pfd_ᦝM̳e/ɳ5 !&ӑC^䄼-"O_y#+S p% n<-DE38G(d9ggE^)5p]*Z3oq@c:jpm(;5Y%'sęo,cE9T )z4Wk"E/з_mH YëocϪȟ 'ֺJ;"(WiT;v&$ ٻO zٹ̸Z܃|&1|O|~qviHyslx&>@8 }+2q} R Q{TxTMd Qn^gL41"QdS,bQo &#ŷy.[v@]HJCE@$A2M"cI$UtZj0R*IiAs)8-H"qZbHjr='_/ד^.|Iy1O5ɞ'gx"zGL[䕞:zNgYʂ$I$͠|lٞAod i[ݙ1S|ܯ#(ɞ_W \ p/K 2ӇTjY5oɠ\%߯1$g;j %s/k1,f7<:3'P_;U#gWzf C}ϔLO7IJ5~̋nyCUɕ*qZW}ѭO6IEb/yѭO>k~.K&(6Jߩ6ZN=;dFl8@/=Ι*.4⮣Nr9()c+{oHUsr-p/rU71Wgٶں6nP;_\/nΧҚ/簰$*1zU{bEczy|'iuqԥmFcrQ<zxqG1^O\ !0V-4=xǠ2{o棉7ܟ31~A1 )% 2UV3J%I(2ĄAn;Y.IhչP?(0o7g u8 Qr͈gh6>Z@Eͮ9; '1g4@1~F%!b5ٛǣA7-7ߥ-LHV\e5n&#{_ʩx't?6C;YJNǞٸ􌁾觙n)`#hQw\c\u\b`$k䙳 JihD KVڒTvSGoeBH}Uin Hm׻7 vr_ڒ' `iԉ(#0Wʘ[(Te@L/ "*o}Vݾl;RJ76~YcnѩZBSG}2TI-ZH- #D/ƌ/ fU/HHDnVV\' `UkdhīJbur:Cނ Ji>LU j2/%AT5PS%R퉼ieZmޜN hĭ^Mp 7 yW;:N:N]':]ۧc9w =a>'LH0%U.[~wEpE=_zIֵ|.+!,vk,0_'^?=˽"0Ut(-yoshimi-2.3.5.1/banks/Cormi_Sound/0104-Ice Rhodes2.xiz000066400000000000000000000053671506652756400220200ustar00rootroot00000000000000\sH_GU-:|omE5Hh' ޿z3n D윝%/IDOO7=zUyt˪yxoe~6Jٝ_~pYWO L=̫ܲ.ݵ{V 0 DHθ{بp2F1osewu>{܆ >;aRw j'o{딸w70o{`6%S \k£Bݴ W72Y L `v[U1+1rQ獳{5M慻ʕ9O鋛99`dV)9J:ӔP7׾ r+jKNݸmPN_g͢vf+H xRf[1フg5H*X<+ﻁ]737V-I 0`r/dA͵厬v50`I $ԣ-7z6AJ@e_0,[]B\fYKpx͋J'h]-RNFK}ϵDpȅCo7&8E8>.7_)Ћp\ $|LщXmahir=NkСXKÞi "Sa?Y_iͲ;Ը:}|9_40ȁwڌXJM8-'iD|xV|"ڭF~T Q!xhV_ZnnxúѬw*ƹQ <=,UryອHʎgʍ} -8Ǽ1OEa|/}+mQ2߬q/@3c`RltFjʄjihAHt!UՄ>- b )NCwzX&u$Nwqo'Gf}2'ys2m=7 C-2]kp*e:Sqz#K/yHc֎Υw!2 yRy%I(k:8w`K$TEZLo4^ s2v89C)S`QR>'* eJB=T2 Lk%yaORhΗyYd^d˯`hd8X`i0]2>,Hb`pRa-7*5kzȻ.NY$NY$7i| D$߳d՞Jw)$_ ./rg!sx.6{ܑmoN_hLXvubsaQl\@I:NZRLk&[}:BIȤ(7G}޻;v Q]e!漖r]uZjhFf3Sy-5tNj}Y U*_vFw-I>APK}bGd*y9'ebCvD0Lct_.i W'/gv/;t_wm1m9M kdDJ{ڏ H<>cP*O&ja%uo6d4"o5K|ȆEqoDQDypx):%0E(}EQ<{[(-Bp1{fv5p&/Ff>oo nU2iiI毪r@uܝ[R7P uY$ DwϜT76> ?}p$"rp V8T .ptEf:]=ESC xTer ` 8-o`-뚿P}!MK2-I t*p+pt dÇP 4;968ږΦwܵ]SRA{שiԴ %s/5(Szy7ϻZj_QsGS'Ƒ/` o3v}4oQnRo,/ BH֥0HܜTR,Ǻv˱.rKaNTuX:ػA汜Jbדw[>nUq;pП}P~ٗiMu x 5a/=|#´/|1.ӥA}2B4`/qr29.8~B_jʎKWY}gKtAkԪb6h](#" j1R{CR&BZ)&|EVyoshimi-2.3.5.1/banks/Cormi_Sound/0105-Voluttuoso.xiz000066400000000000000000000117261506652756400222310ustar00rootroot00000000000000][s6}ϯ}bWe&*Xr 1g_ N8}8ǯCJ8z|8<Y<z?~\O?]xd}so՟-?C%/J:?d\R!K8S܅]^h Iu==< _,~~yHO/Ř{ Iw: c_H/<{ˁ 6}v`2.Wtx5~;-yO)U:tNJ S/Le+/t^<&T no(M?!G+޳ovp&+x>Udzu}>Oqk}xNu?mZnjǫ4HB[Yl׉T\>(F Ymuoͨ!z?0Ŋ/y bU$Tւ9Fm4/vMaCl "f!mQgNޢujޚ9+x,f-ۭ. ~ɰjhUaի2fעj1wdWɧ'\ݼ Ȋe{-Y3d9pM<k \g};bn#+b<:..NGgC7~xxSF收B*|ܣ\/~xW7D|xc(W|hhuF 8ԱtMsUda_K[NS‡Ei8 ;q[Бљ;p-ϻ@v̈́*בMʋ ʔ[7hb9 -uxZ=ZlD7rùXvZW-zο'g^.6qrb1OIY)es_B#J*ҾU~ڟNRZVK+&lEd$k2mHVb-ɨpU$[^I)u+.4+{´+R ra]Nƺ Sw$@acZXT em|s48euo̷]|GLQ"`|1 -Yzߔ|gזsks1s*UZXޯ 0ws:D0X. #?Cq h)dcZȈc~ @ρ Ɓ7t Im.0r/s4܂Br>7D_f>cf&e023ۤǒeO[!UDyflmv*"_*rH1sm:nwd+H[1$ 3eda<(\bvcN@K+a$7a=d8M'%a ýrKEtbnj>;f0va휄L1>@tɼ>QL3 F&3@X>:Lr죠+}"d7%B{mnG; 2n"i6gY׾g-hMitwsi?;nsM ď0Yk(=Gğs4vҨݜ+F܉ =EC&;nw( gP̹Oq=@wRHuPğ7kdC&:kQ؟ȴ>9h *m!k#Ư7슡?oQ%0m`ZEJп1e(Fi6<@~ΙJ802. ௢\@~e5*m&{$]<'*YO%R<;(P` t4*:@=@ݡԾ= 1{l܁lJ2M Ϗ;;(G$he \v4]3u@R%w澍|m`mja_o`xtQ|栄ݿaV e TJ7N>7]Ck,RQڀ?Y]1{9_"r=0]7 ,`(o@eZ7`wXc@yn}.Y X¼\6_17`.On_cw 9* d1Xݽ.P$7 K.pEy~{tQހR(odqQ!˭8:x߻(s@>EU9`s.z4i!+ns컋2eC6s)P e=0kZ$TQ怽akPc(s]9`g ft9` XO.߿g_hz}bp{ }0 w幌}>H=-!/I%T1R3P#"iS<xc%X_E; VDQ#\Չ ;$/e)đ6Jɱ4ZG"ʕ]\#Hԁԙd,} 衪u]Ih\Mm'n TɣSdRso,YC[/( )D-OfKy$MŢ{lR8 &3zzCB9r'ϭ8Q* ui⓺zdeF"D67)$~.h4w{>gYoqH!9ݯng݊0_^>iȷ+`t+UIpT$m> ~>}~L*MTHsxNXVq{8itj4@J,KuJ^g=1+jbjg3ADj䏖K^:v$Xftj&&ZD_/~2{̘ttQIg#NBE JaT(붠Aۥ5IW*Z)S*waF*7VmlЦVOdc}͒T,oUz#\PF ^ iXl **T3j`Rǚ@%np5@%Z!m6A}6q:R r]C5eGzФ8vIoay.$qW&Sh]&ԙvf$e53'?̺GOzf$_5'mfa?0MD6aXm 6YRȔ~T/:(mDm,zRYzcf<ƓLv XI. d`I !䘨{bC4MMz@,p׌iIozԀHơJYE I:oB$XǚbK:/z(f@,MMT=I3#&y$n&9u;㜛㚁3Fmu8X!ʒ‚>Kz q$W ,"IMG[L0Sш$Jq3]} $TJ"}K}ݚE#KzTȒ 9On$!K: YzKbR]oHƞJ ,ZWuQ3lHR]J" %Gա$íF݂8fÚeKKE@l^CmbĒ Qy$p$$ 4P$I|':fhOXEehh<al Hbbzvy&su#"1?h|\Zk*_m'ک\UEvjvr*0n\4k* ^1Qux\) U<B3bCфrzxP4!6zRE!z&;"?O說5>.F`32|ʰ̀ Qe !!*W;lNx9/ pIST =ADBQ",5P:E j0>8~fΞ믂uAs )f|6nT=,w.H)Q5ڴxpP3H!ě|ORe2F|Hr ?h:<3<ɗ9R7 3zb9OysMl 4sh:A/t~~# 4]_m,Kdw,vxz:hY5 үBXh0O7'yoshimi-2.3.5.1/banks/Cormi_Sound/0106-Entropia.xiz000066400000000000000000000070331506652756400216040ustar00rootroot00000000000000][w6~ϯ=IңNcJl6%) xIه6U 0~nwNirl8_aO>d~||7^._ّ v~k&/;n3;\ڍ2\kMW?uhFc{GFJG~IF4t~q6g;; 4<{|lON/%Yf>8aԗן+PsnɌ}_Nb|6\\&3.=ٺ+Oش77"nlCsza췎,|qkg)  򡁜;:z{Jwt)l2b qfCWiEs/UDښ`7 rBDtZ'7tNk= JݍX@I?>;kW|dõ-zx"wʌ>66S6ًnKiE7q{nЇp*G97@`ą"/&^E@J+A˯Ж8 ^]=5|>looAxY_xwwfd}s@K7z 0HY*}I꫍?v-o ,"W~NgR\1xP' c;l}]d>( MwL0vLfN'xSZ*2!&I].&0'L`Hl;2j:S7 tᘬ!ց}ˈstm[#G]pn@vRpk7,I 8xrhK@hJrW\@D731w^WPEc71J5/hԶ,-SXRH: o$"̒ YD:žC$B7tpi?sW>NM|ϵmс$_"gҽbdvt^9ih[v:Dz|`$4#\WP 8OSU_+ ް*Nawc-M;]Bї? ^[WPՎV*7e],k;EtNNqIqTεSѫr&H_Ub՜W%xOIO1[Ҏ?*:Mgu|>֩;~]t^MFp J!Q`/UJtסïF#ڬ}F'6F=/F 'Fm'2 e.OL$LJk(Zm"IȘOċ|6k\H2-͟񤺟GsC$"C6 #l^F6*K=)zF~.;KJ\Fz[`! yOb[qz=xh%=#K;4m!Y܍"M*{g4_ Xq7zCOM nt6yMShAWy ~dJ30$2q˴o*t X}\Fh7VkkAw2R{2_2C[[r J>"%c],P)p8DQ1&)Q4%Xu,3#ߝ_H@XsE <{^ٻ)IqӒd!FQwMc-=ӵt Ql> bQ,C^94i"b|Ü(H@gx7V仗7WV{|}w$9枊d+= co3D.m*X?yXJ7KܐRN(4[E5+  J43ɽ`"~uFDR 鑜P<kEn9tPթ>xE #ꙫ8;/wu Њ>PK<K XȒ?.3fò6s?}^I^mI7kрiUA[s>Dw6x, (!/q*][Q@~m+!o#ި%zjK#iȭՁ4Mv.IH:+K#u  R m\/{r]RV0d-Q*1S^^]ln5U/"hp& D[F唃3+ FH& (-#BWst ^Rgq=<¯Rx6?c e8Wi|6Leٱl-da ӥPcӵ# Yڵ# $YIvﭢ>\V@;ZǢH'Z1d#h5vk DT|@P ʵuܣkEዐ5$C>'T^*ȋ'ˏN/ɮF5bғ \#/$P\{iŎΈFOF/1= (œ!`x0JqL=JGG/`/R} d~F={;Mc؁ػܛ!vίJA(tȜdm$ OҪ/0ZL Qz;T$ˈu [J9պ[Jպ7\ĪTOG%:PUⷺ#%||?㎴qKB.DѸN( ɏ8)4{򎇦 OQDgEGI74ϗJ٢yמϦSKSvi v<Ol4̩<B.'ciTvvF-_zEȾ$gx[}E$X/I9.-RaXTSA.Gӄê$hk%mWI~<ё(Bi m?QQQ9DımbTGo-{xRVNɚ*}4q ZUg7b?;J39{yoshimi-2.3.5.1/banks/Cormi_Sound/0108-Arcano.xiz000066400000000000000000000032661506652756400212340ustar00rootroot00000000000000ZMs6W2eYgdh}L4dWۺ DB6PIʱ $@IXi%1X,޾],s%Z5I^;ϧNP!}vÓ W?o{A-`Y 8 pw%i$_Y|Rv>Jx> N|ܸSbڸÛ%OaH!oĔ$iWz4ڱXwFEa"XJa/)) S%hMb$7j6%DKk{m[Q? >g6yyY Džd6ޏn `w|bSvUɑ|=$ }&(Խ5)?|* W62ldGBٔm~ }` b$YbM lT A`kW%ŋKEzXn6=/MjG od[W_Mmu`K Pʴ$X})kBlh4{?%>HR%@#FCEgLq֔<7NF=N9ߥ-TXd^tdJUxzOeAxxgqAƳs K˸JTn6;}K׺=w).!フ}8 +&P,VPOʶ*7%ocJ1u b7!= 'F#*0z&+W%襛GVg0mn`22& DŽ>C^d gL gBiLR_L8[K$@du7u*7UVzeSs)8}i:O}]лlzS] q3.6=T}C7*J;x_ u6VKp:~0=Pϼeh0#" q+Y2!)z{G$Pٖ AI'5c3ǽҐ[eUdWm4寝ClC2I*^hLzBh厝skoˑPA} i!c @1NtmѪ1r!mvɐ^ CڪGb<VfW;]뛩_~NϛR.Y?Sv /a#̉q65jZ+nw2-GnG0-nG0-mG0}~d\.^yrw$/㙆o7ޣ{|t3=bJT-`8|jr?=( VMt>Q̢;|>L[Uzi*\tتWr~/%ɇO 1x/'Ϧ-bt1{>.kẍ3 h>[~C^T[Wn+X"#yoshimi-2.3.5.1/banks/Cormi_Sound/0109-Arcano2.xiz000066400000000000000000000114171506652756400213140ustar00rootroot00000000000000][s۶~{*4(<4slCKTV"uD*ςW\wIn4}i`XcpH8zqu΂hλIW🋛z}wO}7;v_ˆ2| |'+fC?:{C _f[! BYYn%o߁./onf5m8ޞE.xٙ]\$Q` =G1H:g]ݻ-Jد׳vv;/wyE'wgoC~JgE/QIaiK}p(I]pbcB^+ }Pu:qb3Qtnyj~, h.Mv\(ZUxXg! Txب&EWqT/U&j#ü*6RV-TK(jcWa'|Q7g!&_~LRAuՃ \ ҐRY>W}֨ư+Q],>;5׿ܼ+ls:C}LE S>I` aLxLm*X{`IQv chiJ3o]o`XRX;gʄ^bUn=<_ 8܌uIXi:zb&/oldW7~U E=d0sK@F+[=}?L|IT-8S*4D`zLa6&M^Yn6Lݰ\5l``rc-@u #^3(X+# r)f|y;{%cT+3U*II%y]|A݋{ge]}r5l:5U&A&D%?iV Z9 y;]kHFtXWs)^8Y$(H6h (YY 8U amQ}{^ Ҍ?[ :YB6 {>,d# ٱBvj! X$a 30dۍYVq&3 c"1pHa ^0/R)!}nF)!Ak0a0Sߢe(MVlFMG6(faaCRAؘvAظt lXD=†d ea젗]v1A`qM ,\1<FM@м$ɖ1F0jI0F c:t)0RF}'6 l!Ҟaޞ Q 0ZA- [])Kn# b:\FSLQA@7+aaP1.̂FeN&N)M8&ؚ#pk"8&c&vZI9vsPQn"Q((%j 4l1  #;Q(hqu8:ZE-n:,6X@((ā6+ 4v;P׷C]uXaA&vMZC\.-.hy; vXgc@(.,n$Jܔ99@3Cr1㘆##z`(iLҘv{5dGg @ دF U xd>7Ei],Q>t7.2 A4F@[il }4b5]aX#s;m#AVX ڶP=jVXB kXn`,F 74h!s`ۿ=9h an-5Z)Q4s+a!=s k /L(S p"]!ǔ.%mE,سЃ fsB]4@W1-9hiFKD],#4thi J\ABI˟؟W,yN  1 ᵹ֔d CQz%{U˲ڌaT)??MkJR%G* UE| ɞi02*>'-V[# |Я%w.އtn*BeHzq kG}͎,URPORf @דh^8ܝ/Hs?laxk6[A+YJFzB L!_T6&xsvr`rpSEl-ubIbIK|V:O\"-E9+!iwb0_t8'(6t%fUl %T-``^5A&<$뗿i0)j ZלB FX:w lCO۫9/qyQ\2U.ᖕKP9GX-+L7reҁ[C0fiĥ#o%B~KkT@-7eGI/ <9>Ĉ^'K6r࿢3_OނKW "|*-LK (0OaR_gdŹ{ m8qWT& }.X7zS\ P G{WsCC3NHgrU_Obb^\{3[\$I X6p$:i %Y7xW\q:^FNq:9աKaa7ߜ_)հNK-dmY9ⷶ8ⷆFReo-O1Se-;._t+*9aVE~32Êu /B Ġێ kW؏>-ۮ|f R_*eDR!(^KvxN/J0S/deq 9|k3o-Qi5jo1F(>.,P C˺2|RYSlմ7]eSa.M`;CU^C4770kgFQIHd— ۄ!NK\ѣ"la^ bG/_4S3Ed2NJdĠL=|LȐF Ru !Yq{riʨMK֤t}aV)}jp%+rbKV^q:]￾OlԩɁVK:CB..=6$mL!&d D ^:ϝ)y GSN`՚DbO*"Ōl-it 㭒RI"BKL- f'=UKs6stcJxd/|Ժs-jR? IfOl++sq}}w5^z?/b9WD#_][yPUʻڮVvUʶǶ]խ.h2 UW稻UԢhWϸ"s dWQ//K+X?e.7G9p۹N\y5]L/uuOyOJ9)XNz(w}ΐkOr%NL$bUZ*MJ>?:JY''a)_ՁQ!>B,~a=3 Q0W"̋ΝsH`3|JUkdKCGϸ >*S~S\E~ܳ>ol;_b ,Iyoshimi-2.3.5.1/banks/Cormi_Sound/0110-Arcano3.xiz000066400000000000000000000027021506652756400213020ustar00rootroot00000000000000YS6~HN!@2ܘeJMBE 谥R8ҿkǶdKNz D_Z}J\|y+Iq=rZ t !\x-qG-crx77b3Z B8Z*Nm O-k"6jXG32ciH,I鞕n5*$hID*& UM(!X@ѱ~@!mc0Ol8 7Y~4Hso_os+/ 0'wu ԜMDAYUɩ%)ZkA#k\8C )9g_*y*sgĜ UgLmhK_n<=re>˄DY8څźq7xAͶݣz>h<7kY7Ƥtm.g[99om0tIoJpvlshܹ -b 6,r4Ϫ$ # x(W5N%t^^*=7"!Օ#^a4%"RBލn Ʉ@۹2rAPG4NE$EU3 .!7Hvҟzzt$[&^лl4݆@PqZ1rb|,ֶjeLq ^[B(G=Oj4z_,-%b ]gDq"I1RAb >=ZvmNg{l7 T9j?<1زAp!x@B;>Pnv.[mj ѭ'[F  xU*kk[Y1NYz]m5 C~Mm)'R?ۖ Fȳ,ڠp\iB7'&h箍<+UƳ};wi9&=?C2M s汓 u*?Dߪ|liR@& 1oz.𔡿adOˆzP(dtq)܃Nӧx)cqCesKHo<9{Gw"=jVf~h}y6+C2Ҷ%mw}|zz9zm/W6(Vi/ǿA4vژo"P@cw޹ʅL~QcL]0=j6r!1c%C|qo@}=iыv$ S7lN󑅩jgsisa[+kLlWwlgFHI'bX@/xl@]W@wJi e0A¥-%2F!k_;*~ g;m+@B2tLRས!#J ND`elQm~֎dsp!qإz{8I ,3?\N5ql'|US,J_ w ~bdb[wgMeBjA[&N-8Z0] ijQ ҧ!@5"KHLZRE"ߊTдPTauP 7MmzI>N8!Y\NSPy'"꺍 Hɦ_"H 1***簃Š0)rlYy67*O1my^QJ\WUNF`+$JS{[͛zC:8[9/|fY}(焪%|9'Y(%&K@ ՘(SSVFy.;hMWOJ̄&Ө<墻\EѪi#TH!YBFrc߅B&.S꒳BFs2! _t\DGN OӔ3AP4{: ȑ78,ڈ s!rEފfZwM=B"xCDH2!:b7QQ*V'g6&sL|r!@&mNlbLbMD:H ǔ:6)BghX;6)KqR}uyFJk|ӌ--.ǻL O\ם~OXFc`.+Ѩc c:CԒy~331"+375Ey <$EO/Bg)!a3~psߋZ ٨n}أ |)ΤʱdahOU[ 8trUdhi͏0SnېEdljnfQ n#7> /*IN65+uV+ Z7 o{ԩЊgIkBwf^zV/F--*Ӭ^f~0*t'["*gZRƙFUwp-\E)^mlZTJ <7FHӟǺ%j.gsURCn\V PhH9U }l*|;a_#&1?@Ġo7JCm=i Mhъ{صґvڊLS%M~L5B$ç 5MaSj N QRva?M9c0d9\=ys\scDžy~nK.'&ʲ-_YQ-Zs'˪'ZoH౑(y܃'?YoS_W\@u~tT7,P=8V۾!u^"VCw^Lm\0Ki\0$wR<֚L_J3(\W3cF.eed ({+Y)C@OC?l8/yoshimi-2.3.5.1/banks/Cormi_Sound/0113-Glass_02a.xiz000066400000000000000000000052201506652756400215300ustar00rootroot00000000000000[s8= 6l1nM r/*M9d믅eKrK%7ۼiZRZƯinTѓj%#3_Ut4Nh2߶4"0+ݸWu$k]$aRij7Rts*l@z`>ɹL6d\J+~%&&[7"^'n]wrMTw \DSI)lsy ohx/#_| Zy2EW s9yf%8>YJx6'ny774쾑w ru]"7RSmeQg>((Uf>oBDa9,y~nnFkȅD{*9]mi@ 3E4p dW.qCL,r iLj^B 2i؞U(-ܒ<=d*wQImhr̊Q4Vm:?",ɆH-/93aH.kk܋Z`?ʱ{!w ,hmV7 td'U͗<Gh=>>I-46"uKH1ZR#AZyj:ɭCj53 [i@-NK Op|Wt^#9glcRv'ݹ$c^Њ π#B6;?Q  O0RPmUg(iԘCr'y`!񢰢}H]vIf %jk\^J1G7J?+j,.r"SUajC2wň4=وEKq"m/JY&JY&wnz2>}nN19p@…,%Eq #3Hk/K%rfKBaהmŻ04WZSv(*1YyTyb:tx&8ʠ=Ŵ$9sG%fn P\r m(R]k:&((>Ȼm5w "qr+j->l2ԝcD3D{PjǶ5(jjZN%ܬms*) !g {%?(q8ftnY6"NgO2t_ڿ'ze#HZt2v5[>".`ˇ}7t%ZV$m1g#[8?v 5MŒvع5&؎÷w|QdW] eEǷzWPⓦ{L};` %nOt6(q2J%8y|q2F"ˁ«j˦T Vurch[M#ʣ 0RV2m_On?{7@yR{ń} pMOz:oRqtx߹BR&e.-V\5Ux~#?wAq#"G@#q-3:+g`=c8gs#30u]Y}p쵼h 2wqh֟`Q`8<ӏZo.O4tQo <[l)=DF)ZKHJY1H_Ќvx`r>yoshimi-2.3.5.1/banks/Cormi_Sound/0114-Glass_02b.xiz000066400000000000000000000052141506652756400215350ustar00rootroot00000000000000[w߿{ 6s64ms_t 6]cSdweKH'e9yٍ3W{r C^su`U~9㿮gݨ`ۋd5¶b VYUݬ/OAVol[Oīxs/2ŵq/錭::gr2o{+$ jsŏ$$Aċ 'RR Ts,bDh9/ə;\%)ɘF'W č]DNH\?d]âgqmT4LDR[nS2ުtߎKvm ={VHZ$K Am:u1?e_Jm\O#AAG~rwͧ;V-%[Am,V64#!W&]9^q,ΉֹKbUf0_hav9M@ lJ͖F N,˟tyD(XVvl[+&;HJXQߙ9Ol:R_:|?P㭾<"s)OEަB *2??]\Ϧ"ﶞwx#K=yw 7[VQ%r#߽oo#s*AFU  R3,q#:XGB14mSAjSQ>|xL+_W׎šC&>d90e&k7~!y"Lohn&tun`.MQMD^D EQ:ZX9g%n&׎M@!+Gˑ=w ! `STIYNlhlct\K3 Ƶ ?Ep0h\_9n@E" أ)}4#FK9㼚 Z _e<r?PV#i Gmr"H* @+Y̼b@HDNL,ۍĉugE+Rl52j;$ڇX -(RPpTAM=7x/u4Y\W8eBiDNĊZ'QH$e 69>Q Ru5X)'\[% 1KFQXm$r j @L!qhw \[G^<KQE( CM 1Eh„fv{ύjd$S8Bo;HػqA*^!BnYrO.9BhU#4IfWk!bM jQ-נW,|^y 'g)E= < w$KsI ܗ$;GBv\0w] _vYq|;(62B34rV!<|xQXQvUXZRwd7 1^+(W=th -d72*P4]xBil|.ޥ܂QG #mc$aFU m #xK&OPE*~+CG%X~K[y@(8.63-ft u8=ń7ə./Rx yLS2*k 漸5M Ԉr?0A ,u'OADA t 6͡ў羊mB Ǿ56 EP[*6$зMt3k i{GvŮ %sf @J]Qf7A(- =qz;Gܵ>(9\*K҉jMIr추J6fP`klt, 4h+)iP0&8Na641mHs|t6YBŝc[$up}.ZjC0Jzya7)OkRI7(rtf/J{UJF^ReH_ꎐXq\>ہyGWJaE]8a|?c_cIm;cIQ*n5mAG뙷|m%)\ge.[mgT{R-S:W߶O_kKA($/G n5/B/:&^Furklm#ʓ z7RT2e>^nɯS k*q=衄A1B)ySƽd\.>tn€>Ioy+´hwV y' F|xsxW0YDZq53:+g`c8gs+31u]Y}_dNy9ZgG?8Qg4I/ɂv4K|DpGR-]·U' 0džG^H"yoshimi-2.3.5.1/banks/Cormi_Sound/0115-Glass_03.xiz000066400000000000000000000031051506652756400213720ustar00rootroot00000000000000YS6~"; a^$$tJ_4l)ʖlɒrsi@!vWĝfW!4`aD|~^֋G!1|\WΉSDw^|ywDv:v=9J#)RaӑBjxFGtGw)Z0w(Nȕd?uFB1װJ³ ɬ6]}[7tV{L+J0B/Ir~r$Њ(YB!Z[ղMJ,$P|l.(2﷈=6ye_X؊ ]3Tl>}ndw\,CǧM2לq3`iNM8` k\+v~$Ωi=QD :'KNXX{Z)˲%Vd[;<эJA}#h4ǝ(r9x"/bI8,NEehQlW'T QXU鉚l i^U@Lq2{ Ipfqg&FJr )Yɛ&'wq'nx>ժf,S/V5bY m:7nLV34%PAD b J Sb5ɐ6Жb.L}#zR4nf 7"ۻ{$eJfjG#ή2F!2:nSkS-YABWV$Ez dvzADnv7%WCw289&\ܲѳy|K}g7*4.ѽ,\Gcךʪv odhв-+$ _[R@/D8 \:F'Ŗˌ- I  A I#Č7،RNNi@^A eېmVٰg]H 4jc LVpt \mmJ] pNXZwVj` }ky 5z6:ؔ͑qť)kDa?gVZb4*'JK*K].?pyO2Nu4`\[Qe ^ߚZy>]XygFtNB@)9)mTĮZg0Y#u1v=IB5L7SR HpHxn3?Ùv&WMtHt&?9WQx\ZƠک4cɔiOdrRLPl63MꝊftmӓ$h9` ^`U-Iii̫@GR{(zm_ ][E F)W݋ gb=*+A\dHX<僂ÒmdӄTGm`9-Ї׀O67mWz?ٹX;N?X+[%Y7LrO?t&yoshimi-2.3.5.1/banks/Cormi_Sound/0116-Glass_04.xiz000066400000000000000000000027261506652756400214040ustar00rootroot00000000000000Ys6~=%N831 $iH|%j\_!ɒ!%AV߷R>}~M Iyz XK~><9>|v0[obI3 ՗Js' K̑++烪ٓX`m^·Ɵ$:)SJx\ϜV)$wVpt4N|t;O+cq\:5 9 ca26g_,­w.mݭ/Gws:.|L+J0B^nV|2e$hERQPN5᠄rIem 0 C&0 x h2Od^~E`Db9:|j_֥r9W( XkҌI8`+w l"'95QliASGdҺHrBׂW!%VdNtq+ /SŋXaREK>L֙%#ɦ <E=C))iDS6h(&h0m=| ?*0ӄ(@ ~D挐)Q3*7NFQpʿV|f,S/. mn,5 ꦻEAj}lۂoۉZePZ\3]d?>m3[7rG.fp J.v@avd({MW,w7"6%0dlTG/,]I 0E+&cIZAN1 YM7%rQ=Ub]ڀ }SJ YeՕ"c2bKZ ^?8vtne=4\m[ajpqOFX ޲BDB8B*8`Q_rIAАdk*s#SNPM;UJ0RĻW x=}u --t5I-ڜ,/ (z5<I% |cW6U u{eyj \)wbqju'yd iH0B1("#i$:+Om~:Z3_.󺵐oFԵ^G%pg5vYe(ZK*r- pyYoY?_'Z_?]ޅ3ı[^z>g=nTHYAj}0cHyQ$UL#.G0}SV9{{<[ 0OdOzC0+J];eYRmE.eԼwY?NlrwK3ʪdg?H_ؕyoshimi-2.3.5.1/banks/Cormi_Sound/0119-Arcadia_1.xiz000066400000000000000000000271341506652756400215770ustar00rootroot00000000000000ےXr)u/ C8pQT bI"U,uk~ $H$=;n;n  矹o<XW?=_zϟ-VO?j_dOU~~<?^\7s۽m}O+??n_.]nߗճǛymy|_TWjyVo}Y?>1|/w^/ͳv~6f+$m.>7Fw #r>jm./Ϫf񰜺r}+bpm~-/{#ɮ7u ҽOr<]rz>vBɯP 2{ylysOvɾZ_n;jg9^}軲jŏ^!Azql씝*wʆNrbI./FeO+fuϼ{ojy9hIlw+;}z~=t//HvUGnwyRן>c7\hxhnwR}_`W#x7_KKv+d}}̾ZlW|%.W]K^-fw9f8f+>\-65uElC`x'NXbф5/1qՄ^~)Ji>;tb2d"&'"ŝa;)vJ9{#[<|mlq1{˶sl{IQwdCmRt葬fY.pj|?o#G9qσu2#6h/Si#'8y0yw:vW}Y+/fK;Iз+;zȮIbsn{`frֿ X[Z~ݍnDMR]; ej o&>񑣜-0r򣄿L!GO{lxo?y:Ο(UFF⩒G%ϬlSEOΨXzŒSoї9<͓A!&h6nO<8EĤJhNjW)ّi&Լ\PK/qu?@;ı/(<'7 ۰ ׫穼EWč8s%NT'QV/6P\ڏ4ߥl&w3F^< <7HY9#oaGjk]˂4b/ʟ*뒇a}(L(Uqc +?֟^ ̼TtȋR~y[^]}PXޘY  *ogE,+֗&7\Ei{Xܰ ڨu:~y#}ʨ ,H ;.v퐸wbg$N0K#/P6KTY(ޱ;Pa;DN!-A4KT&A{,n6Uԥ͜aw = W (hpg4m+"OŲIВvsK4Cw 3܂btnŘ`Y>^? q_s,mzEGY^e$NE6_87SoPʃ}Pb򈸱8{>i8~(+hX#͕5hݛQq+JQ]b`$2/J*:lrГG-ĭ)afYkԋ/p0lb/i X"Bld.(.ϦȄ2ϊ0xi)]d(tIa K*BuUfJq4ѥFțgAVVyOqU]~N,dߩS4mg7_(-Gi0}.ݙy5yda>ѥ斫" Cs-kUaL RQK "Is$a %;x=` HATxTNcJ;R&5mkpt[NE ǥ+c",܋+4O]BVyƆΤ^cu6̋$@&&mr QD@X#k [ tBS kq/2>? J%ZKm*rRX "Rɳp7U-,6R^7n9>& 6XQJ)IFaIx==A ^`#OX4+Nq%_IӀEy2ڈ%7wJ(u141:d!%/:c\d DVX9U?Jd߀_)-`hmVN+ӆ+li5I.huIظc gY@M m.oסxqJiFI u'u* DA=\EStm7Dl>z,ہS.(SeՍ rqҌAݸA{TpuM\apy0J$X}QG=p,<&q-/TM!vxpyKXu7".'_2b edHAژrJ!)+ _BӮK]OXԶ )4je%чvWl LPUY&ej 3 |!k䢆j(/P5 I LOVβy4J\imx+$n $` W虍wt.t鰬r[]wJh;i˞qެv$]`"|]g'|*ݮ+od # vn?VD]h U wY ĖnGG\,CkT^1ү{ɵnO'YxREKf&` U[f*z`%BT]B-G 9hVr jp:G  ?HEjpl\]S r@$D&I u@1eVQij " /Jc|!NYZA'Ibj:#u6$늷#!jtb$ kkFp(whܸ\18ᥟ#j|h0D"3rHjA%ra^5&3A#VT*m;E OT!,pI*5F q*PGyP^as$I^L*kЉ6;/G²(*V+1fYeY] PcqHC*YmO\$gR6x꣠s%ekzе@Zo$R-]^o˧YqPr=:9z%uւAhȥl#@wA}M%u,2c!c^/ AZe t.>]j;eAR M.K2JN]Z<@ff4Qs|Ϊxf\O&SlA[Bd \u-.*)bc/s.1Nzj7Q$cakM)P1x:%81u"H"ע-m?2 IX}ԣ{m(B8<c 2&Ɗa5[YtH:>j‚~%fU*AXyM'&Q0!h`wLjY:T!]mU0)PUGL:Jr|T5FJ,1J ENSeaFRO(1{4ZT~qCB)E j~&#r1:J멭Ѳ x-~lC[p OwJy PDE/ rkQT@0k/ۻrhX9&m"K%)Dh#X+ +-*M|Cnf[ؚza:ظM2:uàa֦%U|q%1Q "Gav9y$6"cRi<;^ZA _J]gȲЭs E9`al܅fR"_ L#oKqu.$:Kuh@kj0}q a ³- swLӭEh +o0 T!H eĄR2KZQԡ"jȘҊ4;1Zɺ̛}3)C]-C{L14 })0Am`}2z+Pb؅3Hi ! U~M1XYM`A|Rȱi<²ȽuݹgC@͉gZ[0Yu**lb >Kp\l=+EFJMt\R := Ga@PCBj}ӵK SAT&nmC^2)=ZX 2/ hFn,O!1sƌ~ٟP^ah&M ;c=drfX\(RmT*ea+ JJg0 2m YfafF*B}d[j4s&@͌4M߁ F1P[kL6[_($%Is!".%0,mU@IK Q7N ̩LV:ɲb*| ̠Ҁ%w#^N{Ĩ{laLB2]RAcJfGUg|$Li2, +) %N>'8v%~B)̳BZi=7i:ӓJ/o"#:;Lq0&MNS{TF,ku\Wq7bQ2$(-PE֍qj$uBs8]5PJ;0Wϸb _\ 1pʴ֪09B7s96YCk8.LG#$kSi:?(6m&=JsD*uXB~w˒0h<8+ ]ym6":Iu@ҡN-h*eO;a-NX&4'+Zp/m|)RRa.]~6UkQZmdhyM(xUjQGa ۆ+(KzͲ;+'dRe6x.GFؤFөt#+&uhG^ɝձb^RoB01>^pYb6ݗ#o&>-'R,LvRyxV Nj:|)|ҤO%%J"֒a" lDR0{&)3 ܥױJf, PE2:h:i3:]*$MRpY(OFD2~XSfOoߴ`GKJ[*Ko4t(U `U9έK(t " +84t#>(dSUTis[;FC9&DDf}QZƭ-2I!cS[O',1U3͓d]]4خinO£&D\^hp]pz^R2?&4%n؞`%BG`3J-$H]|xm!DAhSGG܆@2RK+.AQ:.M˰{A_$"ܳp4 )&9NMZ`(TוmܟAEBKEָdvw$:ՔKRCg;/ *J1wWer7 C%l~Ah%Ϧ$.lBXT@(qFƣ} m/1Ie'Av( Ho-+#6`Jq 1ǜc CVi6 ';=b'4VZJ׍sZJ ]iѱ[DhlCefg9q&g t8HNkGs#j9Uf p QhTƺ!]3/t1v"CO)ZnJI]{YmdINfVJ|1X#h ㋂(8'19SόfqnRMKڄ`.RtڼFzPYB&Q 9`f[v S?4`~4KڤODp<&dE $05%n$xT礙ZG]Md }ǹ ^x&Yofpl\'BWqufQ)qŲ,! }p 1au5E6K DG|]N抱fLL"[#( .Lz娓[Vm%(x!cTMAhVh!|ss+-#%}QP5FEfCx Ȃ Pwse%RCv dwcD&-KMOB.V ;ي SNT%yvi}8 sN >gwm@zINP>"V9й#p&h|˳|"RÏ.5mH\ϱpDMz-]8 4V &s)s*̖=!1VhUZs)iȾ}m2-Bu?ev!wmtsjⰤΉfε6yG9 s5 Gda ST&ɏSl8yȘXFà?F%b("37uhkC9Q[YQʮi8xj2NmVpyȹ\;r$azWUWvD>u9Skl2veK?4 *hu*G5U[s&|@"Iq3rΡ`:fr|F#zX5l$36K}Czc6BI5 ~6&Γ:Zl縕e,كM-R[X-4B;՟(Sum>=o%7.$S}elHߤ?%vhua,57P!iژGzV\2~I&ބ=׾isʋe(8DS \Mwl4pF–s v$6 ܒ$iQI}HFS;(x,>6E ջ7ˇ㻋jv:ey.~zXͿ,?>yWݽsw7Gw[ղ[A=L"V}_mwQj~,޾x7=a~{wxX !E]eX7+vW/70[3[϶#"OfPm>5>}}x{`~-WAj~Zѷ?,_Wo/3zQnZv7njE}8j\W{|.VâUob݅`o{9GO~ſ7o޽Wb1]_>ѨiGEᣎvb}͗y1 n$5| ^_.r`#?P6,W )sЛ"僞϶t=%;]]wa;ǿw sУ )??Pem$w/>=[^jxחyt[_7}%PaZ;lȑ裳JUMju}wN0@BRg8h<ճ63毟(z+XNȥ{/. ,?1W ~w~?,f'Wtm ևyJ0 7 qRN  C92v2NA5Aᇧ)TIYt eeZJ~8Xחw1H:{g]N+ο=XWWj\yoshimi-2.3.5.1/banks/Cormi_Sound/0120-Arcadia_2.xiz000066400000000000000000000102371506652756400215640ustar00rootroot00000000000000][s۶~ϯѻ+4騲4rlCKF"uHʉς7Kv.K._G^acy*\·˻7?b~rqc0[?n¿U*;޹ێey# |+b]m0wqQhZD'Gsw ]O:GE!bKb==_^\nN/o{7rnp{;mgvr?ɽs5G/u~ՔBm˙pW֯s9-nWYywg}~Jcy'Q٬P8~bgEIty*? x蚀Ja9Jx|_W]I~[y]uNϯo>-oİE+ws7j lwg~ axo* wl^^O(Ǘ.y{J][CR*FW{y5eVQW(k"WZ;,ΎNʾvQugNܝC"!t8r!qr$JSMbqV7){Z\jӛ'FnaSSeه|F;:܁^ ʺI }}Yll]$=K(ۆ+?yt`c(*'5ս;r/L,Y Uƒ5j_s$޻. M'ع^;|/_\. 5W~[^2Pynᇱ\4Sr9;Qi(R^: ߋxem7#zaϻOͮ e6_p%WuSՁZ3<*f 8 >~$}Є$yyχɟ^{!ibM (JIe]oAfexO]+C畮|#-oX'* ՞I㹢[5~t{b ՘260@$d%&~d ]ymi WdHY.ȋ+OT\> v 2!XC?HmZ|jք;8 `UCg0O^^H‰b?<-ud)?R[= p4ÍsD-Pjj5a?-͹.&>Q?QD"{Du#non릑%r4SSubOΚUͪnfU7uaYՅU]˷/Q #E/ܑ%KdWFlb~.` %RK4jE!g<}ee^{益㵛Ywlyoshimi-2.3.5.1/banks/Cormi_Sound/0121-Arcadia_3.xiz000066400000000000000000000076601506652756400215740ustar00rootroot00000000000000]r6}Wx>Hݫ2I)\Qŷ؞ݝ}ae3H-I9|6$,7ڝи4 zuey&[޷IE<~l}?0j7_/d>",B:5>$N'7:Q-Wa>OEM]O: MV4K89 W4u"O#v[4~v}EۄY𐦫$\G[%)m-hjK&im7o&M=D9'wfr;Oocs\_u rޠ"Z&ʂ8ɋl$_r" 2kcNѼվ>\,\~N`W9ͪ}\2FuI6qtk■7ۃeӓ4+~(0NP< SRj̢oI78ʪ} tH3_j׮h5M,]Đ|m$17 ~.JMGd[&<&Quq}w:0 f4:|<*m2Ki:Sw1%pޛZ(Li>+q#pץ.Lh5 A9 pCz %fնc&,攍EVhV2͢qQ hBM_y̶ZUIu8luI mV5ۤk:d/5#ѐ18||\"&H:eKBj%TS,+7u{R)%D ~MA @JĝVWeSР]6OT2޹:Zӭwsw޵D+'UX>*ŧ# =do|"*R+Nﮯ&W[NwtrD}΋Q/=ojN^lqR Q#y*Qzz},-H( _3)UETi&s2bX8R%һ'\Ϯ W<el[5*ښWBx3@pƎ +{gwf#NF{d#=1V&X C]3@XCb$09N72M NƜ %;G#9Og=2m0۔?p³6s $!' ǯy1N3ɉ! >=QHkqԨ[#aӀHnȭyƪX{9FwIάb"Kb,|Nzs;v촑 F?!- Ғ~H[W6c jn l!S75ť$=2woA1-9xHb6pL& !Mra$#KӒpk X$ݑ.6;0;u`ԂFQ ~f2S8m\p qH~[0Wy.Dq@EG8y0HƢkt¹'=1xQx+Ca v(_%ĝJ3s2\ݞ4m(<GUG(<'15(OQ-flg& +OneFYaBa Kɭ-.drc#3<gc%^+;6d֍RP&$n@8j5Pvey7P `r\Cy׍ ె=f[nk(!@Qw-t J aSx&YV*P^x(1@>fQfM{9>JV{ E c(A@q(r ܙGVJ&$ ˟[7kP}͑[oe = u-(,X<> 硌 xUr@InG ~g)Jf dpc:k&o1|x7|?8`ldF6(u0lX]{5t9LpRlGa=(udr>QeؼQ׾|xrxFXUF"Dكv lpB=`d> ]c|D&>|E1FuI{G6{ GVeU]խsm\ΈIqzͮIU{/"UOTM\\L_>M.f 2~U@H|ݪTW%gJfWn߸޶mMRLzvY99]Q#f輤5zvd$*k*s 572+=IC&fsJqSsTע"hB0F?kS EɣV˪ٵ+bq2mY1W.Μ+wJNN>i("A8^ރ(yWRJ69+nZE0vUr6-UKNpQeW=jʡd ESt-MC Ůuu_]c~EGLTWvDV ;W7` *9~}OlW5Z,0]WQwDCMX O%NbNkեV6Ea89a$ Ey;: 1yd,z+ŏZdKL)s^ή]4vv=RResm}G w-1 *'[̯Z^)yeYwZ^dłwZ&ߡk{eZiGx'1wnyoshimi-2.3.5.1/banks/Cormi_Sound/0122-Arcadia_4.xiz000066400000000000000000000034451506652756400215730ustar00rootroot00000000000000,`Z]s8}`yoL3e6f_4-Z[b--KI'tg|ttչWOaأaJ>4wf<~hޭo͏Wo1Yn*~ևg~чG0IFZ7I0dx =q 枲-qxc ̛([1vZyNS;O˛zw;J!ܓ ;1C%ٰTۑmf}\p;Znܵ\R>!2*[~`Bv(0!"f;01 y5:: !U xjoC nlZ/n: xkNiͫQACyoaDŽk^ȣ18b 0񉥼*{+lpPa:;%$!ZLL`^D"m}* {~ʂ|ti qE0svz ~jlRPbKYp.tUl|Y i5"Dم]ѧL;6t[ ;P>7l n-eHCC/ ⭝GH&BƢr@"C*P? keVFi .`d)iH~Ξdsz}ǜQ%la&UoMj,Vٵ4{ >*xIA:RM 9T3tu*֟o~{DA0agD_TY^{RP9pz@!uJYDI/ƌX[FS:z]#S Kߑi|SWJe0SԪ}xq3`(n;J,mQ7n@ ?7Sv<¶ g0d[&w ;&˕sBn5Z빭[tWh>vSVZ9yi[fuSwPmxaҞ d .f \nn]nt=[#[[M.pKy6MK12y?[M*{f>#jI"tY |v4g)`OqTsYۣzTf&w9q9twRtH'͗Cd/≉ËvAL)V!|&HĦLΌdz`R|Ul)ͶUrI\s1[j ,mO;,ezHm7OwVg贆nSO-,&On,AM$,mmQPG 1]B=Q.TbzpLhtZ>B"#jUht~s* 'qЪ} <|sF{taC|}cǫ? H%&Vs9Yҳoͫk":MT$C^B+'kVDQ-i AԆ94 bwhm;bkeTA&oA|5A,GԪPZWЖ)^u*4Zٚ|Ai!|RL=c^8|DzB GQ7(cQzSNFnN_$įܛ/%%v̽iwB$+@w;R%>hp )Amє Ip{bO&%r\Z5KUw߅fVڹurԝQw/GݻurԃQ/Gmy/x HG~3YWsSw^ߢ׶ј*Ta;:d)UZi/t~1+RNީ?Vw9K^(yoshimi-2.3.5.1/banks/Cormi_Sound/0124-Armonica.xiz000066400000000000000000000053441506652756400215570ustar00rootroot00000000000000\[s~ϯ̥*B ^geJ akG~{͌zFBUKbMߔO>m7G7?[k Ͽ?.F{_?fX8|c6. ³z.x>}Ү>ʮMW~oz9`ŵ {';fO[ut<Mg׃x:vvHA=./g?~ u@b{~P50\CFZꛁuFP:̇f0\<ݜ s<b،Iiu}%¯^LFd8o]U,z`qkw%mLA`:g g2 vT͏e3 d^' v7X3S =A |oejSV|텫vy&Ujꟿ)8yfOWmm%;ۘ`N{8bpdRUDږh VL9*/59P79ˍRkE՛}wKnOϙ~!Xn"wHHTU ̔ҠhDBUnbr#{\1|`6H=QLXQhr2]O' <6fK,e0hpy <0'xwx33+Oǔ+M3/n/1^pp0=˷cdf>Bsھlruی}A_`23n?H&#N; 1:Cc= \64,|#!C7^Io.Xɇ•0׎јO %qq5AD^ńS:?&p)QAf2K]v*rha ΕxF[:̪ڥT Fe\'0x:#"tdKz _`P<ב Nxv)uuzOPmɖ(O I8Yj+Vڑ| GJ0g 2" jPCM P_-3dDxH-cDKMdjrMYIϗj/-zR$CYltqÂJQ7v*_\Q2VLM)C=IȒUD9\/풜P5ٴH0ꨁ/k4x7d6rWw%+Z׽(d 2,TO-GI$$!h僭P _:9>_:HZPyåW)U)$f?B>`T2>}uaLq"oM1^Kh_ WnwЛLPVQ4 UrBiJ6v7 m2>ZW6P*bػ3DӒ!)0{[8ԭ4wCe.lA.c qRyA"{fѽ7vKtRj&X(U`+[)X^ϼcKDR3(DFw:/e,8>(Yμ@ݒ-g.Pk^k=U`-2ҎY:Q@ׂK;(-E0/5EXZʙYk%4K+σft2\h:7t>Q,h(!aE>ƉDoiLSxyʔ$B9 h)h :jjhzjJ)4i`$UABŇ|l iFM &%ZLi2ejL!Ҩ. <4" N~4ubwiV)s-ࡃB2wK2Fp.x`sJTLG6\78n엩 7HU00erEDiYcMht  68nR`@/E1dtc88**V۳r:Vj[e4F(r,UvVqgVa!&y׌ fUbI;Ï  %y@2b݇*_C3v:bm=Ff`3e`if0;& ~K->˽~G%"?ZGtHi%aN̹ hxPxJVd64taߙ||rgR&VK$%V0) $HDyoshimi-2.3.5.1/banks/Cormi_Sound/0125-Fanfara.xiz000066400000000000000000000117731506652756400213700ustar00rootroot00000000000000]s6~_{*=ӤTS[vmCKͫDH*߂" vInF a]|~|hYuZ'^ W~u8?j::]|LVoWn¿ʫ{uFZv^(G܍2q?npr7wB 4 899u7u-Z춠d1vn܇$pއ,~Gg{+豻ï^:io~ԔBm Zu[׏۩s=\NӛCY'W?%г֠hW(8~mcgEIz *? x뵷隀Ja:Jx|WW]9l&gաo7w"o|796٭nv#ʅXk}exrFpF5n}\zBA>s+_h;#˜gxlXYVlqv̮+ryA#l1ǀ aLDHh魜xn!j2?CAQ08+nf]&Nt:O'?ʄb=Ug<_7WY#܄uIZTN J-Ni|ZM?^ ;=AEoXYpmu-sۂ!(gZ%AE=em֡#Yyen5nw?6b?jxa]y%r: @ a|ϵa r*HgҞft~ɴ^y>dXwЍb)T+}_=}u5XgWSAJ=֕*hyP<*/khzE%W5WLJ߷(y8ԕ{9&]G%_ym*24J~v./o lNN6M0T$@ɩnƷJ=P⊐ .Ap(֌uI"wG*:v]? R?E +jo$9Yzҹh1FTd@˧えE$ j>jGFϥrX`4#_a ^q8I=j-Y=pDE #آpha^0/GXZ5O)Fav6. ]7ۘsYW,@P!:# 4 h. Ҭ.5CJkcjH3Ŵ ajS"8c3r0Q݆yiR-%7zag7r椇 vUeԲꡪiTS2J9bHF vMF&slҨ$Q(HikR(֨U5|M۟Q_=@'1FI`>Px eBY d>"R #5 # n"R4 v3<ɖ3&:&0/C2 [ƼGGAgh6јdT+bJ8ҘɞcWضeN>l[FKc2Zۖhi k45rQ((icBF7Bi7oc!sSըf,,"PEp5: Eu,u]bn!#,oa2zH܌n,B^Y*KN|UFVA;=✴4餥UnDX4bS+H7$F t #'=G6γ| %A! XR1b*#n\7`ix 9tț@,9  uth젂8vn *c ļQԑuAb\fG<ذ 칣2<ȶD`!s*HcQm,@KcwZK%U5,[nQL{E*Hc^!ga (TFXb ưF54@JaZ+h&Q fmczưFKcznȶVpkp1|amkFX7Z#AmFMfc6W mk1laC9:XHkpء:PӰh>SQA'yAByl, jԛh6%k%TnٰX6K ĊX,lv+-6v|" جIYJ&q+nt%зb ^໱Fvl1FK65FXbX6K^bavgX$aHPl,PAˢ{kԨa\r6NJq+J >? z\%}k"3k @'N ť_fWqep܉8Bʕ*;(8QaW*g>rӑ9P'г@#eH29gJݪpio>9z=pI2{)qxszG},Va9C:P#X0fPyZFllr\ݞ.RAruJ{6@ΰd$ҜpL"c\xW]I5BD2<=J-{%% NJtW)%H)V>8+uh?J$h%#7؊ޖKf<9,UDE]bZbcrW.%W:ʐeÒS\|FX&tMNj>;eۃ f꼝X俐*(Vf奭XʋJ]|vn!HB󯓯\fYa#;m)~A^"ŝb#LWW̉g{%2Euf8V+^/M$Ӆމ`g91W}gy\B@Y; sc'K/jn(7{9%E'ЪL* hG ZkPd#ZK8w0s< |X%3@)kIeS˫* 3%1t b T5OhєV} 9ڢqkx;ÀCcrh+p㻽cVimvI|x \҃LY%,<"Լ9Vjq}lK:ع(Oi4 &mw')!>ș}wO|?5>Fe14m.cN!J>Dֿh:&E+*Rɾ.cޗUbg)p-~u;[̮Ea;yBŃ;0ueS痻lIq̬')ˈdQNJPY3^ SfNi-י'mK?yvb/_V4R*,.G=:qyCX}cK-N ,Y}9# ۬sNq5[u>zƑٶXVhܿxyz}bi!_\@&+${Q'pv߄c_1hwYyE,6hY\̥9;9Qo%r $X&-nˎO7ry`roRp¯eQAp‰>oVh7 a&Q)|fYK~!CokU cVnAVEɬԸJ uxԳ*ZTq2u;ϵ~+Ī k3tumT0V@f% tWVUFXt4. PAT,x*]t+<7\R-Ru[No2BzetM[L-XLh%.hNbFZMfIvLf(%pS5cidʞTRvs#2T&+U>~Q[yzY !Ǿo&Kߓ<y{d* D` rJR*f]ZYc,]BaWS05/kPmy$چ}{6]]N ™-0p_Jy =RZ%uRZ)RZ,|9wT]pqEUnz]xEpE oWX%++t蕄:ș*'#mM( A@(Y_}/SRf1dߟr܏Oyoshimi-2.3.5.1/banks/Cormi_Sound/0126-Polvere.xiz000066400000000000000000000132761506652756400214470ustar00rootroot00000000000000][sۺ~?-"9IG9Ɨi¡%:VL]P$.iڹUy9' X vקxYɻCx'tH>;}_~97?Q*;zڇE~qm~6rEQrpm}L7QhxFK`=;<(_v#:|t{vy[E>MI;Ǜ${ xG-ozj뛻FtuOdt3 Fףf7vS5|Z!gְbRh" Y W:\$l}.l0~xgn4 }4fs(/:Suvqs{}w>- h.&-'zߟ/ֳ4]gfajtȞC ޔ6$l[1\'CCl!L, _|*E{F,d1 w G&N+q" vO.1py5Q7:۔8 (X0TbLf-8F09!g<\8p",Ta8 Uk4bVO}"7P`醚l1]Pg0BiD˂ShnkO LO7t<{ hGxhm-uޝmo`J&y8QգX&2! c^@jȶݐO6_[s2z NPS$ʆYdp%rqdܯIgҍyz="=mEozʲ]^{ kg8.Y'Vur^4yzPBZKKyKCg (*:i龷o! y-*o3TDB~0,#la a`#1Hb a$10CI!"a$10b>u O݇P]wcw1mƮc$hjOSXV nNZHjk$u'yuš k^'=5%|kTQQZ881`Fbh$1ľ٦F##(hbL$' A=20r. !-wA3gyY.P&ԁsOJa =m\,L$-5fY\Ղyߐ#ۂh3$5(CNpȘǦ9Xp$Rmk.965R"Z5Fsֲ1}dB۟ G)rL%h@ 194 ԂڀC]ru#1E3vC#`n6F:8x; un7a>MȻ4P7:ꂺA7 PԑG$tK4I` i-s& J ({5DWFGD7AF'*ҀZjXm@`5AyIb΄!`ZƜ K0g(1gBT̙56Ԙ\"ijkF}7"9f!%N{tؐD*P=@Q &ĩc!r9*LrbjV%&|\<_$-ddyfGj2Ynf Qlw/(ݵD/,A̳k~6{.9= "UNӧR1Xhlʆ,uDZ-!oԿ:/X]vt`*@H[R-1~_ CGy4__x2͢dEơTEzb"giuX^O,ĘUU%;HgҧͣUt\(S w[NI‚jb@C,7n@#ʚ)_~A]AbBM/{ek1rQA]þ"O?8-*!LCA*7L$~?^|"j)FX@.#d[xbWI(&H 2kse[08`? b"sR9騺TVq;]dxOY? hx Gfn8ӕA>x3+D{4ILo[x~l{jCP#K8ޱ6Lޤڐk@hqdZF\;Nܡ~]!a; I3|TQ&!df0 6Ʉix`o~`kiJ;71]1m UX Ab;$.L3k:'GT,XjO'5rlbOSB0G}v!;C*A`M锆}~00N7q''Ӫ ?M4gK7*;Rög9#oB#(>վix=4!Gvp -e^6m;TmMq1Sm u"^n&9:o^WI?*YҔnZT[%UF]*:/HSjI}U3 rx ɇ$wT 4bZyj^-f+ܩv.#\w \?KPA%C]y{`|{`-Ot [+VO7zEkljR6qo P\?ҫj+i*>MzuŲ\pQPi"6Gb6pu,olXM0ȓh-D{cS_\AT&$~b{#}j];wR n ǻ=KB}Z4y"{E2QU Lʅ`LjQ#L輿,J^!7D_`%N%Sl&j/b&5C^NJll C@RZb3'mQ]0fEƔDJQw)| jJ}#ԂL`k7ղo$ODSK}I|+'n˾hj۾tzWeA0NOB Y+1?+W{]8ސoOd&9rjnfђ'94=RY6F3B{^6 '|(?knǟNy9Ui)Oz8kt%anJO閬 ,3vo[OϚ i i!lgȶBDY _+y:Wm xIԿ' sFSw|E[ùgh8;\܆; n'5Jϑ9uvԮVvv]9뺕=]׭lUneju{]ץa p]%ޢ&o*k)o#y2ׇ O:IO^YN-SVy ߥVYQ I*e/4<%d3Ŕt5Se-RyUL:>k1/(jAG"]Mr񣴀tqJiH.>P)4 9~ . fT_h>Oy4o yoshimi-2.3.5.1/banks/Cormi_Sound/0127-Comb Filter.xiz000066400000000000000000000047201506652756400221140ustar00rootroot00000000000000]sH=݋?0UIXj j/A6c_̨GC*Sb_% [4Ih;[4OU׏fzxߟo?O|xW~$ѝDo|hwI'w!iM<$nݓm~u'h«a4k]H- TXč;kh:, !d,l$ڃtgkwR&Ƭ`oMc`>tp1yq\xeJ粸Wdn(u74q8͒mDc`Yt!V8]HA>\Ѐls6? ̪d= ' !o4Z0 E(3ˀε?Z,hT{,MG Z, 5iֺY G 7mh' $~Ep=\Pp.(7tE4 KAL$/w2̮ L&m3Jb m94sgkߐ2x!lBIuо9?!R{V>)" &B@Է#e <*]j+xwN(Il0)p0E˔(*SyBR9JfJ.hYnύ cfEбJZ{jT e ?ktyUTqqm" tj]S@fXÕGJ1-A"/YLtPi`7Bq.h^U! 2Ej >t0H k(ɞsM(lߑ{棝 oԭ !?k$XKjװ)_;Ra,!' {fj,IwEe (ʠkW0̬V*_׾& n-& @M9U#bX79;4rn3gS4iNpd lFԑv6O'ɵ?RՖgTtj(S Qv>PS)PE7 h=&&ZM̲uq~' I'tXZV%S&B='ݜK碱Zϖ V|g Қ.j~> ⶩ 2U} %™+(mb Yɾ)^gaRV/. "DOoRNQ{S,KSԖF5=f;-P1qU?t缢1+楶iϢ*I6TZ^KZ:Բ vrC+y-W@\m<jxWܚ<1pc}DthЏj^o00p4^/nƹ~_Ol+:;6&?h r!)n\ U]}iRԒ-P/WG|+Kj)0szP"¦?}C_{^Tߕ7 lĚ LJ z$#[WqMV]< "ADي>%D t\hO$ӬvMBXzVqbbؚXKv;Nh26$qq"?77.V6=X5 4=VaS]H7u2 tp?|r5yuց8(*ż s_O Jd#0uXKa/+MJa>Hggk@msxo@43  jO` qud~xM-ֿ&(9HX[jlKf/6\"OY2hG buI5bnHWTR..͇;E(]Sm'z}{E9_]acHUyNKİ* `t@A 8WS`?Ҍ6$r6Ta3_)!t"\[e+ܠDPw/~As Le>K\y߇w!άs }@ nD*n! ĻȾ?s7כr'9>I֘j0|(a0T&I)4/Omd SgT X%o>S~nnT n'T!P^`~@-PB/5x8#eg/mE|IE0`pub\@Fr6sᆙ Fꬖ(o4giոP0eKa:k4%ꠘtDGKc ކYN'厈D26$Yj1] ]T9`,ve\!p6N>P&P+.i]QJ̮Gwʙef5Ie\t3'{y_u m43nV2QtPp1[h+tjVmaN]dSqHú"Op6]ocD6M )SC'p{!7ȅ 5kBD1(7t~{)kf_AQY$bzJ0Ti7r"0 4"佁GGD(V^^>?WNNzݻҙn'ϣgo`9#ijw匤?^?π;JqGO!0}/"#g]]ZݎTGW*O~ռM{miS Yodh/o5Tv!q=?$W8{Q["4%[lֈ>GV$i"aڳh4R:liÐgZ!O;*fOm0³hJ1]x1&v.~ a8&ETXӊ+Cz9A0on0=Ӆ"sVd}elVzUVĩ+oT:Mn40RǼmO~3o2{ofyL7 ]AEe F|©G9 j3Ts 9x՜sXvrw/Jl#)'Hak._(X` <]e={ 4w^,V:u.L:?.n>o~ÿUݽɻeA3y+f/mOq7l 4O -ux#1bK>b^-.ogW7 Oeo"..({i~YWo|5Hog]Uw;]w; ס?e0X3*Ǖf^FivAӅ)yf1!S|bi^蠵u>/qb[(^tէjqpx=_< 4CoTH뼿U|v'Yƫx4e}`9lb}P_<&;b(_س2*tKm-^RNyCUa~}uzlUT˭JVD4ycyCr{ZNx|y/H w\[Dk/MRЫԫ>eJRkZNgƏ`=6b|]+o?y ޴)v ꜙږ$DLs`T؍.ڹ[X3k >Z}z =D a?xx|`S)&%ނ/[L5~cɰH8Fu,_IFWrM`Ճ]Mgق < <}Ȭ7D˱6K(]yFYd+EWTnd=[bil6S`ɃHF/Z,2Gq{Oj\r}U9יd9,M8ތM8AѯWF4%p4zh3d^_pO & 2͆C$;qڞX~^S8 t>8a9N"[FW,Guek?.z%MEm<8@G䎳S1$nТ] ./>qŪ5e_)NDئG#&sΌVDl#0J䥭qQ_Ȱ)8o?d?ɮ]QBg%"6ҁp ;h1Ӳ͌~Vcf'GG[=5ph8:v?^وV$LܵoexE}-uv0>}aﰇC`w{wKM+ Ⱍ|0Kz䫷;lK qLagqv<ֳIer۱곝vV,힤&F|y" mo%UF % ԞW 7WoOP9D+\X=Lf bQc[mw1K`ӽm$&g\yO#4dr"kY6A:w-Má6|'NnV.}`G6XbeQBJO!ҩK22]orRq` <ֆ8UgܖJ2-X9MHN=}LHhϭ=ǽ4)q7IF26 cOg95&dP+>@fm#ىf=+>sjc[SlRΩd4 gAP>s%%f1[rh\-y`&U˓+Q *1jisyȑxPnj2kymM4hv`Voozsq VJAd+l5F#u7FV̓"[VlT"\DvaYfF5"GF5(}d\}rd]92/v|cOq1|`̕/J[,f(YnQݢd1E"7sl&o5p"""r(I5aۅy4h/8F##袅1E.R60rd a0~m6VDVs=F90및 %F/GF6AXyз6rvalC*<X&$s~sGb# H]EF3uWAny ?0ZaȘ #j#Ha([AB # ʑ-nqjATdƀr7c̆Q:Ն' ]KQPv{#.#B.訥d}ȥ¼$6%vPKRM1/I Š6Aȹ|",b<$%9H*{K˜$1p˜$1I #袲BNeإ"TMa#4+}d1 F<8糇t F=v P#cX4FJc)}Zst\ k歰š k=ks,.«?X4Q%!IJheɴ!eH(cX&Kfh#i]#g K'E3%%` |XJG"I~pTC,BXuDzN qTC1Ξ5ıJ&iG<ܐIیhK@!vCqBscY*žX=8Rc#`#2jq+aHdp ?P g9*\1f- К# E(05G`93b{@ sM+ S2X,Pm$G5Hh$##JFHo :mJhĥ_1F@r%d:q(F6ht7-ޏh: 䧪ҟOf fܙie/Zk)%әɼ{nb*7%@D3,ZE7:Tn֗l v &pjd㰊 rrY66~J9ԚU$UΔ2U#ς2jL&BzDH߈gE4Dh[Hץ6t ے`^B*XSgΫe8[pLz@wk:Iݱ7Ǐ&Ӥ[W!嘂5oOGY3Hh=؍(CɅreb|R'u 8 p&Ŭqב鞧4GW~H5z83Qw#Ot8LFlx3O+9Q\8^nX) !baq4wW Iַ>M=+o[o?n.b3iH eV{[V1|S" ,͒uLTkt$D (kmKS(? 0Ԙ1'6{*?qΛflr7dzb `. #ڹ9"*ϛ[o&ox<Rr1֊l"D40JZ'm(r my(F[,̂+5p9P gA X0]+ w>[ y6TmPdp{jFƶg3p{؞{Χ;pτ^6yjf "ki!I\>\{lӑ5[JY[Qt ¥+^F\W)ߠx-[3+9dPrH&p+h\#|4q_hRRu8sZ*HpQ>ù.GP5~/?43p"ߛ@EzYkSm.6|©|Aseʟ>?Q*0$Qis_v! yoshimi-2.3.5.1/banks/Cormi_Sound/0131-Carino.xiz000066400000000000000000000033701506652756400212340ustar00rootroot00000000000000ZQS8~ 3\ \wǽh[Jʑ,ɒhIx)ȻOU>$3"iH8}_.;yR 7oHMGj3yCnvv KCn;c0[cޔ;w,)Tşxv?4kKL/#PBK-h9ʞJ@ hEe&bZ2F4B6|2.-'y"I3IdIø 8sUQ2fQ93| 'z,n*2Rʥi $B6s52N \}`R*H ,R8|91T@І^oӛz}|ހ9TfS)om2G`r`^ [TBH[=g38b=ې)֩Do7o!YNPMM WP۫Ґuhm4kol ޮkG>!WK1*:x핆JGܪ]&?C;]ʮ_w둍@Jh&Wjwģ9D αm>\Ol(v÷1fiիz=Pn9ge9mSfsX[a;K¹XExYBJ-IQi?\$yoshimi-2.3.5.1/banks/Cormi_Sound/0132-Cigno.xiz000066400000000000000000000047451506652756400210700ustar00rootroot00000000000000[[s~ϯPg`/ 3&iZ e*V|u֞Y:wS~טm㏽ϟ?|l|z l{|iDwO9{ԛuvюpMkuDh?<;s  ڐ zTDbKcN~̦Ӂdnͣ{vSކo^#ql1|z_4o,R? t *חbDh9/3!!)2)nDՉ}H, FAgrY"6h0D3g2 vgYsfgXUb9M}_pnL1럇?5ߔIRKw_ABD\asB=J\Zv`96)1ȯ~,޷w^ruJӶHT9*,G5Ǿ_q*yʕ0veJ}rGz_̭WV(W_vj^,dM"_65\e6I  (!{paDfלsG9k[R ∙C@~6 9VVX292k+3 &:ʺw2l i.?Me LrhӐ:#_^~꒫Գ=DO2ǎvYx3sP&g&3{t7{at1F\HN`ю8;2( XN.Xɗ5 S\wAR$` O.]JɌm_<7+k6kp0f{Pb!Us؎ 5~ؽ4(omΪy@mYt+$D^ ,ظP}FuX PJ41N b!j143݃`Q RGj(JDQkt%#_usMpGݍ1ՕlcNd\=My]%q KqÑkO.V& N|tMu[O9ҫUUg;zNe2|~{Ƒ@)nLPU8Z1H Wh&BAD]mҼ-@9kp`hLnD&Nl@p@mz0|~PӒw!)%-\H`)EHLvrvo >3yW44ALmWd13!=w̻[GoSi49-ft!sYyM{"D$jX4^1@4T1Qt8^\rq'%yBDr/H"OYb&d$܇i !ͭ1}+]Y=/MiS-M q֔rȑ9 }R:c/OtџAVh I ]t:{:L:]xZ M @˲rzZX]Ծ[qK ռ)fqh/;OlH~`n+F0 N4̥uc*E$ yah:QSWv~86w0A&JA*#"pҍPZG q@ )dm-|*"K:a@ij ߵwh}3;7hR|<YVم"`#KcY=,8hnA Y1,#ZM9˫p^qbrt8UklMDI:2ebz0dbtɷ2 t>[1 oY6gw⬀O*zCaK*T\"_OkzJ1+Ch'GmLKgGt,dfձ{m]7;m 9Vvi/5nZf%s?b%"L12Ӆ`z;'~MV>*v\v+ yUny?>eS3PdLu|"8}b.rP50ǀi/zy,s98`q.:\u>¹|s'< k3w9˱#oԈuArr_#I~, x4\G(?Yt5WCC*4EہI*]pKX^ľFRbs;tY7yoshimi-2.3.5.1/banks/Cormi_Sound/0133-fluido.xiz000066400000000000000000000144541506652756400213120ustar00rootroot00000000000000][sF~ϯCEKTEe%9DB6mןC̵{@H"/\2}:Y2/[nNލZ_Od>^ݞ<7'ݻ}*bKH{y΂Y|2X-Z?}N!zMOeQgި{-,$YC59>N_F,VSzO*umy\&Srr59L.|yOw(,|HpGq-Wa ˅O)]87}:hG=S`>_$(^t֗o\, ֯wU4O~iImZ׳h9Ke,y`NЬܶ1 4haU|"|V?Oʮ&?${8fewЖ#P9 s)o(?D;^J/a.LGɰa }@biœ 4Cji,HOCuO7igY2>ӛOVN5Ya.Ov<L3sX y$/r[47# pڠdeO>,y7e@ [Ķ?ٽ /-HXCl&V_ A@}|Hh毗$XY&Gq!?=}rei+ bcLk"Qmy#X`˚Kp/E%Dmt!bC: '^}`|wG]ci8*]Hw%ҍ`I4IA{6$h#@$8'SXmf\^y*(϶˨ep 4=㮧ͤ7ƣT11]h.wd\y@2E2qė ([2[ [sf.mLZ"5̒8|Ur# r#{k ?H_Gmj*k*5Z8_?)-WI.4,u]"$7ko־ggUlyezl4T$hhȈ=0Zdz]HO_׎0Cu0 1eCI!$Fc#1Hb aCI\a=Fu60J ){ G\b0}$#L=F1bcLV{ K,Iba6F "caĘFc%IYqw"' ZkSf^`)gxFō<'R°vOIy(bOc^2/#1/Ia$Ƽd$10JA[ xz$O'-Rjx%,Q2a!>|hu,n_i2#:âd `U#@Q#" X57jmsF51aF9relR>n!ٺ}o;tX| 1JOb1v?],f@j],h@]'O.!a_- zjFG45f#Ԙ@Sc(TyBA],~ aU)jAEjl$s,dH}M% !l,X.BRV鹣ٶŢ\! #@9<.vŤcs rn19cAxr uѬ"r㰀þcr:\^u Ea(ꨬ.W`a`bruѻ؂ 9蹣Qș܉hZVSeGpOʊcZ٭j>BѤ^w՚kL_eeeQ oJ#/',+Y K~]XYŏ+J o }$EeGsYލ\n ӫf YQpZ1H5=[wq}tQb2-e(0c%%zf5RAVn WJ%~Q=TǵK4_FGAR%e.[b[b#8> 6sD5-+"6*qR&8cˋz8YiPOP,77o!v6ߕ [L)-7e cJ8]t%#gRym候h^ó\]s@1&abۼGsE;qrVt3i,SMEѶKC;ʷ^p*}o@ ,VokU>uc*j]޺͵bd?0S^iUbx\KP,]*4򅒊e+/h/q 3!BG{<ƓrkTHGd'nN^Kvn*?qk.{O(2V,++"d ?3a{?Hޛ)S\YQXی,~Aqf[W'Nnlx1Pk{N>]jD 9.e)4iv{Tg#Ѯrko+jѮgRmBE QjЛyOijؚ<.}BM%64ңZkplGzzƺA{a_oN[GzjoHq~Q gi^}~V_/Lp"= 40I?hag pᦛ!ËlI{lIKxT"oO7i 'b?VKyן>X(PHI 5eY-֬`4Qg.ni18X-,^oeܹUץ#m{+c'8 T*So&g]oʚH ^WG:yE,Jӯp%)+d5 y({0N,qų\:CdGqV.VIMF2f;M3(@A7n|!hٴ'%56kDKHKFx@757wU^ɥ ƿAmP9fJX$yYĄZ*ƨYOeJe%J閵&ozͳ+3E?#XXV> 6?C4ߧǠ@N~dTvU?&5pW+!&:VH՗kvXNX]j1QTbۈ˶': gddd3į dK?{AHÜ;?u ‡P"VNșlggxϧNZ*x6Y{YQ=@kȈp}e[tLM\mֈt+k뛫Og7 dW _Z.a6j]eou%/cQW@V뺒wZו<պ)/捼ۥf޼~'t"kmˠdzt m ?OĬ.!( 7>u7z Nh tѰL8)St\gpH3)g&:ů,m?6)>c?DgS"xNy JZMm%-Uf*2 {/"76<s ^$=r;0c 6T /U=}my@xFwcqo;Fn;Tǃy& c^W䯛ZE>!,a|As5+̊Gβݲe0CIӺϼ{ H#𓋫 -`(C F~Hš)Z3-bI( BY2ժO?V2&KJϔ1q+T)Thb60Nqx&r:T<;݉ѥ-Ժ!o 'Ki z Pd?Eafnĩ!`Z0h} a@ѡ'ƉǐbHPnw;] sƯ @蘙ƯeX| D=y \fbZ3\ЎUK:4ɇQYvfhANpgZ_>`ZҶjg:Ӝ1?0%ɫ0aӒ˥n*I&F`J1h!TK2ÆMS;G0Ei[NEih:ㆁLJ)֡ | "KeWE;i`Jx4LF74)Qe{!bS*enuMaՔO:&EaSކ=7LR0 5WMsՔL7i4C6lKɤNbFooBH`қ8?Īhq04qRLSz 6zdy-AQE^#׏1sU*\PE6@wSMVizd 6LMvC!LMbWww1K+4,hiInP\2$l6\CդW6Ւ*>~]ԤIo"vMO�=kГ ҨdJ/5LF`z+?0az+_i$1mr (')sӔFդi&R?VQbZLn_5(zݓUxڥRd庤T2oB4kW4=?צ[x[QIȯ͊i(:S@h2Z?Z6ՏPhw.T?\ב~#P(RnRd~kl֢j+] zV]DOd>^ݞ<Ȃ_ɚyoshimi-2.3.5.1/banks/Cormi_Sound/0136-Romantico.xiz000066400000000000000000000046771506652756400217740ustar00rootroot00000000000000[r6}}"QwU'%tE[r$yw/(H,f(RˋקA)˱R٭K2Twh `n{apѴ~h7n /xh>n>?~k0qeg&~+>at4/`_zOM<6曄>{4ho~z 㝷> ?QI0BrK>b n拻j:4"0ݻu$;Ʈ3~ _haۅ'&˯nnӺ,mr?YL약Xc9 {GS|֠"K܈xAD [jk Jnݍ2F4rBwMqr/?ކOoaWMgΞv`fͯpOۄ_ZelͯUo=seI}J^n1a4m[ϯFlb%)[6v:rYF& xK @; ݨ'B+96R ]J7ڒ}#P 7p\~E=>!I% AO(+\HVl@c(DzY_]nK=iZ@ǐ>u$AnѝÅEP% )pn%E!iܗUH㭊 t ɀ0);ߕl+jH%M E&[/B"9x' GSdI-8[!nK$aÀZ)$+EF̪.W]E#.,Ic;Ƈ(Wh;kNFN|mmam '{.%Xsa/Yj`U-UG|93Va-tPù@ 1Z!$ɁR1 .'w6ar;]=jȋYao20DZJ劺ߐR(-)Z:&s"$tp]?>5E+2Uh,G{oY<ʅJM Ípj\/ʺr+:(w,Ii[*Oq#0l\VHI}1PM7xIL ML\U:5+@IqZīp6+x1HfB7 hkMh F&76w91Mؔ4Df&Nť6e!mۼƓl)?fgOY4-\;T&+K:xi ~`s)9KvSC#ND 7 y6SPq\cw=$>}p 8"57!a*QGg r)˃=z:z/tvMWܚo2fnBv$QS&t%I4wc;*]ĂD,+6ДxGW2a C>0?;0?cZ06cM6hRolj஌Θ]+]p[FĘG#S$Gi=WvaV:+ngtwƯov`5\Lf;9m]7@Tw]kq2!L&) Z 8W=Ѫxuԇ:|G7o:?ʹ9iqysӽ7<#-≾Bg|Ngo:fux|>cDZg IbdkW+v$|]ʴ r"WmMIEn B$?SQ{c 0z+~ÍIt{j^f^눫JxqUx`t*F=c 'FbP[mHW [&8Ԣ޷yf~=/@lzc@Ǘ:6W@XJD!mdo$Rؚ\O CDc:`y^}?`n~j2sm` 7[<5"^N{'~?Sxn4yoshimi-2.3.5.1/banks/Cormi_Sound/0137-Romantico2.xiz000066400000000000000000000130071506652756400220420ustar00rootroot00000000000000]r}W!USDUT(E8/($$$lofȄSKbzz6^{p_ YqyzDxFN.Ox_} fz۹oOK8ywꞖ}F7yg,C?:77S F(uzr/` oTXu _\^ .𷕟x8^D2xw:ɥ[ЃR,-^˵ /iYl*~Y<<3ai5[sڷL|q8cO<Aoxrw{54xGi8Vmv*LfY:5KceҗUP!d…mrH5z?]Eݳ罌f$^|s)o(OĻ]wMin?]ZU@h5tI͚1FޟKE8nOE:^ ڒ#Ы87@ҲTkZloi|D<֩(h1|e3o?z-aӏ۫=g[c)e,KoΝ8D8Yv}4۹cߙkMt){t],mD쁹NSCP,b`G*. lH%8 FyT>};C'ݲ`E< r-6/g4ef$|dA 盨MYo@]re$HgʍF!Nf|2bF+?Do^sf|gcv쏪P\&;3݊rSMC$7dS&طLtO4bL6bm^N#6~b'~Bl%'=e.Ο`.*-\A=(30jТ 4/.?¹5Jrc am$jF;RjR$KNPğiTzj /LoTڳagu HxrӍpRcm>&}=ë$<;. 2O>jC˪u_C3U n%2 65 ?Ia?oexv -m9ma0s]ahaa0f5#GF!>a!k!W?[Hߊ!$"Š RSiw0mp賎Xq00țXM #haa00ZA) 'UC( 020* c@T1 gWIʆnx G60v_352XHbu1hid (ug-@Fb]Q{`?px'##ha,#7 (Cnf .ޠ.Lbp.LiUAXFF #yfȑ;8Hڊu`52V,%FKXJ>8 n R䴱+)%])a4"s؇i3yΜ!@s i5y ?T4OK5 p5,O&HR )p^ݮh=zl,<~dc*vkϡѣ ˖ı|J˘Urf&erR؁x,_( \N?Tph[ 3o4fhi̕X.s4Ji m̕cr#icX# <t !3T dA+c%zX.XI6FX " $:d*hmbxJ+TǪıȭ8 XVA*:X `!:-dgi^!uw 蒀d"}nPnX-4V;p+&=ȑ[H!BWp!DD9ԱKidH ۆ\RͱBȱ$T3oid 5@ƹu# ,-pb f3"M(EMIWj X坖Ǝ 4V{;-Uii k45XALӺXAG+((oB\]PAZikU6zװ4bc ҈] a:XA@k(P6؋8vÞ׍eH}lҶ`oo~X)4%gU*ew鱱.-}v.ZIưFKcX#O@Vo\@\ߢP\J ;%d$](&"VI .VIC-X%Sٟ7VID.ZH 'n3k#J )4̅Tϙieb{9^AT%]J63oTi79~W'IU֌x.Yt8 _ȯq"۹Qa2m mvj'gΡ8z#s+VQF] d ;SgOȹJAm ɟ24 gaYxM|fe4P#B,%V?flR02˒m=OEH%`buڮ^Tӌ:HO}813{:LECL@mk-e󟮖G-vgνY'-ȡwlD:fgmyr>Sj1]c3Dkо&+6N9 5"W3۱UXsر JW1*wE*\ 3kU4ڜӷUTVg5ROy`]]3Zfv7e ݙh6iN~#3< 8㰏]NmgȦcdЅ7ϙO]WI-L\iec~u$w'|rd\(TdUmu~AH WT*w|/-@I`mRա'[ؔyp(i|Y MK}Fky(]yp Bl:ѴXf$c=xiR?hBQjlLlP7O\{VnzNfZ^AT q#8) **Is_waUä>s`aЇ+'n`K,*&5OXdS'hkמKN,JbMHfG,JrطcwGIC5b,LbGP3=Vlˇi+;g%-ſ¤'W ؛:94G`-U`a1wVҾtT'ouuC,R&NlXCat)UO{S {jqj Rm#@)%~ ],CsJӫ8۸vxWxNdj!,PbۚM @ k jkcRW̏X5eu 2$SC "J*M)f+ EGI$` LF?ߏg#Fdzo`X r^*QB?O퇓Qjj?GRtT?*ɚgQ9~8ՏJR*>/~|QHL/1**ٞc^BaBy* kJ\2=֋ogQrN=O@+/ClE9>EX@ʼn!zfokotCnpo]p1D F!0!w3^ u-}$nK1H Js8x%z2ݬ*qU長edyb|S^J;Ѹ{O=ix~.FWq_ȆG$"0E;v̓W-5e^kݼBXU&(JoJt3e LgStdK2L](.v_gū, f+/p>lJdyoshimi-2.3.5.1/banks/Cormi_Sound/0138-romanticone.xiz000066400000000000000000000054011506652756400223430ustar00rootroot00000000000000\s8}Wj2[@- d]Ee&_-[$ll]^LՒ%/]{UzB}VnðW8rϏ]`qoFU>q=Uі=ʮLW^>pݏGè2w zT"9c$YAǓtv_t]ųڿ _hK!u@b{w_0@JC#C:rCПlL΅/d:.GLƥ: 7"nD!9Ѐ^=` ! "t+ei ` Ȼ9\D4ێlr9ުd=' ~ 7vsm/rWG?ՒﳄU?߻ʯ GlgwSjy끦 JVIvwƪL,:fK٩}Gm`F 0\ m;8:SA BƋ}uufo )St)4n\j 0C"_l$ʜ- KDn ?MFF @Y~|[;"{{C4C[ XH8ҟO'C w|?t?7r("W},#t|Yv>+':?y7ۡxx[U@րK;: @Z"ZX($[`{?|}uhuLSzgWnJrBUnpaaPjFi{ջ j&"aMxvڑ^DQ@\ՐS[:4ڡ<6|t &;/%& f;&ǧ)(h<K2Q M7hxZ~U.A&':/ab9H x^XOIOgra6w* xbdU"ɠW?"9wv:[t)iQ.ېקYv5ѷ7F=9q|=1$,Nڻu@ Vь|0\XSGojlaJ!c* b(`X)]װ̛3jAbъlDhe*h2uɫSI~k >0sx䢙Mn|Sr@גB@qQ$v7+{&WY-C4NXE)#a4Д ]J :)kSz6@n ⒳zX7N/3_s)v[c-e_`;ZTIݻk/}r}A.hB3إp4㪀gP@|Z;P& |wxk S= yqB t4_u>g4hO93˼Jq@sS@a\LjXɋ[׃⊹.5V2}EW(,}ꁀ58q\hw1L}PYէ.>U3qh|/*rdF-]H$a(z)h,@yoshimi-2.3.5.1/banks/Cormi_Sound/0139-Emptyness3.xiz000066400000000000000000000047151506652756400221070ustar00rootroot00000000000000[[s~_=K @dX. }Q [$66lْܲd/8ݭvV_?z #7oqjzoI㷃?tzCc +>]x i'gxA#6vL_\7~9]ϽȈ[$Y7Ft FF$W̟+vl1]χrѐ`n8:3GvO,j6Z'&qKWÄ jr.-t+\%(ńV/_V!č Gq֪d00[YkZ9_B.t@=u/k -lau8,Vbxo0 槉Hiva"XשA47LD;g q#H^%,#X9Q m .4#!dp%wĂ1&3ln9Ձ}P|v- N84  m1!qx@A %Dy*2d_i8ǥA%؂;] ݫ')TB;ea# ?d= H l7>0yP@("\np'EU ׫b'5:ikԜhICKN'wkˈL69$IS\:BjqZrui лtmˣNkA5?Y,'vG (^O֍I1Y"ky9-=H vǐe<*IB;H R)zz?d1\s;,26xv@È%#`!NORl HUS/}B/ϲ0uLѺD(o(k#_kDzJˈJ:_ ~gYң ( WWՇ _vqbnF>44f"0_DG=nR㋩9ǮR4HɚZcӘ=aEe2cc&I-$:OJ׆!`D$&b2eDZI-:VnW:3FGhJksQI&*b^j" dc~\ #Cؾ*/hR[Gw#6D.8Q^hI>^&6"ri˖,N )-Rz\Pf4 xQgl LL}܎'=tX&_1 "ە .3;J1\iJps0NG}TP;[Yk fgy0a4ѧ} 4|`ŮhhuKe+q>>Ng|&.kSVSVi0=S EAtd$U gNψpa2#Pu5yP'(Hyd͜l|eU/\QŜdQUC]@IƧ%ˡFyM,J8oϗو_b~OK ^#̱ ,n6 tk O1%y;7Q+; t[}l)-5Op7wuWMFd3;:ǔ%;Q>4z+ 7 79Q(hŃ4`k0U& y"<Eu7'.UN6Le}>?%m-^@! |ιPrFy} 5>hRLh[衜ADZV6L՛H"J/t@wHRL_nn ]nm=Q l-F,Po ,hˢ/+cI⇁JOJAz#Z&4f'rssd"?ǰp@h@o%6p2>!mϝӸ 2=yoshimi-2.3.5.1/banks/Cormi_Sound/0140-Foglie.xiz000066400000000000000000000044311506652756400212250ustar00rootroot00000000000000Zs8} @dbj%rwx؜?2akK[2a2j~ݿnI_~~{WFn5q]y5Ax4_zO ;yF#6vL_]7h5?ݻ !Ӄ?YϢ17mxx4W ~;АktCtI"K4-,|\i>(SRͺ7y2棵l=}#{q |axn/1qcȁ8Lo#Dflin P  Axnd^~ \+7b>L-k1"(mBHH 8'h#]`9CTD%TZRrCuc8gi)6Pc3ަq- :ddG}6%h$ͩE|+8XTYp=]RL|؈p7uZ.^Wufr5!#E!E(8SS$ϤiH@"1cB6 \Lbໜo#V}- FbĿEs!v&8Fɒ, 31\Y7ݩfknrIwӺ뮲Aa"P#LUzCa^Zi&7;!9zjuu]ý*ga-3s6+ [kDtFxo@JJ)q$R"˖ȑW4ٜNV/.FH]1XPmRv;gRE>MfڳFOVkA,  BC rY1!\Rbkv^Cxe^`SӢ^)# lю@Ů e-5h-٤+IkOk:D k_a?]2D.Di?Wɫ3vIFл2ɩX.eq\ ^I}Q;&ye~unmރ [(t=8hN?8p8 C3ާkf>S[Z`$GP/)&zlP-$8䲢3 ;!'Zh|cZpn/f0t >-Owc#βwcgBq=DzAUP۱0TY d9>eX@=͗1/n6bw#@}Y#a *D0gG/sk\5y։Jnu E^.:€?V!٥^k![`rVx#~I71)Jq%rщT"WP]܇\Auqr7<)ؿ\Oz??|ѸbhIeKz+STL;8W^&y.yoshimi-2.3.5.1/banks/Cormi_Sound/0142-Solitudine.xiz000066400000000000000000000137031506652756400221430ustar00rootroot00000000000000][s8~_{V"udKزǖlEKJT? &%;N2I|h ~sنq{(" _vzu2t=9s4^,nwgzoOy_ˆ=E'y-oU/&(&G'B◬1 |zvus9_Mok(W9J6X~}G-h-u`Ƿz|3&7Y(WWo.B~J`h0~1JaIz`6VAV>o<<s hZcwL"q8gK`?ˊ7vKeXxQՁxQxfȿ_vauԩwjHmH#๘b 8 m-$6LVC+Axߴ-7o*|vwj %lmN~cb?#"^xY } SQ`h$%Jh"sao ?mH1W[.?y zFh)ƒڷdZh`s(>Us/N&3M[G`2zﰇMAP2QA}+ICmi!`˜Ȑz7`meoFmG+p4CIZ0{ q1?O|﴿ei z*Ws,:m_ynz=Cޘ Iݴa{VUztڰZoeˈKEz^ D{.b ^WD ++$h:mg}KuPxr&U4@&O2`ĬrˇSzmm=֩2)5k>>L"Y4(}'E_H_3E}>q7|iՋ EbHwlTR[յ׀ytveH_\kIkC5yJiSt)uFHyPqi)ϴ c5MeD3t#vh6!9&[v9N~Z+w'aS=핇Tds3C\r<#+ rt /͊ڶW{Wµ.\tS@T30=(A.R{e a ӭ9N A.&`!QF͙06&xl.~{mgIf ڀrLQⷃxZv3Yee d ҈22.04N&ʨنܧ eL K†!f63>uv G9,(@8ŽmJ` Padeat`> ;aC}Q[Z*puW @ ۰:1/`c>0Rc$% 3YA9lp= zdel!Z*=Szr`$¨- rʮRʇ la-nS*A؈|S AO{԰SsQ<F7]֥b- q@e̖$ d:1lJIOpc۱Mm!!#@vf~G}^vژ.FW,wtibQ:mh\@<6sa_dٱF 7T=rL-=]r8M` Wψ1\1O90:1ȵ 1G5xq'%yژlHs9h]"{ s1eҷJw0?϶DbHs4We쳆`{ E[$ !` v/5ŕF, @\, 0$P,g⻱@})́`M52T@]Og k$ZpXtxr@XTchH< mA l bɰ rS8,~hp}B J9RFbdbb`"pbP!LHyu~2Wj!sըvQƽm?3D^m$u:JlHK$ZTg)jZ>F*6)w)KuVcW%0Z1 ]ky(7}nO/|+`7g < sF -'cW&9-}y t#JD#3jz@y!jTՒxՒ}jZ}bkc ʐL,Y>8/uYa?J$9,ϙ Kf7,DEu%vPQAa5n{I(ѦT/e[N#cajPY"+6$k$7WF%vpyf=%IO oyB*|(' "3+Ÿ'Ӵ+E8S4B^Ч,qBbϖi25dHȍS,1iKImg)}TǷVeVFte˭Z؝ x(m\7/Ñ v.VۣNޙϺSйXJ/͸] GV0B ӯ='>{#{B<i ?Dz]6p`\Id픞 UI;tX8킡3qyr2uӲC ZR`Љm=hLtC*m~kE%Rp o%yOQkiLI} t>O!2NDoil-I*Pkw-F1JK:h!^Λw'/{\r`u ]yᗮ\ba Q΅Х!BD4şFBP7P d(N޿u6BZ_ۨ=zCAfC;[5eC]M!+M6D aE\msA?9<)(=n?Mgiir;ݽ=<(]ҝLJ(5*E" ^"V$P`yEi&z͜ʋOVs˕IYeT֒U9!?ֱo֜9!JЃwB_E$QDa$0u*p7`ĜJ|bki )v gO,k~Mc5.p(sK 쯗jM)I>fTq%)AR.(Ӛ>i(-XgT;ZiBOI$9 h 3&3ӖBe=pYu'=_M?ܡ?:b0)XT\evn|q>x@a DhvHy}Zq=X0wG#x0qټ\«z gVKՙMPp1M0:( ̵*F22{9gK8ïʋ/5]+)^ӵV5]+^ӵ]5]+ ^ӵd5͟|7*_h ;\7Ń1Wܑ+n-$qUa;9;XXُE8 AJo Y3zFz+>KsGq6QJr=1WzWǿJ|r=:JGxғ0Ŧ<5,TdumfoQeBMf򸦌fRBʅVk(c!(瑨( "'!u+,߻Z?ի|񞮪EOu3,z}۞\4⧌ŖWFU|qDՉmHv, F~J NgwxA(>Pˀo9A;5ZƱ}p0 XRYlhE@S$?7:Y*.r(KM[`rٌ(斐Ătݟ>@9"-}t5co׎$jiYGk[7_G*6[= Up>; !Әe-ҥjLJD{C- |qڱ+s!G@LczV9$3=qAit1ĹJ8FBnw%;޽_4OO0K 8o;G#G;lPAf.vZi"`(j|bCuqC2d`|hފŋ4&)dJ+4 G;Y^HG=i&>N ]OLMW)U)$F!]yJ&ûC$)ǜ4lQ19A)%pAx^O*r14)!$Z0׺Tbv> mԦ3Ɖ!)%ə|T Vma#MQ25ek:R֮eH;ΧdۚZ)5yLH XtwSt*?f`(|; Ur"T&pΫCCj 3f_"An7/;(y]!4qw8!/܊0z ą@ **^+=I]]Hͼ]WHw 3&ȝtoIWXuP* YJPQ&'קV)>ƷD(}Xϝvh]J6#dw|[vkXu wu34y2RJ1;>CIǕ;Զ/ Kgc3MMqzHE26|/;_{U*\bgw#ji Q|Qew_x܍lR[W߽etD/p'xcZXXZ=h[(b ci, Wʛo"+DZa?c)ى,*܅*ibq*Kn8Oӱh[Zéwo:ZEn3ڪtɢ oYQ R+-Ftx8vn$Q 4^w !WGNltHw}eai33#oMY#8`˽B p:quĘQ&ӥ]Ȁ.o<;x&qHi;PS5Q3tՈ\$~Y_NX7xe['J=8ԗ:{p瓺s>K3(w>!7?鍆mx"3ImKh4,xUx_u̚.܁j qT;笗2/elHJ`nW~f?5Hw=yoshimi-2.3.5.1/banks/Cormi_Sound/0145-c.xiz000066400000000000000000000076201506652756400202520ustar00rootroot00000000000000][s~_ĝXWlpdAJ@H»ί?=ͥ[#iQuόҗ~n{bƅ>}h<?}|&ϷӋ?_z<iP:YM& [u5_=Lyÿ` ưn|\،UKY㯼Kkvl?G?uogSq\"Qf.-NuȠf+ %5yzy$[sLIЖPJjf1d&ol|ʺt@ul#b!2bTn驻;yv#!a'D_+I7.:ʊc} 8fÿWA)BqކF{ |21 3`h#X@ +T"J,Ƌ*{cg[r)<,iY!%z+'|5bT LMS_7m^?v_`%&"mamyQኯ[6Am+GkIp)$7ׂj*4h}//[j'bܯM]T1t#&phgMI >L痟 _mFͅ-!9k3Pm6hTtmK!Xyئuh^K=6o[6X5賑pձ5 〵`Zk S#N&b1!0'}b9fҐ=Ì&Rܵ#k}%`B5^$22FxcR*@"kGbJ[+6IahX5 $#&%Z$ifD/q09=Lk:AӾIt+ȞI.hfw HY?.h᪺h,vV:ok!.+QK_9.p_f@Ws?QAۻd,6y63۲d;lCk,o}Zb+k AeMt&Yvth.a.G=]K|!dAD =[MwɜUZr,@R6ws1РH1Yp$G#a_$֏D~vkA;^nR7/ gkfQLLIz o (A6`$rC,i^f"PZ"mg WMՈ/۔0$7T)q|!r q[3V{Mi,h#jxx4=CDA5:r,CD`6g8*[-tPzT[Cw-qMx~IЛy'O'pM@! vSղFG`<5BLD>,aH1Ñ)kp=")ؕ ]0yLt nM4|>GxBI7'89b'!YF}0t$~rH 7̥< :􂸼#? $D^c80SSCs$S!U R2u΍0,thF=!/l{zKR[?;QhRҙ;c2Qwh,[r2;wYAWLؕ ɒ+qn]y`Y~>Dpr O&pqu΅B+ꉭIF9-"K>bEdxjyq5T/#Cߘ`6$bArވ '&2ꞨXUBJ%QY:QwyP&' $4\\*G-0@ɴA(ܨM (4z9 PWiAyOVBFt=2B9*Y!vdNeV}wt P8qyG24!!VܣVPh889k3n ;wU@(8=\Yn+9cvi#*θ#zuIC&5Ѻa/|ᓩz`R<>zPҐ(5:t Т"&5;LptJCI[%Tqکf"Ig=L\; JPݰEBԩ'L|rYԣ_7g`Rb.k Z`A=}t8,bL"BɨCIp:ԥv<Jb71]33EIFI-AYKMI `"V&vaengI7 OkZ:PJVZE.50qeD>вIӚ mXudU%"f k tRmIU'E,NpgtJ`b:Dy\έU$CI0H2*j; hngia\Ѣ$J F5sp:iPkft( l&uf&kmzgLBr#NLjY4*_]tNBw4=DinDd[jv^{=Yt@_ә!$қi$|=Um%%BbT䳖NPJPx!IU  Ī?EwLn_Yar}}B2 K}AeK5Ŏ8 B$n4NZh> Ip>WGA)\yIp]){^;V^%JR!My8meci/1np߲fr"Vm[b{M^wf剨CpC_J5}3/8TRZb@yӑDaQsI!wdqc>%~.-cۏg UO}IW?:*z|E9rA-E֪ﱯ_e/qeMڪ'*y'9yOԡ/ץD<ʓՆN1NaNNNN!N# G: 12UՌQ#:lll򞕊g#,* s%1q=* 7W\/ĨbN}IyJ XyJ'WUO(@%+@œz?5ԩ&?J{XbVuo (edhE>^IyK^S~z¡3C'`/rW3lBٲK~K?Xܥ~s7L鯊⃭A<@d5]RBڧSf2|k"^?_z<-ajyoshimi-2.3.5.1/banks/Cormi_Sound/0146-Ancestrale.xiz000066400000000000000000000101601506652756400221030ustar00rootroot00000000000000]rF}WhHIb$u.}AA$$!!.V>=$̜0\w?|^^,}s%t'O;wg^}5fEHINnf;~%N/7*Q*ϗa> Euw"~'O,$֋΁TXYۡ_]\ί.o0 t~}g|z&sʣ8$o ~rmjǷz|3Mnn7\E<]zպ"h( $/"J],͉(F϶MJ'Ç]p6۰%MV__L.MsKƈ~tEΣ7[8'iVDy)@|9l&4XO:%4РR%lfi|squy~"V|IM^fSor^=yB}R;9s l9ڶ: v=oCo{nT[};2lÖG;enب-=/[ܖ ~lh+ 2p~wj:=z%$+j%{S `^ru,Lf<>ųvl&IȹG^K4Oqա5{&|1"%/tXx)fĘ|E!nؖ"i}ra*/lBDq98++Q3hGi8F#*]O; :dݍJ7 tn,=~pOFHx~0ƒgZЊLW-9r?E;rE:`4B[[7“:yvoWgTiXDOiV'044تHjIB5  ߶m6I5G%PZxOQ5֚"y\YҖpi{21[`O3Ї'^U@n"n&JQLʟ4|9$kxt-3Kt\}9g VKJdv@= \\t~w26"Q[luc(b5/bR.QWl54ӧ5\ոjjҮ1Z7ؖ`Rz&Jaz^wSDK{ ۓ"F*Tz2L@ڔ"6Qge55TVtJ~O¸WG{7FcL J76^7m-O5TI0U mjc)qgᲈ &N<5CaZs{(ڦ0Fd-el)q-_x(Ur|ybI9:{8[FQMG"d[8qoG/ 3h&E8]iR ez}u~yg+~i?d4m$m5ZY8vQnh rJx(Һ8mTCTZY~r6-wF5C8'6dX$Lh[>//}fnsxJ7M %sϸaCa5o\G LegF06@q$;#I5{l2K5OM487ItwF;<12,nj-]5Q:e 6b&+3Xg,1O߮7qad ĜV6i)3=X!ɨ`2O4tNZN?칏1yc-r8Z-W{H΋P TqS ]Hzǹm;C ps1WqV_<1O )@2@Oƅ7 ̜y ؕI` yf65s+SmY9jeXh& Tptn Ɵ 'c)xGaɽ2'psʀ=71F(94n[9zQ Jy wZf-x!Ի M\y#;{mNx'^&V4!k<.:ͣKnk#k<5K2cw[P#|'QZ|獲N%*K.P" ዇a0kl j56jP/l?=y(OVkk-]y9J{(O69JuQeՊ䓹R<5(S?OKC.#xU1ٝ@Q_{'wZazʍsVBk\ rYHFQ=P[PE`r xZPF9[Aek-6k-F6* [%Tpy5F\.7nVPyJܹ仿}1ZP"'k `F5 s*A jTwSfyꝰJ-JXD DrU}FJqݹs^oA%>kjj[8؀'Ge<;l8(nD]-G6Q;X, kGί.'θ3O2\|z@qQ/|T=`3|>!@s5&zЂ`5z鑳f>œ8׆صQ^`) ҁkHkû,eՋ4/^`^΁ WI|TI-$j o%f|TIhAK* -vetڨBʯ^wHUZP5c cb[bMxwO7=WkqO:{ݤP BD AnA2kE7<Vf$Z-fzٴR96Pqх>~3qBbªFOm9PajY]=L- {ZV{0,ajYԲW1zkޣDVcL6Ԣl'gg;5\ӛkn[)2.K;âufTw5}kTw68] 8P~3?2J9 |yoshimi-2.3.5.1/banks/Cormi_Sound/0147-Attesa.xiz000066400000000000000000000075071506652756400212570ustar00rootroot00000000000000][s۶~ϯѻ+QuIґeii,r (Dꐔן R%f^ZSv~{y B>4_Z[K׻иON_?{_OpM<]ڑ N7~nO\<4ޱ]@pa\-"ѵnx܍{6q9at20q6ߘ=Ih6`r8^௭Xw>1څFlw 'MBCmOH7qor<_$旅߬t-x(n6H?nd XFnx0]nS,gr;:WQ`Լ/iNǀڛr.JЁSMZ|7{YTxZ:v+w;Inl.l;uuC2"N pG8xý1Vq蕓h2fS_kuU8vz#msK=1@bNF7 lNJy5Ya,roq3Ŵh-ʩD!NJgjN>H 1jgҡ\4 hi HZvl+͢cw?mQ0iĴgXSjt#]5эft'%S 򑫤TC\L iQ;J:n*҉1[go"fzz"ǞyY"ZO애(7ԧI&91!|?/gpzB\NP_Y'腣b(%$XɷLUp%j$w͸[ -pB@vc@ảy&z0hpߴc&3%l*j+;q W9\׫ŀh^oyĜ0CE[*,]/&A;tI'Z%CG3ƚcN]1$bT5l9ɼ:ԠS o"|yȬxk #i@'mk5ZNIRN:KAN"%58`.ךVt~C4ğ8.ftΚm/tJ<[tmmNZĂhDmoh#@]u:DF7Rl}jhf]Ԇeqˣj\xǕOP5"LB%8<\'FE3Qa\+DV#]Ɋa_ EZI$Sw?Y&*{}w~j̽4u8гS= `ԑŗF&5S0EwjOAJX)%SrV)8Ê)jGt7N|MZN6`RoWNlž0 7NQ; &s|mȿw^v3EM( iS:5mNﴇD|Ũu0D?TCMˤȊ&~5W@KEPu£{VL{ΪuZ†bGwXqIP}Qw^I@xg؉2v7S&9) T9<6$ǼJ5qQ>N{O3kDF @:sUUr#> )&HW$b֔kX}JZl:_^gsܚǗ`B<뙔<^.㪺'JwjtF]Jj+NRj@/@:K_P3ϙ Jd~l+d2IU06]\9*W0=$dP\aKj!lHUOF+xsWpbe ~i QBRniQB5u~i\~}7 _k֔>%wQ~1% Y8Q̭1+Y Jߟ[zd5/%r_ϩt(Zql~b;kc#[8udr! ˛ӥWyoshimi-2.3.5.1/banks/Cormi_Sound/0148-vento.xiz000066400000000000000000000064311506652756400211650ustar00rootroot00000000000000r۶=_wW,L"KSO};M_8Hl$R_$H\$_%1/{ߏ>{/08l[[^0]?=l\Ow_?}I`WI[S'6Kol;̉N|8.ͲK+'-O(5v0ʁ؈ŗlĽ6Llz~y:>>?Ndp wŏArgobυ; |}vn>7¬8ϣ}1N'Wt+^oçfFgiIr_ok/ N `b͹1z!S@>P9 =.߇8trvMu6Ӎ!t~d)dtG5ċ}<\=۟b\MfaX^ u.L^~ IP7} p"2ɣ [A :?8hVzl+/fK|nΒ9ZlPͣbv۷QYArb/"<5e  |BrC !01l3@O`{£"kGsbwt0 G&1l\ ؔg>.7oGj7 PK8p,k7"SnAmx%4$ 3GF3Hђ}5uCk|6uM;Bm2 f|ÈW9/3+O/'XhK6#L>"wЉb.Ac.=BI;b3}r*gGSQy9C ܒcJRb񖤝> zOvMPfJG죞AoYF#"5"ֽ5CXl|}2q(P(|+C?N3w64ɖ dg$%?Uip9 B2;F̫Cib{[-/nTRN'0N,j`>T@Et#HE$(IDp^&|F "$ˑPx%/'WgD{TV\Is BM`84d TȻvg/6խ"pD)?$aX! kSN+}Pm!j3R%"dF,DyN0+( (҈oKs0U%XڍD"t2(kf$+ 8+DR ={\;TAF/_ztW,4+B!4#211i",6KINnתH;b ځG!mLԟ7޳;G j>QjU-8w<[(DΉIj* Gi%h RVYo Lx3"X'8N|#:hK1]9.i,Z0Y=!.Oώ#!X[\PboSN#:94Mhw3.vrxgH w$}Ʌ!6 %8 ]`4X=(lNnʌ31+)#5Xç4 (tDpR-tIy]-/aɇm!2 Rە"ȥd/!(^j}侁Q&sZT1TVb$̴x. h;=?9]S%=%"=RE26d|?0*xesDfs#)G_Wm9aF?s?4d}ffEU?2 1+6FΝ+qzZW(d5̖a*} e-lbDh&1nV/f1L!/֡UE`j;WƀƼɘ_ciweHm\#?uM {(ŗ •w{c8~& 2?$5)<bjLtVlLd\fH^(Ik׳Չ2wKHbY:kEy8MZ5?e(n}+#Gn^7qG o>kX㩘ygP+8i>݈7 zQ1yD~<"=zM[4 &M>G I0ϔJb]3 I~FXv\&͔f)L7$A6p0"o5\_/"ik~MNͪr0ԭT#B.RYu۴b\I2$X/$}Cx2M=N߰oMiط&¹v  꾅ԝj#{"L.ݣbo3a1Ie$Iv,gՠ{gLY_C?bpYy e{ZpCLeͤZ [v䂉XE;JxC5cIrƹovZKiQ:? e-*522*̪-UkGh۾eu 캎~~ˮ ͎ѬFEMf]kY]|K~ yox%![wϻ#bH'd|MpPGV )]y  l_Y7F| epW_ItKh+!mWbvT+I|.#m* !I0'C4O]Ncd+Вb_!=jy;I D;2tT c x/Xܫ醞T?M]:DiiG=x9B̅bڥgSv(_ huH{hvZ4Р]WG4裣> dχ{t蹎jyw,awNChJ~1f6kuӇ Q`yoshimi-2.3.5.1/banks/Cormi_Sound/0149-pioggia.xiz000066400000000000000000000050771506652756400214570ustar00rootroot00000000000000[[s۶~ϯ{*Qw(<Ԗ\I>` P/_ 8j:%1X,ޫ=;aUY9:]{U\޾ÿnf˧qȶmS]~O«z.>ҩSh)ִ6[٥~&^Sܽ^<8(]ST5A$W̿d+dz;ߏ~:Аt\G77ѫH96hLAċO?L_(4Zh>/E6qO_޵]b`JZ\I7v98!q(ヵ*٢8kei   A 9ѷMԶ3+?+΅7&rx?.q_o37 ;ǃl.~W$ʠVxve`Ϭ?k@_N p vz3b$ݒu(el@.#[AmB[s "d\d~V,ǧ+Oͦ>~) Wn_ j&q8 AwYb(YJzXjn;*d4]br@㎓s+! n/r&2lND |~j#@G$LHe4M'a>܍5xhȭ$kЗ*p 6+'^< C;h9aB.³nR40TS=l{7ߙ$ Thl䳔ّF|$4Cvalq=0>5ӭn-f+_%3b5tB& :#%1A`VAF;;e/kSVSVi>;$|#*>~䧐!qYP"RDK2C1 *u -CMCJ2'Ǜҹs-d2O,HH=xVj{e˂N= zk7~%`H%Bzd6dlaH@׵#0q2X(]p>R2+ݑ$frul<]6"M悩ad4%SigZcSls}&2ě[+ŝ o/:\7ٟ]*_R;L|#V"Ɓqe\h[%[s}Dz^ϡfx&r~;.y_n@3v]|S#U&Ze%4mp65ބ ]mMn8}T6 J_WA!pZ"bx$  4pUet*-[V40&d0]b#NGEc|r]ks8%La2N淳ol|C^FthEy[\{XŻe4Ѧ¬DrWrz6S"ݒG&^qHy*Dnd-$ ӥdy]jJFB j U9܂)݀CGJՙ"7)qo[FLO^ X%33}|3cO(5#4xMDhf4/׎hJD4Y++ԭ܄њzAX- &MQ"ePx}͡/:!͗o?E;sq4n1q_Fq#&ft>oflЌNǼēflq|9p . DJ \~4KC!w4!O ,ǣ!8CЍbJ Hba@I VRD=+jUf916l] ^l氃EHc!3 Srkpl C\^On ,Ū5xjMcH4rlFD; 4eTDIvMs`rԯDUOPRj>"bu o n.bly7gA^{0;t=8s86%Y'z_s%6#W`R|sÞZoexPd* WK_8lʉ F{aurCV!zO3nr璀/+wYR:l1CzJ+ƅF)l`nF:.. 2B! )bGq]qȸGPI=M1,sWFs'RlUF0 g),YbȐr?z6,uLl[<_[ۘLշdGJ։`"ɒ SLK2C`}No$fl%kw?:dIzռ:dCXx1BPLj5-&ʣoD(W<p9c/2PBa B%BFȚJӤ،XFCYT@Bkǖ0үbQe9ʔBj[Q`!_fqu v<*ek ]+t,>gf)dtύ֏2zT憌U NygjjVfqwc* Fa)?ޤdμDve u_qF5굆Ötq[N5@rX(uŮ M6`$mq"Ol7ieFKHrK4nTJ689GV-6UEjdWdgPTd@;4QgvJIBV߽<"Si}zRy76OY<16Ac; [ysuZwP *%TJw Z=Ǒtmnu=WΨPfJ;9Jg'vA-9JILGmcqB݉w7=nG?pa^&T)1K״Q M]l1tG*;3,AZ [K\eaX_' _w^~Ji["}&`Ȍ hz5%UD9~D?>*cHSyu,mmtqG!{Yݗ_KgŔwa/6ԧ C5Oc-z g`-~X{g`-G;"?B̼vΨϞO3jsFtA' ԍz|dM\xfۦgЭ\CD{.Sߪ B3*u&|\|B/Y'n.+<>RbqXY&&h O/ӶiX5(m 'wM!bWx#-P| G hQ+^n+*sab U߿w*bWs5+;ZJԣ`!U.N֏?;ҳXk W F冇#Ayoshimi-2.3.5.1/banks/Cormi_Sound/0151-Memory.xiz000066400000000000000000000053351506652756400212760ustar00rootroot00000000000000[s8}7UbRKmY w72XM&_-[$lC.Ge&NԖ~Ϋ=0rnҬר?.o?nfOq;vlrw_AxUogO:w*}ԎvmgkD[wD#4}ŵkzM'::d6vHVA|{G꣛[rAċǏ##uCh1&~\ȝBvxf\J~vct= GqxQ-:FDfC(?@ ȹ m'=]&rx?.}?ހf~0]?4?iRu4rj$tm{B./>i Yt3I $y!v {C4]A ed0 B]2YksUo25)핧T{ý触RgzNW !Q!q aUU6)ɿeF" Y|./R#'E8$v |wMvgHk~6\3#mvOeH՗ǭGC_1,C̵ۯP)x?}m"UFw 6*> ^x`3!{'@Z@q9] m v|q/o ! `ʓ|^v#ʼnT!?7y1w& 8rϽxm G;x ?rT<;B}.J9!3ٲmda2)boR#KYPvU#M+6@? $ҶEY`ci`+fE@Y@xI0%JV#B]\ L2 v W@f D[ee~!_%׏4T\*{aN#Pb|)$dz7xWyrHKY a49#_{i0N6LS(:1ٸw>YAgiI;ȸ7@{QjO.YR4ߪgp&̅Ȇb6M uCl12=p]MfFTJ&\Θ8j'͗EBo(! J((֓TotRbCBUC?VUؐB }j2%{2IRtYJ{adbj%d=QZ2*nCݹi;kY4 QѤԝwe}S}|ԙ|ߺ}Ytem.sK%=e3߽H*iN欀nlǷ%C1CJO"x:ɇeT>14X8L8_|2_MĕN:#|INa |-^M4' M/*k?= 3Vǽᚷ Qf%WZ:4Cף;1w.Tvl<0Ux`㎄%He(=nsS7?wĉ}Rb@[lSb9|?yoshimi-2.3.5.1/banks/Cormi_Sound/0152-Memory2.xiz000066400000000000000000000046531506652756400213630ustar00rootroot00000000000000[[s~_AxI*Tlps|^4eDtF͈TR/VOu(~yzWFnԍzvMi9çfo:"YwX+?]m?ު'Ϟt"+7Ԋl6cյڣxAqU.dzQ( -L\Hx]C'l`.')B [[zS7oHQ,APO ?:{eYbD͹0ZƭFxrn+Dݘ1FdGCQ&[ꃷ.,"t6zGG P ( qn"[y5pm.n8WP]5.tɏ0sǰ@Ao}jd+ eP170cUve^ }qMmxhmcwg.q~G@0pHƯ]Ok|toa8\31; hm!ي pO\P6Lԛ, KqG}k塈+BsnpnXy@>u(85ZmcReKduRCJ&Ab5J8zp,:Pm*-$wo6P7:VX+9M'C8'# ++D  ;3D5yCg' <7N[#.28g~%UkX 1*r$I1)X޺p 8f^Iz9,ķx CnE`Y=֯l]87*y$X O){9%Yz$X;GŊc& dHGąQ3:t@\jEAHvS r-$X[> Px@: LxrvpU/! =ZTbF&k7Dys]LuVR"K9E)-uoCeQlydmCsZy*~m`3JYUd3uJ:SwZwW93uwuݽ/ߍϲ&O!oD $R+o@U^7ʀBYvL8u4AmFWHQ PT&gd!h|MWx1f!OC \!O5Bl;Bg|xߟY j~t,*Ǖpشk!D&, ~rx0@ {6(;[oTfBrYSJ+ۍ X?T^z֌MK+2_P3V!sb[4v/QQ5 n53+-jcD. %צB*;L8/@eSRG1!{OaosFu7&qD)ҁdXJqV#R;r2ͺaOd[*\ }…kl*oTl76Ӊ<O\׭nGd;̇ M^k0hMCu{{2:yYyUr?0Q[G,="E[DjԪYEvvYsX;"vptT1[m_3@ߟFsՍ}%BP]ϔ7l񍘴+ep^G4&hƉ/عo ,lVRIRswlD,VQ## vM񷇭(ёgdNM-ic=;2FtJQmDi2/xﴓlQ5(*$XMcd}agL~=rc{c d9tnNfoYUzp//X ^t?R)&/IGGGG߹~yݻԭ6x7>n~8l{'iDgO9{[uNюpCkMD_i}ÝwD#~4<F[Q/::M拇j:4 kwkݳ.}Y~X U<jXgB+;CSeRZb_'bX@/xh]1$3PZ\u{`etx0.%68)В)=e^y L4DAq1Mf)w! Djt7jDi14܎do.@eہO àŌؠFlMU\8=I.\E}Tֈ'q釦Yڎ[c+Ac+2<66&"*ή$2UaB&/*p4Iu"mT/JY%JY%~ >ι$D)fcnN\Phty0-N aZ4nj~=9iN-Ra0 M١dRىԦDGӒv!)շ-HΦ[ Ohr}V҄lv҆l^|1^g٭fj65qST NToJY)"x,0^*TR]>c)h)3rqR1m7ѢDH7DEC_9Bi=t'}Vh-:K?Vxo5DbJP,ݡ5h,KH*KkAߴ =iY6B1,wS?,G,Rڅм*_Mɐ99 w㑿w [O9g[P!S^PL5KH~t^jtO*:|@pݑZCCl,utF.,;ڐс351DS`w-ψg*I&X?[;ԐQO-þ`)L;I_fwO&\5MWd(t&DŘhۤg *y)|CRbsH_oCA:yoshimi-2.3.5.1/banks/Cormi_Sound/0155-contorno.xiz000066400000000000000000000100531506652756400216640ustar00rootroot00000000000000]r6}}"We&rŵڞT&/,Zlf$RKREt=u^vG 6~i>z 4^(2?t>ߞt~\~͖˛o~?սɇῄey']~ӅtЏݺK>}Yh?͓(Hc ]:Ge!b˾~:zvqzy}>=mĻQoIe. c_sUK|YS:f][?nzv>_.M =)tFUBaYImxafnD0[(,}NU蚀Ja9Jx|_W_. ENjʻT]^>_ 2ֺqGYD\|<E|t'Y‹xæ5|w: _yT(F+l=36>^9[M .֐[$q|K`\iYPwv;?? :=j*n?iVE7qonvPa} Pqu¥AX(I5}zQPn\h pI.sfWn?c-]ʸ~mcsF|Hho@DU]$ CUll\$-K(1XNj0{`S(#*cfrձŃ {rY(L,[UƲ5h ؈dGO'ԻOV;|?]^ J@MxG`AdT1e L 쇜JB0✈[I*NKuড়&'(dh!J3ouq/2<;̟H8OtkǶyXmv4=x#Xuv?~pgz7¸$~y ce?L]*ޟ}4gb%QG?$"clrUI^Y[a:v֮5tMkX2X2\$E% 3MA:8^y~qt^.iL$ ZIgWuƾL.@Th!yo_\+JZ'핮ꤽ`i偢~gȖD9 ~4WlUD}srNrZET[Qe%é3qGw"CǙ8=ڴO{'^REd& &CyӞ7kgWbӹj^.*餑oS:,,Qm"JgnOGdl{팗%+?jR$ZO^CZ?g{Muo[}/0_<ιooƙB9i9=<:[cA&kͱNNԭizX77S$RxY0ח ^it:U|ޛ;2F19Ia2$4XK21 WN.,GqI59M8fQ m63jx]@@B~ָ>4hh0Wg#lcC3|yjĎXvBcK;A9)-bfn 9F;dk!m#r8n ?#9Bhd hjƸFzlƸFm5׊kpз\+QQq-p5)#eDOVFSڐҸ}i#DS  C"ƌ #,s  $+CF;8FMEXK3?I0&H0&ˊCy0QF.°Ҧ50%nj1Zg8mb># h000# h00r1`A@p}`a\hc%IFH001c #6Z|楢Zc #H00lð108.FƘt~ Q}0lB °)5才 c0lJymg>Nv`1h4vјUI1FcV%z+6NtؑF[q 6͸6EFwDzNQhk'tجӳӳӳ"7;-Vp+ӳp\l;`&p˪u;9vâScߏ:İMgD/.1(\DW4r>s˵1,*~wplh јJ1;Fc(,QEâ c(h0n+am[qo548@Ǎm|k\15r Ahkm\6 r P<`R )ϋ `TeDzPhDE k 1. {pmHr B=6"wZy`ft 8_`t@n3,l /u@YJQU+2uN!~o0H`!ДĪ1ry5ڝ17h46Fc.y@H4L5,qny@ 4ƸF1hk4F 4hk4ڊkh$ ؗ P4؆a؇t6 t6 t6 Âbtt|?)Bحnȱ2߈wHW}@PfBv趱PA4/5@#BuPyž!`_r! YF(ǰPr@*9B;ɞcRĜc!tPAY5Iق j9pyÂs8o݅UA#A1-JZKy'^ۧ35$zUE!|J_<혒x(T}[HjDJq%IQ1K,G48Pu db5!H4y=!&OPfiU2i&,ŷaAHX*^MyqyG}Ն,WI-(ݗB`Sb(}SyOvk,$tH}xV2/,Xhs"RKtͳ&+I岐yʙ!X"k ﳅj4WcYXd4 /Cu^.ɻS.O]ED,(D(D,/0 8;fijG+~ nYcK\;!6n)}&L.4YN⾼oBQZg%ywt*y[|~Q<[P󶯣hy~yxB$CX%^ RF9"+ϵ2{ژ't2;'͑B9=d`HK@xy@xy@x @+xqD,<2.? SM"V݊g!nvUg[q]խxݮVoWuyvjWuy>y_q?Vy^߯# `ؓ]ؚΏou G~to麝.TՔ3~Q&3]լeʿ}/s7:>_?Gfwwyoshimi-2.3.5.1/banks/Cormi_Sound/0156-fantasia.xiz000066400000000000000000000047301506652756400216170ustar00rootroot00000000000000[_sOAyOM`R &{%K eo:OkOďOufB7Sq>à]v1GS ?.(To?_"MW&.Mܔ4=mP%+_H~? %izZI|ZXv}>_E٧z6مl40xx+C߶uN0??p䚾>pҹ)SNȆ4ޮY"\XDr\K)wKm%].\ؼE5x. `럗4Liӏ"Ufp~F(NYњ5iJun \i-@# ݹבN_-'s(IT-1rT|p_=UXHQ[b N6{w?$_.Ӻ.Z\B)J-꼁-KDl42{)YB+wɚ>H`+?e0v?G7<ȿ/EY|%!+nl/xP6 'nݩ`C~3NS(CvwhxsnӐbOل^INCАl"nLC/ZCB mIW&^RvrlB4G‚gOtҞp%aC2fA,|<-H! i-zO,ut-e3f4Q)+K?dP -9iKFSV)T)'`c=֧ VEk_ l88ȞK%9APiYH.MsWTX% 3ez)l]BB ԺMcC͸2yA4 pl6W-ra2I$&K?(RnRD@cZLPPfYlRhѦ#^ UjYAЮUQ2Oɸ?0ekC_ʇl>".lb@qj=S2"=ToD*X:"jIL8ĀHg ϵ0Su@VF@lG|ΦȨ,'Gqnܒqd9X -LU`\cw:cGg ,K} k-&̀ Z3fZ;~m T772.+Tn?x4[Y׭LD݀|?^z{na=VE)@9JVNu#ـ$ZQ{,W8 w0 [U54\;@w^!R!Kwq7[([W jDZ8m!!IX\ q4$+RyhYIHη͆Gif9֕~"&v:Ӆ3[1Q{bbQ'NRdQ[(WGM|ܤ ]DO{P| DcQ:;q("Lf{aj SCWɴ ^E!#I6Qa+bHm-3l-a#kDY˗qg|\Wwg{>{0yh"j}Ft?(`p8Z>ٿΘuDm6mPHXW0 ׵k&y$ّxm^ e n=POѺ غ Y_XuA,Ei=N4rh` с  `csow=OLuZNuG۳.vՁg0tzg^FW"@1̥Z{q';˽KOC OW/_59yoshimi-2.3.5.1/banks/Cormi_Sound/0157-nostalgia.xiz000066400000000000000000000056671506652756400220250ustar00rootroot00000000000000]s8}~,o&6,˽ 69d۲%KrK;fvj[þ{7UzxkvMq9ثçΆ˧Q?m+oO ǃTUȗV:E;yjk2[Gֳky봯~xÝ{p?24 <'*CkG ;_U t2d6ߎV`|_sSކ^3Oc_=Za**)tM`12h9/)Ւfi~w_A䄮x_CwAuw.LrH %`Í%j2@sW\Z'-dzV{ARW\8QCHL]꼦 B0ݬԅg/h TV6T3{J K b._t ^3= ̓5%C,T~2`e0M'Cb{ؿ5ݦܦKFٯPQcz2q_6^AoIWLL7iɽ&[jDO8|B`g}n dLD`y|/݌}sh% I #ڧ|M9=U|#{ӻ90&"GJ`hώ2'Zo`&cnt`b$XȤQi:ɚ[q]ur\\c F$žВ ҎMIc=M5b֔)||h:|BDT@egEẹ5 MDq}k B@fG 1p,pb$N}S<{ h$ %AZtdrWYm"19&HaLȱ d;j1"\ِ=̘KkO ɕW]US#*Q (7MPVWjsj\-v#EB{t$6Y933`n)%U [c!I(W @ ᴏu)ܷO{+qg)`CʚP[3\"]/rRln^4 /"t#pg7YƉpɝD }aٜ5d#Rml$ ##Wz,mCEm` ;uʋ`M$(Ü^̣Ẉ tgl _?}@q3S IoqSc*#HM$qehIY# \k`3`G`o1R 2 ln@p`1rAL:XUe kwX,Lj`k)SQxNRiĝSay/\ )JwG_iH ݽD ~jQLP 6ƛs#և} EsȨUԡKB:OTPq>Z̦PQ1fnfw͇b{us ataP<:0:H0Cs&B̉\q'!䡃jpK| jN3W8[u!"`M o (C(iGbvq! 5h \ N2 7֬{JEIͺf[Ԭph/fmhuṋ;snmΆ6uNouss0Z \c ER8ÇJQ^mo3\YLkAbB:48qmgocܷ"I9a{xiz#oPG(÷I기mwo\EENQUhڡ* %UYS,ďtCI4*n7۶ Dݩ*w,kt F1)ci ҄ ۛ1 -_ǂXr,Y9+dUfEqV 0Ф*EUkhn;pToIa S&?2#nϒtX믅<Piه8C 8xNN{ڏ~wD53ꪑ[ez$;MB6rH!"S.!R ;5.z͸IUQ"*6*  JIEì۽P*8!;!^a^L O-31qf21IƔ:vvokpk0KN: MMhf L mpK,Ь3d~?ҏt$2H'ە9QL 5@<|T[/uts5surq _5k^5k^ue+cbWH"<|Unw̖ǣᒼg?J~23)B]?X!4xNWX-̷~hLx>e7]*'h^׵s=写YՈzL_\إLT/̴/1!6rN(UV$ѼԲ\Te,U,G*K.,fY6rU\m* 0VY ,cMeG MÓ3/SWG+ĝ3ё.I=Uyk^襣>*#yFN *OfKr셬jmR*X#' y5rkMX9I`ैI)sj*ˑW6'3G^ٸRQyşI[)lA绤9AR|TAs)P=?~}#&;xs)?|$cO]WF5*Gyoshimi-2.3.5.1/banks/Cormi_Sound/0158-patetico.xiz000066400000000000000000000103531506652756400216410ustar00rootroot00000000000000][s6~=H],4騶<4vv7¡%f+ZrH w(+Mwӗ8x;xÏ(4yvdmQwۏWӃ='f}w7o͟tooiw_D|Q|rVOq\E经i/7rdAfIႶ^tz튽m|r{vyAZYp$\Fo;9)uibM&i|'(ئFir3 &דfxe9X8 Zܥ7UA\Dr /`ƇOi<-7^N~h^#/E H\>c-$! gSjL?O//Ύґ_;ۊ5頹,Z}>,ǡ9W2 ;νQmf8uK9Yr]}٫Nίޟ~81 l2YD֯DjʓzJdOc0 Vi%J" y$nX9Sc Z(EI(b@l>"(.'=I' knDޠJ7[N Y O^JxnXtjƝzh3^O08h /g @AAT8;aAoQ3> X'5zGؐYfy4FzW*B4|E!ycG<{nǢ976vh37IkVtGS׉}`䘀+2u,PGOz{ x ^V33  iR1"b=mb]76F4ϱ9" g4Y)63lEjJ=rUWE.WX+-i{ўqnVFv+nmMZ#ڥD7Mw&^f!];q׺[`[qhR':=UdWd*Jq77ޑ9(40TvR?}`amz\]_xw2Xeߑ+RcŮH*]S9XEL%j",L`r`B5mϘV7ږR|6Ja$G]4,(.%co:FUfwȀlrNf"Ya)G`6"-Ι:}M͵*E OfyIi{}$گ>SD>c:<~|J Mn.s@\w Q`}({\Q^$l%hE⥆8%m1n[}kWI0}mj})᪈ &N)4leN)Fk!֟{顜F64r j1/G5A&i}H5~ǹAGΥ}dss_o-G{(MbrqlIB:=C^8[|tϨE7ko؄S.)…EL1Ϣ@`W0aa%yT,|0VHqrms@R6{D c$zaCΕqjyT,g[I,n lI` M- a2f@RQ+:m# C:'K/7Ĝ2"n!'9nxT !2"OӞC#N{R g*9 3\iqs aȚ`lAY3W2Nbک;Fams<[3+#OU#c LV!'1p78M2cs"q{t/ݚ%F:eBaag0F:"f7g.ʈk#WEYWNx]36g;iKhA\\q}<2ḙ}P>45^M:)5C%+/%t-%D?/(O H P?n}LGL>KQ^XcZe驘Qʿ5k-ZPXnkG1S;ir'7JS~[56`P[P5Th6ʞJl̃5**sC򂢇B5T x B*<ٗq 5_Cy Q@ j`C >%BE)jzyCegBus\CX% cUT7PmnQ0ύs_c>sTȶsύ*f {1T#`-xH ޒWO=T%cAT&8bsMUVo.l~*xnyϽ3/5-0+%\-^[AT0`Fzbd։=DqojG~ U <0F5$T~nnm s>]~yuGui0}T7`s>1㣺ݐxjTe |& 8Qـˏj1 X~OrFK'KGF8P@6/OXrA2(rĨpDžj>A6QkkCCoMz=tqFyVZ{]Go QjR=2ԨV%T+hARC X`5Z jZP#ƚ@Q5z{}nT+h6s kV`[[8ClpuysVw._ZpXzf81Qu.7{ QuJ76y#Z3N_?LG-EjGhZ*J${o:}5r̦vpUM: R ^-YvMZKKV:=n&J Z'qEt5{R֓iM]M$n&sѓo-kFz, Vu+.M6ߌN}`zp}imf;;\ {GXXuL\$x]fԧ6Q/FE B8~Y cZv^ܧLmkEniibҵOeqQi"|̶04)Oji44UZ#oq{9&(L$weWh6\wV Oh3g^Gv BF6, e-& :jhuM_+6M *kb2{#(KϟZ `QٺKwlvO"Ͱ-;[ѿailǎ2j|n -U}N]c ֮u'N_or%d "f|&@KW!k4d1ʐJ6dl{UҠP!o>~2kKy_KϢuY6v^E }\ًY44Ŷq/m?6Mxq矾 ~p>b|zwvZ^ajYxeWZ^ajY{WZ^akX]z}DV^c_@&jQWhʮhuaC˸,Z ʫURu]nPrcp] 8P~2?'ǀ|{yoshimi-2.3.5.1/banks/Cormi_Sound/0159-Destino.xiz000066400000000000000000000172211506652756400214400ustar00rootroot00000000000000]YsƲ~ϯջC;$:-yAA$$!! $t8,__Qc,~>|~ӻOv0χxoOywޟ1%/D"olFlD/'W7Krh~z Y&:g0co__?)zDݐ'v2ףn|s<.YO L-RhWA/bw zH5"|l6xGk>04栵ocl_`ʶ"xyCT痷w7˻l?n`ð> 8Ff;"XMhq`j<y?-%Ky8=stj)wζzpeͦ(=mg-ryCy"(|dL9W~=̱ӹX'B„svB/u} 4pZ}b?I$I^ŹUXqo?]h 8p+vA:wgFyHo ں^.#~r:Xy,ZT }9k9%f=B'!m al3^y4 W>y,6iB1*7s'jk]g%zDgTX6e:qEQL焋,vVz)~l:|Ǘ?^]}1 `B*1m!M  8hO6|ԟ+{1gQӍ:BndC::p_ifg4|tC4%Tn$!2i)s\0 o8NT(_?g?`/(V0֖ {4'-8v3H6_%YdX& n1rk^@8b9|g ^k,wϽ]0 `DhF!C_k. a#6|& ':i 5y7UJKm[7.Ƙ nżv;cb^*&qDiQwV TxBA蜖A Cx}nBt*+Q?B;tH$]y*5 |r$& rWtuêlƔKh/SMҸ@B=C qbC&pY(I0h2MMVRUEChI7,5]޹`hZ&8n<>3ի s5)5 SS0MNv#f cW?rKe$;L6_+>pXK;q2TF6m6[. I}r ` :Be 8]!8t-hb'=ۂD>%ejAZls )R9CT-j!n=.SmkxIC̎qZA %M>v5c!ʒ4pr@(a!f\*QʒP7;JS&u0ڪ ( C=`^iEaҰxN3a &(b(nv Άx(84@!{(kR ;uyR0ђk׌hkvꦮQ>aͶIe|R3}IN D,JP(DdiCnu !qYNI;QNԕxr\?FttTw L>ֱa4E'|5MPC PS[(@ Vk ^@(@M e:[>6(@MuP9{ndzZDa0uޓKe0M({}s C)]DܓN SCсa':P2:lUYV^nIWnIUʞe>@ll%VX$kd2ފZpV.Jc"d^uX_mM4"ml 9xL,Un>ěy$.ѶTonVERyչ}-D4V{ -`pY{W;Wt(ΗRsɝkRs+Op%V0w!GQ^fe+vg4Kstq (nF wc/E2d5J %T=4̒g.M: E- ٗh^pY*b]ᚂ/<ɫa,VˠX&|hkd q!A%½3gʟ"Z~R+ վJߗ* :K\ B\JDa7*%XȰRJ->(™珑 Hcr)I(2ŮQ y#@@& |̳l 1odro]h]m轢 pɾYrT!V VrnUV\C 2*\U7* ^&QQ!JQAf0X?fQO o爫 1@q/͎6ވsU %M̳*Z}e*EE`Bv`zRbmWaKbDKq2Xa7SE S2mS%YlxsN(aopdXޣ9ȰZ nF\ JAqFs2pcKh n̟_y[JW~BXsnvG5#y}ݑ<D.E.~%'u?1t!D(YC%43((i>>|5"!_%4Md6&0 B` mQZDj] a/M)WxT {mֱ }yf^0 D7WٲJG4ұSF籰b=O{G+cCe_hBbҫ|0ĸdYZV$j%>  .E!H9Q¤7T][(FD :A-[HyyMPQm< ͣ(ͣ?o ev?DOҤcm8cS0fho! 46ΆquiSk潔6x{{# C1&4 ̂aY)!b'|Rw}K!7G4R nݤy&c9rg|?XlS3I&+1()-$Z4ᒨk#AB$;6@lvz{g\5`uj/t i h~%ueM 'TF1UPn%zpE!Y!cSحag T"T0ga*seܚs&hLu`oVpEa+a6ja屷Rck@_`1,IkBZwKG7چ5,1Y62웶\"h ʤ>y[uG K4 ۻ;n|U*U(\Ejfl .8]RA.p]R.];0_z:GExhAǼD:x$/UW&ĕx2ޱqȫo=P,WM7zfDI3%Sߴ`v0LMʰ40:ō/j(R3PKPM9*)T[|]sg^}W?S}Kr)bQrqTMqɈ)]ϝF6m6,%iCTЊ raܓ*N\-@ɷPH~)j (/y!!ؕ;PZ+i55!2wDxH55(/rj 馰bɇ@3pzC&T!bpt9T=T{G09LJQ&!~El 6]7BI T3J$xHqdL( qp9Cԅ?D>-FI;EBI hII=k&H5SITVxIXcP.BRz-Js5)5PbW) J'P@ A8 ' 0f,DIc! 'uP0nXBID9J>vCk$LW\=ʜVЯ ^iEQP'5P;sweOrJS8ixz 'II}&Y7>Ac뉓@Zo(T"q} nafnP'G"IV^5-jO*ִ-p!nIՓyL(s@Ht@2'3LXb=ܴfX ѺV'ֵؓRZ')y0t12ti 'z鲚8R*Q6o@.^5b R[f&&8PX|հfFU&u0v`{ x~X2Wwm3%6'+~Ocڰ磀 ֙u>ʝmfɪ$[Q.8<{~)I~ 7:^\]_擫)W-Z;ڣыm,>}tvg_?֐2>fczt9go7̵pM(;K8oF98zal׎ӥ,| "Y.'`P:H| ODbd%Oਗ਼Lg믗<]ovs:1dۿL?|]K[7&srtǍCY4ב5[ z-}'J&7TXQA{"^ S\gNnsK/]#,t96Bz]ePs:G_>O_ϥZ_"/<̍O U נ˽|,B?Et u xƨʷф)բDg- #%l=x'@"DFlNƒ>)՚ﹶL'Xy ;O5|e2pNa6z`",[.hcœP!vK-vf+[TV`,#sA t%f! b瞗|?\MsKQ;0zQӋTߞ`nhʫ{_ +Β7'qQce7G/'kWˎcw5-Qj\W,Z0z979 ;@fF[SI܂oDžEɱb^^ϖj(.qq=Y8֣e` ʵ}+ f(t7 '`QjtƊt5QFŊZNWpjs<4`|)9>6(19:7F=-a( S\.fQy3 )}&xWھormEέ(1wP jG^] g-@/!ڌ.8{$cA jaqZ vyIc6d+hdeq=E\eYյ,ZtٵqGϢɘ`qkϮ:5ea|n=7PrN%Bs&K6lAHM`Eᷨ C;LHS*\cZР2w.[MgXf ^ [釶K]wr]*S%R0ԋ>w+2ͿLo7V='JvWg΄ȣNkĭ!˼ɦȃޜ)&,d+ C7u$3;*RyI;a;fxgqE<XO:@ ,R=pR8WtLC!Z&Y4|\-MN\~W V%m _HA/EOV Bm-M.ɮJM)5W.mUAva§trFc:꼓HR/u2E[)a|kap=bgD G#gˆ&#Yj撼0$2*5%+!#,8w[K727mMVZ3l%/do__wq`ru$ː R q(K1te i^P$Db˪7 ։<зѫUi,ݴ|FiGM(q#ӎ^\jG̑ڎ1MҾdVFė GK%bG˪ 2{V-$Et⭂vuL^ŠAR\ $(,3Dg~CrF?@yd!.%<<$-vT}*bm.ޞޭꎞzQO{ISsu,VV 7 q4t'vAnr]+ 1C)0jDq֮>fV#긇_>X*`JEi9@"(HzN% .IX#.![dJ~ÌI[hz9025^fp4 =T)٤:@sBb2Wr(E͎ [8^Z5+y >hGޞJ"0yJMȢ uW:bu #V ](u"#b/1##K;{4Na Įi?,#?J2Q}ʗ &ayEe{?M:c? {(~l&a0&fɰqEaW"XmOa7Lwi 53>yqvgABT3֤ΕY%]-*~m6!<˩{(tM`w)O 㣟Qk6Wo RE4i6B2ɆJfElشDa7ˆL*͆Jl>|1(],i 1|k2bŘ9[as=_ >}31o>Sks)z֦2lOVV```6W)^^=*hU '+X͕PW4T$ؿr4[P_ `\TtTޫ.:K;]qmHUqE2UcTc&6z=p*0'hWF `q UW$*UGF ׆1\R]ra 9"t3MW,ayjI9{Kz)WKF& Wx!MzL7]gSC _'(vf Eo%fd5Rsp$IOiD|2V*c2'p u:Wʪn^Amn`{-B2BZbe֐D-hKk^ڱ|x 3LL 6y{ؒzkZbɏJ Ε& h+P";ˠ/zU2$ov;Ȍ h0j 'ę{8s5/86!B:ߧ'10TuuY:rƑu΃eGfJm|л.q9^F277i7I{!p驁T8]mv >1ʷ]wL?Šf[VLR)ݖ]w+yNk)* iT`B^vGüOr$@ڇ;+߆s-YczC.Bey5Cڛy#oȎj# sat>W9P 㣠Rn-M`cL&}].?\ϮٸF. N熾g޻7E>pK]7 %(#W`(vϵ<;c[mZ9ZY55A pƦSQZIJ Lf.87(hm{&xa n͕tfgpnf6HѾZzׂh3c@xLNgC'SG5 Jb(P0Mumg{ܢL֦*I,_J`8i:{K˂:pBV1j~8d#9q_ކ3ZڶoHxIm3FYR8K?pӶtr1 .MS+1hmۧu4y٩7ͼ*zHPO% ))%O,0BEOZ |~\\ HoIЈ%Sqk\跔]!0eiOuI$==՞^qcco==tܦZtʽR*V{z BgqL66Ī'ܱ:#dv=ANDKڎ$ Z㫓jOU<=u "QGuhTdf=C\L$[,Bn9z؂g,i8e/8iVDJ쵻pZȵ7iYF8ݬ9)?0lh {nɚOnzEfwYstSgԙ*=o\|%.\#`jV=2VŮy̑AM)H cP`H΍fKФBZi$+SIɚfyv\AޫS!YunR/l`]nWʤ5 jb2]l)kam"13M,W+Gt E去"[ǒb<|R@9h_WjwȚwݍF@3*uۓLUu(U @ILkh:uUuFt* "MUZȱ4l~r<Ld> -w=|fG"'0a`̛nTZ5_3 -2cl9V&LP%L)B?öQV;K҄/2SdyQlYBZB\'ӬQ="|dd\w֝h]soT.c (C0A~i^*['| 1ݿYB-{YݯG1 |;K+s!\#i,뺳4hrbpdeSe PFCJ=<).>7ÉDnUI3Vws+ )ѭ^FiҊRjHIkrN>*Xg%_ א@M@Ck )ѐ )}twl]ђdBe%j?80{gܘ z-4]FL5s$n𡭛h3i55f<BшR7@I`9z#޲$Y ;("Ƶh=ӆwu$La8VJ *\4Na^3i-4Gt/Aun]7ƃv\k#5Sf @5uYɫu b,JPFvP/ޯS@nƝBq"|Rb ʺSF{` Qa[(aD|b< #~{zdлcQ/x?O0IcF*0fp\bGDJ6qjeIywʝx] &7Z,fۛ_Xۻ(?yoshimi-2.3.5.1/banks/Drums/0002-subliminal-kit.xiz000066400000000000000000000301351506652756400216120ustar00rootroot00000000000000tdJE./subliminal-kit.xiz}[w8\krwg&{bgy-:Ѵ-y$9||EEHQ@PPWox:st&\LG|:_gzOG_p1,cw?\=<2ubuw3e՛:o'/< n_7LQGgGO{zGv=|Օ=>^dE~=nY6| Q_^kch_ۢ|(ViT4F u:ȝR8=чM)UYpC8==X l]^U.~7lx#̛yfTd^i7Ӗ5('Yn\-:-/[1^сM>_ny}Xq2uX`<~Ͽ?Z nQ2.\|׾qi1Moս<I0i7o~_r[C9SvۇUIq5$7e8NsV:ӑ3E!7ÏO>|ߥm^-us_{>}ч;Y%kv3OŹl3-`0z.Eyt#: 6ѩ szwjkͿ o0ĸJQiiTJBtl˺ʼn̮T.Aǣӓ~>j`]ts ].Y;ev>/7{f6]'z)FåoxaRWd87i*Z~$ؤAj8h5MZSMx'WZ@RM-)HJE,8\X%G̵TĀ5jb^s!N8)XqC,9Ċ3gIa)El9I0%aȖRjd8,V[ Ȓ!}V$?0 V1Czq0CfSJВ3Y36 &шH1fFF.ఘbO1γAzF2tbltKRGĜ}FFg2aYlX05Se-Ez9gsXp8,*֌ C92,]̑aq $è9'!Q[ =DiMirda\0a\0ab4bვĀ4o49gaLr2z HɊl~[ֳcM\}|,jŢ,jp60 `<M\P64uTY(Ԙo9 :ADtw""MԋQ/Zَ%lD"{ѽ("ED>DtҋD>tw,)P@+ӋcIgً! !{YdHB/ SهN^dZDF"Cr^`e2ښ^p Α!U?Zt/ZƯ 9Lև-:CDwg#!z}ݝLE/ST!WZZu— G?5ۈVUY5=OCap޻ _##~D~$яُ"Q5D?f?Ƕ_v5p­ݿ |S@:܈W8u&6 ;պ/!J%N>~zTܿegG=dUżƓϏ?~R/?].˧@lltkajG?fy/t/;/0vz#odMw'o{mi+dUamHNcֱzJ&y/UD*y^{omdϼ7I^ЇouPãXߑpEy$Gmn0[}eWJ}%ݛL/WǍdr¬u,0qzmjNnc츦XժQ֗fX4,'Yn&x) E&&;\tQ*.BVܰ;:[ܾS\TU^vMΘ#%pf[R)p%b 8y-p;hg?nG]IuG QVhzJvKr+M\Y!v̾JtAEA'[T'\C'Pd / /zN+ B(_|pW,f`Woo/A_[k5÷oklFI/AҮRWiס0%F*)Vh}Y>N FȦ |m.fw,oUtWnTxxAM^o9']>Lw5C\vy;XSjXn[۫aޟ(-FZ-7Tg.oïy62ݷ8=Q 1Vnusy'؛bhfѿ z.ެ6jv3Vwe| dfqv9@ GÛŸXG:m>2A\8n(_A`yߥL&MW^gͲ]#@ mYcނFdbkk(ͱHrWA=~PV(;"[{P8N /e8QWMn dx|J'7tfu¦vp=wg'2յ&].W0eũI*N@UF?Pjڮ*^ժՊV[jtoY֯z3sK8h GxGnxGoC>QygZ 0#!/|˗c!% )%pZ-cEæ KʴÀ8eC0f~<)L#Wܕ.dᾭ_ j1h̃.2ݸvmԛS<`W׭KRڴz$y&i$4 o<6,ϫK'o5WQ+!l nǓL>9=>;>P 9OCj$rVOqSO<]z1|:|w|[t,/X2dȫPN/ n~ǿM_$)eyN҇gХ: 4:unB6zoY_{t Ąd FHzTUY2pʐ $$ @^Q2Q2m2|}j2hSӐ V&)oV4%r\`КD0 jlHƓœ&mP": HjIhX9-֐& i`B&p3!̳1#"flM>^cF: 9fBc&!L1c& 9fBcE@MeS4cg ypSD!L0_2̄j!L02̼b!Lxե3{`F˸3W`_'!LH0o!o!; eB~_& eB~_&A e^b~ ~Ȑ_&R2!L/˰eLbm Q۠93BZU1 # 9F*p,#Vh,#!H2,#޽ @B"HfdMbH< !H̀$ v@< !H>BgDnc:\>m]n eHRt $j: N $ @s*(d OeSgTL ~;ϯZtŤ,7jeN?Tz\댊Ql7;%U~+Njq<傭EC@N5Q{c9˥Ki5ȓ*h-ʽa0  ZEҖzfU PΒ`Rԥ$L_+kaV?l =53lRnhPRs@(kҎ]rXvb䣅D-צWۯ/ 8Ǔɚn%_FWQW.B+%_E!*_7*;RfSݹjw>U۬Rr }Di",GtW!<̦B`,ehWWCU6MH]XZȁz {4K}LXI:U֦9#nh-MڸQIMFUT4qـsQ%wY-g΀!jb`ga:2blDFmـ{510r-CpJa$10Mn0=UYV)ɐ$Jq8bO8%*bRݒԩՀ ud(pXLkf8s#cƪBSƑ4bX0G8Z08̒0cV Ĝ}N8)C,3ԍaCC̲#99mʸbca)oǀpXJ]tblU 8,& CĖ!zCp̑a a$ȑ%C$!BpЊaMȒj(Kc)%)rT3Tp$ 8L1HrЊok{!&"0U8Xb}fHAF34u̐(X^S#B/8ؘ@!y !r#ĬB%k-S _܂~IS^'J1^~MS3 45 kW$!ȟr AS+. O9I?P,I{7N _c#7DI)Ayk7P @UVhi!7 @Pcl\zIR"#o@yCD+tXV5%W %%2r @~jX2_:][ơ5yB*K+4g6m8uk*pɖU:H,Pچj(JwPD~ PNwZ so9Ɠp'bP Z(.?Te~5VCJ訅b(C5P %TCyP4l<[,PnKz<)Fau(s*ɂv?Ϧ5}i} CFq/@G҇!mtB:VimzqPyt iыMZ0jpt!WnGN "ݮZ <+r397biE0˿泹/>NhY{[.eI>P EMPzFݤdBU]q@8с!- f%r!7!r!c#BL?,F%r!DzKBAmXԖE%~ E"- |! |$bQkiF=XT4: ;~_D}r4L"/OSA\^N6oUtWٰ3Z/O7/A Z CP-}ϪKώꥻw[.AH6^\b̾m˅UDܾїGޓ޵fv.e.8|6;ߠ"== Gӳ}8~|w.~Y_~>;A}"y$~ߍi)jQ7/Ӊ-d5ݪꌏNUӭNPΠt,]`>MoW&8]?~+}+G~]}Fb? slyoshimi-2.3.5.1/banks/Drums/0004-Natural Drum Kit.xiz000066400000000000000000000252731506652756400217050ustar00rootroot00000000000000]YsH~_nl%:7ƽ!K6yA@$$8([7APGցԕOݦ E刺t!H0o~޽ q< ߮?;_~_]ut2Z|绉7#߻G柄QOwKpmsmG~:.ƙW1݆/>^\~9^vN/|2ȟgoNB>Rx{Gf,AQ%Ye`,|Ǿ+ Gdž;0fIeC{wP GWח߾ Fw(F0_F~H9֯aU#jmIo]e LO}70gۿZ[{wz3|yg`5,;"Y"_O='³z7q<-~~.W 徽V8y/R o||rN4c-J"!0 ˯.sAoHmbakOӫr ޼5VPxCfeg٘oՙ-`({MYwċ9-Gx0m$f[ zq6"0*_6DŽhndL$~@xCFNqb pZ?b'Էy5 /.qe,`+K8 H߿ Fg\I-"ԏ{'hc?IOiFhwy{!=v tfjkap/Z>+5xvU+2b6ԁ1؇pY5 q`%hg]X,d咎=p WT=<w_~jpܹ{nO:z)oI.#i I\l9ٞ].F3(bx6R1j^Da 4K*Qzm>vy=F͑(?7e>h}'k|K?-z#?G8w63ge7kȪtgHp OOAlͮ]UB|_\ ?Kgny՟w \[%!c%]j-'/`n^2 ]4ؐt#)nD"/f~f@8ȼCzYvaeO-CoMU#Yvu!ꈲ:$xen3gU6(䔮sϳ(%Z+I,ce*YKď3b<\WX?jNEԍ:Uz$W>; p9<.*,x_d8}s!rtUX}Y#.*֢qWM}aTk},{`T193J<)+Lcg[)hpou;KaٳLkB ؼ-a>rj.=jp͚gY-8`Wsj鷞Pji}jZa˂q6ȅ k:'`1Ǘ<8S y27:'EaКcyږ˄bڎ.72Ν6ŶC۞ƚw(ʛqvh%*T!NNqPgMז!+R5#cNӠj,>r۲[4O} T@p@&;,o7f ;%BsVaWbt6uRH.AzrHOdNXNGFt\2- i v\9U62~L,Pb/BtX C s;V,NB=FW 8''V"R0k:[@EXbJ b*dn}VbŮx ?+S6*+V"V8 gN]*ҭyE%XĊ}XGräXMl\GuVk) X ):Ҋyt./)vUJ"B)J=bqb*U fZ6U4%Hj M*bs}"3VIuPW6´uٯJT+ \<SL4'Ŗм٨Yߑ"5=m#B zVcn+^\ZX\iF&Nć%N^"#œPtl -6mB'.ȼ x')PaWhg.NHk|q u6&z]l$)8;wsc꾹r+QSͬG h+a9FQM qϲZڮD|-gY-'F u.E[֍96)#spuf):Ųqߚon]6QTo[-.&kܱvm6Ω؄g:wkXlg經:ZۮsևžE!6,#66 `* Z-6*aaUiklT#SҶs:Qq[DpwZ=U1 lA`f4 3 "Dn"JV*(+գiib9~~GBPV+J箉3861!mVWE yc*ݜνu*t9t*I鴖+ѢtJJEڛNq&ɯ«#N'q:1#;镐ItL;c78Ve3W5 ʝx NR::t`ْҩQN$JЬ%SѐĚ=lkR: @vO}SǷbubuaR:&92:JR:EFCQN°uJ?))!>R:%SAXYtB nN/FxTHnXHT?,t[-t]-u cITIT7,tݡtR:%Ӫ!V Ch][de1J5,%^ƒ/*h}WMit*7MJ5mWrntj=b@[S:e8k8sC]St>jx]ڢs794kFMefɋU, ecvK| բ+ҤkJkn q`KXʞ= KT6 v)Mknk9EY1ѹdBI3bK4_PyiyYK簘&=89G8#DgijHgo̻DƕY$lJ¦WVais[8zV7Oa5{:Y2EyWI¦I'< `H %aӼ(NzӅ=At1*h]S/:0? Jr]9?bXO7gmfbHIUR [UH M\Z7 &R;|1Fⳡ itH{f;!s"E'VƠ|,k7ATW=WĤX!O4.}*z,m ~3 xp=o%1؟vw2m"g~K*ND V)gtp12c'~SUPb9F>.޶@Krg%͓JЂZ\\l|b G0Y&P|dVיr+l8+-{U/G(SjJDNy%}zn7k;KٳnoTJ'C(6J (6jGp.!A&"9NF+W狯&Fv4ݒ]*j|y+$0sfaG@2ɼTvu21?ij(HS0[LtW-,.rf$֟UU#&(6AhmH ,O9>O04hT:#$6pHs9g>Jo $6! Pu\:r<$ zv&1"ѷ%FTUYeR*3vq+~Hl@zmEb[k.ZHk% 9[ +0۽VUD@K-hN%QUMb Kj~n"]ˮk{8]ߞT\%# Wq{ M! Z~:\1:+\L\أ% \1 ʞz6s+9K]p,kf{8+>1<"$pHs\;uMu=ƙl$B:d/}_z-ͧ[}5-)g[i8e 8_lBh!ؒ)-1$ E]oAaR-!R-!Ւ.]Ktt+v1<HJwvX(LAO! Z,X^:Oڣv #Y4o?˸8u/b9HMLEy#0^~4åȼ8raD&Wߝ*hVНQ.M"JSs$eޮoJDC[&da!he (92b-dDz=D^l C~IHƮhk6emخn$ķ5/"0V,Y< e d!֔BT GtK$nx-@63,Q,PSȖ& 7 G=y|U7 vDFe)As1I-ʖ2ee1O#*%* 4.%ʌ{KJmu )#G0(S2>㤮@DcڡJ7V}^OzǕV/煇d؂w?7,Z\;q. ?T{tF OP궀cI݇K/*+OᱧK;L*`|]F-LesUmՕx-Qݽl-e`V1c)eo[ʖA Xm=Kqb.'=)1JB VR0j֎x[ctD[cGngq *]4=˄uaLkI uvwnǎagwVWjabrYh\Sju}Q+p7#q:,Vqq\0vu-- +&\a3Ӓ-%P[ͻYlu綂 m"2s'sRej_o'MiL\yۺ\ZǦ5uBuò^t枭3N>[{1鵗ԮSsL!3Mq6KU40"P9U v.c%BlQ|!}Llʇ<ЀeY 4¾4 naI $>,ύ#1@|>, Md)ntagfN1^NDN|nu67LF]pMtnHf1sr`6-mfp^ͰqL#Hlpz+s|EyBP5Ofq?< [-";Wgp}rpZ$j+DwI{ϋ]sw%d Waˁnj{D41ŜmqsG(sq~6dDr/*$\/c?sAi; 3WqTf`5Yɪ!C8)q'KT+!A2A ̜Ԫo-) [ZST٪YČ31#0RV1(|&g="ٲL`SI#_ B3d"r1|WŮmR Z;` Ϊp4Dҍwط|Zűu:rȨK2km˖krNZTv;zo/Z=|G]pN1ޥ TRï^ -`i\8\|Gždum~^_ϰku`ڬ~y1` ی~zn*@X le{G=me4FcZk.õZ["79`E ,;Du-ocW b$`շ>P/ѵ^(֖ס :gWJ| t\d(Ϲe=Ocl;VӜ(+; $EAj+^ ѩeC-UO8Gt!Q?Xtxp Bt ߿ Fg8HM{ItM% ]$:JUKuB \h1oK (:J7(>[eakuEpȈGt owoZp7;m$Ltʲ#: ;E{NtU]Ƒv1<H*8ҦQQNCdxt!QBt|fT,J̰ٺM5*(Z"4)ܚh|SJΌ,y !*QVd]P ֲS ѱj(DG)4!sB}eAwiј}qׯU(,#OVUx?wgh vAtzW&KQa]n݆IƓQFó<̦A(98]ȯDG}?PN͉UTe廗a7̸mRG!>/s=6|5/T. QDSJQ3ȁh+|$8 x[UJdmttA|3$ʾkPL$L⣈>fAo18L qʒ1:Ռ6钕{c,Ya֥ yuz}\LMnc';D SBήG]UxNzfj)w}-F|⣸c^3Ⱥ{vmrJ\.>Ftg&R2#[FZuUXk.]2nf٥P2\"=j0|8cxNÆ J{ҪHk>Y@Zbב"~ ê|Q('8-bN|趡1ʒQH-֒(!ݒj᳻$t%e%:,Ǩ!GyNB(PwR-{ױD(?g)gW!>J })dIR=Γ᥋MgYlAV+-@Th@GI k6p8^~H Q:':2ȨKW5]Ԁt퍹~PG6^(2(GQ:V=f^*Pz3)}U}}ud N _J(ŠeŔǏ*V򊬫K@WeoG. Qg7r2ˀ˳e\0:>Ͽjq&~yoshimi-2.3.5.1/banks/Drums/0005-Natural Snare - variable deca.xiz000066400000000000000000000067201506652756400240730ustar00rootroot00000000000000]w:_/CJЄr6!@&-جmfKidcmRi,͗F~\L׳}h^1,}_]N^k>Øo84t_zK/}_oճ'<w]k>h;ֽ^۵k}KGtt55P .tfK}}זai`4b zؕo572]Ͳ=]/MWt<褙9cFP{nޓk53Udzr8Ɯ`ޠ1>?u]v|t-va skD=]#9?A6]"hxC[Fa,x}v|{[ F>X8 FKQux=l^vz[;g53L1)qF!iʴt o*0q1{ P1D yh:YQ`i0q>Dϒ\"X|J_s$"A7L|1XTjki&q[mTAȬtC riVKhZ^Q0SO\N̟`-1װ{]:5Ӗƛ/RFT` lj<: Vk]ڵl5 rͭ`L>k37OÝ9Zeӆ8QEfVG3t@F<"83R, ޡwM?3H?m߿7ItC֣$>(tg޿5U%o'nL{ÙђzL8pCtGpdF:"Yν!ې'pYKb=aܦ!Lx99ԓ $t"L|<&ST` HY}ŵ#ܰo1q0v916fĞ#jDV%Yڦiw^t<i{nGh2 0Ex_&G5 \w&9nio 6h>q &VVba*g/W _3'T`k('!h ̱}((Xg;LG|.'ψCܳeLZoOM7Isѻml7>bMxDk3HV{n#s#" ;y縄'j -7'( p*W]@Z7"u&uیBBqR)&Co2ޯs GՆ9hzIWRl[qt$ 'WT&>_FeK`ֶA-gOTg{Qj X[AB6Nn="#'R Ug%-w9mHnhSڢA6_쫀zJJXuyIbK+S+QU=z/_yP 7vP7(eKWuJ[(ltkn(ltrl!V*(R[ѕFW^`ʟ k|ޛ]mM$I> O{JT@ BcC۾ e90SkV=.K~1m *{>ٷ4 I./.=6g-_|e\WGQFqr+\QBqfdM>DGF[J<(\~jz忛kH(,QQ8P ~0f6{mQfOb~9-apB=62|pɉ=60}0BI]Tmwq<;٢뢠X9$$G1w=W7`b +[n񄿉q6ʖ fpG][wYV0wRq_<]qj k6hQ/]Я#DyARp+4Xpga8cȇlsY¥0H{#@r !ˑNw@:v{ ʱ$8.]C PrE* 7} |x: >L:z|Uk7$N%wU)e(CG^ULg|1Yߞqh?~yoshimi-2.3.5.1/banks/Drums/0006-HiHat closed - variable decay.xiz000066400000000000000000000026121506652756400240510ustar00rootroot00000000000000YKs8+>X0$S$ 1@f6{Q [ڂmlqDn}j}uԮ>Zt g85G7kq57_\>]_ף:"qk%G:r-\,ޖxO{fMOGdϦR,U4,u.0îdc\~E`sJO>MM~7(2(<#.2l{شdw`" Ѹ5:YK(q)lZ0瘇>Ѧ[tp tZͽqGt4^D҉W`FzjGW7i3iI]"(?vX~ޢtuWlG3Jz[Zmh(!r t|Dlc>cZZ.1/^XL`[ u݁"gb\izG/.%WG//R$cp%j6zfEx>QPm˶pć`SɛC[Oq[Y$!#r "^aeȜ 37Guz$t W o7"m¾r)4]ig_`썅ƶbL 36Ap7{i\ʿ0zx wJbN\ޙp]Kdy.]XJ&R'|?/؇oNʽ%̾Io`:6݄' x78G7b{ԍ vU$87rho:ᢑ5D)]vTuzE/JQ9:j+Z ;oxb{'!%FэSeua#__*D0! 3R0%,hޭ)WAx.zYndع<ܗ;챛a4cl/OOI?0QIMI|yoshimi-2.3.5.1/banks/Drums/0011-Drums 1 LHR.xiz000066400000000000000000000161661506652756400205170ustar00rootroot00000000000000 ]v8}W$2-_׊3Km+'^Kvz&E̎DjHʎWUEJR=u)UދO= [?~odzOdzFϡ|oO#<˅z/筸%+|nf :SbsʄWAp?SőK{NŇ~[*ad XS&lcs…(d~^]ěvoiohv8zi8!|-;X|?smމ|Tg.f:* ncnA1*WO?d/W%U޿W:oQp_V%*<;ZLC8֬W +H]*V @K\Ң?wz 6(>V~wbszqLrEvBdۅȎ`Ξ#SɝVT[f dyݜռ-:x,]KiM3چP֛ Bv*(ԫ(MW7I$A͞TDP*ZW mr{k];+udU@cV6䍞ԸvRO2Mvy\ >h];Z5\vP007,%̝YCT{R#+(Pׂ͉֫W&9 c CAfr 7#Zb%  wpϙݼ_Ѩ.DH]&h@^z c唩'팬__t(M9?[\gsgoNv}2Փ9*ёaפ vyP$Fg04^]҉N^Q @5K~'cd;KwzmB!kuwuѫ-S'!PPJþe>"6d05*9ɬ9N eD,`&6B[ʾ/ݱ.Hu'CV;QRLir:jM"$uChuT*,u֋cϖi@wL5gT0SK͗*-1aRLeTf*S8`(buJKRgwP+7y9p,ۚD.a|k5@qS|cK6ӯVssJ*W[m[TL,Ȼ '&DS I+ ̲+W@-N4 Uh-6Fim6I9|+Ti@ &5CTBbڠ1AP)jD #Nˑj s;L`ca hPMA7SyMob5ܙ@H]VS̳䍣Ԍ+qe_MVRE6oIǸ*vUQO*5Vڋk c2Ѐ:O-x[)ցNucin2VN+Tw̚D1bB*D(&WKD1yJDZ+?$ňJ;E&-6 Q(FD5%"r:ѦM+|9SblGRi1!XadzL1dY7W]CXV9;=FXHJs ,_/6FH露̬\% {smN Rpd?r~6C/"r9_&`IsdV%i*#Z 毊/g"VEr75Ƽ&Ed_@jg\+] )71% f+\[B%\"\YrY-R=۞ aC<֚$\.cK8~S8[C``qAȚDG,]nI|sjO&lo{z*8zT7aN3b63Qy!pړgv3\ HY~-џwNg0{f^{AdAL FiWl+rb=fs|p*~(⾓92rЀn-=,S$ءBA5%2rL.r9^4Kl"!9Dȉu C_mabȍkqTf8eb*ejaE^ҏ5#؞.ND& /}7 1ri$FlIQS*>g^Emu!svH}~:19`5,kX [acBo\|<=ׁ?+PP@:Fߞ#U״c*< DϜieC4"MY^@p΁?\լRiQJ]TR4n,]9VF}PBB2* ,!lP\0N)5%(1*{j+.ȳFti푤=Gs-^{*]T6P^69P)p }3|v9p I7o-X̄LB[ t|5aҜqb!9Tĸ#ϕ;8l^s) U\Y(TcwF|%{ .gIı5,!d\̧Y^qf{q;oL~ 4Ի*khx ?B$B l;guRKy5}DYd!ie td%Mr'`I`7$ {'|7#C`e DwlMVjSYU |\ ;dsL [2؅iwWiB`wD=ǪAv د.]&ێIݴ#ʕ]؟D`ښLϭa*B:ZZ'nvIg*K 7aAh.DНʨܛ\lQsIh.]BMv B?B2qtUvNu51CfV&[kP#sX|l2vDŽkǕ}8KhWH-$Kh.&n% b^ᝇjBshABV^ R'3]s0Uq#DHia͠–)l2{ƅ6dNfdH>Qk1 vm%hvb%CJw{kp-n㧅rN{blKb夿)a )2[C3zX*(m"s!,E]& zCpeRVbJPmjIY(LݻT k"'"E봔owk; 2$MR's$oHJRLӧ֍l_><>^MnQ.ce֗kab(|*f䛮~tx N_!.%m|{'Ơx'vAv^daP)7˳無9 DWMlj0NA߱Y\2rPe"Nˑ9,.B&#]H.S(YFViN}3Ήu}He;ڼj 9! SOlxu]ͶJe>uS|[{WsdϑM-)&N>ŠΧO1¹^xE L;tZL>Tآƌ9*.P#{-`ˈ RKS8S8 Q*P8LgFS p@XSiOè<(JY(V(>5 H>SLg@o"N jXҁnѢԮ"ֱ.]B;vɨX[]Q1Y%KhnxbZ"b2*&b2*nhvwQ.ݨjv %Khn)qpqu-ik\ΘXl{3iS^*=nHLTKNfd lpm.EdݤZQqxv %Kh.]$eĸdTLFdT\NɃ^z>+ 2*>obdEwZisW0)s(&)A~HJI0'zN|@=穫TO e/ׯ8.9cbߴ5(-4kV c&Uf7&VHc.ΫtfDmS~"Iony0}Y_>?JWd1yoshimi-2.3.5.1/banks/Drums/0017-Soft Kick.xiz000066400000000000000000000054651506652756400204610ustar00rootroot00000000000000\[wH~OęL8kpf2/:BjlM@bt!օVu'n2T]]51@MQbl7n;rk>[v xdAHNH#AG[ ,2zM,]+) "+S}GFovX$RSMlϖy``ba7>,u}rod 6>l6گɯgy1C[ޖ9h|[s\62}F&@amt ߝ|t ͍+peXiqjfwJa|hV(cLƧ)U&cOj]$.B, fF>v.2=x(1]o4ǾlK\md+Qu|(F!ǃ8s.5烊yv/oqm#8L]B• \Pb2[~Dg=3e^O#e{̰pٙ󘟞 m!Hfe)7d(LQ8'rgTܨٚQ "z4 NqB,JRzSGL sH 40|/zHa?}_oؿ MwwF @ǦL :-j l0Ueo?lx3f")y2H=m 0KܺvEuma_n@E|0^^8:vBX8XZ6v^ 0ѿLYO &5ey"zLz7 P9=hR=XG`ixrgys8a$rrl"H]lc"@`ynUVĢY(qƗ@('w܏g/&a/P<Dǚ^<{=o+ԙog5A~z *r']>V Z>#* / u3Bs!8J5*Zr8_0 *_X: \(f̓/0_^T+a𵨆5'|} &'?/D<_K? F%Ƌl0Jϧq}WN2F؀0UD}JwV> BXV;m!xA0Bbx'bӵq.v]Hm^w/O-9z[J-"bP; H6 }8p+n)yg qKA-HnNjn͇RPNy 2ة+j 4"-t"V۵MtE'zHuP\e/ե))$f@Ϣ!OUS-FScTE͜Cj{hFrک)AԂE#̊ 8P@":/>E^ϋiF 0x|6KqA 5gw7tH Ł-W[Ѽq3E 9JM5>o@<2 ~7UQ3Kܷ٫[̴#ɺI#a\9_!`A'HQA#}c:֫B@x bv>-[S\cd1#[.rp pؒ7~Q<$4! QD.jsB8J;8)j/EesW졍iE_Su`Ce(hV2 Qe@%ѭ]ѽCU:/W5|+4#+ PJex;ۆ#7| *)푰7:P6WWtܯK%aJ.iP $ĈmXYgR56t|ZH!Z& M"DA’45q!a~8S'Mو|BZ;.ϕB`cBJ>\4nEnx=Ԍ jF>w++ruǺ5ZWzk]걮uuǺֵZWzunX_kpo/߹ǎW䎯 x=_#WtI|AOpƓx!k&DDl>)oò?恳\*߼}!)y`v=4/|>]Gyoshimi-2.3.5.1/banks/Drums/0018-Tuned Bass Drum.xiz000066400000000000000000000056561506652756400215270ustar00rootroot00000000000000\[w8~=e'sN9/3>lEGDS[Hr.ԍ@JǙ=K$!>Y$];o[ xKq||kç g8Gl7 ~.mcGk{n|=ʈk(H{ G ##b+O; `t2nl mZ 9oŋ]H^ FS]hP_es{~2uS;7|ts2R[۳>3Sf<hWsa!DO=da Q wHҍ^,yXNJ5v؅h;o`^PANK&ۢwIUQNSM|K+'~u-/z A \2C/BiB2@D `LxZ8V@N8aPe[;hl/#+5ֳ ÎvEuÏk/wlzq}ʒ`Łx= +-9QkɦT/b&NdgT@,v9iO%R:N}J$55t?_ܷʷ,gfvxd䓛JkA>됵8Ww Kߋ 1_@ :8K{ FWU"Gg-};UDۚ]{F 'gwl9yĪJW.D櫏>WdYXsW꪿N7zQSa?uۭ UAp'ǧ.>X;@vX1ϏZ'{1$]f2% ~Prtϙ,޸ 4Yq9e+ 7Uax q$5*}Y3}DZ偯D ]ٹדp'z?/iu2}~ː{!A2țlڟ$Qs/`*o; !q yw]+B4;˦aUD|J.;%LM8\ZI0bCYc(RmwL>G.]kiVJx " LQɛB&v\ R)e ɣ/JwRstwcWA +i-_]2,,EZ ώtN5.۟X$qr λ0*E2~E2GbcdxqLDmC x()p7~|>JcIl}@0s`*K؇䴔Z-,&!Wjl\M["u^LVh>+-Ӯ8C[6 DI cBΟ^\+0*!/ܽqpMv qеNDCkd+w^ j<]mÙ%mrEjP *,V/\}` znK9]pӦ,%3Z$LO,m<>ڿвz G~Wp~pۣ_ٔ-A9-܌ƞcnm׾ȅ<F;z֭Ϗvdn0ư-کTY<ڎ[>x}:hHP5]a3'3:;tc7swFҵiŦ,P843? 7:@*GE*-Xq"D{teg*m EP * asdĹ^e,<תbjc4o$3}$M/ę!01^J*LUaD@ J0^WOxZ HWB_ i,^>C߹\sEz5;ğ\oB|8_!~zK+r$\.e2>$s Ս $³=@2Bs7qʤ,8#_@QoJW +JjŲv]*+Qoe_JDOf_/C /!e-~2$XB\l8)x2eY441_ӑќۭ%'=;Chɑe&*(A5ɚ<2wMXUI\L|oE냒$&-])o%Q U9] biۉK-N*ɤ?. f1s5X7ѮV\ z<v@˜yv ;sx'%c{?6O [􂕽mKg5Y3Ս|FLu#m_7S盩4 foN5d㯨 7G7H CR?(uLъ GֵIEE)r.9:% ]嚅fWV&Y;+? Ű^6yoshimi-2.3.5.1/banks/Drums/0022-Big_Drum.xiy000066400000000000000000001236471506652756400203720ustar00rootroot00000000000000 Big Drum Big loud drum in a kind of taiko drums style Lorenzo Sutton - GPL 3 Sensitive to pitch and velocity. Add some reverb for ambience. Big_Drum yoshimi-2.3.5.1/banks/Drums/0023-synTaiko.xiy000066400000000000000000000105211506652756400204660ustar00rootroot00000000000000][s~ϯ=Ul>Z_rlyD! Yl$%􈁙N5yٍsago?lڝ~nZ vqo?7n'߿|?WC+g|\XMڅ+-W3|BmlamM!c엎;'X^\^3[ka$xtÕ EC;ZS_:v:ѵa~]΍qu'̍pL)Ydw'4M B]XfcL{]j6V3=_f "Z;ϙ7R^\On΍)o|7p#mv˱sM`5~kF8m]siVso7_{A4,.4ohA?} ;[ =mfNhockж?ӖY'$F0J>Uba!`ylBR'{vܯ^柧l9E6B8$l{A$ژ2iKnqwtөq9ύ;nlMrU%fJ}yd~m_$R@oҧ ݅z'U3+Aԙ. 1#wRAD3f)5qV9Zi "6 \4'w*!#apfa3a{ƪ]*xs+voCGZ6^7t22?}7h= [m'8jm>bla214/F*[`vz?Ddι0}{m[Ѭ[~6`Œ@g}d.Ľ@<4i=hY1ծOzc.Wr.ծF')) 8l?醓 W܀M+ŏg+M00?b!zk8w;Ƿeh6~곳ZI\:\8JfVwm̌K_Ay6۵[GW3%T)O?3$|~V=,Ǻ^rb)] :N"xRj _B:$WE|o8h=)[zp@֘Z~Mf,?9=&K&rw+3_1i4[}9*@9i.qu {X#=E#P톤C-+o9M'9GV!iʐb1 *jЕq}y1QL,$r.OFyh7 O?w=#p~HzQ^l$=35wU9Ιr%tmK4~Opz0-- F0 6, Wq;И'!5Ç#P-f9H[TTDaTRgC)'=n@mOy354c  EJ V*ӻh*쬑X;xVjpoA"R|*e|Uʼ[w, '}Τ"':e*SacG!bplLs, 9Z^V3!zv J/xN,+!pTbsAc--c%'@;Տ[eW3Ig'΋h36Wt^P@ow'ctۥv{ < $eFQg"KhM ;4Α1/]ZK;|~TxX ~^+j tWA;a(:Ak}:uJ#Fu)aQeQy0s5<@?镘eaR5@Сݲk|.LEʑcI\#ȏszKX5<.C Ay=vNP-١69RLq"=\%N a,>0цlքGې# C*z )Evd<U^{t(&<1}c1j2葏y(`lLȒ "}Fp y.>ҼhiyDo)]bũvIBvIJ2KRT$|.KRGKUC)O+y0KC,% I} >C?A{.?A|@7=yȩ-g?%ZO9S<68pϣx-O;؝YB:;AgFBPFu{Z{ߵw \,A節PV̂RR%OEfB7+4#"_Z',XMMt$k5>9XxNʟUpIiKJX$|Qr[pfť Cmsgո*V!Fp1g[ԲIsox/'7g%%K\,}(KZy,RV6Z@IkVkQW`'Ri(W jƺ|5w-av0;$pAdb^fٹo3; k_ѾرCZʇ@M=ʏ/)\0Kv ;h`?sZ؇]aQ-uZ~h{եޮ=4YҶ͡b[|n]LF3W1nhe(qIJ#m@uQ ܒ|ʒ|H5XqGυ}]ٕJ6Ԣx[jQQSJ.fP[YWBdsk-*HTPJ2l s?N'%+ULH^r~S}n)2^\On΍<琢U +4r]ɥF,u@]/u)Z/u=,c {N@ZG,r}2=/7g8M3Uak)+n)QE?*ߕJ}V@ f\.+ 9ڇ; 7YRu8 !]JulPiƵyOeyX]+ON4^TC6](p: g]a,Omv9"YhVʀ&Y}!Cdܖ9]T2߰6Bj#B& TC #V]Uw8bUFV]nUV]U(r\K+sVFJVwj`mgY̻.u[Zʾrwh0Qˈ.Ε ޑqɔȪROWaڴ` \@Jdtڔt#']g*pk& +0^](E'W6|/ Kfa~`g9`|{n;w Q,U,?|VBSo6B^=4` 3Z 2|  klY/f@ٳe#JXen@!v<*Whul$Pyma G oM~Ҕvۅwзaz9u/=787 j[2-[|JUŽq0;9l=TH9"6DžZ_>0m<ʨyoshimi-2.3.5.1/banks/Drums/0035-Rock Drums 1.xiz000066400000000000000000001174251506652756400207760ustar00rootroot00000000000000}]s8zﶨoELφ,Kю]sAtmIW&(H %[Q/wIB`@f<oj=[{x.O.G1~~·W7mI!b{\JͶnbu0 l ka1qU\{ɻ&6KHE{O<]oލ{{IO7+w!as78^.U|X?盯:?-~NWO+\ub{'_\]q|q:gWdj?9{}:}M&ŷwF3.L6rB"xbf0O_`"~]o?&~XjOqNlZwvFvc8- |9z t5,mۿfӿ^l,^G[|.t~o*.nKvUr{{)|>՟׿ ? ?ǟD7*?>_>#W}[P3b7wV. _%C WWY/>|U7-z#tÜKۑ}3r<7;T?v8~mxN63ma6Sk~zdϦv6a^_Vǥ>z?\1ƾsJSt `-b(7߉f s̔ g"_}J<uXMxާZo縟Sy0Šp*'dC?\[vwCIߑh؅bLG XHw42X~j>U-?d>9Wы~m<4 qmq;/5i:\\(p&^~սUvɷv=;ki|򰼟m8ۈz.?6Ovs}bZO\f"^`'y|1ӷs1q~4@til]>7=ZEn`|V#vfZݧDy;el$aW cﺞs6ϽWX.NTN'*1]v~ϵ7FG^vY' FFց<[ng/ Sb6UoLfc/ә"bt_s^ S:۫vHC!X$T ꛟd= n1sW#}H07%tlśA>a\+9\ \Ǐqw6{[ŒݴZcOטσ3T:}U%{;x+"&,~Y/}4r4v>Cndm?5淂I%p*sZau#61Аe %{ ;ױܘw՚Jnf^"Ԣ!6~:p%.8-0}Hn D,Ԯ^O[ 0B6뻹u,3nI۸9497l{8+VN-?[ɈnC|1ݻs9~u(n+VɼMplyoL)M=jAn =QBtX7(:,)Q[}g>+%C![sN9 7tBGy$/5JL|[b7"[b9b.Vp\GQ:GHJb&J,&:Q!ltuGv>ɮ/:Z ^&=D@{ZMXX5&55arz9di)8y\Cho"l'>q4g&L\b*;zne3SUا'L03K!S%"0"YyxIz9_K8JR:љ -h^/ڼ Vj"v=&#!cu>,ʓrlq9/%H{jN`19!a{s6UƋ`o~tyYJ?JDNP"7IA,IHÊNx0A#=(B(%BDQ@^P".y} X5`"@X&h4&K'"ϗ$jc&3zk8#͗t/9L$_h ,?fa":T'0 0{uэLFϦȔd%zdt$y}@Ic!TM1uz ߨ.*GTNV<6&їLfQT7P9!A%s}Lq9@+$hйJS( 6tÎnvV1 Z 8z^HPydɥ"A5j4{=`.Qus/+pj_`qZVg| l֩r6ߤl |o\.љ8|DhZ xu V}K!U4>2A4 p55Qq*Lx%ȬjNOlp 5ZBui~~_?._Bx#hxvvQT}FZ9Yso OY%ӿv~a;l Ҧ/L1ȳg%8^<mpykN %?w&y .tܬ:r"-^:fE7x3ZbEjnHU6nUP -z̴I^9Kĸ9S(T7'Bm>*Ls͉9zb3s9]&.Biyͫ|D^G]qy,!Q+>B1;rbUzͩ^eUdPrݸ9v۟AKH(7gVB;2²noӽ DoWىS_hM5oP[\#wODˉQrʟLa>ea.ͥю@Udxv_yq;JY?9J>zn s`}暺+pgE]ϽāJL(|ǜ^Z`@%UT`\9,c1`=r)yXı9e>:$t %H֢G.|~d[( 't6'20LEeqgXeb^h> x NG q_:gY5:OkbXv Έ qT3=nQXTH߅{~_׮@١=h:D_+liP5KIVߔ"(ԈK?'&^O{K_讔XVa\;^txqg]]',iU$_8i"(J蠳ԝ~=hlЀT++J.Չ?﹄Eϫp~quuz"g_ NR S‘^ oy5MYofӿqTtQDWRT!\lx6Q&hӻ;S6Oeq/6r^E4̷'srTAX=@񔂀Y/2G7qFxRiD&)ܭx)~n%}m߃\.4ܗZM^@vvdZ<Jo]샆GA>ܡFctE5 ȧݨ^hjC[ ^ޓC{lXtU-Г/'ъ[r M#hm;97;t:5͎&Og6~}C(3巊δbtE(vql#n3M62COZL\d)nRGuZʞ<!SԵk{]QKCϭE6t8d؉+i|uy1ȴ-7(=L*MNCeASD~`'#C 7=sXN׋y2bPㄲoo)DEXVg5NMY)kޤGs9L :~.EХ:T|ʹnUХxF] yoD Q7=w|*Ie)gMgl#$]ٽd8FaJ, 9Z@YJ,d`G>%3GH{t JlvP\Ѥ5l%5y);U@kaH{iSSBN3s$Gz @f@5@ZFaV,% jqr=]36 ǙIp U*=yEm-hvD>ɬG؄X5@Ov0" Z>OZ$.Q4t{O؞ee(kY$-S5^N5U1Oαy$r3؃rq|f8sP|jV+EZ:BUDo3>U0y*.Z Q)033)$ : zU;8# %qk% _R'zJe$ƨGRqI[PyMpvAޛ zmU! ƄK@4Pus ^5w7<ګ$XN"70,s^BV̱Uc:G~C0:S2 3+# )w9 %^~ydϔ̑t6njMr WQp WirĿ@ PV6G~f!!s?Q* Dt>W(:c̱ HaQ9w&u7ks5RJC#6m}2kFϋAX>_nAt]AX6X>v7M-KX>.!`A1t]d_=gGNFM;\Y/"h Zֻ+m .hBD˩+F `cCݷdEAү˞'*W\Pb|u1zMJ BGSTC8O,DYvS"Ԫ'u` 'p0vjPΟj@#Xn{r/'f!֔2 t>U$3ɓArO*Pm #RBLcȧ}_4{,APx>Ơ-4V&@{6G Uҋ}0{pn_'v4Wu%=Nfy !=AukJm 8T@Z= "~QBSp$'(h;Lz ф`NBvSDƢEfs'Qf6_<:zfP" )%\%(eŁ9tshNG60V@&qˎU}Gߪ[HXCQ"vaa6U 腹z˲8k%|8htYO-Ӡh&8IXhfIuklvuRy$kF.,,buDcuK+GH]$um7A"RFg(F%qNWLrl^%hNWLlޛErT D:_qkaX4Met 85h,k䌐RGG.:xgW:x7?))ckj:6z3նyU:xqۯF.7w, zAҤ~>C+w]c_^$5J଩7A%}Z7bzE#U C{!{^nk=molg[s|bByp8Rp|kF7hj6duBfq6у%?d2_F{mrbդY8c5rUPyd˗p}^9٨#67r}*=E/@Fs sQRN[d|B42QӐՔEZc\{O2=C3HoЂPaQMJ^ho/ ZBRpB~ pGhs z%b9S˫а ZPpW9; jږ[ |`71 .9@˛=7pޡ̸:udm¢y0]mAl-<eFo(>(:&B>(:C B)KxQc"XX\  ? ?]AmѫzkvU{53Oە iGVc5jI$#&9JBFGSyi4akвYOj@H *x0N>Nʞ;Ē/gu5}4R&$0+'qɊ$Q DD7](GX^]Q!s}i/;3몠ccx#PiVCu#M0JQﬠc$Ӟ[MzXx%|b#4ߡHo o F}k.jLM"2i ff5-a{j]<1R:G޳5:yj%7 gMhrބ0 8Q?)=ف2-9f\kՑSH" d?pMN;"%3 \z,=寘%|WD έD9x xhrѠFfu]OjPj!EoŕXq@,(Bݍ+oUgAi>6;Hʰ\,(C:ުvC&L,QfݺhЭ{\=gCl"D׸l*] hd(S%Q[`Em砶G/4P}*qTŽc&<ڞ`@Y6Wk°;Bɡdɡ|/0ZUue]\ HQy#GYg`;y,R ߗ1<%$,w*oPS\^}>"fb2 0$`T!;$R80LtV%^& 5潣'LaQy~.uX#.];0֔sC[_{w~ kqgi ૔V@I ,9X_ s;pvV!<,oibBIy 躿h)_Lg:JH_{nڕU Mu!i96YmtǤ[ 9LFAMW!tfHZ} !4TSrיִK@b#SE$Z_|T$p(.m 35 n^c"rlĝ@lJF2y ھJ{I(__r${A(P7bب(7jNf(`[zPQ AכUjPY Af6_<'Ew|@ ^a?sw6:_{_Z-ݱwojz -j_m8ahabTJX )_ɽ: j݀vA`T{[UE*ife6M6Xd9ոˋiͰha-%$eDkV g5q$A>g Yх N[#IȮ󟻺v(J0P5̽4#3]!+c;F.&]Ф u */ίG8:e+1)b2'lN=x@l4jI(:m˞O=3ơa< -Q[8bz~Rh!=h78;b;)?Wk?bER<"]$(pd$nSyFl 4RtxfG;U9S%iLkpf!B%^|ŖY%bXj-jD9`6ysU S4XM5-E;dwP V;U1ɐ T v!:i|uy1pVP6 -A˥;骃\М w%wɹ 9g]:ء\:J 8LP}*>m 9]ȇ,S܋5ARQ4ϻ++5cT[.(~c4>3së`dG|ڕ#;ؗu"6oU4`Wn?jAFms1Z/b̧dl|3_pi&δ㊈}{V-{ mTnMzUx򑮩SWN a:Bux ޒ`5 "-pˋNsNa#p^-6푲nsF)ğ&8OCoH"h7ğA"ğGzW!u&ev6JP8TjJ+jCD(Urtx#@5˅q"xᔯ]8-KZԋڽ!Iz‡;g% %'6.G#PvTA PWO`# "- =li8n"U}:d|lPP))6W *DSؚ kx<7JJZ>}2$iBDF]@"EʁO\CF(*'Dm\wXl/ 4"JÞNEII!/P>h3$#E4%S ^!:u{9q(HXU k d/BYC ƽ` 괺;A RD~Q;ʓUB. '=D[؂'2 fXXpޜ L.<9FsDYk\K?@shJ71žsѼ|Y|f2B!xib?5m+xw.9ѓuU= L41UO\SP/Y2U.%z __84OD_0:MN:#I4!ht4O>8ߛ4y 0[}7;Y[]68h`y>y:EY͓ y(e'.z"DE{R޷(Jۏ|^AAO54R*dR_.d DEU+r`oHx-0Κ- -_;c]œJDOoN>6@gaټR}C|K.o7_A}a3[#-Mq@Z~᧏wWj09̣K[F{佷,;2z5Y#Ѐl *u?V/B5{>\/[%ElHyAB9S $5,qXBo{rU Fh]ݭMoS~g4HIk!Q*B#.j3jF"(B+]D5Xs٨A{hL"F"BN,ȑV`NelL"s~Ơhz5Ñ>j굴R2qnT`NgvgwOfn_@pB7!קzz]>m 6P<1Rs YMfYEKDqO?$n2H:#d&| 4zY $ Эf`.(.u^!3=ކg&BԯDtىa V>JXz#eq2apHVp(1QF}YQ(/Ў ha~paad'ثkwB3Y1W+vyYO@|:!!hFQQ $M{Cw +{.p K`JUr+ M\LD_tHQy dd-lV2D.Ӑ?26A'_yKg)U-ID;)%)xy1uZ^*M| 53U)Ɨm&{q5/y[J@?j:XS_B2|S!푑%th$@Kg=5Ē/!|J N=MCV !eU$w׆qFI"$6bT$+Qk <&#IѢb"jگ^e+CkP>G#1ΡG¥*X)'LGoUKbU8Р?L ,f^\ixubXU.0Q0&*GGp"V+.-aƼw&0ǥE0^+J@ʠ"ͣUy55;pBxkV?YʔcIa#7xE\g%"hz5ʼylz=VN NHʱJtK^>Kǫ?uh(c4Z-Z<e4A;Mۢ"@~Z @[.Vcap|.8y%Jֱ7~ q[/!p[l%|1~fڢ܌5hЫ[n~6["{"1O&T7zIlXA˄;<YY@- 3ӱ8\ ?[i&Qvq>7Yd䌶d23G T쳸'nj/c^ `D'v~C+'\Sv'1:^884"˦-2fg_E-t,cTgyٴ3q uv Z-/0J'óϋц~ iN5vRs4bvuLQ*b?|/2,Go޻ϩ@]cf{G"]c14՚H Jx] 7-[sBuN .f^ޜpk D!֔sn} ^4p9?, Q k  =BW}5hzSt-qw#GƆiRԲ ALS2; 99KhCPnPiSgRq .1"s/a>t\FourLyc'ѮZn;bM`Lͫj>Uݺ5U=)0%|\ ANxozQj- |zpmq;+,WmM܈nP"+ F[% R <]U%ǩkr/Q;E_vk def6_<:kf4zM?@ (^k4Wm3)~SHGIiB7,ZwB?j8hHNZ*g_/WQݱtO sd~Y\4~L4f9*4ڽ! %r"~.T4r i4YkuQ;,$>r5нߺ ő-Pz}@y(KB^(Uwgs({t@dn 5̽4D=Y'" sCR/1\)a{⯏6j_\]q|q:>wWCzͲRgcv3qχ-3 bz GjA򞻰RES\2~&Bk}BoAy BV1T73s%27){n"¢2EZq-ǎ Z *W#Nl4;Z׫t4okp:d{xu=*ODnQI3pq !ie ]LABe!$H?$ѩ3_E7*\5,>"{H?E2bx1j j8Q2w @ӸO=޶noڴzUs j`5Pr1OUؑL׋y2ƆӦB'v RSY<3`gb2оjةdkqVPl-d%[ XdkTY**ՌxM_u|+\Q`? k `Ьq,Z'0ҫ0(ZԘ:֬a:|!f`ha\@gƓa: 5]àHTøxj AN'0`:Z?–u< 5\@ƓxX5\àqƓxJO 0tƲ#kLykLykLyW0֘0֘0֘0͔qw֘0\6`S&ټ(Hz֓ #<7&<7&<5VP~s0ޘ0}@?ϒ;läט0֘0n* omPtaLyzd֘0n Ycø5l@ykLx|[J{ϕ1&<7&A9oMyw /j`5[S}omJDJqšք =3R% _+aM,nӍ-5kܞQ~X t֔֔+:|9x6k)_c??r*_š5~|J9#|ƨ?:(_M*R~EnSlؽ;0aWdٵ6kOMDT?qQe֔'MgO&?ݳ'l%*6`1c*6`*1lC9g7UH̻ӥN-T oͮk]*ƮLa?nmڻg.U`Vi ?z Y`^gDd[Q%(׀\+@ku*H6QUĺ&܉gVš5إr7Vš5g&~7k% _ _㭩rigÉ?^B $6:P%:@6oM:@6oMMD5G^š5gZ k Mk% _,tU7(aMԙw^Pu֔qkKH#ȩA k׸ %)_ֵ&Y$n䔯ԺƭM?@n&5ID<ք&5w2&PGk% _+aMk5U7`;3Tݠ5k)_)_㭉uT@ kgSƝϛTTbo%uݿ!@zA kgST@ʩ5n u kż1nPš5MkMv% _+ɼT@J[ߗqL*R G-4ߊB GU({ݬFIaJuzͅZu+NE)ߵOnD =T͗b6U/gc/}q+5wem0Fv {E2%7?)"9Wwy5:`aPo[>fPt)ˀYvePHe^}O]Yϙ_$(NS,ADR~x+~x51g闕x9MzXcrZ5)y*j` ^]Z,&ldY\\|O/~_gwcyq|7[ BInf^"Ԣ!6~:s%)8aGx)VmWs] = -K Gt|KA[ŧC% RP]e7Fa#Xxנ Ѱ׮nɼ~.U& #yޅC{^~ux8׃JE4~WZ#yYT?(v{Pabp_=,:!x{)ل^*}WIp~lGU V(Ǭ}9[Pp&[T%x.WSidi~AfvK?(*O!՗ODVyuE+"X򾧣/?tN˓0əVye ya ZYbag3ɚ.cȡ*t1ܵª<AgҷM>im=KܗDu몒Ś%2N׆Hs$4tDfT{cGҏg? /?mk 6w+{r_g+ʟ?S5?cFPvq;@Vp^@ ta7AbԲ{xa5$.ZޗƅGk}xi"D >iR`-6kmoldUXz//Gr߀nnaM%[0P-6[{N[t1p [ȨD $7n7:09(WXh P>?l<.$us#UAa>p! PjHhU!דmgJ}v(gsupXx+K)VnX]EC*u`Z>i\%0љU\L2Sӏ5hJ7S5X1Y) (6[g( "s)TdwP͊hoe5v HXݖxV BRuGnTxYYaE *>ކIcppY oX;'CxFš 9` ~vϝaϵ}ڞxpw?gU*PKg#^qdǞCM#-^\x4\fe4&zc"^'%]Ew3..|I?/ T /&7/s}NrDON,R|7sIEh.i+ ?/G]}֏7BX>zn{$NRQmnR^6CKF~W!{jyq4{Z;@A7 9w最֖]7n[EV5l{sqtA jJ?q)dDTݱVDRvYN;O{$F)e$ 8? ñM!D5jě!K[թ5*Me1G促_acyk:gM槎/ v8O:zYg7zJSF+Fz78`6mz6M&vV{Kt1 7I~5h˴?ҕRXگYLߨpc_mT?A+Z+sZrX^ILǝ7ʮ^zJVFD/ /< A!t8+؝˯~,6;B|?ۆ>UpR Tb:=y/?}8u~_?¦k]&WP,cIClލ'yQ7Z)I}W6n)74&?+ "a@?hPxwϭ*-y ut$.2P'"2n.Av!_ h/ ` *& 3>;e/@L0P3!gy=65BM0 Bۛw! Μ}HG97oJRFky!TK%gywt#ҎOȋadoZwOrޜX1hpt/w'r׼knKJ;w.7ᘯTҼޛs #:MEsޑc21kZ8~"xo.}9{ogv:.ĺ(2f>q|M':׼;#5f\띞apsw8r2UD0}l/0iF\D"^˸c(Qq`ZkǛU29ov- ȱmq҄nńc˒zzYyYehzDu +!.&T8!|!ҽ/!ݛ/;G \qtIHKd=}gQ4Vz FZRW4c39klO ~]V];ÅdϥJ``k : |2bx1r>AU$Noo"d;uP4'ko[L7ɷtm]akoZl/{BK| +춏| 8cJ׋y2iY-d4m-du>[頒SPւVplJV'B%[sdkU3Ymc=oT'.|xrVOav^%';0PxxXq&֪aVu0lxu<֫xiw0aQu0h: 5\g$A'0[vݎY.Oa8\u< BOa: %~c6 ǫCOf)c)4'LykLykLykLyX*8c3kLy*hd?5<5&ʨA8!Mxl% 7+aMy)֔qps]5ޚJKAe;kN&|5k@#*_šքRˍ-T5kܶQ~XMeKXS?5nӏd}cgS[S[SoMkM9r%)_G^ר5O2_(/aM}S~U%==Q~/PDTijkT ߁ٳU-@W6Y2^Y*S.8aS>.(o*X @2l Q6ļTCT}߀'ZUxvOFa=YۨK%ոLMԥ*P4A^؟g,knQN3 0>GήLT}T|TH )+U%(aMk3C+aMRܳu5kL9&|MC&|/7}7U0t NgU2S(lxkd _D~_VhxTݠ5k>ĺVš5F@hZ k׀&U7(aM ~7k9 =^?/C|[TcZD5AgSƭkM9@Y5ٔqb3|R$f"u5k%uŝTݠ5BY>ք&|f~7U7(aMlxkxkb]`o&ֵ֔{(U7J -Tݠ5Blxkxkxk7k{(U7ZŌ&| :gVyOTݠ5kB*mH+}y>g"E: p8Ax W~Qo ^zD oQu~*lFjc] N5]M ɯͅ~y XZ*NuD+=T7r|-fS5_6MXOgŭ=ef*9u>u-{Ok^}s+0wjt? VRPiOa-|"W6.'i^}O]Y$aTJ)i%~KћWR5FH6_V>-Vi|܆iޘy TŒW.-AeR2,.[.T|믳;Ef6/f5& DکEC|mJ$cq;$E{+x`Փ;;PRxŗy"Zl_-Eg ,Hنui[ng^?fgV /<$62-1 r1u PlƟѶ#5و瑻*$W·e5/V h{+XIvmdR?moUe*LՆ|Ewq]srpSs{(G/M;'쳨$.Pp䉵%}8?,:8*R~i^9Jr?>_>_HMŕ4ܺ7V#ى"K>uۡRSqY*,VP>gŀ]9bWym_D_]>b;-@?be *bJ*֭kpЧ;%0љU\$k2Sdw]lJ7ӯ#XMiJS(ҀrauR|̲fUJ.+ޟdwP͂k<_jTnݑ ,Qo122+ngŠAT[}; +׻!$;!3|]o;'CxS=<K <3<]ƴsgՠWq?<MOA'ShedI0ItT`[[E\{v~jH+YE6_xS"h.w˶x4:~\g޻/h|㶅XKjnAG3 *Z#ȍ?q)dDTݱVDRj!Y!-Gzߋ_(ʯ8ojn7oA :QS 窯ߔ~\pwdVir/ z%k {[@ӻ7|=(Jw9l^%T患V1d0zP zgtv|_nmagžMOlp,P۵zY\贤򗅐NXz  7F#hrQḻ"jjV}GKƝ7dir&L/ /zx p A!t8+؝˯b,6;S~D<:U*rvٞC`KX|&'Wן>_\:ϯaSq5*a*O d*}l[>1kZ8($}ٌ9%{9?M9G|XQ6uj\% L]m0z*bPK{$W€7v+a@ێSCp5 p ;fdI,ۓ^cf0(&Q8F " 8\ٶ/Whf@qʏat5uF״v77A(ԅBݖEwPWU2t鴺(' uL"yJݠLPUJ K44+X/P(NË>?hPڅƢP o*$^D &N8D?+XS%LHLMe2 9&*QZ!A(s۸g((AMctrH>YYe*EX!\aL}щXɶHjB,' ꦷ-%Gk{_^G{tbxT6h[@2  z1xz}2K&Z+`E~p|56<"BV="UPx`#U.-q18RXH; aڝ ](Oe?|%U!lɞ0MmƆ׵an3\\!OˋȁHX5*]gSAAP1 sIM-};8l `s.W tw[苜o{Nb̧-G`VK;#ټ$ l[ .nGYj{dk&+ZXJFRꅨdkT*\KՌx4hjO[@~Uu&4u< P?4av_5:2s5~s:fU{rk0U]~sx4uH_ڄYàBo~u<]gFîavwe -5]g `'0[vZi͢Ɠx.xr5 BOa:  %~c ǫCOf)c)LykLykLykLyX*8c3kLyd *b?5<5&QDUMxkXO޿2QUĺk=3k;ք.=XJX&ĜZ kdnxk\P0{c87}SH6:P%8rϦ||] Jnޚ5RkO JXV(Mk% _z&| Pj6A kפ)_ΩMy!`}Tݠ5kԤɼ5ޚ5ޚ5n]kRRS-k)_V&U7ҸSuքIV&ĺVšք zx/&Pr&|5k%u nnPš5ٔ֔ĺ&ߘ-@d ;0U7(l=J -Tݠ5{(6}')_)_)_cw`n:5vRPuXSuք5^:|ޓ&U7(aM|9U7F:4NE/GLIWJђ*(1m8kxd2#疽)?3Uʈ1 Hv#Nv+UJy|1skɫWDĪXW_E"Qwj'_ph9-a3 (5HXymBZl4] D1p +U:SU;03_ruZ[9Dm.%$2fL6,r'RFuٟtКnHb `oHe.ЮGn2H*sy-NuE  |YQ[Ƚ-(ĒPϒE)A] 3 ݏJӉE}ҀTk9_xH,y}磃 404@ t;P ߭Gj%06Hj0ƍ}?XpG\P>@{dXXV>@<1G\, 9H>?\ځ.\sbJ*J'U:9%0љU\$k2S.YWGӈY]vtsi@9ް:C)P>nf TJ.+ޟdwP͂ʆSHm(zs$p%O1+!hݺ#n[̢J♰"dmVކIcpƠ5 nz*3#% kW&/=5 T>FM)7v|Saripz sUE~+%{ĩo& ZxvAƞ֤T3c%wIG[-\44^1һq%ǩs@9a>mL)bn^›j֠u[/ Ts Th[՗YLߨpc_mT?A+:_9.Wt5k'TY-[cwJ]ɽ0)jaȘe}ROnw69h4.gqrŽsܜ9Z~'QAgKγ\x=LP"g?﹄%K~~quuz6_-$|֛@&e4t{ywL81IF0xJվ1 s.gs8 s'oL*Rr) OXMz9)Tw%)\=Co^#Mn;)KSDo`'&MZsfa%EcnfzGa^ Xql[$·[{mbF 4LN5uF3JAW;-R7(&>1ab"dC]͑in5X`b!2)[)q:+>w&%?D/**]+VԶsK2)^hrU:YfG;_;nJ7]!Y_[)[>$b4;zde339Ns$o3:Fhl/Q0cUZ ٨E hu6>PQc_O8#ʶh$6dݙjUlV[=BNy"#F _sWj{/_GmYRp326Ls Yz=wq]UdPWe:ԕ;]hpWbxZ(2UQ~z_OqgH>;|ta S QarmkDd`"Jo>,nX^GyB^h {ְ"'qs6YmieNtܹl=_SA|I_L-X0.*`IcH6竀P-g^c0WIZ^ֽ/"@-*iL!DMסTuJ&*s BUq~(+ªyՠDipjy汊T^xGhz&%=j]*ʪʪD͔U{m(0UVmfeYVmF3;ʪ^fߚHtPV%)Xʪ,c4<ΰPVJ:?pKNΏjvZdΏ*%>HИkdЗv'r3oO_hw c ʸ]/X}s=0%" ,.XzC㬛78- +c]yzG>xo7gd6dÑ_4Pd}r CVo2W3B5s%MZ)(Odd3;-}͛CEyژ5EtP$u7oju#63/r7'>"]RgC=x)~Ggܴ4 GǍm֜s|ޑci+V\/z4oI8:n0tN9 cIij`%'SNv |\zOI7Q_]u[2[4;-b]Ffy/s~&EL nEӽҩqsSHH W;SA+}/ ox٥NG'C#zoMf1%*${6WEhM uy&sӸ/S:*a'Ů1 K?ٰoz :Z].mRx<s^c ֶ:JݮKo7fqY(ŝQGEZեuZ]t#X~S)έiP"ѝSEWgdWFd:lfn|-g嗃^g(=A|i_?-oyqyNOeT,ֵΨg7 ZA'̳KAc+vEC`c:Yd3x`*:eV:. ̠ydzȚp 8gt.*>\{bIk k `+j\zVsZl&{Bk|v#TyTkcd>MHodvJ# l[ 0! j|dk&+Zbl-b%[] Q^dkT Q]f\dzƓVTǹNjVǽFjO`@B,T :fwU0q[= z՞\Úu< sw0谫a\g }OaV\u<a:3D5xPxrk0{&) `5\ lvKh>Oa2Tu0jl<˖f_إְ<^Ɵ2kLykLydfXcXcXc$17SYc$Wo2kLykLx=@7&Wzzo.8| \i5 %r f5MF d%_ +>5qD d,1rϸC0_G[S} Qp[w5ޗqdz\))}kJX&b/aMZ k`FNڀt5ޚ5vuR-6ߟk)_)_c׵&||9k5k5k5g|y-_k5*_wS~cT_ kUJ+Mchk)_c`xxkxZ{(Uw`n@sMho.QeF"U賧'lgזU ~ޡb.rGT=# c7Uwi* HXšv0oD kD`soxwlsԥ** DY`ܢ^gD>$(+U!obA k׸bD $-m%̬&| v)ĺVš5g&XJXmm$ɾWL}F/1r- !%)~@YoU?uȨBP<'a58Hkri.(كw8х89NcStAp ͍547ՁC TW]C8ϧOwUITܨ%9Hq6j7@_CexXf#]-gs8l,1YIw',y:SVt8OQR$OMbuIu~Y!O0-iї~~A|,,Zy s.-NfͽY,Yס$E2jXX O_L)I cެF}eS]O糲?Pv×gF|x֩ݔP/_z*g,Rxgb[͠rOĬt2E:Nz D3f!͕Dd! [=+蘱vVcqEyZ#YKsc_H"݁bbe^Bfo*syh0=rQX4̮V|Ь1EVucTeohD`4- vs [~%d0,=VH$?;Zvs}w;Sjks}W89[ɸAă=O "a>ޮ#`/4^ =Sh_gnD7pt*씇"aKA|v)ۛѨ7D˧3Ǿ]5SeLKw.u_Pc[ }-yNɊF~kH2?SJ&D 7مP}ΡF1@P+xhٷy+ݦ|i>TGVv,kNG-_ j$>mx/;k׵ԢLF80^{fr_0Jpj!x"=|ʼnTѴn6Zӝi ?SI?~|лT,8[-!c_TⰛ'7q&C Q 8@Tx^`l|;"]xMw\2v<NM'\~A=i:?M>d*'y-p54y7ډ}'6 QGC|F(Y*Ti_jbI^Jp#Ո-wPBU,zDzS^J#d#s5 hNAӋEzp%B`3gl4L Fzx r0?f@c\am /)u+cN’1M`e}6$9ub2(E]#QuegCz뫧[G]u6"Q(E]TS$ji=9 T *+JՏ'6TY1x uT-Bg]<@?o#gS1~w0bOR)uOS2I#ŵ5)zZ V`0#Ůgx$׋@ŨIr:jBUK3~P󮷩`s[9+J_I7+q jN 0G:L>ض[? ؕkiPGl z-V;ag*B\~ne7j?b5S$|I'Ry7p5%s߀CNƹf\_3R?>9 J<ҜzΒF{-{5 ϖ k DO[#9#s:kG".tV|nu%"0њZjVqj\VwV{RK|HiPYԺ(RvV|R4W  E^xDu Mv6CJ'RgWcgJɟn{QjVz$ü,`v F$Y ]8 ;sUݜ9ZN2z|AoBrC%J7gI l׹%/(~y׏ë?.ǗÏݤUdm<]7Gsד?cqM[5pAXz>Π?[;0  KiDSg%; ,q'm<aOt7 {,28;Y Λ?Z ɦ2;% 6%m9t^漈{ny\t= s˓ωJg+Iq/J9ٲezaQ 1n([|mњ&6J̧/4 U>5͎u G3OgT4Ah&GYͫsD"XAЎ' s[] D57TiOQF%ez+8h Q¼ 1Lf+RI)`]=[.i r3ȫS_1/ usX>)s[| RzM1[)cQ29꼈hڣQ );u!ڭWH+v©C= =6%.n"r-ibp`䢽1aQӡ^;mPA Қ9"h[^Rˌ䍹α׈4:UU`fӛe~jY\i1bxQ3=FEF=gJ1孁i9H(ъzPϋA7Af7^|gg8SNzA{b#F=bÑYQ2f[]to߿oԃ}4V u %1SO;eD!Up=X~dc,g؇. g/?Jaap#ك4>a̻E~#Ihs]:=k%yOAh2˥,*bIH4z%X;fJ/=ASfХz*i==_‡(.Cljx=\ 6\Z ;VҲ`vgN4Y6Vұ2&qX;&J߹e_҉b K\rq ܏M?E7mH~V-bvN&}R΂Mo"l}rz Vt?)z"_Lc.bnh?bX$m\Ӆt* uQd&aHUE+?)9Nfn:/ctz|땒]h݋H27z@ N}IC}dc\95wCs Щ=ᣅ"!<4 nu*N!JEn9bzoa( `˱QWOΊ^m9PT@Ѷ*3CQD\IbbW6bs>aX:Ɗ9R %pIf%š!0R E 9˥<qhW:tGE8^xrۤ*oREau[(j7|YżIHm _ 3c S-"Nz;~#(|+z d:y;{7y gJ`hwsA&N+ö,GޙjZrQm A f5R[?n6xuZ@q6Ђ Pb&OmppaL\:et!|K]7x'j5tQ=4MD17+& >[w5{FNw;; ،m&wl5IX[+ AI LyW>ښ':5Tϱq8T^NSQLUi5=%FwU5l6U;ɊIN;UEgNDJٕ_+Tt{8X U-RU,UJ^py|*ߧtTcƦOUOD uVpv2w hRu8V %f$,Ikf)'k9hS<2Fw6L30YLalD0ՙfct c+O"нd* p„]Q|"$1$6GSr="<օ!.mZ ȕ3ӛG$9rBjzxNJT.&lzCMFDl7w&v 6&Z"3^ʑp/!4PCJ`d;!#+!,aI"נ}aI*DfdC%$#a/-'iHK.۹no^K[ uڹQ'<Xvf{4M9Ns"/=VS,\D-"]ڽ$|]gƺەϴ>t^HQ~:%؊|EXNҮĞ2dd:pt4tKHci˷ʍ,@ EcLG,b~kQ?CK$OF]2XԦcglh7Y$O*l}}Ԣ rPMƎ6 2GD-;txԡ7VbeuXuK#Μ 1!fGzLGD 1՞騲1G"vn;P$T jLt|G!p]_[Η\,Fϱn1(ݭp;8Ž; 4u.jN mެNtp~%8 jJ9:Gbm|`ASIH O4IpQٳUW'/Q<) Qc*#חz p~$%\To7EM58P m|m9ݗ)?}6x!tEQnܒJlh>}޸hZGxAEBJ9>3u=@l|F n$Sz`>lk #G0H\4}V91nD~ O.\qxu=ǥRӶ0kwhĻ79'F;b٢{~ATٜ )m}y|]$˕9T9˕T91pک6prާsm;J0*aKC@mS!/CtASHqj,F|~_7/vgC!8C3!: ) 5gH{;Ctw½!WRdۙJmNK(xSi't `P(|uO^hI ߝ|=;<7?jrYOxv.?۵0zwO/~ ~鞼Q;A|nnj>ɛ_탿f+_(qk`I+k$Gُ9^\_]^\]¿6np ܵd5hil{ҧ73zqv;ُNr~uwfΒI* cǏx8ڭUmNww-1!(D54Owlr_H'?Ŭqvy79eXnUk i?BwCyafaК #-I5jnC8 |k?}x b'w}å^+{?ɗ|iq_G&HbWfʌ/r!fpb1" ;Wic3.a]tYC}"c_;i nPwmfD|Aq C{94T0>0l`ġcbj0-unb X$EFRlB訐g}9ҽ#9҃#ٶsЌL`;XƉsEfDuʑL-F0ڽwS4 %̪Sy|b" }ޕYDj%93 c3TW igzBQ9q gW ڕLmTن Pgx~fvfLކJdWAS/aLS+80nr 2y';J-LP)a4nt+aJ^2#z {M+Q]#d~6GW 1'tM{YTɘ]/;0_13uӇSwG ٌp@+8P{mU,5A`i/2~:./Lң ~]i6{ErgvهO3lEgdJqGz_3"5%lw`ۑ4#/^/*I]0ZxKx$ O>^걳VZ]N*]75MokM3t\zX4o,|cuFg|aZRUCίg]tfAsKкl7t\! '&J{vTMG"NtE Yv"{`!5ZE1nXǫ"m֎Ϥ"T͔i[IL 1?_Ny14(景K=Nk9*u{klidn [R~RC?==-U5vS7]7uDv"Cf(*TNw'5 &R1hTN#x^L{L4Q(GdW >բƼVdcBpKBʐn hlQdx na;)vch p Jn'v{E w_1R)-?+YEN_|! lkhg63-g%0Qopj YnD:oDaAu>$D %M #{)͊_n.ǗKva^n9Vd0A5N8#1Uߞ-?1svP vW A3#onsZ.8LN6I}¢Q_wۨoV6+l9HkThרӨQQ=r,FuuQl)bWOmAj֙"aiCfEA"a@"a"au(nH<<%M"au(֡HYuà % )*adR$K0 Gf $GE̲sͦM0i<|̂vͦM0])fVk4>E{FHFaP02EA<#C%3EA ad) M #S$ #S$ HFH$>"aC )6H&0"aC0mA#C:3EF Q$ L0K"aMr ()2!cm6EDa8 (&r(cSDIFIHFCi?f MIh0? ~aHX?$FBţ|7I8IF  I?#3M5H?#a3H?Y3wZd`$G#yXt| `PdIc`$ē$k$P_Iz`$l@5{ Hg(A$Fr0'7IH^Fr0)`PCb$Y#9 TD%̜.`$xn2s^# g $YP@!|7ùI~Np߀p"kySƦ5NpR^' 8oe?(<' 8oI~Np߀70)Mp߀7<߀7$' 8oI~Np߀7$' 8oI~Np߀7$'%p߀$ 8oI~o D\]LfZZʼw3JN>$;[wpQ<<}_VqW{[jN(Eۺބ[J^<9du5sE傷/i|=8%C`_$@G$#p2!0̞6ȫ  (q0&NqcG$4WH8"Qz>"CD{B^udAw5Hpa cre %35G #yd@G Cb\OOdVG~S zmnݞ:ˀ8Hq`,Yׁݳg1덺|v7/|>+x67 tCϢDjEyrOZiB#O5!~*md !6 ıGgJč6јbf!+@P+ξT-(r4%nd!/o-% ݴ5E -H37UX@7יbFƉF݅.D!!|q(Vj%lKy37Jm i "Huq DOۢf &|yrȯKrgRxߌQ2q#W9մ0#S"3_%Z&f7C5TKDZĻ~e\TXKiL"[J$'L.s>7zX~-f8TRn F򘯎C9bc̈,RBHpny.p苿! @*CVHBd;M^88mCt6[s}h&ȋ ¶hlp{lPx d7%kmچ?&뮝D&{n1@֎d|}\7i0F?MKjFu +T'ƈ3XI9$ S$Kh> #Y  3Jge pi9/۰2 @Y*gpͲ 5LXJVX8z4Y&aX*'l|*|U(J&JFԞȬCl9 w u3ZS$\mh%Jmi-괖Yb>[OVB8 qYgpWP,C4Xqx.Yg?/?ȃpi7YRbOM%ÞB,zmTԦT5`=ǠPXN4|'3YT[ӆ{ rF6КξQe;:z\W1 /*JⅭ< [v6UEEΉSkS}np(v)47pL|yp珳[痋[vn_RyݴZsnHNvơn0pލ)njѐv8 ;Sg]rfɭHQZuE*)RO-pKŽxPS2W?D_,1,b?f7?ۥ?Gyoshimi-2.3.5.1/banks/Drums/0047-Slow Cymbal.xiy000066400000000000000000000761371506652756400210260ustar00rootroot00000000000000 Instrument Slow Cymbal (c) Dario Straulino + Will Godfrey License: GPLv3 Derived from Natural Drum Kit (HiHat Open 1) Slow Cymbal yoshimi-2.3.5.1/banks/Drums/0054-Tambourine-01.xiy000066400000000000000000001720231506652756400212220ustar00rootroot00000000000000 Tambourine Lorenzo Sutton - 2024 GPL 3 Tambourine like sound Tuned to C3 Consider longer reverb for added ambience Reduced LFO on 5 & 6 to lose sharp pulse - WG Tambourine-01 Tamb Tambourine yoshimi-2.3.5.1/banks/Drums/0067-rimshot low.xiz000066400000000000000000000132461506652756400211540ustar00rootroot00000000000000]YsH~ϯݱHUl:v\Y[ hԈϯ_4ţ/)I%1k4hzxN͓Å<;4O/_f?N} nӅ7SV_}wb_}iIu>87lrso::vr:r6(^SEO97h뚀JaMcJ~IJX'1l!ҎSuqu;t9 İ>y29M.6nnhtzvdF'}p5~/766~<_z7+È{8 }mx| 47E>_'(҈wPʏ~~/k$s԰߾o[4x5נ)dk6o6^~Y)W6VWgE:\ol0Vl ʖl [4߷bO/ޝ4CXw+@HKcqoل6<Eu/e^p$PPܣ ;/ʐ k.bXw|Nt3`$c9[aB6.+ɥ]?w ptC^YWn &;O6[;3܅r~)< bP >T6k ⠷GA7}\> I{Dl 6p;`ҩߢsYᕮ֌÷AiMΕZ`[z!xӲwtgC{8O{3*{/wZTqalv)ͷvHw<"O}x|GepPqxYwCW[ɾIAn (m "eVDL AD֤ݟvF 7v8r8֝9Ht~"!BTW%WY@yY>?ynDe+>Z<fO']k{fa2Eu(^X:tQG]z7H7*X]~t4sPۃ}D8 ^U]$l-.X"URxgh9( `*3iYx}q5tީ-}+#iT_~ mb|+v[6Ch{>v@ lQeQeQeQeQ^lSeQfQlS6B.m XIh0]ra- Z(kaKRitKe$f$f$f"cnc3!H!H!HLAX6am u(P֡ CAX0b&ap5>`)!S֥ w;}\UzVe@!20#10#10#1fT/m$f$$T=f$FTQx²B ʉJGf&FR12N L!$]tK fڒ} a]G0tAX?}RmxZ:a ~e& 2ƌ oZqR!0tALAL&Nlk҅ 1Q#6D@:fjDj0JN4j"`K.܈ *e98 &rrVs]T4vLon&,Lo!c!3d SG`*O lUw 7FPy؅ӸKl1:0?,L:FLR[$ER[$E2X$ )f&E3Y-Bq35dI|M6YmABY#a &a FMfjPmPm܂ ;sIXCmƶZmj0Mk]ֺ$uIgh5J`slh)$6 k=0cA_;葰#a {wlŠa mJIXu3m_朄5r`n3T&5xPm$a ='a (XG+B6h\98ݒ)|nRfc#Zl|P5I$a!`\lMrI^6M& ؘTMs H|d7i4n`F eaN"& l& l& l&  % l& lnn`6n`6F`R$:& lF} =' PosC+yb49<4iIV%.W܉?`bJحPzDTDCΞMf&AA\m<-m8.KBUaxe[QԈJ"Mm掯 Nlv͋;N"0X,F/P/թ5#,hA/~q#mNat0)R8*c{$_$ïpÉVXO!L ( 8-uAYJa\,zd؀{4iD%KXͼ&a;(߿^7baFX.wnbPLGRrJK !ǝ.L k@JvÛ뫋?$+?$%6y'W-iF8Eiݲ"r:.ل+$ =WBfZt*WÆ%4ggu1b|TZڿ+y1},bQY w>+^ q?Rr,99Sl]Z!_pQ\f2Ҿa'5 .Ky^QZAL}!0.TꎥU((Qa<#NpV̤cJR &̥J╖ F+⬲g-$B9|%olkb:MLPA7P 꿨IEsx?Yq@g T{@DxD'oۃNcMej!*;DFv7M(j,@Qz{zYnNNdT"Pc2 %f0]yfV[Ȟ\qAi*ۄwgG.mJ% %ǫ0Q|KUw;|2S;d9 #}t-pLі?]QtTI<<{Ax$y HAgع|5UDDv.]\n>]Nf?/flr ^Ux[iDU} VA<ꃰ{XaUg,w:=bəao;2= {L\Nhƞs S`Rh3!g=Q %}X >0;hpMB;.kOrܞ__qYמhER fAs*:E4>^\AҬ@`vqؤN wilK N\+gUkg狆Jh' fΌ;5` !ڵ8>K;IVǤ ϻ#(-+uU;i3zM4GђHRJ08UDqK來_-..BmYӞtrJs:hۂf&8@GnI05|fq&f9i莂)伋7e!9Ɵ8al?q~CX#])G\ǫI/O5 r{m5Gݢ#$RصP7brq^f)B4jĤ jڑN͎8LL2:#Ձbbˏjx&II,ۗR3)tK0?栳!LL:bMkƇP1 ,$ &i'HIə\UJz ]]D f TĜT͖VyIȫ4O:BFIJ,:1(\ TT: &*iTz̈́~6^)IJI˨ ڽ,#BJ,o=SS][>?T半J:w&+t݌dc։P7ݛs{R3q c.tJ}݅gX3 *Q˛fr*(PKTEN;7;nc U$RU~F5;"'J%㚍 j(i,‰JF\,W %-&'mS %jLI/B#[t8jćp}ժlI 2pԪr [=Zu[1 Z4㚍Xl5v8jzƚ53cP**&*72jR_' kpJ)jCenQY 6kn58sQPD;/C;>w(oxMF 1lrORTI7LيgG%+ד\둎ue\YfYӸrRWc#si)Yۚ&{`:wj wqAUt$(;Db=N};{`#ݭ H:ra+)'we:#L+i 0ce 36so+u% ~S0\,nww.}6Tyoshimi-2.3.5.1/banks/Drums/0068-rimshot.xiy000066400000000000000000000136121506652756400203670ustar00rootroot00000000000000]YsF~JxTTkI^ΖP I@_= eJ4gouыb? ~=޵OZ^~ɧo~zu>:G7|zso:lO t,+ ~OMl8v/)D[pmttM@&0JAEJyXl~C"xV:UWOӫy71ī0tor=Nޏ{緷7U"p6>y?Sڄk/ZnZ+/jmdwonC#|_SZIx0jyb2ɻ7} OP젔mrQ~Nu'[{d3nY9&\ lVlq|re+*V;\̧-IpiO{{f &y5fpupΡ縉rn Xv_{K' mmM|`8~ Kxˏ.&1\B)ʸnlrJ%w62܀N I }ɪ(ST.K(z[ nLye@uDP:]X9+/xz8ަ9[іB6Pɕm_8ل5vp!*zǩ#R;x#g1&L s%K U(P oDg ULI#gY.'7oe'XOؽdr^g>xtX uc,89VV?375xd*뢜 zt<77X٢hz6ԝl:IS&>QlWjʆ_z|+vVT"tsʺ]\|E܁NL]}v : ta >=hr^ *ҨxK6D;Zu#lFaL*ˌCu司vC6wNoXw<&Ost|GeVhTixwCWƯ}yp!O,PLhlb=Tig0뎕/}|8az$r*PEZCx{Z@U9FN˟ET9$b!'}@akMؾs8Lf(}J]CZw9tQG]1;oWoTC˻(j7ҹ?p5y*ϩp^,ױwh O]CBY0p'wf\ygIϮ\@21i4\=#v]l 'C,|YZ[\]%6_`a@9~6am#LAMA ݦ )[> 쌂3 (; CXf}TZ+^*0000000|?0cŒŒŒu(P֡ CAX0 .a] ºu)O,„Q֥ >6DJ(?.WUU1OflCQCQCQCX~6 c3 cc3 #c(eafaaMʍGG`%  3 #catX`Fff U%nc3m0Ӯ   lD6\m0Am?Zݲ aCaH` cF60AX~ɸzJ & &6fBÄ Mj# c35mGfMg%*'jjY&D[IY89+VXD]\p4vonߨ&,oԍ!c!3d SGQ`.W juw 7FPyq؈zc1u\aYuHHH 50KSL%dQM0 )&CkJP 0 kh<6 khD60KmmSt {N0ݣ-4:`nm^둰#aG:C{$Q㜃g;M&a \̔IX듰 վ> k}ְxMX1,bPm@9 knMkXܠƜEmc$jMڐ5,~P$!kЊж {nIf)X-6>!Mݦ`nFz!`ؤ76鑀Mz%` ؤw670#R= > 5R=fО $" lR& lR& lR& lR>#MؤM^# lR& lRFT6)n` m6)n`o ='} m]ś?/éI+H[][q'W)[Yo7ίMզrq3{6"7IJQcIXU+@˨UMFʡǑ[,k*BQZ>l `HF[{r}K0^%1X,F(@KAu*f@H0big_iZ>lny ׷Wn[fVX0jzTFhaŲ@g[^J`3ZPU-19 tLj&F̤]c,{/+z7x 4j~i3+dX6ԝ@ .'zF2l\4Dd4Yۆ_=l\ ;~c|]&>$+2jYgK%^.CGN5`z;ŘQĦ7%(_u~9[v礤ž~hY'\f,ϛg!= ^<4{tvVOnOU_LQRn$yZ>qݞ]VpIY@=&Qhɧu+찺 sRy >K)6܉t><RdŠPq S'˺y(_~W!cV~CMXsb˷ڏpdy*[ iu@m\xAU&wAҔj|p|6s[V~5N}Ӗ8-ޒ<QΞxH5,Vv5jXUdpOB%Ks~T_&'Udoْ !Tsy桩45hp ra$U7,©%Dc3=u#MhWC?<3.p=Me J;Ҕ)ڌiZ x]ozit5^sC|NH.z'zkf̈ԙ:p`y熖i䋙Rݢ ڊ+.#G0o$~:LWߕ)_O@$ljb\̧5 W`k谪aUê>U}v \VA?;/XU1Qw@H킽{;Ȃ{䩸 f J,_(."[LxKȧY>ըLrOXt`O) GJBE+'v\4BמFv{a|9Ხ=+"ysBνN kHfkGZkjzsS_TzޱM"wEE4"aXTza\||h;75Y$&1pu5gƦLk,֞[.v;_6TE?;P*lftA3j?a;VǧYUꔔ}V@yol:;:a2Gqqyb`ZD9.|U.pbZAw;m+~/ -..BmY7q 43 trJs6n$Jf[#&8Gnt=0 IFur0I朴 tG rke!8al?O4Xr?=X#_)G~5.O ʶXJ`DTtI⪱V04j̤я74IHaGf&#5AbfKx%YI,ٗ櫥aVj&`TC տAWCt$5Lf,n`&i,M322:B aA?#R=[Z,#?1!d?oȩ%4LApH7?DqS=r4of)S Ɨ0['ٽ,h"BJ,o3Ss][5>?博J:w&҂+tӂ'1~(țι=mYJ0@-|JϨaB]J/a7s'lJCwnܴ!v[m& ;)=I'?YVN7(鮗L6PRji>oԣ.9pK\7حn:tZa Nz1<ũ =] 84vRQI0l;kڈI(к4lUi(451Tz+Tzwd.53R[S7)J= smm|57<.L{`ԝJ6XybU;`#[9tȑ^Ie?wy|;3ǪE&CwlDBUY13 lL)JkU<ݾxO,7n'gӿXA{)pmkVc P$'JuY<&&pAd,ؽ[ 7>L\-9|8</yx(kw6)yO.16)5}nagK٠n鿌`K6Q,T%$a> -gWC3kL4,gD iv/a`Xk҉)8W0YJ( z4)őev Dld#Bl N(5TZPU#yZx'#0!HOr*!$Son $Ⱦmyoshimi-2.3.5.1/banks/Drums/0069-rimshot lite.xiy000066400000000000000000000137551506652756400213160ustar00rootroot00000000000000][s~ϯ{"425_R[<:F'өHɺwin-fvi-w7{=~ab$Q>,^"{Gqxع>l!J=E@dc :o,44O 2g>ncȇH'vvyҺZfL%CM='fa-|ٛ2U#{|8sWS୾l:Nx7xqwonC + =zS;qໝ j47ˍ (N#H5?KWoof#Ap@'>颅 mgÖGxS¨m(f)66?P3' c9SF7ulV"a' 5ధ!*>uuq}SZH&tXL&M{x 4*@ܵ[` @ypf ILo*s9v&ts)7 !70fl *sI Ϛ2wހ])O?^$`=`Ͽ΋d4S:HMnd䶮0[MIh|~C*> /|W;=XVYW' ٭XMvN:W"Z*?;¡C%nzG.~`ō'j̊_Ā+̱D*pȵw=;ipӚ-^2 /Le+ =:5# 7b20Vea0MD|ue+q?͞9$J6޻`4d|o.S2_‘ yͺ%|q~ޙ2 㶨td̛A\<@1y d pD,0- %s*`΅n6ey:GcLCL)1A$dJbL)uܳ !&ȔTXv|#pdO[%B!AqrdÔ)1ScRҠw[Iq0c$F8Li@XteBjp8!cƘ3Ҍґ*0%1aJ3pp.v051a* S a# mȪS5A8LitOWo-7U=}{I_>ægsp2E8 bdòLRa0E8 bd`3fd~hՌ\ʩU!LF&:fo9zTC/*ifЛzʪcwKpѪ30Wl o;W +e9'J1S*2sU*xZշbyiIA]uCTso:a"81n.Q0BV ZQC+ `qdBjjXg`@jx*%װ@u@'i xm4Zr (cC1ⵡNxjPbZFjj-^C걵xmk#-6ⵑx (x5N =tu5錭kc-^k/P-p5,bPal-^߂̵x TXaq ck9P*Pk5,xPal-^֒kXZrmkJ|XAnxy5\3{:fb 5%5r4z&`j0 Z/L[S뱀 |\{/`@ŀ\ӊz^ `q5L, ɄPEzL4nI4Ѹ*bqUʼ1(#{&7P`},HŰ5aIE}D +U,9 wsC9:&7[4TXvzװ\  =UnEH bX耤 #cS^A?V}W{l܎ \1+mB=@#XYd1hm7<iG.tU] `P^f$pze& hE0{/N$Xy"ٷW`4͒n$Ё, t'b JV X?h`@wN$KLyv~~{9NyP`ޑ 0 +D]4#B,[N>*2vHt#:ԔLIVZϞm͗m+`oaiōU)K(i#'+Za N[ݹEE x [,M;~DT*̛탯.v h dDް{/0.gc$+b[x(C`γ )d _ɉmvsy}u>''wu? I_5RuEi߼;.96snY\@Ϭ9w+e:ĕ37Lm*q ΂gM1U/|9lo^TN#3 2o??Go1ܪdڌ*E)ëe+ 0s^@йsC45-L(GfMoqel SPwűBQEX>"zڛ+Gֆ(OEdm Y %aU=%U[UVPo8=IC7| oJ tcqO0k:UN.?MT+'V`,P+^U^q5PK]2C8m4x^k5N-*qZ}{-,OU5,SM*jkdH Su!W@tNGeRt$1WA VFCKYfݪU5h 8PHX)dbE&q<ڬF$O-N?$Z "j£5ekV@F* Ҍ^p7.Ew\$јHS?rd1!I5JKJ&'h0bIaفcj%dZ/̆Vwz=5Kaڲ |my˶!y^ؐMDDzd7HvHXA|I6;MiNn2\P]O[ƾ\cc>5jlx8#YbJPx3jS,۔Ӗgq@ o c QƸeLă 2+ R2J+1ybpdF^gX8Vo>*j`'1`DW?TUb{ iIo&j8aTf&)#Abf)$Z h!YIRZZ P3I fP|}1I\n&Тer5lQ?博J2w&D jmAR٨}b?ț,ܴZfnc E_Oi"ZCK%b4&}2;5 2UQC;:Ĕ$i$-8;)Q U$哏6%4oSd%g-[f(e%my%ID8q;^B P&`vAtܰe @J2)o3^G Nqb&H$*Lb'%3m6l)J.ZiZP"OQDI(4U%QRtCML#v)MdެJVfh))zdZCml㖹Q[ 7l}J'r: *ѥ;j$E8t&X%At ](QE7ܷe{L^ zE1 &O/Kd%Ud~b~8.O &\_^OV]W5N5^|A+K/޶[nsGy⢀?(=.p꡻{T7NCw#c$r:+)'<+4R{^o^Н&Cwl9DZ!DY>b6}*!iJgٖ>/f_xhٕHUx}!`ܪF a0|_Ƨ`qi7A4gaarzWdz)f뻳_ԇ+${6fK_WNϗ~2WQ_ϛ>c_B9xI8ِlZ4gW7%m鯼87"mNO(}I05$F p\Twon:ݎb<n;xpzS ={T ^[+/t^ )<% Tikj*CK|Tޟ6)b&畷P_Nn>\/'|n gAd'6\.[ݿxv ^}㷆ۈW+4^N~ 8 C)hd?F-@-Y0޼zufqx诸qN8R)>-b&{>>kڀRYly<W"0gEK A$ॕ6ʂzG6bj "nnZP]uԡtX0 ]|Д;(#9 oU߳~%+W**`%P37~>pj39y˸XB=h/@[EBY-G *`%Fi>y0Z{TSZujJ^GG`DJK!2+s!Q[:U>}̦2'9ҰjG (쐉Ku(r_6~u=+ T^`^'A(tQ&ahBAQAu[O Z<~@2Zybovziil p Kr]w4lß2nT9,tz'..i5g莂ZG#wşXŖŏݪH p*;*y'nf®YΙk;@)T zGB_V}i=Xe/O>LYB+uR_%W*uܣt}ipgWh4xU7_E zU3k MM ڦⱚC}E:uoU| tSŖŏﵝN+op=ZVY{AVAM;Qoxg-1=-߯HS|Um7?ƊՒH}58Sp2<+Ȩ֌#hGRdC|MG3/]?kUd5IPؖP:kɱ;j6=uMsOCGcc:mlO_Tb9V̐*&sCp2d;iԶț9z-HntL m4ƧYx"DoEx)HtPՍh>8  Qϳ 3}s*HȏAk Ds|Ҫ7[-)&NslޖUC6 )vxG=,l.*.˃=d{eex̊ O1@`BUn"L 2+Lo/Lr] ayȮ =20}o& s8eR˝n0  Iea0.u(qCmTQ;$2`<Sa00eaN-(a0Krݥ]a2j n O]q{7]z Scap6m8Xّ\p8 -E€en „[0+L o@M0v) 㧊@͠!S5Ѐ@/L L c@ -IXρd@ LDi_8 (P@ؗ$g s6$IȮ9xB}jH!my@{~Rb6Β\ZG c#j WKr<\|D Uln8yD0v)$cS%NX}6esRa^zӦ|۔畟oʏ95owcŽC3vKOԞɭnrprC9YP& s=< ~v n+ԥ\,RTemuj:ܘXc=KcYByE!G\u(,g8%KS>YkMP~r(?X܌X;Gr\T|m.Lvu)6580 s8K XKp='@l74 J|۔E`svAZ ^8X ـ @\d'nIu \KSw .J:4]nk 8lJCEŀ@úA*@ |"ܧx+'́x ηME XRapqM&I@LϩPo'S *HX M`MRB=UT^mS! > T&Q~Ai22.2*rc^@6ƙp9R81I}b.<`#.<{NmRAZRNl<lש6= My>EEƥRR3hȥ)ƪ&*z.=`8~kUxR*)yjc.Y4rBqTB`oTB۔UTu1T GT C3>6Ol%c%c4eҔ_^ wkQX3ݥb)QQvR7 ŴMxBSK$u.݄C9mSqxØW:?g'nuMq/ RX^-7Ͻd |H{ ej3^PTޭ|`%7K%@!VUA;yh9"t gz eAIW v{Hw4k`b1ٗԋiX3/bY5@RP4|)P A{ZN/h\e>wW'5@oIgx'YN;bQvcD fae!OakDNLbR4VbRT1&1):Wj81Z+IE>)$&-mU"73P߶2oC5RG&ϼ!Y)FGj 3!  4l{ ]=$up0.&8=^ ~ȧ߁zC{QH?K,!.ms1@|l)R?ږa{@iucUahMŚw塲jžnuqh˟; zsa!ltrYyO .|Co|sχpKS^ χq}l5:>5}ЉMOc&%R>D? s83k9Ȭ}b!E +C!ӲȀƯ{Bx-Ւg2VOi)V9R qFlUyD8L31":BnAQ@Om.?H뀃 !c*+쳽*ڮKUNcȁ38bNQ&~X %JWA:}4dh7>%ȴ0zwL0Q|ml2?0c׷vTWnG VV XEm%%6Ә Je~,@&LdC'J҉z!HFq`#Fx(J Aj)*OQsRPcOUr%;Uߑ\Ōǂ)%#FMri䯶׮ҒPqI MɆ,*YZ=^ݖ?/6xtWvPۦv3.T8]< uh+mM$v~M\ +5㮪"_ESې}<#1POO&?jE7uvK.>}wrq 4~&j8oqfEB`}'qdҜhOEc%,e4agZv]"KG #i:I-+| wN~G#Nd|RV;a 3(fI;1%U-26_Nn>\/'?'d|Yï\Y$bo#Wu@hkIU]+ZZzUK2de񲗨 cҎfKWՕ3ɖz]َ'©X8*7טMX-CUNMXY(~ok62Cwlz8cc-X폧h4ݮ~=Sݫ0)/|oyoshimi-2.3.5.1/banks/Drums/0086-tambourine tap.xiy000066400000000000000000000317011506652756400216130ustar00rootroot00000000000000 tambourine tap Art Horan CC-BY-SA Appoximation of a light tap on a tambourine tambourine tap yoshimi-2.3.5.1/banks/Drums/0087-tambourine shake.xiy000066400000000000000000000332611506652756400221260ustar00rootroot00000000000000 tambourine shake Art Horan CC-BY-SA Approximation of a single shake of a tambourine tambourine shake yoshimi-2.3.5.1/banks/Drums/0088-tambourine shakes.xiy000066400000000000000000000340731506652756400223140ustar00rootroot00000000000000 tambourine shakes Art Horan CC-BY-SA Approximation of a tambourine being continuosly shaken Reduced LFO to lose sharp pulse - WG tambourine shakes yoshimi-2.3.5.1/banks/Drums/0097-Stick Hit.xiz000066400000000000000000000121161506652756400204650ustar00rootroot00000000000000]msH_=Ƹ*k] nJak' _#1̨G-uU{M3_Ɠ~h͆N>|h~4nN'_nG^l6^ߟvf[dKo4/n;Y1 VfZO6n<:Kmh`Sk6Itƴےظj^\] '7Vo{ޢZKCsxv᣹[X__hOjZP7tҸ.xdWnqi=Kg짐-/J :20Wo:nB/d=``r5]]{k6lL 烷V]\'wF~_9κq:ӯߝ}kl 5?^z507^vLeA#{ְ ' vrgߜY_Vve÷޿kwҀ⤣⠎6|Y|ILP'a"1|DKo&``nIms|K4i.ļ,Xk/t 9Fudf^Ci i 8~IwX|@RsvgfIũZ36FfW22_'` k8?$7|:ŏ'o @ຕ+OpZ_d$8,枩\`*]k]ǓZGf".ƙO(ES LsmޯDCޜ"ߍit}%Obڕ8l:,?LK囿bdI u[VNJѡXRP8tTNxO NGsI{GǝvHv#SQ?8֡SFιoCyr`=a)+!NI͜8BLW_[YPS.4qe?AzG#oMYZ 2>8̑pRȇ~ޯ ?*r.[8-~?بN7(:VrZPkޒwccvtWRHN˹$XR#LhDZdvL.WR3)+,;I#SR*k>2uonya<F5e>\;#vt&QhM~CJ 'x5P{v'F+2 KK6tCy ޷)0saN;rOZN{* eR/}7.zI1z2~FEP%o APՙέj֎* )j֌` `U͚XY'YEUfdYeVÀoȩl2z Oh8]>Af0U}iщ N3|*nQ@t&nl Y1V 5=[>W lQOQTD,F(Wc d* {dBtD!ZU1J歺VEf(Dӱ2٥b4xSVFt RL(F]HFwh:b4ٛ؇e5EY6Z_+}JߊA4݃hhˊ}Ch:yCh KTA9(D3L#bXTA5) 'd[B4T2ò}BFݘ'z ChqEhŀ+h]&cMw!a#|1T*X*F+L}BE1Z礵N1iM@'dtvx>u6545 t(BS}**DG4TF78Bi:e93r9>DL9_9Jg4GxN܌u$O#\Ւ;8 7k Ɉ`ׅd0ïq2 l]8Nw> =p06 [&*/\ T&un3Y!~Y#ZEW7g.,{rɹđ,J܌cd3 ]{$;3/Wu .IoW s.51dl\nRɓucG+VeE̓ġmu_ձy?kG++f1#{C&,Cˈeu]>8@n?H(P&М~Qu2 pYZtQjJ(p jENYgP2)|ߌJ-?Ed&+ pG&V܉}Bom͝K%EZGGYѤ$eہwmt;v XvnNc>E@! ۍ"`m^WeYjKaOՇA9d^2J, WsF'ɼqqoi1:EݾpJgwM )nFQ, ii1&& aJY1K Ɏ$a+4ooI1|˪cɾgY1x骫Ód! ~0| !FoT̿wx;]lBL~ގUtq'uP. &EIxdYx*n!j:Xu*p]hU2)tT1pEٴ<ٯsESN@B#< 6V+}n'y O"QMs Chz%[<~dR On#ZH+Ec:tB$U)B v~@Eng5t^5aV -fUl+uU鲭/_lkaxu[j?v:6\MLT>|T[DX5eBOqRlFHff@ɱS}ߊR6\g\:s+' {ap+{KCZX{mX6g<m]أn{1 W,ʧS+Sœa %Osc0|WsGE˩@th 0sɍ:ھûh23$#K̍ؓ.鈍>4''fggwus2%r}fYQ\\'wFb2b;5|UꋶLڹ^`ǡVn7Vt[vC'iKlCf ؈;&HV˗ndK%zlGItJ6?:o[E-Y\v` 1Ka%zb*RQ2r?͡q2_`Y&3W;f|JbIZЌ/I?R&N*"c:Kۑ+\٣%Tψ"A9.F~BUcRT1UR38oh۱Ev_*xG9Ў]wvޮ7v#V]zGe~[Τׇe >y|E9qesuB^S =M:A $q+G"ck#bc-X.߃ Ŋ$ngϷ3+>NGyoshimi-2.3.5.1/banks/Drums/0098-Wood Block.xiz000066400000000000000000000054241506652756400206330ustar00rootroot00000000000000\s8~_e`!]j2s/*c;l _˖X\>ĴZRԒ//+xaE2o?^g_>}rnd3,uXeW֟AxgOz#ٖ1cٵ|xALhOЧQl\Z =nq$ۂ'|<_k+$ Zы*Dԁ[ni2XzDJe3v~XoG,횏qe00>Ht׭$͍UD4$fE}Y%>ze]R0?D?c@'eF~\9+ocS'h2`0׭_1>yC;(FHg8ːn~1>]# ϊixTVQ8 g0X%qSd\;ݸ{%EƂE aAԁx‰rY.]jI%,E~3k ,pV#L(I&fA--I"l^i&G\:,c 9J}keg3}%Ҁq}nw&ӗK0bFwHHiCD<6yR9K(2:AVR" onJty<Yk'@$@y; @)VB]'~ډuC~ Dϐ(o +@jӍȡ`^WF%7j?F˯U%C/Ase('i?cTh7˭bDکǷiUІc PG`^mr+A%3VGiokVXHZ7J䲛" ˈW=rUnr62y le%% l\Yك#6s G%i>/r`3#}~݈=%gn\/=TC /gl ^M-uTXz&{CpS)zz^*ၦz=U:V[< T&F{&{lW[nOOS:g茵nUm4{ 8$H' gpKim@j^hmӷhmnU!`R"tO[4)gcSNFJ:ߦևZ*BhK*BlSsUV>5խ>GzUaoi|pdUU@[i}Ż MetR gR>h*M ߨ?*O hm~UBJYF4%et"@[p+OJvQߑ7JVm)h]SUU=mE>ז9ﰈ4 We*tW"~$uJ:ɠ[.܏X^ MmE6MmX<6YBme  KDʷ,*hla8ێD_#JY!Vo,h}6UB7+:tVv9 .CrCX_’ݫH+WOnz p۫HOz 8jPeąM7_Ţ{=}\.Es6(9KFP+]Ϲ'wh6 auE6Q}\hF@̭@B;p)[,{82 Q #"X0`ATSiᮔw'X'("T7B"9[Pr;N_o`h;cXxIٮ`,W{5{y8$'[7V^ʤ۵%]wFr̮hߑVтyy ljyIp=Y9Z$6,vy!e\eIA=%B h3=:ٚ'8JrO;5lT_$IJ)M^,0Rq",Z@'Y;JH)ȃf2yC:6NƗ꠰S-[h42S;ڽ ŁM)936B]>#Cd*)˸sF f<*pp}r>+ԕ]Tx<;zeͳ#W6Nz^<;ye\V,? "};HKqMZTaZqVOuV|S]+v멮T׊zW1S= w/Ut֘Ƅ5Ϋ@N ΒGsV}.ʝKm %r]xg*Lq42w?$(YHO_`Qyoshimi-2.3.5.1/banks/Drums/0099-Finger Snap.xiz000066400000000000000000000044521506652756400210050ustar00rootroot00000000000000\[s۶~`[RftTYj5%IiHBC*/_ Pflvb |qY{F$w}'ppո_?}z6\~Y.srv[G^5: B|r8;$)d͜ ;x/A![r <4 }y0aD|Ģ%ӀNv̦*0We&i-kגU*\ *>mA5Nɜ05h LsBy"d9{hQ,"9FD&Cp#ķC!c|щvWw1pmW ^|.Q€4oʁjp{w3Y_> ?(!ݺ w-" }#n)ȺS(f!GդPA#b)uԵ& @Ap fk٥Wԃ 9" O;'}Nhyt3 ݔ  b)J4nS"A&Ibia8hvZz|;,sA lp m_k\ˠU4oI?& fbA(υ(mAjO].?"'QӢ?esNWV0wQBav[@۝GD1~5]bn]%<ɦ!MnRAə>)GGM_L.oP PaD<.]6Rgу㓲2U]|ҧBdwFԮOIQCtҪ7VG~\ 1GֻˋnN):{!{^t*iC ԲTN'D`6:P=aEHk] =ÔK$ (S`0OjԜAr7 0x~$V~Q$O™ Jfj?e<^v()el:5E`(Hd8Ԙ`DF/2VlSD!W"#ߓUc*jSX*TQ1O" ?J b;zUF%PQ\Mc;]=z{,es̨RFZ f;i3&+Lwpr#REGJU QHPL n0u J}հM#~'{ԦOYg/SVW7vA& @${IL3C>2ꈂrPb[(%pAt\}ڤ\aOP*Ș.<_8t\ C1QUB\ XIޏE*[;Y&G%~ogɐKNӃ6;)N84Ἑs@8R3G7م|"C4`x}=XDk,}M|yũSqnKB ڊJ{YdNS%̈Z ލ%(=!ŚDr(\줏_P4a%毊urAakp+ο S2AnJQRAN_6,6 L{myo*Ge>GOeFU~*2_.Ne~U |B/ng.V@8©]O+5ݩ爎rFl@2tJS<(.(ux^u>{{7#YAגvH}B"<)m@ S0d]4o*f]뱮eXײzku=ֵl~w뱆k5hi_ۯW+d|[Z x4\#s_ˈD8'^fo36A?n1hC{q^65F̼YΆ_nn@i]cNt /n=`R!cdgcSV( < 5\xM0F>f ?2*`V+ v{#Ayoshimi-2.3.5.1/banks/Drums/0100-Tom Toms.xiy000066400000000000000000000055541506652756400203350ustar00rootroot00000000000000\o8޿B/w\GG qPc;8 Kt,icZHjHʫiш8o5'qb,ޒ4 '4<6Ow2=/l \gֆOfaZ^ OH0ėC뜸)ex56/x1_ef2n{s:  &d!L׏(frX Vqz0EF 9-&6pmLpƼj2Z̯/[n|7֍ϋ`cfc*ӵ/fm\CVn4jƵR]<;;ЉAp-n" K:9UM*Q+K(%3 eAb|aΧFd o-=)VQ7і7i"䡘_N13 bJ*Jmjym< 4"j>jxqy>Y\jm v4|3 ًDB~ O2#sd]LS OsKvB;4+tWHrxS5k…[AXpi}u[vB!QӢC-4p0Qbkq'ܯ LiDڄ݌'VϪ m~gmHpz l>x: 'Jbb(ۭ6< jdol}ee*ye* [bkKbE2mrfJ*ť.&kVAſASlBnܠMuCJM7e~ZB<$ [gYܑ*#*LN#W*Pt92r*"+LqӚ!쪍74`SMK|/fɈJUGȍ_wWϻ&^(Ωɻ獓Ӛr#V %cZ-T;)!hQ Suo3y&;:;_ [H Ju~V"* ,N6=Ц*#rxMQڂgGGfc #THSvqڞbH<nWS[>w4쾜=Q4͗‚;hOֺ.;*0OĂq,vіȱ.%xX:5YPd My0)kmLuU6P=ؤŰ`6:ش6ihNj-ڤpn2ܔkWG)m@9&Ui OkE_8?UQ,ų")Tjf:'Tyq2Rqx 2_ Ѩ.釤懗|aGy4_q:y~vKɲJu%xP'TJ]^y~g}ϙ / Uw?e>:Z|(#YAE Xzku=ֵt}/s:/GE5K~A{lA_"!M쑎<7te+cƣgtA#~Qɮfoːg[|Rn I'X}tXj3DoI PJCǚX͵YH Dpu9:nLGRlK|t);.hiw;k'a?i'%TTȢ+܇)]}eŴ) =fU! x«饆Y(R3!@-ugV5o{r9;Ky:,ZC(H  E`4KQiâA `ڳp1uӌiJ~)w#`PXyoshimi-2.3.5.1/banks/Drums/0100-Tom Toms.xiz000066400000000000000000000051351506652756400203310ustar00rootroot00000000000000\o8޿B/w\jˉ.\AMl,E%9Vz7ԋIӞMሏo t|ﬡo543}w~㗏>z8r35Y$"(gw"Y`O>9i8ZD6#O!x9ʉ.FڐDœz::\\^ f &1}W>k Í-8-1qcxÆӻOjϗ dsحOȸF4ty4V(eԻg9¯Nd8 FA=f&FX&')L?H"+ȳ> c=t|Ǥ ul|/ _kƖ:ڬbAT,W>Dsa:SXhD)a B-.iN(vFWc5ZT'KZh{dO񺼊#\=joe#۽g)V&|@ (/gdx lW7ݹ~<.GHK3>Ӵ.S{,V+xIΈ9V,ȺHс*(y]tS E kK?0ZuK#)ap""-KL9S`I9N'l{q񚟈lplGG7#`j̃=8b2EiBd0̔ȨbNxZi[F`6 *x6l Pb)ozYnHth`oy?ޣJ7^&Ɵ,_cɞ'l@ GḦDv $jhTaXA`X/5Lf~݅o  dv(f?1!(h"=cC YWȊr'@ /nGݍ&/*ѲL~IFRoWcJ". R9ϬM}B]MJ6[ yT']b!8Ek* tjp=AaZ;'~OfZÃn<U^Ϧ]/!UY#d`cNv& $¬ rw #5ۨ)ly\6_e#eB/nY>t-`^EٻޟX @'zs{Qpy"g~z(y6?(,fڢM'P~=#5 My9! 7sOa͈ 0|ٜmy@*0>-3(Q'q ! Eil`l~yK6[Q#Mrj+YfkR;e(쌎 J(#`|YPes/kJ&R0 fEs @(t!2 W@ "-`Kpg-``{_/v4ӓA;FXvHY_ȃmK"@r=<^} ~)L5b#hs!ڵ 鰐Y3hҤNn2uPMeZ`!1[>Zov* Dž 5MHl, ȉE䉌;hN1j®tI1p'kÙ<4)IvOS28_9[fαX5ywԼ{HjV95yԼqpZwȨ}k R %i') a;foͱ:B'3H \%CjGũզyeX 5".:mP,d4+R)fc, ֣>ɐzB'g=yfWS[L->/GOTb*U6ړe ̓'5`&YAo uu:TK$L@&`ؔ;VTL2I¨&%%ҩ%II/ETVM7&.;M) ,{5 [j g!%hh B0*|MMx:XO5a)wgG-Qz\5TQ@(R~$q2Rqx 2_ QoR]|\aK0cμ|/Iozsq~CR*9oDz!!FU!)*Wv$|~E} 9'󹪻0j?0!oJ7wQ=+DW\):GwktX}|{:(^`nܓjH#hמk{Pũ4"h8tk@Nv*eOz^yqn~P hs(]n٥$牬wAȺ J.)ZYu-٭Ǻ\c]KwRzr`]TGRAHnmbO4$pʳyílظpFmJ$qݑӔ}QѶ!~L27Ki]6{\]>Gq=O}-^i0~9mu<߸Џz|>NEZOU$iҟSfC*[,~ٶ6mo4-7y#f*y'oS?_ӯAlҏ7bcjQUǾw{Gmy'oNC~Jcy'NѬT04X$2Xya"hX򜐐fDjUJOъw->hOLt;p-D>Um8ʗE&0uC8 mm|!Vo?7Fj4XIOE6IcX΃FTy1L2(Wl; .¹ h6c~d.kOik$RY j`#`Կm7vDxndNaTCa<[_$R=WQKci5*YGI{|?ms څ􉪈z7ѻ+ir#o4L+? 5QQ>y?iThۙ*h%&I>{4\?C*-?m&O*>Hҙ`J3w eio*q4qN|xVz)DHkZ* H03m%P$+,a m6"z&[OJZ<:~'uiyi;J酺ϵyKlkstwy0V2s(AsvN% |ade M%-|'i֛i:v?fMJYI^e}'gW9Ӂk㉖bt65`!X Idd]dAx~/lirGu mNbRi'ĶHui4m8&U|oJ& uդߢΰr?W4TGP6((2?bu=w4:, i{nRPˣpOAٲh 6B̝vZ-sh6V g1P֤3j4KWw5Q1`<%Ai2hm%_Ϯ?c^PΚّU5ln"ݼj{"~4)8z_XYLx7 / 5 Q*NDžJ:"ZBh3MmTIY-WqJEoRn~đMs%Kb4w}1ɏ;˃-!:y$e݄GO TV=rv좧BI٦vY_"C5 `eXH"\֎g,V!:cxa.^b]3nCa³+. 9y4. c>a.@Hٻ  92pR0@/ vi0^ ;Nr#>ad la'h>6A:[ƭa0:%٦F)@&Ri-# S:a"h]gJg:%p{ˬ0B+|#>„h_*0e0ݳLij sv߭xa,Oal# KƎ4u::v$cp $];1Hus8T}Kr.0m;07a],$>a<钍}ƶ|/c.B݃baȗE:SgX81.)m tJr@Vpc@) .c0p }9U:42a;mds2K!:C$$t`Pܸxi(` E x; jHՐX! l1*Ԑ>H6JԐs4! l6~Qڠ4L91ԁrtwk]Dlz qN(y2@]<`3.LpG AÚFjiJ1\6l5G({5Qd.Yl\=`-6eX?EU({Ƌ\=!P=E]=`eڿE޽pQN ;,Pw\m|㇄u]BR#BQ5B`C.J!hx[6=9$uaݣ0K#Fq]zA96JkgEEif9\P\Ctg5)\fQZq(oFQSnpߝ"Ɯ>_G!/ Rxy%K)?uQ톜O+ϋ +?MK6?A)IU|HhϖyWa$@ƍ%_Fqt-D)1x^MR/N&aɳf.3[6հcRT3D`(>~^,j^2_ME Ù6Ζ&5R,wղD+&j/%hs9ض2IxM\HXZZO'O\li i[Y*fR(8(Mqd9'[4tFDUUɴY[hg&JYT {p (/ӐP"JM^n9~!WS, /pM˪j!x;N!'RďHY*ްD:̈,՗Et[8tN8[&'_#m Yyb@/hsm(^#Kh5|͕|ZVP9>/Qm s9q{'_$;:^a8ڦ9╇DY?J׭6?,eעx&'_S^ey"_oװa)=i}/?qAut/N~ ::ɗ7GSFG/=Jm83>p8׿źo;% ʱk0"_m߀jaRwWnz[2[h A>t_W_ E4L &zMS U{L@œ1Ic2& [ԺVN[CDU\Q<$j|Mx! Txm*\ڔ^ڔ))HIQ%6m)8ŷ O K@UZ\eoMO=ޚzQyKV<:֔ܶo@ oM)_K6!!ۓ+lx޵x%IջG?j d=BU?_X GnÑ` F[frֈvN0nUݪ Uvwz'\VN߭j'޾@K]Nꞛ r~,h\^ߟaO*ur=Jm,orX EO閿r[~Dӕh';hxc'YN<6)WxxoSWr~h($ڙn M_!*+C_Grţ~B^UN YO0$9{-/x`\#nTreT+c$-Ł` }BEQ*?NRw34[Zm&UeݢJS_p_Ro89*J[lʁש)="w_|svqǹ82{zAK}7)7>׿נ1)yoshimi-2.3.5.1/banks/Drums/0104-Ride Crash.xiz000066400000000000000000000122231506652756400205730ustar00rootroot00000000000000]]s۶}ϯ{"eyIGVX hDꊔE߻'NF}i+cX.?y>k=F,Nm^%t'o7׽^ӋA믧?^n|= ī{=No~['엃+Y(\QM$0i]Y4{k^?? I孓p]-^HXnoCGxx1[6Mg$Go)UMl>EY1K_߼oPo;IUw~_U|0\].;9?xS=+{uNJ Σy,e'Y\ͣ ˞2 h"q`k*1>mt=ʏi{jeҚFTi:\AwAb%mFtdNE-ΊMi݅RYJjGxpފo{lujDIx;DtC'*:IDOϗTtM͢d䩴J* ;p~%ha *`.#0#_~oN1-gET0ra2M`2sBiPښL`)yf$Ο /4&7rCz%R{ʵP*â(zB|"}-ʜ_y }4'z<f2]-(5Xh`\b`"B"JA bf̸_d0a,{PdKh,YfBIf'rCp~,N\;{[ p*5ۃtE`6 \uIY`ў ^+-f=XRVB@?7qzC-olU7]6tgu@EÕŃQ,M. m̒xb+-JO\ApqBFI^4!l^%XzaI^ϧ՞] {3|t(_%bcèLpEVy1-UCNRlU-n_Ŕ?DŖz9Ͼ>[ڵwd]ږ2Qz75V?wl$y4{o#1ݳ:1p팩><~eI 3xEÞ>]"wg~ 1(x{ !0\:ȗB>dQ0"0P rNrw#¾n}0 -g3o4|x%G\*g dP(|2|jp}1N,pRmeA S4fŐcE cE #uH #E #E #E #E R G4mc.hW ɩ<$2a7#1)h2a&KÄᖇR31=jA(Gɶ1HDAs]cDwm HPmod N߃ܛ[nD#8$>Kt鶱xp`s0˃O[XE,#l, 0X:V{,!@7`yrdۃë[D{naciζI -MPNiQ$ x{#D<DOG$,aiQCFNȢ 8ԐFt4bjH#1[uy Ԑʶam,ePCz% jH#1=Xڠ4",s#V%m fSĉSǒ)#EǒdG+r>< ><`Hc{e8|PDztX4|Ṗ}&bG,{@E>=!64aҋXt>=`?vU^XN#;Dm$.ה{WHn|,Pm`]K! ȍjHHRd:Rt D٨G<)r#WC-m4 C QB!Av },H9m`d6?9c9ڸ`9rWc9K~&K9CV4H~1<4'th*Jb)d!Pu<@#b%&/h472shRi%Ht 038 3gP0E.1&_Ʒ2#'1תks$y2wsXQ I.9x02KۧEYʱ*˹>~P≜-fV0_7 R#jY ]Wnڅk$h4ck fr`J9"5CQ[^-W-jC0 1@1TnZ"muQ`(p0r^WiFih*H?E /0)jfpp/3*x.'1f` vZM[,aI2a,q_*qb/ ,QN3eE 0` S_,az,H`( MJIK3¢NCb&,a?,a 8$I/MTühX00tÁKMj.ai}\j` c.h!Cew&/:mmQ yq(Op` į^ ƞ%؁v(+{|@f{9hLHFGvٹziuEH"  B25Xs@C|Q7#˗Kn P[/#oQn Zܶsy 'v)p.叞إ!߲K8mʿ#j-)~(xT]<ǺvۻsX2ZE-<F-?AE~ g 1QauWe*nbx/Rx.Yr~ l,>8&ӐX"7WH1E~9scFX=hY:!6Kh &cDi)Gڱ88QPmo$韞G_Ԋ\Ou_iy諸̗$peI^ipZ X<)f5f}qCI"oKwq[Erf],nAl8(me2l> cήsg:20BW+:5qgmPIlhcϸ"f_`MvTWlp2fG\BhX-Un;&AwUV^FN 1tz=4wGyoshimi-2.3.5.1/banks/Drums/0105-Soft Shaker.xiz000066400000000000000000000041221506652756400210000ustar00rootroot00000000000000Zs8޿L3M;r@z~pLC[$K6Iz3헶fwoW+y{֖D1 ˖ӲH. VI7]MwC]wY oO V%Ѐ9mp&['^0^SD}~F5ZVA$VV@z2G1o#C O.[x5JbK-SH|7.۪Z!Op:˖uK|bX}_V"J1ڐ fQUb`Bd$Ʃi  {+=vې:nx697 u,\2k_I^&­Oyև]FdݍZadyU3;-~5֊n#pIJ݆evR^JmQ> 8CW,`xNDa/D[.* TA֢e$ ϔO$CRdؾLݽ(GkLPʲ< Re Q.xQYdkDwʀտ*dz":vyWM(\AI^nuzOv= ;[e;6eҞWImϠ2ΔyZh Ni6x+}!.Nw~*ࢅ{Tٗ]毮FAsHa5"փYI  0<;=]c,|T-<LlW&UHZ23-j^R8¨)Qk%"ZYx $T4&JXeJ.1P䖷0K{o'O^3oT3.Ԑ JѸ07࿊̿a U:qzoř{:M0(Cjd46U4> h #~SeD7м>)Ħ2\Ԝ|KfL ^DiXIOaZ&˅GNi#v0ySl~ P;T+4K Y*:qpSڮ+nD7f|3ѽ&L Wb 3 i?cFϘ$+=ޓ> 9obB)C mEi^Y4*z- @?!}-yoshimi-2.3.5.1/banks/Drums/0106-Gritty Shaker.xiz000066400000000000000000000043241506652756400213540ustar00rootroot00000000000000[[s۶~ϯ`ʔeٞQe9Ԗ|$9m "! E(VY %iڑ_Ӌb/By[4 mS"z4xg'O޽fܟ}~X=ϛO<`[Qdkm'4`O:;ID6m+q,.n7N}0^=)z>i$N>yb[c$L0bm8pt;f~[з"v&1lOĶҩ?H3.[X?Лdoe\gE(NwD&&d5 $JW$.1,Bd GǴ0i\D=/W&.33o`4\1!V2M~ߨ[Cow'mzcCZA-(@| LaJ$0s]a\51ԇc|hl-4Ge (~2-sxb@327 x% 7P*ӂP g{z)R}SjOUH<$B;-$8틲$PJU U`M?fh MzwM%lB@`J;hXp+`KW2'Jd#jLCAa͆K-Q#Y]"+#:1C"\⡈PrӀ7$Խ"S:3-r yZ/3aPaKUCXDz*$](T+=7/5Qt/>&bٴn„: \79KPQXA! 'T*`:F}Cܵ܍05y{]v41 b# ڕ(^CB):z`5V5r 9#$+Ky"]DLWShli W9!@ZkP1\shl4D/.-3b,cc跨YNƌ0HkSϷk\5{9TNw~b#1U.26*鬫0JaՀX6sj'͒ykuЯδ.JY'JY'W!(^b+@&;G;hU݁ 'x( ]6 s=~_wi%uRsG/ŋyȡz{xPbM:-CNk:mm:oXkZ#a k17}&C,;pw7p@ðՌ歂#; ;>V־\9\x%$0wǹj+ 5H1Y;ndF9b%J>pP|ŎImqln+%ZHKv&P1'e ɺ4֩0C+!DV_ĭl*zmp 1cVY՛^+μ=fEUEY}1z{׼Ezv7$kEw^u˻[~_NkV.}c" } ?{!F~fnFF>،u#lƺ6cȯnX_6 fގ5=@a<:oF!|oJ_Iuĵbp)BPeC}vU 1ewRf^Kw$`S=;yoshimi-2.3.5.1/banks/Drums/0111-pipe_hit.xiy000066400000000000000000002441411506652756400204730ustar00rootroot00000000000000 Tube hit A pipe hitting style instrument (think industrial) Lorenzo Sutton GPL 3 pipe_hit yoshimi-2.3.5.1/banks/Drums/0123-Hugh's Kit.xiy000066400000000000000000001132031506652756400205240ustar00rootroot00000000000000rH5x?731]sDWOmUmVD]! D')~6H$2HPJt!s}\7ߊ|46ab< G/?꧿|w/go~̿F\~u2m>~s6św}^=z˻{v72B^z~KGl(ٴe|1+2_pϹ ʊbND{I.c4\|/;T[n2]gP3 F?39VY|?ECå[ǃV1așCpZ-C_tdeZn2 ti7Ͼ&Sw"ױvMv3+^+WJ%edL}Hy\&9YP/H&80'HLfb͊"[ q!Ƕ<@јcN=ԺwW?rN+mli&[H{I' v mayה55Ccesc֗?^|mJchOn@DhMU]"23[dӯ2;zۛI8 } MoG{BWx/f(xaqO$Ӄx!VFzzȫtа t_.2~lqr6`EֺRM$mERou~RO;znzJz҇vՓޣ]fGĠ>p>&v8?<>iwQ;;`N ?RMmC(Ӛ\Wl|Q|̀No6JA6e #Sr}qgI4\prs3/U/YffpjQg%l$%lXG/E vղGP-1&_yXjk7짳ϗ<^`;a4Ȏ;?֏bYjǣ :Tkͧذ6zm1uPF׳|A}촮[N)xH\T&c9Pi045Lq>ڕyӶE6F_ssG/[ކzvAWq6neUd-`K i>zg[Z?4L:Rs!u7 *+h\VAyDxounGկ\}-ס'nhoո=ezuo߼oJߊl5oĹuXJFq, }Q:3P_\܋l\E<<ԔeA/d誛h6Gx>̧ I efU:jJj˩UܚgpqtJ|2i{i,Snf=!M61w,]vɍ登hf\wi,γ{RMX)A18d.a;כ(s\}>) a%Vr@bY8 C cS?;dB"|=f¯ $LL0K ?H $l3HH0ٮ:B0 " $n# aGlc\ j0 oFIےJ 3Gċ ?-&NSCfYbL aL' a;Av0 څ8(n!5nn }F#-V"6yg,bg#9ߍ-wG%|7D<ͣs`G3X? ɗJb!OJcZ)IЩIe a$ 㟝Iv%(O]$E?Tq;Yyt!]1DF#9ledߍd9 F.ZnА =KpzóQDvכ=Cƥ]1isLP&@a"k(pLW YRGQ>(:Fs^d6 0k(@-^FF  3)}Gx蜣sw#߀ آɵG9>TZ`rJ*p }sJ$g4 Q5b(I}%8}Qdzo) :y/@ z%([}A.ೆd(c@ JtP^ pQހxw`%g(nH,|ItO#EyR7:5Ey> :FzR7> 韢0o| A}k)0[1y>|t/Yy(oe hU]:)`C ̃Naހ(o ޭ/gOZ4ޒKQޠh$kt¼$S7}k)МE yjy%@D+¼57QTP Ja TS䑖q _'½@C$!>5@QժcTL17-TN~"T>E:Q_D7gfdݐ;)晱mbH2 Ki9X]\ook>:g=5ɮtQOiG F=3wgjП>S JB,}nA,jB,b'}V BWhS:Lm&& ߲XoB€UO߱dr0%_N:tW:{j^a$q,r! i+_NebjC뚒zuU;/Pɉ5-=7 n,Laޚ -&wV}Q6 lPVlg˳o0qrNgļY IKnH-nqMM~^ے^^gsѸg]UBrzFA汎S#K{f\~yȾ&M%ΨѤ\.vQ.WЉZQ'w{rc2}m U!Zp`gni] 7Cķ~. ;f=MmmTz;gYE>U7l;>*Uv~uQB |VE|1lu֕h;Vhn4~/CAk]\!b)d]1^dM1XxC=Lh,&ʰy"Ut]#m7jVB6|QIfcz?|dY< #<m1p*tol`Cյq1g_f[_]sBVح%^%_8)SNJ,olξߩ^SGi\!^I~{}x #޳ZC1Q]!^!v}QUV[phϱޥH?5*nf=HڪeO}tz֞xQ1lS*nlAI\($3UOu9MhLƋxr?g;uN{E?4U{{`VN):Ro*J5r:)f:^~, X?${Q7tpRP~LZ:h~κoӽ/Alt,xEHl#/*$拊'bl8KHr:!ƌDej 1|}talaKyAt[*)s2SQ{%Kc#(&ڋ5ګ ?cF^وګhhsd@^\Z rETȤ+9o/i fƳDL wx0m!:ߜR0LHĕfzT@ƒ?C+-<'3;1'K)Oj`&Rv33)a٦ևuH4.ɍ5o>0 "d:0:2+Bx# cz[L𓙐H`>&^,vGss@<`&$-3?=m0A:ÃI.<~3[-)^V+/A>F%[2(˟䌏FƖ=72_x4e"Q*la, >ySS$kO-0o@ 蜣s7~hh ;E=4ޒށFݡ0o@7٨^7*Xob$yjy-0oGn:0oG<*-#-enZFvRJ ֪%cfȐa:Cʃazdh!6IED\6 C!Ĭ)R`.I=ߢ[`3"Ex.2dj"EJHye)5sHy.lsw.ᇲ@9_P+gpz&#ISL ĊE[Zj?g.Jm \0}Ϛ|mL:Ib1 g%:pm@|K&Sr(mt= K.(#~`Cv9cm{D|d>٣ol-䚛;z6`un9##8C#U[3_HئCL5Q;sJ jȑ,rPfUN{ɪ b11Da? Q4Hs zݧ)#O 1SS>?oo.6CGEZiO v{Wd(0}P n\}|ӫKOeE%]4@yxaf (&oh͢Ⱥy _QfDNJˆɬȼN&Aly "+&ai]Ԕ|}+ڕR1Ʒu K<cG0|1,hlJUO;e}ҎQ;>i=յȱِ`u<'>XR12w٢*+/SgfafuF7Z#Fc?7Y?㒌@E\dΊq!E+G^Mi5΄_5w&/ wMUcMwu.CX(ޤ#|3ٷy *=^^`KUi#:V5[g4p~njjkUvLk_j9se̾m5M777-k 9}>*Gg~qn4ˡ/>_}U,bլ5T_*g,oy4,|^}g_8Ņ:I.Vl{a+JJq|żYLXB2uEVH7"ڨ,ɴnL@a-=vrq YEY^1Rlֆ{%^kFZ]h:F$hwIsVRr YUoS,TT.+_gș9]8kvhyu] 芝:g_f;gŀN\|%a@ǯx㷯u$~le:#!9>-fȵo(9wO:(1/|UWWOCWt+ Xtva;WZ{LƋx'Niѝz:Vo5+}nQ5g]uktf^L}"m7h@;yk#=p>&v8?<.qݕv}A~駝Vn)R5JEe2ǒ b̰2oαjϻ/(Y֤.fwک#W./\K>vy Z }E#ʾlhaƲ@*Wzu&Y4Ḇu!Z{SWR@׵(ޖ3ZQ`+\+x:,$~R{Iճ>&FQyx`VDufZ̈[(X: !0#M:`nұqx t,u5B|gI"`t>H D28a< ]|0/>A\1:$6COFF$ø٦(0N5AjF#CwF|OF$DI_0d`}0|ΟG]*r C}$ A'# c#<I}r; S; a}0Đj#"H僑=cWH蓑5ՐoF>1j\/*,}F$-aK FBЃY,Ҁ(QM bp#إ䵁&v) $Ly``pJQK $Lh}` at0BRdĄf갂&]eJ'Ã1H $L|l   >m チ@"Ku$N0:I$F:MXt)} 3M SqK.=g7EbG#9o& =5/1=.6H1$A}K0'#$ =+\ h8g{Jw(= R- KPZ s7AGTP1cgJ*=5eaЋ4TZPh%KpFGB&}s{JG f%TYg15{J5xIa\%-%=;Tɰ^+BCO"1{(U;=e: vBuRqC GJ6h n`oJt?́qeL,Fds4H.R >:截P?J p5AI4䜠EHAJpι:f:6r.\I=Ɵd:Cr:iA9_^R{ٳ QrN81,tIm10lc=R\Y!pRGO h7Gzcay ƞ-L;(u@{io;h kFNW }R)L0IMQzT.kTP  %(u > >CS:& 5aȚ͑, qM!oRԃNaJTP:{ htFg(JQlu)JF(M(u@)J}R4摢Mzgkd:F_&҂R`"EnS:n˥;e$ŞP}|k/(o@c=)tl^CM=cߍd9N8h5UTQyt"LH@ i$L)#@1j=yK@` $׃5͛-'a5qnŻߚ86U !6@g4u6۠ °j -YB;djh$s(CvJ4D-3b ` XJ֡HMVvZݐ$CikX2.L @zC$0{@*q>+$[PGB]y$->,&w?}r(nC$02ηY$H zHpo8 oU0 yH&A^W㓓}1Djd,PXmqLRGiH1Ixi\'wb>"&i'kaq;mF2 Gi] P$؄4I6I(gIuhdM?IBMk=^l\IJf$jksIBsR yӘXXi wj͸ֳuZڌmZyx %L{OE(!B TTȳ 19M 3Z 1 9*~hĎC 0DG#&>|QHh$k|4"t3RBct4J(CJUǒ*742ɚ)وf"h:*x7)EQGѓFSFVaE;fhTfEAQo!FnxIAX夏ࢨТ7C &8DbJ1z *८ ?id!2 Mt>* Bh@ EJPܿhLKi?gDx4sD4 s̈́ТhM$1Lh pKEID4A-%H4A=& #x(Q*A (OH4A"DZEg(0#@R\BJzE%-bl%0-@EQ &hEO`&dEZ^Cn+EKPA *3 PrԑLP@bQJ p\@ Pc(Sa4CfB,F,޼X&R\ Pó ݡe{(U@2Ao2TIꆱNE:MP"&(U h;A,|eUzD-P&(Uϒc^g(JLSX&x s,I>ks6 d`oY&N,! f,LaހYeÛX.B ALpiA&TZ }6b7d&d6f+Kaހ?OL34ye%eFR7ಆ|PހzñL (e;7טWY&h*v,†, FFyQA .kD:C!A5r1< A5=Pހ(o@kSOOAQ: 4b0o@"PIy*(oe ?_Y&*6G2Y&Fqo:ٍ&.LN}3o^{7尮w#n?'FJn(|Ko^޷y%z2Y&fE-Ñe5*ZM,!?2a Z<8‘}DBfWz2/d ȯoa25Zj>+LT-[Pn W0k~2iXu.%X%lYr~3.u#8@Yڋ*U5xw4qRLnn"_`D1R(FL| sL i/b$nl֠nc(U<&Pfayͥ&ڡnwh<_d&=&Ȟkned~s˫v -Wm?rD2IOno_dT±,f͏nV˭ e;|;oA<>:&P5{A~l\y}LKrH[#<6kź(9/FSiځ ~#Mzː_EMT9|,E n$%k0ڟ,V3>&`$Ǡ2HNIO ІvUKfV8"Fre$#Ij繪3Dǣ2!U_э5b# ;D kkubU^b<1#VʭJN1i_o:U׷,_,&x@*Bs*o`]-\vc֫^RNIPZuްGy!7U7FgVuX({İ8Y]GpsΨ/N(l``n2 Lo8͋ b3jwCiQBS`—eʞ'oF߶XKU!٪2pW[ rAr5V˂:PWz9U>zxvJ|&ՆL{u9 t_.mQEJȹ#ۖ;0ʋb1JGi}jwc>k{o@(ݶ'e߸1 weP#pMa*atJy)l4,kl-/\m&/&׃ B?|s.u XU1T(?e\&b'Om8_; @G<yty<1NǘS/-,1t[UdGǶ(6H]Vݒ,C2<@''^EyBWm :c|Nl\w)F/m)0i}P|_[VA{Bp)J5%"RP*EZx֫9tcÆeE|28'x1tp,B8;BU#)6H\,0z%{̉^>KK8r 93nZﲀ5|oW?gO{~.4/9|׏gWٿί󫳏 .h(2I#ZKPY7nwV _8:y7g2:x 鑓I6[Jx77ti+C=;ۺ-c.~>cقUM'{nמz]Y[ Y{&ᖡ0|]ʍ,l\.\" lRws+oY0vQVKVD/ɽq B"Cn+> ncvn:BC!_M2ުAmSAQnns{6x>Y^Бx1Oau=S\hts5Ox5LMӫ(5J3ZDi^۵ǐGnz|L_%3Nv0JvjC{1)ֶwoeVT ayQ-9Qu6԰X5mDx<5|ە 0$Y)ˋӋe4i'w@巈pkԤD8g `tĪv/7GbЀS'xR:g.z3; ovbUT<&}Fl8FteZ,I;ă/qa*?&]=iee@L1X"w˥{[|ݺC*4 <=2o}"lȃ†XADNV(9|B0;rrO98!KRIJwvƼE%㭜Qyg^u:^[l3vsa Pa=8ݨv >M4J_cFw8T#!n>ehB7w@C7eeÂ$ܒ>Z;X0K6Q`0 Fe6IJXvn-pk/ncB7*,Q% 貞W&;[=Vf[m1t%t FXun"YO5'nRٞs*"%s a|#KڮqҲۊ-JksEGu, -NnF÷Mܼȍ :E7XtnNw Pܨ_j4!nS($`~)X-'/a*6L9W򙨥Xtc%La! E$)` {.@Ӽut Lx4g@bnنnJ߲,,J(Fn4vC7=RJ0]6JHMkZ7e9*?Pxf_] 5m|Knt$[2w-9LH ]*4ҶxM*VLh| P}d#kxp-Еh|M?E~Eж_(G@ hp>?KC!P> ͤ]V7)oIҎ \_\-U7|m;PX|Z;'crկ繥i(ַL{σ=4z[ 칥xRI{K=4*W޲Ý׆,%ׄ* V:4s*"pF}OO W&^;%LzoPzG1#Z}wEWq]xePkxm+Ty SfA=dy275MRِ (0/)[OGR'|<(q!p]\21c[p=Nؖ߻ؖؖ'e semeseBx磊71kB=c3), R$k 8 Dpɇ⃑pUAtHV(FUqCl#U*A1NH`$alWH! $FF# cjWA6IP¤))<s:=t>@` a|0::13rH30:Xܫ!)` 01Im9O$m} a|00}$l|LZF$O*mzECXz<HOQr'0+h2T@’]"G3m ."$t%S8B9Ra4I<ᣁ%%Aa Z眎>F=&7SjHv>=Ff|"5d7er~dm1:idZMOh>rv rĎ d"X#)>7#~3kOOgK\ fF£R'1£6)7Dt]L%䳆$fx~AȚ N0>KШ iHXZh$kLgTԘؿ X'R%T3%(6KG(tFw(hN"` g̈́RO8|9G&s)R*[7Vb]B̞OP*P 0 # =JeT+| &ר&('a4ktF52L g#Y6L @qK?z%(7-.dF#{o00 iJP5$X:9$CYP'05P–&]o*P=ld*ZQugS :<tDb'<>NnثJp 7SQK JDwR͑ T E~>鏒 E~~| 9J 0sPYC)n3zВzO^ dzP6:EyZʒR7)Ey9g0oZ ʥ¼}Tl~0ol Nje NMaހJ +o¼R7gI vHQހT7GNQހ[Ra 9S7(oaF Ŧ(o@- _"sJ ?> ~镵KwhkjSuホ֚:n/+!<-1; Aj4;&'􃡥ۓ[]dM$:9!ݭ.Wt\٢W}}Bw_32ˢ\JdG[/t/VZkduDb1ohb ir{;A"XDd8WϓDa˺|Ko^&/iOBDR4G4+%)d&Y2{Hxοn|\*nˋlnhWmjW*c ^s~ӯ._eWguhG/UsK?~/޼̋wV ,wN6$˿+ee1Fcy i//XAtZ@n'1BʷaH;Tb E P.5ë2ȭ#[ @ 3xt&,X*wנH%͘)-:]^9F؛ig|u`QIRG&Sw&3,@ē z]sK{CS7zv8,{URK8OjUAoիY`*Q2Zt|܆rTzncĎU~y`6"|+V-ɑ+1%>p2_yP~O,ݏVX_vUM@nMBFW}]ْ<'/p?4sڱqUR|1U6ZHSj$lZt[oLŦ&_?Τ;bUɳS #_BKDȗ.j%fhؚpn{)?~xyq߹<6]\? s,;tJt.(/B.be0x7_߼z\A]+8ׅ 6wq<"ŏocųxLتtQ7ot.V.*CPWׂPhPR۩mbKR(T .E ݍLbKc[yFdf Tنq"Edpd*U=6]Ħ qDtV܈9g#-W1**@ 8D ѭDL3PU+Ea0l6Eq3".0"#:tAV$LFY+2bEl|HJn~O~PS `ƦEpOIUȨ"+8lCH2OٷȹbElhzR]/> OT#6]ԭ _mF?DBdxu.~dP,(?&**喤ksb5qСG@qMX~Ï6.s:TFb=sx='*dHmY#/LTWMƣ88Foa1W 8wޏc\4]^EޱuDԮe6Zx5%@ #+/j_5V5*4sva=5:Gu[V)>,W]q!oxaL ~?׳w5j~?~!r^OQ8-$뢽졊x]]ɮ2=Qu*ܧBmDlb^Wll)Wi%*#i%zy:vQ_d(q1 xI՗!u}0)6ZjE@6o^vd)ܸt6Y}&C ^3S{M'"%:=eTCn*:3=r+̳c {53_VP`,{zޙ=D?=C M }n28JÒĊEbEEUmoFE:p@` ^|0/:Xx6mC  3eXq! ` aI2 o#a\iMi1H O*X>dhx00>H>Ӟ{@` a숓||xKV~DxI @7 3 aS$?H1nï $F$}$aL  YC&P4Y vSJ2%~2tJat00:'G+6FW>@6RpD5nnc$& 9I+/D¬a;i$A&TnH$kTQ_{"(OM$EzΚToWP *^Up4 j&(ܿGw(dY~s[R&=fmEdC!Y>dIv0aJD+oh>k@ĔcFq}֠{ ES!odh k$bGnSQ@}w$Sr*1wYu JPiAy~D!6i UaF?Њ(@p H9Jt7@ 7G7OQZ('@߉$Fi^'JuhhzNA 2g,P@컁0Q@ bRNFu dh k5Pm@ :Pƀ? :9Jt _^e9c;%l`fvNQVIcC4S;]dauSBlR4ĘMG(mB&cNRkKFSC{hd(KCQчDɑ ;gRI ժ( !P0E9CnCpwTzh." VvU?6E1P8r#ٟZ lOsWP+/E&oEfN';8pUڥLKi#S쑘!o = ⺧"c2qݰ([ƪ5mݫcA9,z7[oh7U)3MV[Ej3LJcMo4MwCFY7E/7#  r]χ# GB<77b}/ݘ~E[/^by&:vo히?}l;Ul#mթ&8SJ4fnҞl/겢qW[f&xKJjk_wl+#>͇}~ӯ._eWg%H뒢w)Χt ǧѰx;_Wd-T3-4P^)d!Yqs#e=o TZ-4uq"5D['AjT.NV>,dmWrMu|k&kW,ڂ)Cior13v\ɦb`mu {½uַf_fF\WS%[-'q=XST?gxOB9dP&jLo'67oҔ/B`^%v$8cAl{Xj'HMlAK{;A@;Wxbן0+Փx1Oi;9ZOM+o\5euI|&9V־#R\h(UpvٜvƬzKKC6ٲ?evGc۟Hw-mq=b2lVRsܰbN+]c`h]),]fGEv`duSi]NZ iz>> OT_\40v'Z/_//T;gY>ݗm?./,3AjDzZƭkaU魅j-aV5 -l8cCFr*SƁ2ge[/l06&ژjOlL1$0ČHy1qxخ0;n+-㍁H`ė0DhVٖSx蓁oOv0RƟ $~3B,B\*>1!' 1%ffƒى) ` ?4Ɛ=~20~H +>49oFԇYIF-1aOF0f>"CJ-of R!C&Fdl?#2Y\ƃO:F$ODwHgDvH3'mdC:esx43{tHQx'zueFa@zpR7Aia<?CQ"J*PDl Lp %LAwXl%_MP:^JŒe+jxՃr4} ,eMã-DGSC4@8$'"Q(7H5%k(o99#*W 4| g-Ej(K#HW3(EC]fPv0yTpTÆL))F}eh=0tPZM)0ŖS=H({a4 e)=R(jհnB^(ă;Pn4. PnTB'UP J!ЊTPyÅ_T5( G5(mB&cr4֖LaQC࣑(OCQs,J1ߍQdf6LQ+6C>ar'*|bIlC.`ܳN8ۡG-bOV=9xd5'k(}rABG` ?V SEEFb4`? ;odrX5}#Zqc=}rvXBUb(Kv(h}, }\ ;<2C0d1t`H";}dNH\B9k;(B`"De;`R[}g;w)B c *mQ31cV[2Gߴѯל?8WK~"jzƲtjqx(i-_G[ծ1OF6$PyOB7E8ET/^*90ex|7|~[p8z"~i5G_2dYz"i&Q8ezZohta*u% {`8d]:)8J Yk#ۚIfHEe2C G_Ms@h"B#5 ,ZJ^5Z e5{·!"xW-z3eKJM@[:̤fuVf6WUNWiLJU?)܄zⰯsmeWf9בqϟQ >!`( . 5ekM +p8{챒wJj)KRm; E^KH˗Fأբ33%yE]ڹ,Vn2 +OPKܷu챒NlaqA}Xt& V to9:å.ܘdZ:%* *Uv~uQW.jkԍN1b&oyzϿyu~|{˻n4~/lN4;%OB%3l4/i}F< ? tZɦ,&s<6/N?I.sOxr+oj+Jj},}kySq0Zh+na!k~(פVkޏ_3YbeZzR.F间w[ )[su]0'(g +lrHFT+4bwݎƅlzs44d%\_ {j67U[lƾ/s+GG{PO͊Eaz'I{.,UEd-#OkJQ:2U8l *oGnvQ `2^Ɠ{oc{NN{E?44|zۍ3 hF+JQ }ӳ}L6ݐG6^uyQk-mFfJb PZz\u '2?btp%GJAy3C;dg,''O?Wt'|Ξ]1i]/hAm;~uxv~([ l("rUA옙4sZh"Jv8T8 jםB׶KeKU:`2XHPx:!?G܆tW!jC>yeDĆt!R#vEI`pJR('3h($,X!$63JYH˜ q ) "2LȈǐ?żW f?}F?H/ "&s,sK1Ő la&f%(vOb(!gG|Tb=LptqX ŴgNʿHgO b14m*9G,-A,TdQTw c(/狏HQ?g3w Yb\; CS(w /g F{w 5>(o@` NP(@YHѳQL((?i %FNA 0GT# ]ш+Z(! A2k"7@ú70թ(1@Y|Qjh kF5+F5>3&(C͑JL(G#E(Ii {t4[Ph:CnTAgc(Y D1-Q[B5ꇢAg#nsl$k|45>5(k`:_^ JpkO:6R7{,Eyj 0; R7qtXd0d)n0;ИG|409Ey#NQޠh0 ]`@hF2EyQyPWl^@p(o`:Qû :F\:k0o)ѽPzhN2»ͳ) 5S) I-YnAy>Re.{OQ<7td7QހkE VGu>OQ_ $ h jIy j\3HQޠhTFw   zs7eR{yqzDFu'? ɭ Bdk0FA!nWEI54EVylE0* ||w >2cJ/D@P||p`bk0{~D`JC,vǎKctȖTŵ[x&hضL`~>$Y,[=SoX-É۠Crv:vO2qyE;A!X^AJ[psKs:co[j75퀵1"yo=x∭w|Ĩlr86lBu0j D}9 ܼu0j TM#貈RML$Ḿ'(b휻A1XRZOHaZv6勅e0VN[RZk¾fA11b$jk>!Ti>ü/ic1.!YRn_1(DuNjF:rJE :bֶ/DsK<먘ԭ:TP$5/nFs0.Fߊ̌Z i45-{.IrŚ)a7Xe{ŗL!u(la199)4,li;Ve`aSbZ7 =_SMcb1y"aj6}ȑ*+%ulPPhyȾ4mڡTJ[LW+ϸ~\Y(v1=8Уن )sՏ!4y2<-Oj5Umd?L1VAWaZ%Ki/m"^vc||ӫO;̄~iUK(msT 0qwφ :_͕O ?1\ދR;3eB,`Xy ? G\ἤp p"a D+~Uuf  ԙa{[1[Ll>yZ%.Q\osω M`^01.kI. ҽ.PTQ>#[=wlr}ѳo1 gj=v%>/YTd48o0]%k5B$wJ8Է> I,2yYqb}nY׵SSQ< Ee2Nj5^HzѸZZNiLݵ5q쟏[fRbup|$:DŽeM)wQAy]f `C[ӹkY`^_-{߾ ޸qt_.o_ZtX4"NYϖA{P*n6LF`y׺Kg{sA=Z7!@F"x(񵃫EW95uq3aq^u҆F,($ qoYּw-QBkk4it{!UA﵄}*@_|["Dџ^ U 9Q1c=5^h}@IEk[m9} V͈/KbYUR TGN-AG =%ϳ̃, JY X#5=0> KPkDGc}d jR+!JI+C 75J"N6錱WkznSNx|o?gۯD!ҹThC|A}Id 13-]m8'D|7|@E7_DmWJ&r":]6ybYIg:G?4E?_S"F6|?CDBg[_326-SE|MNDՂ]?W7jxfD|JPɼCU|/ԋ Uubh/?_;'%lXSP7@:MMG/݅^CJtS U.oǔIonuq{=]u {TCpb:dY{tu laz,aMEq,أtnG[}3Âb%CZ#`YWE27^%But:Ј~zn XZbxCĞf([G=o#b){at`\" >ð7G'ܴṶ׻L쉐q=22|: k}2XߊP&?& <.3<^R[6"8 !JP˕$+[Wp:h3=EUc! =ZZc[km4J h5 Xo0, *i$[t0.CLH`$^@#d$_t00]Qw $dɗJ $LlkiOۻ6n$z_=+ ![jm+)(jdqCq0v뷇 >xo$JJ\z4ggS6?LhN0Sf-0ò~300FHØnTsqۢJÄ \7ӽh ȧh (S4Ldɀ {ֳA&GD,Jm7B~3&dxH"}'e%fG#Ϣ 4D1S4̔,ʟ0LN9f=afz/m6аC6`(~33!͇tfd49{Iq#oc9dTzq)32"{dnnly b[d>o L.0@͊}<Ȃw!VH@ͥwl5+ *tM]W 9iuik=ab2t@g PlMmikPר45* u95* uCkLZv0l} IHC]c9Y`Ϗ)Za':{(V႞3=o!&8Shęg 6Bn$9=}h~76QCFFiӴG#|JPgI3)zI ;آ@N(յaG=GfE:蘏i3鞏(KRr'iB]Rbf[x1%"ZC|Dh@|-$?5Qvă( R],ST$͔~Cw3ezRTSaJ$s%@L=IZ[PF (0@H#]luuwIG([@YJ F)jP@F,.=\صFߍtTIK#](I9JFȮ ;݉|1.P`4J]jik@Ҩ(w@K* ; K9Grލt]3R75*r s; 5.tK!.tK#]H׸45zv@Z(V]Ԋ#krSk\Fƥs ЂJ F4BI. FE3GU\rnQ-;Q-Fy^1] /Fy;UxGyHXe4z7 tF.;;P`kȮqid׸45.Fy>(o0@9k\\z']Cy(oQ`4:Q$C25Hר=Gy]=G#7;0pi7t`N57=t`}6jt~v|D4u-L"XM, #綾Ųw0+TnWu\^4i䪲0+݃_e0VdYã)>0oD^C&]{왢ZVxYʹ:%rvHCwHNZ3%|mzD[~̍ru7>.Kv=+M[Ѯ3 }q꺺U*eB>4iK*NXfkeӃMd۟߸.WVD[xLEM4هj[nלg@=~v~wLƵ5]Og.h`] _NK^z'ߢf?ׇz)4]m,s4Xؕu\/C@il; H׻nB rm%O^[ǟNN.Z;(پU7>8U|N=o..ڹﵓKg+Wjw阧5 \: \X$M~M5F=Z.&7/Mk=؍Y}kʍv&BOںjIRƧtܯuU]uG/DCNO4C>%]F]}&+s*(Ns!}RL\BaգsC']jjQKl]o4`s!]UMy;  p}LCEb lϬ~.f?.p*ŭM5"mI> y2n/2t~/L`ժ֮8xj3*5\wd"NɃL~>aaao Z,!b4tW]8;Z)) BmmɀYW'm~C~a2gu aꞻ텛m$nD%Yx,糫թ˝mҢ?t_6JNoK/FXQgi]$rTmKqɦW`b`*XSPޯgT ԢХMݮ]/@϶ +!5ؑ۔XxȑםRړm>-G|4'I4\^Dr!*m;Pmă aZ+)ujZh{ɐH|#^ˆhs:/o3 ˋysv;v{xp}^F[=;n>[S?j?!UtoQ%P||=s.p.@! 3 Оe.@[$#s>kBFF;sztswlwbRDd._Е} r~eK2sL3?`=sOϮ$cqxARWƜxrj P5z\]tmeѣǜUsf.HTd.@m9Sہ3`lQ\z7&k8 ǥ3s旌2c5V4\Qgd!"I[H9h1/ONϼGaO)"8HUploen^wJBy3XDeKWrR㏧W?{}^ =>׍CW^ů'Y98Խ\׶qcv"NJSVAq <햃R\H# j"<;${;H,]jh4l fN?X- }kLZK;$L de>Nzf%3.D4J|^[/'ֳfؕT| nZ5qhÙpr÷o"Nk۶}߶LyշD8^Ƴ\mh골L5_M,J·P&4j5niqgqz,A=t^_/b^8r Lp߲-T'L?8!L=^ `\쏔"wf;:iGZD,AXKDMKt4OM) >}kC%E{i?b ?k,a-5^׵Uv<:[ c@ ~IAOS&v[[QY ۳ . )PƧf9[iLZn (K8 :'Owv<'aWie} ϙnITcNdŨ`{gW?}:9*uzU^|j燓N]l ~V6JtB,v =hPo/OK]T.oLD}A` o=yDcr+Da{t?zN,Y}'tWm攩r Ov#SBjG;v=pTρ!5j_3@wE5ǘ\P-+}A맡?>6g7˂vŃ|śeD'XGH׾jvVͲ{k+hr7ϫY9PSj>mHiNFе3Nh078"fjupQϮ.?~ S۸ rba̷vZLWjRMQ:z!*^|ͅh-D#no/mhHX$Qno0`WBe!q\'jHIsD n(Y[l32{dKM=hmk/IXٖ=lDlK f8};*z_9=[dq8ڠL-X i ־z2*'[TvV=ώ\no' yoshimi-2.3.5.1/banks/Drums/0123-Hugh's Kit.xiz000066400000000000000000001125731506652756400205360ustar00rootroot00000000000000[sH=^nvKӳhR%n "!?I Q]~KUVV^ͷ|:Gl%?lG`8?mo.^d0~4{[Ov?3nٿ G_Ի-|ޛ{o.޷ao>} 2OQ>yۻWo1'VY>1ْ=;ŹIo]ǷoFwf?F,n?֛m}po'iɧW./=i.VfrPsy6wlOh6#/8lc&&;=Bn* .? \^~w}o0XN_,EͷT_^}\pnrb_7yR޶o\N`Iw޾yM6͛ϣazw϶\auce_Eo^sͷg<+޿>C6GlvsD7vKMӏo_vmxw}re3ϟ}6{b8y>]%|4cg7\?"YKEd_y+,ES5|wAm|+x,:\rb&Q6u`?}io4߉Uғ\^p0Z]vvd$^f[~;?2VY?yMå[GV>aЙpyZ-C_the\x4gn}'Dcߧ.~;՛fW.})JȘ⚙Lrohe@""u3A6o̊hؽr9"s 9sZjcLO2ق@rߑ/k'RC7.!`_Sd?z i'}(mV==NeiP }ciCvy9F\7\zA|אjjBZ=|fadXƳknePpy.*᭬ tW_f^﬜yzsKwqCĨ"5w/u.VFBAEs%ˊ@?5ԯmoŃdKW_uIŸ"ó 6Nܷrܮ2|K_޷~%z?{lW p/k HyY2{`)rt0g"" Ytq&yWa)3&?s+i_U7tޠ7Kb(3QS͖[NT<ߝ蘝okLTדO/yH `Ru36 icrm-MnDKW˙kJpLk=e,l6ev(ogWH1K*8wp*sKsR{/:ryni}K-Sٵ`opwϩ TNjޒd4T4G}-i,%s<ĒWRRq&RAyJv+;)|9K/P ^GJlQ0TZy l⒊=%u3=Qi*oYi 45B|EEjpb7If ^hgu~x.i"8Ѽ'Yuwf3g._[EZ5Q\_6ּTU Gpp+6gg}pi?lBWwpu6g`}i >F@YXHLӘwB'HvbI`6H@Lp1H,}bo6raMdF Dtl$ w$@96e $CC" $?H,nl" +ݯY$] a&m~20$VC%~2at0atptRC406a{]NIn IL Frc;rDx6 26Zއ}hGfH.8^'3 "GڌZHז |*<BV4BȘ{h@+Gk $RO +<>&҇'L(d1y$t@7 [H!-$@¨:B:)#`` a1ƽw7(nIwJ[;e=XعNvÓq#]'_QÃQz>$t~KBc{&JU9UЕ%Zf&6S6÷[-0`wl xN#+ʞt؆!z\99=\BSٝX.Ɛ𺦤rx=9gqUU΋74TpbMrEyc E8 SK~ 2LY/>1o|M,с7B+ jyV1 D7ÃKz_lҸ=&EThMM .Zv?N\jkO"--hY[(gc BȣG I H)tgm;_IgaFtzMZ0^~*)nkQ.d|4e&Rp;;jV<~,'w:WoD `$\O%Ixbȿ 8  4sI^ZgZ% aUjXD"4pـI";2H@ʄ2<O3DuDا`DtN#s6Q~;4(cÃ~x00&܈K4EL%L""F  チ6Bhx"/ʆH$.a8@_)E"& {QؽDH2 =%W"佑1f1bY*ț=nDşZ;AƎDťR{)^O5~LSV`fL5)h R$_1dSIMϟfF'(/. K !JӮ$)8c컑1"AәNHw#YsU]0K\RQ߀y+4(Ae Zkt"Y҂d( `RMOIT-AYC#b4;TIA:X(ZF'%(ٝ5 h.D:7PS: jqڈ3T3T:%$˾yzntR9>TZ`rJ*:"~ `oh+dJpe dpP]2Q J. ZK|-yf+W@-R|t'YyLLQs7:5ENTP> aހ99GyꇦqưS9 1c(o@-)hl$k͑ ,y*k0ow5(KO"7P|4s|4Ѩ΃j!P)l!{f0 )捍3<KYbTDe 0,Å" rT-6)R4 /C+RDWFR<†;w~(uŽ|  Ai245Mϐ.O,[ʺEFO}7Ժϥ cGYq$6{q&Y ʬsop~ eQ_ 3e 3;=}Fn ۻ[6rmKqdym( Y`97* #YP&Ԡ bJPJzP#AKe6.yAʑ)3Ӡ\߉:=CiD5JfP>0L.H rRS2E}8:XG&o^VdJ#  =ro&tP;8|pT屶ɽP }t l<Q:[s^ %"X^%[̈/`+/.ߞ}j+Ɩچb08DP\_e S\| =,Wfr`&,+j 7`oJJ٫$Xrj:OiĆ+bEMioЛ̇vT5{L"pgdgnOǑ44L|xq~R4rP נJ;iܱHO6v=''956kBr2YzQT"YN4[4\iEe,?ì1¬Cpp0kuYbg\՗i~@v8ʥh6h˩>PT&Cڙ&dtᮨjnE e؛$gÃq 7OdWEB a lc]x *v#_~\Zy ZluMmblitK-7Q=gzQ\UhٷM|ᦜytye'e_rT}fjNzp9էOϯ]egWe<]۬fIu8R<#!pm{󽻟;Ņ:I.VlGn+J q|Ŭ蠙HB2uyH7"Z,ɴnL@n-=vrq YEY^1鍤j \C"֒`U9uHn,7eyMŲSI#}q^P Cgtᬽ٣mu/2+vzHߞ}'^Z;=ru%߮WqxQ?tҙBH D28a< ]|0/>A\1:$6COFF$ø٦(0N5AjF#CwF|OF$DI_0d`}w0|ΟE]*r C]$ A'# c#1j\/*,}F$-aK FBЃY,Ҁ(QM bp#إ䵁&v) $Ly``pJQK $Lh}` at0BRdĄf갂&]eJ'Ã1H $L|l   m チ@"Ku$N0:I$F:MXt)} 3M SqK.=c7AbG#9o& =5/1=.6H1$A} 0'#$ =*\ h8g{Jw(= R- KPZ s7ATPcgJ*=5eaЉ4TZPhKpFGB&}s{JG f%TYg5{J5xIa\w%-%=;Tɰ^+BCO"1;(U;=eZ vLuRqC GJ6h n`oJt?́qeL,Fds4H.R >:截P?J p5AI4䜠EHAJpι:f:6r.\I=Ɵd:Cr:iA9_NR{ٳ QrNv81,tIm10lc=R\Y!cpPGO h7Gzc`y#ƞ-L;(u@{io;h kFNW ]R)L0IMQzTkTP  %(u > >CS:& 5aȚ͑, qM!oRԃNaJTP:{ htFg(JQhu)JF(M(u@)J}R4摢Mzgkd:F_&҂R`"EnS:n˥;e$ŞP]|k/(o@c=)tl^CM=cߍd9N8?9o5 UTQy"L.H@ i$L(#@1j=yK@` $׃5͛ 'aqnNu*Aߎ L 3jZwmOaXN̖A2549C|d,Q͙Uyrۅ~B@%Qh$:`}d \ I4Qߕ ,COц| RIHCxTm= Ĩ7$PGB]y$|X$Lh1l;5HXSP`+H"a doHha0ub(:-H#Qr<&ߞ`fMd=<GGǻ{RYc-Ծ_Qz⪙$!>* ubҸFlELfN& @+9$u-4CLbFH&V$Pϒ$S{\ 2{ظ/rI8=>8K縬*!1 (CjVuZڌ[yx %L{OE(!B TTȳ 19M 3Z 1 9*~hĎC 0DG#&>|QHh$k|4"t3RBct4J(CJUǒ*742ɚ)Yf"h:*x)EQGѓFSFVaE;fhTfEAQo!FnxIAX帋ࢨТ7C &8DbJ1: * ?id!2 M.* Bh@ EJPܿhLKa?gDx4sD4 s̈́ТhM$1Lh pKEID4A-%H4A=& #x(Q*A (OH4A"DZEg(0#@R\vBJ:E%-bl%0-@EQ &hEO`&dEZ^Cn+EKPA *3 PrԑLP@bQJ p\@ Pc(Sb4CfB,F,-޼X&R\ Pų ݡe{(U@2Ao2TIꆱNE:MP"&(U h;A,|eU:D-P&(UϒchNg(JLSX&x s,I>ks6 d`oY&N,! f,LaހYeśX.B ALpiA&TZ }6b7d&d6f+Kaހ?KL34ye%eFR7ಆ|PހzñL (e[7טWY&h*v,†, FFyQA .kD:C!A5r1< A5=Pހ(o@kSOKAQ: 4bv0o@"PIy*(oe ?_Y&J6G2Y&Qo7˳LelR g^n<ݎ($lbXkg(h-߾~%z #Dd G (h5& dx,Ye5EyQNG& ۙeB+\|d/\w}|Pigh)Pxur!7_[C4lקLNSڬs!1"-(a•wYY^VIG7Ͻymb|s3$rPnA1b )#]eeTH}#vd-LtF202 {hm.|v<6Z<C{z-n=G?//|d^9Lz3˥$M%䣴> P^c޹rsm{ 5l}u %=Jp} 49rr0Tq<\eg:R䶿F^V|kl-.\m&/&׃ B?|s.u XU1(?E\&bl'FyF6hGMc ȣDA<:RE<D'c̩y: t-ɪx_ucpk~.+lIHaGy/ʢ<Ϋǂ1q>'i6_ör.^~a6-r+UECw)GXDrТF-GBñ^aò"|6F8'x1tp,BT8;BU#)6H\,0z{̉^>KK8r 9՞SnZ4|ݻ_3=VpGn/>;Uϳ|篋/Z)!L҈Vnᅧmoj0wNp G wrIu8-4ρIn1\u?l*&c[ӾNmO.-i rY%{&ᖡ0|]ʍm\./" lRTws+oY0vQKVD/q B"C`WK},Ǹm_+ u&;GGBX%AQEU v6}_÷Qݨ!zym@Gǣp4"NU*:Dsuof&[ͦgirO'hR#:DOⷈp+ԤD8g `tĪf/7GbЀS'xRZg.:3; ovbUT<&}F9FteZ,I;/qa2=&=iEe@L2X w˥{[|ݺC*4 <=2o]"lȃ†XADNV(9B!9{O98! RIJwvlƼE%㭜Qyg^u:^[l2vsasPa=8ݨf >MJ_cFw8T#!n>ehB7wiAC7EeÂ$ܒ>Z;X0 6Q`0 Fe6IJXvn pk/nbB7*W/Q% 貞Ww}[jzͦcMf̱&VDr"YO$ܤ=-TVEJ@d-F_6Yue7ˍ/0\=XX>]ȍoyuno&8֝V&hCJ5Px'H R4F/+KO^tc?cTlr#a"6Lbэ0]'䙷HL&.@%xM 20Mƣa-ዡyg)H,|TQ_R tK* t-(!jDk CM?C=Ut#7/ȶE,iSrӆS lE.ܵj3!Drԛo1tiX&C3tX] 70tмJaB6h[1K@:_ i CW5]{ k]B~ur:QZ&L!kk", C(4ʯsta XݤY$I[b6vqv~P>PnA͐8;#z=-MCe{_칥)tշl`-MJr[  zZȿ2>(a{xջ)Oϭ<y"- пKZׇζǫ/Zk[)}4ȝ"C ΂Ѯt<ʆL@i2wIHRxfB\E+?xt@̀؆;\sOS!844rYpYkc\Э'@e|ƚBh}L T`+'2\@`$\eP#d$]t0/ʥVU\k:H`$a k$aLS$at00:IU)0:aHk# H˜ڕdPw0iJ .kÃxdjt0}:H $vN] af* $*,alcH+<)9: Ff[ ;`[rH $v "a֟} a&,)SJ^Q5OvS\L 1Zp! /dHLȾ fRrD-TTdCHx03% n c%;t΀,a.$u)Oh gq nAXfVv D-` 95>dF=&.9l͔OH Yw!Ya+vdN:;Vb@Z?31;bv=l##HbʄO|ߌ3]cdF?'00£پ*hԉhhM *<]~6SFr4!I㣁_f`fã kϒ)4*B>S,~6)5$(/䉔w L ) 4A;A3u|ΑF\׷V=DXad 8;LH"F]tRiEg(Պ(@CI@5*-(%@c ]=dQ H֨|4kg p %@^  (@)(*k(C`$#z % $N1ɣvPk&&8 ZFzj)8;5I Zy'?Tp VD]FFF]1ѺX {Kp-9g(S%jŅRܣBT*҂R4ѝT&{s$kF%>CQ%51zdAgw:CQ(_`jsFTPʀ[= :hcר>Gid3NQހ(o@} fJQ@k(o@s)P ;EyȜSQހzT)p̈́Fy+^Cyn]oL@#)Kd h p*"Gy*(oe 5P,Ey_/Oߞi o%{kAyl۞ "L~}'\y6lqlUt*]BWK"$˯Lz31[3}qCM~- B yl#m䱝 *m$CQPAo2~3P"Jh< "BaDnO1@d͉H<.m n"XY>JsdoHոRMW3A n|v(K)f"{x 5k>ƌw ]#f8oOY.,Kx}?~}H+kІU5&}M5}uܠ_Byx[bv%Jaz{שwL6K|GCK;7'(vHqrB[ Z^n%῱Aw/o=JfdE:Ɏ6^(3n_*ݭT4ָHÉ$~bñ5`Q."E$_>O/k-߾~ޚ= \ I_[m,8-cdU#2F;:q ..nә_^񪴏" +b񟹍yQ'fXZ~=FDpmsvmb/WRPMV^iGh|{gm N@YFen|wZ|G͒Mk T(r`Nxmjھ2vQ®̙J$[#+KkYM8(yԘޔdz=/-:S pncwRט])GX-`ٻzpM{ <{_VJsrm0/غCmwl,/[UymVoePǠ]ǭKt^Q9m/{R K=y4;A$ Q]YiF^AGjy$Y'^aXziGuUIrx4hܩqSX=wKU>awN2,3'r]|DQ,3d;Ї CHbwL[w#Wb,k?nMYĥw*]Vһ"ܡ8#'V~j:_i\\],zN8K EWn6|8m$f*-&A˫O?_e<ήN?뢛U G_'ukox`i`stw?w, G];bV$[l8#AyW*i%|1oPhEs...MLW$|W'ILGGjH-o0юiOb^d)jb^؏Zvx[4T֔H)jyş.Σ\|I p O2W* S] *@R#!xd-|}`E6.6]ԑ8{{*m =N5nE..&h= =O\h ߍg;.wBx~^9L̿.K4ˁ|WdBؓt!Ēl,q&6]]@?%dAK| =2cӅC#U AN[Sm6EדO/XobEVc١SrŴ`>wǦtQ=Dt.ήN?.H[iowP B].l8vN>#E.~ي}Ϫ1a"EnkHȿ#EdX UB^] B\CJmъ-IŚ.&Zv72]D.]oeߛ_S[56."Ӆ#[T /"6]( ǧˋJs# x f:&_]PvU&pd\-DQ0bCYa0# f46xgnH| `ƊL] :'aEf0"\.bECRv;eN@M/.{Lz,'VFFMX!GQ<$~} /X!6]ĦZ_!%Xŏ."1ZD5bE aeftJD*DWGłc"²RnAZ?.\-zׄ86pϚ"1kBui87sk=WsqB֟͞RX;jP5 pUAd4L2Clm7ȇ.Y Qtq& ;Ұ;߲.К(UpXL>V@ f՞ SU:\YcOm'ofۻΑ"r]|:x*ŖU.tpKc"iXm`?ӂO|zZo/jY8(g;B.,mu(#h>.].VA4jKv*uFznYv.r%V2"VGWlEIYlT}\Wk}V5l.jeȍ+L㹰gR >h޻@|{ujjx8[$q$4vqv~>`Yp hmd :X?{nW%T@p˞k"wf5O=BlB= .}<dcXQDrUn[#d@` \|0.> M[lC@ŒgV\HJ'<HXR Ã%H4Wg;aZS: fv$ ք a&: $Ǵ.0>H;$ޒ0t@ҥB'$}2]@L}Bb{ Ofk )f{ISC{@*VĐ &m9Mfux€2m(jpL&~m셟̾yGv$ 6} aE J'' 3ѽ%8lK 3x.' ;dv0>H $,e[0:H@R ,2(aGL  チ0;H3 ʶ|H%tQ5a5Q5m&HL&>%EJT؄יUGH蓻G@¨|$QX%l!ƔTM):H5)dt0:%xP+;܏Q $LVHuF:qRbL+d쳓dmY[Q&;(ʟ"|Q95'\/G#}FgMIrvwt Kr}:0k`1Iй4y" sH*S>I^&;Tjg£WM 42YpVߜc @YEYCwQHF1Y*k]?L?5 $[d9<51سQ~>{5CTțYk1Ț. [@T9a%ɔ@gJ @hGTZP(p5zHAX=&O"J(\&r-Fw PB@:QF͓8& w"= vQZI4:|R* <i%rdž#O?H["R @$Fw% (K@->&n o|4LP24TQh k-FYk1ZT,PF;61F)fr-FA"'e.v=>$DSOeh(Eكb e)=R=HdIG^(ăm|4Rh09j6j( rr$HٮuH*y6!pr'LQP7(\^+6=dթGCAϾ VOR-zWa'ѹ+(ʂ~rH"@dL<33Z2nRE&4s)HL+Uqݓl`1  nX c՚X}*X/p# iH݁Y L?! φe|*ҷ.>E'Ӽ7m,h9d&w" ;60}5 _:JHˋ>mfq1.fmᥪ@+˥|{h:XV]qQj.,СŃd[k41qs,'٢Ǝ|u?ÊUOa֯o ?>3}L >ڽLR~e&IjrʋjKfҍ%-Pyf<3G)Ihg>+ =7vI#j& UYܺ<"?Ao{vsjY о!o,SfdwѽgƤ߻-45Yf}xhGiL?c 3``u.70U H[ywmO.o:k룲txgx(ye){":Xv17#RG0SMp'v,ii8=G2?^ꢤqǗ[f*x J;Uϳi<]PV߭b6B.%4.7oouYN~BN5p2@e\! q6[Hh77RcL@Ox-ܢJS'RC|T:jZNՋ;iBZTl2]Ior?dїW[0e;MW·"|αKٴݴ dTYt|_++W2t=qde6<=qꑪLm:?~xQ-,3A>Lvorͤ<|b͚y#v~>(L{O3&DHʋƺ|La'q9$t;@sWx,fx <]=_^x=S>tPƵ[^TjD ?M%ڷr$TZKjԠuN}"lܘR7vRoic&c5[⚙*g/.#]Kg[\նO 淹?tw=׬;WZףvtiq0 tykCAw>F&=v~;8*XݔvyVnک{i+W; ݉ޗj*×m?../3A*DjZʺƍkaU鬅j aV5 -l8cCFr*SƁ2geZgKsVB)m; m}=aYs/30t<J%r@O{ձ4 ŐX_Ġ'ÌC<s!Ud}]XLC= l5, `Ex @HH"f;`r wPDɈFdt0O|FǔS~ȝd- fFĉ| 7Dt0f& p'~mxLX1؞@wOɊM4'f)B:6/'fSPlrLHOD`tJFƸ 37ӄ|3ar<>l06&ژjOlL1$0ČHy1qxٮ0;n+-㍁H`ė0DhVٖSx蓁oOv0RƟ $~3B,B\*>1!' 1%ffƒى) ` ?4Ɛ=~20~H +>49oFԇYIF-aOF0f>"CJ-of R!C&Fdl?#"Y\ăO:F$ODwHgDvH3'mdC:Esx43{tHQx'zuEFa@zpR7Aia<?CQ"J*PDl Lp %LAwXl%_MP:NJŒe+jxՃr4} ,ueMã-cDGSC4@8$'"Q(7H5$k(o99#*S 4| g-Ej(K#HW3(EC]fPv0yTpTÆL))F}eh=h1tPZM)h1ŖS=H({b4 e)=R(jհnB^(ă;Pn4. PnTB'UP J!ЊTPyÅ_T5( G5(mB&cr4֖LaQC࣑(OCQs,J1ߍQdf֯LQ+6C>ar'*|bIlC.`ܳV8ۡGe '+ƞh9S#0Io+yr"#U> |? ;odrX5}#Zrc=}rvX@ٕb(Kv(h}, ]\ ;<2C0d1t`H";l=2{r+Pi$O.e5[Gv`0"{ǝaw0.n~ȳJ!o±hk p6hñhp-W`JHoZ]k{G˥{?_A=cYJ:8<k# jׇMCK[\"뛢[{?ޢqt/~~p2<~>?_r U 8=N?/,=ZSr("qJ=74a6O<*|2je=) CgKڻ͔.Pe:%#Snn\69t |{w=`5*Kb6 +J@/TSӼw[NH͢ =^$t',eEiwxrء5% bn*qxj7e ;W먅n׊TNwŴ?͇1ڽzrdxj>\JTVJ\K4(;O?\vO5zenfr6^uqQc-mFfJbj PZz\u '2?b&RAyλSC;dg,''M?5Wt;|Ξ]1i]/hAm;~uxv~(Û 7l("rUA옙4s\h"Jv8T8 j+םB׶KeKU:`ܟK,xk OQv/)n=iFՙ7d,5ScTvqv~Fd"Ւ? 1K^:0 %OEܰd(`"},Qcw{;#tΈ8El,Mgc1@(h!@ئc{rюs;誴(;+đ 7c\ѱ6E$d/"}n;2fߋrs&g` ~1 FŌ acGW`G ! ?p1}m[#jIKgЊ`t2C3ddiuF5̠x 0Dy(  Xd00:ۈr%#Cd aSRziuHա9 6b:$~Έ琒 KzX6Bɻ>+84 ٮB|П#vC&܅q] `12 C|0gKutUB&)Ith;`F|00ڈΐ*cd'# c62 b2|Ȑ2!#CdbF\>2X@\vJl e,jh [Fyò " 9b(. C"T0|==%JpF,E WXR!!; 0 b1Ӟ88)b"U>%дRzP9G$s9GQ})k|ȾW؛#/>Zg#YF~lH`ȟ Pb(b4"0g s MBxx?%%(7 5>k(b4 73o;A~~eLPz#FFyn3!B~L /9Q2hpR,+vG#LjyɬDߜghgb4ʖ7Zgߠh$kTeMPfFIPvJIDϤ A7G~(3$z6=nAy^k1 yR- ydH9PFni %[X֨-Hhz| {5(m=[KQހ }3h$k4HQހ_cTm֏(o`aÜ(o@c)0ol Y ;EyotGY ZF9*IB]~M4ÕD 7h1r;0oGwk0o@52 9T Ϧ/L0o@O7&d了 KQ?K=Ey(ob45^FyE;hd7Zqy0^?[q* ٲ.ѳ![RnyH[(v꠽b0YI5nd @clS@Na7 'FoYʝ`cEk; !TǤ7+¼/hc>6!YRn_2(DuNrFZrJE :b6//EsK<먘ԭ5:P[F #H_ 3;Dzd>gf:mxH$ImsA?HB+N\ *KzgI==>?R6scAb6mpkyY&_~1eʛ1.e|ݰؾ%14 ;{(:&M/ G` !b 8[]A\ݗPb]vK 1AӤJ4q7q0ߏP269cz4*<ڞ:=E=V1 8s>_fe}Q1S. 4lL̄cbtY U1)e76Njw?\]|Zef*< Zo4GiS;doC V#~6j|p)(Ul3S!ReWЏSp:\|PX* :h^'VuъDNs|cp{pŶ{m7O[ XGV.G 9TIŔQ)+?,Nx[k*>Ymd P悑1edA;otȗZZkTc~ަ$tFSjhr-h9q{HФ4j &m8ݻ~խsz68WȸXog՝M$6{kUZD&i枺,_p5Y7+`LelQ]Բ4EnѲ#-4/*b,sb'&Dn^;TX3@s:9EDZ]D\i4k 7kjbBbU!.t^hon!\ O Ef@7[kU6{W1E+y(=ʜxZ4{7ЛM5HO P.Wk^{\kv7bP֟pjrER^3U!sr͙݄PϙĚE] &FEj7ﺉv5c\9[hLs[)HejғjDZ-NsߎlfҮa"r)l+~>_IRuś/Ok%Li}j+O-q>$[  gUQ7 6IKJvv46 :]|:xzuR3KL.hlǐ+|,f45jѼVE6 效z!= +(lzAV*gdˇZ]m Rn z-ZRND0bUCe:*U̝'Sd&s]N@ga0 Ef<>a[m۫jj\6J֜~oOTIZe4bg2SP֕8E]|+Gi*Ņ2r]ŵvXg^2 Zj?50"J1s˾UT#w+5Mxڗx .$؆AG_ Yo]տQn5N]^T5&Ӟ}^ B.5. 2GKE*Μ4a`>:p89K{W_.}#v~>(_)*w לh^D[Q<Ϣ:A9:-nfֹ|…`y`Y<Gc3{NY"/shN_†{WHRC׌:TF}>=J}+ϳW!@v8ʥ;Sp9a?Swm UcvٺXA ξ1aQzS jmTPF)z3vcmVwn0@a~#ػW-ĭW`!q|0peu: t\.uB>)r:hOC*[ ބc,Zlwn#G7Ho%vpu*Aؔ7oʣ3&x̿koU (z5xu9'!VI ==J{ȩ%dyyp݃A[)K!zZ9gd j"h /,!T2\H#p%pS0aeZ XI&=1JcMwI]m>]}~w*V/+A >d4їDc<<фS2N'qq͗nnnt.|UN6h_nv*l"'e?o3)pn'3~~I3P5%b$hbo>dOnLT(d~5 3a͌ڢn]UWDT-ț;uJ&#WrOzGH{^,LnFC~9ye-amŚZթk48|.dBȥTۘܕh:p)d}x=Lz]?A+٣$džk!{̊أ˯`+c k",z;eAs=w 8R{r .4~*ڬ-VɄFc7sS=GEk"6E8RdDي=XDFcсqt:* :wWp6W1^f3'B:>HǍxJ(/ޫu:q/2d: qў1\Ѽ'5 `S+i>z~.DIjoi Q+~m46S]8|C 5b6@ V_il` XCi Jc6޵|b7I 2V-9 d2̈́xԐ:gu~ڥ}lC€݌[Zi-jeDEd/j &[a&G{"-~P{վ9m ph fʬucglHŒʦd060a ۡfUf]@cI0Q Os+@ِ׿ l(aiW,i0l<f[Pf 6݈dj &bDHB}r9@Il) 0{Y.Ua@7gY6LVJ3{o˞1s"ç_ 5(Of0Uv6@m00'7@rԍ9W8T\x=c6ClBEdO?@ %'Kb- 0+FlxfC,f+ԭ͡HIkFXhnޜ´:aLT= ckZt@w1&f>Q!kkbZC6Xkl@1kA-<, XCYY pes fC8Q"z `Π,m9jl",jNשH_FH6o6VCFFi4K#=c %h0VD6LN5!mκw(PJVuth9@;kt@)Y4 BRb[)Rk@k#6XX-Pnn[o04 =6o)$ˤ9ŚTt6?G#׫o9asa3zX$;Q@/zXڂzXZ:-(Prz<a_3RuﰏƟFQor=Q]y ƭָ5ka[#qk5v@Z(VA!Ej!]y܁D<a[#qk5nF-(w@ (uUܲ5%$&(oݲUxn5*փnGz#TyKQހW AkzX Qޠ o7(oaQFy^T=a  z@XF~[#ƭָ5k xAk5ȯqk4rAXCy6k(opk7ak3Iqx6(ogt 5kؾ  3a=h|16hvNN_಄i>4bݹry&שm! U^.u/S{bZݍ5ʝʾI]ُoo<@"}t z&K_zJX7ShYGyz6YMh͢m)@vкLY/ف[5+W7]87牧u_^שZ5l}m/"}fB_^uYԋL~UB>b*F*-JuտWv=f8_\LKk{n5b Gז1Ds4k]_>;;=yu.K?5:vbZ B-QvrXOŦ;@Ü, 4J}Y㉵>RL~X"BDZ7Q%9@g )k5ѻ$پV>9U|MϽ8!!]4skPHgG2ұHkXt2 鴶PM~u5|#ˎ|.A&7߭Wzze'_"Yz\"rU񝶡*.t]_%h*܋\^@[RD9 'd/p<0ZDi6q|x.7>x0kN$3Ft|$Ǒ&4b4=ǷGg-\v,>(:A45) ?L ^5ͲBŹ E;cWū{N-vS5lVvGN/~V]noz$Nwew飱x)]OWV^셜 !Ej2wkM|LMi 6".1\&G &j*цSjQĥM]/q2 R] 伧Q$i{-i`Gea}5ؑӔz%K^K=ojOf7a+pБyii 1lHBjm?~ߩ-5\g_ Io~lHN{WhGbmۼڹdW;gxsZ;<8<F[;8n;<ކoN*(j>9 Y dϲ-jQB֑X1~C#tE\!Gl1Ed-@$&ko0SC /Y gʄdY oxrz!O]"5VCJlZmj,ZVZQSu٩A=UZ)Ĩi`jd_Y )Mqqr!5khCY 011fcb⢬cZVc[ELz(0@WPY 0 ze-h)\wVuFY)KX㭖cFW{Y 05;Zz[V=e-Y5gLJr]{Efղ`<V1kq9KY >sIL+Jg-D5^1QiZ󓋓SVSJġU+*vb쮲|7J@3\D}Fǣ'ylHz*O}0?W\QxZՐǔw䵽c13QƊSVַFv =}-I㩴b:0j:oTn@W=[ϯ>բrhmͅp"Suw[]YέJqTLMK۟1IPJN+ۥѫ7,xƥ(u6I[)_֋+QYTUR$ۄw,D܆}|e%oߜy!2;qh9EmsmwOoחR^ur%/Z>{35B< dr͂H4|# iBv^-}覝c^34i j:IOwc^؟.e4&Mh߲-TB(3Bڙz&?#/bEnwm"dܛ R#* OcYץ&3)'n|`>'^#:͏<Fuպ /*` w˱nί|}_\OVC;yoshimi-2.3.5.1/banks/Drums/0126-Drum Kit2.xiz000066400000000000000000000203331506652756400203750ustar00rootroot00000000000000][w8~_sm|eJU^]qjTԼlJן-HbKbHDO]lik߾o]^<~m4yo7N/Ã?lׇ9Op!/_MtO~;9F΃_Ax-`}7Μקdh\.7IroK^z3φ"x2Q/]]۞FaO!\d;ѓO|W&f,?ޔ| txrsr8 N ؇LEZ_bj;]i$S ;EO+Msch1"ɮ#lصw$MAN6]O=w$fxy+ۅlg(7$M_{t{}&~sV8/̎ne'W*&7ܖ]9QAk"hcm}&vM-?Qa:?QAۓH_˯_F7ΕJ!X.<>ͯ۫#;X;,X*>B?Yt!m ƘR"zѓ SϙgF‰A?A]tD0;QѢ){]oĴ&UzNо[?~:pv]Ne`xHza",;[hcܜ0!~I̓ԝkw:![ | w`FOj3f7<75= < l؂{^w9p-h|#w]ڊaRL/M?`x!;T!hˎ}oIŕ`}3;֨DɿuNO;vGgGlcc:Xa#J-Ҙ ֑/-nh9,W /pN\+3܅}Q-*iGl>p\\m8>Cfn~9Nʝ:t$⤃&zs' դI(k|Jt5:ce=Kj*^b!j }AW?׫3ʧjtgOoY'|Bʧ}n :hEQ4'**{4O賱ƫJi)=lD]c@B8԰<଺>ĎjAwQNvRw"hqcZ2w!;Ͱ.s[SrP,9K`8'}8 Ϊ4<}Z9! vWȢNK%ya-LQ1҄MDY*lNFN:KjׁE̻zQR :;B|O/V5PPOƤt/n ⊮-})@ NI }^ZɉYO Ī*vP!=?y}# somg"VIzS:hJl9R:V\,.sCäAσ˫A.6 Owny+d;RE[a|Kap#=gD $ǎ#gˇ&4_6sI6 *DŗPŃRݭ ٜ-&y+V,D ktINEU?8Q|/(*MJYpNBb|0Ke Y^%o%ز-+}JKJɨf=3G8znA4,G8zqRh=0G*;z})GeZF$ J%bGK 2{'2{J Y-x+l/:&[b1! ֜" WLS윗ULB&VO-\Ee~{g':"?gu T}T.(R(ťԐۚH<`8ex{=`oB)toe4SYutIGG>G寮'u.-XeX)?,0 {MP2W HcPS.` ݈]u~AdbW@V $ذ8@^Z@Ne-f2Ҭީ..cDf| 6-KֈK{1)li}#SeotBO5 ~8RzYmvcHVζk:{Z:}%9 $GCWKȤ O[iY?~ъT޹TR8Do&GB+yJuZ߰a￲~lظ(8%-vɰa4yE%6JflذY)aî ~U ذ |:eT<#w |ZmȰclC-p~!1ļgN)^YO,m?[Y-\^xx^xu% n ^cꊆ* Dݥيj㲢Zmܾ{/dNBͶ\ո&Y`Tc&{^[ݮ&aT;*68:Af{MvQ}預 _ %F]ogd sM雷2p#c+<&= ;^in^hôQ4 zqt}6mHË>N;suR|\YIc(=x|R%~vY.9nO(ɬY%6 ݖL]gSC _&(Va Go)fd5Rs#1)tT$<ɞ/fs䯸'j{ɠZniTp|m|M;HjvW#hq_($̬w[Oɝc9 3LL .ؒ{[c89XqSe3;sA)fަɌ2c ;/h_f)߽&3j*(⣭Զkj)O2d3[8s9m/W!81볉TuvY~=ꜞvm>1뢫M kLm}'޳T\oٲIJ)e%p>RԾ{O_OlwG{hwL 6n&@%^Q%f#J@ ;S8a|TUlk 0|iz8g }k [p7ݮugW{>9nmsPF^É׬6Uku@tv֬i vLglhtB,JpJJyh /i;׬x%"VOW}.H NhPӺAnHCzZm4DjY7DoR *,@1$oߤ]%i(xSՆaYD Snq*3O0O+ >:FmC9Ɏ6ĂY]6zD;\G:%J۞3M΃k4Momy5x3ҪF%Skj%.ml{jK]ѝInUCzN/xNHO,yf1e#` H6ˆ|bV5FgV8*ߺ UK>- g~U:\_h SrXWI9\]T|3jy[&sm /LJimMzMgqVC챗/]gD%ǒLN%ItWWOE@ܹ,OR2ڙ{ $c`>H^wjhI.b t:)PAe@y`AyV(ᗸ2MBTO" Kc>+l{+ "uyAn"Zv1_]s 8]Hgu8ň,t2b9-nnq?u4#}YLQmOŚhl]w8įicDWmu os[ /ɔt|J̶y9hL[tI{iKn`ЩQэ}Vnn1i54 յ]u j*h9t)ut9%:VRe5t1]ƴNCcGиm]wihL[]Vt~uVgFy]wh9Hqʫ)ittsN?Il%kJ9_BXƶNK7tsNKc.mtZwdHcNG7]*9JkFwk=$:޷e5qc[n_*\SЖѫЍGZ3:bZcGR:#:奮]wЈ>UU QXv|YwnkVNC;t16?t&=&6j󅍙:թ~c'6[:FtsABmYrg+3-fb.c-N&~Sj"+&Ij\<ƶl/;8t)p4NShJFй.|EE3EϓӚh 'rJXe$'6GBOֆCbh2s5>J{It^,K3mVkz Q %B xhz ^bu'%5|׷İP,(/cZxc^,aFD+6.{c2&Ӕz+COܐ%ғ4\ғO@p}:5Db=Ĵ.iP؞6Iz&rfVa=>,òC!sJ¼BK9&&%\tĵhsABldv19{@>d.L=-ZXiF[FG f=ëep,y|+szQ_-O_s8_I:.xs<2镢̛Ֆ2LTom$X1v4\{t3gWkI+uvӸ 20!P> '0~<|zyA L%(•_zf>h J^J&\X |" YuLZ•: kʠNjqJլoZ'>׵!<6&ڿl:viD d{ؽh[̠$g٧[G ߸~Fv;iJP%3 `ovҲ$b,ݾT%N24Ra$Ll];QĊ.I.S{DY?`sD^{|gITh^%wktŭis@1]l.2F8eײ*L[LL>ؒU!V @P@inI3&de26jqvژ/.AVX$iTߴ*DszV43&Ce\0nMUx`\]SuƯ[8į%F_BnXbgO6盉$,%YEރkmh…gNfVoRLB-;#ia>zfD.)"{m|+.C WVx֪^IF$UCgNYu 58?W`.euVWr T(ԓ#+fG}E}/@EH P{V>|"xiWx6XOEBl.vy|hkۤuu.׸2E׃!%Oer{ "xPX)7E>RH4#6!:wQhZ̩<saE("+pWVob79Z;q#LWk)\ڰӺ yA𺩂7(2 60UBr=\g% װQ%2S-AbHiռGVm%LaM2ih'pH6pTV Tj(0U I\&ez[r֙2/$5@|*|̸lk̶# @mGo ێ+.a4o«˕5'1kPˈz(d{H>u^ҧR.8ЇR=yY|,a#|یsde˶w d}$l7v5-Ś79CM` 5AR!%3s*O'J(DIyOpέҷJZdId{jr6nTͬBy.P)-O烖(Cc&n)ܭx; ꣄;x ~& wowwxo orftMg %9R|I%pC1 .q:{;KMOrqdޞ?&^ԙ],G5fohzMmeE)sw)[WSWlx1&=CrP@ |.Il;Co2"/Z7vUBװXEtsG $ߗأ%<ƓoMOZ@?7}veBv$Qg]AJ3l퓢Y@JYE3+=hfݲ.gEI8X.`Fnzn"W!\Y_telSf=%0:~%O`6ln/aD?YPyoshimi-2.3.5.1/banks/Drums/0128-Moor Drums.xiz000066400000000000000000000225621506652756400206730ustar00rootroot00000000000000][WH~_eIEYaML'%lؒGI3겫J%\Oƥҵv˷_SaDxFw~|w>ul2->|jw38ye /_EO8B?/|pMO$ lܟKvwA=/vɅ^^}rv{y}Eo']Ow"=H[\?]>=gzOgvx3*M/rI?eU3/̂Y̓ 4K "xX>s8TLJ?tpz `j?O)N'߃jt{ꖾork&ٻ}d}l> gMYgp`oQFܬ[k#?k.Ǜ? ο\r);7yV&Oֿ[Dp_+kv')[kW>Ae'ڴ\k}~}y>lô”?\NC3vLtNom5mTzO]B, 6^Iv|H(ՃM'/|.eHa<( W" ])o #$˔_wO̡0I) D| 66T_RWx#$e,?{qG z^ā~:r}uyy +RdjW͘*٘K$c_fI+R# ?ê~(GG$cNzyUquVX:%,}'f[ O ŢU%AE\D=пHDȷm>y*mVZ9Zs)9 ']NJ]\Av $()m5u-+{Ej"< ~h X`8p~/9|oiѤA7T;HA_oeDTխ)v.wqmg*e* ] }`W]XMm_=8p8ϩƤ&_h!b4ˬ،f$WHX-NYzWfeKPi?|ZCeIpql8$(qs#"r/qTT}L#,:8h`D3H}! 1\-8~G_]ydI9dNU)?zܔf;gSqWS5 "TN LB[T`Rj6"B 9>Hí"gPe@-r=v 4(eh^ltʲ-@ >BA^ 2"E@( FB5*&PlټqY'*2-Pfc*W JS|D[c[[qF)Wsض{mMf*zܰmMjV Jb&G)*J!|B%4o_v[@yS}SJ꠺Y74>5ڊRU*Z25 C[1`*G\1;uP1BbU O:e=$Qw*X0%>rFٲ)%:YÃC@4~I$9l/I%I!kW@m]]qyA䷜snE/]$'u(_؄D&B[v/CŽC$GT>'gH`[1*`ѶK}P9;9ⵟO.?.#PhZВ55q@b`N" z!=$7q S,#_JqT6Zlڐo 6Iɯ&;2&,~ gT{'бi( 1Q@\ėH@ܱ&Y-f Cwoກ XQ>@94umw/dռ ~v[uz /oqaJ=/ PJg2N%ya1)M >ȮDvMFUgN]S%PUA<4r˲F'B.ۣ޺_q:bzZ-[o'r}p[G7(n;ߤn DgSC~))L3Gn;v4؛Ei%^@݉()RwFsbå;5eQ{iZ;kEp.ɟ{cWL:R$.>^Q_`}r*e QEI)EyQEj$ko*lӠf8j8ZVXxU ZgG}_^WAKyZbI$(qW)5;Jv+ %DsGT.aǶ}r&z젡Me9$Ti˓AzQ+ӻKSdŏt^v`[_k|ɵGM%mRWAeLtl\ _QS"ұ,kh9hIoj.i: bByۍw5^Wο0g8y2|oq\VT(${O48>㓏4V| kx U%\rOѳCIԀLvF8d98=opjsr FGжl\0c`3ܰƱ8U =+Ʊ*Ӧo̷R'Z1(Z-"q)7Jrp8o-h,Af [dqqh72wyxtKie{#]76VXQeO}]y: ݡ۹9;{ǔ/K#UY5Aaj C*|h:%R4@D) ?e^THӍybz~C|1w~?`O!HSɱ>c& l`޼mۃ{p um}5 (8GQ1I2.. Y+vD:k@Ʋr7$Os/o3֋sxS 5RCdF*d40Qu56XJ#1h^)Awz 6`K'n]ܠI@IF?sf bҾ3gt:: $$%98~r<6I=ːrv)APZ?loD4H9vPH:@m`F'af _Ij <ꟺ#g`g8pgQ i&hϺvMٗ4?>&pw <$ %]Y 3}z?XC0upx&ȒVRXfV7F{LXbU AL)K, Vi$: FOAy"QB:ѥ 0{ȯ>~M/;_2"P[3=! `>LRv$'< gRHh O3-_S1̛D-2X ~?Oÿr;lѦ4} 27,_ ? ]@uEd0ܯڮ/CYt+M)8mHџ@]a f]fuύt;Id6 (0i ?0EjJ-s;N͡"0ݾ6>}+Ю=!oLU)f.#&eQ XdSAF}U&W%"p7ݑ0;,pt!h:#rY$6β0 d'!Q]0I70XvMd+ M C'Eeaɖ jr~xe];I}Ufe6Z@>wHe {NdP}hS,(&* K kco]z(/?m$զޘ(% #DŽ G=xOAυ\~NFI2CVI.ԄiͩSG%UJ 5\Uꢕ>Bܻ:D['ֹ:ģ u\WghG ]"M&eVEB@Wg4G {]VG:+A KNk2P rIVb MH'5'={ãwf-MFhEJ4>lQ,IgfEA#6ѕJ%/VzY4$j2ǝX΁4'2Ya akO% nt.5Y.R1YiXuMVzM~tg;9Ґ{5ޫDwU;BBwqѝFYȰyl5Zμ-Ud!+Sir+T:NM%oy ]Ͷ}& }پ`нb #[ݍnX/0h~]f! djzFݫ8샵fӥsR<XlS9X9I@(Rhoëz,UdH9.ѽy$橤sL2>둌,4]d5QV&JF #<bm*V% 'ƼUKnS+E~:$1V@3w=xIV$-ni%"]ؘ 3JB#$J.8:q2*ѵve(Bĩ%5Wҟ/y%insu"O1|5TE`z kqaf\v$W/ 9!?A|2B )MC3pt}l@#A쥢:YE!;-mQI_ 7 TGMD <"͚Bh44|hysBh@P ߮5uHz+!ۨ+Xs}?,ott@)PC-B 2˭5BL;*K9 `c&6f: s g7H' N־ɀQw DK9i1T#1 3>LR=%/2m@rX&< ɛ{Y4flPcf漬W D  D rhKLcB'` nT2[IF4׎S`CPǝr]K[I{"it{\ >/iuԺ,t5!Ppq[͞C!6PkJBA䅊xݴYYhUis<´ S +]Cm]5 y4+$oD9O .:)K,cMp I#Gͯj,WcXf*XVu܈JX9̛т(R] IdW"\iFWBw`GzMŒZF0ψC؜+(an4`&qGy䏒\`6/oBR6?PSO'@؂OHMxbg :" c؆B.oza䱆nhuV:y!P#\V:5~*o4ͻ4/%&~yAY4sy]7L/T gO6wBWS٫tᶞ'f%ֳW~B-bHYS}@vvBp,7s_+vœg7쇠Y}1UH kh7U\ k&[nXPb=k$1-LP~&H.C.pL^$,4u~H'w!5P8/ͭ0)Am!{_iD%?IGDjN`.dS}ZDw$L8ax QQ]prЈ1w흂ѣ OLpVa7=J A [-1BjS/_謱`:G+nReLBR48vQX\oN[!_g+(.?; X)-Z{%eg@征4 y&Hf"gayd؅D))B,~~-<\ thHw8ᅛ8=bH#MW")G΋ _܇Ss򐳰$2XnS5 :.SDh%O\YCAmQA$'f ~w[:Lmk%9u) V* GtV%RUO_nuZ +gm KWW RSeb etIg*0$D4P+2|gQybu `6.AyC7DyC7,$!qON*0 K # C:ųOd u DO#٫զ})zI0zE-b2#ؕh,_- /X~IRn"} &zcKIY*|Yk۞DW<238m:/~E  a:Q)9,@#`SA#CYc Y< y}! WVL<ߪ}ˏK4ЉU |fj09f?|Mx3iL,?: g0H6ڎ%#-1Lbx{~u ]Ύp}<fIhg+c5p/?Z'硩kٸQÛQyx=ݎo6Cs߃y<S+&uj  Σy,e'Y\ͣV$3 4kcMC@=yҼj2'"K؈bE T7_.Fvÿແ{}ӧ1ZFj d}JfjEV|z׳S u.ĎӉFkd'lLljm-7M/w*'ߎ.8ݣ$}q*׺-7Nߣ X*NZUdQ2 Tc RX.~,/|]YF dxSn {T/$Xtա' I:l‹\4#f]t jh1%¿qaaso,/"mb(צhiuc6Z?!\$) jD1_G>A.|\o?Ї6,r+&@_7St9&2Eaxv=$Є!a0Q7ڷSkg 7䮍 6?~Zj7a\MmN[;(:h?`{Mozpu{m_\=j0`qJsB,`o&h xҩC' 4 Q|2n#-:w|t< u$ް'8lWni"?iNU](sUjf=8>]bt`R PfS{ͼD)ȗw2QCr0NH)6X53ŝx KbH6v# -j=jKY\]/O ` 4^vwX|UhWIw/49 [hݓ [N|Xݮ=%9QEo2sZO%ti&kTdcmia7P)k"X0bdNA} V(-['q,mQ 'vm O۫±'EhjĄ1ɪ᪤oc+;w>iϞ c7>vu{o9z:O|-g0>=qk|6qVQkg9Xi.mb9&Sp_9#ar.⣝Ҳ7/9: v5g9LzNn[b.ivqN8}trvv*56mHgam m-U~ea_ՂD'6CcB$SO0Z5̶88Z>s aRBb}FoԄYM]DC"ұi֐0F<5Ōx`b*@Slu5anJ&=gI|DRe>m)ÉN2,)Oޒ:=qb<@_l]I@c蝆*X NL3hw[NzmXVe';m {5pTpbYߠH&}n|*Éў (W`Q[D%U2NfDq(v@1[tw &@1h8zrgg 04QVnfA],pDC Ao qw |:-)e{peH+u%xװèA*{J,y1j`dQ…QIeXxu? Q,fK0U鲞=Hal|u΅,XZXZ >gXZXZ>gXZXZ :gQ||%+,?0㲴__]Z||% cg ui 6#ݺ<1\.uڀ`ӯ{UI/Gf 00Nf&Yb8bԶ̉a,1aPSƉa,1a,1aPSXbJ/ZV֥4zNnCӮZsq;1'IRϝ.e*r֥zv)ۀd7(o@;1aذ>{N̉aۀf2}(cOGDoRiS>uvc(c''8NRՆ{vc>a%o>aN Ai ^Dn;1aN woI=&'| 16ǡ5'A18 jv)m aql: mJl;csZ rXkRV7֮ 8m&rT$$qk\ǒS}OO)߾'$qbʣ6<9u,9$ mv$d,ELuP 9u0"x $ONq])ɩWtݲN<~&f6}L8HY^R-Rq:HZ2\dWMZI @&O<9iHyd%jVm28*mhZ 35*~rjX |Tl=dJ@q327U2+aq.$%T,uxT05)ؙ>$QMTH)Ԡ>רB{o*f~obSYHhW#< }TxAV',"gn*U=L|7c`12SSOMXj*>ifǨ8C jjPSϜ5[)^c=*9gAM7s 3c)^)^)^)^5/1J3x |*D>[`>D>Y`C>Xۙ>~.!fcOlnzCj=>TD:?J(׌S2r 5݂OSym#c ~Sv(?s29H|{~;T >QvĔ{%&8H)T=thأMFX'슓qVo 2 e)35ܸSo;UwT@_ԛ=cT@McS"j[Ȑ-rxY&3\$-ZĖM> FF1طH, ?~yg x?[ØIE+M57͂y2T\xM?&@EtՅ4Unzg$7WpݑfZﷺVQ IvRp띴U-F&G;ak+Dr(ruŽ冷 7<;0\5Wpmk2K\ӆtpncο;Dv4@􏺃VU1T\Cm&ut#M《kP6T-Bh.&=pC"nnC{(K=,[c }gYUܜ6xc m4=mڐn{v[-f}jSbZVjn{)tV,8M8IͱT6dbF*E ^Z"ve|rsVGg9nN?*]Zߒ0Syχ5 ;$%ĦlWIփղ@'נϐhnx_F I3'aM+$2] jJ=]:tyZ:Qp 7.E 9u[ Hh&20oWN,N"8xo3 & dZ0+0):e~)n2ƍVtvUCyjnw;JY+MQ /khQphK32|w{S]#!Y4F=ھtzR N2iA]JMoAw8`J2DɥB4I)|$)0 cIHĕޮBk"\PQQvr5"gA{ QP~Q&lD.rBj쏳O` cDhuՙb.+NtEYlڢ.b$y}S\xs].)v,iz'[ʊ~jX3``SfcBeA\ iw!6)6/= [IWB^yp_W'Q7d7`#6d:Yz歆xPڐ. g9:P+\]㬽xc]g^ D Vk1Ԡejʗ'dl{0#G2<lo)9 _*t06.!gU6ݳbA=٦x+ +Y GLV 5(Ÿ^$inj߽m{R''~Fnz/vve3]LW6ӕͬ+ݣbAXƷ؆؄?i*)/ Wb.g Wկ1L*Ӯ#Ak|xvہ™MNmm lp|O7qP1۞lf+ē:(y(*ܽVy-;nOwݺމ vz'٭^ufWe6mN^VR$^վ}?HzOp&m(8F'"]NkZyiߥgW C;xٞR\Ka,o{6r͕~k~ECWa1N&7|y(1yoshimi-2.3.5.1/banks/Dual/0002-Layered2.xiz000066400000000000000000000074331506652756400201350ustar00rootroot00000000000000][s~ϯUUIk;$lđcן̌zFmB)1FLO߾Ogg\>V%۝x>~.?/߾|ѷnWcY w1'x^8nI},ç> &t7 ɳC=Yy3w.R K2RJ1{lO2L׿vF> 9Y%sssuᓹ l fMfKʥ >|P#:%vΠsuŜ;cG!L,^넦\ؾA/ +VXC=u+`P`Dޖ's@5=x=g1"x2x/U? nQn~7lda"^ܐW۷-S%2OodQP6 2hؼU:E^4M\ıg1 SD6 V,`:?hJO썺%NJ(K3ѱlqsGm ql A.%G $Zf1>sQY1{ΔZ[;:p~|$A^tnoz+~fpB[G-k.Ixj' } (|+V@3*OB6ȧh .O ]F f u%*PyV$wL:! )&݃ڏ_ ֹ+݈7k d-109n$3_qIP4fGV5K[%a4ŭE FF_9LxII^U4$x]q(֓0ap9!4Ze?EBUoWAQ]0zG)|%cgnN=twNR` ː}ϻew{ύ]Dup_* QFŪO:WȑJȟO:WAQ6l;`"G+ۈg<2KU^}].`E}Xc~ M/8LkVìc*Nj0rj3#DM 6Z4QIXw7pZF氙58(nX=ܰrwYy#Dv˦μ:Fk`Cjdnqގ@ ڀ *+s&5 SϞ@i[q:PbFYΘ w m c+dBlv[8`{.v0 qF!^NeUx(ÍIatm i6tsx[n؞1&e;mM8ynvffQ֢15efSfӂMj5 6w0TC{j ڳG|6~7{]l]7M^Xe,z{Fl *v*Ce` (W 2)L1!ac{rE?E3l!htk O>,BU'j6'Cb_#LAZ]:Ş46t+\ FK'(hцs-,$drq C@D,oCDMJ;,Wp]ƈ=Gnf\4Z^5MfTnuh 930цɭF> JV5ȔG}WZT\Qw޴rO!ZGbYhG)C"%[$`|oSL p|\w #Zܵ@ЅԸZaD[.>W9k }_n^ (J+hUWˍ@'.WOgޣ]q jrWz$4g6RWms)ٚ8n.>*_nnP}~{42`MA7# 7W1pʤ6ev-xjGJ10r88m,UD0)8Wp'RfEP>B:۠\Ob:2f;^UK_CCk5"T3yjU4Yc!]լ#Qvn45^o4[,׷,ٷ8!k T|jmf˫|25NPVNjp+ 굗w~P">'Qo ^u:1bO=j,eĜGxsܦ5jXPy'Sk}6!&؝m~n'ǟ7?ȋh mژ}r׸ݭ{ 60X5D(1_MwlaǓtv7X׎dGSspszњ!s@j+ ?R~ */fb8'{Bn ٺKQRZ\H7bېX@\/x@ʀ;:z8|HOƓbp7,R{ѩb#xƜ>l%E뚟M3T(@m-{eٶ#BXj<ف+*f>Upn,2UAx1kṢˍ.8jh 6$^s= ]Ȏ.Xˢ'sHKz!]W2 Avx1Xo_jG=EHR+7.VrJ::'롈&[xbvW*eRBn ƥq)ihwg x% t+iW,E-J4kDpJ1㝬To*`L"Y0 Y(s2"&%SW8~O 6Dv!0 5cpRJ~8 8zLFfɿ^"AHI7ϕ5YfeZ<M6Xy\BZ: )^o[VP #.0/Qۺh_n4*I5ADvk='q#6nk4H%c@%2:lCK_ }/@2R̉E ͆yNâؓ d@TRU!{BPHT]C#C2S)\OS>7A5'[WeIÜ]˺kAn TqJP&I[L4BiNE4Dp2#3!Tɞ9hӈ=AIZW#,qn^0zjM \D"Q@:8%UQfZZ^R{"~?X+3R&T2e9T8kf`#ONbaDŜipv6O'ɵ,6"桼zX}cY!ǞB/t[ED9n'0x{%娔]4DsC%fRHB2TK?Ԉ2*0P1l}]Ph/Cef$۳,*`g݀Q̀W uGCmv/Jjz|a[y!6Z2ޤIq[Ro wr|#~Zc.[/h>AuuyAS%JY&JY&3}b$\S5 acdhy'$u ΂Aˈ0H:BTegr?Aϔ{d; +XT%&+79u.rKu" bZ]Ymt/Yu~Ȇaįt2w`**歌#v;D[yQðڛcaH[fw͋}J.h2w +oDAtZ凞<`x ֈ 07#sJA ؕ'KB!dgI.9nPʿqʭc0Ck!V6 ze +"5 ?hL)#N&YҞ'X/H8X߷::xַ*mۖw߶߲uf4a34[*<1XUs4J lz7 $ -Q-w<< cʼnŧ!lV2G057:֧ҭ37c=rMoeiQ >A699|aq:c{w c88ue:_ju;7>L&;Ej ]4.jq^]Ymmja;|ҭ^Zs#NH`ˌd; 㭄#e ޷Ey՞I ZԵy=ֵp{=ֵ0}=ֵ~=ֵjzXgPfЫ?Ƙx1 O#$\TYnиթ`8 |T= 2[n(n7w4Օf2Wv|}hB?t ԋF^HIKaRw$nYY>E08 )hxMS'npWc}&ӛn .&֧Y@:};wO54U>i$!f0{^b`u6$'sn-.sy“d j\Pm;_~vDRZ1%k]y6Y#K\bYʈӯAY,-5m^47]{z؁po>Oo,0XIJU|PdhCvE:} y)W:M'|r1V@{論 x auI lLj2 R)֐d$c8Qjz*bj+ԑbm^o-6~ 5SfjUeެek|smsaoXv (p墺k19\(yUsw=4b lb99Ue Զ}4r^Xx\p: ϡuȰX : v=h{=]xz}l:lόG oU[|s8,†)ly\$HbrIo>v[֘A&AG^4<,.n:`(fr,@D$[؁c(W˔+Ӯ*M5\^r+hVa箊VUX ƚ+TQf<bcGƚ+MQyLpCq 1 c|/1kc kS8=VLʠ񓣹n f1k#8RH4>Cp6$ ߆}Fp6` 0P (N06Ժ2@F%MA' AXB֧ SA֣LQAX*;zcÜYAXbhea20ZA VF 0RC!TA 0ʆ`#1¨ApWa24K.0ZA ʍEF+#*shea20jABU= a20RC!TF*c#1QKʘF->0JbѦ',1Qg 8/k-1Q e YTΒ2>eI a3!g¼~6E>c6Tl0Rar|p k56u۠AXצn1Hm4ֶ@E˱?8?ǘ֪iU9ڠn+1+1+aAlb5,O70`_DaXruca^14OHm,O9o`6VXXac:6ֱgCh[a kXA˭vb+aI2Nl2 KucyV{h_R ,hcb`1MkcX#6g=l@mNc= kTAbq@wl1-ǰFN o:043@֍hm; MucX1hm kyu$ F6fhm+n+aڶ`KfQ,6FjcC̮u\>chƀk65Z& Z 4o@ (yZƮ9hހ_sм9m k65Zlyʻwмms6pAt1ژ]mΡ77 Fм]7VX* mbR5iSѷ`{(hm7 ;Xޠ͓u[=pAm.D:Xbo%ms'y m7 W(7mΡNy6Pԝggv3wcZ qx.xT8J) d0<{^›nt1eӜ(Hÿ>'{]c) &lW͖5o',^Ekdݙ)^^Y\2w=,:%^k`@yɿR]PH$HU2ٳ ʢ5$]@8m;Ffj_~ z rY( /,, &3f{239k|1} 9*\&B1VJ]=0Me Ŕre@ ØHSO1^t(WixKTahsCX0|󀚣jÉ/#_qBxI2D\΢jAľ2`:e<`ªHU^ bysu6Q36 IHiK,;"Bboiok`kYHD6=6"A{ " JTv:t@@mUGf Neߝ{Y'6e]C*h Ui/ﴶ,_L[QG8{do<ԗSʛ9%,1\ Lbuzcsz$a+XۈUM)K a]J◃S d2Re:t+豁 o2&v8kD[x`lG?5Gm%ЀWJ^eR툜~YWЄ:o;>e&uYՇ&l7ub3e;4Uflhz]LBOcnH޸9ջPJ7l#m?WHeHۑk+9i;'߁ݚpɤwӬw<Դa_gO`cSeg cq]",  YCoj2S݇Ig&I?- ^H$G'LI?߯ehѥ]]»_ICEI?~K#=ohdcE7{(?C%O-Ptwe7ɔrєDhWdx~5Y ^OoO9Jn~6q\'/?T,,[T~n8Q+~S q?l{ĺ_yoshimi-2.3.5.1/banks/Dual/0008-Organ Choir Pad2.xiz000066400000000000000000000047541506652756400213410ustar00rootroot00000000000000\]s6_ f;4)R 7EpؼɆaْ|d!Ͷ\9:::#ӏ/K̂񽫲C\b̷0}lnדn鏍ױzM# e?%>.~pU_ 3Z"PtOnã.1!S7X GRBΘ[K*Ao8LoE2}%*wnn-:d6HM5|r?O|1qް0f]3ΨsםtGxn!㒾c;>E0\i5S!/ND-Cbq0 K 62G40 VMԶc-?ΌK.WdpLX78P u0xG^Nf>Ub,uwy%hQHsEچPHͽ.qrKV? TX3MuAHҽ+96ṬSW ԉ JV :2X⽎GM:K"UVe$dM"_{sj#U4\O%]Q52~L~Fa Q0F"JvP]lJ=cGEvZJD ;MG^y픆h.oH@`K2k(C\rxo]{LJO'w%mc!Z! jC}ycx!KZ[fבbȂA*,h=gFiO.2bJȸ Hv1-h;)w9B&*H'p8(~u'eu"yu" gF]AM BRIH <*Z0b\rp}/sF;R. r$3SL*O/tsG%D'&s'NmdlJ1-C.)JӅQ`}Vu U\d#oړmA`(.,5MYTZu:y+yy[_z(fʼg~6cJ=[QK8-+IUuAgp-z85rߊ:F/w"@؆A} N6)QQBNdt$RqK~}'C8KFړ$@~ eXi[8 dB'7Ͼ ;{$wQmE_Bw#;."7BW\쟙ϜhC@FZ7=a\A3^+4 Q=)Q,`IsWt)l+-ֽ*ԭ?yHB䊜&uQGZe-J]C3c6 TWr++ x-b˾k^ݨ?7Fh}MsAtV *FCˏ|xҗb^6뗵&甜V?4kvͪZ3".U_꽚ըPn.*8_ "b[q2p\t_+ԸCK {uNʛ^kH9= +f-|Np{cyMICwL)OYP!⯂YdYiY4;Ci;KWO&R" oN9tdFL2촌hgD\^7#Jfw$VѬUABlXV Iє%sCF̚ЭtmZݝш=AA62(h 7'NF OFu.5:fHC82NL6IVRz"~޴D v6iT֜JVaXu83 ßR8g-)[O" FXs͢ӣ3Dsw 7qyׅ#& !2\y1*:in@V9"ngtJ bthˆkqA3Fa;'1q;1˽`e:ʛCg/%``6>^9~qտG'~m!Ӽ e3췅*cdq]/Vִ` + U ˫o5 ;ߌ9yu /ȟL94 &a3_Y?FC K.ui0Dǣ@;L@I%x0 Fu^!&3 FFpG|>v|(C'WWD=_{/,i+ R7 LƂq\=:a:}~3\/8vdoGYs's?8u''%{=ďv8kד~tmvc/gO'Qw?Q̞Уz-#Z~mX &J\\^uGoag5Ϟz<|kFmϖZSr=K|57m71'k:"X:H!Fyh-H`^9`J_ Cx")0}x]@=# Oǀ58$?$^ti v*1S ]^n,{>pc!q&Y]h=VD0Â9ajX;L*:*gGਅ=k9tB{jenl=0;jz( +> Uo1[; vĴTVMSU p%y'QiR;C;iT"]gZя 빣tœl;x{T L'T:j=L']W'ݑ|j+] O* )P%m$ENt*B TF;'vDD\g#V蹉UH{D8>('?xDNПNCBܳY6-ŭ x s^$qEN]ꈱ[4船L7w^׃c k!_ MsCM ;&{sJX^9-c qSpn72G;髒w9iʿgR?AQ–S!ݫʧTh3e#i?+|s~9 KVaS-wDVRIIH24O|$?0VrCk [o_Ny~CV䉭e؋6ޣB)|Wb߭4tȮL{{u=!+` eԧ y#k1v=5291Q aԡZ! (^gA,{ քF=Ŝ`dgcabPG?ןs6cvfDc"Ǒ$CC[hK$oəVR vqVybD^j_1u ;>بE3pڻ~1D _qDѯ:&YLYP0)8x=l%Z>ۚ%խ iԥ]K0KX풜yգ$!nfoXhaUc9(:$W7uJW-U˱6=\=ɒaqBt՞79` r_tbZW<UnDϵ&O]Q0% lem$_\ґZ='eMa( hls t`NSBq 9dbw}a"9&-Ӧpʼo}wX;nht$;VplOYN+/,Wn @O Krw?ؠY3۷fm)S~dJs⧌!t`H<` 4𽑕L(M?oq?xD\D0ͶǸM˒X1)1OF5PcdM (dJT~Ik Itv~J:! syJ *%M)#;v@ kD';7MO9N})%a0G.SlkfԲyuAEE@ IeEk6y(멊eqe DN<-QXNEQ{3'c0\|?Ol~*4sߋy?e)j PlMhV sb'v,AHJQg!yWFQB.mR{`"G5K㈳{Tqam${lqf;*Klcff<]If!PAwJQ8 8r)qBّHSoojp\ݞ_jF氙ڏ+,c/)< i;ZSM$v&R|KыE)F~v\sxxOyBV,*tSs-GawH|+D@ͳ4/r& @rK3Ye[/\FEJس6I1ZɞC+awK\Ͳ6Io.'$t{,c|0% \ËS-+(Fjo^IO\'2%T>ô3UHf![$u=~!NXX;R<_/؄{)ř#D.l=,8F)*<_wqdfpY[c6F\<٬^vT6'f 2Zd(nTi9QEEi(ttљryLrdl}!N q@[ q4|+B;(yyuzѿ~]zV[U\󜒼.mIR>@54j|(2]VkTn"$wS>fקvؼpk ^8Chmv,|C(PQ/+T$)`m5DT%*r%*8'D %*CZ *y, zF[Y- ah*)B _"T:Ga/biM!5}ە;Sot(o|ݙIu,ZU @.^VLVgȓpXR9«VhH!; [f`.xRH 0AŢa$w/Rv?.L \eUTM(8 J k%je g60y8%09fk <ҳO(pX=Tla$%Xn ZdC^ sxq؇&5W!v\ Pp4a K4f[B{-y1p)Zx%=hqfxJKDM$Z r4{BXX K_,-ta:7{VpBƱ~pɬ-5&: IE8\A M.Z%8T ^Ėp>GhqS?Z-4:- \0^ד\6hj<.Y+A~tJp!axf4opWt?a[)Qx F !{7 QW nsrEڗ4vǬ4/` w+pLJ@vmiSx6Ǧ6(+:qhhe`k$ v^y?]9(Q&"AN`dnvYw]U_^K.]kU ŖPwV̐-[-yCmo)JWV\ ȍLgD}N 5mT5|M܏[D,д!Peʆ]6z-;ܹz]s^X:V`]LֆgpC;ܑ=Y9S NHJV<)V-9ЅC<;3ƺ/\jW?E5tR@r5|"r7SLHQE,倴VyMlR+igқERy*kr_GJtv5+ЇFo4^Ouqg#ި|c),x9-b|{v9Zk.IGq ߷''S=4CGM868Wvr}2/yß2XI_Vj%( ~z c1T,}JAÙP@|hh^Aiy>_h&x:TgӛOm1b`\>\?&0=z69ZLϒ%дBV `;ng{9SgBM:(dbf$MsCyjGQ4gTE}w Ќ4hd3sF%|*?RetK wPo 4O@7~%7e}ʏA5ӉquM@KQ WX}(x,AGA.ͳGJeCbXdeO> y*7(Z6wfU*sijGpR H8aLZ[򗚿v*2'lLN6+y L_^MvC2! "w8ƔamR P:m,:QzuT Դ9.8ؐtܞ\lH2q']k~aH}XtOo*k̵mL?o7MI˾ ^WZ0V k+Th:g۷`0;u;TpiW:WTK}Wv8ev5,W(H֚},QpPASΒ8q#Va[-]*Ms>*_&&nfX,3R, iZ*^wjz鳫(egѩ((|4Oe@EA9R~)(qVUP5'4?7=}3_''W#RWOi۠N4i9\C;m(}pdCFzeQtdeoTOov Ar0g`EgNTL%hmߧmT g|X')MNGo*"LuM^]Bl_]=iV"c$ٔ?XbyWUr:kAc(ߕjS=+ڱ(τE^ôL`X &C<-΂VjkbaA< +x˳m%ŷɗ46+H/oDEE/:_thQ0Ƅs(HX!*6esTHYW,.cUOApE""e\HYW,b0)EpU>b)'LrHYWΌ}FpE"``!>) t`ûEE #x3/Zlě1(F c{(F cgC)!R= a00RC={Ha apC)Ey6[ǔc&==!Jh~3IQO>*RJcy,<ژ]O)>fS<@Q̆-y  ߫uOa{5Ca!07j!Qjh lD!̖>OGlb,YX$-ehi,@Jcy-҈@s k4VFKcX#høa1Q.f {BkX1ߍaưFK5/4Cb2 gP;Ȥ| STSޜ \٘ 1JA(Œ mỿ qkX\,%Ļ?h.رD5kzUQbem$Zp]4@TC鞣jD58d̃Q"al,F #H HsGc0#69 !&GZAAvaK%)3-%q1vң$Z⻱3.ưYb)ipƏ;4gǓ aMq?q!‹Fs?]`~?vӧ4W1_ueO۩Gѡ}`pQTmNaaq#@~7+C'#i/.gnj>9i6"; .U-I?tO ]elkW c=_%ż&V(ap֦#[0ԴNYݩlH%x#_YS0F3Qa'?ݩƽq@X: ĻwnْfpSGZ T#/guI9xY ERI\M[ pݸjW`1谮D?V O)k,znzno[s=sSr7M(YM&m^=}-o.rtmݞ39.[%f~z~2~庘ߦo_0wEoUo})7v7Adܬߦިp@m6߆_iYWۤWZM(ꁿ5 @;y#oYo;4{RO|taw?oo~(~ۚWboRmo օn$ˡx:I뷽oxN5۟Yqۭ ;Iwcwbwh8j$O^I*CdWm۬f6_ͷ|d(ōpueϷUmp$2cӁ8ZlϷϷ\ x~:fޠ;#mc:,@!}:IvNyt̰b$\l;;CxnznsJf f޷,6f3n6Rj^M^gCyLR+T)N9!~)7t\ڠT6hДJJIQ kn'ֿٙ1ύSiq.ӝ7j|=苦]SU073%Mon?]L?nV4h5re/Iek;cdYʷSt 2Vi M@#c?@fg~xpVqsuˀeڲ}$$eXmTSyOJ1Z.Y=i0ÕBu`YlNʶ&X|VHxOP-7"\GlvO҄s|X' b`Gגu6_%q>KIaHDޕ6jRPEZ Wy-8UϫSc[ńȿ <J=UL MwE]k%F:iܟ^VJɮ3A=i7 |F]b ߞWY4@V%BLktCYVƦ<DsIGM]?\: ?a ,LeXnW[iÌxnf. vy4D_'ɱ#GWTmw0 w@G~Wm~+!M8ߧ2P_V&l% 7GFK wRM]fAx7m2u޴d!Z9VYe/ki{,ǖ0_ -FVEmI<6taV@$}VYҧg~0h }}0-U XI :!L:w7uBrV"rh%,A]I[x#K @*\8Sa=TQ`-0=SK*bjmO:Și?2Cg3uM-3m͟2ߋ&jxNܥc[S=PإdYk:]J@K5oMUTTd s*u?3`9d՜e3i"9:סaYfv<#`0$ Ա}telR!G%׻;ehhNzD5ERё\?E){jFzR mVOxf'!|ДdvS(mO`#TV:5$X?H*B~PAYZD 8Y)m Xc4bҰOn|t7ظdFl*} Qq#K?DrCfI l'E ML)?9=Yqp*Q5&L1b:c^ bI`~uǛZ̖[6luC*h._vGkG +}RO^Vģ.DsݧJdXGWH5KŁlA@(vgG#9 H_½٥qFp?\ 3Q a^)^!۫ȧ|pgy#ILݛ..d >@HDc/^&L]QHm)(EԬ@[rga)t&]@dBp&'gY +1ߣJ)õbWbVE:d9& clrlR6-Ws"e3*ߚ@IG4ZVhsJeuXֲ kÑqkZ(|э7XA|7Dv7!Ewaj YfAXaWlb fxٖ$"l/dSLF s"󵧐Zk :ZJn:aNduM|"zT!@Qb}}~^tz9=Xs">vLGi嵎 G%vz*Vl& N ǎ fV0pXeEO5 ,pq8`:(p[Pb?,o EEE$-".a,o>Pz@-.+9 9GށF ]x6 ZTzl ՄCePִzuNKaY^R94z\#w>z6@dk| /u[鑬ɬ:m([mLBE|Zkɹm5ȃjʩRiU0ۦ5>/6JuGy_ f$7p{ hˊREc=)Z"a!W6H'<HГ֚TԵ;>I 2Iʫ OZ(}yv'G=*8A`3;ʊC< 0Sp6('͖mZ*TjUB*BPz.!`RDQOв'=QOF:a)עZmAـs;*2 S֚Lzczrb'IrNPԓ.'V܂U-ҊT1U{žH#QžDP)Jؓx&&@‰}QOazwmKm׻/jD' YD'5dOښ$ 됸'{r҉HHeGx7TÞxD̀&Xvf."0y4C¤U=UVz^bWzhYaSo011]z\ݬP\zyƑb3(ҨF^gF4ꓫ%By2o"Q9"SPF?bUEN Xwf{PH={[:T<^Gx7ҨF4myҨef(s7U5Toyoshimi-2.3.5.1/banks/Dual/0065-Dream of the Saw.xiz000066400000000000000000000053401506652756400213630ustar00rootroot00000000000000r8=CLUbRCm S}Q) %-Gq.=)?uKs_6֣F^_-׷ڷ˃~/>bzg_1ߊ6 zodtD+od@54 }7[t V;Bjtv=\kKCrO7Y{xq=$tg7j:z~7ҥ;*^ #r3 Gl͑'0XZ|_ /v7ٺ!(J_#x˥kK{부E >o8 #W~Gʹw|v_X@wt=*R0`A:=Q;fkwV` 5LK BdC[/7DI#fDѸiG&kZ PKBm~ 1b"<dI%6(lhr~g7N|[p # U KU77Pȯ BUg>BtReJJok쓖a}ޠw$ 8}:9Y6O>I;qS(tz"K;Kt9:!r*tO4vĬ7 |[!\|'0X.#WD68yC,.)on.Re8P!áDPM 3,qyz8<ɜMȢآsbD\UC;ͧ\s,!2ґs:>TEދLV/(I@dQe2%(݇4Ej+ZvTރ*:;I~i(AEI׸@bc5z<%Bp =q,7`e*),g]O'sV6 vP(2ޘwYKީ Gq$U jETZOVCd:+'Б,Qkd 2 s.RuOW2 "scu#H%2Y] siRi2g-(厁 ]0%Loe˓MPrC ꑖ71Kc<jb S61C8o&ŠPmt%UmKB&K"^/i >A}Nge7A}i>IkMP'&QN4z9QM|N9j md,OtO<8O^zuΞTU--݂)WnIS`Pz܊z]1JnfSh aPf.o7ef>[ dc3;K;UBC vGZhydu'A:i"bRA>; ؛p^Ɂ0ñe"/K-N℧+!yϊ;(UȅoS'4֔Cr㤟|'5z|6l >]{vJe9PYa$Z&@pF!VBWiGTA,"?fwE {G.|de;ZqY)DhW0룾2pSQXJ>ǷMt-B3;__5ȻPM]P3/noi'Y~'ՇD @de"rLwAQ-fq?ȳfaVАrͬ_ꤛ(\T5/]Ľ@aVݍ^U}NճC tr]nx+3ӓW -Og U߬ugkE-]fZoZzKj-=x}.#}`[﨏yW_RQ#wTI t`qUc;/$CqQJ;8SJe~K+dXr'?L/|8A ]yoshimi-2.3.5.1/banks/Fantasy/000077500000000000000000000000001506652756400160645ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Fantasy/.bankdir000066400000000000000000000000061506652756400174730ustar00rootroot000000000000002.3.0 yoshimi-2.3.5.1/banks/Fantasy/0001-Emptyness1.xiz000066400000000000000000000043361506652756400212540ustar00rootroot00000000000000[s8>,1&SK]9 [7E%lG&_-$e3/;c[VO~=t^X9w5~vg=v6QO>n9|~4;:z^'?/lSw/ǿ d&{yA#vVL_uir~G{u. ~2CEqgJzDbKU/fd3_._ ;^'IlИzdQ_4Ԟ%~D=U_&kŠXq].+~qb̍HBxQ&.Zl1&v;fIk tKP0?x"Ր: +=/cυf`.6q`̹aYw?n"c/Jy[Sr[F 8R݋v";PHf|CB>?[׷8QmЂPU7CDZo<*a<=Hs q+R$dH x ;&ʃTTI"$ȽR#U JRK@BX2*L盧Zx%Ee@="T@H=wFR6rNձ}Iv"xA)G&d1.p=b范ijyϒ5t#AXlIN \v'ic̜us'l\q7~hۅT^ OpLH \c٥v~h1h$\=8 R/nfbKk:Wj$AxT-' xbSkV2 OtMJJ Qod\++:]Wti=S|O/, S\_ BFċ ?Kcr5H\us\bN`/,3OrףnppDO)J Gvmvoa)`^ x"& .$L$ʳ's1\?,N>P|^^lWl+}a$S q6wsG&6\N>#MiCb>76'z uK,KĚ%YeMT/<7؉EЫdQSCmxI'@Ӓ,P)Yݷh: kNV|_$O#W1 A WLt[ O߄ȏ+%d˿sL9UͲ%67)"2c.F^<<69p^alp9+@!/2oZPd]wQOzi%ʑp=t^` x#73e9~߼w曘d{n^ɯJ-xʗ4Dv[`;ѭVNt+n'Ϸ=jNDO4XO?{k8cui\_Sg8寅5t-S i k?KU42yoshimi-2.3.5.1/banks/Fantasy/0002-Emptyness2.xiz000066400000000000000000000043231506652756400212520ustar00rootroot00000000000000[s8>,1&SK]9 [7E%lG&_-$e3/;k[VO|=t^X9w5~vg=v6QO>n9|~4;:z^'?/lSw/ǿ d&{yA#vVL_uir~G{u. ~2CEqgJzDbKU/fd3_.:umwrwxO٠1=$ȢnOh=_K8щ.{ZL&y&\s]J\v|A\I\V"ĉ8L\恵٢cLv̒`~D>!u@W:zjۙ_|+ aS\ls~2 >E*]mOu[m)cJu/r)C"C! l]kZdVGюJ5^j{B BU2ߘǾ^򠪄 1HƭHqX!)\/XP+R9$S%gؗ"#JT(+I.Eb+ aYDX+ 3yxoj?@ cHP!lJY9Wǎ%5TA ; >6i"02u S"0pMdlpѺ x .`XCK-.!^{.Lqs}u$, -/N+ x7.1լo #q~q%V:#aL3<']&>Y$+-۵فOL${1$$dF/3郒(V?s]l861B<˧aHkz13wzt?z3p<`guh=Hѳ q|(ڂ+fQ0DDA.Páa䡒jvygLc`A= oq0_^ jjN+Ey QٚJcј=aCdQHFtD"xZ(F6$U "v);g8׽;G̶щK7(эMeT4y.}2&**j&o'+PVz,R}Y"dߖپ[GN9 "];s%QI>^!6"r9 i,N* I-Zz\Pg!5 ŨQR LL=Kߎ+'A4>b# \ ď,G4.4;$Y*FsQNa'5UiN=4Ҷ$rPɏntd_Nyd>:al3d|bWia4h邃/'c7뺕8fsv|P|W(M>g/kR6R6i08G9щ#TM.A'p4!1fPL٥yOP֥Hyb͒,𿲦*DOUbs¨ޡ6 bfӒ,P׸BaV=FGcf3:Y=,)P=M|\^$wWX+Veek-OBBqNM8=~?0a=s#xǐ4CLc+U9 OGẌ\\)zChk+]zsR]P=?wRޜW)]dҮWFϢvs!2  jk4|*ӝjQxP>ui\_Sg8寅5t-S i [w%2yoshimi-2.3.5.1/banks/Fantasy/0003-Space Synth.xiz000066400000000000000000000053741506652756400213320ustar00rootroot00000000000000]s8-{鎓سk\lEHt-$9M(Q&)P4{iG}i+$ ȏ>o7'7_lqjz6l]-.W_n&?_,?-)lK_\}6?Hd=sڤ#qC/~nݳh&GèqI6@zl@b×dNͧjv$}Ȗ7WW=Z:@1 ^]h=_ |3 T.ˉu3_OVe25qK|0N?L+~u#ˍ6v4\/zB%$ԖꦀA 9|i@ g|,}2 ;́Nx#]A pehVW\Us!JeL VtPp2ɥN@鰬X' X}eb yrLNx~fkʟbv9^T)9g!Bo.t/Y|JQ 9tظQƙ?"QGڮ&aRxM/@p8Y)/aQ,'ġ_v$8 0{VU-ϊ;xlCI6R}9;)`.(GBv!H0Dvc.cIB5<8^옵2U"zU" 'jDv`xCHZGH2\PE NBٌZEZz2X>)=LZi,0K@ bSY2lB|^EZAX"$VZΡ"a nt8q ^/K;v2TEޜY-EZFl˻73Ljw}9tN(ףr^1t$g{82aE\'1g'K]J}adIy|vD.82漢 ӝ2.U7'NvP;6]aáD\~Ψ ~A>1ZIr 8Q%1Ԇ~c8.^ɤ?o88hh$+vh2O4W! 9K?A4:I k i:w~pr8蠨g 'mXe#d9 qbg Dfe5m:D2w*x2IJ uy'e:$SZfdO[t]Tuǂ;w".^n YS|Z/NekcpWqgr5/˯VWGM*:^+&^d;=v"zzyD|`dlʎLlj'h_4=cj'}Lġ+ɠ)TjCWjCWjCWjCSGo74o((#4ot<%}Lk EՑH/nkKB&W<_@w-v_pLgϝc-^+ZUwN^⥆/B*| L_+CF̹glāTD ޵^˹ "A_&8i*c}GTb3S"}e/|H?%%Tyoshimi-2.3.5.1/banks/Fantasy/0004-Weird Pad.xiz000066400000000000000000000030121506652756400207340ustar00rootroot00000000000000Ys6~=%Ir34 mH|%j.KdɆNȻqڐ$ uܟO> Br<'WO7?sK{A0[/8$̝Kn#WB:T%^N}ބ&x9YEK(I=i rR-;uh0>Z-ZfhV)sZmSx"%Uzk2қyhқ7{sc0,ewҽ(U S" i%PXZMA g-(c_Ոs MA _R/OY iA_.',MXjY׍ A4{0+#w-e<_˄D(@aj|mն?=Q7޽.wxǶ+o Kgm"kw;359k06L5^#8yΟ`R FB`^Gs"@g&VBuӀ0in\{dƠ#&0&݆D-<)2<7a<L۰x|(Ւˤk(P@N(KH+GrT&D!%@`2,@#]կgҠ=(kY2=Vp4OQ;a@TŦKڦJOQL1=f*6/<6nVjmS,ZSV5ygcdC@M" ^ߠ@%]5NȖ˔d$[SYWr ')AI#E,'1JPJNӽҰί|iLtq.]c-`TZm)ɘL e; {#U5 ׈Z^jyaI֐` "jYZCw,ɝ`Q3 NDڶ%.0jǺ >k4WQK>1AN5_-? gj46Ut-dC}f9"nU9<@}6֍yLC5A8iA<`Z#>?Dx/gxg"|V8GH%~@MVJUo`/zXq2qo Q92Rf_78U;~Jpe`ʍS+m?NnT=bS@ZD鉧:{YJViɢQTl۲5$ Cϛow䑄⣬%+v]<Y 7"=%K7!> jWd?ʈ x5''ZF7[kkap6V$rnpQ ȒׇS;z0kX'k L=B-PuFPy89Wh6C9.ɣ=߁G LOJ_?hXi)Fϩ+  @zy@[:zy"?';oO뛋d w@aKkSFJTN lEcB+yZQڠ L6.MWc[h AFFaωDkAvqƳEb]CҢTmN> gW/|Y%'$$\4fd1~%ge2 )ODM|<95C ŏZYBB+ D$% /2'{}NEz]?yr`ctHo:N[d#ց{\N.tע uX=aN3]WB&/FXz5cgv'1!&E&4 ,&zS3#zNDBBM(?Ȇdelu<#!oCTDrO*5FZACh|c?iiKQy)VX_``[M ,}$nܖc̶v*Iugu/sZ4qy(⎤dZZ$jkDK)U |ĵP$yZ"S*9@ήGMN:&@hU UuC)PZu)$` [)J;Z` L5Y)We;c#;X)Ja~VJ{Y)#xHٝnݕCLFӷ^ >2RVvc#BEePRE6 l|D]"[I.F?*tLe3tIB¨Ķ+e(1-&@~ C( %&5Dy ;.cℱWO3_n%t5L;c(_fp9 @ F/ gd|x9l$w[[9B 6. ) {TZ@z DԂ Q?v,5Zh[Ͷ٫eU)f8/5dn 叁m}reQVyn깨/2oLoʩrnu{&h&fg aQ:iuQ:8E+\֮(qc4)̧UXAQi(/t&Q [9=7l@W0 o u8Sv '!@[-vr>hQ_E\uZRyG횸Z7}fԎKGXv#.f ap>8mwmDSEIϪDX_E큓TeU.Ǟ]%PEu**jǵxeUUν⟾Lv;*^Lw~gVvMEUކMH~U᷶ 骐N>eY 頮L5OW!q+T{OZ8ƉXӉ5SN}vTyqTyOGUsӜUWV9Ej.QEwՕ6;cwv@X>y]zxEMҝțKѝ].urvKwz/-]ƽzNu=xyhBZ+: F'3vSz(KoBI˶#*_1|z*כq@>]`*Aś+|;0mWDngg7Xg~ͣ]f5 ,ܾfKӮr׵l*W'~p,,u# X+'zeJBwSKkhŧp<^s:q-J;\iW6^mVKbW6?͑uck&M*j[__i_ Uqhyoshimi-2.3.5.1/banks/Fantasy/0008-Space Voice1.xiz000066400000000000000000000067331506652756400213600ustar00rootroot00000000000000]w_wW}GSrҦ/ Ȧ@c̲H4.7_3ۙafxfyw]~NݻǛӣioբS0w#Nl[|W]_7C.'?_رcw.~se7G9| ZD'c{ KOxlCgDхŞ]^^o./_[;np ;?9Ş ;ɋ^~EBR⫹l蜸'.ra]ͯ狛2qc?Z-)EbZX~mbkEIx),onl X҃ȧt ~ ]7;w#=|Tg˛狋n urk;^xʔuW 74c*yzRV+˗ivFʞ#\ۄ.{R"̉8^mxqМP\uv8.QR,^`߮e!9`Jj%܂sT>/aNʲ{k%!'T$fUZ~)'?N c~~Ij?k ҷXې)Q 7A1>dJwlt @3Zԃ?yctHom]8d"owso\y n,qN'2Thce RlEn]+*<2xN.ch#&C}&h)0&rYV=;fZu30ϯ\e !gt-PA})]2zRF? <[d1E=o3r?ǟL:KvӪ1Cv{V 0e4"o\ [m(.JPj8ZD0U*wጀR0D*a(|f?ր9c> FSs<`!2F|9-J!URe*UU6,Tr+\H9б.#17j3ZZBIhtZ F/F7}mfҌ֦THASm zM]RBϴ *o_ ůlLGϩF_"hkՔZhzQ4C_7u*g*Dk4gV6FeE JPꄆF8',qӳboЈBg}<GJ$,R/|4gE=t 1hyqV;N 8^hʤn_%EpEzJȉơW;N ͯ˯<=\+x:_;@aq?Fv;@.+y;-f^)-˔m>)((?^ΜBbyy1[(tyv8v`.c(V ,BZQ]{ %s2G *#4L:?,ېx*nw`O%v4GRSe~ӼSWl09ONsJFi%_>s]nO8r~[+yoshimi-2.3.5.1/banks/Fantasy/0009-Space Voice2.xiz000066400000000000000000000072511506652756400213560ustar00rootroot00000000000000]w_wW}GƲ%}`lZ t9v̲ uF~vf}nzmnekrɸwsvy~v<ܝvb ͝?.QD>. 'c@=iY"?z:2px/|\]\+,L˽[_V O\ckofQЭ 6]i2x㑥4~GCE,."dh ςM Xb]n+ 3!d`r鳬h(;ZF1_^Ͱm|)}.p"Iy M$ `M|L ̮j6-÷P-:k o0ҧGaӨ6~~FGYKw\ w>tCa? {#}gd۷TEh)4']jP۞u'YOs]c-ϱ7xCcn55dN8;L 3PG<*eoMx.@ʵ熠 $wRfep7mNgb5&HVמ= v 7 rOvBPE0U*"‡ R~(=P jH >,)}0́CH p4vAIC q;&B[)g06 *{T& *R)&}r {ϧ؎@~pDB11WFMoueLm6M,']., fd?H'W{kA|*25Ea^侱lHfuIəfGMklmNYC:fcB*FՔu˺73mOJ]%Nx@萮ۡTmHҫlǒ^S Od+jA+ 6k &2q'g$ pdqv U>d#K]-her,h 3uMV@@OQ\e=PfzNBvV cTUV'ʲcJKhE.UA'3PථÏ3zߎRD $b/x8šY="2܂vVNQ;Da(m'˨4ͤl^9EExrЉ!,WN __9t_ixdW$2p$j$V {!ғhXl2Ѱ / M6M&DGy{Nj3n.Nz\L)O|7w\Og$ %?Niъ(ˠ0=fceYka!t|3 i%4m3'w!YC(h1$&JZ2¥ٰ&h0_dD N[x /X;4ILٕ͔&$T\a;Ӎyyo21d-\Σ2Yμ/$vyyQqqG%HSRn{ؚ\ވ:'WeEIqt{=tV )=O)/O)W7˒ b#r£|5EBUgJ6T*l P(d0~iY`HYeFJL~@Æ8M88~ K0-s:%{41{ "t9[|x`̀r1?7k9OvlѼo{hFoܡt;M󝆽' l+ ҃t7Yw7IDyRUߞRVjFEZUZP*-JKR,o_}ξZm |d)y6-b:.IScmzuU;9]t&pm%-](ɜVp7>Wg K ym5&Ew z2-҃eez3=;3'+ wU+0M|\]\&_+c] rU*踦)ek}\U^tv/lMǭQ<\iq̗WtV_EU*G4 wQ8.$qw`;;?B U|NrP9e %5`f!z غ3=݉$#KBի)ɾl_.:ra;MM0qSŎhWCc|⊂YxQ̯ _Zqů~ | C$lV:KNvo|^{< F@W4bR!ٝZpwۉew]yoshimi-2.3.5.1/banks/Fantasy/0010-Space Voice3.xiz000066400000000000000000000053171506652756400213500ustar00rootroot00000000000000\Ys8~ϯ=#Q$S-ר֖<] &!Ԓcϯ/l2[5O3@_wЇ__~F/vNzwq>^k'6`~oF۽6KNdcn-~ug0y{}A4O(qҺ}znDr>؊ /f\vDo~lO ّcL]k[L|>Tm}a\:A2;i3(Η:Y1M9*Ǭ]>Rဌ̉8m`xiA(O7ۖ >OBt`UlLUxT_U}'KP\E#U֨4>>Kz1Rw dB^DdDr/G Ƞv\gv~dWubK"H#m].n$}cJd%% [&*6=B z%xߣQ55}; #-J%:YO 0Ra C(-1(H,2+AGȮ6DYNqDHԹ!KqhIrE5WpVTfϰAVVRi!V<尃 ˺QRl\LyVc8/s;2 ,jF{8T +8,gӛAs'?6v2 „S 4Y;*4KŤVF\/AdojЇFI Ѱ? .;vhyM˰7K/ʽҿY1( D3D Q'>k(2I}.P,R.Avs ]#G|3 nn@pɦEnIC*A%oQin1MOMp49< '#* [1NʆqLDyD(V.$wrYkJo/ m,CԈԞ Iz?_j>ᚵ5R'zj\ybY@#v)CT۔ԑFʛMI47 ΝDqD'cjJ95N Ct*\GNCcޭ)DKF#ަ *ihܛ5%Uct):C-D D=VUrznԲ NQ\0QՔuXET04T@SMIhc^۹Bw{B[]cAJN#cB4!Q@t BAk[ XjЁelAƂYa.t0=)0Ͼ3۳ӯUz6;:7ZZJ[:6(=j)((mc:hsmŔvX$:FƤj+i|;G-1`u05%Um^1j!z薿:0X Chs)YF-UROͥ^-DK*ژ?i=C;6NQ?.1_ZHܗdBU"=,#޺+^ۜp!V]'nxM(A7:T) QͧɈOL|*(gTp)SU^h;^-~S^/5~w?xe؆\ /I.:Eo{!p>l 9𖯻vjÏ>  E8 Xi"`]$cu .EmuQI`]0`*ԝWjw' xJfnJ_|h?OFjW4aĀ<mi0oWUu~ˠH |7 {Y@Sj1bJR `ɂ.]i1Hsȵ!5Y.ebX`y=Ra ?Ku "1@Ȇ!|L,rEe!& P^#F0e8oЮFX롲X7qPe.PZ7%5%,F_I6t E\v.vD~xIRHZ̦鍬zk:U f}ɺb 9h!UEjRHN+anD~~MOFQYB60O*\lvm v9~ Ȑd0z|C!@ʖFdU j\G^ 3[ =U D&`H&"\c.cC`âg;K}qe:mL+UM,m鋭jF ( E}MǽJ_D#1 NgERG c@?DY6 IYxDh@PRo_->*X Tn̼]\w.UH8 ι9^ {Įbu.}DpiÆP^hEr_ƥEcm\sy‘bt` <o<8<՝WH.3KlZ)'%9Sm9jzl~oHYJrCVJhkޝQMQ"Jk'hFU43"hˈ5BSn$D!B`!:/(0! 65eDtbejH;5ǍpRGFR=蔯*@i^ u`>2Ij+!1u(Z﵄^0'uE z3XSE݉ћ`)/zCL|)6т,oS**R#EvSsEw%]mã.N{Т{C.Ot{S}}:өN5o$=&sŒtN;d`Lǣ83MѲ٘M;s5>v_D\BPܔ=r ]u"$;'F6;  W\D+,2a5c|h-ρpV-MvM?{_uן|?A*yoshimi-2.3.5.1/banks/Fantasy/0012-Space Choir2.xiz000066400000000000000000000037671506652756400213570ustar00rootroot00000000000000ZrH}W;X`s"Pkxk/S4%8&_=23ꑀTeX>}Ż/xfaUx{l0 lj>,Fgoq3^<ޛжrMc ʏrugWvS5uȅe^c#&;b<_e z9~&Il 0Qb zd>[RPѻ@Z`bpv7l:ߚ j4bD|9(;0(l 2@ /qcg:,AB`'.PUS eT?iE=+Nl&v,˳i( UE8-gq'qF]gdMU9"- 45 w,'](`;⥥:ǀ@7U\ϑsvB[Ū:v@ Crdd3#њnq )R,I-* !9@ū/$Qڲ ilu^N EYmo|%H}{ FbTRs&v%:!R$KҔkDvi6Pe 'AޱRË$ ߬,(Öuuk*ב;lp#Pm>RE;*Y5Xy5`y5`[ tj̜O'u|LUޒ׈Fe:1@J!GTBjfIp>5xI[>9g svXH%S~zl !.(*m!#M09pa!.h &@Iry 3YE.#WUNjI\&Vv#`,@>̐آ:~#@ɯ C~Mow\yfZ-mJ2 3{N}y!Nnxˊn{0ha bntFmGkFC0&.vW8% 2GRW_C%i܃̥G8V0ND&U̩Ͳ0(`N+K -2 R%j$ė1@b4+CIR+I;yuNDEIlj(=tUPb~[H;.1F%u BԆY=~G7G{:սөNu>>A)t0&qŒ4N+d)UU5G#zyoҿV7~oi~B$LR1zz #tf3/7w׳{kKa88$'+K/CWD4_9pMx1v ?G:x{$ڗB>)%'v 6Ӻ/{%PI_uwҀkm$hfw.,h[]-zoEa~stx/דP{ ,kYudʏrvG.Z{b{;#cc#4 mbF6<8w~]('8jx4+ÁG--'*$D-0,v4Ld ZYyK/ZpE+ 6 <֖g*w4`> fCr?t߉k[6G 7;"vDݐi@l/K=Y #BKjr2U")G"?! џTjyfl󶬪x6> :SLl, j_b)E4ue{wcuˇjъjKۉh-i_4-5s#]=':ڭ)TU$⭲bžp 0\m[8"ӜP\͇wmA. ÅV-U‡3|#P>}/E"_+k%]֨4,$B!.d8FR=$DoTb a!Un2]]m'iYuA/vαנHo-+}Vڂf0+ex& |Z*RmJj]V2fSRK L]45,嘦zH+k*|S{-5M2w*SXjjNK mnJjvՉaӶlxdH?Dܘҏ7],b* mipkJF*& {Bhe Za̰:FV tR"t_1(Pj Ou @znƻ=eR1(3,ZF++0VE++Pn4V@tBV;p;~ c2cS(F=PQ֕-uyEQߨ+`: CaZW}m'͢G%PVUJ*KIJ( J)0v0V8F+kVP>iԲС}h8'eZGJZhe%к̝he^G+S16u4DI0C[6$E,#+ ^ќm@;<Std&M'qOKv?")mK|X˧˧ľ} VOSMOq{Ulj4rծJo^n4/@vh]H)fq7<\} @0ܓ~]O[=j3⧌ݛg{2[/v-ܓEnpr׭_>ѝdD5h (>kz:ɈDGͧguwMOwk 1}-az_uW>4R0eVax5q.ó*r>8;)Q|?vD9~Ż `JE4r[H}TD5| ޢ2]_xfOg5o mvl ȿY{n픨H ]pV4R(vŏ[O6ne8+]>D8ds=c}ބK0!li\6‚6,ATT:gv=9;Za.^Dl.},ɺ8_|ee W NJZ%*[ PG;K0)Hem;LA .>ή?>\> {l9)B`n9%^dN_w!Z`Q]͸XH&5 B?Q.mv,,/}i%4]dNSݹM ']O8"vJ|<` [G4e=k@;mډ,ZkU<`=uԏ;^M =)c?̮m%SoAC52 =s{fI9ZZ>EAkkLtP/z>yKQ %#MTܜ{8#>"edSF6v(+x.4`cH8U {Ҝ'?j@#GIQ=4:5x72q{i|fHJ.kQvG/zlk>gQ|S@!c˜Ԭ~*ܑЩE ??zdcQ4ܨ;\x3 P5R*.JY6¯Dw e2H㸌ãbUل3 9Ц\46U}Zh^)C&Ϝl~r̉.!J]Tv]s6AJv%ŴNq6LyHl~^g#[;m="IČUsnq,27zOm=7G;acCx/FRe Q 2`:~PțDAcI8?ȿbA6 :[u~o>=UNs 0-8`AJuOc84 ޯp1Էʉ Is>D:R`ѹ`}(&Z %+C3_7XϔC%Q,TA85M(^H쏊U@AvIMT ta{AȉbX2+b/]QO|c/b/}%-hlR䥀z9|nfϲZ5z;`eM6fʹUD64|@ P==B,&rQ,PL$莠wvHr#83%IF_l#/W$gaCz_ RPJqPd%3ٝ Wo Li%ؙiuMbIg15)6G$̗ɆY#z<>T4:q<=^*{_tO)ɐғwRT:$WtSR;Nf6:)҇wJ ?߳O,CEOangcc1l`qBwlDǬ|P7%Tvk\*Kdi2M"횵7|K)l[V}&xR+ J87_)Ճ2/rfPrCeޫrY2YQ'} uP+FndEٙLljl_ߑ$y$cH idY4;b 0-S2ǵ}5_ cӟ7|M⫹]>|s{mLuWOϱg`A"iD=QDGuw:6g\wukSN`l}k36W[kuzrwU׮hlǍNmz0NgǓ\O^Y*$ہa76g؎x۵rv}dX˥5gmIx&jo.*?|xuTdz{w=O i|z=[Y}2Qu$tϲk>ׂ~ycՆ}@>77ʟN($/f6"/GB]',i6ൗ&6nX& ^|5ˌb9&,`7 > ęQۀp"cm= M_ LEmeͷ.%T0*5@B [J1&_vfY {hzח*Gw9d_jc:yav,5'm9n^t@kaxV Xrm(M$>kRGle9%Y˜9HFR у]Ǟz)ݰ+O `aKϲ<DM%B^aM |X&L-]on- ZYOeTvlǂL,]cA0rYy2E}>Miy騫}{Hkn_̉c[رo ױܖ{`](/qagD/5U2b&w0Rѕ4ѪkCu[JkpAAc+јjyDz-f'3 Y-\y݅2'R s NHrm8|_/JJ(5z WJ.c,6DXQs3Bi C[ D-mo0bH2_#c^{,h\|4nIOs\6f0%~xZQ+37 |qKlҸyc`x^q7 wLq޵yϼ E̋_|Sp mW&789Yr׏}#'j~X0xfϷ̛/2oGL 6_#cAhN6e_ Mwc͎f[׋;R?zJ9d#DŤ& 2Q =I8>yO>ud!: gg@]({+<+_9AfhBcdՐd{طUP@fY$U~Ra (`TA\VXnyTH # )WC1~!M.шq"x\Em:h'\s4LiҜd'x.gE'W(seywP-]'l6;쭼0j@JH\Q@?$0&x$0UwpT &y~^IԻ16jϱ0JJ2DL@^asPm F0)?hXZ;xRHX v7oF.AڛyRVNW˦JgF.= F٭%ui$-B×+*fL..91L{-"/dmy52f|,5ZYYPZ]X9|Pu8iAmBvMqHㅍ ' _ItUX:3"JdtQ& fC/{۽S*tPaa̶M71 h [DkZPOlC;ܙ%m n&0‰쮽]4R9.J9 r7X,$ ˳][TLYJ̍Xv7s.F  r|]l8= pί`˜J\>qxo|=!ơ|%*=s3 CF{KHRK4~bٱ2Z`*[3Gz0h:'^@ÞCE=ĞCIs"+{] *'|[TnCCt{.rqC*Gܑ)uoy=Y%WpЛND?7wKͿ[/0Qcj DՎw/fE28/F؄2x(/ED +$|^d~=/Og]qۀbyc:T~.KMufJ ͒tc3Q.lDž?yoshimi-2.3.5.1/banks/Fantasy/0035-ImpossibleDream3.xiz000066400000000000000000000067041506652756400223560ustar00rootroot00000000000000rF_B*)J$+ՑPBB R~s %~IL?^=:AާKux vOۛ38z9=nDZmES6>_vϭpa],"ѵKkj}=΀+i9attj`Q(+濤+v[l|38mՑgOd>{у vlX6S}j|6^]kM'sڮ ?E3KoۍL7r֡q(خpX Y.![&AC8-NOwM7Wgrnfr0e>? ݻ3 kNDZUy:]o'A[3;?ڷJ@|b`3$T'ّkjub fq< XBM+aXe9 gzs~Yb`4} b[x  r PSR7!rfj `"]~N_= l,1:Gd WQиA< { JNvx ~4WlKђ%y 6x8be2`? Z8Lux[1WǠ"y`5mMG(ެh˿L]>vV.d Xΰd-eF nF|)1?p"jW$m;֣i[V:HaGO‡n -HG2N/*^q; w.0zL.ePu+Ō70FZ"jF>an۝uF#,ƌ$F|H $3}_N/"Z[g/`&QyQ47hEe*Jɉ9 +r@ 갢 T屮dȘ3DcŒkw- S`d *c9JY;?{r{1z1Ȱh(E<:4$XhE. lV{^qH!!]M/h/v^)=8[ 2rSPDJj]jY6mbaEG.d @cV»`B6a$N8)[Bn#m`N-zX=|L?\%YKi$Vd[)L3/ 8+tR}Bj`c X^"]\οp`n][%f`HhDbkhʩFލh\MƁGu\[(LyȢE;f=:f`q}|,|,]l_$\re3pҏB&ݻ_S[h|^@ }AK8eɚ9P K a7@ܣ$f(l$%2WU#u:}0W12ng %drr28)&d!32Ww6ܥϛXؠ͹xU63}$D i%tf$Θ *3'wfrPSDGl {̂30dQ&g/ zadf-dKDd0Hx_Kјj|1;@o7Ykv@tcvx#fg\oP{&HI>udR7Β48W~\g SޱDbYJņW_M#JgSwk%M}w>^WCsFL.:]jZG f0M~:)9Ԉl|UrG\Dߍ6Y^zhlmL0M]VqM"1#M2sMx=!`i%_wPNv} *(nw騧UҤkeʒU*h"RDLJU-إijGfEg/\Tdr=Y# =ݓ(wQ(T=VݓTZVgz{RWȔX#S @"JLp:)8GҪeq藗`Ih4{'$~hgR$PM& {L~te20QQ;JHF}ja%שC?uW+E%UUC8<đ++ueYU,[kKgbUsɰ´uYCiϨ`<ᬅ,3iL~O3 ֈ4\~QēhVC2P͎OlkZƭA7^⩠RTӫ[Fhôh w^A}L_V~PT=0lJhWhuJTUrESQ\I_f"ڶwoR->1ac!6#Q)zY4#9@]7J#=}@Qj<Nq=lH}j\;w\ 8Gtoi+.iaXg׻K[CяKL,n_RX? дthZ$xØ Jfj 0^lCk6$tHj遝s8,k+i΋zӖU1M$SWIUq*q;N]oRשׂTvu-iޮkIHYQ;ޣv@zʇ)R; Ij{Ih.eg~fӛu/f#cz@ Y_KsoӯMs?7_͆|d1^~<#˺L2CTqkj}q\Ek~ |l,Vynoyu>&D I];cs]~[4tqy>Zs4\skn& }`[csvl0W I/Fح+ݸ]~y7M5c9| cJ/m#پAﷶ UX,x akC5 A9Mˊ'sVd!hi-b,us/y_y[2@+|lA # Y;D%kֳXK %d+69UJB#l7sM,#RkKI$gjC ;~L' @QYn l2BʡZyj4qm 3_Ho*ly=U9-GJ`gyJc2w7]ۂJqSJ<ɔcwB$P r$k.ƽVNh]?[\X־m͢8DM%LBhdaL: Sk_ٖ ǵa7;8pdXl#ʃ *;FtS *:U |A(\CFOiɱZ-)[gvɰo5cujW4l SPUzg*:PLNJ(l%YϯDc\3'vq½g'W =X ײ71d a!{rLG|}Lk}>gI[vwb(CVD]\{T IEZ2-dHeY#u|WsHwf?*TV_A;UURd|w oρ!]E.F:Duc%ߑ鶔Gބ@ J:|Z9|:;Iv9m 6 [/pA931ױL1cIiI b)H}s*XPET^6ױ9;Y+{'2OU2OUa˸h ezl?9 ').Qg-%"\"&Kj1ǒQ6vb|^=țGu@o.XJzFq /6 "r)saBPB6Υw  y! !"52$߆)6ݕ<GM!F?| /X9,%YoEHB.t[1Tc3+9N)yܙH14j-Ƴ3L[@L,DK'~`H ~c #+AځէuQ9jrrd% 9{"eQܙB4OO1G)#X2FU4D(l؆tPWۥ`́fyEO xutE.8Ő9S5:{F'D}ܰ|\<|D`ɻ.7z7NgOv#Jag.yTM#CIrE?v(λ(@3}$UtbxT"Bѩ.ίR]j Pi^+?Z.5y5BY#|v:7F(k̈́$BP /R)6ރC j)'Z_q(Y-bCQaYMգD$'CM?LuxMU뗽hA1[%ߔMf3CaP[L(BSGV]pUALȪ+IeժժNRjUHjFsGzQ a~~?H*'Ix/ ANCYHH+dOA^.5Sjr'iG [НDrRr[-Y \(GoJe27QCZ.сƗ(8I9Mi |GH2.i0YlUGcs2%_#f8į kϯ]d|Gi?&Ǣr!?R8?(8uG ATK"*[M/+m0$ /*L2 {er(J~g=.e{yoshimi-2.3.5.1/banks/Fantasy/0037-ImpossibleDream5.xiz000066400000000000000000000065051506652756400223610ustar00rootroot00000000000000][s۶~ϯѻ+$Ȳ4ߎ-wphJJR_$H\Yr}i+/.vo/fxOMvaKr܇Oͻd9,\Oc˺8ЄeJ;٘yd8.72w# fjO6ݺ<:$!OSߵ110H؈/&Lt~9/W[7=op͍9>; ^36;;Pz,:!n:NbC9ngcX?01:I턆ڛھA6 ,x aV+:AC9Mˊsd#i-TrA Lu|_gmnz[1Q:gߗކh P _6[mHtV::sDߒ|986 g@%KȖ>|hk&DbzpO6Hٮ K,&ɖpKe > 'Kya4}v-#8)*W+A_.!qimY3>/Δ[< H lM>O)L kyP)nJ}uu:qAdCx _ X'4* _ T6ys0>pSTЅr%Hƃ*?i7,x= ma 0}z~u=m[.lm !j*a2!&E6h,bMxZyҶ ^fxTu׆t&ña*24촟?hCfZD%ӰuOV1 v 9 b mx+4,47lIْxW ?s~g&81a >Z[Utn AICc+ј%m G,ٮp'%uCk>kksv2PDfXzn&)# rݠcϸyv3rEeI[vsbj#D]{=IEZ2-dHB+sOߓn;ҟQXt5]r߫*y)W|o >oρ!R򽞦 AÝ.F:6 .J Lt.=k-_^Z>h-:"QYnS]OxLY97P0LӉL1[+SreA)H}sw%U0o lfckoVt~b^T<7G@EC)Gf. 9Axri}#JYnD%L(܅nWˉ>BKo|2*`pt\'BaYND`R2dCxIȑOνo!cmV;m!|A aA"/}tr$>F\-x'z^t%Ym ɢn$ : ЌK;0yŝR߿l̀qL'geqW`|(6D&>t{YȈOI-[BT-8TwckG8 ې~$(%qR_Ml@+ ,EU7'Bd\eA.lޠ'y[8qg:MNGŞĞ I2C$|bޜz'Q1_rLi;-[͌IR8Sa{!&GR%wCt) Oarquvw>^\Q &Sʇ(D@K͐yZvŽ_v̵5저j;ށq@Y*lEN3gI'2TvI8Թ:K}%JGf)f˵$ վG 6Zоt+7ds` h0|ڨRKNrF.dۧ@*Dr>2y#]rLm5 :M򩦯oԑwI"ywU$y$7d}|ǷI:0Jׇ\HPN>:a&G=}/&])KTRDE=EInQ5źT9Zu"Ȭ$K*L'+drAC&vOIe]힄܉:X!k􊐪$#Cn ^{~j򘒠=c*X7Wڀb;ߦ2Qh\Xdv,@ '҄o8%ΦhʋSf.:u`|C5d%p$agICFOՕRmtfp˸H&GrT蛕ÖP*!<đ+]+udYmU,_Uy2gKZ~&.d]6g6M[;@{@{u&fQ ~iJ4ث#EH}]TGԑ"O|/dk 0}ZG z;jŎ7aH..P>P"deOnml Ii?F0i2bտGI^)/(F)%?jy2ik\!gĵYyCxrύOIF/8&ٻeXu=.ge=Ļ8s_WWzXsRZm֐[^紡>@}yQ$$ya:M' R*\*Ba.0)TJR3%Fz4s/I\&ף[IeȊd25v^!k)$kO6z&%q@ tDIV4oQגm+Q`xg6,z%:LK(g؈ϰ a48@:^$ۙܒ&HD# }4}"P>Wa8)?G`!AI2~yf?y}$+*1|$ KLޮҊ~3qvlswlY'?UXcyoshimi-2.3.5.1/banks/Fantasy/0040-Delayed Echo.xiz000066400000000000000000000057511506652756400214170ustar00rootroot00000000000000][s~ϯ{V[U-YjUkK>u/d@czF r/~I{.tt|ij:Vlߊ>7'OVcn֣g+kj~D WqQY+zldDlI:b &b:o+4`{G~`n#ׁ[-<}vfon$~ %ʺΈ[Ά7cjx=/7tk\{g£&F'ua9¯^lz̍vZ;E42ҵ1 ),?p"+}[Fo9NȏgRMg7lAf C]YϮVJPLYw;XՌ Ue+M_O[0E OK+TBfA--ViF(NĜ.Ɨ 9m*[w+I[B/mM8q7"煀#^"w8ःrW^YgʷMb|-~CbwR/fxyu1]ܞ+c9o,L\Lv kP%~^dJs⇜:AR*ل%xޠ)Qao-m KG{ | 4~J{u`C9*:Sv`l3]P8"> ~)h+2t]2Q7!4,1.@˒+geڮcʵ"Ƥct.001#M\HyؤsHк v>O |.{j7$S ؗ6^@hDfO]#ҖH1Ƕb>wxa1c![Vj˔D@ Rd2fZ׽W.2r{(Ug|ƿnEĕFp0.=3{?:ޙDbL'QQ)1eC3UGWR>}?/lOD &:R<7p6ď1GyAptl}/ "ENDkF0f ^m_EHSG.dP].@ " Y'q.H F$ĖoCqbidħ "c-9r]Jt#RAw88#ySS`QT^RICti`Pd~3^`][%1;KIL`dc\@"-CەOvnתH;~`Qi6Kً+R75K*>EJTej gBႹҗBlJ&.kJHͳ4^/b%R%dМl|sr6HHl.0X=`:hM1j:%S6!8 /$%dO9ʐ@ *W筬GGje-- ED_}~R) #K|l Cek\o/91xVh2[K78Kjkz>pڃ?9v߈5)؅oY`?y5d8E; QtJjܡ/Iq ^RЏ('NV7b4 `XD{c:;^ 1 v'4z]iht{}ʣ$kFy9A^35/Yzi+wѨ*!UU}3˦sit=ExjI|:E.M ,K]7ꪖ:CnwbҢ1Ǭ Y??v{'~HP@k!GNN:WINU7:eJ*sSRĝL*U-UC?B,s%5*w$كKW(QHT ~cGY{ebɭ ~%uA~;Wݷ PjKWڊ^2>nN=IUD:dWV\--g\!e7 ~H}A• ║E->.2gg2"yZ%R@go,R^s'W/hw%,}wS;-;g؁Us)k'%QzVJ]Wɴ8*Qދ?%w^_{~]uGzp)}# vDԎ( $|x2 zJDB* 7n,@}E+-AeAڮ-Kޑ+ft5 ilK$N%iB044dfK]K;𹉸k1h<'<%dSyC;?o{uvmgd|vkeWX7>l_1=%ᏢXmyoshimi-2.3.5.1/banks/Fantasy/0041-Fade Down Echo.xiz000066400000000000000000000060161506652756400215730ustar00rootroot00000000000000][s~ϯ qRkNE%#akG~{H3+${.חͺly:uff9K״NjbWO͇/7ڟ4v}4%E}E]'Ch|#c<3_20méu7Ljh?=Xԃz-"b#O[ut6^ ~cl`4_I 36;xjZS_JWJ|3u7i]vp=^o¡7ƋM[GLNRr_@k[mr`2>4ҭZrch!SX~DK!s@-a"?l8j:[_g 703]ôj#0I!?}nz۬uk/(Lfe&g{D/>%/ {qM6[ s}/)[M`ӈP>]kyQoJk I[D/]M8sѿZ+#Pn|1$rW^awo D2[D$ͳ@g$j*gw 7"5}20'n@82kHfuB'H@*ZK;xa}On aT[kRowIGn?$ lnp8Qoz tJJ6c/pAGmg7c,b+ϲ<DKE\ބ̆͸-˞8eQxZ2uZ[Ϙ4(]ێG1 L,d1T^eSi#Y?NSj~p˷4Kv2%A Ѐ=iѡ W܀ )WW10l!VWmsb ,bDe JSŐXDU4$w xh@8 r'],o땫 =b Nvm;.8O^;y]Za:;RLG|=KmZaz[[zmkwqQ_g'UlGWt)y$C2%/(St|~2ugRH){nt| TVK=VS;¤ Cɷۊ%R͑2h!.J^頖G*-_\Z>hu>^Ax$M'rGD-T[>" LX :G֎jLo1[%Svx(Hg,^VŬul?F:kkO7'"NqEĕF?=37<ݙĠNRfzG%:F\\҇f8|ZD4* LFux&ގl(%1 c>GyS9oʓBbW9` ͈A}|#UOɟ6Bu* -aH> ȕD= pP5~lgXZ>b%]if%w#RAw88#yST`QT>+[×$IQn88ƻ1sbBdW&Z:!r FY 2>ݘF"v-d'y)+Rfl!DdvhvtlzH(,0W-]R@ . KOR,׋X Y 4&ۺ,&BxX!`% }#+\4 lcZ)CCq_EE`tJֆS6$GV|6Ą{@ p 2$Py#ꑄwEFgA>!ȂO*Du!Ñ: H5H=\#HLى&_!8Bt.=߇@1A"#3$0v@J \n>P#۝c-Pba׎e2kƚ2)-mV\ \*^j9 Rib2I т Ob*|rGPyl M,䕈f˲5bNa ( #lok-M|Zec=q@qJރ_9oāWx jLvac7p(Uyf8E; QtJCOA$%G;C?wh@;I[ZވrlA4ԳXD1 j4!+L0nGCaJ_ڝn~5>@hpiLFE~K^aJ.4$jt`TGtU4ȝUI{'R”U}jN\`2k$39em~ʟ^OE[ޛ?قPz\FB?V r$dp|TA FZIrU[JuE kUg}fzЧ$yPrt%cXPVes)bCI='FIU_7nѵ4Rs&ǜOT.ƭToyoshimi-2.3.5.1/banks/Fantasy/0042-Rhodes Space1.xiz000066400000000000000000000066311506652756400215320ustar00rootroot00000000000000][s~_=K̝bNY [;rI 66diaɒܒmHȔfbZ,uO}Z*Njr^8·]Kv>{у Fm ~SP{uM׷l`|0旅\[Oڵ]E02:JW ǍL7r֡q(خ,YB#Y.)"j}CEov<ˏ +AN;g`< wGӉ!]:}m'61>b4iuկLg(Q𵊞7jF #˶J"då%j8І;e@|p]qm"Ϻ[C1¤m>3u=9|JTEz'M:mFJ~%hs}< IOH+h~{G4 XH,נ!/<ɔkG Y !tdp pg<I;F쿷a$):Z[r vhmgee~B!^^▋f۬*9^Qd o:vEk.|+3E&1]^(ڧڃ m,*UGPO|vje'C vleTfe4 aO=u`a~2zp-d۝j"o4TzMkU4]SOikքb;paEνduiAMg *y{~']Q`-QY"\ls/flZjɼE9&>W*> TN+E|{iG2q`v0]_EeʬʔY#a=:f`I9<"Yէ< D9KƩ> 19T~6p7!982%j|=9KS9/M6~_"\bͥYFe[6aAsiXPʨ#PXnEYFP6,<[z=.Hgrb.ZX$%4mn#hqW+J/*&tIq 0HԬ> )oO|j.]Fd .H6.<]qninj@iLQYeEgYCjdD9u>vE][|<9=O7;Pm2jP9xtȜEGZwKBF!se ks2o2o j9s)_?E$uW+}b+X??Pb6.bFl;]`)tu/.c`O UV+\NK3Y=WY,ًq^eWEZqQZ^YqǙSU-04 isk@Ī^vVTi)^0 6FL(c;n} Q\a+>sBE|\7' ,]usr@otݨ״;Ӏ rBA5qk>Vf5 2H l|.ʼn*]O:dɽpU9ƱԬl\-m 3-o8ۻ'7FL>Z0O9^vT{T<E_0vį3X(<}#08);mB:3P@}=͐84Ȱ|3 0c1DFʷH'9 H0!"9>eჵZ)%G(^FF>)t.u#;l |K%ƕm$9"P$bCzsB"^%Zh4n8Lf#~UB @<9Ro UbOBщ*0>9C?0Cّؐ!ۓG܊BOn.@_7"&N^vd.KU ^aBWcx{w x]q0 "r J=ZMv=,0~2 CJ/B(Ưi2Tpxy.yR,r"/z~Wzg^f` u'C_pT/>0K1E8LԢbN &C⿥#׃x5{n%/Rryr |] EujYvlI4Ωl_R#vL)^h EԮZPZyT!-Z"'&<ݢU;crYwd*LwYlmˮZՉN_+sފ}25 2ǙX>c_.UZTȎbH^)go۳3ۊ yoshimi-2.3.5.1/banks/Fantasy/0043-Rhodes Space2.xiz000066400000000000000000000066571506652756400215440ustar00rootroot00000000000000r}Y|-Ob׺Nbgdk/18ad$Zع4Bn?Z0K^syxݗW9\\ k=ǙmnG9vloGlw~uɓ'qt.Ͳ&wĀKinN%,=Pt؊΍:,v<M/WZۡu˚o/i&rX'7zvMJA y]u1t+ZygVFWit ߽bwYk7\Ɛî75?7,hulg$A𳊟.j F۳.#ǶJ"`0-j0Ё'eB9L1һ}TbMj s fw)|JE \߱@@zpYE&gi85\S'tdl|u}` "^۾8t8I m V!t.)X!Lepe0' <AD7Q,1"z-+׿VBOcOع65NR|x.|f2'hv |on% 7Sd݅f-n1`8cx6b[&T5xð } `mcږ-lfSDZu]vđTw=.=߅^!AS>"K=sp;R9{2 BmfOF5IyajFD wޝ^V*iBbD  |DьmK#z({{ `{v!ݗbFX''3=JL$l B-l:LN`HCt|2f1T-^GeJĊ֠p3*~ش[k G\?xܼ - SI fl#A|HGIƅ-Z{ x̏DsjŪl;M&@tZQ%8iE}#Fޞ%qLg'3IH-6+@%ps B ̼|y>U1^DLb*ml*DWo)z2o2d ےmoV)C(PqfDMε5r 1=L ZDi_Nc/lYeKSu$ߗ0*ۡod`kQPn;:M8uОbX+9d2L*߭5̆'~\O'9dߊ[Kv}f 6#xoj0N[Ⱥ1\U{-7Jzd/J뫭l6SDg4Œe/GB0 5'7H#% Y/=K8w"H4f)k+5HR|Tc[$N'ՃZZ`6rV`v}D2%lmD ^ʥ\EFT3dodpr699J4u^V [ޑ|zz}6Rî7!4a+&ި;vX>9}z"*UmyR>l|^_ElY4[{ ն!oQFkl ngxj +|M Aa OEDH{p(O"/+-P57L27QT%hB,r^8_K|Oo$< <]yhy~t{Bڐ>$l'ŞXyi܂iWS&N,ʏBJ|gAXe"3ݳ` h*K2]|g}`ͭ3QϦ5be̾lB Bq.q=Jq;֬|䝟.yG9!zg!悕VnEJYAz: +Ս/ys;F!;rjPBv$}OG\ /<eJ'}~iN2!W.SL*]LFХ#4 O" ^Műzpv!=s8qv(Yss[6Gsmz)Jʰ N 65VQUS."zk~AW!ZB|]vJ,(?lL..Pi2V[ͯKqVn6؃RBz>.D<-z8-im *Ӣd" $U)!Re,|}iIIT-9ο㽽\dRX^#GoKiW׺z,78.ȤBeKIjOWPK^lyI/:^Z3 ٘àʗ(!O ȓW2B2Jx& pF ߯_p#eEjv"u0 B~D(mC8zY‚8zHX \S.=QM`vd+mCB~` /tg+Zϫ akiy6ni*S5 "NׄMMiDg*ߐxHGgT5{Qы{H 74(Ŧjh/S= !αKπ>- M$e@" !_ Vk?TZ2PAwIyR,+LoehgN_z g;wz'_nSBM/L N\K;w?s> AH$i&3lQhxrE -9 wODh,?Me ҏq 3iYL(>*fLŁ75S#m P}([.BYF9Grk3k1Ʈ\2VZLT9RbH^)'8#ǎoryoshimi-2.3.5.1/banks/Fantasy/0065-Long SpaceChoir1.xiz000066400000000000000000000072061506652756400221760ustar00rootroot00000000000000]rF}Wh[U#Qʒ"[}AA$h!&.V~`0ТMmpzn}tL_GO& m9 Y<o;ߌ:O;>p3=s4|3S_~k~RսYěS} K.oY?~tto>c ߨB4DAKz9RKUftW׷&W򯵿xymgrvwԻNM立wyEWoCO>"^t ~ S/LU⭃FIٮHf %ωyb̴6NښJERQVޟY~Y6]ENjʏͩ}nzu_[q t2wk>8/,Yf4ԕ>oܩ{;UYw+Lsx^laVldke-땪xwG<[&Xjˣq$kXjmھz[t훵s'}XzdUnab ;C?cYŠ'\Y6^mrԻ>P'W]S-eb{+f[mi^ !o~o՚)˕yjA~yuUIJ md87ikߦq]-{B[q}wzqYCȣYQ8V}F̺|(U,@T&gkokY{%QZo"Wu9M_%'ش{{ \ڲq⦵dCW>OBFc0*zF3 $ԳU5@[Erl#9س1z aC3=oϨw&۪!Ƚgua hOg lf{||@hyQlGa6@؈d6f4$۷FacFC#1!2]#e#O:FXz|.[cu#o pOI 7Lm%GhRඇ8ݚ:]=B1Vud9YoYO@-tG!`Q7Glߑilt8D);u\l6<.QGѱpqu\rG̻\.Bu.󚳸=8u{PQPCұЀ; u=ha)۠fڸ:I;:GN+. Pg9jaa@BV'pF$cvSiOЦO<ڵFtP@ݦt( z1}`\I:]}7`ڄ4g FGHʁo9^fA=!ўCf҇DPck(F1=*6L(fP`O#Ђz.uR>GA1FwG9fm.F7'Pcv 4׸4 3PigP^k|k\aKxE*3odɼJ$lrih] z65WBf>\`cه(Gk(@-b kEv*wQ`Akv^FWAᢠX_+D-VnS(& xurU5NptQ4AjfF^Ѕo=6nHXua9"PqA(RPRP :0p@g (Uzl@e. }4>9zg =(d tRbzu4Qtzϳի!wUv-N)#/Lrʘy B(EYJdH[&n.'j~K%a o"W-`xJ_e4uP=/٥ W/ }:}q̚b)^J*ɻѽqO"^I*{KKP3-QsRI<xϞLjUjֲdY_*OQˇnTeגѓVAQKdd=˥6q j,iI #]ŕ&W^^ߴ}d HO e y.ee.?iFGמD̂ B7gXQ ~ѲQěW)FJCgS4~n6~xyew[2ܶVpܪ.pqQzCY&M૤lx,gٽ/9C/s˻V1'#[q)H&٤^{VEL"Lre 6Kk (ۊ-+#ä\ڇZ:WlY"Y]u6VD>*\E/$q" ROhH+\o`iI(٢F֧jj9'vq0'ZBJTeWD~QiҾ-#j!V5W1!d!r?XQ ob̙)_OI*=PT6:lzR-Cݯbm OؑVL.R'U[fJeK7KI0SU>ޠZJDpNMvwӔ\NdZ5\=bq׉ؒX\ wy.m٦U(-TWVbRP XB8VaWZBDVͯP:~KQ+BkWdy5 dd;=?gi5?VYRלښjUJ.V fm Y ǥSEqK[ݽwt9P6k>ٻFଖYEkjr*&r*:.W>,۔Z|f@絟d:K(uwWcp-Z>xjkqyN;Pk_vHY^ kFZ:lޞ;֫\IѾf2vkjyoshimi-2.3.5.1/banks/Fantasy/0066-Long SpaceChoir2.xiz000066400000000000000000000041071506652756400221750ustar00rootroot00000000000000Zms8>{Al .,}Q [L_-,Y[6^ڹO v~?Q煥Yȓ/]n%>Kqy{2̮Oοv(')?RNb;Ot]$Lē's-x)"EufCYЫt`۔ lpvvqF5 VBE6!čSR[y;}a$-YBS ksHF "k1>Z5Oq y>B#%/ ~/uiW)z? 9LMؖ7CJ`h׺fb ufzQRt5N{9HLjGK}q}5Ġ rŁgW;u8jvKAAV̙zgl:^˪lc4Gi/8h!ue詄8t"kmbtp7&=&'͙(, D@Ix%6@*4MV)\NG),o7z/3O[ꈵ[|k]!gc"@5S;t'^$uT4u<ݠ^'b3,TuRR+2m5\"my͸COT}oNT};>;㩾8㩾:TZ}Č􎘒dlގ m5Vˊ*Sf6j7 >ݩTE|p 9vq nPTHk@89ST U(wSgz`UBL#ߺv[c2x݃^Qh}ۿGuІWE}pU ҃m*;xUΕ -y܆jZ_ {:suOl)*jTŸ+yoshimi-2.3.5.1/banks/Guitar/000077500000000000000000000000001506652756400157125ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Guitar/.bankdir000066400000000000000000000000061506652756400173210ustar00rootroot000000000000002.3.0 yoshimi-2.3.5.1/banks/Guitar/0001-Dist Guitar 1.xiz000066400000000000000000000050601506652756400212650ustar00rootroot00000000000000\S8"w6! ,B l܋J x'``kŲ%e;f9? C/U瞅Oa>t|~r1џUrs=~+>ʦ[ӿS'ϟw?hs9sޣ~&/At筽hϢsDWzdD⍖$} 'g|А5ԝG~|G1]%ENS_]j#4uFur5%t1J_-x\\LZ W/&^ٰx~ɚZâ\2Gyǁ0),?h"?,!< npA=Tl:_q?ݠba=P/>R"ipe;/gQHYŏs,Vo+-ggUR[ i?NA-B[.^4#!@3ެLaX`e fNbeLs=|eWU[!QQw"$fUuo+?/8)vB^>&gqi+|ĆdH#JTkp~>^dAs㻜lhz!)gGK5(Jk*%Q9" ybb ])+7,vEF KxGu{I܆AQWB#`:szz~1 3۩̿5ɔ }`'1%VD* B$d+F#e[l0?(NF3՟X/ =Je.􌂖O'ds4b!Yi yhǶo!d{N1CĶCtvWWК0&;UҊZDtʋ&SG&V]K<14<"+K\Nu=}) \'4Ck h1R}R}ᑌo& u\bN *wH5dU{ ,@KQaÃׁ/s@C{8EؓRv)^Q^N%b,C+FFYd x}94fAXᓫ7 mc,ra˭ IR)edd[5֥/Lyv/|^#/́fG"! A4Y ս|>pZ1GǍ?gGɔZ"ȻE?2D\!56&Yii D nB2%L͔$O"R3r]KT0])Ӷ>oGɯzR M)8?x ` \o JytռJ-K>d@ 0ajYupA70LtTGŲ7{6l{(dcě:Eۃ n=0G~[qܞ_CL_n+9Fl(e^ԖOOvÇ7|)'3{;vJnv=콡1LmۄJfNG}ԻU8.'NH? -*ֺ6^7795zrSC^ ڣiEZ/hЉe ӓт߈BHheQWj &t~]5Cy]77?k".NOq\KFM^ Tߗ52<}Gq=*[\ש䖴Qng+:tO'7igfq'C 㲶$էJͳgԴfct u*5 +-Yyoshimi-2.3.5.1/banks/Guitar/0002-Dist Guitar 2.xiz000066400000000000000000000053601506652756400212720ustar00rootroot00000000000000\_s8O= !@l1 .!l܋KE9d²%e i2%On ?_:#zZwA>tz|p$%[Q>şZvK< B "=#GW^J]k<8'-q$=:% Xz:ʉ-I~ :_\f)oEb>G!YOY:>,&6#-H7uNVet;vG7l|sqIe.FYi?E b`Ċ*F)/ &-A\ɜ{৏ى!XrOtyAt+ )*ȖTC6jz. hҌ0 $u c*?D$^Fa?aKJ܇8ZdNO_\]cJv* @ wr%Ch2 o OZg3bnL$BGER[z8r}!ɿv?w`Bζ~w֊Y<ظ!M&boeǔ {8"KzXyvmk RYijp3qe1 -摫lo;AjkHf԰F.J:^XY\PfϻkUt {XCd^D℺%JwHJ.X2KAK9}S{*"=]r4/.uKZ\?pX+e{z[ݞ|O8~tX'{ w?aWhG}kW*Sb\솝ݣ\w*;GR*ZYp\ B4M19hfh>OIp T9[_Pe?x'H ْ]I\MtϲK|gѝ"+n^MGS B+gQt\?R:B\A$S(DE8&+E^S>&ȑO}LTd<(aj*e*T1cX$.r8;T, Ӄ]j &P9u ̗[6lEgLW 㔭/XQګ"g/+`$ZH ҅\tW %((KV3)!MrQ\`LJ (#^0i+d8@_|"]El[JiZJiZwD(2 K}\LP>87 XڏB'ZχnYmZVi/ @҂l}„ B\ϓJ΃81'45 xiPNɲf VBY2=>trjyߛUaJy;<]=b}E+ڹZ(W-T{}ˢJ,WYQ32(*2"X_ueȒg3j }c;r"Wxsd#ʵ2>iӞi f٤t)99rpNW7ڞdt98$0G;.pq~q?T$ӥ8-kTzfKYxr'iD׿Рx@9o݈}[@hm3Ql*Xy)Lh7|T'ɕjp{H4z&pL_?MU.g_|:j\\Us?q{5mr#mdnCoxW.n P`D^yoshimi-2.3.5.1/banks/Guitar/0003-Dist Guitar 3.xiz000066400000000000000000000053661506652756400213020ustar00rootroot00000000000000\w:_ ЄlB g/>-߂#M_c,[GiOMHKïUF/vnwvvur=m%xmzIV}TL~M^?IND1{<'KZWnB|IjƏ_MV4 hN [{%<8lBgbv5mH܇5؞/A1`d[L}{YAJjꂸ#/v\On&65[<;kx"W?qcgC#$J4n/1 rrI]}+`R`?h"i'3)Lllfl~L1&uәONNQ%I3vUޮXYT>,:P0Hedn@g^|/3P4 +i(,bf4\h8_K9}Q7NLIBA百)f]蛣%|2Nq lqw5pY"ؐل"D$58 3}$;Q2BNBO^`y,Ud %iH~dIB ] &K\ah/K;1 i#aNN8b! Ӎ.2Tm= Nch#M L&>-0XXkaRω芒h\^!@N#31>rl+bvxU7;J9[ "ό/rxb{`%ErIori;؛/ B.x^fz{5O8"(GqWi\&~ iǗ(bDeL8yrS16ȑbO}D=U(aj*>HHtD'N@Jbj˰lR^Y|{>'N>jz'v-XN:H42ِ'B3d=]HDKY>5Y9 $,aX(].B5]ivrً@ c6$97gjp])M)M+F?)k a/Qs)q*ӆ VZ$8A7+VE\(u;^Zmo~_iP[YiҏbSM/%3`~\^gYA{XR7Lv7VVMvO^(E;k҅_ Y@Rn*9\EtڢeW$=v3S2S#}R!/q |~AY-/-2f;ju 䦘3{eO5086͠NMxl ɔwM$$ E}3p-w_EҖ0>d@0a{;98n^o?{oln2$o8uɐ o@YY-C3_ ʆm-?.(zC Pfm1=͠nP{"PAȫ(+Ra ( ^TP&v~wehpJ I5E8MQe (oNfLBX#²6h`ް>Z]CӦVR+k#_6͑BsdS,{_/CxiPHiroP~o-vur*Ul>$ۻm5|[._I_)ڨu ݶ\BQYQ"Eiq|gvyQzo+kM˰T8>'qԵSq׵tԵԵtEfj8P:ZopKI /PsWG zE^$#$7XhPx0=?./CzN$er.I/`ab> 9/O-Ѝ*p Bl`9]W84qcv}(6X܁Wx8Ÿu머J;]Lj5 leK@pC?,syէ i}~AFƁͳXs[@Ζ(m3lJ-Yy R3Hqht;)y(䊞7̸ 6lm}SڥcU܁ov_?Y/uowIL|G~]';qID\91y߹&ɺK=z}N4]OЧQ9%kXzD썆${ /ίn.%}O6cwzvDԅuO_h0g(s➼ۙ}=^Ζllo<׳Q c4N _b- mϏ0PD0Ȧuw TI9|\Aր-=q݌O礂` g0ld`ߠ̌1.ȑbO}H☧=(aj**=T1c[08ET"T QC^]<JX98 UӬ6{vhLW夣[Q"^e/[a$["rLtW )(r)[ާR^A&M<Xu:IᛍY(No2n2nG"e0D2,}e:R0E#2Npn*B'ݳ2Ҙ_遫svrO> (7!³CnŃgu)+/t6q6@Mq bZ;9X2L}:/%3d~\^-iA/{R7x}7Tm8ݯL^|om\ B5+-\Ń1#H򓮲h JX_ {즦f^+ 9T)rwD߲B"c`+gPBn:Z+{ZӌAS *n'KpN$ܤ?V9N' $U1'/v@!|Gͫğ! [w(ۃq2|= jL e؃k^E=E'~w,HVL,Ivv2}-(+5KriAhүゲi,5̚X1CsC3bvB DUY"l܂ikumNYkAd2"\CRmۂ_;AYU5+eGe6haYmXT|GjaYQ(ȶ9͑-.kqi)4GŲ7'm22=8i򱦫<5^֮l]e8)|qKCڝEmǸA-Ϳm |%}ŧh>g|qu %v\BQ^EDw6iq ? J[)/WRn+kvM˰TuhN1$4~*n6^77:jfSOXjᖒ^ܯh+iIGIotѠ`v~>;]_rHFI\B*^l|sH3(&6oUzLsR7DQ9,qn\ 3&.JIӍ=1c_OeP Q`nQ PN6]72OZ}rN,Nؗjo<QlQ;.?Ulq{ҖK9HtNޒUjXES#őh卩V\ 3.Hc Kg=*CTṞ*p7㖆=PPnk0;;&sKU0'cfI^yoshimi-2.3.5.1/banks/Guitar/0005-Dist Guitar 5.xiz000066400000000000000000000055671506652756400213110ustar00rootroot00000000000000]wڸ_= 6sars=}Q$ނ͵M_GX$$0%I뾴G/oF~^.jO~QxRw~jk~8fApR?_gW/`6]ߟ~4#)wG%3On]< BY 7">dJjWӔ<$]s< j~NkHOuh|~us9(ZBOꃳ%Lu`d/~R50/0_t]s:_Czp3N7lK-Y&&ta%/AL{Az-k%F?Sin{r6Dѓ,cSL Y ̪vrsw9O/nPf* ldELLђ3Q(җϘqo#4TE3*e4M 5Gɦq$s"oW;DdxY f@!_LC`g3[Si\s/Dݢ$~8Hyo^ewy<N(hrwf4h)TЊ*F)O &,Z0`>ddI!(x4H_<`y"vQgTQAd:I?"y48g,J_%E1CdHeS/c'HG6!<} Ou;\ЇPLh"`A%<̋Oq>,0(X=ȯhٖ{4mV i7vZ]-vPZ~4>kdЀ:wۃHUWPjŷĩz,y)ddZZ$jk?-s bN4 S Œp(.IJXv~3p|tJ.#+F$N|@W/TL|9:>:ct=bhq4/9zɞI= G+fpqfו 9nIqr>#wO E8ߡiI) a3 &S c<[H덱׊lLe bGV 䵔eibs|Aa$X Kc2"0oSP e4'Jp U6F&;Eyz@6A (M8EzڮƏ+rvLڞ$d&*!hQYȊR nWTҊ^LG4VM7[ZFH% <Y' B 0d=](1DHY-Jyu6@2-{]/;R9S :H!q׶vH!rsXvAm*m*m_ɓ%DIuQ aU=GLP>Qi? )8)/R+*<]ptG:VW_N .'{؛qbɌ>qzš@SXnˀ\Y_7W)oUYʆHkzg=BH g,)`%-- !2euȠ(jRyb52"[J)lgw]ܨ1D4HœHTgH+py< ȲJAa/T\:>CӀU)/+M2@'\wMNՄ?"aiNnu}Xa9mubSeu2$vzαHvE9ڝfZ 9޳ZAVnڻn$ ZIu C뇩Vo5I+HP\U(KJ"T#XҐ$cvҞC[*HTZ{<=!9,KɆw8+$v+h ]tyՔVUV7o} ] UvnkNt'BݕzO131UP_@[WAl[5lUW8VrVT4;V@[ =G?^PCPc|m7w3|Ǝqw="O^EWq}.z}r{vKfϮwA{v]Jw5ZXJu]Ju+cN^p^ /Pn+ڣ鼢E™l.ܑ-=O'Pܺ)фRA׆Ho,u/}#'O5w 4F߬aqHm;o~v\t[i,mE7 ]\ 4qXi-zApϣȗNCEt%KdϕX%ڦ~C+zP6=ȝF,] L-&ҲNբ֙C~#K Nb$mvEu,FbspI1 -RS}kb~]EV hohakXT[6r.o\m\} 'HK-l[&_8/>e؛MiQ=W˒gEڶv}R;/: jncm5onf#kyoshimi-2.3.5.1/banks/Guitar/0007-Dist Guitar 6.xiy000066400000000000000000000057401506652756400213040ustar00rootroot00000000000000ko8{ϟm'@ۅ8Wc'8 t-ic -J$5$e).]_p^קݶ@/fxrͻǓ_>|dzGw~\ٱ I#Qܘ[%n@; m~p\~4l~~us9^̮o#,z⍕Ddl<>haۻ hW_U3LԺߌ/m:5qg?Y;wZ)a>Í-7& Hh^Ɏx-9AY#WMH d~g4 ^R&?Cg[Ur:_0q_n;*3?gZ)D4U旯ύoq- |zF|LڍPƝR:t܏_.9 %@^k`6L3P}+> XB)QXf@dL5[L/sM `zij[)D'3O4] 83p=yΙ̗/鎊Zoež`MLXE@-*XoE`!l [b; f;=-)=+u 󇶷wyV|Cr;oğpXAsJ~~W%Rsyq2G`ngatgQۓĔ zN4yjC468WК0(h0]"&a'"B 46. v|/3ᆤ<RA̩DRPx~3t>W$Nң{(<"UԱAiY? SuPF5I)fa3:? A)S=t? SQ-#:]@sN`¾+^iL)m{?4xuU%oF逰kL!9!Yqh;?rp uDx\Þ{10ʹDrt/|8>rA)N,n8;AL" af8qnfz{5'LXk߯fibXxnG(4e@ynE$,.E LR.C;yYeÛAf":.d(A#z >/.Ij58l{:f vOGS^5zW GSPN+J%w G5M5T |H1EKar.#/uI- 2.:% y En%HAu#D ,7'À*6 ަ }vBd88rRO5ruq{- e**E'1 I` s(.f6A %zU( lӢkڃǔ%F;2V#@w%s`HA 'kUP62v+;XjJM6(ʫơjfķ|6ٿ8U<| =y+XD#ǵ{;|Dh;4.KRy]M1=G|)d!+sy]s9J.d$6>c6eB2òy,E!hr< [seвz[}5AU7$ޝЌiI~%4?wWNyoshimi-2.3.5.1/banks/Guitar/0007-Dist Guitar 6.xiz000066400000000000000000000053111506652756400212770ustar00rootroot00000000000000ks۸{~OL}g(hjˮ%4DE"U>~}"H\iy8_.G-}a___6ڳF^_֭_/.돳>|p~T84_!1ߊ2tg{^[uN$~hAjw<{įݓd]5V;ˀkin׆d Zw̿;Zu t<{w- yk>ٸU㕝Du_wnT50 !y0h6z[37xgçcDZ|[^n"{놶Gql\e\"Xd˥訶~~g4 8N[PA0fx2=<ގ&3&n1ʺGF QM%yZզ[ov_w=^k5[ևY{="֡[Iࢍw[7? cD[(+)T6wSWh6[A-lTJFʄ9&5Ă>UF<р7I,lo.g2?h42r}ǎ&+&S籧_'/E` @vxx>_wqQ<Ӗ6. 6y|D1sUC H|8˳^)8'Q,98$m/V6h? v)`  d~dvqEM{ ;e'\uVd#4mtsw? ]Wm\r ZQ::5<Uj ױCw품]{ w6l!xKlەk ܳ`ͽ:T]cJA7{ 2uu>;_z./dSzh,|i_N0*Ԇilp5aloWO4 l&DLlk/N7'@C&ht51(^~ Ag IsyηJ1>HA_.Vt8Q[T #.@"rAf1WUppJOŢPTRBgE5;(뀃B?Aa'G^X??uA)S9t? SQ #@sN`ƾ+0S$vU|N­2< )+rB:,p*2  q {,_# ɽR^a"8!34- Jd-هn2 ` 5ݍM- <*NQhʀݎl 32I\Gij7IJW7̮Pfj0{}Z$dDKP$Eոa/95ˍ<@nGK~g8X~ ZxW?fRnZMu=# 0-wVj2՘5ǎ=I.P# }A_'pje@Pa+mAwaZ#W:to԰hp5Bt4bhSx0(gLv"At)T7֍<8Bry-2%<מ:ȶͩ[XMỴl'?i:gUټHΪl^ 57dhb~nxE6dgd?ZB'R ^>lUTXile՘z 0NO<#tA*õ| U0A*N  RYT5c!6Ͻ$Na]n24FEUDuay`[b<}hm f^SvOzPVHjhL nEhP?3ia#6h'laJ+&3uHunβX \XvL҆Ḿ)XfVІJ>${xzwJu1*zHXĉ5//x^9hXXBΠmRJ~%8t;Nq 07PLkO̓Qk[AB1bΣx 3} cACF` _F^D$tdKnTrD6zz.>+Хay/>FM?ī( <7g'lIG."}rOAvh`2 o"O:|*QQs7>Ie @9pvv&:@p#A>` rEL:;Z܍rxK)fb4AEC?xNXrK϶۝~ ?/֓E,g:w}0PHSoSw(X\D!AVen#: 5%1~E0pͨ*e7ߍtO7ҭ!B/"q%JOs߃'*yu*>ڣ; oZc;@$c):(-Vs?ee!Rt)Ov{8B=liO,f˛juTWKi'uާȸ;ȵk;M#,mJ[phՃ lj7Y H1Pn "yT1bli|B9=^W9",MQ.7[+ O\ًތoE(jr:H$?7a@- %(QQvsĦݦ09r@)I%L 9 -}3E@<͉C:!n,&ƻz+KO;sFp8Yvm r*N䤭/XQK^/r5I0x-K C*ɅAy؁,3)/ S L"i%eZȽnDnD">EXM*I્0sPdϷp])M)M+B|7y$R 3@$a_U"TfFT]GEr͈XmZTi̯l59@[W#P/>7BCnJF&vAm2'45aA<Ŵnns(d#dL7t \^M'Y9 ,Zg)j< je^&,mVL[8yw-w6u ' +YBe*|ӢfR x3c2T# }R!/Aq }#rǬyx= [ǿ _)/:(Π=,gPU8DJ:~7 ׳N'T EuE=ꢐ',$U1'/웃km8DOK[U!_~C!  kw(ہqr[#> jÅ%H 4*e^%()dbAHpv!+ՠ-C/߷ez'~6PֱB9C p}VaP["kP^묺(cɰ.uݨ.ՠ 2uWH.iʺ5(pYmJe;Z?{6qke_յ2ՁWʜ*LZInU.(]Sw6LEqO\(@v@Ŵ|S0oO+i-I}[$\&ީ ݴ/ڧI)58>k զզզf^\maK65܁R T zCEoǓ74CB2-ƒtCHuIbT6>yO #>zbkxQke[QYҁyrl9r\ J e)2EQ|C{J@Rz!=\}C*38TA1RI>4.Kwݖ9.jpj}.}E}pQ!2`I ,)QР^SE4,N*)h"vr EOm&c R4 2ZشsA"d/&E#ꁇ1]֦ Fv=z0q1( @4FЭsqtjPZ0r./0;ۗٵ/3 W;z!bDo樨_yoshimi-2.3.5.1/banks/Guitar/0034-Trash Guitar 2.xiz000066400000000000000000000055671506652756400214660ustar00rootroot00000000000000]Ks8WhuHUI4Z[f/,lN$RKR=~"@le9) ~ղI/f ‡ͻɰwqvu:t=i%{?'I V~Ħ;Y?Cn'A=i7߉&}HƕkY6}`0~ġS#o'MXtv~us9Of5(Z6B?4ggK>:`d/~l0o 0R_US3▼Ʒz|3'7WY^Fi R8k?v0I[aK]]+`R`?h"j}GEOaJ>$I$J%PC;دdfS;iLϪH@qrK-ϣ@UQ~Z$8A7ДՖE6\(u; :s#[0odbgĉ)&Y ǽ)urCi%F,% cΦGWj6=yVZlܶ~nEDUϾżFpaĀ߾aBx%+\Q ]CEuZ,Y4ofYUj$OSA3%("`DB/h!sˁa+EGV%Խ ghPI&vjг=$$ E}sp-!yi5o(Dy!2 PaE|;09<_pkħ?ÀP 0~b_Fk߷e"L,INv2}qeh֠lгPʺ=tl:@Pљ59:Y>AA{"#%jP:bWjP&v W2de8v^" )֠}KPfy_W+ keW+}ǭ}uXVTf^Q+T9hZOjeu{q#k\V2i)GŲ;R% =wGJىIs[=Cc'Pw~kǻ`,5v ?)TۻwAw]Ա(Ti :S2}8uWoT4Պdw[LJ7/ {j[{^߷~MM=jZۻU[}tzRS.9pJ7J[mJz]mJ:_mjeզUjS(@Ź74H8YvZ6Yyirl0 \ϿԼ_ ~Wg6w>qiL⧬3?5ɗ)ڸrbQqM7懯A୼hơϢqF0Ȉ%߄NW7j [ӐG~@6sat,j6Zzv#]qKo٘\nFf縢OdO1LOJ߼x1[EdBQnVnE4"l`4FG7t Ar>DSMxN">qy j2on/97eId<u?_$5?B!d?Y>Sε3ʦG9I(%Zh ѻ (ZPD\iFNLˆ&Un3 c%k> g{9'/D`DwIHLӫlgtt;2J d~{^jҏ2oG>YB{ w8? 3}!'02G /~&H&nQ*p&d#!7@@/MDƞĺؑ֋VvV>l`.>pCR^0جeV Oc[ U8?xɴ -$Z&%+<TR-a. ْH(i٦|* !yA#}\u0,rF {*#4ghr7-/[/ DLknG2,2Ihguj_ud>IrԾ=@I46xWЙ0&Y̒z\Dw$ҋ7-'Q'@i˖ԸN1ĄaFy V$T% v<=Z,^Y0b@2P󵋙]C|TuGP@5Kc;q}6^ӓv9peΧ;{)lX]{EB|*Kze솑QF>^lT60> ؼQ(e!(v2BP{ ߓIR. PEDH#{9AeUG^,2{%g1cѝ"+nϮy(jr6G)!~n|/T[%BK9QNh Hh%v@qG.q,R8X)PBLJ{)cH0\$7qz ?(i,xz+IJP)&Axidnv +q-A(U_/R50rp-d B.BY+)/ M$s̀B$E^ UZHnT\Yd >XMH ߫۵QĽZͮ٫~DTɗadX8KutGܙWw2-83 Xp캆JO;f .SU+pMU4'[ߙ0!<^nP[yQ #SM]=P:6rJntedYG7WYRކ/ kly+ع]޹|qU2/r֫V-h"UVԔ ꬾ&G(vy(U&,5ﶛbt- ?KPTC'+H߅ 1>Mi0<>̃r|V[{> gG䧣/6;NG=}vOb+u,+n+u+|U̩ZMzE{^ WHM!{,;c}҇l܈BH(eQW#4J/G0&(~|{pt?7g>L:~dz_ ̟du?A%/7PɞA: :7,qCYO2: :Ӭs,AGZ,ٶ?^^_^/oo`?$ɢ<}'3qazwkc[ղpW㻉a|;OnM}\_e4|)NfDe2Wڏ4[oa E)|N6&R~@*>r/ml;ȟh*&xQyǫ}1ns10b~ &͢cYp .Y񛳳?ލ]d)7j|N2yϝE~ ;0pn8ٝ&ʂ/wpL, S9z *|F"Yg毿:l3;uJW+eϫbZ1G e|}r+Gǥe2bYBt' P0)UZc+0`͒%踘П,{*!=uİJ\KهOբ'H 41RwM<}VatI^.q;qeScQ:hq $v4aOMuYQt?'o>LeT?F3 RbR&Q hbzA3piQh-ZjC/їH1\ːr\Ҟw67] 5Y:bP[^re+_GS|p7]GQ2\eN?N B7-bzGщ*i@:Dٲh_N,aEŶiƆ1:ҫnv]gIUbӫLI07N50MuFI4370( ۬0W6#k1#aF̈^eI0#@jfgQ^ 3B؛C4۞>RJל7+A݌hZ]+,i<zNJCr<813u)0Ͼ}_ T;H%߳!nXZe&ㄔ&4Z=]*{t m) jvc`6w{(T0w7yFY`8mDGm`u;[r/Xݻ;n!L3Ĉgpnsk% M e=ܮ#8nin(5ƭJqBr_n6GN0٣8V[&dk4iףۣ"BXQ~4θ szу[}nY˷M|Jp}Gz~™x^Po/c mwIm}EP6/M` ܨX㥩8fjHSXc7C*< 6}T|45xi k45^+ME 15[a hkڠ֨XAn58u*;jT9+! kTF ck5 Alkk5 APkG<*VM jHX!Mk5)cN jMao/ k'ضX?jԩ5[ah֨XA[ahbXs*XPC֨pA[a h Q|4࿛ԐnZ <2pd䀵N9b|<<8Ίʆd{Hr{9OQjQ6E.ms M8\ ȫW*z(frףbe ;cTo 9=2nzd܀nQqM< =*Vc)+Hjw;XQq6G x}*nz=J;d܀ۿ{T﹛'ـ|4u6)D{^:u"1܌QPNQqa´M 45^/Ma]cXwSX)9JSq~ԨA i k|)ҭF ,m Kϛ˳Is\pZ8~0Eb/u֚SӚᒌkZ9zXYVqbNW$T*ܾ0" Ÿ{ -~39S 9i6(4[:]+[m;mhΪh d~hTb5&@F(͘inѮ}`B`@}GO8<5i[x,WLeUg, )7$/WUNzaS+,HJ~v!jZ.oV(Ff^\_g&綁W"וyy_Vhm]j"zNuUnej吜C--'WՆͦV-4qR<:gm-Ժ-8pm<Ժ!n*sV7&ooԲ׺M'~+'Vfb:{S2ʹ{my"۠Z1ژݷi=n"fu{mk=g2RM+(k,c+AgylfT.cQΧ?E bT%r!rvPp:Aa9ꕸSΒy2l~Ӗ) =~^[Q=-P37[L~h@m_ ]} H@.} ~Ϥ+{b M*IG()];C?-h-ܧXg[ߕ3amFvg/]ݜ|?) Q^5_ûTDZJk$D5v*`"tqEчۢm-DgMmMD+MTr&^ÉÉUnh*( +'‰c]T@m YpE:5-nj*LuRQQ[ p)g8H$朱dQYޚɒv9V%7MK:k'2,-IkϷ'5I%U)]%LwĪ9-D)Sȫh:Cp>uRuV.YgܰE1a͕ʷvN!Dv¥P:iú iD~H#U^szR8)ㅤp(zͫ&pzbмoolŔ5?C%ڧo$RD~'X31գ1ԥ=<.^QMk" f"@xq*IZWb`xX)LL`Wwc60N߰l]7RS&pشieNSǏK\BE}M̹*rpN1r o&p%]AA]UͪnfU7|倯> UWFuhJjׯﯸ"Nzf,=k1&]I]N..&gS)zcw懇2TspoLh}w]>$68)3m]"UѶs869½*'MUl J5,S^bqyxg>[[|l0t[d!=t]3%l}*<. O$ h/Y(TXkӢ_ͮo/Wxq;K_ۤz/7kNwOj~ ]'jNwSf|;Oovm}\_U=)#NT0,X:H0Jd "K_S`.55A 9Zx|T_,vZ~ùPW]UWw/Wth\1b[%)̎{Nx+U/]8Ɏ~?0~9$J(9m}JT3rN>ˢI8R=[lGV \ j@*^TЂ6X'q>RY Ң~zy.>bXKii 0AedY ?߃R!pA{i-,LWCr^}E׾^k;-ݗ5!wVt%O)-Y3dr=p=UزGV@\R y5ky|{y}u>nngS~x"2Ȝ}ͺ<&7^fe$e9|ʼnZ@eZJ @WԳlCʪv(b1"GF͐;ٯF6YÀ8 gXЉw #~#2+ V7\85 /[ajQ-KQ+&;z\5RhFϟuCѭk9dÎN_/} Y{ rd?$T *z$)~_I3TLy (ٙ]udnLcV1lPc} cYH0)0Z3rZYoT !ڄ:ndkz5)6E܆]NvN Ӷ~hˤ]{ uQVvzw}5^_hk各PRս(!T8vrzRH(5M o\M{p!$/:T "L0W\1V(c!ra_Zg4Z;m#Q@Pk{k<:Jk4Z;FXkshqF\ my5p6`[0suv@Vįva>7fXMi@XSX +cqK6{ܚa0@+xa^~c.Ba~n#ƭ.@k=aCnIua51.s U=0^yIadj3@m!{a$nCX lL2KrƀܨKrc&kq0@ c g0.pq hkva ¸1)enSpjf !FfZOS9K2r  9w3D^aܒFFRa ڍ;f0Ҳ}?Hhw#%9Anm8lX!qy0WQpj_QϭaC =CWwB1na9tf_Q0KhF:$뜗F/}H~;謿42htdX:Ȥqq ,8t cAfƎs ٘qsg,ZY?EP8ra?o!:xk5-.kΑ]cqiKƌ|(kѡ?%qЩqSÞC QƢ7ha]5^aF"|(?{oP4֐8( k(&qN `O Jw(]j6пq3R4i(!@0#j Xs|ހ(+Gtaun"|(k 805r]oP~x.!߲6Jj#-Jj%h k4h*J)7LF>D(]^qP4EVR 3?c3PbT ث.Q,]&l7]qXb4ZÚ?X9'  0(o@g48N5:AFH4Zi5ʵ VF_Fy57h KAi5^(ov.HEy~W ]c2X-2JPޠ|#v (+P7 4k ]cg vBbo^Ȯk4𡔉f a(o H5FXc#774FXc z;=m bmAy\ȮQ?v˄zWMZ|_\ߝWem̂C 9ihp4b( UXL_\L_?/(F=L3AQ`UϺBD$YU@̖lW,[h\3+K$4@#z~_h-G#^9JE7TT~ 0KaNS\TP2u֎=D1&œghIℲBIo9@5UeټIAv#*ET9$A,Ĩ$3^HN 2)ԸHW*^KN{'ciFR4HQhjG?bttiIa9D0PpfSTrcAԱپwSZlľMɶ2Um^0i& ygJ5)^"Jo@  UwdUu&BS`g&sД}81ZNj-sd͹洇~q /QZ/vf'?qM2OjH̳|V%:+d.顸]"XIu0r*]<2bT񋅸a*SCd;yz5b#} S9(NM%B|$p"hi4ȼ?]"6Q o Jj]R[sDR [4/S"1ౄ-MיLaR-0)%lF{] [Lt=ug_7 [,|ưGƩtɧNT?Fd[q䬾 .z4ӟ+~3H0:jOi}cd]}6XH: "KyuPly#rbjT h'~Z9 ?hA?ј`+Bݴ;&%$뎖"D/K?w6˛95P*vV IDTo52f_@פ^o/.&;u<(n.r;۸M2_k2nSeӿ.LlvδzKՠA nKJBN#N;KqG@g?-Uf~ZWۈ)(moWgח޿PI&\,X܄0r=\y(XȂҵ`TdAkwdL0X\v ` jŤ-e-5-֙ s4oq_֙X\p_֟7oq_/5oMX=1Gq$1}pO̙Jdv[[ιbb(E^ ~KFҿoUtyoshimi-2.3.5.1/banks/Guitar/0047-folk guitar.xiz000066400000000000000000000134271506652756400212540ustar00rootroot00000000000000]rH}WhjERmO2KHx^ I|f(= (Y_ڦu=Uu|_.4J⷇oÃ0%(~x{yz~4:˻7ׇO>vswyoOedw(~bK,lGU΂Y|SY2:OuYg#QcKQ!4r<$8Xo>Oqop-)L:׷[ǟƶYǷf|9Nnn6.2G>AFzZïQGYLU8֛ehbS B~xΤ:*P~@yc|^ $(^1vzrr5-0}ew?*vnHA۱Kb,Ц'V}>eX.x*:0)Lm0&wbh&=0~hI]I6p| fRg:{4\e2_&l}N6+y \}\_0TW͕7@AĔǘM D&g!"c,pk^Dq8T4 ñ?t#2\:,g&Ynd>ldo̚$ Ǩ04tK[\UOlU4k닫ʖzlA_N^ ZGY4Tab'ǎK#zFǚf00ciDnNI#j+lhKX)V8ɳYn5U:V'~Db@ ߅XlC; Pq#hp>(۶2WEh&hue6aqiiS EmTf;bhmMw"FζPC$o=$ਸĽ[- {G^2(w~3 ofX|#԰fINC_Ҙչ  6+&vZFSmfDOX5DŽniE4PYMC ьhZ+,ŏ? {މdN;h~|=O ݏ@# U=통X#'CX-LB/>՝K?u͋iNY006񺠑 s&dRtyfX15~f_= 4(}W PD^Br@hZTgs>oBj[1-SUc|'mYQ2h1آJ{|wM/MbL.u$͉2&KDg ^;)T6ɛr?W=aj'YvՄavbV0dX k=#g"/Q=5[4xW`Z몭W:\@.+^8e0EDvjXd˧F'U#A a Q SDĒkggr0ƠE c"1pqs1a"1xHa `a,eH Al%-jn0P-jF0RC)a6;n6;n6;ncaCJlje#5#]rcak}0- _R[A- 씲IN)5GvJ! BXA\!X/H1T.=jV.>G•ܷaRu#`FP2ṽ#My6X]75`E{>>cBBKF {4Fm=̃@s Ԑ%~cucz9uKaR#0v0FJc~no@=5ZaztF uۃAۻ{-M7 xa~N3~A0ub`~94ok5/Z iDluc~9pHՍ1aưFKcX1Ҙ߀5oPCr kt+a~[P٤9]H <<+-lQDQJOW@$<-[Y&mMײ%K(:~G@j0ZI| 5,$knJ,^HIuّɃ=t P7KZИ+( F=JW TYG]2xP ;6@0c$n&h3F.h#"f4)]H%KkU/ɁSqA0bzVh/ݚfP-4᧏‹l_䗈V~)3Cl$JEi˲BC}kLbЉ0| bo. \QuV?Ci]/}$];Y:xy"@ :h_8Ńc6aNjx\뫋39 4+5^UU$/P/[䲫'*\3¹U6\Ek6\4ںIU)$}W |nl!ma7ȁsl!#Զ\m7kvji%n GV%@QCw: n GgaAV'< ۠6oו17vߦ# +n?,ϹB{e 7ʘ{g*JMÏ(dj=T,d^$^1JKbAZn 3N)ԩ<.ƔFIS%yԫwL Z_a+gzbP01_e7YڔN6pAߨ9Ԇ;z2(l&}?%ZdCܱlWSp0E9o y؏9S8B٩g]y  NF<.9|8ա`dﭠW-HECO[;ϳӱQN_ ́:u riy"@cCyZ]QY P"_|=2'fƨTFkSu_dGsOޡvb85 ':ҼجUiI툳$pM%oiGIszN:K%_s jw|bζ7T-)g:5:56iOwyY#L]v\И9MT,#\7y0k6.r]'O6~]nlr~l6?%Ųŏuc+ǖuƎl39vӛ~5\qdOj(FGY `춮UYFyP6[~\;y#KD#wFn <ݭ-pQ{kv$cvK w4 ;ִ-YH%ܑ %FډD.K ikwZ d7h{Z//o]v9.;hD{9,ьDW9!;qX6^kS x4Xz"3B;Ѳ7pD#aX`AA"Z)Ap+s!ݜ2O$xH_\ gm !`1/l95X}G֎<`Gf8*c>p@Uo[⾙_d|8"mrɱpZDf.bs'EHqC^s!,xe W#j=KHJq(f!VLn I>n(\7 <(!V"?bzX1#2=3Vb51(c[!5V# V&@ Ym3i<.OQs=~yƲr~=+T (*G#N 5鉬(Hsm@‚]wAX(Muk 41 CB8?m)c秧F헫?\Nsi*).n7/'WSSb:4˯ u5+|fE7`Yэ۬FnVt#7+Jyg(zey墩جϸ"g\UcQA*lʨEҡJ<%UˣFQĉߨ *PSwl%[E+RY2OlrӃ,ǓĴMYJnӞ)rذhJ [6EӨe*uoMf P#d*HijNX{V#ZipΖ.Ox>ܝhd7Tyoshimi-2.3.5.1/banks/Guitar/0048-resonator.xiz000066400000000000000000000162501506652756400210570ustar00rootroot00000000000000][sF~qDDUޢ%ZKJrz_P YP +̥ H2/I\׿}| q8:th\O|Sg߳ŻC%/7r%oB)i898 /T~e!tjxys 7l6=<~'o?]¯/A|xpd)ŸXy#[w#vx5ޭ>=ЃXIT0$xy(N "/1T`,}}Y]?&,:5~dN}/79ևA}|n fSEScs?rQ`n̞A EE[$g 'SQUF( }1[ot6f<BI֟{'iO*J4$-Ҽ[ ƒ4XZGtge?Yl±{_\;}42"]*qG ,XL % )."&El1&"~\BvO(>ĥ á7)<F'^u:{aGO\'"nz.=l}o(Tn@5+)_L%ɋz}tsy}H|gK#6g`O6ࣴtٚYk2s'Sd(oD}ٍHXA匼\4&I¥B? m p)g[;H\61 V@O1FU9-xpyhި(i1NhYjWZM8yfXM2l]VfƪUW3>ժW W7{ҠAuQZmM4Qt M4ap\.bud{.02020202Va0 ale ale a\e8c+Sc+SˌRc+S/S\² )QD6a ;H:lBl m20ea=a=a7zZn_gal>0} a WR A a2>ObY3_@X6.ٿV&  _ c ale aܮ:Vmca˾ŽlV hav/s@Xha|ea>f@Le aOpB@X/i0X za'`L T&66ƀ@؀ɀ@_@_@_@[bL l }~Ur<%G<+;e'@Sb0&zOBk!Mj Ab`t9~Ҝ7y:612nHc'We ޕ4(8KSkSN@13nʫ:ʭP6bb,h\ jSXWrFyHYF@3XKצ|FXm9;甏pi#FyX'CXKhq>mn8hs']\ڿI&LMyMqSRޅ@L9XK@%K=%`%KyX}ͥ l0K*|IK'`\ jjsʧޔO)v8){r)a$.Q`C\ZM .Oc.Oe OqNؐ#'p9'RKC9oru~ K5 D Y‡$%IZ>PCiObZ-I ZO^Q?Ë}NiM\R o}zae@>wḦq]Q족wJ/~Fdsr !Z2ƝRV,W$ڕ)R!:(c ǂQ?#f> )V@[ JE@@P Kv.UՠELz^)s~eՎ3ZfjE*H&PL$; 4+Hr zU7AmM.oJ'őqM-u>[Ӛ&7 ~$mjv[蔶Mw7Dcz8nri%J&~~k783fE7aot9u f'6gi!vg~[[\ٞnPSue΍ӷnWƷCuӽ2M{[9g"BQ~Ea9WZf$ MbNtJD1"_V 'Us\'ژ n̹Z|Ü&w-ՀS.4&!Jp01*3 ͮ:(kd]*yxE~ݾQd {r(4&c$>dC<M'#\^+mX)T%Ek "(א] a_J|tQ7f(%[%w3^ݜ82hRG=. gjG |=:])8M3Ѱ\|?3јO$qDc7IqxM4Лh 7Qeޝ9wr'毊׶Ăg)bSy9k>#]?JCP+yTHBHș$ʛEcH2⪰Ә3$Otf' :'"YY4%,)'24dL*Xrl,LD!sR>iyLýGx`5FAz>,u -2쌉߂T7uk95g*:ȫ]m*!TxJ՞kpHF üe ȉh4c~iRys?i 6>zZ~ 9>zczS>z#J40N~5-)E>qH!:6oW;Lam*+ݳ 3+sdF6{fF ]|,EU Ԯ4u7O4|}vyƶan#h7abG,> L=Gp,r"6z_yP Gp߃/6m2/N)WT4h0W;V!l=Vs8yFrX6 Uy?ۺŵ6!uX MIn`ˌa2EsO" $V yc So|WPUmWUܕ4fW9[#V?i4 }Ђ7mâӇ2ttŬZ'dĪxnCe#VEz/n?]e9u;qJ$xP(z{9 ^MFIaRb~3!pJYi( 74LQF'5c6ތSqhx%a4ialNZ(@TBrOID-'좎n)kD*{v7-H0i] E;h`K2hhL '5&BgcTgDX5U a{ײo]\԰%p$i`Ln 1xDA7RttUu1/ f Og[:!1( a_ #'}uTJGctW`ґHMmE^T#eR^JH[n(`34zxw#u$i C1VP:(Pm BtD#9ر)'R^[vdu[CG:tӖҎq)$few$us˛Ғ^JI=L0A+@Iu̺m{(=@I1 (5 9;|W%'Ze-=;o!M3 [-JMbIw-CT#v7& ZCۖs]c &a'CR\^upAtaE(%^לҒjBT%+y1PgqtZ 5)=I"Wmv>1RYP\@+#%uFIN oJOrks޲SғZ+I"˩ Iv!JOP RJOrM^l 󌸣Ԕ]imLjѓRyZUOr3R`ϺWiJc,nTL ld7l sZf%UEU(MU, -J2ȤGݰ;Y\f&դuГJsKgDÿuYLiǍƛ'K-Z߂ELWw|]O7wس3A3'<2׎dwĵ)F;+KL78vh'#eηK;fWVfoHy(3Nι)Mv [êpn87jVsZ maCKBC52Ue j€#X! *\*D *Ɲπ1|npaɚ՝rs7?X{f }Ã/gا٧ʹ{6-SR02 ]S h׵4M.T\WD\xtm廿~>>zFj}֪M~D!o,g}Z\]vPp2ί?Ϛo/7ecC8+fz%[~74=*vu_w#Z_8YdSa?ksvxYˣc7wp'V.Ζ-ng_{7wv>>SsOj̍=^]D`ᆋ_yOl}]_Wwˋ5#u9jy~0euYN˳?No I~pI%}Y8Yi ' o|w7J\ۇ-7^?;1[2/ χ;{}mA7au$3(3G0zj~U O"I^Eb]CБ4k"qt=^ ^3aPY2n׫1T1/4"+HTrc:7G*Dn7zٸȥii[};<=1헼r%9-Z Z7gNDR6ox|:",g>nxK \'ICb)E=ܣ@G On}Mihj[M9?I̾SK<@f.ib[M`5g2?cgL$N?ķݻ7׍(fKs5 Kч9bDȶm# (kS.]?T(扣SKDjCofu9<8pC%l}#ҝz%v%8GdI֓Cn=IMod_'iĤrov:N){wߺ{w].¡H6I\F _vUd萬P-ȯ>bvW7;+a7;l̼ovHɜ:Mvr_irI!av0Q/쐰X;S9$,Q0f%;zC_vH~C0f0f7?Fˆt\¨=HX K#aGc$ }/?F’H%/_v K#a$lH9Gc$ K#adϾ|ٙK4?,sIr.wz7kv搰TYUCLoS2_B!a#~2׵ι+CI`?/4srWB]+OeCLҽlW"NFJVꖹv6rW"Ђ•v,!KV9S?XᐳR}Y3-gCbVhrR8L!dsJ.MMV:$Lȯ}ôSU$LSdԱQCzUR:vYKnWJ_;!ZҾrn9!hw$M_K%kK4*teC.ЕW;Bk%M7T0s=󨬸cўb/q \*+ W+4UEU) UU*1i*Ab}HcU/(TiQfbT*x(U6У5W݀r\\[f]R]Rջ]}ל]*Kȓ]hUC5UDOh5 zVUDЭW< uU >"#_S̹vȚzMUL!kx}]+ ]ZJ wdMՊKx2#L{Y귻 j@>j\I_www۝IIG #WnӼUa0ndq˞q\UFj"WuU[PqD3V]=nH5[ *#j8\8 \55cJ vpUg*(x6r*rUM^#xxJT'8ow뼸n/{1?e;8|^6r޼k^}{z?~Ti/ĜdBI>zˁermcɝK>C%}}'G]h?ҵ+]+Bݧ/yzRI'['dG9 >a0\/ŗ3"b߷jQGWEڐ9 ֲAW*O0'>F Nj;|u@Jjgk#7g GB7n>~}r}D.c~ƌ}N(@R?q>>$5}wg g0u>RKqӦg񢌋,hl)OշEbQ:'dy4 "r9u]'i'4/q1Yn]tȳL"^ (NV]4k, N!Gq,,ɢ}\QA}6K<+J1[r\ew/yd8D#؄\^r6mYV e%T*C^WifYQ\>O;8B[uAR$E0ۦrҼ [^Hn20&FeH篎>*#2cR㮝jC7SX8"2RMؗmb.">e,[N?D9.䨹PPrIT-M04"_f!_$I&i4s B&;aJX%71\GTB*5EST7p3ץgtF3iƚ+j4p%yY1+Qe/[yŨUYiE#k~|3Ak}c]YjE$l+t hęCGN'h67}~74<ɋT Ut{t:^~A{&}XWY4l v9p-ףAka,s0Y6"#Cah Ӷ}Dfa1CB2 >V{Jbb u_e baf;Ca\(\u'}=bn'Đ/y.UlH1 4@z9t,eT|)?i~UP0%e9bI ѥxLS\68"^9`tA6 A >]S~GpqrH׮LJIQQm4{j%@v D101EXT#bS<} [FO0 h Hts"9G亂01c乤:4G@9tF\rnܦ32o9}HXi,*2SE+8yXdS]9τ05U2uM\I225)d_. HW<I{O@Y4$Q]ZW0F7I B?Ybp1 mMUz69 (]H1MG":_Q(k8Jf-70tK=F{jb\%GB?H3 85&uQ;ҔH䍆e*^E^AS=cm 1i4waTg"xdAz`jwODx~'_ D`FABIl綔bu6eeY{()h&S-um !kTf~=ec)yڹ$}NGuU]I왂Yń#]fV̬1R\g㒹vb2(;?yV#|bkA*X RJ#*tbW/\M{JHVJ&e^)Ec:н,9#7g` wϸ!>C1g[`)RlǶ&e-SckAV6@s@ٓtAg7`Il}z=Z @˼V ~\}ɴvbYs+)}yšb{+D (;RTeG,Dnp<6 /ysl94  ra֚t%Llu7qW˱8 S%spH3ER7.Z~kNLRa=?2\(H2j !I#獗\dCSQG5+Hp?su PC#:˞Y!aRiAl%*3O{q1%@#?LNGBX65 ?=R2 W6 ֽv:^YD*BB ztvJY ?ޫs)n Rѫ2~/e8v$ܺ7xĞv!Ѡfk]U0E*%z{C[fiAE≦yzzcSphɓqJX/̛C`EuXt!0}%cRn$hB& iNs ӱgF nw5"ZtgP AuWdдYLPfd~ f>mhG Aӌ*U4@dS *@4FjX%h1n)?y;cQv:\5ZLyj_ڶR>RX[-0M]F%UZxzF1ecA>凭G$+2.Jap`V.ۭ:-jӣHi;p/xdjBHE(3 tY/RM5;L{v @?%b:LlSB[ڐ^^wׯr2mOqE+LB~֫fH=\,5Re6gf5 BM4=NPp)ԪQL-`dmA}XCMp=kUkVh˲0ڜha98BO=1"4ta%ބ7(zM mzf)uu}ѮE̢ xe|zk@5Ζ Ӵ!h=X޳yQ[vP¬XZ&֔AИB>M-i乕5shG&{1h>J B6<:L"-Y7QK/JH)B$*=jY;i5|_֬nG=Fie:&D0A5#h.ƜEñ6v0H8z= e\JLg_=I4Tu2{Akv(=]=nEϺ$3dް" ͈ݾHnd ,yAl(ܠ&H~Za6z"MOJhciwM+/ mj:k G*!͚m!l!ڨ,@ϽkttHҤ.bA5qӔcMSw:m fF6AAVQ7(MdmVn%V3؃wpxj8|BP,;ރ>CCzAK6^J-^2$3$3dl: =qea1B c[%u93NR$c J-6|ϝVm"7Ӝ`]@fU јixҢMh'1^g`ִÌ[CZe ocRQ!SҌU$-XI㌣SҤ? Q4~MQ 0DB!Zk8ޢ^IKsH(_+Cc|q2Tr/9hڨ[62MB-!K_#LS<3(h$aFB=tt̷i>5B3Z@?Zmލkj`kde |Ӷk:bFniJWu5%!,׊J~œJEͼ$Ԍ,f>6E2ˑ4 б>ɆJ9o"&w@q -~mo\ȩbr$P'nXcU—&(ekaHD4U vuD4ُjʓ|&D8{~]‚Lq?HMO"*#x:QiKz`*!)(~PO H#P28YI_(a05˨YT5 =\NZߧtiXauU);0M֗)2`$FtI5`)4lu 梂i`+"ڞ&d|/&&+ ߸Ke yQ?d`SO]d8Uk=Ze!16͸{[xi{S&kBʡ H)GV1wժiL@Q/c%U}qSKf ɆNw0_~χQ%n*@c8`& ]o\G)Z"T:Σ@ҨCd C:;~2ִEj9mI4ҺU೒ct]<,Uk1I`P-1CόkoD2Х_+#Uk1yk{]u-T(ֶYk÷"SiI(81uA$-j^{M|٦Yk!R۴1RaʠYRɳ'TӴgkh VfޔlŧX}0چk+ %#*5q\fdI[Z rpÖiA\j2rCh՚1|?\>Lw" vu0qƒw" D֐ܷ qZ!*gQ34:E)!: #

*lCTXtE=E9C-%Bꨆbwj=h)=3gF(b {4HRk- 9ї-b,_IB]vnmIsHkA%{0p @31Iд$1 =d i(Kz_T8\P^^~ZFmʠ$-"P|lRP3򬪶Mym4m8 ЭXl"C<}^lz\kfkԛ>5@c&6F@ 2ROՌwWHz05c֋fq=^Mִ5vr-iʋ.@S[JܠWSU7nqd ZRlmeh r*-e$:}¶t.QM=jM2>ZRVbZCjLJI-4#z@kmlE#l 8¢a$\Q?g:\\ E~:tj ņat@?4%B[p91hmJ>{Hq `Z27mxF$L[4MA쵭3Ḁ.z[е]WlO QU m0aTޓc-u0LnG, G#Jmf%2l{iUu M>673%'0ΏK f UELA/=\m]`pHԚ1%/&{:6PsPRc]y515Tb.mڗH骸4f0.[|Na!k0^+Y3A?zRv=y(هzڌgR,M 2ȴ% h.z-'Я򆣳А{FE,Mģ`7@\^3W<7Єfbj>QjoJys| ;yT (d{9eR ->i@\u31j%%$omLT2__H$/Zp:8D nfo!c\EmS8&gdG\6\ C02ۚ` <#ٶ@ 1A{>_8=ٖ`Gb4чKD:@0m+~V !! oGZ@*Jd{YsLA@ )G 8Rs; S-5RU@ 3n{x6^2k[óieHY7"C:PCȘiC$!E]#o'B]j"Of1yBGlF[^q(#ҰLGTjB#~۰pL]68 T`> P% fP{nl@HI7~BAwI r]?qI U ud=7[ 2lB0H"<Ń egցA:lhȸqAMƕFdpDh BQF1=2e]޼&ͻշK߾zC-VuﻷﶩgWo߬7wϟ翛Q&>\__.]]_^r_ܵ/7WW?/8t.zxy⚶-?_\u}֗g_w+H Ezu_V.>llݷovɦ}]ëW/W+6\swY]v@v۴zsvq麮o_WwM?ˋ5d󗩖盃$E—4~vzP#}o RrUaj*)FYV7;JmmۇXx={Nr4нn6%Gu CP>/Z3jwBa}u\C^hwǏw?>j:_oN]n˓+gdͯ7ɚl]LWߢmzT .ˋD9MsIOٓfv~qp$8!39?q:9M _ps: ×F\؊T8UkpΒ3/|/7냾Sp1=A^ͫX?]|v%="#;WwW˻L|vv:ܮW=Sy&tFvtvk$B,]xn7ٶ5Zxx{r%ɩܮՙtqusYt}1g_6뻳YlxɆ̷o{;޹i6~mET$my{_oV={?w_niuly͔6|Wg7poZG̿oB,w__Zϫ˻Oi(2߸e_VF4补z9>٤ivGFރav_j&Gn6Z!O5(ݧ./?^NٹYn6HxA_ =K 74v35㬏To{Uc y]pBk< xJ^O<}X>GTX>넇O:lc9Txd˞=毤g dLgވ͗簦pÚ$Ú 'kzl $͇MX$CQ,a1PIzJc]?XKKK& ljNFtzoOZ? Byl r\Bό˜0U]ό¶03 6$yW ό6#gF({N \GFa|| Cp\xx 'dq$L٣dDA Ɋq(fR <8Y17 op݈--čj&!7*y><$wU|ۿ9{_SY>4OGЖ`e,uϩ%h C!ߌ>Mќ-y.nlq!"ihv} ?|v%Ŷf˒=Qvс0SffdP/a"|"K^BWYV+@T߼z~)(S".X^)4a;0DMryh^v{O)pZ)Dz~/@0&m*힀1t( /(F0hiI<.$Uw9J˜7wu9Jsb?~$|j^O2 3-f?p&,5W=1?_M2] 3%sI{.DOL$ Olǐ.dZ OL\naΝ@lM2z9'p6g&IcxgvIvOF%23OANe( lHr:JE/tLԼ 2"" o+E44_?R}pIpIfL=5/̤ޙ`,Ǹ$՜tmd8N?ɦ(} X) xO,bs:JT@gﮉGi 8 ؑH( cX$D( 5.G$0C'@{bYUWBI V>P'Q=tMf/҈ &D;adȝN 4^R!ꉅAt0@U^ `ʓҰNxJ?5|+а|pNxt@$!T~/qKEh ܔCIethgr@?\v2 L]CJ~7/9kmB0\;o1x1_9oi]7fgbqZ^'6}q:{8O{Ήubi|yhl^툂'a5ÌM{(}Ӻ_EkǖM&Ƌ,K̈ByF0[eyi0y>ȷ8mڳ:Z6I%g-YL2]ŴqK&!{Tzy|y%|:x%eL)fy$JkR6>\Wa-v(.MܕfP F-4ivqt>"`y'MS7UJ}&"L'07FzC!'IQ:/$]}?8'vTgm4j_,r>W\dB1ce@ے=(w#uǜ~J6*.NsDl.q4Re3, ?q}NrBHq^ 9Ꞗ$=. /Rr)He> cyqشE1!} F! B3]qgB2+8Y8ۂ΋"RI띋ɅfEqv"/0,8myTf7'sS%>;xV:7|g拸 Hx-PDG?/ve( IDp۰N7·RD#YX 8$ӅQ{xaʂEVŗ벶/WXı9&qG3hxJfceEdVѦn[dGN~4IDdXtd9|1km<)<[rFE n/4))<"W!>)UgeK\[I)"" ĸFy< R=6\BHA]L :59ϊb,bM/#F0/$=%Ef@ȬY 4_Rőb4OuuJѽH]-WunB}죉i(DG՘B3}i2 (M'KHy@!M$4WW&'$ cK\l=jHL:|$U821Y9c矴&jnI{ln IciY϶CYƭaQ%_Zm'+1AwbRQl8I=Oո]bOW-(!dGڴ&aOO>|uS6Tuʘ "}E PB,dNEi%~!v?#<=&1~IF ֯,2~Pij-^gsdR{YK]I|9b/bUDK68fz  ^m*{1'A^b%qNQsy ̢zۖ^@Qh6UU~ L->,YOәpLaN`hs%$C“Ъ8J C:X5 2ͱ3[b2Gtb`AqxpBTMM C)FjOtEn8L;1Ѥ2܀gT.JII\P\)@%'9 HvJ lK))\DU7㗜Gxm1#5fSv%B-% "}=2|P)2ɚ 9:*2Т<O| _勒{\m9T½ydGDp9?oiCeۗ:BߞoJ.rVS-_g#,% | Aekx`$CRpr$U ^B`dAMr&fI2ڠZCarCX"'-n .d&dN_<||pbS s P\W[E~'HbP;z 5XR0[ZLl̍Kc١ƣd"JV(=Y3",S]$m{)<#ԼPzo,;Y@4u1c)JV8^PvFD mr#Yjjuc=-K0߂,WT{ʚIE&,-aϤ|IE€<}=M A5)J^ yxs!wAB ܅Au}B `P$3gG Q$4# /M+R)(cj;(K%nOfw>;8G)PN1i F$1Øi Pr48&GQJbgF!jF# 0, @XxvlQ8JĦ}Y)8Ь(u@z !nL |, -l$@UfS!ޮ eTgm}AIK5_A\h lX`u!Z8_t]LK53R=&ZFT c2p]aJ wqvZ3tTŠ@F`HcFn{w?G|qN ddu@9U8_ /^5X[ @V$α;u6'D-bqΊHZza^ϰPdvh2v}4]IxPҧQ*׍Q,_݇ڣ?vGmI6E:}Ќ˪Ԟ b3HO}mLO) =Q_Xu j3]4GhE<2i<~KM QRn2ve'x:[{Ane+XC(pOuZjB`hJ5i.&o3&j4͞JOgiiEM}_0Po99qR9yi7_!YW cl(Xe6BԟBF wUzQi R՚YɨOrLkɾZϢUƖ,Z :AIZɔ7&j-n40xSҲ&MªLSO\aO:6IUb}S2R!e͇$rS, {  Ӻn(xDתUb&[B$pl%Cr:< V|j( @9u^y%1RQG"3ds@8 '@ǏJG,maՕ@Lpsxz'ǐ˞L A06tBMןFJ&&ctF ej:lN?rQJTM ʺn†ur_9S48$[ V$&l]Q iCg #T4&ł8y+5Dq/v7CÇI,D5iKĂJd/Byx1Xh|k@RN)p$<P3_VC[SL`(l3w?LNLWqZN@ᬵzAe)x:  LW*ج:0/%`];HtQ>|1P5 = ,ڣSz 't-cj$!P4 SlW ~I!ڦQ 0[ŌzߒΔuK ,9j f08O5:]o>cZMҶqFѴ5`eur)[UQ 5Q[z@h!K ~d_ /BELxǖ_J/}BhC4 ̱.De鄣Hj  0ؗ]56fZ$MמJubF[H2 )kb|SUNlLmN';:a墪&x6sT'/E ]!âIbJ2 Qk5 2)FMG"K? P]{RCHS D4Z4YcƮg*hj1CMŒ@$,dQ Rs!gFݩ `&[WLD&Б`:uu5ʊt(f-Q}sALTNM9vfi4srQg@N| Bj˄r .4Ξ oC'jK:TAW5DO 4sVv%C ~WN$}vzw΄2ubݥ`n0~$ Ӭ`y/je &mO[ Mz X@V:]ڪ!N5|h-nCy#@J8w2/j ,Q+`*T\{aD -HjqmRl0N;<Ѹ'% >6^&"cܚ*瞒 [YN qZ2 sٚ8y,mۧf %9EMtz`pzB f3q΀T)RRii.[5xI CeXn u43\j&Z?QYF= jl);?i\^6[g!T'ʹoj>J?ѦdI  ́>al^ 3"H (x@( et[μIe3B3nH{u\-wXU%J]U8cRl-4A[[ژCF՚L xSiZJPf؛ ; "qIۊgDӴ$i}e.M}Maٵ!; Blͬ?nk">U:U!TTln6x#4xJ!S'A_v0x@V5]z>݀nvҶFKU:3:Ԉ1ni6=?#TA_hqE m%VRO%BMɞAyǐXhCkƓI8-=] e;2cVLAޛ >а݂!KOx9`39&4}MsK hXPXGP,VY3cria3Tn6zEf!V# cm EN{ I Kmpmudu)4 y:kBmUStHQ7:q)0ylbi&"qXnMThRc((eҹ&AXuLͳR(q񃨍#S5oSGB&X,z^҇pqBJM8 ɗ1_:T1J32 P4q=EU7ҦiΈ鴃ZW`/b{`,FOJɘ0":=fGUgՐQ-sΩ  Z`a q.g] dES}qlh!~g聞q=mOO8+|=Vf34ׁsݚy$gY)i]"CsZ=:qlAa3uPĄV\_-! ~ei܍hbF.'NX6Ήu[?n޿zͻշK߾zC-Vuﻷ7g?.h}rwW]4|OxO^]\ ~&i{aWקi}y}vuyk7fͿ>\/}_o| Io,*K n?5wwazsvzy>^ߞy^6[\^\W-o]fUO?NorX쾷!9$j8Z" !hV7;&(.ÖG,_~A'9R?^7钩|B!)#9'W!u2'?ޭ7O8O:_oN]n˓+g2כ,=k9>sX>C[M͟*%Bpy覹*Ν99[m?^jWG7GrCI:̏Aڄ ޼AP?+}0YnnWg?#7ǟ~[1u]J/|/7냾sBNp[{7c|vq7yՐ\ˑٷ?i=|6v:)sy3ح⧋_c':#YmNav45Ͷe W- ɣ[~Xr%ʩܮՙ~brً0fF~,.fVg1'2߾UIkY>+]=ҵŸW?wV7G^6?neԭCw}2Sd=W^Tī> 'Kf"<tjOvтy2NDe7?]'h~>]|2v=r G_>I/ܐ6ArG?H==?+OxrOx?@ 'C+ێ9}{Lޅ?*(I u gIN׽A**~BoUu~C^6AD3jPyoshimi-2.3.5.1/banks/Guitar/0065-Clean Guitar1.xiz000066400000000000000000000045071506652756400213630ustar00rootroot00000000000000\Ys8~ϯ#QaU%RlyGͼ`8H-Ǟ_? ^%9v&q)l4 }n,]д~i7̳}?4o'g_?{͸Ǔ7rE|wF~+?ٝl~i'ǟh) mژ}p׸ݭ{68X5D(ђ# dz9_Mã[9hM9 1F S/n?i=_K|3ұΉ[XF1GxHdGu˄Ű7"nĶ!ٱ^y§^"lb4FW70 3y&?SI67D&xƼU5.ty3gn~<0pnD}+(h\B!l=X!qԉd?.x[m;UHq2;pE%Z9`xiN B&uuxbgBC`Ig0ƑC8\#_S91}ٵ%3(NOY@ @9}o& ch?N(v#;_A_Ps-$}uh]Q CP Ʒ艀jR`[:ƻسy=aJd(E4]dTe[sm~5,`<}|5[T=Z3{OpQHcާɧ:{*KzfԇSF1aV{e24b~P%@eUD!V.RUIP((B $˘*`Ky,r,oasT"f3ϲ0t*\5Njt4=Th@w~MǷQ #sC踅_Zܗp;XE_cm@(r3.Q$:8JI # #ELH* =N2Jgݬlq] eM`?]QiV۽d YJe8j{*{WNR] R03lq>RDE=e 4\a ʅ;Q@%k {s7H`ǎ]#Iރ+{ᐹUzVSJ`JįpMրL yiu"#c3AU5<,Th'4hݐ#ԲSc}%AR I{ DuQ u+]?O7*1YAXCw N'(%iȡAмj2lh~=N^^wlvͮ>r3ޭBWkgA2SFi?D־,TJ'#ce+Y ؇.<`xk 0ՅzJӕ+ KwbĎ &*֦Ri# -NCc4*c0C+Pq+ǸoX|EV]XQsQ] jP1Jcȯ__ ꋊC 'I_4d YΟ;8==P9c kP_ѯ[V} ~N=5A~'o ԋթ S_E4+>;YN}ߠ|נ^)=#V1;9Ґu'ԟ{5A=:U_:ZgN}r gꫯA|N}5/覄{k[|$m'qq䣷,; Iʗ%w n|Lևz&Ck񙬏]͕{f<ʯc}p:X5?GdĶ^1ʞד#zŐ^ &5҃|?D)n[k}>×.8L2HJ[(o峼lYyoshimi-2.3.5.1/banks/Guitar/0066-Electric Guitar.xiz000066400000000000000000000054771506652756400220220ustar00rootroot00000000000000][W8~_;ع 0gz^|[O'vvh_e[$zK]n$~ڬ4];m? پzͻɰu>?[|4xƎs[^~␈⣬ Nf?qIAlDvCxFB4vD]5n܍{jx4gd ShOMtv1/%u#z^`BzOil0/ jW_U]g-yZo'f|5YLnnӡ7ڸk&&ia/nd݄֖QPU,|EW+j ctUC@~D>Ԑ9 8NGߵcA[Uj2[0qݠ̌1&k޹ >R"qrOJ\ZsfK-i6I{z]p?I@Qʙ?}^ | `nEt}:'VQ^L/#|O1USdx)-a6xdi@z!-k}d|3;P{"/wmEHeBV!Q ZŨ*cK+KnwF"p6QU~v>S FHd?kHeGk`G.z=TϥhG; !?FV71TκM'#t"VTһ"1#A-N"a)BijՐ/z)|>E.Gjf/Y^RAwZ('~w G/MJ[b$`[#rLt۳D䩔 -WS$D9)eZHD-@ }qf]SBxJa(AF=NȔ|LʧAJ>)kG@$G>)z8LUYvF/⟬ZR*4Kp4-GԒR+\}@*r &(7`د[ze!7q6rAKvW1Vj;(GƢh+6F'&1:Ϧg^sl%vQy+:Gje~v bXYUwDd3)ry|5B[nXH>ti%NjCD$Dy~<1>]%XeGz鄜nJ2ԥ ю z^Y:I:@%\MӆVﴈʋA}ԋ smw꠾pi)⩿NKԟ6m[o3wZuP_RKAǑRg_+-) \3e+f՗ZaZz\++5OtiQe,˷[zkKp@XX19*19CNJ!5Gv}jv۸Y$[wn~? ixqҘkzl';Mzvsw5~\o[7rp܍9_ޒzw4Zy·c]ͯ^|%w||?unwvǍKߡG gE''&v^ADXVBhk*%rCCJ\T]Ydz[wt?4nst5OzgV:?i% >L&g_&EI7?̓E&>G KY׿7 "sǭ,KoKD&\dMH^^lu>_8Py{EZs1O5WVh.&>hCZlqrų$ʕ8U_~l[Y^>Z'|˚WfW{{-4\_\iBTl:I(, Zž( *wun]Bwd/?+H#Ø-BZ0Tzd:+AQE((S VP笺)ݖQYng5lMvy0?+%էБ*$!;z\9R ` ǟ[tkiCYxRfm`@-8xk-a{B92${BY7k4/ |h#^ xA iklFykDhA/ j1k xۂd]c79Wr ^#5tڏ~^e/bzQ!wh((B%F]WSɨ)ӌ*Xk)B@W)ٻY3{Clqi/Ln/ {B|?7DRͨ$Y!H:LtÅ:M):"Q\aγC]^$%β2R-r"ʉ^szysa bT4 ^RSPX21THW*^҉N{'biq"R4 ,IQh*Ï2l~o[rND4hXOVJqJq űSZžMLk_ ԲY4R& 4xg)gR[SɽDB/ހ\,4 *taT(39h>|xg,ZJu3ڬp7)u#qaT-ROvf񤌙 "%J'Tg V%v)D.Q顸][ǩIv0iHt%0 BpW/N^Dewv7zė8INM&B|LI<LC܆U% Xz.(CR-B7"bJI뇿kKռ%nQ=&lG$Ea҅-Cb@БQtHFHa Co%T4Jآ=S QRgg7---,ˇSOŝɩA)nN&6Du+v:ףa~ׯٞv.T"=WMQ{2O %rٰgT=}OREGٱ/{UFWI(;M`SRP F0ҩbdA[1e5gf < $I"w{R)͜}Ge$nY*ͽrX+FUu*$ITTÝmffs[gܦ ]:ŝ^\(iW]Ըu.) 98v=Q<u4cՓ>֒UpFLBYf#ex7r~_rR{kp'Yq {gn/~6@_Yw}"7<#kVgtIh@)<UC;TCyjsPu~o"C5wuzGqEo&+W6SJMRxxߥR3Ġ%Q?:u A$^|ZJG+k+QXw(H`厌+W VnaBZ-fiz~j.H~jzvUp:[-_`|bƿ~BOT([w7\ٌ qCiz7llS:DSG117 xI$YywLP3]L[< Jem"! 83\?p|˖- Xh:1 <' %UF07l+M pc|~y6]\=>\s 6$p6pHy p }IB|/WBa=]<:0,:BPAs' HǛm9`W4F8@/\ĕ>ЙqOxGu'Hsۍ<V&&gaˈR |=p'32!L&Y&04̰<'zYK='+JbaqVVC@lcRۉk|%<@0vK,dsw \i;hi,_Tؽ%YdԷG#j[#񰈥9='^V4)AW0(q6w%ᆿZ!HA֛lKOfd]OPn$nXQ]Rj)\h rC7$QL$wuґ~o -I:ACաO u cu>x7I~rkN~$UY<܃>vu0߄> m^>Vc PχO*Lπ 8{h4?ީ,a.Im T P>C70["a];IDܯ928  ˘-rTMK+a傼#8M'ag30o,@YB\ !mOWg:c1h*}gL ^MXCӊ)C-%?.N]6qؒub q\޿H$tM4Qi2vE"ωSD&R(L1 \=-P/Ʈ/^f+f/CK;#S_Qb/S 1{-$ 9CL "Tʚ7LKH9 |EѸ* (Ԃϩ8lceU|o7\| 2N!SURWQE;h*{wDɚ5Ű&p#UBO Ǟ)+J`)F u_F 0貊Ob%לF6=)\l~ !#uK]VOUYQ\rl$k'UewP^EVlNtM$q::MY5/{XВ7D]Tz0oe=BM gV^\J6ϩZ]@\(Xm=uKŠ,hryb52R[yjxH>tid’Ѡ s&Q] eO~&H<M QVEaLz!uiGCT~F+kgЩ'7CSev?4lX,T٤ow0TReH{Nf"na0UI9!'ï80o&Nf(Kd^;eeo^fepY٨EHYg `%l{m(bR6: Qv2Ԥ RfWv\JRV2d2TMtgNx'*`cjRfHBYMRHBʚ3?\lh4Ru3T,5A}ISVWZE꠾c龶3zuP_VWZ ऱSi&+3*tp;R<?sT|wCgaoUցmo=µ!@N}:Gq!gL!;!'v}k|bוlWse+u+|UܩZףgՆm?+z. w={NU҃xN:THlB)[O#*V 5K^~ d~~G[ۂO oW8}p4ΜtTi݌ma]v4U.8M&m gM2Y'^i?T,.uM]lE3};}^^;eod| 2jiuCVs}Vxi+ew ]W5R}*)3fi3ztUcvgLp'Q.oedbyoshimi-2.3.5.1/banks/Guitar/0103-Twang.xiy000066400000000000000000000110501506652756400201030ustar00rootroot00000000000000]r6}ij')̤\/jXDYH"R;_M 8Mvv$p8h4zZ[* ݁CDxFnO~z|:i'pO_xxG* uϩ(ʸoD0PgWǷgWK!yҙNAџArjo~6bcOǦEڭoFާftDž-IџRXI_4+^[+/t^% `: R&R~dRfe8?v\IHnEaFtnn/QOK%)MAa +=sC7|`˚_ēvBbU$S_*ka(V* nGp ^EԂȿ0UXRR %x.|YH;0 ƒ5*Y4w&r$Iy}n>Xuc<'1/pGg/[ƥ4Kі_$^> } '(ׄ*H6y 8L=D.:$+(aIB4–195W`⭂y'%G-fFT?CҒ{rYӾZ# ~~k#m_&ge/Ng8JE[O~&:?NdO{vd%d2JYr𝔒ƞiMI/0]>tk29A'܇P8J\Bd!rQi)AOG]| ]G@ #_%W) wu^*IMUt~.ueO_\;iI;i]5i'!(6vrUIQv2NsGz=i}:?ÁI;uNk'r[lfک:m:=;M5U O:(mSY~<īRk*PYl4M,&i咩D݃=~jҕ?R,y@tM<M&F] K>'/_DI 0X *Zx+x$:$pveCe2sVİzTo4hqL~+r*Q8ZLoU[ћ yԟop.K #?=+ۙtuvyxr;Cb7rl{k۰nl`l~oߎ;؜V`}{fŒ}n%G/>Yv0Vr88]b`f@>G𫟛{ +,5 s s.>001ܱVa=]0a 0Lv0`paNux0`؀Ӟ]l-o 8nwx0`؀.b F 㤪Ƃ8"U,0l[V`!`0 6C0 ƃX0V 9C ca,1Ӟ=0Ƃ8MƩ}X0b8́8mF c[F V 2Nfa,1#`0ƭtZlmLe0b2b F cae@&}X0b F ca,0Lؽ$a<0`0 vqC0 ƃY}x0bg>tXEm16b F ca,17aQ5aCH4iB2ӄeN ͜N9&Ds:i 50<qE#>Ɋ8MLy5A.h5c|&41YaP֬=mjdڡшk,1輠q]Kx4!FAt_m5v%Bl0]=vѹAQ6܀ vѹA 4Z 4.:7`]tnPn=Elh jj~n{E5 st\tn^"qѹA 4Or]tnPƷg@G#&w\tnotnPPmx4g]5PV \tnѹA 4k jnn8pȣtj V Z 4x4:7F7C5n5tnP+:;В(QݿB %e$-+f^p%KJ/ޯ4-;2* G G6u%-zTKRb /z%J4d+5]&'_OeIkRfr ͢*3>jg(=Ғd)f=ޓTJcJg(+FU2mŖIP!zZ&r*&+7 W OeJi=+6zYo+rZwg^IЦpx|}quyv%1*?ny[HMmfUsf)<2Yql9wDJVcU[,y/3}ڳ! UΠץ0mY|]=]}Z{9/&HʰP[μIsyi(hN.o+o.Cz,"ǨeMr7}+V8@]tlHQ=/r,cN):nقSlI:6CvU2ic|Yߞ]^{EV-7wS<؟Qņ~}vt _MUr~Lܫ|r;5q}q,p駄:uR f$2vW 8Yo~HaSL ןƑ Yg}Ll7ȏQ0M'"xVyG瓋l_Dl`ҹnwvǧCf,Al9]G:9ZZ oan-QoŔ&O+?lK= C>|`_gC5fEd&Ŧ(RQ\,X{v;9o7njxSCna22TM5&QP:,m |pWD) a$R'cVo\iܛO53W +\O2_}8#y;{**iP gђrymTy\KeG҂bo`Ɠֶؽ_G:Yw L.~|6_LGAz&1A21$:-D#lSh=g_^\plAM9/؝˚Կ:Z?4]@woJ?\̵1Ns㇭/ff?gE/; =e- 57MޤOKTJIm4NՃ:ɊXGniӚR[A1.gY}J7ǂ>QP)BR$S^Oqrqd5ͧ}RR"#7U=}v來*&úڀ\Nڟ;6jNi.~ީ?R WWZ,ީ]h0Sw+%k杪ٱӳjsM0=N;k$,-S/u5XZl4OQZҊ%S-wf7Y{%`X4_ `4~!ϽQÒɳ; r¶4̡!"?2ٴ)PyELe'7+5P&#N)oEÒc}ukZLouPZѝoe[lqX]vqzԯRi˳R)CopG2{(U6U\R ulX{6{>;،V`+`͊J~}$`@>GK!A`|?3׀de@0޴HAA' 0l1 p tժx0bGO0LF  &v0`ؐ=0 6g0,}Oq3Æ{a<0lF1#qVC caUQjC 6ʢz+Ix0`؈[nx0` q ` a,K+F#`0y>b F caߦ>U,1s[6#-#q+n`0ƂX0b F VI-61m1#`0.2>`,1#`0 &س$a<0`0 vq#0 ƃ^}x0b>tXMm16b F ca,17aq7aHDtpLtLtLtLtLtMt8L|h5 Ɋ)D%S ?f ⯁F\26./G7̄h .thVL=C\+sf*& R#.!z]x'@#m7ə q7C\шk\RX4JYqƅy4lh5ƣ_ctyt}&؍&ZG<f `w$ToϱTiF;G*y4Sц-踊|ۈkGF{솿+m#~άMg:xbohg=X"@ 40VC|jFI #1! v4iiFضXmv5 MЈk|ۈkj@1<qeoG#mh5 3hq]Kx4#Fh龲-|ۈkJ سtwkA5FuAk@@ } jѭZ;h߀=}ht39އpоA 4}?bHoP=G\@#m#-&шk<]'=Gb@5o5E=NqG5G7U+}>hoP}ml.&7#m@V 5 j avоAq h{O?]LW%j7a@8PAT1Bs7^L!I[YVZ\  ^}O4Tk2Y4e-[[\! ԰JQ5j y׺*ӗčiP̗lm5خUg%+ɰTi(=( 5_2˛DK. tIQa*.KRY jW.K*O"m2SMRKwjt(pEE[u-rɢ"adJ5AϤ^IQej)}uK HZ$5*͘!(Y*7=WqYew>t!;qO3K1S'RںJͼ*# ԫ煐S5Ձ `#'ov%p:ڜeݝi+N50-$ *?nyGHԑ:UrھxNC.TűiB%Ucƪd`ROr.h̨V ~QlS LL{9:N󟚪8ńW5 eMm l/kZhpIJÛi.ޭ.v{`xYU:^*$h|z"ϬG;~NV]{?f*矟x)U#mRfҥV%&ִ&YOY]H_(5b?DY):(\q%Uf)]TUTy코;`w`P==KTI!S.b%M!8.>kǫ?%VU 7{([x^f_T8|2Vٓ)+3Qk^ !1孬|KEnS,~"~%QԜȊs!i+d%KE.TNE"dmH%˓)l*RM;TdG]:P8e*3bUMow:\9.7˓5py@<S{o9Օ]NE=%C%x_{qp~UދUZeNU-@a1?(~Ai^`)7X&tQ8 +T:QJjjotlI:P?*Fob_'/Ѯ+Y6W9𰩽7'䌸ʡ]k?ګkSq V9XO>dҸȣyӬf?C MoZN( ιh?q|!T=|ɛ){U7*iU,C56#X D~lȀ鈰ի6e#S~*sVԵ檠V%٨މS0gB-iWio#:S;Z%T٨ MQSx"UbU\vrz3~rc[ʖR-xeYV×egzEkQ'lOJBGPff< ]Ƶ_OPGzSE/Ox6ܝz%W&yoshimi-2.3.5.1/banks/Guitar/0104-Twang 2.xiy000066400000000000000000000111531506652756400202320ustar00rootroot00000000000000][s6~iwfS%3M:#Oݞ_Qs=$C]o*Hoga-(;'ZBc'/{vyzu}q|{vuI]:I8$VY4<e{YoIj-V(ջ(x|}|1]l.8y<)UJ/qy4ςE $˗ylA9# NƁ (>t/`߷'$?Xe]s.on?].oѸ wkkHt7@moϝ"͢eσ?{IH|JU8SJE͟Q5r>O㙵k)Hr3~dk|׺I 3C7BeP)EoX%:JYA]d̔w6MM)8_YYYRNI4 j[qe9|vTYz*?hQߟF']$WTwdh8 YJS.^wdj67NW'6dqY'n?u2ua,֩?<(W0ڬS/$#kguӳsڭLS= Xrg$ƹiR0ӥ4|a(41Wvߋ|TP6GTr]0NH4fsFdbVմK6ĭl+kb7z,rv68Tm^n./O,@gAO(Nό)qEC0B:(sSbY dBɸ$gk9=TW]^IˆJ\|:ՒN/w@]v-p>-7vݲ"htrY} [{젅a a # [z}76D6~w d9tP KH[pxa.^% Xa ʽa>B+ar+m 贠Eal8}0n8빏ƹ}0#a8eI(p3a0@~Cavv;y a\E'H cŠ[YN0V!=a0B+-U!n~=ۜJRX.` zwK1u a%nSdۢe%ٖddT{a6^w6e[#i3yݍm!BgX6^rC0.d"a\=D &GCC0LF `ZcrS%i%pGa0@# 6v #-#qئGbXa0xto%^a ]/PK#F8!+K#ҭFoXcgCX4CXcg Y]-G!!<k ĭk J;@a]oan==5Εx(`[a X{#k4J=G9^KPҟ_1,][Po0n5n#q %yF7 P]k Z55dC>EA+ GXc>GNC'G[FMa@q&nMޚ{MfбVC}Gy8t{-Vm6nt  qW9:"6tFР筰N x?|tNpK#ȓ:* x>0lE| n/-,2kVQth[tj9=t=iB <8`=0yݏZ<>mQF9(oz |xzPzΫ9=t yA݉ks~nsi;+xg&}tz@a]otz^S遠rp_ZGV#CXgtwi/|Xst%se=*X_ TtF=,Wvl,|.fW/ )#V\ ӷ>ywc|pPWrgvxYZvmzVΒl㔡Dy՝#Bzl8.Ac[&e4p5%:Mt2R[h)N#6$:4+iW/zhM DIklYCeYsY<}yN9>J)lz $0&)YӞ>[cYY~UU=VmLq`Q\o(.R(.w)v)6iRuS>Z~tp?B [aR z+mWVܮ][awvUovUGPuu5~E}F_Q#+ $}W8{4~W6%ZVAӥ( DqS$}wC=NE1I7]r\U;6W6m.ЩrՅh\횦&'.j洉Wjmr˕\&XWMu]umZAHsv\R!\صk\bīx `=GSEܝծCh!&YT@Cgv회4GbS#եo (X|vUw5U$"u57`*!76urCX1Z])7)Z\*\:TwՍ-__4w[ԹpߙW^{+ W.^$h ' nF]͊fy@)ꥬ=`=/}X:3Ş:VgD't!LhS::z25)xƷbj],Iw3Q[2l4'WW.|!wΨ&J}*427qDׇy#]QMF\:O?ƫ5-`q$7л*X xߥ鬄,=-҄>D@.!`6  fYPzѵBo^,efheH_ZwQ?U7ٸ'RrRePt-fͳpnl8~N{::^֝a`OI hΊMVq|SZ(6;v7S?7)aavN: =#޲H$^KP6Bg%YM*HWٔgw'V;I #K?qQRh/DZJ>(6*HEy $L=D.:;3tzV6T :~n_x4T|f(h1]15$o P߳tO(leHG<rD&FS K>%/n_.@21F~/Fxw$WpHi U[5ˋűahM> }#FJ\QP1zg) rYfhJɸ(95T]AG~4 +V #3Mcquyvq$riyw@Uv-.GI=d] /,eEh=Ze@67VAG@6vllX|eos蠔"`kxa/^ૈ6c]0^ FVapQʮ&݂oFc ¸!qֳƹBgz{a0B؎Y 7 ~!O{0v!>a<xa0^ h>`0@f,E!F) + #qSGc aIJ6ۅ,}m$g)RL@yI6x3웑ddT}a&^66e#i3yM!BgX&^rC0.d"a\=D GCC0LF `  2JL7L0a40@ؐC@/ƾ!6/K#O>hG*+т6 ðjmq6/FQZ44MFѦoЮ?t-Ҟbt pjq4F](K.372rC#دv.( .V'n> w1GXVEܪEWvؓx.tA i5v{LE~hЪ&\Ncq j\›4:K3j're~Yn֗݃>kωyi{[rr^aFXѵ^aFvnr7EVn Ph%k'BlIZyi5^aFXc?jh4|˛܅rA#fhy%_.ώǻZ;(k^YR!i<yڹ,}dЪB UOOӒO,{S)IUVjC"DlܐpIr%vhRhM|#Mj~/:kb˘;bouj/'dW3-bjX±m)L1)?/ Ze>27gS\.*>fUdvB?XF%[jwjY]}v1&:S{H.cRTH"\BЊFKYFm ^7ìN+gG_!S!j>fƤ{y!e$&AmUTpv+OiI!i.Mi8g40̑6+-AB:hc=+Jő-Z؛Q@S'J ^F4nT,ZwdlJ~]_^gTߛ ٞwD+\H/._waYoWev(l"ޒ ydf(6V_jYM&|0kfʘQ dkp=(RtK1,Q:þ3ySiYQgT+1%VtʽY( y5f3*#ͦn ?3z]RW _Uhbh^_bP'|IWQzXV7&\|xCuu+q(Sݘ:ġJ+fġ̡׬&PCZ] ޒ۽O9JX> (P6 Yl>=,Wv l |6zW/#V\ 7' >yw}|poQW|evxYZfm8<83'۟C+8e(Q^u2kOPhY݃WHtaUz&:moRhIiD-61$:o-ѩW-ZhL DNoSs-RwStӻosɷwz'VNޭ0[|Q-uڭjq.Fݯ1h+jdA~V>*=oGayj[H9\d54@-bw7bǯ%xi״orD߱=iz_,W6Ui*rIrhNq$W9\MsSׅ\4C2EҔ fn X(Ly'lA#^MX:<-QrBq1(8l">kdu՛Y78i|lPwَ{y8?4Ogդgwd7$$[SɆfS|q\AnDv<#4ː<:m\ݺ<8$&ᧉ l61ѐD#0|~}9ZL3kK| l,xvkPfL;Lfonh]OK|5ui}Lr\DC9nȓqlǂO!LO%JߜrB -- B.p+Y@#Vt) Ar ѷuĶ#&?zΒm8%Y5,o/'n n<ߡVc*ߗކq2P(6[L/mYS3e؎m<[e#[^D!{6liLNĚ.& fʉŝnS s%Tl > R7N,_k0i k[';5MY`|-~E)wzSi1.n2[f& HĵPFy>qmoMLD;|HzH4CP H -`y Ma {K?vA v.,+K3 Ĺ.0\bDoRZ.ZLD$uVPGu{ JHdb~5*)+0}9p剥 f)@l3" Զ|$B׎K Ă8l{_Hͯ{%̑ݳ([m/_&S1~7I}J sMMOdp}ns 4LM 2AfpZsh5]B!^znqNQn)9Q_O~_9;W"E]zD,~Wu*e}BEg>0OY:u͓1m;y:a,>ۧ=b>!>u1N٧3cFbS ;4Px!BaΧcft4dakE/3I1G$!8$sS86RT{)D'ohBrOV |,fK+ ߔWį)J6@BP&Rم*_f5eX1tOfutㅉvrVMf>ƚl0 E$`t<)dU; D"5NV@8ݣ%Y)N$ -E ]S nʤw UEyO3ّ 0CQYP`1qĚHA@P+)`鈼DK$ws0̔Qval*{ޒ@qiUf{2o*e GjD0de4 DLP-8V 8LB-4y򅽩<0hBSBxD"aQyA96t@Lv bZ+9_&5ukf]įl:fE%"p}M7筸Gx#bK{Α.ctEVe iHΌTe/DTP|uaYVMDfRv򢾑 Ca3cČ#U?pRvDbNJq[Ql=PG he7gv'):~@3S46t__(\nh@a2 j+L.p+e(eBtm=f&S !jma|PkENX+EN l"bs\W-/M|8 m;nQ5-}Q=gvE3[{l{?_$䥞ԙԳ%;y*jr[`gIJN5\tʿѝ>*1olc֙xK;40ѝ[4>}6v$nî9˅݁:q;v.Hr:/k}Y˚J=y~3^{#GGr"C$LW#)RAu bץdPBNCJgKnKuK|SyPE rrh +P##?޼Ux'RoI&]@ŕψH3(ב_)_NV ~ۥJՓ|q1y4]꾊6yC0U+0B9x1ֱtԉ**A)07rլU[qU &ǽ+6vUrW[c*W;UکNUvr+ՖθJ7v]xɌز#K\m7nn+eٽ.Q;^y5@tÍrDϞLJćG5o!XY&}e7wYyoshimi-2.3.5.1/banks/Misc/0002-Bells 1.xiz000066400000000000000000000037401506652756400176530ustar00rootroot00000000000000Zms8_{ & !3}r@n.E#lgi_+"+ 3~jc?Zv}vec:,Ioo;-}v1:>~xf?ϖ|*(ܫ_*E O޷-u%N덾fb-/OhQg عYzsuG%h­aT84E)A]Jij8:b<_%ӈo ./m,$K01o9m ~z>f`einmi0lp=\ gم}$Q. X^8*'5@@(% NEE,h]nSXDj<'GQ?0 ?Q~'U8^oP'z8Y`@"02׭X߫r>H6a<`.TKRGܡ s4xxfSVl7Q7v[)E~˽u2Z` c%KxmL1@2^ tjT1ޒ3$z]FcI &_ٶ ھ^ ɖ'kERbU Jli- Pl MFA ' (j&%v1[b]8==G`v=/l:_ .iʈAy1/@Aڒ( E  v1e*\e2zf,%2iN>y̡e^̺Ĉ_B5e D)Lp35 W-Ԙ/WEJ$UVY^\DŽF0I CjǾ ѭjYariӓ:;FM>F5@oVMmDURbQ*AM&h(PFJԎϚl-ي'Xw*2%/dW s1-UWGA@<-M9lÿib Z0 +5vUjSKF@jjV}$w(tXvqS洐R_7L0U 0 ,e͠V+OڥΆd0(M3M[_D|:3UՀ0C9=AZT4U(%)%(뛫!vp5^'-*%sb.E\_ 2Qh"$i;~BK!? '&AR*e14ZGɞNbfdh6_]UGhY~z_m*mf0쀹N^mW)Bw/WMq %>1%#Yzp|%KOKr_s%Ktm*mS|s?6O_Y^fBgpOgw8ӻ^~me Lø~{8,Hs8X+dMLFËFF~Q"ۘjm\Oa,۽ܱrK` "?XG'yoshimi-2.3.5.1/banks/Misc/0003-Bells 2.xiz000066400000000000000000000037451506652756400176620ustar00rootroot00000000000000Zms8_=; &R 7nro_$ye 0ܧ6fZ>_ċ˦lЉ\/|l>̇'ǫw\6augbK9ߪ u'ŗM)xxnSє1Mژ8>{4lo{x'P߇q޸>ΛB(Rd;v`h.|7iް$Sԟ }ڿYwnc@_HGFZHEljY5&1OV[U(ZʀǺ%N&+EBo֬4$?6[; ɟ#a\'bD\ is(IT 0Е!d45WE$rVQd_݄ZFVl$ZC&&. eGbKI.W.ɃYoCv4 e"8Kaĥv$fjeBo3vyx[HahpS;>G>LC!0Log F(cȅ~|JB`j{f~x|C&zJ[0dt6>+t0+  rO\g6>fUV{$;? `vroHATqPO E&dd8lWtTa.TT[VUB7?Ya5UNn_- m~'(7{~i#|L[8ˇ9G*:Fv;]LFN3!+gnpa9/C:#7Ԉ;}M̉HE2d\W );E.#蠮<' 9\2j]V*a"ąaw\u$xX=aD@*'! _!mPe[::QE'slO:(QGiucMj|5Iqjc|-Mk@r+:*Sb?`/yPޜ߮5}qgCטRLQ ֙jrt1rTնJp٭3m)U_nL}eqvTWlGP}z[֢{CΎZ$Nxd`t 빸WR#{(ֺZ'-\g!{Xl4#ݥf[TVn Y}}x  h(yoshimi-2.3.5.1/banks/Misc/0004-Bells 3.xiz000066400000000000000000000037221506652756400176570ustar00rootroot00000000000000Zs8~_IBL8s%rsEp-lI^H'fV~Iï/Qzfi$ǶnK ~~ߜ ڿ~zm?7SxWTNw/Ik'A,tA4+xL3&[4lDIi4 ᕛ,+*䊎X 7p>5M"IVL#=61_xLIƳχm3oXVL1<~8޹sw:+֖>FDxatWNj_N΢YJ8isX`a%5lK~@24K͞~$Drh0Z:ŻQ' xI$b?i*q|f'ro,&jaj,K,[RͶ>44!{ |QXLV(-6C]s{8bmЩ@ EI}$,H} !škgbLAfotǠ>S$22f )UF89Dm8GW~:ݺj4cĀ<۸L?94 0`i=!IjNҮ]4x3={1:r2#|Ѧ1Mq'f-KbFV4\kcdv55iāG"tPy6 x** ;*[>#LQܢܲq]PRSvlIQreP9Cp !՜({rċKkY`/(ÊR٩;+ٔuno3}lKi6j=U++E*NeRRͥlxw?q2 Y|WEЉ,HT;BlO\q?Ipz4n<='!ܔPB̲1`N"?GqI#SQ`ؠpg&^7X~ R`E'M yEH=%1᭷6n'Rto'n t?CBqZM֡ ^4PD`kTݩ*Z<擔L]a3@ ofH|[۸:iOoЎwx@4Xnh"H9y?kNk(aD~t{}99gyTԈ;{{Q^d^(n2R65(> -4R/9\檎Nu4t7Sw|to ^bY^6`JuF9Y.3cV%/)ȩ%Wb.B挈zQyѮ[@?ȇdTeg46 m7BY=C݁@;ۃNs~B:B?!#!=3Pb=;Azću!eiڦYPJkף=%Fbg=@QujS}U(Pf >IevȤ9#ULtRdP1!M/Q6~:m neYY*s=d2݆ 4|H/>R}+AzԽ>)J^oM}~Ǜz)_xn㙅My|+ }fv|7m/3U/<5/y󝼈&_Ȣg{wAq<p }ōkqQO4+M0t2wd6_[U z9v~!Il \f4Xnf}-Lr?̥9_dm !p)幑F4Rĉ- Gqxo]"XDz,#@)5 HB'Om;sX]vdX27}sX7>1׍^U(ZJǺ%VqF+IB.mYiY4𩝅 7\1[YaEk*`J A2Yw 3tJRYn%ryIOǎO]:}蒀W1&q e@>V6@ƥQ:VtKwd8]~F 2<O!lE}cǛREgЭz".n6\l<5ԮhĈyT η1VMXюx;[a /XgBN\C+Pj"?z`XLK4nNDmn Yu?5>#ꮫI c* |"}:)ķx'PGnmYq b *U:׭ꑇ䘽o,N6t uW$se,WU,@^;.Т%u8=R"FC\׊PJF[hx$@*e^:C ؀pܔmb}e C{MAQ #D*9SncRf9$K+T2jF-ئX ofț5/ E$٪v>*mݩ=@=P(ss1yC!^%gA/wғ `єz) F%cKpah.)\oMat;Y>*2⅜EJy?vjiB!NpZHndpS;>. C黥>ohsJ <( -[ rrF(nRa!%senB!0 1I/p֧#yG[lVof*R7G9ükR8\yA`30n3<2:"B+yw"et@MB2.Uw<, x3#bJ[|7#}ܞ}sB1.oi,.ަGbet".nGBF#4.+:p6 Bçq 0&"v>' 8EH9'O4+mҽ[PA]CyVpx<9}Xm=t^)9tA9\/q@jEz)C؞|Y񓘌)Y:) dcOj,N|QV.+!IMܐO$#1߮!$H;5$).hoˇ6BvP@1TZB4{="D7c&!v>~FUC}p /^GiGEg*ע1{ =uDf\( j4)hU87Aтє H3RGeJPǓ *͉MA?ݚ*TTljo_7=ŝs~e? wp;;oKAxoK6$mj`l(yoshimi-2.3.5.1/banks/Misc/0033-Trash Synth 1.xiz000066400000000000000000000050251506652756400207630ustar00rootroot00000000000000\[s~_%6bN9l9/.aYdܲlMe4ӺXHf]{QyF7Sn~y֫_.כQOf<-Htw!ѧ]O=9P]b'$vIm&'A_xo3!4XO(qR5L=ׄR#v0rz{=ߖD" ׵l"~ 3&<}qҳ/ 4 L] >/ȹG,qC w[ÚI&7#laˈRJ`3 C/dbXdK`5QvS0rDtMI,19 :>p<!]ϷM݁6(3wF5ˇW{5v]R,;Dx(LVZ߷s#q6]沜?6/meh& gRլ 2t bd]θil7;@ 5)|9 8nq-7m dtgZ^U>v̮O u) ni,H)|vu] .r]ʘSo5\T+ gOޮ74H -zC^&Q(F'D奃THhbQ<$NXB~?fVGls BA0sT7x3 熍 zp_{)<N Z"vJ/ S<& ɱWxw{+ps8k6ŕ8c;`-خv]qʹ.b4ͳ]ZwtcxE*^'|& i& &-v5_ DjKσ;LlV sNyoshimi-2.3.5.1/banks/Misc/0034-Trash Synth 2.xiz000066400000000000000000000050761506652756400207730ustar00rootroot00000000000000\[s~_= 6bNBrMd%$es3dLV䏿>nֵ/0T~ik^/_?͸S0tnqǙK e vgW}uؓf:{% U o?hXaS \z2G40 ~9ѷLuE~}) Ι7RMx:|aW]?6R,i ߝpÖ3('P^4!'*1mBW49QKL.W5e1t6نaEf(<t|K'__ŶB`ٽ,xb/pI*3pU}%82:Sey8T n.'\~`0[m(+ML?nAHɋ}du "&@VCOxZx}[7T-uʼnl.pVp-$@J %ȥrߩ^iEMIGn.G"`<}|y}3nh [vO qsf5٣0Z ޕLj&_{;]Oӑ!V"CuדѸ|&N.c(J1+ NtIEQ b "GEDDVWe(Tr}HUQޓHI往+QyV`ik"v)+;1cBekYnS*`2j[NLO[4QXju4Uw=M.@P#)iy %!Vίhd0/y5ո#`{c\cTPnl|\ `9&NY$NY$wxEU2}-.p Q*zaa$1/zD,iY馠 S@ { Mt,(. ʩK(AKiIjr|e٨hm{0[ gPE&ƋZm LdzF*jT3Hɠq\^h2mQ?uOgΪǹm&z|m Ns/㝗f!SN3}`O͖xrk/(djQV9RI; Z(lh@޴ A932rSmZwVy[m?*o˜~Cf9]mUVN>aAnU72m ݦp?.jE+i|{`Zn3t{UkC/趵N'DqN(j lˆog'^-N=zr_ҽI.zէNKap`AJR-Ǻ˱.rő|A9փ2Z5ܰ+J~C{o'Z&iM·42P/.ƣ9;)jySu8e ڽ ~NN^6'|`Ȧo'fů ,uoOUζT ÿb'sAESfuz wCÍ;q:"׀.IQ&7? tOؽ39Xt|Gw&KW?Y?)n@Y# x C|'vڗs1=X|Nyoshimi-2.3.5.1/banks/Misc/0035-Trash Synth 3.xiz000066400000000000000000000050741506652756400207730ustar00rootroot00000000000000\[s~_=KlU3RKrMdeKHr2g*dLV䏿>nֵ/0T~9׼ ]?T_~_ͨS0pnqǙK  vgW}uؓu%+xBc֦NB|nn]5W?D54/NjCѓzM-I6c'|<4"0\>S.\wɋ}1Pf`b-X_G,˸d>G ƅ:io~BdE$mVtX -2MLa9W@e@M=ulBas Tl~{w=̹xo3_yDUmxךE4\sNakRW֓K d(Ju&$3Y8Mʱ`22' xIy !B1潀.&0h9;"o~V,O.IBp·Af_'ߐu,x"xx~wQhSBFbK tG4p 8 yqロdd$ÐȪuURaƀ _8tΊ^_Yn QY;u+h !قž(mեH&7#lav*u92"&UD>%VDITP-\ykE<\a+# ~;[&B JE8L wk0Y>Jݿ&hc)d햔֜JKmCHBmr!fIsD ٮT5wҭ!7:Av';]B^rhcZ_Ŵ Ć;iFbATQsQ]ގs7 t:!b(ђgzArnkWJ ?!9*pO|wj' A?{6ZjSo쎺v۲z`F`PqrP(s5:Jr|ifwBg^? fSj۠C>JRmSnػ)ېHQΥZ)e\ƞ lpsFfb]JyuGzb%GC*hq!Gl#b-(6 drl[v;*F">̙fk/bh'",p\yhrt2 `c~2r~+r'YC&'ئD ?&,`SQkO)6h1H嶀 QEV`ij!v;!cBekYnl&+_Q N_fԋ-I+A:W䪛Ά+-l6@`Z^BEշK-dG"nM5rE#DgeX;&TD1"iISɫSI>x$^Q4B5% kFk!T&^X9G/'谾 /6OAfV) CzsɶwO 4~'4UUwe19u6%bt:hI1-LU,լ ΏPU(N6NC6с9'fo[qVmsnHy 5q;/J 5^Ԫja"2RQAF}\RrFkm{:3tV<.m 4Q\FGRherz/}ADLdSr%{jkw[{A gEI+&1|lճV{\ QG9j S2a#M4gʄSl)6O gvʈ'7D6ANz7o˃S?MS|R|曧-+|攷i[m6b +Oy[w6SvJۉ>Ox Xy7}SrgNy۩ON6ouPmM(vOOK}لvo| =emϼ5n[mB7f]flxzy? 8nq-ŷK"5-W;}&cgAj+aJƺ櫱GXXj5p .¿oh 6 }CCy0 z(/KdDZ #OS (Dj21;c?y`[r#Vqa&?l'dr?ce ?bZ >)gäP<|!9͕*2.!p2d#|` >"b(6_DbW>r'G'p>ސ~h 39Xt|Gw&+[?Y?)nU@U!d n<%!>V;d! q^Nyoshimi-2.3.5.1/banks/Misc/0036-Trash Synth 4.xiz000066400000000000000000000047261506652756400210000ustar00rootroot00000000000000\]s8> 𑙶;$!&El^ۤ=²%H'tM[:yt>$>ZVhyjTVMN՟?msfvljKbNV TmTgOr#D}Lҙ:$\z¦aY+m_ ?=c UceCLL<4aMdL̓С%%iw\z>tH4qس]!!]o zݳ {Dy&76i,^o_h4d4Ze.  Sqvְlĉ|Rl^5FO aV+`&BVD4ܔV68:AzGn-K´18aFs^!&ԜhTz8oWowOx Z8shɓ^f@T9`3=8?}EOh:~;Cz2A,Г!𦔣'Ĕ'l~ҪY'nqS߅Zx i@EWk4Mw=@ MTA> h]os)lKT%3DF{)vm!qTķ yDc{3K pb)">E**(bbW*xT&ܠ:3qbxڋ9XZyVS=CbvDzrPGd4 /41`> 6Cz z{d"o)#7 .9v@)6m#r,$q,*r5LFyTcIH)BQ4>恑7رg6 c;ODzjض_"Ee[qY3Dz&66KIe$F]dyΘbymsEcx!rߪ,$w7K gj@㺨+$ r`;h[̮٫EU%f85 .5TpX?ɸ=P"-C=[1d&Qa@V™B-pKt s/\quJvtВbY;194πbZ/h8`[uv"rOK浴GGD/]k.!b>IĠSioBJ $͐72aWhЄ9 ӏW8r{-Exc%xtQ3_$NMgm!~Aǂ=V[bPz`]«OVV2y#< qzdeS\~]$y3N=vRSGzQ/qG>8{u;:$ ytqww۝g5}knٱNQAul;:ԡQ~n燪#'xgʹ&nk97{#q۱sj1plS9np"w՘cv_5yI/]c1F=/c|Zc{8)-\9}Y˚_|{q6wX}L]lyZ6#c)6SZ{fD5: >u] .r]|e̩\g5m)m=Zhp M:M5uA1e'Cq`9R|0RFnl?PFڀ\N\aؔmM3`z}U.ŒntMix3SӴ;kmn'itÅxH0Vpox>> v:6 Г`n)h@Gå[IޚqXӛ^Vr~T{ch2.p,%ݷNVU&GW`mS?M\,Iyoshimi-2.3.5.1/banks/Misc/0065-SuperSaw 1.xiz000066400000000000000000000045501506652756400203740ustar00rootroot00000000000000]]S6_748n'0N7V,#9 tatңGnܳ0rS`8y;<5.&/7_qf#U/y l7Wh1lژ1w߸ɺK\=*k5 }ōsf{+YgMPt4Ld mhHAncяW$uWYl(o VY_!Lp:˺u\%p)r%[I7f^D6,$a1UXC-̖8Qu!rxO#;*y8oaSƳz8̹ag dF5vU.g};-pTa6Erh#ڷ@f__QjM@ j@x oF mbkMyĈPl]!oF΅NڊuQB#>d@%ۍ < IPx@\1NP#5Ŷ]NotXy$hk̜0E. l\fl2NS̿(py)b 1O! B9$dkF#q VC*8 cۅ|s*>À@ DŎ}TxKfq*›gYDJpYQ~ul=P;prйl['* 4{}BOHUU}RC!My鴾ZVfT/AO\Sգ-M!] SWPZo'", 6]TpJdihbl##ޝ4T6M_UX`J2b`s'‚]r<{~>ؑ*(ųruaHqR$r[l=XrgR;&\1[P~|x8_!ߍ؋$&\h IP S }fS*߻ƱVpU$i&QMZy&h֣3F:7&4nRkzZW $0趿#bD+fjS,mf<0_e&xH9GMWS%wdv>*-_ѻ!Nm뙖䷢jeMִ: 9#~>q]_ɈÞ?' #ǻݥ}YN߲d=#ъ9lY {'z*$2!UER0@Z(_ ) EK.9#rHc{1YOl!-;܊moL$mTr) Fu:t$s bYe⮬6%:ާC/5`z=a{ |1g"}≺9%*u,k`},`WsEkҥ5'Ȓ*wp)IX-HBOG`Ksj<]x+qْXBI͘Ꟛi4Vt>3jbyH.鋴}]4>Ñ/G)HTHt);Lo0{x-H/ui/}{{~PP>dcWL7yz Q_)@,5mCW> |͇5M⍳Peދ}:fae7Po@TAll2Laz PЀ'PPo@;v#/>=R%2[a/[O4aQ/y&ԥ~ mPAT/𝬡 Uoz{c#8}-^Ҡ껝:h~{6=xbϺ7?,.Ԍ7 '6>'6jgJĦkY5rPtt:5 GxPSz|8_NHSz+K9?i]eB#TەZ 98E%`nU ɆE$J,i6bhDr\e), DS˅.W`\t¢gp<`B0\ϳD2폭u.g{7\sY% iä e*$qFe;uɶdn*@N 2#d4^7|'6xJ*B8:M> =mE'?_5liU-'fGPxam^F_ с̾"TωĀj\\F~Wۆ}M(]+Qe !<۾7Kd]I!)Px`'"Ing'(ߚ=b¡.uk:K\kѷlA_tpDa4Z\0. Ӎ*pjr3ӻ ,x+y)l }Aԗ6ψ@& #y$b+Fciq &VC ēsۅs>À XŎ{TۼU|xEMGɳn}z8vhN8_?u~9vp~8\9~\vOL9r00IMlWլaeHJtYID 5g [O˦0Hҍ sbFTQsQA ]NϿǒ4.sQݐF1#J$}Y/*A_\]|B “AόN%IeQC|ҪY>O}:4QLqz 0t| :,l|RrOU rt)8UNDY]0x^ixwJ^ܘwM_%4W_2f`sB\R^<N<(0LϾ/MÀ8w=EB#r[͵F,Sxw9Nx0>פ*ĶRm2:^1Ԩ)^x@VO1) %)A/"$B ]3d!OEIIYj‡PDTa bZD ?ؤ v# Ʈ/^=r,fgSAw|TDWqT^3eNxX UWGW%-׬ݎuzl -%2^WRi›hwdr| о]׵ 1yvEW|}2e#=-T2} sCޡ2IUS0x~bW\DuUIds,PrK 1Łh[lF21YQ\ȩG7FR1IӒPiq}TR_xt 3p,kNUȋ]H"\ਮ_8r018*.Ur2Xz %â7z*ҒxIQ)wr.kFhЅY_Jq "x q\EN'ɩRtzwI ,OMV/UA ̓{IT_8E&9oAsA],ϓ 5qdQE*j$eHw;3&!;+-o+J J}qhB q[7XPoA}淪+CZPA} T@}ǂmةcJ:| -WN7W+Fx}S9/7/yLoĂz Ѧz -z^|zuOO:mQFVqN(S->**+^᤬-R-ݛ[TNߪT iQ{FNޡOfwWVb=oNP|rGzgtvU3IZ^gv gv>gvj3'|fٵ2 9w;u;<?}+z.鼀Oe[ߵr%T3WG4:_;NӝXo-v{anWfbvB%vmvE Դ;Ҷ+]qdTۮ^{ɳSxXR< TCܚ22Bh2Xܱ/ooT<:gyoshimi-2.3.5.1/banks/Misc/0067-SuperSaw 3.xiz000066400000000000000000000046401506652756400204000ustar00rootroot00000000000000][wF~ϯ 89˧ig$cw$vv)4ݹ7|\*Ͻ?׫ZջywfoʟOn߶3e/Ͽ6OwG4  ,Z[!}p[Ѫ,sW]]a-“nƓl86's[U\feK*O,VjzzIBzR۾uF\ˋ?5mҿ1gd4ʸdG! itv _8![d|AGkh~<a6Z&) ?X"?W2 v2cŊHOP GRu?o0t`b]W?L#)Zi%tU?[: G>mg0؄ʕ I~Ƃb= ( XPVa}6=4# B3ر{bg.d!^a NB pfK-nr$OMU `mDKdy446T-0HǛȵ승 S,ޢ$*{ԅI,u_{cd8a> ȽEq Rq)}+p⸓HL S~K,=I4[&>[1pUM+e0B`Bf'6.ŷ=du+ |\r/#&kR5υ=Bv;ng4C'1-_?w^è=@k cybRl^5VMaIlCYjLjGr!zrH:긓m]۴"LZ.)fDƒnݙgYB7zQ-#Jđ.U!ǥ}W%C3#Tub޽[oc$e7H (b0m0Y6ݸJy8rX8P[V% q`HT1t>Pvרzj14~7(5:`-KbN{CĜG@Kr_t<-yqG&"n&خ˾WcbqOk"uH_8>e)$J 4W aclhy9$5=*TeΜAˈSHHV_H[Ι4 qF]la(4#x_@ŠBV;M,?(Ԧ#ɾ1(%ǡ@ a64(%+Mҟ܌GAhF[DU} ޕZƱȼQ/dHˋ"q7jY߻R\!1BBt\"LǺ#*Wք w]yQ2Zq՘[jμ?U^%UB]̣GXN%8A^8iW'4~R}[z)\5רFیN&5ͨ<vw@yIㅕځ7GCuo(X\z{4_}g>3YꙬYy&CRg>ʮ%XQ6c8ֽӱAljm:qB4N $@WՕ9(w BMBה~c@q(\ʭUHJ<{prlQÿ/feyoshimi-2.3.5.1/banks/Misc/0068-SuperSaw 4.xiz000066400000000000000000000047461506652756400204110ustar00rootroot00000000000000\[s~ϯaUIXjc[}hG_Z҈QpSs/syvS{`AއK^c;w~~|_ŧQ'o8x9̡ߊrvg[|%_wr#G6>ԫxS=ˉix,jtC굜hI_{ud:^Y-P^^O^&q1ZS~P{fc7a6vx=ZnY|[H [7bېX@\/xHI2P.wD[0G%dvJs@*ӜP,F5I+0M'W2* ML]h)qIdZ PQcܸ A9$sKጐ<._[glDu/>W~נ̭AC+h*uB N0 ò<@Ihm^ %I"z‚$v+hMZ5\pO#6nk}'Q'!-6t BX}.w[3Jm|;hz9,= 2UۧAHwѲg4lx!tn pU~!bwѡmHd)PM(Pƙr*i( RZ9@]TL i ;H+rүD4O 4!T1""υIrD7Qf}*ЦhW|?J>Is"ۻKd kwRDK@UDx^eiׅ O.8 rȝ!$\D2{9[Asˡ9P:vlw)nba nLFG**l:^hrb=b_31\N/UHb H%bn; wcmZ2A8 h 6%fRHBƊ4ڴi$%ևQ|E0Xb{0Ő%}g8f~ڮ~4Al0vƴQq$ m8}Q/v4fj|ip+%m@LQR6W\6/HPioEHX%[2Yv0c"h^,JY6/pM ]t2>3-/pE> 2AU6(伌h' h'{/{`EjY;o{HRƫ#APEѻzH_6@ñ *k?0K]uFU)>1-b OUR}llOWA|?mJ<|U{^\]?EPiZl UP?OSUU+<_UJE7{bǿ=T/ ;G{D~뚧fq7|,^{dGcj҃xsY<1WsRd}n3Y3>Iy>D'iOXO1X^5_q 6lʼ4H-Δܚ|G OJFb\Dţr^_ hdl_1ķy>_nޮpv[rh93ն1P.P.8M> G.GS3&M; :ѡm O=EpH_s)i(S?%^r??yA @\yoshimi-2.3.5.1/banks/Misc/0069-SuperSaw 5.xiz000066400000000000000000000037011506652756400204010ustar00rootroot00000000000000Zms8_%& M`\9 7nr ˖M 3}jcVgݕy) Z,I8vޝ[,rcϏ>㷃ov5\ߎZ-Uކk|hw''7"x#r;oF|-m  }'ri+)ٲQʓ,dxqYKaa5s=l[Rp? jĥ H&O=/c]p]5.t) 1"폋 \[;\Ǻn _ m3 ޮHD։B:Z'$N5dkAMi,G7-" (kqJ'W[?"خt:lMIYkhh Fqi+Xk;`. |LDZ;dV4ߔ*WU! ~of%Ɠ둁M1!Ճ qv^Y' ώYm೤P,X=pH)WtoT9wu%՜K z}'N^TX*vgAQ-V Ngl:^ʪS{]C( -&j:FE` -5$sTK&R)",\ onG䏻dyoTTO*oC&@AT;Щ6*.'FOwW3cliUIeyq(=)d<=+P5# b;NMuы m~N@>`C``уֿq_s\AwU/nߴDE˨"99Zx D;1`#$nd E}M U9{V0b.HS>ZX m la&[|!lAJ8gs}_^\hՁ =ܺczx=#JDgZ0Z9 YPu/.Ή)Þ˅=k?y:wyP#7L{iQd 9U[J٤~NפqmFX@`8pۗ<W]ia#=0nw}%2C8!!_V*#'JuxN'Rcܘ&JU$-rͫ3" #1g! J;-).hWC\kfL C!{ "Xx͟!P—::QGm {ץ=IC1&c RUxA OMJHﴄ{mߡd3[:_dP^єí鋈;s4Lit-ٚ^nX/M(˸ߕvz]"F?کό{WT=eX4Z/xώx{S EzeOT;N{y9bB>bJ:2v4.Coݾw,rI ?8 nKS|;]j[GOo?SaA'yoshimi-2.3.5.1/banks/Misc/0070-SuperSaw 6.xiz000066400000000000000000000036611506652756400203770ustar00rootroot00000000000000Z[s8~`yO!!0ӴCe6f_4//I#,[lH7tgF>:::|O,0lZO ء݇߮Wam0pyuЄ·Pħ_n7#w$&k>Cr7 nl-l ]%0ta-T qd"q> [m [qfZ!sxB\؀;&y8B -d' n ,c8O%s~herY5?V}C2$dI?C:ٕIsC<3?t\(GCq1; xEي\u \P7ۆ(^i"\\y޺ƶVE9sb8$ fЪd)¥qdoZJHH-*1n oAKi챶,4:L7AeCS&  d|%)dFI\H|dz,j5SxoȜ 9 rǥ, "]6k *ciA]#l8N+їUt4-u|,Gh#;TC9AK!TWde͐|܌Zye]:x)@=&'Q܁TevL2=^_WBi݆PH*:Ї#(=!Th$'慶l 85*j'6N. kg <*_`*hKl UnBWr8sx33PE dQ.rE]NDvB+uwɳUX>f3Dc*O܀} ,qVζx3ku z~ Pq\cf2Yތ^4F^t;3{GN\VRv߶N-HoBÙKgԶ=m!kx%5gfH(!"I +-&|H<0nAO ȳ TQ~,ʀv7 'WUt+JKmb a5R/T5jהÒ4mgC*Ib55o' ͤ+0JXN qC{[<Ĵax޷zeIp.T@Gxzm :(-~V AZrPIQ۾8nN0tCR*=*"8vU8Ĵ:jZ<[bup$JO/RisHNQ:Ҷ*^]Y}g=G_Ttw:sJ;S}vZ$#VuĒޠ&Kإp4^-R٠EjM-\o+a_vVr?<Qeݿ`'yoshimi-2.3.5.1/banks/Misc/0097-Tubular Bells.xiy000066400000000000000000000044541506652756400211510ustar00rootroot00000000000000Zs8~f$!P53[85%rUyR [r- U[W/1V[-= [,˃$v~[,?_w퟿}x趞|Dgr ?h7I= ir5!۵PD2JGl0ZNfS+Y%I؊i@m9ۭW4Nڭ^<ݜ.8i޲T1ͺ-\8ܥ;_kK#N<4Fj?N΢,#AX :Z%kik\ږ~24KM~$Ryj2],Ot) w1"obUN)/Zf^lZ4CVs>+4lR%~Im ~0L_w(mDxA-!%Z҂m!eI&ې>`TZ }hvWd^B-ܰQ[%El[{Ym_M]2gOxEn@y:U4Xk;x.#6 d)v_W4oj KZWIl:nr]ќ#9,A(@oԠ-iL! 3 O2S/FL-W/Pkt]4x3JsG2W+F;G Q)pxro@dC(DE^jߩ;Ub *ݎZzĚ:tq8=(42~ 5YIt{MCWF M|ۀ(am.Ph I iCHJ:n (O=ŗ9?bilu~DYK7lru!`S{wb uV\ӔCgR5#*ELvq(};]Lw4ګ,P⮕Tݾ$"J7՚aAR.T<;wh:eY(|٨0~Qvg8R9R\fbx_FQqrQYS@'N@K<@rVuHFOOg$c`4Qf5vI5KQKeRf#?(u G Os]/N-藴hw/18dEka- @s\ڸaw\㖮%T$٣%W;tL,~xYz!h_黳41$c!IGLJ#a3ƀ~v {V $D#Ёw{;Bze~wW"jDyݿ]ij%dUS7~a1_&VH7~ 8euN4 %OP/'QCӤqqFYHntyIaX,j80˓;?7;dFFҥ9bQ::Hq@n**gKhԞ%XBЫ|ᄈJQ A%V; %il" h zx/]w#^/$>#7n3beMJlVN܏i`&7!MGYŨPZi^rd*qAhp66U-SgN_""z?Ndsҩ"Lq} Л~, J1foaC46x`ѮCfoz2D avA׿0~.'[qKvL_oKKj=h; Hpߨ_4ݿROTWiW糺>S=8TC~qΘ9cF:gLIt,h$[/^hjm7\GqXmSnwny+w Yl~5߼4}#,$t w-<)5j%SؼGUc&|`ٌƳr>;ǥ 6 ݫhtFi~O3NO21Qz v:ȋ_XOpu@JW\_>ڀ62o8BZp~/WFSyqiqzSS⭤;"|$w8,Bc"M`m|Qo0][H ǵCqeY"Ѐ4 )j|Lڄ'>acă}1eKg *,yoshimi-2.3.5.1/banks/Misc/0097-Tubular Bells.xiz000066400000000000000000000040441506652756400211450ustar00rootroot00000000000000Zs8~` &ESC]Y [{Q [k˙lI Puu2juuߢ,HC`Ar|Z] ?~om{|~)Q"&uTOX<5?h7fmJT_<7Yt}%01nBK^lPy,SJ-ӂmg'JNgMgmQ@x5GzXܶ٦'c%50;&PV2a~mQY*h^TzF'|  :]jFun(ɍP8fap)!Xخ8nLU3!k#%?WkLˠ5xž`B̋Ew.vDIQ0Z?WW]Ժ 8 /gu޽:aadW(k87V;d)$xI=ޔt{*]!W;a@@2˭_jߪq'Sy$ DP]ZW(TD1+H}.*Y;3:Wt PȐ <0?U Ǩ!?i,.ޕu[pQ8L׳KOPtzc ΐ[ԛ~[~ZcHD-tT-l˱ =c! } 7(E*G:ű8>1cm'q> Nʌ0\b**\<ʥYNnWïW)6ï\(b*ȓ~,Y[];)sVl8NkM/X!S^t|=l+4bb醙jU‰JJ§`!%(N-#$ZOXS j2{ШǤ3~aԧ(p ѷռ=m DNpaxӬd]`Nr:z8 E*^lI T P F=h:*EFqGdV^ Ān31pPiM7 wm>kNl0AuPugY^W yv& 2CL2z 0{"((4>[6R׻4; t YܱiI к*&+r(^yQ\WlܤX')CؕEC1b}6-S@ fw  #EkM5_pNʼkf,e1#3yG r3 ubl nhlu`̏=OQc.{2).}t 86;!Tx`导ȖsnK6?Ub9ך#`tW^C#0ɀZ0;~_Z}vQe˽Nܩ2fSGwӛb*9V[p̵ }^#<HAcaulRKca/17:k4ڱ s)j^wWJKpiy+||vF:P hTsFbD☼c1/Ps1sv y8fr O善cbu*߲Ad: hv1DQ#|;1}04׋ f㌽ukڴ1V BǝMho[^Lm_gr߱R及oyѧ }Y735R7fg3֍|F~݌u#oƺ8X_5fᳮ_3#|vraDZo+$Cg hx`-HA!t-OvHiY^+Rf/+8{Pq1]Gyoshimi-2.3.5.1/banks/Noises/0002-Ioioioioioi.xiz000066400000000000000000000047411506652756400213200ustar00rootroot00000000000000\s8= &! U3&@n%l6Llْܒ2G-__ #/?Oe>t=Z|]w,o}⒘|-3?{mٓn<$=!'{lz'9pFOuE6znDŊŰ-_:VOnbHrX Vԑ8- zOuu3!?wƓbp7,/n0h.q>veڟM`˄)BSˎ AK52sik8Ҷ+ƂOj̏9aE+"*#x1ky.Ql'ˍ34VmKsH WRN|lջ(ND}׎乹if#mJdMy pB(Gxpm`Y 76G("bUɐ!@y`|W(:@uQC|ҪY/]VbX;& \;E>߲?*e*e5Q>Œd2}V!FesPR[Q(nAtXυ5v_6i'W@PYhA **+r(^yaTb$')3CؕC}0`> ʚɡ߆d|z m~]DkM5_pN>cyyres_}1}}oC2ſ:Qۛ9K;/2[m+-c_s]X֡ts-9AfUM/GX+/'ےFh9#GΪ|{wŖz0ÁugES@GLҝ ?/q->{(VUȺw*u=nzp;\L9\%[W*vk!깖lSz:;Ř[C)qLӪujy LUՉ5FsX&C;&?@b}>UJKsfϭϬ;ٹ) L\y"YG3;q##1yE/njc^cfm z8ft w閄cbq *NYHP  LAn5h?*_@;1}04ąP`^^WCTwB*7m *@8[=V ?y@ϿoCw&,m*/wbqwtٙq׍lԍԍlԍԍlya/gn66u߄?g7Gv|GZo+$CՂ-C)HA!F7:D-X;@p;KGu@JqWےn!1f?]0qq.{13ua8.TazJSg@3 hm^Q`'E5vYij?EW^;q@c:ի{mΖV~6o]*Kyoshimi-2.3.5.1/banks/Noises/0003-Noise1.xiz000066400000000000000000000023231506652756400201710ustar00rootroot00000000000000XQS6~W~@!78s'MB[QlΖRɑ]'%GrBo=AOV֚rvga!({ӎq26̋j4i>eș}.«lX^S̬^  0姌z1V v%ŎV68zZ8-rg{ݮذlVD5W0ʸm9:x`o0G!Nݭo⣑7Ov{>& %42ثpҽU_ihF$E,]%A.IqiB =/|&<]לyl ~0~0- @"0ySA[g7ٱ;oyQ2IfIotϝ|%n'?7=]]!$[k3i -{TN1xr*c%PlW([8j+ 䨙kf*(?|)!fI9#l ƕA"c xG5ZnAYJP,ks$BLMӕSFEoZ-u.ʮ:{)͸X;bZe8vOj 8<+7xMԚ7?u#AȠjQ⋣/ygkF$[1Ɇ{ 8!5x,rFXݠGѐRBOރ]4HAzw@ hce˙P{|uyiU^߅+JVXiQ4ō kPNZNM#jMJZ))AyvTWAjjZSo h*klG5AћwL_gL_g=ӝLߴgXnXn%~@MiW]^AEvm]{>ǀK9|8`Yb!F&jV^nY{OJ eusUyoshimi-2.3.5.1/banks/Noises/0004-Noise2.xiz000066400000000000000000000061261506652756400202000ustar00rootroot00000000000000]]s}_}3|WnظB]@V$$v~}ZkF#RT)YzO?wgd? x>~n>n>?_Iز?Zfhwŏ>=s7O7 :)xf1߄c{k~Oww l\; =l6R슙>b߰&;wt>LX{ޮ{ss|}q l6wGj|㲑_ %x91Njd5Y,k'1cXAY7'4 B]ʘ-x ɰ[{#\[v У+̓NiYq=g+ <j:[w*n7:IL4/3 lURGy $|׃4ɧO shr,^d ؚmN-ryPĘ&w NJv5;aQd-IbqokEP  l2BO@{QOH3wY~TGrGUX~~UEߦ ?j* dMXS6D$632:^g+~1N$Ԯ6$ȗ O&0biy5]vkYǝz<.?Xy*A£e A{K*Oԥ&}U>odK?<%\x2wℴJ1_^Mo%OkZ&آ>tM6I}awԪΖ/ŷp"[raCMKeB@g<%bku 93WN%}3uW,JM/0I=I!5Pfi*lqp\Y2g "wf= |tɴv0йr!> ѢjGd9gWT:[acCtDDS^CafbT i4;ܕ+,v๦SD!'}J|:[Il r $ԃ*9qsas.T U>>>>0jǿ?aaaaaaaaaCaCaCa1D6D6D6DF@Q;aQga#a#a#a11j!XA'93FƈB"Gƨ \AX#65bHkCX#"65aAX#o]t7xCXpmkF?EYk= ku A}5gPA5gPA bD0` A4x bD0 `z  D0`% NAX D 0`5 nA D0!`E A$X D0)`U AdBϡ] AQ y@h 86o!ހx8p7o57 q7 8p7o!ހ^s7Ko!ހCyCx 8p7o!ހCx 8p7o!ހCx 8p7o!ހCx~.oK̗\.yg[PR%vz}^NͥzfoɌrݖExA'p9=o>DCvV(*@KWK$o+^eNvqr{dtp]H /\}}zR$I?&+*y?6եP/ur흷qWM#m8Sg$?U@zKOIFp1“a舙So#-cL|[.TNfKHD4ul(,&|N> Ɉr%]ml-JZXqmRi=a $Z:Y\_S۾({6Ѹ~)}l,J[Ӝx{Ñ4:HǠPm|Lu=%=O}>Q"_LH/z/d8j 3~hQ^(S\OH402E)X"HJ-{gjoAtExnHǼ4V${EDUxF$ӛ䷇ky%MmNXjcrG\W\PQ?40|[F=Ȍg$ZUC^0mJ(*jjb%-dRRWթEQ +b4boDbQ{4S#*M}=*٘ TjM*gUQH{Jb(U=Rה6ߍڏKrRNQ򕚋oGAZF蛛ou0V(&odR~xNk *+NUENtZWS1i/N^'Lr2L(*`*Mgж*I]Tt? SWO_%Љk̡SC/!\`A)SC?)vӟE]`1a%~p,ENnn&WH6VVjoP[vdm?&~= F.ʿ| /|7aZ0&iiyoshimi-2.3.5.1/banks/Noises/0006-Wind.xiz000066400000000000000000000022661506652756400177450ustar00rootroot00000000000000X]s8}ϯ`y:Iҡ6z6XnE#ɋ$,p2ӧ8s_ڒDPls",!e/tng'=yYl9POyj|$E' I1%[0 UDt4r"Ab oa98 hy'=%6AjJ~l"_U Ơ GoJ(8RcXdTA9 1\9iϹ687ʟsRch/fv|i0|w^t=m1Oh[s5nꂻ<~^B_7텾m/]{[~m/;i%nNcW m /AzU>]5w7^痻 <Ԍܫr(K]Jڨh`~Cyoshimi-2.3.5.1/banks/Noises/0010-Slow Wind.xiz000066400000000000000000000024641506652756400206450ustar00rootroot00000000000000YR6}+\i039KЖh[!:ReүVb[rd8g,^p5 5v~=-J]6"o`'RbXxy1^S̬1N葋% i#uʍm+0]ʐ Ćh2!sX ݉ (ćp(4ӇRstmgqg3w2Nc + O + in53I(ЊD2GIH40 łxV 0 k34ZǾSO6 <54KNg; o}Z͟W웪=* FgaIcX$^h",Ӑx|(aޒxD@pY<ٮ* 4 ziwV[_B\0[¼ |Uh,3w`Q>͸~y5^K%˧g%L2L6yUzh|0\먔%Vu6,+J* ڃ*`"OZݻQPPtFIL4vڙ F~WSy=T'p {4,꟥`|ߟ=ܙ+"iĺ*QyR;6^aV\IN[UPwa䘕BxچzƢI=oPP4~Uw{?f-"BUakȞJ˪h#1"rP{~EC$K*T9ڀDL}gSW(%k},Nגy'&<0ƼVwב!ߘxQN47\喕>-?Q:1Q"c_[pyoshimi-2.3.5.1/banks/Noises/0033-Metal Sound 1.xiz000066400000000000000000000037231506652756400212770ustar00rootroot00000000000000ZKs6W;25'TS[r$SHb‡J_߅C'5X.vvлQxbi$Ey{lK ~hϯOΛ޿yrp6CߟN|)}T;$hI'7"xJ!$~^#.m@NƣKr7\n\ 1b@m+;*2eP6$CÀ{yHyj1b*JM?YE#>ӌ,JVt ED] U}/H68dJj_Ԃ-릐;54QRsJV{ \@af*Wk|H{wb efjVQKrb"YR$wY:TA%βܷsbh[qMO.(IPto[lE%u.EbX1.j<;ugp|)u MK_(|2Ilv4 LdTCX%DW+2%7Qn2Q Y|SD3Mp%yT< U"$;d0z4&JArM$5U]u="sO ]Om f(FY/HјIx,~W\[Ah= c+nLaJw{3tz{'h ɲ#, EN lW Uc>IYt>E fp`!d2$_S!>hOѻ:~fGZQVo#D%)#v5)ӇIȪm=SžDž=m?}\nvn| I9WeuL S[FA?ӤqiFYHnt yI/WYT3/:\DT{`]OOn=~ʼnM}`^xټOzO}zr5or 摒N5/|INDS4qhcpѰqGS!JV^8d o\QLF*X /6bjp2G11YDi.dIOi5- >|70ͼaI6uK7`ftpk,vnc@IGFZH,HȚ  c;%\2Gƙ0)؃xnŸu3/?E#ܕO®g=`@1"͏S1mt>2D5+->׷ִNH*lj+BV(`N%ɒ*y}BFs"K1YH% VVɳ *۔WE< ]#9 #Uָ4IBZāQΫAJ (Or" f>[|UNqA-AG}0GWn:nl 0Q0=@`2fP6$H}}%Oy)(SHliuOE.Sܳz-ϡTVh!ƈ:U4s)+Ͻ&Qjt1dE =,E- `c7f:պu_d^6GSĒCr:r:r#ɊdFSaeXA0)iI]/QlŌHŗ_ӄﱶV)Aw~]`軪(nA+uuP%撘LU4u}/dp 8+;gqM'_ƵֲV`@ 9 h{ϴxM[8ˇ73YBDI#/3odZ+N߱Č=S {Į|:XgrF$߱#Ĝ_F{zL+t/!>Tи#ϻ̧;F(p<9Xt9@;N/p=Cj顭#_$SJYP- dcGjRV>'1j!Vb&,9/k\QM2)"J"{A!+9SD")j !.5h |G~VPѲz X$ְ}/ATnM V#ڪQ>8n:5QA[ޫhM:(QF ?M/P*:}J죲Q@cԄfRh/i:R`?`V<(oè~ug"~ƴtCb}1ѺЕ}B|VW O~k6]T gܺжj.SMyXtx;\Vm .׎`>?M}q{ǛCn_Ilhxv#&uČdEtCj._tdkMҾepc'5Mوjw9-+z+^hj_ (yoshimi-2.3.5.1/banks/Noises/0035-Metal Sound 3.xiz000066400000000000000000000037771506652756400213140ustar00rootroot00000000000000Zms8_=%@`i&0\)}[~l9 /X@.fZGk>|z3b7 zvUa> cM [.qaB {xD<ɷLqR/?-ܕ)o`WƳn0gܐЙcD^m&Sk}hi?C_3$df ϲmc5-1u"l~ȵP bv*%@unw5Ut)QdÊvOum 㫹XY*I%Apd%.škp wTaP(¨;Ŝ1 W U\!D=wO'@K2m+`IH,#O-hCsYT0NQF^,vj E}'Ssz㒒2ςf\9L/[#p:ȵOxP MaȊz*jrc2j9M|{ Wȕeآ#6r1ST ,svBO6ş{vq8`kr!g9z]^]xEe+YГdz{.LJU8Ze1b<*x ,Jt_|Mb]ꔎ+2Ȕ b' |)YdF\.dIN=qH@7IpePX?u~Ȇj`قeRۻJezAa- vWyB9jG*o+z7D܍h`< pG+dxmSUꉹmŲQ_OM=y#j7FlSLr܃/YPߎoL/S.k- yIh{Cv6;M(gqJoޝCX<m|҄oGf)\~`MSN:@svxۧS9||_c!!xe_V$t5:\L_kY(b1vVnOo6"+o_5=׺1*yoshimi-2.3.5.1/banks/Noises/0037-Metal Sound 4.xiz000066400000000000000000000037331506652756400213070ustar00rootroot00000000000000ZMs6W'2eYf1MO5%W;u/,&PIбADr&۷ Po?]E0apcC-ދKCtpvp2_.NhOٻ:~nGj?YNJXD-+#χzg . ʋ'U]Λa4;'t\#3_ 5"33&^[*=,Zo9ef"w &[$O~ʣr[>-eDƕޛ\>ԭg-#(n C0 "n3JTGgj3Nɍ"Qu!SA3@Z%f2"7|%%$"?$0?*")赡5]_oDkx YP ΅scAt/+]DƷ b3 AZѦ6R#ys]M]]^>=ՃM}vǛxS_ov^:?|m:1A39bJU7bSlkr!>h W>T?(6Zwۊ?qXn74Ǘ#v+w;X@{*?XcCf'yoshimi-2.3.5.1/banks/Noises/0038-Metal Sound 5.xiz000066400000000000000000000040521506652756400213040ustar00rootroot00000000000000Zs8} !U3$PK]Y [{Q [Lؿ~[X$lnڧ_wKk^Xp;Y==[G#[fɿ?z41sVOHVI5*>ᶐ{̍ylF[xZj|=8YDׁe[,ga]?"ؾ4ھӻO"\ zp:@.kLdSIwK-m@O(u %cP$֠2fky}/ݖ"ej%( - yX'ӻk0b<$Sp}] jОYgq5=gMyl=IW/^"3vD A4䑽[Y,B)\b^#p^ϜBZ#򳔛^`S͢%4˛"[<]g\ahd+jK*A AI KoVB0mpD+O9m|4> SrkR6i0l d8 {gf$!H"#o$eنnjX7LvEK߲$=Uj=q 0 Ț%َ/W/El8Q,ZI-Σԇ()TLJ-ɓ z 0v,;R2 (ZC/u=&^%춰b)v1^gٍ:׵4Ga|9U#tQQ栯lTSIT Q2T\td:%ʜhTQq1jaʉKIRR(=]=Nz/` dQJ&sQ_yLU;=8#1 9z秓~7k-̈x (oC ur#PCݻ=~i *czxw̋r4Uj^ W S0;AgOV5?z=x^ }D}OzEo, q#2.m!lث:#Bprܨ5j\=-.R8T&]47rnBrEnIC*wqCQo7dGCrx,"UW5ک WBuUywLDEɆ(=lh[k &""J;fD%}w5huzxᰫ8CDp,Dgҽr@Ԯ6 V=کA>8 :46RCGqWFuiʞyPFY+xTRuJ6) 1ù@c:Jg,)"8~p[! q@GZc@|!PzhNn']sI w6N=\87 >tN&wbfQD_OD'|}}>Э* d1!3fsƔ;m v`;L7+qCgP}v6Ze1ӛDyDCEt#$rapW\XP9]ٞ[ _Z{}iKZ d)WrWmAiY鈎-C#bLf_ư=At,΋k GCi ,D{*~4ڶ)yoshimi-2.3.5.1/banks/Noises/0065-Short noise.xiz000066400000000000000000000037371506652756400212520ustar00rootroot00000000000000ZS8~_;M L$4 7ǽh[!n#g˔U,[WNCf{jW9 [O,͂$>o;ç߮Ɨ;:4_uSN]Q ߒk'A,tE4KxD3O[w4lDA)4ᕛ,K*eܱzNǓl8_+yF=1_XMI//4YVf}L]r7 nݙ;{K#L<\+#5'gQFV,%A4X ۺ,[głyG-@)ЃOĥ H&O}Sx]p]5Mg[w4h [qdSx_, ׾iD¿YBPCcki8c(WDWk!M-b^dقj  R4 gm+E,`1ZTtxQ Wb9w\]pz'u4e, O,hm)\󗊮(Z؂LF A IfDZ 2@2gs?/+ȯ j~Lnǣ%791oQ"`SpvV7srIk!Va: GCʓTRүp\t\4x3g.1E̺p):hQh݀}3%1#K.)Աc<Y4J#}4JKO,L 853Dq (v%ŏZo&!{Tx< ;ӽYX\}A`40n3e ENPtJH`$e!RZu0~6 omW>"o@Rv&kÛuO'Ó66WhBVMu^z\#fu9a^̈t[}Lʉ(E)n3RMIW 4+}ҭGhLX^sU5 |_C|cdca$Lq9{[>eaVwqTO BP Bt܁[O,LʼCF5ۋn^OeJ=X]Aߟ>ݟ}7_6|ٟ=&njtdLu˙ȳx~/Rmtt,ri? zE3|=]i[A廷rwd%vkp(yoshimi-2.3.5.1/banks/Noises/0097-Frogs.xiz000066400000000000000000000053421506652756400201340ustar00rootroot00000000000000]Ys8~y8SLMTc^KNĉDjy8m@rM% h\F /OHFCaPכ_6&nGqu۟|3?cD~+ȟ~p4c_NGY}tsG F;"M[;".;/Gp㜨adG #'(8x3: p4M#ߚGVѻ ha!uodg6J=~|-]O:'n]wcNqZuyVZ)el ?r# 5 , ^Qpc9Bͨ-qœ) 8N:ȏk1oC5'7hM7u fK$˥|ݵ~`,ID¶bc6>xsj~9k51 g3|ax~DyA">G[e!z^Se*ܥ%ې g$g;=`dvkᓙrCļ1\bKHGKL0E%.8x WY?s1ڝs]&*{ :M* Bd7*wsw=<\UG  UcWkYks; W0SG9#:Ѣ ;W0`r E=ҥoѳcn&e K?0aGu zst+f-VKZie.`Vb& |ϵt8A[<8Yso흩0vTN~#H\.dJGML\.J"1Ej6u.) VKףC TŰg9|Kdv#+[;'#LXT-w؟|݋:gJ}~WWǚ$-RCO;I9MC,8jLTRq*Z|(.ڭnMAGV-Hp~@ƙN^ey[|K㕙V7`߫LsFRQvOZ%JeZo}iT0o+yeo)y:%7(+t||tTs%֔kPBZwێZ7E9**T|yBXOnB_y*,e,*~x *^6-uPfoE&Nɺ0 S ]Fx>/uͤYqcFXc,p?v2]%X$,TW-5f1?._]0$ABu'a"/dPG0uo`H\=ߎzqTvZ ̷aݻ[V ,CVk|T]6*䊚i@;bUD w#q@AU֊x>6E}*2|,?]V[6g,M'07f5 lhRɦv^K`]gД ,WbJd,.B@(З]"̩r,Μbw+Ί܉2 ui^^rS Gj "WT73A2ejSEAC-mFY8limzH3_yLh-udk'ݴ y 3)ʠQ725sp!YG.HI^N]S%{%r),te]|plonG>rX,[[yOkkfΑbM\n f3&4 "5E!56DXAO4!No~#ͷBoN:oYT(r -T?֬ jl 4gF);Y6l{p^1`YS1 xFhňSx4M F)@\N"Eʒr_  V@9@T )'&GoA ȔJm fqXv& n "b(@1ʏ~c8T%"PD)}T-{Gh̳u,ͳ:"1P%` 4!pLs@1*tI/)0 QE{#z(("PDUQh9]<щhz5.f㍳{81PL T!3D@;Á("PD O0"J$!EZ 7!EOED""w@<ś*~UTgY˝@gY_O,\7MD^ =xY@N[%,\?("o>b c1@+k}4-&z#kT3'7hb6XÉyzW MoƺͿ{sӞݓu$=Y׉ɺdO=Y|=+^ӞC~~~% m|x7e(+[s00@~D⨺K#vL[R`&W?cD%6זyoshimi-2.3.5.1/banks/Noises/0101-Explosion.xiz000066400000000000000000000043321506652756400210140ustar00rootroot00000000000000[s8_=&lr@ͽ-;`e˖dɀ^LV׭VO/gIap2?tZ q]y9~to˓e gtpwOKFwnq׺`K^Fdﲵ[p&[J;űཋ ^Ko]߽,ʊ'{ ~A>%SҼ. rhG"q> GC LB>!g:(W:z8kSG0řjt??Z%s73P_>Y/;/[%/:"_]# '$cCZ:n}z^ظ{bxa/89!i k׫Bl?&\<:| xS2; xx;+Yh5&h ׹kuh8VxBO@tbi"4." Wr(M/@`vo،I$bY#U jw -L*/،djz>>=LczY~uW;]ȣ욇A'!0ʌ$ےZ r@q %nr@`8)*8;q"%]["Fа+v%_vG7pPdPF9& ӝh5l=̞,5 9PUϑ`(pi*@l`dr (gD`ZM[&xn@ !Y{"vzvXt^{v_uoe.u!|hЁ?U7JR ( f|E_ɸV4!.U{[UuLնCv\ [ =ሊ.5J[f~p1ո fD:  ?Jn+f3C$cxsT>SC5u_çS&ӂ )D5aH^2T]?K]$ xVJCU(濗}oVClrnL5)^9u)^QU䟒ju{ڔ+xSg곆uh:7NMSt;>dq MF=WƝx.y?S|e\><@+.W rU'%RucC`FGRU2RӃlݮy{;(LʤXPlrQePakU*AD&!\c+u߈7]ڞ9F踬kFF H68/;/x{cD&J\ː#ː5hn-ftiU[B<ݺw K71C!0kʻ.wPMaPfcuUr%3򽻊p6ZT(A4ҵ.4ւLxրzO6x0.Ȕ]7×򶖞f$h-r4qjWFSǕ^|M{Q;k{4z5TfA֮7'A+5頭~n!ᑮL Y sxTU\׭D96fRjsr21}ec~{-D30zȈNSpZ;i7-H6 WC: tYt(9kvY޷tI[hǑ߁@MG[:'NY5ū"nE:]e_xQ+To^>9I:7wX}"X5Z[;t9Ԕnʛb襉SVb7A(5YM*أ6- U f+QW@I7`;0|E2s@xz[UBC7SMCh!/j`W0 q[1yoshimi-2.3.5.1/banks/Noises/0102-Explosion Canyon.xiz000066400000000000000000000053621506652756400222310ustar00rootroot00000000000000\[wH~08s0vml[I3~[ݒh3eQU}[U=yYBnjF;tS{;_>}Gқy{]Ǚm;VdoOԚ5ȗVyKǮ ­mLhVh[Ďkyƃ]ξ᳻vS ~#g@xT3R"6K2 &MY%;M ZZ^!v`mj _8uzxAUDt]mw6@i~0Lgtk]E)YlW7Bn!^5`K}L/hp(dyAP[wmrtTx]ުx6>szX7=rصO' 'KTww2i;~}3>7 ?0VV8;5NOw7 G846V_"wc<+2ƽpLYwY/6D SX]+¢c݋*7;6 Qﰑ(,فKMu3t#ɚ^,;Bt/FG:>v%󵚝^k5r^G%Sl ،=q&؄zkzDJdpŢ(#Wfi`+MmFㇶb/Mށ @"y敕xmZCmň}<91dpk8f^Y𩬿jx`^-DaYKSD˸B>>8JZuo!F9JXų7&_KY⥩\:.R[J+xSg۪viJd]eh^Lo!.\qbPwpsq(/E=#9rW!WKBvc%wO!+KټJKH*%3)=8OH#22U+s~KL]NF/g{<\F.#oDp+{$ie(/CJDu!ARbt06CY<nm=7DaD]&YK3iOƨD.yJsE %,]H%A EP1a ܕ!k)S-<0p莹f )d7×2XKM\Wb`&T NFe+J  zX[Md ` 0hANy 1)-2RR,AEZm!q)*uH¬BʑY)+R(|_ӧ:Z+R#cTe NrQ'h1T}\ YOp=eŘنTzKe MKȠp7"1ZAXv۱kAu|H[*Ӣ$lJU|nS9x8_C08uG:ҿفI+YUV7I>͏TOme9,vj\I)ZG<54^Q,FҪڡ g'Q uAeF8A)'az"DEJlm [t'hJOq6Ųn)CNa^Mi[5=u[y#R0SwyjX)6kVVf'Al@,E VF 6= H+jVBDI=I)g{_4zY y ZN]-K%Q6{iQծ.3E^sns!x&cߴT=Z8h- VO>'Z |Dwtd=o'R{޴7Gݼ"74I6 OsopЛҳ Д#tOHm]~z z裛:)y>UʗUJL]⃒/w/:tJTM( n|S]řl_MQ6.^2PO|6U#ĝZ}gK}ۺӤ]j)S4)ԧ- P N5GHZ} ǚq6>bTeSQНڊe&J%OsV=xGyoshimi-2.3.5.1/banks/Organ/000077500000000000000000000000001506652756400155255ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Organ/.bankdir000066400000000000000000000000071506652756400171350ustar00rootroot000000000000002.3.2 Myoshimi-2.3.5.1/banks/Organ/0001-Organ 1.xiz000066400000000000000000000044351506652756400200340ustar00rootroot00000000000000\[sJ~ϯ`yq1*)Pk;L `tc_=H=#cfz#zZ}G|o=1?p9mh vȈ&{e. ֔Aʈ J 7d=[G꓍[.=Ou;>/,h:z댸S$\Ut*>c;. X*q/+~uB# ڪ|,x !¶[fIk TKSP?x"Ґ2 v'ϱ!RS|^>ܙujn9U u'2>v{eڟu-(—#eM_,6r,S& ):xxBQy RVy64#, Bfk<43n8K8;DJ;s]%_K@ٷ%7*;O\)9h_Y}G)r~!OH]rD\k{n +9%.'DAL\A{Py ưa3 B&!##/>J"jBGeВ^LFMs$=) eM0{gL"M0 's2"&%SG8>&:DKm=b6ٞ@no;.sHb;BfeX' 9fdQY\waMgBe*N+/gt1Tl ozƠw28 Ұ"!9d;K&MEG 2p;aR~5* mPiM<70adesIF-f7K|EW,\9QZFJHґ}7J)=$!'iU|&h Wau1q6$g܇1\26 W+>N>d4OmM)KP>[SbN((O7 ̢!{|\Q65@QxQ8o* PƄv0QQ2tr$7ϲoWʲo\ajJEFNTw,+*b]|2*Z;׌3,fS~7EAB\'[%JKS&vs5K6n` rR'g0\(5:@Zz#":eĈEɉC:P0P1u-5Ma#]9wKx4NlN ia\as`qۄzrFNrknn %DE9Ǔ6 o:[ oW4Ѐw_p׺s|FzA>Gw9_"eE* 'F-˰d3艺3q&KY0P *#ʗBy Ň!i;D;L]|8QX2';zXU s'g"1:~PUmSC${NQLKC%`{s~,ٔHG-\C4Fu2d{Uq\2WM/H&o橒ʻH-M\iW4=-z~9l<9HzHF{,;(BVn$ fܮ/+ I =yj&llt,Ju+8NR>bN9> zH (;(e$6ɇEe (Ce75<)3ӎrRր2Yŗ:uwLg|ܛhŃ|Cx|}gg7^z o;g~m=Upc㏲7Ss枯d}z%Z>JB!Z[u-Ǻc}U'kF'hc@;$w~{Ɯ;tQ|ܑ:P@x>4esj)c᥌+8>Y}->9(OIyoshimi-2.3.5.1/banks/Organ/0002-Organ 2.xiz000066400000000000000000000046121506652756400200330ustar00rootroot00000000000000\sH_Sd ۸:|omej[8I8ףQSj?ݭyfxbAއK`;y:9k].nǍ?_W84[RdCNS\q=~|'Dw#ђ$O4Aj6-&)oKuã9 _Bt/,l6Z\CZۑuFR:ݍh>/ѩL6`V?DٍMH, Fn BF h=EG]B*ԒG>($U| !2=*>x9nh>Z5?mOm3Ƚg|yy~>8ՃOQ]-C\@4EbCpF>iL|H_6؃}B, F "IP.P *d"%˃Re&Uу2JAV ~(xTurbcɝs(:ͦy(lr1^M1Tz<7[-2KS<&6sQ)K6.` rR'w((5*@Fz#"ňEWLA0Xbzud>GmWQ=j,f%TΈ┭]Qː^˖8I*ȅaZI!"ʆ>8Tix\"\rcxBvU;@) vmzH^>_}RڞJxåW)U)$B R. F䝉!QYj2`UѾ[m Iˡ{)ErnY(=ɶVBCnF%&+7mm䂙dӒPI Y}o}edEFtryqz`͖!J횂>2Ed=2-=boD-WmBG 2zG)QZXYM;:[O5xށ1^7r%o% $)CxwɦZ=*U1tɱ~R胎p:l ֠3>uhu¡V #! 8{5L{RI@ g&Ļ k4IMe&e4y &R0y,HvlRBH95kPVxdJ{uMzΠH#%;چ .A{i"ᚆ.4,ՠ#Y7ՠLr5jPkeՠ R_ o:|GerwxHѬaُΎÛ㰬[2͇8+&jXVòz2U<>.|&Oi֓z8'/kXfaY/+{#ԃ(L2vNVSЌ:f͇~)0s=yaXhp4QO~ٖQ'K@V\u&|3vCGp$D&N 'E2i~%C_ɺ}j*YJ[u%ƺWc}Vŝk8FB&hCZ+$oͺS JWW ]ߖ'D紺[:8,wؠ;_Y^*߼}!))[QP6Uyoshimi-2.3.5.1/banks/Organ/0003-Organ 3.xiz000066400000000000000000000047031506652756400200360ustar00rootroot00000000000000\s8= #lR@.![7Rl6gL$dd3s~i[_6#sϛ/fg;yn199k\Njf?ȶow4[QdCfɟ8n$Dw*zhaۻԮ$X-YF&݌̅ysȸOdG!if ߜ8!d|A6̅*|-x%–Kf cTCS~D~!Od@]=x=NJ0oᩚn7wWlcN&&u#~nſbSk~nyh"k)|޲LJ˔ H9Ex6\Qay{AlP4%!Ӆyp53ޯUNql Vܩ:.ƞ ڶ@`ty k>18W1B _gߑw,y|a ?FWחַ݅5'qaRl=%E|"“}wp"'&.@Q= Ly F?r.HAJ\kE aN cA4LVɊu,'IyVDnr~mbG[ݕ >8QI }HD$S~O, 'Mj֌DukqC GRۅk|SEsdR?ܯ\N 3f(-`vÎ6=Q+RSw1z3Ah"/ +،JԳhP^zDZr wʅ-'PG @Fi'6熐e Y^]RlrcΜ5;WC䅖G%wyґ~! BzbI\ңhU|&hƞ~q1^q}jRaI9 O!OېzcLVCVQGO[y} 3 =,0_8)-` كBZ F AI#$MHP 2`<')˃S&&=/ūeaJ9G Hɉ.?ewϕy;fcBWQ|tlVh*Hh>w@-p% QN` 9/l%e/` rGާa+8YQk&TGEtG, EN\`kn[w'Np/F4M)ٞM):IK&^[`$Z 窆饔BdU }(P\*$Z(1i[S} wF4?ذu#EEMW{W^aCpe"ye" GF f}T9ɰqiI,^2($$DA+$iԢIcVܢX`+Kȶw]y0ꖪpdbt(6݆I;hN1-}B6ڇ (j&-+>Ϧ㨛ے6x,J9w y)l+Zi/k]|Bkz 5&(NRޗ]w#WS}R/Aq|NJDǨxx3 9[ꯂe/_=QS JU3kp^{8 }MtEy7-H!G|iDKR_&A5CK~!=] CK^0<{E );-ްJXpK 6ar,WI| :Avp [.gM8倯|P4׀%i3n񡔖AWwxLĠQW7ΛlaՀ|w=tl  )P԰GegQO1|>ܻòn q^чV9Z>\ͺո ? 5.qYALSqhWmh]9#J4{I|%'Sl'q v$JgU!===:UzSo,&dG4{=t)flX׽:-gmoK~KLjZ۬e[C辐!>B֕SqsX\Wj+u5֕l4;<(Tc=XC.U! To0z. 7Zpa"C9EtL =c" fKA7e$jN(rgRK_p>x9[X,Vyoshimi-2.3.5.1/banks/Organ/0004-Organ 4.xiz000066400000000000000000000044211506652756400200350ustar00rootroot00000000000000\[s~_= jfXR' [g΋J"xl/dE[2x\O[%58in6ky>|hޯ/_?{dl2Z_¦!wG)=?4;Mqvy;)xLeAؘ6)QECzqAvgv ه*xv-ftg4-LMAzJ⻱uJʋxib|k2t">c; X"q}V" >  B?3VtX 6fI>LarPCȀ*zj"?z0oᥚΖ9[%``p]7?0VHZB9 2Y|){ʅø-+*,Y*j,癦yAte6&6vNg-mQ(NMqg-Xٶ%3(O\d)1 h' ,?V#Y @1~on+o?z;pOa'>P<%e|"‹}qp]"'&.@Q< ,y F8n\ja.ukm s$5t#e В&T;ldyl\"zžߋJ$0g7;;gL"L0'524N"SGH , MjvDu{qC Rە^/J x`^x̽WĘAKf m?b.N'yhpZ~Fm c{V)K{1z! `4KÒ 6䰕,$6rH9Ca焑rcKI|d%2lGKiM<70n%dEuIJ%f ?lI,\9ZF h=EG]C*Ē|Ц >HTUQ;Ix2˃Q|;&(,>ް30L@`0X|!83VQ_҃|@ԅbCpFN|R>~2Y4d_7ܦflĎ30 "'IS*e8@y$6,rNK+[QRJQS<\7Q,Rr:g%}g]NW\gDЊՁ,g1NM g:/ZXe4 &YR"G(!t> CQJX3w?",[#b`(r?( &q.^̾wSݧx4OٜDg1¸@ɯ71@$\ B0Q|9R'hye^t֗R2^,/)ihbh?خu_x$JuQ6}\Η>OY&oL/`Ks22OlD %N((u XP܂ hfHR=QN)R4p @c<ь}ae.90t6odAYMmz0t:hM1-}Քys>(k&*>^g o#id Qjj(rcy9 B˼[︧gkJMQ޴%RR#[1ts]ERʹvZy?wSKV}3`9+YWAōdXWj+u5֕lawzvZ(PMl xC4#7tILb]OP~{Bz`^_?| 1QmKASl9T.˝qVKy^ʣ}GR>J ߌ =V;Hyoshimi-2.3.5.1/banks/Organ/0005-Organ 5.xiz000066400000000000000000000043571506652756400200470ustar00rootroot00000000000000\o6޿Ԗ4D%vf;ú/#ѱZ[H;ERGVlE`@t<݋ܳl0lǽ?k./O_?|lm{]ubӐ½⥌ɖ~f)8.nQ旧4hcfnF^vIF4-wY6D(]ѐ$+ dz9_~Qyަ-;k/.'7\(`6HL7\}bAԋOjߌu3*֧$7\Et*>c;. X*ϗ:!qB ȎqЏmU><a5z%)<KS}WGOm;QX)VdXo257 Μ*ۺq߃~h%D5?ݷ-WdP+O;˚XlXL@ )zxBQy XQl04#T!yplٙK68H8FJ;s]%_S@ٷ%3(:O\i9,$<]Sf3H1,o/Jc@x G/.y" 4S!ܜVrJͱuNGAL\A!L6OTȤ#Č+ؖ_ TQx֚{1^.t$+(%T˯\":aK ȽE;Y8Ojvc8[Ud >8^d@D`Y'F"-fm eR*n8&؎.=t{^@ E:s䘹AKkgq*9L~w9 iA4C(V$h1#B.,eu(Xkxn-۹YyDq #ƖD_2Z!6Tėa$(dEsIFU֜.k6 #WQ?`@W{iS I_<<>HT]㝒Sx{NQ|`IњY\ܓ|ag`tE1Q|7aqCTCd,O~kTecÒ9g,a ٽWde@VWie=s{0DaYЧWP0PƄj0J0haU\/U^<Ͼʫg_uP^PPFz8LĞd9{z(^G<)N;.ƻb4r4:7xz)Ҋ59)%=$t \"oHr@MhmbԒ[%i%fRށ U#eʈkmN* gbZz7/wAۓz'> ,Gԣzv/Yfo}PBN X5J*{NRe =B05lq>RDH= :5\2.IqGl wreOi!9>%I zA>!"hIRVɫRVI>02 ɰ1K|E: ΂Aʈ->I;{-R.+@*,oL^/`խt-=9ߨdAަ6݅I:H$1JF6ڇ,([&+6_Ϧs>~ၑ[نhkzt8:&sfB!$h;\Gl;6)NEVTw K  )ҁ  ;kH]Rt[b0a~^9o^2D?**W쪅kB+]@w Ɖ)1C+C D=%<#c=|/oAQƠd9#-G X$ױToñyȋazQOw0GT~1+{ŗf7vqP}WGTDA;d8z(C0F ŏCQ3: },u5o/I (1^c^hԏ={{?>lWxVφ\=>Y88V:޽u Щ؎`ұM(_|_N8c=z=0Wmb<+F!i@Liyyi/#7!R|kiXghv79gWRIC1 Byoshimi-2.3.5.1/banks/Organ/0006-Organ 6.xiz000066400000000000000000000046071506652756400200470ustar00rootroot00000000000000\[s~_[-Zju漨[Io_$% i2n/[_7s?Սs-vOy>t1.܌j{r=.{fӐoG ?:fUxB֦VHnh+geD54]!]a_4'{ut<ήtRy޺ T\\On"Ql#xĂz緿*]OI|3PΈX#r3 Gl|:qCƱB,:!qB ȖqЏ6̅*}-x %–Kf h>Lar<ѷTԶI~+VD*xʼj8qɌ $ `Í # &|gkFnq V!BlbB~< %{"̔ J5WUk4טzf-xhĴ<5}h})Kuim 9^W?$ەg!Фh!A7۵Fʅ-'Pǃ -fkZ:٦5qrÈQ%(UJ.g܎&/|fa 1#/<(|&˓{QSK⒞^>)-` ٽBZ _pr/B1oJ (wr0^̩yiANeOeOaJ9^dYTUvŴewRϕl4Ny(t<_MT|F@-p%)QN` 9/l%c+` rRΧa+8Y)Pk&TGEtC, EN\`kn [w슋p/F4^,vZ'-}4^zP=mik\·+)ȫ(zVZ^B&.:sXY\,I{T.B6ZS;29@) v]^#IqJkp}˔eʔe~+*dX8KltOޙQYj@U6)`UFBBBfHZ#mZ4i<_[ B垏d[.;0tꖪodbt,ߦ6݆I:hN1-I|Ք  !5U~̮0ne#m ^j7Ly#XdnꙛQ4(ʦ֫6-C"U4Ԅ FW:}D<&x_V?tٍ]1.jOJ9x1]:2^[,l &KbAk W Uή̠N.~%\hFu-֫JpH?x \c rEtѽ %[oR>@ 0a { }*oaxV&pTdb;HںAIBx $9*e=. Mj&P`WD\/b4~Pf"[÷E(@YV @K~]Յ@M A%jeGRT54M UL>x{Qr`{e=h&{e*X8+^Y똣U_+6Gvsd*\&86G #fٛ.ey|WěŅN: /Őnc ڿZ!Mg>0LG٧⎬>vc}](?1t뱆>ljm?+z. wXps_>r4\'C~;!:hCAw.Ԝ9Y囗rgoHJ!e@]=<ↈjqkVxopX1͏shu-KttǼ-o(J˞/9){ʅq{<[ umoMya%D_;|L.QCP,Ķ/TȤZ;,PDz$_}D̡ IsBKz]2衹4,\"G}š;eM0g7;gL"M0 'q2"&%SG8>":DKm'- 6<0J $*Ͻ9|ʫl\)#G %wUȾkB{-D%}|r =c'7I>Z3'ϰ7 sOw0F0,N>|(}+k/邚}7RO!8 ̭|,` كBY Xp B7 }j}JL$dykD/T1?ٳJJY%6R 4x-;Xu*\5.|6M4-HkFӉYABuN1-9)447mK# jt鼕p2&"(U-ڝjW4TEd:9AjXM[+zV:KqY:a_g,.+8Q3Zs慄 (34t]cηpD,٦}ޯ5)ꎚПwӏr(kx1efdA*"<=:<-㹹۹[%K:$S|:t|Vt:nKrUfW.3Je_ɺj+u%߭ƺ_Wc]竱V jG:(T&hb@+$V!m 'f2.d?BwG"ef3S%|,˝rKy囗27$%Vpٝr4g #?+Vyoshimi-2.3.5.1/banks/Organ/0008-Organ 8.xiz000066400000000000000000000075521506652756400200550ustar00rootroot00000000000000]]s۶}ϯջ+IQmyi,Zr )D꒔cߥDAR>šv8X`>W'nyaj"pN۸x^j:HG)~޸Y[ MZ2^Ua* /[A-mNV<\, &$SSwIQk lv3z}:0ۜa\߱} Ry/ š}?I/&O(ڏ\9LL?,Mς^>%k~Vɩ7ω24 G.!YGw,ق.xQ ^almm Ȕx*bRXVz}7u,)pw',Iu isOlnlͭ? 0I/Dɶc@jN:\G2cʵq.,P>`2 GFҰvoP9Lܔ,"&&y3vv6۠$g2NO"NړXZO p$4Fl+`&?ΜIqZIM{Yyt]K㤓ilDL+"cniNJ /v<=ڮ9n 30,\vVARbK{V`S$-}q#eGjj)(bs⼬'s0>a6cuKq+fq|PezK69] c>,V5|ɓ{-fiRkN@N0X.#7ߔ{{~Su2/ǓPߊ9z{l@S c\ьތgWESt]fqdvgGp"'X>ycP7Rk1Y˭۫.9p[t)n8CW\_Msl(ݶyXMkJm ݎnWC;x 4t>ц h:2te /C`pq|k( A0SaLiP AX[am~|uAX[amuAX[a<?utAktJfutA]uuAiҨYa]uuGǿsOa=Ad\: z: *[h( :  9q 5 l: l: l0HP8C uqhf l†04A0Fkc 1hm g64a1 i65ZZS=ާ/K@FVAZmkQ-GVAZmk4skn젿645a-M@ưFkcXc7]fcp,DicX1V;0ؙ?GT7vgT*h#XKnkҶ`VAKfDF WFZLm ktHS,^=bX65*bAs X65"c!X$65n k6_r kJ nH9fHm, E3TFkq^ Oi*h#X5U7  NՍ΀ @6ص  `ưF5,@7!3r k65 @@`6 ڈ]3I˄E *h#v6b s5R`Amk]㍅ *h#v 1H j9b ưFkcX#m*60I HmYb0QVl!XKA'f $&Sڈ]`͠Lf Zmk81d 5a'@<`65j~r@5MnܕưFP@ҫ!'(v;r=XȀTNHelF*ck'ATƬ3Re2* $)1CF6ě؊I* @°dXVJ]°t:Bt:6 50,,@֌ulkֱal³k\MƇ)H+[߃VI-Pv܊6scʼ7$.qX]hqN'_/HB.G"LRuƎry2eA@.ח=ꮄ2;钞b+^hV.\bbHSUBhPFPp4-w;ٷ8n4 !-OCw5;|6ھ'Y`(aY&00o!es)=H*Od\jJ=azͦzڬ.[/Jb%~ +zEvG_f%c'KL Y.0.VKIv "M)5qH'-:$*67Be)$ooDakFd;&&L/:Rʲ~Il* ) +QۀUglX&اtrAwۃ_>lpZܜ7Y .pi҈ggl ;pU4zU配Ag^ ^Px m)&6FRKp7B" ,<6ŀ/!kT aBv9GX~~|~K/UH O,|:+-$7r Fο (lNY4} qvœYڝNˇ2d_E5kLB,hwNoq2U5?Y -{n }w]ޮݲrXrE햽yLNFӄŒLI}yLĪsF9Twa+*2jCe?l(n1:T&މG$~@\g8<$/zK?a_B7r%[$_-.GlcZ>n,',Iٯ|C#UNmAw$'|9$ecbV.:Ζ#uڃԛske:$}B/'U#؎:|2on/ӹdnMKm-y*\F]%^aEW9s8yXaEÊ>.W(:# zd įW_/0'"Ec;͓Va~~qYĵY"8]~į̷;+;T-8?P+]˻8_qfۻ?O;?? B)yoshimi-2.3.5.1/banks/Organ/0009-Organ 9.xiz000066400000000000000000000043101506652756400200440ustar00rootroot00000000000000\[w8~`yO pN/&,gEp 6K7Il.OIh4)o?{mZ پzwo˃wv1:~7~z3g84(gwmO\?9l?q4icdGޥ^O~pWAN[«~0j%59Q6%=IG{i8H5X0QY/dEKPYreCڑ\K7[[O擌!aKZ9X8R%)U .?oOaQInu> BFJh=#JYt@Y?HT#B'q5Xݢv@h,nN+m&9uڝ)(=jl>G(٣ϫ7* E4AO9!Ym.1̦ @Vv ʮEpr'%I9k (B>Jpr'GU uI!;GyPv1V,0}vNU*Ѱ7O F8Jقn/4#yc71~XcիI=}T/w03t0Nzc|CgTꋓ]?̈́zh\QάlȜ^Br־M<۪8نq T6/S4eA":v~}zt͌zFHz+zZ}|Ӈ?G>{rn8,^\vЈ½цݶzqҥ37l\%p)2!bY7blY@\/xBB wKV>!g.*1-@}B) AAw715r[ꑭ/L,@@=Fx/DL"(aW C[Y8_7!e>^N0;zN+  :}j6sH֌GMlx;ە|nOӲqbuvܟ)5(32h -.$'ϑ{ړb;`4R8Ϻ~:=Q;k  n4W "ەlh j2_/}lt:RHvFvoI%cB+dtؚVB-}/0T$eesIFU)gsX{[}O%gz_U:p' I?uD>1!y!VU>x/4fK. oE7#arzj 1Dq΄.]Sl?@de@lk}͈-/Rm|&Q@ϺL@q2!ː'-rZkS%3avY^#sMdy Φ'93! hXz*\Ed<_jrHg~.;*.g!B/[ +#*ina;Ml"G?Fhz]D 2һPAbĤd*q "S4RzPweu"⇶+Q=r,aw G/CL[I*l\f.G7JQ4R6aG]V^Bw]Bw̅;J ]xMOY!۴OJsgϝԪλԗ^W }d$\Qg 0-H1uswX( *#ڷBm>ɚ;{8g` ?˂vIzXeD In`>[꓅k.ݰU+:O,zvIAzJہj茸!i03`:1t|:qCƱB`,eҸ?+~qBl-m *}-x %–Kf >ryOC*zjۉ<NJ2gݍ9``̩`b]?N{0"xH~,R%V6$)|ڲtf;-8$b.k6__T^Lf^,@1=t.ʌܼ9vڙKkW(d+Ȭa(ΌqKO_jhuf0&'{jjQES#YBh /!m|97ףݕ֫58fb_Ԗdq(2S6|,,c cp lYND@Hj4!v*.TP.PA-mZ+{4! At%0_4d0휺SZQ㹎Er{ߋ(Rvɭ]l3vT vā'24&)S[b~Ge6KϷM|f46[׎`Y: (g-Rv%A?Oş4v>~WrRn5l^tFK'fILc؏Vm6!Gj1?q|laA&v԰$!ٮDM &UziC\nk'Z:@O2GidքJsCH #Hy6VTT)+N_g]f0r>Cˣ~H3]:ġBTOZ7T ?se?lG~28U)/:gZq{&(G.,}h EI0:&>,N ?ȫJOeW,.31F'3fѐ{~IH ,i]" ׼65`/*D6MBZ_8mr9&Qzex^ǽXeriI? m~)PH+K~ڱ{%b~"jd ޾mE9ľe# 4s]E /&H},p~{z\M+r~  ct2""oݽěȗ OV:ꬦ$ήROnćZ^{2Ch>H`0ڝAۨJ|Hoph9V ѿ] N&{Rv$r B=xOLjtBA4UT&qA&uD{ MŞ&-I, NQ8LoV>b brUW{~W*PJ(6`+ w)@Y (@Yi'j)[|(JƛiU )kayU,9~z|ʄt "{eEPk}4KER߮sm6U7۫*CVa^ilܫd3Vv/^j[{fo/Vۧ\R%*mzqJ}UϯN䢨(n;}C->:*yw8sT^(-=µB~QM"J~!gLNR'}HġA'}*.,QQv}GqCg'Kq g^GhC/ > w.áy9O:ʘH&TW.6tpi a"j.wV+ xw]oXb/z]yoshimi-2.3.5.1/banks/Organ/0012-Organ 12.xiz000066400000000000000000000045061506652756400201170ustar00rootroot00000000000000]sڸ{ $;4Yfs/a-\=²%dvxj*/>mֵG}[45پzYws=|394-?;пCU#Gw$G+> Q튮^KĊ2xYBGdz۟&cߖdG7C}>{ъ!sbaZC?=|7N:YO`:K4nٸK`(EōMH, FAaptZ$–Kf+ktLKR`?h |O'a\pY5x. Ac'(zH>],nPb,#Vl'Q)RN hP=f~.[z\Gꄐ|p[snXۙGkUx,ga8Rp(Jz {8'j`.j2!P5VAH.57d* 0{h~]hՏ 3CRl}U9|L@_]'Ze`!!?o3\QA+#^c^+=(v#WE V6 +%a*h=& ?4 C[[2`l?0~'U2+Dթ![3J-:׮X@;'Oy!]_;T: OKTzeF $ɼh_;m .엋VײV'jG4Öiu!ԆiT^AklWW#4v!(&A7۵3MS&c>Khtؚn }/0cyq)BՂtsQ(tCۧAH33w~(ԅ&IJ~бar?T1:ާ y9/>Vgq6c|;Vm5s>͞m|!c};96}:HKOk8"瓏dvXFtɚfӈ=AK s-<<(I!R(DB-\L%8jyP㪔/B(G *#GyXZw8! ;}4Y սt0+CdQ:jPRP>B=7[-Kt ,& YQKvW@ Gw(U| 5S@.()b.gQRqY\0`1ls+Ɛxdv"⇶+Q3rlfo~@DN;5H "exNJf \Pn2hDVIЇ=Ky ^r..j`T^R air_/qE+yC$A%Qdu^^,W,+}d$\Qf }% GdléQ0V1n ';[h|Rݣ25rnq@"s{WVf@BniF&K7ˢmm䂒AŰ$8TS,50Lm5YPKZU?GW ,gzn8y#ŘGzMjU[7B@4OL^B\ls~P\JxՄ0B{ꩌ k nk 8Kip;)^. $Q\C'|h \X)Q Y,x[2L%)?%@|q^I*]T:bh(0(HROaH%ZD&RZ-D?dT^Owo>ѓT Qu%4<-aH%VC]IP@j{U,jx,T ThAZh+uW`8\!4('@ZM\V߰H!A߯{vS] L l|b^rL"1Й>7ezgy[l%uM,ؗ? 6LRhJ\V58Ea }~TT QLI?'7OGyoshimi-2.3.5.1/banks/Organ/0033-Cathedral Organ1.xiz000066400000000000000000000045401506652756400216460ustar00rootroot00000000000000\sH_$[˵ٗA6 qpǏz$|>=őZVMgvS{`AާK^c;w~?.[7t~yDžC# Rv[|uqfGk~yBC֦vD\n~SֽHe ڈn@^K7ҕ::\Mg7x:h@yt>Շ>dHL7{zw_4Ԟ%X U/ùEn፵fՉ[H`FZ7bېX@\/y§"lb9 +wmnDyjjG=E\tEs- +9!:HEa L<A=Py(A*skFJn2w{^p4K"EnȖ>}LOҖDfkl}ϵIOXBrDwzzk[V =<N>ӄd '@@Ng6sH6EVˍ1Xm?8#(\wȪ3fH  Z3'O7{FK Hɧ ڃ'VG'j}>|ld%]P0c^ɖ1aEenz fӈAAB.^)U\Bxw"z&Q@oB@9_B&\EUQ/ճ0P,RL$^\Ei91{U3[vNUjYd8i Z=pg~GVJN/ s!tBoQZTi`5NL)C?ˀFhy(Pk&r])X$.=6 Sn+cDvӬ'lN 8es7`qʩW1iGC$\ ML01t>_+ı'`[y}އ*d^Pi2E`c{Mb^9@_s--W)U)$N TiadgX?egȊz(%N( 2F&.OCO=Lإ+:@C<#ΊB0[YMT ¢z:t&s" bZ)&§6PLUm8N#>K>F2v96D]qԧF1,`n˼]e 7Q$sfƬқx(PN/H,);ٟaӣ}k6ҥ*;f?k P1L=MW0-TTәǹϰ*r,xV+G(X)(-H5^Čи{BT3NwA1x7=Y8:ڂ4}IΪ90ZASXs[(7]cOu6:-GWF _үP|+kc,㏪@;bd+F2_*؞d1Y:-i VۥN}褢.amҀ2Ԇ@]4,U#VL^\Vj `Z+qhK=jV '@YuAYt~S  @Y^oȂ2r>Og*P"P: q,0]㝗=̷~v ɝ8\~yŧOX9sg>?u)Ԝ/PH),Ǻc]ʯ˱.XΊre"k8*X"  ~N~`H .XWWhޡHLmmnhS,_Y/+߼~CRb`*?j?rQ}Iyoshimi-2.3.5.1/banks/Organ/0034-Cathedral Organ2.xiz000066400000000000000000000050121506652756400216430ustar00rootroot00000000000000\sH_ħl,jg˽Lh' ޿~{̨GG^V#}qn<0sn6n.&g/_>||ve7\fw7Kc /e6 4+&WFm̝>xo\ݺ[w,cf##JhHW' t6__ ! uç9:?xEvsAb'5-L}sUCZ⫑uFR:zti/ѩH6`F?D݋MD,$n|VmS7\2GzFW` ATDSMx7D*xʼU5,o/"57gNm2!]7=OH\KN air.sʥqmW 1qANA-D[.^e¾lx.Q̧wk]tq!6X)- sf'SI%)bK@ 5\.HJW )|-~E*p $bF]^]L!`VqQ[m /T l g9/ƫ(/~"H&5hs}Jn2;Yp4K"Ş~ؑsH9ሸUԹsZ3"{~wM2hi -.^7aOBA30{])C;WRpZ>M2syx~LLk2R܆i\^k˜lWTJ^Duڋw=.'QE*ekZիK21ԋ;HyV4dTX\goe5/BfhX(#J,Ql|SoҾx B[.!QJ꟟@=J236f % Hkfq@Y~7_1$% 3@>.hzcY)2b٨*jؔ<;xfE`JwN1-IbAKfWuc([&~]_g1eF:~Gs4C8̇xʠJyw+xIM"&oB<9\CܶQv6N_'DknZqN#*+~f: uv6dCL{BoIq fZٷNj}kԷyj7itQZfV|/v,K'k7<7 :yZAghv- N7]wXk<8q-T|W Tq,F*!!f|!)pݱ/<).DDmLa[z`;\sY/A@xaZ3R?A2f:%cXc5Y';@dá$\dNjk2m>j'H|2y\G`?(TVdUzB%#z( @ YHt*0!4Aboˆ z<'3i)rp[4\] ue6R9+Xq^[kE-- ͉S[?irUz=Ԗ8e!g 8eeNdV]d@IS[vj6=Tߘ<Mѯ@}Ge^3m}V4e]gXv[}n}LJsӬwh4MYCxԖD*n=ѦA__(=l#_{`KW4*c> np'Yӽ$Z>CBjg=ֵ|Z~]u-:?uL.ڪXÎR# F^OWH8zr@L—l .ؓ=^x)!R>@Nɻ(9g{|R I@#'LLyoshimi-2.3.5.1/banks/Organ/0035-Cathedral Organ3.xiz000066400000000000000000000051021506652756400216450ustar00rootroot00000000000000\s8= 6UbR@.![7RM&ٿ~[䖌MlyjVvS{~xyYQwَp^[L|hz\~3~?Jٝm^7''qهkxF%͗!yt[&M7/X;[,%nৱ D뵔Ϙ=glAl2.oG|65ly}xq<fOiP50W)*)qCvl]oW6:qKc;< ADHM+~wB 6vԷ7[ÂYtKaj ` DDRێ7s  Uj<[$ Aag]2">q[1Q:ֹKov4(q; Pflt#ZJ.S6> ;g Ȗ+"jM t19y+gQ%-U;>x HUq9wm+_@] =hUp}(]58l nOrGo !#uIĵ-x779!:#"#&.@^n>[Hj4Sa KA(y2n.(u5t#\YO]R.2U\ҊzN܉Dٯ[ʧTm_Pa^+U2F&+>" D{V %WQݺq\ w3<(Váe nDNm4?mYēgq786U9nDMz[iá)'cTTK2oʷmN[D>[9-w?u4ZZh}#Π̫e[ Cky̒'Yyt ' ^RN ۯ=,צr̸(Em"=wF~E| zr3x6 m]GZ9Jt#żw;G#Q_5y屮u;^P3Jxy K/_Z+?(x`1%/` /e9ѹIr}-*E 8UтSSK(x̊qރ˔E â kA^fd;& V<{Q:dbkAQCl Pt:hO1} `yP*ɇc1aP o鈵*# guW^T\r37`|&w,"v]pejjEQCv[^~/ eTt0eR}P_2gHÕ7lL²|ҵnSOO$0'6T( +f}Sq ^,߻,N;N7K86;^­k;:)Լd|XdYUMfM縸9S#%}>G;fFɯvF)";3]gG_Ԛd]v8u%T|`C*g5֕tJz]u%:+eXXj5pPґm=BiI`ܗdN]D'4vhcpѠqG!;Ʌ>ż1>Λ\(R;^4d4Y]5.k l6ZXx~wS-ݬOMgt }&<<3F*e"lЕK!# bN*pu!\P7msEbг.}%7 aŐ) e 0'.S, n@RinBHl;J ۻ|܌ZEb^RSr)\(ʍ !-fLe]{p#J- %y(,F^], I vqJ kO85VE / giMłGn2;.'VFҞaL | zk1`wlܿf9(dbpd4}U̕ \1D޸T(^`!}e@\e2Z}f35joÚfPfF-cÛCciEs>?S$̦YXڸ)Ewr:ݍoKו[ `ocUS+1j*@%Dc<0%cˣ$ Ŀj$$)ceq[Z_?ț,j]e!NًzZYTe^UٳrW;)2d,sumU|󂏣WHT~j/Nu>U; >uGxVwzʩ|O/FhSz,1NhdbFPD$ֱіA. ~milY *ܣrJS1'?TN(yoshimi-2.3.5.1/banks/Organ/0038-Church Organ 2.xiz000066400000000000000000000065741506652756400212520ustar00rootroot00000000000000]s8~}6-6!% ^\6;`s$_,Kn USW;?I>Zj˧__sa}n_ZF-c?>7_|ݸh?^oG[8tIOZ2gK^c̼Ћw~5N6ȍFiDA5. 4=k6QQ#k7v̦𯝗qiD6]]QviCFqq~;nTWkPh>vFb|??]q뽸]xh$땍 f6uwAQ%mAo5VRSW  }c/?2ﮢEzWMx( d.:&>Y |8Tmk~1yuM.0ևvm|ض/0#k-8MWdk# Ն IDF%kzX<ũF92%IwX"}AResoitxK-;:]ya0%\Q1J)S٣C?[EtZǖF.FGҽ]On k4p&`pk Ձ[%& w0HJsb&p*~eqS++(KvUC/o ~ R}y͝Bi\-D鿮F|&_ @8r,VG]}qkoNf旓!k/Qt)LYe媞Q.pڠZBđ'Jk=ma4Ք8 |*Ưm軜zkj"[Y9Tu`n+T*i,.UnKi$JwE嫯O3UkzpHw/psl^]9!_(>-|-/7_:t4,-y6FVF%l]}q"qRܪ]gr6+ʼMͤ'qEK0OM ekRL'X _DD+smʰࢩƚ*gTpD :]yyFۇSILuX?`6XhNJ_sUGA(mR./b䷫{=eI dYL&^a%<]F/jjaWTTF^DYȕ/vE>W~Qr-vÛ@hf.1 ^t!(EG뗞3 ^kƀ9K@sbY3yI*(;Mi"SsHՏuw4xa oް'i"cv~2!|kގ_=oW [UP,6jTBjc xSY1^< {C*mzYpT V'IXynxouWr˃cz$qnbT~*7*Q%52F*󶨒rpu,E0'+Wu"q.=[ Yҋ$@ם֜Yh-2ʟ'jL i>Hb{gyoshimi-2.3.5.1/banks/Organ/0039-Church Organ 3.xiz000066400000000000000000000042411506652756400212410ustar00rootroot00000000000000Zms6~J {)R _4-{Ʀ ]aْyp]j}v> ? ?6Ϛ O>p=?lҧ{S(W~EvS=CN_DS4qicrӰqOӠ1J i,+ȅIƋ&:Lwh24&OQ4Bbd%I4Hi5-,<{iM%iOِ|8e6+YOHW ~99[%db  [˒M[,k{(rxB\ڀ;6yy_"K-x6> sn `n~ZlLgRC+)fk~ݍVŸ!7kV,ִNHت"O- Pq$ VՃțJsA2'2)r@ÚJyJ=r!6ulkN z 8VHy.Mҧ}Ek-|ŁQAJ JLbV쐑>{Rw^Z!D ?wO'7ۡ'0b m+Cq,bW gCViu೸ G#++? iOtSiFػu$eːYp_с~v Gf-BF4XҲ c2YxKVy,E+WT.& D/e8v;\ j[WSq8lt>{zS^S¯dIc`bPw I i߬6,"n (Y͗z amYZ4:^NDL:Z"/S,8QK:()\J,R.o  ,6B=0rA^cRR}QI`i.%l(etZ[9ݯэj܁\}^ߪ]ou9iR!o:Mƃ:˨-}"HeSLK8A[PBB<؎2p6_D2à"WGhG`t^ٞ3ᢈtj!#ѣu% `d#kBPZx`0'pB&H r}!EPἙugc8{B$pev^2CۗVBVEr8mx;d4H8D@<}1'I]WD{+wg \摘L|CR w X^S k^?wQh}]}fnS5v E#eEs>*_i>nk_^3rR { sv>bpfv9w\euv֬V 8!řIc"ﱀnDuEs9U#Ta.1} 2nj[J0kDbbA5A9Z,{}%{IDr͛;pla]ŘrJTNΩ/w]mmYìv~wWM:N *u f"䞼ܕժk0S ZW@j"(;`Jc(i{*P:lSxN5ʦ(8݇ΒV2؅ks|6u՝= r~V|yٔn+~:Y Tdt0!fs”t 'K,Û\ӵr jPR19fIq)yFr]w-5ҭ0Q(Xz^ Ƽ:ڜ*i}al7kZ}[85^_Xz>2aα^-m*#P\xW;zFǙ=c=֫c SӲwPG5掏"6kXبEUm`wz"}ܢ_d1О9?(\/yoshimi-2.3.5.1/banks/Organ/0040-Church Organ 4.xiz000066400000000000000000000041551506652756400212360ustar00rootroot00000000000000Zs6~~%'!3w2e@ E"glj˹p}WX$l 7L"V?3K >O-yDOO}jr9Dߟe׿)[uP~En[9i'ь/mM򵥍+BV0]霕Fj_NV)YQʓl"Vt$ ik%@)2kĥ Hg{9<.iTgp<`ߐ1"O,I~"U<ڟ~gjH`͚&mc52i"lWS"-(ļ$NdkՇțJ A2o[/*'=cFk>**R7)=&tϫɓ'<֒^&Ep㾢kp gTaP (P֠2g4>_*ӪJ!0y0Gn: })#F˴-m0~۸@]$ φ0`+h$J,Ɗ TܑI\hGȔTӆ#[ #M!#5(}gVJ AndW lre_(i'0YIh-U5 KyaC$/wh PPe> 9 K9KEbʻT6)G@rGELx0BoKudQg2ÝtAJPl!p"Pg~)ԄBB͐z?F:>('2>@m(hЄNXr0.NFW'8Cf[Sh*oz"+m1jH!<0!E4x+tDGLo9wKʻ`Jj_fO,,Xzڸ?mlԾbX`k'vZ}[8 ^m扇z>2j GP*$aazwW{z&ۣ{WCUP-+ӱ4$1|3͚klԢj6Vj>Vn_d1Foh .yoshimi-2.3.5.1/banks/Organ/0041-Church Organ Soft.xiz000066400000000000000000000040221506652756400220000ustar00rootroot00000000000000Zs8~_ނIdi3\)˽h-[cs?$&Omj??b/ ևf't~??zqpg=ם&?])(W~EUUO@zqXi #'gYD QbxrYaasw^J$-l@g&y꺩B ϔ7lrkfY79suSDβ6Kp?6R]tOe;J4$df -ný.75e"rЕK!) bN*%u!\P7 gmsEbܳ}%= l'V 7X^/ ٦ܾ oEjuv%x4쓻x05ïxzTF2!XTM|HWSeb"iOt)FٻqIIg!3.㾲5Nr  , HÀ?* <-.#E8t)si& p.WXSMb1#r!{9z]^]xIpVH; Rܓw68dRjÙԜ-ˆkKoIX+] 8]s2 Bf?5bBKECI<х‹bD9Rss{|O)%)gTPE gAQRVVK6Ҥ]*0:RY.kp#H#L]aR÷It04[axᴪD֑[h4A:ҀZ^4?[A]>oUmUWG7gZy u,lӡeD^@øJ3*< !YdeTTi&_{7كX4,~q!h2A@^=yᦁFgץ㯧Ї V! CI#jpո,p= `g բbRfu-Wh.,xT9)kW(}i:Yle$ΐ}PA,p XĀ-~L &dw*+@i0Dgj6ê 2ÛWֿP~F?#G;謮>~7L<&F cÛS2(ЇNӺ8W@^CuyٲT):\#A:ouG7"x `qb>"Adw1)0S Ew,(.iBI9BRhʮ'3d*^f Qߦ<(g qY|$F׺D4qGIGB:W':hs|y<a T''POO:]@q:{7=X, 38ݯ;=+ Kҿ4o>5|ad,*r7oyCV8P1SHN,yoshimi-2.3.5.1/banks/Organ/0065-Nice Organ 1.xiz000066400000000000000000000042331506652756400207010ustar00rootroot00000000000000[S8_; 3N a.spIB&vʖ,+;qDWoW+rѺgQIyn =?;i_OϷ?;lt:} z7IohB]d_m'~lh!] iк&ߒDG)]I%Č$ eo: m.Z]v,~ 9IctG[L=dB+UZwL>&}r.xO-d\=B:ŴW?!~–1YADac ͘ͱk9\Ȁwlr%߇ !;XUd: `n($9ǝL.6cB*y\B`ҙ`RJ׀Kq-CO Q3VL%)L-zy-y2M4~~@BJ:5{PQ$= W=H!Tp'SQ #Ib0>pZ <8*/jE ?+hKA +Y}d^#w&8@-BO b >Adh!&%S_ +tcjF.H Ul0C =⩝ L^]ٚ%ʌ :VCf 6o<9j1*NBQv T&\l?w!dD&`6O B@bcC\.W ?IQE]Fv <1UT$gesiF5q*wXc#nH%gT:u q~жa ?cO{*OEg>89}VW|y>;e{i3b*A}$ϳ) ̥ x\QeU;N.wZ&IDݯDHq2# g,wzV%) e/ke9&4_%"# _y|ͭJgDq2(rF}߼RHBVL?[W%JQNxjrEZ A~F4IT'+%J`ʹP%$EU,Z!?TU?}*k/wE.ި,©CBU5j-גelVg9,㌭_Q"Է+Ik\j Ӎ& #((KzVA7˭V5A Q`B6]P;\>X_uyI^7՗M֢hIoRkRI3ϩ1 ɰqڗctMޙ1;P-X:ZVޤkiP픺@*LZoLp`8:zz1̏|zt9NESLKrC=%,u;ۛL[Fv/G)?ؓg.نj[J!{8He̼/#ړŮS?BRhtܢV*'&TM1|'M?˽]+3 KT7),ZF1kߙ/V#aM"+m2^Gh~BM: ֩0C'T ncɷ!!j߷f@^Ơx+~dXWo%C^"˞JʚU 8~ӊᙒßI-WFp~I}wەY v6\J6ӆg׸KH+`Ά5MŷCR-nR F8\nfaFnƺ曱>lNXk 4yAt^!H]y*JSh)oST>'2"moWD!g? BHQm}ۂP[+ lO9yoshimi-2.3.5.1/banks/Organ/0066-Nice Organ 2.xiz000066400000000000000000000044451506652756400207100ustar00rootroot00000000000000[Ks6W2%[$Ŗڒ+ɝ DBTp.D%q&Z,o__b? 5O w~ot9X|5z 7OWx4[QdKwvS>F]DdOhMO-M77xohFQqA7 zlD⍎${c 'Wp1N;enݲwe$k&O,n6Zz~@FۡuN0p6-Fyj!>% U? ɎE$J,Ӫ\?ŰՊ;Lp`9o!2 z^vrE>d݌& n ,~,)3{k[~F!U7b? Sq(T+WvlF1 < 3pULXw PA'_,"PFxqwip*ގdJJ U^ ^gKY#0 I$mBOy qR4N4Hj#]1+Z_9nUvxRzhGkmwIvbrN=!hzz;ζ3 <rC412 DpꙘagF.H6BmAr ,PPϣ/R u|_!0ϵ (332h5-^T((goG s=Sg#u.O_N;WmGgv4W0(!jj6hiG m$57OL!cZݬ-HAyb*=HR%iWwG[$ Tw0.!bFJ,y ~pC(S>8ǀm褣v@ ,sޓ|N~>h*逌⛠93)+e5T6)g2f?f"KvFE Qmp^6xM ^)XBL6s=aZLf%6մ*?Vq.B'_e'YM f'$lЗlx_;{L{ :ͧPEΨc:oXI<RAT$A4MNL9} #2I"{8Y)Qk>ƾbQ*q![Q1 \s+?إPvFe>&$]_Vf ٞ,v2N }4_zQ/v4ƕRB7</ZQ4R@YZ^A7!GsYCٟN tC5l+@dž]L:HźJً9$NY%NY%gHZ*V?2#PKTֳ ^YƈqS3'#%z/S& koC!GTL:6ahU6.HutЉbZyj)9m42, qeLk9 ~nG\ц:]Vα̼]9T̋6Z9l|s }ڢV PK(cjV {#oZP&=J= x`ƥωR"oٜGF]oYMVĽRSuPdxF2=7*cQCk_*Cɒ!U=֩kɐ]%Ə[2 /cPUV _Z1Htܞq 3 oU07˲ ˋj ׊aR1&Y'I֣[TRoI}qi+ ɺsjLBd3qMu3~k= EYL*ʊQ:GܭX~[}--`k#?֑mŗ{hte[ޔ>BBֵpBZ6Xu-Ǻc]ˮ뱮eXS=փc j@=G/ |)}<]].|̀K> RO 11-ۂPXW4Q$rhX߸7ΰ/UN,qi1CL?t7Y&˵{g[f?64 BLDnO3mΣh #P0T((MHh7Wy#*7M@DhBS|&A*iC;=ַ/oz! فuOJ5<5&Z[->ݱ_ -şB!r m;Ch\-=kr ' $φ\`jxq B*[ټ~߂1hBuo@rc x D* Җ1(6 sN/'ripu+Dݚ1ϘBn;; L_adp}]@@Og:7Ny{IWfwbHtNg}˃=a=',H鞰$wɊv4{h2_Tߥ Ե|pxZyζ+,x\Gr;V^yC@[wyoshimi-2.3.5.1/banks/Organ/0068-Square Organ.xiz000066400000000000000000000043471506652756400211530ustar00rootroot00000000000000\[s:~0C2eN9@:E#l܂M}IMW6vJҴ)^"zUcg9zal1-MfvqpR_٧Ao`~I} ﲏvkq[uIJ+#KxD=ƆO,j׮ixKkm$D6]~#6'ш::]'Wp<6%sYlfos$ UOW50潆v}넸?5 &hX5'k˴Ԙ'3\T1?2MUAp6Y&Ol̦3ʯoց/OزX %f5#&cpLL?f,\Epvsw UX; ) Rtրv /rL2eJ i wl@`ɽbRn[j~<_&%c$aKrn!MM&5wJ]bMqIݵc[v'ܺNW"G`qp9`o[}V` ,ApVZ!pΚ6p\e+F=ayʲl0X;۹^O׭r|tϷ*5(32hh-^'Pu[mɷ]Fh {iza=5|._.Zv""`l Vd-AMlCiGr ެ,?o1?O2h@FhJY>ĉp48˪KR]L Fgb7-zp1DWw8ؒ;:AGONH9.Ff1=g0|jOu||ԓc<9[^;juJ P{yuKz<106E8g[NPz(;\n9)gM|_teH,A Yn*YF./d( 8*THɱ?¢;EW(:LǣLei(q<<T/zAͳm1QNo(r%a09ΚE*J`ͤP. $E#XD\ݍvBe:u}x%Q=b,d5;]nl} 4 _9"?l3')jrxn<=^*DZGY-iky^/*dp.UUb(+Zply#x$߫}W ̥*e*e#ޒ*%32Y FZ\5q  %n [eD;+`୑&ԲQ[nB2AS '. }'#JLEԤ;IӒPUB@X'Ww](kjz@o$̏ "|=T;_FIld"'\miXfl6P4wmMRlIl J ;׹nn|cCAqf""e缻D rǓm5Ssvq9y6/ITUNX(Na&%2pd6=ItN$`~ߌye/HTl"k)J^t:'F~ldGAԝ}7A}( 呋ԷHPo36>WI.>O{ Jo z 6@EGV72.*~J>={KʲeT1F)W4ӻCm kߦ mQ&={< aIow~lns%/- u%)Vi=u+٠ZiTj+n5֕J6_Iw:,KD5Ћy??B@tr?G6%;IG@/=\\ fz(aGDJIHwBK9GbeSz)C|R  S+D^Eyoshimi-2.3.5.1/banks/Organ/0069-Soft Organ 1.xiz000066400000000000000000000044631506652756400207470ustar00rootroot00000000000000\[w6~_AyO9gw{(!&EGEplK67I%ny Gfdi=2Ϸ]]Y1t-yxW[]] ?xvRY2¢{K)[uqvf<_QߤG:[no>)h &6[=RdFCد|q3ZM3oO=rۚCw]}ty?;>@b 3^v\-H:%nbm. X"˦?ɞyv ẃ*?0, }[GO-+^G6" TrV<7s0\KwX)c{/o;B!Typ/D"0vm1Y+f`zN"S[>"D&v=Yc[F}aEvC GRۥ|n/Jx`^TkbBˠUxmBB~ou;g{ ^k8lMc5.O^Oi R{iP\f7@veCʑ[;[OB.Z"ŶT.%,.IJvv7?en BG8"/4](zEG( % I_ V3 Z}-`DaOF^_5L*|CpFNYxMl`& ؃B p D䤜7 ˔|8} 뛶@z Y :]!S>{ GezS?祐k+&/k%Ȫ(;pဖPgcdR:^7P Ta>?ذUL|o8_ɸ6–<*E˫RI>2oR0AEC-\dX8@PYbzʈMIS& e@+LOL/`hڭu=9dm{~YM-l0t;hM1-}Bsc&5~-nQ~`$-!jF $xH97ڃZж^w\;D^{٘b2h:B؎RztC{#w^- P\FT'+pӵ >h"0S5+.JP,*'皧8v[&HQ ? .t S[Y8?we>fE`3sPdE8MJp$|B 6Dv![3 5kcpRB~'8n+ʿv.9O "}I2S-]rs 1{N}y!pZ~ֹu ΰm]e "VQEv "]v"字>Q:d;)"fvX{eI%c2:lM+_a/}/8*Y\Q6xo>âؓui2RDLW컀4T鄤>e$.Q!`7KԄ3%#!h,H>޵ջ(2/z瀽P򱆝AҮA^~>޷gt)a # OdKiĞ"Wʡ9fʼnF/˓T!b g jeB/!C'TziIBejeCjC?Ud9-l'tg9SlRɬl2o4%Z=P`Fy͟͠~OGB=7[~$B)!zl"G (#v"`D 2һP?ZĤbp!S SWE=}b3 u_"⇶+Q=r,a:KS>w G}/^ԋ- q$յL.3Mf7;Bm }QV.ЧgacM%$ƹIxML+F JVcǮZ%i^o_ٺ-yAKzJ^J/pEVL͏q_;gJdU QXeDR¨7ӆi!g*ԊKOܪ @+wlZm/L !_0[:zrQ *M\p|H;H1JVb}6-s-?G7|=V6s)fٮs,3_n>-Zy9@s )Mb5s P٭4m-+jJWO&y "e=yy0,anR(:J1kߥF#YM̳P6Y}8J]%J=?5T¼iP8\q1 PfslTT3rd5Ə[3(cPVJo-v`jxu ix>U ƒ+\ `8 +M[K4@}Ǖ'P/Aa'TGiߜ@i`+PN{h #_\~VVH9 }MEUfwدw5&onO@ͫ~DCDߞf[ɵݒ/n) (]ߕos&(Oqr7ާkViBjg=ֵ|Z~]u-N8c}vM,POl @{eraD bїKfοKBg)puZ:o$Vଗ2ʣ29pHJ4?h֞yEyoshimi-2.3.5.1/banks/Organ/0071-Synth Organ.xiz000066400000000000000000000047711506652756400210130ustar00rootroot00000000000000\Ys8~ϯ#LidF;`9H-Ǟ_?M$6@Q8yIB5 t>ym<1?pc; X*?+~vBl= UZKm6U} <wTԶ9VTy OlZ/nun ƜNLU̵uHx0G'3(—=M(:+s _ul*b2`CZ٠viF( BfMñc\zU9bz9+8. :.^ [ 0Ar$OMU6%Y}G)`@<7׳ݥֱ-f`TԞdqsk{;7'9%cNGL\p N m= _Ly il[jB&>rGvA.0! a%BK.U#wX0 88?׋)ϘO9>0 q'324&Y7$|B3,Ήk6o1lhMT0n 8 |1BzhӽQdj*A9MS4%$4Pw x\'%ʃja9MdlB"G?9> C^^TLi#QF$oq^U"]!USL1u-u֛ +.p/i6d 9ځ i9qg G/MR߿i'!2rln̮"Ñ>5qY_9'E L hK%to8F!?=N^-UiI/S+SI>1rF)qgN YeD9(dDVIGr"hX񂫯C&WgЬۨz"dAYMm0=9hF1-9x+&J=/6U>(꥗xy&q?/wi%oVƱ,aFԉ̻%q~"s>ĵ{eR;-/-UTɓVس̇NdnaqvVQ6(䉅"Ƞ*j\m2R5zT bxڄB }Yꞡq#Vpnq2""o#!3_ώٝz=}#\{onvoL.Dk719uRgү9uL'ٮ5dק>Oc=v;sGLWGxE4^%#ߕ]mprnej:Y'C~OρH*"-Ysg(wY-eb?}@R NNKO_yoshimi-2.3.5.1/banks/Organ/0072-Fantasy Organ.xiz000066400000000000000000000053401506652756400213050ustar00rootroot00000000000000][w8~_CpN lلnb`ISI.ɗd^?u)%EUI՟}Z8{4~i7kzޟ6o_>}ljYn#~>J4eOOKt>317CPqEo^ଝhƾka㌮`a_4'Mt6__ >Uåk9:?vn@mj Owvl0 W#o׋Xq}݌zt9^ooǃ\'v,F觃;!qB{ B]Xׂ]/{MǪOSXPD~!ǀ*zjY*?z$966@w= Y)MBU[.%8ld]ZB9=\W8"G B^Gx,ͺwI-Wl4;Sl w~OS)Zϭu ?yx|yL$vΓ8hI9ѹiV2@Zz0$#أ<'vp)bST#8f Ћ'X)$^`:iB=BQ;->gG/Mv`$`[H"gR7g )H3)kz_-ayg.cKd,LeZHnWTb_>⏱8Vlݗ{Paj"|Yf.G/SWhJIdX8 D{D9)4H&+9тfE v<X`+ >m67!Ԃ\TeD#y7&t@MAkiIds(d``xY.AQ2I^|6=cK-iyۍ(Sscy'9ΓNfJxam.%W\dLE\]Eou2zH&$A^ve2S#}R /Aq|NBD7GVϠN K'+8$\o4EcF%p(W%ЂE);/yi5F|h˯!|NJ:"Yɽ|Jfm/5{{!2TpXP27Eއ{cuJx%>|.Iu U __A^.6_X"_ {R1;(4*S\aGeo2|:ܛòrkXVu\bpu.f]Sj\e,V)ŸL:ySCg+6rJtʮp$µݿXgzC\^DtG zA(h26WL&W4g5dɫl^ ,zeۧe4W{ =|dǤ흾Y4]Jyp}TzBiQ(Y{u#钥R?:=˓w/B<'裃żBL,R0T>PKGw$[+!)m}dԇ Tԝxwt^c=sU/nr"A)2kFLSq'PWR.e%%D9hhv9=yn#hNE/Sjw8-sIK+k3a]83Y)i=u%Rm+j+j+j`){zXUc  1Mr(y5yE/7tδ'ق @y[HRAݰIE8z{|o8hx"-? ژ$`yoshimi-2.3.5.1/banks/Organ/0077-True Drawbars.xiz000066400000000000000000000063601506652756400213260ustar00rootroot00000000000000R; j B@fξX$vvo˖-ɒYz1ݭ[7?\X4];nZ z3qƷnO9<Zlܬg:$"ǍNC|q=報Û n(:ccΈu9ȽK<늬~x.h_ uB@.ɣt׆Otw˚Ft+خFzI=RpMs:805DaM4~8o'LBsM}Fx—qak< JKs>5^tFlD #Zi~Ή[*P= /,9nI $' ܦN,sH!u8ƮglAsY$s 9̃sȗ|r`مaiOjJ&$ tpqu>|;-sDU"D $w /AZz-}9ЃDwIM Ą$=]370a9(cTX[#E(w5^ٝ |E[p+O\ h&VKhW9 MݙL'١}<;b˫@R6z.)ia0!L2qh` Df)3 -6JI\l8q43}dͷNJh z*xNɯ׵ׁ k}7 XMGx>Fi1pZgCk54xWE8l[T_ (v`3x!zY?38)rT Ww22yYqsVNzme)R6[Lyp O3mS$ E`,*P@vIpAή6(2=!#M|Aj˚^]{qϝ\f׺jfL_O]>0\EƷ x 2gj(m_C:];FE|iul&^?։B_Yy">e/"~t"Wmȕ!.Z&gqv3ƭV2sd7PjhJ",c~R]H86_ ˶H6fV3ZҼRsRAP;j/;ҢZlMg6C}aZ5,l'1hH.m"lӦg:aqBݶ`%g}ѝ Ȗl$-uP컿Kd: *@t ["Ey 1"I܂AD;8"ApQG$hu?5\"aEs*}Mk]B%o7w>I69I߽Rn5GR/#R0@ | H0@T~sv^Gʂh17dC<bH-Z h1`JU`)Uq>Z !bJTaJx%Sb(Qͽh*y=: wtPz¬YO{]쬧z '?H"aa010!cx3o\~p cTc0 UwzU:Ю0Fel-ޓx[4h@hxv#Mx%oUaC cA򡞓zI(F10Q b((^xtѫUdmAyUJiW.-fŒiGWD/P,TJǵRӢs'w³eM_sW+[6 X9W ?³ćX ϩ 3|r Vx~$3(\j=`gQ{*;Vx6fIʫmrSңah(\]YE -Vxf^sq3+<*ZqYTc_ ¥3XO 멙*cZC%QZ,2 ;Zm,!D\Y z*%U;-A8Q zk%U.ho:3uj1J=ҵZ Vt-Gc#ݯpgil'1|נ]KכkwddVAsTA͉ O&7@R\P"za4X籊}5\ 'k*cSM w Ȟi&*bMǛ6.xDI2񺼊/w]WK@1(x\3njkT>בɾtYPdvXRs&b^ti!v|OgRy\=Z}#^zfVa];,k/=mMF(0=l72x:5*A>i+yzϨ..]L]Zumig6/;<ؼ\Ns?d-E(%Wvs됈|w !yoshimi-2.3.5.1/banks/Organ/0097-Accordion Pad 1.xiz000066400000000000000000000072421506652756400213720ustar00rootroot00000000000000]rF}WhUSDUTkQZINyAA(!!.R~$`0ATdKϙ ~~^OUDdžSq ‡/w?𯳫ӻ?^‘ݮ﹉K/?džȟax'31}hѸ cމ)o!}-R|p;bo&"lΖ"rVڒLɦ(gDAGK_lT\܍/O/ݢ*нWmD\wu"5)_@9 siX,_S쇞D&XѪvҤ0ۯ_*7AiZ(狻/gڽiW6 e^N!`^ R} qGS6%5>)A=h$/>CR* GO, *¿ڂgﷅ+Meu~rҒ"fݎW+L6`?жZ5;M6L}n[{@fQq 56Mv%Ьg(/i2gS8ՑvX΃d]yeI$d1z܅S(Z(QB+/Kf/W:5T4rW(yn/ ]Y{RC%!)kԨ>PO>@U^>>=>(ebZgY9DIOkYR>d+ʧuf ,Tc)*}e(}.>ǨS=e;QհZG |gB.,jVK=?l%@.S}.1aӱ2#E.gP̜)E3@̜xf0 gr;W9=piXۤj6 3@P0†a"S$C03Qp6@ 3m6B @V7V 62A22 +5f!qgE\{W,RzZnIP, ɝ},7 wynd<㹑}s#FύL4a6hA!(#Ι ZBQ+sYOB2!f?ِ7 j(r??rQdF 5-S<0U ӴjE$rkNKwJO sо:G%"{ hGQJ33}HFk8[֨ @&S_-9E)AY MXl N夔Ayjh2Uy^vP*LQdܑ-o~vFM5,XŨғ$ \(UiSX\cU0]Q{G5ݯ˫iZXZ1J?tnUhxW˳V֚N)8[Q\0W"($~˂RM̯ɸLſÊRq]]^i1m?QŴ޿:fxڲRHjY 6z6uBʙ< NR9Ξ% \;5bu.Φ\MS { B%S>T)?cPvONa8a` zl[݅{tt*<]P d啪Q/uy4oP]ϨѨ08F\#8 p4)wpe1)Q/?m'-)go)*Ac>ƒ/ #þϨQדdwd|d7/boznVl >+uUʴ辽Z'r`u S 5vkz/\^߯iqvگiqw ޽ m~}n-;rW- {]`|~>>K/([*YAG_Mwkn-޵\= *Qnh7 oJkx53уf#%JF4'&:\LgWx:mGn]wp膽oG'XgHL!<}d~Oj_uS*֧|Dh17ll&(!^6DO#^ah3ч[.) LA9<wtԲb%߻ 0oaU'j4Y$`̉bz >f5Z1M8v懢  aq2#cG?\XƵħdJhU)*/FW !9v J*& $+3E mȾ.~ޙ|X$p HPU pҐ0dEcdxu}9^ܜp>pKuET iģn c8/m8'B 㞭] ܗI$sRkJfj##oC\3I"^ 5 Z8>,l“ٯq$>aɝ[Y8FGǘ>lsn`4:AN@NEv"[3 -Z,׶`;pH,>!;vYgI8C1(\)|^efZ-h=cB~otub"ql@j\b:m>E n4(I5^@+=%z#lvj$$j>0i[)^-/{:PR撌@诛KX:RV7(Mz>#9Jtd[CNHzV~G>٧<1 +(>x9lX|fw$Aiw%k!AE8 {$6)U+I?/O`ʖI; d|Ʒҿ#`$[/hkJ9晷<O&͋سQܼL7/-YxcaMPvŅ>&E˃^ !h!* x.RwiDD*ȷ&Pť6YW B-(yנqVCu Њ'Q49A6Od]4G:"-P1+5P// u@V2;P1`V*.~ӂ@+J-_@4Z .ѯ{:.AC=z'qgoԠ*z E*0A=]? vI!kP/~:=v;U~8UwN}!ttO kP/fJsԋťםz?}s*?4d _17שc>=ܭ R[{^o{VmKe (}5 q9>z='ާ2|"JDו|J~]u%J8Uc=x9pֽB&h`@/ $x}-" D҃lOt'l1ݮJKCW7*9,wY/e䕿BRbG'Z(2INyoshimi-2.3.5.1/banks/Organ/0099-Synth Accordion1.xiz000066400000000000000000000043411506652756400217320ustar00rootroot00000000000000[Ys6~ϯPJ3I:-O5%W;M_0 Yl$R](1;n8bw B>4lqͻɰw],?ݎs9 Wqdiŧ'`e^Ow~3""(e90+xa%gD_\'d}ăַ艀C p?snQ3#:س7yȕׯ`n^ҏw4@;`{MRu¡"2q׳1u>L0尓 A>O@.9$`[FCᢦqz NW8 Gۥ˯;`^xPk@feZR6E'ai2RDL߫JG]0=$!:5tD>1!F UǪF|e(|fOj' |n >rGЧ W?e 8s5"ф=D' fӈA +' S zK! R~(g]"8@uDRs{9*QZ(9xf'$Z`vHM4$#gfxYR[e|MG MVn9b\b!}ƞB-t%XQNpm`& D(#pW"QTLj]( Q-bRFRHs~P( TL=[_fec(x Nu#⇶+Q=zw,as:KS>w G}/C~NWO{Ik\f-.&JQQv@YV^C #Wx\(PioiX?+ñ_Wc|l]eVTШT {RHC>0n1;E e2l}p*ifTpIPUY( *#]!/@$p2Xa5wСH' IX/ֺ 7*1YAXnS#$_'@iӒ4PK '궇(ttK$e<̦ >Nr+s h״X9wf^|ocZzhGlDFG(N:c,Q2Ac]jL? 0w(J{k7'"RG>{KJLdpEͬqT]/6qZV4u\R+~V/X,2K_[ԧ-%JnRI?@W#ca;Ns\w6\}n;/R::zkRU \uL[oy'WKWM\u#ƫc'{oJW%htG[\>BFֵLsuBZ>Xu-Ǻc]˯뱮XS=g/@zb[/ $43_N'/3$ j|cP\HUW4tpA?:x[ଗ2W/e߯HJdܤ7# 8yoshimi-2.3.5.1/banks/Organ/0100-Synth Accordion2.xiz000066400000000000000000000046601506652756400217160ustar00rootroot00000000000000\YsH~_;4bmEY*Ab%o:JY%,SE*WY_6# B./jzen1V?ŷa?^qѿ/-)ew!eլ+Ǯԫě.Zڤ2#rKvo~r7EJ_OaT5U+)QDC?SAǓtv_ߖֽ+j*| >ӰZaW+o*)qMk>np1G'2nȓqׂKi r# - , `h9,\R[xFS` A] y"oJ~]" Bj(>e#C"%ēoж?HWMK?x.e8Mm@MQ_<|ZmUo%0Fâc :c$^=UӤ@.  a5mz`LiID !Үk݆x&6 e( wU! ͌rO/!U NbY%1ʛgٟ;fMԬluiV("4G`eu|Yu'*\9Ά?(@Z?Ռ=OǃMs!BO^Z+!i+M\l- DPB$xGQXSwB",SH7:qHK} *&Izq`kPfϻSdr4YnDg18is`q˘yKB\ ]\01t>_KDHِYy xַ@$20H[i[;r9A`c.IOEJnk dyR8!eJ..^LY$HpEYe :c?>`P-8 2j)|r!ICS[_lջ}<iAy`sg %DZAXTll#$QLkőJFuc(ed<`Ӽ}m`$Cl;v:RyM=.Q2fQ"oZN5C&oUC ᑉsѲP1\=EotZ,P2Acw]窭>57( 8nDfo񐇏l(ZY[:.wuw 1Cm 8^HshH _|\(K^ď/_VpJ-T p8F?1\8.=Z X%^xj8$*kz^yMc:z4F[hQ*ݑVѩBO;x@NՙgGzq+@yipSp3]V? eD eo6y#PU堅 Z64P2F-LB @Y.h%ʆ>6t`ga[uIsee ^y/`] JP&,'erR9YF]V4V*̄LT4T0^).F}?*3@+v_ !Ce7c?ULSE7n&*Tڑ߅{wKWhE_}OӤ/d}L􅬏A/d}*>T|4'iOXwO Xޏ5H9! &hc@~:yǐ4 &mo p`ĠߘHzQuִIEyS;㬖rg/޿HJQGkNNOtSyoshimi-2.3.5.1/banks/Organ/0101-Accordion 1.xiz000066400000000000000000000046371506652756400206740ustar00rootroot00000000000000[[s۶~ϯѻ+Q7[3I:,O5%W;M_00 l$R RblVOqr{!4Xin6g=|hޭ.?~|7re|ۙC# eζ?4Ow"G6m>kx|ݭ{6$X5tGFF$h)O77AjoGrGCstyx#Ct6-Ld|#:#nb}-'vLV2}qKu\"Li *_܈ۆdza[恶*/!,"lf/Jȅ k*wmn!`ªΖd`B1͏#nX[Eݚ~-WfQHKE/;;L7:+`{MR}w&8&_' u9N0 帓9 AԕNO@N:Ju!0J-;7dw( pDy8T!.uFP.ߗY@i.f ~Wve(Vbp8촇C5LSswP @$ZHo7ADvH{O#G m(VO6rH3$T9DЊcT׶}/0є'eE)Ւ䗻l,gsX{2l.,ۧAH4];{ IIa $ !U@y[1X@F3ˇ4:#e]X@W|ARwJtLǟZ%@s52 | X<@cy$B8}v4b~PDžv Wsg: gM_Lɮ3@udnS5BEqrZ8Ʃ^Оhqڣzi)Ffy; b;Ym A,$ JqguibFT+ Q]|:倫b EBDIB7q֒M: rE@ *wDI2Eeez  TL=\ .⋷(d9"~h&5Ӭ{6{K ؕrnUaS qTG. Z vʖ>-﹕ЯFF[,Zjܑ˕/bu:>)Izj rNIK?]\3RkJ+}b$|Z%z*6?2p=ygɺp2;Ɖh :f7˝LYx>mq|LZ>4tʜleJ!# 㺵30tbv*ݦE.8INj=`Z*ΰVv͵LKɚ ?7tyIn`YK>ߐ wCь孌cy獙/hewJL`:@Z(=WE I(Ixh&E^1uFuJI\nuԹYKvPvŤFm|:[iB6dSBVB !(`DtNhYBPxԦN[MvuH:iqIKaO/>(-J'0ZWUv3"p:ɧi s@Mژ"V$1 sW JJ񬬊*SbVRZ;ĶC.NZnX<\]M+>gE(%>>ww&y~zx7/{8m.cc.SgG(#W+9<"8bL&q/^Xє^ ? cDN'z:H#?`O~85Ђa8%Wh#H dNk;"jTN9,@0kSRSC9no4G4'@k!DmR€Y.IdqSA9r8,o9$*qcS5|BUn1+bdݧe?tUAkS|Sɤ(!tݚhARA2*RDd;Y[hIXq!6(5r"hCƲ9mGGnM^bz)CH?V#Q +D5m4mVlH 8/M̠."ǯR V8K9J+*ʢBI#T"}hЕ.R^WCIߏ[e"?<y϶1hpMTYmy쫜P_,wDs`mR :k}"ie ӓZm:F;uvLSkDcܚu{NaTpy3om 'B_C{o [{o 4V?H|w텾o/wb?z-6bGz-zbeG ʧaA9]z\kn[cu˽,Mahh+?bhێyoshimi-2.3.5.1/banks/Pads/0002-sin2x pad.xiz000066400000000000000000000036611506652756400203170ustar00rootroot00000000000000Zms8_=%LM̔R 7QlKoeKʆ܄}jc>e7Y{apٴޟ7,pB .٠]Ϯwv]0rE8̥ wGtg-.|y:ɚ?ءg;wa6Yn4,NWדf#7+Zʓl~Ldzh9M-cnest}dMҘ1SxF /?o|72ͼcq6uKwha|tk/"[[/dG NZI/alYD NtVx V+(ktMK~@2T }dO]7s9<\q1y j2],t) "0<͏_-u?e m͏Upck2QndDʝ$Or&tX(GqmV]H>in;B&KṼ<1Y@}0 «Td41W[/ ٮܾ ljȉY$T/fU%@)"qx)` f *x1Lj ^0CFME9j淳gɍƌhGyۛbaمUN&o{,*׼ԧIbĄ+/&@ad@݀_I2I}EQ"!Z 37@of6 +{F_kelq5& ނ͗89i8&X0ۆ? Z|%OtcXB]MN =qȖd՝Et! "cTs!,z*䋬Csٮa3(ÂR+gڹMG+іUPhZID M6ªV #("J.Fw76z?,fb琉& LDs^+4?r;=Y_WCiR'!LniUy^OQ\|H==+$gg懎W+j'REmA 1XX])UGav٢; L?ٝ@)ϐO&Vmbd6FջSma.TQ K`HrśW}kueh#u>" j ZLˇ7>M^߾ʜBi~m~km܂{N3n[Ep+.94laAZ'H%iAMW'[{<^)1DXMzeBÁ<46Y *ܣr_KS~OXs5'yoshimi-2.3.5.1/banks/Pads/0003-Analog Pad 1.xiz000066400000000000000000000042061506652756400204730ustar00rootroot00000000000000[s8_C ai2@Hr/9I[K2Ir<5W~>osOfgij9>8i~ogrX"y`ѐ·P`Cyi#GI4 |xJ6ffHl6.i4]{O#eARD(]ѐF d:/l Rxp醝6ggI0 $N,h6ZzqJ/e3*bD.h9/S7ll&0`F/_V"n& [ B?0U9-x`a35ʖ~D~!Oe@2zjY"eo͏醴  aa˄!Ŧ%$ObƳ\dJ*ӌPLm.\z㔅F%n7İm|g"d'qыZ$$O= yD_@ .0Y@ $Lwq*[ԖdpUЯO]T9/m뜬#B,9iTȤ }KoQ*F5\Ж4׫`v%jtvsm$) meMMg#k+H;pCPdh#&%S[8>&kt";Mf9Guc NYXCCb \> sv|_(K@f^ʠUjg1xœ`'B^=҂ipZ`{~m}ryxrx CF+x Ӱ]ilײ{Hy#Ql'El;JT0o2\BF9r {9!d<5+K2?F.sX}G%g]U:u0TtB'Gtjr2)y4Iz~{h ìt@ Y VOo{!zv r>gƠKtPZ?E483CÞbC0OɚfҐz~"WʱvOyG˭T!^ ()PƄj0VΪ2rFyr}$>qApE>r5ۅD2rj'EXab̖Jb7-ftXRy(: G[*>gtl**=%il8=N\2el"G7> CQTLim( Q1SF\HԅC+ gbn^Pm#x2_!h9j,fƗ&^%7[I*l\h-s%(zV^ẠB6rn_اu8y$̓.AU>{4W)U)$A Tkl>#LY1 PUm8 *#¹nZx>i{LZqi$5?pt(bܱdN~0)jy•ݪ'JLVTeԢ' AŴ$8R2J&6YPK7e0M'C~'FzߒlV{Iñ["1ʓwheZxk!iPk-+ ի[$'DR .FuզK[j p}DžΈT Ñ_%&nP%e6Y8 =Qh#6j`1kjhЊ (Q0d G{'V0$8 (o¯ ;2^HS/^m_/_A7V0҂ቒz oI}%+^I}חgxUR_$ǻ̊G}O -3յ|[o)~*=is_v YWRzkg=ֵ|Z~]u-N8c> xxT'3F!io_L7wWӯ燫?|Y<.^7TU>}`۫W͠o]1i|Z^-Ң|[nL73>fJs*=xZYOߖ8m-&jIk;s,i,qd~lmÇ&];|+x(ˏ9it6/nD=oKu}ǷmF녱{}t9}X}Ff?8 nhWss4ݪy+Dͬ_T]{\r ֫~; 36Lo˷3{@"?_N?=HGC'Gyy^g/;,c]1 pT6l]u俖=]uM]1_{zF8U%۟X NI⦅Ӫ=a-_'뻞.gG"׃~]̶_y!KNI;z3Vw KuX+ltH)y}^} dm ݴ2:d'9v/@::/d֚޾gWg G#pwAɼF?lAl]ӌByΖE6ފjB/I<ױ{6mz7/Cl}^&v1[Mכddo=?^޳>NtzuL/}zVC>=Q (wq{>>}sY?G#$c|FI{~=& ʧj=]/W'!sLj8j;H`# v7?֭B#Kw V-x}|Cjmdt[|:UͲ9ŵ|i xx}H&#NsݞV:vFm͈u#7qN朊 $w_U}vû&k~oYTRO=/p?:Si`Ms汻FoxOÿ.>m蟢ڲs/9|"To;[s#:+}ئT;U9aO_3L^Jub9qOgӧ!i>jފN'UrF >~o|aw__o\綴sܺr(nv!(7O{xϙ>~xw~پƮW}jVM7zwkǏĎuOY{EUm>pW?R""v?u3?;6K54W5Q; /) Kae;EDj:]{Nָx}<Ӆͫmnq"*LZYdvaN'IFEk+MNh8ӷ 7#,f˓M3Br\2a$]2[zES{s^ B| $_eY\TFPuW>?.Ö-c|L˲*TH03Z:eNc͌9ނL$)I""QIYD1eEE~fa)1*57^Z҄52_R AQ[cso22cSb>IA)IZODWYKڳ'K4Sc߉|8;qꉿ ^> &tq,B.?KS{!> \D$-29^& L"A\TQ>up;^ Z3el,F0[ϠNmT~\,NA>?2|x:}U>?ؔUȂ ԀkؔU$r`YTolYٜ_)TC a9]T^rڰmJO)*绞otb:2wI$$s Ig=ƤSc'_2X~:=2!Q{&S* 'z"+ /4ܡ2>kL);3JNyՌ1QRhcr"{3ھwY*UF\(6Uq:L`HxMFq\eOHy@1I릜]Qξ" E>%Ŵq߈\/&7?'1csV@ U̴˅Y9TZWNlO yYFN1]:Ud:E>T@jedGYkj՜9.iGE +ߤbFR`t(DCe,;ڙ2 ~J EU_e=$87"gk3ҧ)uL)S! %411v%NTMW9BG‹"U8Ȋ.i2OcSV@Dxا0Q0&ps]2P@$Qv]Qٖ Y,-*L`OJC lNˢTx #☓TgM iߞ(=`$[ rďL֦3\9eI bfL,T/ r+Oܜ&EVK }K 4$xfIfJ0,p@c1s$4 T1Ŕ!⤋%qm=kM,h"ָ&7&* x)pcP]S?%ne7 yҩٍ%LI\QT y^*l6^$Ce/%vR9Rv @gH=J<ʪ`Ę1%[9 8cf)Nbǐ UM?٘5`R#؄a\fLBPs`1‚לVNnUdP~aʒ54V [9VMWP3qds R lf*{ +|Kd"¬KI S~Q-IE:7f9hO\umd"")7ƪ>t!m('#xFXKETD!Tfs&9$"hgK.ʔ:cb)esMkAtN!Z]0/@2fg"+7bS8h5ړfN9Go|Z/Gj@"dO#(, GQw::3W.P@P j,srnе^h %8 \hq-NCR%J2TF)-FQm]Rh6$QG[h̥ ^ތ.YpTAAω08b/LG/ubg̡.I,M.bD[\!b_l[٬ۮ:*mxDuJL-ZB_EߟMo$!=w%Ayֹ,eX:0}|]vuJ.R~?Ց j<6v)WYe xm;ϕ?ɎQTl!dH`~ LAa֤>܄QB)?k724K0SBJbhH<ܲ)7j$3$n 02C1᧕˒:18Eȸv@9aUh8ذU4쌬J Ub=SbTNYe /YYЭhPN9keA0!VtUV(2QBlۏRV|WO2p8F'rF_?(aQ8ઢJqptLBIt:ޝ+ŲւcU$GȨq`TV%J9R-^(sQё\gGRLxxE3ӕGQ3G78ђ mq yY{/L) QZA>jM$Jca8d/xJp4aBᥤe?ͭ".Yw F6Ug-%R:,u 蠩;jGZe Y>U#w~$/xYeRl"\H`%}GJ1 4T:?՜C"C"dd! D.6Rai*[tͤmޢD2ˇO:>)U57ꌉD, arin@5mq%w~F'˖bSSLY) -4Ϣd:psN"=5.I`9$KiS홢VE)R47jHuiN8RxhJ|-mT+@=q,jv\I\Wff%7J4*{ 7e.O)TIȡV CZ4剒mJͤmm: +ws#0X\J~JYf0) j(:鯧A%4@eIBb V+Z8lo/悀䞗+& q7DN+92ݤIs4}ԴrP[E1p Ʉj$L ,jȻ XbaXt˂&8"-DT_H>"Bq$3.Uy8 4x*iPʪs!@J3;A\n3Ңt`ӦiL{Hg` a܀jkc-_?! 枂IEzwוQy8MحBn!k pڨA zNtZG=qJXT0io)p)Aˍj ͥLD.:бG3$Sc>B/-٢ACt6w(wkЊq:b *S5,3 *0ZɆ4/*n´CʝREX#`L!avNlD*YE4s`阥cᯖڔ)/M0Qk5h&f %F@ 9`&]^'Zj$a[BW;4dA!;aLwEwk+Zr *J{Q*@@7PZesyتAq<;Dm&psDj,>ʌX| X ߤۗѓXHthRj9$G\LBxF@R't2/K3/b_`pThee ux;RIu7R;.UnvMuD$FSC^vѣ/•IJrV)c[+4| 4r>\^ /|(l%t-TW֚ICbb(]+tp_L>(Mr}\s7yRҬ4pܚXFQE+ʰТqW%+ܚ9Se:r/ t4s R N{k.t#r Sx3%4 %s* \%̓ri9@b6ry _-`$%D(g2>hGЖH%$j,%†U4}cƅVRg@ B 0?Ũ֋qmER9A^L-*.t$ToS"YVSQ<<`5:B^d+R`&7')eZe/p=FHy8w*[ERA^(u[T+Rb$*ll$JeX+{Hh@ Թu֒\u 5cZ@qinuVYDQ9n:]jLj4R5k/14U4U9Ъ$"dP|%=!y*P8:l$4@J}lT)%vT|S?mQ_Di0+/S|f0Ó6&/ÎfIȾIxS/sJKR%*OiT@S`/5bxҔ+9l|0k$:W\)GEH$ f/CܴAWRוJ,%~p9J^U5>2l#RBUUx{$,8o0ѲD[Kx6Q+L,M1N(eDġ/edrR}o o}ȯ?]~,my[Wǫr\:}x濻cVzz'>\_m ~r,}e=q~p u&6y\,6^t|lVސtONFd}\]oC݆wG'~$j'GG*åB) ^SQ],VF/lyUlt#U=Ⱦj|  `7ھ|yQ·?o#:rX:9oN#Eobw Jb>/rYN7tXi=^Q|=_[=zݢ>6G;*OdRz; AՁ9K<]޵+,lb|]-:^-NVðCOF{a/~;>ݨlG4ݴfoS1m,tZ.&#jvjÏXΣGNWK~~?x ~_w}OD.<7f|2}:z;Lס-kG{PWD|7Ej3dN;d;ÞVϝ|YK`W/ǰGv4kNoIc'#s!`;=,‡߻Ԋ]LGא؝ȿ߾m,|ԏCZ6<bo'2A2$֣^6bdA!Â20Qգ5uғ4IP-<)W7T:xZ AYx|PM{P;e߃AFCAُW߃]IA(JV_hiR [LfТ >sdqRr_pڹ]{HVU:q&$;e}t}?~H| |3l)I[yΆ7n|[Nvr}[E4ߪ|٣5|de~|/ݗ=ErGH_Ss^Cr֠~iFy'}3X2mYUe~kIQ_#tT}#[cШ@wއ'˳IY YA2><lO yoshimi-2.3.5.1/banks/Pads/0005-Square Pad 1.xiz000066400000000000000000000044371506652756400205420ustar00rootroot00000000000000\YsF~_Axw@ r T6/Sci0ʂDtxcF@>6.=ZjZ}M3|qk<0Ϸ]SSl0t-۹Լ]_^ |bzc4zrƖ .h@^RbOvOM)n~a7icaNㆆ懯EB4-s4&tFBQDo4Arg9us]á{9N''ؒgHLw!\}b~ԫ/ jUߌUVV/An6ձ{He`Z?}DO#^gh1ɇl)z0 ay,eEJ~pm"Z[űGj\^;ՇPŋH9kx% a+ZJ41%YG? Tn1?dhO:uA4]'21qfysIFhK[c>ZTY,)k#K=%gt?tP.Ǟ$$} UASP<33G;}>8 by鍴4VOiCH>ʣӞjr |pNe.=skj7X \ή,|Cp~UX$;3KIvz%9TYFK_%&GoJ@9l|&\UUV(fGVydVy'lU*ogSyרduy м.cĖni|h@Z4M=Fg>|_۔WzL?r.''l DPL`y4DGQX3THoD`HG"q "i0P1uL5M!.p7mG4I#,v8.;8{؛@} $` \06b5]e*'p5\$28/dXK办/8us|^jA?AZ8[)鳔ef)$N41 ɰqhy"v&TeV#ʏBBB4`$n6O]|-n8&LwV@in#Jgu31KL6UԢ'I9iӒ(PKIQwZp9/4~/ل- iW4ɼp&M$Ϟ<< 318 @,^|,Ĉ  %KSo9Pt_,GpT_8V:'ѥ{I3 j|̘F}zI^OΛvZG0Q$U8AYU&qbjL\Lv5՘dKAkLa[CjPGZנ9|m'?$(mSv32Pw{`@OQ7/hYNhZuA*kPVyZ=(SjPzP-T=(+֠e5(%ԓ$kLFm mzw=hvwAG#-0BlMNO:xq6̾]eMG (;ZwZ'wK4 &̀ԩ]pU>J+]A#jғhNǓl8_ꑹj]z̿w% }ft{k L=v\%U_:!ndܟ?_3c2e\;-; v>0؎x9{^"l`4Ɖj` AXDTSˊ|&7D,x̼U5MgKc4 w3NJᶮRY5C#"SFVX鮹6 0UpaB܉JIrQ{jkB@* *2M̸P̡*4Wp.a OvvQBvs@;y?c?=W9/\AF/(PeGO%˫0oDpwꐍ+-S!Y8)/m˔ҁ((!ܲk=iA&'ƛ1|97t-)],0E ZE8E.v$:avɍY8q12p-Af?|=4"L JC۹@lPi7;zD mpZ޷^O׎;j\_vwųH:mx% f)[Z41%YG ެ TNo1?dhDFh'd QN E ,o.ɨv>16FoEbAHI]!/7](>߳JGCؓO~ЬJ?HGB d<9i4xX|Z=5M(jiZr|ϴ~N>x,KV! (3 rO_sј)̤q*PLk=fĔ1ˍT#"r$Cd)b3K0jaUF(Of&gȓwq+w[ő͢c:GEQ~x80ot>CۿvS^1Q:ӹrbВݶ09J@1=hUrI=BzJHT)c[HԇC"Gab7-6!]Sw]@\ߴE9Ywm,"*`WXe>{GI*lkƦOË H)kzs+/S;yϐyJ+,-apG.Wد &Q~{Y-fY2yeKiadE>ZޡyU'AWƈ򣐐M2wDwH]Ot(rǐ)DEnb,l/CԢ'I9iӒ(PKIZwk (%i*|O.ǣု%߂-^qIW6D]pT'F‘/5#59CU_S ՗˟P8OO{^jNիgGoP}SMiNիv`sǬp{z)O{XD;ͦ.݂QrXkv{]?f z~lWVC8荟buYzoj=^^-[+ p VHWl@א?@=>Y䟊;UJt} >A>!t5abkp~ƈԞ1$'I)wœ8?73~=#(XCA.*8%˝rVKW/ֿ_X/|*ըOyoshimi-2.3.5.1/banks/Pads/0008-Resonance Pad1.xiz000066400000000000000000000045711506652756400211610ustar00rootroot00000000000000\[s~_Axw@ܩq:68Sg ]v~}ztaf# TG/{ZVߦ>t7ۮin6cjm.F_>rz;kٙX:^¢{K)>5;Mqvv ~yA}6f@m4nio~H&{5)݃A%o4+MtZn&r;Rl]wp}jN./g'x ,Cfw_4Ԏ%X-U/NVfZǯNd<'r-K4J;#Jtk i( I_=e䊺죯{rON󃹧_| t[>tu5X|cc+wA cJs|ڗ'd|HmuĐtA>ky'[r-~Rީ`& ؽ뉄RJj}ԈoK0gMDa-Y^ 8eDv>5 .Y*uKYjJYK<yR Q_CI4;p@@ːZa|bnʉK;chm}SaQJ&Π7;^V/[TRj^.&eQ~|:V%!YķNYoHN4%D-)ۨQJG@4=pe(5@6HFA K8"xiP>cw+Od} 뛶zݡ,bS b*`㔵ރQ+#1t-3tt~>ʁޗ-:5 Qx\@ld:*ܑ=_9>4{~%uQ}tη2U"yU" GFtF䩍 [}ԝ1QwNXeDQaqGDZH (5~t@)Ky";ߙA)~ar5tE61KDA*Ŵ$9S2:h`yXn7uH&*:Y,)#fٮ8y+ȧMZi->ق&ق^:\@LDdԑ:yIA-sG17[$".OЅW2Ƨ;;%"KřG`c1&,Ngg z9hƉ:뜼NYod6}76ǞNl֟~)q=<鑑yFY+c,K^;f~a ȭFe?JpSq [ aXZ2ըLP+5(S۷e7Pf{`8:k];ЛD;vg/ԠLIJ:U נezTՠ :fTV28֠_bS:)1$By3L6 vi_q]MCʾN*۶ޗ6ag,Cwi?y ȻgWm- @P#!9eORF^2Xk|[Iyoshimi-2.3.5.1/banks/Pads/0009-Resonance Pad2.xiz000066400000000000000000000042371506652756400211620ustar00rootroot00000000000000\Ys8~ϯ`yۇ 1G[I؄P@ξ[Of}d¿_Z1LL-Zm~\+m9☮e;w'՛~touZ8g>;R~ (*{b;=~Yx}WflTq8Rpt՝{u/I{`BXExҧ[Qښ8Uocf ~D ۲}#pHdd%.W>tJL M (KT%u[ML@"o(ȱe{pmƬkdtsLe蒩$4Q=uc8~\I mB׺!WO}O*+:V߹QLKjI6+HGKb".\ =HǛE-%&rFIb['ՃȊ9]QMDF" d,v=YebyQ?BY|bp2O^^ns46|@#nTVݫ\:f6 }mhFp 5`}# ss̴B^!TDL LI[LQlL3-\6]8ѝK~]\`{uO6G 󀖮n"?l; HCS3<2'gjOvK(wd.\pgtb;9c:~IJo}?ewהe//=M?fҟNEH0T^3^7Uϧ.7(gxA׉8h !m^|2]'9N,>ME9E)ŨMopMX$.0= @, *Dal!`ʢplnMHT0B0jUC/"!@M>Raa4#H9@4 NJ-h],D@!4I.>aFb,Y{QF!0q@\O0( WQZհFe"wh/,O6ce+La$>T:PBs$5À@k4gC`k *Ff] iesRe.@7q11lz;8S Du?m5u9ARҽ!aS=M%RBIMTk&瘈2"k vľ޲WCłjDwI- hJoTӂI**eI`Ii'c74݀5Q3;J(oX}alX`$f.U$̙@?B}UՒe.bLhňr0 z%FCl}u|3Ă j\mu&<˨¼Et쩢Mmg#[x.a,@Iʤ(. u(ƊK6}鎮Yt8I 7+!!>e쭥O-뙰^ Ei#)XB$Tyť;Jd~QGk䡯{# 8C :qiC{E]ȌPVi`bj0*j0pz cd$*ҙ\*ܪ O[-Z uX YS,P+|L'{q6,= H) 7&,I%`J#/ X |-R,b4:4ne5JJи! I(aI,FqK.Ie& Rߢ,qw?`) |PXJH*nNX H}- ov]Xv X董r}3=\{%mEҜD*FW| ,I8j:O yDOW͇݇?n׳{&49)Pw_n'A$6hƗm=N5i6=2X'P?Wn7if;:ړ|&: Ɠl8_kyUsn"$Y|Un͏ux%*R|fѐeVRNmj-BK4]PM>TZ̽kO yyeF_5Ulq{v "mJשe:)|c n:H5.Mkj Oa "/Wk`ٜFRy9"@!x4&`xӔՠlE`fy^*HT Ye!ajgBTR_*`ɂ.x3H#%AY 7f g<6cnAX1ᢚC- 0%MVqxdE8k EyX,/1 jhL(k$]0AEn'Nu4!rí7%wkJ;}f$]5 >" I YwVR,l'XLAKYX[!NwĔ^|:H{sb EjVPe&Sy()֩FS%yCP 79=dCk䂂E^I9*ڲ^aPXK*oRJ;;PeW*_yy VQ"&t<ꏮe?VQg<NZe$!4ixD$m@s]P )*iQY8ߺCv8{4*e**?K h6b$P MLHf;%a)nj8 S5xGr*5#/()^ATӆ2:((vg^7ꢖ-Pr>7f6>+0KλFps.qOus]تH%R =C<1S栐I]4PD}V\Us:P=擄L'Ke bp@O|[eǸZ DE3i@`y?5#M[8=Ź64$eBV;^:0ӱqa8N_mEP#4 'ҢFpisrÔsU & ytG.*3G>]?].3nh/eۑ sqÒQ/)dc}ƳHC4"i dPysCFw65lWs-dwYa*L mWY=vN=Fl(1l8]`;,b;gpzo>`jZ5Wu 毶k*iTLr'; 1 n3gIՄ'f_ɭ`Nضo_ zқ-/2(oNhU$-e8jeqr˞Kh-2쿻IVK/M*bioRZjXeOA7:S]\{A>uViGxVwz;{<սvVhv39bJ:o5 뙸KR#~‘mt+E.{~01߬ij@ZE/o߿:0P\0'yoshimi-2.3.5.1/banks/Pads/0034-Synth Pad 2.xiz000066400000000000000000000037231506652756400204070ustar00rootroot00000000000000Zs8_B`i&fR 7{[²%yetL^V|''^^ r|2h׳Ýw\w4PwЯQ|/ONE4K7&m͜>y4lo{x'ȇWv$m]QLOۭBHh)O/`d:oGl miLVQB:مd sbg4ڭ^~Ȥyǒ\uG7ha|tk/"[gxGQ ˅V4RKY-&i,o5.Kv ,"lfGϴ(C Aɟ^~ bn/fJ )Fb":aFHPuB},("5@cH)%j,$Z%AJ#ۻ|LZLxgC|RenćhedB&ma.,3OL+Hndy];>E> NWF >Ǥ(" !!a{9^#D50T`B]a6#>*ԻF.MkOt!pAFҞm  W,p X9(C.'i/9Ё撘LK2 P3"c\o{(@sͤ#a_xܨc |x3iDy?!f0rx]cI=|8}>w^w) /aڇSbn/rXc&iL,P]#((L2T$<\p<ӫõ a հw,9 QhNXJ6?2eiʞ1@*iAd&"F-搇z P Lkn' ҙY͈;"t5g |x`pfϲxXx3*߀|oij:5$Ȁ]DkSZthh7 /P&{p$̈́ɽ`٦`=D$K9Ȣ+敯7 krV(yx! ' %URJ-VE,5*٩0ߪO/胦Xbuۯ#>{ϒTOux˨|#{S=bAZGH%iAMVW[{'yoshimi-2.3.5.1/banks/Pads/0035-Synth Pad 3.xiz000066400000000000000000000036471506652756400204160ustar00rootroot00000000000000Zs8_LMs @n.n# oeKʆtL^V̇O/zfqEUznЉ\/|j?,F'>q3^<ۭurωKS 摒 u'Wn[>BN]DtOhIG=(Y{wR }xe!K5*Ď$ 'nO' 2VHv$0],a.XL Qχ M,Uwt>6Άwž󽅍}!z\iJ#o^J ٰxaYBVd"V+({~@׈ InsByjtUnu(L4 taѐewVR-\р?.Q"[V+-uCxaߵ<'< W2į*Yd9 z!ƶUd+V .I#n*H5.M塢j Oa1"/W+`ْwMץ^R gwϦ񭭡vIF4ȣD`fqj*feP}$I9iźZrRr'hv#ݸDrAp%ukxͫ$q Y1WP/ Pǀz|cM =e`x iS! C is8`-:z&@^NFu2!rí%%,NIt%Vr*V:<(q4RBjVQ̈PD(^z5K=VUHcc`w.rM]aZ]ЊdiMtaD.B]I=@INy,S(J˅:PQ!j\#$Ȼ]#eFl^dJf Aa-) Nhg|:NEQVk$Oc9 :ZjFYػRMIV IBUp>ɗx՛Bx?7рF@AT;mvU.\v{|d0!WfjybGT,YEq Js|Jff~x門SU]~Ί@gF`M``Ҿȥ^QZan]Hړ!OTs>C<=>K>M I]ԓDp jNʘ\3N nK`2 k7s!Fy?wfT1Z>M5h,ͼ]v/Ε;ftⲲy]ԂɈP'lԵλ}lx¥ 3&Nȁ_E{+-!Qߢ)Ҹ:Ȼ̧G8NpݗD*0@k/ n@qCsl)CXC6,=ENrEmKZ%,% wYf"'1tJIC & t5owaw斴j.w~.35;װ12Bg;A`YӋ(0qԧtV@-|dj d}|X7CS+MS7TmA1>d=CLpyRz|D2\5Ic|-_@r'3h6pKKysEOwb7n*(D^6qNx\y]WfE n'y[e_bURcNͧګ~}sC嗸;ש_xϏx{SeC+k?TC}4@z~l]~ÿ>/L=o{{M]Qgl-$';ҧM|ρݸuݗ(y 6Bh&q'مB(ђzhz|7_[7vh}cksO.=0j‹ߚ ߌZ~C~/&v|=.}cܸߝM=J ꗃ&q~aƻ ,yIVuA9F<&ߩw=(Xf7~j:[_Ofwzo"s֭OUwp~X@֧ߗ&SfHK/[_(f@iQ:f#hXĖq$+W!GvW-Ձ8ӻYeSkifЯY٥ճ n:_RuefK=8N⇞FsU*{s5*MvMEj;r wm rh1TS&كz/}*5ŖB9FǷ¹_N& kwW4O"4`rkFdž[w8: 'λFڬΘzcPT.wCJw/ yJH,MV Qל~&[YGY4R^A('w:D̘/.W CxٸMڅla){֟= @,i>#z5]BZv1_hK7*F}"[Y4k2 &BL&ržSR-PzLi]_1tNN&{6&ZrR0!dut ; NDZQ _4 8i*u5Y0C /UN0׋C)+ELeD/tnAp|6]˲k6u[=ښ֗l˔ (۸*&QI6RL($Sw]aC+D.),.\CR|:S\Frrlam "f۩XljzlU`sߚ 2ʺrzc;.N#Rl`ԢQajY[,<4-- bX,%[;X,b ^cb xE9ȀW:c+گZ^u x1UǀW޽^Wk+ ^]^u x5U׀W]^u xEqmD;c x3UπW=^ xE{ـW=^ x7U߀W}^ xEW۷o+O_^ x7W^ x50W^ xE'K 8}۳X,^XtrXK X,^X+rG^X+ xrFW,fg(Nfq ] Ńx0 ^<K[m@0 ƂQ`0 ƃx0` & Lf0 %wZȃMf06am0f0ۄa(y PBلa(%l0{FF#x4Hpch(/Qf2[0GϣQvZ0Om`-шk̂z F!h5v<fy4ʅ~Zq \@0v~ >s e)ЀkBqh_9Z4;QN(O (O FXvG} FA FX ?c\߀ktGCuxGPf(Oq\copZ(O+$7Z [s},sG2F:eiY?{oD-?reuh\{](P*e:x}(6;֛67I69`jG6W^Թ͙ݦ8gwWgo4>| , LpF]gH /}x3 <NFpĺ@mm ;e,:vʠ Ylx%Xnmt`5#_nmt`5#ֱ^oG+l8bp6Cֱ^g 6|N1oGn8d* ;<WE^/wuˋ6lӻϵ5tnHɋok @Dl"T|xRw EuH }=Ъd2 51{!RUɅ_ri @,BQdf2cEAVYcQ*.T_(:WZ<+'1)YwJ/}{4FTH#޹M78M2 jĚ8uk^ELUC S֤/#IU\4{څЈ(L0NƂ (U/o'Of_54qTE8~UU[VE=4MZ%~<y~ Ś12rcs$Ya% 9jiSiܯwեj]MWzhйYqwrN_j]C٣n{ЦcY߲}k )ѯy;߾ޮaȻKzu!P/J?u`@3I}*KM(+ "G(o%3wDG4v_+1I׃G9+r^ͽE?e8,R5n>>Ujfcu9oƎWJRCQ7rpJj' '[Tl._XEM4]Nt=AEVM4]|"S|hMS3pq<򸪳\^N.<<FV"֪y\Qi|BM*rڈjGgO?=Q4j,lu F>rqAC7|=xބ@'l~=ZNfSkKra#9Lw_,e>DL FqƋ7"pD։:nb_@RyI+(N C32Y׍-E>Ԛ%fJdp|g2uj:5}^ES"X@W=6@ &iv\-^[th€dG5CFFEw0f4"!z6\l_)UiW'1YIhU֞tINU`[\1:4`RE/{}z]z2 _J2[k jIUb;/_$*X|.fB|}rԩF bc2#j@] THoޓ"+Y;m+|]Mw,KŜeiSU h&k9_혃NfˍK` z=S>! Cj@ Έ70 Մ}-LEG'>0<0#0Cp 8^Ad _Xi;hp=^;˽X8Dq X A@ق&t@U5RﮣLLH$a!LyD ngPfԌ73"#mpD@eG>_[}nuвVZ= n -YFs†tNؑ [y0Ix^,ŕCcoCھOoY~Sq -M-((7RT\_Y'yoshimi-2.3.5.1/banks/Pads/0065-Soft Pad.xiz000066400000000000000000000036431506652756400201000ustar00rootroot00000000000000ZQs8~xO!!0ӴC2@ r/9[NClI^ِ0Ӈ>Wjo?|,N(l:O O݇?Wam8y8ģ»|5ŗvS=CNDS'4qicrӰqGӠ!JV?ɍ!Kx:o6r#=Vhh:, 1y5lmW$M alw[dSL>Cr7 nl-}\=#åNpR3ssNȆkBj%\2W[̶L  ^wl(?G+%pƓbv;,d7YFq-9^25?VwdbX4톩(4]$j:X(F GImR=H9inh:BƋmDqb>ZYW Z)VZ?$ٶھki_q#<.fU/)"IxY/dTc̀$+!#cHCU1yˆ_d|Effh&Gyۙr~مeMl: |+sP1'UP8YEO=9g!FKP1C#o <2^b( Y`YȊ(]Oeh*j L[>j q* }Q`r^pM:gF@-6iK?N܃$idT ^YY%HZ=e3bQ$z/ 7}]XZtY@5* d?1efF8HE_*h'1Yq`fpPS*S%YqC\HJvNYPO̹wJʑJP/,e͠+N Jhgt2\ɮs{icOcu6N7vjF稭VuEV)Bպp>7,hNqe<PЁW.;]eErɏNו'(CpUhg^v(.>id.L3 "[AMtS̃3 hO~ndUZfh.dnU&7;K1P9 !8LAQ$.l"8 TmeYtяy J`HvśO}kLCBn@@ մ={ ϬVoFS}D7+7/cF;'atno; uG(ӗΨ휵{(Qq 97u\%8kTk4gyv ڍB}Ztil~8z[/P9fI!&򃹸xPsn˄qY|4TM;A*,-3YŪ ͛86Cط]V]\ 2Ω;ܯޖp`;k=l{S MlElN?Zv+UAkp,,FRR74:K9{`BlC.ADIcԄn_CS0#l$O*"$vU$֢`ًz#J1YDD>=&ZeIwˊSF\:Um_v7A).@:NuSWM9gǛxSw7w Ϭ~KcxS75E>bA:GH%AM$h4Z{{4߆b],vqxÃ&+ Q;T^ yC@{*Hi1'yoshimi-2.3.5.1/banks/Pads/0066-Flanged Pad 1.xiz000066400000000000000000000040451506652756400206440ustar00rootroot00000000000000Zs8_ނIB`i&f\)˽h-[pHC[aْI:}j*VoSYxQxѶu-:Û\.v]8rE֥)ߪC^[x!ߨhn&m͜>z4loxo ?qȒuI}0=m !+t<ߌ1YE i.ڣd%h[,|ۑI%n֧&^E1O$\P ӅV4RKY-&i,o5NKv L"lfƩi P  Aɟ^~hz)*Z8ꚥ:Gb"_ª| ;zgdRM\ ISJp1ɗdyYx?d2R)JEϹʩqXf|˅Kd d$7z=B>F>e !dLA sֈ((DBzGG%asuxd~x鎀SUBy9j+t>(q\)7(Kgc*ѹ=˾XP1`#U2 z2{!p;襂j\3|[Tq \fԌ73"$'ԟg<@]@PS~7ܨc4n"<N>fⲲz =k=Q'SAdܳN{Q ϸ<Sb..8㯣HNpS*ҸtOú(L:1T Ta.e@/wo=AqCR0S/V-H΃ hNXJ6?4 eXCNDc*@pM:k^P1¾ o \$),kpz]uaخ] E,klElggP.`Twѿح/e@5ht<@&{4djf_ɽ`ئ'*AjWS%:ˢO/b*Qx5=o!fOP͞ hAaNX;ŪƬ#xMV/zQSϺyrO:Y/xώ(uZ?/LcvHx P^Ly y ӳT48צyEHLv6+80)4Yah 2L+Ď)8bP |1>SY41\B!nC+^G r{BV.[U Hd)yoshimi-2.3.5.1/banks/Pads/0075-fm_sweep_01.xiy000066400000000000000000001132051506652756400206010ustar00rootroot00000000000000 fm_sweep_01 Lorenzo Sutton GPL v. 3 Pure FM synth sweep with filter effect (no actual filter Env used) fm_sweep_01 yoshimi-2.3.5.1/banks/Pads/0097-Bell Pad.xiz000066400000000000000000000037671506652756400200570ustar00rootroot00000000000000ZrH}W; 1TN[Rkxk/S4%8&_=23r\zzzrO_|̢ ˦l7xl>,Fg^/ƿ`8t9̡ wG3~ ˦O܀?i7?ȋh mژ }viиkw (`qҸ4PcwlDv Ǝ'nO'߆Fd^#>lonmI3^ Oha×:[g[Y_sg;ka޹>}!%<7FJ݄ caq8R౽m [-mJ!=H_#ۀ;:y8C ϕƓbpgMy:w u T&kqlM;-BP5]uxeBa]zR=Y864dn@m`q|$ü&\$T(yjʶA)k\cE7k-}B揓ş'dà#MZ}>[:ɺTq~ʴ"ߐny5MG[K%Q èe'Ëϫ2B?w,*M ,z4 #U/NR@8:J^Òa%JCwAKeP'S \ՒˆP ^R['*4W.2 \00eb8?SNTarX,:ju$.dINC|.$K+Z1+FD~r\+ݑwLșT^D hZf gAQ-vSٙ5N+^GhZX UJcG 8TTK!)RJyڌq>ׇx47P??5b dwȧXi^A)o2aAXɍ/njЃT48*e"ի{^١&(\H==+P!y&[NeQ[g&>,P5)OK\s=[a|n#,"ovz@&2AA`3S'jyrE]N؝J>]GԬl搈yLF0g 3${ƍ0Pt!2x?Wk@xU҆ZXǺեSB0*w~a`^.\b=$ DgF@*XqMڡ_AQy@Q\k0&~ (NDkqO{[DĽayϳO @l>h%/5{b]\DU}p+9J4ݣw-* Si6MS#<܌/IQOҰ7D. Z @r':jS:d:XV<(ohev* ~crAP|m"qMM!q7ϝ% lU ɚE$JW,m?a9s1Z!)<w-BDb)!]n!`&ۻh* bny5c#H9[w7\qUSfR܃6vވH3rV'߅h48's0T8Vי愺 d8\|G'w*J+*MžWZ!pEljY$T^8l:KHdy4 E'b}s5]X!\BhJF^ӀC p!JD_}/Yl:(I!)Px`'*U" ihI_^ˈ a+pK\eHŒuJhVa$'G1tjB#`0}p5GT<g[)NmIn$ SGs^T9@n FmxcI(yHuCŌ(ʳu A*}lRWOPha1%($ŞO`kّυa %=,HOv( !, 6;ǀPzr~yZehц%]´""8G1UХ 6scj6QQ ޽RWTY$"г$y$^fZ[z~=x"դ(6LEޡ!EbA.bz,Jm1aqZB!5s`2Gj؉6 w~l,}*4ch7U "w*sf "GyJ?&@+Pkt>Ԫ)cS)%NT:6 TL\Y )Tx CDŽL3_$۰YfTZ1j냿3Ӛ"MF/0xr>Ҁƶc;*ZBmhd)/I:B7]R;Zlo ^L)h=xZz0ܸWG)('H_#j.J$|W<'k6sv8 `PZ,]|EjͧY&SJlWD6~aCpnF'&s?P9:KݵcZ^է +Ji ֿ|08b;g"{Φ97rۥ=oafgH@\xq]F[c(V='UÅ`b {3R_ۯԸ9QJ]߉˶|, OE4J%t JcCc!$Wu1Q_PŒ0s1=Z*0=Fm;1:֕~va0=F?(NJ{Lo ң_c}q^1=Ђp#oF U\);E0I2q K^r.F*or/WzcP W>lԨ@\\*P_z\rUߓ[1ke ~V} o;AMթW@}Տs5_"c5e+v zoN?S:/|79={.Sߪ@}љ W~#3WS/?:eշ[==@[[|$7D~Ǒt'$k:Sn#T .w3YsRꙬٯy&}g>w >A>!t۱$a<:oF!BL½ AӉʋ2"[wӶH@&|ʽlrx)7+c O^5hapܴ~n74pCaO>tzy2|5i){M8Gʗ0:nMqؕvI{vyFb4.݄<$h\t9 Wpk4N'dCO\hIWMtvvy}1O/g߆D" Wqs|z?ɽԃU Whl _uM-uXo&z|1OoYin%/~ ]ΆFIiUXC].+u AwtI~})7S5̯o/&9W7cttJ/k[ݲXflOnfS+BOӆikdvXL8sLeς7jQK"@|r=i@+_hfWDjCpn~|OԉחZApbxNJύMӪ`l-ϳo3&q" PƎt~{jp)&( "-<\%X9 4g t~Dz2C4N7i;`W4FI &4sWz]4¬W+ JIu(v03# `2cr~y5(< xr#C/dbe #@ sǚes"$&jZW~@a]8$f8v<!w|0` VX7} \khi,.o_TT s ^Wr툒<,77[n MaPZ=;ݾ²`6`3(g{1@وEx*mlz$OhhCk1ʍ4SY]л0ueA,}b=;Z" bM;ID/:02DJ  ˘>wrlOKWG ;dmbEiA,PlYȢU,0֫.0 w$=sq"dtNjuV"l<;r.Hq9=1dДCr/Yep"vw "9y6]đr$h%IhJ&ldlDELdEPbzn6)p<-;Acℱ ꫗YwmI3)h_Q/3ӆZƧz/ W\3͚ %$XzۜmQXZ^^ͳkc{DBo 󿷱 :EEd5>V"w=rY@E ߬pTzzrA5 ɯFմ /L2ShwҶJtG!{*NmxMASK oS$HKYfmU  d!06ݿD36 w6:p:NwI]TK3W7*6m"x[g $l{m(Kb6: QIOԼE$4>dtjVYmr[ فkY5o}!׃;ռL 嶚 n#QPV7˚9h0g{jNŕ|].ȋʋA}Af:zأz*.w :cw렾ї1uP_MV_A}ԿjPoK{G3 |/:Sg{] z| {{W_]_4نƯ[{".lCҩ1}>Cyfzfk>MdC:+x]A6XC鰦Go4s 6l zC#7tI8ź}KJ&gg92]ǷdBʉHK#& 6!hY?ʭU~w4J<?|?!]yoshimi-2.3.5.1/banks/Plucked/0003-Plucked 3.xiz000066400000000000000000000043211506652756400206740ustar00rootroot00000000000000\YSH~_;cdGDwOx8l6RQXӖAUU*j`OJU*>m[,Զ~8mo?|j/O?ݸ?rECc v'-?mqyM ا*z I"tg[LICZ⻑uAQi|t;^ѹ}". X.++~uc̋Ȏ8L<惶jE,"lfs#)< LGO'Sc9VdXoenn Μ+ۺn_:V2gk6ݷ2R(jo9{ɼk!505h U*,Ƿ-щtŅF*1%Cp['_s:_KV_usgp,L?ȔY@ ۻ׏B\8D>"zB x~ +9':$&>D@B=m`3GQ-bƻķ7ؕ4ׯb O5E64ߵIO؏"ND.pn#l2S7p9N^De '8}sH pD!]wh7˷`^P#ś1!~\ "9~uîuj !Y{vu:-G< |i\2aLv䞳]DސvxnƉvCI%H>kdtؖ־?0Qd;W;d̢%ms?^~1es_8FT(ʳ] *; m+:xB Nt[O $lۯ O8F 5.罳pQd[}(4>YWg$!aGBE&zr `Euޔ0{4fAX~0R/P&MwG=Hu%JΚ! 9)a^GL$68y"v;^r:<PA$Dj&{x(YIF~y[5?/GT̙ b6M/5` Q6 5&C <zȪ%'*v 'SlF "G?Ʊ@Pk&u.ԩ1)#-r_tpT(*-w wZ>'O1 "Ef%K-3*`g݂Q{͐3F-W <*fɍd>_WkhƶϢ|I":ɖ*ܑ˙Vzu:>A !"hIRɫRI>2mҗ ɰ}rD{L&^  9F/%*X_|O@RӔ(v7&Be4pkxFu)9u.vMuuN1-b5.j[jm@2Eov6\a{X4fzNʼkfyo)P|:҄-#+3ٲfd0lZ2΂+n<yט,atI jWk "RG>˦Ib*-ZZC kBS㤽ZIK(Q2 8< "y~Ke cÞ>:V Yt4;pA/p:\j QzJIP OGi1zguR?Pk%E-~L}RL scR/s11J8(dL^)?0izAS_9Hꇃ!K8U~/[~彗-OlV\8*޽sQduTlG0|/=Cu]!wn䃚C5 iX7fu3֍|ApjzvpEh&ha@Zo){;}BL)iz|SٌH:PWGC;} -rR^2￑XGD^m{Cyoshimi-2.3.5.1/banks/Plucked/0004-Plucked 4.xiz000066400000000000000000000074241506652756400207050ustar00rootroot00000000000000]rF}WhUqRLժ֖Z "A 1 p P 19l'e~<$ V$&47>ߞ4~Oh:YߝO}Hun7F$'w:N~2O.'ɕ7'"|xIzreiD5Gt' o鯼8D"x}U^?kҠ'2X@ @~)ޭYǍ/)y1^rʞ; :VKd"Ol>>s:eM&)PU-t6bd i/0]ZUZlk>܇K(cZI 1ϻФ??/NܹiBI쯒4|{/EU9w~2J~2Z}!zکՓc\VOϣUOZS-oI4_@A\辊iDgiNU_3ʅ|;hN4W@ $KƱk\l޽v4$5KWk7Qa<%A٘Ͻ)4ws5yT {]â]ECѫ* ]Esv{sȉ=/Nx=]r,pzJmHJ%h3΢ARn-P*N%(ThQ7te&$qGzxuV\]_ܖO*̠y";RuU qXi];+Xiۀ67:Vڎ۵*Uehsca 0Rq6 r[il['eLr:lV/uvHlQL;\*eKa;1_g'PV U$߆l fZ6db <]0@P%[kvv'ĜVncNr i1U9-fNܤl k9-6bn9*b9# aS#qj5NƩ(uaS#qj5N 9 khT> k&301GaM<nj}ֺGaM\cf~đ;fl5w!`Pf{GP3X"PC=QjQj15F-RbrcSj5J Ǝ4}5J >Xc' 1Xc'*8Sj506Xc@`lJ F[!xbC(tӦ;(qӦc꾝=j FCOY>6F e~d#95Y1,df >C}L6>f#;۩wP~@,k9w c;(Ŕ#WNi$% 8In5Ay]7J鞣L\5j&iawd`M% 31k|(Q@A=Qg\Q.%eoZ@qkfj6ϻ$w% `^p:_(k]JPG}E,XCɂ.V#-(YЧ3G!oAuݢw5שru:@Q(Y5ר%Bz,-05dC)P˘dשtP^ qP`@ Jp ,ώsG ';4'>#5JJxv){b!fvJ\gG aQ EIy]Cg1BJvud䒩}lP5idzuӻsځL([1ɺ?Ta€[nn368۷[ZԽ &a SL10uԋ+WOr]He &E&(u@.Jŕk3vQ~ (u@d.JPu6]r556(u@]ApdF:kH(Jp E꺸(uȌRCz v]hE=f(u/((u@߷rQꀺ.JУR\JP`jТR:hxEn;(F%[.LR|Q]:, T.v@㠋RDDuM=vQ@҆lMcNR5'Pp>+ 4J22-(d,J`^=s+rcoT@ʟ4(B{jBgmnUjםރF62Gן./OPE"y%0[\ (0S|w^|7Po ՆTr*EkmKKz& Re?U4v_˛ cVf/YIR$,T.%Bf>gv}jf} |A=p}Xam鰮Wzw5~Ey]X|yD.;Ƽ_@& jgg,Hm<,F%W׬i'=KW - R}޻gA~'dESM$55vyoshimi-2.3.5.1/banks/Plucked/0005-Plucked 5.xiz000066400000000000000000000050221506652756400206770ustar00rootroot00000000000000\Ys8~ϯ#LilF; 9H-Ǟ_? 6Î39$Thi=8 ҬXE~ޟf'޽lzTs8l~~+?*;Y? OwK4K MNQ,Bk1>ZꌐltU |YHK_c,UP.6'|ծ 'aOH1xalQUc#֯@n?Nf#Tljr^]_gwV~ҾGiH֑tG~nBD?}ؒu !x@-#/H NPǒ^s;mŵcFK \ ]{^Ju:m/9X wtGtS~PDvEDiGZ/43.ib<d};?A7jK00~dY= s*f-YJwS #%J$w]/h9DR&9 -,c6dP0@9rnaZr^PI-ʨgpOr;v,,Tv{fR; F_mX"0-:!ye |NmhxGXd9A*MK޽,ISvX%FEdj3{55+E(/)dRI[#q-%ZGVYlq_,‰g*Ml}iBZx3N3,"B?5K < j{IR*EmSw!+TΊa7D”  1MSY^VRnV c/|e*ZɆi虡5pU|'8g~JIxDfj/fH0ᬐQ[%h,y"?ibDiB40{UꦷgK-ؖlV~s-/&ībFƫ-4:-y%F75 ^o@ m&oN Yz>G׃^3| Z^w䰅$>2NgeX{8ȢibD^Rgjavo= ج ɱM d΋4 zd(_UZ <2rw5XkhфOP5F " EV\-2ykGTt>yRjGGkgS00gkćVjY\9,rۨ뜵h6f15~Aͪ Zn˷6c ]^ ¤; {/l3 >ێ{o(Nam6l6+Qcɖ! Y`ma,u/nS?(ps3ej[*&1َ4pȳ~88v#mo&}0np6a wq쑮p[vvvV6(vfVLd~V6uy۴~σ )SVMn}9KЌiUIRl6U5{x*z a]ՌS5c[EW%u#.wZ7c^ԷJɘ*v0c*o '^YR_U ɘR^јqhLπ3s@R Euo.-]mh=U8l~A57*Ln.wDwO+9¡)¡׼pCP >v wtPQv}GqCqpQ87G yCt%vW-<]\fd6z(oɉ+La{G}[Pގlrc<v<ת K\]yoshimi-2.3.5.1/banks/Plucked/0006-Plucked 6.xiz000066400000000000000000000073601506652756400207100ustar00rootroot00000000000000][s~ϯP)^fdjjK$g` K_K,EJ,{g'O2 }8 q< w~}:r=:s4LnWz7S_~>Rݽ Q< IN񥟌q?~trfc8ߩFÙ4ZFA3z8Qf^C&zqy~uixwqu)[K>g'?7>$Q譒`"3g+y$5kոYۑw=~ݍnn7Cs߼y8 =yI:Zïai0OE(IynA9"/N6FnT_c4[s0ڷfpD>Uw7?.d|cnx=[ͯf5~>V&9ϋfAc9"gA<5˚qL}|9ray"I8ɸ{:]m*<6_ZڄlUr.g&\+J pEi(-Ru(-Mi\16Wd]o\QZܲ\i WJ%Em|mG;W"=I#Elصw )1҅Lhu2d!#}(1g>2d&؉;"Qb07٧MK"Qb0FE"[kLtY2)120 es?w81@˄5GE˜0)1B=0JY53efzȲam& $n6#07LiSb0uzTry>2}9Rb0}0ƒEqU!q1dؖdu@`x:1a@X):ILTU`1@ N AS#1rZdB0gHSw[HsZj3FT"bCEO{;(Rn`k;P#QESNF9E%'bC]5N⯜5qٺ4#>P3XEb)k]Q8)v[ +5-(֯nex ֱŧ#'XSk=Gat(_79sbsv#rvR$ֻZbck(R\Ȼ.֙Gf&!FXZdlAA %LEQ*Oq.R~ޜȵXx;1.߲vXC c(#$@v $Ĩ kkĎJ W_h(5 "'&: o9r.S܃}` e}C?otOT$]Cin3FJpe #*zΡT\\`c#Jm&-,Qo/P%2Jp2; t(5 ׸&BIE~Cbl;+G78$8wQBfWL(u@*Dl#tW0aw^\:+6|l;9Raꀱ .S56]:!6䢗:(R Rtl:\(RQK&f(A J {ȅ5>s`\:PoqR4eԁ\&ZuM\:\>=pQꀆ]:9 {0EUcƎ5:9JװH]C(u@]p lХ"*t 4XԁW(u Ϩѵ"NR5q_.F:4^_E%Z5y{^WENuTug47\͟Ey>]JK:ZۇR(eیuy-f\Q&,eh+vTז,߃JjeU4ޙE^âpZ}6[wCKmZIw֚c+,gP-`4ݴ^Im|kdj]ݞ]|,وےs@NY$b}fYUWPVʄf~wr6l 9fkDԚۏNڜNrk)f_n[nfGTQ9Bf;~Q\M/oDh"iW(D"Y޼x'1WmCZr*YU$ZTAoABf-KIi]I]ޔ{pN_DRS9VC\^wvAu4Qw>tuyqUV̓JU:zqT=V;\*uB;F۵ηeh*1NVkJAbIb]mHUR0Ϧ~KZzRMd?UuWś1cV#ԦY6I1RM#4T<JћEiq6ܼ߁⫔읪v# yZe=u9;x:R͵ T J&dzC*\R)@7Py=n1W#Yt=_`H<s;V~Ep6{sL):; /dkU2(,YGfӗbok~В!ϦW8߭2]s;\%B$WU@rwۋ㇅V 1S/> پw`{f~`{ap~] uZ]ىZ݈xw_W}ט+rkxRW؟`t~>:˂"'iT2꼿fM;Y>%hɏ\?5*\+?, ^'+J߯lZ/buyoshimi-2.3.5.1/banks/Plucked/0033-Plucked String1.xiz000066400000000000000000000075101506652756400220670ustar00rootroot00000000000000][sX~ϯ{U)5k;S}Q lM@bpB:HG5;SsG͇_GoafҨx$ڗگ}׫ɿtz;]#5gXk'~|Ҩ!xFr\y0z{E4WUEɩ;ǵEhi+vkbp;ʹ I.Y:cwOvR7oVAWq7Cjp=oҥ=.'gO}>ic&vY;~-"g?ztZpX ǛͼFj cl}ޝNC~ IˆluF/mnLڧz͛l>S2q 'IH4*P܊^~؄Gno6v}60nN$L&0fF@pJ/NqFËȨz/pUұo)+,{ޞd~:5yԉCM 2V̪+B>4i wC\)HV酲B\\}~9c1n \ sd+ TF9yS/^H!]ES4<wJj?nOaOVSoĨ'j6VOuA=u_V=2J6b[=cY9D~j-GwC?5άAӀFdCTX eke*:G)SrLmn*,BeR.Z7Pchɂulgn9[)'Lk!Nr'ߪ܉Dp6ܵ1={7So%ʋsR/) cQt KEWg`*SӘKLزC6&1:8ep"Vix0>LD1C8*&oB +Jtcˠ :9ᖫ0T3[Sʮ;ߌ+)/ 7xngFGqu9Q*ϠErrjّ`+KfU Vy v͏f b6*cǶML䞷 tnwfѨۭi}~ylLg8T ՒvM^3{\mq0V;T~\]Q@W;sTbc2<!LZҙ,Ӷ@b%aI{`=Ia̲ L^ LI!Lv Ley#&&2<)# m#)a  am47TN_IIJRd yVºҁ=be0EWFIÕ~ !LRindZa h>+@($v3JK<&&mJDmI&3ʟ$CTu_"I³Jm#I)!o[bYBJJF0a}qa`Iƽ<}It(UIgIR,@}AB=ؕwpG,1Ƥח 1Irx8H>&_GZL2uT\%Z11 J񬒞98BpdM4ܒBXJj3&jr\[ O ĵ:k$[1ڤfݳ,d5%`Y8f-fs#&g.nOX(/z3 %*. LQBQF2Qet4^4 %u'cTC혼6k6 X5Q(x2 l(EWyZe'J˧Fx ,1X}ʞ8G%~`*?.hH.-0%y9vEZ3ba5@]:sT736;Gukn@Zn lX7Q }&P@cn@LermT7acj6FzK޾t@GJ:q')hψ;ђZd-h?w+7V~fW%Mi Yzڢ=t&Ͷ\_,z iN,N,iù%{ogz0yjB$L#vKh:=Y?OZ(0Mf)ҍ*;eGCgXwys:\ ^hvpZ*L|_Y6i,)R-n@,D˙Fni[ƑSѳbgɟW}Hvi8у[+v`Ry/#xS'VRQ5ϩ|*ʒڃ$gNIguLI: Hͩ6RXtK { m%RϪU HU@Sw5.W;ƙN*tFZ d]شjmTxtVo Rmf,O^r Sֶɷ ɷ %QWz\[nȫ?!jgRj#uӺ͆xPR\.4P&S]_w0&D9Cg͢Dk D3_9Z6>&mS7'7-<,_gB̖4ۗ9w;LW&V yct [AkT`HGa[ph 8ؽz  LG f4}-`? ^ȧ:jh#fOi}Oo>}! Rzx#ԧW8鷿|eU%U^; n{隿yVU_"!~CjY~S Mz/7͵87~ So/ܯ( Wm $^`$Im|S+T+bgջܠD4xS(f {uyoshimi-2.3.5.1/banks/Plucked/0034-Plucked String2.xiz000066400000000000000000000075401506652756400220740ustar00rootroot00000000000000]rF}Wh[U#QڒVS}AA$(!&.*V> C 0sx*=Y&{.>}4lz,07 0zxtw~x|?]#5ݻGxp'a}lc񥟌Q?~tt/>c8 )T. INl=m)|EGdb!<8wӣȟ9Jeet)>Iؤk u_Vm:z׃vtǙ՛ГRXIYV#^ě /t<'2 &`qRL*/1{|}ׇɏͣqxy[0t9nW_?ik5~}?gف&%[<([0hN^d-ebd 3"NZ 8ޗ'UxwÏG8QAO뤃~ɛ-SmN oS8-Q U2xәUڟl!$s?q!d^8҈6 YnHD(̹LQ>{rN7!WX&iI7h ЂAۡ. ґ[/j}\28 G8J%"^ȷS`xД"A$(3E@f)*g+%-؏w?JdNLkuNܞ!LHS\3ԛ?lG7^Ÿͧap94!Ⓜ=im:Gq,bL3Cjl^sT͝ ixy䍃t"sb^8eEUQ9w~2J~2Z}#zsO1.''SF-ŇX?N8NQm~O3g2`a'M(xju_ECUyzlQE$򴩧3TXVJа6EKpCdq -Ym,,aSZij6.ї:w( 0LpmLA7sU˹;O cQv IeWg`*2]_mOcr7/1c!:ؘn]:M{3\DD9C8(u$ +It 8Iy-q:_ĩ 2Kv-Jj\gI8I(n;79뫋˻R>JeHNI+R䩬I;uc]n>V=u067Wֱmֱؓ06gu*^`Q9c{\Tc`ϹٷX7adu`գ+put2%d=>,`=2@J35@X Oa]̢bZ=a.@ʸڟ KO SvؾmwlT !B+0Ih[az`Dє}ed#H2!Н 1xJlf]ka ۦ&VR Ӧ @u+mwm$b̬+;ixL&%ҵ:g^v^1U"\]qbU {f)3w`䈱]1 n6s:aԣ^ZW¨uc L0@ս]L2x_`H*!m#,߮=iѨL"!Ԑn%`L2+)<+3+s %\1&WRq_IF>mRb,Gώ1:af8m3IkH2WvHWy}rc!:33l;MJ4zhvfY(b D?nTiXq^#eDڌ>7SOgO:˽,% 62Lb PkL 'O8rmoTgqht 9͂8(OiE2*=gFKbM8(믮۵JdBzJ0AX݂R\P-P+(e fkmY/P?M9@rokT3߱wP T*X:U*v5T XkjT #)FF?1T SXs#J?ȩ l6TJPUL,s|c0bk4E;][=MoT9*Ыp+xPAv]3%_wU>DJ^P5" fѩP  5nP^qP^ L+n@-4 8v좺͈nlq#PT7ߝ7PʯQFuꟻ=ɇSCXEu3n@s=b[P@H -F5*ܨn9PEuSQ݀ hL䢺tTeUmJdYW ٲL+ FS49ۈl!~]55^wm|=Y 2%oO%~ dMRn ōr"³ =@^S}U$k?nI/:DcDLi@Mҕކl2djԍKOI]J]ᔉIHP'Ppj8S[ wőP".5ϝ]bmTǫˋӬm{TFQmXXT&Wx>GyM9mBc+=NVvv%x%Ura5ua-wd}uUVj,򧚾nky3aډ 5^W[[jd&Z1k*jEorC֍߼ǿtUR=?-ٲv2grTx+<1 :{hq[̠u`*f0,-d7d N=vBu݄ #q:},!h}`*(;&{M4SJO||zo>})MRmƺԧW87?|eBޞU%d:Um-hym=_<~LժՏE~BjoϩwYwnSݦ Mwz'6a86z \:|_Q7_c߯(ˎIj χwY(ʯJP]w\C'[_!H}of .W;ڥybE0k 0Auyoshimi-2.3.5.1/banks/Plucked/0036-Plucked Wah.xiz000066400000000000000000000053431506652756400212640ustar00rootroot00000000000000]Ys8~ϯ#LilF; 8H-Ǟ_? $6@I>2/lDhqn<(in6hܟ6'ϟ>|ߧ`y?'I+?ʻ;ِi7?`Or#&+xFb4܄<$h\t%W?ɉkx5'3'FNG'و&Lt:ϧW3mK"gF@69>?d1`d'7-L}{:c]9qK/ۉs=_N擛lh> yt6;(IZbX8~B7qjU6bh咺]),?H"}GGOE_x97KVY tf d:tɁ%e"e %i(fߚ4ި0Wf?iD.+mwl=aG(LJ~|` [FT<B>İB&#DokaRω蚒Xig\ᐌ ñ\~Eo}d`ym--;/ ,TLs ^WR툒Aa‚ԷG#j[ Xڏ CpTyajTXW(q+ђႿ^!HA6۵-'QLGפT6J7 p SGs S*9@q.n&ξ<:&i }k4 ISD<{,Usa3}u6BSnO ,4Pb= .Y(HY(x@ٽ~ۗBL7A (g{Hұв !W*e0E3M 9ؚktr!T6B$>*캲 Q6>RUqHԽ.!b];IDܯ>02xJ@# ˘ >o/KXΔWį*vb63C8BbBb z]g{y<?DɖOT[7۫xvXD0v5=1DВCx/Yepww-"1y.\ȑr$h%JJ&#hbEǢL`EPXbzl-lSx,Zw cWO%u fTН3*ۃ Q_fԋ-0/ ^Vκ۳g(b6r.bnsE!cyAW(#Ԃ Ъڱ|L+iU;n"qoA)hJ)櫉èbuQs}0MB{4lx_@%>HlQGUh`]z=_VZ+vrO` ۆߨBH R>J,(ʉGRRl=:V)Hǹj6=ci;""V# x#r;7,nV†αi $܋֣ >hgeD:+i'АaUG"Ɣ_us{8V./k+(Z*nh:`8"ؖRaQ䮼#>)>r ]rR]yfׇgv}jtV(>dǨq]ޮk(s8n %nMP%ۋ ~K}ٜFEH)YEpֈʥ8ʺjP)ۂ/ oWE~p\47[rh%ri_pն ]^J.^Ǯgntž̅t\ɾ ҆*ם0Wtb*2|yyr ;V^+B܎v k.vTCKd咴e.Ϣr{H(Qvbaf ,G klf&=e'J"cbyoshimi-2.3.5.1/banks/Plucked/0065-Plucked Pad1.xiz000066400000000000000000000037151506652756400213350ustar00rootroot00000000000000Zms8_=%&@`i&f\h-p[I^pӛ6j}ٕĻOxdqEEz{lЉ\/h.G'ov5\_p躋t5ĥ·P$_n/#7$ġGƌ~]l;)>|%qI}07Pd+7d4 Ҙo4`U sb0FF /n?\x64iޱ$S8\d6o=_dk60=7F*'gAB,&^8 X:8-%09A$fy1\y jʍ ;!j2YqBZS I6WSj4p1]zӪM"'KoҙƚF\J#N$Nʹȗ22vEǏFWȇs 6)RSEGP8r!額PcoGGwD`# t#j'R\Nl0XxhL{zs6^؀ֽ\Pړ?̐~@K(9 !8LO$/pj_340$f>SGmTu 0+[!qM!+kg~>G@deK퇿/h,GS|D%K3{gnGcF['!+k^{0h[T.D.}٨mu}T5"3&\Z_Gt'W[BI}HҌ"2܂s}_*O sQe@Ϸn=An顭1R WS/z0N6$xʲҷۉh TE+WJ׼:#dbD?̈5X24F3".hˈ1r0!vVݳ,Y bkY} D<"+kx`G#jD[5ׁTQdž6P<0j{B4[S> c}NN7(Aѐy0j%$*%^m JAyu~T]Iko4&mj!@gbBWkWz^NnN|ybFZGLIr]:ڣ}/JjdGZ_k~o~[OV-Mjwl?{|DVb (/ۺZl˟'yoshimi-2.3.5.1/banks/Reed_and_Wind/000077500000000000000000000000001506652756400171415ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Reed_and_Wind/.bankdir000066400000000000000000000000051506652756400205470ustar00rootroot000000000000002.3.5yoshimi-2.3.5.1/banks/Reed_and_Wind/0001-Flute 1.xiz000066400000000000000000000037461506652756400214650ustar00rootroot00000000000000Zms8_=J̔r@:n[MW6qnSSZv}O[gAUxmg=^A7~wf믃7EybӈoG-W^[l@:yj۩c@dg;Ub95,9Ǻ~k:oejU[;2T$DÎ^KؔH~p#2oq1+pM% rUi.B&K<51ؙGW.)4|VJ-\$dpY#_١ؾ jI]Q2&/=CF4RK`x.?U@ Lۻ2 y)}l 3om >>PAb {<@RKF ^c% +"Gr\FYdIE{%/`Y"fH`{ERwYw#2sDgfvg[TN1.#0OOT$`.@hՙ:36$ ([C=d \Y}^ΐ@ w ̵ :@7 xB3/3)Fڄ {]^g {VJt3zTlxF5 "ȑ&CrH)A;׉b푖铤&c=klKk(-ߋ*E"X9\RPl<77JfQ쉔O$gtP3$ K9SCG?ԟR9\a}k'`h,!#T:jȧ7F="cA9r:<3@oX=B`Ƹ:ZϥT0FjY9*?cU35QQr$ UW e3L:d,Uˣ\V~ɂiQ*<{o4 gah_Yy*\Eb6NG&<(Fydd6T ?c a:Em*LI\^pђMFHP&wV"1JIT3iT)@ *g$-ԉ&Ugެoq] }K;SDrD;Yo%jg㔣q!hUQ`SaGC:I- K,thrT eK+5LjzH9y$@k& "~ևc\W#ilٺSTYiYeFjf6*33n23Ş #LH̄T]`0,cD)D\FG_4?qk@BGYo.K(DU Mw( A.Ų$94T2LX:uK$ɧ t2xIu`d,ՆkJ\cYyFyK*?V~DoN~B4yw"MէAzf)ʎ\rߟ{D3"PxmɅ~ _I\k洉'5ي>hdQ0t6J#9 :^S.I=Rhǰ?s˓OOJwG=yszn(>A?KH@+oaIAF8knfaFn曩4If/_N5#5`ff/ &i`J '{҇`s<6GK^b )]*ѱ*<݅f *_ _Ic|!F+yoshimi-2.3.5.1/banks/Reed_and_Wind/0002-Flute 2.xiz000066400000000000000000000060661506652756400214650ustar00rootroot00000000000000]w8_!᜶sp6l ($&M+[$_Y`mr}jkOCR?Y70Sp}'Xzçb|r],ތ~|w?dIb?eݝl_An/O6?.~$rHc#~_x'p ?BߍYf##b#Z—t~&:gd6mIhᓍ9^EfL;FF S~SPf:#nm87h1C9nȳ bˇy&nh{~͢j:g!S`?h"?/!gs@=Y.S&?C&:oaVMh`?`ݠ̌1T.v폭"Qje;22(◭u.,r2l?'t&X` ͣdNDъ%˝fDbt4>_BZgϹa toK9|Q/jMK;mgU4~4t t;2K /j,5` v6xS(FHeh0wo?d=d}Љ)LO:pG"uB5KX6v;6(?S,=s=Mg#,aY:h1?pc(`9`42݌BU)5(dJBi"`2'D`'mN%**wi%Ѳ]q.0hXoD؎/şϐ\oݢt6!]ĥ=ϥ0s젥4x\ L4N=;~uj>'sgܶ^Ao| c{(J^!6A6۵3%.rާfKwMKZN%XQ\P%l|;hzW[&sn !: #.P"~LG *:i GOJ"Kco:6Q>gݮձ.S:?A|7Oy9顽B ?g{-? ju)JU4eStel =$rp:9$vPB׬S$靡@c+ێC|Sy aZE.wL zVt[9cTjJ@[GُvBWG!3t Z;s$Y1˕av4M EVnlr1L)I !~|/[ͽKc1ܣ-l<ݖ$1'>$q؊ е+J="Q8Rƌ$hqıeY!n ,&yYD^47w"fKt7@KHN5H%J\UJ}%ȅ!l~1\3f9Z7TOu-cĀhx|EJm֭l1G2:|6W"3u5ml7"tVy-r+ bìХ*yoe(IzCwV[bC]P?2{)7m{)x̨ ǟh~O_-*l?nş)|d+_J6_Ro֍'/0xߴ~9k6 ~q1~{Ûw].>ߎ~ |w?I(gvFxYKNc&Γ[gnƏ ( 8i\:kzlD|DKzoD'f̦an{^]/Ahbo 3v;xF S?B-P:'nm8ٷûh1gC9ng{/}%01>IW +~OMlo8v/i/1d{Jc ~D~QA;:zḡ.S8g¢L狻7邫u1s0]7?׻kt޵D5?T&XZJ^^1AT Iט6R `\|N ߵ3yfQʒ0~]nGVT< wr#C a41ɧD `Y&mA%*\oiGsbaUW~̝AKi:BAi{~{.f bw  ֙  WΞ;u޾@ v5!&Jz#ٮdԸ+Il;>9.C.A5kiYa@\TceuIJU_GUKvp k (%g*t{sՉ֎?hNT;D.>>xө}VV9vՕv|,l"x\d > OЧ ~y.0[񧬱VЌ'אVO91PXpT0I0" +}:C9 ,A 2v9]9@U-rdkUkv/; hkX OC.2Ñ6s=I\?<ux0z7Ϧ&O+Q~lr9:RQ@B~ [D(DEDm[E-9۴q'>rD=('Ձ*}H"Q:R%4iqQĹeU !o"vW;ȼXm-v;]_$zf/YfoQLN5h*BUF}ubTT,m⃕I]riPYiBEͻ*uHP~̦K Qnה`9w(*d> [`^ɨ{'/"NƮѾrr7GXfT 45HV7YFckwU~&yk]mHT3U ^oQĖD1ˀU+ O.3t:.Ȗ/8bݬ(JbVı&*" GUzgU^"SVt4qdTv+ѪLg:\g:*t]{2F%EU>(Y&MI&?ℼt*gSBex~g{sWڤlOIGOG6a棚{KHN5ՙD,Y}sf(xUҺ.j+̌guRwMgNs} 0!g>[q棏>q7)KG>p9?- 'H?$.lxC`'uQAS:ʎ'mಯ^(JJRlW>b=٧kѼTټ`IE͖jJJ)P yR\=/ d- 2tTKQKE{u(SksbUר]bsCk1*>~TרgJl՘K!Ն۸VBZ35{E>}AA=9~(BP6 DAúJA9 lQGR] ܭtQ)lL Ka4>Sb)6Xqhe)2@tRB.%*2&z SNE-^R(36*HR,  cCtب$H,]_)` n}|bhcq1Zs|D6':6 4HjGX ck%AˠbGw9SacR -5knQ4|.3@`*Nj)F T^0ܘaD.u+ +Sԁhvy))946dð֭Q^+Y6PmN᳹.ƚ >k0r 55,W4BۍH֊Bs]w m6El͇9cj.ygwe(IvG߬awA|Ju#ć2{[^>%@F|)A,ⓟ'h">ΧW W~6HW>Gf]l@hrIUnKWVŽ!#܄^zn9|=7W+_[Ϻ?onkoM/Et3uĬXeDZ>vc}](?uNDZΣ6oWg s UO;ӥxt`F"̈- 컑6$yg,Sgw4K,hWubyoshimi-2.3.5.1/banks/Reed_and_Wind/0005-FM Reed.xiz000066400000000000000000000042621506652756400214250ustar00rootroot00000000000000[[s۶~ϯPʔoLjKSͱ$W;'F"U^ $.@I)\,_b? >O-Iw,>Z{ 7Ox4`wчv-r~~DdOhMO=M7wxoW(`qҺ=i "pL}HlщR0rG"a4.jˍ?`[ap 'Jsd֙{Q5N@xsdfFû, H{I1.ϮJhG% e:b3u.YNφ]ۃ2HwXpI D ٭UC+H#< uORcfjJ=[8ȫ0H8Le Y\Ql80|lK@FLϹFq4P"}u#.*.F3ˇsq#] >Fszϐ[`9G5Jj T ֱpt- { 8jo=0&1jYKZZƑ)/Jc&IDϦJ@q2# Wɪ-jYUhSE0{*&p{<# (xZ;_5^n+:?14i@Y41 S,3$4c߲D *i &.Z #O2I"g8T(5Ljz3AC2Eχl 6Gab~W-~Kr\>'$]_fv/Yfo{S;k>G/Kʩ/;Iila\ oFwZQRqO_V^CBkMlM/B`}ч8Ŀ$y;?wg:d/KSɫSI>162 P c2IU"(47X|>{Lޥy­'2ܳfI *Vv6:1YQ\WnSNR)%yȡEFCT SL~膟gՁ#N[ʣ 9k7Lh)8VwqwE汅~آZV͌ )Lu֦YvWͻ<ZZ,aQ53LNw+ "JbOrPG(>Z`>2hjlPkglVZVN pax;p92.μirHG^g[Ṳ6S-ː;wvNQ69Oo$3VUg)Z JDo T{>o_=hrP̏GߓH3_8ҏ񦃕6T5qv C梍T3OW~~vrJW/T_n}+pܫ΁W ⋋bivD@i F~֌u#lƺ6cwnX7f{M©c ]\h&7}N7Ho'b.Wn+fg<0Ή32aF@}!ީrRf^K7$%Vp6K~9̥5yoshimi-2.3.5.1/banks/Reed_and_Wind/0006-Clarinet.xiz000066400000000000000000000071111506652756400220210ustar00rootroot00000000000000]]s۶}ϯ{*IQmyk+/Zl6cߥH A ).jyo ?6Z?G^}l|4~.Og_'<#ϻޞs~^ͽ_F Q\ JN>~GTqIi;;̞l7ʻN:,`逭"\^*6Dqp%Y <rBg2_^:7U{2VDjK o: 5,_O쇞Dsմ*[}Z2We~Mddtqy2rђ&hAbϽvCgWHظFT%B/ߋiH4A S2ɓC*eQS`xX\s'%[d+ކ{wR5rI iK*F-ݬ0;>iUM]˚ȻS`'۰1kynbߩH*~/+][C]7?ʲQg~֙zGc}4>3O[ [uyYN@"6>ݡ5{UPnײd|WOZV6 (51?o~ؙg%lOՑqT;J장%l&]T( }K^[ė;io6$w(8$/i*^/}9/(3N^ꬔ蒗7A9;f3O|ܻ}]i[hzZIʑ:voq ?\u(qYWk 9mQ+LWk"~n8JbRd:+Ňr]al %ǖj|Mbm |רv6׏M1BMmN](R BɝxM%"j"Աۍ$E<CEZZ )5tU 3::Tz|ڪAR^Z21qxUe+Vl [+JTeZԠZASiI>X%Gj]ޜN>V}={ǔ'MG%Jz%jA/Zbۥ[j^މ?҂Yp.qtRg)dޗ%Q˒ߩR߻ҋd1uAIq̐RŬ>ZeM?JYeMd3K2U}[R;[t/R﷟TyQWR68eaglbTuM0;NUY'sJIK9T.?wz207~]_\N'ieh?8VdѰhxujkKGmN)8[!W)+ɔJyj\y-LͤzwXSmR*բ+4DCt.;u.N#U-6R-!H1-·^s7X^ ZZzի)mh>[a9x^޶ Ri\ePێ!wVk?c`\z]m ۆflTm~`^Y|ͧ/|.>؉#~uK lτ43"LH=.mG~g{{{>&jY&d5{fGGq𸦏qM>5}kZ$N5-ӯ@kq_53z)I 1 }E>||:K"' \ZFpG~[厕^Q/UOL6ϡd Ruyoshimi-2.3.5.1/banks/Reed_and_Wind/0007-Breathy1.xiz000066400000000000000000000074041506652756400217450ustar00rootroot00000000000000][s6}=HgvGz6 (DjEʉD A䩍._g'O2 m8 q< Owo_~᧿:|=:st:ܮf⧾=^m0~i5~A*}~r5NЏNլ8y Ut&- IOt=mBy˦~C:zqy~uR}N"myn!s>0\7~~ cԆkml$RbEP1#z׽R]~ue36'V{Y2Npo"^T,wĻ}< 'qt"~Vg5{WWVm0X NnIh⥱q5N@YUR_"Yn?yco3aH)0mzdtZx zQ$3$+ aAB2hD'4^ fEY]a Mz" FzSBws5F=m5Y;ŏqP_lwڽ~K{Xv_e)Y‡mwnk8?NdYKk58o !dv1LZhLţ>=cf+:cv4YjC[nJZ!W0 f>sZuZ(pUX6)N6fO˳϶m034X>exxn^tcUz>uEO_q]?XROq1z-Χv9v5t9 ymF> OXΔcTwNYi/>:}gzⶑhsV>]FKQlCN- 'Xlcě"ɢDm}hXjV.u@)ёtEjbf.zn|Z^վ\}L0k]ezڍiO;^v;\/sCi9u^u:𠦗5{'2R*%w7۫˳u[7z`y8=$ٚ+yl?4HŜFmsSٷh"[]Qr:[J$hTזn7&뫋˻&Y4Uy%/uvv7 `69áá[cY=P>N0RQ,`ZQ,JhZX+X|b^+X< xEW X+@cX+X+REVAW +3O+7:W xEWji@,`@-`@.o0ല8a)ihˈa,e})1e]0 F c\6La,2Xso{)19b=0 F|IzhHh3h_96GKE FkE FE FEh &#1G `0a1Ø Q0b0 F `0a ot>i]ٌ?J!z>jreʖֽ=tLpM5tPP9dm#q4hрkU;[qh5]E;S9qѥ3W_=a3Ꙇkgχk;X.:7mv}yr#Gшkx8qQ e-4[\tnm#2.]1ؾ-b(GC]oHĢ hsЈk,rѹ͸\qւyx늦su…/p4h,AJ.6:79֡3+hWNA=[tÕB= ?G НTЛSۯD|ѵ[S;v;Ǽ)EO]]WHPOMvz^h,D4oTk<\ ~yBT-@+/deޕV86)]Id^_~JT2ym7PԋqXh՗iu5TkSJ4SY&cPUD3M7~bnihAZQ̧Cɑme%fYƙl]@T,[< raQ\Rl%\4dvs)#9LNJ@.Ra/,k>f$G$hV3g pD&3VB"}(Se!BFOV\fNis25,EEj*IbK5`zKE4\&Hɟ4(&\%Y؎! 9pP QG俞|8ԠbQzoT5V+]z~{NMĩ,z[/|󪪷Fb㦔(vG5 >.%b>kL1E-)W- iP4e536fV(~za}6O-_WzӢI;9k}:8;z T,KЧgfe-}}) _]|_0.E 6or@Rz^}k W J)Zq h` MT9 GcTzu9}$HcDB\IEk qE //=oaQwp .빷B]]*,^_s[uz"zeԯY9~&PǢpu4z \WG{;~ku7?6}PLlcf.>Vjzz/~W^ݯx_{q~՝iՅWz{5~E{k-r{56)|Sat~>:[:B uA͚r}rcB^Yro0KmEDZyyoshimi-2.3.5.1/banks/Reed_and_Wind/0033-Reed 1.xiz000066400000000000000000000071131506652756400212620ustar00rootroot00000000000000]]s۶}{*IQmyk;¡Ef#"]Yʴ;{8]|_NmDᇖsu⇋ ϷF_>_g_'{ 'w;;M\['ܻGв[ L~RA.yH=\$c'WnK?Omɩ'!h)d=[4br;mܭsE]Z)L]{4bw_u֥o>Z!FWp8_'7Sjr=No1:~Jh` [Ek8Acgo n4[?r_(}Fi9 AVɻMc,҅7֧j6|1M&2u{'vLƴG:Ǹ !)yگ~Hb|οg%,]uI( bmKW5ϣ/6*qfӋKwu?tVU{̖vz(-) Bt?9 *$Bnԃse~7&hl}Re14|fُъ6 i|޸H u[75Ж>ɹзKbm R#!m) _E yrhcUbUR8)![[.\<8D/?WhKed<вN4$3V\w`dI)vnD>I˫ϖ[߯ޭRK# H LLB4(vD2.|+ߍ%GMq>VءBǓH[3=~yq&AI]mΘ^ڕ -7r=i?CߓYwJmc񿻋$OtwmgJIi+f8u䭖S0s([]oVAlrSӇܑ +>BUV/0!p'7!+/z.;fd}m;%Im>'][;C%/鋫lTmU1hLG9/} hP>,ʧ?F$E-kDʇ\qMtάIW|^[H;4Q?ѫlTW?kM8j7;t| glMh TrVh*`׆V6Yy"̽r0԰iNu_\C{h}^˽Wm%_׳/g_˳Wp/yjE7ͶwZvƛ(XPekܢ\'ӊS1BP yw̓@R`A#__@RLU_mPYBB\a+] (tÅ_>U8T\]淅P{K &2f0`Xl.9 )%D300[@1qrt&v.3@2xqh2Y@3A<DKq1^`Ѐj5Ѐkg,AxpppppqS-qqqE@??r O4P-(T6fkk-2f5䥱{Fg{~,69 X6nCֆv^(c 5r E4 FQ ƣQNL(OY V V V V V Z 4Z 4Fihjq ejݷ25V#(>ڀtslKس JnO\jl(;j>Ѫ lA~2dy%F66f Qdc(=@ n3J\9V#$5%`-J kf̈́cFze J+(([@١&W,/w J:Fy4Ẍ́rE3SQҠhtC9m7Z 4׸jx)| #Fyht6FgN3t6`(o@>,3k:pئ`6F\5z{ƶ P~(oPYc(o jK l7o" fj.C5VB9g2z${F~3 `UcIcH`80% x0c찑db`d0Y0,f, `g6\(?^ls?& CSyx|0W8S*B7ʝxCdL0hv_O׊YMYAOP#(TLle}+,W4U*ToW_͎x.bI'mV-\bfZ_5g, V(" jMLiz.J#-̗tNU=S.]eHKҫt*, SA-4q΄H{ϫҒY5ptqtduEp/J%Q '~p  Pke$r&3K&]S3ߩ|((ʆ^hIgUNVoA Ku%Al};`*** 1*z& &'Վ69Jz [*N/`(FTmr}q9ſAɱ"ZEK8]V[Y@Rm)Bur2JL՜r^YVMej&EÊJ:5u eibu o"&;}|ˢ镇rrkuL9gJMmsvuq]}::Q<2.O VؽJdABo'4):}GƧۉ!;!*k?Aw ?vuLޜBͩoB/ԋ8r3"Lȃ<.rmτl3"v]?jHhȚYqM>5}k(״@N5-ӯZkp%5;p5{W,|zzFeR>*BU!v}0,>gH>\==+( g+ _l_D ETUuyoshimi-2.3.5.1/banks/Reed_and_Wind/0034-Reed 2.xiz000066400000000000000000000071131506652756400212640ustar00rootroot00000000000000]]s۶}ϯ{*IQmyi,J/Zl6KR_ߥH AL.f}[O։/>,ߏZ?z?gWӓ?nޱcVI4~c[f+_:w2s;Z'~lޭ[ѽ ɚ4 }7ON5 =nGC%qآrNC6'q?&ggѓ[uhzG>Q뤭J|B*&UM vqXLnzr1]LoҮ1nGk9E?4lЭ$͋-/v7uC8m\f ¢@ZK^U(M?1Giij1(*yqI~eT7/"[n=79d[]91??eR> 6 2%cŁDnfĩuuUM R%#Pϳŗ3f?kRΜ6mm U#}'ؐ}m } 6PTI=rl1u'iG0mȆ`:}j*tjmͭ? )D4ɶ@^&XiI ¥Xv(nk\{K[+u@LÉ仑ng_{ʟ?L,$1)\W6Ю\m _OZaݡ壥Y&직9FǠ-}q2e}l} l}=eSFNQ`|}!W\1>3cUhS+)g&G9z7Oy;s>L'D);2j]'Sc.I. ,kCE=D;``8ߪ\C{`-Q;ٯ>K*/ng_;ξg*Wp/yjE7MUOZl-;M tҵ4hF7┦tt P. HI ԍbFG:HmV;ߡ=KW(m閏f?h..gE!>$Kb/X0b F ca,1#q`ƂX0b n0+5x& 4aؠ M6h0 ">MFw܄a& 6aذ ÆM6l°a0zpݨ.9B ba&ъbX[D)Uq;0Ld406X: ctEA"a6`H a].8 30L `0S1` 6:b>>J`-MDbA,3h\@яA<DK.r k'&T\3]@}qjjjjj8bКjF߈k|߈k,F֧X?cdu}EyJަ+nmzL]<.klϏ&G1mv ىYCaCiCqCh,7qC@@@@@@@hvP&FȮod辕">rp⸌~EkKW(!p^={pM\7CY%EWzӪ蟛 lA~212L\Yv'Bi޶,3k:p;I/=lk~Si=qہM7`wP9F\c(o j%&WQހ5\גj(k%4`(gIh)J=#?X0`䤱`dX02ee Xs<1vhdhdhdhd5cMF;V,I=7aJn091/~9;_OSPy~{ y啊z=r+ReNZA4+,268/d(IRTT=GMƾT-ԕ-¢ QAZ91hͪeVVl [+U uTuRڠ\%ASiJ>mH-%I*]ޜ>ɡ,ƾc&LI S}AXR{5JUTs +!hn" \Rs7-wγ2苒hEI4T/ÊBFud1u"B)Iq̒R聅VT̵*JI״&3Zi|%[R{[tz\LWU"eSV^Mcoch"pQTRS$JR.>wrF6ǯ4)-J@l-Z,7^rj|,NR㇎h ;VU VyBR.ߛVJQoTE_U7u\(\L'ʭyeLx6k^G[oZyBȒ cR9jypEҲm_`{rjIcg_$`{V } &S Rl2^̠ۑ; qN,ܙqvdHHoGpdP=zbzqߠE7}{s[X :, 3H=.!τd3"LHo{k&&ju&R27Q<QtD|*TpBh 9dX}O!}hz{VGpET'x(|g~oWWuyoshimi-2.3.5.1/banks/Reed_and_Wind/0035-Reed 3.xiz000066400000000000000000000067311506652756400212730ustar00rootroot00000000000000]Ks6WxuHU3Rlڱ=hHHy4%BkrS2T7^u ?Z=8O Vg<?5_~4~\\5wۇ{G}XyDO ȿaIeSy3zxρxeoQhƛЏsoICOg(Q{7h~r=E˳[5LmirK__qԩZBF7%q8_Gwcft;ߏo]gc\y/*.}Jh` ޡ[{Abwo v凴Z-~ )'hy6]FE~Y*lYM}&ӻۯW}&n͛-L*[ߟ?6?l}u ׵p?wCs9IǘZE4x)lSh ċJ@,ceNTY#-[m%eA~_/lc~8wH|VU @pss%}'#pl=FW7_&_/-I9shBw:#WΣهЖя`<ze]9Ee&g͂ե%Ux%z?qRCBzΞ\>*C4%r=X2S})inZ]l89_oƺ-6_gAZ 2m")ML9h5Qԋh3_^cԴ5.Ч: t(Pȝ绑 ׎&[g=%̡-]<ߖ6,tnI2$fn'-'=67a?p(C[͒tj ^>>GW@)sƧur5ӺpFm ik?>lbc~z9X`g.'_h=ǎ6xCTxiaymI. ZOs= 55Mv7^ FEn<~n.Tξw}c/ڎܼvz3߿K=cgjKo/Lsfv|w=MKNiA1L7hf>\i-J~\$sZ@ _7QB;w  oc,%?B/J͔z2/ćd@9ceDSX,TUgmggggs`N8Wc'qk(Rs T-pE \ \ \ \QZYUWm \IZI>i1[m(]{ \u,pձWt>߯:G1SX>Zk.U2md\,jN`f^,fx)ma:R+oKy#%I"CffN=d8bKݍtb€Ֆ^c}06e=sja2 FN+ÌU}01 Lfa|9dZ3e |9fa1aʁyavd3@XSIJEE^`a2e |  gaºb dV3@ό\0aC0AQsZbdoE;7\gh Hszy6N 9PHEzڊUCzy͌`6co keq>q"9/15`7 WvG FAkPNF#=5̗Jg#sH_5!ˍBCv(O(_ص Uv7Zn`׆eB! kl0OgzYIaBo l!xn7FPr?ohhpd=|E(.:kNHtX?*pUX UF1~QЃFXX_f*JPFQ~-7ύ%(E5g}>ύ΢,,skQKPT y=`5Λ6(mc }#k,7JhA9>L/ցLt6sVqP֞ü(5K<7JNN9nrtûM(r<7J( s#k< hA VXC }[a ]os6U r.S̓?{EPA7>P>`r1(PU:)9Jp;@yQclqq[ؼdkk_6oͣa*@< 6a2@,klVa6a>@6/d!*(sޑ~=9^dPXP{S zy!NFtxk*0+fw4r(EF* ZƣYjtrVx]dжUn͛SSZ"Vp̻܋2y'uSQ찤RJB`RYִ֘KZ.Ӵ^[MPeB!"DRL߿Ҳ{WjˣO}^ʗNή<^s̓rNT[U g5}Ok$|I=p}Z'ae:ִCӇ{xOǸQ#$ō?|_^S[DDٱYBG !Xr(wۏrF/pk/" )iyoshimi-2.3.5.1/banks/Reed_and_Wind/0036-Reed 4.xiz000066400000000000000000000071271506652756400212750ustar00rootroot00000000000000]]s}_v7rEuײM J kק42vjSO}tOO74~~ܬ[nymm\8eq~ӻ:<]|~'s={ǎm['G~lO~ {'?hi.~ޭѽ ɚ4 }7[[B(ѐ~I{id1mк u˷7,z{k^'7j:͗_*RjRմfj]M'&:~6YSLi J߼bwY[73cSh-֧ Qz)oXGcgg銨=eORX#e*vZ8Öv!0(kCeA3D90wPOҴ[+PrHr/V%r';VB5;uvyGٗvq UWЦ'mro]⁖&ViLo`K*ܢ\'ӊk6DP9 M1iKQP` w$FE1*mV;ߡ=J,\o7 |_{ώgZ|QtZȂKؓrk&f6;QGlF -v"[};glOD@R5I(2Y0b F ca 201#qƂX0b F ca"?x0` a욬3` (V1x0` a<1s)b_0ƂX0bXһaȯ_0ƂX0bw?#`0ƂX0bw)$ alψa,1z)3 F ca,1sa,1SQڜ8D ca+5D ca,1#`0vXp8zR^^OOƂX0b F L1 FM<bXa#t矛(](]&q̊^= FV\$1ɋgdX0h,4N F'' n0(C2 %xpi0& #{Lω{{x};ߣ3UTɄ/[іjS2"8}QS)W*hJGt1(ZM1;/zYtflZIm !KIAԪ5uKYuqj%%ݜ}:;U)2 oO"V{2Hx+Bo7/5d)}WƩە!"qەA{ vcHS//-}ͩ/ޜ.N#=N τ<3"Lȶ=.mG;5?{熤oLզ:7g6}*F}k(~Q=x}\GqE:״OBӇ' _WGz =m_cܯ+r5/>'0=?.(cO PUS!G i-Wr~{~@Tx(|i~/KYuyoshimi-2.3.5.1/banks/Reed_and_Wind/0037-Reed 5.xiz000066400000000000000000000071321506652756400212730ustar00rootroot00000000000000]Ms8WxuHL)\Xf/,ZlN$R+R=~AԮOMu~}Z-OMdžKqp_o~zg߮'yFnߊ?ޯ?džݐAKN!yF3r\eݷ0zW{!4ZҟƛSwIǍ!h){7Hbt;ݍs˓]y9mIcw_qԥo~.RQYBWf\G;TǕO1)*in~q 7ەhAX o)'hx&.w ?,T>T׋6n=79d=o~(gZpc?LvsSIs(at¹%/m(Zxs|B03_2u{{, lq=g'Ae"`"u"/;qP>[I 9g%|٦#'P/ۯgF~ d6CYzJqy"dm郜 C&L <2Go١!TђYIJFq$!zyA.Cwj|>-c逧OnVaϜxҊ9pVG"UG`<}jby*< iD4Ȯ/I)VDYGTR/̛;o鹑ii\GK+u@P\Ñ3xu-!#FM%.mY:/u@N(M'R~ݷ- +BDV_zph[-ɝʼn>IzjVhJI 5h:=mɭs(6K?ޖ.m))Cn):ν !OkE}ֳ0)8JK"t)ί:~3ls/dPc,t7$=?ޑ#*xtꤦ/uh~ !ϑާ xXz Χt双A-) e j:ou?k;ھo>M5~:i /}vQ7F'6ڣEU_!5z}ϼ+:&cXx](^cy>@?(^(^c:@F־yoc@c^ЉA45hhtKG#ƣqF,[ltn2n8hЛڦ/nsڳnxprG[(1oTyE\c5U'A| ZCئ9ãk^'aClfFlNFwDe{tn he=:7`6:7oOEߦ;7k%U3so׸AC(k,X0Z>Y0ʬ`D2 X@<eXQRj#W luF 7zF3Ӌ5z0tD]a耠d^Crr:>J26Ep'=P^@g*iZMTѿ۸q,K 4UuRyiLw3Tjx׾hZT+y (=N|Y\fbvͰ5RԜ8XL k%6-wk7q)Ҩ0ie:u7/9w[Ldn,ej.KjJ:ІP0/L=K7׼9"鉦?%wӪpUL@ SA E>.|^R?f^if8у+Ĩ7鳯WsK̘B,£ hSPgIݴ&mQZ>^I U2fb'MH/3`*ʋ兝P 'wch"phc:{ӊX⪸X%s' 8QtrԈޅ,G-- .]j%52KEV:J)8[/W+[^UjK,{)TT+_L'V]w[Ljy _c'qZBQcRy_=esG=t^ 1>ۜiGfư= 'Y5>bQ槣e(E]Tܲ\L%Qg}ZrutDNi6P-;e 6nڊ{3sHr/,y&r/VB9[$<,K;z>L9G3Bz&'>hd^n͛ћl<;+iHsZNA\ıP7̋mz E07 ^yo$o x4{2Z\_Mg\H[fKa$T&bMMDlrh]MGlb+"uއ37IC=Vx1j`zbf`@-x0 ^<#qFzp` 4#=aYafƂ!%AG ca,1wX0b F ca,1#: a(sa,1#`0ƂX0b F caKNa,18w=0ƂX0b F cab8z`0Ƃ0J5\a: #q7>b F Dԯ6 F ca,1#`08?@ ca,1XpSrƂX0b ða 0lXFaG)؞X0``ȈÞaD=0Ld`0lDr^|&v:<(šēdo@3 5ϒ-~Y54s`6Z4 Axpppppq;s S~WqqE@??r5M֧q1m 6NiZt@k8/cS7gKٓEH6:uf>2: gpAO,Pn [P7F;?]gy5\\\\vص h5U@T5V{=okEQZ=Y]%***() t߉hWl0`^e J ϧ}䯱J 7kNd!\#okL>Gf} 򫆞fd=N 'TӟI8DcC䯱k,χ_c-иCFF.{|A=ͮ}yFvGgy4k<5PnM7`bT xFop7h^8u ΂F?r7Q̃c*^#c 嬢iFkLÑ^6T};MA?:1A ؘwD(o hte-Q ;0{{7QހU2(ow F5 Ibk,,EX0 q`/` x0FA5 2g0gd؞0nz=aJî0 (9>uM/ӧ)M=z ?EJݞD(} 7T*+gK)JMDѻQS 3$i**~%&SJ\c_K*TR5F] kQ5e*^YA"g25+o-urTU\X+ASiy{ءZK*FI (=~ə>ھgŻLuq1S}eX\5Z(/L=w+;׼9"?)*wpŒF!Fbad2pi%P +|se1uJBw ˤЄRT͵J' ".dF[)W\@*/7L&f**0U^fʋ六 Q '۱7G48ru!OKy 0oRD5 o˫,- ntZcK4Xlum̟ihXj<(EKq^R$ΫU\b߬|0_RzRRn|1i(Z؍U1;/|wnlđZ}h !KqQC̊*Yukrj*Eݜ}:;E)0 oO2V{0H5x Bo5$/]W c'7/\BfB֧Od>=(ƛOM]}zqG>}IJ l'EDH"vU@~qH,'Htnr;xV2>08x\G󸦏qM>5-ϕ鸦ErN,|_Qӧ_cܯ1IH_|<R+?fP*Ja?MvTwr(G?p~Q OV>6R??lW\uyoshimi-2.3.5.1/banks/Reed_and_Wind/0039-Reed 7.xiz000066400000000000000000000040571506652756400213020ustar00rootroot00000000000000Zs8_L%fr@:{[`sHeK&n>SZOm끅mq|'p=}?}|hywc~򇮻HV㿎\SxW~;ѯAxOE47Fm͜>xod~wDoD-CEqkD znDbGKy8hx6.')!Yh//'?ސ$b.HL <}bQԋj?0 Ms.&7^EqGs=bLimo^L"g!(A[ˢ^3GԴ0 r!?1S͔x7\0`UMڞ.Y(ۺqΘ|d4?VwcQH#O{Vz+q*R.ce˸v+9aEkV8 י愺 d[#:jk fFײRX wa'SI&;(DwI(/UpJ34(s?t{RZP;͋N+1}{~޵- HëǓq:힡x+MFt)ou֋%qQC&P-=Bɭm*16+K1VttWU,N|2g9r'aHi({+w@TBuqv)&AGSQ$5'Ec4|x|NNy;s(XdcO9 h Va9AE\~jc)S34USdaNp \3ʜ3/s#}O5Ո)Az>0|q@ F~֌u#lƺ6cwnX7fϚS3onz@37G zÈ0$WIђ衜eDڸt1$+ 9*w,eꕿBRb}-b7/I^{+yoshimi-2.3.5.1/banks/Reed_and_Wind/0040-Reed 8.xiz000066400000000000000000000061221506652756400212660ustar00rootroot00000000000000][s~ϯU%"6 >lE%# _=H35`4TN|sɻ_6ڣF^࿯[45_KϿ_4|ۯͻ]L_nF?r9]vV{q V]||Y#7rv}Pfc7a}Fvx=ngi|xKφO1 J_bw[7=?AZd9FZ 3]%| wTȏ`XTl~z4su0o0f.[]OE~_&HJn>A:Dɐ1fL]`)'j - VD[bxKи4#Tb뚷dm'4dV.xHLs.91}٦%+MK;$c熦*>]:K{e2 y&t1?]c-Fm 1ya!so2~ɺ!(D\:Xx "dR,,E@-_<`X/ .$u fB.)`pM{ ;'E}, >af=lO#p'324FO|BeTQp.]N$llQ\{ *t! á 3[u N(lIb3w j4@(q>̖u;m؝,8a~A9O"faJ=:;ط0GZHn`7alodUw֫V8)v;i %z6ğbDtLM[lڋ!4 o㱢$*q?F/eҍwp'0r%i*wwFd#ڡ 4T* x^@$p,S-a, GVHZ t-o5y9/H:#EGTq:U(AeSgl ]8A܇>l}Lf5~w[-.UbL*rEt{9ʜ kr.; i+,O N2ソá6u=I\{@mZ3Kd-&Y[}bEG0 qv Gx0z;M'ɹ&Y+ Qny:>_Q)"! |/[%Kd (m!MdlZ"GЉcQ^TP#R4NA&R2a$:'N0ryA]/y/Y<'p)hቬTO%KMR*`W)K XIJN')"rrU7"/l= *6\^ QX(fPݭ;2#>ODZP6I20ޮ\q u\%(x-L!~s];zpYz2V?R7R%ġ:RVKr1s 2V /[ca56'Ten#pfYMy1r*8[N rͺJl0mglc$k'|LLk> K4yC{@^od|'7\MQuTp8&F{w!&JF7QFڨ4 E}M1O,G;Rxl dlbw(eju-#i\ډ.'LV!/MJ<jOKpybeDT! +Mb-s+X];"WֈNI:*Һ en!ueϴ9ϴNXO%i]YAd^J^Q5*+U5*=1ÉmiQ5ʳ9 mJVudYei] 0?:]:MۗI{6NMb,Y¡-*i]@Rm4IPϜt'@&VZaCN :D-}생`4G'GYA℣ɥֈLJ87|8o,.Qx:^yVv\R-8 e7ғ}wt%6<]a^UwfKmfJJkmw BY=w d% ҫtK^D IoUk Vk㩪"z:Ҟ1S"JİOZ.cIkQON2[2' E61+KJ:we Smκ)6[DPT)w+jW 8n)'c,KC4.UN +&Ug3eռ8K3Q􄋇~6䆰 >G|*OdS.| dgfɧ)U@C ǭ5׬V42[nYoKZ yf9/l gvyռqcC_:iUc9ZHx+w/d}i%F} (ܹ?ñ/~*ٝ_Q/AȿvߨhnM<ڙ{)} hعٮCl}pRw,I;WtNI$vt/Ŏ.:Mj:4&(uBg9L$K]_Y0gu&%qO%w]eqO>RL mAJr`1 $= A[˒0Oܴ0 џJ~B.jqVY(ۺ~B΂1y+~}o݋\F!>T3x#ιX)S&G\ hp>NQlBkq>3- uAtvG'w*J>K!Ȟ+~8Qq$f?8,?VTY@ ۻ׏BZx}!9D22Ub!xa% On+! @`BdH lyAL@JzHmWY+>(Z@QܰY)EM'A(wJC4 (9(XՉj6Q1lh"=ԖwA  U2_>Ȯ gbu~7Ƞgx'iP0S)pt...@ﴬO8=Q/lLecox nUM@n-!(1A]fƜ&)ԟ 2lG)(L2d$UX\QlpwgWl՚,1s\@"'(>u#^k t~sAiÄ?ҁ?cc Kc iuj~pZhggpl3;1! S7X4 4628tbO-y4eQZ@5.^ g8ohʙSf0Y`xP+R/J1*h#1EU#mZ7DΡ]u1 &/x Z<OUiK[l<2iAU6k~O 3 fnIY2Օ.$&dW-%| `4cE5J` LEvĦiQq9~#"[ F) TLC| :/>;SJ dCj쏒l6hvrZ v`q4T؛z| nFȵ0|y5JjG:55|ljd|Z.&iai)BX7Nǁm'_|up i8 XzMM~$[M(T2l}T8iBj:q UFBuq:Ha<6! 49Vٴ";D!U]FV晢NL6A4ԧ4?))_iIth s;Ȉ5 Ă_Ƌlzůʿw-f<;-368~v// c/@]UcAaT(qV6AS^|j-A-*2 Z7MPIF];G^ڢޮhsCP#_1CyA[䣆FX˛(4jt۪mKϿn-~H{//ws@~m^Vdxc۱nXv[u;֭|6Ԏ뱆(NlJד#yŐtALíڋ-;W+^rXi37ŏobB:` 6k!VF*Mii` EgX~l쥷 WlA9"!ۛͼV#S~BּghAk,kvB("xy]nrj8 $}t[swf[>d*\LO˦И hͰ_F83DedK4(9J[\zS0?{4^nb:޽]e XJ_%|{Ma6 *ykǡt%<@oK$a}O~,T h9dpuq4tapN&l\/^*5;*BKm>']{F~4(Oc`s ϱ죯9/>ȧTه NjfE#ZKDhȧ{n1mSTX3O4qOёunj7;tTۇְ{ Prn(01eke{iҵe@ɡly[{-_%[Kٗs制{Ѷ4U'ڭ)JN~CZg/@[muZnFowdfuqmM)Dɏ/$EflTk cٳuR+F.J,]o/ 'zmNz4"Dǒ>T] dE]*vo̲4= de$2˶R*3 dS-e;@6ՋQvШHQgmsLqҽ6 fa-NMa+ ٢@cAN#3a,XaYa;9UQL#H,g MIz00a0Bgϴg7;Dl7šHǬ443HwF㬪 sO(Yn!v Lz i8UQ0pVE>a=a҇7OZ%9nUȉ?zۈ8l*vq0Z,cf' m7.he|Lihe FL޼a)m&@n;a=n(=n6Q\(? 2#)[$Faɼy3󄥱(XcE$.BxfY% Ós!cO¯y8&Y{aC;èw9'4 s9TyaU<}0hh{}Jr # 'sئM3mF0)h~2>Ra00aa/ 0FR4ʒ/*g4iaThp~dsx 6.o+ Nȃ.5=U 3zu2 u#GB]q:sSPWA.97Eq:1-::wYA GAbfނ<$QNjCcAk!Sf@S̻ӱ3S8:'0ʼn#UGc#cDq uldN Q8DK(OPu!xq:^wZuO7X7<۠́*0-Tb ]PA^e,){kDގM\B &TI|BKcHQH8ò taY*lQf! Lp~LDt*(@a;aT=&+PQob{f 8Yyv [2 dA{T{K\l5~XZE #G-v2 R{{Jk0Z(]32rXcϤ x`>:Js` g,yW!b XY(@n1#/4b{hwgݎT*+ǩؑnJi͵ri'~qVOPhI]SHPJ,mS3vi26qYHU_Z4q5 KJjK3}0Y6l [Mlۊ3jIbC=ٶ҉J_J6{Z(t|1ǥ )vhj2LR}fIWV0%ߘN{ s&InnH.)7yIRhJ.rϷDͷD#B9ɕx'@m_R)"QY yvKeWT_$(Ɍ83ZŴ>_I}ĀTjÕCw͖/!y; ӳSya|c{"TqeL\F;ڜmi[m5 aJKf4W&,z<:OjPoBG|IuIlb1\?U W/^W(K VT;(<mRY7WLD\8&4׽/_jlƑ^LmFRtM_[j$k-f?֦BV_HvDINCi ݾٔ1oy̭fB+ zR:ߔ[YGɫ?ԫgn&ԗ짾^O>ɧW}zϯ#er;*՗:9۩e>P}NQSԫѡSOS^ _ꉟ"ɩ?9ȩKDSINt+f̶ eU%V:.0 ~qz.Qn( ޜϦ8`w޺N|x795 yoshimi-2.3.5.1/banks/Reed_and_Wind/0067-Fat Reed3 square.xiz000066400000000000000000000074741506652756400232210ustar00rootroot00000000000000]rF}WhUqRLUTkKZINT|6H 0`Eڭڧ8Te~\=$-N,,o}~|7jw?×ٿ^~xw3?opo}mQIoҧk?g7,Z}pSD dIzv/diL3:'-Yݧ󇫛kxq}Ç%JMdb#ImR:oϛV~>xw&7oBO>Jea"A1F{za,o0JfDrZ-yI `kB# yDfC~i&|m󨮮>\?ȾdnxgwA0%luC{GTaxhR(ŕޮN-Uܒ/2 Ȧ8IFkL_TV]=L>LIMhRCjM-X7߃wXOD3/5kU79ϺK_ ՇYb &ǫ/DC 񸾩yTAh/HDX!D z(D%E9e.`Oœ#OtRcH%CןIҊ1r !6`Wm4NnKv Ժ\?eSow:ެȗS`r԰:A,03ã@fl$I-~&nIz[OJ"2C&ϽYL=gݯK%,k]FI~zR"?eݡcUі6;N[|i,p|^N*5U`NՓ.qxyU\!M'jFFmr#q(X,Xp UXka=T"MIEXV&Jxvy7[6 MT8ux5J>y]c*4^t8Ψ3` '˺A6OϸGOf0Xegͭnk[ G(ڌO=LCy|:Ħ~|&cgQql#ÕNgMU5KX0ϓ L̸Y)鶋sɥ +yU,4K78oKS=Mȹe!A!y"\sfnrs}~}pOٺcaqF4ܑ*oIq *fuZǩ&I+JŖK7$$h%9ۛJjH 5j[1:yZwc=woʺ͝w.߃9#V+ĭ*  鰣vڃoL]4g6dsĺ*m5Cg snD\6 @gOmNNbTT.@ؐiu#Sl33C(3@eqf ٲa}]~~jU LUa]0 ƙŠv[I"ܪ*bv e ѭ1ꣶ| &AfS2¨V¨!P[rVNcgf-'j6srɲ33l/28St:ӡsh%fG r̄P0,cIN (c3K.t=Ke.g&*y,pY%w0`˄]'(c(cO^IYx/rg;~v5`1)&{:͋#3#,Uh9RaY8-U3\$R3Y1M#mƌ˜<:v,+jL+rĝܚt:g:tP]2'%s/$9(OsJݿϞ:r$qt} ? u 7y#`p`6S{p]wWQ$Έt*Ӥ"FC)qNe_PndXtQYs&Fns#ƹQ6j()RQ_,DP_RKQPpɘMq)ܨ J::Х" *nu*P%@} H `-{ lp?*􍁃*{p#J&VaR'M&%j;7:@ߣ8F>zATR9* һj7 P D٩'kb?E]BN K8ɛ*Ї[D驏N)r:PY6*1yl7F9I^U f-qE5oǨh@W.Mj]PـGlcZ b3٩!{x>%5]T7zFDq.qWrs@}]T5{U TG$UDUzuWhEU="U hlP"}o{AX5. ;kj5T5}{`nxAMbrx>KB({Ip'rqLIlݶ3ȍF9sӴgvkQtCiVfƶ9h0ҿVol=:Vu,ޙ]^LòY3|IɶF`;*1b%\d] ,;ǗMjҲ֜2 T}K+`IY)L.ř f*dYwV*,lD"㛪ЕgyEJh.JM%RehJ# /y+u2SxrF;W$fa>P~*+Z5nXi|7I`_ƈ:g!'-LZ?AJgy٣Q؛ug* &4:ƙNw+٢E35ݧ뫋w68iR3[6leLmegi[Rk]l{l!:FjV-quX4DJ3f꒵9UV7iZiMd z+ż[6::yO4-Ѳq gqJͯEʘ^.MvU;]n9]%dW#UHvu?g㾚͞گ}=aa0A8;l0xaCÆ> {aC ]b7Ǣv~C,0~rrrƇe~nGTIIT.0Hv vØ?EMMp#xG-ao(P4WK||i.n⫕rtqz_-Ō&Zfs}`IoLb,Y3O5Phq(^UQ@-+ԏ*/1*@Jej6URjc?vmyoshimi-2.3.5.1/banks/Reed_and_Wind/0068-Chorused Flute.xiz000066400000000000000000000051561506652756400231130ustar00rootroot00000000000000\sH_PdPK] ^[}KFH${FFXR<%=_ׇ׸gaK`8y ~_ո?rv~+>ʶ;ҿSӔO\?i7?>3ٴ1czRqE^Mmܭ{rY"kf+8-{l AwR\kB0.6oaQMgr<[ }pnf!s7c+%)Ҧ&\b%v"~cm~ۍ52]kܲ-XRvzwL ̛db713O:nQ֖(' T5XVoꌐj|p؁Oo2G+і.i= Ù>sAtάB`uΊ$ -U O ц,ofߐ[# bJ1.NW8qxbڽv'@T_U!*w-? KY}wxG&>x|#j#pSR}kae1Na@Ŷr\ӗtעnnߵI*O"r* :dQe`=#Vfe &!SWb>!2H*ժAh3c4Fjj=gpU *a8rÎ||PGP.Łߗ%qfQAT wٱNn+;RN+/p8촇Cp5@sCw|ze`!k@vdQUG.9$)v^ z~=d!"wG+i+'PMνJ=*Shd1z<;1tc4)P"rG1Q! IN_=,!Vb<B!yf!kȪ@y}J,V~Ӄ\׷nq'`R2qbZ!^e9E\PQe-CLBi>|`Gը9 >Sl vY87iٝu{8tW 4@udv;5ʜ Fh#e{"+'{'-Ԟ,AKjSS,~ ȞgީeEw ˳\b,obgUd8HJ qWqJxF|6kE 5̧GBnP^]]'J %639 @޽ iK{Qf dwD%IITSP/o׽BƮCA}'8}IٮJiۃd6 3VszqruJ}t(T7_Oj)Dl݁ky PFA 0KvQmwdrE}QcZǛ/i_oT`b]?%gA)it%)%MXN6T(SɰhJSU^ڑH[0)=wи }!hjԪQwQpUMZ -'ߙBmC p-LS'&k7m]삕ddA&iIsXDd~l(x%k%do|6==Iv`K䐠{ X[َͻUXQs+s˨]';JM# M*@Iz0v3"/8]”ch!Eqmy)wRnR;5:GGUQxy yEgW3~^<|2Tpo=q`mG+`:RR>NUey;'k[Ԉ<*QDq}edbzJ'T(m+pVzG$簾>m˪K#f\urQ,s*]Ehn.9y"XqH>c" ?"GāņqHL̈K;?2//r]\Z9 ܍0 zU9^ŕ\%Lh|oquPas)>=mҨG[$)CԈɃx葘?GYFk/dɱ3xP!yWPSgd0=QT׳c%gnTd`6E:~m5i^/ȵ УY5"8Ί)~0.n# 96øg~p=zø-CW >VN>cF_Yˏku>m]+ZoZz[ۺVֵաN÷nѳǶIiK/I!vg?_2?L)\?/ԇoߝg0"/9ܷ٥?1FA6 AcW [d#_^/yAܗ*/l6`ٸiixG?{mOmUxMf09{1 EqÏxB4k#S[A#A#5?)GD|䳟}bsnH ;lKjf:dSOț@@-qA%h(UEU<·%)Ye<]xPA\2C*Kh}Q?=OvGO'{ƻ ;yw^>'A (+ I`b@|V&x`mU'UhF3fQ2 Gޒ`Hޭ5mO8N'˹fcw0nY9̺xЂ?܈t[Ic8!7ű'jSJEf(ә;aP ‰!eˢ U h3,dyoSoĢhK϶z kk f*Lw97'S 8 wco2E\Q ~j ~l=ʘ8:jp볋Z8CI-bPRZ翽T=zn x2T(U|,ixe y~ʍ{eBY&, o'pPo|P&WJXjM># ޲ x_|>se;"!~xHˎ#f9x\9vD}JKfr,&sm05mH_ UG!c9#y;]qʐ%ݹ򞋸I.H/ Rl=θiU †6s8vZ6sZ6 sZ6(sZsdY,"-?HcHӎ45q50<w ]w*Dl4ǂwI#`3F^]`Ff M t,OI ,45ikѵ(6ikҵ` ba:ik APsD饱?.5mcai kZ;麎DCV7aU뺎M/Mٰ5=2-j; 1iu29э45iDA.Hsk ͦr@ӌKH#X3F(h]111i-ѕ:HƍaM/aM+e==G ͜ccX kXrVX4;0"0hkZ`I ڶ(з% e LXVXÒm[amPzK襱45AV50h_m[am554\C|mv@ !~i;^,Bɨ.˪Q0~_ )#v`B2p,;/?Q2s͋U3s}7>ZG =H6y+[/ T; sfkhi ˄`r`;s9z k2+L?â!E'.zOg0_ '0l1Kc!}l)ۨٴ~9 ~h& P ܋qHL%Y+56[B2k5_{ F/ML 9EL.׎D l a~䌶L lӑn/DŽ{FgSfQ#¶,4xn5cxQY9d &La%ʧx5AcL?]KlUзNE7|]BmT3~W ah!,Jy ccq {*~'IwO=/r#=!+ dɷedF!AugdrG]*߈tCu!,P*r͛R8wa0F,S2*~s Oߟv,?YVa)L g)p9)3j̖Ng"!08K=1sS|6}/ٜ8+oҐ؎T(L2%3ۿ_kzAC̨Dyzp7;䄁[a%|ͦ*z} J-k݆6Ԫ aF!+_mBb  oe8 #EKPflAG`.AHHK@%Q @8rk \54JlB0$bsNjfD~ UtkfqnRTIAZu$kLXiXKR=cU_oѝ&fFsI,)piI@lpU@$B'5Dɫ sȡcXhΐ _[ښJ"@zKlp*^}=ŒT&ڙð 39꫌ʽ@I*=Q| I,ܰf &)5FN#]a) s5[DfKAEkPI#P"9H$eIRu,]UTd X$Cz*j?Y&뷧? x;P硰0qYe.A)^~:R8txqHAd}&N+-Y;O/aӦ 谪aUê>U}v \VA?hw_q;T]uJ|l;qAK!Ww\7XM~8fcJBk5}5bչl6O&14Q\N8o)s׬\P Y9qrcN|]5@ +HU6(\`+ 9"퉗/T!Q^ǯ.a;Hz"ЋjrܩZݶ0[^9靧œEpxS6r'jˋgi$EK-Ŀ_Gf&lfلpS㽇.t!8eWNx[.sS0MJYIԲk>b:~2{^ { H5 ډ 8:T~ZZAs$q֥,~b&V(l<7sbHټh 4H&9s'%f 7 dY?h%R-BĚZj-k5IUCfk .!]xK9~Lm-a-4Qy^ e}܌_?Np}AzV_uDÕo/u.zU`e*^P*{dȩx%U'>ZQJ5kxꞛJ]G\ŷ{]a) ܀]mNC>xe8U<2 ftc9hrdx7s9<d{ӗp+%h,2oIgxs;"!|xSGze|wq>w@c/2;Kf24&S6CIZO!7CenXAHތo.CIܨ4dYItqDz u6cܔ*h8$/b{ܠmhKބ1DomH21Kœ^n0; z}51̇>|=e4R~m 4mȶ d;]ٞl@6p` 2e-\ ,xY&Lf 2(#6Am0a m0a&lA&M4AXaM5M4AXaM5M4AXa=|aL2AXa-L2AXa-L 6AXamM6Al famM1AXaA0`& c :& gi M5AXa4 º& ̲Wi(@̂u8+6XcUD79S&C)tOpgOnlr}^j$\ꙦUyM1lK:**'[[aЄI׮4rbWMp8&¤p ײZ G֧@4-81p"+ɔ-Ps_Uv w4krcO$ DWؗ_.a'jer@2u ۇ?.pcBh Q3Aq.фRey] o5-(,ApރTFӯO,CQ8j;,C,pbL"e oup BO+$ue_1$߽Z!'ரH9I MX͊-G"^ x_%H@ Ѣx((h(qP$q$InN4,%d}Wl$3Eb0/(TK:!$^Ŗ%^BF[Ю3n h$I*ļcx$BxMXHH:I=1ؙ I:m4#٧h 6 *aNaltL%gɨ$I0Q9J:aN<("S17s"g"g$]^u-HD:IGaH9oI|tI:l $;"'i&xy d9fmP/Id *fP7\T *F$B r7` ^0!*(ox__ӹL]+x@]Q$g=/wع]{= -P?ד# z2GU=s)əh'eĀD̞ك "z1;MO{S'fv&:x'L>TM"$0ð~bo$gA >Rnv:Q/x"\oAsJ:Ux Q@tGRm:W2\JN @ct yLowrUc45;ڝQ#<)Yn|iXM`goݜX~;rv١7ۖ}W%g'@C7I^] WZ(Q"j[B=vpbG=z?̻ mYjI5?{г : SK%ӑ^R(֑dl6<8~v1OWƝż"Rp%RSPER$H/9^9_]zgX́I8;:(sv @Ӂ١ųNgGF#'lsn{_n}^'1<tLg شI~eZ#گp_{ap~U U:;U秡D:9\97\xH=dlǓx8#GRһ35VxvV\6j~^ L?e*ǝÖ巤rܹkZ.KcHsִy8qR91#. wÄ$J.vrzrLOK (Uכpa;.z"гjr̩ZݦL0[^ҺP%ԯd1 7 7v}0yoshimi-2.3.5.1/banks/Rhodes/000077500000000000000000000000001506652756400157035ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Rhodes/.bankdir000066400000000000000000000000061506652756400173120ustar00rootroot000000000000000.0.0 yoshimi-2.3.5.1/banks/Rhodes/0001-DX Rhodes 1.xiz000066400000000000000000000047131506652756400206630ustar00rootroot00000000000000\[s۶~ϯѻ+(L5%I4}$dH^,DR EƖdZ˽}mk,Ǿk\k6ӲwE3W_nǵi.ɟ&)~Ow;U]'͟\?ȃho Z>}]mu ص׆t ZLIOu`t:7t>Kg[]lx6̫zyYAm;Jہj꘸d`9&f/;DvixcZ縬D峝G%nc6H+w kfHkTK ~D x@M=5PȏepEDG7jqw3"u?`̑`Fd^MOV0ДgB}+f>匊a\g;`8Qa}p[S6LP{rҘ075 ~rM.$cl=+$!۸Dݴy6H @A_fߐeqdps{=]ݍ2}ق [G6;:5e\j"} 9"fHQ-i  1,=O+,薚HH66LM^BBߒ$A f u˄tAlnsl dMn-ɳ]FJӊKGuRgO9?t|jNtJj{\f\7@vDCґ[-O/@%ãɶ4 ٴ>ԈpcaVD6Y{7 dm&[ZyPc$E:P*G$8}* STu͓{2 =أ)_ \81n|jO |mMAH4Yậ>i}Igz bVIW1alV٥OGk&2A}99)PJd"5BzC;.5ʀDBg(Ip TX.գ+xK0۔x}5^eqV +ZHU}+t껄"Mx9 fCEUA$p"nwŲ4^DP{)Q(_ W{h}{ j٤x BEd{.;:0٭Uodm^^MM-0x:H>P%MGXbp" ʚql:z߇@\{lWTpވg{MJ8Ҟ|H-EV{ Ғ0R;"eB2XG,gy^n1]491,34$&7k+&"R#" #sB.dONrJzU/93@AٗUPi縏Q*k[_jP=|oR#%8}a& %+Vf2d:AYHڻ*6C+JgW!S=7qٜXĘ/Xyʲv.8@*7E;^kcCβxVo-ޛUe:V;KlUc^KM:ˆT8Ж <gk˚z'gЧfN))~[|3+{QW,pzˆw^6pqOS7 =йFB=*qJHSA29)e.e.e.eqrS75|w_" co3:vF+$ܤBKz0L=_bDT_ 5tpꂮd3šro=s=˱?4_ϛ fiw7닳A2Yן=#\o/<3Ox=q?4xby<-4Gh[r >2ha'(GcVOՔ\z\KG<[EELjdYg{K, aޣl!Q-r <ѷU4C!;1M¢Wt {1Gn~Xny }+=K[cRBS A/(:+fgøX2Qa}pP6LP{zҘ0W vrKI&l {THBq@Y#mߑ?2#/ >׿#/ 8 dr7@mrp7̀KmC#orF{s $ rO&4 GF ʥ_GOE$]{D{8Ɩ1NbQ,%7̮,f }rߩ&RwؖAB;9dQD/',`:czbo۸}V f߃X<V^x ej +@@92j3vzHvɝe3ea0) bCSlL &CK=";9*;~RY< M3dݎ.qiEvUj?/t J{  wS ͸>9le5K&r!IGr?,ݢ$jGHE x4َB)6ۇ$((̲꒔.Ly-ump1D O u Q(#K>{A!Y|):ɉ=9YCO8h K9Gf8t@7j(OQ>z%nuyKz>KBO6!8 cM}bҋ`fP9nA@N8-w5ɋ6;>D.5ҀTxL$8csX,D.٣x3gxXV,Rr:g6.sQt9]-XQe$g! h[`o aMb(Iw\ 8g  DPD~oݺw %L$(ނ"y*  @6nTXeG)p3,Qi6d4' -R[#+'ބԷI&b vxvJ!eONԕ\i88l^PV\2u8, j@Ѹ6ʬʼKy,+g^ P~dEDtBeHAS0UQ]g}0{)j٢[BE % - ϓMl,+ʷIfQӒS~ôfbTj1yW/;H㒴6֮hky+Zq={ȶQiH,} ڣP~Byv͑hn|1Q?qyb""poy,<\",[攅8>)Vy]_U9N:muPNg$Yl:? ?F;éʐ(}i*#+gQILpJe;fDWQW_CW\+UĈ+*^-&7"c"jm\8 @P*7E63':se[R.,ózuaWXbWRW†9@*²%@L `pCq+oUj8eoõaÑQ~`}=a}}<9 Q:^銢LW]ecLoOpV>Ȕ:T#EV(2Rr|*k ~TQ&-Yeo( {sRP>HʧvN()jaWk|]d?Sd5Y >[=[CrOT*y=aŗHwwW^*eڞOLĩ+٠NTjSWjSWjSWjSS/75|q_! Tc/ z.=O%Z۳ӋxͿ@W!QX nO͕"Ns\V q)),^_>Qyoshimi-2.3.5.1/banks/Rhodes/0003-DX Rhodes 3.xiz000066400000000000000000000052321506652756400206640ustar00rootroot00000000000000][s~_= 6@l1@j@![;ť&xlm2m_%%c'!'3m-uZ}m8n6l,ǽԼ]] ~_xz;g +^ʚ;ۑ?=SSo+]i7?C.I` ɃC59lz9gh kacLzldB5J&(:_,Wl1oy޶ᒝ9L'7@c=';h6ZX@#QәpWfj\jI^#α.X_~sB ]`mp ;ۅ*},x !^myGW h,$H#'t@pW7tJcN;&ƳJsk~7]ԙ'AG*|۴:+S,R>wX_$f^ #+> o41fUñ"on+r[!dctLqo'Xg4hDZF1Ɵޑ3 ¸:_ 'D GFWחDܔ:=qGO]U' Ry[Snr>rFh(<[t'<`E(D6 cK?A$Z{:kn 01۽g4'\d>WҘ0N!sHÞTj;ڷmPa`N2#CġF1|,= JM=ߴ-÷6 &ɭ0 :xpdXt^B6au.aF`Nܿ_ o ^g:0Q%se<۷ID4ׇC]kk#1H(ui?v.t`4%lf&Фv]{7ӡc['<'=F:d%:Z~oӒ8izn9⁺QT.AXNs;6.ӵ!B#~`Iԟ}A*Ԓ|[RU|9$Hg^ym>ۯ{JpjiD!˂Oi>0ˣӞh2 |Y|ՒD%DY)&1تOFwrIBK17QMj= CY~Ht0j}b~e\~^6HprϦTY~IՃex>QTR3jYxl{0һ(-:;K︱J}b>HI#xZRH?8!6 a: g_l` q[ ;!<$iGFdZǐᔄ @p4 ]L\SvSஈwsӡ`T,9 )hNla%I׉Ӟ:1uZf9»25Eujbe=lIыc⟋% ~̨s[UWח,;y`C8 w+VaS-g(R#CF(s m? -fTI #|JQ5i_ф[bOHy䝹nS¯*vkdž^X;~PpC${ԥXH\qJiwk*/d&c~-8*eف\U q4oe-F&M,-=<2g---CD ȣQd[(REUg虈fq, <1:];XԵwQy,zr J"i N !s#YdKX֓عaЂruB\J 8&E- (Jic,ȩ^Ң(u^Vc66}($3( Ҙ48a 8^I֫'  +K,'Ò;. V+&QP25KT%]d}kJ*2?4 'ZPUN*,PY Tw+2dת*6U"X[FZX.5TLGI*Omm  F߂OnOt=d١:]Q3@CvgDk.;2ζ!!L g_r:TVN9sK\\*SK\*2ܝ )PVY~˯etJ"sm& ual(eAoAٸ7MU(CMU2S((P׾- jelR wD㲅AjF0j߁w}p͜=?F;լVV CA)!#2]?ttܿ2X6(jeᰣO*2ѡ ZY|e++FP,?[U mWL2jp;)U2 }te/e,9&19Mvn*sHϐުx{>g~=>>1hOϑOMWYk̦TLțkٮaeeqzMO40\# S[;?i%WI͐0*bEzd"ĝ':%_0@VeU{-c~GZfpZǚ iyoshimi-2.3.5.1/banks/Rhodes/0004-DX Rhodes 4.xiz000066400000000000000000000046521506652756400206730ustar00rootroot00000000000000\_sOAyO!0`rtE#l&짿GlI>˶!/U 8Q Hf47,>uXOmYW| s޷z-d8e}ZKyG E'Y>)0S[l?( JVqmUY\.<(!zϻ&Q@Ϧ4@Kp2&ːɔg,jN%A^=ʾ^W)ʾrUx8sR HBȲ;MWs(:&Pс,gT>]#*(sCB+d(KI\ؙnc$E@H"xUQBLA ](Q-R$bQpat~P"m.vEz];éSDve-jYn*记Ӗ>w GWA~L[I]&l`̮G7Z (\p5/s1FqԼiݭie >_ذFfIRWkyhB!s9{_/pE5 @%;@H AGel©W0(V1N '[g}{uIĞC13yP濰c4yjщ ²|:t`%i;uH1-I\aJVCT o꥿.Ά pH{;MH4z8Ν}?+՚] @̆ [UjSеhaXbQ_תe\.ݔ(U,KNɆSR גPgAʉRax[*-LFY^h&ZjYClJP}l{RvKuqIN7Dyhf2}xx2F[?N#?U%qIwEsJNUɩ*9γUIzX#8˒5iV#Q`jZ-KUio LEc"{駆+Rx|xuR1@TR)%=mPjKӿ됶2Hr dT{v|XjB9 NjHU99%x> sz8(9Ir:Qzt>vRO#8J95Ro2)p$.M)K[$i _ye;/k8;Qx"({wC#m)]yB O 8d>Ʈ+٠FTj]Wj]Wj]Wj]_Uqj]w߮k`Bƶo > W~Q FGD لv0KF&L<_^)Dm/Dd6N7K0ޅ]C .vc4ڥUUih2B"&$Ѿ;rV>{MTCSr| 5Myoshimi-2.3.5.1/banks/Rhodes/0005-DX Rhodes 5.xiz000066400000000000000000000047041506652756400206730ustar00rootroot00000000000000\_s6OAyO!$a:4!S @:h-{`S~lْ %?+iݟzx`AާqyђlCtO,l6Zzzķ}S)qKgt@n`6LkH֮xcI4V!Fč:$ `fVi)F-V81  r$6`\tK5Mgh& `ޠba/hLFc+y'LԭbTarłJ$9˚9ف hb;M uFp6i7Ọ0^ޜҝ{®G'J:XsH+/o //JUwF0py?ҿ. m_J]'Ni s5x / / :2#;Ex`#ym7z"JC\gAkFCjKm2l={I@ŘwpA/!\eJzleä)&R\$ {SHQWB#`0}p=`c[MV =J&iBXeJ%@Dkl搀 m+c?z'ܗ.շ=4v>,Q{ؼe|xR 񿇒ɳY{XvhpZ~X|b˝OgO-KYpEΧ۵sp>u9m>-<н"דbvX C*Sl{?(qNvqmWQN+!zϻ&Q@0@ p2&ɐG,jL.K+[9=\W8"B<k!qHBut|Ƣ;MVru/:Lǣс,fT>^ #*(Zϭ?j],&vs pbcJ D p"x]%G ]3*w!}DHbK CE0XbdW-BAl#>FmWfz'Y, 8msW q{׋z̜mB BZ !2eMws.4}.52:-һl<+vH?,Ij :(g.sSSq>0.PPrB*pj UFY8D;|F]|-'HbWčlce/-Lxotbp,ަD.hINz$&0%BCc}>IQ_hxqx`dCBS ;o=;owÇ FO;gJcyj$Xjjr"$VaҬPU6u-? Q Q1#Z&3߅%CF61goOYڒ<,)qS2*g(NnB!Pa'[.Pw>#Rbwq6[8:i 9C :f|ywݟTq:ޝ!]1݈Mx?:5~-:S:>)OZdfyp}3󒖺qV+Fh!Hm[Ua)X&٭ZRU֐aV~ ܡ=G5Pӻ`j1Xo%PzpZ(?3 v˕!EtTFjŹCj{ ^PZCƐG*XK;s€(-Ʃ+;;8PEK7ʐuP/wg6:q=>j)˚w_e2rF[{~[괡#| t`CgvO̮+.պպպպ>bNպ^k/Pm>[}=_"W4I6 nQ 3^ϟ"2:0L&W<_*@Gm/D˕`rj1#cT$>;cډCcڥvk2UH Z&*Ѯۑr%vL+.}U q\}b麃Nyoshimi-2.3.5.1/banks/Rhodes/0007-Dig Rhodes.xiz000066400000000000000000000051451506652756400207400ustar00rootroot00000000000000]s8}~{ bRK݄ٺb;`s$e˖l${9&cZV?$}ii=0SnQ \ϿԾ]]?Wg׳uow>qIL ɖڽKAD CZWNL=ⷮ~5wM7,iHۭ hI_Gm tZ^NWoGB.6-lkK䜐hsØȶ@V>Q| (Z ֠|.H]E:SmtvijmC"8S[Ϸgeި8];$VTP6۸JpWd  )^^nύvl4!v] ,`(Q& $l;9.dsl `yG /~ jus ` %(VP/v;6(%O]{%bGZ/ZM̸bH |ϱS†aɬ -~}a[ U8?xdZ`"2  ̓YAP醒H(igx>& Vĩ\ud>3KtwDR;%B a;HR' Vxɤv Oĉ=,^>/z֠7F afxWЙ0w%OMyleCܑ lw/k4OfCYBK7t N1{aFy4V$T%*Xu;[}5k.5AV$]DLW{^ӹ& J_]C|:磏t 4t=Xh,>V9^t8L 0v>#G#e%Χ(\̿@rh< ^k1@9 !1l))ņC{ս;MrK`D$zQ^2trp}}o25%{Yw^ֲVT!n65=I\UݽN7]Ս.g7WLy(j~6_G1ԎU}/z[ Li;n.8f& <BǢ䁭 T2{>\Č$cpQy!SQ(>ivd> ub;Oz,ASPΘ)!^w;Ik|\r]ݜͿ(!D^Eْ{5AIy eVq60V)/)PzoHbpצ8 Iz`YpU2zU2 GjGDa`HhyUL@-83 *B~ :!ZQN)B4+ !H  L'*ŦMEiJ P2j[)55|a);աa1Ú" sA џTpeje@TBq덧=XQC!BZ, K -` C 1\:1tD J$Oc<2pLsU&(|y]AϿ >)q瓪DR8 /5c>1qYYp-yic>/o/8N w};k z\^<6oknuɏߠ\`A:;ޡzSzQĕ=^Y,ۤ/k;\3T8}I͠ U#XMJ2XDnuKԩhe[}Wtu\ZAx]WN'eIrtΎD5ó2h+5smݡ'4v헞ߐcHA@49!分k]zkn=ԵZ:_uvT s:u~P-p=e -zC^&! 8҇l2RU 2ʁ|2N)h.~`gjYoc|\`|^?;ԪWqlyRelv`!_,hڣ,$w,S>x`yV[crn9+:}r -f7*Tj8cS› gl~SruДpsÁM:Վι bS\ƣ[~J[meu7 CeEJ䆃_H*Ryoshimi-2.3.5.1/banks/Rhodes/0008-Synth Rhodes1.xiz000066400000000000000000000047661506652756400214340ustar00rootroot00000000000000\s8_{ב=vuY%vvva$:֖|&//R)KMMs~j*  >춍{~l5̵6oV_?xzp{6 )V|{zǦO?9kCg4hcnޡnw_`)h ?M|acL zlDɌ$Ajg=ɭm.ݱyr >hag)G*)q+/rBGd5Y,w!(!^6D ]@'a\V1A̒訦~D>А'2 v{ϱB$'[XUrVr?`̉bZ7?-9b,0>b"ilpO-o(Z{&T^ԑdS.WmreC!, 5h5g癦yAt5j86wPl̥[kQO>b%_٣BK/Q\dQ0Ѿ1 2[U(G>P %\'Q yp MEB%$~.`Nl# ;> Cz`/*Pk&@Zz HT,R!.p8 *@ԵnR8*d!$^`9UӬwG"6G볘 i laɰ1v*[ abAxz!2eG|׀pZ8t.d@yZb[Z'O ql׺81 z NƵQnU]K,7OY&7zH9 +@&C ё%Te/:4KbgǐMoe(T4#{ߘp!<_з[=9񃲌t:`&8uN1-}JUV 1RIqFl:歽(=0Kh"͇s3c ̳FbM_񣭍b+չL4]R?U*& foHɇ̗{VWyj3PJa|IT%7&:ZZl*GiT aa ɚ$Uq~&@33"7tǟ7(aUphx2 w@GilpĢf6Ѷ4e6S4-"eVim`'j?5֞$Eu5֎Wv3'=-`mTþ㔵噓o0ەkevSKSjv iOZi:(5v:^P=w퇐 =H;hW?Ұ{\:Rz뇫+? UH.?r*N\(N0<[ǟ T~_ns2qwj`OZY46RTeî9—IUYM"g3yӆͲDҡ'黷*^.rzVtOU&CU4 0q/LwR'Z6D!Z[u-ǺcaXxj=p_@(P #|rrG/3$VKz0W P|A>S}R}Dᱫ4_rgRFVꥌI}ZҮ_A)Qyoshimi-2.3.5.1/banks/Rhodes/0009-Synth Rhodes2.xiz000066400000000000000000000055501506652756400214260ustar00rootroot00000000000000]sH_UIƵu H${A#͌zF8ا$竧7ӝϿ?W']R5~;Voۮwz;הD*z8v[Y2MC:Uތ6T%~.@?6^4!'b gkS"xnR el> 'zI|Qlge't<ۊ|A晼a*ț]%k}4)hE@w@|o j?+δa]ԆxJ)N @xi_ɌkG˔t:@182ʟѓ,ER<*kF2=lr{a 4~Lp0AEsaδK2<$X;b™Z݈` F7bqԊ =$RVBiB`3q 숀Bc[rHȅTw8\ρ ĞeB|"B{(a^}*(ה?^?M$ۭzl r<'Bievqnp<.c4f Y@hF9d&Rf0Z-|K:w ʍ#'PEn͙H " \R,]¦Jd]Nt.¹Oб22Q_w`26>W7>P$*t4G<4m~p`6Ƨ5:f0Xf0:`|GՑX`So"ǭ>k>gxd a,VZ'!܍)`s9~c-Tk xupX a!vmEP;B`^R^ʾ'k*BÜm3ҿh֮']َN7+b,@zb?p$E!~n=7-tFn &Znw"G&?w"z`-PB׎i] Q4c.fqaHAH@,&\6[(v֣9XHu"[Ё`Y Z7mGoIvT֮|"k)>{2o2e  DB0Dd4`D{S-8Q (R. {`| {0(Ҙ_3 LAS*K*DO72p0&6D.IҎ[SLk:P%DWT`l\z<u^{`r oVmkIIXڽ˅&rA1#s%U_xTp-)<~a}=Je?A F>f#@|N?/8>] %ı̣WdתH#hZs6e1N`Ln PNzQ)kk4`FYl0huȥTh?8L_(ցd*٠42i-P]mls P*ZΙqkE2yS^{ҽ"N^z|q{՛"+]-x s &Tjb;UkC~m`YEa%8i4:*SqZg9 7}+0\R# _Wb0jFhvFfތ]F`x6pV_*b2d2&?ɔ> gdTQ79GB)~UdaR $ӣT3YSs+ʨ줢NDiF-*c2kDIuf|8 ^ˠ,J2Lʼ7 NQ<ނ 3{%\eb -rT̑e g9#8Wʼ4&o¾rE2o$Mjtp!'e=1oDJJu.4'/Im1eˋ{y TZ:rwyf&2:S4NJ\8 _DvMA{jW(rO( ScrL履(4鄬셦lAHޠ^OmUS .~yoxƸ(Cnj7!v*iwnu]$9>Hv >d(6uckx8lڐ}58JPu=Sn]0g.wDR+ՖKew{T*,)[-I ҳvCj v llb]ReLJ(]bT|I)2Yad/A-*T>Ju}e5UD NeQ-;a'.)f;;YbS |;)>eyoshimi-2.3.5.1/banks/Rhodes/0010-Synth Rhodes3.xiz000066400000000000000000000055501506652756400214170ustar00rootroot00000000000000]sH_⛪$[Zl޺܋j$NfF=#$8ا$竧7ӝϿ?n֕R5~;VlwY{z;H9E+`}s5^hU[v& ;5W6Hq>q-oMLfD?+\%dmЉ )x L`y SA%_ P8]L+۽fDG#p S[L$sE: 3b(Iy{ ֊Kpjr3*m[@ȁC O,eh%&6Kb˞Xa(TK_ؖk\Huqm8\a bA?{/_{HͧmԺofŁgyM݄Ont-A΁$P(-`^87R؏dPqY7.xA"P5 3+Ȍە͂a^zt! A6۵GO܁1G^%%YzM__pr}= m(?e l:3 |n|Щ2>HUGhlyieC: 1>mOgtmba|Z-W @bO|K [:ӓvcLlXi}r?t-Hh{~AN dS^~5au/wڵdCHP 2K={ѧRK|u+.6. $2;9y -fG=д]?1N+gq Cz`-JQB׶i Q4c>fqaHAH@ ,&Bq;(v֣9XHu&Ez-@,r$Q_0k *Z^̚L5ß63,3͆(с-TY 76.X(2ALD-4=p {Sy`Єl  Ll.?EbVӚ!Tɨ+*Ecy XF061Gz=:/=0EKrv76絸Gz$T-ۇBaou ɘ/<"*uP?k#yFچbZQz Q>e.X|+kUQ4l8g`LE7gv'ȋ55Z|0}s4R6z Rpz ]@|{{f,PDQZH6(wq8µx ?f^CR'tx=' y.><ػ@*_515xr6 [fe`>D%2<&eM3x]Hvu]Hu]HuGXqyZc+Plڐ}58JPu=Un]0.wEDR+Ֆoeu뇻T*,.[-I ҳv)Cj v1lob=ReTJ(]lT|)RYn/A-+'T>JuCe5UD NdQ-{a8$.)f{;YbS |pvy>eyoshimi-2.3.5.1/banks/Rhodes/0012-Ice Rhodes1.xiz000066400000000000000000000046511506652756400210130ustar00rootroot00000000000000\[s۶~ϯѻ+SM3I:-M5%W;M_0 Yl$R Rc7N˧8X ߂|vz`Aއqʦ;?CۖO\?9nS8Zڴ5#RuKM'?\[(#la0j] [XR+d4 Y-\]O^&qnbxvw?=H|;0Mwt~̇v0 <]Z𸥏d:.G0&enD܈mCcq0 -@Z§Z1[YĴL A%D3SI6W`\LOp``B0\cfka^$LͭwraTcRE'|eL_ƜQ9l |C UhKf:#d޴\'6x*2+8693u==B`uϋ2!X=Bk#@&k1<'`cps{=^]:ߔ!S]{G= IT[^> ::';Cxm7z" P%#Rn[ijƞ&`W̻W8<9EBI#WyllqK&+9Rɚ[sm~S%!ؑ06~* \w2#C4!H HD&Mf ؆Phɸq='+,֡AlJ60S>Mc@+Ljsw8cT|xMǒyD,=2pֱgԎ8?<_9~썺IR =p/*+LZUh{nV>ю7$!vqxj [8Ȧmߋ 1XQ]Rl4z7\~*KŞ-lĶO%g.t%DBH$9} SA9)=%3Ciu ޯ3%Ǩf:e8 ,ZQ9=d8 hE})3,06'#%kj'M#vY;))j8k' 20{&DIP) L*d2%˽SebrI /e_.ūe_8*R & 9:rXF)FmW֢fv/Y2,J8s7q{׫zcB/H B0ʖ+\+i8\jd*tZ^ 3:vJ|{q T1RCr8:e:e_#jJvV#h$UՆ3`P2bN^w\| {uIžHB5sUyPЦ[<5daUM\l:H.0%SCT ?f7w򲿓]!vCW;ٌ,TkJ& @̆J [U3гhiXrQ?תe\܌(U,%qG6G0YUJ^,UyY_W9 P5n ҿb_)CF[IҀ|hJI|k=)b ÉW5nWw׃TylEa@#99A0އMYT, ,iʒ,%9NeYU]o K: )YEFYU׵45*ME[ES eSE Y HU.>(,S1BT 6XR5eg,Ԟ -meIQ0(hT>{{`jC9W\} `!yӤI#Iw|Cޣh.HT\%i.HTii.H@+ Q9zW/%^ݐ8?"ߗH?_7<~T*O3QxJP΁oCo#(~]ބU1C.ϜSײAw*R>M]vM]ˮM]M}QǝMQ+#z|GZ $|p4^.`PEiMh;(Rt ^Xʿ9}wLĸMft e2eq\fgrq\ UˢW]yf0_|H>&+cҪxY |$e»=7E&ư^=~;.{C\!BF)W9@όMyoshimi-2.3.5.1/banks/Rhodes/0013-Ice Rhodes2.xiz000066400000000000000000000046571506652756400210230ustar00rootroot00000000000000\_wOAyO!pf{h@.EG" 6M6Oߑ-[G6xIfH?4_֫# B.ϧlqlprQӇ?]f?{=Ǚn84[Q:ɚf]>q=ADђ?ЦGz;]?|åvOR ~ ]Q-Iymo6j]z:|%نj OYX50WzS֯i&?&K ]%(V'[V!Fč:$ `fHtX  f+kIA`9\[&z8}XTt6fBYihd;,l~l$ s*\F!5=otX1_)?CΨudv*ISB2ok<|er xl9Su==B`52!XBk#@Gߐk1<'`w{w3_:vmG6tPk^6 :2# I

EOe|`#Njdh#&)SWb>& D![1J-:Wd: Gy!]v&gݼrz|tw>~GMF5ˇ7q9LwZiziev֩gOԎ8?<_9}j YR \hF%l&fY 4W htYxj-%<:lEKM۾Abnecyu)JղsQhI> BFrHБ~r!]XՃ:4Lj >D d:z2x:׍= QayiwfDzd_|m˺y8 >V3do0tбsWX 7PŞ|CpvUɚfӈ=AID֎ $OXi<ΐ<(E!OM_LyeL/!9 NYԤ*K#Pʫ*WN ZwgS,~Lx;XzJxE'x]J<<%ë~u;Bzn[~CBe4 7pKX'-1QsVpXjY.naK)Éŋnn7Xylu"#nǏeI\SgQ˒cYr,KxItY 9C.M8vuIC=\ՈQTCiUZG45jME[ES eSEwuReLTWSqI F+!#TާBmXjKȿM[YR9 J%`>{{`jBoL5$*IRox?87@jűA QrlcGI= ]s.uw/%I|-uH@%=ug/~ˆȽ^H_fW>8~ ~}@~ `{z;d!}VV]WW;U{ Q^<H.iO—_r|QՌw-H;(Rd ^XJ?axs6f":MqKRƥq\ җWu\3 MqC5L VCb$ѮO 1-56]*qR 2"(OP.жMyoshimi-2.3.5.1/banks/Rhodes/0014-Ice Rhodes3.xiz000066400000000000000000000047251506652756400210210ustar00rootroot00000000000000\s8=K l R@ͽ-wIߖ-[[28dvyiIROmii<0itlP \l/F'͟?}ݰgd9KbӝlAxl7gONA$DiL˄5?~w-fPM;*m.UtWΤ1cT c:_PpG12' hE$ZvuҜPe/ e d9FJNMbin=B5ۗ ["eˉq Y<=Bk`?O"הcxNH!f6:c,wķwpGnsa!s @("e %I+QY]J{+fil2U&6= Rd?A%06 BJ~* <wr#Ca4Hx)H ٦VAP醒Hبdx>됂 ÁZ60>뗕3+LzswL;UxxMǂ^=<;$OO`?~:`81+OQ:k_@ + Ҹ"̈́[j * IGrm8ўh|>m2GnHi'cH FE6VVT%+͆N>5Ɖ/F$]D~W(T ܒ|С >U]':ct^zձxz׍= Gf:tEgY"B7nײ. @5 Y;>=ty)+e3 SNcl]s4[S9Ӈ Qk8mGr3(D8$]d8@UDENS9*•arZaS &W Im` r8 I *%JJރ#&a%T C\Q(u4Ywsݧ"ŨfKN<˨`:c}4p/Cʨ;I>&l`p:()DlÞrԼafP!cXylHذM+q$+qZùW)U)8Jadhi5DLPUm8 *nW0!{bB]mĭ'(Pg͂l|UT/ӭtoTb{QUM\=|:H\JV]OiNYPVL+:N'+vf)6֮ЇV>#_WjvZ(]DAD} '!ca+Y~`z61 5EqD~ ^qur"[b.Ywĕ*T8 *+*'*cYnMa_b܄]0ܴ+ ~[)a?إx]nn7Ŕylu*B' ݎ˒bϼ:%DzX'Zﲤ[QXj]=SjimF_5*eq>VcAh;bY,vX-}+V)1T7ȉP=ެ\PebTX*.QZ 0Բ.(ӲfF1'DsܯwD̥%9PBdD;=]%c)?powݕrlh9vTv[;Nk^_WYI}hѶQ88KZhƗgOdL̔u>Kʐ?~}PA|;N}H©k٠eeeeNk(Pm ^\};#7tI|YSX`8 =?eDʝҚ;R%Ld௯Uܱbgp3J=غz4}q yV~PDKUPJHtoaz{Mar{~\CSrٸ?0b@zNyoshimi-2.3.5.1/banks/Rhodes/0033-FM Rhodes 1.xiz000066400000000000000000000051441506652756400206560ustar00rootroot00000000000000]s8}~{U3&PK]![7M&_-,[[@f)&cڭv>W'}[k̳}?fN>fr=rׯ9v>C# %O?ToOԗ6Zcڴ6#RvG/~tY[OcaT+ = ;"n}|x;d?HCIdl]*0*V:_n://uG( Ҩ,U1+FjV]oVnnn?r h[OKmߋ JJ3J#f")psXt.BۧAH3=t$9xK$)=A RuG|!N*=Džwl|X|Z]Ӽ,MΧղ8ɑ9zH-i!}h8hPXg[HM'UY Ol ~a6أ^\`f_ґ{%2CPG%CDs$ UdBEdPcG5JH"rt?{ =rE ƦY4`56JXn֍Nqo|4jTc2W I[ )զ<PPp,r%A+a p;hɚWr)5 # $FL,J".p>d 2u,Owvz-$^NwlTXДg13&r]Qa/bˆ2wR X>o+"X_o3!DZHYǒrżJ /@0^8/da]*|!ıbVIW{*޻@>߲?Y"zE~OK)a`{H_(iqBLB}pb UF7 Zx>= tJ@ عʒ5SYPjе[*zE6u&rAKA,Ű$69TUWy9> I xxz߻-!횾ޝ7y"د-ӿg4/^xlEqWP(5sD >TܲxA)mtR-)3{>nAo5ݍEl L%W>nD 9{#oYmu:/M cLR|E9>_zFQqDKG^B˳iyΑVz&7DTUw#Y&vd+GH4}f8/XBS{zƬw7ηY/ a*fK3vˑކ50kGF@۠qdzE@[[mhF+DD|Zs>"SOjy&ÑM90(K&oo`(6*v~ `Mʐ)eH2etҎѡ8c(NC'1 PO)cH͟&RV|op ]cꚧ^^<mT=YHOFB( ^oa'J7za;7-+B`7w|޿|L}wQA}q 4yc1P8?ƦcE% [E2(IR3%ϕxfȣ,&M5ӝ3VMdLxW~- 1g|3!>Vr!9Jhy8dhy"7=HA~{܇ #6{xF So$Ԟ/%6u6h66lM̭k&<`dtZ?#F99za췎UYGZ9K hXt #l;YG]R'ژ,~?0of0d_/o;aCJ ~k~U_[@v*z9l+1(} Q~la8Zٰb)8s0M'xdz7Qzysn渱,z7Y2 Łs=LyKU|݄ߘ 9{]d* _pkmmۓx~\ZW:$@`rJ <Dno3'hܬ|Sp6n^n=LrhmgcNO/}/%qώQʞ&=˙19Sm=NkCt D뙼uR(')'AL V Σ= 煢W,{4{|Ga m*iH/Q>֯~qD3CQ%zZ0f+ӥeܧp-y,X+o!zٍE3{rQ`-Aʘ_B$Xcyut[ٺ$o.eNū$eX[(xE̢M^kwD̫G {EO(Eg|:M%ZtF?s:@z=7-tBPke6g'Yfc#D"x[%G M;w|Dj1b3! (,-.5[\oY'X}L?\ӬfZg 44ㄫ#K_2ˉ&RtHU||%8+i6=amOb67#jcG%~G%_;XU]ͬ\ʏxEʢ~3\[b'ۏK! QmPz,VS:)B0=0Z5xȕN1 fd;Î/;[=^ "۲]1ӚəC#WcqZL6]O'sK\2%~ @o-突ڃ·oK9<;%d$XSԞ NC%̟BeG Gjb'HxU? /@]) #.D0:9l* ~tW sXU7'd/e@jr8};A*30N/qqJz?9N_)Vd4 3(H*ӆ ƔӓJB+'>y#X좍:"jRH,h@0@Y(o<] .8PŴ,6'j˲VYmY/ڲ|s|mXa/,5\&8lYuSZ1f)CS!w5")SEehqYp:Zi|HwpxRᯀkFËCh|?*ҞFY>ԇCCk fh6v{Au%1Cp #43:QdÞ>…^WG(S%6YMe`?[u^y|, >.ۓ L*Yc_6sg>(˾HƩYڷ u6Ll̦DǍ$0Dp,hD.$s&PY$tX9걘9:1]=el'Bc^d2zbE`l{. nڬAGsc*Ht 1H,&Ӫp* Bc/u/j/}5{QžH4')#RQrspၣͩ^E`jVQei?:3GLI;YOYb'mzakӤb2YuF:hABB Ń$?n X̨EIV7m%*RH697oGX !!1[mSӐ"J\] acB݇\.sr?N 0 ɡ{Du!Br,Sm㉟o[ݎr+.^֕`FMRlzr>\-*ig12 urȌx™r_[#ETg{u`p4KJ1.]U$ʼnRn`3QVPRIq uYp/?B@\&)2izZeM_t%iQWVkZӕ՚䣭ZkDWZW6y@jx"w<ɜqyi/H8>CV840\- 1ˋ(8dnֲ|1W(c>Q{J4n ikyoshimi-2.3.5.1/banks/Rhodes/0035-FM Rhodes 3.xiz000066400000000000000000000047341506652756400206660ustar00rootroot00000000000000\[s۶~ϯPʤ3I:,M5ǖ\Y LBTIʱ q<|C-ް-=zcjj76Ӳ?5oWӳA>r^O{Gys̤>߲bvg;~jMIJy=xN=6O,j7a6:F[icFLͨIOMXl>],FbS9ζa]\xO!b='5-L}sEAm;J둊uLJ/fBGd5YބSGkGL#-R%J,X>yd\bٞvi<Dz ij ` Ah  hl~Z^MH7s$UcqL5[Yܚ~7L:|@EB0,, >Nf筩Dc}&=4&L/VerlzU9Fifmw%vcl=)$!۸Dy6H@AnW#/ 8 drg n*lԞdo הRtv)rD2MBCLlA:?'YpR.=`&{im^BBߒ$)뢗 徒v8osl @asȽ(Q&?' ˘gE`؁cPleM8b؎ 9 E6$.2 #%` < qDL1!^ȿG,{hőoR#KRemE{H2*VD_{pkx{sT:ҡhl~#Y4lImuH:C~kK -XɶJٴ>$FIfUT6]N_7[ yPc$C:uQ(#K+}v UA >''d=?zűGSxN{ji¬ nW|`GFBYT}\Kz>KBO6!8 c}bi0gj3 v RZbk#'sC;gM|Ti@*ʀY=&R9U,V"QS<ɿ%uR<\r⬢H͑gٸ򻔮"Mf1NJ- $YJ"㸹Ki=libخfx$,્F(*.W,Zoh#ކ3,#-("#*TE/;4Ku҇MˋoE T4!;ߙp!<_д[=9ޤrt[`&8uL1- }JO{+`)ĸb>^whQ%in}j%,׊fyz'hQhg#۸Ҕ3YB2h Pu=)rNJ/Á4G(e: x?UwmDD*oaT -naM6l|YU#x8rԠrAGR t: ? pIwexU {Q<\m"eD!9,r#P[m Pb?ER g)8#C囖8%O5-1WjlnڅA~T$^2':=Zׄeku_]f7Ѻj=}Պ-.ZJ:eKށZL 0vDV{6_c(():Aւcu֒>R>zX;kv7+Y[Z^OUuᮯKSXe k׆N:o]i!qWcO*J8%MX* ~tߑSGQUicglŇՇ'U9V|/t Ht[.~l0V!~` 5DԇZ GUٰCD|A]=*kI$n:}We.=={"Ee"]=$_E.”i 2d+q R>dXWj+|5փ*Tt€ Qڲx!zvB^'_҃t:G4$J}5*[ :?vX|UVWZ%pqMB|_$Qyoshimi-2.3.5.1/banks/Rhodes/0036-FM Rhodes 4.xiz000066400000000000000000000055211506652756400206630ustar00rootroot00000000000000][s~ϯ8[Zjmxd_Tc$6 q$%43!H=tt|i=Zoy]^kyn~WO_oF?i/$wGIw7/;uv'g|# V 6]&N_]eo ` FcAmH0^K$['`>N[9dco0cg˯q7Y qC֗ȸףhvM!O6m01:I~ol-ϰ?vˁm?ȰKkђ  򞂜7e4E~tEt^v>Mtn`f0^?_^f+״ZS#~%٭Y~n Sb \ѼIÉfm`biSG d %hg¶&D|t]P<1[_Cܚel > '|k;7YԐ)Ċ2#tGaPu&~Nqu, #f0_tϴnj1R( 8lF}dc壡 Bk~P*ݓc 1_)4S8$\/G# GZ0Xk!yM$f/Wއ]Gdv`eD.ll/lidQ7{ SzrװR˘yK|؏[znsT/QIV[%MzU/p^ZUT%yC^SjK1`|N Gg|ed򍂥wE 'l .狱G5QvV%v]$] ɼR)7֥x\ץ\ץx\׽2T%@iC݋}DԎ(EjzW02?=]^z)DB9%⫺q7WܘW)mK4je.t.vɖHb]0O ~M^B6Xf88&O?[`jyoshimi-2.3.5.1/banks/Rhodes/0037-FM Rhodes 5.xiz000066400000000000000000000047101506652756400206640ustar00rootroot00000000000000\wڸ_%sa8˹r칽/:[YI2ԭ5پzut;}ug;shDl5>ԛu;u%E`Һ.~v#Fl Q*0ł%`R?X". < :N*'ߵ"b`4ML}1 p]?wXXko Ss,\F!5ltD _?ΨuƶC Uh f:#d0 k<|er xlG Ùݺ^ W [!Wy W,^X]Bt Oo50 f7#Pl|U9ƒ Y}qh%Dx'm7z! P% Rn[ą7g/ /yMHdV8L'+bK}ϵI*O8BF`G@o{n|3{3pyɌ mӄ eJ#@'D 69$`+FCiE'Xv##[DWNߧqxèf. R?ɫU}xvhpZ~lv:M܂gjG?My )n`4K 6DdTլaO IGqެ(6hb>o2Ghi"H cFl,.EZV֟|*JŞ-lĶO%g.t9D\H$9} SA9)=+COe]C,[BfO[G}.ѱsWX wPŞ|CpvUdfӈ=AID֎ $OXi<.<*E!OMڟMyeB/!9 NYդ*Kc+7oU oaj9Nݵ +Φ(Y4wYzJxE'xJ<wGWAH/I=&l`p<i)GY圫y@ ǜABc%@N kUf#B~Qc.Z-6*ƵPj^^,W, }b$\R 1Pо0rBP*p UF+Ov1S.7i~Iܱlae_-Lotbp,ߦD.XI6NF$RLKRCDao|Udop<V^w4EeڐXe97yI]ڝl- DTkJ& H̆ [{m?=(s0xZ͈R"YwJ:Ni-L_KBa!΂ZU`)YE~_A&V,5mCtd>:ix[⛺R]w6p*[nXINNP()bDm|DSYT, SYr*KNe /q.K.teIC=\H@Ti$jUvSK|==V0Pa,Ud~HZPJ[ WPxVI%EjG#OXjvRKm+zPjT|xPjKӿ떶FRa*gLJvZ-t~ucR I}Q SR/Iꍗ(~ 9 ~DM+|t?"RYr}?,^ DVpm,9*SNI&W&K[{ ۛe5A~mÓL^z/|HeW7~ y}@~ `+ާ{ԕlTjSWjSWjSWjS_WqjSw751Z! Tc:?۟i%7IK/ʃ^߻|(%^wL}QW4&}Dm/D%q ЦqJ |fq\ wWu\3 MqC1"&I]_ʽc:}hv٫ebzGĥ"dDProPMyoshimi-2.3.5.1/banks/Rhodes/0038-FM Rhodes 6.xiz000066400000000000000000000047021506652756400206670ustar00rootroot00000000000000\[s~_C |0NeX q$ӃFzF_vqzEϭouK~\-k,T~:טΆ'ϟ?|Or1r=nljKc ӝAnONAt/1Z81}_e× Zx+$%-A(]%l=R"zŰ1I-~bl5 GqY1U:,z`a9s5tK~D1= ns ̪f6gBY0˺yxU.EF{0QgŇrRRӚIF' ztߨet9aEs'M !<3-uao¾VXN{žO:Xy$bK@Q~xYU_GGAng"+U# ]]_f}?K0S2'@ZC[nOgsa& o/2nIlDR oOX?/8 \GY1+[<3ƞºv-v$t35 sHP"r g[(2tN'cK6DUy:%![2I%5ݒKgpCĊ#p]tʩs0&;~ЊY>^R &suvhpZ~jݮmZ:1]NC:;-i\]Ag˜O#|rU]^Qn2j~ %{tْN;CfEfEq)BEh࿷Sx+N"+tF(LGs݁*tIr|Эs>HuG1D=t=rci_q\o{VaiuV/np&jYV^v>:=@Bާ( G)\O1! c2>)ifsh!n 升?З{%?DF rN(|1^R42}o//a.;/n6x|?0wDDIU[R,doIM\E>GQ SC"1}JcpLMزX5DPa9e<4Mpe4( E֗QA\ %To/{ U_#Jmpo[DyM/GTz9OTyY1+199T'Ռ 7iԌJ4ۭ1,p- 0pנ'6>(?TX2bX o~3 [L(1"{ hw*zQ|D J@-*KZлj[M0y@mZV햴ggyR6JF.d nA{n_wjۨkD9?Uj&)K dǤ'iϱ7G۾[s~pNjO3RdZe5ruЭ9G_әJ9YW|LY򘓽:m?-)kB˶;o~ZfnVu[v`;dg_5+|"{^6 Oke(:{g)6wU Cf CЗME=9uS弄o0d/otwK57uPRyb[oh𹗷Z&iMǣ _R Ō㣇Ä(-^ihK6|M)YxL]nwڥR- վrOyoshimi-2.3.5.1/banks/Rhodes/0041-Soft Rhodes.xiz000066400000000000000000000050721506652756400211450ustar00rootroot00000000000000\[s~_AxwM*Ա:{^T4eA"A#͌z$ O=7!}FTa`<͆oC|syKSwsԆРZaïjt]5uZ}7g4qM͵c;&| ab|F;V"ꄦu`no:n5u[͂t4FS7t AW|'1s,&>qy j8&wьu2s0YW?OEX,=kiHݪ~5cfPI/*-n'ݼIfLfkVQ} X6CliLNwfdRFކR҄cu\+},_VlwҚP6COxm{ ff92LS!`9>v&ӰئPp q͍'L-QO\[{p097 YY ta ʳ2i2Em*^.Txu zEGinZaHZr 2ԁ(-OsI:R`>v#sOG(@Gv|)۩}5p߉ -e%@3x"-j>]Q͊+ǥYa b=왶FHn7]s 67{~*MkZ1;/ k(&tՕX v~\^ |XrFYi\Ag,e1KjJxCܑ 7+'j#OfB3GHisCH Œl,-.IJV6菮d%k6 ĖG)Jwh^(ҹk3=AAC|TuGdLiCcj{f8|4FRCi5ZFˢ]^Gjqv>R|ex,ϓNbL셱Vef>1i4,GJ@A\ j8i bգTYf. PzE@EFG9RK…rt'{ =rEdx8qW2e#˓~NXJXrȊ[E'x]k 48r?~q%9BܺNp[%'Ji3@0&6~ȑO'a(UR5LzGTd1cWHU08U>( ׺jq.L&]L94rD)Y[ET]f>gGWFz/I70|V [%HP5ySVΙ09"TRnWHpY#vl$*ߋ4kꐵ>{2o*e 'jKe2JPp="Ty BJMp򺁽GxP49U3!xh% t '\8~olB$n'b)5#CQGhnC*ӵ|M *֛܍GkK ɒllޝéN5T:IP3*Ҝc?N6(kyŁѷjz&_kRC?8{@Q$3Zg$`3|FѠg$\ꔗ/!9rNS"hW/o'1|]뚷_|DJ53kx|;?<҆ҋ ]!;/%>+u!ԼÐBYB[Bz]B:_"T麆;@i'Gi"q_RoHAz"QD\Pθ;|*f)k ~;KK5\7o:̬;mf&_],M bkǯhN.>m{]a=Z1`M'UQx$Pz.&ם2W\Y_+QZ}QѡI&[i9[ ]Q+۰bf9ߞxƝn[Yړs oc=go:q pG֗Ը,'Wty/M#O6m>1Im.~o-ϰ?;l)> 2ZskdK~>{@]<1ɏ/nNoV۫|Eb +5-_؉1?vw!6}]UE7m,٥YS6,+ (!l!lp c^l3OLC2ΐYvpBc|%)at|1H[R܌Sx0nW_oBXdz@dr=Gw ̙"~ػ! x1' #!Ȗt1](y8{)!σbHg$NxpЕs;!6>h0h`&,H)vc|s{tzYlYQG;< 0>، Z" @qRxڸ2 ZgDcn<8) qbL!/h&Ty7htxGze$mw69tzDZg@ amǺvYOd -ӧA"#фl(+Ќ9IC9jq A!p Av*A<أimhz:F=.Rb9t~-\30~icąkxed >E@ ed:$>HkȄ"E[:9'ԩ)zj٣I\ǖ=sG鏵>4FV Oi#>9=&]DXH7|}qD30OdaLVOz)h5 {SdAS %h2"&rB{8xd]f@Ff[$=oS%hxa}Ao.:&v osrV V3 Zt.@+f1$>Z6@Z?iHJN>|/bbSPԠ6=sVK2m@HQG#A20rmp 7gq{<BXb.u\lg+N`c)0\m3oTEg1L WǾB916lv)ieG ˻7 QB,` " -2;.OqLy+$IWHȶ*s!U!U;A- B #+qF! Tpe Ju),0,Cz(l!Fh݃y J3ʂESb,KRuYD7"=_eq$Ǥ)5bCQ% {%`N$qb>; yɿ#@4kV.;Ɍa_HC6g~k%%)22)b0H:XGq}> ? aU08k$D~$QTOfnYY,yXZdbwxKAN},şrCϾDyDr\A6T6ϾȦ%8}HU^D8BE _'YڕK[Ji+vd9B^C&<~"IrZА,[1xP @J(ƎzI1*8Tz~ky߬,Lx,17[q,*zI+>xRt[rZ.cdXuTZ<)ʳs;QBkr&WUG\K=WBq"M,?]e"X~nMYm,bqp(_&Q<΄k %<{ e-O{`8*Ua5|3'莇yq?l+j%>^!\| ^USZK]|751xKt<[Vg1k6n/얍F~ɼ~onY"F>qE /B+ y({VފHn㕥M=ԵM9 pi/k2cQj1Sq]eeRT}VV/F1I4A|ksnu@AB & q3`y򞃥r^IDhJCiqei?('wJ<ܕ};'&"5*E}TY25.9uFͩ+ѧ)וhԕԕhԣ*\m0Vn[֤>0ӎ7L,OBLjbz #kz ΌА{J^>7]v\Rk0+tBqUq)K|\c_0m JTLPvDjKWL@20.EM(qyL-&2T 0YtE]qiW?r+^QUXn jl04tb;c.V{uګ^]Z*vՎL)Џ4Ћ=(S 9x2.H'/ zcW@LL*Tv Kr2"*CESDwԌz ,?fÃhyoshimi-2.3.5.1/banks/Rhodes/0043-Hard Rhodes2.xiz000066400000000000000000000046701506652756400211770ustar00rootroot00000000000000\wڸ_=K ! &pʹ ٳa-\wd˖ nB婩IOcin< t}C`;y?\6'WwƟ^qfbljC# eӝl_~n'ǟ6ߩh1 mژ}t׸܍{ X5XHh)O/hx\XȂD LcH #[=y)7T-uH CmiBسWy gݢSU$wQ1[d+N&+c+l|ϵI*O8BV`G`fr7 3{3pyɌ mӄ eJ#@'D 69$`kFCieGX#O#kTWTNVgqx˨f& R$睋vL,?2r֩gOԎ8?V67}ѱsSTX$ G7PŞbCpvUdfӈ=AED֎ $OXi<ΐ<(U!OM_LyeB/!9 NYԤ*K+PʫjWN ZwgSS,~LxZ;XzJxEd_J"<''A};B=7-tFB4 pK\'-ٴ Q"Q$!|(aj@@.ԏ)FR(uD0p*[qݰ &99A0vĈy|DDz$(eɱ,9%$lj?,iW% ..i'PkXȳZ EDSrI=Jhj*#﷊: Y .:)x ?:!> 0:W40CK{8bTާB~7,#CjVyRq#*tPzA[S I}Vkzd cO!sz|Q$*ZI =- J=6HpAgΥ1t6yI}gi lxe_6P!ZYoZ[oZv]oZ6_o:ToᦆWFkDzl[Gxp|# > _~)|Ey0WsʷR" #`꫌"eM0|텥C7'Zl|a&b\ԞnW40uOe*1eqY 4^N4\qY+,4YׄrELZ5D>-Txthv٫ebzoK5DȈ<*__}Myoshimi-2.3.5.1/banks/Rhodes/0044-Echo Rhodes.xiz000066400000000000000000000053761506652756400211220ustar00rootroot00000000000000]sH_UIƵxr/4m@$_if#!𑔞Ѩ3Wg}]kԳ}>?|t8z78}Lw&YO\=md'$ImjG%^lW_p݋hFGè6$+XzT%D$~c O|<6$}UȚ~W/ZZې:bWk L}ECZ⻁nꄸ.~d f|4_׸&/u\ E0HV"Fuhmh`^5[Yt0)4r}SGO'fL||fxr?=܎&s.n3ɺyd/l;4؈V3CBH*zPvޭ+Y1[deC5hs&B|t[sfXGW:аWYHCZpg}ϗ["0nVsB9VKϵmSA۬ܯ`@):xpk lS(82 /L#Q^@@<_{ҹ09w׉)YGJ CP LWFaƒ1}Ӹ4 #\4Me R iT]Ag,e1K[j[#YoVnni|>}ς5:tE ?N۾AdfcYqIBU²_k^hIN#+}P"~ƿLGs=tIbGw>h9:磏tr|ONF.=%uj߃ 0h,;vj?ۆ;2r>WƠ;&*9BV^o =s=0nUn쓐^ީ`68de@NKZH%ĎDF$%w6 (wbRI4ReI-@?g5aA^yG_w,g)ⶫ~:L- QD=LZVi/9@HvrKS K *u 'ZAXql"$')bCa"0Y3Xn #9Wc0NCVK  ^hImDzwHfd&M>d mWqAz%gF$"s_^TLUQO(חy^ ]vsdc8$H"IT7@ᕄ' 7!DozF{QtB&) r])ș Pt:FY3F[oz@~i@`FK~bJT<\"ap8իr=v@uŦ,'+u,O""ƤΨx;z̧y+FNb H 8N[:O78tYs*nUfyk|XKby̲!@L <JNKUgǤ~#PoH+ϋT_Q;댯P' ^?jUZe.2jiY#~uAo4pJq*+yHWU/k%Ns8 l,2⪼˪Ls9uR\ǓByqQ3RI7N] Ʃˠo tV-A{aSM;Ĝ^eCvOhn'4I6 3p:sPL$3ԠǏ=_iR4̕:4y`{sQq3q6dfnR3óL*㸥wʗ"@h^GVT5곓>-U'N+>T EjW"KGY3tzj3}j|Ɓ-y\)/-vcyoshimi-2.3.5.1/banks/Rhodes/0045-A long time ago.xiz000066400000000000000000000052401506652756400215740ustar00rootroot00000000000000\_s8=H?tuY%v.qva$:֖|&((YJ^SSIH~yj<1?pn'zt3,&7qbkL֎ ^ڭB u@6'v\Vi%F-R ~D>( c@m=XOc[XTj2[`ޠB0|FBg؊iı5?nyk. C!W+|0)lIGjGKFJ=壕­=[Ԩ '|/T-PA>4!LcsZ\zYFƊrކ e:.^Rڭf?>smz pU)%re ٧gdtu}9]ܝZM mK64Ju>umo >Mya! o>d=dːz|z%E'솱Z> Egfh!N 21^m~V ;Zb@;2k%l7Go&h6hy 6ϧI}$>BܺN[`Ly 4&sn%aa A4 %聭(G ;@lHQ΢$|QQR>nxq2!ˑ٨fIٙT0l~ V!_2NJf 0r14O/31DÎ<2K)P.[`E"'ގJ^;E6̥賔eR}b$x @%BG! Ac$Uل`F1^7Pc| {pjU[!\NSI 庥SM,?(M7j^Ӓda4[(&~\g1%G! -iqChV[ <Ξi7\te*JBҹzQAdPwu5@슋J)5&x՝[#G^ #Ђ()Q3@lgK'!"JwT^ݚ"{smwΗGP> C߀ 68֠[HRLltՊO :8d~ΧkUáEɋa"Zr/"T _zȘ =P[m3)Tge[ -($-1޵Wb.^UA_A©=5%6 8@֊Y*^YyLZϚǤgǜ'lO"e"P'Q;"gvHub$=^#f1Q*sD®:?io?Fq ZIrP,vZnJpv]9DE>ưJ+?j?aM#^&K1sIr xJ{g?ZkVU?T{IǣU xG(?d՞2"yo[ɇ5~O]Ҳ6F9(Ukh&+v~~¯7ee ofp/.%u%ͻoKCO k&soU|Zd{_Lg7_Г4%*UWu-PӮ#$m88MmxL\_^Kҭx*\NUS]k oW?ezWɋfu ևȎKגU]L_OV_#'K_kmUԢv-[SUyoshimi-2.3.5.1/banks/Rhodes/0065-Steel Rhodes.xiz000066400000000000000000000055631506652756400213210ustar00rootroot00000000000000]sH_ӻW}W%RdVu˽Pc1H_3CSR<Łz{=vxg9eAcZb_&#|?]$>wGqw[~jMIJ'b#1_"v7_ommhWצ Lo6b"6&rhM!PHkjcUˮ'z_5{[0i!G%g^f: Pʦ3I3=A QTa{2\o{4 Զ+`Q.3o|Cm4,j\^i6 l|tobz d30a,VOLz)`Kg1Nuw6RBg!*D %o*7@rp2$tV+r{,ϢO%8='跀~U圼-3[ڿ <дyfVLwe;z?yF"FK(s>O#)޶< *C􅑲,͢`&~&WeZDfb[: t5^X"nF|Z><&W* %#:;8v_ T'_O@xuXejaY#] ~uA}pJ PT]:|;>QDe25>L\˿r802)糈p!:.:.S(oH7rNp33J)>$w;#]9]r1-0j|Pg:ԞSIݱ )7S iW3:ԞXߩjc:a;UIYm46yi¤[|[ ioHG˦$7` lp ER7P#U9 u,=bl6Cդĝj\իrj5Tƪ\Fr<VjT),\{վS\TjvrꜗjKeC(L]TY$y"dɞ޷•=oZ޷rzF/'sdvZ^ >d?ݡl#yݼ}9G*FT ŋ(iǐgyoshimi-2.3.5.1/banks/Rhodes/0067-RhodesPad1.xiz000066400000000000000000000036051506652756400207670ustar00rootroot00000000000000Zs8~_@`IKs P 7{[loeKa7sOMj>~q;4,vbt/l=?۔S-{_6%+M4xyLC6&;z)&`1[ nMs:_(d6<Yl@ou07t0< s6O Ml!aPetMWMH,  0l !l"lb򌫢GRp  eg=F]sUndM9Зc<+;yT,F@&Eב.+pvCO0?Kcrdd莑pMpVHZ' IY!)%RK-)<nH^jB^cl^0,T@bzbJĶ7j1> JV.LVN-ʧ6rP8$KNo)ʝ۸L9-ӿ! .*k >c̼vr_V(7-x OT)WQr=TDu_#"?QQN\Wh;Q9pU)ԯ]Bk>TUE_{%ZaP:'r-ء/iLPgJə9;ylYR:u2a`.c @!6n2)YH\cfMUɢ)Sq`OY cW,t ףs),さ2AA*s%ٝF=Z<ݗv ' "÷ks}{' 5QLRO L*A(u1+eڸ%{j\5mrfędZq(pT|\H1op'p˄PRGV2:]JSSa$`.SkT]c0@씙>̀Eu8ƽa.}1+*\|N-`4Džl>t~&8x "pR|WK+c0$ٸMSqf3VAGo*,0dRZYІÙ=Ww4d@xI}Oqr5PzsAW0E SLL\A v XJ0rt|s*۳3L٭* :+|P@ՐM*HW3i A-x:Rt"UP뫼׼eL&oyB~uUuqQm0´k:iUU]5X9/ # *"tRkڇW/Q]iөT#3N'gPΊΠ:Au::_Cd=iKǕg8#Wm13&d66?ϘXW'[s84Uo(?JEcV\w?5,[tȢR+<'RāOJwM|)yoshimi-2.3.5.1/banks/Rhodes/0068-RhodesPad2.xiz000066400000000000000000000035421506652756400207710ustar00rootroot00000000000000Zms8_%&L)s P 7nrZo_$yeIܧ6j}w?3 #'ƇfV`;Ua1|k~~qj6۞_m)+?ս M'E4FmL,N74v4Nfh264$ p>Us:>_8b6lDnYl@.}07t0ܛ s6OeREn(jqNKTݭэz#u_V߽Gmk~ZG~^c{﵎1;u-:_"%ٱs9㛬1eUOՒ9Ĭ$KJoJh݁XͥDפ\HpBDu$_wţBzij)jrwR dv̓Cn %'-ddbhp[9Mz\^ ~={fn`9|K,j!&0I`ԦjRN;m]BDϋYMkYOn2`4rp87d"uDXN|%\T{W-fL"r'`@ @>̀:V~k=3}xj={vyKgn8ɦb!6!ImPJB\^3ւ hU'l>|E!T7ђ4fm6siTDJM豸9(C`of+^ 62 f;j㐏,;c>'0(K}r+ _SRU97d*!}(>IVnnȅ|vC#M׎,r_!+e`HOI _?/G)yoshimi-2.3.5.1/banks/Splited/000077500000000000000000000000001506652756400160635ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Splited/.bankdir000066400000000000000000000000061506652756400174720ustar00rootroot000000000000002.3.0 yoshimi-2.3.5.1/banks/Splited/0001-Strings and Reed1.xiz000066400000000000000000000116741506652756400223030ustar00rootroot00000000000000][s۶~{*uIG婧c;/Zc#Ri_Rb|I>%@bGM%csdş^w>ܜw~~O98x9;!._-,T=*3ټK_D`ݳσt]̳sGvcGUhm0͎% =Ux_ ol$Y*|ݙqvop#[!L;G]qm|9=jܕvz=/Wuu9U_Eȇ2X9HgVhWQRn(Nv0[X݅s x(L? Gi>64/ǠtŢI4gx:Ug7Wo 0þuuSzċ0\8?uV:oL?OVlJS^:܍zT4hI 'GG2՛㽰J'GBlI. nfNښ v[M 0嵧L*GW!r Chᓚaݔ=?UT#Yڠc7( \|M/ߝ|81VNp,u/)X L{:eEvϧZe ]sLQÔbS|]mIU>z}@ZhhE̩*Zhg|2*_'lkilLc6{wq9S& c;? "*)/ڤ0AA >o, ߌDP%y72 RQg!(QS!li0K0r~SQ̞jD9wxoʆėLa.聂RS<麼o]-003>7r}A@IPe-W?uzDyuXQ/sW2:={ny |\a2ʶެ{ -"\ *Z$aX[ zlJ ?HfM"̶1NcgylЯTHWy :ze֩ze:U =Tk@3@Q#xnE~WkQ`ݡqƠիMw;qbU{:by^F 7[V_~!yaUuu t|8ՍY8),:y Pč̷|S_cY> g, &+ ]r]5?nк/W3{מ#j;z6s7́Ns *1iHd5=wl>G,w̛e!mWx)"I=yZ1sHH[_ܾvJX|(LeyvPن& m,X=gͩg&q;(Ͻ`V//oCS8ѭϒSkdlur/32E t}DcD<6*Zd"K}Yy\MZȂkH 5 A-@k@AE #ࢅtha_00r1QO1#F AanA(ńa+:C)!F {Ha a00RC)!F Aa^d^U;CT,LA} a00RC)!F c#1Ha a Fa00ZFpl6e/L a adHa a00RC% gh6F 0Ű la6Aذ tAڴ Fm6jQ la6AdABmt6C?1Q6nsZQFlS'Zca}j##' 0Q ]0LyAKzNw ҰGa.9Ha!ߊg=cpDI# /JAY`>,!0s)9= g>qzX (1Xb!@45ڵx#Xk `4H#Xk aR-|Svh75o k4vO4@Fư~Z`NƼ_ ;Amz0+܉#@t? v6ƾTDˁLT4xN!z |QJ845F)ikRhiYoYJZik 5F@Zik 5FFKca҈^k kX$Aߘ^#^|+N%5{`mHj5%X@4Hc{(i;`A꾮'b޿I}*,q-X`eMh5B`}caưBPe2X}r`>ia!khh% w",L@,NP1,q " =jXAQ^â+ xN* " 1{LX̀]"f hi1?PJ#v*-k䜻=^k k u+hqXD4hi71߀Ln Hi,n6,1kP; 6-a׀雖|ZX܀ܿ]C) cqcJZ \,nP1#R!n հ |TCi%,f@ hal$Ȟc5RHaH#1]F c":0ac[&)혤0a~I c)aؙZg,>@d °=6BَlJRkBٲ#?:vhwOiiU9\)n7AqM%<o% lB}g O`*L=CT<Gz <x[%tqE}, PlA毫#֠m񼤬(;%&9wzucZD_V+̵*tl:F<ٯBǚ\1iw^Dݏ3r=X(ժAKΞw i}ZF&jv˾-zJUc+U[*WUP#R}p!?ߓcWxC\SZIuҐFxJc ^7gRr0e޽"JYG޴GI 24؜ 2'!thNRٜĪJ9PTz̓9p3lRM IA:)H8%cGZ[bp=OWH/Ǽf4ծ7Y/ʰWadC!&^ޚ̢pr ^H&^P;3mHzP~~ۉEo'MwO`Iњi͆`I`Ql :lv MZo&kڐʛ ll2|sl#O=b}y잊7h1,ڛ-T̼o>bd" MZoؤ3?6EMZjwg9j~v3b{f!M},^gc*ߛ79@|<:BbН'PL&Of*3sud^DMZoz֛ޤ& L*lڃj*IM{oEݛj)Λ|j=O;Y3](^<ђMiq:֟,4M?iIOZ֟ڰ}Ǽ9)tis]yuuzr9FP.nG~>vh$\בRG:'Znâ-x0# qNY`~m^tVN=3\&=([$|ࣛ8)u۫~eU ѓ{{g7)7x FG\#H$)N[@+#S^J ;Z?J2RRA"M_wLcLG?NxWb#/V@DSRՊ @2M+W2TZm6 &9f1U_\UJS+W\Z])>&fT6xR^g[v.쪗д{QzAW:_¯ bH^Byoshimi-2.3.5.1/banks/Splited/0002-Strings and Reed2.xiz000066400000000000000000000120621506652756400222750ustar00rootroot00000000000000]]s۶}ϯ{*iQmyibN 蘭DTER;Ц .8/_: M: Y<OoZnN_Z}N.o>^Nz&s??ս^7- #KJ7=Of,?~ttoW>\BtIzt/i([,ٶmAGO/On.VڻQ/7I& c_uVK_US:/'m[Nj~z36q<:w  S/Le⭂FI,F K򂻻`&5r#CJ?osD+oCuv~}s&n|796׭Oɑ͏`ޖ߂xɆ4JJVA܅ ;:)}oM2- Y:N;_(k"WZ;L7[a5DBj̉0ZTSa<?/aqy%7>Iͽ4MٲZ^FAxo~SXu&/ߝ|81Vx)8W{G* iGE%u{>:J"XXo2"CE2+ 0MJU&yf -> ]4KCaTҙVܖ3~BzGێ'lkioVH}1}wq9U: c;> B )$0~At>+,K׳`E'uFCP*'\Ҡ?K|t^SQ̞jD9ixkoºė `&螂RS<ꚼڭm-003>Aw{0XYrtPmo鞺N)`Ju(C_^D-bO2E/W0[s~ հڀ΃\U"Q7(3}Ց*]-Ig}z5Gu=MU+ o$*%mylނίlyE-ZꕮT2hzÔ:*^I;9g g,:kNF@Y ]p]5?n v9?xN{c{Gs9m~c xc{o]MG]Gn wBdyj#9J[T8.gݢ=" dīXsd$<;XSLlÈ[j6BQ/ eYs$qGz t(^X qhgI5|w6ʺlePgh{l>>vl~l E4CDYyXȂk~n Fէ` آpha^0/Z9(aF c# m08kMbˏ:C)!F w1Ha a00RC)!nnu $󒤾zfa a#1Ha a00RC)!F c]0#120\gs){!F c#1Ha a0?Up00Mq a&4Aؠ M ЦAM6la la&6Aب F$F7jK0QCe@oub!:!Q;Ay8FFpG8U~ `tºAKz<װߌ PFF ýDkY~Xqy|`A@'^TʊH\ fNO4vsib!@45ڵxx#X!`4jH#X!aR-̩q65m k4vO4@Dư~Z7֩q?.i69H Y5J#w"ȟ40j? vM\1c*t4u/JI#z QJx45pG)ik4v,6v,%`4jH#X!`4jH#X0@ iDՐn5,PmLH}+F.Ym>58%wڀ}k*`jH#X!Y1ߤ>opи,0#1,2{5,4V %ȳ1gk ]껱$ְA56#ia!kh 54J@DX-X`X0k&,PnE)!존W j|7"-5,\c U z cii^#53`OQ5ZCii1?ňJK#{(9.7!k u;*bq(iLҘo@KcXlXb7v`u-lZe6-45j/q2965R=51=|r4Xܠ`F0_JVâZ J+a1e,d@ #(˜FvF cV)i0HaLQXTXml$6LR/Ia4# ;VKH-7AaXh@21˧\Ow$5*8('^#\k^#N+LfܟJq$/9]iBSx5P5J.2%M^>E4C`)UbUdNî.^ky1x5pY[5drE}%Y,F(߶TjBo@}X,/hZc>ug$uR.O[-e`L1g3uTQUErY`1,|v g tKpN)Rl[br| A&F.K(u:.b$.U`{_bU+|SQJü4cj˼Św0Ҙ1\o ؃ƔJV{06$-/_Aj{;Ω癒 {w:hJCI!Ǖ2jYovVi0:Q1#/ 0k bʼ]XbK3 Jyˠ+/b.8I} Bꃃ}+K'/ z A?"yCgWJvZd\]zwY/ ;tWKMF̓*C̜L`h9T`pTbnFd;v(؅pr JF9opGI=Qg?!7qn+!S>=oit2>G(e̾/cgG`]!z򽽌q=Uu&_Ø:~atTJ&Ԧd${_ ֙|Sl`gwFAxr(^~뎺=ykM.UΌTg3ĭ3 K|v{QzS~Girv]-FʘfkEgλ'LVԋY+81͂u&ߴ,ºϷ!yC`I ˂u&[eBb?VΤФu&R@OTîz,"=vnG*q^LC=Iz`~:uX03iI gLZξA8ldR-2(ld2P#p=Rd:oZ,z+uk:m29>ܹJ^$29 h 9g;\>rOf:֙Τu&3i u& mdF&ߝed)|A9*N>v+/Ιy]8'@Xq牖gMϏ?@3JIEk.ȷu';iINZwRRκj:1M;$NvzR_34VpUC׃uTWspIBʝݖ)/Jm̔dKܥ!Z|H%4E1o߃ h36!*Ea~M+Wa1zS[~0)Cq<632L}4rEM\s5rEVh.MN4xrJ}nۇݺ=vٜR+MS2C3ꥸ~e!כ?_Wyoshimi-2.3.5.1/banks/Splited/0003-Strings and Flute.xiz000066400000000000000000000104511506652756400224140ustar00rootroot00000000000000]wF_ĝsN}k鋎 V $}gu]h%lDJ^ڐ^fg~sٙz^ΞL׳CMQ;3~~{X̶?/ ߀K~mjŲ/;Ûgӹo9k,:Iρ4Kn9 1cm9 ZC֖ZKk>b/@振\> w}}(Rlɭ.|(.>Oa_[,wa]Y@-yܱ}[Ύ2Pf$@|! ?Hy|3n499kkzj5waOI #Ly4U'g\Cqv>׈~Z.=Yz)'$Us|ZZG &д~c:DL^qZc&l)iwX.% DPezJ6_b2'`A#@8^bO@2 ,&:]d>ߔ@Ǖ @>Z J8\jSZYwA f1[0W<G``gL1\"'w?娔ܳnD`6ȗ=JsND,5;pau_S7ʥ1&#*=)Es'hGH"C"f4Ns†_.mzy>*o0#-eǎM(yuoۆ/60G͟{}ne C橖0)3[`B& {n5a {N=i|=}pmf0E 3J' jiecxM"zDG7_~`b]9F{vK0$3OZVj< Cە!H.~Ļ1]1oG-QZq6˘ k1!IMUSj`sy@>~t@JJ3pȃFC6Rފ/1&yL\V75fec)X.S o\t9:2%6WSBk%^hD/7֗cal| $''Cc*.a8Fq?os x^+̼<!(9xw3OVK\. ~!^U}2=͜D?l*6bs|pcϠٞO8`HvBOYN{=%oi64fb#%gpK&Fl[&t\" ;B^OG_a{cLf N8z5s, ОT;i,6=sًeJ3;)TxJݗ[֞=R)9ޔ\U[MҒhhkZa\9jw2!aV-Mߩq;BvqO[k*K7Z<[H(I9 *hxQV < VB*lHjd*<8Dx Q'QWkdQ ɭN ^ E-to|eSvy>NCU8p%F{+jztߦ>hgد+9@Z/Bɼh`ArȡCFSnM"-=(f- 剒O8Ug; '\$D;: j6+Q"1;zj-ZEBqbZ@DR\8'U@%ً2+1`EQRxE + BƩ`{폝@6ɃULFGT0( &(ڠbB4 *&U0 ^SbGI,B*ĆT8(.&|8F W54)ؠW""`R ¤>>U`aEaRD)-LmHcV4'"JFQŤ )u+%| 2(Q\cPSR:GZqJAQP$RxdNP dZQTYX($t=q*ԡpRb=%N"Ub'QA@ %f7{/ڠDI鋊i jDyFGykR(V+F`~ )VND@&J-U{B&Pb8oŌ*T𚨐_CI'P.F{y*sRZ@b P݈bBW@vV)JR`mV@ID&aH_WԚtC]PP2:PH:0F:=H" ^ WJ©0Rt҇*BbH: %VeJTi'(Ibb] k@T1">Rx dE$2m 0Ψw[A %vqRdhi8)Ɖ 掓hrIt4N&whEDsII+%iWhS)Ԓa 齈DnT85XLB;v)g1=Q{`}QbcrbDKT,U b OPGVAَY3#md#PdS&+P%҇wuZ(ynRKJP5NcG?ʖv5y3pu)RG]dl A)4 ʓ请+߂btB:d\7~YàÒT*TLԃ$#Dጥ' iΦڜv FCH$CambHO27*k>K[%jϬώ|/ً;xlroRhX.^$q@~"csNOZ W7Mg;Z%7O "eA(*eݒҜ +fjCڛ/E\{;Bq>]Qܽ O! Y}|Bw/Q݋'pVv/> * w]v?f5\,K)J$Ś,H>V"ÂxXVe TRɋqUGx@ɜO"y{pm.IdR44`5HXe2F= >/(ȎJ=xP\T='Se׫>\L߇ M5 *ÃE2#G7J<ٚ\0X#n\C}anF/mFډzFd@\GrC )7t`rC *7t rC 0*7t\(vqp+ Evz B{WRÝLE9m4oY%k~yTo\ch:[G{:_6PM"ddzUV~}Wh"ap:~e?_b1ޏxAmwF\yoshimi-2.3.5.1/banks/Splited/0033-Choir and Reed.xiz000066400000000000000000000150751506652756400216410ustar00rootroot00000000000000]]s8|_Ej2[[qmlf_XDܑ)]QJ@"ݔhO2Yn l}~ק`s(&i}z{o]}|?>s4No|3W[qoϗo0RtʃQ|z?~t_ώ8çMZh4/ ^3i(-ոe[cXzqu~}s9-w?ώ")x{<:;գ؟ >>:K~P: >)6{?]7۪6>_pzJ4#\y*xE(^-OA$as, /xx&::*R_̧*\S҇GزdE&%8j/ Ww͞7Ub[ۏWwk;w@,H.߿pf5 3;P n~-y1힥rRK8]=f]_yH$c*+U|l> WϞty/_V>?:^l}:w;Ь\U6hB[<۫fs0kun^cTe~NltQ6LJVY$'mBʑo˳?N?`24pg2qJjuo^ ~iL@lZSMv޼y6VM5[-{-a t޾ls`dsފl#s`7رG}5GɊN,,2Z:[ ] _F{1%bg#QpuaDjtbXa7aFa F `0 F `0 F `0 ðv0LVIQYzv0[a 0b1(1(1(1weg' #2b[.wzFaFaFa ,hvQ0b#Qpn\wð^0Wa: {_arFu֯ð~0_a: aؠ@$lԙ%al~ :lPgbv$m:d30;f0γ8sg`6lsbwx0,=mg0 !`;$~hu 1;(N LvX݀ei9hϘ=qZh(i9`:ZDЀjЀkkЀkЀkЀkЀkЈk̴8MB݈kn5FbjX:h5:f?-hTmbktwd/XxUЖZdyvW՘nux%m`ăfh`eh5qFpMQ\w8m7KF24Z4Z4Z4Z4Z4Z4Z4G0@4kе"Fvn-&筬9ei_#wd.ZZ.:\\Fs(];@z]ojklAPd@ݐ\C6m9 -*c(< g!Xk(@СE:tBk0F@0H@t&Ban[P W[&("`^ Txov E dn'# dEd6m9 "hF-;Bx.AA heh] ֩ F{Eq h^c@I"W2k\a(8]a(4`Y͘8/Gjkդ1Q(W8Il5])Hebºd؍V\ IjI۔JʣE趠RԤIʇ"I:c#̄uYUMcΠeoT_N8kyTbot岯+oOLy\< Xm)yhxSQUbe\ZRyFkOw}{z`NvO'"VxH&Lг]9PL TgtpG0gHg~lU|DTDɷ2Hpr,1\]e/D-D-"B^f?4ֽLL>YV p:* Xm"=vP#|RPȭGFz КzYLdozlZ ;iI^DeLo#*u)1߈p0bPTj%ƌ6HsØFSf9y`dv[4H`fz RJlhQ.N!)*.;%U\BBSTL1z")T|d`܆)(DSP0җyH^J u)ĥ+Җ*HZJZ3R#`$HRPD:L̒<&Ą" {k)$IhbzV-f#b8h5FB VԵC((*ԎoԯuSLIPLd`J fp9c] (x i)x jgvF}Zp:fPёsvh8YYzYG0A?7Nތ (6ų`)&qܔS!b]8b]8b@wGq*pyK?Vp֡A[b&d$|~ǡut=p]LYdut%,|X Gp8t$Dvk촑5#k< NAN+]ڠd'dMG+hTa"u*E,t!bb ۸B<]AiFa$QTda'8B ]wP,6MP7l:QwB.~QH׍b p&e} 5W{3(w7Pd(@3:(@:0w Ptj;(@7_, dCehd].s|0@1b((@([r]W@Z4kЈkй5s(g*3T@#Q n̡Јk] )r4G#qty:\+l\[Acƫ]T  2;H5 u$f+W]A?( ;QDrQkNuſlAz 殠g\.J^A({j\Z0@ ꇺ(@bԲGvQZc=&5W]9a܀NB` (h@R]t݀D2cI&!2%.f(d2SK ֹB-CZB`G®$*I|$Z6fIidؚMR&w NWY6ƴ$҈(K'ZS4Y-/E٧)>IjpY 2'/1.vd]~8DGewj_evrF{()\jg#ȨmO^6&^M_,)m(x$!N(ߙ?H<ȑwg"ISn-H;n"QOxlgYÝ_y&;]g5tgzvR279x//Jw|9܈k'oR%^9^K/O*dAPo1,3~̄3 Lln..Nos> oKBZ˅8Xx>]$5.6gߏnFc/'wͬyzžd_ӛULb7W&m}_G&;rVE*xa[[ S YgRzB&6 3?3+C4xm&_yx7ٜumblx&w9xSh s݈iƛ'ً(Οub%M%Aq0/;  6fO,~_ћT"vMrz dsA(&ϝڽ椫f{̛Lo6d}j5dmL^o.6h 96ɤѼk\,(Edqcc2p-? {2 Cs&Qc/LN6&xCWR~toґVdܡuo:#T,']Epu3Y|ӓiZCFn:DA6r{|L}'gPss9iujAu4QAhON=C 3?Tu]YV}ճYY0r~9+#\~&SQeD榟ŗ?kY]TϡT94r#Ym6ZՕxȟLwe h*ǿdtv~]-NzcOg8.nn>\_ywK#ï"U.:dGW9Y|࣫|t뽈ߣӄ%8ߣS9Wx.k<;d~ˢ~!^'Ef-||z s?n&[n&Pn9_kvfuD|wO6rユ~G;xuۿtz?盩Vyoshimi-2.3.5.1/banks/Strings/000077500000000000000000000000001506652756400161105ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Strings/.bankdir000066400000000000000000000000071506652756400175200ustar00rootroot000000000000002.3.3.3yoshimi-2.3.5.1/banks/Strings/0001-Saw Strings 1.xiz000066400000000000000000000046301506652756400215120ustar00rootroot00000000000000\[s۶~ϯPJ]3I:EO5ǖ\I LB6Tyq.x))sSK`7 omƯfg;݇lLfOĶWlR(lGNS{s2~2}anȈ I2 d=[=ɭm.ݱt<=ft'4-Lv=-D7tFR4Yz\ksJNyGslK4'$Nv38nю ׂ^"la4GO7 ADSN9WDx:x j6_7W|u1n~\ѯU8h[ E41Dz-o(BWӞŪ9$qVk\k;Cj쏓Y*і؟ WUFlm^5;(6yۭ54dVp]JcH g {%'/D`tR ̵II6ڛfT9UB| 9!w|Q>&WחʹԵ-x0q=uN0)3Sv |,,c9 c ֳȃjRn[j:xk+IЅ$A`%eOZ!lc#xO:I ;R@|/˂H7k;gL´VZ @6@Lf϶Bvƭ2Ya| )ٖKl`V;U~Fz]?8!;=J]eZZM  J{&N'hpZ~t6Ɛ=R+ؽIiX^leUK&veCڑ|['{Z:DA ZͶr YDJsCH#IyFVTT%3Xܘe ȕ1Fhy)P"y&BG@T% N{Aۆ. VJr7?HJ1D>KVau鏍Qg`D!~0F| G=5&]dufE)Ue.f"O1!8 c:%s*ECvzP61ej 6Jt``!rB>4 }j}r)cBo HJpԸL\.R{IQJ>3qY9Q6N=v&DT;PU-8s 2FBLBx3$-H-4p @y`ʜl}elBn#Rg}1Q%&mj}耑d$iIqd|C-ް.]ٵ?η4[Q:ɚꭺ|IND= z#UBͅ,xn|$>8@ANjR= ׁ9$',I F`G=ݾ]Ö!cf?0ǝЇpL=iX9,a. يHhҸ|K+ơ@l#ըvA?_?F|t>~7Dk Ë :{"V0') !^M:1,u޶ü p?K+XMͽi%Ԉ`ZD[vʋ5M̧PB Z£Vt.Nǐn#eY^]Rƞ?%l.խ!C'aH3]: rA]lb yfy_ѢU}𚓋>ˣ}=k5n_쵆i; QЮz\B, =<0F0I-|Nmsh$ ڪ6@PVx8CsSp!rR>5C|6%j)wr1NͪR42$eH,N ]hITq/΢ߟgޫ';K4] =MGӱ YҨ}6WR GH[ߋyeX(˧I,!K8iI09@ iˢVr05S@@HF, eN\ *Z!-}'8}I9fz/n, qy+8|$˄iC# ` 5\Pn6O."+\y˵J /;@42^.Hh i]QmvdrE#@c.ǻ$ ~?n,bNI{_/j%3B.a/1=gBGgށS`P,cUIl.i "ed 3_h-el.'dQYM]=t :H$.jJV u tOlLcX#:M'cKed Yl7TѼLi|ނJ!\GDTBmQPɓQqBIfHZ>tmK9b&:ex .cxR"XYҊ=' &Mew/(qt$8?V9bI;Y#BYm6{e-)uf9it7?L27^?Nء1qWuoʒ2Ž]Tp@sAؤ&C⤶e兠 Ep&a2, ULe857|ir%*o_~B$+PBPB;*Pv(ke(+mU2cePx3 &e2, %gS;eVShV2ULzeVk>{ekhuZNgM#ܶa+RD ze etcꕩo``YS?ŪW^Qm`/f[F厗W핡kUGƇ\vA{:5{BegC8;v0m>*ʲixde{/+ L7g{{v (rw4FB77 P̩i>sC3>> P(=nNM=|N#qlC~E^#WtIȘ^,o/w+>? ~~ =Ǭ"dv_p2q0_ډ^6|26?"rgL{ERs3/8.Ua0Ag ߗ8D58.^3 MqؚeC"q 1oK Lw3Tob#.y Qmc6Wyoshimi-2.3.5.1/banks/Strings/0003-Saw Strings 3.xiz000066400000000000000000000046631506652756400215240ustar00rootroot00000000000000\[s~_{zS-*TlpyKQ$$v~}zef#$GOQ/3?>nֵ׍lqbt֯]N/_nOq滻og(wyݬ+ǯ4.Zڴ6#RvCw/~r7Y*4\OV0]5kPDC?WEǓtv=\kKrG7> hEv!s@c'k ,=|P7t*P<[f8^[ k6踡d:.K((itJ_݈ۄdza6k>pa%guA9H_ [:y8|HOo`S'ښ,w?̉a[mZD^4m*WӖeۻzY&yUqm|G ?.f~.$[8^4T!u]s8GֺXY.6HCR8\#_Sf9rhKW0dC"_$4F ̿L?䔇 @>7Weaj?kN0|BlGHHYz𲱰o2.Aăڷ艀CYh'q8G*8:H"9yb޽b\J 뢗ZJ=7Z`{Mb{”meK$&ZW g2`L"arI  A ef6sH֌"DƵ1Za| et%HKgיsΐ@ihh=-.^gPpBno`}1iZpYa?tM5ׇ-Q BٮdWKXxn2!H9A7۵Z2$_r5h[WPú*mߋ:܉LJ$*hfrkM.Ulvș1@Qn4I"{ƿFG{@C?hRU?mV@Nip(JV~~g`h,.@A=)FЧv>i$}Zv{*ƗW~^=k h|,} HcaELeiyK((ĤB8ս QIP M3 ː#ǽ\ZvidIH/ m#+"-ҢlU CHN#6x /_hW8c_Tj5N Q7 Q:RAB&ynS(5&hobc q@{(E9IIByh$#Eس M"4Sz&;^E= CT/sR0\!S>w Gݯ{K=miٓm&/WJ 5S6^^B o QDYTYhT\A.uz̻Cګee~+:(d1}ncI N]eDRx" ]d*rHwP'6:0=Pxd&1@8<պ(EU, ,C A'0Y˒8PW0ܬ<恊_~ή_K/d%[vMQtD^Oj8{p 3ms"+QOQbT(A#iة' o($#tMDbWb+(%b*LVLM֥zA`USoܓ2웽NK*KZeavoYV{gKU֐ ܩGBQlgc+Wo]2 { %V璲IjLQ}Ԣ9E=&F_Q9'ݗݾ?3SUƑkK1aэсc1yzǬ)v5_>mbiCnh8h8Mm xÄ40#7LIr+]F#bF+RMNhh0Q`zg#Gw>#-yHW_ \yoshimi-2.3.5.1/banks/Strings/0004-Saw Strings 4.xiz000066400000000000000000000052221506652756400215160ustar00rootroot00000000000000][s~_=mU"R'@vť`xlm2In2d9zi7-ɟ}^ONwTQ [=7棳~/>r:1x۞mG$"[QٚMI^Di~b_"1~k,#'30j 5QڣDA 45AdmYI3&EoqcdYV1$VvVr V8ʅEn!YQ\PltkΜ km=ƩӅOб <ӑ||zIt?UC~P_~JBcOh+Q^s Gzw6#3}t TE:UW{`fAi#J(/}W\O1f$'ѮOn[y ̭r$ 偁H⦭( o@c\JpFU[Z9_?eO#Ӑ97k $y4g=~ERN.û8-J郅wR9NyȾt<4O$?B-t%2(p9lbW5Ka rR'> QDs8Z)PB*wB"0Rƌda8rP(x 1MKlwɼ3>G.\ G4^]3{YB͕8nsW q* ˆ:1Rȅa*l8B<&{p},%djsy #9i1O p#+{#pUE=ՙ 7zj؟Q ijudHQYwY*-JTlIQ2d@7 ʎe{`(Շ{v%(+`3 IPIP&AY3ZU%OLJY~R!aM1Ú6ޮi/pذax 7H MR6 r*|y`Fp_;"..%ODUr?+;e(wZG4JX7;oyoshimi-2.3.5.1/banks/Strings/0005-Saw Strings 5.xiz000066400000000000000000000046401506652756400215230ustar00rootroot00000000000000\[s۶~ϯѻ+Qn3q:,O5eKF"uxq.x)Ɏ;yIB-ް.??m7G5lqd˧9,L<{cY;qhD|-ΚxzII~њ?Цk;.744?}õuOr~ Ƅnȉ-I: ׷Wzр-;kg/Z8dpL71<}faԋ_4Ԟ%Ή[*[Sr3_ME:u>EXƤ/q# Ɏ(iվ>a9NuS ~D> x@]=uTȏksEdgfj:_fꆿ3p]7,"y6z[)E45旪m*BWKTpI~qVk\k[Cj쏓ف+*V؟W UFl9jwPḷkb$KU+/9̦{(h)X \$~C(7]" g͜2!W'-rVU%Qc$y0A =d^$9~KvMQ[$ r Xc; Hv,}yJɠ=Iu< [V 'K؇cxe2GPEuQ] eNWnND$W0 K8!H0YU6PF+* UNR iCdnmѣu:Ӂ5*XM֤ۇ"}TW'CJECdAx,{U} *Kd(2@ e/e{`S}k@Y B (02̠2ycHu^Ҕ{ *`ŀ2 zVl{(ÁӞ5<Ħ ΰ{oA;<Ve]Ѐ1 (3f:eNeP0hQLj@eul$*iJY]leVѰ$]|f:-o&7I|lNVi1IYcwXoaOj@dwZ^ԟ$PIMR0L >Ci*ԛ۲}/7>5'>^R; />RM+Q峷/?׎ ;kѭ2CΘpCvJpC5/¡]5j<ʮ(?n1tУn:" Ƕ7fo|.-ݘ+=^\L'K~=7D.k^[q w1*=}#.HO>\yoshimi-2.3.5.1/banks/Strings/0006-Saw Strings 6.xiz000066400000000000000000000046621506652756400215310ustar00rootroot00000000000000\[s~_= 6lR' [gE"xlm2m&-e6yn}Sݒ>8{^7~jk̵b6Z~~r]̦!Rvg[ͺxII~54[6 f4,`5~HvkYRI,!H.A[Odd6OP PZBfyuIJUr?kQfp 䇖G%g*t;CX髇yS<3tcGnX|j˃Og`ͮa_|:C1l!*\KzF`ŢГcíN^Ojј fѐ{~I@VV ULBx-`.BDs$MY3*`"+I˽UbidrA^=~$_f+$f;x$'jw|EJN^ewgGuzS=hk+&-F+%([zVq-PE] !*-TapG&WplevI O{ʬAsh*e|Uʲ~kT:ȃd2}Dhy"!:2AUS0(1(KqACTe:(P2#yߙp R}-uǨG^;׎@!+эcΘ<1;~3Y$ܬYƓ4'iion:! 6m nzyGo+$\ʛWz03z(nulBw;BCwܰ!;㬟ed~}YbGޕ;>S]yoshimi-2.3.5.1/banks/Strings/0007-Saw Strings 7.xiz000066400000000000000000000046401506652756400215270ustar00rootroot00000000000000\w6߿PBN9_)n_t[$MmMw$l K/kxnߌ?=lֵ{֍s-v_˧?F˯WжOlR-(dCӺYO?i?/]xOi` Cݭ럾zqNR~. ڈ^K Iq w悴J_ xՊYm0(, }KGOm;X\ ,t__D|7s"^[DZs#ȓWRm8B*|ܲ^y#R6&UƳūdJgASB2Y/kumoBN;vxu; .@Lݳg9#2rR]*!D:\뎀1VⰀ.t$uK -kI +ZⓉ%Q㹎Ebq[meA$/fWck+1 f=X#PjcC8MB|De:+ϷM|f4ZH" mH[b]Fp&Fj?cp=B]dZER :k"u[=Ӗ\g4MV8`?v4j4Z6 f4,`5~HwHXzeCڑ\nk'iWd<mZuA<74q')꒔hkQfpJA ?<( CQ^T*wA",R$H@\;qy?(e"ǻ lq`SfT!$^`9iVd0{YL8es֠qT*ȯW19Iɹab4P2{` 5\\Qx\dBv=.qAB!"hqRRq3QbA$a/Eb{T&>8u 2Fs-tZx>.BB-46Drϔ΄2JbJLVeԦ#I1IӒPE0QyYnyȄ^Қ/l:^(90~KvMQ͒ul"4mk&os\Tx:ֺ*zbNZWuZ3{^R%uލ,:0*UiɟiyL*lX|ף[@s{ Q7ows -ŗ JwCFW2#E1yЇzЇk8!Ce5Kx]7Q6c鸡74uD8mnz=_#WtI|.+=GK~=DE:#4wo 2z.#|\F+wL7}9S]yoshimi-2.3.5.1/banks/Strings/0008-Saw Strings 8.xiz000066400000000000000000000046511506652756400215330ustar00rootroot00000000000000\Ys6~ϯPJ$Ֆڲkɝ/,6p.x#q% \,ͺqMv\˳Czqz4lN..'ܱmϣӿlR(cwxO?i7/(\3XqaΡnFO^r6QF4^OeA8k=l62tDCz8hx1'7nt>4''H0$>haj_u3*֯\j ʸdG! ia%NHme>q sa*_ xY],KS}GGOm;;ϱ"RS--Ru_`p]7?<~4[ E41Dz-oç3P(‡-%$:,>墊׸6-^'|/T-?2UAt19o86wPl̥7kk&+M_6Q(dόqgO %LYLg\diL~0 24[Tfn3H2><.OJ[ kG.zBm V9/<)W9Y#0qGꎭ= Ly )Y-P I&6rc$a ]Hׯ`Z -hOs$ S@n}/#?99`_[=V6s 2Cid@D0-f -ke )b+[KN䟻HW}}c.Xa';~+k̕AKh,^ >AN~g`kf 9FAvOó}4"`lv%kZ4寗Q:%fvH$j$2lM+?A@iynib$)͊꒔hW?'Oeȕ1Bvjy)PL~W'P!$$}V ]A>9d=>=4J1vDF%Gf:F0Qe3!Qi2 |L uPԗ@>3e;Qdx` ٭Wde@:WV!2uJYЧg]" g͜2&ˀ'-rVMK+٣Hp S, J7@@O =T8,?"%j;+]Fѫb6k0Z<;^L'TJHh># 8%X)QN` qb+ιi%fR HdĈEމCeA)0bZzFx2!hTO$Dg +qAU_/ꛇ- 0rp- Tu陒Au +oP B&њ*ܑɕ0u{]ރ|)}2}E^W c$XQbC$a/Ej;T&>8s 2Fs-tZx>)BB-46ārǐ9„rRbJLTeԦ#1(%ǡaLQF{ed5W1e# QiBQOcy+cXm2dޭaݼ3և7DҵR$vDM8ȋnBm]WSh)utK:wt^-MmK4Q^TӋ{h( ꥓ |ㅗx)eȕOVU,l'fK(qrN; [3;A Dkg`.&}G pFWCJ~㽅}{DB@`2[/d*mW`2ᓂϷ &15|,܁K&`IVj,,L> =(3.5iՠ S୊M `+T @Yg ]4n݆ e.i\ V\h@YVhAK^`A A%4jPԠ}KP6utHew))&_9(˷4,5I}琓uTnwiwI}'!]{Ү=n۫zzwiMx{I}kוzqוTyGqJ}]Q|ˤ~K3-s0?lkiyDG>gTz|hao]1l֞7 F7R|otѨ|d|#RGg#Yӯy$}P#YdK;+x] ?w:X`D6^᢯=xA4'E҃x:˜H#CwAKC׏.C;笗2W/el߯HJq=Z>٭wujωKS 摒N5/ݶ|i:f?ġ';wQ0ʎC+iU-IELdzh9M[U=Nva!Y\< v_n|72ͼcI>uGwha|tk/"_[gxGQ ÅVtR1KY-&i,h5Kv "lfƙi AsQ~K#=  p1[\Mn4|lhD琀>',tx_18^BTq+m!fFH룦X'qEz%/ً9nnwH[hFpT2UM`@$+K [G1#M!%[PPRkZ^ & 0/f´x~A4kݘ8C0PnSPRB3%yC\H*N_s1 A.׋BB/ e͠ Jhb6MDSVNt1g< :45TlsUK"+$*]Fzf|M[!K2F@lr@+r2yGNr'CS9M$- JrU3 ; e'tGIfb~x@PԠ*?gED{!!p`"_kRO \aԑRvh.Dne&P~@LUqs'ȧϒX6 z2{#;tژ\3,Ts \f`73"$p8}\Pr#J]xxnc̴|x3iûDy]t3Z\;q[sa:hĞrp?}Yw" 66qJE8ut@.d7o )Mee>m܂s0 LVRP%ymxnWupk*G:Ȗ6Rq9c.-zl~4 eiʦ1 *Dt$м9ᡎc"<}5i $jP֔FwV3~t\ ,`~8*GUh2lgY`;H,b;k|zf;NzMwn|)tg:j w֯NZCS $[l1 Qd$Ŀ˽aئHUWS%9ˢOW[J^f/iv8ERShLPd[MHo9o19ȥƬo;W膾 Oq ҋ.u^7u_J{ǛxSouio}V=G,Hi$7 dkՒ_+??)V~pݖ&; Q{T^ yC@y/5'yoshimi-2.3.5.1/banks/Strings/0011-Strings Pad2.xiz000066400000000000000000000036701506652756400214310ustar00rootroot00000000000000Z[s8~`yO!fvhbfM Ep K˖#C 3}SSH>:;$s7XxQxٴޟ7,t" /٠\Ϯwv]8rEsҔ³PY@Feݔ#^GΛI4K7|xJ6fNJ<6h7=D h#;Y6Fa$h)#Mpt2淣d6miLVQ7B:مd scg0FF /?ndZyǒ|&w^Enc@I '^bK ![/L8 X:8-%09;.LE!d>1> ɞnsxbdXoR}E`x?reǺNh&LU2i(2{ 7_dzD i 7s(ITA - uGdi6<(< WJ!J*ed z!veUh+V_NBy7ê*Hu5!MKMZ,?QɫAE H࿜02"f+=7ݔKtjJ#,#9Φ+r7'7M 76ê Aّ So{,V̧ibD+חq@ad@ 4s䑽hU.Bn8E mnoy;,>K#=  jp1[\Mn4|lhD琀>',tx_18^BTq}{蕶wuu3X 3tPS{'yE:%/ًx_W(W_#ɆnŖPT7%HbR@DiEÜ/mxXAb(fĸ)d ^~͒*(10pnrrm]aZ~A4kݘ8S0PnSPR̓B3%yC\HUmZbĄ\/ )KR"06ZR,?,ojD;hz%uzΑ>[LH8}C8@SC )`i$ EW2&_G7o YD' 0JbDsB+7.W(~$wz==E>ӤJBRHVRjyaG좸.zz(VHx9^#D55<8YQ;^Al0XS;XH)ni"2ofvg(? &Љ89`gID rE=MǽJݝr:Rma.TQO Kf`73"$ x܈:<_h <7.2fZތgn4n{~{hډJֹ2=S'p~Ep+.=pd)17yܼ%~FَS~Mwn|):Mn3CU5H p}ZCS:SF.[l1 Q:4Ic|3&ro3# GUaiq oβӲU,֪!Na"NiTT1V,[Nr[e_LNj*r1k|U?oS\qK-~WR?n閾8-;6T>^.-=< OЪ[i"5Ya\lؾZ{4ASb5і.G~xmib@zG/߿*0$Q~O?% 25'yoshimi-2.3.5.1/banks/Strings/0012-Strings Pad3.xiz000066400000000000000000000036431506652756400214330ustar00rootroot00000000000000Zms8_=%LM̔R 7n% ²%yeܕM?5Wʼ''^^ r|2hxo׳Ýk\w4T; (lwr if/OiIG(xwR|xd!K*-e%E Ldzh9M[U=Nva!Y\Q‹/4Xf}-lr7n=_6XJa0F*_x) e1$m.MQqfz(rF\؀{&y꺹" tӥ70 X/K Uouϝ(L4 teӐef'TG-\@.Q"[V+-uCdi߶<'(< WR*id9 z!vUh+V.I#o*H5.MKEk-}@'a1&/w+`ي7M7~9">v6\l<5Ԯhˆyz1j1;#AX\z̙O(bD+Jϫ6~2`WL1ٍ[,!gܢoZ༜IpsBQȆj u -&7>64sH@_u: /! p*8dHa1wUvCGZ}Qx>("z=MM~O$+9N+X_֞xIBHKz)t`!b(fx(d /%k*10z; 9K60-~]ЋeiMtaDnB]M=@IO6z,S(J˅ZPʹӗP Aޮ)K4Re"PZ8 kI|XP)vn/fJeGrl10;lj)Քd$_H ۻ|LZIx)d]zM8aJ DJDѯx~ʅ?2=Y_yOs&4,QU!Tm&˃ G}K=qe(KkOt!b+#iOofwb>Qmq X,4\&wQOFq/ROghbsI|2:XPm (+s->ˈ̮gh<h Fcx/FiEw=?SZ։6m;vS Ξr{x~wpi Sb-rсn! xKH9iԷh4(5]#訮<' Sd"UbKY.s=z[{ϐ9z[fꖊS4(\ԶDuRހ|Y(k"rp"CT4kґ @']g!gtwѝtXM} ,]? NIL=YDَS>;`j&7𕡎-MީL1*6 r0E<*M>b1uʞ\66j%9e>" T/1,tmE3tSo+왨u"jEOOj*bQk|U?oS\qKש+_@NuxώxSmC3k88TC}4@z|ż1>Λ\([RF/`h[|U8?C^+д?Gr7 G7 mz-#wiK։ϽH# ħSLm*U(^CS3K6Zi~ tY5%z@S1rf8GT4sz>?SK]뵭 L.a:kwG6"xyPqb-8/=HpS)Ҹк̧[Q䬊S' 8\7&2r*1Lå hw}é3d7tJ.d3bG܂4(PO.1d.I kF!rpBAV4Bh*k^P1滊IwșYFw\.2Wv0=l E, lElg O?\vʃI ەժ5&7*+w@o^6L*C9{ AilEeBq|TZ|1B5u{!J->Br'+G*IoMemCcًzβ&MTc ;Y,?I;bR#[Fج,{|/yjOx,:Y}v{m=r~gNM}ښ4n=,j{&܆ Q?uC#0][Z3F`t6/G|hB9Z1ݲmņd) be0vO~4Yf}-aݏW2_[ٸod!!ӕ^4  MɎ%$Sd[&^3Xҵ(rF\ـ/\4r/ЗR+lZ<ޏg+n `VnZR@Xp T%s?> _6O_-D|+ݝ?:bc:#% ʽy2[蹐J1?il @ !2qR>GFwDvLv/l_Noľ!JYPth5m@.k\fϧ(Zȃ,f_'A& J%H9۠7dϞi| )U\ ^+thq?Mob>ލ->Ӕ (n0[mc8N؟ԧ=fwQȒ*-X{"*xbňၒ+k? 7~rn.0ޝS,W7bo6Z7GVip n܁03ѺC0˛ M<}/ež<KL 1SL,8^Fk]ϰGey: 6 ){9z[^[¯tCwPˍ`b: I YYWRMVRlFB JwcK?T*mB[7HĔWjreB=9:LR=(*;i@w"t+)ɒMե'^RV7Q?{azpboy,]Lzeo< 'Dwqh͏"9Y_JʃL}hHڏr3`m܂ y,1әT<\ƀu7Y}n7tL.esbũG^<Ѩ)uՀ,Ec ;&ЇU$l$(i|wCEx7n3-z}׹sYa~8ts0Tz7^}F7/& lW W9ꨮ9hjxmT0_Ӫ>' : nx~QJD$RNJsv=a)1۸-/*(ߝd*BeY;mf/꛻N|LQ{mO|>GW=3&wƌΘw d;L7+ynF>?ZV! 3[@Ur5C[t.ԑysA5qĹ^egyM s΂\T]s^AMy;|(Tn㊪p.MZ4`tc-tU#VYircT{_lQ)yoshimi-2.3.5.1/banks/Strings/0015-Strings Pad6.xiz000066400000000000000000000037071506652756400214420ustar00rootroot00000000000000ZQs8~x{H$!0ӤC2@ r/a؜-VX$ fT^W~+*=8mk,t#.Iͻ_n׳~Mi:yQNYy)Wwު?+}MR,h٧a힦Ac, xԏC5 t^B򍎶G7G5MzwY2-m\=H] ~99[%db  [;%6X0W{ǙA qi?S˼p4\*o`W G?p?pntuj]Ja^]#(Kfx_]GM?-yWU h%ܝԯ4 KY3 ȑ [s߇,j*^X BGIl=@44 !Y{"qR-w ["`DUC)\c_pZep%,hm@)+\CEk-|AG a1 R֨9 Ǘyk?&wOƃm@&Gqۊ@nلEN>m* |i8sPŦZȓrB)v' 4#ݺrIp-:U{DꝢy)̘kBF4XSaxz=5* }!8Y+ \L@&* ~pеZhW;LQ܂bA;E(9,[oJהeWHk}tE`@{$WR,lŌX@zӄﱶ,C[p'0"y)[G_5ů+j1)L~-YGT'ɒ,¡\G/*iBk䆜E?mH͋JKiY/0(Ŗv(wPW_y"qFt<ꍮe GU1p&=i_CG.مԮ .[i%LY8ɧphDYT|#PF\I ƋM=َwp|@F 9 `JT=(kBVl+3[ :O+PA &yFry{ ]ƒ'78LJw>=<хdGv|oI?`=hBǀO_ 9(dpU40B*tv2,`:SՀ~64 IF|i? tY;J͞S㹅'V k`ltCeEu~1U=vm9M.B].CAtrZ8lD8&^[4,=Hp헐b4i\Qh=НG0Q嶎S7 96*rj1¥-W}ICtXu_ s̸!!֊ChP=ꉢ"a,@xj5"rp#CVBh2 A\3UK;G4A kp9`;kkNSTt Av*ͫtV`qTq]~ ʾ)G \M;RΞxG0DnUb[R'G$#TS7Br+1 $'(A;ˢFU:M9g/vl!l+-7 +,v2ze6-Pcipk|nֿ-n?/C_~?uЭTSGP}zɢ9gS}~FNS>q|.iᏧ4icf'ɥA㎦^Co\} =x5'+I -IE Ldzp9M[Uz9wA!iz)< f_4Xnf}.Fn8ގ"[⻎KQ˅V0R&M-I,o.w1,"lfǙi P  ~wMq2/?% [Ub9M",cxfl rV,ܙ&!#L:2ްJׄ[*#B>(5Ud+@un,G !(kRibήn@]:y|يչ(C'fCPA7R>eKtubaej$dĀ 1!#|:ɦPq>/{"@l:"wxr3P1#Q"`0P8`P6aR>;^n=EΜz4 #]-FLBr'v%#ݸDrAp%Ukxͪ$q i1WP/ l.PˀjrcC#? \e`xiS. C is8`-:z&A^NFu2uJ9uu>'F B-.kJ<$!% YJXH:1 (BK/uqrڲ ilu^N`ER&  Z6D&k7,ԡdɒ,¡\mP 'Aޭ)K4RE"PZ8 kA|VPwjD;-fJe۫Frl1ӑ0;lsj!Ud$_H ۻz?,zRb&08p0C>*cL^##ѓuz0. arK%]}XBzC%A=?1/dG*j`d.?cEm B#!0aQi_+Wq\FYbVvi.Dle$GӿG7;C1A68,xx|}A.+t*8!J9d{n60+->̐8컨V_}4 tB5e@s1xFiE{9?Sz։>C3t{v{;Xg>(g\R32l8ux].bR="3aBZ'H)iANW'x5Wjo?|O,N(h:N 燏ͻ}ӻ\M/ƿpya{r ʏޯ(h''w x ͞z^wErx2_nL70\7?͟Qٔ35?UwhbXl톩`C9{J o8u䩱P 37dI5 z{stÛŰg!}(0lRSn~Hm:}ݚ>/'aGx^B29ReEHP ųz OTcP12%PzϾWr #D 9L'Kr;C4aĀ<z.,c_ hKiM೸\ƞӀ(6ň(pY&=HFF+ KbFB J6 D޷4{-[^5& d?/efYcZ\Q ǗJDڵiL~!YG7 lIVry$RxҾCs&$({NH9RHElVւbyA_l8NKٔun3-}|NHY ը{wª #E(2ZQ7Cnp=^&%Mt #,)E0=\fwʌ9)/*yOQG5&74*Uϼ(h (.>iT(V0IXOO,\o 5M-*,3V4mW+' >jŽZ5qW(ݢ;:UN^Oo-:Q8,||,uAa@BU;\摘Ld~4k[wUJ}24_PB5mjB3-k`эQ9oj;f4yJ|sшP p?yi" k{sQ'` Y[BFFӬq{FX@kp(p痪J0Kp͆_{c d lr)?Ĉ1hL'5OC4zNRҒ1 :7'"151uU`3I򰴊d7gYtZVeXU+4{^O}4ڤRShTPf[OLo9)o19i*ϥo;W膾 Oq A:}WB?n>=gǛ{w?o(}f{]{ǛAh-"U7 9bE:G,I jĸ&GB\k=T?o(VۭxbG=?*Խ(hw''w"xJf5WqZ%˂l[N_E"`uϫIX)fЪ2TOY$}8TtCw@ dq?]2^5 2f@D9 1!쁆uzVZ)D}?GtrInP@F4ȣD`"*fP}$H}m| Hԧp$BZ`KRlŌ@l҄ﱶ*B[7={bYZ]ЋdinNtaD.B]X'=R,K+*s԰X?urȆ zN^dJf Aa-){L -D-/O!|)J^̦eOUkd-&rܒ@ a=I ET=B sd(QZ^z*e"8Kh6#.%P= LLT60.aW +HadywU;>E>L!ʦ &y\QJLPE%asyb~x|K*:V81m6KwYYXt5rS[M;j_50=y[I{}=5P*t\c''`a9(dpd4QW՜N`$f>SRTq \fe&LJWb+) \}=@3@P_h cnT1FZ>4ut"<λg3Z\ Y١}wîubAҰpa9N^zu nDi`sb..rVWўF'# 3LH9$w4n,P]#k' 9\U2 *1¥< s=>\y/9zŕ2bw,ʁu\j0N?2h !b'14yIC &(.]愇*Mgkb' 9S;pz[H ,a~8(C6z5>9rJ7Uq[:_?ț,p~|˾qW9@y3jf{|]WfOsVw;)*b"vj>Kj{!)"w_]Nuquս}.Ԏ`OW/ĵ~xS <t1!#fuĔ '+=ۗKqFP#ֱn;8kvCÝ*y+wT!q<Dzl5'yoshimi-2.3.5.1/banks/Strings/0019-Sweep Pad 3Wah.xiz000066400000000000000000000036411506652756400215720ustar00rootroot00000000000000Zs6~#@`r7L&6}[e ˖dC0s.jەćO/aؐ$i?o6Hƞ=]5ó~w~\Y~aP,_n?b#w$ōKQgAc?+>9IDRڸNBhI#M0t4Nw|4_kEiܤۈP,AQltm-Is-լAԾstm }G0Da:7FJ||JI(IU;-ݦ0 咸%@)+Ĺ |$=/&].n8W]5Ӈ;g<`f3!kWZȾlǪn2ݮ5$Am3Vcq cO̅4@IK,VՃЫJ A4;w c)DxHQBbi{fԜ`v}#ub2%}Dz8Vqh.Műkk-}fZˆAN&g@9[3d8}JݎRwO'ѭvSԃ \$&Lȟ- 'I b/ 0UmwI)X.PjTe0yDS*Ҝ8W`rըKA+,2 c2*Y$#E!~:),rYm)WJs7`sf,8Gnk]P&Jl1 G̃ço*Yg*Yg3 X_$q!%k sY AMi JE⋽YJX/-CZ:Nq'Pb")[˕ RtDFK?IYDTE9Cj60Yݷu~̂  x+U/" eha-)v_yFƂ m :_/v%b2H}R] :8K.YIL8oZ:KRvab*$t (882X10҈CjBͅԎ DaCSzQv 3Dθʉ Bz5ʨ+mXwVVDN M1 鳓jEhPd2) "wB*ywf %$ 2C?"p!ҩYߋ^.SB{ =BHԌ5q]؞!L:7;N?滊Iw]͙ Yt;U1bY*v-lƲ;,g;Eժ5&G* sF0_S.)Nj rѸMaf:8>I-1L5 vc;MOT.V7'GS ^ֳ@Sў*^Tb NiB|:O Szc\lйt)5ACog5] rI 8vSåfQ;TVY)C@eE/ݧ'yoshimi-2.3.5.1/banks/Strings/0020-Sweep Pad 4.xiz000066400000000000000000000036451506652756400211270ustar00rootroot00000000000000Zs8~_C 0Ӵ&f\)˽h-[l9 oeKdCnL^V~+KHqtٶ>[$rcϏ/aw]-?EûBv-{r~'/ݰS5s)~qԺY~?Bv$")m]LV!w'm0t2r2_[Um__nP,AO‹/ &;;Y_셃},"ߛHkP) )) S% &YH"Vt"DkJ{~@&>6h=Њdz)*OKyGڍ# ȤR pIvLn d4#d1bHAr3uJ(l@Gh1F;1N H4Hys*4]Lfҝ^jf#kX:-klڲ{,~=':@wT*)y )l8|QW:S]\M@ueg:O:Ճөn uNt>G#̧i0%7 dՒ]K?V:Vӝx sjX85\YhZG/o߿20H5ٓ'yoshimi-2.3.5.1/banks/Strings/0033-Strings1.xiz000066400000000000000000000052361506652756400207470ustar00rootroot00000000000000]Ys6~_ջ#:ƓrEckɩ}a$e3#Zi)ʲG<$luϿ>WG7?mhہɰOu~u~=i;|{w~+_ٝAx6+ZD6i]1yߺ&U zIN4^OwuFV0ʉ'ܕ6 t:/W3 X|vOُm:0bg7j:z~UBR뱌uNu[ɬܖ,m9^s|\ ^9&eg*'{P9mEXo>y`> AƗߦJ~ V`Lqze(w5'9#9CAGfL|0F l/~`#tUX-qF $ַ,/׿FXA{k6]҇VdAf@u{N',Ju ?p''߮'Ж͕?x:^D0c:s"w9 ] ݕK"U]X\? -G&9s|C0k4|sw2H.~K&Ol90z]δCA e엾1 h{"vLCɼ01@HTXPjqw ckK4毖%sH:If[ҖKn!H+Z](!<2C*b8 ?qLf #*QL'PɧgF2zy^}t G>x)y z$zlG*fvq鍺}0ϯt>zW7CG?7ǃGG8Ay eyqD3 aNҙ ~r H)`6 qJ7a+@]9d?d5Sʄ0X.#E%8h磪|Z:żXe#37;Bo)yJna1_f3ƟEw2d~5$(bF߯g)9$4[ߋ y-QN[Vs1K6` rdw8f)(˥*=@TMFX8 8=T4 SL|[w7[]4?Y<ODШfIىR*`W ㄥ[Qޫ"^waZH"goBQQ~R^B杫3 ͗4`AH )ܑUA`8h$Rv暼 5zn"eG׊1udB<?R%N3dAf8B`Tuo[ 2ג$xAD/S:5u@+w< ?]fCyCnɢgy>Q$^!=cn)RCI%@Sr޺䁼dz o.f3ZN= lEn数cqs=;o܏lpLo TnE/)]}IvPi3M^j4ZVH:K)O8K/'8HZK =l-ß5K_)-5W8IA&B ?05puhl9 7gfMҊ, |5YN!2З;u޼* ;p2x Pab>>V/ŸaH Gt*w(7>(37ȼ(S᭚|7(ktӇ~UkF5M7b \ʚo<@o5;USߌzp!N2dM!N2:eGY{CP6bE:=R2vW)^(4 l (3G@FCC*egP@3wQ2i*e>MULUj7Qݑݑ )PƟ8lT2JIENF!/>~pl߃;EAh(پx5j":g"jZʺ U,?^*eRXQ#<*eRViT֊@Vgԙ2|ld^)ׇgoyoshimi-2.3.5.1/banks/Strings/0034-Dark Strings.xiz000066400000000000000000000046251506652756400215320ustar00rootroot00000000000000\Ys8~ϯ#Li$F;`8H-Ǟ_? ^$u:^% }n}mk,Ǿk45fiEO1V_o' +caoI b~Qִ-cKPwؖA"q bv'?& vX f#XŃPbcC8B|Hex֎k0l˨',hZ6eې"!1ʄ`,Fj]?cp}d4r-^'Sf靶.IiE=QԺҵއH5X0~Itq}Ț"Ml۵CiGr o-?]$j%ͱ6l!*bKzF5ŢГca0I *RY -B⟲u ^ 9X˃|hI3 c")9˃T%birA^=~1%b̠x=(A(Jx ,St{D|6r Z:;̧EBg`[@\ktqD!sQEkJ u`Kё'(u{_ރ,;~2cE^,W,;}dP`A$a/DlT&>8q 2Fr? {h"}T=-LZ6il0|-)S ³ =Hk*1Y[WmS} $yO$QLK"C%MGbwkc&~.n鈷Ɂw\Ҿ(y#I=x8 WB9dҗ vNOFVI .ax]0E,DqQ]e NVBD$07!0U4e~jI͂vG*',i'cdzk5hWti,*٤Z]$.\%Ý*R/[$k` eIܕݫ[hL >.(CU\Lv5'&0d80 0g*P&o ɂ2o]2{*ke~57OPhvWjl]~m6;yl0ne:@;r@~ UV5re(JƇiU 5@Y)aT8Ҕ(g%NYH?Y,VаI[URvNr"W^Jꫤ^>PX~vUj[lJ/yj[C?3vWY=:ReUV0LKUJnաT?TeYաAC-#TY}爬>ƒT# =õ@N DtOS&g}^3>cs3>vs.,QIv}'iCOqӆp Q47G1~C%WI;7si`ru5jP\)M] ȡ{= ΌjC&4h6ZXzyY!zJ˱L%wx95/WjzLqK̭c;&\ ci'W'4nsG}qЏԅ*-x &qz4 ći|W%Ol;{ϱDOoᡚ/bN7 ʜ X((Kw۲ $ >Q;H-[YY?mlʶoEV(|/D-P>f]n4;bWc3N]rQEY6 քg WCpK@.thԵT?U;E'3 ܄XlTlLȧ ^d|~y6_]Z#S~q͝m SO\ۂpmAN9vx#SF\0.|=x>0(jkb: K쿣 QM.r;TB BG~Ic%.z䡅4@SrG:'Ly{N;\?gSlkkRrݦ=]M{=]Lm6 #Wp?fNP*_)z|^ǢCaKlG9b鍌ao\E9^0| "GΧ}jH-%8XOpAv>3E'Ř #, }2ϔ0KP '-jC3_(u!Qִ$^G$k܊1U6,$/d_.īdFxqg3^:yܑ'B98Lb9I>%P 5iX8!9_ɲ6DjA0) z]$v$}euQT]̡˒e%z rfpG|Q >-O|`ʸT gFA!OFMKNXI$Mm^ZRiق[bOy{ _(׭U_i,vpsM֋vYDjZo=֋9B$^^[ii[3{< ܋.x |*>Z:KYjA^|G v/Uiv"wHqffT>%=ܣ[47&5^{,cjvIS{1eY{JfL_ ^ݫ:8Gjy2Uٽ3cKÔ4W#Fr\ yoshimi-2.3.5.1/banks/Strings/0036-Fast Attack.xiz000066400000000000000000000054041506652756400213220ustar00rootroot00000000000000]s8_{e{8K\\EXt-$9M? )P4m>t[  @n`z~pwܾ ڿ'I?O󮷷>HB򣼻5+V?hmrH EB|.v%V$ hdSOڭ(#0|4^_ajdMۣ)HmL=1YmۭB%HuNܑyt=q/GW|ruqMݵ.KS6Sގm:x[G1E˝D|r=&i@nW*Ph%)[oa9>K__le։iI(|n^E V%lM (kt~sR) hG! 8\ D$5臠 /rFQ dp *\ɓ K}mHjB{{w +_X8d!-zt7d=a/t9@ݻ(nąȦ2srvq9(U)>;9a41,29`5Qe-FtEI9`\tH#o']~%Ak8ĭZ]dt?ON4ݷz]A#Jrr c iC0"aahZf5abhW(q7N &[2t dYVye %`ѣ+R 2WW(E$`n XyMӫɿn&*sͣ6"30H!b(zˋPIgg:5TMԩ> }=B |nc*/zFTn{61Rλ09RA$N,E%J NJz0$B#U,oHH$Xoff y'񎰱a9U,{vg)tW _#WLo6$I@B.y O$`yvy uHd[}i]wrU-@|]׎IRX;8Rv؞k.feʺʔu3FgfHD:KGqgs- sͧ>=)Q<9>t;MgȂl~\hBnrF&v~#.qVӺ!iަd@q_zY?FW3 lWڼLH\ >3ֶW_d •ǏJh+ ɝMF&07Zi#VD#Q>/e~N 8`,D~2"HѰ{wT\v{8e_ |! ݜ7@;7Yӷ f=eetp`S6q̱nzPy&s7}SGYg@;rT]Q*# 2{ AsATojP7ʰ0#_ҠL215 ʬ% !T JolP8@YgN'֤/X:H_8{aAY(I:֠Lڀ)#e'D4(&/iP#etʠl#?0e/)^7Pֵm[Pfa Y&!f:R&_HAY3u/jPAx)ً:R&N_65(;n3?4CN/AOkYw׀:@xj~.me] 4(C4(ӠhNHYQFQ)+B)STWw"e?N}ϺYoNc%1h)m9H*4E@o8HQ-RU~IӰL2 vE(S >tLtK>tN`<0Q/#$f!<_Vi 4~oh=QI]En"%02཰ևPrm~A UqݗcJYY'oimB?N!|AF;3#M<&wuLgv$̮A|K u=8Dzz]Caӆj+ iHB7|ɩ 't2b! I~v\%ODvIRPW鰳-%ڕ 6nbr|KT[uf܈ђЦ;z+>]GQ? Q팮^ˈ-K2Ie>__g[)eնE cH9+KRɆ׃gTsX{czO%g*tCNxAFYAr>$Ǫ>x)4Â?M)ղ#tf9iD|miB@(X.{:(Mza& G"OƐ=d _6حTceP^Ӭ&BbjRVJ !rR(2 E&VU\`R 0AAC<\P0^%r f-\ =d@*?&')9Uw~D{RUt0㳒X!lpxES;B=7b[~ LED9&VsQΔu-` rR;&Q$*؋ 5*@ZzG脱MX<\K* S.vtjC˒xGGmW$4Nm7; fq@쥁׋aCC8Ii-Ԏ TuByeMowd7\ r2 ECkJt-@4 v]Վ$aZ3A{_ïpIY%2>}V'RCVTv &9TI!|$H-46l!s £ ;trmTbp mSn"$k'b(%ǡBQ:oȍKlY)toe߂+c5DXY#58s㡸p,ѧWLQ /SB^IOFV>կ]"j4/"= 0NNnFD$/`|{,ه%T,U,MQq69}3o9phD]Q`MqUO\?iɋh-1 mZsW.ݵ{ Vjx,jtGZNhIO{ut4>L/d mh@n|Ugg-I2$>^k`W뜸u2 `:·Yu&>E X&n+~s#Fl Q*]>ł-)< *wmnLyj4ͧח<37 Μ)ۺqFkևFH:ZCB(z0bD=r_#.X͵"Qx0\PxX\e|xYsיGoVhVRZ!q$]7U|٧%+:M`Ad $[=Py(gnٍ;*ؖ:_0Rl={Iw+Ih\Iqf-}-Vpz苖4XkTp6㍬Labr5Ӈ݁wrCiBP2u "PA'K-f ؊PL\36@8Bv;SuSt,ܳg{ L ZC { 1{v9B;`4OM8@QjZG=P;\>oY~vmxF% ^Dd -!M˫OYG ެ(i?d g[O˫mߋ )E m3$*tp|Ŕ9,= - O%g^U: P3O>;SC?HT3RQ}rgN}PR }pGkfptf* >MQ:iwJ>T&2)a&)&2d6&?[*'M#v%8/O#ttKJ R~(7]"8@EDRs[9%ɳ%yPs<ܡP`pRIvfȁ$oMO2rf0}mZ/U*Nx0>h6g|N(g!Ba**=#ڦ$i.:8rI#ܛFhy(*Pk&.1)#XB\p{T?(m*/w61]+CըfIYTX)G!^7Iku\fNGJ펲[ym6w@2%#B5^Q;r9 X?+ñ_Ñ|l]eV|%JY&JY&=c$\RcALӾG#+&XUAVeDQ3ͧ YCtEj٥@: [n6=wۆ/ ~6*1YAXmSn"$_'0iӒ4PGj!,Vj[#AM'[`z9N /Xِe;vMQ捜#e9<:/S:5aXzV&A#y{ߣ oSD%]D~͉TA8HKa^r4ږ NCʫIZ1$]"V6qlԧ*"MQ1rwd [N0&Y"eszQoI[R/+xK#UƷ~~;w=P ̾;vl;'Vu{3f( /;e=nn5k?mӖwɥ5]c#W]c; ŷo2G-/S J~^]"u%ƺVc]wXWjU©룗c W*@5G/ Ib~R`x~><z(=DʤW7kh}0,^+_")HO_.0b8yoshimi-2.3.5.1/banks/Strings/0042-Saw 2.xiz000066400000000000000000000042371506652756400201110ustar00rootroot00000000000000[Ys6~ϯPJ3I:-O5%W;M_0 Yl$R](1;n8bw B>4lqͻɰw],?ݎ;SC?HT3RQ}jgN }PR}pGkfv{* >m:Jc>=T&2)e5&)'26&?TN0F*Y9)p^(jg'?TwA,!Q@ϺD@Iq2!됉,rVU%ɳ%yPs<ܡP`vpRIufȁ$xMO2rf0}mZ/U*Njt4h@3k~M.(g!BoTVzFT$i.:8rI#U@HZݠUՆ`P2@S!z/S.C93?p t4$wAmt>4GѓoH1$>ha/j?ߌts*/܌jX[g2#yGQ eBZŶg/&^vٳx~ɎeS[#mLA9|` d@=uTpCdg[XUrVnpL1͏KyJߔIRGk~4wWcPO{&T Ƚ`H|)QX q_ie8=s4 W9ш+!1W2 Aj4C,3>E(wd}xS&>D@OTUrGR$d#+KbORyؑ}KP@!3(#%JmNIT#vwJy=c$}*.!oԥ =1d C>$ : Ǡ!h,?] iߔzA`Xa>?!PMPd Eቕ"-2 CS)s1v.S)c}Vde\ )B=98̽0IR (@(z1M0rUV(/g_ʳ/0V+%Z ;i;TBzB3mz3a,;h1&Ax'ӬwGlh)36sJ`q42@uJ}&ȥafbz@bG;n5k<Q O l wr|#~֌cZH&:huTRB-4/9:tDyd˂l|a"nE9Z`g=T *M]=p|9HJ b)*&[hq=M/Q^8|C 5SG}2o9wjyD|+:|A2SFTD־,TJgf'AsSK#>5BD%̳DL?(^qwr""uc43Ui/L6T~̉d8 *o0 >[<7P^Ț#f0b#ayv7P/.(zi@=ҝ8+lנ~bv퓮zvpݞXΨoyyϟp7C\u&wO_•ujq+Y3- k`=ֵZ[u-Ǻc=NX_5rmb0'%)<3}KGO'UwmnLyj0Lw7437gm]8]·FHZ"CBX)z^3d~?r . 1bQz0Sz\ewSsۙGgK]TBHb%ɝoyAٹ%yVy|3px1n2Y@ @1tonӻ+cpo%ħprHb}G־vZso +9#zth%k(&KfBmҷ虀CԲÂq5#%5:bރ$.r%͵KE]E[:C_`{MR}¡ײ&2q_zףy>\E`'w2N+  :z6sHGMx v#Ǖu,VA'|Mkhh -s@l@yn5OOuN+RviZV@#.G-O~:in4*I5AD m'A#]nk,H|1[˫mߋ"h.ɨ 6{&(Aqh4)P"}U# zf:!髧tlU~ǐ} )R|if5,O>ٶ, XeC4m!GJsY8d3єz84A62ɚ fӈ=AIBVN Sq❠wy*C 9,!Q@o: @Lw G/Գ5 q$յD. 3Ӎ&kAl(+q+ϡQB[R-Ti/i_دk|6 \6>{4W)U)$|FU:fX2>}7(2Ga2AU<(Ԫh7nXx>mRB-4?pt(Dc-d"jzeh:t$7r+5<,HGTs WJ'TZ@-܇ڗ E=MOF{

gkoJϬ嗷ɃWW<ݧA֕LLDJ>Xu%ƺVc]ɯXW j;oHUĶ0iaHZo^߻8)rSihv+LY-gWR&I@?4qi6yoshimi-2.3.5.1/banks/Strings/0045-Soft Saw Pad.xiz000066400000000000000000000042641506652756400213530ustar00rootroot00000000000000[s6 M`4Hb}WCW2\o:yZ+ݶ Mv|'p=Cv594էq'nǙKc ʏrvg;W~hMv󝼈&?ȡl>yg9h ơϢqA zlDَ$ݱA|q=ZM3kOCrۆOwCsty=$sAbM^-H:'nbz X&u^l+~bl= Gqڪ\=E9]LDSMx7D&xƼU5-Wlgm qcI[)A2G{'qmF 0UgB܉>HI~rQ:n]dNDњJs*ӜPLW.|zՅ ..%~{>̞ 5 Un.XvG]g*=bbdi(dʩdt}s5]^!B 2Ⱦ{O}D@;H~ +9# ;GL|A?PyTMʝlKݿ(VrlO|gCǘ/Ih=IqbGZ-/g,vC]{I )"aeEdg7cl1}Ȋ=^N'|  t":撐mYCJ Gĕ*S.B~m#1XẗG/,2hi--^0(۽!9\"xnնsy8~i?v&յ(8++MFjd]Dv:RL~ʼne$j ]p[;PLD$l.ɨ J,ƿݎgLeq⋐XCN@ÈնQ\$;E1¾x BC7R2|e!VUpycАf䟮uREo?kw}0,?ְczi& s2Zkrdz-) ;QP1>+R.”GN!ʞ ^jQr$Y`&*`Kfϳ/jFz-˴CjBzB3mz3a}V)2G>b2AUyP0hW~c{8qt.JnZvi y5ѡ8$# *&*EZ`g=T *M]=p|9HJ b)v ?+;w)7]3u'VΑcyVg@b-3eNEdBdpLkyʁH>>4Q#D4X]9/έN>nA>M7l 5x|F{y|?~sٷ)OZ-=o˗2quɞKҵy2Z-n4ҡ%Z~q]!u-Ǻc]w뱮Xzu©뱆[n5@=WGzň^1$IJg+҃d2X P\{H^ݑ\KCwc?1ArRߑX/6t|8yoshimi-2.3.5.1/banks/Strings/0046-Echoed Saw.xiz000066400000000000000000000043561506652756400211450ustar00rootroot00000000000000[s6~{J { )R ^h-{`S?rIl|\o:|ZIvOm{ϧlqwE7o].?ݍ[>{#Yī?NQVٝ_~m#7$G>QnaQe+ZHy6:^淣d6i@Vmyt޵GWWmH2vL1>`G kF:9qGbLFx9/ҥ=ٹK`(eŲg7"nv!ٳ^y is[-q[r<B~]+"xƼE5.ts1gn9~.ӥ~on;.PL̑Pd_&ɯQ1l;b.8aP4'T7B&mu{bg]mu$H!m8[#s!:q|ٰ%{^y|3kpX1Y|.A) ĀrLWF~CGpUas}qhS |m]v@CѪY nJqE/κgsP, >ְ|Џ@BY_Ҁ}&7M(4&?^'k*7M#Pn!jčw|AB8儻D?%ʄ_C&kz'8}ڮ@z,aSR*`gqnAeȯ)yOC$\ R0Slq9Q25rŵB 9+ WTTZ[pG&gg0u<"I{yy=-9۽JY_j_##*3\hɰe6Zv\PU8w Xp /̧P+&B3ptIY _@h}M>T ªl:t`$<sD1-I=U.Ni&NYPKoog%'ɁuYΆ(k`9w/psA[ySt^@] )^5] y(UBҴmVȚ/Ɣ ڭF(n:sD<6_^?ȋӠ sRMq |nND$/G|Kcf!wKa6SqnyŠrવcPC' P01AV'y ˍ `2/d/.unxj)8<)`8&i'Ǥ^Э^+Z= EX*/ xY1ۦmۦ'϶KoH 8]ǚPi|[~ΛE|CWndgndX7fn3֍F6ߌEwjzzU(l+iGZ $ i`|}=\25-HqCC=S6twg+5Wrh9R*<j/}[/5v^3My><)i5T,Gu?14e .lQo1+c^^v<5Ҥ@Iٲ.Om(@߼_Zw,N(|v~>lXE~޾m_χ^|r6tx?n4<$Qm #W$K>71MӨ5_7L:B*}0j@$G[ѤUf[G i '(IT7JBS21BzEÚJ~R&nPھmIX4@/g%24Sg31ͯ+}.Z{#64$HyrI]~їOىmAT(VEO!?vOs3T,B2N8aD7. C.BI:5lS|cynD>3Fjf5#uD낏sk[9?qj=M>e{u*ptbU)1a Gk'GSv58)P4N>:ՉS˭V"'IS-)b0VϪZ:^Q{1SƈuSHH }@4jNPlO+6[^[K4"dt9OQLKrA %eopuȖ/d<:Wyw,Žj[ڍf,?w`#\W0y+!+4;SQeYٸ }OF0/Z!VXhЃ7je\.ID_z,Qw%J,֜hO߬E}Sl;֩0Cg˃w^n[×>^ߘw.ߑt/)}9UyLw6Rz ˄%/|9}JGYx9}wEG~7qӷOK<+k`Ξ)} o7'{3W W=~ݧF֍pfy[#u# 6cX7n3֍p݌u#7c}ĝ?kx 4yBt!'H ]> ?t(ApClhP]D=qL#l02EVuFb^w< 7zc]O2XΓ12;?JmPF8Dy`'×e^_~dl'oĎͬbЀ Ow.[pF;`hX{ ?#{HJ`Q^l@8yoshimi-2.3.5.1/banks/Strings/0048-Wah1.xiz000066400000000000000000000045241506652756400200420ustar00rootroot00000000000000\[s۶~ϯPʤ3I:,O5ǖ|$mIb#*I9vY"\}x\˽a]@ym4~>o6kyjޮ._>|z3il{y̦!wGtg;jMqy=xF6VH6na 69KF[x5]1a%+ғx~.j:'wmt>5Gn!`6pLxĂf_4Ԯ%N[*[_F -FדdNxGslK4ze%oNHg>q ;悴 O "lfFGL ADSێ9WDx2y j:[ד*Q7 Ɯw1>YΚ[ގK1P(§=C8(egY㸶v-Ƃ#j쎓Yk*؝ W'M UFt5n86wLl̥w[K 6bC(#1Zo(>!٬%g&`MBO4FrbY~~E)O~31n/rۂg NFǞd AHO]Appsa!'D;z`CP%eExO/P繎Ebyv{;eI$~\o&>cz_f0ЇpLa,jmj϶Fŭ2Wa)b;[lEHoo6 E/J/ NY<NPSfݎNӊsM=R+t}isBX wӰ !od=k(ҝt:A%aDy쳀Gmi'F-/GjsC XV]Rr1d6,+y's^Fk*;ECvY)pZ(jŎ7@Nr/AB%$Mț:`"')˽T춎r e_/ǫe_9x9L8jj5 4^M %5+f@pYωclg` n99c'K@SXcc7Or>-FyoxRSDB:Ҕ5R`pB6qޒNU19iv %Lͤ2P.2^,KP=l2;2|!~ű]=Wko4eܫEE~ͺH2>#-=cKVtFΛLTE_zʈp /EÇP6-THYl}gƒjGFZWӓÍJL֎Ԧ+Ilj$iIrd?~q~ʂ^¯|6^^wIvMQ[ ?r2^&z(.Dg]KaC̖>ά2Ⱦ .*{$-9lNuGyoshimi-2.3.5.1/banks/Strings/0050-Synth Violin 1.xiz000066400000000000000000000067411506652756400217050ustar00rootroot00000000000000]Ms8WhuHLilF쵕f.,ZlN$R+R=~!24?&~}Z6cl"cwu~u6v=i=vww[h3~lIOw2%/"q7l\Uݷ(~{!4^OmI]ГfCe=ZғC& t:ϧW3uhݵ9>?žG#vW;zFK[tU _­~Nr2Ƹvu=Jh` [I{8Acgo n4[?r_H}tFi9P#ATɻw(X "e㚟t/u:qA"_y~Ct=Mǚe[G^% `*Fqt%Y =ZbB8g:\6/P~ޭtaiJ:%R{?g1 璀eDsHR|hߘsm6]T RO&lKƗן/Z=Vظrɫ` hM"<6r&#𒇜U]%De*ZɳCsˢ˒ҖVI,*ov!4D\HS% uvTJjلgonQ,|m3 'gduzrJ ?|$,S^$i '2M<'[Y sw㜤:OI&'OK;$pxsR\+!-̹[: Meʕ~޻|Ai7͇9wvK*_hd[mkDܓH!Lsa[]{+&UX6q6J[-#Ցt]oVAp*IK("c _Hki2QP5KZBvq3ϗ.~d*3F"."wNIRIW QɪgK72*Sh̏&y)^>>y]*T.s}) OgYC2>+Ƨ}n; -TQ1*{h~TR?/aj+g2O9qTC>kg:|nG[` B6 V rgW1^)*z6$[w*(9$5n#+d +y}K;0UշՓ9[xiZV,+UE3z3gg4!Aλ;ZbtDtçr/JOF$7&6JYBμ]qX0 ~y_i2cKSq}5 D@cl Θ*'h6flߨvV޷g`g9e<4 a|blB.˄]tcΈ_q s~ eނ8bL3` q a708Qv/a#qb F ca,1#`0ƂX (Jz9=l0 z6al0 zF ]1#q`:տ3 F v1#`0ƂM$yBRqg1 +ȍ{tXs a\G v \a,1,;FC}0"}^~wٰK`d/90K^Kr<@{IN%a,1!bӓӪ!b  cOaN1aN1a"aC0 cƂGaNFa<0)1#qZ5 91 )%-FaD=0Ld;`0lD[G`c} lt[yoeVЌ#qjr1~j,΂[xpppppq_15ƣFk?k褿ڈkd#go,ަͮ7yI- 9,tƖh_|ū sN39FM; v=[ȃg*ic3޿|(;kȮhCy4<P|(F>G#ʢQ_oT=0 LݢޮVz4?kF_et@0P`=+7I:Y0'L h̦7ImZ0/$}nyR5&tn߰F&o(oΊ5&p(o@Q@_T n&ivmgs6jlt1͖ʄrzlFĵ^=i\Nhn'iSMf $l>ԶQ>}o7Nm7 3V ĵyp3P~4vȪ`D4rB)X`sg(5łQfd F>(S% x ú& Ca0 ]{6a&l0`{Fl0 aưcMNҧL߅]w/]&tQLTKf5qE&m$ɋ詷KԴ/TL)m},[^O-8+G%ߊ[F AQQZ9)qxͪekVl [ EiʨAH\ }qcT& QfKwu{6\u=S.]eHk+Z9D=jQ*{Vnys:D-VM%6¥5xNQć7RU/7$oQpPQYL]~Ё]dfr)B+|};/ "-UdF[9WZY@*,LGMuHT zWb.[Tv6Fś\$Dr̩*tN~VZU.wv dm)˫,--JdFRg%,]+c;Jߢ%8[*W)+ʔ{i!\%x)UyRT;(:)kSUPO[xS]Lx%/AU-T7R+-!HTs> +v(<VUKϝ8upu4[Se&A^p/ pz!\.v'[5+jUK@K/O?KOiMӚ>5}wOk$^I?iqZKNkZA[xL~ŸP#ӷ+$A_L..&g4V‰GδU!G Έ(FQYӏrp~QMKcLiyoshimi-2.3.5.1/banks/Strings/0051-Synth Violin 2 Fat.xiz000066400000000000000000000075201506652756400223760ustar00rootroot00000000000000]rF}WhUSLUTkKZIvX4H 0`!Eikj,3ӗ4rq0޷; Ƴ0zxrwn?ݷɿvsw3?GjwKxO(Ag7cLi?~troc )Ӆ|5YGA Yz:QDnaKzqy~uR}/N"o~)dP Y5&z6 )F oyryo#-`um60^щ{r?wduZlOe&ӤBQnX e维Z_d-ٲ[ƳUt'h- WUՅxw',RA/Aʚjܤڂ|=x.$W>oqu%A4X~Qu; O)F»vy@@LA݆~tqUⅨh8jG*.5a k?KQ1)p>5QD1Jr|3E< gODNؕ MVkljM=V=hKХ&,jkݤG3?^Q8vxx%/԰:A$03@f=c_o*z%v )}$Vo037w*rAw{jE T2҆8pc8b+4֓E.s#C_7 l֩zwz`o13vG Zѩ媤Qg@q,|UXka=TBMIE\V.mS+_&gla,H7Q2#gl(4I( y {1D5o]W?h?ROsc1?`֧ob}l}LT@iCb|zuƧ8x(kg< i|z?b}2Y*nj?knpS߱М_|C4Ě!]ûI+NlC6;ctz=;Ãv@4k6M@%-a<'Aq˃Ymrw zWLXqo(aqvz&/ A x5jFo&Wg 4kkHSIInb'hT,dSyM4TW-_5nHI4+]K"뫋˻JjH 5 T[1:yZ77V^m.eng9歼f&mʻc<lc2Vlc8l@V/1x8[GşKv|N8`*a eZ!iFZȪGa*e ˤ-B>rJºL%dY30 lȌ &ewT\kgF6s L63#1"Ƭ jIȆљd aN[Tn:l=d:̀P wT@t3=(Cf8aFTn31eb438PTwB@}f'.:xq#QEES@ǹ@.*% EzEj\XG`مuZ\h7P: ~wPhdEeZ]uQacJz?82UxtZTC9Bk".!PC5~(REݗ(rQ AdK.o_B2G^K Vs87JQnT>9*p-9hEZ:ٽw2Rlrx[?K+C]M ^Y92D^2eMvP 7ZaOOӲϡF)CZGB+}(̌X6algimƛf3[3+5Z؝4c:V5,ޙ}^Lò5Z3|IɶVa;*S҄%\d}-,͞;畟m&kմ־2ߺ۳OHl4kjW!Z| t+798 Ll3e|Y޼\b4jΦ5k1xMRehH /y+u2s C썹qeLCUG5:Hߴk|(cbY޼;'}ZG)Ҕjk)ɤ*#(5Ȝ_i=/85<{pO_Dibz;1z8ffM,ˋ{Ԫb]3lj3aepuC0({2ˮDW볩5&FRo[vJzG +^/֎ZQiz,Zv3]:ڼ2!w6[dv-Z0ZAZ=č廆o㟠]v4dz9ۆwpw,ۃSy`P6A릛lBve4^ȮN\/dWG  M7j7[k^vzA찡aCÆ> } 6xN ao0tQ|P[ 5(ź_A'Cj?}09?eaUz20/aDqSȦa;](ޭDh:W!T2,*;4_-ɵ].fM|W\lK-S9 o]? F~"e?PcI.،׭}:y=R5VC'`0/^}<5a^\:P̋!ńe0.se^[M ݦX*?6 /Nnyoshimi-2.3.5.1/banks/Strings/0055-Fiddle Kit.xiy000066400000000000000000002673711506652756400211510ustar00rootroot00000000000000 fiddle kit Art Horan CC-BY-SA Highest velocites have strongest quickest attack. Easy timbre adjustment; change the center frequency of the part resonance, or of the peak filter in the Dynfilter effect. Add EQ and reverb to taste. fiddle kit fiddle kit extra attack extra attack hi yoshimi-2.3.5.1/banks/Strings/0065-Simple Strings.xiz000066400000000000000000000042761506652756400221100ustar00rootroot00000000000000[[s8~`yOܙiC2lY ;}(ނ&{/|$f'>:>:Hq= t}}z۬טgݿ./_?y|f\9"̡wG-[ufњ?Цzoo>ݺghƁ¨vN7 zTeD-I~L/gr2_;;LA9|` Oe@m=uDksCXUb9O78snmXmk$$ELm*Xӎ"m->ᲊel[K!"5h U*,5}yn %lGIu]|fOeߖV\Ðy|Sps81Y|.C) b]\M~7!zd(艐[^ +9%::' &@Ym|ۍ./JQB-SQZсZu/CrB)!Q@Ϻ>@n{B hJpָ,.^R|$4yl ,fE=`,Dd掷~e͝b4r,:/f\ъe9R #sCWY*%ʻi&?w"1QTL]@,cN<2e@Գx7E-ud3>FmWQ=j{l 8K)݀^껧 1p`-̐ tJ 9ʖ@w+yqĢ 5P;r9 !~±_$ zt]!c"hIRɫRI>021 ɰqۗ聶3!:`݁lYP01͏CҁiԲKc}k'v&-_8[Y?LT ²n:t$:sF1-I" ,܇jLukT~ͯg9?o%?v͸QG~$كGœ%' 'SeCd+!SQO3|N!uQH6>4sQchyG+` Ȓq ckIi*L-lP t_J8Uc=|9pAB& _NHC1 ?5*Hz0/yz(n$DAD@D~dA ˝sKW/޿_X/3V*:yoshimi-2.3.5.1/banks/Strings/0066-Dual Strings.xiz000066400000000000000000000054641506652756400215450ustar00rootroot00000000000000\_sHϧx{H@`0T%"6/L`' O=hQ$)_w㯏kOuC^c/Sf~W:o?b1]F~>J{z.8ҬSm4imbG^n[?\9k}B4pa0Qk XR+adz5&ckCrnͣk>8?hE![O,zv@FA }__!LWp:\GvGL*_8[dxalv BDrle0)Dr}DOc70F|zs5y? ͂1ϷԭvÏ K \y UTw y;V(YFOi;Q@7t[~jZ}ppؾhY'8JĂpE +MJ=jֈKh7:E'z:xj[pR `.-|]sL{[IT0>.]L gy݂E[OL#E}d(?uCBN{dV?9N@pX%+`1|Xl|:}ZQ0yƧӱ4ϭA6>h}dKy[%y'l;r ح`6ؽB ZyW"Gde$ UfǙS2d-v^lC$n^m{yYVű;fWig%4W7l2 QZ!HFuٰ:!~n='T.t%}(I\8RN݁ A4$ꁵ(C S3ʥw DH3v!K#Dy0`1ls+l!e{>FmGf应l7MixStqKDžGW-64ġȜ MfgKͅH5/+)/t>q<=% hMuRmv$ry#Bp"r]4Q8pĸ6-yIS{h:eF03 >c.;c#TE/(KMyD@%R"/| ",Y2%ߘT Z[J 'daMt9 $8isG1-5AJC 6&1;m0Gg<ۗX"ϒ6$nƼq*uFbgKBOAK%32A3y6T(ށ I0}F0usN"FԯGh[K'!"J/0"S12B8& nQΜ 0N'i{NwdVd-ԚP2to$kB12$K\ycHDvC2@ cDYIT#8- NYn#2BCcHdCUr/ecH&ku%Eo>$R)]Pеڧf@0έ/0e}AY/^8u@Tڣ8͵ᠮ}Æw=l!A%kYѼЂi8~Z0NjP6D"J@CJ \O'))t E*$&9P츹"NIdO0A@/4i,Oĥ娌ha?(UR4"hԨzArEe6}b\ÙLCL1zq9~LeyVju2˒wd6r/~$JdG ߪ)UQ@J$K#[FpCnʙ_L+CE!H::MJ-8ZMczzm4qOfH۱yB޻I]Â#5dx{d)I~%?]n2 uf9 SYt~TjnV,g,hvQ|c܏leX5Izf9UhC2r}hycܳ|0Y@w+qVyND 4X)f9~^ʛ9ܑ׏G)Lզ[6uc+$M])_YmJjSWsVW%ZmM mpV_nTH5zAA'3W7Ëٜ )?^#aS? 0x4ךōg*nz"(ea$5a\%60.q\b zC4KɷMLLaěrTCMbhJÓ?Jp*fy C&iݏN^.1EPg`I0JVyoshimi-2.3.5.1/banks/Strings/0067-Dual Strings Oct1.xiz000066400000000000000000000055341506652756400223330ustar00rootroot00000000000000rH=_SdظZ<hciiI(8\/Om|u>׍zrLwe;˳A/>bvVEx (Lwz.Ҭ0ذS꛴63hSvCmÝo}s,?-l= !}Wal~=ZNfSߞzu5Ņ vL!|}z_5ЎNPu|t=^xm}";{e.^X;-؎xr]gkLin 9|UG6% t^KNo È]rmm}1TZ4H}$rVPo:Ib| 2&vf7c,akϲr*xr lw&Ca0> ڂ # @Yigm- ͻ@c sH:POnfwV],D׹2Έ FX(}Q3s -ǫo"nGnς-da{e4!XvO ~i|j_Nk֒ʱ7LP ldICۮ]p:L~kR'!CT *[KۗU:ؐDSJ4%}P.Ϭ[YAHj"A4]@"|ƿHGEtb/н?hGc'O[p$.B}~~Y0Gh,>+z!X~v c6R> cFl9iP6YzIT3?2Od p(rhM3i`=^B.)[Mc8+!}DZMtV|0]}K%Xo|Oa["ǁR{{E{ɴQ#{z`)@ԖʅDH2"ErE0G%bc=^>1ΰ7maֻRhR,r8곷@q11u[4gBtJ1!Hʎ>kհt~ DcAB*,D_-UfG,7-~8q,ƁaǵoyYLUȢE;N-o30q13*!gw*:p",=$(A%MxHdYh1؅CO R%K`{%/$tևU`=ڦ+l`d9BJC5sk\Y:_ϦsKY܆kzeHfNʟ!C52X>w;E#᥉lb E$k-%93A^ M,%v0kCjy{w[\wM{{=;{{!#UJ&-yrD1%(\`uR삲7Sva|űSܷ电EYGxeI(+KxةkP]0sq{ +21uC_{ZP mGfKM{~CiOWx٢2$VKn3BrĪsd,(+pP{)qFr3\whz)QNdy:".#((]EA'jUy%H4T*87tΦfRCN⋿8K-L%jO~ogOi4Vd4|<ep-&ϕ[F\^fZQWv UTN< ;\v;;gwT!OY;+ X*xQ6N^n-4&Ksڙer:P^3À؄|'zrl5ϪMwH;/rjST;Ϻg{$Nԩյ,W`+%.M])YmJ jSWJVRԕզTVzzS{ն iD( dFv|y9>_#⏢:/Qu3ϒy1xƛ*U7Xr2^p)}I]^B>vԌKҎKf܀gh|jҌ3S,QT8o gS^k ePWsv%FpԈ tWyoshimi-2.3.5.1/banks/Strings/0068-Dual Strings Oct2.xiz000066400000000000000000000055261506652756400223360ustar00rootroot00000000000000]sڸއW`M,sٹbୱIȖ-Gq OM͑t󩏿>lƽ}j͆홾xw׫毟}tus5i-k={F~J{f)8n}ag44icnFޡ^?8[} 4vIa8.5)_ѐ$+4|oGrnã[Ss|v>zцCvl0Wҩ[*^_ /ƗdLHn:CSq,AՉې8^q CD65z%`R8`>,8 ZVrc2Jp-|TrV #vٞe=d J 5?D_74Z4oٙ hm$gC~)ۏH-1Vå 0\S K-uPELWˆc11Ƃa{ ¸G){;j?f''/`t3 m"/ gJͬ2npEf I<X`+tu}V( ",Iَzd I g["^6>dͱM6@ x 9$'ƽ=8P5ڈpSkF 37$ "G:Ad)md-m%~C9&I.~'GG0db~5l[/maz'e2!SG0B>Dk~` lצ`Ѣ u<.`Cҁ2|z3KYg=Dׅ<& )UT~רvE|7h '~O-daѨcXvԌ>̴i?t;F3kIX&Q~ "Ȥs>Qn8tLuR;&`h.-݂4}/r/$)Ք rI|1z2;)2,;{Z7FHMMrX c鏌ag`EA)~0|@k#>3]X`eA> #TOސ!X  =Tn0F(d@ P4:~Ge$ UbzÙAƀz,zNRleA]C̼ =)NgywEDd?wSᕙw jt1Yg٩KG2Q|z:J){N[ؖHq̞&sFK:m@Hq{6Q$Xr0-E !3Rt""#DEIሩg=^8n~ bfǶCDt;Yo+i*ݳ +䝮(B_6}Nc \Ȑn<^(&DIһ Qy .(`,QH]ޥF|]6%S80.2ً^,W,IJ  c GG(8#WL@m8 e6n ! JdI6-4>/veŒf «e 0D ,EwL:(%ġP`uD7FV5ƋlzR~߱q`x"RQJu`׎gC. }=4u]'K? ֒<-E() vF_J{ܾ@gp8G@Bj$"G$uY%(LJ ƈ:J *GP}(Pwd?9M).2N&&ki9]#:/Qyz1dț+UXsr^5q)i]^J iNg5R7!FT{3}5QT5i)l?*I}PA/5f*~M1XƬ7"*+q Wyoshimi-2.3.5.1/banks/Strings/0073-Morph Strings1.xiz000066400000000000000000000044021506652756400220130ustar00rootroot00000000000000\s8a$棘jM j/*;b _ ˖䖁̕ƴZuK-UxbQSpl>~j͇/}r~;h 7KhBGI>R|إ'[w<^+}NA8i\DOHh_/ h_ u$V î s# V8a2 MAh>ia,=[l`DU#0wn?$ئP@ Q5}Q&Y葄ka!]U \WY8}8tM1Bwdv?PA 6bV2Dx.t@C%˂iTlAD倒/d<$pt=0ƌ.oH@`^,"b6d|XsЄG&[1ܓtyYSO++I= g!F#kX뢅V9:x Ona?KЪ C뵝v]왺G NOmEe3xdn&J=;X=HpbS]i8#{,;`:eɗu&~n.`St8}co%˧upw]>;[wk.5]f34]>54]>|?ͱW˞U0;Y/$~н5Ox%X\{>?Xo86Օ_X9+nM9bD:G I bt0sE z߸u.,qG~^X`fU=6k{(hwح7s\Wi=Rn}R WasGPhzHEyoshimi-2.3.5.1/banks/Strings/0077-stringish.xiz000066400000000000000000000117131506652756400212540ustar00rootroot00000000000000]s6_=&E'rV:M_8DټJN-!K ӦK ^mC^y7O~g?z4q\)._n+Wwvnz_3^$ nT lͮQb/XxZ"[W 8vP{?x۳Goڛ( mV,Ujn-w"DdUm^^?`q <<4k&:=XRh7ꩶYOnW~on lOo?C _+'+ |'lhbYbmwe V;Lf㫚xSo2-R^ޭTC;qx\\~W~>]h5cU7p6a{kxAqQ }CeI7A%(G|сRarwQ,g[]0pX^p)9lV- `aϝtϺ#‹wA@xFS*)kɗud>35\dU^Jѫw=#ռ%(O"Pao a3P-wJVudFIuƉߞj{2p*2=Bl>6Gg>1++DhTr}%ģQu'; C=F$Ɗh4P1&;d10nǬU3Q l%>El.j@UHgZV'j,W\G*C2Uف(`%oƷt!ibteqW+<cmܺ,ET s c8](GFpzzQBfw27> t&3_Sb\ keslfl+&Jmَl@g 79ILe@ 6e.t_p1ha?e 6Am0a o0&-L2AXa-L-6Ay Z6Ax0o&ߣA&k m &k m :& c :&# & k º& <%OUa]uMl0pra eв z& &l z&l<&賾̣A C/ ²^CX sA8S,[H20A]}aepaуb~ze:@ A 9Gb6 Bi?B趱8BidWA1;B 1?‚ ,3G x-ZsS2P Q a9%"T ]8al3F)},@KcR -XlƂ ,~hi,@KcX1hi k45J ̘h*HcXs,+zt/X:<ۚcs)^OJE/¶jQw;\ ` pr8VޱQ=oԐdSW\Uf5޺C3BgGC0HH$ wR$?&r'=Zw3JL,OoPS'-%)K)_\J?=ޓ9N.%$kܣ$-GIW'}¦ƽp#5́1׼Yڞt~<8~kouXսr@RןU=-ǗvdoXڑA"pQS=7ſ#@vؽCSo플> }DܫxJSlRHdF\T~FmnɄg^XSFIXA)CFՇ^]_|0]go`\n-$)MX".)8X'?6K*P&X+G)1͇X_SAP}˳7]N}NѷzwN|GsK=sva>irڴ-uӒ_U/%9";:_ Vintage_Strings_01 Lorenzo Sutton GPL v3 A classice vintage stringy sound works well with long chords. Fine tune choruses as needed. Add a pinch of reverb for even more fullness. Vintage_Strings_01 yoshimi-2.3.5.1/banks/Strings/0085-Vintage_Strings_01.xiz000066400000000000000000000645231506652756400226560ustar00rootroot00000000000000 Vintage_Strings_01 Lorenzo Sutton GPL v3 A classice vintage stringy sound works well with long chords. Fine tune choruses as needed. Add a pinch of reverb for even more fullness. Vintage_Strings_01 yoshimi-2.3.5.1/banks/Strings/0086-Vintage_Strings_low_01.xiy000066400000000000000000000520271506652756400235330ustar00rootroot00000000000000 Vintage_Strings_01 Lorenzo Sutton GPL v3 A classic, somewhat smoother, vintage string sound Tweaked to work well with lower (longer) notes. But can be used for chords as well. Vintage_Strings_low_01 yoshimi-2.3.5.1/banks/Strings/0086-Vintage_Strings_low_01.xiz000066400000000000000000000474741506652756400235460ustar00rootroot00000000000000 Vintage_Strings_01 Lorenzo Sutton GPL v3 A classic, somewhat smoother, vintage string sound Tweaked to work well with lower (longer) notes. But can be used for chords as well. Vintage_Strings_low_01 yoshimi-2.3.5.1/banks/Strings/0087-Vintage_Strings_02.xiy000066400000000000000000000552341506652756400226570ustar00rootroot00000000000000 Vintage_Strings_01 Lorenzo Sutton GPL v3 A classice vintage string with a reedy character. Works well with long chords and melodies. Slightly faster attack, mod wheel can be used for vibrato. Add delay or reverb for even more fullness. Vintage_Strings_02 yoshimi-2.3.5.1/banks/Strings/0087-Vintage_Strings_02.xiz000066400000000000000000000527011506652756400226540ustar00rootroot00000000000000 Vintage_Strings_01 Lorenzo Sutton GPL v3 A classice vintage string with a reedy character. Works well with long chords and melodies. Slightly faster attack, mod wheel can be used for vibrato. Add delay or reverb for even more fullness. Vintage_Strings_02 yoshimi-2.3.5.1/banks/Strings/0088-Vintage_Strings_03.xiy000066400000000000000000000671171506652756400226640ustar00rootroot00000000000000 Vintage_Strings_03 Lorenzo Sutton GPL v3 A classice vintage string with a reedy character Works well with long chords. Slightly brigher mod wheel can be used for vibrato effects Add some delay or reverb if needed. Vintage_Strings_03 yoshimi-2.3.5.1/banks/Strings/0088-Vintage_Strings_03.xiz000066400000000000000000000645641506652756400226700ustar00rootroot00000000000000 Vintage_Strings_03 Lorenzo Sutton GPL v3 A classice vintage string with a reedy character Works well with long chords. Slightly brigher mod wheel can be used for vibrato effects Add some delay or reverb if needed. Vintage_Strings_03 yoshimi-2.3.5.1/banks/Strings/0089-Vintage_Strings_04.xiy000066400000000000000000000402711506652756400226560ustar00rootroot00000000000000 Vintage_Strings_04 Lorenzo Sutton GPL v3 A vintage string sound produced with the PadSynth Add reverb for extra tails and ambience. Vintage_Strings_04 yoshimi-2.3.5.1/banks/Strings/0089-Vintage_Strings_04.xiz000066400000000000000000000357361506652756400226710ustar00rootroot00000000000000 Vintage_Strings_04 Lorenzo Sutton GPL v3 A vintage string sound produced with the PadSynth Add reverb for extra tails and ambience. Vintage_Strings_04 yoshimi-2.3.5.1/banks/Strings/0097-Smooth Strings.xiy000066400000000000000000000076151506652756400221340ustar00rootroot00000000000000]ms8Ow3wϴIg4fIr][Zr?ȖDRe}s A!o ?4wfg<?4.5]ܜ?|4F2X?Ͻģ?v2~h1ن~4ν͒4 [Ji7NƝ^_}9{\Oo>EѪzkƽdblx6N|>Yo~|~ޞݝ}2g2h*zo>?h% f2[w_&vh݄L1^7?ޯ(Y6߷$e?5>|VAltvx 4,Zꏛ% /Vm""X!0گ:Wi1Eu4йwJ6Fq$ZIAsBUw0(zO+bTGxKn~*+,/ ˸p&t2,W*FXv˫44=%x_>kDN'+[:Րtoō< Ḍ`'ʳߥ!S@A@ ͤB^I{xm{wH*6LN~L"HYsdhՓ[( D³zvqˆ[oL8׺$c4̤&&Z}-`!D%v6,G̾76 Efd^FB ˀi]Bj꺝v*&wicz->_k8h,i5MgG{h#iȱ:;x,H3T>N@Jo E.P{#BQ-Z:=0-Z:p4{ZZ%'t#% U IFeo<Ѵ&O&֌^MsbhPtd6(p$ ` oU4u(]ޢ Mh'?פۛ9C/ Z9S-B o2[ o%!]5\dXx- 73Fޒ9dRuJ8f>b@gFHl\]Y,a>^,3ˌ2#q +0 Xf0a֌Ʈ!eFcXfu f.LGmU9&:a]ֵAXaUf z6ܳat巘a=ѭBllֳA߿ 6(BlmFW, mַA]_ 6 l`0ʷ[(a l6A!& ¸D!eFcXf0!eFcXf0!c!qذBd a, YReNh+:xn`X0Q惽AZlR*Os(ڜ/bcET6g$<;t{C/RY2FY6:Э<7'Cz 9A;tK7K7zFk5$X_2X FcNFXT=#9/#u5ָ5FXFXxn5~R_.wƣnMx^#՟ԭI4ʪhݕQZIӋfARcikjKR+C#%92rҥ6~,[X@\V ̤~w:\t%\{rus[4P78F_ 4Rb75HHU(ZUWTHL BRK}1g\s*\< ~*Tij`~]ʭڷb99ǐ Ւ޽qǣAt%jȺ_6B}7mVw32`*soSpi˘+.AE͢0;a =:6BD~JP^M~}\5]t,h\gZޞ3Wzּ,Z,b?q0s?م¯U,/DYWH-j~IԚ9UDWVthwļ8vAde)Qh? r/9z~^l2w`4nAl;AǖK;ZD=.; Rs=,GRu܇1yRq3/-#eF'R-휒}Z"7z߫L`Qgg9ζ d- N?86w)8-WpMζި댺i;w n3 ^6QߙFX<7RmVjԧJMP KNji[VMcd0M:jXX  N0t=yJC N0tU>yyC ]<]pOx'N! OdT)gdqUc;?b%yzY k2 mDPacb=="]\-y)/$`P]ӷ}Ll酡rU[h'eH6]>Y~% F$}iG4뇻MnPҧ>QxJ9RTH~ٙO_ @'% vm$fŢ.,'U܃*TJz:OЇY(#*5Z6!@m5:Z) ^$Dd߮:#DwdI"|%bS9. ̣ok1) z|?Р$aK vUxk.͸Xvzp"+~~l?[Ϗ?߉L.z?:ܩ]#sڍ[} 'oOF+j09+=R|ÌVL/oFw)ol X|g~?zw Վ>zT'ↇX_F}3]Ʒ܉k秽MEĞi2!^d{퍻=?듶 [.\S6 J'( y"B.wo+<j2_wv_nsxg j7ƁH{@\#oVe;;k֞}/>FJ7%*$@iy .(ݼ!&["o7U-oH EMvނݐxs-8x &(^`cr+i|4όΌЕ2#|`,3Bb#!eFcM2AX19naXf0!e6AX0nbtVcM6amMFy_)Bˌ2#a,3Bˌ2#a,3B<@90a0.AtbXfFuIJ#WtxOޡ035T=3@YV<  V@bS_f g#̬ W@"ff0.7=Dc8渲7 0Fj e*pUF@㵆,ib̬&w8-gmdYQ"2 -(O& Ef!q˲ָꗅӶ#B;sg# %yB=!Dw>"%F6Zk39:JOn`׆(?du>t\dP0lV@[v*oQP BQ欠"T?+ST''T ;g*VU\B ύ.<7<70n֍<)?70mFXcO * HEu 4 JyQ Tk>Yc1TlT`F (ύn<7|(s{+S6(s(/[`zYnT*`TF6Je>xn`X0Q惽AZ LR*Os(Z/bcET6g$<4[t{x}]ˢܬm,k֤͓=`nY-kM% sxn /i߁hUX1sC+p#qwP^Uҗ:GՃ k\BՃ s#s#k<7FXCzP5FB:oP7kQkk,77*pPT=07,Q9zm7kF>9{AT8} PUnPPoQ݀G T6TXEukn 7[=:A ON/ 28fQϛ4]&yw5mܺ^87}wW0AQF%JJ_YϨADn.7Iya ?v)J_5O; %gJd}qB{cГsm`E}\JCݚm{#V'XSQVI뮄N@߇MU0VSQ[ܗZ:I--Clj#B:Ş.ͥ9N``\wuO]R0j?Ǘ7% Ku;m\@A) I]=J\pEpP WRUYht.fd/~N?NbC3 #[zJQ9Lmҭ?ܷŌ{sL}z~rVKzwƵRi~ѕt%Gݭ}Ai3S< w#>qhIFvy7\2`Lu z j.e w%Ȩ֘yG0xFM·:<%6RCߋ7]ߥΖʂs-뙖,e?Wi^,O0 7_Xjyl_ZdJs4s*3,34QWĴK~$Hʂ 4t9v:na޽Xgޠ4شZH-v^jL]t'1=mhlun:{Xm0vN>[Gˌ=H[ Nv[9%(8W=EvuL`QgG1L62$ӣ,ǦT.8}ibSNɶc#A;}5n箷Nwz}F=Z3FT RTQʥa-mC*~S@1}2i]5,̂N ':`4%w| N b':*`贼q| Ξ.8'<ٓ '2{r,X\؎/.gwqXx>/eF 6Pa~ejzD;\=*RΟHJU5 4G~kyoshimi-2.3.5.1/banks/Strings/0098-Antique Strings.xiy000066400000000000000000000077711506652756400222750ustar00rootroot00000000000000]moHOwmm)~.&9ŖcڒWfQF3<nlB>pHzͺ$iGΛnDxFO˟G_on.fo'q 7 ?]w&IY_,Y$4n'1&8mwz}ys|6~=!}KEw(n:&ïߞ׍;~=xw&ab GʈX3(f^Fi6AD҂lKJL^\se^4(l, :z8H9繸wLQMgw&׳B?7L( ҷM__ZwO6\Al]z&0 77{B*7{ jk_k=B5!1rxd$NӥZlaABl.޵1V/ǵbxyԨOjě]Vo.#x),B*2 ZxYXTQյ.-"Mwǒn}sRvy׳CQF *SBf~.U9DoIsp,f+4»^M4>iiamOB vʁ]gb$ /f: x[YMȔC3낪eER߼Z̏c72TX; DJkѠb]5 [eU%l_L4dGO`eUf@{H v$9m:؆*C߀⣝FC6Sa3)z9J/s+K]C*UT;9uPi{1hI&7<2]P=8 6n)DO_.WUD HȩK6OAr^NLZm/5+nK': T(gj(8#rpJ\IlGPLiLvLj^0F#H3AvEafa~f|ܯıFuc=ӟ8b ~@䣦tF@MW;CK݉bPjBhq{`hqT 4^9бq:3Цb Ɋ+/}o;"\__7!5^DQnjsN pS8 0<*&qFH\-(e4$Hȏt}<;"QW5fz=rUdG0<5 *N($y=N%oaby+$ފx wjrh"XR4tcrhegFbXf-eFbũAb8p:as59,!iaXf0NUnU#]w#4&.Ev|jtª1IBwN!q@YYag F:m@Ƀa#M`@ NI0 gcC:% YU Lv!+@؀[6Ww-6 :GYaz}ftJJ͓~q>bgfgFcU'g~L3s 9Q:]6@(paeg%;3@؈;%a"Sja6 .{&2e8=DjyۜU oohK 3@<#MI LlΌ2#qs2#a=¸fNIP~JMN1BgUTc]6@dg#5bO2Eq;`] ;bn1gNLՁYtG jN`;ݺY㠰eT8Pkl8n~n}ܡ'ӿND?p#h9I-:0s(u<d]Z}ܨ)!;4=:ZZ+ZyC0uf=]*9J_`\6Aκ%Q\{rus[4P#8A! 4)6.{"ew*8K;A }$^{Mw:ڷ̻rLe[!=79(%mEu > ԌzvI93*0긑\Zbh̫c"׼^L+WvNlelc}@=/lk|nʕ E}*^M~{\_|u]_ɴ44^P-M{k-4ȼ_"v2yE,vh՝rr1*K֥;5tILNa_S35~{TZ)`P=7},|E`K*dNI^AN>1tE޿1rՔBTy&}iǀyU )}e~)E x#}(>(0[55* tmy -0,ROp wN)|If% ^!2Kkr=J^6Aj?t|]_Hv5!^ u$"P`VДCBruxk$h\!_2pHGNSpyoshimi-2.3.5.1/banks/Strings/0098-Antique Strings.xiz000066400000000000000000000073521506652756400222710ustar00rootroot00000000000000][o~ϯPM,Rw ɁȈP AKs$RG%.wF #4$^f 9z˷ղl057f#f<5.^/܌~Ftps?Gb+x6'a}iRm}|'3q=KЏ7v|%NUZ -& q/ii!O+:Mnr}E[!_(}I0-}ƙ9xz7_d?ػݎ>ƷW7oC>J<ߤ+6 =L0 V6^%f "$K^"")ktIc2<߃1]5ޟ\~YƮ|g&&Wӻ㫻\3&u(J?Ac*y{S\ƧSc`K/7ܖ:?o5IoQ鑿M7W{en#p; -c1Bab:Ά6q,|eE+}R1P߈7nwV% "a(^٧*jV+Ћ0~^ 6㫊 p~Iͽ4V4*GsŬ^&ۇC}sւwdy闫OAQ7F UP+v29h5O lIiam76>>x2 0$O>mׄL1XoXfQWt;]7VIa$+!̿・ӒڢAƺ+@G/eU`zz>0oVqμxVhyb5 %e cEJϐNnF?,cI9t !::y.6MLYl zfPp&)ˍD;?^Ɂ%*jN#CAڙ+ZG=xx*YSy_6IؗG6!.d l h1lU^/dZ能EI$SsuJPB2ͱ^wPbZHc!O?2bAU2ٍ@{M6AAOtf*ZmnwGݷ5#ȹCN޵|`c',3@dڷ 6v!Ӫ>BgIvlsZёb0xF+,ى9LAƮ#qs#a>8w3D^3{I"qZEP;mF$2@[!@(‌+cƝk 9tZfp6|@+59-.N r7ݎ2~mq)?pfPqzCOA~6ᔟGrYt` "C&yZ$%cYvPyK %E1nPƟMdOJ}qaC 3eQj;XqQe{?oQR8jr:`A>납a_F~x^n T`oPZa7kQ%M;:T =sT &_M(mk{(kQA2Vx 7 12* Q tX_ Q]jTzF'ܨZ&{ 5T`}@ |Ԩ&.WٹU*JTfpjP)t:J7j 0\C"JCyQ΃cTY[ߟv`fkڰbTT2cdT3`al\cU6p(^y TX:2.Fgr9CJMu[E=.*O-`E>қvQoUP.p>ԭU7p:u X_`u Xu.Fva݀Fv \T7`{ Xyú+oX7ๆQ݀o?wa݀] xjT7 \X7`%uuaFXQ~4]T7` wQ@qk nb]T7`5v;nk6=b]T7EP5-n@HbvPyEu΍r!`t=;ڸsmNu5^z1J YNGo.ޯvd$SJ1cdma"zE(}^v3Z5h. %16mzrw$9^Rb"JOz:}jv/g}5j=*vff?``#&H.>nԔi-ɽJm&rE̴[ ۛxE'ATFc̃pg14Us1D^Z;ߋ/.&XrTuK9^{C)m" RO fHzc6:FV*dF*hɩ-,﵇35{HJh=4VY~aq.Vszm0{0-\р"4F) ԥ>׳eYL5V6sX** MsOS{Ɵ^eF~XR_m BDžGR$B%߲{S!)u/I/$Մnf,-'`/ OMa(7`jn;"{ESIN0(]`jQ8"} N1 9B,''Ta.Y\؎/.wYXx?]QBڪYŸML?~OԈb]Prh&w::3?q0]kyoshimi-2.3.5.1/banks/Synth/000077500000000000000000000000001506652756400155645ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Synth/.bankdir000066400000000000000000000000071506652756400171740ustar00rootroot000000000000002.3.5 Myoshimi-2.3.5.1/banks/Synth/0001-Soft Synth 1.xiz000066400000000000000000000050231506652756400210200ustar00rootroot00000000000000][s۶~ϯPJ3q:,O5ǖ},sr^80 l$R%)ίB PoI\1 ղvOk^z~p{\}񗓋`y<W w"qݮ+~4&c$vIMȽO%,>2nImD^ˈt%WNWb I܄=ON s61`d4zv:ėCqC]ع^ ,qE\J`a|V7V"'UiAD [ŏ1<łm0(4 | '2>]&p>xj2ͯ97ea6cC׬H[7cB*y\SiPHD[QoW-τ-U<Ǥ =,Fq A<:hF.ę5cUf3 %lI1gNesPyoQe3\u G&tE H+pA>f2'{]NMe 2t22EM(~F2^oB]K ۢߨa";wb6 7k|9B㳋16EDL{=hNcEM L&-0X,ȥ%%PSd\ nH>PBhv"mWm`?Sk̕vV yeiKQe(Vx_``[Mkq4Zն<@m&%&J,ip-8$$j6$j@K%)}U rÍ05&@r١(N32u~ӹ&AQC~*OMu ǐCفȁ(*w?8G2hltzN?o>u=őF'.b(>9[~@FPOQ` 9D49b&`G`L2LTbKzF%.Ym)qj"h02D~$qr9qf[pK㸕/1\*/hI:Im,L(Kcxu~1X?/6=x%nrwlDbgjdvgM]BOD澬N)4FM1O##F2 D$̥D5P?@%^n-ȑ`,aIvcD D o%P>r(s +QNVy幅O޲Yh=okA:hK9[^ D\)fg +5juQAӨADOoE*®lo-Rſ_T p@SA,C^Π A9Q9(Gr/&07'M5}&pdPArҺHQJ{HFgBr\[ݱngKo&l'|pmDۼTArI $栂$/mW}rmPz7} fe} jL| RO 韮M޷^AH\ Tl%9h ]ty4%]}r[+HWA:t{es*H_nsl'BϽ13}e]%UR>h*{ƪOSiC<sVT3j>gTOΟ3v-LwHs?>̅> lƞ'nnxwM)ۣrI}/{{k8>CKx^6A:C鰡74k> lzE^"W4IlK/.]Gsv(NJlBihdu#W~[V@~byoshimi-2.3.5.1/banks/Synth/0002-Soft Synth 2.xiz000066400000000000000000000047731506652756400210350ustar00rootroot00000000000000\[s8~_{UP@[O&̯#,[l dst;O"Ou푅uf|'p=~:?./wW>siL #v]~|Y6x?OhԉG-ݭxg)p ?BEq킮aq-K2bOb<_[ X|ae+ 3|}fQj?0M] }ZΆ7h6Os'\&&&iua¯^Lm"e!(wJE4"ld2F4t Ar1D2SMx輁Y5d! Ac2y5c#!S&VTl87#B*~2iPHD{QgNş*qmW4's T-?w!@3ޯMa`´mv҇2Ts=|eUV,ם.E煾zU!̿L!T @>7ei?kάao_ԖdH#JT'R 6~f *#"N| I@Nj gi>c Ӹ^Am˜lW[/pH:Mv;&S"wekZ] Ý#ˋK]FM.9l.w5@4Q"~&LG}@]mG8@:1:T *14X>F9ˏtӕOow{Eӱ} ᧍6Wǟ@s5| @ܒ'P*aC@W 5~ 󠄆gx$ 3eĤcAR42p8zE6i~^)C`^mG6Q,^9xJ?*Fd80iA6m~/FR H;ߋ y*Y<QQh фLnb%v@w8ilE9J)iBzH1c(LQR9owye6vbD'R3rsl- #9m q* F8xRB["rBtZs!\ʆ>,﹔,F9:-_wkT/"qex$OkZhwO4B {<0hF 1iBXA3jR:攢NL^ԥ5IIA<Ŵ$9VpX_ zD3fx Qe)UX䔌o\ AVe/ Nt|S|8 haQe_ZX**SO2})C%BZɀ;*p! ʾ3(Qt A}*(ҒZU+3ʪ 2VVeIU7+ dn(CVA&+m媇Oe *U9Y$=+W*-jUN}ԫ CpUExsry [5Է+rѵʩozZL}r.dxLofUZaZ:6N}VW*|Hg{T#{kK3cӍуccNJc5/]/Kx^I:ZS鴮5u 6mzE^"W4I${,W0],jQiMheiDN#3/"o{rnaιqT$vRc ҷ9R3׼R:)4Y8-l*>jƇe.xELWCJ@6ܫO4K`W~=8O^yoshimi-2.3.5.1/banks/Synth/0004-Pulse Pad 1.xiz000066400000000000000000000043641506652756400206060ustar00rootroot00000000000000\s6#&uhBLHtz}(#_ߕ$y%SZK]~k=0r}z{n1׿߾]^ ?x͸ד?rErwCc vGwow+7 k~yJ#fvL\nh| q ơϢuN==n |FKxA'z̦ߖ.O7}{tq=$s@b%pEVS/nPfc]wT~-f4]":qCu\b,Jܘ1DdBQ&惶jEO "lb4ǩn ` Ay.?Sɔ67D.xμU5.ts3nI9-]'_%ܭt6\B!,?mP4Dҩ` TF q?NfADkp?2-UAd9nO̧w.2o%6I,d/|'TjQhBvrU(bC@4\dG ,>N0Y@ A5o& c?i9 ҖdpؔH~ +9':$h&>@yOTɤa(g;b%#uo % t+)_,EϒMj|Dd @§D`NdZ2Hi\" sH8b]BvsvWu܋}Mktҥ@lDy?9N- m;vc "=R;prxrٵNC"NpqMv c]ˆ2M[DYuƉvuI!52:̣WہJLD Ьj.ɨ DO?3(퀆#J쾪td;C{Z5tK?zc>ӫ>V}kf5X|zCk[pQHY|/ r |(B^5LT4*!8 "i?]s*+Mcv5 YY)͕UmMxK"Y8'P Pj1J0fQUR/Y@AY1**$Q@8J=*UHyYd jo )#W͢b6M55Z=PbFy𖊡nͷ"5JωJ8M-ʼn`v09J@9{8-EJ`ͤޅ"&eTK]82Joݲ&Pv6e91 "ըfIYeTX)KQˀWӖFrZ%WZfɕ >ʆ(+︕WШRS(dm^B6iدݒ|?l| >"hvIRɫRI>01 ɰ1|A; .Aʈm-7DwH[]/:i1eI >3@x2|anF%&+76u6vIq" bZE(Y]5綎PKSu4M'|S+o)76D]o'No43uWPC=zBҔ :;PvE=w9؀FQ߀zF}bCěFa =թl@w _(7ک?i@}y/4oN|7^~9}#i:^|8_yb/JkdMkh?^tP_ǧwz_7u/T|x`}Ϫm)ҁeC!+W#9 L<>3Y䟚oq =A~}|0փC0c zxW_OWHCz/U> $]_^ϗ8(^1ˈjt* |$!>%gW~R I@fUX`Myoshimi-2.3.5.1/banks/Synth/0005-Pulse Pad 2.xiz000066400000000000000000000044571506652756400206130ustar00rootroot00000000000000\YsH~_IVDwO0kTRa4 mϯ:JYm:qKYT^_Ͽ>wG~ikt-Z__?}|v7i2Z_¦!{K=6nF6Vf QpK G2)ߧ|]lg , hKL3BY2]Mn['xNgp( g>;{ε5!:@â̵I ޟz H C o(LEE>|PL$ۻ4iph_@]rx8 R*ק!U9/cۜl$?25#y>Py j2\`\jtD{\kKǘ XB:BKx]ے{u,6<^t5`2cr3`C >8qʜ HLÝ $Dt[&>1p-%w`w wRo#.Ļ#1])t_eJś^ 69C҂iVĴ<2MS׺ D0'^OƵKPp8NÊ ^ =@m<"mv:BHa焑r{K--P/A1Z!vjsC(#HymV4`TF^Lq?n6 #G̥f8<(>5BROM%} UAJ?ꪧ$=?|HR5,I>J3'OO S؍+O߼=sEG3 }pF1қxh/ႜ}7RO!8 # 8 ݦS&qbĔ=09J@)i%fBH2EB! TL]K wS⸇`Wܧ̟wKݧxp4OٜDg +qUR_o9 Ʌajr<*'`:5q"}FL mhG%V0uպx\z`K.2e2e?##J3ɰQ>*I&#r΂VeDRv=%' ~)Svx-8&V@ynKgu)U6!tIu< bZD(i:T)uyhhq;MT/Xh%lVߨN杌c^eOE''hj!t61bj!"KH- ѲƘUNW>&SҘ /k7]KKw( wdDDxsoIN[n &ۿ*BK3{AƉNz>4 ]W v%ԷdlB p_S9]tAB/bxΔ|ď Pd x"k^39}7xjIOĘ!!:?l| (KZf4L갮 -fԌ P}@|@6! ۀ2TQ @Y k@Ky]3k@!ꋇp (J Pcye7S5;)Ӻ.}Qn FG%ˏz7`&@eml DAeoʌ3ΛWI[e/[>x~3ϠFs?+8P|U8.X>Fǘs?ktBjg=ֵ|Z~]u-N8cmk8UV# [{x0 7H CR{_(Dpar}=E~ !ZhGAS?@Qշ(wY-+߽G~GRb”~?[0Gyoshimi-2.3.5.1/banks/Synth/0006-Pulse Pad 3.xiz000066400000000000000000000042541506652756400206100ustar00rootroot00000000000000[s8_#L.!S\E#lG-[W6I6j/v%Z,׶~>no߽k./Nۿ͸?rEȡ1o塜і~wn[>9nQ'$)lښ1wߺ~)6=ʉF|>9@ʉĊ28ll~=ZNfSkGC -{]\D~!Iz >`j?0ߌLs.֯Ř܌r<_dK l]%0`BHkP,~qcl Gqlڪ=F0'%)<V }DO'S}BpU5.t) bo/b_N}/f~_\F!-?T4Dҩ` TF2Q(ZS4'!:<>3MP, BIMF7WEek1쬼.11gS! B ^XɂělB`VI!Ƹg^`#G*u=KIkyK|{CјXA5b[.Jp٢[6]d*"waTMqW1uȘ9n̿7py"ʝ mDdJ'@§D`M'\Qz6sHv<=T' S y0bDi{8e4⑍WJ]_J9D5  R@V}z ",$pguz| WsI@}$pEOAO)lNE\AXh\E kejMcv5iζSTs1wJY8YQzUK3@u$6NWyhv <{}>(>7CՍhOK=z(Cmz_1Ge@^ac0lq>DNһ=[y ދnhd^Hi%xTn(!xF (ƇTQėg4@bZm̰TM)>: {F fJ$\tX4``/cĸ)$$@_/Sm]R ͔{-vW&#W/߭%v6M0ԡ7)a@$XpcWij>׳O%._ q qcgsNJ<@ E/(_ܔfdA}$L:Q+Kӟ̏,Z$=mӦ6}c8W]W{GN7}^GxɺHnX7fu3֍|&Ԍ˱'R @3Gza/ Ib~Q20/y; KH'4t t;.b*w,ey)SI@៞ i86yoshimi-2.3.5.1/banks/Synth/0007-Analog Filter 1.xiz000066400000000000000000000042301506652756400214330ustar00rootroot00000000000000[s8_!@i!2@Hz/9[NM婍Z>ՊYE[SP?x"?)!Oe@"zjۉ}HO&r~seNnpT1#]c츜 ]+'.|_7BF!L*|RQlXLRDH+ m|[,pAAf~B[6^gꂐҼj8Q̣nQtӱ\m"0Tґ}orze"A>}J^5S)4|X >nw`ds_>n=hOwOKO C^}&0AO!s= fQLԲv zNi քZTU *d(5˝ZTXi<;>_8yӪA52Fe#;Ay \sjj|Gv_ö3`4XWDib/ \b6M `W6k>&fJ0 Y1p]8!%U$BBN\dl!"G;\N=p(5S@)SFܴ( QY MRzVqǛv.~G}-G64^-v(}ثqKC<)- stR+"v Y +`T#3L%):-b#jܑ˕Nu:qltAKuQz<[$>u*yu* {F5ffCd" ['EJdꃳ`PG1RQ8oE铑ԨU ËJ z(l#ߘ 잻UHOE *M'IAŴ$84T2:hbXXn}Ȇ]j6ӽqq`. 9l/9y+(juV{g ݟl*#w"j_u IQF' FQ%($iZӕ L%#ϜPH$0YHMOqHƾqi@uJЊy.YgqOn\MGQƠњ{n5^1E5= ^&zjz/ǯ_ע^Z/r6. )[v翮缸n@'>mӖuM&8S]+ ʵkn|˕a~u-?+[!u-Ǻc]w뱮XzOS=×c j@=x`@/ 1 ?}Ay`R Cyli'EG::S{ǹX+y)c ~<56yoshimi-2.3.5.1/banks/Synth/0008-Analog Filter 2.xiz000066400000000000000000000044501506652756400214410ustar00rootroot00000000000000\s8=K b R@ͽ-w#_-Irri&j?V۟~:G~i?75=v4~篟>z6\~5,k>hH⣌ٖ_xby򠚔*ZGA6^kvIЖ6[,4բIKWԃ,u7zmd;P ȃE;y#RqGF7vϘMEx`#XNfch!&M$|L,>Ԭ=dh ,ptl 6p@,q2/Zˢr\rP~AKh&BNn׾\g4)VDqn\h{f3n~zln#kZ4;k(Ҏts0i)?/2Z!ZժK!H8RɊ꒔`|t Y,\2} Q?`@3]tġBLO IO~Щ ?HWs6\>FugivUx'/;NG˂e0Wc\ A17>E}Jxr9bY)0V^8̩`& كWd@Ǽru݈>H!RgMBu@@F͜2& TA˃2l*Q2 fϓFw;CwRU|Mӡ&G+r(m6~F@-*LMOr8M梶)cW09 @)i%fR ކ "eg,R".Jo+WA"Y г bMs Jӵ)EdM8DG$0QQF/-{=\*{EB*'TjD ̓w T{'-iqQ=2hd Ljd/]ź>>\cz טN=&`zl5 aekP/yrvԫ}WtkՠcZkP_ʂ[<ǭA} e# 5?MwjPwWS"J}y=ԩo>\.NZ4԰7^S `ݓu=zewu߀վWw՝CR_9tw#i>mUPJn<< }3*9e·nB:nGWϩ_ֈ?h!>sqH# YrBև$/d}}j>RGqXeDZNDZz;yD8Nl xC4#7tI@%|Ҩ-#h< =%DA77Z:JKI%*rRVI7ہ?('>@b3ۭ^}QP;vbwb}gv6:~t">m. X"6+~b#ڪ&v;fJϸT=s<TԲb%? 0`Uf$p[?>P028>vb"eoekQSG&4 !(2u$Y*&*V;R\Q,0|iJ7m.ݫB|B?Iԋm|cϙ*d74}X#9 \Sp)}cducd|s{=MKC wGw9" B Y8/m#0q J] ܗIG 'N rl| 󁀏1^.% *XCKhzױMV'{nx#?[:^p}CMB/K> @YOw{-pёқxh/B>̯,bCpF/}R[L{׫ǹ_ܢf|OTL QVO˹rpJF- DRPBho=ݮ@ *B"0RHH\áPQ:&eC]S=׺Oq}pTM;$؜g1+qރQ㫤#1t- td~!Fʁޟ[ntjx#s]lxL9I>ر׻ )SVI>2?\L7Q]xiu"!:a3AUiX0( yAF /RN=wT{TyDe c(յflϯE ^'(%qȡi{ks(ۥxu\'|Z2sfٮh9y'XdW0"4uy 4l|p!Ï\ԝ\ -i1&Ů8FM +/Fx-@K,QޥWOϡq~wvJD$G>=b-ϊ8Z_@-¼mP8QAėmtc,pyvGC5L416`"2;ۅDX|iRët`x+N/C6縷&pXy >!Ð^ܖh_IA|5,naҀ\uVl8;0(03DboD2nl/gLڗ LLtbL&E}dP)\®W :L`2962M fP.u}㓲eFd!P61`C崘At2e:_6fPVـ62igd5[#AY3({w/>e (]¹O0x(<e͏>xё_JKw<'ܞUHAB_APKx(q*9I_ Y_Ⱥ*κu-߭Ǻ_c] zc u0䍷 #R{Ð~@L | dÿhB1Qn;jiGA+V;㬖2 l(5 C@Uyoshimi-2.3.5.1/banks/Synth/0034-Phased Pad 2.xiz000066400000000000000000000043351506652756400207240ustar00rootroot00000000000000[s8_LM`\9 ˽h-[9I[ٲ%ye䩩Z>haG&qKc6 ij0LgB } q <@0!uo~u#Fl- Qoڪ\>Ǧ-)<wKȅ DO'UBpU5ӛx. w3 p[7_(iߵR"eoemõjTIMCp'JLHIqQ:nȵdv*%u.W ]yt6 .&~s5JUnXӢsH+/|U=Rŀdv;B8  BJWחEikT裶#[_ĉNUzr^XɂD#0 J${m7z$P%!xN Η84Lj#oc^1)E f|-t/:,vE6I )$woUEqσ2`rO݃2CiBP2u "Pw~`3lBwɵ1H8jZ/qT M,>p݋g{4852h--^&@Hyzrt+0+VBۓv׶oԎ<~9|8vJ"FoxF nDd˓eKhEt]QloB0d h[O()mߋPe$Y\Q*m8u3ߖobOAui2RDLJG]@]|  QMc.{J৤)C*~t5k }py^Qr}~&tk,VOgu'%]0 |:@]!s>074i@^3k>OFCIg!B2n**]4 Z6a r@]4GQX3eTJBz2e$҉+s84J)9 S6y?|\>DmWvff'YfgwR6NK},_%2^9euZkqG.Wom8u$m뭃&go4))$F WTad>Gh$UgAWeQY ҧ~QW4OU@;6ɶ7VByñRJS'&K7mm䂛d$ bZ)YmtZeXuφeSz5^wRX%?ېvù["vC<6T3Z<(\te>YʖBӅմP)z1LvmjD 0yy4kiZb!^<_qt3"8?&0u:{CI& )1C+ dϐjcמ!!z߷g@QƠxm~eQԿ 70e0tkAˀ;׎7?K+k/yI򵨗FwEaO:WgxUQ%h˙ˏ'O[.\#-m3յ/Us{KίjOk*pԵ|ZYu-߭Ǻ_c] z{/n`@zb[/p~^0$gIYEʃp8815z(OS" R;1^  QkDac+xn|&b]d`u4¸_f=ue23NM2 ,~:Nnɪ1p?rՃs_4k 5H/$%Vprp^im9yoshimi-2.3.5.1/banks/Synth/0035-Phased Pad 3.xiz000066400000000000000000000054011506652756400207210ustar00rootroot00000000000000]Ys8~ϯ#:L)\Z[f_X0 ٜH{~6(;N/!PF@UFm7ݢz~pwܾY ۿ'ŗi?O󮷷>HB򣼻5+V?hmrIօK]?| {D4' Yԓv+'F4'鈃6Lt6?:/fs׆DmZY$~ {gSfLV[xDvo>+PI|9Vuwi}_O|^]Cgs\Gg{X6I_ +~O:v64r NfS \RW: ay6DoL~}-D6fl~9rA3ưn' `^I ʔ?UkXK40X,ȥ w\]졸ۯF w"E?_? Pt:X#'N +s젣\ilEOsзV+vDI0Zn~[eܷG&l>1SZCdC@n&5&J ,kZۡt7+?*lj[pGk}Y+, 8[IwV^.aQ%/j|yh 8#)(N3]f:Z[0D%Iw?hP4۟ Mp,Wo%c>lb}u0>eި۷-(Jcv x3d|{l|2;z d3;Xezʎ0KnLisIB¨ K;2ҮfHU];$"5d};IDܯL0\.cl7D*K`L绛_cg-z%;PGC{5hes@{s蘆4W6Wx>Qrp6^&ã*$mxSQO;sH9v@H536"IƒXJ5@>`HF,qjT)B$pՈ7W`BxG}L0v}G4^]7{YJU8iW(U`/Sۧ 1t-ēKl.'3Ʌ(")krW޲U^Bc  c#k2-b+"DV?XڱIk[ZsMޅ웽LY7_nu{"LH}և(2IliW@UƹVPQGVh`]b{f[eK q@%R ۄ( ^w`f9"튈ښwYIڽɇQg&oKA4PDvTlE>K БbJT}\hkDbRdi.XJXعfo*.= gEJCg PN!MeӴՁ22s4](͉G2P"(}8Yg:rT]Q*3e2~QR M炲=ށՠ,oaGa2<2Gn.&C4 4(OA| CfUyFjlP7p:݁nv=9`YC7Xщ=l0ՠ(9Ae 5)Sf4(HƻɔiP$QAΔ^)T[8뒿\l`cx@Yײm Uk@=1q-&@NʉE).3gyA֠|'E)#/>Ae^ԙ2Q-EE ʎL=!/@Y`Jt5p4T_<5?}}|]#ʺiP.iPAY;Zuw2)әSVB)STZwe?N}ϲYoNY߄Kb,StFU%w3e6#/:Y֊5Z.U՗{iXaٮej^ԇΕ\Εr}Q`<p_F8Leq}WUfڍ[ /ZAhT{W80Uu%w,#k>#S?yNEloq s2Ev@_hR]7̮D}fMIL]$׊HA2XC鰮G5? 6mvz}B+$1N9 ɂCyMHK*i"*&<M e;lo Œ%YRaBUe\U)e|I튒ʆT4̓v;1R?g CyvT=$6lXE^Q YTn5ǟ7˝轡Yb3 [َn;-Ĥal :`|`~"dnc{=V+J+D.> z{T'?_nE0E W^WHWD7j> ("zF7wGP'Pw^V:&0N< )&ȶFT =K?0adgo8)E~Eg|.dO&`{M}ª&tX߭#l0S{7p9N>˄dJ'@;Ktl搀m -[c b?GHnʷ m5AHG#Yh;hi,^_Lߩ-($JoF6F@ڞp~\FEG^4@Wp "j>RvԯDnk4m4HhpS۾=eeh.Ũ9nvug.Q6E'fhP> BF Hґ} .L'gV GtJ{0~/f9KۢњY>}PxE9z16=1|:\ysFRgz 9bi 9KOW!s M#x[(7@$pRBt< Gp@ !3SjiezI ooGj3)p,X erqc(•jdaj|펆C6O"w~P)eM&_؉B|EA[6˙+5g[r>.5IZ@FURR>Bq{.԰HԘ!2BM=粺YKQ G>Q$8 5S@.d()S!gQ2qY| "WHI˄rH\\oC+&OCە^f;*vh~HAw\ns`qT*aDyOC;)- Carz#Y!eG$ksy $'+,_-\/qUFIk /uN-RUKV;}d$\ +@/p#&RUlGI|GDTD̶(]|-/C*p#Cfb{; ,|an+h&k77u>rIvsF,I"Ք qMwSTV~/n%K>Cld[֮8ԑZ){(n-={n-(C e6DTƨը|Ba }FK)b%e |k7"J0CȍUI6L6V,M0yE$[}]pU[ 蒤>[<gRIKQ1gNRNu9},9szM:pz"Iԫ' 7$1Q e3':h=d_ʡaʟכu=yWϵzm!>k k%{?g^U^X_"07>#ىSOvMs-#Q\p:.՜GB?Sj6[:'$e!,W}]_ps-鷷NߟbrUxC8ʛlSv]5*+R?u]wu]˯u]u=N_p ԛ6h߯w H#xǐs.7"/\WXWW功4ByD(wVEtC{~svY9C&zhJD©(uw$N&iۥ/-^kۥi:6Lv tI@uuҟڵtsѱ(9bTz;Xn1j|4јj;3{)t;Ft/#IEB W I5t+ YDTʠ2,*)@ ľw4 PƹS]^ ^Xɂ%E&0 T' ]?y!X'" iE6ޥ&h,x$K|Mq5W-K] i %:ᜊc;]Ben#n1f[,x/9IC41((Љ|Va2DlF?`p 94Tn8"vFJ_y||wD k$۬uс&ȟ&5⣫D {sUZZL5qnYUK*k3v);x ΎƮ@vv/Yfo[$v}+G 犢VP?h[ZC :ν0lq91h`n~ :|Tz4 CΤ!HwrU+nY}f ً'IY'IY'HF+@'G>ZD{L6,A릐.MI/S.:<=/-vB`TjodGq]K=K|pN)%y̡fl澝C^[/:ΦK>[gA3;cyәjy]t$(5&VB핲:6eua(\,yuU1sC^|QVXz8`&0Z3`%Sxc|.Pv"j4b}nd,*zS8Y{:fd*$&橼 V2wD ȣToñÞ>z bk?@ŀ-RRSӾok|Kս\Rq:D/x]R_pM G.#r`hykáKB;oRɺYHnX7fu3֍|k9?(CW`] _+#`IˑbD:WI-`|}=\65z914F+D!g Bۭ,[_ÿL B&b]i0pR6twI_7;+]PK5u[HYjt^Jur_UTvlV l}Uu.|3Wi% ݷ2sHJlpe| ex{<yoshimi-2.3.5.1/banks/Synth/0065-Computer Lead1.xiz000066400000000000000000000041011506652756400214110ustar00rootroot00000000000000[s8_#& 7!SދF"64_+IJ7Lj/v%m[,h[[̷/w˫Ar9-?ݎ[u\C1 ie%/nLܘyٱ~|V)I̖8-LA9|` e@':z8ϙw&r~w3.ss?op\1%1 [׌:NFR<n<}2!6ʼn/"f`8FT(>ґ}W*9=$!鋧tjU~Hǐ} P;Y}>s^64$`}9;ݞe oJ>gg5`%Kkx'|e3єz84j/JTN0>krRj8T%NT炻K! RΚ!耀q2% P1˽ vJdϲ/ex'TS@^yi@i97?SlGEl:45Z=PbFy_hܼbh!}&A-rIsNh`RM;%]4EGQX3dwDIi"~P( TL}[_eC1kOa ]Qi^,v2N9-X zQv4•TB/M7[& ((SVШmgsD!FJ dKL3B` ~]7ߒd{yy'YAOzN^N¯hCVLa_ ܑLPm *#M!!! :$oJ]57СH%K]PpSlFuh:t$ߌI85c}z 4zxN'+F!i@Lo*?rWWђwѠ7ψhv';LY^+x)S ~ 6yoshimi-2.3.5.1/banks/Synth/0066-Computer Lead2.xiz000066400000000000000000000044631506652756400214260ustar00rootroot00000000000000\r۶Sweʶ,$騲4[ɹ$dH;O Xn Pr_׫b? >-Qw nFϻ>wфoG95#>m;u&KxJcfnB|nv~)?ʉ+i,NZCѓv+'3:ʓl6:g׃d6mhDp }h./ YmcB+y0kpIFSrA&\X9mzr,9q =04'!{LaPRA2s:Bt#Ix8W5 [B wPx, z"y@7W5g1RM(à'cR !E/dAeACQL I[Py\MlK?qe.fK~łGEB ]+U0K\mѻdZ24ZL&1 UBifl1fSX^zN/} -:Q]jF.HVEm,08'ף.rKSd[mY:1Xẗ;~~7d[#UHH1{'ݳS%#F"s{quH왺 W-'sUGN~4H6QB6KJZD[uO5MSKnc+Z { [IEMV6bT6ߎ{??J6%@L߹@4)Q"}fJG}DTJ“?(nMj?Rǒ~,7f3p-8/:>8-hf:]8nqBη%3Cj%Kgp'\5}l/偞}&W#RO!8 cYύ9̥ { (jf䊇KX)gMMVeJ.1U .Zղ*`K9x=\W+&%"# 7?˥wVigl: MZ(jFupTHGHu TV *io`5 Yr)QOCDDbxU)Qk`@Vz:Hԋؔv,J'.7 Gab~W-~@bOR9!a5,;R6; Y8mW`q|YEF1@`(*prU;n 5wC +jܑF ~]5od{qT1UV%NY%NY%Hda/jB8I΃Aʈ񥐐]"Җ]/@)wYm/*ͅNL~Wԣ/ɤTiIrRrh0Xox Uot2yiumbkCbќ;92ns?y7Nwnl-ڷNiE5*TF%kkVm4A /FZ P%^<į]9QZd43kh k~_mY6D.roo.0Ŧ? ѦCaQg T-`>`=b/cFu@CbwjԖOH |? {hj P[vBʾ|9|jš)vWԦgkE$qCݳxJs<9x1[X.bO\1u^7J@IΞWeP|Z z9>˛ȺnWH]뱮Xzku=ֵ|~pXeY#Gy;0"7 I1 _%)}Dy0G9? .vw tdN, T f)SL;+8=}f? -VJyoshimi-2.3.5.1/banks/Synth/0067-Detuned Harmonic.xiz000066400000000000000000000040621506652756400220250ustar00rootroot00000000000000Zs~_pgLSb sN3i);7E#lc[ԖsBIlm霧ZvvWϯa`8iepղHRϏ?WAOWO}4e wեBeV%V\.M8e[<É#A&[?/ Q_9qDfqUO7-0t:t>O;5|lno}Ķ(M Ո.|tᇑI$j/Fѽrٹ!~Elύ!0A;#?JX$o5nK lBd!5 |$=/ ]\y[wt\-*7ssX>Fij>8~hgBU sO09$]r&OX M#)e?[wٿ:e֖l1ŊZτ'Xۿv1Ik|ٵ0(_,ÿ{2oE3|ֳ($btol&șDN7>zb/p!G$`I&<T Aӕso=-Iׁe0Df0ef(ˏ/]'/g$`wnNH!FS U RUOY$]*úw@_h4[}XI6 H#&@:oNM`j 0{l+RA:>tQ@ A AL d61#Ga@>@4ƪZ0\Tդ+~C)4ry+ 1qJ3JY<*$qSOq8a<~]PGϢZ!Pt{U& BD01?,V>7~xI6TSr5И 4%;h7xiŽX[V ?Ntn)eSS&_%սT&0 暻Um8[ZwD7k(˹vHNdf)#so(XV[}Y`h]v[8&%VwYy ~vA g9f˥]j{D/b@= ڰr]mk4XJ5p)$*TÄÝ~{MWOJ5Kx%6cqTIe"āKeښv}L,;j4&jٹT<>#pj"5e|"!"\e&hɽ6c`!ѳ1_r\AsESitfqփ>Tn#s܅}M-B*tf$ 2]L"/eil2B($z8o{ZZu!hZ#/ 0*h-&s|x 3oݛuOc{7.+c_C|.;ؽ@6zɸTN2 $~- pTTPK#7HR pI udOu~tfBS+V$A1tkMBـ|p'C\ch*@pM*r ׼;i5w6tWt"N/WKwza;cnWPdz`ۃx I3ݏVv M!gj d}V}S!=S).f @BH}@u|z|'b1v\($nA0cgJAywFBzr~5]Q-&Z=J3vov#l NN^Ass |GUW~ }~x3%M,ڮys/wWzG񢯸:Nm3zlfu|ϧ>ՇwT~Q{6_Χzx>h#nMg3>cJU֙LߦK-Zd2m)N wEVP20Uޕ? sKs6(yoshimi-2.3.5.1/banks/Synth/0070-Solo Synth 1.xiz000066400000000000000000000046631506652756400210400ustar00rootroot00000000000000\[s~_= ¥jfBj@3Rl6ǗL~[Xddp.9ح7mOufASMS&cHBK -Qfm^a,=)ɊR.܎aQI[䈶O%g>/t;D.,I[]AK}c?l <}׍> Gf@4;|S9t~sЃ\|'A'˛8s9h=L8ʘa2gi$" k#{W!z=})j2^ͫR 62z}4R},TղlyOO@;Krb6NGV,dI:d4^K1;D%nj⨏捔cy9;f6EHO}bW PM-"ʔBfSPACT 1jn(iMޏ=ӹ15(\>1^)Q7>yys/!Ɇ0rÓ%gj=?G JUa贓Ac |V 5;%vA0_wpF+!%݅c{=x(dz^eYdm@?.DpsWy 0ğd$F`I`4'N`Ǘj ?NAYo0^wʲvkNsJ=6N-SR~&)$|Tԧno:D#SRb_?Q7Zj*uUN?h+3rʍNk[̒FK{4Zbe< ڭSY%8^hiq2zOv ]}mMcg8{ݱM1[UtV^h=mLǀgd%dXWj+u5֕l~wzvS(PmiGZo+$xAW h?BG Q.7qD]"a{~{{Yꚵ ~y0o1% ΗD΁ةv\5+qiɥl4zUg4,~cy":9ѡ_(|e gƨ7ؽ52Tlg,S$X*_s~BO$CHyoshimi-2.3.5.1/banks/Synth/0097-FM Synth.xiz000066400000000000000000000057221506652756400203130ustar00rootroot00000000000000]s߿{Hf6ۡ 2 HG` 66٤=²%IiO_1G|tjY{r ^syxEn?:ç\/7/~q&Y# ~?J;Z?ެ'ϟ?&~G,x'Y?ѣR~ꅾŵKZJ$h)O7v0?vZО法{Q^]E/~ho"ׁQԓ ~`$隺N~NzM;M{b+l<dzQ k¯^l{ڞffKlwp;NLN 9\ѷLq&?ޜO輁Y5Mwh* ,?MxǟɏyDꟋ~+H]eiiގ*ˀS3  {lQ` m90z)>{0 kÕҤ*L˩j+}(NK:X+V;yfUU5+6ؓ RL Л 7`zwUO43k9Ԛ: Жڨ d8Y_ɂďYtfH de0X爔 *-sDfhh\2S.,+_:„" I|d*𽹝Qd?f2B Gokz| ]׬<HN*cC8MLf4-0X,p:v.]I -KwB  TSwk;yR=A?j?#׵AK$jw5v0N|xr>a7[鉢ڡJ ?My. 6\M RQi҈[.[sphv`ҋ7F&SGn ,.Y'R]`(C\cR&U FE_̙up0r%gt43C9.$I&j2?'P:E;j@Ȁh*7?GQh!cgpiONڊ_d}NϚN/d}fI:>-!on(045E' , RLީ9݇ ,1ɚ@ h /JRhڎC6*ǂ(Ζ0X,"W%nv=idnv&h tWɩ_0Ua ˚E8yRR[( Jz'k-J)+#Y^@ל $ې7)] fɴޑEнı\IWkLZ=-^,NY6oɵGU2<\hyB2IUR 9"j;<*8PPl|sB S_jmtb{QY=9N4&3 ﶎy:/p<\r$/68Βan(9y#:HNplP=\@!"*UqJ < [:u\axm0D,Be8Zx)d؁q,bdfT"Ʌ?K\SriZw9Ʉ}=%ԧͶvyݲgu޲'ʲgxzcTN'V:dNlts^I{mF@/bT'ESGi*%o%~(-&._,;B 3,(92q(iJuedBp|uwݝEA^e@ !P0.iBX!nPAaaGP^TgfTX`pe_WXY(iIPY@ ڡ\آ PhHZP=UKBCe=!& 0QBXHa!M"J!)ZBXvzDX"\  Ia;P^q 8a!Fj+BlSBTBrcBN'Bꄅ҄lW*9LZdYE ,$O2Ҭra!(G v}!P}_a!VIBJᡫ7 !,$W%,D9mӸ Iá}!i_HrX:1w&]ӻ !,d+[BXh B'h_玧}!pNP϶N yi)Y/D9*ȢatFV$:E,ƈB yݛI !,;o2!,B, }!/$KxN5a! /pE&8qȾB A7BXHv3 -ߠBv\QBt_HtFBXa!%*/3t<AIvv}/e7pB ^DZ B {N + dF׼sHFʞ܏_нs'f[3Jh2FSL{C`vl+?uqfvl;J[וZוdZgUԩZo5\@g}C:P7TH 5zC^A'dƶ.m*y[YJMV]9k` v2~ _%4mmp!ޢ]Nۥ&" =Sbhw.Ocڥۥwۥ.;|4g Y5 MlGR5"ɢY^°K^Y25܊4J`n_L6oG{yoshimi-2.3.5.1/banks/Synth/0100-Dungeon Lead.xiy000066400000000000000000000043651506652756400211320ustar00rootroot00000000000000Z[oH~_+4$@фY)O.mǗ$̯SRU>eC4+M^ǧ;Nէ_|¢vcbm7}n?m?뻿4ɞGci8iMoI%ȧ Lềr0̖ ҈l9ZȽA'ivz)|v맯&g;Z_)ytޝ7⻶Kϕ J%w7!n,"n'QX|!Y;M`~p2jeSά]K+W<-֛t !r_ܥ5gUdo/_onZ籨 ~dm@|W;YƏ_lrtL/zcb?3a>[ ) -`Vء & l(]h!ڟ]czJΕan<541mn@Cid|5g@?e$\I< RU Iu5&АbtyDU R=b@qybO+cf[دKJDbBx\&qͧZnïoG( IS[B :?7\>N=H` {ۢ@* L nCuՙ{JI<Xa/+l1m/ԟo*WhS1&i54w'~_kHQ@h895DԺTsF% l m_ goJ6b}w_՞4"ݒ]9Lsq:{?ъdLSØ[Yƥ-fm\5g ae*ӨfD }4TSB&ޯ=MAjiŻC[+Jd<)gwmlH %i ʨw6+tjWBqO-M*Q4%!ĚI>,Qv⡋ƇC\kfe3ތ0QSOݏ7׃DtX4 ê?;5G8eje(?JfjEQC624Ck]&A&ID&}yfj䍝vɝ,~m;Wȅ Ѱmn[|2OqrQ8%̣Q͙yj4۩9Lxv6b1;kpcgV-j].崾D/'zt9ѷ S w]0#aw9{CNVK't#{BFׯ{ )'*SoaSIq.bʦ8p"N2`n&?P㜋$P^9:RY*- 0 Uf5s,ξAtwd'SX@j +TٱZ=SԂ"y)xbx{`1bTNeKG㑎~  %E-yoshimi-2.3.5.1/banks/Synth/0100-Dungeon Lead.xiz000066400000000000000000000037471506652756400211360ustar00rootroot00000000000000Z[oH~ϯ+m & IE (hH62=/33 RWj_ߜ9s.9g/k<0rfk [˫lpک}>y͸7{zomOSޕN=9j͚xyD^DxhdQcl١@vD+sNsPׅWgQl 5#'f }w6kyO=vUD?^$b6hLAͨcNE躪O}֟Lӽ3=BeId~(tMv@:d4".TP\Xjr!lN}cǫBDRwRv'ѰG&DF(Ɂ49?  7v֮q'A n)3VM 0fqb3IM5iT$z5łz^R%B$Tk,YQwQΣ&8N  w,!H|Wb78DFE\CL0Sj`y9t} 5${ىuΐ9ګ]]~όD+^!VPjHB ăK:qE2=h /D/wt. ؀p̞M :*-"_Uߢ`pH,jv6]Н4!IT(’myn6QYl`Zʞ4ǁ~j;HMyY0 - ?~L_v?E=I:uG˥ekDOb˜e<.z&%2lW_9JeL(9?ɧp1ՖE7].4 -Me609Jg73s˜YD ˚d$86QqngR c\!0=37xCŏvC`Dʺ@}{ Ɗ$WbG2& a%58:/<ٿ?h2xZQy>`3mJ 8&sQgGӵ{JI\&X<:>^l|.2_ȯ/)'k4Tt tZ;ɛ={ԛhԵ7Z7jFӒBNK3-ik5Z1׆A A-1C̄1")SaDQ.@Bҏa3<g~ H+CSJ?=U1.H-űx.0麵D뒔'j"b1Y}ۑ6_y+!tj%W\vysBDIGRQWbE}'ͨH;‡-䊷C\+Pfp7^tp{!.[taٟ ރ GRŅJS:LTjEc EDd)tA!&qH/n8r L(K-X/9YWgȅ ;Ѱݶm4f?QJV3Vi^ e1ѧME1;u|[Wj_Ai}q<ѭnOtx/':_3#yĄ4pw<{ANK%`DCJKh_~͚F^Dֻr?~Q~eUǿ\"U(yoshimi-2.3.5.1/banks/Synth/0103-Shepard Synth.xiy000066400000000000000000000063331506652756400213610ustar00rootroot00000000000000ksڸ{/ٖg2v2e6!@v&4[cH=2,<6tKFGyH:}? ?Ujn}wsu?|9Q2{S 7%EJ'ӋCPV6@siTe}}S@3 hE9~UHgh<` ߮HRq:::3:/Q} ;qo8Js4=W&'Y? +~))'hAb sJ%!2We:5v84cK.#8J?uq0ZW>f09#j M|9$v:Qku5 ܹ}8(΍ Ix'"& N-C/arh'r)~"/8|7!cMF'Μ Q$q S/')t=2C`A)Z Φ~P5gC0NGAGI2lLyj:nT1zI`wӨؓU|I> g;Ym,/Po\!!h$1!C@P*A`US8rbK_P[=E(E-pse 89(P`2{t; t M=\>]!@yRh? UtF2tg؊ /!3JՖZ 3ϣwQMdG˅>Aݷ._Ә ‘ g1c1m! &c_65 '2GM%I@p"Xh+C.uQ Olݮ_*mu0ՖGa|U#ŗ7k/ 4/yQ-IgF݀:Wp8kM`u(-Q31ELfIpL#lP@"Ҹ$h%X%sHKOQH] 1*:'G%"PaAF]BKMP A9H *]}"m*9_~v~ҦjOfK@=@tVϊz7UOj$\;/?{Bv}8k/Lکֵ)ۻ lj 8E)o!]l^l.1Kth Rۚ[fR(~\eMY׈.Rl$\F)%len~=+q/-FdqA/NE kDd!Dpɚ 1hjv : 6Owno@MA KC2S&_RD"O1Qa:,ѓuhO$Ɣ k"Ř }pQ5kHrEF?(Jqj~Xk" EQ5L[lS(UTF?raF2j{qen(6&T3Ǐ[| #bA,T_TX$֠Bpw}z-@@~]4kA횚Zv Y6_lϐ@ +A9q2< )$kkZN@-8 .AEi RH<亅,b6%ZUnsImRSSP7*0qRfc/(PN( :,JEN[u-aj#,,3,mSrNT 34jc1;o1; Jf|aQ鵚M2*[OGzz}|ۜ8'I\.О$oN[Ozz:̧qrS6rzf]b==[tt7C6gsz[;l~@YOO ;{IQ)xz`{ ^Mhy;Q?f6M@m {KqoٌٌNIy6biZZy;Q?/{pl>k,[6wb<{EMy͚^y;Q?l>H ]W7B%ϳ~>rFfV(a%CQǾŒ>q7+4zjUy^Ze,h< ǽ[xRJ,ɸ)V_׻1z`׻Bi0⪂CCnJ>6/ӠaܰqV0hLEuI9+ ^6=V xi@ XO")BDoM` R Ƈtl%XPqY/A/i^,rE@9IhL`z%%qQ}ᐸA\Ko&-W33a%A-m/lGԣ=Lwњʛyoshimi-2.3.5.1/banks/Synth/0103-Shepard Synth.xiz000066400000000000000000000057021506652756400213610ustar00rootroot00000000000000r8=_ij` )jj:$-{e$Y 4)%}$E?}DjF"^4=~x_7񗇾2(~û⣼93>Ԛ5 vLldFq`I~Kϼwu}xՏ'VzRr >I6]Dǻxp?8B0ɇZ&^ 1qctIUWGOhP ue~ؽlhz%CҾ\+~%dIIԪl/chtJanwJ |K]7#K9 qy]%`8?>cn Cy]8khD4_֧yf2fiz z /e>K4*ձEuB ge0K U3>)>)*1O%:]T'[y-'uR:yRuQkZ6sn10'XƻeJg=cć{֩Ou|4!ZrU61) y .M6Ŏbmi_+qBPYQb5J"|]RI>@B Ytr t@‡wvψ9xu*fXa2cq!P{O=T[6;ibav?wOԔ$C22E0ˎbHa VUDW,&NSQ$tMS)!c >OըE 1}@ͬ,RhFw=޹+&(ǻz|#ت`ݕZ!T >Y.p m`0ݏzϒNuB<\M՗g!%0Zb5ȰM}Kb}UFhe)<*֮^|ːUʐU~gXJʩ>QP4 HbYGrs (pth \7}Z\!O+L1`ҠBysFFS/rE(FG! 2SVݶT2tm[%>u܃U)WdC9=;o1;s0`;X#n7MlRɯjۏYK+h޲J!,mkbD`YdSҠqq|QHS/BBEZj|i"ޠ_sqs%ڕ9U%wJגu5[$X岶Ui`9ԇH; DYU&)\_CWZr¤Us,MqiEK:{*eBW:?֬2#!QdŬn:K~ÛxRDyU:싖Zҭ2^Sc & F(/EVѺ/V'6劤&/RZat +L=Ou:^R6Ho7Z65=Sӫ\plVąZYInѭ$6vH+Oc& LM-Z-[b"=鱵tp7Egjz=5{FufMM=QS)Dzלa&{ ^C=hy&;8TֻMf@l K~g虊LAMlTLwq^~zX43`3`M=yfޛZ >8D+S3u,|SlvLEobzw/ɏp3gx27d^{sF_Oʭbi/N'^вn,htѯ1wptTUq}Yn]os]os͞]orϮYgԊzĞ]FAH5\ mvm`#*}Dt.Eoo1L~K(YV4O/tU{ݳ˕TX{epx;#a֍:atA3K9KjB!3vh2OW߮p8`:K.6/ js4ĴpuZ3Θ-ܚ nP nT7Fu V7ju V6lK噺KnڗpBdq_j{_TmKT;ͿyR7.:S.Fs5euQ: x %ږyoshimi-2.3.5.1/banks/Synth/0105-Nostalgia.xiy000066400000000000000000000121361506652756400206260ustar00rootroot00000000000000]r6}Wx[D&We&r+c{l/~zݏ;9$~1]x^>wqfYR{gz)[uIQ&l}'ۘKТv//nnN7xx/' {~^(ŸN]MmsX?OW~nu5I-4?4jQݭV״24EiV$h`⹠JQ2%W(-?mU)^**E~Ӂ؈jUm{.zj_4o]0b[ic{kl??}?}>j|Lթ1h+:RR`g|BJ'W*5u#KNS2iњ@*mn<ϼ( Z+qLT78udz"%%_nuܓjhJ{n]?YOP]m yԓg?_z z'[F=ɹX;vɘ>&N.9i'yv{ʹSs?5tqVjjBmرOeπN7KAe #svAsV-%$YF%;M}r^>&~ܜ$gw7AXwu7A@&_3NT p&Ђ2O(u @Xx'arF.3l06yF^9H޽"ύ 0vmV ;v+NA N:\I0.:dM_d>Fa~yX#녑`혟7 MO+PNdnwt22}x?8PokrvC,*eQYVn( ϯX1@u}uJ pٕ߇~' YH0GDu݂_l50@;nu CYa`1Gy^ѡQf?T)bF(+-Ȁcu,P81,hC6 Pq\RV=(I+t,pۍ,P7l%`{FYvQ=PF4Q@>H7zPP(Q /+*Phl%@ (S&yJc'Z@bv e H(F `_5de % 3s2+4+c(]! P9Lk37#Kd0hAi%"823r97xo֣AՊ({@ɭJ.o\0EBy|{H4 .&9QA۽(eJ4 Q.aaj| + TGcNangQ -ƀ.@~ѵ5L QF=L QF ̚ QF(kWP̭Fg*g5vQ2?TP.~cV X:D6D<vyor7DY:-j~h+9#EhU=[h+EMcT_Ѧ5616!m02ק.mP$Y:8iE!c:NS3Oy-`DZp +PsuL,N? x4h"d'LD#A(*Ӓ#YOi.-΢eO;juiEjd^`Ö0X~rklx#a6TkeHurgz#m۔~òMnaYKdbZTGT7 dv i 𳄚7"5(lrQ* E } %bjTvr}]S՜`[wsT~pw^%Z߀$ )D"!R`$f$0%*emL," If{U}ѧ֪ Cn?+f; ŋ7zl_hS\ou?s}߿9/ ;8Q?`AjkvQ㡵oP x{ivχG]>%s޵ vιvݜ*zpFSzY"B.gcV4S[ *),%ǣ%@-ȍn>ۛY2N(n>8͒X1<իh؏TMy~*I~ޮc.Tc\]Z%oեp<.4EqZ·J>^睔lf[lRWlpNwk^rxy{IdyauɊZۧݗN1_4ߘ^^o?_/߻cWQJ3ZURN*6>Z]p^ka~%3+OrHB59k3"Lk%&$}qoA&&MeۻVjGŘ91.q[ e3!9Wej25C_g^qNQ<"2kV+#Z[\8o<:RqjpU1IS[L=Q0-EVV{cz;%ͪ_=,TKsea~Oof !740jY/Y`^Ѫ"a$XD˥0UPœoզģx|VR4+[.ӉZS`Z}6jul"J=hCOWI.R^fhCC8SU eqMxcIMVzI4M#(NTNZچiɉTr~?wjyoshimi-2.3.5.1/banks/Synth/0105-Nostalgia.xiz000066400000000000000000000115031506652756400206240ustar00rootroot00000000000000]]SF}_nNl 0jfR*a2yQ [6dfȯ+K-uϵIȌw{~ttx IGf#F87oo?y~㷧7_/nO};S~I4v7o/aeF/҇?Q?~ԸqN÷PoB?QcBCO QKޣӤ N/{ó̟{qi~JTۚ>͂jW|)a߅˰YNV,}|i< 7@:+6IrKe-FEAu ٰLk2D$m=SWN"ڐ,!߃r"p: {i,QaCžurσGM&H)F_~:ޜXc:\S# \UBS,$GkRisI6W"=x FLCi:t$MҘuJt6X`O(yz1xx1WN˾.bw 0 j z$(&Ih6e!Za˚Ș`̓I'Hm$:B-uquiv"|%HtO߯ j@˸?-Oj?iwV iwi0{eh2+umgJɤ4ڕ03Oك͒)p?=ԺŸ&a0iE{Rl 2jćSX ӣ8J\Tbd9=ogSMJjSMuC5; Ttr,jPudBKΪt~7YD%㻻$蹗2r]Mٺޞ޲xjX ިVj8'a3@g`faԺ270ʴa"aj ƪ0{c͙Ch?cm!'Uv[8xvI:##+s[AVɢn8UB6YcN6}$}F!  m\PC)ɅaFta5o*y7{X]tZrs[ {Ӓ zaMadD{eΤ:BzS%tkpB ʜ <aGa.w@9̰@y}gn Y<76>YNl- Pz:N.8Pp!̀tg͵ tF%;o2&a5 6Y/8kQoz`wXvеt"sFtp}#_;gFU/ʲZuCH0x~吥z;ATOȮ;YȢ,C:A>賒5p34j6(m-]R,㛭jrѭP%W gC_'^2խWf^ĉ\icԒxd7k56W!u0"'V(4DY!e :*V^6 3KiQF(\]/-cZgqbj+a+/$BqR)Dv}g⯔5Zػ ",%bOԫ{rhY 5"\ER5"wu~18;ذ/Z(:ڼ%Z7^ bוmm&hzܙqr:)?l[aه_'J,b5Z8#3 }M!&!lB-in 񖍰W"U(trP$:P(s*抩]ZRyoYRy)DmDO77T$ $Ʀ7#I4І1,5-P.kc"70* $K*r}&K LnFjT i}_/o}&+/ X`.׷T_eS}s_m.jIDA'b&W_Qj{/'cHH{˭Zu}++}oϓW_6G4LϷl@ee*Rߢ^aH-5h7WRs//"h5sߝ۾ZFi7qcG"*CD>{֧֊ C/Nn>9л9}Mn9QkΑDWMt/mS7!RN;uiξAW3_ek9?w9hAJշjߌLlcmP~"ao M+_0{]Qv'b3-".NWӶ{lgW7wavxJ/\0o:xS}Q-R0<3nG=yqvk'n.G)־A/!5k'>=uٔι{휻s'휻]=8)AIޗp>{JF{)EV|xwJy Kq/IA:^RJH7< 5zF1y̌ŋWI=o\)7S[)cvA1+OzIPE5OiZ]SCKG b\˼Ҟ*lW坔.T))ܽ_W ^`lE^~^Rf%XqY]4܈ ?kє)\4ጆ(Ϩ,\(+EN'ѰI%%ϊ&)?J+) ⥜ }_Z 9B`П=vM *$ҺK47<U ҃:I1xlMQT92' Ȣӆ<Aݴ#O q`"%.9j#6pzkhq6b wFYJPcOC!`B)#&&TBg;*4xO_HƺO+Fp5hGM/ɐ9fns#sa7 j ㋅ Z{dk:FBSAЁwvnM)gUJ0\=z`@h XS}5Ahpeע*vBTKAC+Xk-'CY_oq=.eI..W@&Wu媦I0Q+"]UX\iȔji[K[5?Xu-V} ֯7 E/+;.\_aQ^K3iw#|hess9\ws J'5X^5X^%CMLU[^/AM]y.㕏 :Qlr_>(ub(h з0HW\-)F?I-;%UhG膌7{=] !fӇQn 7P 0`.sSqD!%"R,o{P Bخ: kN_ksHƺoOKs1hMYRW>p#D^ Dt]H8 .咓=*v:Z|NPEe4uB0ܗj&*'G> RP>hd.@*ũ xD25–1(Sۄlw~iQg mûk&&ҢhҪ蘵{AԎQ*Ǡ]keײV):[#VgDڃȻOX 'kxƓp2K `ܠD~Q7K[.b;WFQ?`$G<~/O -,*zS2]A;zsP LvPF5I)fpj* ˂?M> FqwO—WQ:(b*/ҚW9u) ̱!T7uТ!{.7GJk#>@(M>bMBZ_T{G[Bo>mgyctZjټ$B9#ABBE\vF1.z/mOs"2Jؼ~(Qgb޲M'@,w(s: OhrVh7@/p[y$DYN5D@rٜؖ@Y)<˴,E!~^3qv&pȷX8ͮ˔E)z>1,3 dB"?c%-N$,ɬcTE#NAZpNT;R3%jQk>Wha(wOF2n@X=3\:LLԦ%IqFiIlq(ye*h,ۨAQ,d<*`[ k@䖫ꈒU5&2NG&+X2 Z`i"~e72( ?5g:j ZhoDD@xq|K.2?^.nޞՔU¡"TtxThwuf}*4͎Syö1hQXK J!!}3y-1aE KLo J0ń w61Npc!!k!Be_ď*V (&<n3__iɻJ!Y7nt.7ۚ-lʂ-m4b ưݻltm&)q[I;0-ͨ%iկ啸Ma\+q$;L)mxLQ%WOV;nRkG>Y6~p􇫷9=|iv S8[F^EMQme82 ǺO;sBqڲ=݃f`Gxw/ n%p{0gބy&E?Fl?%9e G/qr'vF'AqD[uZ}Crl{޻ ^gg4.c`Nk>y=:<컧|MJUhXuY}z둬I  TU0aXN#bb6no -& 7" G`B1HN@tp?ZC͑_gu/ZrQ/oIl}nTVyoshimi-2.3.5.1/banks/SynthPiano/0005-Synth Piano1.xiz000066400000000000000000000042631506652756400221130ustar00rootroot00000000000000[YsF~_Axw@TQ؆ l^i0"̨glm^ ?=x= #7?ԭq?]N/o?̓ޕNWhzofPSŏ[&4meKMJVI~sQ:n5/pZJq2; hE%Z9`xiA BƋuuxbg>]ntQRyI,.<Sؾ}'bC@4\e#]>2  cp}s5^^C>@tQ@lOHYN@;^X9W׉;>D@ p6ƏTɤV+wyS+bZķwؕ4׭`vfԃ\Gbkz$'܅A5#`8}x5[Th.F8MJp$|J uǚU!!0 5ƍ3HCAlv)!ɯOQ Ͻ~GʹZ+W)K!B^kv-p~m-if{vK=jY?q˄1ٮe3K8f%!H@ƍmBI| Ԡ2:lC+&:LDrr! ̜YTzTn⳩sX"ά>S;aH<{p I_P lx2tZ O $l9e ǨfYSm@N0inM F}1 "mf%Km3*`gnhfWqK#m^tJ)3v`+yҢ|p]o wrC`~]dAk z^>U*yU* {F5U&s}e2l}\f>Z= yUՆ`Pi1[8uτ S] '7I=t )PQЎl|e"{W6*1YaTUSncX'0iӒ,jfoye_d| =OH_szF̼U\*RsV[0M$>=@)|Sٶfdp7i8S 9# P%̳Nx_-Gȏ2TG(nH|jAM3ưS>X884:34VJ *1~ -q[e v ^cSiz\ru 4|Ŏ1/]Z:Zex^.=XoE}N+E}j݊ﴨ/~w{>+wy˻[{ƁBKUqpz_]'x(?2(&!]?mi+^ԲL*qy#BR⏋aE+Vğו悺!dݴ\')yƔ V&f^+:u}=S'"`u؉8Pb^ěA ordi %r'de^wl ;eAmOLHՀN@.Қ^6&֥܇AUB##`4ct=[U.G<@LL]TfbNԠZ Ҫq WCACRsoCIX;~k#f7I{vvhPD{ulk{vkv(Y hx5 1dVݬ H* fGIm7n4OL ^1m~ 0iTz.R͙Gws7\|t_}%0b$<] %U EIK_b'd d*Lt:' Eu h>,?ٹ5,K( UtvfY'mOǗƧ.ZvF*SDWkfVS  ܿ:ѫ$Pyf}jMcv5^hkca\7OQBD+K;WMڟMdBI U$^eftyNyu ~=_'bDeH<@܌(Y)Nn?pDb˨qD͝"upra EPmt|1j^R)O|7^~Bo'8b擫MK%Hap!cY[VL5UʻOEHF~_pjkL1mZ\WA0a~IٮeVNTm`&*nVWiK#-*AT/(5߱]r/īՅMWk ,x մj;>v@&4kd];A}"evYK٫KY>0Vacff pwp vq@Vxa-@&]|MVRQ(ĶbbEñT8TF&+7(9u6v!LvuМbY*^>lxT䥉߆d| =TeMp|bFNWԞ:9<(a dka(]tξjT&bk<Qv)]yl%GDu1R_֯mvBDe#PZgefm*U?.R:iv:'-z CvIV.r]Q1 R\RvH}]bH}&xdԿQyR_rNH=>=ҵ;kIG8nR/!RV~+TGPώ&pJW^="6_o$տoT/J˚yeiAUXlK-呥.}oۿgn5(>nT7f|3Ճ&L۩ߌ>37GxvvaFZo+$u.=rV>F ~O}Y3!,]UC^L!S_vsV\0ux1Dv;5{_^6\.@C"]pvq.GC8 GtL^׸L.bi0Kcezߐx9"(_:}h&Dyoshimi-2.3.5.1/banks/SynthPiano/0007-Termollo1.xiz000066400000000000000000000043201506652756400215500ustar00rootroot00000000000000[[sJ~ϯ`yq3T%9C ^625Hщ..}~6#H$l9U~J,>_q3s?ߺs ϴܧOjn_^ݩinW& )+?]9/O"xIVFH-hd?|XWԆW lRDۭ(1_;|Ck|n%u>yr>YW[LyQPabwbL7:yV_oSB˴< ATHmo+~Bb ȑrЏj,"lg@0 qy*i&J~,"uMρ漰Sor @`Bd $3= _ _QPƁ_1Ip0$͍jX1OBFb 9ĵ jR@|/:ʚH/V:Ϙ:N3's2!&-SK8>& :髓 fٌG m +l!eASbZ6NwS1X㺳7HryGif.Nš`.ףuo8"g4N8H`zIOj^ryx}{ڠ7FNã4I3~HRI{PߐvѶHYR~5:MfO(tE4<70aTQ CSLB*-83O2ⓑtF)kr8w嗐xa3f$ٜ<&TX GZEOwG(Ohj`r. MF8xLBĎ[yps_ |5jY$7i9|0~zn]b:hu}sEМHY'oNo@ VLEqԏOLP}p 8F#Lp8'Y=닗B(O왓oL._UmdoA]CNMz -l9H$!+F`ֺl(&&W-f^:'WNɼqXS'˳'os~Qڗ)Uㅩj+ ' &?4l*5%7BptXlvs3-GP} V9c{+#">jMͣ "wM,^XppiƈPmk KkAUG{z7#P >{S﫰q[CISя~=;g^v"%GJ7+gt1[܇nKK5Y3֍|Fٌu#mƺ_7c盱7 f'c 7fbkGv9/C2/g-/H\z(.8$DjQOj*Ͳ9gWy)c~CRbs?/r8yoshimi-2.3.5.1/banks/SynthPiano/0008-Termollo2.xiz000066400000000000000000000044701506652756400215600ustar00rootroot00000000000000[[s~_= ¥jfR' [;H ǗLlInI8S-ݗO_}D OmnE;tS~3㿮Wwfϗ`8t;! wGt>+>{m ؓn<#{ MZK;!O. Zw$ԃWf8i]TOڭ\X[mAb\N7ړچ O?KyjXoVb wC@s0_?oh䇞>ve,ڟۡL+O˞ 3ٷ|P+)1#BFjQ;"V^W'UEƼmP4 [OJF+嘟&yغ/ǵ$`FiXI(<6ͬrCY_ `.6̔ĉ(@@;w7ue^?.&;= }(R`(Q "A12:c!6DBABM^,y\/"K8QPOтa\&5%c*?i\HD׶2{¦[QeKpuD͛坉SlQOT4x0pQ>`e @²MzمM+%Ҫs ;+,! éZ~;Aѹ_v3 kB)h,_x<߹Pr8X| ؜ ˰F.}&vaJ?3f}s4)# Ҥ]!f?nC -eC֑{MR瓤GPP~8iAa*Ҩb}3Jm2so.VsM@ؘDC*I"gUC=oO(suTS#xe=< oJo O8G+If.\m.~ >uޗw|bx}|*{SD 1\ Yq- 5m& }TW8A6(Ma{=J"br$nSQA.r v p9]߸L.TYINn/Y[~Qq'OnhWz.4'2 Q0ߗ+9_SAR!KD/\(ۭxG' qQ\F$I7$LM%Rޅc*:Tp24T9Eak(P͏GnOxb \/?'Vۮ8evQ4GOLWy\TvG#~Heۗ='4nX*8 t=pѮGTb[rM|я x6ݞʔ +]`>BtXܪQ5Q 6Q|6Q6Q\7Q7z$M=9p#6S8c>gLHi1%7IKW/s636u Uo /bcX6 G*w)]TUAÛCR{FiI^zq9j?ЎN3n\g^MCfaNP*D <#9몊krC0Ki Az?A0=:yoshimi-2.3.5.1/banks/SynthPiano/0009-Termollo3.xiz000066400000000000000000000042751506652756400215650ustar00rootroot00000000000000[r8}WhL6]Z[Jf^P YPǞ ؞V) h}9>@>O,0Դ~i7,pB ?5V7毟?|jnL\wo{҄oO3>5;M v:ɖء'{_x\hOv8i\Q4q㰝9V;wt>iDa7c%H$ ~ __Xl FIu.җu9Y~+{̦kg\&i *_x d"q;*/1 "la2G4(@ QXfF~ =;B,\(oaSMgΞ70 uEVkQ, ߝpMkO˞I3[~>,+_#S.ۅ i>.Dao"[|.x]W !ӕ}\8Y@׾)/ UVȱ](:a+{9Nn_kE %I6V5!H.lLU$N1K)!5eĴѮ4 P@棺nxʰ7MG@P@jH O/y!`ZG*8qP9yΖ@`QYa\&xG.LtK~1ж@$܂%@Aa*\wJ7gU>hσ=RVй,IS#k i3RD&~" ok@ +}sB RMU J?OE Jo O8GKfڊ S{lu:(,~ҍmz2p*Bc95a6v :4aaTq R;y鵎<6{({T:K;WM:_MZzsɃ`L6yT+܂]S߮Po\'bjP)UY)NnY""%N:.|6]Z"q 1ϧWv}¦B&O/b/R_бl'JI|$0J?y&VSLJ=SQSfCg8_t8EeLE9{9WZ7H/ |<:2)U<'q7=p?]O= &F4?+ zP(1@xcDh U9u> JqsI,R1WV]Z`i591dq7MaCq9nO`5ʕT}crxc \p[i[P΂9s]-;^dU)h;%U9S`zXub[\L)կ㊊l{"˅B ]WS3l8ޗf/C8sT7tSe MAꝕΰG_m4qk;I璵Cl o,J<<:ֆmmbYp޾_?vX,^\}`ш·P_k#yФэM-7^ '0pY.DڭXd+hdz3&cOu˥;o./'7Z8dHM1>`G io:9qG`6$f8Ngҙ}$m",8.#g0 biS[.)q[ {iy&eJx 1`UƳf8g`Йb/7u/e﫾*Fѓτt_rȟ#.x Ѩqi,jϺ]q™POG]85]mO1tO}:{B&T *t*B9)ar4b^Py0R9P>$CQRMs$ ULș7L2d"yσzɌӁ'biIF̾y[.~Q1g*Nx0T.D$|.5=*صChwUKFT$!'SlF "GoE@HtVSL4UPJIi$ÇPUҭab:l׏b0?F M[z,a L]e,kY2^<4Ԗhj`rd.FJQtk~]p+/ěխH7k *-tx5m] zuJ|IA"k.JY'JY'7a$\Q/ `G;! A!LjvS8ӾT]5B[,|"~2ppu9%<:H!zWF5}C\>cus$[ӛxt oEG_syGNα̼WwصEw7E''rDґ-+jzuulC6 /oz`ՍN5x{XΉTDX;ą0 '58=؊+UhjQk 3tJJT 9&橼W ېEt-Jf }ŰdW a_1lY}t>WjW[u+^ibu}q?k~cO3xk S Uz$.N.U3Y733`3֍Fیu#nƺ7c}$>{9kgƌo_NHC 1 ?(VC^] /UŽ|J9;ޒG~ RqG*]pKx嫗2W$%Vpre**;n7yoshimi-2.3.5.1/banks/SynthPiano/0012-Drop2.xiz000066400000000000000000000043121506652756400206550ustar00rootroot00000000000000ks8 Yb P53[l%us_\;q~dײeKrKg&SW| [~_}Ɖ/ Ǐ݇lӻY\?O:y Ʈ6$%$w?cO=9モH9IY8)yHй'پs<;+{x5knV|b'v.0;O˻zM;&y ҝ%>/4vzz:cx5d=Y9>y}lxcIZV⥶R?#^q$ֈ$d:%( '[)8'âWd?o0h.8zś:HalON31& QQ!bW㜥?3ƣcCW7j 9q$[" DK@{u_k*zj8,fדC < ZzȪUyD)|JyMLTtVST4=SQcF^I.PQ5DLG_U ;; sj㉢Wd3֋A㨽fҷ%"D㢁UX]n$@aZB;5ͭH5 *,tx=iC]`@vmZ9L'h5ǻ@1{9{_ïɎ(}9,smp*PM.BCM6 k}v!Sn6iv&7 yiu^"MD* BTSROEکH;iKSV_p{'>j}Y7%Gܵm@6߆^vQ^kVy7[G_˗; 9}LJҭLsV6؎t+lG#ʮۑneH ӣQOmG.>c?u =zCOW2ctrfjP\(4G/b*_FAʭ[Ǿ~ Bn&6 ٴxW΀xJ4|Nx ^y KW8zQ-^ms\ФYb/*EtZ9Ca.(\٢^sc8d4p?~"._?G:yoshimi-2.3.5.1/banks/SynthPiano/0033-Analog Piano 1.xiz000066400000000000000000000043201506652756400222420ustar00rootroot00000000000000[Ys8~ϯ#RuT%RlFͼ 8I-Ǟ_? )LjOFLJ>??x= #7?͟vvݧzz6j].._ooqVf3ޕ<{~jw'F&?Ȧ{ܳhWV(n]=[9Qcvlagby=Ys@C }˧Ԟ\^F~#IxȢvW_4~%XU/En&ɵtLF>u\b,Jܘ1"r`!q(ecn-mL=|TAɀ{:z8Ϙwfzy{mיnpL1 xZ2?vR2muU a>ʖ J=Šun^dvDіJU9*0N|낣Ka%Q?d'cH %;,R|āiʐG*׿`Y@, P '뛫2=Dkpp!A1* R < }wxW PLDP PgvG*dl`[DK]dC;^;I ؕ7aעoI7"@w4ߵIO8"rADJ85պZX8޶!cn{pPdK8MZp83PHV"&6m搐V{gp&b?GOHz_Б8!5{yJy}t]Y<:œ`̈́Ao=K2g,V Ox5 lsyx c<]!aנ+8MN4Q;d)"wػq=2~5Prj=PځC88K7AdԢ%.ZU)152(R퀆#%Jj@g:@EPHT@S |3^.>'z|:xKfƧs7 a][2x(TjlNMgWPvVS9"ȳ+SI=sЦ1 XW8@Ź?GBLbgMtل'0n#&2ɩYN(į)6WN1*YXG9T$篚)Pef8Od3kș17)>ple \'i99bOA3.b>_hr#hk~].Bw#hERg1Q)Z{%TF~nBǢ#D lwREUO2TnDUU*JÆo,qCo!&AdldG6' UVoSF-S ^tJ2GNn-xբ6}M;Mo wrU+F`~]OhFAuPez}ʷSҫuu~D;>KL2>OUAeDQHHAa /S+.7n[P,Ė!ΤB S­q(JLneԡ' AŴ$8Ի2h0Y~Ѭ[#AMޚe^g|XQ5=wr%q䌣<0$V; C3 EֿP)c}}0V55L J^SG2 [$VآWJj\nݜH.>,.y. `&?jr0P%NiEAk96 t)4ﯩ·3uPuZFnC6~<9lp˱Y!{^ nbAmܺ FU}^uSn{A݆^nr 76Q\˶ c~𲭘TTϚ۴[\^/[>xswx;7 hM 5ZSo?(=_I|3PΉX!p6O?:CQeB''"NܐlY@/eX1AVV} zyOCɀ[*zj"(" BFJh^ ,J ,*BJiI'y5>{ ~Y|>'j|:oFXttna2#|2Li} ORY%@U h|y`C6ʍ4Z4bw~P~0R{pBu'd}šD> )NZG68C|YźdJyq ~H( ~@2>)R"#ETMHEr@66[noB}Ä͵hTN ~LJ(3׷Άd0P$JDQ?1_ /hVb :_Vb2"p' T;Zb "G }Y4xu{ZX3ڤw SEYN]n$d+QLE0XbY:KoCE!"~h9~lUMZ(8nT8Je >e*ye* ?{F5JsB%HCFK!!Qp R^F:;IC  SMLREkAC=,ȶg=_TCndbr*$6FXI>ZRLKRC+`@1XҬ#`M^u0NI1}bcWMFα̼YBd^LJCb!} RJQdɜ"`^?tM1)jCP.N9 xfyDDHR\0<.MKWQդIeX*Yռ5!'u=:Ijjvڃ$Rt|j6ZkAM/:}J ӳAY㦅dO Q= 2!}Vxxu(SVXޢ V)+|FVo}m&>&;m<#8YӶvzhgEP\NAGЩA=SP )WkzQ:~ ooUNP/P;b['OiżъyBL:^~ >exyж­]$ɯSvy"C'>7I+(G_>{rn9x,[\ȣ)ߪJvG3?m;u [w4[}G%` ? %i뒮A*;nbV:mv4Lod И,h i>WWsH0 >`02 LK.ِ֯ |8[ D ܑ'P9uz ɹ:O]4 U5iǒG7sڲS ̱v"bO4eQ\ֵzrV{kdT|WDqY4gP7 2a`2v;[|DcDlB (DEd`=;Ǩ\He:R?XYؽV{H)[ϴl2/ `u k~.o,+,%WeU wly*>%|PQ"i*'+8*)&+*zl{#ߗ>T\N.Wh_׭3ŠuP:\y))$BIVTad>Z? dˠ`0cRHHH.?sVU5>f!O;ܒm/LmpD4 l'uzt$:sF1-)"ͮ.ZﳡjĂxtO˿ ? U@pvbN杒#v;uWc^1'{PZX kr =A~}|0ao?=Bv07 H #&eooprYy0^g* >\1oLw]|Xʽl2^ܿ#)(O;7ŷ|Byoshimi-2.3.5.1/banks/SynthPiano/0037-FM Synth1.xiz000066400000000000000000000050641506652756400213540ustar00rootroot00000000000000\[s~_=KL­jfj@N [g%l6ǗL~[X$d )?Ĵn}Sג>^՞hynr^Q \T Ϻ_?ݠNjwi2%1ߊ Tog_F$DM01>I+~bۋ:74=?dM}Xi%F6],#q: 򮁜_L~ < Owx A9c럇)H- Wl ֌B!l`m+9yvLdm"5Ȝ0h N3Bu"h6y.P'.nI,u&<_ϷїKVSԠs*;:۸\x2Q /(:hpm4`6*'?_&v)O $My_ɜ˜,:DrOt8^bˣrR [D⍚Hƛw6()aIk;r A"Ypc) Ȝ 0> -BJ+@ <2%C a4pxB DaOdZC];+J"rvXCrX+6%$k{jݷKTzSwyC+ffi7/:֥d!%YhֹՃ81[Ο/M囏 Yi\\Ag,e1K"qG2ެ8nm?-2Pd.]%N$&Œ |FTs*Q y:Ɖ/} HQ@XUse3=B?>(2'<_Z8ɷM ۨ?i,>V6ۖ%Tj, BvίR?IIDG4@irNPƾ+ΐ0S ,v\5P<$Kd=J &um!qb %J-aXDT58y/\(GNjG8J~qjyث qrV`:WLB䈡jp8ncߋߋ$D(Nv@޲n@ "G>?yı@VS4=HSQcb63}aʔ(h '<=MCBpAx",;ɶS*Θ.*#x/RˆD F/ +'ӫэdh͚ʂɐoK^ (O޼.yFhwV8gC-ܗ)@WRqp}Ff0 5ƈIHu~_Iq2"[Jtp-dil/*%I ,.I'ςV-U6:s( j5-kcM쎌b`ۭ h//;z)<(B}H-$ {ofOQlMʎ_l#U+M\pB!%M6Ḯ]^Zp,a(A=ey|Dd;P>l>5}BZe :A{!o@a!jlrH]d=\tg*<=)! 2GO A9 ZՊ*h6!,:8dpipGo@2CЋxtP:W1o.ǖ'߂w%x|w{]1F7? UVgyّ 9% PJu*3\^uꝜ:vRxsT==EpiHS&)9n= &8&#ϻŕƳwyFϰWy=ߺHY ,5Xxd+'{eyu}Az}Xa]w1ú{a]W*uB{槛 -:IZGIxa0f(D o)w9vTZc4?ju8mL45y~ʼnMs`^xѼzͯv3?Lߛﺳl1ȥ)oաBQ@GEӔ#^GO$+>K#=E!#+/92c<jY8B!}| PYZSS!xUv9CZʺ<̓r)wYv}:?#ɊiaKN܃$!eMZJ Ze3bҜⵗ߳$cmUZ4L ^* \d?1bBX_У/eWinNtaDNQ jAu.]'?LqH)WTBx3ԙ(Ts* ,8w(2 e Jgl<ꏮEQVis$gCyb::}͆dݲOR2NUI>Upֿ}v8R& -MRqRQXf{ʅF7羧ȇJkB$QU<("Eқ.( U &.,礨R;x0X(`)T qm#{a\vK%J{}; E;A`Iܨ$2 z;zPew2Tt@sKb3sO ,qVNx3}ƍղЦs>NhGٻ}}G-c`ECiYsz1E]nc-{N}{xбN:=q + '\ Sb-R4 9W}\BʓF}H<2Bmʪ(u0kLQ}Э<ʀvE7C{C a;e2raDeR#5\f,+=i'1RIC&,5Έ*LĈ榵kF>,Ev:!IaS\ޗq!!DcB%qM}07PrY;V]>5"FHv$H0~ Oèha˅'} K2-ݬ&g,vnc@IGFZHEljY5&呞s¢j1]o5hD琀>(4tD)S!&`C[ FXoDLHh㎜3\K%J{};HPuI`$U<E(dv[[wDzTt@tKb3ԡR |욱3}zOƍֲЦs>)kGK~G-cX#ȳYDcFC.!+'yj[0L.{ctz!VQp|n@sb-R "WY_B]LHƏ"2tdU:Q1uTs4XDQIsQv7Cݩ{Sѥ a;e!I2l44Ee8YQ.i(J:GMډh sZEҐ+IKKwgDD&FDabD@\C5z#`h`$MqC{_>čii'Чa!Vjw!B:v߮&D4|@B.Eѧw 'I7a~L,"n'Q"V;,0]0)Ѓ{d1Sɢ6p\L¡Op`h}jfazޗ 35WC3,dݖ@[J^S9'9jҀ?nfGab[VOꎐrxp^,+O*A+U&ʁ WX2tb8$  fUFʻi^jx"v@ dq?Y*^u 2b@Dh̐1[yrdSL=;+G0"@t2"t4j]ј (o{pJAl/)tS/qˢrk{N=>-FLbbR=NtQJR)NػqV&Eh롍V=8f5ܧI܀0`dCuZ`LW aħ/: lW Nu5uL^is{ݲ_ݲ'H[FpT"U]`z$+K [#M![PPRs'-[^G@5* 01efIZ\QRAʼnnLn!JCͩΡlIVry琚$(Ń}[/YP1 'A.ܡ xY޲fPZ -Oޮ)WN=pb a׋ 4.JU :Fb,g `)xXnVuSISp1 ɧxy9W2c ¤"t4gUhpru_u}vԢ;†Y;) R|zlÒ4mg}!@d, 3`ገzQy|7#V ScD 7ˈV1BlwO;NG^C"ijeN@|huz]C~V5)|"ò23T+hvm0"AH|6Oas$HYoroQ:jR_?J0KHa_Roh<|Q}Ԁu,ICDP(YyIj._OjӭVŷ5ܮ~}DdEwG:;ԝ|+ y7y;M j}:bAZGHNjd;WK~kgP%[S. '~miFT^Q{O%#k&A(yoshimi-2.3.5.1/banks/SynthPiano/0065-Synth Piano 1.xiz000066400000000000000000000036741506652756400221660ustar00rootroot00000000000000Zms8_%&LM`\h-[p~IClI^^]ͣjgWr޾b7 ֛fvU~9zko7lk gFvhBk~f)r|.i'4icj'ɥAcFS!7A~F5Aexc#&8;r<4"0UspsdCҘ95RxF &;g[[! 惻r8_d>xr-T_܄ ceq8Re.EVqaz{W> O'S<\qaC5,d) }E`xjcD V(C35Un>g!dݖP[J~W@0TVՁFs/w UI(lRibn@]:} j_!I^`U )"q:j;x,?WH(b" fʈh|udS: R!~煉5ͧPcƌhGyCa(>¬#w =hGKܭ粨 z4 YUxAa@E}p,Ixy`%e.rf\ůWᬡuv5Ig0`dCu9#-5F 0pmcN)LX`TP3 ,D3G~ lJlxF+p1 &ע竍j\jkd.%r_?6@`fJSTWHjȝvH>n-1,vLXsJa"!?*dBf~1Dh!'M)(R褶HKFCS UA}oxb^hɎ@Pz(?"[F꼅cC‚Ge8D[c-复4{k.Ere*?ә@` Ugt?\?T]g,=eK a5$P4pYB6jJaI(]#CVBr-dD$&ADaD8\A9GQYvZERC+јf^;}Z_ v:A ٍ58G%''匶*CH(C;8MfMF5mD; $t-bs6O_L*e3M7}ԣ: `(f0mkJE)&S|5+u(}[hzP}oY$TJtV*l~:D_6쨻3߁A;rq:ӝәLNg:0%}‚NX Kz, .hxxftdZ{ˀB>mioGT f/'xFcŝ#(yoshimi-2.3.5.1/banks/SynthPiano/0066-Synth Piano 2.xiz000066400000000000000000000037461506652756400221700ustar00rootroot00000000000000Zs8_ 0&f\)˽h-l9 oeK$텙{6jڏVOQzdi$bA}/Ws}')T6%vxr~/9ߊ3y58} hܺy~sd ޖB^i2޺!ۭRڱZ[l2_܌W є$l4b㫫l-34i[,r۱Mei֧%]e1O$ #˥Π2RppedROౣ˲}lѳmJ!=H| .m@6yKlZݸ 7熄n\ [H})$Eҵ?6H33$T~ǔ-J;oSaZ'%Z Ui@!Im&ې>DTZ ʽiR,P*-֜V(*S7W\&t/ɓ'<ђ^&Ep~f;Vp 3y0(ɔVk`O5oϷyJ*E~/n%]'k51S0JAc4lRw=hO<. XZ/{yHyjq$WJ ,E#>ӌ4ώ,.1\:Yκpeх~`'f-ČliPǒH-M$<чguȥM{Tg Phϋ#_60smu*?9ʓE TDK7k.eWt5 ˩dxƎrQuvg}%@顜8CF(#k|_OW3BY|WEV̉$P1j-a*U$GF I1 aXSL Љ*^N"rHqI! , S3]t([h]` ? s#ڸ0ƻBY.d'Vtg[K 4Y:!(1Yu(d2 T8!8ӝy42$e!aG'z2A68k->̘!q! X/P p#}K=Juyfz27G42bp~(7OBVwhunD=.|uz!"94r&.8M [(.2R (ͣ&3BzfN7 rUF zk>-EDƝd~sgMWu * -v+ŽZf@ `K6q~4|Xu3B%42UJhYWD6@DaD;kmÆI8, !@Y=<hK~+uHpg @>l;@GӀ|p#+а΢,7f%dw=C6,csG5>uA]yS}U0@ XkR:,kS9FFՁ#?L_v4͂P 6<&3#LCLNmY8Πsr{)=c{(<>?TOzp:S=?~ʼnMc`^xټ_ OW>v3^6PrY ؈ ƎnMkCc"Ҁ]6776L$K VS?al˅-Kr-ݬ/M^سylac@IK),FZHE/eAB6,&^qMXWB_*=Cnd@ 4sbwdqP;Eh1Ifps¢5Wj1_n5iD琀>pK,tx1X^bZ(E!h*9r<ڑ+VPJo AuL { /Rg.dM7PveSpўVxIBH R6 $lŌ7@lⵗ߲$=`mUZ4U ^ \01bBX_Фd[inNtaD.Q jAu.ݤXt,SjNQkjZP͙p@/5R0Z2lUyJ{{ o=>3{>עUQ+^]R6ARVv pe!.$ի,+P^i|p7h/MKF@LsrBCEs-d$7z=?E>heAdP"I lPdkI`( ժi[NM{_8'/ٽ њJSũL=s=RGf6;e[-P?Ԑ@>g>A@=~HB.'Él'Rwוi\3Lê &KrǛT56nԻ6S_ {}qygyv8ȇW4=*b>e9csqѱ=S'L;X>j5<=sMsmt询-T0LHyf^(ҸeAwOnAu 9Qt4yT3Xn4 UœGTM.3=~hgH-=hP'_|31dZ%,%{Reiʲҷpv9ìHb5 5Έ*LĈVkF>,hv:!IaS\ޗq!!Dcxs)aCշ(b/{`W "j@~AB?CS}q}~K /vb/y?/?|z|5{sO#r /"-I/JA_DsG4hcqиqG!ɖABni2޸!ΛRzb,Olcxr۟ #)'I؈i.l%34j4-,ቖ mCf+V ӇwDa)yQ9ϗ*! "ޟ܎G+r7791 !6ϷMXJӚDyȃUt =!IjňI|)WW~@n0dA.L3rޭK,)\̺p_mn(ESn>s ’% 9Բc<Y4J#}| Py쉂c4D!lWɂtvZVPjY$Nuf#X"k Q a+},AɖteW>N;M *)8qS2%AHJ"In ([Ak%j/ci(r T@~b*Vj*Q_ޜdZԒ|\u,)R 2m-SjOmK49(9PFj3荽KiY-a/(n+Rir\_ixwmWogNǣJ*zūZUӡ&%jnA Bjww%^bY:* ۻ| g2 ,0/)N@L]Pc6h!\AZzFg׵#ST "(8L`$Z HRlW$֫'&^0S c~Bw$0wQkqlyyCԄ7(RGnIތ,t > 2 L 'ʲJݱJ3P=擔Lgb fp8k>L)qu~mO? \?5#|L[87A>Bg6gtBVv`z\#tzԈ;4)'ڢ vHPWQeFB- Bs &k(Kb'ʣC*BZjz53Z֗2ȗ8)Rd'˟;RgR=k2 gף=&:b20" 5>H=jڎPMxJHn RGeJQǣ ۪"DZ7"wL{(c@)*&;mT^ך_hQq+}vuuF8ph_nyWMhyӣש.o99)OpNT;/zsp>}t;dLkY\T_A"&ɞ>nwn|BVbowLj(U(yoshimi-2.3.5.1/banks/SynthPiano/0069-Synth Piano 3 det.xiz000066400000000000000000000037551506652756400227310ustar00rootroot00000000000000Zmo8{RiX}LbJv%N쯿1y8@WEI%O3<3=8n}lk,t" Yçn7lj]{]w.S{PwoQ|Uo/W"e:OCiBL`@˂"Tf lVd ^f6a/[> gF]CɏO+* i iyA!RJr[F1#M!%khD4ݕV! 9RlP+Zl..L^%JI-ΥkJuJϋɒ,ڡ)^5% tr(m+=CqY`/(%*oRyZ9.ݯ4&JK 73gQt7+jūYƳ3?rpO3p{L15.o,/  =F^tι(8S:!+^`:\#3͗ezԈ{& sm_FZ+`XV=Pq˂<2݂ sÌ4yT1X4UœET/S=yk.H-=/dۓ/ 1ɘR02Z.Ԁ`ʲҳpv9ܑ4Jh2kޜUͭ|!Veh`$MqA{[>ąabS°]g5[P!Z_ZvM,LyxwCڨ>»*: * {VxS#QucwQDd)ԓrR@ ]Ҹd41ɭ`FLIxR{"w_9]k*"~δ11ޙ3Du!*>&Jߕy:R-E~Qr ^ī_o=KY.5=zb|w#=+r~:)&'P}q:NtcEY'GW>aFZ'LI rr`tf. yf(o5}n0|rrˏfM<Q.5ܢ[;;xF?GmP(yoshimi-2.3.5.1/banks/SynthPiano/0070-Synth Piano 4.xiz000066400000000000000000000042121506652756400221520ustar00rootroot00000000000000ZmsF_A`e&N0ej S!F^^_=tiOfBbw{w5Yapմ>\4,C AO>t3^=ޏ,M(V~{/atl77O.T%&[xFc6vB]4i5=ȃQqM=p=i6r⍅/؈l Ngng׎Fd^#>jnn}lI3^ Oha ߏL,Lt>cr?Zƫb[⻎KQIW8~u&̏ɎE $J}@j} Jm6V5B =H|P!.|@^|2k]Ә (opJA,c8,_)=S/qwˢBi.tR&ac)7Р)%7ި9JQ"iF-*އ&\C~z  F۔e|y= M|lyj@T.!PP:sx5hX{L=uL kFc^{9> ]Rx}f$ٚbE@IiesAJeHH&1. (/uqr۲t=#`p.r2]Ma[ Тa(1?R:0n kAY-(l]m㶋Ur_hv-z8ƥ#|9/3;ڗ -$W)LzߎoQa,2Sh1@ nW 5 \&\Cr;=]=Tn"CrCp,@ s}hCBDC #A}oxf^hɞ@PcU0DŽ6j;6^+ [<1 Jz5[ژIwcKxTgo҃)TqX u^OL L'5B+uu]I*:E!gT{n<^yV6x1#zXƍB#SVMG9RcaTo,N67N{~ԇ^{8l[,P;=KgҶj^oI~0%Zd69$ 8ۋIiQ%蘮`<; 8RLeUw>:ATҜeTyMƳǪSm jeJ2kh:7%d4*kicZIҐ+nI 'DD&BDa"D<\:QTƇ2!hL|x{`p쓡 Ue !gT 'Dtb$rF[pRņ)cAZgH%i,Nd| yfX K]1Q4 b>Q?gr%xCBA1ǨWa^ycT,ݞYO;i}o͊9U]:W5Q-6tkZxjT!Lt4ΩQxjT;FsjTtN[#\BxjTatOjԨvՖCmQ_nhIuH챶/(y|>mϹY.yoshimi-2.3.5.1/banks/SynthPiano/0071-Synth Piano 5.xiz000066400000000000000000000062061506652756400221610ustar00rootroot00000000000000]]s6}ϯ=}$騶<Ԗ\K )DjIʉ{)@ͦ3}jC݋{p~40cn6\8yz?l݇]/o'cYޱc~+>ʊ{MOѓgF 4 }77Q^cMkl+֤NgWr:ѿvvh=[cs|y񓵏\ZmontqY/nt,6bbݎ7nq;mfm=dzQLi#Y?odŋ-/vsC8o]FDd뵻UAR=-}:hiLt2PŹ9s5sʚ XWuҹe9{;ssʚ>U9(5M*X<29  N3a]fY'4t-zT[eYZefP6C(3lX,ʆĀaB)#WjXPnXb) !6܀A¸a:Meum\s¸a31 ,[: w6 ـzgM a&9wuuuuuuuuusXAXAwFCF[@z8ӾpFGGF305# WˆzjF6@6DFoAA`F6DF @YkSA5#!3FF苈9ocV63Fp874Fh鄿1kꆰ 1k'1kT!uCX3t7Lg' atB֌ugx_ a :gЙ?@XOځցZZk(u A :g?D0` A$X D0 `=(A\փD0`! FA8 b]V`1 fA@9~ 0J 0 گA$X D!nQ 0.`#(AAy 0-k ڀAxF!ހq7o!ހw 8p7oM7jS9p7oMN7r8p79oM#tMxSuo!ހCx 8p7o!ހCx 8p7o!ހCx 8p7o_$BNe *Ydq.Tvmd !I"75.7tYy]74Aj"}AZAh,[Z#FOkTӄd}u/W\O46-A{G#U8 -|oRyv7ʋ_,H6Ba~InJ}8]`G輂A7d9R 울 !d:L[j):9RŒ\Z,Iurw܍mB匕A 8"5VH=춚ަcD8sfF3K s5LDV((1בę7bULA@`!,KbT*,%'DmI*KZ>)KQ@oLrs%I3"!Y}d0dDM4#CڪH}IU鰸*Y=*vuSYxWv>aQdݓkBzK^}i\)2= I][DxAg>.iP{"~;S)h;SȔӈ4T0PU7tuÜ>g[Jڂۖ*­lH[$.k~ 2Un-̶C,:cPtFǟ;3}t/JPtF茳=C{O QcY9}pv9YHj\]M.\FʶUbwjΎy Grand Piano Aleksey Zhehanov 2025 Grand Piano v2 yoshimi-2.3.5.1/banks/SynthPiano/0111-Grand Piano v3.xiz000066400000000000000000021576441506652756400223050ustar00rootroot00000000000000 Grand Piano Aleksey Zhehanov 2025 Grand Piano v3 yoshimi-2.3.5.1/banks/The_Mysterious_Bank/000077500000000000000000000000001506652756400203755ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/The_Mysterious_Bank/.bankdir000066400000000000000000000000051506652756400220030ustar00rootroot000000000000002.3.0yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0001-percussive_lead.xiz000066400000000000000000000043641506652756400246730ustar00rootroot00000000000000 -`\[w~_震ך,9@:}VfB%K4z2-i߷|ٶj;cu>rt0OW|㿆՗Q30ezcݍ wOu]1J&a. ampgBCዋmA |v-9Rq#Y:c׵:Yd6/d>#yk׵j=lAAV \#\)v"nkG[[ m8{(SM;"`cZҵ+Ɇ3!'+f&l&j 6龋R6JY)]FӚiD\זcGs@逯h/>8@պyFB% wIX~~\fAۍ8@ Sc榊OU xrO~+,JsŐ@VԄlzr}ur!1=ABպroPzP"l0 $剎|oIKų+WmNL$0s"1JU#~'1V"r>?8ri~OFDUNJcbSRQ&N=KJ88gH |g}ny$aP ΦS h˲N25p.G >c=n9.MfcOx" Lr0-qzA,tgsAϗw{{<Ӊش =:;2KbI-p/&R/).kfW K՗_o~;z3Jk c: %pZ7ŧ:)xrzbyܤ0(&Y)Oyy7$xknN`1},ȡ eI: bUn }2ҊI&~,nI~:7Z!\I9k\Q yC^T KS5-g񬴻*x#v/,@>d3i.Eӏ Dn6_S^l麇a{g*@$NC j2T-2p:t 'jc:c:ck~WkoVWUߨghVe}UWe}UWe[]y׾roWTf~);Ă}vOG _ިZ(jkraE$|dѰtgMjul| djvjvj.B' %iDŽΓ^F~yeKȕ'eO!PCq[-2]Ⱥݎ Ye>>c},>Y6XZ-:ϥRGWtI|2wm4VKհo&3r#֤IqЎIڔҩitYLה*S%dbldm ]WB'!I)՞D}X )08u4PpSX929^ݷuf2km$ړ%^yR6tow_ZKٿпKIӹ̿C T_e2ʲ,h2/.٫_[ى/Vyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0002-heavy_funky.xiz000066400000000000000000000037651506652756400240530ustar00rootroot00000000000000-`[[s~_tCL1R@֙ڱe-3a&Yl95yVon3?>ynkCn!b&U?M7V2vU꣜݅n|I~sٰ)cHZ0v>{]dEu]ƙ[9ر wlv̈́ͧx=[٧`n@1ޓIt t9LjE!Wh+clb},p?^וּ\2F|v0`hTp2Ŷ SE @!$a!BOE"ReL q%U ܐU5ˇ;ka{2&;ɗ{#]Sk_w;f궦&9t}#E!~m{ulK9DyXzPinz<rAÃfka<)7(5١E[aka@Q0[[w-$\Wp x1Ua  qe/>TŠ,W)y,"C+ogIm. I _RyX!%goءٌ aFTmK\#=4qTf[GTn]1wGNŜfiLq'v;z>6H<~dޒM Ri'"{}!.}@׉ !r bOL0cB2[_elIcɉH2K%Ci1sQpp.9;rTσÎMAԛvت&qjɮkB ohY9M(BzidtrȘնBj'UqrP <ZԨIӥ5\DcRIj0 jIEUІi3z.UDUe(]j'(Sku^f.SdzwOIKM͏jjQ&MgڢR )t0SLqG?hM0"S\_5a\kY7!,QMfy3_b2|ǥbDʕ\ x%#gO~Ԉ'97ʴKk7! <ٍ|`SU%-G>IV*lqTR+wM)5>WA2ވ;-d>]:(I^1tYDetZ.?{NŽ'cf[I(][ln̻aYZ7-/T &ZTkYx"+oνxx@:kuB @0ϯ=_oi3viSؚfx9Sިsu;:'24?YtٗZU#))Gy,8B[hݗ^F~2/#>8K|@+ יo\'/5cϚnX7fn3֍F>ߌ۱ksya5$u;JWw?vÞ1gG?5;VnC]di<L(u|g=suRW_=ތK.2yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0003-funky_lead.xiz000066400000000000000000000045521506652756400236400ustar00rootroot00000000000000[K6W0:6D=Gd=6I&ЈD2|ȣm %3l}H`4 OnCqHlcz"aͨԫǏj? t3⺬jl/WL~Fv|@1=/+~v"D"q(kn%-BзtضS#=Ǣg목z8o33 =m~>=z<]fld'sN"8^ƱU$a{|28Έv؋1x1ӟt45 !:Pm7]bd_Sj6."| _dV `e3ñj 9g%.un9ltH!(yt61߾fqF'þF`bZ}V(8 l0{Ga!Rʾ}"AT  XgYǎvg@ ~)t${rp-#)&6սƮC+> E`nvO-QR*sDX(5'd=^싆`/ƪmBnqƵ cF(MFǀ|B.XFrHC* 晑A؊sƳQt$Uv٠e9 Jm7>_ɸVL"dc%Z\I>u۝^-Dସ<6IlyiTdp%FAX1HOXtOH_!B-%@7~{TcR69Cz% k5u{hs#}hH?LQHͼ­U(dM̱pD*JJ*/pQ=@%N^T\ "m!EZ?~6~)nGR _*rIQKyw;~K(AKe㖦Fr}ϖE{ R\W`>t Ce1wz JƉ]'E!ʋ^PU9P[dr&k\fGg(mYJQl" hr)}&Yj [f02v-}K?SÜz79B^h9ͥ.%b4wR8E)Tȕ|QoN> fX=,^Ͻ~SiEJ]ZK2-ԪxJRAg=Ve|tNhEJpK˔eʔe~GD2՚dOMW>$\}4giQ-T_s)lE닗t H\}RB4ɦlF0tQX%Dq ^j80(j`{&BB'Ai1Dڏ@?JbIk^;PtM RpFMC=x]x<7xrYӯ GJ6~xsX}"< %~gI5P%,ij+aJ&vj+a*TMtDðBhC+> /?sO>d<\[{t)Ԕn= {%Q0d5Wy_p5_7z#z4|-6e0𱦘-C_\rujC(zҮS_ [+u,SQ1K]!Q'<.c.h҉r9]r% ޾jG4+Akhen@4JZg\U^SнWF i64yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0004-funky_lead_2.xiz000066400000000000000000000042211506652756400240530ustar00rootroot00000000000000Zw8_o&l16@H [Me:_%dɀ:S*J_}*U݇ڑ0wh=oXs|z7wm돽wy ʟrug[4 zKFc'8r5uQY84|5ҳ\?١G"f Lg +3_/`h2h:o,oM{=FqD\ob'Qj_ ҞoTMլ_sggt-~B[RJ)Cm"E,o#jEii P hW InOd="n9u*>ц`5Sdy Ӷ?丼}iHH8כ_E6rG X?[RؚXcߍ73V[[IDle+T5A]c?#51w, PbNG KUj-Eݛ9R/7(5<91tHAD= 'Q& ڽ2#⹈Re7hmUU7'd!B*3Y|7Zw{[UH9L=o(ri 28SD\R+?tB V8aD: #ρP:OVm<_M)1PӾ2w܁se`BpڔCۼZ6Je$\v.{BԎ }m_'?Z.V׷ ”DCWN'f#װ$<b>NI W ,%ȇۉӛdfp|A 2@V;$8>(pf`O2ttպqTԶ5Y'` t_::8k5SM,oN(+Hb?&$Y~[qH'{F,_fΕ>?@%_s֒ہPfk8˟/}_/M;(TQ|9-G+]d̩8f\@@;hN&)-DT‹[XϵX%tQp fŏ̗:2_^T ʙ3}Wg&OEuLf_~\y9cq%o) A3{>'C\,z_(kN:KǴK&TxQ@N)?iu,ng32ČzlWkڔ$A7zNSni*o$uJ(:zZ!c1zA 4);/O CE,Kj.j4uzqưRkE[i&82$2Xɶn:|(n㑚В2tM.*bxB_(UUGF`3q}h%z qZ|Z1UC,wEkuby GLHZp*< $q֭9bmY0ypOpKȜX%"_xаR Qъѡ vq($'HGs.Ґʾ7 V er:f#q /q֟рy\]Epټk)BRAw6x|DZ@p*Rws2ݩ؆fCt>[y{*7]>GqЇ'O<90m/mxۆ3y⻒xyjr ~HP-,S] gT`=յYOu-S] T|=Wu©S  X+czŐl@L“[O=ڃOD )E ihKR^Ȇf&).{#+us H_o=0yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0005-delay_lead.xiz000066400000000000000000000037561506652756400236110ustar00rootroot00000000000000-`[s6>a.741-R ^_4=[v-9Wؖ0 3CH]I]$KෞQLh?v-Ӈr|qxw\w\BWo]0жeӖN/I85s(| n=oxh.;ƈ fnbB,;VMv2d6eE00[龽%[L7 !e~Z[^<$AP ~T`:F <{{is=()4bX٣( B10q L-aBʰL)ssRs2fd&mRW;1bٌ 5aZ̔n1#Br{vVxXٷ~IKR?wEZnop#r?_/С y[fw0SfI9M5ɕ& ~CP=\D =Hw4.2afUH턘3!2~Ue`ݣ"o*&4͕9" aL!%fI~1t-S0UYoۊ驧O>?&(_n.74u%OێN4b~ꉥݷuTPd}RbHbjlj=jw 9=n]vvJ=qVaT71t>,r k&< 0{|ťbLƕX VR࿒'[̻ӐeڹMGI! ɍFU+%#!'D&r:\goCJC jHqW=Nu3WraVy,2JhvZ.Ē8vcq3-y67rt$#O97 o}~R N+N HU$IXSBjU9JJ -6K Е Gc^+.4vSErMQ؝*:s]V^'~:{N|pqձdH7_hĥfFl?nfFo|Smsv3ƣyƀ4C|5WGcf5wrDňVFdpX.6 ^3rE}*4YJ^*S u9CfeC8LRRqi\QWtcS'wL#,!vIJtqQmM_K=3yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0006-old_lead.xiz000066400000000000000000000040311506652756400232550ustar00rootroot00000000000000-`[_sϧpy>$`١ZrtEPcK%'cْ&N! ::J>}y= Sf_4j"u1y\{X ϯj_n>}w;/nHursr(C)sAϵf-$id"u<<́Cbȫ}l}<15 bCOp5+Wܓ+ZӬ aGt6-FӉ,),}$x޲ k1  b5?kЄj=\ϋso>YobHjd|=Р9s=aMpG6ǼtP-V qCfy3_bvVKJ+EՄLdbȻj,˴|:M/!\eߧzæ$*Zf2T;&]Cl8!:3&qeRoQҍt9a_WH}em+9;Ya!R`p`+z ӆ_;EO]o@nZV^EĉGc?#Hk3߷BW 15Oke9E x鏗x _3l sRWKIͮt2m8 $*-RϺ9q|z= m-*O Xߦka}Axu$. 8 M W Q ߳Uɛo#omwF=~#q<֙>IK颼ߔWj+Y5֕|JYu%߭ƺ_Wc]竱8>r*G?0$wp~p8/E|ϕ#:D_C$?%:5 !4 "ꥪttr˶]Nw}eӵ;w]Ng_:5iU%bngunnnZt-z78Mehg0o,8r,G2yGӴ!8뙂#mT \y~4EJ2yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0007-8bit_evolved.xiz000066400000000000000000000046351506652756400241170ustar00rootroot00000000000000[[w8~_NlB2 3/>`3a~lْ\$9ӻKTRSJejliw4~j7Գ}O٠Ӈ]ϾޛAI+ ~s#ˍ:64\/xM=VZ Aɢ1!S0? JN8Njl#y-lqtkNg|/X7u`[|lEoO>?:.Gkv9?>=/a$!66m#52*xdM  kkpdKpN3Au"df6\fnXp gz7ˍ,/$`tELsȗ|Xӫ<7UJt3rz ɀiix{3=J)@^+^uogm|\=9FB]'Zb=Љ'$lʷhgjQT[oسz K"W2\ȖVֲI-]QGK}ϵԜp҅s|:bݽlPwSA \PBLF&|". Ա$-;rWGȆ]b-Gr8 #NkhePA=zHKO7ސMI8(葊ʈ š!ǦnS4$`0E׽w%* ("5&+^2@k9wnh`h%RN?RF,wn-GHNO֛} Bj$ѶWy @Ó<:u@"q]F#דtL%±IDZ(QSaѝjD1RFn)"R/F{A&k)I0=݈y1`;݈X}u7"d"#|ךR1wW.d_&f$oI8Pg?u \P~ D5'njQ\[w( Y#$o*%K]HoC54&%FA&P1l}2?!J2xg~Y~h"Y%hR.j4pnFR(|ɥKwj340zW=^Onx0МȬԖe"1V"phZ* xE4H1Xi8-z t }W%JV;R+\% 1y =THٲQw ֐aR<Ү O7PVfuô`g@ jl0(T nv W3ߩ!<\@a!.0^nVyC6 0 bY+95:.QVm NGbcn:fo'yU5(y+둥wZ-O^+[_=e]x SR5HVa;tdabNgߕ<EB%S\ȒR cxciBZY%[( KI25S $}k8E7GnF!?{*ok)ܨta=kOQ}+9STe*yx"`xNWG\}~Шsh˶Dw} gƁ쵨v%Vt~}ԥe .}CUTx\!ÎǷÎ=P,;.2M 4/zTvUjz/N-\}ȏA`p>;‹Z7ƍLZ&?yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0008-pulse_bell.xiz000066400000000000000000000041311506652756400236430ustar00rootroot00000000000000 -`\]s8}_16BUwP@-mc0~elcɒq)Cwb{uut$C⹝gF?uz–o;Sq=~=*L{aCXQƒ᧮-88y~``Lv9,YX>;w`v?|9GĥCfQD:7ХI3;ettg9-!CTmdjEݎ&W?Kؗ&29Xy2d97rjyxDGMqZ!!ȋ@B09!#*v,f K xfжS=|^>ޛun&t6{nG-.Ҍ^=wA2:S̼}3Aѿ>ܯf^{ }\):nZbٚӟd=i&0+h lEN4fkɤƕ$hX-^LE;|E{ra1*C"m@|1O80\%9`eE(xV]<.(8@ (ˁt !ĶѦN@ B]S%Q6en5r}!{@]IB8"\o3ĵ< +pawPFWQcԝtS++ߜf-L1t!ys"Ln`"d9 U-dFHu0Oԕj1`J2eG ;tH+n\dR4ûCg"D -p0qd]?]ß!e/" yO }0ei$IMݕfMH@c-:=LI@/pK4,2Va\\B|L(#YM<QO͗o#5WX(Uˇ!%-8 PO~7PBq:`CUφinPA6(q?I\M$[ɍyA%74K7؅vD2Jh(/ :ko}}{[ >#`dabEf:2ЉE(Ղ@h! ]Jn֖\J $mP1LwC<1ߐjcF;g{2F*Fm:4SD,HKG%!\{u&d_M2Y/泛]ncmɻkdNfF{ z5*r6x{D??^Wrij/#ḃd=Ub$oVR\q %OE8{Xޙ9)S9Veђא[̀ZRߒԷ%-oI+I3ꍿ[Vmi@[Zַ-oiwyWO~b߯AjEć|VKUn8(~myPu`CgyT>+S}VΟTO^cMuc=X;V%AMөy^iMD"mIFd}z'-rzC9Zn0T W j+]!wp}j9}\d$wPbiI;Ƨ]i7N!h:P"ao*HY਩`d7w^5zhUW^7jWMo~Szuԫ^4꠩WM:8˫ٶeٶ +Ň+iT-Jyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0009-vangelis_bell.xiz000066400000000000000000000047631506652756400243370ustar00rootroot00000000000000[Ks6W(:dD=L)2֖[ E*|h4HP9vl}| q;]6wfxo;eq1=h~pC~ngGp\6;M^LTq8p֊^ns ] <F vaQ OMXl>/fsk} l½QVIlTǟ5Ҟ΄[~?n|?1C:5[?c;E0HcpVDȉ&D[ UCPBd"0GO7 (l |W'm;5w,lljaqxcl7u{OuB$JES5?tFuS(0-f1"?~nEY?l~XglsCњ4~3Eb 3KD>>5N KЉ[r093d㖘&Aib?3je>Ʒ4K4CŬd \ʃfBla4٦mᥫj 6dbG‚3s<V/z `ty؇ijQ \E36pTW%CX>ogǫ¨],ő[졭w{R̄:v> x\B_;<,@qI!kYk"ޓ 7(,UeLZFC8cԜLCV4[sɼ3U[ݔƔ2!;!0pMDH"6 Kp!Z]#P!^0#'RZ3=c+BuύK+Q:6׽7Mtzc$  Wu$$)SNM;VZkKK:IW~?gA?HՂTw(+ҝvpl PNJ$%1"\,'0 >7[׉b9gNaj u^&.L$"8< FGR }zoh'JzD#Ӆ1R $('lkFK\üua^Y.+ʂ(_5|_{IYF8!j@PQBtWZZTA?2]cxZiU+ r8(5P5E>_#5 "V=L9 yT(yFzTnVPB$p:JAQ/W!*$^W'q4OA/1_`T)c9ԥ G:LZdOND<_hND2Ji| .QlbVx 8p%Ğ: qL90Á[ xhTٰ 0L~,EUk$M~PvK!KțG*wy? `cYz.?LM޲PχCֹVf9* \d4TnFN-WHC)^8240{W>LfR=x y7%6YI6!KuYBiЉ`gYVq]G{i'8>*u)e^,[,Y¯xGP@SwP]dBGKqoE̬]sKK*@N(Pyb[+)s nY ,;`o#`񨣘TE)VE,h:!P*Z|6$ߓ`=Cߕ75W[وgjehc{Z9mmOϐ)D;Kj𑬿vjrCUbNKѣvs2CFqkL<=nr"1c%AzgZ Z>YӋ2D-ڭICZ⛑n蜸δnFksaeSsZkBŴ7ܘ#kCC8Lԇݪe0Yt4@7 Ag\D6)pm.8j:[_W7 `tG%e n폽=Z/,/ ݆SLC7HsszWfkQD!o7TB{zrJכ/e6@L1 Ռ(ZI4'T :.3’Q,=iԦl$Ɛ/t[Xl0Q߱@$bͨlbruϳ!"C F7Wex <{C|k:v.  vb,ɜď)lȵ%V=ck(Õ=K9f%'q{) +x%uG^§][$;;c*fN# |ΤJP=5{oƟbmƉ/ҙq0V5{ +X/o٬sHTǓ>B/t'ؓ zU|3zZx <|7NMc?97Np?'rͼw/ ~@ʈt6 /S'+(TrTnSWʇx|39TB!kO%0@ Z'b%[3Kpt$A!r:#9QZ iq܈?ːıD CS:]IBm 6#-CH5B>kkJ!-&7 X7ϱD+[zz'Y:䢖L3*f4+V h+RNnHH˦U7Op(ÎВiy5de+_!cA.jdJ< 0Wfs獁]ǺY%mg-f*e*e_GTdX8$ ]_]Hޡ2AU*(Tx]ڿYC2i_,Lu1gA RaBx€jJi6hJl0xC6 (A[iP衎Y]{:ٰRہGtn/]Wt\Xƃetr7}TFZ91pחw@d%*=p0uˬL*# MTW GȒxd7-uX8m:TX=r"Pv*Is0(3NAVO光4g0BȦFҜY⟞2R1}}xu 1hC!c` c8YCP_\<?D]W$uU}tMK _yoxהּh.j[\mpqK2 =>ܲ=p=- v~ q=4}JՕwȣP[_]ʡBCE-zˡ-;/<#@rX=oqg;^ְ^~:ױ_aܷM!yY~EU}/4WknfC7gaЍplFo6Ysj6 XxfbhY{?"w4I l@H/mQ\̈jʽ"Jq~0j(O6SW:\W@k[iJwCde][-_ə@ _^I;_4|y:]=P)T]3f Rzإ:;ԉ۽28h^:uja{0Ƚm8?.[o_xAJ:7Yj ^zt8㫱>F?vjΏa`f;W:/x ;NLyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0011-dreaming_bells.xiz000066400000000000000000000042101506652756400244540ustar00rootroot00000000000000-`\]w8p1g";|$g0f8@Ȝ[Zrׯ 6-vM}cӳhOȧ6VCC$Uͻ?NC?[ܷyyaA\v(Vw¿a4#;QlO 565|!`4}&tcwLj2m5tX Ǝ'쾿O'7`Ia"n1ۀ"[ nmhM=UD ~Tfڬ_!xp6ke>A=,+ x6\YR.jLa ˕JxdTeDlIʛƓbx?,p<#ߍG',=$g]h yxh~!&owe6ifWc5 q6( -ZTw!NŶ:x"cj)xZ#L%X:-e0') gBZi LƋf[ᢲQի"iZ܀81&tP-\%NErwɛ,~:Bnx7O&u'5b2m|- $ `DՒ!ͶCD居_ehH1lnkuN(c=.wG=#+Km;QI''NMrV>B2MDgCd]7|Ļ'Erng pWzEKU8{-r&NwCTAoKyɸR s2xBM8;˶~5}׸p" Mˑ{ad4aJsgۈa]H 96 7pb\`XJ9m8e *=Eseh3f?'y]B,BׯB5 )-|:.z4=ޟcE՟$SUI}j紧x؝:IW4=Iӯ۞ s2XҟZujUO.Z=魮ѮО (Sh3w\JB _k[dhM)T]K$3$syF]I6T /,#w@ZQ Zl|Ii~ģ+ĞU/k!*jĝjR",j|:O ^B2Lǃ59MURmJ02b*XDK#Ց\5B48$t;_t ĵBl(eG/?3@i;%[ ͗SKk9[Re8W9z:Rm %iFy`3o?S=AX~xLi/6BOX)3NL$/TKzK:o\o ^ /m*JT@%1KPEqrSY!3]K͢s:%WGdtw_We7i0X>-bЂ?c9Z/ #ݐ6N[oUYPK|3{v?s;鲁kBRwfQ9\72r|і.2o]DFa =~Np?U=C^rģ"'3K=H( U%'JnIN$`wA\~vy5in{Gg'T04wl>׬^b&jRR_BkRz 3V~ƒ_&3ՆpϘOş|$~6^|`8v?{xZNϗ;i/n]NܕQ ͗35UNn*蓀*WI7+Jyp * nPyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0012-fantastic_bell.xiz000066400000000000000000000045131506652756400244660ustar00rootroot00000000000000[s8_CqbgiǛȻK\CKtL(Q")RaU~AyX;~H:ӎEz>}<.'Η>tsXӑ'N0wU_|ʾ;d&&kyc[nw>N·a7IA4 WNDIX8ՓU/gPt2FZa`Q!WM1@cuOթ珿ih$~D]U_Fs=f;g\ ~F|J@1}Q.+~'d-O$J7} LVĕ蛖`~@F>!:hg&zyw2GpŹnt=9w7 `a|^a8]$A𩛓Tisu>NOaĐyn> KB"?L}ڝIs ~|Vxb8LgJ~l-1Q"ܟ췤4 74m/ZfLf*C&: gdn K5xЂPUMΝ{WS%/ShOMH2$)FВޠݘP%snwTKOhuMK݈@dxSZva١dmC"# Dz-eFD}/YdZ!RPhIhG=ͤ [Ɖ{^S'ICmF Wڮ\XpHP\hRb=HS[\gs{1ǩ>Kdȴ0}M,\cS0r" ֝́O Cʘ:G!| ;V9Ff|^T5zhd1(o^8W-9v{lk׈K6;S .烳"ъwv?`T(gi%QN#1]ˀe)H)ǽ&)fIG)aJv=2!ɩ i~*QM nI_3Rg?׺#IJEfڗZsCU(5W}oW %W9CYBj޽֪ݦMc1/ c #js,c蹨̩@ޜ1&*r-_s+Ɩ7 ^ V).? -WFf39%zd4t rul!,:9ȶマ; c"hiR6R6iXt%y" AACqS]6+VeHbuBbekd;/W/cX닔ێJV~7]y0)DlӢ<派fuA3HɆXm4N[Y`)p9y@ÉkNBbUx mt4~p9VUke3cxBC]ى"{pdC}?RiUI6~>Zh-ov }5=i뜬 7t5IAvOu"_Ȟ#;0_~:ױ^=J<6ҷX%#_6eNQ+,*5nv[aVl'vۉnv[aapj'D El6iO;icH{WVޒJع^X(:9P@>IbǑ4T&5\!7 A\/d>Fh\pAݳI"q" Kb |6 ٽN59TCO+͵r%#ĔwSNBBX_;6XS;t} l8(R=>4p_`7űek^vC(5bG(k{A7jvdQGWI*?l4yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0013-outerspace_bell.xiz000066400000000000000000000046241506652756400246700ustar00rootroot00000000000000]s6=B+Q,{&NF^0 l$RcwA)QLF~hRzw/_V3 #/vNzya6>:m.o.fn7uG.))'wyז_<ߩH4)ںqbQuKeݧ zVQ4Z¯gQܺK`=nr b%[ N㛻lr3[Ӑ̃`銝GƏH18nXnu0/h?0ߎLs/{܎F̾ϖ< YyGS &bY/fYH+.A7kVHC}-kyO )w.ۄ B.mbr!pwus0' hA vt9瞷K|:_Ϡ>]~@ys|m 9Xa2#$lL*w ч~E Ęrp]^Mf9Xghku ]D@H}7XA ZXO p Ib2pxC@Q=(7T-uHXr=w+bOI QvNIh |!8Ἃc$kU{}uskc[T?x&ܼF21s3N$?N3rj ėבf 1\tgP@7g ; u+R=߬idlIe_\i`]-=9|&[}Aa:D $o'KQG&W͊χik3D մO륟uii9 GتIl d|`[F5>mz#:0(g=s&'Z{MED >lx.o٠;mNHiWϞ>c?Zoz.iO4=3ިF} H뿛F]<{|\VK4 7ed0?.XnWpBW&FPEǍxywxy85?_+ xuhy4-W"jWEt2,grE };Hhূ|j\/u4xy&Q+,1t odZ< Ayoshimi-2.3.5.1/banks/The_Mysterious_Bank/0014-fantasy_bell.xiz000066400000000000000000000046321506652756400241630ustar00rootroot00000000000000-`\[s8~_ak!moqMwĮqmdbgj{_(i 4t<~ FH;D:H:W}q9l54YxiهOixC۞ŋOlD+6eN?0y%- d4OQd!"Avb'kz8"rd2{lD-d:'7SWBs5//GVfa1mਡ5!\@BۡHtFu>z4vRAkd1i~XCLud84/"a)a6e2r-f &t-GۣXoBUMh:OMcRN&6Ζ#(ژ 캟;"gFKo ma⛗q7i|!8t8L寓G:X[[:JKO~楝yZȏ=[[l>qrMJ:IUf7SJ45s#$>E:|Bf~-C+/4#'bNkͱA졅+ \Y5d%c"ox#P n$l02JL#Ôf2su:V۫R}4Fyf"4y %D?r [P!5hl-lL%,8--#eL5If:0)kXˎN"ȰBܩ|8`ZEnnGtcqcbzjHBQ%#'0-QA'Xm3.F] w*j2gd{v@Cv)}Y?IN()4txLT$uv #?3۟._>!YS{lpT2uĩ"R XKCK"ÄZDEt]\4Y?|Нl%\k,Z)IoWY޷1=&JZ~.zhA5]HzxET$%(.?]e BH?$A~I~9o,O݁w[i' NPTѤMI&Oo]ia7$4t O51~C8s19߃ϼ-*y hVfrK/&f<63F*d'\&j\Oz s)?63-.'I¬9T{7L AO"RYo&Ïo$ih)SL61].u{VR@Y_rJ*3˗;^r]phٴT W\܉ Rg)1ٝgpDL?f.%rq$R&@025*fv1hG6kPg%yqQ%7y[zEt$d ]aq$_[嫲곯>3w8Y:h~99ڕR"n*R8 LZ ֺ[AxzZrDPf}ZX彴oe~d7Z9˲|\:aڒ#ġҚwvf~zʀY)ïûb >ljy3XnȅNTv]E3(ߏ$n[ֲvd2`ڐТe7Iv'|Q('2(ʳb\T^tASW Gn]ށ2GyFgmuH94@9UG"Q "5XÄz kL0!XD  K@OjH?P[!B){kDXJvipϵjWm>| mΩib$@6^j p]FmFjVըFm5jQ{@m]hDmPjWDmȯ}&D^O^ceb<+F!@LFb>5/*Aa[ԝXd<{}_DrNFsGrOg|m9Wu|'X_S͘ \E>zi=}r]UTlphTAWk],>*- f g|k~J[yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0015-mystic_bell.xiz000066400000000000000000000045471506652756400240340ustar00rootroot00000000000000r>_e=Lim*-;Ʌ A`|h4ϯkaUnQj?-&gϟ>|˃;ݙ?n κi {tmkI=c'}0S^ BdCwaz opڞWQ5}$AswZB{z| 7߼)X:p"`f`vDъHZ:Ds@k0Zs2#,TƻNbpno}BbHFoTȈ%q-Py-*w ^ǚ-~A&/ )S=NO7cx`%&5v.3 v2:K6D D|08\˖z; DՃ2E%oI+ޭzEg ؕ7!n^6颕;Ap5\d=Ao~5oLl`R @-hTch# &! ,)B&JЦRHhU\B@9$opl9RĎ-n;׾1貟od>˃JxQƻЬuK/*=q8،׎V14^ }*D1BJ< Ӱw ^'=?s5gn%VAI[Yc;1<7F9yyt*ON*o:u*dz m*_-tg{˓lM%ñILUgI&rҜg߂(ƊCbm*?H)UDEŽgػN!|~o1߮2j1߸0@ 9҅k} bB#AZC0ګcpi23o$$SETUDqGs~?Ϯ5 rﲘ[8OMފ8 8F0e?D9TV&^N6m"p9]$E?%H Mt% -_Fڅb{(4C "&7 yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0016-pulse_bell_2.xiz000066400000000000000000000041421506652756400240650ustar00rootroot00000000000000Z[s:~_&LqCmY vE%l|_p~| $UU8VV>~~ٹ Bn/vyo;mi5n՗Gߣ7e¦ߕ?.v?m/y-uf;IXE V@(Yq|)wabt alm4T !ӕrva)G׮.4:O]I:$p< '!# a!lR,e8hmU7 ɀiix?]=URw!ꋁ7h{ꑽ/JDl@@=x.LcGB 6( "s}ˉ\֋rR8~ƞ%+=K'#yF[dIEIU.ic4cԟpԅ9sy?4qmq*y)*Z  @'B Șl0P`u :$8[sQ{RuX=ϴSRCR̥cS.2XQEЁ$/řAɬ' Ol*Y{wOH&Kh[߫{o/YKߜyd)eW+I~cݾ74㌞tdhv uI~pc\]H~0,!]+O?;$2$4$?BJ×r]F%''dN%ñhĞQ&ȕ:ғ9Rg(UPh7|$u o~bŨщhP̡EG&D1&/?oD݈ TɅF~T] yl^䭨' 󗸎I7^p 9Fqw8)"y\:Q$J8K(In&+oC?BT'l9J4gqYxi)#?Qlv'5Z6M@hV rTf㞆ښD-͗齒e}>QZ]@7 QMš* إv|"ٌ1pim6"?wpZ)U:{U: #*}Y >SDח3 2!U<(x.  $h&pְ9amYNr)%iȡC}y`un?H\kqt0N#W t]l5ZTsօ D~P!YiUC sF0Q&VDu])8/#TB)TI'oঢ়bDZ ۿj}e^si9Ivw*$]"VޞM{g<(xxۑ>W7|3s#}OC(y$@yNTΚnf᳙FmnfS37z ;ƣ %;1 >K=dbW&gW/?|fwm{'8w߂SwO>w?L8M ̭wpv?| 9g؅Wf8`TOd؈vAl2_܏W qAv|Om-JcbMNO^>-X' j8^aߛ+ṡf:zy xbLIV $ID$J=Ê5l%q = U 9Am狼 )΄ԥΖ9[1s0o4[j ZVru?F ~ :7(0oӐ~%!>᮳I.|,Pp&s;c+!iq3ds-&3)CkMɬ( hkmdcSWxMc2yDD!(\od_0,11&@"`TQ7@0%D:[(1"Wi|p7]=]ʼC0nu}\T ¾xrRȌc'ےBj⃻q %XNGM`[lƉ\S" kGX8 RZb U&NvG [yX(_Obi(SbL6!z?;CS2e"&U|F+\&"6AdE%8m]װ[!X8#opuoŷ.WU8avo_Ji-e;7()W|t9<;"z(-a?\ #PiNج :j_6Q­hi!0軛I;b='Nj75&OL!m&.nQ?3TCO s |p0~4g7_D$ϽʸV| pTT</ŨB` ظoEUu!JD{0@D(.oT]h\Okf9>qy\|yħm))> 5Sբ4ʵ.8U!rxI6 Z8!OAեF ֨٬9R%򞄂UqT*% )Sʌ0lbs5yb {俠7o+ o*+^.R#bdfSHj%s2#\gٍv"|zcݲ)Edl9qDǧ}pX\BC2vQY58ռjr%B2򝳎pގJM^W-Rr)g³Lh8+~%ƾ/뙙?L}]TLKeb9VqJF&.^Ck D40zQ˛靔"?hH~}}3T" z̩Ht ,6#Kю*H7TB1s9^{I_IxGPRgP]36QFtdi…S NJ[-z:p_n4J)YwA9F׸ÍL6N7aJ >t%UiQrJ(G{fyFEƋlzCA߳ܤH.#~Pk{B"#@{y"/)?d_߯dK[[z,ycF0\X*p jq "$ p$0?rъK:K^ܥ5%5jkizhk_hKԺ Q|Q{FZsJ^˞{zث7@ľ;%{Zp?nT5k|^N PMϏHױ_%#/pcEkfr߷mu j}LmBѭnAZaVn'ۉjND_hw&^>O;:iKomE 97+ڗVHFAxɇm+?YV5 u#Znδӳ,@0E{Uf% u45"Jl~?vilkP}bG-cKX U|xzy,2N~?/:yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0018-synth_bell.xiz000066400000000000000000000045251506652756400236700ustar00rootroot00000000000000[s6_݃+S-y&NFlɕNs/,6C߂ IѱzsCл `@>~~9# #n,vfv1~͗G7uzaʟrqv]aȄxO?/pdҊ^'n?;"'+3Hw؅NNW,d+b\=L6m}x@n{DĆc7'u;=zď蜸'oDܘu4c;>Ű1IXV ȉ!B EqڪeN0!KXc[9 AmgJ>E 6΄TU\lpn3S uS&uK\c/u.C[SҸ;3)*B9&'?>sTI|$PpƧ`sܪmIOkNS$|N4%B?vX `F|c>t{I]t[Wnɪ]Ă aù78JNEwLjx6}5RŽQ)!'E!RI2\}<`Q`>wkBWR̈9v/Ȯ!Pˑ'*I)P-b)ճ&G+= ;Aq5bK8r ]D##2$qx=B:ᖋs'nsy|4UۅݔO9ƔPe)(B'"v~h%8n]#p]!X0 p4yV\tŠw"Pl7oR2߄nIrq]k1pʒ3SV{iq?ާ@9Wzx5 H'i7ϕro Gw@9*t@`/F3-|$ (LJuDܧ +|5ǵ_çM*C{1$ F)68( g)̟KUm8xd ]f8*Q*f~/(s tw2;}0H敭¼>|eEa=J3Έ4P<voVc}]F׭ T11~Fl0 gA3rC*—r^BAd)e8ɳR^ٌ\HYn%ᎧJ-2Zr^CfPb+ΈR"R nXo4F^/̷Z]o\@tctvOWߘm0jQɅQ#x"_M&IRJɊZZ՞Y"U2HV=n\bjF~e1y~YΧfnE[fω`9fȨ2E8 ߨ\nSUȕȏ6q̛jbPDhJW;R UL{BkrԆ[M?$cYx/HFG0|H/1#M -HYdgT NmhN ҉DHۆ`˾L\ORXtvVA똎 +źDFG5MuA% 8B`YQUq]G'\ 9g4M)+S>W 7ob o)2q^ACT Ztf4 /Sc9k\*,s=N1hLvN9ALr>u(9k1Y>vtO?ŰO4V}8i _‹1zyo9'W4XgcbxX{Mш0؝{Ro|Qj=]Aބz??LQ-p54?7%F5NNziŋ<(4?1IQs(5c>ĉ7D'4ϓjDY;ѭ0Nt+| Du;ѭ0N;}~"6*'xG4%7IxEZz>*|0g3s 73"!8> o31{Hϗz,'=z{> + "_jsiA/o_mTΈcZh#\[KwФabۡMӡ}/$<8OބsOïy- jԛw<ëC:u\V5pc5 pͯI[üFMG&ȃXu##%F5yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0020-popcorn.xiz000066400000000000000000000044671506652756400232030ustar00rootroot00000000000000[[w8~_s Nap&,9#l< :̯-[%NzftT.R|>G6q-vܧzz5l~?&Ӄ*L{e2qW6;Mq^ȄhG?qhŠnO^sUF4ï%a=l=j62"b%]ۄ~-> ms4'7ڡ8$6cz"aRW?j]OK0҉Έ[~L0Z͵\K=3:8Sc4eNB9n񁸠J"-5z%@(KvXlLxKUlZ/03P[7?oyHB6WNc ISํޟ>F$p8׻?52iwj nni[gs١3zp.b|po )xam m,4#7fkط6uo:GӘK֛贇8dqgrˏ/:@`tE$ĵQ Ы* ЋJO >?).O Ĕb0?֏@q9rnK]s7`n\dFű]Nvx4q8RdYNtB򰚔l_0ZG=kZ;"w]!,*gEKO4!q:J -DO"v/TlwS{848eSBiBP2v8'DzEl=!hY;.D 8Hplh1i?7Š3&mSRkC߈nIr₝O2/̲N[ZTwI6\nOCYqFiysZN;Fo02ӘIB;4^^hCRW,+x<>{'}>1T_1/9M%|:?"10XAXTRl8>Htiќ?6bǥqD;AHPR1k{F\ՃuA^٪.ɒ_bz6J11 Z?;׈Nucu]cpYiWޝ'mzg/Uͧ;蝔EbQԤ+\Xy~n)U8ȓT\?@RC/Tj*E^*4lP< =%͠(ZūTD݆j-$6FV{fWOw+0_Re0}2@7BO}ϘU1ɾT %:ѝۣDj}ϕ2́6ˈKscMطg"/ج-i}+ 'v& /^Q~Em>Qxؤ+Mb @ Л.wʔ4!!}k4*Ʈñqitw#䅖{[z,Y"Fp)S;3,4KzsqG0EWa[Ƴ;t!VBr+}+z2-̄=++ YcUuz|P2Ki^گLY/HPR+_UHZ_-SDWϘSU8s R6 AТ3_69"u5iOpK"5s2B<(_x& p#Ulc?r%:JUZ5:^,P:!>Ob>' 'Ձƿȕ5V}4oe;,<_E׿VO'MK"_T KGJkᬞZ'>뉮zkẞZ'zXǝꉾy;0mxC4!7H ]xGs:5kZ+y/%:-hԉC VbW'uYM h^w=oW\W^|ٽG^f>ǘZ,j޳|Y T)_3 M>À`KgUQB w=V.iʉαksxU2yv|.~띖-f/;\nC0_/$Z /lֳV!WBl"TPb'E 4R RtiA6yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0021-popcorn_2.xiz000066400000000000000000000044461506652756400234220ustar00rootroot00000000000000[Ys8~ϯiGU"S;%$OMD"9<k~6H}lSCh4n~4v$Ͻnq-vbtv݇L/f?{w`x9ζ\7;M>t|'28Z -ܘZ9mx| 9ˈ$Cѣf##+#&:b<|m.ޒ&ܻ!AbatOfR>k]OK|?Md>&wœӥ[ @0&q/+~s"Dd"q(mUY%-9 e 9AmJyE &oOÝ9Yㆿ`fz͏[^·V"Y Nhh7O6ywmeYޖ*>l~(F{Ca^9${6=Sl=/&A4%/ WX-A P'eAxa5٦X09Fgl#5'693[p\s ""C(+b*F_&_sk Cߎ7bms+e>vq:6. `r|.UɌcG\js[ّg9jR T8[lHluk%t#(bvO-\8zcTpDž1b_T9ݼޛBfqw cF(MJǀ"|B .щXFr]%pYW0 o4yV鴟r7"[PzN ?|g /u|*dA{O#3ҊkfVOҖ|68".{nOCYFi}޹J~TwGw10>%#"ERymVyd[D|c)0 W sk ~Ht F KFR R@==ᗲ8&Qrti\)pTT5|_do_9 pI_+w+Ꜽ>,%LW=Y\>u -ߏ5S]'E%v+k\vwG훶W2ߓ?:tEJh| 2_ ʑz  &Rc Xh*V  ?-)LlΕQ"L MxȕqЅVq]GiwT,_W1{4))$wk,Udy"#TUΌ@} ! ZZ5-RWCF x.|;~QJj5h܍LVNV;~J2>t(59kt^Y޷vt<8_d<'сyϕ75V7oe3ڮR+s?gSԊ3紡 @\}}PBԳԤzkލ`hS4F,9һT#p=(>*'BBAh>$I—mW&@ .u'TN1hG݊SէoX+#SP_x+ObNA&:pzlCSP/?z;_]ǿ/x#c~5'H>8𖻂2_~֑OՇ%|2 S™ˁ kaԵYoZح7u-\כM}YǜM}vSڣiEoh+$|UJ0G#sqeS"UX. :)hӨԢgbe[^w=oW(Z ntePe3zL4|ye0aS|-٠tNt賻Bw9%B*@+H`'RU05QaOM1=yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0022-china_synth.xiz000066400000000000000000000045171506652756400240300ustar00rootroot00000000000000[Ks8Whu݃#Qe*NcG5^PYPǚ_ $5TF|z/$]5f[]q=7?}|/p7umYś?a]S&]_\}6L8 [ܘo#b|Dý{p2"ۃ_Qc=P=j62"b%] Ng^O3hC5(<!q@cէFK'^=~OMO$LET>۫1ZKa/W\~Eq|+ir%%/n܈Bt$r0 Zl)&Dv;蚖`~@F/!:h&z8_es-Tj|| |ݻ>FEn͏վ?:GQ|$=>E$pi?2i[z`'=$kX1 J{Wx<:pZIJw@+DfF,PrXl0a$:*4#TA:w6 B@o<)18Tև82s)Snc}9$s[jH|ET1oTY77*ĤaKzĺviIK1b[-e"3d6wNEoVˉd}p#@#AisŸ|6r>ޏxopHD@1:^=Nz r]ZE1JhyfF|adQWZv#Fޮ葖pz@d-::P<)ـa@їӂrd9TĨRJ~eD%{Qk___JïpPM@rG?dH*,^ETJTUTA]i( ޱ:0*Umo {B2@|jJɎmu# NFF%F;7T|dcL2>. k(-znknjn MY>Lz.\y#bP[{؊<wkyBl,/ǫ̞ y͗ GY_ՒyD}b,n `HZ9QUD"WqIL(cˣ}?]?),duS$}*5R)qKIʔ8-MIt8*m_㩘 }H"J:2(zXs"ľ_]^GntB`԰50lV;Zv>BG0Yꢻ aJUH%ijns+dz_! A* uXuM®pi$D`+ywRUT-qP@<"3='pL I\ߌWoگGsHf Mv6kR滅Jl5>[Ϡw2b=,MӖ}r"_0M!n{ݛkihpuɏnI㢷,=D1CM;߼=gSCirw[SOIwC<}fRes&#}KcJNb6ǃv:,/řA9ʝ,ǿxEZJDejmF[߼b&aX00!f z랭KmZ3)s#e0@scȨNbgQ&Y(&UҊHB%!,;(C{ a 2*Ҟ7pe7Į7\u\Hr"\:~yS= e=zji`YDY$5$GvPDg < ;$ ˉD^Ntr Η}.Cz,$5َ'pn@~+sz"'BbWbTQ~ǻg=5Z,C.el5>~gˠdгSg |K6zY2pF,Ø^> |5v*]c[& B 4ϼܜ8ԏɱod# t PZZ0yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0023-weird.xiz000066400000000000000000000044761506652756400226400ustar00rootroot00000000000000\[s8~_IUhbv 25/*ai_0~lْ,\jnH:swym8{4~i7ĵ݁m/ ~vwzm_~6?pn),ܘY!>8mKsHf:39S1%^6 ]G~#.Vi@#Dkb ctuC@E@_m'|nSuRj<],sd yнn~NJ~Ii O1z>]'Gs?w(ׇ?7EYގ.z$H {7j4A10ϘNwMټ{0m {AƂlmi*(+Kspf^ԈW[iJ^5`wQ(!(ڀo䘭.h$QF'XCWQ7@.*%x:]XO`p?^>:;(c=nN=nۢ>vmoR }wpkN\05.z,yP.J {? inFe׹uun` PNJ(E31C߈>skIQ^[nuHg)tC+4%ӵZ"1XBqoT;% Kp&|rќ6 #{kFwW" }.x2W³+ܼ>,B']וig{ZgӼZ@jiQ?;wisWW+rԾkWʡvg=?L@@y|ZԠ+d,?y<cJC%'P)/P⌔2/C]S -d9OŢD3 }l}v麚?獓ެ}E*A}]BO:&*&ٗ@@D ;I KA(EɹMӡ>SYBll<4sܷp" 8 y)L(;`/P$Ssi1+Ðӱj@O;m)B1 !prRJ}K]KıqPiwC-zwR,FCHAw*3)TQ`NHʤW=|[=o* Ap|/eŻO'5pȴ&q˒ APR ZБ`V]֎ւjv@YvJ|\)e2}e2 AKtjJ`\dP>e\l©Y xNJQܠE\sBۼiuhP'8žĘN e RApdavăm@IڎeIUYi,P6L]_l:; `5 ޟiN-J]Yg礨 ?\=A~Y*Ts#5Z( v{X*L Dh>#I$t]K޷,P PʥW؝Ok[bd~#1ؚ8 >aHZ0o>h}C"ֺڭ e+BjsaGdz?&c)!XP}{m[8B.z1ݠ2dM0PFY =ێ] rNE P0Xhq"Kk)77d]n'$17dUƳwܡwlkgp[#Tϵ9㿬Уa⛷q6!%7 1pzqs;j_ bl.JKmvZ2HnHG i-qk۲4}nT[Yw"?f81F}1bi0*qR]f󟥘Y UP?܍揷z\ҜJw h[=yh}.[ L7jLjQ *QmgRzƄG7"+AÂ.4̘jwԷk`]V!S=;<ز!B0-D{&`"d ߂uRrA<#$va_2mf\ᐻNߊ]Փ)ogyE*JKw@5*/{`AA* j÷@6Zy`WE~x5ӤW6!ZoIA(1,Vi2:d̫[.v {C ug%~4Xu( #*HZ]*h5];zNUDU(]jՓ^JP>A&(y&?)\ SʼSI"?un;vOjkNSբFM"UiREaf9AV4hdN)E\OqXr!]j%4|:+%r!,+1)fgV<(r(J&9Ո,Peک=EW/"r"oэ}MMVQ"܁r(6s^Tъܽ?E 9o$lIrA]q:(I^焥 ĹB⨳eAv& ^f7¶!8Z`p7tVQ;bH~Η8=݌JƇܴHܚ Kn5*c{E:tݢ }˻KJw>aJ,(/PnJ>$໫ihK'iP3OmlX33-o˦2,q*r€aЌNXTMA\޷gA0σd< o]$-u672U1yG!27/^YtC4nOG]ˋB0c.nD=uG~6 xӕWUOmN43W}W9 AA^R}D%v{uY.$DZԘХ^<ҧ^KzS/}O>ҧo:D8uuuPggley/rcϷž@} :OBaX䟇>wc}_ ?X_k&/}x4#_jmd?yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0026-60s_organ.xiz000066400000000000000000000036151506652756400233210ustar00rootroot00000000000000N-`Z]s8}ϯC &6- dt6ZrWeK8 3N~JP0%jFBĥ&wIoWc$]?PR~ѻZ`4jG E<̅CbدSނr"./yJAmքAo8NÁL)-$ؒЏEUW4ZmWGy>t펺7l>{&ζLv{;9 (0"|0db@r9NuXA*L J=o]UUL6Ĝ¡7E搼{. q,~5O1-#JW7EџIKdѬv%cƗ>1?^E4ڍߙuluğa QQof/Yc}LM$ǞxM@l֥QfP–''MyA@XK&UYS_'1lڏ ˡ%faxSw(U;(]O`|?|TL!b7BT3?*M-n+!!͂}]CGA7EFABuSR#/P93CG\lkx% KpKkȸ0ƕ,X(`N+20hE;OQM7҇i6'" 01 %C" T\4r"#Ȑ -bд.t!齒{Olܢ`\&ɌuU"B_K}ꜜJvk7G,=B״O;](pĩ! 8U3 r۠# BXd 2zȇ%.%\ԧ19 Z3-Z/I3/1Tsf+R1 HZ]"h*4]HdxR6]RDe(]J2'(ۜme_funO~j&?5NK9O/$^ZWZ!P̧8ќF̩Ȝi6S-$KͥíҟpABI W@:1 e.g,6Sl W sdbț_5$2&‹[Vy̧aҩ~aSU-3J  `l֖R"\7< sFK$7. %Mya VH\}Fe5vV̏Pbf섭w%J [IHme6R\0n=_sM;4,&nr^7`ɳA[yؽcBH#'̔k>qIvSZ~y|@-`hapfOڀv,:CE{]|sC"I4tm})w̹2M_]y0ሙJrctHb:tn*/quۍ}& M|nXUص|$my=e,7I~zH3yC! ^[Ow/K?QKvyY5 k]Ws/}"NÓ߯Gg=hhGlqT[z4wrwMd4y_o[ЙoA}(EZ-,:ˎ uJP_si{V| ?}󆷟7=Ou_.|g4|u%?F]QWjԕ|u%F]Qp>O>`< Hi0$Bs~6s.'c]cv1+GtuH]hw,%wuER)B&8η&/Ljx/yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0027-metronomy_organ.xiz000066400000000000000000000045071506652756400247440ustar00rootroot00000000000000[S8> @0Sܦ$, [7BR%ɒ>Lf@nZ?uڑ0N:.|xչ_/:?}|rXӡ-=c:T;,:bħ|9p G.nw>-N6/,Z\ 7Ro@cDbr$Nftg聱Eq@:hO5J"xDS/4PSf$D]U Sg-s ŠX}^N+>1cDhKB(PV#[ Պ} _Ԑ:h&zywwF»&~̖vnp0|;`XnFS%\wb?=ka!wdK t9&ϒGvu\pGOӽ;+UXB=k~d=`hG#k?.hZ>MGBE>`\w7=e}T﷤4inV+hqS;FGpË9!hk7V"ht]uNxWP1]Tɠ$$CRC'/,/D`HP̤Σ U ծ-̖?iP#$ `Z ۛvlXS2^jbLYSw9'{$;PrAAڎl{&Ib$TkMFW>Jžda+V[6vE8@=qÀQE9|cȒl\f~ 1Bw>Ǵp})&KXdCp$\@sHyl]BsܷT -yU8w'چ\%% S>d\(3M9vkl5eb&=6} B p޻L?gZN=?:}7+AVLh=C wnbH9 vljzhPOI Wk ~ HDQM IrϤ%9?;ї4#qB4]ؗ AJm[սPMrx! 4}s׎gkpޜR|~Lh?~t@hoNw+<99<@-ȟܸ=p֊χp:u~72vQ^IC=|$wTQ~r:&H?u(O'tN%qqLYP*v(i}b9$ShOi)y=\}j*?H%*""cG8g͏̷+Zo\ph`:.8TFL>|//ȷDNwb>FRyY^<'#} 8 "wQiUINTV(BN)..^!6j;!q,zPDjP uHRP\(k7tC&57ǧi"Xc"-3*8H1\9qzoưRQ׺5EiNؑMWC%ߺb4Q-+h# >n_L649l"]s:>~ݺ_7vr9ߩ&d-*e*e_h~nhss1':eiEPhd\^Ul*f5 Snvi%4u)R$۲)G+Qz0jw^R LӢ,䴮uCqX5t>4;;U\\h-$VXx9_F@񃷮KU*XZ,nu 5w@MTn!˻<ImZ}?W{I= xo2Tcx:h{PCMÁwsnNjܝm覥( Pvu"_ɞI;,y~m>x {VFodwy9I<2jKJ [Y;ѭ|VNt+m'_ۉhND_hmԶ1w H#~ǐ &Ai%4hbmP2"㡔Zu%Pdb)<' >uHUjSai䫔|sQ#_J=a,wW@t39 0i^e&,} M&/G5M@9bJ7GCe"-u%w]ob|cW3yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0028-hard_organ.xiz000066400000000000000000000044011506652756400236230ustar00rootroot00000000000000[s6>`>B2sJL˔6},=cQBlْ,\v:띳ZV߮*$]U q]q޿~7ibW]ǙŋW0)Swڨ/ϾA86K\/#b2W}DÍu2Q=0=V2!1c%YCxН#hAWUޏ6(c/>VjӅ']= S5լ3M=tnn>E0i]FJنhGa[⃷ ! Bd"Kii P h7%MiǎzK.n8W^]5{4 uc^W?lp (QWGhPy>~ۇLj.8Veږt<V?Hb[P^^ zf+G?z-uL3e@p%ْpKLP5 Cuu#>^xR1a3srnY0>DhFǐFmaT\eKxqZsAA'-ȆA|l̐>[`:&WѮkͅ$vp6|^PJbLOx4t m Y"h26"w$8hաEkҪC 0[+U#k7)I|3Cl #J(GTE'hUqCjdgPA-%)HYZ>F~ 21!z[L,xGnk]PXl&6θy,˫Q:6yZʬРi;f~uO],lŅC<%.čj!uhԂh@qUpgF ս,J˘֭ t 1)R#z`ͅ*Vn!fdDUXEie!9]tanm M#\$ȚIe+s 7mh:OE/P /՝kr12ڳ;zBf&3 DWɽ}$A+YD$:sC!^4κ~y'!#qk݈ wJEƍR&iKStbj5~t[-v؇4#ban) ڵPPģo3ҍe242i2WV(`6(⯥ D.r%]P-Eok2i:|oNڣ_xb>HPtYWU(L®MIU%8( S\8d `__L9 //Gۚ{yXݩZ hDSy\8ݘuI Ch& rL1鈴)ygMY3R|&,"2Wt[N%8"׍G{߰Z]/@9rq"FAtn?q=RĥcC7rvҡ]ܤgc.c}IcJyv,/řA9 O_Qx@Rw/ "Z: ّWJ7D;ץUH"sMb_pu%%I-725o+xELbnXJh@d,hnӼB+auBBcdVX-s,91`͈J0o9UzJ+Z}nk_YEsU8Ш`WeR ,aNZ.jZ)EqvF uZr ( Yn@ݘhHIV+D5;鬖;? zs|N,|F 4(1QMh'2YcڂeŊk ^|Y ,B~~Ny+"v=ЭqrqIu`9~1tKXʞ Ҭ5-eʪ'j%/i&%y TDˊS]U\@uvSqխ^d=♾n_NTw.ro/z㏪^ h]0 Fu & Y@MvoTJG@/Җnv[OPE~km5TЧ|\>F8pUǯ 'ϗĴCM `5Ge $S\w8Ϯe@0'ٛcΠ>:~8zո ?As]O- (סQ^DQ1yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0029-cool_organ.xiz000066400000000000000000000041211506652756400236410ustar00rootroot00000000000000b-`\s8! 6L1٥6,{Q [wlk˙Ʋ%Ly-6봞jk?w-Mbx_\?|vhwGW\XB6WJ]OjlH'!FS53)|!n=iJaSQ@[ai+[f'l0ZNfSɃ>X0t}w0݂0@5tB6CAы/ Џ#oLbp'/Gу4拘[ȅ/-!8iòMMCaZAFzLnK1e:`W xߓer{&QTb9z0D&m}c2o ؉7zW^_zk?2ͻC;ֿv)m}빧f7:uоYCEI׶u'9evrdcKlJ# XCZil1=晦FdiR!> Y|Il<A6/ZNB̙P7ٜF0p0ԇ4!@^ĕ 2L('牢 sx@D~ a_aP/CՕ$?|̫# sc1/!\y?f[yFT)7OPci8\w*%%g{CJI}$cP 6Vz Qe~ b\!6^Hv!/ ڭ+}yOvϣx7Àkcy\{bBZM"P΍[նK@TzF({] "n#%j:mXQP9{R(W9jGU;b\윋ss.vι19!zɻr ;~UJ0ϿpG`p2rRN f?DY(lE/_Guc;5_iWXx`Pc^^PG[]>se*m ^{جڐyjC͚ ߘy.Rg]u^WA«h3{S[ΙK\M'aP܃g\GZoG}Nut0Z#tդ _Ih;A_ܷ>ݨ=WđX7ʟn[7c(nƺQNތu|ӱ>k>?j'tH%7p~5c<6n `Vşs7Hp> iUD#HKإv).'?.@Cyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0030-cool_organ 2.xiz000066400000000000000000000040751506652756400237630ustar00rootroot00000000000000g-`\[s8~_tE'f@E%l%-eK$U!OGGs$O_=Skvsq9>rng7oV;2rÉ rSF̃s--q6nІ# ]V@P:7Y3e3vrf'l~?ZNfSɇXQv}{ۂ(Doݡ臑6 Wha|to-"3obၒqqV~ `(,4Q;^ |l磲, KWk,LG|Rc0\CYj p]f"#`;؉' Wʉz+NELZ9abü,CBDl5Bf q,MJ>/. }p7Y>j#u9WҺ}HOsߺ8W!ġ;B)v6'(6'BUSf\#ژyX :G!+7S^kD-Cd#p1, &8.- ^?&9ˋ\C`¼KGf yMrdYf5jhY8N(\zYdtȈg<:ȅKhd6%Q2P=9,k GkzM"q%Ma"PB*bA+.ROœsJXTJbU&@iyd|V(:@(_jʸpO">oPjNSY=M Ooڤ )duDNY q *VP" w%yPJ1ih͓8ruXE`و/wL.Rq*r(/@,)9m9'!XTgOhb6Mo^>8P6Xk4AURDpH  e :>G2 .R «2F#9iP$>.=J(*Dk #`gr m`^-l_  vƥ5G·2'QL=[L y75iky;>3o+U;rax"㈙qy1'%MҜ6|B BR5~jՖj9E[<=xᶌ68 Vt]})k<|UMwpugE0X ȡ}@qHyaJku&N&~gB}ݢmy/X&n2񞸌^kOHRGTT&T\➕UWM7xLkm*E@<ۮ[$Nǧ%8Y`@oU簚zyĖ ԐF}P(Sp*Neél8 T6Hvpq^_%GGţ•%)nToNu 꺾!Suf@V>x lˆ_3mpW t4U魂Ej}-T*A{ bɖO$>xSTɥ/g-' ɝ>kV"˺Rdj09ԥs٫SbW~ ~J1XL+9I =У|~}.ŗ6tH69@W?FjlO4}(IK}kܚ\IU ގtV{;ҭv[H*ڑvގᱴ7tH =xC4^'K٬غY.TyU|.쀪-4bu1đK|g\ʍbkICnByoshimi-2.3.5.1/banks/The_Mysterious_Bank/0031-cool_organ_3.xiz000066400000000000000000000042201506652756400240540ustar00rootroot00000000000000m-`\[s6~ϯP}p)ꮙզ[ڒW;}@$$!A~A⢋4i"sppn8՞QP7jkہՇ_xG :,Yʁұꣂݕf|I% Y0ambB\{W)׮@CYF1@r&Z͸#+fEvN&Ӈ|4O!">oo &kȡRC/O7( ={YƁ8./Ù5[ȇ/wG$q2ig ?!c%>dY)@%92,eJM@+ x.oq2=憨x6>=Xynn:t6Ym@ F"3_7fh J}6 & p_En?f~~ ՒM藮WZ{4&HrSSq V%ϴzN:ad';y.F|6bU!1 {J(WI}beAC2B~4UfºCKaPV-]C4`s!뒡ڔ FMYHvPzhԶ= ޚZl5+F¶)\_J{0)kV 0 'b$dUƿYGK2BH?S7p.㧘joAjpr!]{.F 2-fYL棷Sjh}g|ƍKTڹ|xLTDQɥmwz6cA=(S9A/&yi5vohUE^4dW4ᚵon'0sI"DtȄArj;I,O}ZP$'k|IDfv Rt Tӕ ,AmE~R'SS JW'ˇݖ;,?u:,AISau撟,?U-j(,J+DW'Ԅٜ|H5ΜB\OYmKUOyA:"`d,[Jo\(&2q{Ă'oYsL;fp|#9Ď+Kdtc`Ȫg ڰ C!lG%U$ygwABU7b֯Ļ8=xJ[$Wy!w`(WmyEetu+v=hDLS&nwp=jrMR9z a, s9'=p'9-R+/lN; ]/CNdjttMMZ˨ڑsmځsl!#j/'Ԙ鼧ފÉ4ΖHkmoh7ۣZң}MX+Z4Q}mOgբj]Zh*ХE;[&ϫ|-ڥTmU?IW7VU/zS[-/EE^\KU/Uz$|KKpiÖT0.]ÎH~yuבN!7|.Yjo1 /F^_c}(=Q~}|8y7VO}x4#sm}F~7p_m"bddp Tp)<:)H)4G9t-5]S7_OM&8tdgj`N1DN">OOO?qkuIyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0032-rock_organ.xiz000066400000000000000000000040261506652756400236410ustar00rootroot00000000000000u-`\[s6~_Ay߂!26qLHt}[r6__X$_H2M[a.쇟}Skvqc~yӧw~].ٝ?u.drv}' ?vݢ}'m)ؙ9 >`H:w0h}=eEs =Ιu;9h?,:.v2olʿ0+J>⼯'¶ ˥^[PTs XǛܓ<^n<K{He||bXd_1!? & cVC=E9':,gm L?z{A 󞪪tefo{t6)W@ $ziw\ߡ~2HBҳ&ѯg]2YJ-k.9!5ߕ.4ʂҾ`7T\yXA֜ŏ&P|EO/Y!FUQ*wJ`%"`eY`Q dyeqIʼH@@H9=!ĥ>"Bvٶ`*gBuCR#:=8*-t#&%:ט8[FЀcXPi3l+Lq [`kW6!_=;٪!B0-D{&U;D\>u"EC DR}0AUTMf \]HfWb=#7練UMB$AOkf_lx"!DP ux:SGa y^]MԬ"r Uxk uP#Xd1U+dt+ȫJ"H"pjaWhϐ)ﻈŤP͹uCa!PBjԒvʠt)g)$} ,, Puې <0?UeeoOZ3itafi4 JW}{QS٢=C"OƢT itu@M)8ІZ̩H4uѩܥ6TOxBkmđ; ]#*2F|ElɬKV+EՄR&>dbY˱F`ќ=]ۋta h'eI AxvRR '9N^k-]:I|Ueʚ1~CU7ua kFU9ta0WhNW#P .mXo2hhv6\.ϻq7ʲ潜9';y!_2(c/+'Ҙ$յDl})/| '#4.%K3I`%"2~ǤhVRÎv7ŖUZ`ޮ {X ca,쏅? ]؟ ׼ {×=o]g.ʿmIGt׽74٪瑟<|<瑟Bkv7^EFMxmUzJ`~1ZO]7:ߪ{xaKf.U0¥ɛmc)q\zdc9QUN"=Ƭet(=hV]yCCd4Փ|}8Ьo%rD?zGwUݣm\\q =?@֭v|X cj؎u]d;֭vX}c}z/^顼_1W H#zŐ^ &Kh}\CVҘ՝{DF)7&ڸ[oB7ADyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0033-organ.xiz000066400000000000000000000037101506652756400226230ustar00rootroot00000000000000}-`[[s8~_/csMUwP@-@Ӷt_2ɖ, ٪! wMG/zFa)6[8d\_o>}vngOƮד_A>W]~i[rd$ؚ; >cHZ0ڟh}\C"ֺڭTX+Bjsa|0^M3-!XS}w ہ8B.z1ݣ2dWP%qbX6x/^,Sn#!A P0X#d>Dm6詰)7753$|WbI YUrxzg_;t6پF:S־:fZSڇPi}}̡~ߨ}# ]}:oȶVnspNSQfsBE(`ƫ2́UAte?,*sA=U) UUŏ:yLwWl_ `Z:$B~{DoA.yooR,x *匿L=.iAx-; AO<3]Pe΄p#̥Fu0HM3KkLCd+H؀cXP@Ì9;)qGCNO v@N~E`8:u۳-n"rMD` &JIY'h C0Bo&*fUd6{'8me|Jc#ʼ", C"DNK.A?; g_÷^@>ҝXfo8"sIi+`'ZVrJ|~a+4l2լFFyPڡ:3T*ׁ/~u ~dn5}R:5B-|.f暮L=E$QUJ}n7${2? '(Xz%7'A}~_9<-?4A)ScǘSݢFC"L_EiR5af5A4hbN)EV\ZQ[UOXB:#@DiVL|ehzɌ+ų; +x%#g#lvaY'V1xI>?32hMCgr>n^B\E[vM@V!74dI1%  h)=v-u9-?u!9o$(@ndxL~v-"6z@ M^\i Gmb6c ؕ\o0@#{G0(04G(ήX9\M.B2C|cvz_n$ubML~",hsB+VJWuˇA8e/KK>#`oqޓ2БM(݆@PC@) 4ѳihK'iP3˂C?c},>Y>X__yVLGi^0" 1YfO&j,?zBUH \Hcvhh%DRH)? HL^tKG! ⨓bF ҙC ]_^GC7ha3lӪ*`!.7?V 32yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0034-organ_2.xiz000066400000000000000000000036761506652756400230600ustar00rootroot00000000000000-`[s8! 6L U3bsKm9 [;ڱ%%g'%Kq>L"/uKO_")ܶ~[s~9>\~mKFW_<ȡ+e;>v>I2m`72f.mp/ [Wy+Ȳ[kx6-'-XQ }}Ͷo@̐'~,F[р&Xg*֏Fѭt=Q@= gNaY s9 Q0a<Dx 2Az\i + ja &H*ê͌gtZksy\cTkʼ!̍ :FC7@ 1ɹ dA?ù}#A6V0r" IWW5F6Mr j|Ac4l25maj.͘T@dϽ3Z=cfh]hR1 HZy.V.T=Ŕ4QM|p${>3?}NPVuҏMP|I~29Oá}>G~7IO)?z~Ҝ┟OEvJxr#~*J ŐAW( k)r@ )RzH^Gz:Um>a xou@tfW$9塙%5;W.u*xWIĚӑSesvLv,f{Wi~aST5-3J JA *-c*) VīrN+|R<&ɵtޡJ2/T.l kN cS=\`A-l7_{`W TN k7l%!W2ce@*z(ÅMj*:&nrW~$,Жw&sd!+%t3zy7Ux鏗x G՗2>ZI)f9jYP Qi!`ܔ~օMӫijN`Ŵ8wf,QreW`#VUC ft- ֞ 꾭1 ʆɮ&~ogByWXm5nt=)ܲáq,2˙7mkx mwGP'; jgۋb${,Lel].5cڬs;LOhm|V OT: Cpd Iw&&;O6ܶ\\lc 8q2.vJȏˀ| ~"DȒ8aSaa\~ʠ:<)¼j0Lp5#e^S h~mҠUu~&~5*}[|J*߮>qc?X ʪ"!_y(;ZYkۍś ޡ]jZ aOC Ŷ0]iL SpQ "pLcd.nacfrHNC"6T=J^ 2w) < *!.#L{ :BᕲoOGP8ĦH3$G[lePd#ꖌF0_r U_٬5 !$q,)"9np;j7K軔` l)6> <9bތLts!}k"(bP2ı(¯A:IE} G ; 1"6.$=y\Ӎ[LXg~$AMkxfḀ}qj7%;J=VGl=Aho펙YM<' 9𖲡U8s G zHS&Qh#nW[pQeL2pj嗶h-#mҸRBբgIiLh:%} , Ps;#AeOPF~RMP|F~Қ9O+iVIPT͖ĜӋ姴Ek?2T15fd-9p+ExN#G-UYC:I @:3sBN|qhFzW  VbȩD`ٜ5]Ѱ3j"<} *| fh) Q)YQC˶]_'mxCiq`PΘ)%uy-b&k OKԂ,ݽߠL`trR[lA*MvwaŞ4 <ޑw9Jb8 "\8`q ]3攀.?#l ;JV[-hϦcTކ@B@)ނoo^HFtsűΔ{<-_}I0cІB]NKb&th(4}" ʆ&oGAw"}^F57p!I[l^87Xu),Ǻc]ʯ˱.X_XEh1 #FqĐ4^ &S~N'D=+$jOȸ)eJi )LJup 0:yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0036-organ_4.xiz000066400000000000000000000040561506652756400230550ustar00rootroot00000000000000-`\]sϯp3͂@f @t{%%`ْɆvԹ&֣G56(` ]a bSՇ|xyx{' g.t -hOw_inO0r'ux Cb}~16޸ }ߌ8ٺХA%Ɵ9 0 ٟ/`l:El6%_g FMҘR1xaaӾ0_ٌf21 q xG)Ir*z4$\=ndԑ|룼3YbWfԧy; qͿf%͒ىz4 NG4ј5\.vLfHC"TM#F W)>?+J&S ~|z͟ upC]1Ceݾ%jPSRb;|*%HpnKm̷@C@ί!nk y8 +!d1pEv%9*/wko&Oe>M1و(l0L4@6̋6r@\Rc;w1A@/[8LZ֮zk 9طtmX)-;Z5 *J9}RV>r\n^WVOyjݷ+VӛSޣO5i%aс?z9[Jcyh tҺ/wp]+߀o%n:w ny':gש;nhgsݞ79vNSQcZ}Li1>U}]UMTh~U}U+౪^}YZ-뢾zQ_|GuU_WuU_WڠTjuoMfȅQUgG i1#39{L0 LA\@C~d(h*3*C̲R}8>~SOҮEyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0037-organ_5.xiz000066400000000000000000000043701506652756400230560ustar00rootroot00000000000000-`\[6~ϯ<[csI6C2]` lFؖf鯯 Ȗ,lyZ9::7޾r=f { o߼n[xP쑮n,v5fİ'>|< ͇O00o>`ooXFdHum;h~xƆ)M"t>Y,gt1'9͆ -Dx Nf@lH,zmc.acX?V*x-G3u.W'n# > @^I%R Yp B;xi0%& ex$oPOz{†|^>:27I:blbwm}+򠓻5oܺ!?nAۍg>r x?.a+\׼Bjo +/]3u]zʿ8N,eZ5 =l1yqƱVVm4+6qBdxցY=T⼠p$ـՇ&i$]9Գq\'I$M̺KN#-ml#'C)C& 7e,52f@TB3IMa!{GIX Jq=3_ < WW{Z64pR'3ʌs̒@:}xTTiʥteA?NcOg ynOyۄN +Ξ64sAfdP!-4p)i2Ȅ%j >)64pXlT'KGu~(T5yȄ!Crg"A\ڏԓJXxvA*+NP8A&(v ?q͜><`8{SqKer6lmW'R *oR Mª4W qtuAQx3㠏vh-cN&Gf|[l%A\jGU7]}<[)[ԲS_b"ZR&~R5a&T9zRH)2R]-'󍈄+MbzVdUFKmx񏠤@M=J8Hظqy$aP Άs]$EENf6pϖIP:&b~4+slHmeI}$ghXʊq\~,[1Ntz@qςY> g,xݳvɡ'û+;Uw_te_)\+,-5/=hJtA!fxqK_HD}!\H0?GVAAnU7dz;ʵCüJb69ERuQ_et媾,sk溪᪾~c`*荁LwJL%u [y#}yr䷁t # 1_r[-en.d]!J>Xu%ƺVc]ɯXzx=r](_1 +F|Ő_ &sz^<)x_F!\Dd<*OlMƙO}&{N,|!RLm tm|b:Y@-& :@Mc"\H⸧\Z'@( LpDe_G|W}!'O^Ye^\B9}kkG| JW˜}> bf_ْVyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0038-space_organ.xiz000066400000000000000000000041261506652756400240050ustar00rootroot00000000000000-`\]s6_U{nvhb2M F#lڒk__0-Y6d;ދDz9?~E#Cl ͧݍogƟkwi<qB\q(ewHi5'#;l u`c0Ax|Еx{PSve[sάHAd銍ȱ\h0TĠt<)E< #D]ix&>tOx-;$ˎr. x%@_<2R`s&Qd*55*zhܶ+,,y1vV a y.5̘ŕg V0 U'?(XF$EVw~h˦[D4[g֥C$T\$r "#HaG\n3}Br7{'v8mue|Jcܼ"L M"B3.NvL]?]Zכ?|: 3/evz}(2wĩ&rWe rG b&MƼ"jPɫ/:crP8,Z(Iۓ=T]bʼB!0 $yEМkw$} %, %Ps$A'(Scu<_f{m^^ JZw-+4u~zTQ{SiQZ(:&ܮOq%4Z˙SJ9׻D:{RhX5`t>8r$ELXbB3(oR<*r(0{K"KH iĞGѭ"‹{"}}MIRc PPF4-ەJwsUR˞?{2F#9k*ppr;]}nPBǯk˼0w_8WuGev!/ x"8-+N.JBjCHN>_py 9+/b$WaUF[y,?c=H2OX)NkgݜUR]V |F`aQ'@6tNJ .DNr y= mw$ jɔB/]yCy0XxՕЅ!BS:MK c6tĴk VEäW'v*)f>nRP:H9[d07O`n:2#ә%HQ- Vvшe>0)SYW\Od}(I-o,8*F7RG'_fHkKyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0039-space_organ_2.xiz000066400000000000000000000040231506652756400242230ustar00rootroot00000000000000-`[[s8~_16P՝.&1;$25=/*a -y,9ׯ1-Y\2! wMz?45zx2?}˳]m;_o\ +en;>խz>dQ _=k0o|ʎ0v}Ιkh,[9V ; Ɠl8O!a8lb\.5c>F^3dG%bX?6xOO̞LSn[F|z1dvv C!)a)'h@FKL q%m|+ouSAsCVp4M^lknz6]!t b`}4RD:]j˪ |%h\3CGb~Ԭ 8 |l2 nl<VH! nJC ̉ (`+,2̀EApf?<7YT0SXpU!}g[D2o>Þia^d&J& Q?9n6["#W[Goa yk,e$N4ٕ{M@ -+_P8 %>BH =+4l2FFP!3*0E?yG_Xsܚ=)T#@ PK2_Y͹Ki\ҳg(`Qe(ITUR ž'槶>A%KMP|E~R9v4an J -5tTQG_eQZ*:&L,8ВD)Ȃ$9Vi>a X{$bA$5;g.eq%#oG%H iĞGѽ";"/}}MERc 'N![&]Mel77%e_y#+!9o$䆺UboPBǯ 5sQ]T1KWw`~cP`^f~o(ήX8<\`-z!U_ $[Evwa4O\K5*b9EyJ u"]3 ᐽ..7]PG)Gtm8 +-Ϻ9-ueޥ4&SYs 7[nt-]`ETWC 4-iHiIO}C ]Mԟώc}(X-:DDzei   QџfFB(.wf=_0۟F+&سe lO=?z&9(;sB/H|Mk^% QB!O5><a M뵷:O|_3y)`r pq9Q m].4'!}ܫv;`OWL$Vd( +;WE!z2#$/6HUu]B!__"CqƷw7ue{G} [ w-,yn\ WMRgGp-b-^y&+?)VŞbAQvKpDgnsHfNqy dB#ߞj,l`1=)ԓ@ʧD` Z\ hUx>d 8Xa8&oyNLt_Z:k^^B.]L|c13(Jm4¡%yq)?ޤJ 0E8мD2tѽLVΧhz1)X `d@ݳ X1O<: ZGg<6^9D,+bwmkL~ %{"QE mQ>RL{ߏ|vY22K#%Jt;EyG摪0o(+|y2_uu(o<`gGYBQ)? r&E}8ˆάo<Qύe)pԣZ(U!\uЏ^OZИ=a T+ Pʞ&,ԴOJ3 C|mTj?H%ud'q4u g!o2f(eŨ94徑ZnF?r&/E1&ŗl9Ӳ堗]. wwӯ?CB ii~X󉡁T]3 lb7oV4QI|/ C!co%/vPS9nb*"G^UHXcqPLOW{B *cmK(wnw̽8Qx.fKLdL%KZ.gT f ;Q 8jW\J갣#!L]Ea2ɻOGZB+~k"[asT jd|6(`Z LN6T0|%/u||&MXAB#3ӵ))4FDTcdqEA(|$U݆s`aĸ)$DAŸ戶ej^Y'ץȚ.Ƥ  km`7:1Y{aTw.$QӒPyY߷&%V/|6o%fU 3Ws8yI#_sOkUWl @|sXB6k&G0|QY$VDu]kx/0"z?.G9|D\"F?jb*p6MTC'-dYz<{'<(.=}uH {/}}װwN|XNXkӣz$5’1QF8k&nfaFn&曉5qf/O4*DfjdCZ;> o>K=tjOFe.#Һ#r{ iF)znI;@Bu?|kgfX/hˡd>/ThP(dc#i9l<|Ewsj"%WP$>jwG̥F]17S]A]sWi*h/%60AW/2A2yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0042-80s_pad.xiz000066400000000000000000000045651506652756400227640ustar00rootroot00000000000000\s8! &$L1R@ͽ- _˖--*򰳣tK-?ynhw4~i7Գ}YӇ_qr3D~Wlʺ;ېic-Yk&K=_ݸg` 2QcH`zldBbļ% 'nO'- &{ѓ:= ?|H{V~:nf}M~0ܙ s6O6nȳqׂ F77܈nBkK(7ԃժT !(Yt4FW7t Aqn?Iy6n8%j*`ݐ)%Yu-_sw+`Ev]P&Jrel }NUzVAʂ띣8C֫UU~';jODIixUX_ lx(}{STOOQ}s5ST)gSTc2zy+^fY: ϱ|?$Rx]}/_{z 8|P~ּG \/U/ N*zV`k^׵[Zu-_ǝu}~] XlxG4#wtI |*|%59\8jTH*E- mq3QJuy;=ÛGepӍkx-e2i2uyTF_W̨IgڕR-ݮF1PtCrz&`x-^Ӂkί*m=pW]%`^K7Zt_uE7INZd'F:ӏ*`~(KGEU -~Yt!Ayoshimi-2.3.5.1/banks/The_Mysterious_Bank/0043-analog_strings.xiz000066400000000000000000000045201506652756400245300ustar00rootroot00000000000000[_s8!Ȏdiu[%N.qva$:֖((rݽa7U~Ae<(kt0 \>,Ggϟ>|dw]>}ȥ U?6 /'*M;uqd^!Fs"/H|UyP' 6qB!]lCVn4[7i(ta\bru9q m ]. !}܋1J1>MQgn=57iP.7-,FB`# c$ pP6HUu(]B!_狟Qܫ" ,# ׷Wemx%9wH}2F2U"r_FD=7Yd# ć(>Ge!Ng/f:e:e3#j|l {9;\&6\#Mise>55;QAWONhLc͒, 3A=e Kz,(nP()dA&Ŵ$9h0o`mG5f>G Y}`p9w@ÁkBbUx m,s`յ<S}QM!ݾ/F>2-Ak,K"t)YM>UA:D3uNjNzeJ^阽ٳb;؇cޞV}#=HN}ה='B#VX2Tj gD`;ѭNt+ D|;gm© c;ƣicDZ$<($U>ө=Y} HxhWS0N:uJ.?(jR!$ނr.bc\/4>W@ɠgi"Qظ^ |MlE1-״2}n8eܛ 3H| ,]/kjĔ7G]!:zLJO)=1h"]! lM%oW ad(nR_}IՁϱLxHXVjWyݶv,߻lo,vjrrͻէ[2YO8iLPĥe#G7$|xF#VLwZ4ٶ|uN ~2CEqkL znDbr$[ Ngfg𯀆dۖG]v]]E{/~ Ilnݳ`G koG:qGhibtc2[:ѥulP BrY'fnDNj0q:8-G0͆Y}ksvX9Vt\-n*77gm~l_wK6^d3Ckx7?^vu,ڏ% axrLg{HԋM N!\@k\YE*ָ >2-UAte޴X=Vu۩ړ#Mb$pG>}e}9j$B0bMb_ ܕ5\eI.zl {e`4jQco!ˉhH`g.`WJΉ8vP PxBNP |ٱo9ʣäQ+bzxgϼ{Iؑ78,ݢ颵; b4t}ϱHN8"rI +"Gߜn^oM`1} fU@>O@5:]jIȶFENݭ18ap /-gHbHG59:pс$9_gҀ\Oowl.Yx *Z[> #F*Ȭ*5~C@H8g#Qu8O)k`ƞD3Zg<y:O-X(+a?0i vP^ݫynAL|$oTA~z :ҍ(Џ^O&JcјsFzΡ ~D ,^ӌ CZJ,Rf1t^pEN y.F5^4ԝ|'&ODO#/D]'+P9%r>ƚQtY.9ϧcys"4D?6{9Uy%Qu,WpNs!cQU&^XL*P"w uHRPtwp%y@ԳŸXVy]z$V@w$Dۄ%)j)\]=ա QÈvS|@c ~i3j٥xpbB5KD' q*18atCmxI1OR)%YȡC0 kx)#/|6W 4A0&px@͉Nʼw9qB|Ə]ͮ M+̳15cEوJ={&9h%+J yRYMID2> [oYgzVS#=JN~ؔ'Bϝ+Fytu#?kƺ6c?nX7f|3M©c }Llxŀ4^1"W Ib^VJdbW^ؠ1vx'udg+G*qGThibtg2:qαbP,WҸ(:1rbP@BxQ&;⁵٢}Ll6諆`~{.|hTQ6o]^)>FT%! /޼q)0' 91slkGm_1kL1}Bl2}ѻJ?:OzF82v7 AZ ?Q{,#WHǻuDܴԓC@/SA!`^ }&Y;iC/3}Ol.)Ix .+ ,AJiYŵ7ly0M_Y*W50_/D )z63@yH#d=m27+Oi!rU D6(U* "o6a oA8ϾW1_dj| *iˤӉ8WӉ0D$8Y60h6V˲1Eޚ$A/"rf1^P7`t)Ħ*?91+9Bd@]K@yK*0Y#-CpeBRl=K]˓ (ѶM9ޙ|>|Yoi6dEEfT N(f Xr*_s(ͩGʊDn+͗魐U( *oLqY "-4 %-ugv|9߹'3FsH{I_Io |)WGw0ھπ]7B"Fǿm5EZqi8iquj],/_[ մ~(dNipw+/;k71s֟SZO>csd} WM׻2^Կ -eS?ҿWp1B;yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0046-synth_strings_2.xiz000066400000000000000000000044001506652756400246550ustar00rootroot00000000000000[s8_C֖Lӎבo=9ٹ D[[Í?P_$Jdz7<  ?w Bso/vg;Mq=j_n;U¦ߕ?./i/3 v-M{|{!Ac둅VSPawT~L0^͵\Kg: ;CSeJbY'b, FAg.X-9q$ɐqWv,,/ǍD`2O̵IIY#U L*w ɇ׿ȗE@` RL97fʼqv5ڷO]{"†"e[FΈ9v\ QbNP s`;r#[jzxk%'I ȑ 7Yn^d1C3 X$5'w!y ؗ #o7&m>L{8Hw5_#Wٗ7~^.~ވnD r*wZ󉦁T] lb6oVtсNÆS\ tuɨ/ }hΨ#5=l h,.J IJz[Pe! ŀwQi L]Kߍ˪cL D -G44ID碶MS*3H\ҌzsimIdnhӉІ{y }d>pn*d|PXaWia2"A/ϲ7uf|_EМ^W=0>S atI1-IC}k}r oxy&C>0!p1x@́\":y=9|Z9ƒW!?էL!F۹g#>֨+ө9Y}=HiJn \/\W|/ zE-_ _AZgGp$[fkSh?91ub߸ɺs=y,'Wv(n THX|V6Ad4 !Y nnn?$b.hL |ݳha'&9qKW`nlpg/<[Z踡dO1(&.e/^Lm"e!( Z٢}LVQ虖`~@" : nf]9 Bx jHYBd0Ge1Py~voE]8E0hFyUQh }9M\n^E( i~,NJ )Jz[Pϴ t ]ؘ'r&K3b3\>$O4QT㢗íNa'5^426$i`·[-,x#䧼.2Ug52>#,HQ2\(YSM:\_N_oC||4 ZABuNً9NyH__鎑j|l >r8ýEAt$ա NÈqSy2fӚ#QiB> e])YmLz^_xՋ9׉ Cu6%9 :Ȥd.V ->3Fh`v7 Ciz`p1vs@[IJNK!:.X3HU'ټޙz /ݝzrg$Z{VUADˀ,w*ݲNy=tt* Pdcz!w(c/vzNDl'se{siYkkm ]E)ṑƨ4Rȍ= Dq$o5 Bd%0P7(rE\''3um\yOutZ/:n;uC 4x~f~gЙx4dMҠcLB&x?u4h31;QłlM8)Yi!(k:> JoCe|1hc02"b*DSdV6@2ƥQ9VwuqII&a!GVy!!lĻR\ql) ٸC%{`.6?˻|ztfI )(KIEWgmHLO{.  C1 e*JRTP v )]@;&䛡⾺1uęD$2:4XA;m c$pZ"e6#r6= 1RBJ3pDG&ILlv߹ceڬ%%, vx4bQL}Fق\H u˸Tӂs Ґ E{(Kc$[JV! E– iOM؞~:_lycdauÈHv.M5*(KwNQ amtljK7Fl,ȚieEWY(а~Q¤̱US*R`n)]6WZ-&/WDҫ+ {mՔ^J,K5JS <Dž@yw?/l~h8b5ܿ8ƔS@P N PQO6p{ᶶХ+%5qi玚j;BMIP$$hgQۍ5,ӂVvz4< @\ 5(mP0vE:;if{MAZlo= 3RLb2 b*Ym⠐xDLb=,{n@( &mNŘ8Ol(//?U݊섰:Z4͸8Ŋ2P7d&I LWҌ)'*SN,_5eO Lqpg%Ŕb<^χB \`2Y0\?Z'c86>Y3:ُZgp$T@iЌ3VI4e5Z-X{ZTͬrqe΍qrqhE*۾u XEqTq&Qf n4(ZkX^m][;&9ʆ'6\5"H7R2[U>+Jh*.W{]۟_U/KcS͓f^ :W7b@Ԉuwyڈ}cLV̿|jցwB@VPbɥ9]ܡmw!$)t)ޥ8z{L*_<5{NHC$Zc\YDA|/M0Iqr1T 'P>_ky5SqtHqr/NgtǧS}y:WS g0@8aD' I b`dkM&͚] 3eK]s ) T\x.yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0049-strings_pad_3.xiz000066400000000000000000000044271506652756400242710ustar00rootroot00000000000000Zw~߿t9g{Ĵ@n#G6#[$K6>4ƙFo曑Ϋ t[~hk_SoUӇOO3?pEvߊvw[uٗNh>OpƵ:/.k3{O4ܺ;*x';IGZ&$f̿3`h2tqVz5m}ph8`1bz /.<F>0el0y,.5á}dwRL?nJ[4]-W@ބ3D:˧ʳ:~boSnW>Y/a^<4_%hg zHњ˲й~RAϲn6L?*;Pxxǡ~-#1ǔwɦ]5_ce ʓ!B/yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0050-soft_pad.xiz000066400000000000000000000044371506652756400233220ustar00rootroot00000000000000[[w8~_49C3@lEiY_0~KlI.\沇Hk`v7B$;0x 8o>媏L"˨ZY=k=fl}tRvV#Y{س9 kj%;Q^zWj3t.r"K*#u#^ H}%5Vp9IrwJd]"VޞG >}LoY=2 )iR >%K)ܧNI=]OIԫ/E^Nv_/wx { /^{{%#{c/B[}& ^sœV5HTzZ`=ѵYOt-] D|=їuܩ kDzj;:iKo%V,iUѠhDJPiim+=y5)|GKźB 2i}֢Ηm*Og5|B(T.YfU]_K9|Px':^IWZb)===;Sj&c%;Xu(LSj=yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0051-trance_pad.xiz000066400000000000000000000043451506652756400236220ustar00rootroot00000000000000[s8_C֖diȷK\CKt-y(Q")P&w{3ö vس0in6?4Ar;-<؍._.))wMӔ_<j~Ph?S91sbxɦK={["'nWv(nTHX|Vlx6.')ߎdO9~L1$f?H04Ή[Z?6y·Ҟ/[BbBIW,~bl Gql:"`"lfƕi   A_fF![Tb9Kn `n~C; ~le.ehk~괭o6ٱC>,$ۇ?5UҜ`-5?)ҭaNJ]KkjM)|['K k@0ɜ05Uh+0t9,4<KA|ژ4tjnX(G瓯PXn_ x8PH` U 0L*w 9,LWE@< 2K9% &t65d(Whq-_FD<7~.z(A&)PbٳMxɣ[D:x< +bO1\QvKQF4̜pE) j=վ=8!c0{@S1N'1O6Q!B$dF# Ѫv kX$K !q DNsiO*|)⛫|Q7*iQ}-BcLSZrlXKז]z^IFHS{W啒BF*ʌSst^.?~kAd"3=YD;Jnʼn~h"+5uنϔNH NP'2U H 2)ztO^OZИ=VsFz؁XdRFE UΓlA9+C|Uj?H%ud'q2 g!o~`ŨցhE}781y!1)rBGw!@P;%b6NGQuY -T_g][GN{"y㵻9TŅD;Itsi{L~AV!cُ=I ҟ ULJPNupx|*b}w 4F+%&AxuaYoOb íNaGM;^v426$i`rɝVM-}:Zq/̧lYO ҮѠdC5rt"yc\ClZ:|uc4FDTkcd"}(|e؆`aĸ)<< i m!ej*xpOpK35 ] /bub؅t{O&dRLKCM_f}nx\#4e8M'#x!{ZXb\]0r5gV.,S-|#8-X'3?HUUټ^Cm=wy0IeZ궾ր^`Upa]GOG2 Kj A8wPpݜI[@GSVzUW<'t:fϣ黰R;^ػ>k[gYIVF:ªrc"I>1zkᬞZ'>뉮zkẞZ'zP'ꉾ~?Hmc-yZ)I'XLr(-@[â],ZQ[1ԉ~@"? s@:z8|f'ΙƜ-v`f5(%,}/#)f~gЙl!* .nvc~Ϸם*neڏ$ .bgd蔩MSU`:ej2"#䀱kЏh+T9:k4o:s3S,FgvS'6%҄sp=3j˗F"0e\FsؗcYU`٪\%l 2|eHÔ]ztO,x |a`' s-8̉N.N}lNP D7; TՓ2$7kM<{m(Ͱ.v%ŝ0mih-A*rEޅI=׶2uiY"t lR7S!zOch!&%W`M>%WDmX!P Vףpl01 ǖ#Nرm<lW!lǝиVޘMI40 )SDNL[i)>^`Pptz<\QHI1Zq<?#>̙[ӠNTc+Xˈe.sϝ۬|K96ظq{Sb@`:tC^2NT$b*b`$ |ΤJt=Y7gnƉ'\әq0Vmk{u20Onbh:?)+|~q^ϧZg| hw 896NsQ?'߿#dDGu2!#qag٥T] yoپ[QGN"oT^EUdV@@tp/W0rBǢ"%Rޅ0T-4CHuB(ӔC J&i/S; slfm$Khj.||ZJ[Y)~$Җ$@zX.J@Xy䱡&vyudo.*dO(b3țTmJ6D W5 nkgvf@y٫uU)f چY2j( gqB K=ê,Pɂ~J/^%Vne} }VSKptC :˛bOc=lrA!ku%O6h*ўҾǑw aйb';J}ƩRUUAdI|K 7lj4͒R CݜxU;K0(mn6O3 !yiӐ\'n?d{MCsu;F"M).zM֫7qX>\WݭQn%4}oN. K$rWJb飯"^(%{{ރOMoKn~B<['{!V8aNf{}=`ÂJCyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0053-another_galaxy.xiz000066400000000000000000000045651506652756400245350ustar00rootroot00000000000000[[s۶~ϯPt΃+Q%{&NFVS[vmӜ DBTyq.x)QO!zX,v?xeY:w6~[̳|.ۏyw?ߙmm?ċ'6()gwe_Ƀh -ں"PuGcs\x,ZcQ/錧mt:ߌoC}5l­H2$n _,l:w#뜸i`ƜԙkB֎`ƠV"Dĉ:$ ^3U;,܆0Y}+3vg߱Fdg;XUƜͳ톿``̙b^?PϏV'җNJRM-5'G5q[UaZ~Xqw?]OYk?l(F +iC|u'V,:eʵ m1 ƴ9ami`S*ӜPLM˱/]%c]:읪=كq$Ν-,/{D`e gȗ)3e WY60eRJy62`0ed]OW 5. P׀=^ +9#Ѫ  &@\r-PaoGF ZcZ+=IVEA ȒVֲI&\N3K\`{ERua7"2q;;2`L Vpm -ӄd@'D &$`.0ѪSu<6L!%6AcjE$sK+Az%q^u/0|ާn܈8AI~\;ա ¡)'~dhR|N+a~`N*/!QhqZ?zZg#_`U"0FlVrsܥOtq(V=p}\q:إ",ߋ vU Gv&}Pbɽ9 mŞ@s dD5*/KggBWyt:`y}DYy ȟкgY q(ϣdC-XkoNΕ*z?0p??;(Uv8Y)4T`QU"+ͨ %L50{W}OxӎЂȼ&J| .虡hRaɋñKF`3v]77VkqPƝAKzN^N¯pEz>VLwGEW3CޱenS00]@]]C2lX_ 4|J, ""UpPUrIwm]`tod!M:<̃#u#eh)7& 3oraŃXb+Pv2淣d6E0+J!lK$ Bk$btXe P-nVY Fѭt狌mO'b1ف0$Dc[&Z'a00?uP]~vn{H!ԣL;]-k Ӧ?ۗP"衷VB3k_:s&~8q@9mcJZnsctwzֱy4L7ڗ.F0mDƁAsk/eiBtΚ¼2Ƴ}a2i,+&KtQ tA1]d0P1V}9h$ 8U=ȡ O,>N?+a/SHL׵IBӃ"=bH|C }>Jt "[2| đ334uTa[0^pׄx ȃa c2m f !%q&,֩ߝ\t!}k"(SO1L2ą(@gRҋAR}0AbD, 22mf|]Hgٞ2=/l[L}}d~Q$)*bפ`za'!FP򏿊q\E==ر{Ñ[UYMܐ]Dk Jw# D{to :(-%\T 9 \EZ V-j$ޝ^}> )ܾPBգ0fTcIvQb%NSh3r2.CUcg槾9A^K_6A5IkbМkOO~'KPԹ}FO=NJPUZ5h<VjHsV( 59r@cé̩ȒinbR$K=Hϭ| x OG+%z79*_q(RQ5a)+X1~[?9-]t4Dxq`e~MRB00TR֡F,.5KI{#^Ősz:RP#t3&iuZP3کR VH<}zD*ZviU4 ŵ˔G<";/v~ 8f0Xh.gx$P 0%Fosʂaϣl:ZH] i\[lnUr\m6sBC[}Ќo8Lϰ%_GY}/X` D_eQSz(RY<{jʤOK%rzBMu˫y}Y.Q\ fzݾwMwb SckpVzHOxH;ЪĻ/L2ćN|矬Nu_H_)c\ȗQ7fԍ|u#lFwQ7fԍ|Q_}Jܯ+ibH_ &+ؽZ.tE5T߿G1bjѨ Ly5rv$ncZoh_ w^/g0,gڞmm{l! AKECccrMRb6>S#Ŀi.ʣ_aG,%0yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0055-will_in_space.xiz000066400000000000000000000044671506652756400243430ustar00rootroot00000000000000 -`\Yw6~3}p$.Z|&qbSزǒf^p ؐŶ.O^wp/HgUQ9S z -l;Çjv:}}yx dMzJG/? >o"9.ti\w˃L Фi)'N(a!?vhA5!Ĺ|RunرϛjX*s7I:S?9KVZ}8w ))3ip^&څWqIOWʣ^^zQ|x8D_3]1Oox?==&ɯ)kyGY0tuf_fIǕآ4)|LFr0S(@ [+6 Vid+ZqtR^  Lkoie^s<'v+HTm| o)Rc["f gOh$C׷We%=bJ.y;2B4_H,ɱmQ4OXGbˉw E=Go$Ց]گ`|,K! 󭬡 %Vc${c%D@5B JvR7jy/a2~eY s]qvEXƄr@5GP'.ǃ):Q9L/b;sy..~|Qhe~_On*Xb;A!))3P$ Y'W?,\$eGg8͑D5B 4;~z}Uޣ_vUU0'6h%f"+$>Sb~,ǭlZ~6(lK<UdT^ /y7ˋ-l;pIyɹ0?::WKV4k霽;EemAzml&7UO=1f}m}tn[ֹqw/iܸ#ƭEּ+zWַoMָisٷi5mŶMj\MPUZPˋ/7^&>|e./&@u` ϫ_nuT*کnTv[n;խ⺝V1NTj_1WLH3R}ŔTAN]fg3g3b],_8|g A藸 d|̼Ql"eodopVN+xV-7T%rz\[(7兲PpR-zV-7 *l>'p B-I\WV tI胗4`_#e;;ɍ$1Ad ɏ>&aǟV|밓O%'P\PR撄lƲXRʢV%5 Hܨ]u&\;V$BW]CjUUVջZUjUUV5ZjUUƆ_\Wo_1wDyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0056-in_space.xiz000066400000000000000000000036351506652756400233110ustar00rootroot00000000000000ZYs6~ϯP>8u33Lڒ+ə/,&$p.x$@I&3փhwX|]Gi<?w[Zx&l\]ON>t9-n_;ohYh5!CNdQaS13C`cq#G{wG'Ё #AaTFFgG;(:gr2[N.9׆ 7( c' FS^~A}3Th"Ypa|xm,";Uŏȵ-PZ\I";$nG~̵-zMLaj  H}GE-+Mlt^e hN 6[=lI>4/T شvKovcP2ڒO׻!mЩfR=. nK򥝤v.(1tfFOҹtZ|p Xc6hW,RQhFXTMuöεᕣ5ņ ' A`]n`|U=(c1 B*P_TQ7/\%.]x4,o/+Cus3i[-N.*cϢ./%9%f[&'K> B<6N!PwL'e@֗( q-5 \^а. MaZ+:b ]&J G\}mEC7ٍ!;'D<<P`aLZ 6!I,CulY 8P)p,~L!J]H>҆^l]nا_sݓSߐTpv̧P􉌋Œq5֚%+?nAtB$ 24F~,vzw04(gQ%,Gbh";)* >ݭcQ>ROA WSk?OH &B#*R֕#| ΄BB=]Um0xd:ϤxgR(mM/^ }L]ka^:Ua^RUeE'*ZwQu~Dgـ2XQFt;JTAw; 뵒(/3n]T3ȗq&'W?ɇP dYpL{)@ yt3UiJxT#,^HS>6J_ ?%: <]{8͚?Ћ/W:0_,‰9P|Jꢷ%2&ӑ(+I[AĮ%W@pJ΍l:r2y>&#o."f=C{f><OaoپVpDg5pPJI.?b{8+ 8 ׳d.ڲ xί xZqE7$gpUoCS הI!#Kek`v8҂ʷ^?Dv֕׾)t~Ͱ֕RwPُpSN_DH(rW<~/ H Fg5n){YBul[ziejt:JmLـ*'6{4W9 8n dwtҙ_Ň7;߇YkyDVfi~\Ȉi(s x!#jDJ뉮2]+'V]Ot4Z)z=ѧuz^O4(ꩭ?+z.OC 8aђ/ B~cۉIGUE% I/d )_ɴXW3E2(՝/ZHgf0k6N>v[ D@P'ޛCoi)90_ ǰC?.yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0057-near_saturnus.xiz000066400000000000000000000050431506652756400244150ustar00rootroot00000000000000\Ks8Whu=x$iWI)2Z[d.,HlN$Rˇbͯ DNfCt7~|en8{4~j7]z>]6瓳v<|g6~ۻ#~_l]Q:نNS{qR~e. ƘAHČٓdn&7vZx޺ l>[Q@m#xA4Ԯ%N[XFu7ݘs!˸!/Ʊ  dJ_rB -- B?Pv-dՊ.9z)`P~@"?/ 2 v;Y[x9ㆿ`f1쬛\ g0(xJ( :m}t3`^E[=ϛǐzƮ[4۰$ q~K0)u15`g6ALl1 ٌl{A"mm:hJ bMMñ/m9գ.YuJ9:udD4$pk}le0ʀz6q$kFe$[c=|Fj/ZS/y4 [gh[Z[O@,O\ۀq&s>gd0 *'(yѵt½[2( k$a]H7(,\JEkƓh]37,d;֓E[y#8/흉lSWS1'uwch!&M&>& .R+_R隒@@鮝p^b,[H_2_zy~}%X,06w/1 C|z:I˩Deġ)'~li)^J0؊v{))Ic5F+,OEGkN:Fo82 0gf%TAnzZgdyrg)M )=lNNH9a~E֟\)|:phd۰bHd $/@'sQm0ri:7.[zDǚ^={#* $}u;ܳ#Quv^R+UG[ 龚CjiQ)1|Nȷf%G[UF>3 ^C)r ;])#dϩD8K'/@9J&b !-9OR3&dR0DF/^f ج^-#NCcIr,㵂-h*^:l\_͓kj~,|"%M u!-Ta(ڍ! &^(OS)1qjDwA5uepZ^tDKO$\)pqFRh|AVʩ- %4HYahyu82AUT)(Tx].nچId*f%ţ/h1gaw{S[K-N2nA  4Ex1eg<ѝ_/Għ5{{"KZ9Ss+!-_z\> oCAWA^?:fi~oTllꘆY:3Yv ,>to (>V]HORPyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0058-echoes.xiz000066400000000000000000000047171506652756400230020ustar00rootroot00000000000000\w6i!%39g2sbM aL_WlIl0%t<3Օ|YvϽ?\kĵݾmϢ+~_=ެ/KA8 WM֞p+g\D5]^a/Ɍ::'|4߶G [\!w}wbx= 굆J={v=-S_:%nb}Lԟ͹9%S37mA)F7V &@[# B?vtX`"%9ں))l? G!) g2(-=dwcу`3 uF|hn3zOZy$H~IVԼ6?pі}ϭq9$E?>顶kq IG$[h Ś$Y$Q/2]1׈x6g2%|/X-  h47k}W5ZewMM <S%p\D 0< (apeUA,@ }%oO}ykPl୲-v- c6`k܌Ɍc30qA8bOvdYNGA9)*-P2iMuk/t#l\Yh Uֲ'-\Q9W7X(Npnzh+n9|<-}Bj$PPӔbLY `1[F>Ypyٵ0C* 掍0 SZ8k7'ofGm ntT$I r8'I3NrhXiʆC8VN,OpQZnp6ou[æyʩU %gp$F~+byr륇$'x];a$# ?e6YS,-M!F!bQg)N͟kQm0re1n{gyQ*ǚ^>{#d*%=W+̼>,yu[ku%+ohGXy (xiWNjE%Xn;Fe3ubmo ͎^q_q&Q6(Y|XT+$D,U< 9!yTtǗ.pRĢx3RַJ\j4"Y#|yQ%y洨$y-1i b}$Diz/ mHHY BKNd4|2kUc~foA[q8Xy6aF(Bـo^6.5`Fs>C^UC%&ByށR_(ڍ ! y/G-]+1cZR}wA-`5D^`9Ynl4&VBҌfF#Wj9)^8$ 0{^WMfуf5 ~9PZS^B֊ eZh Ek\;A'g[uLtm'jbƵr1k9^zL^LxGPR5_g--2GƩ*AE)v E{YsyrH0OŖN4(_ s#e 6t%8nt-UiQrJh*mx`y݆{Ѝl -?}Gze!su]yPpּr3o%ֈx✒<"zfA)VN7\qmC~RLGt,igw\p(9.f~L^WrзTC eK/VwG:>ڜ,L LGq M*9jo!xwזTiWPBRA'Tp85/SGTx?鏤J^x`]r `M d J /fK*ZXݦWw[bwJץ;% ;MAJmY 5 6Ş8<8s+S{Sfo(ZbQQ|RWa#Nd] gWk%RW`5֕Yu%Vc] XW|57Uԩ۷c á9N_Jt@} B}F}z0֌}1xqraq\ڪΗF v\.y7nik\;.5pne[zU4i'lN}TCO Qΰk CxUzpx-=7kZwMvQ]\K`w ^Swkzd~d~J30}W%}gC\;~\d<=/D?&x{9ThKGWׅ8#?f(Hyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0059-far_far_away.xiz000066400000000000000000000043751506652756400241560ustar00rootroot00000000000000[_s6O!8q2ב&vv:a$:Qז\%J$JɴIf*? ~Yv,j[?v-;WӇ_u'.))wUז_<?L4)ښ91yod%w +;YFt VN$W,d+At<!yu˧v^_G{?~"I\ИgQԋ ~`$D] [{iB }&|A1u^,~bl- Gql֪e0Z1GYoZ9\OMu3# ltӥp7 `nZ?de oO=Zur\^'[瘅^D?|MkwZ% 6QB!LCNS|孫O!8>eM Wh\݀kNAB[k uEdi߶ՐQޠɈ.% RUǤrwt3 zUd fL` Q_0^}oO s!`/da# o?d(A')PrٱuxɣzRT-uKXo=wtFX(E{٦Vh ] 79$3'ty dB#oOofw6UȘ9L );f9H1\ZNa.G][~oidlI`rɍV] }<z^^Aڪ4uZ %kIG EƸlڌzE^W1=Q a_;lUb'Z{ UADF>>˧$($vy&\+[.MijSNZCtɺ>[=N#~7 ̞>:r}g~}샗w|X<[(ԧG Ij%cэpLt# 6D7n3эpLt#7}$|;0lma8"wi9;K&⮸R`'Ms*qW:2B2%?^نyFoTwgW6k;ЕǰjG_ty}|{؟Arb6yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0060-not_so_far.xiz000066400000000000000000000044441506652756400236530ustar00rootroot00000000000000[_s8!kvdiȷK\CKt-y'(Q")P&{3CU~Anzfaun1 \n?.'gϟ>|xn\w&9siLwO-۽ˠAeIg4rhމGM_hh_١Ϣ5[P=nr"b%[En_{Ul[>ݱ&:$sAcMEVS/6Padwt~-l0=_dK w<#)ńEBՋ]D,$ac>X-:DDzei   rfF~<;B(.wrxgϖ7YbdMÏe mO=?z69*o=;sB/H|m_% vQB!0Vi'ls)߽ρ \ĸҜ (ZS.`IꊐҾkyu#ş) >-F.y0x>hQpa|āFnaRKH9deŻ*1dXitp;]>Tf` _0^}O !`9/da# oo  ćp(d\h+-9{ldLjK6=$O)adѼF2tѻJ5첿ejd|:X`ia0l&A/㺎k3>Y>*Oً9NYNY7HZ?@%%yI AÈqSHIHqmuB bf#kd"~eZ7ҍNL^xK(dA&Ŵ$ 9zh o`m郉G5-h~w?i}`p1w@Ák\"Օ:y=:k=ij} uoSv#|Գ kTVnk]FZ7Q lN,_dGM.y߹@EW\:'z u}{*{'<(n=}uH Ͽ؇a$Y{(ԧG Ij%cэpLt# 6D7n3эpLt#7}$z?0l icDZ$,=T>ؓ=^}=HkJhG C׋~EMju//gMt<,Li x%4dZf"VO2LQE8i BP, du,VHISVH?sVn!V`* las@fNv$:e۳_-n#NbM(B]O1zE HA6±\#A.}/Dl-L63.8䖟I~]#Izؔ]?Uf$0.1}Z #E`8{k2{É]VMTS^YD[Ӳq (p9h4דCx!j*3_ sw+**.*R%'FOj0NCUir>n^~82Χ7v*Y) =C@?RSX@y%ez/:bMЕq{a&] *(үӼ* 'Xa1-fã2R'0$l?23 ǃ3Kol9u@w$qx0|y37>N˛$t҇bgZXj=߉vDNj(-sRp^|}|Alaa0Q}$@'6]tΓV .BN~x|=m-OZ5\Wkatlͩ| 6^Lt=9taD=f\Ns' K31-雚BXܷ9gA1/|6Yrf[i(*u57r2uIn5X2in7'|_ďF|Je0x=uo}(|/cY=SfP~G[Wv@~HUB0uV ht'ފ~{5z ""\H3.$GZYzxm⽷&>xqd}n0EPտP+Q׊zԵbuG]+vQ׊zԵbrQ<5`>LHi^0%wҰ}wg߬q1YhG>D_cD+ CD \3YrJ)ׯr=ܰZnȍe\-g㲠򪡈'TZgHY9*K9^Gxur@tH7MK'HZZe5ѮfMƻոhԘU/ԪVSZMmjnSvZԪݦV6jU{Mkj^SZW˪espI6"hOuTY.04H=]`6'?-?8$öDFa7yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0062-somewhere.xiz000066400000000000000000000043501506652756400235160ustar00rootroot000000000000007-`\[wڸ~`x:!56t̰&@Ȭ%l[&5Alsз- %-k^k-uE~i[ bG>t ~kM*_uVu!k"Xb} =H,¾@&`X.mEd,@D3fnƅiF zzP{|d~YDt>x(ПKJ6tI" v#eb7UcIx%f`oiM±7(\ 'wVGPzJfmx.&)g,}MUvnpCW !%$G,|Q/j&.T(Oݡkjm%Ze*K|zT֨"D;0+-eCY&kC $R+ \$HzUf> pG3%&DXYȗf&T+o8W_;UG%#:^]l4xxqJ>;6H)rsAhA' ="^I )ZcObs%$፨ 7K-EбA+t ~R;dVGs%Xfy+8|m>~)>4R[|GH`\~"{n\x^F6ݪ1M\}bLB I x1$ 㧈I̻3'>%Qy[J|sH6 ;`hi靖6> %j1x5*#KZM8jI)R Dyap 7чuQ|2rmq<FVm7)weEjfɘh^E3mK~.E9fykE3TH)'ZʾM7(.go-k$-咴\Kvw.Wա$-o"sDzzBV`˒_Fyye佗O!W*ZǨF7U)Nd]걮eXײzkn=ֵZ6_|cV䩼R=GgtI|4\\MoVK`ms!($l [i3,a^2Wa"%41]KוגtZ[Bmje: RоR ZV::Ӭn(Ve6qӪS̮b3]OEڒ%[O23LbuTT"4Fh)’Iyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0063-chip_pad.xiz000066400000000000000000000040051506652756400232650ustar00rootroot00000000000000=-`[s8~!kl~L6}Q [زז3a1ƒ%˘ H_[-)Z/(q@>:"Nb\]?|ˣmGƮL֓_\H!+7|{}j[ nؚ;`HZ0{ˎizL3mrqģX>b+r6t6/ƫ|ƾ0 Z龻wnA#z kݡ2dGJX:~/m8^약Xf| |bh|drLEFw1hA7FOeJ s%u0 Ufv{ $llZ<=س?6&#Am}lql~42*[ꘝ+jM Jyyhχg"$>ҭ~}!] X'mX,<] S[QR49Qa+2'Js80]-즃ZkOj U`ޏ vLkXĈ2k *W X~~Wb1BB~zL/fzI!aPՠ\CwDcvP(4SBUCF^`'1%5!0!ͰG1gFu f F~@2s].QX{}?em"aZ c&Lbbfd H߃m"+yHv aX 2-f \rݓGui}WӿYfT`(=]47.,"Ǵ2nsD G? b0F}VB;plxj+MDA=-@%=\L@?0M{NV3GyPh3U ЗG ?Yyg_hB \#)VF1%,i),ҥ0O1wOQ΢JQTU)JqWd e/o+E>?GkOO~'KPԹ}<#秞+NKPeh2g*R9Ua6 EAN)G SE\I0J=sU? hCf#I-|+37+q(sS$K{TĒ-׈')wJ {9g/_D2̧v*Y)!8\EY::!#d1lWs˒2\ As S=1IKRGqg~īX( G-Q&4W=® vW}mg((lc*B^B+/ƃ齀=^&9S/o _c.văD:yHu\hB8e->ox C5%/IT:j]t ΣJ .DNz~|mt5l_ߧʚ10t8M}ź04 d,BGLLKz[S6; ;&ixϦK>0bgnҾNFd䙶|^x`D]֝~y; N 1I *uCpPG@Hw1.K%%ylԸ7:g/N}=/ uQ,nM6oM|xq3q>L!_Eo_qF<,2ܖ7ܘ4pѵƿ}vO"nm "=tHr3 vQ/M}hKFTfQ5fF|7t-\r!cGsg&KXoMhվ Rq}XMC;e.B l:; C4Q#YӔ3x F[~R,&_FJE3FWUA9$G,|V/Rxҝy7 /DB.P|ag$P^z W8>FR# ŧ^(N|jOJT4f)VA ¬4 qd0Z3O+ZF DfLsY0&gU0FoEn_YlK}3Y+8W:UG%%G9?$l"JY/ńFD•u9(;6QH)t϶d O; ϡ .{j8H '}b߷6CRք9!^t΢v}B15)LdžPR2J'j|lOՍ,K}R37x\[hފ9ÕZq-}>bdg7[teyD?ލ!M_&ٛqJs& Dx(᳸(=NQ tFiA={:^M圈xI6yԕ=KPɃNX 96e8鎾K. zUmSŖܤNVV]+8+܊zr+۵rVnZ]+kvm$wy):8xza3IDdrch(K}i!pjye:a-1綜2^P'+@Ȼ#n:K[_U]k?ߟy!ZvVu-Ǻ}c]v뱮eXײzc=k,/}A.=RKJojlL6k`6T{q 6vByoshimi-2.3.5.1/banks/The_Mysterious_Bank/0065-bell_pad.xiz000066400000000000000000000042421506652756400232650ustar00rootroot00000000000000ZIsϯPtzh^5K)6bK$2HbEcקA)cW6^>t7ӳuv,0|vX`<}>.'WO߽vv`uFHWNPV*؝0v~:ɆOilNΥA灦^0޸{R}&L9(U qd"q> @c} [qfZ {U џJޅ !{XUb9Kan~\1:{*Uoݏ ;c/_ަ[ En}]gwZ}QFM[VnD(Bzzf3vZl<[ܹ#W 73'0TgIgZꂐҺzB,+jSO"p n@}`}5T1 J 5pUe%!O(UTn|]AѾ4 PՅpUNC%/dAuMIvbmʎy&{*Im{' ^+<)%fe-ZK8E O&:ᔋS[UBiku7{p#a*;Sch#&%SW>#Duu!08ap*#O7d[<># Ͻ=}}7nb3Ye/ c"8;<=S;bw8į/9N<?ˑUuWpID nT3+8#[D;vsx ~ 5d 9mhi; 6SF5gj# U̜[T2њ|K 5 T;QH>)3WIC~x5/yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0066-sines.xiz000066400000000000000000000037041506652756400226470ustar00rootroot00000000000000V-`[Ks6W:"LbSHrńT@V͎I |X`.@݇'mO7fa~|߼[.Wot3^_{&g:d^2g:WD2g*ptv$=n l22;wATD2H;:]b#:o&zP(L*x'XVI'(Մ&>I -O:a瀲ktHKh rj`[ Ƌ70e4 kǧ مQD{GvYpvzʀ292қQOFpC̱yF;u*թ\oժ]0@^ _ GrZ:S_t86ˏ'62II1[% }sccP;OGv>1dR{X!|O!a` Y}pu&>Ww7;3T$b|C^*[ȴ,C<ΝX aE2$V;a{:k1ńcsR S(cF\G&4\xDd8wܟV#ʗ :8b9P2vB6Ҍ>ᮃoE٪&3vϞ`M#xh#xq7%LRIpɔ=V-^owRL$ÿn=2NhMq'S\yy+- ]5" (ѷZ\Bf&EhČVգΜ^Qy+Z|s$+OwkU&7BMk|WF,;-}^_`#P4/ΉBRq^gJ,3Q*0XfQLi/ˈb!Jݜ4 {z!v%غi]A/Fyj7O_md4f CW<z +RHqr zCKiiƑ`D fyL3_7O s+.NE/\.0qĂ-? ݩɘV+xI6_+zj>TwSݭOu>TS}Yjwq?5nH׸%ؓhhd^蹸f*}DH &ύ{wY9L9XSuW,/ pP!vy0ih$擀jLB*V2ӅqWs+?suy>P٩JNx\p+P$} _~W*L(}D饥Tؗ`=/r^GG HEt'sq$/ a1yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0067-res_strings_pad.xiz000066400000000000000000000037311506652756400247150ustar00rootroot00000000000000]-`Zs6}5s.i)Nb-QKB1KyBi v]veKh{Q}!;հ݇&㽣~c[O߮< ]}옝|H(cM琺P[ }{wn@O9Fi70YG;3ӊZnl>],b?` 4 CuO&yj|L<^9~9kgJ5>hg_||B v(>,C1z\5l+!oR"A.j6_w|} 7 }T\Gt;zC]+Ԧ;t־;|b(ILx괹$LN;cCh-(}V Naʼpu Ii(; <[I&$^PW ̍X,fkNdQQ )!I+j c&?y/ ~p9B(`D3Nq)By wqI j< ^q bm[ kA hi[g7~n,Et>LQ=FN$ "xa0(Rd2*ptO!*Y޻S*Td<X"\޷mlN,*KJ n7#!تrm'_:|IGaoh}}{?-Rdh;cy ?7bT-vl>V;qIA] /yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0068-sine_pad_1.xiz000066400000000000000000000037071506652756400235350ustar00rootroot00000000000000c-`[[s8~`y}H241&F"%%~ellɒL>Dtt::"o?܇A Sw;x]f1:x_.n !b:#w/4~tLґ~&|O `gqx!\$L 119̻رX۱{`v<MgWx:E0KJ!/.؆5H0Hn7[&ڄf]yF-'{b1YA9)_1$DY6L,hBǑ + j7x΃?4gzC񞮪d\EnoSxtN6}0AB>p*.sA(qI61%_681Mo~ڨy4Lfo"TwkZ!^.f):sP觞R1i b J؝V0JtT{~:D20Ehd*a q%&+1\$38B">TaU7à*E,YjB!"[n [)NU!0)-PNS 1]M'Ym:](X~+'yvNëBOD,"j9pLK$ Nv!i(\}DU$§M[F0L6+N>kWgy#dr#D%ؽl 1z*W4C Ȑx2< P R:a/W yHs<щ]왟+ Yc4sq'kf{[)e"EG<C(GUbiBљ\*.E$M;@{rk<\YۿgR|U;IڞiՔo*T5䶟]:uhZ f9U tY⭷.88wRCr+8D 4S3p$6 nJ]Uk[vo^ՔۭTNOO$+U>J~^ ζzfGtVYN4ɭۋֲu+Qy7CB&x5<("4i M=z ôju,JNoڄM1vP+z:?_*ʫxxT8^PwR[֕C@h"KsۜoQ}R5~]F.B^ۮ+zN`ʹ8շrϞ,PvE5^`1ȡ#Bwjn:d%@{04,VvM6 LX>9[%ڽ?"k_f*s5+Yyp2] er}vQu,fmyo[՗qˏqO!{  _8rv[9J;ҭV֎t+kGc#H=iI㡴[%1 gHCy {6ZR3ӄ*,-ƑKrq7[X4yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0069-sine_pad_2.xiz000066400000000000000000000036261506652756400235370ustar00rootroot00000000000000i-`Z[s6~_Ayj&0.R n_4Al误Usn;݇l"}ѹHãuP0%^C]LwV7~_>ڝ?wdh=ąPJw4|ߵ&H(#g93w8|tnau|l}ƞC\BO0n'e+fb銝бBl2_܌WL):Hp_][1 bݎ!w?+Є*cu 6j<^v+{LD>|>v1CeLYls9P0a<|D1cB95NUXA*\ +k$|_bIllZس?m{0A†.tD\꙽L<ƑyhRfӈC͡~kֽ( ]͝,]"`Nm|GO|2LcR6iW8Lˊʾ`7^TfA=U)V6]ŏ: yLSl.i  8cQE ]fR)D>*onr@=i&8@'٩r!$.EoۜPkABUKZ#:09C@RmF)ݜ`da4O=4קOU5h2vnHa'4ɚ9j%wJ%z#I|N#DD.|L x/G%fbS3)qتt/K!|E; U]l^ljd`F `BCYʜX $\ʻ+R$xBisF3&t%ޣ W~. K6HBeAēQn9? %j{ [MJ]2R/1 =_^NKƇG:&"Nd?kUƊ;`\"^|JD~~:&{i}s}k > 0?Ra Q}$@G6tNN .@N ~xz=m jűG`te˶xs5 2]K]p, i2$#5&%}.5Yixq3M/- /h([jnUr5/LnmdGяgO_ʟ㦨T>&Fصhe"mӻ[S=omgr(;a@jHz"&E09_7 oM| iSc)]HV'?{)FÏu`P{FhK[Y;V1؎U|n[u;V1ߎGGm6yz*+ ibF de=ؗj0\L.#O1JhC;fv䗜He9^.,\_#ׯt z9Hn{N~05$(2҈kk^ )jl&1-LKypY7 /yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0070-sine_pad_3.xiz000066400000000000000000000040211506652756400235160ustar00rootroot00000000000000r-`[s߿SC 6#3١s4HEpז]KΆ1%N!9::_::b?~~JOmny>~~Xޜڟ/?|jic[a?|4ؔ`Dh 3m PbIVJ\̈́Lofr2O1L*!b H 0Hv#?)8R*#x||,"gg%%'kP.(>&4IC2%*,cL+G^ Sz{|I;&rpL{sؚ̡lKctN>]׾V[7AdyhD3Ewzrs05i_rjt*v;tbw۬~,'WUis5!EPL]Ee.U 7D\”1,{X=@#ه(02],<ςc"dpMOQ$- /}8kpCA{7ߣ׌ fFT-YH034sTf[*6[k `CP>u7svGCNIa:IGc1O֭ߙt!uVk"ļǦlaS2+߁:y Aɾ],Selx5?}.uO_H6e002s%"AM*.y; 9_c8/v?}V >Cbwc[ñSMԐ^$ҲruP L&SVdP[8ʭSVtDߍ糐{$/T%~;KťIEP|V̿7d#=ۥ4^ѭ{Gt<,q ʾĐWQ%h$Uyl6X/LNn{eDTt3(Z:"ב:ȇ/!tu7d_.ҥL^Ⱥ5cnX7fu3֍|X_ըܐ :a@Z'H!iALֆ՜jP Vg0U%N+|Hx )QvrHgk6 t==mZo t#=°i{v %wT^QxhPycH0b|_f}|a=S n`rXC\ a5߹x]AJyp!f/5yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0071-sine_pad_4.xiz000066400000000000000000000036151506652756400235300ustar00rootroot00000000000000w-`ZKs6W:dYLjSJrXtH~LNsHlžXǧt{".0yн_MNλ/߽z~tt~ߑ-r(KA~X$YuD0dy ;sG I~'ʶ89h-'"gdĜ,;v:t>0kJَ-ЏnR4hB໱ub0^:n:+gL @,qsc%g(` D(G؎ "6Jg갂pp?dPz^jG]0TSMg֙3E@&w/&HtK#{ٽW3iDu]DIG"Lcݻn::n. YRB]rN.1`Nlf:y*O"!^qFO ̍(c(akb,3̀eAtvrA}]iV6%> }LgӨ/*!N>bTàVKQsl2 ۻ\RJ 1WNEgkC>4(]J9c PzԪ)˽3TW=cRܾPRե0bT$eUZXR)$} dB)*ޮ)P5|f}*/'HR_@5Ib\5Oa/-PԻ9CI}zTUS&SmSZi4zFOY.qVrR"KS]H=HVe? xG%f7TUlU_ST]XģK%V|XG`ٝ.|6]i2:ȹ4ΧWNMMUU( %uu)" =Ce|D6G 5I2Dt{7];uQX W_. cV1?q@#Mp?)Jn +:׻2me@x0|y5)aMuMLdd *c "9~I ]t9tMti.}syK>"04)eXbI I,)*u!r1azD*I4lk}_)Bm4 1SK=r, *4&v_Ljz۽&ʎf?j)on9o$rm髹qNNB{# E,T &vWs飓nLhIl=,߼OWzIh.%bƩD^ۿ nzAi{v^K쉌ީqoKmݠ٪^F~2^F>z#qnL =V~XjǺUc*۱nXv[u;֭bc}v&c~|0!7H S~,Os&j-#R;b`F VFd-MKx*ds+zA=]tި|h;3]3g`xKE&B#cr͜Rr6?&)IʤT7? 1uP.yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0072-sine_pad_5.xiz000066400000000000000000000042321506652756400235260ustar00rootroot00000000000000}-`\[s6~ϯP}p)RUZڒW;}@$d$X 3Cp9"ձ/(-Ti55ZzibZ*TDM!^&cc $S'#s9N6 &LL pAf", -t˜3ݘVqX+qK^(DbFLJZ6U5b$kIw|M/im*8Зh6wJ16RZ;uN@sFm3u]J*)9+o $ԈZ>kƗQT/s5BʣSNnVG6_~ .lRؾsGe3l:;\KqxrqV[UL>Z;Py c͕H_-f[wHIo3Km5p,Ŗ}侕M˶gz,ܶj>cx%g G@$f7+'E>-QewE~y5jGe_{U#LZV L1RV#jZ\tFȵȀ|jJ#ݓ̛}.uIy<cƁ~?ЧjK#hB}ew';ORwj ?y|+~_NDZvV ֣ekn=Zv]ף\zx9jʫS/RGtI |МMLjk^$?\"V  $)a=9"5rrXIblX/KkKbLn(SaQPiUXLE,4+m UbL:^Wl{|_{mN׮LNb~zo Zc*Y_I4w~K_̧>:2d-NLLcDAɝUQqob?|Byoshimi-2.3.5.1/banks/The_Mysterious_Bank/0073-sine_pad_6.xiz000066400000000000000000000041041506652756400235260ustar00rootroot00000000000000-`[[s8~_1NUwh03$2/*ai[vr:̯|-YI" H9::7#;?VyMV&~|n͏4]N6xl`;ύ sݍ tv31q8jc`@:l,uM0>;޴4aZ3i6bPbBv ;_̖f\o.q6S>2 ͆£׏hcd4^kakm>qئa:DOe_LLl&2S"v;3ktEXʔ #C81u1WxU^[l"s?tMw71:4@rN׼m n, =s9G< );vky ҽD0ؙVJt&?15ZB7 a26!Lc`V0h  (F˪bDtl ypR]Ҝ֟_gYx#oٱ ۷ 1p4]< Ǧ%J@LS\\S&Qd,5$@UˡRB'`}~b$,Q\_Œ{'\<zMIO:k5RM~T7P"P %> T=O=yR ?6AIhtPz#QS:%(A~jM[ZkiSޢJA"¢4W tuFMxZ3 AO'ZƜ\̸* DROL͇P#|D$|ilƊW|-ăL9ֈ?Hfͩ2J[/D{+Kr>_dUNK6}+ @MR4$=^ppΑ" !Nu$eP&/s]$tS 35rXg$(݀nVӻG`~!u*Rq4O(ʮ9LZ`+=_9.M.llTw_,ށpO)…3V gun+쥺.7U~rO@%NQ AhpSQ"=n^Kͣ.A4=Տd:ߐl$~+ς|YE *4t<BK6pM@ݷڪ kj~Ocu6q cK͕cy %NO#ه:eYN0`X\i5֬ 3ϳh`Us7 KEgTaI  QǧURԊ_3]U>nqD"$5c՛nkTћV#"ig6ʻ.WcHN.Mrl3Mzm M!r KkOx ='{kv}ۈoޠ U5=do`t:ÿ ngT޷kv龭]oK;#ホ:+U>|pYKůWid]걮Xzkn=ֵZ>_rGcVy\G^0" 1ήfd o֜gLubN%_ҩgҵz ]#[[LJzd#r}= @B'!J)|Z )2 V ?ѽhpH<~9֓xkp繫TN ]_MRhW @yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0074-violent_pad.xiz000066400000000000000000000040561506652756400240320ustar00rootroot00000000000000-`[[s8~_16;]LbfM dj{_TAӶWK, 3S! wMWkQaJ>5["u1y|o?|~r7d7!ם%\C6W]7~jZbt$^c91qbƐ4`5?| xxl AdбLx8>ɘ} `z }xG@!I nPl2zM4P(O =ێ_] P9+(Y@%r5:*,cL++;$|[mM$憬x6>?[9myK嚷Vl]_Vc0u$@?7cbDCcݮP?vԼfM XKUm6Zlk4H}nHK) i-!jRdEAhn?6.*sA.= cM=&Fw hZr!$.wo؍WC)ŒZ2y0Gzh̶-b!Y^3"/siJ#`Q*`Sux idɖM Ri&"k}!.|@~ ։  yFHSeizO2o60H2S%CibaK!^Ǟua[GЉA>Zf?"3I:dW5!;VexK PÅljH&Vjdt[%1:H?ɧR)?IF?.?IibP7fm륧n'Ezjݷ\ӻE<4=*kR- %a`^hњ`N)XSŤ\G0z:Vi> :_I 2B&\1;|ǕQy Şd^!ߘsebȻK79 Uڳx0SDxbϕu2Ȫ#J@;& ?xnoJ$H;/BǴ>FgLCWIEq ԩrB18l =J_c@#{0K l;03cW 1KkC/6|NѓAk|r 7-R+/WK5N<(p Q 'Y'ҵfN*쥾/7F Z@Ed˕azOځl@6bMG]|wz@2ZiLS})-hE0X0UЅABs:MG cA:R]bZR5 m,#e0}Gw3mu`6Ÿ/ұFα:';37xqE|b /T>&:PYxX6o)MTVGߢ5+>HQ0ArH~$XJ5`Lhķ;8["ui{N~qçQ;N+=muGʏMKZضBi^ZK)&.[:=tq;Kvھɼ?keުQwF}ymSȍ'@%f ޷oiNd}(yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0075-violent_pad_2.xiz000066400000000000000000000042041506652756400242470ustar00rootroot00000000000000-`\[8~ϯ`y}{U)Bjɼ-%B+c_$ Cd;Gҹ~ >Vc\S򾩾m5}i54?ܾyxQo'#\7&!+>J3u7fI&+>AπGbCK7bf#g<%36\CkNgag/`M FLݝ'2٪{5 ^>} G" X/hb2+ {{GMj8m\绁B{L9:",S\%x -Cӌ춣@r7t\-*v7d 7owZ*h!(蚷ZKmݰoZcbQ7 λA{?|bxzƮ]͠vqyAJE)`Kr%ljt"4-a0ålId̝y 00] lZkKt字b8qLl?4Fe Jw*X~~>e@~z+-;j{ZqS$iz:=fG$FA߰oS\v3%9Q4ejdQ{Lɡa2Bs q>vbls"ϙ|5Dol% p;sBצ 2'wxvidZEλn"$NtNDv, 01#C&uQ@&p.-L{&`tdS]v /Z͆$޾;1̍ B@::}xpitN.mO 4|'Y؄AK+mѼq ^ɤ p㷒5Ȃ-Tj1hvl =Bϓ>*&fT5(t= HY_"h,](yҕzBqKU(q.)P%>uJ(-nKCy}^[WOn+*PԺk]`SקWOE*%h2gN͙/qGԕX-NBOЬAHz[P7]h|P_Hxȗlw%sų*+SEއRRE׵J1öowiau:|"]U.Yp֟.|6)^8j6lJ*g`?%2}<)IDᲄswxBߧՑL5B4c^RlT/;eAAL+$\ )g`fcOxbJ-q$bz@O~ 4Ɔ/xecizy#9/o9Xx/V˺w`v"2D3rڅr<5*{뭾op2 s(FNl:E6$bL V #^OtX%ì*90~Cmu~ 6d13h"'9XKT{M ߷ڪ2a1/|6/3؁ |άk[j$3)I=*Ǐ"F`DOa''1 u)G<:2y_!.w# Q&&%|-.*%%'yl7%tAH7(6cjkVϱzn5I}MkR_פ&?+j1WmD^}Mkb]bzľ&5}Mkb_{ߓطkb_\Mkb_ľ&?1ﷺө@jyORuUQ:(n?E]2r2PYyb^-EE:zE7ƴ!R7Bsok;6\DzV. %rr9U"-h^ܰ/K'o %J̢q UDͥ4X)\Ha¼+$^q ׎LNe*,^U.xժ+wo5kʵ%N6N&& l{^UD? ?(slUyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0076-compad.xiz000066400000000000000000000044231506652756400227710ustar00rootroot00000000000000ks8{~/[uY0!\MfsK]6_/Ilpu3UL"[V[|l=sF\ӳl]4>}p6X~y0?n߲jK >+.e.5 btӸpn&ff6vm_`c;eG x -b;+ɎW `t<r<_;죕m5;nP 8V$hhMzYzJt_?O1_$[<:9e#X Io~Cd ЎvЏ₴*тCH訶 ~ ߵE1.|gE|;naGإ$SԱłʤ5c9P3}/֘-1 P$ҘhuhQ-+qjT}bމBpfHC.^v|8+r@\ g+SB/oI)Rћ'-8V:h123cWnNKr ͶM֕\q\dvx@ **-Ppmknq8KB\Xhrβ7-=Qjj&nxmD {юDcq?{0d[͔A l2Ba2H@ *|X'[ezk"=l9JY bA Qj:g-.tȣudNݢ?xki>Q)Kc</D\;NrdXk˦R/}wDv{Wgen6~5j^(h9* N~?D cxs۵(/-gm0c|rd"(^r\lKTx`zn~ļQI 9R>Mbgj7wRtVyUWg%^>_U޺x ^f>kxyTj%[v׷zJ䯯[~5j [ƵT8yϏzi~)ŴA+hu22+ P!/⌐XT#4HrB_kB$b z_pug\/#F"E5A=U-!fN+(ϋڹ"SUDeJ(ɹMӁTl]x`4vӉ됗A/ v8`C э۫EpE 8+!kIBhA] oC{K04CpmB6we@EU{fFN~sOqZK. qc} ^ l$бFiXrwK`?ÈPh~ uF>(I$—\+@[.u/'TN5&eҿR@}^d(yм ty^Qa;}^"}V SIyc2>{:V\4'P)<q\~J)8Rt.T%Z?ΥTV˕IVqK)aK&̰w~!LpV񑪴<'<{2z #o+;C~zu轗7O|N M~y=x.=]g/kR=ҵZ:Xt-G#]K둮H1zoߏ4H#͌zC_L>~~Y.jϽkԵõSNۦH GmFIOzp?}-rmF0K%2vG9IյޝЂ)U@6m:zw μ+&m4&W1@xh˩6ހ`u6u*k䵨7y괍Vo5anZyp\ gnr_g0kx"wMJwηF&Ic>ySq 68=q\8zUjlց$,ȆޘOoW*,WǮllfl|<\PTj)&㸫x4;KhznK/3[n.*_HAuьR(∏/It"SUFq3~wIBS3 Yb-s~E%߯*--R;Z(ƸT偓jr0\ .cٽz;#`+ޏt/'x?:>FF]xZ]z {C0֎W}ؿ Ǿ_OB0RT>^N.೗Yܻ)f'߻_ϮCyqNR>. ƀAHĈYK2YOFm1N-ͥ.Ыf:ػ:= v=-]_:%nbԟͻ;\ gdh.<vLh A0.͆?;t[ꛎ~.h``@'VԒ~D~Q@e@g:zbۉwcs-d' +u󃷶AVY(1qz3t{n_!/ 绛mڃBiR$+WZ+sl8Fۻ0P5z{K\s k{7ㅕ̉8vuGMPkr½ *2C%Q*Q֣ vEIБ=,٢lA g.\u,3Q'o{VVGpfz7)ջ;DMJ&$|L .ЉlR+ϷmtMI Lh];."%6þi'b&wӧFZ:)ɇܯw/~}&9A; 8W: 9:6dKk&ޮ5u;罳|JRxhE۾\FmV΢JlGXG`YW}n. $}0vg]G¼QD|f?EN=JVg@o+DA^k,ȷn+·9x 1.`qHh:5QF h|铢&u7I2q,?pUhS TӂA>=HYjah6O'@@.zx0-H 'r #σ>Nx` Rpp/eW09KHbTJP;B"my)M(UP5kqFMcl|@| M/Ӭ6d1ME LKRNoIMIpy_K77 ̲PZU^A؊ + f,Ba(Z;2l X}]v}'j g!|\M*!yUC~!;jDcdxqUET%kyա^A!CMAXkJ ?O-4Vy0(q,3#z_p!<\p+a4F%6W:lC$'R)5Cy_ A v:Ņ^E%Py+0~\2ʃu?Y˺ӽu[hylm 4d^t\~393YWj dXWj+u5֕l*T۱="`57G xC4%WI#H h8X*QjM{|Je?u+ҕ~+arWu%]7Xst4uY-Τ/]M9tr1P//BUM??tai 13)kZfv~;)c Rfač̳V@{Iyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0079-supersaw.xiz000066400000000000000000000036311506652756400234020ustar00rootroot00000000000000-`Z[s6~_AyjRcB2i)N/a- 1%K8}Httn:StQBqD>t{"^c{w?^{j%#_o'>dՇ %N$u߉B0elx ;3G IAݧnpK(SnBe+pfrRXxN+;gr2bUCĹ閰 H)0HnRы4hiw#ud~-\p7nݥ;_l{>!FK&\V~ `B bL(Kv@n)hFƩI sy|s=FC j2],tw7zOݽ)7 _[d[ٽQ5&|{P~ǻc͋lϴ{) m*8$5J[-V?O{aW+!$t lC<܉2i{~ʂ\T8L6L<&3j/aB=`Tqހŧ'%E 4ҷw7ucxi)x;QTg=$Q 1y}$;Qd5 "-&fhܷ#Lkהxȃaapg2m  &aDrsS$JcQW;սݹ B4DG&Ja(72U (@6 A] >ঌM_kqTÁͧ ޾>05Ef%ov_Ȋ9XgaTCV̹[GOcyt8r*ɂ+x#:Z5Nt * .쳾=<> @iSSݣVC!OnZ33z|MA`5ɝJBOsXWj#CA*7` >l8rk<0{|ŭbBʝB-Xq~?REwZJ;whz;D*:\lb`@_BGل*hZ\ wVR?UGrj`${Et>w(o:vPzAO_.ˬS?c~b `An`(NNp+/l )G1+p¸7lq5MUuJ칼`3Z2i%vD29r:txx GGJz_m 5Gt`ʴ")nJ=beʠaJy`G_i2` 5Ї1ܠJbA:Jcb;ʗ5oŵcFtrk쮜7AP9*+[6u~ ?눮a DkZvh*WLּ7v:ckL/AҼ8|yM%8ep۾6\wk霝; nvw`qg(iUqeL|2񳗉#n:]L1Tw je/ vԭulG*>QvԭuoG}voGmf\7G ~Ì0%Wڰ;W˅nz8ATmr!X"=xr,g7˕cria w,g0,gڞmm{l#.,M&Q a&1-LKup!f?e7-F.yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0080-supersaw_2.xiz000066400000000000000000000036301506652756400236120ustar00rootroot00000000000000-`Z[s6~_AyjRcB2i)N/a- 1%K8<$AѹHǧ(<=C~9>9~|ӝ}GHWN| N"I>tn5l}'m)<;w0 > B>&Qֹ!̺TX+vra'l~;ZNfS) Xv0}}Mm@JϥaGv;^Acߍt %hႻ|t."g'~%'\V~(QLYFdtK9@55NuXΔ;W72(}?# <0TSM֝.`DF1 5,>M?) / ,# %ᅢw 1IXgZ} Fރ>T L0wnBj/`[MN,PoGJTU{ a ̘15:u L"; IcW;սݹ B4DGAM>PndT15D$AB)Rc_26)3.%2=718BԘs5x+BR$Iexv:O7$ ggg'1P<ǎ}:uyd1 ŕM@'\ !#`K;ΔLyckG!4pTP{3rT"pGjXPs{wz2͹}dG`B!5feuЊ[V$}++Pm>5i`O>(u>i\ >` >{@9_^>=j5ؓz!k%2@$w*%R =f]M}ἪgK`đ; Y)b V*7 w +7 J"@706Q0jkǨ9JW(ER i!UJbeʠaoJy`/ȴ\t]`jjɡcpt#y((kbYoŵcFtrߵvW Hl[jn̝WfnjXE?uȯ:kEr5E;KZ<ձoF5hNy['D阢K@4//SU[~ nz[؆NkwV gJ2ӗ^F~2sȭ#ձC[̀ v[Y;֭bVَumǺU\c*۱>;o>湼07LH 3~Ô_!'kjx^-/,#8ATmr6&tXn"9rLg7ӕctia3@wLg"0,gR66=xKE&BCr%Bc~G?&I.E%K.yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0081-supersaw_3.xiz000066400000000000000000000033651506652756400236210ustar00rootroot00000000000000-`Zs8~_Cjl$3m:4+s(˽h-[[LB1ؖ%h'̴7CO]+7_ۡz-]C!ŕ՛. 2C'qD·g#GZ"M<<ԁapA`x>C(n%3];eбth2tŸ0+B| qكcE.D <$MІg/"wgx(~ (آx0 f5Eqrܹ~A·Ux I!hXn(6Ј OH$e./K$#sC =?^9kRi b~Cde^k/S8-q$h)49!t sؒv#E'-;sMe)ÕJ ģK "ӼgWOzEE1\s63TG I(iE'.QVmiYu MSOM lKP~i~}]WIE0X{!͖Ep˼]/:ZIHnZRgX,ml" .r*m7 )[/,țah|n/֮ O5k 1]+9S*SPUv1 llh fj\ifzK8(1aH|F6;a.Wd4QT;34\m =jPpn'e ynYߔ$L+1Z_g2%p yV@*|ϋb&h^D %;F, $D+0Y͈rE{YFKQl;fmbJQAAH/B|1B,z(ah?>JqVN&{z$aũU*;&΅#\ۙqzW}}>f+h1!3fyƔ4_ ' nph.?:u*Pa[H:dHjiZZ?`@O?zT(yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0082-supersaw_4.xiz000066400000000000000000000037301506652756400236170ustar00rootroot00000000000000-`[[S8~u ;Y0B&ag/VZ[v-BqK%Cw$wMQظG)1tߵ D8Cvv7>x dՇJvo#%N?4j||#->l}1$7cހ!R(kÐsfF ڬ!+Wl~Ʌ.Ǔl8o L</.#aKQpaGD GEOoРI tK#`ꁛdpͼɴf>膓{YV~ `" L(K>RNb|a˙rp*S|-0 G sGUp4Mnlmnz6H3 { k~4qJJzJB^&AfÙ?m-0?)]@kҀFfZeAp]7p/rAC]i NeLV<&+zl_ uE$,VrRW.yϣ'%EeŖ4I2-GkjjHѷať;])|}[Ggy\nEn;5dW5)R4p T!$,i*:dkU u ;yƫȌTΓHu ru?~XF*՜gJ1L)5F-lsMZ=ϞEQuJn槞=AKϛyC~Қޙ{q^U$(M~j]Ҥӳ姺EC"^OƢV itu@MX)8]Z&SIijR-$K -2,׭GbAd;1UY*fmW\*RTM(e#G5$ttvMǣ\{ WƐU-eӘT Z664XWmINʋ%`E[2Y%v!|!rtS*]˻=t %S=i ڲ epWZh7u kihKi2͏UܲߑmM%^l͗`Sj+aBK:KKbA:JaⶕebynkEÔwhx>>) $T-}6wJugfp, |@"?M+ U@Zzh*۫]ޜ&/ލW;DMќ@0/9_ T%ފf,Xt- &0VDV Lop_oߠD۱oi}caKalmñm8 X+_o ~¾CaawF}yi'O#B~h6*Y:.]ށX?cz/ޏ^>ӗc}r]}t_0" Ib6,]^z糩nz:_| PkQH*ب 69\skBK3ӝNt]]"gBwz^t{V'ttVu4V{7>OW=__0-_i~ݮ)sOv:׵A{=NO#n=yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0083-good_pad.xiz000066400000000000000000000037671506652756400233120ustar00rootroot00000000000000-`[s6~>`~d.7\bZ @:h-=[r-9Wؖ,Y`fn:w9]I߮VRK7QD=?4q=|Z.o޽nzh7 2MMNhpn`6IR6čGw x>#(kBkfFGŲiɎ'aO'[#$o` n1ۀ"1o"lT8ԩ-yZs<g{a橶s=5YǀP@A"aʢ8@[ʅZ#aR\~UAwux躩ݞ EyK5x2_̞bnz6ټYrgyi[ $Jxyha#1/n6ɚiF@+eKYR|[%qZ&0'"˝(+̀Dxa?4<7TՂ0\P8L6%>~/hY*  Q{r<߀W%E<#D4]ex&>i.x//*˞v . 8{WeB\ N pS34!*-t)ZGqcg^ 31O0ܥAs6  :e =ġ(.ߞaOmu!}c"YaSO0z@%t--V$r "#H0-|nд!pu!{{JL(C ޾;?5IfU:h!*"ϸ2ݞ?)ezg cC#@704R0jmr̤= iYP ^j!]مIwf[F)AC7w9,$_i<~[Η`ETC g Q*1*>cڍWx>ȅ PFȇmG0IFW"e2<c I^-ǧ쐠5.)f#mw.vlNəM6`N GU"l k|tfwjЄj} ܒ?mҿgdR#bіuV~ `(D,}DXŲhE-8a9Q\~foxP:+B"D\jB L?f+."Y}s{=]8ۅʹH@@s:=ў!ĥ>;R" 3v2'x5'Bu[f\#:yTM "[G=kL%C^ЀcXi 1,KLq:K`\CvQ}=U-BnLb}!m@a~ 2D⋆rA<#va߀2(;L:^'DtU|DWSi^d&Z-u"D9Iw|"!DPO^v#tf׷,sIDWn5!RT*oAt*t~ak42ym .`vj3852]~0}9Wu( # HXyY/V4.xrN=B).B)"6(>*PJ7'=NnmJWm4u|zThkɘ!{!2tOITBdzHpUe> XGt+,b}3F+/8U+?sPĽ%+Jތ9EutvbOǣR>Ėxxi߰1DUEJ1% _҄*D7H2^W,i2FwGr@7]hkPՈ&+6Sч˭W1K[ؑ1?2@#{_ [Wx@v׸æW|FZn[6>ND͋8I|J_".˯؃r&FvJu8ag@AyRWsF-i8t*;pZh^vr>Zm]nI,:TV칅3*n/2,pЅ\ٺ@łu(4s[]65'~OnƣT7^PἕQ?';@[e>ĐJaDVNH f&IYH}UTJh- 'f7J,. %ySq`/%j:lPЮr֋Jsfrs:S ؊1&?X y{Ha[i_Nn54-׷֕T[߬¯ tM߯d::?pVsVoGK-GYu^%3q-HI]ZYZJtysC%.?ݯ[~u{OYx:*׮ |a~AxQO$KID{~Heˮ#GpGwJh!zu@' n``_ΦRBZ\HcV2z8-##weqN}*!Hyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0087-bass.xiz000066400000000000000000000040721506652756400224600ustar00rootroot00000000000000-`\]w8`}sdNOLLbgmgtotdm $x~ cBB`7Ћ4~s[NKCmo>W׭O>c<[~~2ȶ+RMGuW?VลzSH,, _'w}u<'\eAi-JGLŎ#jed'q̦SC}WCLxLvnADf ݈iimxIƾ4>~-L4ͥ9_$< ,;3eǑv# f>!kÖĸ+=|;TԂ0\8Y^QyR dtcXm@}1+b <], !%ҏO|.i*x#;~ht ! fcE+|}ul yΔ`DِY#׷D ڿGrak fXNp2jmLp+E- =;Hv>6yNWad[4VUCŀ0=&ܼB6 Ablஃka0SŌ-KC8k\w_ͺW/~#TA[a_sY?&v{9?\[:zǞ#8e6qPSEueQRl}퀂\J@/pI4/2bLW1GPZQm2Y恫yaѣ?7lN>}goT| HY~/zb.yy6Y*P}@W(] -mKY>oAW֫O~')Pw̾piӛէG%~~+%2$0/q*v'zAٓ&w4֗JĐ{^De|Yn swLO*oErxXp+IzAǸew8 {lQs v8ζl:Ix j:ܙ_ԭvq@;RxFI$%EH !~}$SP  ]f=*wW9eA bK^+Ӥ "ܳ+.Rq+0kLԕqDž뵒:Wiq`nan*j*:V|^{r_a-˶ȅv$r@#rƙr,zPg-g_g @0PPaE^h1M@P1tQV +?ܻV̶Vt\lWWʊ1SXE%[g]uσ Ca=)"$#Iu:sy4M'w{v mK^GB[CxK=wVWx쒷~~R xo'Oݽ1u)G<*y_ ;HHd%$R"9,퟊ܿ-iavRz =XbBVTz6a oX}V߰Y}FKnH^!ph7´x7 oh}Ck^6hh_=.5X}V}x&>)OS}R|=MIq}b4חS}s9z}|/3R`Jof~4޼[.d gpL@d!ʿvNԈ wgMD<ִ8/)g˥/rzG%/4TuorCDUr  OE,ڒH VΒӥq׉Y, 9W[CTEyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0088-bass_2.xiz000066400000000000000000000036261506652756400227060ustar00rootroot00000000000000-`Z[s6~ϯPR%˚IQmլ-y% DB` бI$@He4I |ayB1Ô|?D!LaY s9 P 0aM5yQȧ& q{PM*zC>Q Cjl&H)#fץd>{#< Tn1e͑ee^SdZKrv_Ӓex b4׏hGl=Cb|ح,& jn"jbh8H)(<i*:d"Z> q 'EG ft*QuZ ~pή4}񄔦GJz RctZ K~nR7PP ? T?_Xe z,mR堹> FŹ=<> @iSSݣVC!LoZ3 zlj=`;Y R9"k2RC>I @0 Q.|ejvɝw7 +xW)Ċ[,څƳkMן!̯*VJf049"! KW)?u 9#5B'0c>II=JnMAXyAO_-I%<{O=~<l£PX9p <5dT^"ȴWB17|y=`5!|xć/NO ҥ_Q~ZR;Vq֎U n[n;VqݎU̷|?Qۧ<~DŽ1#wLI r6\]͝LR7X>.f?WڑJ1?=OF2V1z2xU~, rf9 6h;f 74 rAnd0(jZL~mx)n s0/vi|gZh;B7.yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0089-bass_pad.xiz000066400000000000000000000044671506652756400233160ustar00rootroot00000000000000\s8_v.&$$Ub.{Q [$Ym93iZVe>~~8ڎ-C,}n=,FϟN>t3.rS >+>؝nۥOz~5}<❍]GN} ]; z2"6c$'nO'hy n nnQ $NO$himzEAzJuF2~0 c6ONe'-K/i9ovl%> qA[Â}YSMLA`9e y*Dǖ(y&݈Ty[Vx2_"n Ɯ*ul}l'[k}v)FSd{sH|ۋ_Nqʸކ=h} 4`hq֨$ZEwmj&L$5 /߉|`f$WyIa+Q:XU?Tw95g B(+і8(2EAxaiuP-x,qQbE~B'pJ}_|8/s@\ 焩(UBBůRY3R1 oNjX+i[좭Ǽ^oss^Ss )(ܕQHQiGϴ=դPao{B`k\sIXBڜ.*&Zi-x\M157k(Q'zh+"1͸|Bnqw`6 oI 4($c"PpNxZyI,hY.&"ldfBO Q:'-6֓)׌ׅ]/UT$ 88f#4P֔m]qLcE"OpQZp?\tYg~Ө 6h F#wYyH8楽|oF},"~8U8">4BhT,C9Bx.ݒ2m0]KI KFVN>ߩ\> L[j YFiBdlFRK|IQR/[hT0{Wҭ·[!A ~< AsȴEW dX,pLlv? ޲]W?[o@3)O>f-"e"e`8_VO&ワ'] .|`UՂ3 \$$Ani&Mӄ {.ɶwRAµmPl?*x VcAGRLP_+uurA55u0NCz!=N]YPqણy;H]~vhEgSlK礧 WH\5@~,Gڱg#u(MKv{@ :!q8|}&fWP$H"m[K͉a)نv΃w>[~{J/54i}iM%7#7YsywW\ʫ&WTMVjˌMV/g {zAUD_p睦:7sZ( ߤFv7`[р X߀ X4`N_;g_㑱ˆlˆ3}k[S+ޚ=½ο3`}LLֵlBjg=ֵlZv]u-;c}vŞGo+$|CBhd hM\Fu٪wC_Pr;笖2w/elHJY/r"qGyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0090-bass_pad_fat.xiz000066400000000000000000000044531506652756400241330ustar00rootroot00000000000000\[s~_ه Nf!f@ΜEج/L_-$Ys9<je>|zn=|uZNK#Zpպ_N.Z>trgh=8˚N,`[QdpVŞ}k0XXpik{kD o@DlI Bd"&7GO50H [Vkt#mYU|15&d?X7s׭KVV8Ў 򔱽>v;zjQw๎çx?F۟q3-ս8I=BsWZ&ڿ '*rşh9Îd8',teo\T]1UZֵ$~@Lh  h0n5ۺju8xQbE 'pACc|8۰O .{+ݣUBB//RY{Q> nnƋw7%ҺwA;99 v,w Ndd%'Dl+XgdR,&x(ўl\TRC+5t5"'a]`s;/ajI Wԇt8bbkm]6QNȌ>zp+"1ݸ($#"PpNxZI, >3Ѣ)&ࢥldH Gl(qΣHzznkƏBӇq*hB' 3FNrdXkʶ.Û(]1sT?O{\$N ;Je#t{/rU!i#`^vk`i1ȟuOu(+GDyZ HWkDYVZ%{X.S\?;Q^Rs1Τs䏮{7|8kp/ˑtQRWNFќBc<^T <#T=zGv^zXT2htFAͯWw r?pTvF2 jX2w1<) N$>+x01vp2%L9|Uܜh;y'"Ȓ)ę1N?CYt<4cpB-I09ce^7`KFj\'{{XFQoӅ6[PPB kScTcqIc;4;χr}ff$( 4(V r /8&9%7̞dF3w* !"vYvKuB %+A'Oleh#9nE2TY ^,W,䯱 ݗ+آĐ+Q-8u AEIBB4i8TH.7iZ&HY1gFs2n3n"܈he{~ف[x`%8t$ʴ(v9 ջR_1X\.7TcXC8_d<ߣ@OZYە W)G 3@[}mOYk?:=]9*׳ЧIkF0QX$D1.#tCVp9}&f7O$$n[K͉`)؆vT΃w>[~{ /54e}1܌@TO+/b^qjzHMUOOMU^flzj>+\^">oֹ^_Kt X_7e=ݔ XV4`}7`}+z? X/F,k<2{ ?S| 3\#6JﲷfipoGLJXs{"Z6XO!Z[u-Ǻc}Qǝ걾|=bOXOlQE_#WtI|!!c42 zSEznDB-lVA/\.8KRV0)$I3hGyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0091-depeche_mode.xiz000066400000000000000000000047211506652756400241250ustar00rootroot00000000000000[[s8~_s IUbv 25/*ai_0~lْ,`k8GґO"}Ͻ?55ZwӇ_n߶rC J?<ު/KtF8 Mqkg\B ]ހa /Ɉ:(: q1N;죥mj.ޒz>8EAcZC?v=c_u*ܐ?7c s6Of:n :S1%lXA"'$툏7hK\Xf!FV膀Na9M8Aom'nSuPj4/fOcs` la^?dG5A[&@^2[Si4Vm|hG9>|xQ~|EYޖ}P$H ;M#(p:{]>m6عT XaA6I4A99]I0gwˍ4&h(N qWrL_Ah kLȢQ,vdb$}gax/dmgapN܍8a* g^"f:͗Zlج:7MLl׆ɍiVj>UI2aOS膮W9ӵNgǖH$sC#ErU8M_3UgOdٶIn[,A9Ie[{o䁹ϝoN٬#yEU/3)WKoh8HȺ/]r|vJZT$߽5F4v kHy4JN'{=?&q(`(E wʑz sϏ&ɘc<{~IKwN*uFjkYrd…ԥ@W.* YW}g18flƿvQQ󍃢. }!S=n;1,м`Xtd,+  d0}BN&BvPށܖ`(Z8 !yYG\+N&XcZLs~wA*c%D^`9=H`#)%i-_"hy$.Bf8`wrE-@U\UZ,*kGs2N 9,Y,Y7'(Xc).('.O.2 2.U6($xNJQHТ_V9m^M(u1S3yHe WVRAC70Z9~P`BP㤣,*SFKk6<54GWl<B=0X8+*ճy#1y뒝w;*K{\lt q}Vk1OJpgWDRM -z;Q\4 6RXeBHȀG/tTpI*!3 4WTusSeEeWf>p2{~RII1Ź2PsJÁ6VO)˂`gЕb_b7mKv8ULiR}#@){uW<E&GiA @= R j s~a#WCi`*U< =lN8r/:K陣w_7i8t<5"aBCXgW[*_u%Uu] պj]Wu+aZ7U̩Z׷ XMmh\ ZqA4&ES)&NIU7YR>ej՘[Ōp uJ"ƈdǨ|e v2KN]'+(OB)P[~T*kғgɮ"@yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0092-dubstep_bass.xiz000066400000000000000000000047461506652756400242120ustar00rootroot00000000000000\Ys8~ϯi#Q8),֖=<5DB6'X $E$[CbC8_v3Ϸ]mmc<^ft;m->\~?h@|Sɖz^[oL4 x&mݘip~}7s&tSڭH#0bvsw=^o׎zd庛C=NDBY0c v~P;v:%y|?%t9N渥dk[6&LeJdch@&2֮g2xlè/ Zq7cZb%gDuϭm6|^u'x3ߘOIQyJpyҿdЗ,@d`Nq{(QAm?LjPׇb(ܶX:2ޙ.|Frh[ս7\DL_#3h:3( |~uz74|VGϧZcw[鮞ChQ)ˍp؍<{ֽNq&Q5+HY|XNӕDI^y:Ec*Iz%P%.@~FzFwNMJ71A([7!GϵW%.g"\|ިfL/띋j9W> )Z)Tδ(RE(dRq  !09Qt{Tҟ܇Du͑{$R`Pwx1$ˬp!v3L'y R儎C1ttI/w'Sk]ScǟW .! ERPupxܿ@1$]4^;瀸if$d\ԜiLԌfPLG93iB:ZTld~YwK+2BPbd Id^gˆGB%uB*#q`*u/ Ez| _Iᘵ٫eU)f񟨒PjRY/8a_|@q}ܹevg_>:ױs;pulilGOɷR7z g_^1v] %z]nk^׵0_:T^԰m>oj*iNW$AjfɒUAFkL)V =_6$iq˳%99p ]VA˗)4#x\SShBډvt4*{o(2*c1CyѮV!+#/"ӎW-|5-_ ~cB~S7^R2Ў:E^ X^#kRWt]-eP[WfJdZ:⮌vgы3 tx-Q, {K<ԏI֠F`H/mj-Myoshimi-2.3.5.1/banks/The_Mysterious_Bank/0093-fat_bass.xiz000066400000000000000000000043571506652756400233150ustar00rootroot00000000000000[[s8~_Nw`v 25=/*ai_X_0~|d6Υ_ лnmp|$,R%XkukMlϧG{r=sH|ˋ}}pYzAG.5RFt8.e'Jc=SLy|욞yɇ}p]K* L\P6F!ٔ= <&@Q f'5r\.`nEKw4*bϵ '8=^"ݿ>M_<貂m}Bjq cF(M-ILxHm= &Mp Zim%ag)eɜcTuϭG1?/z]S˖R((tJ8iɉb#Y;JX[1B7eG1_ .! 3J/׽ea/ uȩQ _p"D~;`xsCĩQN ="l$6~<;"2B1cTl8%8pzG_ˢl Ӎv+;~@PRkE`n\gL7sVYyITW%F>_hTƺ[! F^SN04$^Sp 'ϯ?@3B$rcRœ'"Q* }l|k ?9xm@X.GO|Qk:'@o1./j18-jeTfT]&DeL#(Kϋ9#MeD2 nr|(+yb:қxKߒÉ\+B`1*xQH;WWOaʱpRz [Rlq+~\g ٿ@K;yוW5d{o<_nYڞRyy/%^W/Q聃fS/F2)@Kn/T g> ͉W#}IߒRUa޷PRq圦׀*o&jie틆&O Np^95UiXsү-<ņN8R6fMnn~^jirë8K2?*dR5-JS 1UO"ºJv9g1*x)c|@RЅ:'(4:yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0094-fingered_bass.xiz000066400000000000000000000036751506652756400243310ustar00rootroot00000000000000-`\]s8}`y}H$dM&flY h-Z[r-9 +eK& 3i}H~IG y(dMu@ġ.&owYū7]/gnƿ+wi4sBE_)w4|4Lv<F|7 s`cp!ikDx { bq =!7)h;vX:c#t:Mp4Onx$~ `z }$d_]K1 bFKEOkЄj}ʫ?mҿgd#𱋁hl+:N+`0G> &1biV.Ug%DCb)[lrwcfbNЉkb!P\0imE&>_:G88BJ߬qb?^y{x8.P?^8k^Hl|/gP5[?k8Ol6VcRP–+̾i`7T{x.oQ ko>[[u"DHٜ<(Tc F8E5&9hZ"A.=LhSKɤ;{;]U28jG4ׯ1YKILJ;>"(O;b:=ǃuEE1 UMA[P 9RF@?0;ӭAGyиJAPŹ3bWςEJ`b}g.?}d9ΕLu( ,q/V4.T<^}EWUuJmԧ>=*)DLZ8 il#f|`; =fuB^"J,:_vr CPYʗfj+/W!~惢\%,XqrR,{:G /^Clc>5%UURD00pL@[xt ]ߔ(p%sZ)D#TA2&u!˴^$ouʂ0w]TH}&ev9 [L J+6 +k%2m8_z<^Mˋ8yEX|oV+6ȃHFYO)y)*k}u}k > 00_Q0[IHJ@;L NE[]`>ZLHi0%gBs~6{0/gS]cQϹ$B]GQOei6NOGVbIyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0095-fm_bass.xiz000066400000000000000000000045261506652756400231450ustar00rootroot00000000000000[s8!GTGR dk^Twfe˖ N\UagnԿnynXl0{|X Ϯ_>vj{g/94(wf)n~Ph=ڴ1#s׸>,#x,t GFF1gۈ/6 ʎ&l_- nاf0^D95]tf?=H|7Έ[Z?cka駅L6xbBN/B͍MH, FAaX%[Պ7.L`@".!: s=utwksCŅުd=Bup[7?6dIc+}W$JmwgncAeD,p8LJ5vel÷=l~V(M+LASy宍*'Ik-esl|G7ف+ЖB3B]2ZXp<\`-}Tđ"CQ8s#>^|ONĐy|Łx RUtld tU8b cQ|7Z< J_7h[ꑭ/='[U o x,ɂDO9Y94$(;m7򰚔lK?0҂Z5'bޣa ]*׫jZGKWtpD'l|ϵIpą1㭺Biku7n*vǦ ch!&MR>! .R+?Cf4-;g׮8@a'<ڐ z(,7O+;8~7Q@hh.RM#UBq,2$`ׇ?asqշp7*+&I5i+h t]Ql<҄(9JY9NYNYwc$|ZooJSխ&TU ΜAˈqQHI6mՐgr\H"od[;aƸRbNLVnVԡd|2-Ŵ|85:]4V30j7K6NF|;:bPdSߐy+X-~bdNSJB,wpǜ#5꩛`[bJvڰ |;{sGܶ]T=x1 ͈R㓗Ya#WN|WE |#t]|>4 |="e_rt-m">G5wfȥGeA";ʅl)rܹ[ 2<ݞ\M5-WhsF?k[` )FCnͺQ?Lm a]@<LB25q8 O8Yp}Xa_v?1jl? ۔ء#>kp |L|tQ`r6)ټ*dKt4#J70-I GC^i/LVhRQ ڑye!gr2=$\`""p¨<@.9q5*xRHwðsWItlrVA?ͶB{Q6el 69,T\hRcHSpzp!1˵ʘU+Q, w-p0'?/)x Hg~G6B&xw=":z"T C}O'<|;/ͩ^~ 68g4S\D,8Ppmϙ0똤3K1&e}q`y3+N-9Ƣrm |6ߎ^z{JԽ#W%Vr:؍dʽzHN# Y'U@SMHMlWx-ؒ~{Rz3-K*BlI+ {'CUXj K𛵖4|cʭkIF/y:>Wh87̯+K <' yɽ_z/=K^g XgmQkѨ=s2ě/oL2%_ >d}oiVj+Y5ՕbJYMuحR\WS])櫩^Ouzs^]h\1!+fqŔ4^!' `=L_>犉\'~8@TllԈGdLD5x^,3-`\k*Z6rmB ;N-SZj>C– AZ@B[CZrDՅ.tHnEzLʾƁ"C&rb>U+{*_>9lJ24$:6V9yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0097-powerful_bass.xiz000066400000000000000000000044661506652756400244130ustar00rootroot00000000000000[S8CP5T68Ab+w) ٿ~[dN^0%͇O/ڒ0'Py>]^wgΧGqs?}yp1|W*,:bħ|9pG.o}L/,Zk RcDbr$ Lw~ mpkrD;PVFw$X]'5eF⇡ItAUA3s5 Z`(勴W?F~Lڐ4dM(h-EbA\ii  /k5hg&zywA υwuUMO;g:ˏ~s|ܰo$\$((u>NcgrüI6d2jn)&ϒ_G~gu\ʏ:?pgaN#Xp0JpdH' 3+LĊW(fZ^oaYlcZhBb H~s%;&l*mH-Ae.4~p!'f1'sCE ,ָ -Յ̹|sy`vͨʓcĒ i3}%RbJvƹ kBCO_5Eû,)}o0E&z @F^@րy+9'{$hB(pmKʣfRnp5bZ{^Ki5t/)n ,vj{٤nsK\pͨLpFhd#+"_8gٹpt[T[ccacF8MJ+ŧD&`K<Hhm@qHpy vc鋕hz#u~w(+ѥoȗ8AJ'e)ǎyR ަו0?0&BY_B"FpOGٸg/N9ep1ڬdy ^;[zqS@:z$3!>2Cΐ4 A曵vIƗٙ4G?t.HPLw.aDPR;{a+wgbolym&7G5(_ssZm@y h|a[c kJ1 W̾8 O3~6>9uε|$kTA~r %:Ht(f'tN%qqL,lH@@go2{g}S&B<QR*h_ C~m*?H%"""\ףoEnz VE1lPnHԅ͋^}cRn]`"PF&[_Qf##*jT##❑ˈ#!Rp:2ԏ˲g"|5ޚv$ԏtLKJr2E iuU#א>'DZ(!BD<]KCqK/)#BHEBSKZgCQL]s).}|I{A|zz#(oidCEfT N/v 8q&_U o*?&J8Xxx"1PD=B{ uBIqso;>X|gZ|^;իMU)V o VX #̢k!92Aմ)w2nJ[${yfj&ͣ{.E=sdisA^.b4 pFM &1*h*iy;B+=9YݷL<BǻdğN;eU W3w +-vo[T{9kjRzV#Ewл; ojƈ5'Q_zW 4҇^XDH#7og]bEsV7vjp2MC7DT_|<xQ:{rlϻ/^=YI2?7X"}HP+[2<%jډneDv[n;ѭ캝V6Newj'DC[hC;> />+O=gׅ5/K2]zPYejA*ޞQ wmi?cV2yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0098-doublebass.xiz000066400000000000000000000045641506652756400236630ustar00rootroot00000000000000r6}n֑%WeXrZ[v$9/(,<<b@zܲ r1/_ ;_L!k#Z Z%qj&puMVw5~Pm'l8fK4z yԡ.@XNd\V|11""!~G|Xc:Y,--HA= :A2wGvv i\csxtK7fYoz)&! w^YG&lv1G$~ :HBz[s]sm+R8cuMM.Q0cG %00; hX%82P&fk:]G| F2DX!\YLtOZAq X_"mȸKThex{} 9p **ĥ29JxY(`BqG l<e 3F#vս&DWĿ(4T`I ve.j)!暸ġF;|}$+99\ëۡj`r@GʼZcFLLƔB|  6DTEA!q iyXCEEnnO=owsGG`5;p*8A[+h~*LFӓQO0"Vb܃t=O` 1OOGN?*, 3Ӹƻք1Z-EA &|w T#V.푖&khtkVہCpC2󕧸RA̙D Ry9v7_|1Y\1U;aDPRayv_KspU+tJ9XtJ!UALt\:J=T5' ΅`O?Axs;h׆@e*Ѷ] 59j0T_*Ƙ0[S:m qHhN3̤4UGIq& p2$v=Į(4TgL7hRMb$v(Mb$v[b'uhj&k^Q7ksF\0M[/&WT>K;NYruޞzkĝ<^}X*9~BUnfUvF`UmfUYUݰn3̪6gU, q4`o|M-5l<@|V??$|LdT&CRML>6=g&5|&SU^碌IwCls 롆qͅgj_^=_";h=$|>rx1c) e"oXT+<~!*UIlm/tUyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0099-small_bass.xiz000066400000000000000000000043111506652756400236470ustar00rootroot00000000000000[Ys6~ϯP>8eٲgbgj5%W3M_0 YLxbw RcOӎ^,{?9vkKܫnL}j?,'ot3-?뭿v4j牉# +ٝ8\{mr~ ?ц~ᭅ=O^$'+=pIFѣv+'b3_O d:l qVg\쐫&ܹ!1AbluGv#S/>(]OI|?TΉ;X ;}ԙ~BeZ>E X&v^L~"dE OdaqA[]YWMLA`9Ey&DǦ*yY݈LyGVdX2n Ɯ)u:tmwe׽=?z*obm|{7߶U ϡhbqg&ז]%ub=b't=53 dFs&m-LsBQ4Yw-˼jw|xeMgxu ;/dWh-@ DǹQf l`¨r9hiMwc@Xʈ4,n*bKi>v1:gN `%+9#jѦ ;nB•-=ÊvT֓RC8hk]cIXAYkEZi-~2ip2fYZJ \/yEdקٽ.;: D +(<6&-҄dl1O@:Mj1Q@lCfUmNkJ deuOG~X__s~\4__] Hq A9p!̘ 4XWє]qL S68sHhe#t^/r*ph#`A o19{!᠗y},$6~8S F *BHg|qz/W7ϟ>|ld6{pW\8l &KAdq8pcfEx`m/8;*#nWf0jDϘIg6AtE  _9م'r0 qA[l!&Dkb stS~@B~SBdP:zl۩cэ`[&rhNl?n3S tCd|lEoOѾ?: (.cm9"?>顱fy;I|/:Յ$ٖ˝ (Ypz a|s )xam mߗzouEm ] X7ǎ69Y_1moٓg9jR T[l:Zc q_ K"GP\bVO&-]#3D vX(U'^싊`7'S5u@L{ PPaLY APO@%:!( [CѲu\&pR<|[b~m?ʆދl=Oq"_wa1 H; F3ҌS5֚%+?Aw=Oi;ܟG{w1zY/@9* N?K=;]{H 6w։b9f(0 W )9˵çT$s#cJRSg)?їt&Qrtc*pTT5F+LKn^:7s˗NZ{Z+yyCgi6yuRKJ_18__S/;n߷k|q'=N3<@r]@q2X8"/^Pq%HYNOjd%QaP`+@b#XJado OlEg2P2^ND_ND;}'" dE!qn.ftKyBu6k%p%ĮB!t1%F2Ba{g(X5E`g04ӥB2*P$}tx@@ص88C-ckrxyKO%KT\iJéJ;KΤzu_TQً¶nMt0ˑtZCKd?XQ^i-o42:>*h[8mナ*Z8e-2e2epjL}5#O]][d@>ejQ]"$8AY戴EjH,OpK<9s2F,(_ w#Ulc?r%w:JUZ}Ғ06ރG5G5p8NFB$;0X86lDZgjeh[zʽZQ9m=W_?V,Fک mj%;Q^z+4҇ZXDH#6.1GDZ@?*|vJRws2MlC+xV٭=w~^rdGu%?7Wyi8/Yx"_xp,.I=\zzzˤsuگ 7GnsW>8uexu*|^-ޕ[#~7ޙC™@Ե0XoZ7t- ] cN}` XOlxG4"w4I la` -iA\)*z:[ eOf)F}QzR u 2if+ΗAIe-_ kUk2hn\NLO;_Ou|iE˖J6=)ji >JIѱW%s\r#A1P^N^qK~VXGL}h|pg/ku_W] -ʙ_M zc@g=?ULJ?IRGW@yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0101-synth_bass_2.xiz000066400000000000000000000045351506652756400241150ustar00rootroot00000000000000[KsϯPtJ^Y[vxUŖI䂂HD*|hi ARl"A7 7v3?p<`َt|\Ϯ?}pa"ZqfӐRvg[4;Mq^:F3 }M~uBlm U:,80Y=ȯ ȅ kls,~Bpj2],R70gp] Os>??:9.o;s|Nj|]c-fy[AB!6tH8Sp,'/I@- 5;*Ոh!yR-ȆraHSkU E[&u?F5ke{||㴨47y+c~Eu=1ChSػ罅UL&.ˬ58UL J(E>R$<=2E8AGo3 ҠBOb6LQ^5+1&QnAie:w]/ ,%Dvpp.T9||%fJQށ*3=(Ak[CgԵ88. d%$^`9eYo+b6:~ J'*^v%*yy]G7[ 'wZUv)FP:ݵlzkd+XRTimAhN_TT1fpZ7.uQp|Z$M:e:e螑j5|*>68 83IUT+u1 ۾GShol?Cl[)G;OtQ1o1+Y™=BԵ0Xu-|c] Xu=ֵ0_UuXC'64ޏ;*d5*~]G]ʇx<.y}mHkDj~)N JRl+_w=A1.a\W<3K0*}h/+Pwx8_j/BLZðkqe(fↁ(9e:TQ F` Vֽڻ.yc;GNKUrB&#T\8B9u-/'e {C?^G]kXvE'A ,aXjI W48bb\Z(V'$@=ynߜfL!z78WjcBJƔۀ"|D .ЉhRk׳<%&Z!a0!Zf8D6O~ SN WP%˵d.R, χ<@~#b;Hx{<7hNG`MʸVb'(Glkya rg\WJvօyET]#ʂ(_/ }]i 8(Ѐbm|4ZZ˃|ڸ|ߎ}6g3LF9ORIW8%d)! J.Pz 7*@Z9OBFIgLxR JXD'pI

U)etjt`TLDUL'|Gu-D$YjRt8iGe65ނ pB}8Ȅ(;"u)WԚp2<B%&ByBqK/U!"!kijcҗC}4֧Pr}f;IT\iLҌfL-Wjg҄zuC ]%ٺb4`V!^"2/$27,)˴ w>MnծfbX8nVd\W |e2ye2 AK|U"hym1!:elS] Z/4kN}ܤJ('8EĜJ<(_ p#5>`%8t B)U,P{1Ba8_t2b#t`$ۀ歔#CL4Оl~]OWkPҘS҅!>~J!YjSݵss#s(Ĉ;Q\zjRC-3"$OY}%KhgI,yqWw63PP`EUjJw`+Z>]q 5>njdjdE =%F5^9d/Djd/ aY}STߩr'F5//רFWkT_z]z@CkT+7~b}"W-dXWj+|5WUܩc T67tH =xC4^'Cr <0csdURkL$(uZ:x};8  E3z)#;RU0)K8gRGyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0103-synth_bass_4.xiz000066400000000000000000000043521506652756400241160ustar00rootroot00000000000000[s6_݃+S-{&NFL DB~տ$HH}M4wo?칝=b'ovzzv.&f׃?Urf犯 qg-n.˰Ndi8pga%x`Ss9+.ʌ|' vA)|Aͧx=[_!&܎=r?١4&6hHTj??u ➬֏㕉6|iO (Ɣ4.e/Nx1 I?N#>X->vK,an  (W5L~Ƕy8=8SM5{sf }aYw?R78}/'Rx~gG3u6 ! ?9Aݿ:A4+lrI[ǭ;CPb_ l֔̊8b6IZʊڼ8Mza74&N^/M…C8>BE ɘ6J5REƨvv|pɈ@pFlx[1 N_2^+€%wtQvAKYWNv%٥ Jl7q3)*-KD o}uoO5t#AXb Ufhّ9"CG^; .FOQ!:'n`ѻ)  )41;&"AdE%8˸ذC* I3JsN6T9RC74&W:1UIr*c?(Bƕb%~iq?e bt9 B$.4JG`7Y=/@9* N?JPK#'n$zl^:I*P{Pҿd6qKt`~u{ʣQM =% q&|ϣ9|+m>LWƵG1AJXgoTx_ɝ 󊪺0(k|y0_Pu(oh<<ώ-Ӳ]BiQ?6hԿ* ?24ƏH;FA,Wq&Q;hEjYԤ+\X~v2֔* ').R](g wTjQB$[lFAI/W` /jIof_Ы'׻J|-j)ctjr^r+%6\gٽ-Q񋋜258EL26J(u9]j+נM׼I*'ƥZiTW b617vkފWh!vw0Z2FU^sQ ڹ+f=U\|l"$ JMt---PϬ 4GmX+t#6ƾo:ht Sw^ ĖÛZzw,GS8!)PĕN|MQo!LzްzW-VٝT]?l-t'+ѩ`CS]aPbI:>먪n|ڎ9(){4Ǵ))4;,Ud16ё3TM;.@[ AؗhJ݌ilPyd͒, &*$l&hDq=8LIǣbR!`(^L5 @ߨ~/لZ(V> ZWH-]q^iNCa</ޘI.#KM!0@-m'4N1zߊS{*{Bemy.>6oc6K{'&I7zzշ+5QGy’QV8k'ۉnv[aVn'ۉjND_hvԆ~C4#7tI|zV^x Ԝi|=HJHG4]As1E?ځ&z4 +`WZ´Ɒn"i耄^i(_rjW\ϞpGMarApMKb )=0s v5t-3}GZ-|R_)2cs1yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0104-synth_bass_5.xiz000066400000000000000000000076511506652756400241250ustar00rootroot00000000000000][w6~ϯiiV쵕/ m֍G']{4޶ [ݿk~^LφI'ol۷gY⣴kf'^E.2]k\[uW?|p7Y*4^ß&QZCգf#-fO;Ml>/fWsmkq5=бzOhҷ?*=_)|=V j}NrL'uX̍k&}wSSVm6q V[N>id/;+w]{<_?m Y΍W<[~,N6K,4+bˆkk1YgݭUOыbcy2 ߜ'`Afs+Tnj- _%4p}l U(b_ZN=кVI?:E]]X1LTXI]TXbCd+. ˗.S5j@T3[`ao͔-v*tSBp,$QB7۫x~<*ݸs]6n+]6!S!nG>?9L jِ*"k/P\5+6;,oX/I@^_ a; "lj@ (ɾIʌϢ]W}EOQPE&JB_$$$$$A$A@OMxmF$Ab5&aHX됰!aCZ ko%PJ56dC6d]bME얗XK˵1ኳ\Ú(a &Xm k0k1AXư!FZoyZzڠ{ںaXk7s{ں K3:0uhaXk#X$J_{JAH>0O)Pyu eeCm! FGP ĆC69t :~+#Kfs L Q`@eas;#+#*KY L L L L!LI´B?ScO< N,Ss02a:,S6 bӫmaN6cF2BkJ)03`Q@MK)m Ԍ6 kX>@;yX>6 kX>mְ|@$F kX>BIXzX>6 kװ|@`5,P6 kX>@oT&a TMkX>m_됰!ְ͡|հ|@ma.钰w(IX뒰%aKУT&a TMZ5,P$a IXzXF6 kXNm$I~ Txo_듰5rIXP,=P$A0H~m@$5'% HQl)I~ $A6b! ktAW 6"a20F$u kI&H1Rހ{ AQlS6ů1Rހ G)o{lSTM)o+7`=}7`pHyw)I~ G1Rހ GPxa*&a GP6 k# )oHy%k# )ozHyF0Rހ7`=& v#Z|"6#jv>9ѴU y.-7C~L"JfR8&y%b\k?wE9hڶ$h#c-wQ+uc9eVHtYv̑1q&v&ӡ}L?\9ZfъQ0 yd*BśupLP$r(`KpbI]ݞ> 8#4XD`hvb*e1]NE*عDi' nm K+ӈ A'L21@0~N1da@Wy\FW{Q(w0Kޗ'2{M%Ep1/%U2>O5/Jkg >˩l(5&3=59l-J`UxQ\A{Y\IEe٘܅bB)fW\ ^{7Wyܟ{]aڙ|g>EYxa5/nvK(V:hO>闒PDs sv iru\Qt'=3v9:牏):ǫIaQ=|˳UGuCfxO_)LU|;9p#oէGF렾IuP_`Wx. خ>5E+ιp#^;ZC~IoCA}A}_AS_s'f 7 mgک9S/O.C2ҧ';' GGSxWzdkGf|a4[?SU7:*礲:*ٚf<裰{\> ^{4K/PtFeW2t"2 Ȍh% c%^ttr/ZrR9!waP&] r;ȓ I_I3xNCMk 5J[^S+pz7UjJUzUz%^S+\.mf䡀E9>d I j/rN-?yǿmvw7̶"/ zyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0105-synth_bass_6.xiz000066400000000000000000000051571506652756400241260ustar00rootroot00000000000000\Ys~_)yJj7ӳarq=Y|1޹c۾$$⣌نN?q\Do~(|d$H ɓC _8gx 2|acB zldD&:OoƋ%u%z_\;7|4 1YGtGf(]OI|3VΈ[X_wy3_ .yu*<vLx`Z?@ M'Rt uA[{t] `  a y*m'J~-D*xʼU5-n﯌"]n `Nֺ)$A`?"eN[kt і|mj9E>-fyI 4^/х$Y#(p6{3g󗀝+`, hK`md,9[W >o쎺dVYbdֻ݉B pfk~\|ZgPd@] =R+Y1"YIK+n.gRyokn=n[=KD|JN;vi ','ܙ@$4LRܦ ǐ Kߣ [O6rGEADmTd CGPf%L9ʄWhFxc>a ߋ&Rq8o-lSS0p@&hP2q81(Xԉ?ZyEmӧkJѲ-wlxCpc hZ q@YwƓ6r+@jܘ8'X]3IR?w+>f\tu?4F/(=郱Q\-8s*TD`~u[d=Ot=΢䒏㴎J>z@9G*R:y%*N7]mPz+|m1k:;|pz"Z%|:2J/FrוH#M^)E8 ?'9bUEm%y, ]?YHa>RRDF'r,#fV:t;kOwK1_9+pk-L2{uahBe'EA3yAa~a4P0ݿ[j#:aH&%~zCN*OJT9 R6tk]~T] qo׳q| Nm'd)UwsX.C?W9)I`iZT(P;PB%2BP%1.^#*>RzA1ud 94rx}KM$(.B&TWg3v 8ʗ)rў7h+]MfRDy7@QT\Au#KtEKjh3aNGo '}A"ErT^'LO䉚#zQ$ˏ'bJt`8վ gVACM夐-N5_ |3+z:Afɶw*Xz]np68`ּ2kd]d%kRyQUNd u =Iwۑ%=_ CIсt]ZUpz.v gt{H]8UE6W-w kU-,<9VH΋ՒԳNVa;|UOU$,_ SUשKRUԩOdRYVMJ[e}‹ϖMR]uL}&8Z&cMf$[u6)q&!iu6 ENdMxnMך}ϖLv&;#bCcO/UZu2<=k&;KޖP&k\s9Zt>GH.) l]!yp]h 9ʈFK4Æ'Ɍ:/G7)oM|KV1:= 6n@b o*]OI|9RΈX_Gצu97u2u*@ -'ZSr uA[[Yt>09|PBʀ;*z2%J~-D*xʼU5^\ݞӛt/xos֍ ;VS3!(R&xk|nKgХg;"6]8TX\2- BkFXԽDԇE0tma"*}>zWVO?Tsyvqib > 2a4(8H,DDL=ߦ3˧KJѲ|!KÑ5{' Z-8l,3ڣr%и@5nDvSzkiꚹOҦY[q@pE{F18"$ -{a{fAq[7#ZqTBi/Z^u[=K OVF]QN Wy!;KrȸWQl !/*@+ Kp&<˭9=Vhީ=*PeM~/=u޾u&%}q'6g׋6rꀲǗ.=6>WbV\T~bzi W?C՜|JɷN[|@\ܗ#.X/_Zĝ'gP)sŨRrQ3[cɔRc{S p#F=zx` /B yRXO@Q{"RIa^]E!~QkUdֿ+/Jd+jhydZh EK"qG+&iqz8nNE:"*ivI/SnW&#yV R9H~dx^^Lv,™QP(PKRHHp6+ݚ/RKF<4 =9sH B gRAndbk:t%8tJ1-떃@u_Z{#Vcytu~1cٿ@O{yߕ7=W7of[hf^|g׵Tw *Fu"ZҊyBW\u=E+R 0Ux5IiZ}l,JɺݛYݚL;(o594zLv &Cb;shOUZN&P^P&ac1Zt>F|=_"W4Iln -\=*<0c}A"* k*jpŦ%rRƨ|R~CRb_I6MZyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0107-synth_bass_8.xiz000066400000000000000000000053341506652756400241270ustar00rootroot00000000000000]KsϯPtJ^Gid*-9ɅETX A`%CvfFt70|9]}[{۾f:Ȅ?eζ~𩭶#_G -"5֕o჻u2~Fѣv+#b=_{mt-/'r37-:ړpEF:6HlnbwvonJ=_J|5Έ;X_'7q5\+&ʸ5k|@0*2ȻF64vN`^`*zX\ ` G%TDߓћNZd!yO|q+N Yc'%(RvGm6~@<9Zo~uzq-` wN>~:kwS.wAɀ`e6\ք 0\mZ۠O"ӌPĘ˖kjw̻$&o8xpgzwg1>o1*:mD>gJT%\y@Q1n-V"YI8W\^]W߀3Aޙm/LwdJõlLx`pLߑzt6F{> *0_ױ=Ij>V{Xa=/wS7/t,˫HI&ҍq⥟拊)(e>mW8JCybk4Rq,3r"a&?rb6MMd['1aI]y/ ?HXupG|qНuɧ [EGm/8b֔ yQ_W3IЅk|^4_1[fI$*$Rk=mf h)D>^{D=CkRI4',B!ob*e^OAh!BaETyk;V!_ESG.0e@ .wBC l75R\ 80Ǧgɱ<L"-[r YF R;HF XqʗnQ m˛BswkNk@IH촢ČMP1HZ`)) ev=( 9$HY%HY%1S5D<^}>TGEJt`UՀ3pq 預-R՚z_U+ <+N%@90 BAnDbcaUc.rAKv)Ŵ ᾊ\|} r1 ߓ@5 ܛw2Ejs|J0#2NV]EU>p玜H|TGgĪ*ҔB)_Z>1O'ߩT%Z.`YKMJ#В(}PP:'28ol@Zfvdo)a2V#35<杚wu/eL)1m+z[ 艬Od]'=Jc=:Ɯc=~=apDS^ד-RyET^&£}6ӧ+rw}dODa)+ ~~6_s-vjruǿǫ/fGwdx=וM# +]^p4_z"G[yFC6VDu45?|­wr~e. Ƙ@ȉĎŗtn&h5|.ݳ.<і!Ab둅F S/~PqcT~-M8Z̕X[g2 ;CSeBb['b, FAg.h"6fI{t[SP?x" d@]=Tϱ!23-lZ<=Ufn Μ)ۺ)度aHn>R2eoOѾtp}v <ׇơ[\aD! }VB{N<(9p~z)׀؀;޳&dVJnm?LsBU2] Ǿmy⎹tEnǑC8%_ٱб81]2dM"O ̍5\eI)vlyd\ʨ4zx* 苅7>u@k{{}sh[ PhNP l9g9ёӤQ##:km s% 0r$ Np,0)# z"1s- X$'t!yؗ5#nMa1} |`;: ANO@:}jIvGܝ2a .-n9мP+"Y_2-ev=c|݆G\"% ;:\TvLm91u[.Һx\WC3za'!QhqZ :7{w1zÑY;89GH .tp "VWZnr#J!OΉbξPN W )kk}:S F*RG|Iz0d_mE+ڸApgy4)Q"Wmos p_;9ʣYHT3 +1AiQWyChAWAy jQ:yWAc 2)#w'GO8*|26J—r/] IX4b^pUt(YO_ zMJ=fg݂n3. j}*?H8xMDg8fB|օU}t$PNKs뱾fWߘFs$].F~j]tDRLHKDyu^N|_A8Yꍸ0h6tʝbl!}>[ pA0d?E5swoQ/ }Yn|*"GHu@HcqPLjOW;Bs&]G(:ur̋Ntard/{%,Z{|#S*F6CsB烂%*-U#Z7g:>NA播뢓]rAsNz*) #*| [gG-f|dԁ`aD{($$ٰ挴ej٥xpŸK̞}c"vEۄ2kJL6N*xM/ A*Ŵ| xFM4sЭ7~-?_F6.b Ѽs,31b#~Vgg?HU˦t^ L\}\ D62'w^<Ĥ2Du__@8/0|T*)Ԥ##oil<T;r8vN]$=֩0C+ D͐lJyؿry4̣oyo5[YחFO y)yL:'F|INZ~Vu-Ǻc]w뱮XzS=7:)5;ƣicD$<'-#>9^}HxJӖ޹E^Vbd z)L+8)G- d0yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0109-synth_bass_10.xiz000066400000000000000000000055551506652756400242070ustar00rootroot00000000000000r8=_UH6G)2UZ[f_X4 YHco6HQ8aݍ~qi<Ϸ]}Syn6cܿo.go|1Y~{rƖuM{fJѝm\}d_l~QoAFFcaƃm8+#4|vR~y҃f#b3f_MXl>]\_ogxn%s z VllBDfon?IW |5N[>o4j|=ԖM[j zlS3qL%  0pp Nv/)#2>/Y'.'xHk w L<_t D#n|yu1[ޞjwʄI$pdtp,w pa"'@_m+Xg`}2rqM;xҁ>(pI%|T8\-AovfC\XĹ疨Hw``s+Avqniv6ئnP_pS"YcmvҰٰG@@`&ܽLbgok͚+0q^VR|%sj< tv"u+:<5 O)X8{+?;9C=dbꇙJ},w$ܩsLimԮ: FЊ]"eߖx]; #j%#x=.QBD\(xCb>O$|2Kc~]&Aނ8bб}H_!Ì@e>@NX"x*G><#X@Aj mnCѪ@%d1^#ƕD=46SL]4;cif ]ăHv 8q/pK軧dJ0{^V[LfEy俈(2eK<:% CXh'Ueh9N6ɸ.B0}!+B@tm|51}ȃGhyx1sd léP])HP&,'ٚ=|Xf,I:ci=sf`;+$M/T=lD݈2ǰ]`A$Ű4_}JKVpA654G)r1MhaDߑy$9,\Ryb?l"Vf]IUpJY$IUުK(tdVqJ.-`PɪS!dA]ՋJ#MZ'Qb#?2 S9hlG;%_> CÁFt=( $;aGvr+voU5uxnWzZȅ[USJC`pi˲mD/ nEN*hr欦Zg9gB_wlq&U]Wb_vU"{vURW&hjoRߝʛ7D6o'KUY9&bEo2 ?ޤ9:Y{|7 &OIx+J:MXNM&ח}rgs&JG Rd1GNEidL_羞C#>#5B,NMaۺ|e: "6WrBp=\ 'pѳlCsYlFcs-\jMsNM|% 3UosxW]|g﨡6lWyv$*G:A)i^^Bx0aPPN,#O9 9%R t#l.l}G &yMh442?l7=soOvg;Mq9>jngσ;E̦!ϊ2vg[ߴ{mq~2}akD7 zneDbI2yLdzp9M6-nM{x{DAbVS/PacwT~.L0ͥ9_$S2n :CQBW'$Nȶ18nіa!A̒~D~UBʀuԶ%= 2`UMޜ.``̩b^?%\W4a|$Eڟz]{Zsüv{n!/ wy7rOc.e(M KO6:3psz<]c؜ XSİm(iF B&K7.Â16:윪<Q(\qWvȕ,/D`E kГ)5d WY60dRJ2]^fN3". &R{p|5Zd . S&D6[&>0-;s7̆ 8$f8$8xDB}i%?hCoa}W( pv. $}sG摨:G%(_ Zg<@<Ђ5i^@hR<kۮyRO{;Ahg5 ?BJr])!J8Sp,'ϯH@3JS#8RA1d)0Q#k(S3m2,?/FMFߗ)FBz$l:4b2\c~MFfoI 8gE:(OxI^6"r)Y4 E9J`ͤt)-T_(SF\K(}*/ť"L>N_B#[z(YFSqQk åJ;j%9iJ:cTQًnl1)`^ҧ#!S1"2D2!5MAbKц*ܑɩ>Ou8NڬA"wSr*e*e螑*| >-|dUՂ3`PaD($$;i戴Ej٤xPaOHydΜl}cƒt턵lJL֎T%<Ԧ+Ibpiy_}jk6pA7F^e8M'#~!=w]EPqգy'Xd/g~V_Q!5nJƠ\rqq;sYclrA!itW58VOird=S##S9DyCB)8/6U BjΉT]:Ґ*I<^+)):T͉WS 8N hr]5˛\GFò &XPu)Irjr&#s&OE8-6Q}~k굷4Q}-&oFGo@ի¦Qbj:[&;QtէHwF[w{_m¥XU~}_~XKΉFSsG{;f&)W>%{%Z6yB!Z[u-Ǻc}U뱾~?S 'v~;$xG4%7IֈEH-PMh 29g)K$%Vp|Hv&MHyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0111-synth_bass_12.xiz000066400000000000000000000043501506652756400241720ustar00rootroot00000000000000[s8!K $$Ub.}Q [$-[[68mfggaMbt~\Ϯڟ?}hnzHV_\S]S.lK ›v-x>oPh?S95sbzɦK={[,'nWv(n[9\kF'l~?\NfS׎dO=~LcIEVS/4Pahwm8\a8K{Ȗ{\6&6i]*_x1FdBQ&[惶j٢CLQ蛖~@" {@==uLsE t?ӥn,)QDNFQ&=nk Bdaz op9+?jR(Ƈ+w)ClV}/ѹw'@Zץ4uu!` /da% o?dȸA')wٳMxʣzRT[D<VŞae.ZyGa4L"NU؎{}7{Cf*{c &%SObm>%WD:撐m$DblXK !qe ub"L U}U.xz}kte-iFPf|qz86ђ#.ǻ4\ID5\/BFLJe:zV0(^%ւ1=ě۬ztnʼnOܧ"+5uنHu Nǐ'U #|ΔZf=|/U ėʺF h1RDך^{ R& wnEgG[5ysFY+NFyygy6<0:oRLjJ.Eo Ws?7 ·?/LA'wH崜ࠫD"A?Z5 ǡ1{ šT PѲ> r?=R'Ⴂ C|mj?H%ud'8:7oW5 o\5@1w5:Z:b6Rn6YuB/L.zKzjz W\agt9v0>v9\.Sv [gb1yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0112-vintage_bass.xiz000066400000000000000000000052451506652756400241650ustar00rootroot00000000000000\r}`lU<2%ٲSTV[rly+DBw(REcקA@H~ Ӎn|jiNPC҉4׏j8ZǞjOok(Ծco?p 3ɱItp^veu@EUݬE{fD{.YsZӅ#:?~(KYSɪkF`HQ4F,Ի$p@(>*2-'ҒH .y۪@IRd\NNiܖˎ 5 ac|;~-4="* BT<@FWXc g}y/*&6<8mx)6<%mxPmI. b[Sˢf[)lsjAp$'!GOїnc$HuڔZvM)6֦6&~eB̽kfQA}P/ l[(O뎊C[(Q*l m-By~}BY |;G>.WKJsLe&#AL"~ vk1ŗMlt- *.0H-|kv5] zM_YN| XoG +R%š Wq/IQ!$agA>6#ߵ·+RuϧzSGepSUMB/GqB/GP]duz*uU}(<\ʪs 9ԸK&]Rָ qׄLUyɦD; {ڊ\}~ V+6EmU{r,k^S' 86jU᫴fC7*\аǦV7*\]lpaACŦV4꠩UnC{J'/_eXyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0114-80s_rhodes.xiz000066400000000000000000000046351506652756400235020ustar00rootroot00000000000000]w}/OCL=C4\ =w#l56Ȗ-ɒ Nv>]3K׮%Au|iij|[ewu;~m'60V;Ym/GZE8V6&Vwp嬝 O#ad`HZFw̿;- t4Nh2?mp^V6y !buG–Vg?i=_ ס΀2Y?gПtnh\gvlcD'BND!ڐ9^xe.E,~ѠmLEg*F|x?ϙ?pnPf*NoC;j[ccvN_]cxCv?>E$p8i6_S·## uw|!FrB{? k݆pyLtܲ%!c eDSY=5N%`K5f2!h4}P,#F2D^ǑC 8C_Ns|ѐ{QԐx6|˜va*h7*=%x#4<x`StVԑl}|A{=ɝs gkpG^Ke2*;W,x`Bq9[< qI^5"ޓ@a \;@YilMKOt&3D&־X(e'!z x#2?:< T[͔mA 2SBaB`2v('@*( .!WѲu<9l!8KU w"[+E9]9LBso>~Wjbω1D^.N{aӫiy*NQzhxy>vEPTWPjQo "Yb ]H׉b 1D4ŕG8H-ߋ ܝZqS 8q8q0\>$=nRbwY.fQ N)I\RH'}(TJBtVL|z)=6Z⟴bٕy~j^:mgpdHrD%h89C!rUF5hKUZG;?i:HغS%:,f2d2d_pʜL:Z] aGdQHy J!E[<"tJKB ]H<=sTYPn~\ ªx9%:t(59xevf|nsȆ`d< i=K^dKzo0rS;s{[gC)m@ӗ uT|R*ލt %(F3Z`NLWh#.VbiVV-4+^P)1p݊)O*/[,n&WXT'nyDozm7Q}D[ZW< kVY9Q}&O߂+eV7Q=XMS4X(Kz?M;՟V/5.*#Kr+~.[2\ ٕMyV3 F # =%4F4>~ՌBa֫i1;m1Uu˳UvnZs7X:&Id@Sc4 _ QAjCjg=ԵtZz]u-5C}varg |C{4 7H MWF ‡p8UG;^\Ieu: R4갹KOp\uXނuc/B I_6]@~=e-g |oJٝowy~؉5Oo &N끄wYJ4GP?hDڭ#At<XioolЧHL!nu0qC딸#eЍ|x/":qGm4 X"v +~73lpGVi7C'諆~D~U@ȀUIJb%\d 0`UM^.``̉bZ?yעNQ&^W?xz"o==zs@= }]p^twL~@48i6D k{8h錍_&l֜53L4c0eFfz﯉@[`ؐ4%1&Ke[7.󼜯Q*/S5cwa Nvo%Чe>V(L(%cu8=pCB@Gdx[%=x͗=8tɝ[# 8/m30q8'uM;8r*-~ @ i=<17u [Pe f沏-vo:i7<7܋HOf:vGMyxf)14Fヒm  t"LjRs-eCa88phX|cc931#qs+A z+v{_F]ɯ\׻ѕߐ$90҈kf^OҎ*y]Yq}1_ B(I33FOk|_-qSi+8BoDseuۮ]C Ov}Lע[~*RL Sy,*H@VڍLh2\ϣ>}-J-KW5vK<9Jky\A휉 pI_=ȣY䑨 ' b|z0_H1W񚢟S\)Ƴ\@5S JX/smpZQ|ܽ NA4O8)pJʳI<$OWrHYOt2EgRE+:i iΓIc1^XDڧ<[xܨ gLʿzǢZ;+-LI[@Xl,64'tϊG؉H2\_̦HˬR!u6m8cPW?q (;p^xn6V 7?+GcqT@ mP0B^3EI(8KهL6>>6G4]%YFȐiL06)TQ`$_p(MW=D=+ɝf0>Έ G;Eb~uDF?Jbۖ @])]eD~^7Y=xMէﶒT j? VNWB9~X] %_ˢ̛*C\{eUKnͳ&_YSJh{ͻ&ڮ)_;-E"P9,+jpe/lt5zħ7)7<~JOAY^Ⱥ *(}c]v뱮eXײzxc=oՈ7tH =R{C^'[Hr_?"4>Z`*Gܤ (wY-ed^ȾߑXV.?\&Jyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0116-rhodes_2.xiz000066400000000000000000000051461506652756400232310ustar00rootroot00000000000000r6}BG$_9J#Ulk˩̾ Hm p}>Jst&tN $f̾3@l~ysw=^nu7nه;>b NC?|n};vuO~Jnwbzwϝ/dk[6OPPidDJ_d0B0'H\d؆Q_hс:L!YJ,cb#;/ H:N6Bv+ˍ >'_w1gLƜ$E Є8 xX3w(iR|+!| #NOFǧÑdwr&* (=Gg#RuF^,/WcHksohUl<sdh3#/1 [#_k R,E>|JP(V&񜊇cҀ=^IQ3k͏px4YƅF(biƉ!iFΫr,ZL8ؗJkxlEEE#O><Ս;TFEQ,ɗ6 JSDrm"d*f>O4ɣ|2+ic~MotC·Хc9] m <8R^zX! 5rӅ6dPzQB>[#OS:>vv!$xI#G/q}-=j[ $\(<t83Y)TQ`QB $M50{^U̮o0KncEBhwyd^x. /UX `G"W4On,ex8.6 dyu"`W!U!(|Ok1d0!%<rŖ J ψvQH0&/ ' j"ͽy.sf`;iPpoaT4F&+j]`A,Ű$V95Z<Olo6#)f%WQԔ[ּb=^ԨAGZݳ+ i;QyWr TN2 " +qX\1A*'#[EO4ݜ(KS;Ћy.էz+oOᅆ֫%Q@գ^}z%(5Uz7|OWkK.|9⣌NF?q=l|9q@OphWytOvuW?|p7IF4\ï#a551A'p6N`}yΆ6΋8$KYtG†Էwg jW_U3,ֲ7Kkfܦf2n'{.]E RFd[خFA!hkp Vd!T9_Bd@m\J~]&8cĪLog7wtƖybZ7>{[rvS3%)Ҧk|6Zz0(2-r%">B{,7TaP vM ]8TJP}D a9.ݖeer`0QY?C '<0("p%DL3BY{2.5wyhQ;.X.Ze'&Ir56'FxK;cd*`}u: y u@=b2;/9=4[[g{#Q㭨 &G5ٺBԆ.uqD(MZv\$|Bu"lq"V~ K; ke21o4&zr͌?hAaEaiY-)Fq-S5nHEFtBgX]37IT?H+>^&@"=JǮ1H~jdžnVqԫDfP! "\mmiG++XQ]QN W Is$k9_EEcX^}QI2n~$/ř@7ֿkY$Q >@n;AH%Z#^s՝<ڝUN^/ڐɫ#_tLL|gQrqtS}|cԱN^Jp n[UsN+hl[- G|pE5Kxr2_m+g<5JRpL@`O*8*h)C%ji(l+}^( OC ; 7^hȈh$`)  q0/Y3W>[W1_/-:j|HW7z ̎j;oe&2;Ҕ g2$'EA3y4~&&C-tn̶32CKh)OwK<t4=ZU!(s" e lƺ#EX{☟&#*oIA4:P+/s^;܂ eg|+"G?"^,%&Bޅ*1I"*!ߎqWQZmc(~F!>E.\^RӬ66)L+%i)NIdhlnG )"̋@QhNWyUdj*/Jd+jhydZ 뤑U )A_Yqz8[N;ǍmkH\8!e}ʔ$<;|prz"^}Fс%T&BB\&2k}Z4rʹ湧])3'߉`AumP^A/q6r%8tJ1+qM5F5G5j:3ٿ@gM;ڛ73Ea4?v-vU]8誊Q3۪)^bfIO]?أb niӤ4-YҾTp(5paB)wNMhmG;l|ŮC]8IH:9;pir-c;H]85U54*WonfuւI 'n$ SzXEjIY0WE@:[MUn)frwIUq^/IUTMUl2,oMfMF6م h,5UlAEl2+?٤gg=ҺYga7>lBYgYdPJM֍:uk590-l&t1G50*:T~N1 Zɭ'nKȏΦ᝗ lx9Û/SUϟl|upxFr}QLUd}~QQQ?us:XÇ*Gxᒒ -RC^pьDW))twu"S6ϗ>a'%c& t_|6p2VuY9pUUˠ3(e0Qk3 )eP@LO qMCibнV%_nʡO6M^AH I.zkK xu?Pyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0118-musicbox.xiz000066400000000000000000000040421506652756400233510ustar00rootroot00000000000000-`\]wϯphYcBd]NHFGcK^K΄16a6\dKd^xFÔ|lY߷[".0Y~l=WO7gt7}~tI|sr(2uF[v+o$iiΊB0櫤y 3x:L xˉbܸ[FڍF4"nG?GS#07 }wք@̐'f Xk>@?U3Y3s&TVQ_@= Dg;Mn s0`xbl̈́@r c\Bppo ;*i>*֍ݶm |%qyhQbaӘ}wܩ Y3kJ NЇkŌ%dy rurYJ-^5Gn"ᬤ=zme8'07-`[pxYi,O g΃dPY "pRܲZ5|AkiUXvor0uPJQhT*DF*ʲL}1ӝ൴<//k h y =J/DՐ٬O]@I BR ]T)NVKRL LM/$E~Zz^BxKz+ t9z^:ۺ)IbkpUlAAi2ydtX`=$mjK 4f,a }}0qn?W}䦹Lu){HY_}\Xzo͓ 4UURoŸ'>Y JOJ7Խ.;V^}viRԧ]J'>Z}YQ{[%'B [@ 1%rj%wJ%z:PԲp݀Gr' H ,/0[cxT!~e(T{J,9yp\tg:G ߿i-<:TTUJ1oFY9PILDK?y9B5B54c\bEtլ7‰_TEa r0 v.3(s6s*S}T|=NQq}b8WoT[uA=U iaFZo+^sy4g0pngSUc>sDn #d7BKN6P3jCTFS-gU]u5rWr:kpY?X:S`iaK7UQd*"41?DV+nIM)*ê"g,i5$}Gyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0119-jazz_guitar.xiz000066400000000000000000000041631506652756400240560ustar00rootroot00000000000000[Ks6W:W='T-ܩ{@$d1|(V~}| @Jti:Z^,o?,vѷ'AhyU[nL}j߯g޼z1Y?魿4Wfי# +՝9\{mr~ ?ю~ὅ/Yu m$ZlQ /m0t6.l1q6g\쐫:<!1bl@v#K?(]O)|7V΅;Y+ݍ[}/Wԙ~BeZ>E`Xf6,?["'0 ba!Al諦~@$~Q! ɟiN{A7"3v` kzp[蒝 }hW %.DeOlϰ@q=ykr9nX,2JkI+W42 ;8k(u'v!z _,t9!0e@=,cLZ bO>!( 6!hթk[.S&ppd)pLvќ BJ q^K|}mr7& AP2K) }0cpҔS]FSvdo όb4F}\2uػL~dO{Z4( w<`)csCI/-m+3D;95_1YIlq*8" ύ wU ߑ#|)θBn=]CUm(v3]hBJҶ^+s|_:;`8K%SU4(+Xb?I[+4֓RkH~0,/|ڽO{$_Fg7PJbrZCe 4Sp G/ ytY  tR-d9\E:ͨ1( Q*$"m!a麜?l)|^|{QE #w19z/qbDTdDž("ڠ )Wx>Qʕˢus1Ko]+FCh}e1N ]P6`MD8X5VJpJy j[RyI֎\Rb*$TSTގBEVyx j+T~V&\7?0yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0120-heavy_metal_guitar.xiz000066400000000000000000000044301506652756400253630ustar00rootroot00000000000000[Ys6~_(jRlj-y%9/(,fx(<4V~}$HHTyf vAɉe۱Z.;Oz8D p;>6:%Aj&HnRPacd~L0YN͵\e[3=A__ B꡷ɞ9&$p9 YG-u? ܼqOC2Ko75~Qmmcxͷ׸8% Xpq|Kfʂڼ8657.465(FA<8}%BbmBX1peFB/J, "PyTOJlߒ(n5" a]0-Y馕'ly^; /BOaEE0qTlS?8rSBi"P2v(§D . B($.wѪ:> s<)vߎK yŀ k<^2K-]ܞ`g\̫j8B;$8/(-Gǃ%؊<*?ct51 nC4AW0FhhU6@R>T#'ڔƌ%PC&Ph,?4T=7{OR̙ERy8]}47_Fĉσq0"D<{/(ٸ/PJb!"P@Uس%>]qד(5F+Ikf.и:./@i7/ S٢ r1T,WdM)A )kP]J7 DJq 'WjUo:*Qbg85(5fMtJS5:~>UPU4!c[GOb `~QYo{4[$YdQ~QJ WlU:LS)ǑEc˱LX*xDVDЫG-LdZ&.+.WnguO6'hz8nT_眅Ӝ^W>4S WKG'!̑OS8 /AC)BZbM^OH[wik )OYo.ǭnr(LNՕ/qQTҢ,ٕ1P4ss6 &~, N]W(|lѼs,3&jXc}IG/̼P5@/?'~7;}beVp*gIWq ¹%:+,Q=˗g jcur"$ N/(0~o E6F@?j um>45N:FNziŻDT]]V9$\Ng͢z_[~fy̫dsnzQ/|#~\~Ӡ|rthK%jX7f`3֍Fیu#nƺ7cI85c}zat렶hb@+1 _>gөyO.3"җjF S26Y~ IYM*vPEڣo>zbRg$WJ/h9aq\3sI{:= [ԇ>ѧ {PjS|#ʃ }w2],͎šgk~aJXD;i鎃ցYjuVp VöZp;Qm:la[juVZꨭVGm:jXI䟼U0uOMn~K?uiYVo駮3hշS$=Qz$Z]O5?fJ:yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0121-percussive.xiz000066400000000000000000000024541506652756400237070ustar00rootroot00000000000000Y[w8~ϯ`y>I\gK}ٳX-H^n_ HXm8/i"oѫۧ006$k~{byܧڜzoai}óqrlDV7 K7?DZCjX3w2'R"Xa5I|?*eZ9? G!gC!~DiLk yLa.mn<%Uˈoy4VqyM> kF~ަ6ۭnr%w2f:}6]U-Lhzf3\m97)#,7Fx%KCAҊG2xC8EXB5k\rGcWeDHˍi ! h gTikG$KWjҖ<@@25MsX@6Pp1 "_&]v,(diܤu6jeMswxu n{.~/@9iC$_.$N…}%8YjH~Ab ^˞#ƾoήJKK|4YU BPU].mKw38-cBY\ͣ$׫ uA0h7vM+bu=M,}$?yI3- Sk5RJ4q[uZͳ~kPF5N&BŸ%ւbTn KZ|ŨBx߂rўJ >A-cyj+n$O`w) nͲ(?E*Ϫ8|qz"]c!Fu,=Ge/BQĐ $I&t7Fȏwց㹗mnE\˳?/W;;h5יC ?J;H3V}vZ^ǗW>P\`8 N5JQ"QޟxbO tbJ(]5t~#+ˊ]{H핓,[':a"p_]lKt_&", 88 NKLx ׳{bI΍ ,A9JXgosh9 :+w䕥@^O`|y* z;B01T`nGc| t ZOq5 +H۟uP 9A>g4ͯ!Ry@46I< O,!LtfpJhܜ'!!)Pck-UaxoUgI 7Jᬓ ߘպ1_9* rXӢiseBҸr"A'6Q&"U$%c)_bjGeVy~Oނ$rD@!puY]̌*xQ/)t8'$Y8 y:Vur06Ӆ$ CF<$Y6]KcBv}4Z;Syf+%\%T0**pJN *eԫڔ ̞7vtf9~* )!L+n V OeZ( E[\gtA'guLrk=>Y0꫗)OWA`#eɜFNYPfХ S>t@KR>:HUZ5zJq^,Pa:kh*Jb> c`ˀ WtDg@[Z}UOV+J_.t yYBTIkUFj0Q%Dq]8P J>j`!!Xʊ*1(QL"IG'mYr{8qC'_ڭx<= گ/uO}֗\ƭoƭ5[߸[ge]Hu 8SʵSm{JXG1eŚtF*ġiFTu-j4y]MIzӪ)15%&V+TSbJTlJLjݬ)11lJLq)1X'y EӮwCzha_%Jf%Ւ؇>>K;_vVUX}^†9+G T_8t 2H-7t-ݭ7t-7t-7ys7 =5޲7G xC4$WIM4s63KtT/jpz}L_Sik;UR0E)ncRNyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0123-synth_reed.xiz000066400000000000000000000037241506652756400236660ustar00rootroot00000000000000-`[[s8~_416t1١6,yQ [Mےǖa~&Y\z: H9::7;??A S QO݇ǿ̯W_;2ė P,S#d#l `c Cҹi&[ 45 8g픠jŊ\{N ;M拻j:oҠC`8dG 0H%ݎhЄjclb2^~߹+w̹B BcXRqϫeWf(L@bI4D Kv 'hA@L qE Auxޞ(RU5-W;w*5ClݫkʧWN_Ng8̛4BOw Ř?o0uҽ^.BU|w Ķm[$'ԯi4y1M ->sCLK,ܻEU.u 7dՉ\”郰|E;p3jBD|}2[ȂcvziMO4Vʾ#H@D:hCӐ'bPr}*q͙nDݒ(f;UrB4aRnsԽnઌL_8;Pt_9ǀO}s`~)kB!*b2: G`A?sJz 3cFc)2w̩!rU P# T{l)l 2(-%לisPBlZjIwv-Vͅ}Ga @jԒv5t#%} , Ps%AihNP9A&(u%?i\>ۣp&?nzP?ӛ姦ED4OEi5a C46hM2"%)zN#G= Ue>c X $f fH,bCKaR<)qPJģDQ"`ќ..|6]k"ن4ͧh)%8$/lCUFI7\w*Q''!cx$g1ɚ nzn+bJĹBeQj;S ghfxZnqRz`* Eϗ[ [5lBx 93+oRe:mX~z(9/JP*cr{FSo+aR8ٕ Ё](ӎ˨@B@+ihOgy0}rGABҧs(~VL{! C~"j_*}=x+Yzĝ>x~pZ(oBwA5pr?Z.ˤ@rqYTdcä](I1o_}o^[xծ:-f7:fgqت#|:ב^Bn@>֙" qVIt4'iOX仧>ɯOc}ϟX_kKyc<;F!iAL6Ľ^-uu6.#g[Q٨ RC:Db(.tU}s t703 醗M:KdKcP%ɴWiuQzTo>z}MjpǴި1]3Fv pg& RKy4%1yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0124-brass.xiz000066400000000000000000000065221506652756400226340ustar00rootroot00000000000000][sH~ϯ`yπ*RC ^C}Q lM@b%.tQKvSL|ͧߟʓzc_VՊi/e?\V,{?lv;V?Wo%?}:eQ_,}iU?>O oiTfKx rk7ZB ȵMϯ ݯVB×f:gw7d6 WwM6e?z/=s#66{bzJ "JYO5úGm3ZaƳV|X4HsV(u73]ݲ=oMVKY{nREu⽔P&UXE~r%ۈhQ5T|qf4]D y0G 59*ZbЈ K dn䞺(T[c%sGʴ-a:0[4]iꌺ"E$pm-p9YywBD?~]nGX֮ij̓i?X22&xȆe >( &HwitܘE4kn, pfa__qG0ɳHuϕСX:ܯ;^PlH$jVK 9kK:pW\@D7KfKDiXN"FsiZ% Y_r9eݣ(bܹ%IycX^9)4k̍qL=d-hskAw[ L a__F4ȼ2-2ٻc'Jm ]{-)`3R>77;Sf 24L)yoSVX"KV^#i9/`)ȷ/NS3v=򄑯6:b#•[V_V>`:O \f⓸\^W8E=x2 U@%`{@7Z`j4A Me}X~/`%M-8grxȴg|Q!&}ft2:g9:|01^D" Q|>O_'"ax݉H@n4M%CAu6s)7@{ RY2s:xuo`/n7W 8*dA9!6 4m 4Q[`Hk Pu[Ø8nfɀ - ®<H[ښ+T mf\aO9X+xrcayK!ky}#SH);νK BPHhX>  !?%HRtsF;)P `7)DJHGXa38yv$60¤DKr׋ōdzQ@^WU/6pTʓ֋w&Adx5jW@ZS›|EZ^aȒW5Z5&U@Qy$B꼿97L: +dIg..JvSI 9'5H +1N΂PU..E8IB*tAQWſ9JҎe*I]=P$j%;(5~#J ,6,/ pRpϋ `BB2sJL4HEpl._\2$흳Z~]ϛucܛc`َt|Ϯ?{d0`6ܻ}۞Eg6 ))wyM_6L4 WmL6hn+geD5]]a/ɊMPt4Nh2mOntn`+:{4-L={ICzZ⇾NtFR?3Cڿ7t,긡dO!(*i\J8!d|AG悵*ق}L-̒`~@"*!Ou@:zjۉwcHOF|xoq`0`[/T ֚:m}4k瘼l{nǐ?᮱;/fynA Y땎46uķ.sl<[3'|/T- @Rf"d47}ls+8sbs5́v I|fbHFWb\C)~5Retox rvY Qn4- ;o ޞ3^}oKpK>umoea#D_;\dȧA &(PPٱg9កɃjRT8[j:xkO%t#BXhIE{Ƌi1u+o<ױHbNpyh+"UG9ݼ<>cz7ၹ;@ãS1N#0%6!|gkFѲTv\pHðOlx!L~n$?@oe.v:mS<׹@uURhi=qG8֒--.ǻ8] D S.|Fӊe:v?vno PΣJ$#1C]ɀȓ[/=ytv턑SA-vm"!ɡ HDdݠ|$/A)SGs Jɸ?hGe>y~=\D!؍#Z#HNÍGУRmlm!fHɍ噔|,|+%fRwށjo3nH=J1sTbjF>Swsrm<>;÷xf9H4|ԖmBpgHS@ɕ8^4CREOMn2j4o1oӁԂz|A2>ph# 0T0WWOsvG'z|1IΑً9JYJYc$XQe 7S$?pf(q LhwPatZtEj`L+Xy`͜l}a‡rë2,?pQnC`񉰃LiIsltc o?t{cm,Wl.z6]bE0H&V F"D =LQ ! 2v-akT#V5H==TXTly[lZ/}A3P]>Y#|h/T>u;z jS]N=>8?yχ;ЫQO+?Ps7ek5ick+\m?~q{,i-q[L -K&$_3*(Νڌ|S2+p L3Bڸ׈M!Bv8졍rLzs o o_t,@ʖb6#_8f ]:4,s Tl86Ҿ3>wپ d!3Ďv9ٍ[$: 򰞔*ٿaT@سv&VEDM v+eLZ%PTp&S{Ql9\7n` 0V) ŲƤPi B&Im¶`hqP)ȴY(m"^/~Y9#\r''ޯ  T2h+% :ߌ/sps0#JMw3"0u{Ӯ~=eP7j&NT4oAI;K w(Vi@M7C \F;v gY{D1wsw%(ԜjTxPKߏ|*q{ܩn䪖%JI^ lJόJ:XT%-UP`*ԯ(cuJ |R?ǧPΤcOB62|*k]DUTLe;sA EjPpHY8RDďM9Il%7(@7U4Q2!F|,`; SʫEpEYHqW%3_BDĖ^XP's".b>` *1-fcy%>l ĻTr7KLu}%A\(ZQI&[h!NL֍:J2.7;9ηI,ِ&\둯lWX,_-Iؗ.ƪ<7<]%2[A62*nnZny7@Zw@=" %[`( =N. CH zbvG͢3bxg y kbWrYؖV֮hh94k̝p$F1@vD>7z~k[T.ch!\&'SW`M>Dm搐mD18aĖ#g>/ԎI:#Az% ޠ~zS4F|JJT&:zR^1e84үՐ]-.5 N'BF =>_?'9~9ap FaL XΘfG{+<7N3yJfH_\mkt E25ؾC6IAG2I |rg%O0ӹyi1RDۚ^{ %}C@i:GSѼ>a|%ɟze]Myly%5˷`vRWJO/̳sxɟ2Gn?z)*'OLBJk(1|5-'Е.Dyv2IT2.J^%i\EJ iΣTA Cjm*?H-UDG±κ󳿐7?1b|{Q 4(GPw^<Ř̿|jVFv#R@VP9&l4kGeu~OVoM8FЏܿ2y)Py%Qu5lZ]Es'w8X"T$4ӵ.P}iB*.]OSz>$PK㝛r#|=|ٮ(oeV۽bMEfR`f4+^ 8Is. FJuZI>-.;rQNbCy]Pu: >~MzcA";A^8d-BfUɦM3|OD-lnkbxqB!yϖ )`W#E! Awf͞V!ͳ<.e=cb̚"_xŰR Q uhBOr)%YȡG{nt:B/l:فwˮhj:z6yF--vo[T{s҅#>J!YiSCݵCF0Q#D}]/ TJ<*TF'og]bDV }55^pi9iqwjf]"/VޞM~ nA}mߦ~mרw|V,G,[7Q=GZaIt+3 Lg;ӭt+\3 L v/44*[0`i;icHoS`M&xSoQT2!(=+3.zR sRW]~{~\rO]z4穕V^fRWFwX]HW0nV-IhB_]x{T\S91\Q P}S6n;x9PA~b_x:6Gyi2~(^ X|si:qhHtLgǷ4yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0129-falling_stars.xiz000066400000000000000000000052101506652756400243500ustar00rootroot00000000000000\Ys6~_#(jmkkR H-_ $([N)C2C55v#B>4lq/Ű^OV_ofq E~+~ʺءCl/GF(% mԸ#"qmW?|pwEF4OaԘ-L=j62|ļَN&XίoƫGmC;9NÃ=Xq5f%S}|%XuFy|7nƷjv{MCOu\ >E01:I~s#ˍ.8\/x=XiB# o6誆NA=PCN wTqR&?MA'N;oɬZ,V_f7 MCdA-|VJQ$Ml ٘o(4C{^>E8p8׻\6;lG6?rLa`(7om%J֜1ς0 Aa;l0wf2;p8Zf;Rb8k]5\lLC.> g6z7|ȹ̖ G`Vs笉jW~nɖvyϒ]UK1n./Sx`yÑ=̫l@<߁d&S=d}ɺLQHo}ۍ<,'% Eq Δ{}{n/,Jk'jW4M"|ϵ߅}{t:L/뛙l`c2GLǤ\"`'JmƎ-F!SQݦ >æ rpRVñ}N۔+|<7K4wz;wUvR }L?' 6Atiee짾9J |BvDCSgnxVTXPbQw%{mdxAsjv[^(I3 o(Vni?,2dޢ%Tj"Y TR$WdZ]("o=Js`ޅTUzt Mr#.gx D2dĚ&H!#k>ޅ1?E.{4Qy`JiFat r aӄ逤aBeFYnŒ١# Hyh@FA7ޢSzg-@ }z#(8$qglTHY6_l#$`s2x ҧ:ZP#"cTe ΌCʋ-$N& "uJ]D ]H<1sYPnPpܨC݈ ²9h%Y;t$ʴVjrxeRMX\Ѯ2 / y|{u\LH=2{Pp޼H.~Vh9f C u>u]ORj_B L$KOy ' -:RP((, C_^_7;F+my0]З@ =gJ :cA! OPp3ڸY&NH2LQ1ᏒݕTD4^XFfXVvkV3(5Cئ$X}2Pd5p\ s'B?퉺µ! ŧ?f?]eٞt_:kn 吏~fo}c8)FgIΔ0$IO:+Yi]gW.ߟOhAh+qw lqfl"W$.eJ$\+;( y,(F~1kC3=7mW(e/{sF.S%E;V{2Q*e/( ~}&ڵTLLѱw4 yUC>lt>4>~d'|,;U}dqGϩԇr %ܔJR٬po6jvfbHj0>tmeQV@SfZ ϸXMΙ]>7`v@q77tCYkhuh֐ѳ 4qt nzߟ?sc:Q9 8€71u /̐C| e~  \"Sr\\x-ZNn.6D!j4ͧwxsrȆ땍~ue1;k_Myv*om|~ۼcn@xmGtpŴ~- u$,b-/Y2k4O-q~Si!]JPز&ӌܸa+T\*7S(+-60/hX&@ӻYE̕mPUXf$UnrģksNu{MVrlH#7luBPgNp%Fkb\*->b.5 p!81,S@;c;\zvK v;+ Bj7MD[&EQ>P.d߂eMdR$vncx +ZLX*zo޶=K6*́Y_dJ mG_G n}m= 5~}'h2<,lBfѕ[π- ^ Jt@ph x PʪM0kTe"p9rh#'x)/[$MO\tO b zѲt&GI8JXTJbUvN8@iJޖ~lsRIcq|j7[]seS{^WOƠkiIܝ #bޗZmML3 BZ'䅻9a2r+4e~ ~XaT+XCڀr0Y-].)be%F?cDZţeqDcIQK'ybJ Uɸ?(<<{*8 mr$`@2u*DK‡呜4B%(cLg :-Jv<#L NS-Nlw]I.5}t¶]|r\![GEƃT~1Α(FvhՁش JcɈp"턙qZIE'%eR|DW|N)Jh?bK@;E[$<:}=m]la,6Rsoh5^:O(#T2\GK4]XS N[kPTL|ZJ!3zvF~Ofӳá1T梅@ 48 ء!L!q˥"2.Y5&WHyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0131-radio.xiz000066400000000000000000000036101506652756400226110ustar00rootroot00000000000000-`Zs:_i!Bfth0{@Hg/a[[r-_![C3m X3v(d^@ġ.&:OŰw/=2ZO{B\y(Uw?icuL^,#g9И;0$#λ/m3SvHf1RPb&hNgagSC3==[1 =bO4hBǑNu 4Zq=+{?rb㽱P?0܎"2|d|}tnD7otUPO\}O1 )c(a+-*MECte?؍U מ4+zMG\_<&+k/׍02!NdnpHfPKA>`e]|Y(Qt4м}BH\ !5NN@߱˷B"[2y|Y=4NT[1^ 9KkD-CYDZA2lk <*wtm0)8Sy <4 d^9}?mBeNd&ucp2y(@>)EC D ]{ 1" 63$ٱy;RrWgrDT4ދ*R;+E=Ӱkp*$Y=M1j+!RYzvUc݀* H7x <ܗf$*?q؊p@QL9i~xc {RIxx]%Nu:VP +˳Юkr>45^ȴ2;M*^f*PnMťj% \)rNOG UVPS]T%a 8z25]M 9klFa:J`xrVQQ z Ӗ_˻}]vGy'>>A ڿ[E8#!I X)^)ww ӭ?-w- )e}7K*ǖͻƲr R{ ?-]9i|s)R6>&&V@suԖ!:*[ņE<4HHGPA<2l*LqGۿjW A6:ar ; ;ZU:O5vZ7r0{w{z꾻NA!Z ݘPi"zEƾ8o֗ܙm-SW9 MX~sp"88"a!LĢSD:Ŭ1aR\>g6 m;ۋXHPZӃe5iBgjPAA`QKAUtwcp0ϻ8@ǽ?>:~?{/:m%{7 19H jl˥;n$+<.WHS6YE`kۦA@ܙ=N $jb"/|:IϖЍI!lTϠvjP Z!%]-u.  _x$C{ccPq ʖ̭Fo9#54IT[hG9Ck#CGqc2bM ^C?XA57~h;˴\V1S`T.? B"!1+pr PẂ-+l vڸu)Eܼd6R4Rd< GLBt/ccvG^E@>:\h27&ӴI(|xZt{w z^:$i":dL\6rr 1=i[tzO j~1dnHKLP Rd^+3pJ0UPsjF~PPsg( u!(qa.43i0 =Mg"?}LgsaOBQ{[mSZi$zCOS$^)P${J-'F3sy݀(Q" fyf1YT~VNQ !GēˈV= AF8x4Ό选@= O'=e(`XX@ ,,d_ـj2ݘjx%^ޚݟljxUR rT r.Pq!$ojSu%>;P꒐{AT+Ė/ b+e~%,mFyJQT]-;F\xb ?0_=-lJOP+cӮ6H߰R"gQnXvK{+% /i3)5lD6MG]<{{mVtBizaߑj~shz'6 C)"#%!|&,:uyX[swό±%gs-XUn\j^}Р{ݢß)6)YR,o^X?sQNom[D&uԶΝ_i^n)@*?h(S-@S)wpS}@矷18g!etj /9eGoq)ԊeG__&>L|qm2PŽ𭆛:tʥn;Y7՝rNMuS^wS)绩<6U;֣cEX0Xl|LA"JՈ 7a\=$z`q  BnX/g֛Mrz9Lj{**AW"Y)HhǤWyԄb-MYidV[~4K2u/yoshimi-2.3.5.1/banks/The_Mysterious_Bank/0133-strange_world.xiz000066400000000000000000000044241506652756400243730ustar00rootroot00000000000000-`\[w8~_!p&,}O61ƲK ;=D*IU_vjcjJ? bknOf|՗'=ezӾ|Sb¿9ާL[ ;ji7?J8 vQ n̵n鬱=^>qm+4N[iݍ*z-FJ],ckGC~E6ɒ? ~5dK=LW1LDYbNj.w xc2d |f.52iyC&&Qb4X-LAv[fr8/0h;c)r^a=˱ {Z;u0Ra6!4M$ Ea$S'c#A'y9Ft`@lM&@]3Bzn/}q]C ]pߗ/3*hq#6>6&-<4=eX?uyZDHO&Bu (6^isf09-4Ah!=  P ֚cĞ+ u9fcN!NVYӱzMAQ^ mwl0JpL;J|2CÇ˒/AP ByÎns.A!0seCUlkyK7 ֓ <25,Xb,B`4 뽋}n&rxt|9>ddOw6ޖuMhk5P1bꄡXߡ3œ`4$A\Dzzρ3BT}V7Bîчb$JJ$g-K"xZ2ۼt`>QtӍP)K<7"ؔg|ѡ DO@ ,SM$H ΰgB"V*Jn_ Ja%֣?]cت=t*q[Ntˡ 44TM6ԕK[Uska^y\h, g,|g,g,\g,̟gzp=뙖|?p+tńSRz5gGS'uZoQߋk#xMv26hg$^W'"N {"E zh@q PTDD6 2Yp.Tn$ .HءHOιMނ 9`* )š.B)Rn Z K 6I?-?`2_,0Qyoshimi-2.3.5.1/banks/The_Mysterious_Bank/0134-ufo_invasion.xiz000066400000000000000000000042551506652756400242230ustar00rootroot00000000000000-`\[s8~_2csNjEoct_?2`[.IbkC:H9::7ձ[~j? i/͠gw˯Oz?;wdh5ƄPƁxF,7i5?D0›xx C6f[ '_pc9V dJ\ gl$tŔ,YZ;gr2O> Dx߇;o@"H 툌Pl(,zv=.icX_F  8p"kdPktxX” C=L4l"iJ8dC^pwtM!ȕ(nx1d0qyK&R#3,D;*-4By56/($̰x w׊8kNr%"&kOfO:ku?L5%^`S ƄD|~$' m*}fFq0szZ벼ɔ%<'̹ }"@N2.^ow(;RgzpC^A2kj?ҋ"K+CUMQB:m{xJd4 [ՆbrBâEA?ӻo"j UÃA@QK*#dJ$(i!{ȈkEܥ4(&>S|;-oe< ]ɡ }l&tłC07UcqVk2LҚe4M'w @mP2?+ "sM̜ŗVM(I/}|rOGthB`\UM{E*)1M|w^@k9+s5 DOA<9|,uOh;`Lm JjgOijNze;jۦ6*i Z{տ 2SH2֑U;yʾ̕,ײeaI!u- e,_eaZsE`MӶn.1B?W9 r^2Q/ Vp岞W,^Dվ^b7  층_ lg;WܽϦU賥wF}ymSȕʼnVU܇72_uJDֵZ>Xu-Ǻc]˯뱮Xzx>jN}xT#R=cHjx-]%B?@!{=a˽v"Y-yIY9t.-yt-k4z}1ݠ+ddCr;2SJ 1Wx^p<4"\V|)L,Cl-Ƈ\ZOBוı&INy$i5%Id:Vad߲ Eyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/000077500000000000000000000000001506652756400212205ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/.bankdir000066400000000000000000000000061506652756400226270ustar00rootroot000000000000002.3.0 yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0001-Xylophone.xiz000066400000000000000000000067321506652756400243270ustar00rootroot00000000000000]]WH}ϯ=cK>'΂ad'#,ؒWI[Zj-YάByTze #/?vݎ/?v?ߜw?/n^:;do܎vbۏw.ͲKO.Χ7s Xv|{~^N'?~6PCrCOQ^zf]N糛uZ[Va<dzQ5iMՂ߼bwYk7V 4'[x{Tίo>7ٚ?4n"J6ɂt? ~西֋oo8w˳Η ҎP^d'D6-8r럧JX)$٢\shrUNof'1ۥէd&:H/Mwo}s(G$],`uDXq ;VCb߈[rc7I*HNB8bg7b,I D}beQ@Gw,ɢGbCxh\>~POz[.EYܿ2u/3ޗ\xU{ +}'XnYaY˺SNlevvq9L6A٦?ZKD5_Di2&mϯ mds".cҵyj|6-7r.0RKv,:ݮ_\?S8x~]]U#׸ólCηZZLLi@Ђ~Hf.*\f{^zQgN( dCV.m8V\~LϦ0ϵ"jϳW/>6&/;\VRK{K*._/9$ IsH]i]8E gVF ZG.^Vq\>l9F#Ð^s9sS3:F|deTmzA}ed{oeיH6D# %^8H'U[qh/^Nqɥf*匥T JT%٠KoG祢$,rmNj<̈;*vԧ]U]ͮ/QAEy8CR n;5c\Z8utcm|L^nqUT>np+s]RT\^o*w+2F-O`9XS;5#ͮEz:촧lD%v>O6풡ZEbMI,, Ńx0 ^<`0l 8zҕ̪Rr fP50lih50lȩkURyȉ Ʒ ƃx0` `0ƭ10lƶ0f[a@atQw3 HqwύѬω!4cۆ*E#4T#ƣ!׸YCh-6rVƐk,rECqh?ECh5 Ƣ!X4kـ$t&Zz͠NF_KSjیr3&匾猾 :Na+0H84 ݄op5w :+P;Bω :(ۦs.7kNG#g.b^ #Ԟ+`|<0]l6nsd2wb4e vLʶyF2GqJ}eI>@Js$U"Ȕ=7nX2@~ ;P*YCh,\k6Pk-Ѐk-Ѐk-Ѐk-Ѐk-Јk |ϑۀ :1߀@+#ߔ]lu. LJ <Ey4:htq-7tmc(N*Z\#ppm#/Lm:KL4C)4s&rf >fRF l@ Dfo8}Iar;t莍;`CL;`M;` FZ}GwТ8Gy4:hxאsA ״^50× x׆Z\Iq|G#V w@Nnڿ\vO%Ȉא9͑zڹM#hᕙx݊-My*e="]ZimGr&!5 r%f"iE}䵺XIrEQSR,Z TR eYܡ4$LlʉT-%82VIȈz6cijIjIŠJ$XL^}I2 iY!fRhP,˵%'YS$iIyGҘI>7'JgMwȴY[]$AF]S2@QT [w^9#RHS*R$S5aiWǝo1M/GI6TP&mV漕36+^^cR/כlY<@Ւ@B)ߐNeM1mj%*/, Lp)A6RϕRgl^6kVU$T)gZ@?(5j%傄rR,զ(!*rv78-K Zfto9;w2{O9LA\>`\N 7oa宸7O 4s~|o'7N_o7o)f 1 p՘"B0POx=y+$^4Sg8k7wZѐ̄1F ^$b.,DnXp 4w&]2;iwN|rbPZg%S+  8L|;ԢMJ-lqb[0 q?S|KWoP;ʤ?o@`g> j).en\= E6>NјUsᧁÐ?zqYu5r3ϋc͎JaYbm *۝$ӭ*4p*TĆI`"4m{pq⼄lЙgô%&u_$l~h`6E0ԎZ2"$ZHZIyh]Ql 2yL?"0V1HYMQ c60qzzZZ!D=tGDiwc[h @JM9"=i dB.=Geh0GNNg8V3tzfxC`%Ow \sZ+,xx3*zDb稹u5}vQتߴY= 3d4hҸ̣[0՛bJTZ{`8OcEԂЛX.CX ]'ve.hݼ$i _j̟rg-l kcMMT\B L 67&4T5~jSOkfm\nWKy`0vi!)R8ٚ8['pnAhU FЏzEο'}hQ~qCCճ(g*||1yh(zP7e%Y}?9NGSFeٙ֬̇o~Wo/^GnYgpOgpgp/gpad:`=Xp~$[/P%5ɶuo鵮pC;ۘV!73.Z?C>2Rtm|DӦͲ^~odˡdk׭EBrթ c[NܭaQ=+MChHlA[w<7^n?RgE$ &`\&yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0003-Soft Vibes.xiz000066400000000000000000000036331506652756400243050ustar00rootroot00000000000000Zs8_zEfth-s(^4ֶ8rlI^H'Cػosws,njNk Mq}Ӫ=yn48mNY7.)+?ͽњzƒɉDx>hNgh*@Gaȟy@=o,k:P[9EΙfG0ެXm{VZu_JEbCǤ X0 Ioyp{S;Mq^B6 ̳ass/~k6r?40|e"jGZYUN \ $-VuKC]4Jf(Z<  &Z(1xY(G"za8ݑx;g4b1VN7#);?b8 w@A ԦM2\a0z@YE}+N\9gVreѫZU f'2{ '0^ Ty$F[R@c8 ,i苀ωO" iQcr%H[8u;^-&.QZ)Syx$M 䐽(}ޛ5%wytWu]H"rV4@2 MPJJ֌-DȈuW" Vi$KU1}+ȣ@$OMJ|(hj)L< ԥ&&% ˒ޡ0D<`Q6]4ҡ<};5lT# ԖfZo(KeG}zNd8hdɺjD::HVK9C!jqfBJ1 0wȧv7}2Hv7T8Q@D$Д#Ӝv@&2sT&sdtox_y[ ckK0@G\~k97vW%w \srxH`fMI*VN8 J+}Ŕ5POO^pST&ڥ\l Vή) 9sI+,xx3mjGuZk u6aG~bpjnʹz!3d4>II\͗___7QS5SbCK2$=}H-ĞF,H1]WH4i܎Pẹ;NePj%l.U9 dNqcgpTufr@lt [& BCw!Ya̟sW'0l$ k#eMTC \`@ =u) Y=HcAI0'XkL~]3i{ IƵs 4F9\>p2ͺsa\zEο Q/6B^Q+Ucp_y-ж{2Ǫ9%Y0;lvq,;OвK~pЩe|)Ǘ>;㙾8㙾:L_4?Y G Ï#djĸ&v4.{>g13*d>ff@_Tk@TJ-Kku^7zhkˡdkZ/'*^KrRƶܮaQYP-(.uCh ͊FKJo19-r[ԙE4h/71&yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0004-Simple Chimes.xiz000066400000000000000000000041701506652756400247610ustar00rootroot00000000000000Zs6߿ԑ8v\i=9 X]}>q-$Rdfe@_ ̏O]nEnӧq3->;FC[_O堘PU9sf$a),OE`Fla5s5MKP0? _YȅDO=4sBq!M5.t) 0 ?LXWRIKu?ϱNw/~'N;Yjcv:~V(#m9aw ߈> cOB4β5Uh-ЊPWL" Lc0n5"Wd( W#mW8:2y$h4HUu4.!{A'dxc 83^JhDX@ƫ@J#/!}D{YȂ=E( l$J,]?0y^"qo[Z#ڤ \IBCK宲[rQ(iGKJsy4.Bn0釙T= |w*p L} l u#) ͤmgG ^X$A ! x| 'nC1ݛ/F.Kw;J^.JdV A:PνP7z5x:j<+4cFL^A`ؤoйbJPHUS2BdLOZzr BInۦ'dt؜.q$DP始 ǹ O7 4Ou,vr--9k!s9H5cЅF)Nvܠר 9C8p <7S-I@#=OjeVpʛ+[7 :񯒈S,wȋz+5w|MӑO!Dl2XfTEg0e}4A/I@I %(ARr%fʤJCz1vI+BmZ4r]h()R9QKNe{bYvbv%q4^zMhfЄi`zɝVd5!}:о0o(R#qN -KxV׶8)V|g:f/kS6S6i>3m6PɎh Dpjp ^Fmw<|_]RF i~&7 ]<,/eymEubӬ"MrPRɤLiIrht9=fA1d~6b:peEN 'lޫ$օ_م;ò]$~y9_騞UOn}#0RW>n !.F>ݵ֟Oz Z_FAw|eR(Vl~oS;|9pޱ dP=Vcuc}N2{G>c#=[yO= @cVX28h gD`;ѭNt+ D|;UqT"k'M E-@Kp~zcD:$< S>ooǣ%/G9+֙Y[ Qb(&Uېj.g[ Z b+| Uϕ| |}1b4UwuQΤ|.Hkت cZz2h4g> f7CQy=XT!lNC00iCHKl]g='=1/6.yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0005-Silver Bell.xiz000066400000000000000000000050651506652756400244470ustar00rootroot00000000000000\w8޿{lsΡ@f8l ~Ql M+,[lpv~ik_]I}ȼ[n5_ qdû\>#Yls␄⣌݉OYl'nAdy|q-x"^>DM,7~lidAD aS ,ZQ[rwtqR!oCf [XTbys{9//73 uevH=}+}_$Lͭ߮5~ UDv}d6¨ᑄFecg&4riЇ/n#>7.a[qBӚ[>noFf8w?tXpi32; xE$ vtTk^6\8v;O\*h&IKϼ )&avPn2Zߑ,# Rly;)m聧$֡pny  r^XȜ$9Y30 -BM,y,ޘɂne' v  , KW\YbKE{I'-%%>׶Rq[QY˂?M/aP` V2l m d @eAgF6uzBKPs 4ӐP>r6!:P## ZOZ5{tu̎0Q8J}('ca@$ġP(TQ$:]@ZNP`UT?eFΩ6$faTy0R9588;4p$YID쯺hB*vjS`h#L.\0\+?GH Q21\b.'i%8/JTɽ[ڛj>5` 1fiMI |1 cO"Dynk D1>]#[."I"J+8)Pk*J]HUQS&]r$%0PeR bBšD XAUqXal"=Ҭd;6{ ؕfzqT_+ɻV)Ӛ$G0{Uمf`WPb\lEE*-{7P#+&u8ᕂ͈pwVTnUW)r6_7V@œa qhhu- gNA$G-"m="l#ܜ Yd՝{/W 6*r* 'Y'qrЮ1:]&i6ڇL(}tsy5Y1.60xW'&Wcy+Xdn37q?A[YyfheyR썘RBjeoD ё5+jJ-@_̸uZd*, ˜wKM:JYRFK{IEfße5ؒ +*UV;yxh%6MJi}c8o.V=c顨WXҴѱph!K3EJ쁥cJ^()1%D1%Ԧ{69P;F zlp>yfϚ7 c6oU7lK7pR&]^~<}/A~ȴkNǔ>H:N۷ 99)^g:v!/i[O71r_UW1e^6|)YuwƛC/u YݧKu!=g>$&Z66B Z[u-Ǻc‚zu<k@7tH =xC@_K1¯H}Dg)r]wGS6,P_?۾m;ۂ+6յ Iqܮf~_;.*͸Fv`GzԒLKPQ=DgcJM17*־x׭rgC?*wךc81qR䑰qG2SYB]<]Ӥha0 u *֯Ùe [knMgylx`\`Z^J^$e:E6].#{0 s9џJ~< ΙF|zk+ٺ~-4~/|_E274>6(n$5/v"`Kn7s·qGlbhb-7GI$7]p iA bmsYp!Y(_UAJ<$ B3]oU'/D鞕*k5\em.!wسO2 B(h~e ȇqw"D D$tGẻxn%&!č@ktȤgr1O,I$EF^ehcA@zRG-KRSwH = Ub?Q`?Z7; GSh^S8I@> :]ju$GM]x8mW:P_?q3x{{lv}Kkhfs{ )iO 혒|a"<^l3qR&gϧNlhEaaVW8WLc_Fr¡B+K3Il2'[˫(LpD *@T2snQR]O[Ozϥi:\Pu"'.Q"翫vAYx IPHT]WCe S)\OtcԐfS38헟v4}ն +KP={_6mRPSz*C65TAS9h"W8xj"DBJ1l1q> P a\&T6ykB+ZMW*J{ՙGyIFf?ֈ-W#*٩5KM3X"PdtiGl 0Ryz L‰ug*| ɟELT+)Qk*MFz:Ui_@625* ^CA$t}5pA R*9D{Y;6lv93`qeNXHm X p2M7]nc aG`V^"Ġo31ȾpPi`]`/~Mlqz렇NQ^^W yvHh0#lsU S{掼dAA㥶vS(oAtؕ G^w}ڥٙ\O+l2wnVZA¥(Jl/8ȉKV^RIy!EfN{ʆ)d+}/'=9D`TN4՗0$p-g? #e# m&-vW7_W]kוF?u%`G^ՠv]4;u%@F3&.+2u,҇f!/feCt眆)'.wܜNʍ~GRbD"=eß se*R?yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0007-Ethereal.xiz000066400000000000000000000046301506652756400240740ustar00rootroot00000000000000\[w8~ϯ!&vN lBzEG`< 6 2-%hSM$*U}|/aoml23s-ymNN[??ysYK8}E e%NW׻muZDO6vyKQN`?hЍM㙆t:>O`44^7=' '"USy ]6Qq0yM^!ZS U7l`K`,zق1-X; lidʂЅ+%ǽ‚z+ױgrW}Z0p8zc3>!ke8 BG ڼA?s3DWtM!~-EdH6ta];L9QCr3h\Ei5,Vhp"&n@ZZzƍ#CyA#9@k$Ei3\ xeME7Ȼ.oR ~TO;$l?$ x˓jI∇siC̗Jk2q‰dH˩l {;M}=ӼKna4/sб} z|"=CJSR!.7ԣA i3IB 5ɥ>PgxϾgNq2UNMi!K܊E)@%, >rRy,=ݮT@t4OG/wGeMk}+)EcddBDI_d3QE,RiU?Y9BF^XYN`xgw8ځMysTT)*Y4^UhARNË%yZ,Td U4)eh'5p7K?N*-D6EZF4W8Y|j\ݗqS>B$ܗY7Ó+Hc1xhx,Cb)o~9QD w9fgԽ pJɉ]hn'B0YZs2rk]iZ #w]4L\ c?8'\yulgtq񯑝[n$yʪ, j}UaU07z4}MF*x7_Jkwz-^R^QVBYCS{\1m92iM{B#xڤ&ti3yZfFTwLjjCI!S(!RjCƴtcY=ihZ=4m*|4z)НbW0)s(DcҝulIswGS$o:!ɎFSFS@Hn<qC* CƁt]`_;?f!йi }Ozw]:B7~[2؞ͯ|pZL֚5 Wy*㞪kaAj᳞Zح멮zS=7S <[%yD4=> _p\to+Q޼]̐ۙg<6̜A.s@3&丶$յL4&M9BDr^4l*Poe\Ez^tt2tn~K@O!]~K_3u]5΋c'=n+\Tp3|y7zءRyK\5M{nHy' ij:ZĴCڴ1#ĩxk }o2 -z}h]5;Yr0uܲ_yDxĖ!Yp/ypa1!@( "X4"( s@38Ƌ6[XUd?nX͏,n&C+=OXw}gwύv.XPlX!װ1ea5тIohȐ6+&d%iŮ]WH ^m{L}Zpt:Oud07s<]Q0N]d&4R\Gt+s|el"%(T}wy|%s$ܐ//(ZULPtԻL>Bfh+y ?TIϱg/yhQՖ.JE+% ,} C2J]Tp7zcf8Ǽ'yͩcpF{3?C2J|'.D&HQpC#yިvYd=>^7;~~8nlo,?m!3X}C&*vBvqw ̑VW˕ˣxkHqJ0.AFe*پAD-^)l=%ۧAH3]W@ePO?qGAtr/LlPTժEw` 4N5԰Q/8 Phfq8=E°E4o7 TnyU vpUPjSE]aq)H1چl%XZچsyfF\}P|ŢIPk;W3ZlB/xo$QymTji-Q y(ѩ(yI()Ff)RjtE~d³qq4 J/hpݯ^t=B')-< ,'% mQLj! ӀF,(A4S 'KsFfV}Q6Wn"g#61NfII@\aɢa]0 j~䒂zYW `G wږK:QBM#3h&ĭ*]#[9BxZjkhґgqeE__pF#Ae>k4fSW,7HZW+N%yRzg5c‘wLR-8 FB9Oyjեց :ojd+7\l:;^:1 ,8=]E$哠TiI:}bD:ߏ&vODe-;THFs^x))"e%~w.|fhz֬tzAGOz:v9:z {.ZRW!Vz^cӳEF+ `.A뢺U^#kO]KZ>պZGڦ?jV|vj#jVjvj[WݺZjV gmq|68 5Iyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0009-Trem Lead.xiz000066400000000000000000000077751506652756400241170ustar00rootroot00000000000000][s6~ϯ=HK<ֳd7¡%f#*I9= ݦ;yj*;pSa:?ﻝ Ƴ0zxx{vÛw;<|59:nVw'~;3VIv'n%_7Řo) U:WcO~rOuռK^\^ޞ^^tz?xWׇ N/݅[УfW3IՆ_ `z (͒"2,}N 44u$-Zk>4/栵=Wfs=zOq8 :x>-vC& ;cm,:g?{lsf /> ruq;qҙY؈"AjQM 3p6 0XY,i.?EqfJyY0@:΂/-B5@J42fVA-mf zϏ6edB9XhIxmzC+#5INK g&ɡMug!iUTmCWŠj ]]9"7\Dn YCێ?Dn0XT;ˍN,|Ш.AY-fLŲ5'@*B^]эJuAxy< ry^/@>ȶ^bfF;P9]J;<Ҏmvڽ"ci]n`d+Ɛr, GJN 5bGz>2@W 5| o>m00ZGv8d`Yb⎉|+G$ E3X<ր]1j`kj-xb!ۤ{HzqbI/I/!%F 80a- 01i#%FcXb01a산@7mZۤ7߆㸊bo֑I0F=fds:m3]d)3;KrTx)3;1g,Ɯsk(uȧs s# c:E#%9P@ώmaK#qMg=8l~g}dscf Gؒ]-pF:4IH6ț>EU8cl `e2B(ӝ 1@BW" aޡ<@.U48@Va,1B7m 2s#cNkL,ORvEA5YeZY잣>ő]sk6pQڀ3s> ѥ4O\8`ԅ_;Os.tW\D6wnH+GN({qeP?sJ]C2V0/bPd({@Xֽ˓'e(ČR~qQ5v]=`/({s(Ne vj<dž8Cۅ5QQ 0L4 j/0}t ]G2 QlT2]a_>Rtyz4i_IRP{Bz'(νtI%}zu\+TR4 ?˪wZK:ZۇTL+e($2X+o2/NaU^/fnZaVԝ\S>U PC祟uU.=9:=S U[L;*?@ږu*eS%.:~+)AC-4CtyMvtdCtZTZ^m櫶D3J/WJ/b~) ?ChV̰j\ b8YR%?>2'Ѧ!&XՙԪHQuuKuL{e58HVoW|2Sm݇IZKBBz[orZG/d ˋӣbZ)bQ$* ?3Ky-#w.^U ]'d2[O^.^@Zh!M31AV Y+{*v ۢ, s~ l:ebFeX*@:C L$je-Qkڱ[Oj]햮L{Z{kY#Q/vHj3LE5cmuʒEi%_ު^ VP}ȥuTdPJRIJQgkYi/GPYްYlxz~򚞞aOOnlN#!/鎠'O=ZN4"r"ƋTŕ?P oP+Ԅ/塎 _0{CO{#|!0ߟ*.TP'IL"2qKr!$q-EyKrqyGVwM奯"<1C}ce׭pn֭0خVlu+u S]W躼}"?w_cޯȑeɐט $}"mH6i?V7S6$k;$(.mѿŦ?<ś?L[cc&Ӊǫ9F2'ef-LSM3.)!(N܊2W-ӕJL3 [(2~K$ѺNZ5)C? v|mi<|R-S^46n/-7Vd)?kTa}-8QU,c:{b,Tc@/cB9D:tKN77m| K=c, R}yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0010-Trem Synth Piano 3.xiz000066400000000000000000000035071506652756400255060ustar00rootroot00000000000000ZMs6W<;T-)ֽ` %R Jǚɡr~bqevܲXrϏ[޻N_ӧc7fy4[Q]H?*h.)]4F4 Z? i84&3+!nw:J$K/AO,iYmnN2ꎻO wSH|RX.\'?eaB,&~q(ݱ,Y';L,N,ȼ`.b@&{yEVwt m`2?>8(  iLcZܵ52r}0uo{󘭏>/։c+)<nX쯘gcn@k~YtdZ Z6+wJ绕‡ܓKa#*aGRt@'@!RP5MپKVA&O'Dz JV'%mfh}tQ8׳V @bJ4a8ߒx;g4ab ūzsdkfA/u.AWXw=aW4y2WyL R;Dkܓz*Ku{ "5g)k^SfG,h0PdAGKB#Y̳Ǎ! ӊY2gwʦ:.ЬܶNeENL {Ijrm"NW$ +[b4HFZלI+eBjwj ҅;goa]MAQJ]N5Ic~lUSIڨU/"7VUX&k*Gg=Uej D^2 =j7|OW͗-ߣ{/s]޺_*u纼):@Bʋ<\B:s}u8>p_>j=6v}ߠ'k9Uߚayi9|}^plG5FAO?Q*0$U V)%yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0011-Trem Synth.xiz000066400000000000000000000040131506652756400243260ustar00rootroot00000000000000\[w8~ϯ`yO $@8IKlY (n}a}IÿHܚdS?%أ47}3tÓcWX{Q;Vkx>\Tfˣ]{/?+k~IC Rv*XnHnDph`E-*Mw6גKvQ^+7\(`&tD^ROnM֟Lcn #>2- ToŜToVH9Y2XnpK`@#sfH}A+<?SӌYMװlrw7J"AgNeYůtY]s>^W>Wϯ4d~QcsD!L(,/?|W㙢-AvLPJZʛ ge^TOlޖu{ӈS<' 5/٩olICHxh-%`IBOĺ4\屁uYvh gq_Mi(fDhk"pLd{L3@@f<9G-r¥:L"#]o;hu .`W[OhpmV`g4]lA jw:$ Qƹׄ" hr!+͞{D y̙:K #mODgMf wHsC=p -D(Iϻ,\);ȇ #9Jd+-B2hF(1gB3]ЯCr90p47GwB7ru th,:) u$u V#kHtF@CFq 6?xhyu\I zAAPR> <>kI,{ H1l&3TN~Y6d(/Q~B{^ZYiDס*EJ!ES!AQ^:AJ Y2ͣ)u҂ q=+'σKڝ%x~Ji*!~ 5d2JRDEg -J݂AJˆvRxXBA&)[,?QFŁrq] 㺨%gȖw&\ yPšJ.rQqIFQIӒP@4V]?I:ԝ܌G^I8ՊzNε#"TKbjVz\5YWS )OZ4]nO/X;oѶݷJV0IśvߙUf^+-`%>WV~^ =xo5w`N~cۇ4x=uSe ]zޥz ]]ͽԸ]z/ߏ>˱Ӹۯ8D/t zd] > w 宏~owXYLW+iஎp4qg\[ھ_(HO/|o=<|Kyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0012-Simple Square.xiz000066400000000000000000000040061506652756400250060ustar00rootroot00000000000000Z[w6 ~ϯ:9M:/qZ%vf;ݺZ I-%2f~=e;Z ZNjOٗ4qhӐoG%NK%9GaN͓VUCC ȊAGK;ԂMJ-̒HD< m7|"k[L75P Gn0?pn/W3#D(u;wg/|9xk|6: _lyuy幡9 82X{s/nVLxLiǁ=UvD0>Ћ=l{J%m2 n_@ud+̥s>7b#SVQ(!2w7W'RB0;P kГR ?Uyo~k22}B*T&jQv8{.@ 8B Qq"[3dzx!@ "Wk=sçrK[;0Z bX.nUNxsE|eA@}/ZɇK#>nLDq*g^De()ws!,cRr,N_$m-{S]^$) d0+MRl@sjPS/8p\'IiR*% *n1IHG*$M5$fҐTCJzM}gu-}B9$^`q4d˝b[3;{D ̕6-Jp TDzY "`bDW[%}D͡ # '\* c~ueBttj*x yk-\uQQy;.ɪkF'uAY ;WII!c4AJ ƌ&xFN&J;v[E<'y;Y۱h.~ 7x IU,<ɢ6]$0Ų$I94@1ܟhx^f:<bfkvT;PjgR;͝e4/Fla|.JvT"\@hXWCe}/8[iTJ4Jam8<"b㭒( Bm%+1-A! )|9"= fqR"J7^(eQb7z+4&~zixzyke[W(Mf V1 CquV1#+fX[1# X+5JZ;:VUn)ݦVMQ6EnST{MQ5EUx̏jֱ{P8|Rd,duomv+i?]Ğ-yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0013-Full Square.xiz000066400000000000000000000042131506652756400244600ustar00rootroot00000000000000[[w6 ~:r\iy,3ֽ0%WޯdQ")P$V@WoX֚Ec ]/x8ͯN;߽zbvh ;K8piB~ N#xAy<?(iY=+,&,Sve" (}Yuh}{#]Y1#;wL7LɯB/2taSr> (P0Tm|xcyy0)#[a[s'3zJ2M$>${6*DRBv .IB)84VH)dy<2U61p.OG6ס*@pcEP[s߭:^!X=A^\H r,xH뽝%cw d2#a9$.! ӕ|8zr;fDNdB/K" L Rm~+}R2ja0Dg4 (SD &,gӀ]?SޛjtP.t&Z]m-kf.-("M1.x4y QBVr0EH>GnL+KR-sCP2QھG0vR$~(tp|񹮰qY 'QHE3]u:{`+q]qvg'2qCrT[3mfNІY<܋5Q0mQe}Vg#q.U5U&ۛ9K[u@5AuQ-P$Z[sEH*յCʝޤ U }biDjWM@jE.}Y hzÓZq~Iv4QЅ Yd}e3T}\-l!N#["ˇ@'2e|h9jv}"dQ%vwIv2e1|\%QBJİ 9AJ9 #CMU9وP v*mFt"BX[ߙ)<8U,(*xE]Jq^w[+\o( Mp5ؤW0.=xKw[;1?]B]D 8E}]@Go+@4ОO8^! qMP/+WHYhߘF }iZ/_jnubD<&"3Pym S˭Q[pVzWzWm X;z>ib[y_pՖu_b 71yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0014-Super Square.xiz000066400000000000000000000046311506652756400246610ustar00rootroot00000000000000\[8~ϯC9̲ gHf/:nOf|!alI.Y`N:<%1U>W_ k͂a1o;tx?;lo&{6^q'(Vwu_\/i}lJ4 g"vg=xрN;VGCoˊG캱_u\FC1|U7bːX@\/xɼhZ Aͤ>:.QD0i$~Y"ǀfxq=Θ/oM'[yp &vl`kWL %ek],_|g͛_VkA#)eb_,?uj}BkOXhbb2OfH~'zɂ/}GF%S_p8秂jۤ?=Xs8M[a.sO҈,Vq$Cc#&EHYn]=)dC"_}V屁Yvoo`+ U qy6><'oK}/ Vg^s?[?s *fVyOsSȕvnh,Vg,}ϝzXWp{c0D40"dI(g&ȄqQ˅B``&-!%{f![0 'Ƚ c,8V~?_KɅ7"#} 㑶v-h& /?;HO ;Y^"䋹O(9ݨcYj(_W(f> BF Ƞ8NB>vHtȁC^ȫZ7ao%]fq/8Ekb݈-4J:pRU9]Y4A=2(r-M:lIﶝ* '?0]GI[i$bI$ a~,NDӿҥJwl Ǔ.ZIvRٔ-zhw{I,I35k$)F٨7 K)R 7\L{nEI Ņ򴔄+ȹEA%#q\|&HjIhIeRy(5TA)``/BKDp t?/wmIFR)h(4] HI69O 1O=p8+;nNi #s($r%UT~Ba-:2#XY^@I/9UJVs6QLEȨDZJ43]3>S,)uYZ*6!vDb1cD;)۬Th'ԔvM6{tBDMWJ!uvtAy\WyF&s7 eQ"$leIrb~޿vGA&9ݒm^>K֢jk㺒YIEΚrb|+jJPimΡf|שEϯחV?Mygx-ϩWͦ!5 R?5]w5]ɯ5]5}Y%5}rM´c/ i`HIx\x,}n&-+Q܀NۤQwCObf_W.[]wʊszhZRheeue+Qj PwZ tz M8_!YhM|dAG+%ÂM@!\{ǹ)C*@Ӑs=dߞ=$l)ܪd'T&n(i~8?l|h%?tg-}yMsC*` 7k„@5/ׂ*ظX+kE,e&Fa[gK:K\pں?b;UsYEB9=]lݠPdh_$q-zڥύjҮrp}_&_),qj nnƋk!?{|`?U1kT-s.x&gowCd6=;L`!1M!ݜL~K$IQJ|X'Ӂ\y$Ctlㄾ sQ Ŝ;5kXь}! g3mt]\0)foFT>qKS~6AeM|Mehċ *s Wk#މeD4ar8*4%ߜT@e4~?\}/ #|π1=I`K}2~mq./lSU s<}g}Cڠ{(V]0 ؑq] }y_ryx;:!:.ȂGj; ۤb_/>}`:W7\|D>6xG>L /4{EMށ8[r?gK {1jSℜkW W[XI69T6:5;ѧ͆d0Rd,r6`հ~ڮ*T$\%EZyi=z(rUJeS'T6`(ۡɻeBYFlse)ί7Q'+XA<-iFm ;b ei)QPg__ ݔM8qwGttUR}"e|Eʢ~OX6dP@>(&,eU"*4R. k+%JuJo>јq .9F,(7^hiluhS-1Ңx`0,8K_`v;;Adq~KpK^vϭ̼gއLl_z=oJx[iR4@%%,͍WO!b6A@Mf&8:5Fl1GsJ r(3E !w 4K;#Bn{ 56W)sK3@,L&0\Q0ЧH;Y)V]7У[Nh(L@+CzY)'ljub*’ǽ9ǟ!=4>Y)%YbzVxߒO}l?Y+}"B}5yo# B.|G1_z q$k@TH^A)> U/r*rE};`_WZÁ@A>xØNSㄝ6y k!ڃe/Q\yP&z'97Go@U][ BE[O xN xڶ$o@/BQrHM{ f-/t}f}|K]XVS墂hVs o7rᭊу\f~5뚦zm}u[;êXmuY֝\U>|w ҵs<]PƵ˪9ʵ.Hy 'J3W &kjiL'H܅6%]Gu:wڸҩ[[`ljbtK [-~WWugs7 ~.|}Dʵ쎬R;o)R!bzkiX׊걮cݫ:c?kn\ ~x>Iүg=o%,G܃h4Z!L.;kKr2: i$e'p+Α]/ݒtlzDBVd+II?ޢ+eJ\A9.Bqiy늖ZJ1ԒCK CA觊B`M( |;25KV/杴)I?QA<^>ٗ0G cW}Z<_n}WVMmO'|8? /]Ryoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0016-Echo Bubbles.xiz000066400000000000000000000043661506652756400245660ustar00rootroot00000000000000\[w8~`yO!%9MzhBM KHw/:-ج/41-#s+I/SS33oƒ^}8T,];ZپzgI].nە^q(V|;~pVWKU_!6wUE8qBۥM+=;sz[O0h{ߴ^Roݵmߺi;x2AţSvVG2u(I fuɪ~q#Fl QOa !061[H7eA G'%|.hLk3^.U 7kup &z_yElɤwF[p{]XW2 ʘm:K/X㢯sHK>K#U)]e}~G(X (GbugpYsј3).jF=2hoтC)q{˕E4 a-dg TZcL}ϵI@=ǟz, C3yq|:Buﶍ=B@dIfFDNh8DhK"PK4#?C6a4>;O!' 4a08p0#wKd׾sq8 w\r5xx̙FW8f6O&Z{ADfcJ'#(iVg:M(p$d!1st؄\e}/H(ȼK2@kS?݋OeaQI):EAd4)P"}JGB:R.f܁p.wr^:T [u)\֚́~oX9f7ǖub2Dz>su]+IWk(uF@BFyXkHJGKy(o#%E 87M_)2>i򚰖*ʵ?U7Ze0VRԤ_u*\:FTҺg p{fH%C3sk]^hʕb)#0cs޾f/=D{nOjP]3ߢSKLZF(p; hGAD3PJB-f꡵ /8gCƀ@3%[Y[T vQQwAP9J q  F/z4pszJRC(Z I߱fWȒ~\QUiCsO<#,˻AV%崟 @YyuW)WW\5ïtH8J+@&x)U9w5&T$!WI?P3t̶H4ʠIzc[3dN62)hycw$:Pz<Cg N񉜃4iIqb n{v.3WyZo5mk}ne뫄i% NQru/mOvB_3%Z$# dYJ[;knRK\=b7#{;͈PqGZIԞsYThjK )nU}2@7T́w?,lp8w ] Mql0@{¢x-Pf^ 6ƯF2̠Qd ڟjШ𛻮Bed!M׵oBx AχF믇Fl7Q-e?P{ 5hT:,eШFM{M>=9mȠ˻*;<_܎TF 5hTp4zK4|hv^s􍁣8:a6gQ8HeNH-/{R{j6ЙPG6'/`hs8Ǡwamx]<܌KYk\q&v.EobGћwI-z;}M8m'D[oюƣi=aDZOb.-+=h_]/nP )jiŤpt@oKR=_b)6oܽ9_D|cMW8,e7%2W͓׎%* _~L]˘ cQ˗1 ƚfF-2[=%=ׯߌr56,曷|[82Ӯ/2=Ǚŋ(V~;W\-S>~md< ؆g654V툆65vD7ƄƮ /]o>_kS]mC۩- M }"޴wgͭ,uyqxU"~Bf~hϲp"–Kf+hW Z!ny?&n#+o漁S5;k4ϊ>Y}G4]#lVۼQ8ˀmO>NepiĂŶ4- 92!|f1溡Kq$+mLVJAnc.odrYRtO8r)tP @AEj&ugp|lӅ[銔TcHǡ`ɐ;RB5h:e4wH$.XU HʻT"TMxqb[h 6 DI[5 -|N*\FHEԛލG2qACF4L fe9輿b[n.gl XY=М"bv (z*E=,DgK΅Aor.hݚd sH8z Ju&jT c< 5h ģ ev2k`,Anm jhPQdeV3Crxǫ[>wa$\5^-ͪ]QWez]EKM,2+qZOX]\gl)F*Z2\J/uaek Ո."AR$1MZ|W+Z8\՚C7&Kr ԡ0LRaC$|z(# 9%RejrjMfzQ&oxwz#v3wiFeaFkdHuy%/Q/ux/yy~l!~iNؒWdkˇk/oNRayʤdpZt0J(<Ӆ)| (|*>`ɼe4QB t~{P:uǍh0RDNL1Ǔ)HaE 6TMa>-1/jhjb jY>5NN^ Ȭ|BgdÌr@0~xVԪjziW (:FT{n1'TKu63Bww+jݎ$'z^J&m~HzV!]vQl{ޕ=)E٥|w:{t ׀y >BHK!TT$C-|f1G!ė8REK`)Uއ \O3 ]s&x(q}/d&bk3L YD}X*I&=^i{h0z9ëvN74PcNOJҬU+L]Ѐu6 >`pUq*=3*EY4{]jd 蒑jv*wIYV"7lZp 2FxNR+If ȦIW4'* J5aBl= *7y'&I]L8*Ģ\Or)%Y un2 [bO]׽83%x󂫖|6s3 uf2WltXYjXi tzk.Zc!rrs#׬e-v2J?Z7?"X}]vΰKdO-kPPY_ueTTXp S?>S?>7ZWbÇ+Rx~{J5_.Xa?\Љb@#kS0r[v'/pv^1![WLr>,}|]<#ܮg(?R/_'2yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0019-Soft.xiz000066400000000000000000000040441506652756400232600ustar00rootroot00000000000000[s6 _=u|4k-3ֽhʒ7_?P$Jd)6 ox\٭ |:maӵp޾]?\yrn{-kί:h@[q(w_\mg##7rmN`)hG7ikltéӺ݆I?Gk: wIv0L0^ˡ+v^G'0j0l#ypnN.'S`ip3`2dcΆ].\51"RC?I#"PpNT,\dͨa Om0pM L}beQJz>Oݓq0^ƫߧ/hto)41@0?ߞv{Q\MP{^@KJ%T6Bm O !{XlZZ4]'L&̼ AbX@.; .?%- B'CNd)P]1I^s#߸Dzb_<| F>RuCD%:z/=:0#/E]wJQ! ң4Dslr׫@W顠JA)m $~PSdXQy/15 y/0a2&U2'ŮYNۧJڊnU/$]L QtVh7'ܔkȽFDlT,#r=$=Yuc|D3PJϡB=RFYfc/*N&1 o|:,V;"1 ĕ.r` )I(1|>2EDK Ûܱ+C-FYFFLtI+<-Bh5qW6=帋ی wґ:{E7C9ox42Cِ}wo5/}t$EEΝbׯsB1&&Gb}iWtKuFj+ا=:ip 暀O SGhgyF8kFl&>nfẙFo&;5{=f'hCB+t.iOpe`p}=~4nc[sV|Ϣ7w1-{=ő}BGWRz9>[˗M7j(iSj v$vj_Gd93 <vVT =|"j#ԧçۋ6OJ &U 9t0CLWŖP骶>:2Cc;`0 bT7yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0020-Ultra Soft.xiz000066400000000000000000000036071506652756400243240ustar00rootroot00000000000000Zs8~_R4?ft%һދF"52e-ɒ n=1+iOk{ [k'4bmv0? ({8oOO/r5~ڰ^L~+?.(>ow eQ@.y5k 8 !;ĉ[#5ŬuӰ ףmo: [ޤzmO -伽ďhIO`78Lwު_)GeV$F%1nM9~.eAk_Að! 1|i}ju[Q 1'q-&7+RA#`s~@Bx.@e,Bylʱ(4mۢy![! B #oԭ,S2lUԉ4^ Hê7LM@+ӰQf0uB*D|m|X"VIo8 EOlc)"G_T{{Tq1+[2cջ259keĨb̂hH8JWvO]߆0,q' ak PLB=L )#\#;z(P޵x|dulh-G5pݑc3͖5bs S(u=;zAEzlnV4^BS'KӤARbja/LPѤ* rxi|=0qsU2Ŝ8!$i3twh|N*c\amE˽;4.Йp:zo;+fp8:=;uYMĞY wݩ :UQ!M ʣkECi=S}]8V k%(A;wzW25bggF^KZe!K%gK_ut^I.R'aoxhWʽhQ:F~b`LhÜ5M )JVP{Q ml[!tcUm|ILmP)O {G鮬u0ndAO9.Af)5#ɤ\eb4XrI6+݂^Fhr91ݢ_ z14т:VO2 11-4MY0k`]i rdïj%'f4tRNswoJהw&(Y`cc;@#; ;B&MP3p/0]ځt=OP?ol;,VwRAE& :W#(w1g 9bpWJr=E:KmY5F yn/~oGx7{'{r^ ɹ[}NΛ;{̎͐s WxCw_>`2-c)|ѿP\0/:Dwԥ֧ۖlP*Gs׽C**Z[+7OS?zۧ?MG;{Jg ۯӊ9<ּlfᬙFlf>nfẙFofI:53}ra& `Fz/3$|NRD{п_NEj=TLhӍ~ʚ`("ٌff(XdLdw58#^H[*mW7XXqPruʩC(9 9Oy^1.)Csq4QSkCjSJ~b7з{tYp{b'ڥ`A%Su?]ñ<)yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0021-Whistle.xiz000066400000000000000000000036401506652756400237560ustar00rootroot00000000000000Zs8~_RLr@z{[FloeK7Mg)]I~Z݇eZ(桸hw_iBw\._6dvO%wG%Fö~EJ y5Wc-4TvHcFkNE&A Gt0:Iƽ?Z.E{Iɒ#lhi{j ~pɖ1Yp(Y2!wśϙgqHÑY?rSߏ7B.:U;Ud:ʳ PL~ǂ2`:ٻP1Am^}i}n¨Pɢ*e/\^ Y1iN ^e, >blˉ0mEM BǴ/Iq^ieHF>\olSQB!=|[ĪOdh[Aa՜@TwuE&_O(M&$,|ԻL*xWTe!ro͂rC)K 9&۫NkIOˌUfå`qL0YS?oFw} aYN/&d4Y("G2qKE!&[>:tFIFc =L `0`S^~ۏ^:W;O'Wc~if˚"Fs QPB9 &ay$ja =t4t L N@ S3GT"`"P긛TBBA<ڈ@lU\_jDhulF1#%IuwN%=T]mƩ<Ք[ԁӢ#w [R pY?܋:q'y>rA"x ͜3Y )WP}f΄{(5ETJ}$_8Ts8MQf"sأ$aq}~:5 ̗;ŶfvI2)0WyxJ@`P7gҳ͊\8\n}8/Î NcdͅX˰niͦiB-^Z#"B~U#zio96Ӄ#;B>kd|mɺ~kF<W?+!Ru ΓvzڭW/=0%]P'mcb;ˠ"2ma2QUpF}P˒,P#{ءl\So|;.ӫvKNzqYε;ŲjgebtwhLW7M'ep4.R@6jyt--yƫ*RGZGC9υs%P~=Wzli֧l+\t󴪻*e'q=V3O~4?,훟+ ;5k.;aF8kfnfaFnf曙>kNLi@G.^n/L3$|RHxп_NӚ=]L_Ŕz/Ÿ,O4Dh5TdNo'9+U񮃖ST[z^ЩC1CsD;;Q֗CN-gpu+á`04C|Q"u]VLv|;]0Ͽr7"'%vpj}m <)yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0022-Wipe Whistle.xiz000066400000000000000000000037671506652756400246560ustar00rootroot00000000000000Zms6 _{yir״%N[bgӮ£%:f#K^x~M@VzOMe"P?>/}gℇEmazgc+(Sp8?k@G6yy:HdrJmp2SY ~l}#|Y$V, }Sc>tw|vN;>MY\Kak'fԇ1q栜 ;l= iiT uT"mݒbJOzn`2 C_HrA4mpV`ޣ[a+ֹF,7w[Yff#_iU5N]U  9Eɺb~tM.wA r,xHގ6r)זvZc,u-U2 Kbx2`IB0(7>0d7' V$ H ipGǒ3rNA;w܍éQ׉,/(iȺ(/vˇ-&&jMVNs/'$F 3ւb2*Z,H 64ڛ09Lc qv9cDC $XSb<%Xu c|Պ7-wp:k0e ˰xJВq!h8:Atd4 /-X.K]hpo> dO`lCyK&ILnHR|g1MS5>$_LTshQbL1wa9%ard˝b3;̌4([: eDK&-KSAI09A!&&5)  Ɯ + "vaUI9vL)w}Mɺu+|+F5FXї9H!SRuΓAɈuSA g;pfHCZSjf㝅X> *7Yji 9K4(倒\O*XlSM:G-~~oGɥvL Xbx1֍ݶ]sJ9c^=.DM"qøh}4s1*R=3gf!FB(ꀰgSnZV8pӪ(z8ߩ~_ۏ_~2ӗWl(,\nmfᬙFlf>nfẙFofI:53}z.cߛpz~ŌbJv~@N‡8/pTԔ衚Zm ORˢIڮ)ŵxJHRokzГwVJr4fˉʢwv"/g!^Z0mah 4\&U:{[1ҁ_@w<"߬r؟h?aQ0a+yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0023-Ghost Whistle.xiz000066400000000000000000000042641506652756400250300ustar00rootroot00000000000000[w6_xO)9MwXB:Ȁ^t-Vc3в~F$_iӞ=5WW/ś֖ vv^09:ośW֟#~+V(l /'bˣmػm0tюhKӰuO7A6nƓl8:_Ow`2/kBbBV> =kKMO<%]Fɖ5nuX$4#f᪟ 8oٿ&ӏٯu,1 W,dԿpG4 . 3[DOw褯1M- h-uNrhgRO3sĭ%WQ=ЏV!KG~9q%v|?& >쎠싅[xRHMIRÂ>'2ZtIFe<1!߄ @rW`Z 9D>3ߧȬ&43ŌJY⢧T!d:&PyR`4{uӍUE6TgU?w]"T#)d55 셭}02+Y w/i #%J$ԑ"ԝ:i=ՆֺࡅVڅ8q$n@Gm;Hp8vr![ꊴHU Z{pm,{NXh,;VVn{~.#62~=2ŭ)D-Ts.X,gHLj_qFAcƍ ST=Aq7Ic}0 L^s#o i5!lML:10 F:`жd ZTs(5'Y_ݧ1Ȳ~pE4iejEhV4ve}:(ĺcrOoRVפ:ge$YR}a=AT2EUua OFf MwVcluIg {9o!YϬʃ M|@;ddD-):`%r6)ט]u-{_ڟ܍Gël$R9 `׸+oXf^*uhTϻ'EGBrm[q}u99l2;z !w? _m\fs ay Ϧ"ͫJ:3\IJ2^.ˏU~uOn-'{8}1\j{ZVU:y9 .h8 b?ey ΣɺJvj]1Dڲ+П» []FsCZ2R5Fctmo4ӭ#=LﴜQ~۹̱elbX|c!)qexFvVKxJRAi}>pqPr"ڋFC:5Oy-TtFZ3֍ҸfxX7Jn6c(mlIFڌX}F~7ڇjeG5Mtl9M; {6g^=G;˲0f"֕a^u]emR]lԺ*QWE*h]'QȲjDvU+òP$Kv54Cf ah4U i_י|noN[wtJ,༿k =m [48eQiAs1dj/#wlDy/xXnH )b/Gm'7Zo_{#=y?i}ju[dmd RvQ?Y_t;JraUH:.๡ۖ\_e0t mXr=Ju.~(>y(XvmՀob`uTMb8$.4xU$(q:4kIdq?Y~@$c*(˦يWI6n$v:_|: 5 ḧb{0 gsb_MS`-S/qCeQSؗ\,u i#꭫{ctq5&>}8(4Rc 213t[X w3ZKﲇsT'F4<TKSCb9|e|u˦~BՕN5+Z_֮IH5ZHՊyĈ1(8Q^|Ndl*1`"* ~bBUZ<\㍻RnLn.S ()I)ْ|CQH*q[*.턑%Q)%{HՆJRIUz߆2y9PEp1 &Wy>b,@bA5@9l\)VM4#r$9vv3$7VlOHO,xvHTN-HWavdzܸDF!$Iw׵GG)O**4F&[9VMߠBQ,xPd]*3;op؊.X&!m~QjFZL.:@MzPd'B\$H4d8;eb1JRw*+ -82sxyE&JEc_8.|,&:5>puۋOs]\^Q<}ڬ_\uxA NYG܏7uiqKZϰ'+p4^-VFGMk^ .-U.W㊋YxEJ 7+8Я2W_O 2~5Yt;F 1Q9jpY9gkc>BZP!]qQkkw*/ʝ wIFxR~2k 22=fTk,)Jkv?sF<)yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0025-Slow Strings.xiz000066400000000000000000000036611506652756400247040ustar00rootroot00000000000000Zs8~_rO=jҤ0Ӥ%e. w"-$[cْ!pӇ>eb%~8yYpgɇMsQˣ Wϖ:n_^G9u`~oÿΙC&0نL& e7bQ6S%[. I<7c¾mEu Y@ ҆%gO%F1n@mP+Vm$fCT@!:6@ RjCMCtlAGD| RV%eT5[yrdS8 =ObJ~n'&эqIcF4ƒ 8#ߜjIO =EUB]HaW/UǠ]ԇq%ÔAE+\QrrFmzhu>\,u i#꭫51c2h灻">}8(4Xe0r;fdNb:g趰fѥs'뾔4<H)!s9|exu˦>GF JA ikN܃$aU)ҪijWy>Gd>[   W.US=F{D$G8Nolnp3Zk)&egDeׂtn{(?d6v=IE Ј_aYɖjUӷBhrK\ed K vXJgX<anM;S<,5료꜇+qwDd* v9 =eN=&C kMBG}zeT)O77 }v x{ ?^hB}:bAZGH%i@MVW'[{8qBCCyGMcxnt..-*U`"%q 4i+{eZO!~5,KIǎ)⡆(a il8Aج  1GkqTjgA}|v~w5v=vg«]6 ;T v/]j-Ey=j<)yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0026-Pizzicato Strings.xiz000066400000000000000000000042601506652756400257310ustar00rootroot00000000000000\W6~'Hz2m aIֽ[eK'@GJ+Ov޽M{js-v|]{Ugvl{9{צ!߲u3AiMoN}rySå3v\K7#.Ռ:նwF]rv.pkf!( RMf+֤ ~uBl917\,XЈɄYR.@)C o1 }\]ƔklyAfslc{Ug^0\ΙUC ܒ?zdE3m!]xtAiC4rI@Ioܽ4z&KoRP/#7Ei8r12:gP&Rp;.ʖm4a6$!*[ BιsvFF(e^>e X7>{o 6lSׅ N%ZHM= ȢȈkp#soû|cr#U,.{OevDdH&X!uT ~%mO։[&>2Hc'ASe o$.!x!4Q?1^gk~) Z7v nWoQ RGYTp$ӉGꎦ&E3ͧNs^$h" GcٔNA Hir<79♬%(|?wl.\G(,#Idwȿ7PB[*vHrU4'W^ݲp4 I]9CfLh6M]r WBYcKѻQ^RbT6 ح*uh'H( Zn=RMBZ_ ޿2:IY?O&A ,tV$jkX*_󐓹T 'i3%qbhvjIvG~Yd)|Ns8 #Iy> <~,{ XX,b2Z<uP]ęšs0Yiѱ-u"`tڻP42wFo,n`A&x"(.M,pK d(2ZDETk̀"UVavhPf.BfUɢE#|wT!4(;d1} ^Ob5.RENvŔXJj*eh8Т%s>xqE(2{L$-MΙEdhjy2Iډ,eIq50h6x;Awm^$B&gSVpV_hD͵Dj'Ev024[,;2>wi!Y!!['ňW9V'a7#ЏzGI9ziLX4ZmjJgӔv݌h4+gR oRvy6A@¾1_¾O؜oPTW[txKsBsij?@{6j@3V_669U_`~+ La~+ P3*[Q|lcTo~An3Mss ۯyO^ Iϗ{~ iNih[ UL@GOU>cEUXz#BuN?MBۣ%XӚnӼ^6M#s./X]Wq9Ѹ2[.Cn RF;f7T7ITj}5[h`B/ 9 nePtϻP|N )w6e71$2"V r=M|Z9Pعo.]n*]I(i%G %JӮ]_R4튚%FCoΤ|hro`@+u7||*~0_}]o}E 4?o Pyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0027-Sweep Synth.xiz000066400000000000000000000047211506652756400245170ustar00rootroot00000000000000\[w6~ϯPʺsܪkK^InF"UR;H۩)5337oZ6Ͻh>^4̵O{V'dO7͊a[ łYJ=S ! g> z`熏d9[XUl>};Ϲf7`g֍Y$m+=MZG7^l添ƇF% nyHAB!'ܭh E|ќ<['z#䣴au:׋ ud46y"Ja._2;.HA(U)MPLq'KZ#R^%hw0&970To``$s+28Q3P.wDGۻU/o%c P"ܲg9 )qqG܇1[1](=;ZR_,,-?I XU3wOZƉo13RϨ0K#&qct@'+hCh(6ڂtsb´%}~^|cMBZdփH?ȳG$YBBNd0\txÇ`"%T͒~`'$M6&ҀS4*χrXgPٸNRH'*(ILI[#{Q[ާa(q56%fJ!Ui E] x6Ͼ ,G#bUHB#x1aKF޿p01Nrݚ)` -p2hnWAO葅# )DlE҄^zND5yKVK_TW+lp.BRy)zn V PT)\-&*2n$AUprzT_PV*-D6Z5i3d { Lg&o,d1ubp@0Bm0'c(%ǡJ>$}0GѶ{$yC" D/,k]\*R+qU6\M+&NS~# .E?3PKv!M5d uV℈0w"2w:*sEp*ki`CÐЛS\1;=nh m6%x/Ȋ#S×`z5|ZQ&_×L| 5~638qq) iE4 *esy @@6j ld@@=}ȭ1Qb5@έ@K>CBP_3薹~T;I}W?T(W>k hwMϴ#G_O}@>nW2Z 7zr>Xt4ӧUaock5Htfx!UCjU}OEчɊKg9]rKu9ѥlhq29os4xj^T*v~AlG2r~G}R(ytT}b"T{p%/PN{Aiw ܡx)噮RL|; `d8a72.H=c|"<X*(#_L\dG[&s5Sw¢2.}/2tto =9L,c{"@^{_/%u'|.6wފg^㟅3-qBPxOyGK`Ɂ.:D0#H{(k= boi` 8W)9p nK32Ѵ\k 3g2[r4' 2%ٽӶKؘ{BRa#An&9NWy㠑"첖ݣ-7k[n.Igt-YJi3 #-HRF֦VlFBA [k-VMH`  d;/f d0-ܿ,j1I`f]PRӲ3%+`U NZZJZDc)3 Ud̪Wnw^N$,Hy{ޅjf>MsG*#@LZE@ wjӆ,4錎#on;];zS*[-KÿtE,B[ ihPӬnqB eeq#8jE0qy,P05MAW,~0dN68C.֓GS}\of*eF,^+EIi jk#H:7_BK$,b&_g9, c*gZ${yi>APTɆtz`ρAYh }lZ9<9:k!5;@l8{BA̫{4[|4%ί?ָϡ,z -J*4 ܛez2*'x`r] ::˯i po K\Cmɀ,6?CriRbbnmZ]<`y;i΢hei+qY?܅eN|t9F6?ͼKj5|Qp^1U ꌵjO>%#'p c6h<订X <̃=o":y,5}0LfRg=$~HutZPEm;tx߬luTQ&FUw"EVߕJtQKO5k>F +Άo;N'.n0p/Re.\\ݟ>۟kPۿ~'=G%ؓƵɶsuչ;Wz% -y΂O8g|uHv}Rhۥ+xqkUnrk$8'g:m 8ǸSupWsYPc﫛}=aUUBL[~0^-hAج ZdaD(J"4#O]w'yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0029-Hard Synth.xiz000066400000000000000000000045041506652756400243130ustar00rootroot00000000000000\[w8~`yo B8Cr6,v_t[$n&)~Xd 6myjci4Ë-|uԛ5i9wo7wo_||6|=v9]^ҤwG1 i]< y] Z}S+?GגzuCM|f‡[5?5 &ӈg2-?<8 Zɒyr[- > "l>gc') "?Ր9 f$2X/g`4:``(\Bo?RϬMC֯,]ۿ-ۮ}p͹/>\_>Z5׫4`n.BAPN^2 6W@B.\S?j5bKK&foGgl9֖u?BUsYKvj9+['+,^&hYKc,[<7.]eL?f+,S<n=:Qr89:k/&{hK8` f ߗI;(,WqO@q̹ ŽK Y,0/mo ?;bp6 K>Cсn7?mzYBTK["6qSԧ{8&m&eSUuAq)7)Ŧ#B8P)%XM90C]~"Qcj\cJfWDsUDCeaдmȦ7s/2t1t8w0temޞ^{T7xWzT\C>G8ȶ=&z+UMEzIyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0030-Bright Synth.xiz000066400000000000000000000045251506652756400246470ustar00rootroot00000000000000\_wOAyOM9 iM vݾ(Mm.weK;IM6kfFhf4џw~Z6,]߻lZ?Λ پzO^>p=}4y}ǙnnsЈoO.zKNy7ij&Zp mݺkͲ G7]6-'l0—5 ]~'+q |B ]nuܳ_݈[dzalV̋ϙ55BYy/\у;/ZLWoaU G`4``B\͏?"jL KO[[ߙlF%Xn+QLNmad_C>'u;4UySy~L&:SnЎ*yaɜ;>\A 2iXUMKح둯l(GxJ`ϳ2!X6To`m$wk22\S0PT_uco%fC޶FR!-[?TI{tZo<{A`-Eҳ34#RXdKY1]n/Q/4XkzX߬HFfp_f iےrM&)ӄ0@N:2(F39$`K.'KcLD3Y+~~4Q?G'`x}'F-Tˏu0CxVq5QA "a`˹O؎X3]n1Fsj> 4}tؒA7HIU}/f#} -EZr3i08,xJ. > BF2Hz*B7Q]2vgLu9̋|NP:F8n^.2azaf=+6H]u܀0մA[=yA#<@s4ԒlG?(ZG+\ KQ<*Hr$ `zTSddeJ]e?OC`ZKp"T*uТRMcBNt k1n2Gѕdgw<ëAy̞S{@sC(E6DiJJ5۲RD!#r:}hIH %fJ!yCriN*`/f&x="~h1h櫃d{1HLrA%L *䤒a! РE W[mM>@P 52^1S@Pd*{xdx[n9>XT_%njE)zn T+Xh$*l +-FI'n1b"V6 5V[  wW4oLn-upeɜdd,u䂕$|2 bZ*XmKa`mOƣߠI/ʖ(kY5ѹH o?EIaiC|$*,Wgh2Tk=&--PlH.S鱋7t^r_PՀ!6fds'[;Ø qgYIi\9E=tq5Tn/[i2v`2zJ(9"5Ȩ 2|,/jA8-hkB cQÀԫ=|€5 0x HJ5 H-j6j}^C ⾙'40n50ÀYC%Ko\S#n@)8`@=z7 P#G5 ar7 w7}⨆o\35 PZV}(|mp({ H>SigOc?: ñ'?8NC ǜѪ(}Er.eDrK|9ѽ2TNˉyY/ :iK}ïKx|'aps3C裼ig~;,pu wf<_'G3-~J_^騢/s@Y|)[#_ |=qȗD!_[aL / 9'4G]УP9TOMl2stF>7 y)ςy,1&cyHdI``L ]>\VU 4_<>V*"٨XUZT*\xNf3?opq_¨_eϗ~:)k5߇GW7'%k'm"ٿ>9K[ &+1H:кwd 2G4 $ j~li^YqpoWUrR (D^Y7Sް8 ]e엟"ɾ 幫6sEqPM{AN5 "vnW~_eʔ1:B #cX"{T'4f^+$^aTum@^+Oμψ!U6'FgVNρGG-(Z~ 4=Tmz6q\g.e>1X6cWYҽ?YQ8?ŋ(HS>WK ^6|wu= ,@De*mt&]FU#u#`˞Ds'`% rn`Iߝ_'qT]pw$z8>pI-c„>= */0[Az ;bqTzNMƞ\'jPLz䵄/`m-X>%#q ߫RN.v'4LL4Â&3=+XI9؛]K>@z’%v3_]\2Z`j߮FZ@&NߟiԬRl%tJ5z݂mËV0U^הp;-R]qXD{ vT¿g[P@;Чs[[HԚ6BۂUi-utDD0k[F~]t7ن[ޒZޒZgSf6çŃFiM$dd+S"%Xs?L*jifi#F8Hk˒>'"2H" ]ſCx'.fEo݅I*`K?YT"IA[z!ہ"A9'7W#!} 92Jc>kɜ- ?@wU{±IhanJ>"{~cGV>@B {%fDo3ۇȏS0UOKim5cbAnrO{/l{.bUS3Åëžaذa%bv0pMf4 Zڝ?ZD:DRFp6Vs5frDHw}>n"W*rDPrZa9[@&n^ksp35v0XGP˒= øsQdkZ1GanSmp7!uKr!Aa]ئnInNcGO@ʳ$;3aRLPw0M*Bv b}9 oa}80dGOv) c;Upnۀ);aG K h%eS6Eamdk~6$a[w;p2;zrH6%Ak 6I - yLݒry@Q`v(0&im 1"bn(ufb!IBmh'( d'R:v_9uSr6La07{sP%bUTʺϞSs'*e%a!h ̔\oDT`Prw 8l15Q~)-K-[y@+(Q(W@UHn \f)X7!j t dW8E6/ײjCy9``#C1>g)׀xdZoX K(r(D [Doɮ(ܔ#G+ePyywĢ"&9AOd عMy x\"'N-TY JsoP^!-H: X< Λ2sS>.My PrJ?`сr"9uMXyrA.<`\yZk.<2rR΃Ft9jq)Kk.<jD6K9TrM:8lq)zp6ݥlK9XK9īvj VNt9)ŲB9D"[ץ,:P6ť70L9x:lK% nM^ S 'ݻ6.;(Or)߁s24]P=]6P@0TqKX&s^6rʅKxхr L`/a*@ԇ2@3 >r.C j% ^cr=.=`.hӥy e#H}Q2jjxK/Wmɾi0ly|C7xTN}JIgn v~-p庝HGk *)K bq27ՠ`EܸR^ ?=̍ lh&5,hSѮ]^7 yYEB+q]qoIAC%űTp)Ao`B)TS Cwꜩ%pUx^Ncct酚v%+J‘ơ,kUlZՇsCko/Vy׿ye6''FO vx9n^+4fd !_丬wX*\(nPMsW Ȳ.|X W⣈CAlSfCHj`Uq% W-e"U*q8tMrh l-%҄63 D4t=7Y.:҈SwL`hk@\И `gepL7$H[dȈ®#+Nϫ^<E+I]g!{^8DOZhp.R.[}px_-2b< 5|hsH@2 ,,) L|-= һ#`L8Y6(wPrZ^n+gHkhBpTM`@{$MgV,l#FB נK/i쉶jBGH'0LRn TfrfuJqRaC$rEPTxʺS1ai.EE6t bCU*꼽)eh -YcxJdGRL=QT٣p<1XD1 XjX4 g610:@AykRWgKh)sI|EyF|/dprʹG\IԷ.z=U__-vS?G׈%kRL=v.H%Bͳ8{BɣWJwݬ dqLJ^/vkP]\S6V%L*;NJ6(T O@OOj}AG҆0[eI*Dh] pTXZgr/rQ3hxL w9F3z . n/5,c,|xt;uc둌&UC'pwuS m#V+6 sj*ҁGh%KvSD}tGEy"eK:_ .ѝ*fuʅ,:!VJFzXI v wk/][#@6Q,~ݵ/QztWj*-E!45ժT Co8;7_溸8G|Yԝ>?\;㹾( xqKUorݬi$8k'c_ 3g㸂^ς ,Ky9aTUPCL{~ѰجilAج ZT`D(J"$#(Ok3o$&yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0033-Medium Saw.xiz000066400000000000000000000040501506652756400242710ustar00rootroot00000000000000[[W8~WdNrN' I7g!a֖+Dz%yv g7O#Ó=k-BMϲYv1?m8{bf{C5F[8]Qjn_<m'6MJ8 W Lܚ!~1mi3h:, k}tyNbo+bNĞR0Ꭺ`>D7z5nOȵ-GaY2z%U";$nG6 B?r +ԂMY.)}H f! ?-c:ylY<$bxj&9~|I^pѳ>}j}ju[rpH"escGsIB'ܬC^,^P׳.vm *"MƋu˶1s%9Z7iܩRK8)J67Č$F$P p.Uyl ]pK4\\9,3>S`I@=3pYB,pއbgr-Wb,4-8X(8z6幔h-OG8x84 !Y}֞jDX&4 1>ѧMb!8vryؔՄg,se,Qa\ʯ@\gCPbʹmëє'8]nY ]^eEY Kj JĹRсg%M;΃W鹤<o\8 O!}Hzҭۚ3WH9,m޿Eq ߲=<_&bpvhqxL6Uu"͒di;IC2=ow6u"dFJW,#~ (Xa'Cz $B!pgReNnAIAkP{)Kː7}-FMOfbkw-}'0Z~ T )^6I'j(EIƁFYq?`v=/Ⳉ*dq֫JMV_;$DR'-|,nf0'b섅j:!-I+fWwى A[0zʆBqiBPÞk[,;Mx?ԥMΧY/a{zrP=_76:[˪`iݑ]x~I-'oR~!w2ڊS7i7GFsD_0[pKj<sߞqX:w2χ~zo7wj=W@qyf虦Lsdԍ0t#|63L7u3Ӎ0itjfz xń4^1#WLIr] G"}(6R[5;H|W; 锯ǯEwbK=oRz)4KohR(iiBZZŴ iO85F:4- ZF*Pcê (8Xث9toC~SYlbOzidt+IRf U״i^:`ŋ4 ڿ. y6yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0034-Hard Saw.xiz000066400000000000000000000040451506652756400237340ustar00rootroot00000000000000[[w6~ϯgɅp&{h]NHl}QlklK}X$l쐴6OkfF7O#OOKܳ`Y{ּ O>t9}7\=˚Fw?-R-)5<6MJ4  L!}۸`<͆kE}ryNåKvּ]k7\(` D^ᖪso'7I?O5nhIҶl d$TvH-b> %s-j:%sfJc!*H@e%~{lr-h:^G3 @ /=6O][,ȽE+yq|:ї )y 8W "G2Av3!48X>=o2a4ȰCv%`- YJXRiϻRu"|qKx{mW~Kgj0qMZ_NnYxy6aI遈!Y-(a;s(yV3];%Q)Z2fzn'I1( e0v]|-". #W2=$?UA y-ڥk3}ҁFW:Tw.i*VI\W8ÕaW_l XP9aTc8P9+Z׎[Eb0sNQ31JBɘ 6{~I9-ʾ_'Kbi^%V+[(7—T6:*Usj/mzǘ)/UzI*IAaRޙJio9<(؊ϨXD;P%[G(҈ۦI72=`҃DmW%J>0,p1=H; IvQh qkZߠyi_񡹸qSRDV# G7Xsqѷ{Ta2@`RB- mI'j(%IơFY]qܛ\GË""f2x8kՊvMͭb| "J^jUz"f+1^q5Q F3/Uvb0ƭBbP>>A R9`(T0ys%ň_&SN웥GNsD_0[Kj,}*6R/cVp*5U ~qzʭ/o*W"Ut+fr}zUV/fōV/FyV/-TULːFٸV/1:Y֡i͔?ՊDKQk@}cyw:!/=,g!ك/J%xřzmkZ4r/U8ME jQ6yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0035-Voiced Saw.xiz000066400000000000000000000045761506652756400243010ustar00rootroot00000000000000[[w8~`yo)~N/&lY (X$n&)~X.#8Nژ47|?{]®獗7  c !{DS?]!%.Xx޹ӥaT˅W1xGySЋ!KrG˅9cbx !q dY #"Eg42IDhk"PC'̢Yh"}p#?dp JA-7%Lngs4NxYcwKZVCˇCnQq܂NsrYV* lMZ{qJwhVg:_~pl#KtJ豀na#Fa URFAQV,)_׽'Wt*)}h8aĠDו{It'L'W܁Ҹ-wrhw%摙0:p:2&> sK{hg%vˑ$YBDkTGEXSPFqI:-ڹsLB%lJoEX&1~)9oElɕz;<\i.ryy )6V$z\ymU1ТRy>wTUJR̒(޵}MIL}.<%dk1xN✥~thf9jA\KM+rǧ ):9n 3h3MFz]:- JK@T%G 9M| ޔA(>9j 6)֫S3Q Sɰq};iEyU{DT0Hn -2Ya pJjMrΚq*U [D,N sQNLf~HP.RDɬTiIr8hw"oa~_;e jsk%`ix%$fHh "=pk-VR9ܰ$Dz'YC~W9\+c8OjUzTZn}aMȲQ.:CG\8 ֲ\4a%n=G[Πr b>T5UpA';quf{ކbw5{BñzN;UF>*U_ ֝r/J55(%|\E_r"'̽ӮX޸;N84W@Tyx91qYW7SM|SSSR@/r&ՔmU>jAdQ)[DEʳ5eElZdwP(T[k^=&CJ ٺO )14TB4G:~Fr\ s$~yBӖf aꎶzYUXdq*;Yoϑl'GX¯nyT uw|KToVowU#Zk;Z 0THw 4{jKl6o;5-(VP׃h^-3%kuD뉮Ձ];'V^Ot:A=' (d'$ c{aDoڌϘ$LF%ic3xbK*~dbGQDFJ`lٜ? >:Js _>Tg]lE|͍R XYw?b%wT%w$N 4% -suҫrtm#,RfoN00>yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0036-Sweep Saw.xiz000066400000000000000000000036661506652756400241530ustar00rootroot00000000000000Z]w8}ϯ`yo &=lbZ&@t7#lږI_c,[G҆=}jcF;W2G?<^E˃fq;npѼ.r=OƟ8t1C 摒 wo|G)AHDd=ئG M&m>ௐFd.uIcDKF [_3L5ܝg⻎KQÅYI7&ME $J}$;\2[48eQeAs{䮝KW8oT GEQX7 Ed0HrXؘѧm,/wwiфEumgyMAG&ba9.96<7}ܺmE8Cp, τVC6Ui(P`[ِ+R;@Y+2xUcp*U8]kR@dv?B[ ŠdUPfFقΓ$Y%4"gԧv<^t<X4fDGq(8՜zUS@k^↞ˢ wRu}ؑ Ni`gMYYR@t[{ջa/(Ad)FH;C)'qE%eum"|+BK,](qipն [Pqr)kɎh*q0t{d7/f!ROWx.\4 ݘ,(C0P ()IUْ|CQQHo*n Nˤv.j ]TjiCWRɘU-ΏQ([F 5+>P}ZPnDF4  ;Wն YI)IF8Nn,3k)Z-ݿe#Yig?@tfsʍKd=]מ9:43#&k+Uw|ЕW> -YcJdg[%KQbͤQTY/xb76U)c6b#հh lb`tJZR̗Rl搈yLP9yn6Cs#^K8x;H]mtQdɖtL{i`j2Z>5bnڃoghwB3'[P(!fڕ[M7kXRwkPMQ$@*^m6J(?ϴ@Lwj>ʠ`iCIu$ $ h7ڜF*.&xzuA-D2h 0\o|'ǜ"^kKem ,C1g'V?%żj[5\Pp^/U` j2N>m}BUD1&1FeBHħdh{$M*DTSL*)S~JUUxXC Tg.D.;]g2ſzjc [@UՉRd .Oಫj( ʦdEGyڨ{'.SKsQMwj'U3Sז`yp] O"X^ù>;ws;ùn;!|>lpG%ۯ'+5XWbZ!ߚ9X/ r7{MGrRH .b\E״L*F'q\E:1Wt긞8+X0n۰aLm[^I3Euh j@8PeEƆ;2Zob' bCQ"DyKFC?%7(yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0037-Stereo Sweep Saw.xiz000066400000000000000000000047621506652756400253740ustar00rootroot00000000000000]wڸ򽿂=KHHiM.g{/: `smCw%Kvv婍I/_چ{zy3qYt5~z=ǙsЈo!AhIz.G\/9qu8]G1쐆3Z"qWE& Gt0Iƽ?Ȋ5.E}IVCknw:7"nĖ!Y^%=h6$s6S蘦,`,[/z$ߝ1_NY5N㏷s}p|D,`~mت6O P:]ÿŢ}MSUڂ<䙿?(RDvŤ(6.A{xX#qS֑{_: l@6L5׹TGI׹10UߥJeb¶,rGޫV7/!s3PU:Frwٻ" U`/MGۻU9oXdxllE=RBda F[U.bj yc>UVvj!$SUKKsg$/=!+us|9讏5L@6d廱 6Ä0*O9sHRRX&y+~C#tHnWXrnKj.:FQrf2c rO^@ܱD"zT%7Ds戫*jFkTM!a j݂U6"4'|V(zs^hIU?k#4@"~&L4{Ox:wwHLn-nC9RUy |kN5vϊsQr89An`~e RԵP )5@iO$(U8:78ƽh vH ͔L. &ʀ 9QCр73ݰÙ+S#+|lGfo@O]`P(' qZ% fj4hr9b8{r{HZ/qyV4vёBr P#DXf*+cNHi{^QhW4+Z$_/`ur_)D5#\j~\VUل ~W6USF|=99^0eҨxq̃c"#pT֛v* o>Ƅ'>adp Ok,HХ :AM{Ѿt< PU?Ub־OtE(l[B3E8X;I D˶['(U_-z-ow;;􁖌}މKfkoƳȥ)ZufL[5(= :+g(}F[#Z݊*f{nUjrٗZlA;LN>*WU -S*WU qTeU *X\w;p h7FPyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0038-Wipe Synth.xiz000066400000000000000000000045751506652756400243510ustar00rootroot00000000000000\[W8~WdNҞ,nBMBw/:VmbCɿq,[GP'=KsH;?>g5w{sLײr./nߕӱ]ޥvӦxb;ѓ]>M} {3 ߂zug YsعWNpO>Ctl3agԹNqč3G2-O8G';`s,Gl9AA3C#¦SfJ8}2/ rDM&˙zdtsON K0TH5!u.RwH95>cOëFz t硠B('X-PX^bN# QvB%ڂpfUTޤ7^7l묹ZpfCogB_ӈSܗ2XdCU" 1"e}9 \¹ui}"\\2 sNdԹ^&7h 8` 6sM;X/cfKǼ'8^[Qp"fٽlxO&cs>Bp{5v2cYv諱Cv"5X!LU6"1 43a0з7$r*b؎v!=@G;L</ ޏ'iz.\l z.lQ̓P<Npi-r+eIֺszW|b:lR.sf 0%Y2{dY-iib䵃v0tn-!ʌE^J*LՏȦ @eށ*oW0X0 CtZ_P)譟7pݜcO3qo&d ā{{]JL&ȡ]6XIND$RLK"C؁F:nczDdp8kdAysL3?aly2PF8"%^+6 pFAʰ=h`1Ke<'Fs~달|#,/?z.DD61Q462 ~\Yl:MAşXφkb ex) VO)5(hQzS6Zkj_D,mōدѰl3:$,%/wV-* %]Chh06.P=`gGEiNh\ly!8pۧУx_?őZlۗ-^\NS%Dn$=.X%Yg+%xU :7fnŁ[Nm2QjOˀ2D ) K",2jO-&a#qc^,Mxq-cJ!hi%+KqN_I,N ?;ޞ۳l۳e؞RvL $_<e8\CZTYrʧ<_.1ҝxYx: NbE"Ij.Z"I$CIn) 7 yzgyxjxCyx\ǝ'paIr=&[%Yfɦ|Am% B1]U2⺗2'.!2 YWO%:9dXWj+|5R*Z5_3:$q=L%-$ٖKzнOc@(􎈔C`i|Go KWWS.Epq\J.UU+FӶKUwya]p\nM6L]m8Vh>xj]OMnv9=Am*&cEe\M81F^d~^m x}2PGĘRyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0039-Hard Stereo Sweep Synth.xiz000066400000000000000000000054541506652756400266070ustar00rootroot00000000000000\Qs8~ȉc{/qKlvQ,:֖4((HNn/Omd$A#@|ou{OGzw۟o?y'o8o;⧔ۍv/oF.?Opif~pmumm?^nFl m}=:B@Gz_=qGm|̮G7b|3O F۸SfӄJՍMȶ<`FnýYB#W+8uLy A ?ێw<`L狛OWB E8y揜o[w(YV /M,AW*z|E@ 3 $R.^ݍm(Ȫtکd1jQ}T)^7lYc"KJz+ʤHRjra/P5 Wyljts62]|Dv)}d4,>ZzImm(N1>t'e>v-,ra't+`-s^x| QvSK؞o<.w[yrb8k0,A{`[ߍm5h$&܅z,Do+?Xr|0WLw vv=[ pC2bN]+\Oк?#p1u<}G׍}GˋX g?vC, Xn"{`Ƀmez^LAt$YIvF;-U!MNAUIi2-}/h[Ae-\܌4})sd< !2o!gJ$wUHoD]GtHd5:@C}1vU:$rrhFȁ 9˜e r"Qu".&Fс`B{J MT%xw~)Zx]oҎȾBd_1g+Iuq:]0t=ز)(XcGGfKj %F*f6dg/eOJ0#Ma3S"_t(ܭ%b(]] M%z(hcruNGz\z=)-FwSP4,eS)[ƺIwTDNSHjz:{tI(6J=!ccR mA(hoJ(ƱASR mYBFmJ iئOFicҍ Y{}cSæ t-c`^R(5\JyH0Җ m)H6O> Lc/budO`WeMMcLw.mHisHt8{˭ D~S=6w`J;6$ʑhs 6_ X#-s9Hp:4# cBSn+#icLA4zmJI66WD yohisHX yUaG Iv4j=;aY'ODRNV\mMq">i5@#>1O!J>E|ıX%l">B*pU& W,K5|7I\>ŷJ).nP+Ob^?4IjY,{׌umaI͌uEқ|6W=eyrϳʩ 0M~>_C߳akGRu˷6sYm*l*k!*`WZ4!aBn1 m N&ë3HO*L;PQNC6gIA[kDm(kmZVi,x"}q_E܀po*/}ݩlaÈ%IѲPIy[GÏtrBJics'=uRج,j-֬v.^ 2({4i9zVyEJ/_ZHYwۉ1.+j}vVpzZR^A1_^: ߠWInJĸcDGhw^PXRJj"R,8jF#lk4HQ_Rb5zTz$VzƆuc*pQk!,tjt9~:| >GzME ^{g6OH4>Hc}~ =Az}t0iX-s:ueueA{n7(m$၁.<*}_\!$D,zc#m'l𳧞KSDuX'|!ѮpG;Ҷ+$w mrng!Kn]+i;,$*Wi֚B:. T)mwJtt >*FU/nȪ)^cRtnUEEOG&ջBdm*dH*꓾퐰4`!WlߙѫJ_S85mUME/ƜM8~֊T뚟t?ʷ>ix~cm4 oÎ;h~y;}NnWIncpk7<_m=pv>lm~Jr_tZљ0LxKa%U0`]^2ʓF̣IY~j#VZkŷR>Klv0a9~fBė'  =I&ρU<S`베[ Ϛ= ]E7 LPTDAgvm2ͦt@& t5x,vmAqN;<8O%L۔z{nwHn:۵cF*8-w@J<_V- <~ H D6pŷ)}BQ8) HQrrt#1LY3Gم" OykW iq6?8:P7,̍u#*`,yR0Q!8{&MFȸ6@]ǯ8o=&pH4=2og3 )pJN÷v g&%@GPy@]+ϷM&-c[˿vAX@"Uh}@sH@ N(z?b){X0?Y'2rҁ!j@^b"!gcX3~r)d1V!+ܑ)9/#21?loS$o$#䝜aN)w>B'+=J(vn#gC*nw>D'L\>s;svҺ[c O{PTN')RpAl~ ۔W:0.#|l)$FMc MM''S7&ف?N7Юt=AGd.֢9ES$D6D Dd>:e5V8# $oK`K3>m@"f2 07ʝN`¡"(\L7 +j[xoMPmFP0"Fp#M. ]/J%9B$*ll3JіLe96Վ_'"k {iFv\l\`%31\i[L$}3Jqe06v!QMԸ ۑ$(};p. E%[$^# axďb8ݞ+l3Xn,3R;d^sb %2zCVOɒ7^ybL @4 ܧ0 SD~]kqDŽ[a!x:viMv:)|1 ?H~7{bN&cڔD4f7쏤uo м_Ýy#",4/!swRG|1v K WhWV4HKн\rg) f+L,zɣUH?s7:/z vYWi&暫sYK>~nKQ%zӪkJ"E7W%g]?HRD g=f%DAFeз%әZA 1EbFoD On9ib}nٿ&VEߐT1M!ak)VXc[@Y3 :ӈl3H^&ZaMj0 *)ŋىw}s"PH+s" AOxhFibHlgMaUXݒO S&1) %BN<(uZ3k`t]3^s!> @U *(ȀI\2/dtU3׸`;ןD"w?f>%EbPdD)bQjl%Amw=&]p~)G6qm0+7'Dnuזp斈.1g+Q~,AJYSe[{xp#:_ڥ33RjywV]bݛ1ǻ)~icxt5d<$^c P~aŷ6CGC0$K¼yRTRӻahƉA 4gbClƂ>5AVw ;ꃗqE#!^8~"QᧆO=;:V)դݢs2Pf  JDQ#gs[aȳ3@Զw ɞ]G!QO&[DQtUη-wD? eZg}ġR I-aVBh"Qc(NPRK4ak c~auu^ 㑌3qp/O|MxåxqJ~ z' Pr.Tx4)TV" VU]CxO_T 5k\:6ȑ*Jyf-tslh347{,8s_*}0$'D#+GsH.W 䨥V_1$Zlf}UBT+I-էt1b}-֋9X熩}’ .2z" !KZ;ksM^,;XV7lֶcQmVjkM[}-Sgkc=6T~Dש}B_’TK|j~U<*diNSE{ѓ뎣Uz#T}3uk{}Vɩ;^H6RIa8F{{qZeqe(!ge+:v TBdKPu/~]~U[W@]/YΏG~|٤I",P+B:ԏ8Hyk^GQXUVG5:,/lRXROJD$vjYC7\<8[j=T⠸~R JJzE}wrQRzl&^*mJ5yùL]N.xxήꭒ^&_}M;C7QrUyEԎi<2 * 2itn8;!}*ϝ0 }ɜ^iOlpCJQO#cɓgͬʱ;uj-Еi#EyhJ-,qSᅬŋ9ЉG p%z Ƶ r6{7)Y_=Vǃ.gq}{*ԟ}2˔]fK!s/ZZc k-t9q&rx<Ԥ#rE-Dѽ ݏʓ|,emnqyB#XiﵤqamV+՗PE_2 /8IviUIn[iKTkS)ѐh3x^x[+SܪGf p>)196ֽ I, 3v5xдW+{A\*,Ǩ|F?R?^a4Xb9XcLQQɴ PcsI̍+T;Ǹ#هMܕ#D+B n@ZrhJ~ǩ%]/ͨh8ziĸZOEg2eJs:ۭ׍y$ĪitOsKoRJݙ爈փ"na"ܥ,s O$@K㳥MBW6w%t6XI%X 0KvOP;uL&X Y7ul׎ЫIҕB'eP9vdCE2rt|̈&n 76JkBјI"ZZ$xONU#uّ$!l^r0&zZ7߆vТغȭE2T$,mŴ킰HJeG~Ʋ##T ȱ|xrSpl~tytv*IB= b/,;{r p,.S7i㳶ԽN'Q[@Dx$$˘[p\(9 m0IU 2at}cD/a:S\f$Y;wq 1fބ g.t6 _1ڏSNE$ ~=j6x?Ryv 1ۤVI9fG6l#*r>}RA?:č߀.*՝u OjPmZ~K*MRU;'KM!A<4ۅ[cfߝ3ޮ50[505ŭ'g'染ci]띳S߹ܺA1׌kMrNנ'K|7R  =˽(X=Udօt-MH@ZqUYJ+!WRr+/W:M-]m4F?8ލ23~PG]&~'i<ÛT lzpɲяQzK1kݘ( <\LNBiNK}|R`34I)׼ES4S$)Sq̗q)KdZq(Q(qJ{sQ # [M~0 ਒zd4FPH LV_5-Q_x qJ҆xwwYpAUKq97=P%WG؜1R/!z EL}a%JCS0l]Rs(sB94 fQ+ctyp'|w=G7>?sjyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0041-Master Synth High.xiz000066400000000000000000000076501506652756400255270ustar00rootroot00000000000000][W8~WxN9=' a&g y1O'vv-ےu)B4ӡ$KRRjo?gS #/?{-'Z7ow>{g;kױc&D۝V~䗃n>y[B"~Lh/hb~l߸|ttqzy}>]^vhu58~h-"ׁtѮM?e0ZWfx=κ#ߝ?xȇw/؝E -Ϗp1sY߻O@nwyOCNƀaq؎)& s|Im̪|xqCa#&|nCctn=<~lgT2y&$SWgWc1]I0K>HHc|Mds ;2G(Kc0>Gޓ}IFlaaG$L%+eQ.Ypm"t~}[9Z{&wSՆQ,їе%GG0g/o}w9c#0;G2I"«%O!O-mkw@-Yo7 !| DօSh-x@<}ďy=uċ1>[Wח wvZ@ˋ:h`wgҚ-7znȡpg9~tF!rJ!_ F/8{X+Se=4S]N "h&~D?I)xRd0RtDpދ(RBCt꾔cPa>,\t%9 ,ȑsҊ9L!dxH)hI"D¤1Uф ՝{d4DĶ"KTL͋QW~!(v*dl1=z )D$0bMo;<%SPilѳ#IiE[q=˩FK<##吗I⠘?tȷir睂v'%# E۷Y0#)j<Џú9YzH#t FDMXNs-Yy΢dC)8//K D|;.#f)Q,vV =6JDJNAGܺbίΆ֟7`[Χn 4DA(3!3NE]Ϥ~) AnnO` v&) ɝ/^Z0È'UءY6xSG!J:'@Ӂ=Dy!VR'&vQ^R/j@]4ng*.b\LgA?W`J\~\ ] hmg(T jm'-8$$'p  Nr#Fľ88' `rs6)aTFS "JoR&B"-4Y*SvE0%0RjmeYb5#ufN%c>*ׁu tlFm@7gF]՜q ᶂho¬握.:eSWlCfS*Acȷc?7e SYgQ(҂f'GC3E!-F\ȶ`8+8_ll:=טَ9f;7oSOyVS0&/W2YG4fjXeEe(jN\xX?6X㌄}{ H".|vZ29s/Ix^(hUjvG{һE1z>ee*3edXWz0M5x8,m@hTIm-HD&8ZJo%aN4Qr[ +f{8=%(Ҥ bmsE5hgG NEn F5p>KQ넣Xè.x_4xTBފѣ#m(}V) s-{GQeB N+o( 7pn=ޖGi3{vrڨr66Vn=X\׿{3?&hrX/>~a}uzՀwj&E͝Xoxoa`6@c 0ڒ(Yvfm<ӍgҞj䚵wRfY)85x`Ix2C3S5ged[n6t[뙩>QJO s0X=zf.VS 7k}]13,HƷ_4>hH/F΁t5h3FF9䆽RwL87IآO=^^ySe\)%9V{$(F.` =WF.OGEjWx DS M\qͣZ1UeT*pP?%j__."PR'M W݇_7RyӚIV+5WONa!Y*.J&3rӠ$ .>s_f)m[Ked3jpFc)WnKsQzUUMK'Z+^Nt< &)ٓ`J z9Y&.NxUet:DU&j]P ?ҮwQ9'T)L4^ ޛxZ5R)|u=4KǞjTS~M͛|fqnN@D27UXK7СMZ!qVy9̐ZajV|irz]f}WpLg\/7*W nI(2O:b &)o#+[PTd@)eo<PʺtH9NoVwgx#!Ϻ $*v 8lW~)"ǿ}ҩID,cCl=]{v{EʮlY&fۛOL([q0Hݬ[w;?3X.[DzywmZK77&EJ?(-J$Oky Ut@WWFĮ1WۅѮaogv;hv7p ~-upհJu.mCi:_ī ,{TGJ쇞D 3tizU&rTf6w6]^.+ |Y]Q(lӣ ٝz/y(-9Ж Lzrsqu9;uof w*(t/Md©bqllE?92 $DVv]vDLѮh]]Jl=_$Yİq3iIL4P2K]6B/ZB, }] j~:; D* r샔mHH.\,nP S਽Z^RT𓌔iL~6T6>]DD3>NŦ F.`)J )kT6MЂVw} 1 m5Ft34('mUӮ:(& ?˨8`$Mz: &9]5xl4An;LWmusߟ]#+s wXdn *3uՑ:⼙ί.O.O33*kVubXą8{R-?66SgD=ݹxa.5"i~Q sUg3jvy[qL3Z,& mMr?DkWCh6q@FڡvL|iG٩8Lc띘iAv2b#?hegj ,[5fKu,q #z_66X&Fc+BlKه 3E 5OgFmٳ)1@XD" Ƒtamar5O#Qb0>m0ʰ@ P!g1GFnHzH1?$^ͻ1LuX!|d=d iUL¨OMl b {d\33U}0F+A+#lQ^!!c _l7 Ŵ`+C\=6!@vXGuebu&6+!YG@=ǃLnLT#0 l(ؖ!#kbbɘEE-di3$Ck$D_ TVLZ 1'dO '-z@&*l0}'#PLlY3U&!Sc0:4rUduτeu6E(c;"qj3>sd/Ь. s$.ftr5cEm `lLX(/'}>6Rj|lSXrrјb"s/ts("(_(/Jntde v@~zfl5괄h&=&jsԊ9Ɩ\C:P>s`C^C!zP_Σ(/XWQ䯡? Y(/;̼fQ?ש(ϭ ANT+?(OaX( "F9Q@Blle(F*N5vLfjs񙣳Fgz.A)=|[Rf+ȩQr %ByWeS}2ZbPs ـj@ F6z\(Am r ͶQ3zʶL(y ~3(yFɃ=Q@rX$ـ|tr*U=9bl=lb_7TѱQ0{b #GhehFكjӿWYY*{Hȓuy,.O˪0El|^BFe-O.ϧoNg+r:*~|(FŻ_ڞ\Da"e^vV>TL4fZYiM1ÿ6)~f:;]" FIԝmiMwcV|m~qE㔚)65x!_ʨNq_A/'Sf\~uz)W2h]qFG܏E:>,Rǘ+ɚƭ*6!(Dz6l}w4눇rZ\HeQ0%](mGGW tM]-ŶxLJgtj{XrTZ~ ŽN b6'n4i^Q^ x@'uMvES.7WS'Zdƴ =x O@^ y~IjeJ|Mong#+gyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0043-Fretless Bass.xiz000066400000000000000000000035351506652756400250060ustar00rootroot00000000000000Zr8 }Wh:rgtDn=YnHtV/d]H l2S<3Y?;vs3t>|2^̒_{)V}T ٓw"F65&vL]ʍkx?'ӫ|4_+ N}vڹ\Dk/I1^DctA{@dFW:VuCTQ}d8DW*.uϋ8k*6.4O*Ǧii_9֔QPkIGY6T( .RQRN8r/m8h._!6w2=)fCs/?{{>Ԫ=3Y:BYԼc ]iQlJeK׼, aߥڽ$m7#ORZӦl25J -ٗdtnokfVg!NoZrbD+=Ly@foۨ3)PWKՕiG Zdҷ :O^ b|t4eӻ--dt:k+_h"KQ0SJ`%+G['fCM\u`y"d^lگ*ٴ_hIv,A4 &`Ў05 m2ZP9NRR*-#+lA`ҖbWotb/0Ya$u*v&:QtO,r hv W<"Qs 츜ԊifJ/Bc=D~S[GI)mUC&Yf"*}mo!۬~nc'b:X%5^¨G#qB@G2ɢ~cPԴiK֫>ѭ5n@Tp_k?&GJ(c)|`qsq0 mp0L(BJrYI8~ ^)psaviˏ1˻;ވInwmrV߿ɗ6)qi6HխpfհVl>۩nv[ẝVoM:S9տGh`B/ 9 +Oph z(HeB 9oZ FwY *_.7~ENq =M7gQ/yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0044-Decay Bass.xiz000066400000000000000000000035531506652756400242450ustar00rootroot00000000000000ZKs8 Wh}S֑ۼfvXn=^na$:V+Q^=/h=H l1COm($ ݇G36,܀_u?N:vs_t>?z`r:8~ϱCc ߪKc~ Bڑ+.OWT&+}$⨐dʄݘ1#f!qyx-FDrle-@( c "!΀vͤ.6h<_n" zP2 tMGE*]]3>2dۣO3h:f;#Qnc,7>25a#¡kW"o׬pשvϑPW #Y!`2|teedn ׹W8Xon+HX ]Nma *;B*b!qBCTNCRe0 gAg_ب;- <Z&R|M9<$g(R7 l70@LN"9USUvOVm) /V{^Ց+wmR>gQD YeǑ_f@d|Cց+:"2(./wD`Y2H@O%<3x`p8#䷁,K;y~} o@`yyYuLY. 'CF{g\.&n=0&$ soRBGWLƉ6gO$P5amT Dygc? {ǜ\St/xW6'ZaI ډnv[᳝Vm'ۉnv/ڄS;ї'&߫+ibH/Ko&k8xErR;k(1]kj&A/MVh|Ic E>k7}+˺$;hl0Oqm7󗆯I?Һ=|-չ5[,A~ɘeb IpF=`wgجpJ}S0XeU`?O(yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0045-Steel Bass.xiz000066400000000000000000000102641506652756400242720ustar00rootroot00000000000000][SF~WxyĖ2r$&ɋJX2(%$3=R;Oɘ>ݭ߹e,潇0͢$~|?4 Ǜ7?'7.'?q\nOOk${LRt%_vd"?]Ls!ޥRgW7gzI2"|{9>[ea@f>?'jar3.zZ_EDyՕ3*{R^[Ya3dcFD^8Si}i,ZCKjZ=S{?J=$Ѵ`WU}Ug7W?LoEwR*+:y'?~n+{ݿsqzn/I{s?S4YvߝiY,z?Qt/hdNNz";~D.>wIKz{;DwaJ'(¬wG}IY}Ci6 eXm(n,g;$hHI*Qj8)}{g7(x;(%aMaX9#,Vԇ$Q>hH.Aq$L s# {֯xןo~Ѥ^2 m1pUg<$sF×~"&#M+=zĀLnzw\vn/HtOgOIM.YaywiZWMˉaRYLB/U]VYGqH15$Զ%(vl$šK CۉQvN\v?=9@ kQ{}:7??= }ai`{t/cZBlr{h[ˋ|>KiEi3w 6b"G[Nu+|Vt4ɧ4mɫ-꟩D3?^v+ CwPBǠkZ2R8zƏ]eVĤIfYh_E `H:ČY7[&Fj)"k7Ҭ!Ո˜ɞktRWJ5p\-o VT2pq~v\=SeLm4diͺ/z,2 H}6TVU|Y+Vd $ ~"w)X䕬~+$jPQW -$_6c p+K1䩅yEl/|֥ -mGp;vO!oXYn*KEHK}ZҾnQ|xS(wyuAK-Q C(.őׯXߒq ҥ;jzYn[5l0NuNI$.|Djq}yi&XUNarƤZℲ|kK,-udct :1}q̑.vR17UaE8fhzcr׍cu =Ulsвu/(1p+FR:sҷLhwn:D x6!xNieFHGIo0̬dL6 hZxm=&4FIVWv^b"˴B6\eJ",1͹r"&1 bmIT'vh=ӊm=VZ+NpFy ρ}dQe_C*_b}d/vdJGC: l6Ӳs8tXxaa3@δmLN 쐳GME'䰽tT{aYC:f0VX!  m#c>@ؐ3tHq uڬ"UcWH"tJr}a,8XZ!\|0#EQ~94_9nSƮ=9"/.Hqwt;2@tf6@) TKEnۜmFa2͜ɮ=Yn#a"3tMJ|)@1Sp ;@~r }bIva,8lS.<@:m$T/ܷsLA$(WfמG@By$a`[uF C$72)9O­B'ϔ#q:vlsREاGa{,8 Lv'\\N9-N&b92Qybd)9rLt*HۅS(YK~s9֌eY8g_oߧ K SΎ`U,2N-9tч=nt":t ?s56Hߍ2AcEzogUJ Q;Crd4߶ЊO V5&'7 JlAiʔp3GkP_l< l(ϑb㲔<V%8 a;Xc,85(Eˢe*C5~ #T ("Q (# )RZK,H I9*@YU,V3T`w80]2٨4U#Wc6XeE8g: .aH27 9Y݂*0Y)A5>=z_o*ٓM:k?l,5JL-VTT,Za\G6^ZAX0`U 6XodcF5ǘCEFU~ŎP|v@@Eϑ X v t.*Pԃ緸5ʉpc#*']t@\iwPc{E6ystw|IJg=k__\sq}ּ-SVnn+[8IoMtm]M_j.y8jn5WW4ư1=LIэYq/MER/ j7ec }mow4D]Yf?Af_ ֣_A>ɚoE l/bhKEМ2/N*W'"ND!YҀ8^f:FNt"q eA9l LGov"ߙbe̛XTh<|zlQ7h `"OYd㸮oO>l ?0\+A^㉿6>u7za fpebeNȘ;9 M4IBn^Tm&%@~RbXh 6J ʛñ?6N-QzYϮN5ˡNRbI<8$=wR~⡖AS݀-|@-~^%en l,y\^%ݩOD+鳵XNpf$x"+p hS*V*9ܦ\Hd-}PanKch u6hM|+)P"y&BG FcK/mt Ug;G{LlhvŦ,6د0rhY|r\\um96$wY ,GVq׻@)ldMQҧ]O "A1U<2^ʩF^8 L Y9&_ Np4Ӊ2)]d-5Qܥb$-2[m]'iÙm]"z$lڰ;;M CSKnyлVs`W$4=˛É#…w颔læO]_ Q;s|iB^ؔZ_{AEdnzI kV:S;:kwm"hFRW,7I8L N&ˏDIP%K&&w %14iR2,uJ1s>˸JLɖ7Z ΝrJLN&ؐXNX$RLK-p}Mcu)aw7px[&c rOMn8K,VzS2pi !/UB74 h.)OZAA8~W9;9aQ`(Q0TjY A}c[#aήȇT; JĪqiNDh3g^aHqPܹQ\sx`έ,#;^%>xns>&l}ppk<8g{E>KٗSF7؁GECԱɇ7;lpqCJ 5x/'akj잧3gsj_kryTiƭ{~z-t)fhs)U ñ#u9Qܧ8?/hq{|]W4onY z6fi@+jo"}$i|sENlEW"|̮W:M:(dr#\՗@~uU)N@HOrAg[$r j^T ^q!wmDzrg L^s|CCrٛi`h.32: LVgY`Ib2 L%`.^65[QO<"]Y5퐿)2i[N2S"CD#9D]S(7a|[<ڜcϏ: q¶YBƅ \[&ɲiJ\C:+* Պ.Ϸ*՟oJsӷe42?JÙ,++rj^I*qxjT@Jߛ9tM@ULQ5@4EmP]T?C&g6Շ$4܋ߨQߠ){H<.g2oz/L3QۼuV6N5ۤ{ȺEVQWƺX5֕.ǪtqVu;jۇc `;*ywy- 8ȫeuoqGEC*)B .MLw=_y<:fL$]yv[nBm.Rێ@+7viqLێ[I4/:lV}T4 i=󚇬.u eB}kz@_/KZ!Y_[fGRW7.^z=5|cԜ_1ik~>9`\yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0047-Distorted Bass.xiz000066400000000000000000000037711506652756400251660ustar00rootroot00000000000000[[w8~`yO &=4!]&El˖ eOS3Is77?g% B{giwگT¦GM?`҂ŽKF~1V"M 4@090{>޵qfoh&Ё)P hT%r!'ҒӔF-2OWA!&J_LbQT6 9namMɲe+F ut1~ -e$op*p 2FBbP IV.i`5aLlce%p6I70 TC0E]8DI:NUdR,KAI{ 6ޕ >&PnK<#ak!չj >S+--bovZ2y>HBRWߴACFAQ!ѻPTfu魂HUM'KmZ`B*4<xEh,|GTYfSF7\GwJl`S_JLf=yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0048-Variable Reed.xiz000066400000000000000000000037021506652756400247340ustar00rootroot00000000000000[[W8~WdNr9Г YH$}Qlu/)_"#;1=`F7fbLJZ wflq;=1>|bZ埻(+?W?83 {ɓCc'r7`Km(i> m]rnh0i9^wƽAՆ,rv5 Z3cNȜ;(P7摱 ~d½0 9 UN-q # l H@'O'\yь,}n3LyVY~;w4t֐1C;(~3;Ӏv>\Z-?h4bA`۟'sIB'Z-Xt e{ }aK#3Ǔ&p*u;g^DG¼DNUDƠ&e-8t됐=򍭊YĎ$q+!3|ik|]v..Kb%``, uozۋP^.D <@e!q"p\ъCYq{wͪE\ZQReի:UYkFqs~7-GYW #"@yKy0#ʽB-~- !s  Є o`G;ۅʯߗ!4^lx?RkxU:ZKs7uezEL:8!Gg˄ ȷEsGAv] #qOE^ĩLCzMvϨ*``/-KCDdũLj6V",Y%d!`23 Fޕro(&P)tVcin+bI,bh2F$gkݸpgP*^̦իuU%V. gTi`b8OJ1i(2 opp 2FB8Wh(m}YIO:j>D_o8S]IULy!E8$'H˒4PG .{/sgx=lf]-Z&۹Ʋjgu$h眼W]nE6s:|4&ʖlPۣ5' !|DR*!٭ܕRHy?OИP]ҿL+٩fXW<"s=CePU%ɠZV.rDV$ߊ[ejUq^WYhpH5[#B|(ފMV@M&~+v?~XsLbXbrSj{*J-.p rOӆ=mcO/(LX\s66#U7YU7`3ՍLu#6ST7|3'M©ӗS 6`~d̘/ i`Hpt^z`]^ZqGgTHdho UQW+Z%6[#mALV`4yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0049-Reed Organ.xiz000066400000000000000000000072331506652756400242610ustar00rootroot00000000000000]]W8}_>1@rNwB,_ t$vvfc+,떃ӛ(]JUrgG?N(е~vpyAxdg;0/߫+z^cLrE=]T7ןd?4n@!Lݏ׾u.{7|\-OZ㿃٬KMc/Wgŝ <晠cџE jmG՜=鬚ߗĥO =A\("9<X²G^ %phV#(/ގ;QڑkCn{n>eSUbter]e*$z#9?u[帤%!*?4@AZXG͗_*WAK)IB]Kjt~uvzظ-֒ _aH]8Θ7 'ƟE5!.,\H=;M䕙{IVUjn<`nEO> ypEwJ/>.:iM>:(Dm Ydn i_"+2)gU&4'wkT,}ZJլ/I_}m^?"yIGMJo, z3]xRbzf?%:C[[?4I9Sg ON4rV";_̂tY '$3g.BɜDaJ&ϲ\^䲖~P̘>/Oa߁5(:8JIMUk{GZkINL]WS<)ޠ;$] 3UG_:,:eU vh~߲oVs5Q]U6VUa :B&Q5!]ښ&1n1y=!>:z^w5{ҾVs/dU;iN{lu[+6Rz/m0DZ8TnU+jjj05zZ&&nk)՞hZJe*b<^'h 1#j`-܆\b2 Fbmfa݆a0ӓ[d#-#`0Nmc[F caC ca,1#`00òa<0`~qh503ظ0x0` a<13n F ca,1p&MV0L7 #`0Ɲa,1#`0j& &L 0b2b F ^r ̂X0b F 0Ɓh6g"`0Δ:D ca,1#`0Vڈa, a=)Ne' F ca,1#qwY61:Krc$g>X/-v!`7UC=\5 954 9M2 $%whrX (&}5Okxb39}ЈgJvȻL8Zj Ѐk-2Ghhhhh5NX4ݠm5m5|ϑHeή1Һf4[H9gpXDnmf\,Silƞ36`g1cv\#s5294kdshh52p \ۀk Ѐk Ѐkfv@h5:pR\k\kF\c{|1h5k^C:2zΧqG#h5ƢQ@}oe6F\H\;@\cmV Yc(4n(4toloF F F F,cPcH`td #!( XQOfntdmpՁ"[ x L$(J-&`]Gc7V F M bFvh>{pF}nQep<| d:FhMEOhQ@|/z&>h6@#3[%6  枣pA4k `m\k\kZ4?߈k<P7 4@ 4hPAۭ n5F>pAm. ppﵹmӝ󹄵 FZXgd%ƃJcvO F{' Faϟg!`I< H۴s@͘3v ӣy 촴00$oGKRZT$ Tf+jW״Z2cpiZ&k3*TJRՔ(KKU>O},>3I)˾NL2׎PLlU5l~UgLd7 fYj:Ci^i&zrzB—7Gg[瑛Lb;6dI.bYruѾE-KIKR]c 5D3[pY*o5iqg<(/_o5UF[x} ǑwW?J*ć%[gQsY=6ϢTZG(0QԼsSw qq=q-e՞,#=56B#?ee2}^c'rWߑ~V#>x&\|`Lb#x˻Zf5/Sl|QϬIU790=7fUoͪވU->:j6Z| U?*_q=Rڗ>?y#s ?e w/Wbȣ [iG8r3v9Q̜G;0pt7f-|wVrІ5a-GbA\eS n_9'6zyў%rBxTp4M? F3Y > 4v,3?RuN}9!ٿ;A ֱAE%ѹ|E ܅sFe Df m&ԍ&Yb^0^dͿ< !̓ )t:l4 ]w^^ Rsx4b!T\Cj'G+RC%_*"CeB+y >V`[Sì㳢q|ok~j[xbеZ~Orf@NT08?:h^{!Gj%EnVgo9\^bqrI7`Y[w)Hu|JDzJ#|ˤ_ rF( }J7;$zJL'gèylØ-wطԡ5<1s RG:u3K2!׻< s{F: S|SQ CGyHkeVd4m;WK-|]J7dDX,*Zde M@Ϟ^j\2m%=o'Ff?$ݵQԊBIS;=M?*>4/T͠y^;IfhODU 2E*o MZe|G!\f/Ph` )ԘZuxkD9OpD.ӑYb]KGR*Wڸh(0RRQ.R~#W=Zhx<kn񲦑C'+e9jŦtP~e#|1 |'F3uZNY5_jh5TJvj#טL1P32 *7h.sՌmϤ*Vt!'{1 #b"ZNK2>t ( 9DY_wa<8ɞ z\Kwٓs7X~\.4>)}al5f?1"4PY,EӪ =t(K˻ipd4ChA3"Dlљ(:W]mS&pNKMgIYFg!{йW[F(2-eHet6Um]etzݖ2x]zҖѲBλg+O#8F9mh2ܺEnE[4:|ޢѕ- uF'Z4:]34xіqf+s2:b٧<`?:cx {G5l> ufy=S搳'>zF>L!FLt#n&7}$z9p6{`H!&Id-apw7w dJ]7U\fcr{*| 68JWod׊qႂpcvW W_V,QY֗_2fx!TkWL#tm5[B^xp1ebUvK&_y}iڒb,'fi*8?=/Vx?&@yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0051-Thin Pipe.xiz000066400000000000000000000073611506652756400241260ustar00rootroot00000000000000]rF}WhPHTZ[J7 "! 0X n v|CMϥLO_fo~|v-#? u;^0 ~7?׫otz;ԍ][spcw_ y v=؝J*~L^=Wj֑A/.?ܞ_^t~r3vNO>o7]{יߜ?)d6l%?[ǝ5i~7t Ą,zi2Fi[p<;FA<+כuYu~qs{6G-8 nzTfg{~ǃ/A<4Ny^iQ&~^xewgOy,87_/nڅl'6aOWo?0p&܆n*&{fďa@.VyChv.k");'e_vYDV5֣?qn0 E2\-e)9<2xy5!,;k%Y~Ws)jND(vhM~Hlp9қynT@Om')šgvm|Pzץs?Tް;6JZk&,[znE(l zqb}DYJXڝ/f~jSZ' Y 8f.\FA,̪9V~(g~_~5.S/^%އHE]FSk3{|DO}+M7)mMʣp7EfG^QVC߀(M4GoYýX UQuנ"?cRu UQ:fžI.2Zr43B946vF_INt'AOrtufL~qrV%Kw"L(lRg6RJ\^\6*F?ϙޕ.fiL$ Q,0 >yQqi],X"@*J$ٚj~ҋ &^ݵYJXquy~q[ ?dfXc)DcW,v@FZL{F#3q2͹h3Li[Z[ЎZЊZ9X3ՈJ-Ndl!pF230>W?Sbzaa=f Ǧ-! ##qb0:6;jÎ8B$SCGdY\1n4˒2 i&LR2a|ai6@=1DfQQ!FAtff;!0&g1G,a>>B]3@ Lt:6@';bmf91z aa!DGd>F$;0كdӖ c 1@Bc{Ɣ t؉1@:ma0**C0%e'tȗd  Ha1>aCzCfSCһq l,S3,~31㶬mÙ DEax)I|I:2:%!21iYfx>nǬCvFÙu̱OɴuBkM!F}nX\QFwcL[(OeĒ{fEt#s kHE~jkX(/ FMX 5V,EjF 92(e#GK 4@!r9v<`ПS+YGRAFP?xt?MY0O KhQ#FԼ$-lF ݡ=F >vC .oCinݣ<zP"- 'LP fS,)6$SkhK%y?(!2t(% =x&'`PV@,"6s=q.wHLM ST(7@oJX(9 8$CKPzkd77- yu$0{RΘ퀒i86P@Ex>DQ\CQ@zfcL%(U@pgZbWtXcM3yv@(e5 zF\N^QހFy `͖ _ðQ@rMFyj(o@_O(o@a3Fy~U\Q@.m7 Q@Hn˥{X緍|J(o@6PĶ4*17vm|(7HQjTSFW85:C9u+90F/31>`֞ T+G,X\ц_b3(o5gR P Y"6> Q@n(Nyy ֝TQO?_O?TPng(|>Q>QA{@5OfNA=9SW,it /|r Ěh/vH߀ڑMh?wqFkMߓ.5Hna7.u{ ADt1icJxK*]Qܬv^+*7tu&ڳR8Y2-^ mjc1U}GpVEpfëvE̐E^;M's5q* .i&~f:aS#Gk`+ժtE5UCzεv/MYn~{NӛٯonǸCyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0052-Great Organ.xiz000066400000000000000000000045271506652756400244410ustar00rootroot00000000000000\[w8~_Oib'!pN0z8@}Ql< 6k_e,ْK2;8T7W%݇o֭=svg;Ua1>߮gŗQ_w`?OlR]`w{Ul_7r~ǧ.+(X]>Dӏqn\"a"4EV5|LnŎlAp>7HqN%Mӡdhc>&Q}S@Af:?iN$B'GQ{ѧalJ`ͤC.p Hyɵl >yQ#9ӳ!I f)%;)%1E/!9)%~Wc"妘a~ZWK,]O/zhzL̵27qv>:<ӎܵODwtrѫvşف}}ewEZ`v%ǝ^㶓^ Ɵ̏E0н3bk;CkHyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0053-64ft Organ.xiz000066400000000000000000000056461506652756400241660ustar00rootroot00000000000000Vݯr"V۳Pq9 byU&d& v;_vH%ʮmSam߲oo˅\r쓆~pИm8e?4>t>9~j{ysߤ>ҏ/=it{ 1 M >Z֮zxskiG@4tm]uIQ6:_Lnd KgtNsd1vLkxļзw hQ_TSGMy[! m4~#K˴}fs.?B1g.{R4gn`YO)0愼֟3ӥp?VExOR s`S2,'?X _mw%1 f7qdwh:,q[JM*R('өYk_SH,|aO1r"n=fwUT)@Wyj7x+vq EVIhzw*H{<JS{Em?8FaO]5 =_R2-ZƜљϳ p|# %,D=s.2KmY#^I1^NA0 %Gr@sDGD `<@2m~q$.[0PUe3xmr7 fޛ\FI>4ct WH[L#V5%'qs4j^=\^o`pD`n~͋Ε06%P!T^!"sw֒h.vRNƃaI; &4 { _ۖ%'1Րf@yJIKB4ƷFH{pGޥ8XR05SȶB$Y?.SP; `|x8]hٲl3MBtxZXKʡV>F›zZ8Q&gKU 7xDˣ|s޴2,G5"XhNg0n^mx)|\2ʜ%)ڽ _2o_##ޜJ! B.BqGb &ĈPh #MCtzHCG,X5Xh r<EM$vdf^2GèIWl˱1, e_J(Ucey߿n&Yy<ԓP+f4czV>i+csobvM8*TqƑ]qnHexCm7Yϓ^% Z8O-1sGp,׎2WBW<~?:>{!p#,+8ea4 c~\z7}m"KQ鶻؎3GI>*<."nCUVs )VX]N?O)oX fgWIep{jC$[/ImG -|e P dgkd'd*&6fVDʆ6}IU 2c>֤CՉ$dHI Z8:qSTDHqÉLytT;OdD476ШI-2EȬ2#maG~H Wڶ 0[N\V,8a8ee{Q6) kEY$j}{K qTt\:P`֎Rđ\MqKϮ. #zqQ&_.q.--o V -pͱg$\v=6~KV[ uiJ}s=β\:)lQ_.=](DKX!dd$x6;b \/]T3e:Ղ m'PV}*hF&wĬyd0yT=F~ry6uy4W }2]k Û;uɣX.e{mlA3`"jT+5 cN;$1Zg4 'K8i͐L鳥GV%zl``aӅ9USSD ր*zjܞSg|`8i I0PH3].ۨ9?B4i՟eU~s6'VTǭXgn`YW׏YD޷v]v t|(xBx PL̛ۚ i\VNY-%&@0B=/R+iC޴W`MM"CDJێl`)k{#^_3rN#OdֽL3]ɱ;-+j` Ey7Y'-4칿ȖvHҚH%s^x!]2[*?5uRp6<2wJ].Kvt& .Ԏ Od嘁ZDhSND `Q&j9 2Q@b<)ǴLABK QH=GZ?l< ~H+xdPS@b.ph;: *ω=q'%l!RG̙.W鯕1=Z@ld 'ghd/1ݱ}Ak \IZЈ[n?,4c0mssokddC]%g,tG!?LCvJ:Q!Z3r\ KC8l9jwf 9с E:Бv-#F n!ɊiAp =u$A`;u@s͉a^:v3t3 `/s!A.&K9g\(Fkta^j ?^Q~9{ }IPr)Y@y$ :r;9Ѱ;)rt"/q̗Ѡ/g"J%EL2ϱ²g8n- ɶl 1xH2iAގr Q?nVfO+1hJGM. yx  oIGC" ބ"*Lk(nܑed& jaq;@ .{4E)+S}b[PDɰ1<-Z'"CT0*oñS0(f0ZsP7}Z4ilhA+3nJ&d+.K[3^tQ|db23]ejЕoxA2Ŵ$9T9((΢ ?ww'o!-$'Z^TxѹsL3g3o# (*K@n o1G$sh-K'L.|wrAо3Ƙfவ}$-\Iu-XdкEBGj@໢ eL|!r$/%8̘0QTճƝG3ZAYHLF*[5*ʆXd^+mG O"[̆H"j Z?ڛZQIx&( ۾B]J{%Mړu)T0m/|ٓ(ǟG40iclѦnFNGu:'4\`͛Er9fDԉ5- ncMҿLۄgOda[6Oaq2: ';d,Ol7hܰbX `a39tSS懠D- k@:zjY=dby j8N)  %+yv|3 bsj~l%DyDͳ?mi|V{o_72h-bq3B(\-Y )Wn>"Z]x u/VRsSytpݰAl9e.w$]JgsfIDznZ^" 5n l GPrh'`EBO2{nrHhOg2_\ w9%u]Ҍ9i+dn//esdC8/vB:H#Yh ^x} ]*OUΩ\$>u-o -F_Wh` a}$Kώ]7U"tLDAHm7#B_eu&Faұ]G }Ka$q>DGj5Mh{}&^b*&-ǫu3F jGNkÑk’ CJV.^6r`,Z5Ev-#qABqp/Y Xϩ`mS%#:'@̓c$~IV"\(򋇼+h1~=yK\IR2W&{I<AsScdp;GD%fKe<< TG2Y5I )$^`"[ǐhfJ5JPB.af;CqՒ y%r oχWI P:CAfGu7Q,# ,Z+P]%sGQ4"(.&Nj l>ET^,[JY`NFa kÃĢx<2\TeNA%0YB9SRR*>Q& -NE@Y@uIbҌl`…|s{F%&3\á]6I:ND$SLKCufoO[r= sUR+*>:Ryb=j>,}6\8bGRuJ#[S/טU7XfJOʺ{n U37ȕe2s5e3 SQCK ViwSGP# R\SǭVRN:jQ,s]snL2}ZRgג kteh/ZN"YJ)٢ /@TS\i\")\) Nʍ/+%T;ȕpjK~TJw7E|Ro+tQ7ǝN ].w[hoZ߸5wUsU 5 vg)x!V۲wD/Gc5մ oHAE_͚mp8mrlJfO㶜d[>{7ZRFz '}ZOB/īMJ[$Mڒu-<*H-Ǻc]ˮ뱮eXyc=ֽ:Z54WҰWG}uG2Gצ҇|ߣ4!RZ9t[Eit ]RK/&lJSZ\ykԥ]kNz\$|\%I jvqǼE;.I$3lͳ|턹eeȨ*ΗQ6[(oNZ:kKǠak^]3zUv:,sv/V2y ;GjIl폥v.}]>qY 9HCP3.{M } ;b]7(衅ǿ5Dyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0056-Sines.xiz000066400000000000000000000042351506652756400234310ustar00rootroot00000000000000\[w8~`yO!!$=lBZ&b pkl֗4_%ydcHM[?554}T]R*H@<av{tL&[Tt6fɚ?0opĂ4/ͼVK^$^_e5;e7n6,3B{ AYɜ1 ϛKr " Yp X`Y.1Y7 8oVfKMh7!/dK]P#OZ*/xi/lP}Q@k}cA|GZűYhbeIlg6 gW!XY6xi&E,G7 { VB2{/|SYDs]x|Q븤ʱM6ĪG%>nwLH֎nСx>5L >6QqufYz2ťI -4\Y-ەy"FpgT]`㕷RAKMBC Qº}mQa%Vz)vsk)# LWkeJOF/H `-4;'Ad`tlZ9Pc$'.䐯!dt|^ZdDՖJrR(xk`CMyiѥC3'4)Ll|elf9-w- ᩾t!NZbR:cx@,Df)&b= 8HȂ]qnB09SjfG;`bw PYʮGi:c@CIIE/)]h+im+hiC\#WǥUuu Y#<0v#NFnڠ>G6K`u'tzW ^ tY oK W _oH6#׿\_&%%ŲrmM$\ڧIZB~'QgBEX\RT" %߭F5o(J j\#`^kҏKwVҭJJ#W>.lKU RT]SucԞwOU[任ɯwStpMuT)C{z\1~9/ F! mo&FcƒrVNL,$1 RU<-5V?`;YM?N?VNb]^ZURKM_ԕRU_NlviR%jziQuWj4}(& fTLiްrh ۷Z #2W4JlਬXpP @?wLʣJyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0057-Soft Flute.xiz000066400000000000000000000054701506652756400243260ustar00rootroot00000000000000\Ks8WhuSFdVU)-֖ͨE EjIʉoS|` )I*Sx/[L]㗳nzo;Uwfqx?j0kیL)czk˾8^GOZfgaEcz{svl>],bۙy}[{? _CjCG'mr|7YO[hk~![v|œ1L88݆dGxaԋ*/!4"tǹ `JȯJ1 ޴DnϾcQ6ߔyj6_&u J0VHD^s.Qwݟv~M@_^~A5#m,73{tp ʢem0l^xn]oiӂ ڠ|.?7'w~=zKx!a R~YO%<ѿ,OH=D>gIc#ܐ< 🀂s~h|w;[)ugSLc)[?S׷C8C"=뉀=K;nhC,!t⌞`{EӳGÐ<~.dar`OrG`Hg؇3-4>LˉD `^&}F[,jP[O]ǣ@q92fa>vsץ1+gtSJ]K)Ttj>f ìa4#Ǟ)tDdī HA۝D{)QCM]S9&6i^ОAeiD^?ObF{1B^dfRRDL~(ٱ9F:x  <{ vpXkH@PC^1څ%!U3X 9 r PUcPZ"C‚<tv 9PrQt2#Uhҧb[?O@/,<R[o`1\ꃰ1M>U#d3M:35H"+y4?%O] ~ZK^h6J(<vẐ9.(/6 qd Jx KMnNJt:.Y\8TTDZ*sGQ"(&N Rv- c4qFd5Z!|$|2 x2~HEDSsP)3P"ebs\4Ry#~ˋ[3*KΖϔs![ᓳauy# 䘶P1-I|F(=Jn1]ǻ߇UHky,%5962Es6d~QbCޣr#\P֗xekIe @2(ORbR^jB<2+k*Jy1gڒm^ublNrki\I1.y!q2"BebzgI J},)eZ"!LbYIB-e+U32wT$BZ֣oviXURUĬ3l!+)K]*2IYRzRR¨MZHJp ~VbIeZ,_-/Z!8W%n3  [ڈspvք#pI ;!?k3|l״ή&٦&/lj_F'<d$5c]h4 Ϛ)jP t終 J ByUH LJi('srvxy [>i)sBu펝2ŧ8ax/ 9BOFRx^bM;WJ^ Gq([is\qս^ Oah[^ zT͆Tjp,p2%b ""Lo[<t .@C+CCu;e4u!Z zjmU[`Kї(hK*69 3mݪ0.hK*֧X5DNKLʀ"c DP.D_RT[BP8E\U 'u 0ۀahKJ u)V IWpKm*AZ_]% } Q7ćZZT }m0Z[8ZuZrWHkC5HjG_[LWiC[iGIgG5١SX߭ }WUins+֣SUSqJks)%FkUCm6 ϵ u%*R6*_X8a%}p}J%ArP[dFk zTg} *ֶɠg|s7UϒW}VWjֶ)UEa sˮϢ2 \Xx*c<ɓ[mxj%IN8\o S{']e*IJ>@F|RYW)@,ⓝO4*SU@VQvK(T5+!;(-̄lYΑ39yf'G6̣Q^u/L6&DCp"{ܰ΅#Y73㋊Q7fg3֍lFv݌u#o:jS3YԦuZ鑾 F > >L:>@3!NȎ$thTm,sQQb(f7 |۸[yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0058-Warm Flute.xiz000066400000000000000000000317251506652756400243240ustar00rootroot00000000000000]WƲ)xO@^+gNXg$'FKc޶̄韒Joy58zmuW_N;/|Mvwwx8EO/?|ƧI@_I.[%./nnN/o_`?L8?~:=[ɳ\#:?/twgޫݹn}BO",+y+U#J( ' (^$$i䇏Pa-2axS]^~:Ͼ ޛւo|s1^&{y:#x翧yNog:I8ם^>tL#8qda1uc6_t%>B=5l}pa<{}\)Ov . k[_Lw|>Oo4b?ͧ˙r |~ǛOaϦQGd X. ïִiHdȟ0X}<8bRiS*‘eNQ9evz~U?ΩO}3wFm>\^W4*ir]Lכ?Fʽl5VrfTN府/4V(av/<]kjX]ZL-ZmݴfVnqmsu1(ucpC6HmToꃛY֫]>+Y9҇{̎fzRW7o+|rH>P:ֻ">$G̻d]@KX#} XF}Ve:hȬ)gC5(J*\GCmp&&rО5$/f [c igwLcbEZHbSAhE}^ Fk<[ t_!3ZN-H%h`B[![#ͽHsHOFnɮAW#F tE e$~jVII|O[rӝ[sU|hϭyrOƺyѝ\7:¨t)m{ ՓsHAjN٦.R7+gq'C%8zSӆ|wCo˼^nk[ 3QG7ROzZ]?t|KY2jǹ !;0{dL܋;;kO>4>6cդom]$ɠ塿A&&-BmkmKt8M=,ҠҾI @;4M4wΣ zX7M@;0!0ɠ0c zؑ;v0ڋv O6> kO>66̈́_/w?٤$9dҀp2a$kr=hzK`IIvz4 zXd~fhUNr zXx2aF˯}WO6I1a&1 sIÌwFvi`5x2Lߙ};6EO6,LL_`'%'g=Qzgco@/CYF鱩 Oζ =hoA3g0ACk';~ol10͓}3z(>\yޱ|cA7gCߘ)#i"8dOA_F6c{ k3zoiGIL=0 YSW(HoFKhyiI~39}4u z[w#'znJzo<+4 z4hϦe^?[hS@q|S w%Ὡ7m&!՞mޤ9Ԩo4[R~:0~oG6sB8{Ό D$ <|ƞJc}QbbȽa-h6@>Q$~60*2yqF[޾iՁtAY`ns[7\p(nhz C}hx-s=sMQz*50nzh g?!d-h 炂{r=s@[/AT31cnljh衝2 mvq UQSցٳH wwph=u`D;4K/C;vZCMG;C;9[v^p6ܧ2~1n:m#{p$=q}@x8ȁ(Q ml{h,Lh|680?980J*80-=q.j=q`PA/)kmЂ{\3==q` XTR}}Ëʢv;&=s@Q'b` ׃;&Z%dvZ|&\{ziCyƝЦ1vS vgø"'f[%pr}gE)ów،l -HjdeQyWmAEJQI& eWg=̃$)KJ#ҡQ=RVﱡ`sELP:J?Fe ye@:qbZ,z_/Lr5aB,Hs( JANv Q4)[Jݢz˽YyXM%$y}>T %,vWXKX/,.،KX]lhykY]t-Ny^B#Itι!fXncw1o,TYhFKub$yΎWEۿ+cPsZmiuZ=Oh琛DֹۭEͷFmJWѳuW|]a%a_ rI`B[A恐qDoV]+Z4Z̍bp{W$y}@ڿ+4FRhM zC7AB?,.$(Fv){&rR؏ʼwP9ckWxM&8 ͛LsTfaÃ+|Ixw[M Vkkvumkq=4 %wP×SA:TlPTmnΫW2{Uʼ =[&4ofaQԦir`v\.\e:K YwEZ*krxMcӫx JBgԸOon+K}"#AAT8"=]·6!%v7\j&WZhM62 OW-4>M}B+lbBz`N5> E Lap`5Hp`-ŁE&8"ƁEJc3X2{<=F&N 9(W23-h΄h-ԅ;Zꦐhպk+ВU#7z6 }dz72 `OŠBbpGbRh9rar5F-i%hnauB*Z`5|q| :>u|0]u+"rxخ9>Xm`+Ч>9>تb&:fS-~ Gyf>e|\11gG B :.JR!undEΐF*d9nJ%rt2@ͽaHaHa,ϑ^{+%f)̑ J}h"M`)SP5ܑp<Fɫ&5Oe)ʁ[t,272$GR9ּ?m8R#9RgDc{Jd0{n.IV5?ga5=%%5ᄒ7Iqɽ<rj*,Ԏ֩H#,̼~ ǝw,L_Ϋei}8O>c dGK*y)q GC2F+&4#L mM,+QY , 4o/W|rx2/F A}ɒ9Yb :0_rFSWJ`}tО' g$'HL @*yhr;T+IW -uf*h8fbH udv%C$u D|"LCd}1G tC [ fr3n1Llq:+L]3ob32dxH6k,Cވ ֓#JBUKf e3|Σ`l! ]nBp e B2]F,֥©|2˂lyX2aJP2JY!;2|uK4%'R4 N9u2xdzjNMu6^&:لnNM8u2g:5kWM~=n^5d 3-4׭a8 u [X!~1b+x;m;@9@X- L'i*rv_$Ga5^)aAy,P0  ,Krp0s0=r0%?q ~ii3##y9v c5ˏU߆̐J[;rߔ: gxٳ(F+;}4ntz{zuNhkCp]wX' .͝#7a4qLjCNs0SRd9Z(zLhHY MRX àJo_) l-s0sl9@6է,LU'p'Q<]Ҧt mMTPqe1V A>M%@=r=b++"xJݳ7dy0 ,;C=oۖo~mX+%9K0Yb_`jVjLWF' 5D!;ԖpfUb ]JK}حi6F*}bU*",X 0mCRbS̟V 0VBP~ Y 4źh9t342!mtJ -Q@AgԜ$ZZ"hyapvsU ظA,vS@jbvńyؐB,7+@֮R vż+a h>MH'3sk\ZdB kWn$GU %̳])a4Jb+ps@*XokWU0AFm3Ychd`9FX qkb9Fey^")U.XRh$Wb#(ӹY bnȇ-ڼKw0u4kGøQ#o#,q0sZ 8KaB~]g)>g6(d9KY D#1#tlFp0s0?lZgQ,J{pP}ˢ M]d+&eM (hW@2{bL(btj[W@`0beBG"F|0Lʐm ]m5Q}W(b HȐ<C{b3!TՎ&"-C*-GU*m 4o"Ӟ'6"3 i9+5Œ.79)iQd.J1ݷڹۂ!@tY VA)mw%y=U8r^BغI"%-iw&a0K$ݢNJW/\HyϞ6Bev9iQ~'A+//q(lX=79 W>a"*dh>כ?,U]58HKwD1GbwEAXle%^j[h<)?W?{W"Bbȝz1 ?iЕv(q 4HC\=䅉,(3KTXl [ $MIPb 4%]iarRhHE'wB"-g\b F+eHVHH{b+_;+a1 ;3D˱%-r>_'f >ڷ2h|XHЊ!r`Qhv`RW/Te!f#\B{CL؇-Đ(faLXC ]he]9aGbm<}}XM$ڮ;-[C.iؚŚRfb#CY s0 :HX%rAn.IJW͔lMr0B,PNHݵC$DׄX2-W%0>7߶c\$lwS_MSYw>~[HU/hzD% a6ZM1)K !ΪG쯅U$Ɏ;_(_<3*PϪ'ph ;=;~ů#BT[d|`Ha}Ys,4MUSʴ9[5+Rh PO VlWӴzb-}#Znv2rEBnлBZ ilA+Z B CePXeI׶@L-D7lM˰x؂Y& (kʕUBbeŖЌA kXMv~{ck6&1{z5 FZ{.+7U/ _ҹ/p\:.΍pK熶skZҹ,p,q$|+܂Cҳ0&kXi?l+Yѕ<#t&XU,X2_ggF;aV]*ĝ[_qir&2m mlLmw. '^'O'W# Ϡ'7Y)ۢ$&lVi1@ܕy/,4Қ/2i ?"u\K,.%$ːˈDȥ1Pv-zMla  D _ՐgPdvMjd?[eLҹnJsyYGdyvg|1zFf$c?rܹ(g>$GS8_M?p8oZ> ɲxisy·"PSRR0 }'\#"PILX ;Fx6ղ?7%E&ùQ~v7^> kxx%!`YR\*#^`l@X$1LE8B7l[o쌎.1Rϗ ?e-60u8F(HBQ8u7Y*!d>8ݡ0pX-:aDD`YMcO%=K`p83{Oc(~P:WG8|_H5a< j=Fe e|?a |1nE7@RbZ=%$<:U$:p 'a('aP&U[ J U.a x2(U({fe+]A:B+\OCatC9.y!1<1uW .9u7˦5k2|a BA/u!wTݭI4:uZC 5(,pS*m(7AԐNt\+0%RшEpoгͭI*VI &'RSj`y^Jst%ީM.3}f<6I2t+ND/j߲׌4uHPLm}㒗䑡 ]0EЬd1Gk Rzи+MΨWj}m W[x亂u}9<@kh!U,62-gdqslM|P3=jRv 9vz2e AKS p"}<0*OɁ|eI"(t$iR0NN#R7C:matdϒ, ~*7޺k>t/21ZQY1vp\@IǓbRe! ̞20zo 陸 }(|r\NkR3'n!15ŝE<:N=aZ*\K*öl. ,T3 ᩾v)*-͚{'c:[ jR?GBJ ŵ[!Cyם4iC֤.Ѧ5*/( Fu;ͥUwcx_>Sػ'$S3+>ڔ= KWѭpNt+  Dn;ѭpNt+̷}&ډ~=0>hp|x4_1 WHC|T~8!,X5Xիȧ)Ԧƽ] Rc?˨.%Oy@OSNq ?9*s&yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0060-Beyond.xiz000066400000000000000000000043141506652756400235610ustar00rootroot00000000000000[Ks6W;2G8b˩JrHfB*IQ}$H\CNILJŷ޻ߗaQy~sX,pB ;w·{~_̾Au_.M(VT_үatu/HuxE9]'NB7 [;0pt5g¿?r۟od _V4d%Nİ}Ɇ߼x [d"q,HX0GH7(eQFq$6;olBab\yj8&w7ь[}C p vȶa?Ueru)t}>[=+,&,2 vej" (}Yu`}}MBip[]1;I7l;tb\e花9< }y@ \PM睃4BaY gnmT.e-u"(!Eol["v$,`Vc(fKP}w qK22TV910.FҘЇ,-}h@ЖGh懎l ?Ebey 8'fc2ēVvR,q2*fU,x2 .tL߱4eSwVu"F #1r;͙DN J/Y=.›!QK f\^8;I:jptOk~18Y(BK~nhR\M F_L%˒u b>CNqBŌT$=U#]s@GϕpX*ntO{ҟܐp@F'12x6y򪨁Z7;1ƍ#$OܨZk5~LQPƂDlNvԿ(U0rWFG( \;=UM:j{4)͍ V~v{J=s} d]]t#Sl2GхR}u8RrKϷ+K |0}5Ӌr斷%oBF@'dy WTKS3ѡOV"4"< ~uR9vۍQ)^LUɺu+|F:v>@npp eh7O);Kݯ@(5M#+eD1LyR u o41 S^z’b6 44yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0061-Sweep Pad.xiz000066400000000000000000000040341506652756400241110ustar00rootroot00000000000000\[w8~`yO ~N6!]&EPkl_$ylsfS?G#i43ŻVc<;i~wl0pLnߝ6o';͏g>r1<|5^]˿vLPx}YЯw4n'wq;[󽦦\oSqCC uw-GnuoKM촹dMNQhasT[Pرy6g̅0?Yh͚grj|r̙V>\5>7: kX4`^QcY;3EBMr\)1p bXυcʶqx&.g;'7O U bf:Ε0Pg!0gXոE_2&eMUڣ@su& cGѪ θ{qA_PT* h<C2W?(cAX Ѥ\jࢩ! %+U#dD79Ed]0/6v$ped%C㋔2 s-ģ,lsBW\<isjx cB%q.6YDdh!~@ MCux3,F}db6(J%/hYG#]>^ޏ9Q5ms\%y v_"-PMJ6;$lEƅV~6Ry`ZJ2Ivoҁ\I'(%}TAR[$qlyN}=Sإ<r>9>Ga'.  ]@ے&A]HX|ɧ YOcHj 'se>Vq^6 Ƴ8ej6!+,X9̸ $KOW.q  zztlmiw )T`d\`%!"&TJڑgvvWjΈ"jHM%ƫK.T#uT1%E]^ǎaɤTل`0;)\ _N0Zl^8(7I ]bsd|&9|K&3 fI݀$dAŲ$8ĝ;l">nop?2[r;SZ9 W~nn%JF29ftf1&; U'1 #Qk(,\>mg<"L,κd'[, t]Lz5 p4Ώj8?( ZǢ x|hk4S4c G*8Rj8iEܳѣ#|jhL5ᨺپ1rPjhp!krlOGǸ5;py{^ GS39zg5rY}͎]iXM@zswQ~MUѰL(FEm3|'E%~?8xZç5?zL֖wgMms6_MqpT x_0/ db~"sʃe|"E-HHw:ʑ6FUuܩQՏr߯h/ <jGyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0062-Sweep Matrix.xiz000066400000000000000000000042531506652756400246550ustar00rootroot00000000000000v8_H&=lBM aD-ج/$˖䑍^~jkfFfFihs9kϛ X͝j݇.G/gۓpv۞M e?%5;M;ї;<^ao SqKE Ft06Z{>{7igơi ʼF'9bd9o]n1ɯ ¢ 'M8?o!H#c _>b,d|h|r6>^7>7: k,hp2'#~_n؂e1gMV.|5Q"t~@o@92QfzR8; \+;S2^h~"r'ȪFQ6dFMi+ezPM|1w[)jES#&B` h-d5Z@6JH K~,g僖\_#-}r3Dׅ.P3V"]:WLam6̧zNPc4Hz0rYA;`N0Y~,5]:l(IfA PŌl@JdCmS[߻(2x9E<:ȞWpDYE{5+I2*d\%کy84K^9I:>&Z;~Yk#mIR\Oƻ`8 975cV[[h_R?$qR@K1m+ $I"5AnR`hw&] ͒ >RM/IS'aoxa(粥z8G~FNoUp]>SidAYM.ZvF~G9̡eeq .j(:,t C~iaD jE _^~uw2H]!CP~HmcKޡ2A NAˈ)IVVta@o; ? ]lQv!wGVA|.+s9|~Ԧ$x2 bX6;ǀ ߌ*Pdd}stn%39JigO6~HPOl5(M;O$Vr켑(qY t =EyjkZLeA&mn#.RP${]8$i5B. ߞoX vѝD] (49^W qC%\UQHҞ-`?UR8+{i]Tʴ Yò2<$]d|&J6XM J[t%FW#}Rŝ>};21i7Gh~D}G%a2wʇUb zr6 VWBL?u\:~K[Ѥ HilˈDňQ:bֈ*1❈؈D!^ZaLbܨJzhA| ޫʪ̷{e" v.cO_bomCyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0063-Matrix.xiz000066400000000000000000000041441506652756400236110ustar00rootroot00000000000000\[w6 ~ϯ:v\i%Nl[CKt֦<]x~E@R.tzjK |OEc4>5: k,hbPKU2 ::|et#*AsEϸMWA@A6@eL>?!7TEx +|0Qf0u⵻?LоWseJq|oIW! 1_1](+;+K ] Rtcr]rsÕ9Sftef?c|MVjbD:<%Bstfz)x2p8ׄ J#ؑ\i?c?`#<^}`567ۘic4 `?$#  Qb-m)X BcN6BRF-hJryL(= AXʀ\r!P?m!\d(>uTz 7VB]b:Wejc='l(a@ 2ό]p=jV9xݠ0'j,Dn٪JY6nć T7y1#937gԒj דqE&=]f-asyuyP*4q$YE5-InTգeI+'I'gYsjeᮍH]dq=G*bGR,^&еY|qod] BfDdGx6OFPdk4Ry>EzN9SHd Ҍ+ȶekmyQkg 4v %fJ!ށ ҜOy@_[M) o9\lj̗;ɶbv!1-XYaP#'Գ͊F@ٳM.7ڡKAFKZkBFF JUZj!TyD`Z+:ql]^$ͮE)V Pɰ}HkqAdhÉW0(1n - @?iŐ:xyV1gJr"Jtdtb2w<_6*p% :H.'00n oGet}{(ENDv #4hwuG%ufpUi G1> ɧF3TC1 G v}TV~ a3̷kss"_J1h/-_at4[6~}Jԩ隟~|s"MKF &,1;Ⴋ;-h9YRWa6K6K&m=Kv0kNq;/BW$0]N).&~s/=aU gn 7 bв~JUb(2}()N%I8p:TuotzL~A(WgN7:!Dsst% %US,l8sc}2+{K~7(e|xM\eY-IJ;Jr;? ΑZg%+cNXAaSG; 9+k)O< Q򫭞qY Q9!bF CR]O!U: _,+@ ~e|iFG8Pħ;D.g4U)STvT2l}\(>ZQD&Te΂A[ƈPhRn.уyU-VAyso&'s%ŒcYԥ/dA*Ŵ$ P60nAd߾>!k p.srne9ʢf%d c NS`dB5/1w}pg NŎHG@b ˈ3yyvTP`xְJdNmz֦{rwyN奇p<K]Ȫ#Õn-'onQOuKd#"eqg^)Ww7P!~4֯ԯPNWt5u>TU崵y/靖F@wSNԄߺ.6-޲*lH&G036%c?zO~֎<}h|e(2>p}'(E3EtvfS[ƶ]Uj۹kO{P0l,NLJA|0q. :b@;(r:F6{SL97*pQm_'RSpN UC45#vAL7-+M v0E\2[\l'VIUOtrZX=ѵʴzkpD*>S9}zaz?m~ŀlbD_1$/iHA{9wR衜Iw#E:v#Bm8E^(j Bނpf|>b =w &zY2L F, ز cZTP=hfeC %X |*7%˭Ǿ]bD<'e9yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0065-Ice Field.xiz000066400000000000000000000053211506652756400240510ustar00rootroot00000000000000]_W۸;B͹XE xYۡ~;%KHG`Fh4X3{ղHݢw\};;;j]>]Z}3ܝgϱ#eq~{+o?8iwOwϽ>I罶D1vjُͲ 'W7j߿ #r=^f)B3_cPu<+x?U[hx7ZJ[,6-3r wDXɗ (mIzF1gN'03F.)( _6bsߋl% ?@+7?oGO& h ]?};)P"y&U[YyH]tip 7 ȫZl +fBOݚ  VCaqp >:_n74ZzZ8<&E (>=h94+'EMGx@c%?-m̛D=,_2:&ۼ݁J6oX)"VyD5z\PޫP cט=)cȐ5Is0"dT{v3^MS?S%x5>Uw  !"YDňҳk"TO~v"#rd8{Q$|jJ`M !z CjZe{sƐ<?ghB-BW$vFE] L2껧b7A(h&B9rSwePwcz"Ҕ{*-D6ݓ#0;e! ~yrͭ(3AS4z2o*e؏chtNK ;PMo %IApb;CH`YjY؁9yX+2%[_@tB0N%& 7EȲ{$9H$;O.r꼭}Û˫44j CmpqEfa@9/s̈́әe |p4!aq]yJ0;26#J2RU<7 *T[L3\(v tM  8u7&s|pY6h.n{󼁣謁c;85?SӼS,\gz9ls[Y~J+$|Q4$hC/"K$Jʱ9Se *B$*oVENTQ`.͸psrP$:%ySzݠ%j7p\XRKTnR:Y_qd[8ab/J4e^:X湶qaN2j5Yz\uk$5YKd] ]V[JȳJkJj9{֐6P\'X/!Hr~izϖ ԪG8E=k"r B3{ Ju;qHXL:v\4qG_ƵQjeviy0]Ƒ)-),"/:V=T4FE5 jd NuQ[e(W+s@m?_^n]xxz ;ad"KGׅ3Xcl0$Yc>M.'XaR}R}'޷""A4&LˈD `Q&Ɓr.6 K͐@ލAOր" ZCXvXxD;A\"'iGEPfsvh4 $6i hS,E#f^f÷@Z9 $r~3dvYelmȖcz~l&0lO f[[y!O#r0V6fMiNyӉ&!;7yJLގR;Dέdlб #%.#27JcKcGvH{]$!'j6*\/ͧ餾Ϯ= exN!*F-$\|l2"G?:wEܥ꟣T1hWK5U@A^g]7׈piC?YJɶlJ= i]qKDžA dwk3^W4=LWtfʼ/q#K'ıDvS"c)v6dZm 'rGkw+"@X$[L 7\8MeʢʔE#|2) L) 0),Sw*p)(e(' ʊcĴRhԢJcyš}h6VeF(@lΒG0N&&K'y2ms9$i;nsD1-Iv}yÏ˫4I= F kK.U7E/HEKLr^.vSaHe#SY.9Slg,EwS*(i TJ"kՈZ_P(^W#6#ë+ہr~"}-л,XWҨ] xRخxc^en0/"u)lW.̔GAM*,*l KV5 WP~-uO=M/jM -ipTaM:h*ASJuTæR6갩TM:%vna_x?md)fyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0067-Smooth.xiz000066400000000000000000000022211506652756400236140ustar00rootroot00000000000000X[s6~ϯp:& !3!;lbvKlh-ڂ `[eC}Jt|v5 -bY״Xa){s1?ݟ8~p'׎|Y}Dugc!CaKɑHJNm%9p086LN `ԓR_!zcI}TDG^f>}R)U f Fjh"Od*`wnY!FU3 OXFJ2_~sՍ%<JKGl`P]WO_|?ϟd<|LjE{.?_vCC䯾e7[)bS~DN5]''b_VcKT-'mkݢTIP6b_UDz'M>i:7N{_嵼}?vOn2Ǥ(Gb\]n)HUVeQ3(jpFUQlxTkA<:zy";8"4s( LH8!"nꚆ.FO'U N<8>BtzW}}xL|>Sy{ IXVVs3`tƏ/P=o<;Σ;S $yC,&2]N 0B YlVx߰dj3A&$KRR^4ZQ V*iZ4SVZ>bŁL)٨ ::-@TiStJ3ZNYF )hIw&#mⅴ[vW wP EM|\3P6Dҏ0z7"쑀PɅWJB0L0kD/ݯ0Gz ׽oevfUN0䶫;^V>ہ(0,b.B_j.j[i~)n|;4X̒_;Gw igtg|w!}q/p;׌vdGK/cŵ}kb'^|8_[;$ ,ЛƤxM:%F Mc6 8T>j]TnLܘn"!q( h]JkttKPƠ/D3= zP7>8^w˅7|8͹Q87 H#udcMhM͔HO_gϓm1 M`ô5> e[~S;!~L?ǐmyb;{ ^}]ax®c)6d|G6#xs;t~p>x\q΢Է.4ZIbIF]|\DRv|`ā4a5Re=Ò)ʤQ@yJ=}$O/D=~](bmwdc?AJ@T(T𖥠ms}>j.25f&(F#m[ݫ6˾,~MӶ{f-du۹`( wJ4Sa4seF%h_8#Joclq0?VBIBP(dbK"KA J9PrwVn#V#@lv0c0 pK%Hl/dfGBm Hx˵HmBU.CԎT^^Saz\)N"i*FF0h /LKҐjGk4{7v%PlE]}G@^]R7j%;*r㭮y]1]bnZt;WfVxjݔyDφb2ryCA dAxzȩDou4%}ML&g ߟ}R*4r+.hW, l#|.%.bUMI35^uH5*ɕH$mZA4Y8PIbWJ3 r)y76*rcik6W*`f@v\NjD_3DxaPii<>Ը@]ze"OZx7GċQoCnu u 74YO.0,<F|>!YrFOwgTIv)*Df49 R 4D 4pp}C!e)[|WU~d< 5ܪ!Cf9ߥsCN*E ۲\'+Y?1dqo@^,Ȱ m9 %: D_D2累u,pѝ@ty}x}Otk_:aH & WM=Г:PeCt4h;yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0070-Bright Rushes.xiz000066400000000000000000000046731506652756400250230ustar00rootroot00000000000000[_wϧpyO[b 6!-mH틎56MOX$d7ه} ̌߈?}Y{ #7oky<}xשûQ{wg=Ρ1eޭ?Ax[k'|Ҫ]5߅MotcRѭWE;׆d5ΏWd1V>ݱfՁ2Nzdwzx YKع(:~vcl Gq]3?`v0XFKea B9uPID]\x?LOsp &}UlъE)E45yßYZ?"dGV Bˣ1 M`h;}Zk.E}r M,n3;!~eL?ǐxlyD=zg>ޮw0aWpܱzȔB~'|G^v=Q %Tedm2B0<]h,$i e%>$w}rmIA$؍v)hjz%SJ;I )aL> b](bEusK8R i8%)(b\\-7EƯ߷3eo4h۪NYUy1amgngQH/QHoh h,Jz)qF3(sG' ?}ǭ~1ŖD$AK)PrxG F2i;loGq8K,_&p - M9(Y<_&D*\9h$B\Aw $muK-Ic2ZuG)򽦂ZKK*}øsop UA?ǿy29aBHk0JǾA1h1R4HR. 4w 'Æi\<<$+C]"djֺ*GZJc:z%m\yGCi^J}W諐i*C:\@K9 ׃$L9R3M[xm䪿v|܊cNɭYeFɭ?6bR+6r]uBΪo2yM@p=90څZG49O6ӣZeQzl-:'ARLz@EQH2h\c8?*e;U[afA!K\@af*-w# pN1 3UD9)PtQqSpʲ)+}a$Zэ|a >K(6 RFh?pSHQZv6U,i 0F5mW)b%܅ JLn |.xI':iIrYurW=vFTJ62H(+q EϚ~3V6o+7n;o# Gq+Ԣ۹ճ*8MNƘ0# p1^ j f#)ni*.K{M&' J#?wBQҫ]%tU/f J=R"VUG4#~\(Qݠ\K:DMJȈTBGL̻}wV7s7vm'(0H3\q]xTsd%~F5CĈ* >" '7ңG8~ (\KuS=x1* !"}s 9nnqfb8͸BS ; AQ-OHf?$\5ӝEz:U]>r05E٤&ͶoT| |= \_c}PHYUՄ_ )cj?uM.7fri;yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0071-Bright Rush Long Tail.xiz000066400000000000000000000047131506652756400262210ustar00rootroot00000000000000[_s8ϧrOB]`܋J`16?pZX$lkݭVwk_ʂFUbҷo}x?5~po,^YkytC Cfԍ= V:l@&iy0Lg8!iKc;~]j$tNDmCcq0 - pa[*ktLKPD`/D+ : z07p›Tl>}y)7 HYo"kɇs e%q}?׵~~UL?K#/-zз,X3zeW;WV?Y10chO}`-;Be=hcҿYc $xl}[^fP#نEeڸ% PZ*":6V}DžOl;("(MϷseFfz>ӾJ(it?N FPTx|C|'6$"LZfQIZ(6> BFr|ͱ#e$(!pqniMC]6#| rPY[J=U&Zgz%}\yKCY^kG&\rjFW Y&IϢpݹN+|+|g׿4"k5Rh̹ b'7MgY|PLV(]\=Ex>:= ´a'!lH9w-shQA p՞lc7r@9].ftiCE҃{T,Pmd C;-]DnǑEN=F6D1E:b~.чPYޒcFC@ng:K=pN)ZI7!L~"˰aF-p7L_L7H;Ƃ }Q+z%6]T8H,`pOaĸ) RE sjHw1fI-PFߔdpLOtbrP;.r JR>LK#֎&( xm+A bQ/* ?2J`!C銧M1Vy݈uᕊŚwJ.NMv+b\ifQto@c@# x6#2Q8$@WJVǀP Y2ݷzD*9(ŀ Wa_yGZrUg&x qj"%!?a5SnQI%i怢yk@&eW*)LpO芵}਄w})xc oz ^.A#Q 8us͐g]ƍtitp\^)b&v>/bT.zWB_rChhmhLkN37x^|[6P,}Lrn7黨3hZg;)Dg!Uѭ3d+\Փqp?/(&pG -E]B)_x6IE/D埣i`ˁ*_%M#gW938Șh+b?1h,xƺVZlb] +ֵ* "k2ֵU]^յU]MqQqMƺVԵjU;'YiGT0Sw+ըºuplUBdnSn#sB%w]VJ"/VIw&ƒIa 3HFdtr$ U.oqnS6ʯ|\f9@t;yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0072-Extended Rushes.xiz000066400000000000000000000060411506652756400253350ustar00rootroot00000000000000\_s8ϧrO! ]E9$>lInIƄ2Q/X$o`juZ ;qԎgɢlg=hg->V& 8,^X7ۮ',+GZPpr-\ - G/"(AW4 'N$h4ϊ {8NnWqmD+2LNjHAEҹﯴ)w/l)NIx+IT,dF`NbWX)^Y,p^I|N?E&F"D! Mbs"5X#QiA8 G@ s} &HLJC\о]o[P|}GsmDB*y?+NPɠhz6LvaÕ)mə v;b&qoɚ# l/Y;:%^5:Գ:N?8lO@YS9 zۿ/}9:@#J H{Y荢Gx:˶tvinڭk̆`D#81F@wk6X 6XW{!$UQt]c{7alF1r ~b}( 9z9c,d9a ^QȫIX8'? Q L2eR޹]T8L{"Ig?Kl71u)Es"RK΢#=vG~Ogvc zIl@ڼУH)FG$Z@͑4#fl1"G?<@ /h]HP8- !yD0$&.Oq4y)ٚMiR;m"%M$9MV ;9W4LƒeFry?K0'YL `D; ݈d"Y`3KppdwAPdo4e)M)M+|(f`dxq Sdi˚z*gBVF"VMΟ'}ڬ p`'רZɜ9"xhNUhndb2uÈ(؋-qDiIztxh"HK1Xv]&Šk`yVsVqs=,Ln,F7qw$TJ._qKtՑ|V|i@s*} sTr\]NIn\Ũ`DixU%kNC[jַ7'8tV9J%rDF$~`ۅ77:9~ ?y ?fx}ÚAoG_5eѬMʣu`M뎳:@o9)zM]1HY_$(}ROepuy^&7ж+߀A,;UV=; MT),sܛ&uD8ܥVnX!rEEi o3c^ YF3^p1 N tdzեHDd]/t+VMAk^cz}PY㍔$j1zBM1ҊjCv_,tJ-\IV+u}n!ՅmڄNWtm m.GEMEɀcR$wV39%(~`7_z g[2_ܒLNUȍX uLF1rblIm /g{` pU,^Pص696 kR9A5ޠVR -*h*h+h2[Iѓ޵åBMT3%*hHHWΫڬ`&&Zt//I]>+6̻6AV~Y({3Xr¤ zV";ǯ 2 6HxG[F \Ƌ7L4 ɿEAA9֯jtMRͪE*i|J¶.n9p[o+UharJ2flm+UH\q[*TXj]eC PR_q\:=Y~ke~ oVk'Mgwk*+iПvVV3iXᎃhZڷ.H+ـk](Ssv0/@YXyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0073-Bright Rush Pipe.xiz000066400000000000000000000061031506652756400253420ustar00rootroot00000000000000\Qwڸ~ϯrZ! 9]&B{{_t,`Iؖ,#ɘ]h$Fof8zyQExph0 =?xh]6~pqKo<7qGߛG]4 tGl7}O sw,Rڡ\g4K' Y6`z4 FCڍC.]ыƸwɂlbrи4؛ɸ7iΎqZ_|%0j9_ ]dM#qmV4H*/1 "t>3in `JȻrD;p=/SRq2M,pz7ء?oP&D>F"q&x5}̉7>_.ߜ_Boї_7'턑tU*hH7>eNq¹K/o#>Q7Y^6hAb=qK'^ώ$ӻU͡_IZЍeMu(0 *dm@T Udp׿u|qޠҝiײ$B_ iIN&hʊ '$.Sn WymĸK8G2<Y\Ԉpw;_SS  Ps3?y!X&=k%c0 ;K|ieЉfLzSNg^%{ 7Z?#ܷp8&QY˛c?oF>`TĜ4x"OM?D&ĉZ|F6DVyͨG"n,txJq3 5Z_EKF:=CAǧ}UT yԞz5: wzeفӎ^7D1H*O6Z͌Dnbe]-l0H ۈ K~.g=/?&&@vsЍbJJHБ{{G'VwLg6RufCdd8EWFn5[_/jhY|8=Eg͆9؍ͲT1d4ʞ+(,@6V x #)Ul<2]{s^6ugQ )kq}5hٻ۟TMgXC̎}r@H2'[j!+ڳI:{~gLjYF?Dx%`!xBƹ;Բ2D3}x~H|0Wd@$vƈE @% > <~xY1efM/7ʓ[+"zKHQN!w[KYˋQfT4"?XlRAqu6"ET^W}$^ 'ǎR`irő *ۆQxRj)vN>jsdnPq?ޓS܏b1XVӒ Ff1v4\ w(r^ zO,ʄ9FgjZxLY5B@5&ZTQKlC/Рd J.%u}ŽF 3Fz_VZ|?>'"Tw]k ac2וjg[j_3A-M,Wi-rqEsoۆsveo`NN?< ~ 1},;!|<^3Qt^?e)WI*q|Tuο:9,.ʻ Y\O^s-kpsOօ3EnAI*Ģ2o4h:}tL :qhHB0\P O*y*VAs2Y~߃  U#AHzôP*D,4Y_N\niEV/K-B%o緵oHy1_/A]ݘy|{vn4纳繋c 2ykwޘMx49ig!y[ ov#c';Sc Ft؛#l4M{C{nOgpAܘk֞!8#[8:U$|bd G8ܮ OEY.V]BIy(Y.ze7ޗ5ʶLUy3\EViJ)W:%JC4V]PJ;/=|o8y)1m0y 3vmR"L)4 )I8/#L@-S}[pݡM%&3Ij MќH(I<( t=G 'Ipߣ L'wrYQkI_+T`P!pe' +W]Pz;&=It齁 <~h2"DR$RŮu%8*PH;UL,Ȳb:A0/LkC^miFWе*.*FۻC x4S_ּuS_YDgwɆΚv ?H>WjGNoxCFdט0ޅ([߷p!̎ kI&$~}#w#@܄-y RLR‚3ˡ0|FWXxth e"ݧ$c|3*57TaxwipKD8΋f]kAІ*C0bTT&uTHSg!cRVϘvު /d%v6y}YV4yՙW|*Wp[,TKkvk/Zj5|QUjmd*B{w4Q\nh?a.(ɽfUTUQwjhVEUUxj* S\5UQmWE]Uhm*ů=lN3_-yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0075-Breathy Pad.xiz000066400000000000000000000041531506652756400244330ustar00rootroot00000000000000Zw~߿>mYs6CroH{/: ]cq]_-# =}nh$}}w-b-˖<xkwϓ.{,}y{&~+7ޯb[?e8i#/3^$tЙ4hxԟ#kC#ytn[} Ic4Hul@&ii0Lg;iM.]W'?alXD0Nt@xC'–Kچ,J/dޫ0s@7^ -.^鼍f`4!|$bGZ~MV;>c;lmxo~8?qoݻ&ίNЄEU|-[Yo,#vIœ~E7N61As2j/݆=-f|?ChO{c=:= .䙡 'n[Dėb%E} uh>yha hiD7p;=p@`xq`$Uj3MX ^ f ϣψ lYW4Q 1{U⪃-_bi<ޑt0|BcF(.o&sD')dYAoEz{)R~qviC0]̒c4#8] {hU}DFr"y#ӄ^DZYv$QYBc<>!њ %!Tiy PDɴE]0c %ͪD? ؐ_Ȳꠈ,nMQu5We$^ @E@8_HFƢ1ʪn-yĈuQx Kd_,[!}}YfHN"L TmWl1HWR)L0ҏb'}M" %# MmIvQ`rX\vOф6FFQmI̬OG|;Xvީq<߰J{(wOJof蠟8qz7(9UC^`A^ $"g`6GwR4陷Jo>*gCU 4t (*r{HlV.ܗ{'X9IO86@, f%ve`.tnD.093VQ4I1HlUZ@le_Ɏ c;%"PeUvY|HVR`q<803(e@[(Rq.lbȢWɡ@U:A_0D,`:MW7 [x1}lE!yovhCI~[mi0Wpۑ_W pIM%Ğ3Tm,#_,IQ%U5h<% &p]#~`#>L<Fw7ys_)Tfz8z,ICtF J'8V zs~AhTJŮ+B!\"0 vqe\ETuU1rAvў(jإ tF+,4EǩR`䡓i(˿p~,tWMm%\$/5U0EQ,T|$^c=u߽µIx5SNdTzu)Q^.xe1dn5u^uIecvś <qDz'bb4m\Dgp=Mry>Wskf}s>נV?;7 籸a6ԣ &b1.z37>06m9g!-n(Ӷ_ZЅ@>,]= %jXz>0:֎e#jN~ةvvP_lGaǦ^4EM)MQhESTnN)P4)ݦvOBmcwh8ځO^v[.pQ[==[ڼ0B.D^ncɚö~5S-WƖ?ړr.{-kSI7 }, syWF]k*i IE.yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0076-ReedBank.xiz000066400000000000000000000025671506652756400240330ustar00rootroot00000000000000Y[s6~ϯe&Ɏ]OKmgw rB7@ eڧ$O)ן}Oۡ t k]C&_naz|Y_{}|q]B tլ7B~6(.`#P !UhF࣭rA {,Ib&:N+F|̸!C5,5Y2do`~;Gȹ8~KS~s=OLugW@`"e1̡~+HD )m,8{zq:}pF X :4Y9LY`ƚ荘ԏhaƹя(Ro#FR7O |f7ϓaDD7ªRP +I4dtϓ嗢3i> `>|HPS?Œ>_t2E{&)/z [L:żqGaom7mj[%qnuf%^uf%_b,(}b$%FŔDE,Զr+8n#>Mq|z[rBvhe8-h-;|1mEl n慢hkMZә%Wvʐ?pGqK$˄[Z\ I<9ExM9f$")юESL~*pr)mAh/s{OR=|WW90V3pndM%Bvi(=~BqX&hy{f_M`",fF v~NI.T)ucTCJs8rZ(pHL-J(Po`8DSq*=L%d2͓ >h:5NL+rUN}!ɄTi;XE5Gix" d,f5Zx8qg2J P(a^n+L r7dzrw\T/KjB]zl0Tq.xg㒻z.Xܡ*[0& o` "rQNUr|e߫?5"V?AXBnôI(PNHz8J2/iW[W A92%"2vD;SB/f@={!|q^н`6̝;*!!G\&'F4XO)[ ֱd#C")&fItFHT7ƪ(RP E4d^GRxD1cw` @L"YAJ7GXb&whŏL3J-ۜ8m%NgnYm7n:N5ھ)I&LLhӀ7JTzV6eg'NGkYތ Pu޲[ABX#RO|x XŋdYg<'ZY#C 6BdV',=c"Y-$RhCG.IFR~3LnvDTjU[BDYv6jnvO?ëҟdD=; Uk"صofI%>&A$łci6·vJpuꔐvWD?xb#i,N:<_óLt76 LP6L:tZk0N5n0]W>LR XR xTѮ1!3Ү1%_/N<̓TEq{=ȿ:/9ERK=voFFf5oV@(C^(eWN^a(:•Lf.;)>넖f aHsʑAz]HƒCO N*'^I\Ffg- o $)Pځ,K^^vyg}ҮXjy *{wVEYfU6ڬj*ͪڪj*V osocFWwWyCG&$yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0078-Soft Voyager.xiz000066400000000000000000000025661506652756400246710ustar00rootroot00000000000000Y]S6}W~. NBf,8&h[[Jm%_9-r] =H]=ARrc] Myr{vn<;|u PGhr%H8kxoh^c1 m&6C[0Eǃl_ 'c-8#ka|d@o }@u\ȇXȣAކc75k22p蒐vdZ|ī5EKp8`|ӚyA;@F-um,+7tb8 ,9 q4nt {>mퟮoY8:6}O h<OCj`ae ;@!Wr?l L0X&ܣ׈x}#!Ť#^%T7Å5sc\\^0AK;iQIAJTHPt#Ԩfg[UN`hW56Pߥjni +?|2Wy #׆>zhpW,Yޟ&]\s3M|ԻNz{jx;7q wlpyogK`P#/7zi|=~|7\w^:uC[q(whxc 9dc5OCvsfEcoEx:0_{3NzОY#@0\!hVNy z \z$b:reN)ߴf~\Ġs ׍b^zMh6>\ }s]2DcC0I 3,إϸ}'& Mvh@%E٪5{Ob 9o]b'*<'! zx,&3vp H 4r^’rY ;y;Bwyp0so| &hc73N8)Q~`i =p"w#j]aBFc#([USwDFf2{ gϣ}|DX 0s`^` $U(+/tIVhp\n3<_$δbtE%1SE N󮖧#}h[WE~E/}U[L#1 SBU _v2<=9Ka0|>lK^+%`^uV2X yŋT Q#d~Ol˻  \Q/inтIl5EɌ4lXz/i``I"[NG0W?DzAWˮϗiBrYK wOKiVFs?xGwZwR 3sl7:bٚ^ZW/T=P%񂋯weai*\2yJpȸYjJ/ڧX̲~mf+!KUAR2UUR2e֑2߀T4 m]\wsNQSuԀL5h5x O~™,|}n(S.uow PB)-]؝Zv6碕l#TP1piT]~\: yl…L&.X/*v]H2`.!)d"^Hƒ@H$_@B2pT#VUjUά^HRKCTr(Ɯc{tɷy{§WlEwe+VZV]Tc,~>Ժڮv]TuQmE]N]T;uQESN]T$m~T8)ڔ>?6_yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0080-Echo Choir.xiz000066400000000000000000000041161506652756400242460ustar00rootroot00000000000000rH=_`IU"/f_i0JH:fF=&ڪT9[5~i.h6elppxoWۭ{{5惿,RxW|;XD͓'d$&m͐m4r@8'7p<<ꓹ: NWyۻ 6<\(`|:gwo_7Rd]ł4@65,n<&ӑ dO}3(b]\K!eF&ÙqӰalsfɐ7ji$]r* 5!ٱE"ؒ UYX`}~; WI' <\P׮#v68>)fk zE\\.V MAŏX)SI|-wȽF\z!`cո،7_1QRCKd"Mf9r)cs> GقDGzߞA>T3D~}Gsv*5^<hi-^Ʃ}Ft GnPĞ.,!a-e5a֝KD/4]yFH< :$R"@Z̡u=tyuQ$ /_Җt1ǝ1+n,F\yt0RDMޫRGCy-)e'}䯋診%C ryb8mZ 8elX;jI Jg(VI * McJmBV (x)yur/5@}L>5T{Bl%FS)x{V{z D-JK\IRr}iWISScĘGQ_ӬѼq}~^2~TUr)wF.-iC-\blKfg @Z]ilvPzhc![zQZ4y;z94dt<#Tg*p"Q0W`%GQ(&O > XOP އ*dyUȪ>5#*S ,8 V%Pb8  #Zp`O();NM:n+ JXi7s0}`U;poT`@1dx" bX;hdAVnқ܌G~Ct|OkR3GVF1ޕ_jes88-50lK沰 /b}iw!3̚ ޾'6xTZ|&GB*- 6ŅV1Z|NIWwDuEmt2͛zこã='h &?q<ֽD٢Kwz8F?zO~<\ESF.[Ben%QhF§4f{TM"wP/iHz l-`8j kZ)s't(Wˇ"Adse8?ed<]

Ҍ-"FBDj iܼߞ*G{[l^oO.Wwu]6ony=\m&m"<6/on=yc}byW}[-qPnۻ՛nOq\/o~}[&yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0103-Pan Pipe.xiz000066400000000000000000000103261506652756400237330ustar00rootroot00000000000000][w6~ϯ=IirNo/RlO) .W~y2z f0o{[A4GaMwo_}˓_[=Eǣ#?'U{<{s{0J^maNRHҲ|o]1+1Igo//7vp}#_l+'MQɧd. Ղ&dMFdQBOs!`ԄTQR 7 Ɓ?/1PaҔd5a.coT wCz'4o*;+7NtRf2 f[d5#=K>C&W[5,8L;vZt Q`@G؇Cha%,1?]apqMo"ĝsd0g4^eSOHujʞn\n(kFWFnЅ̊Rc`xEl8Xlfņ-Rqˏmޞ1W/bC2ب3og±ɌRTez(x$)flVdn|cuU{ޏbϘ+͹qy9=/wT䝩JWԤGe+I|HhEѤ"A=W#mJ FǼ8rfKRoG.Bm r ^Q c*.Bc-Jk*kgqX& {Lzh'^G]a]Rt-;1n˜"e 09la0N NvW%;s(FImlśag&yDYHb02ۇHuq& x„Xv;)1@aaZ].#$öiǑf}R9t̎hf8&LM`lu9HcXq!xk|Hˑ`#+=uES 5:nʬ#3<ԡ Wll;pDaOU;Lr?xu\$ؖk#.FKfߧXb٩TG.ܐ~rSAj8;kR39H͌1 ]c(CT20F:( &"Ģ,s 8BR}umm |ڰm(0b7D#u:V:(:@ig EQs oI{h3݊,U$HB7 -ȑ#9t#)'z%;tRH(PQk hY+nQ䀞s}JU;Dqcnꈲ<$Zò vuBTe"9 "7 g-QZ)#p@:cTP ;( 'Yc(\EM/i69:M r-GH񶑏*OUVD<S\Rph4E1yꢠ3\T\T+a"m'6mL7FG=(5 )FЂB -hkA񞣐FXcB ?:(|TUEEtaK3?I((Qt1Xj%g$OqZW.긋?_8?I/7,Ҭ.jl}U]?m&k"mi5Ri@uIG\QC^’ozJWAʤ [YtE_&(ɛLUfh.l@&o_ڜ^5EiϺJѐ&eV̪NYV28>TIƩϫٔMܔjӒ-MSg]V vhZ?./ij ͵Γ)"x4֠l U6VI_,nEX/V*̬`f XV*x oX*DWSr^Š{sBMdSB6 miZP=b,BGaD1 JumEr)]\m[\W$WNV-ϛ[޽RIԠ߰cjwv2dur.;Nn#++}*kS٩]q"zzʋk4h@kf+=7^:gydkphNͧ)cX9&xS3kg*1W":@NL5Sܨ,K#Br|Ї^{ԭ’_ko[WǾʦ13nSg<.;.N٢Dj6{j-b_|~*gnG7&UdVlprJe˻ߕRqe@n]̓hY5{^7"Vl? EqEW;tZЩK|M.TtEʦ&e*HDWstsY?Ti Ui4&0+@ŋ4[I : 7|w6 sIΔnK EB,ⱚFš˴ZoOVW{[_oO*WwuUon~=\'m"lhˣ_|˓ɻQ뷇h8ln~}9S˅{zv/a$~_D&?_ߺ&ЏZWf~.^߇eh8`N9M=iF/鈝6Mt|qvy}>//oKU{xz~{of4c_uuy]WCSQv}Ȼ^GM:v6Ʌ[УY6K_LRjGxa,2XyaNVErAÚ.JctMCPy6}ޟUSij_Lߞ.&~ ˆn AAՆ)گ ֏*xx՛-Zs? V6ikގW&ˠܒl9߅s뜷~kOcxVBgil;_jrZf%Ӽ:o<٫8^ȿNaԵObH}HBy/h\Kbe6*ύYXwbv.4bU4%{Pcڇ6kZd?,1M~ۈز&24y`6i;5 @á7+?M~:?u?ɺBйZs{NL ŔcB 3LtGeDvO4uqYf+JD7.wG%$~%IwV[:LS傫$0ж?WۯsSD6tr&UfלԍX |,Й8n5L(!}Sr# r\hH_3E>MӞ&#A2c_Rսw }EvfL铳yM:ؼ6U7k.o|ĭFpy@B<02뿛7NM变~tK50^xGggޞۘ|gn~6~C.tRt.7MT4) +pzMJUFKZ{Ң߹H?(Ŷn꺮Ϳ,7;(>'Ow/f0(SܿuErena{)P/XTnoЩ'*n*){hu! Ӷ?>,r\^ /N #RuHn Q nehTd'*_c% eI\ 99M4#@m` qGӠj8ssmVr|1QL߹S2+Nf67f}aVlurq=h3Ӷup총Le{ln.+6rGٽ,2`' %vbL1pRN BNV ˌia,1ݿw9ss؃Aܺ`oc9xҾU,1@XcC.a.:a,3 #[EB0vaz$CBw0:a}ia>w¸E$ߎ0$]0vdcvXK}9- #sx7m֑iJJ]bplFČ @`F#Q⦇0ndCowq !{u#rC?VbV#{}d{h'fW1zIݥ$Zvbv¸ Ic0%so9ܽjp a1 $%9Z0X2if;ɚag8!yXB \;G#l0\сc,ia$}Yb0Zfdd[봷qz#&"05bbBI3gʜCv̎١Xb !Z 9ʱ~;#Ns1+!?8刣qˡ`]72M0>: v刟9@+sR쇌nD쎓e_5v~+ckt/-dl8pHao:BS$霪 `ҹq"Af<> MG.O\HA#o,WG!?{sv:f`n3@=sȍX3 yXoȬ9nbyDd3AOrPoɡƓKO8au S~c4D$u@RV#{vw5@k6v(~RYiCxER U*37Ro5pPrkCS.ˑ^};4粰!/4P\ 7usܬ瀍s~ʊU;豊rǍl"qF4x ?;{LCpnEA([#hA<=Da,[Ee _]<3vU.r)Ԡ5 Yg,<5']R`.r)P@0c ˛CtRޜG8\N`yXO UEX pEHg.䄰 uЅo 8Ee"oE@bv yX˶ cJȂ[F|&XCބzPE}\>,` zY?'CO s0h"#v?6 aO z^>v}"/t  "/BCbQ0/-duղl^{O)k Q [/)^XKw5ײd?+?IzڛJK:RZۇQ˙g[mf=)eWOǪ%c0]ɜ'aP~H^hROy)4,S6-fn YխO[QwzA×R~`JkPoژe/[ew7'7 Vĥ =Vl3e\J3Z7.ږro(7sK 1m0Tm$A'YÛё디_ƷԟWmfpx{_IQ/ܬgfc@f,٠m@I QzF%% g*1EO'Ue̘Ee1@'8lLeNS6eg2 %9]t%zӲ8XEx.)xˋHǟV=(ʄZ|37?;|M]-*!W\#)RNU "sW.-]ɼN'$O RI?dqkh.NLtqDJSSiBjhW'.JWoؓj'JѮ3a݅y#O䨱[Q>!= ?9/&SnfKjFO,)z̥KEpvV)|A/"qi k0=Z=H(z#3i޾~V֏!jձ`~湷~|uXGj{FJcѺS"0E VClohW"t5~DU#%[+6,K|v< Y> Cn8w$#_v$C_v$v$Ԭ{s*n^C+ʰ- YƩ0J$*Bs2Dzgz%IB Y֋W:/:ɝNئWꔙk{S<^ͼ{a>qhO5ʠM C6>EY,R]ufKEMTuBlϬ f*Co3/- -䅶6#Q5jsi%z`/cAS4VBؾ:˸@UvfԟQ]-\#d/ޓ =]AfmdnR]Ij2C*~jIf`E1;RٕiIf#.ƭtnWܖ22R>@moNav[/ lv3d~bS1e\ߊK`_D0":!8UpDFŠYtONW4j2#V('V՟ꮫZMT{jƠj5 X_{jrjZ#jB#6sʭ’@pm7\yvCԷoK+C4n6gAk:yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0105-Lite Guitar.xiz000066400000000000000000000035541506652756400244570ustar00rootroot00000000000000ZYs6~`'WQe:Ԗ\IN``Py8ֿB<pAJ12v}x`QYc7?/O;>r1οX?`8}&U}=@hG; .u,I3^ Oct>Yf0\[sk:ˤ|H|q -l:& fKk|-BYWi yD!tm&ͅwF|z{mO [;s~v1>nB}0w/ϡz͕adx4avsKǝ; .7,P~ jMimdbroBdQcUl~VH<&Pt T" Ud4 94 ';?M4 l]Ch$L`Na!I(z H 26Ay*4x7WEm?$jxگ*A![R|`^hɚLzJ{Iq,OWY2aUU^& X(LWrvWjrctf<ǂ ]Dž9M um~C40C"u"1PO%=7`ppnI-GT~ mi9_>  xLy67ղwn6+b8WO8Ϛãp{(&E3W ;+jأ<ڨNiA(9P▪%(rjyk`Ò4 G)d4P"{fU#A :R+\'v]@[U^S8B '֍ajRW:5Cfpqt|xWZj]ATW7E`maPM2rQ#^{A\4I"jh8exRٽ,~y/ZռK'H -aD-ET*Z:B_EK=wf#()NiSk6CMRBK%|VvfꠁUz()8 h`뛖DŽnacY[6bB bur=hQ_zEc mas OfѕrҔ}O|DH\}NN%yR s.Y< :fN\|౜"hݛHMV)>0/2ɰ(mCs->TM i%aDda3MR;LSD~Zjl/5׏2nfJ[zƒld"> *8^ E7*1YQ,X :t$:Ȣd)f)aV6 דhȿS7琙QWjƴ-$$JݢpnQ)*Rʤ-#/f"j}HSVZ4C]|T jR?QG@*- Ņ[0WNvz&3&;5]ښtF5ڴx }٨6\^ac*'yoOo[VQ2 |Z|wzPT÷[oGhZ*@U 3tHI< ?v*p}x؏~aһ]ŷor%E%t5J\_j5wDԟV1n׭ⳝVNtn'U̷}&ډh||4_1!anz6yŔ4_ 'iکs>CHСGw5tp/v R~|%60)_/yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0106-Trem Guitar.xiz000066400000000000000000000035601506652756400244670ustar00rootroot00000000000000ZYs6~`'WQe:Ԗ\IN``Py8ֿB<pAJ1)1Xb߮ӣ,08똿t ءgi_.&g g]Є»BݾO('n=ٓ4YcԘ }pi`r2G1 C:7x$ḰQ/A1 U>Yf0\[sk:˴|H|q -u [,-}E Dֈ{@:y8Bf\yj4ͧx!Qrtϩc7{_9fF6sH'beT sg |.FQ˜q]oʩa@7dŖ3=T xxAL$+R^߃_=rq& r/>h-WM?N{vv/ CǼK0 2CKRti CKGtiwCAþ ʔh.s}/l2VچK^u2ZV驤L)" l}ג3X0].c2 FV IZ_];kH"[h-|Ópt4e--t|W}*b|r(Sa KVRnfNRM|:cCtbQwo VE6J6m'}`$^Re='Y܇B[b& .ʂAKˆ(|L`g-W]s\ (fg,VO&J㥻Ѝ\dQbqCW IR~l:[gu:8k}xpvd˚GWX4(woB[͓'d&&5fHmʍ[9-?\Mg7x:'u; 6<\(`,Dre6`6-Fy"-'ږMQ:'$;dn@'6B?rw[.)q[2? tѳM&MƓbvw3,R%`pe| E4xOqOݧk5Tyo|T%,>LE@" Y nGn߅_=>qքd}YzD)H5)v0VIԱ"=Z̡*CDȁm-yDA0WwkXqu(L#Jdjt{(!?lK*vN_r hʡ?K T2ӰnW&us^l XR9n'#S\9hzƖc| mPY(kh h 6?x~E5U<^ʱGY..:z!\ƢIS{ ÓLUh yrhV{atPF*ZQEcUCNNݾO{JnF>R+b4Ԛ6ͧdT]hd/pT]/:h`J,8妾iI,{ 0l+f'O@\)VW/ہ5% jPo4XV/:1t>_+'MaGxW|*dPLQ'<)9,FGRuCTUҪ U[A VTi`dAiV) *`В0U m2Xø9MRLSvD~Zjlk.kdΔv9D  8XKE7*1Y~ X Zt$:Ȣ$).RBì9LJ͘V_ۙ;R;+;ghTz´5׬0iK ׌BD/iJ+fl|c<[*%f)ĨL Έ+';3&;%]A5鶍i[* XQK]ٻu>.~U 5o;VQ |R|S7 0{oßi|+U]#i$vz?C8 ߎ~<籟6aoy&߷YS|F0'_^TBWZ`\sB>@k`]׊zkn=ѵ⺞Z1_OYt'z3+ yńS9 O NpC=*!R>t(htms _\)/]rOV4ЎRW|yLjZ,j3fT1s1UgX1}u>(VnSotz.4jS¨ي26jU{Mkj^S5QSf~Rݽ xF'/t">fG~2[Q_Nۋˑo/8"9:9K[&DKy4ni~r3NOo7f7oNBOɦ'szao,0JrD)!K!`q\7t,R9yrߤ@ȁ/Ro }仱|ZKr:nK+mJlv.NLU;6ʳa':fv:`s}\=vP@W'GFR^+|`!Di L9a\jijd]s  ka%]06#.hnS1t#aGac׭HA2x|:L5)Lj}d$W)?udфVܖ{m=F-&}d0ۉQ#1ap F1@7Y6rCͺa%L @vTVbuߺf0&;a ⷲg&;c5jmfax;HQItJ en$)lg63HK2C6~TLct Fc]Kd&ןݱs+~Pbd1.&eDUi3+g+1U}0 D#oRD: ұtː0Ʒ a<@>S8xv1 )FbSus4>> qُ98pM"1 I @pd9g!S!2vѱ%:dHL;rzqdq1f|HQ8k"̑EA~ꐙ@Q#?5]3)"u#goIOHFr7r"{y9R_婀\<&=,W`{P GRHRyy!1ry(8( 1"Q@?k4n0:Pd.Ad_7`W(An3 'JE X=PF*ࠈc($l0]FQ; pFт< T91QGC4F@TzI~b(@ >;nE~2K`Kzksk(N@3E(h@kQ'sP n𙣬 W?b[GKPQ@BDJ˵Rb}z0h@do-jð?o7`c(n@{ ¸[WEq 0]7̨ѡ.0(n c6s$(5H. {ƨ޻'1x,y⢸Ms]Q;neurQ@s7XCqpQ܀\7z ƅoP >@p=m" CMtz OEqUHMcߛ?^^/gzWSŧrBFnX*x}K8EqWfis?VЊOVҝ4TW8^ʯosn}4Shc×7JhSVm?RUwR*{Ղ,KuJ"E);E3\JE{6lYɭl':YzN.vZAk)f_n[nfU*=xɣ_U 7 (eF̊VhŊ-x2P̥rEVӟ!uLH -a֤E"dMy5(xocx_WO8}H V?i(8Qt1l뭙Ψ eOU@VC\^&Ӭh{*")y\\Ք;߼3u([F[eZZS%r^=TjiVKuS۪eS=+hӂW,oRNTƄ}y(Y)>@c{)ʊ{m`pO-+N YxMmP[ig0 l1*iޭٿygZغ3k ?;5qa=*cY kp(֊g6MMEv$W.Uߎ*x# oEny] 7?&}F3b~>߱pV3?00][sv]o uB׍iU\;t}G~ܼA=9r3|[Q%|xz䌇EkݨF)݇sU~u77q颭Gx=cr-]ZwoV| +D +K$c4_֜Ә՜pӨs5q]fR5q]05ԜpWW+VBGf4'#jvLjN)K G|oYtQenS5~,W( UʶLQuyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0109-Tunnel Piano.xiz000066400000000000000000000044341506652756400246440ustar00rootroot00000000000000\[S6~_杆\ 0N n_4V]GN}n{˖#;vO}t;ѧo޾r[/g;aq}t~fOw֟[>#_O7#m~[FSl;E[3+64:^淣d6muFcr7nNjt.+!( 7ԍq+~vBl5ÃЏV{ \2Kic`j*e~Fg|G@m;lκ' O}j-(TH3f)W a*6 =^ZվH(GWWt E sE f>L #y(֔sefr"p\r-鰛w:c1|*vb:JДBKօҩO_yܱO8 {Zxq|3cC2s H2!kωc5E&:<3BUs\F <@t 4~o%o`[fw4mWsdd#/՞{Թx8.cM?aL(Nd!Y?.=r4.tv02oxh3΃Q龚,@f"XG+4r=a/㝟ɇΓ09yMCr)%NuM3]vA_ZgҰ==3ޥ8\o 4wo$H*QFII-08> CYBL o fB+(6אx f~`\5Uw#XAu;u KDžAG5 &AZ#Zxxv9іl{vP#Kbx 1R7I-5OADL0rr"V+Z#qX1ZtӲe]B7OTSuT3| U>6|4 h7|T. xMVGs%vq/GN}bjhG5>Zt@Hac{oQ -RQ5!N ߲@z86?$&gGp]BW));ke8k $>4'G*ש g "uMAvk܃?y^)9Cpl)fp#!jV}fՕ0X!YJحVu%\WU}V%U}zUÑwj}ŀz>yŐ@L5Bz|9bbN <߮vQPϾw:1JQ.û8wh.;ɡ _Sc{$W`ª8t΁LgѫUWZź^*~]z_׫^꠮Wu:UYJ^rxwt} QW[}g}'f>bPs^ʠ'+A ֞d'K3,[%SkXys0.%|VwY [CnQxֳ/C^,[tXR_u0-Ke+cAqFHYDf{)!t__ tRGyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0110-Home Piano.xiz000066400000000000000000000071421506652756400242560ustar00rootroot00000000000000]MsW0%RYbSȒV7q.(,I!@y_f0dL%U9moz1~$Kx? zq:Ϣ$Oo_n>]zxLzs{QXOl-4$WP)˟|.Ei2,󓋫7UnlKe}&#(\l8?u,<:0]]ﺫzZ$J+ol%)yAzӂ叹]<u !Bj>q4`vh,[u޷Uuz~}s[Riܑd˸w)no,n?[e",Kx-KEo"[Qn-ps޻.7:ix\>i8.K1iFe5b*0t@F]}7$zs0(Aނu.@w(\>PАVF"&RQPd TU/hR4>*{@"t~EhXM%ںQP6LIT]&mՍET9pq~.89=@ 8q3mgI;FNSF1XnEZ$ƚ7bFLUN-5z@Wy(&iݚAa~["&OFdJ 5>mgi܇ ;qq}^fi2g-P6 ']UUZ~q) qpF>(\DiEV`grh%}:Jo\/*EHw{I5a;sƉk jv}q~|<隚7aRX @v78w6gZg@f\C"\tԶugi]ʒZ? -8=1| rT4hDl Ϻl 줲#D1sʎܲSޖz/`mG`֕xd+rNB6@؄91q\֜#1lQ"kd0S!}1Bc n8q3@50#tJ}0m00qNIۇaB|ˡʹ-q7{2/Mtdazё„e„(!M[b_ac0FrÓ7ctJRm#Qa0zV1|nv O<¸0S0!?D%]N!j!a['n`([%d65% 0ٓ)lSRRH$.|d&|VM_!d# O}S0fqLMϬJϿ|9Ta}ls/ ytNd*I,˓4op&09R2Bd, TE)Px_.Dk(/t& ƭE%fXy/cɧ bEi֞n5m|kt(/4>5j(OU Ӏ'}06gr`o$b1i GQP_"%l6@"WԹK" SޓLSd'T0O -A Jh)s:G!ZeL0Gz(y.C/'XS//t7|<`{!(y@v=%hG OQ@yܷX5<'6o_50}@` G*uAzn((}D!hAa4x9zHQ@-AwPSoj\\6ªFZ]W&绝nnP8hP5g׏g7.M'~RyiOzE.R dk<6̚d9ӛDkjX%VaUJ2euyR<Rb*כ*t.lKr̶wp۰HTWożdOp9M񍶣76;( đ^W.U"6? m#ѕ: ReG:^zy d|sD]M*c}UQVAWq`)=wU|sN.v- UB?KQZ@ ɎG]FjԔieyPrZ5amE`"R7b,-䦩ԡmNFǓٯg>JA%ͽioJ&ؤ!LnLʪZis󪾉Sjҳf<ˁ^'YVosե]]~yߡ*DPtRw[/-v,*(Buj7ۺV=tr{Z%еkC*wUm]ps{X1=ZdǼM$MYS#ݏMYݿ W_IL[Ev%֥^w독 IUђJiW~\]NEZ:Zdr*5^#c*u%lug]P: ZSR v@:) M'^sgxUQvYn_4K"F~-cf:QN%fyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0111-Moonlight Piano.xiz000066400000000000000000000071471506652756400253340ustar00rootroot00000000000000]r}W0zɓHRe{K]Ut[IyAA$aM V>  ݘJejz.=tcz}byWiz{0%A}r}~wŴ 7G/kTv~ӽ(N},"?\|vt~yzp}|~&Z+&I_.>qv0Z~} ӽNWZwu\M˃j]- Lċ'(,\2\yQf"3">"䅷Lc6t2ҼѾhXoyTu)Y `#{N$GwYBv1ݶi6nާEy$]~8q;ɪ3pe%\ާC8Oaй]% fvmNMaY X6k+8_l-" jQ**A.N i' >r7ͼ -ZeΔ>y(pb[X)^bj5qeb[zU& Tf6M7Om^+F𮾞]j6/-k򉢶v:{dU~SkU#Oxo^c_.Oώ㓩? 634ɤ9zEyTy-vnM$AѮtPt WBeڍh6U*oaDF:/T^Su{^v޽?mPW'@"6@]dziyiY ˜ s<IPG%yrb E !Te{[- K9uk7Nifh.HT4Ҭfز`BE6Y^ KXm i0+J柅> 'me]Z~+ wZ<_fS]ʓzlXq.yIo)!rR,ej&Ues {W-ay5կIMͤăFɁ*ɯajmjJ2!ę?oi0Mb?DwZ LQQϿn) dxVeK[6ʎ ;uhs.8.;amX:Su̟'<.`c [Uv4ʹhQx8[xkt}da؅P&(/:2ظ s@XMӑ˜Aa.@؀ 6`\>KEi|ϘE3 X=d#cӖ˚uvq۪>@>0f0J}!UBg0j0@>; OYI*;0Q c<@$; Fc ˱jd&DMj}L'*OGFƨwq LXh L ش-kq56Dcd A.; LnB)F$l'a̞%c #1 OYc_~ ˜8s+%^szd̃= C'%,GD/wLLJӒP+@(Or! ZC}3i5n%(/1;66%A~%GߴG];(OEuh"^F~vQF~rPD9l^~;(=k ~G$p7I,]8X)a3GzI(&?=E9B}/:0Ou0A FLP9 R* X?@qP" wDɎT@3qpW&.o( 66:H*"x[_f55e$Jt4ᠼ2AwQj_(F=|VP((_i3G{06JS+A9~)^onJ7QVDic(O@O2O>Fn(UPɱ 8da  )ԾQ ltl3Jp/e MJ2r`:Gg(o;#%t.Jȭkͅ淸(y@%5ehqՀ$kK5kn ~1&f-.JЯ]=?8GsqQ@B>se^+-b %I͹0y@%S%hZEs<.z,@Ӛ.|-{}.5쌌 p}Ag&[ 8rV0q JЯ]>`E KF \=Q@XDk7>ĈepEE/%TEk5>~UJ2yuY=zRb*U\*{R+Kr6wp0A޲Y]ɜrәumFu5=}zr~RTA*!H#Y E mR)Gu5ƛF+uuR*HYxp5ԒEjyROTf\́U6)ג T,&xZCI߯U/[廭\xrtnѦ_0*`~\둺dP*ګ}z&FM^&YazUQ,{y8Yؖ p :"{S!6KLJIJ% ZA+xt9mC@MsS6^: awzWf:-{j-V/( 0b|`,_/eֹF0^kXF0c,i'Lo_+$4m TvB%RQ1PX݌15r&T ]+6>v| 9Ҳ]{ʟ}kN\s1U(Zh7缷yoTw5 HO@ʑ,R*zUis_ww =ѡm#V )o 5J _:s.s;L|2v.s;L2\.ޡ=V]{Yw17d;=:^>X[s q4nR_v_Dz»Շy$NhI!购`oM&W~& KT6&DRmr*W& 1m8'%`j݆gC ŏV 1q-aVo`^[gfA,UfD57o^jO.afyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0112-Soft Piano1.xiz000066400000000000000000000037431506652756400243670ustar00rootroot00000000000000[[s8~ϯH0ӤhMF$=I>2\:m$sӧOKx`~`{Ud0,۝_'҇ ړ/ÎmY8v>(,ߔ;]үJKv "j1S~w0kMz>>zctɮJMv` z% eq []gcm%}"K۲ 4 TǚTo6'6gˀOl7~d.-XЉٌ!@)9x_'s@:yjYvz頁Uz()gRZ˞8Sy@f)QRkѹD% y'&۽[eɎK:qvugOE,tH=Uh1Y= HSJm;G{>k2+gH&Jn#}`$XPŰ(ձRƁF&miZ02. M2X71 dʎKAY-JiǙ1[yLPFžިdf9j!H~ bY"*UT4uWΒ?Fw~HC5ΘZVjXZ}u.*HpRLi 5Gf+1mq5THBFS^3CݾOT RLĨ0ʑN+F0;jt":ԤcV^/UVLu#`#B0|8B ].lρ` Mrg`Ew4# Y`E\B1tɰN=`;\G 1X`+N南\@QͻHQGE Bvn1*|PL˺^ֽt/y;ɥ/E;薿L| aTׇ>(S}yH:vJWؕ7&$dr}A%5tN{FnU,ϲF>WỾ*M$;Ӭ&*Yn%6pRk?nӄ:yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0113-Soft Piano2.xiz000066400000000000000000000043611506652756400243660ustar00rootroot00000000000000\ms6_\C2M rF"glj/` 3Y%틟}?{3 #7j5vUq|󧓏? _K8xr;r ?AJkONA4qF66.{5qoЇ-hH&AY>C&Z|F9"jV_:.y ;qw8JeK MvIrr6Ȃ#s âeN-L PBVAlHN:Noρk3LyoU?qf% O`ʭ_XO/ }7"D&#N]B_ {OH6sH(`Ny%(pvۿbBA/% ;aHIgȾ /#|bOމCJUw ])χM8 Ckfpjh!D:B*o@M;Ly ΡQVT SɦӼi&>Ig-_9}*%46QMxHk>O2:Y<`-CAK%Kdq-.2rfm(i-Yة9m P)|իu頁Uz()?dQS-e8 ";y@f:(RRΈ5L]jvT@T&=Y.h[x{وF׽;KSsv@APG'|TQpKSN#0Hޔp)5Ժqilf-BF}%iUt݄UuS|όD3Pxd1ldKu䢩+6;G6SR.$p 3ILei٩~%Uȸ6Ԍ"xa"1fTǸF&S7P. NY(%i!Di@3X]w4{o߻N5?C5.ZVjXZ}vCMO!|qc¤uz70Vi괰hٔػj"^G7wm C ;ȠT6c'lrrm!;aڣVۓY7#99V_n5Ww*-NqrƁUoÈ墨RdfC*U TWNTTS]JTM멆+Go'؍W+$'$ ҃mz*w>Rx+垺F#M Yrohx?&2Dyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0114-Space Piano.xiz000066400000000000000000000101431506652756400244200ustar00rootroot00000000000000]YsF~e uUN)6VWD)D@b`Pos~MRb6'=_=|oi)΋$KwNN(IwooNv>]~|59=_o ;#Y{$>vcd5t.ǪEXL 0\i=8>?9<˲i' g9-EG4z8]ЧquO%x< G7񪻺Y-%QG%]yԆ_2HxV8(,NKx.(46u%h~h^hO6WFъqOY2Ugb|s}{>7u|jV;0sE;뭾6t9Wg:~';Ӱs$U.>O4Q>fK茫U :wSLo² '_:r˕w胇<[4b > PWV=r|}~yq?oeo~>4lBӻjX}m <й'~1l_~2-WRu1ɼnZ{ʦd[Zm,z)iY R''IrӃvFgW#Sː(NyTY@զXd$iQѶ.Y>v'Okr14x4 8Z=4Iڐk8 ;~|oѴz֍>Uѯ m?F'txy4 ▩[\2֏ dL0/@kIUޅi5cCM@鴝и*>4r.p o)o{F(agn` *p!os` C7ps{<9= SԳܞ,Kg3t5-2|h84.!eE86%q6~nlǀݑ΍$U?:]J1,2O8O]E :eڭs7N 6b5ͫ\DdI2.D2C[I uT!աu4âT-;giҡ"5{ݶl@nu+E'9ENSJ9)$>B;mCZ=kI.yÚs&]$F:۪@kHq[5c lS-d  1l!a"dy&1gd9#%P>jl>5NNx(Ot/%(O1;nl5Vx}h9ǩ%ʸ3N{-<5 F=5v(O4f}XdـGf{pcs&5,`2̆?a5 ɲ GQ6Vŕ:QC֧P쟍Rz?z0Y-Htc#ʦ<`e x-^H8_@P"rD͆Rϑ;Z=8rt@`FuV}Ń)o$K{!=svQV QZfx(/ Pbw}PfwQj@qk}Wc=}ck+(= *K Hjdg2=%Y)A9Pv(K@&OPd䟸}6e x E&ǽn+u*J4/ a(]l`0a7(Ǝr12?st>`(q&<9sdCF_C:%ԃ(y%JshՀ(ˡG(yOQ1&8zQ{ s<`c.>JPP<`o(yN>Ų%Dup%Wl}<`%ا(>JiM%xplZӇ8_rGQ3 yIG^P33[U#OXňFX][,5J J >`0z?@A,kQW(}@4n(/7s 6P.sw|KRg%{CN-s9>mi9FzNMz[1#W+شjWZQ[ìp\U@SqϊVT5f"O[UdH{[dGt]ܥfY9vX/3&%(/E/)hSe}A*FfVe25Ue 7Z]2!hzܟRV*1!XM~Zؤag'+ʐ(T@4m-T*Y2˚G˳}ԧjd4.)n.+6XNC*kN2ދfMSN%$kn CW*NA-+^kJ6Ek6+ޯ\"MߧvŚN*X8Q+Y8.r8Y4Z`w[X"Vpʗh˜ܷ& E bnbXB^JCo^2JZa;Eq;QHk*brZԲ*4&k: ҏȿ?RK_[%pެkqyr]Dٮt-;ZdwеkA"nD.ޡ<6I]{$w1WIMvtr2xSUö󨸆f*fJPnrGT@)_YEFҬtZVg.t͓EWS v/EO1 e6dBq F4~DOD{64*H_"vyi'Η pn+㼹')eOmlbCxm.oWV mڔ wEx͍*ЗZQ^K X龈X꽳Au2u4 +!/L$zxrUT^t;InU*#nU#o' ~fŪ^3s7A+D/@`-xyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0115-Space Voice.xiz000066400000000000000000000026371506652756400244310ustar00rootroot00000000000000Y]W6}W~$`Oݜ&(\l9k;Y+'%Y F;W3է((I_ίͥm!~Wüڵ?ݜ\r7?M\ly o%4ɵݲJsymp8̖Mˎ`Akep@lM&ɡQ<j?f.;w3a(@X Yv~,d P5J@,DgGlhDpƹ%"ޭ6(g ;=mxߗ*ofͩgro܏l =d=ZeC?02A/{jYqb0CIf/rO ֈG^ao5m_#>,q;$βn0C+fDra_ع+S%df+N7 / 8N*)>b^m^|KBQ4,!`4J[Lfp%@PgD1<J,>hڛǣmNw)?Wz/.]J, CQRRZaY\k}Qv;u;NrGSJ8KmQy{pr??ܩoWBN$=} !y 8ak1!Be  Uy+ҳ7-XAΨJ1L!BHɲP{Kt2N<{S(ѕx`D@"лJy=Uz'~Vr*~*{D#gw N @ R=ӟ?'/%ߊ\Bq*nQ<]RA$E$YI&h%s?;W2T!M \o}3ސ[QIjTep+0)VqbxO ǹ,)˅`%$n%{1dJ $$ *9RF06B䪯P I'qkLUApQ]DE/iAcVCFTzCCAg>O5+)ku>Y{Pլ;Ae}qiEOSKҩ1#I/w|Q9YEl~߽MˇEj,RuRVj2Ǻ!̔ϏpLM7cpsq_$t:oq9%v2Ԝv~?an, @6Znn&l mJ%$1-vk\5ݣ`ƾXƚk80mxm~Lk PL >gMJe6*vcUg2k^.G1lt{u:2V%.@vLl@l1z>YDQ%0]8x!/[Nayoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0116-Far Space Voice.xiz000066400000000000000000000026221506652756400251150ustar00rootroot00000000000000Y]W6}W~p' nNG@K_t[ *NʉdKz}h4sjf8%)ɍ|-D8duc?]Oijؑ^6 V]N#g-\$_Oؙ 綤n\vSZc?[ 5ЦFt؛#ˡ<0M{CoMgte |0KYJ.m{U|RF $͒MHvd[K&K g\莠JQK+qf"O}A# G}rGu`4Ohhܛǣ]Nw)?W[ _]-WXa>)gNw^w[unrWW) k^_#"*/~CN{J ќgoD2qH U֐JD[y(}ͿT0pz'a)ASJzNů]sЀ"vLaکV *U47{VR?~e!PT-6a׽R0IHhYa$d%.E uaX&BCY`oNMTZ#U['JOU{S$J!++\5h% A-E_hl#}|/̭PZ;fnm7̭jkU 2N} *W}s`hxej8cCխwt#_9ͩen7g5o j!{v4tH,owe}n|/˶TbI2Y['(JeFH L)|xDb߱}&8TA y[wJI541vce!hCW t87 cPGV(A&Ȭl[ôu,UQ=V)+eaZ6ض w&P`MUI*{:Wzߋ`ۦ[#f> w*o4_:&b6e1w־XB1!0Xp?tFSayoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0117-Space Voice 2.xiz000066400000000000000000000044541506652756400245540ustar00rootroot00000000000000[s8=C j2SLBvK dv^Twچ-Y[In)ݒ݇O?V~kˢ vb^t~]?}|7ׇa߻`ຳ#&ޕ yG+G]{m ';QĶ^I[N7sJ;C['[۰h|;ɸՁ?fC0tO4jtŮ+<#(a7Y;c y ɚE $ڬXaw10\2GYoZ(C# rD:'lCa\xj4ͧk~\gk֗TjSIs?~]Fl֗VF-&,bvUQIvk&I[sD6]=.FaS`i.sB]6͇-ϽjPuT), >w R!T6"CColW"O^%`Y$T@f F*O9!U,rW,t4o*}y:8C.e~xɎc 3ñ)yV:K8gV4z{>*2eNحik 4Xhzt]EO{ T`d (fx]"ܘ:-6S.9҅WRʗ6QANP.rY߽NiۯNiwe$~ZW+N%ljRRZcɚNP;QR,AYƈP8[CS=mR'>6s`Y[mϚ:lT8p-eɜdEdm,uJ:H䮃'Jsw:Ȉ߳K;EZvl jstiE]#vb\l0f +꡵^;Ot0xR0 *o)-f0s2ӗ {fQ==~+\nFg5eΗ畱XL1 5ga.o|Xb- dQ.\ 0ɾCzT)kz&))/^pVu2B$73[}EKX3Z-.- xlGŌ7E6*CD36* VyuCƦZ=iU 7jSjTZ7jV?p֖ /TG8yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0118-Soft Choir.xiz000066400000000000000000000030051506652756400243010ustar00rootroot00000000000000Z]w6}ϯp>u&{`v9Mm#޵%jl$KdOI䙑|uGsG·oo0sz~O쏷'~=MG׆v]wӧ.Ԛ:)$᪪?ϯɥ+LъIi#Nќ8 1uY)x)eMYA G;%^^AP-#8ï5(&bVr"B_D* 5h u̓(I`6v4E<֤X}|.X$ܠ F+>?v~rwϚQfK,j5o@hE-]UZ؜0"(g%)E`گ܀"O}zתc [d{ 99s({\jKj%G[„4hjF/{hKZ&FWN54]ZO([1Z#;BhZ#;Bh(p'^l,#&d}=LoN/j:jxw~߄=םg74(4cYSOP<9:YCϩ3'٣sO~K/N3QĹ>,=9bC{~[7]o: ׊Fdƹ4`kx&K +ԱVm\nޤO{]OҏEx*g/!^‚XD0NuBPWx  6׾Ѷ}& q$߲SM̽P\U5Nㇻp*}5Kňî}Ys^.ʥV?rwɏ/Nӄ@(:}r3"֤/}3//^t_Bg`܅)+H6+KX֊4@7ZPAUc--dK<2'ͅxp~O,3_s7,gXubw)|f\ujhfh1 ]p͝)[fLwYx=CByq8 "B88OH QQCoND k!US #}So|78eom'5 ABK.БSf,NސciϹs.:=w`pQ]7݈Ac3sKd+W09wDCBB[B/,!IB@O%>o%]~辏ЗQF5 aL(f x 6# %Kjv\h\hN,!1B=*k!_]4GƐ)E^x?1[0rln=h܌??WtYx?+SZEZ d`*@%dW]CuKdcsN$Z-WxȿS\[Eo0(N#L|"|ei, ܿʃ2w(k-1$8rh4!^k?4#L 圅Nz * nTDܯn[/t["fPt$e%T<62'f{~<m`f{EA5[*9-r||67iJ.:"w:ȬCvl %he47ے؊x yYhr55bxa)u8J֠21a*֣@nʂ#/aZ Q:U{PB=/0aR2,#ݪtB!3ZҕQVTPP~c nG7ԌA=uWh 9(J6$QUD솦Tl_4Ŧ;0 {EX0YxkI4~U⁙d4ҴX>e4AX" ѰRXj6 -ЎѰ7T9>FEdwy>ՑZp4ڱBU E 2jQ=`npXb/UX ;x$q(:$ ?SaYH-h3H/ !M% .c $oF2['|8Ө7\tb[ʉa(786J81uۖf*4w;nH54 VNr(mMxTlɶ;@E_B (ӍI^jg4]-LoI!3aJ*@\Fr'?)BxZ،[&x_.Ku_k"MG/I٩F RDY_Q/x{2%EKhS,M.eN2Fܝm'Uޡʾ8juVpRۇj}V8pjV6pGb;6+c\dyH [ a+~V$߫fU yg %ƖsQ,@€omaK8#PYjO/WI:yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0120-Soft Ahh.xiz000066400000000000000000000037311506652756400237340ustar00rootroot00000000000000Zs8_rĐdIhK]E#l4!Mj߮d~#b B^pٸo^zܛO_뺳t1ȥ gաBQ@?j/#ǍW$&+14B(_VF`p4Oox4" }+ltMH3,~ !oXM,<{|IפyLuS7mw'{۟lƀ>s=C Lύ;g/!^‚YD0N4`!xkx$–K(k~@?m@mMXT7psܸr#2ϿVoŽ~'dfN wJlT>{Dʹ 1'ql ]@ !y\8YXHS% ]g&, 3۔WsB[gU,tI•dɁjЪ@%]ָ4N]S ݏWA*G (,OrB)f>[ɪTѱcK!#NoǣaL𦯡vAcF4ԃ ^?;!A'X M!yň)J6d@ $ub䞽dy2=#*wV;5 ׃nYQY HӀ7QC!}xRi舒TvQ- 1˜nezyU;2g2eTr6*u+y8*k DeTu<"E^.T@I78#9^!Xzl # F.uv(KFa]oQ^d$Đ}@K(9 !8l$dbpd4Q ݙϏP撈L%S9B,{6ݫ/ĕLڪk1 T}KQ(&I"|w'V0փ b~Ƀݚ8Deé>=To?|nQ{m9?én`yf}_ '+ܥm0٠"5A.eŞ5݈jwl?[|@Vb ($Nc'yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0121-Breathy Ahh.xiz000066400000000000000000000037171506652756400244240ustar00rootroot00000000000000Zs8~_rĐdI2һ܋F"-ΖпV$K65n Vo]~) G'>.[o-D.u\zd:_ۨyt9 óP(ğh|Ĉ+yNٚqbk2Ț4hB#'H¬tֲ |E[V!s#^i$gg$LІȏ![ӒmY+qbZ9yxn&5c˼H}+7m:}9-$sV]B"1*KUV6*ƥI|ZKx^ 0SΖX gKy_|K=[sl) x4@d8q.qByz d ANtmQ>@RƪZ1\TդU?ЅCܳw㔚,Cf}usxJaO)j Aki1F7 B8i(A*\^.Y\!!Ps9˖)#k3TuZ3Aa-RF^xA r-q&{՝ y?*tF2ɿ EIZs!eӆbb\jIV4&ȸ+0^})MWeL뱊M-qԔmlV~%PQ|eBQʏ1E*0`R̓jbbMe9Ww4LV}%i5y ~Vl_DY^ˏJhg|2yYcQѴ9'8\F7Wv)t䐍)H|W*2yvzw^)7 $ gj2!(?JM _fw:˄EgH8§S#5U5 ES/t@I$`~Fr}EDz̓3 '*َW$z9K5(c kaQ^D$Gf25d4rwǀDO6BepE4Wɻ3C1 L8r'sHGZ@$lZ)`'Dc-@3}}PCͻ|<7̨m Nh$%Oe޸?usy`551C"`E W]ʣF}&IYGܸ5҈ea*܄0g˼puw|+ K m2я.#cʆS]kCrxHsBZ!V\yqJjnJпdS͙ #2 #eQ5h l& ӳm?Cuxzj@Зkx|m,~Fv } cje('IS<[S.?и4d¶m YP@}N ƫMb~wǭ fk=`1yT^'i35?g'9Ϧծה*̓[evK$x)-fܽ^>w~EճMu>NTNupw`T>]6NTC~0@q8LHhgS~pJp ٠"tm)|Z vrDlr +usHY?߮9'yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0122-Another Choir.xiz000066400000000000000000000050551506652756400247700ustar00rootroot00000000000000\Iw6Wpt#K^d<-'ؒ#=A$d1M.^@)mOwgKbkPg=0re18oͮO[?v`;4_kߡ1ʏW r۟od-\gr8\vNs/nLܘ"f!q(A\ˢX0[9tl ADhI1pm ؼE5Mgh& kn}Adu C;(fO߬_g_nV Bˣ1\n+.̢eZG<'7^Zܣ{Z`Q[OV+I;_֬>87Ԏe@1rIGw7X7' TnJ4'!rءO E:*=sp}Bʆ1!q80fî*o`̤-}~4y8fcԿ.+q1g'@z @0B; /BDO/ ఉ^')B l7~! H%!Rn[Dr]uKv UwRYl+o2;KW]pM2qD! *`yp=`bf7g2堕zN+m1+d42Lnx=gpq` b3G^ub.՟^'2 4]$ O (31n6jZ>N/PPqHr byi%t=KWgԎ9?<":x>vzAY&`7Ox c^>An8'jqb(%pkxtGk_a+?3Tq}+3*j2n0 'U;aH<] r9`U v%oQf1AbQh*uT}jsrmO@`pr>)v] !r4D0cë rL!O{T׮xF^f{P2W|kb&@ (S` mpfXڅ\R.TlU%b j@Q8*y#O"DEN5,>|۴TF Gw8|(akԚ*]TQS%43R2~Yu[U=J˻[q/?|-?~-OQJ(%޲I̷5iI+Z̊y@ cA ZB~]bYCAti㈬/vx P߶_Z֢~09:gꒊ!Q)WjXC"*] `N+oQ( 2!qC5yn6m&=t[;DN9KކVNs30%n]ܟ]&n-U@y I↼sc*SjDI2ӡ_{'8Z]= D$g咑 Ny4 a0^F.dZu9TÈtPH)iǤqq;ɍ)v)Ř}s8ߴ͋&=mmvd#_=(+kCꛈv'uy7xM LQo?!?@RoCوB4ݮ!'闡Uh>e0mݨlFf[76ۺQϴ֍Ͷ>mҪmm 507cyG켣GB>YB\lWWR !{(ǿ6WJ)ZU|;L2K,`nSuT8Fyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0123-Light Choir.xiz000066400000000000000000000042141506652756400244340ustar00rootroot00000000000000ZKs6ϯ꒓#QOj<)M%Ȓ#:DB3$co/(ɓQm*5آFA5 o[AB^m=W׭>{6~?.?W.N0VT 4mu[';qN{<ñ#Nֻg*,~ĉq}0=izkxxV q֔Fr۲CP,~ OC2ڪNĹlGkiGka=+{.l + N_A# `0gǭ1ʠ9 M _\/ 曜Z7."CS #.b^q&D47Xm%+-eCde?{갈 ʾ#9H}9T>G0:V?)YE4 >"F Ggk=7U*CűD.gOW:bXSd-z\Ǔ-{ "2E)Px{#P7@#Y J_))ҲC50ؕ*n䉵k4b3CNi +rjrJ"$M iH5Ș/&S !;49H٤XMIJ1"8e 8v@e2zJ4݇3.YXxu-Mj A,\i;enaOgBP{`|Ej[$e !ifgPk.wZ ҮJ|4vHb0ğ 9r=,$[UCk-K1hE1"po\OHKP(e$|XZb]㻩PT&Wo4⢈DL8b' ݀~eUVb!gP-yN:{q\A' qC8$%Zuv/f_rl&[Z\찂nj9'a0N!">]?>Y~HVS !"9COCy2cUXiFJTh7-%>27)0ܔgӒ>Pm8H'˓={n:xxd{)O;;9H+E7$h瑪%I l(Iء8z&ؔm`k:(\˼/=OҊgC+FZv9^Y[J8 na*A'%oƝ=Po*u hYe27xMR5,WyNaNr}K#;Z=kˬkYoKw6cAX MzƠ$Χ7bIX<ӐsR5bt+68'Y}hPIH|Nnľ1&T*&':<^ؽցI +A(šo眶WY "o=5{epɄԗJ+W{H>k-eNڲ' ႇx#P,#Nߦ{ zuCPurS=T__NTCk~1Gi^0" bdk݊g_s˿K]5f[#QvRDZzB*]i[ooe￑%Զzat-yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0124-Super Pad.xiz000066400000000000000000000042051506652756400241240ustar00rootroot00000000000000\s8޿{JL3M:\=]FEpklΏ4I^ ɤ3֬VҾ]>}~Z:G瞷sMϲ݇lw|oWٷ~ߵ۳it?gϢ!ߊ2v{KiqEyDfHmni䴁p4OnzxZQ{r钝o{W $ Q'nu#7ޤwӟ'ӄ[hIҶl d'dvH-b> %sÊa:A8TMLV<]?PSJ&MwlrwRo0TBD>u_dێYs?|n}mu[rh|`[rM^106k6@ƛb}.=7H.Z2CyӲ~le.wc]gSHSޥe* ^0S%?:ߑ`"=)J\`q)k"]hD8SeԻ~9]$G}?23pM@D\u悀.NB[X1R gױfR*O -\$>u-o ͥǷ}lLHV;kE&nN!kd"ZMf9r)xc .D̫fzJv9~F#`ߧ 7(tT>q Y7 \Xo’*CZZv="t$yra iDtJh1na+4=7q/IQւF$2.鰋~j!'2=(tvrLQotHUyh1_~]SxP*5skxitaC/+6l*xBP]Jlvk0<_h1-^Tb*rx-4y=diy\dY%L Y"{dDq4gcl;wmiV/SW,[OHRM N$ 1,4 q g^ !aD) rVPOkՔrs{ȸ)*Ũ̙r\UrLL!C- ml:H$.F}&72EdߜCFZ8΋^s'L,pVVSRPU52谸JBܴTjw%5jA& |5C 9]5PNMPcQ\Y"CWp2z H43"Jʯ[$qB(T#yC|<|Pͤ=K#*@b@7\L_O W~kfT(ǩϊx+h0x[[\$|yOi IΛxM@:T] )<[`mD}д ^AӉ(ۺut"ܙm:v"6ǁq*o褐biJMCjƿGȤ KO+w;ѕpsYm]}S_6p^,_Y#[%[%Ï^6eO3~یmE[%dl =$㏽\=63YײA;Բzkn=ֵZ6_iwXË4lxE4^#WtIc>  t9JnB$PUpL%y$lUד u!N\QtԼqk]r\fn2Wȯi}I9. Tr!Ӳ wV 4 ᅰji2dj6zEm!~njC߬3i+f}GC5- dzw$Cyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0125-Hyper Pad.xiz000066400000000000000000000042611506652756400241200ustar00rootroot00000000000000\s8_&.+s QlG[cْIgޕow%>~z^:'^sMϲNjlt]Y4zoѐ»t%0h[<ɞDp?';9m8'p 8g̥dX4TW)evwΤ!V$L`tO0"'87.ͨH*{du4!Kf|& > OdٱZD i(fDh"pLd{,3@Af=9OtlvK#jDpGzv*'kdm=F._W*5n<*Z<}F0'.BXo’*CZZv=t$yɞra ؜m۬ET^,JY6`ALՏAbY( ^ !aD( rVPOkՔ9rs{ȸ)*U|3#[y?Xe,칮"m?,C- mOD$RLKCu fuv<^Ž}X+ꕚ >:wmSR' |Toc̈́ :,"b}av!/Z)5sV5~ |5#P 9]5QNM3WcQ\Y,D^Q\S13TGVRW~ۺ^AR'ąUbRAO#,fRv8GegH0jq^bO@ @sTi x֯y P 8R1y>9s oz뚄oi;mY! 7EF/gNլiB&9:A[AR'U4"Jn5NQӈH6hD ”+^MB闿>dA4D:}& lai3>^S! ?ggp7uǯc?yK;[^MV_'nɷ67]/qk &_{еlPsD еlееlguܩo74\JB67tH =xC4vp:wVz W4z(&D UסT+8+>"u=$/?A%K*zܾ9c蕮ТKM#|N4|iT˗A GZ4Vhҫ{}!Dl >)k(]ٰx ه2o{<sr9N'9 6Nƀen^~zLqN' 4ru3?jޙogۚ4 O)SEyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0126-Hyper Matrix.xiz000066400000000000000000000075151506652756400246660ustar00rootroot00000000000000]w_=%9 r@n {}1X$Mm]_ٖ,#IVOIF|7sEؗ/'z 3Ǵǣ]Mkmiӛ?M7ߒ?ߎ{Yo/ҮoŊ>~Z7svhx36Ƌeص{c7d0߿}t{'1ee5Xi!5y^ Z>| Ȳ=]/t6|g7ڪOAE)@{B34?ǚa^:xj0O ,Y7J6$;F 2ڶYEwǜxsmsUsy,R{gZ_p-5-GG\#cYmzx|3}2[i J5 VX:7&2:΂$l!<6Lw5˼|K#mcfw?@yhIƂ;&ElM`(tq!.&2ew91TI2Y8L"åxm-WQ=ZO7+Ã6g4$GS W[II=#K)͉%r'#RamrM|5z"[Ke=^Y:w "kmf/̚2kߌgCrALFet(*kT`H(0I"fAx,e22q g{֜WjWn.g'qH ۢoS">'zw*v/儦Ię}tn'tNqpǖ;|Jc`]ɱ۲b+ co$7"Q ,N k "Rmu5-kșdNqp@'mBt|'~|bV|ftEbc$ 4M!^# OrBqGGoNuwk0V k=|m}Gh:*flTJ=vuEhu.=1T ;D8BkI?D ¢WyS ?VMCRԅ=M ^1QG7;y[ye;<x9p|KLkv-yv(,)@moo&B8mEq)*rnN>%@pyp7ɳYe\ϘWMŋ7w |ɱb 飳Aԋ"9+[a]{̥P(/Kc@p&U #f͓=,=H[LB33ِ^$^VяLy)z ) lzT-mbQCnPzӎ kXU b6cU؏%P~ Ad~+@KR _U,*?J<:k[^0_‡&cֽ:ʞ /DMNv*G7Zݯ>26gGgbؚYdgƾ4[t/f\)Lp;f'A1Rbq2;J{tA*UAUȠtbUV*W*uWXUzZTmWj*UUJVv){ l#믍3zziǣ֢3yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0127-Extreme.xiz000066400000000000000000000051731506652756400237620ustar00rootroot00000000000000\[W8~_;r9M@Y,}Nа~KeI.ɷ =㧦RI*U*WǟW BNݟz'ްqvu:r=n9?{(}$~pOɜ{{rm9DvJ9m]#RuM76L:_\fiet;&ףx6'kv߲D?].["`/~h}nZ~Z҈sť?)d5KOu``z ߁s;r~*0rd{N1ΛLf˖뜴<*%seps&Q<Zנ~oYD G*Ec]|e/rQVgB9$]OU]ytvFnLg!TY DXd*dvwf5' V?wU#l #G[UVv,K^x}13*+HsPW Cd9R3/3[yOdp!"AspF&3Ve"3 ?3lh(U ՝U.]"'miDѱQ>B?x2~wc1|xu\^©!5Ctasruz>X h~mKQdZ/hct剫S&6cr%݂Ue^f#_"X ߌu7~EO*{L d$C {|sω˕i -39 -QioxPz5}AV8حhcKy.! pYI+t1H4`oΩA9?q&./~9B*!>z.J|̋&Q@_sn}vF?PR%cDI!j0uѵ$ uTSNνk 6R"iBNlNwh7۫hzjOg 1&%C(%!J1) ׀e`9r {(4V %fJzJB]%@=G 0Ūl˦05dPw R,_4QrB0@J$|u{:4_чb0T7ctISC dTH3tr'~yxV9V:/2{)z2o:e 'FGtT2|(:'\pd*o(e7 j:C6`YjUxͩLoL-5]RNщ B9'Cב J"I$iIlq({a~2o˫䔿onDOS2]kHS}sGpuplL9Y&&ϐe"YlVd=_ϐB7 WX$)HoY#V6̕Ex- hT~G &OGȑrڀѺ`Eh<ֳ_ AF*wF7poGQN-fwGU_35pdrڢNd07ZO$ٰeF3ui֘4ڠQQ$GOsry=3keS;͏@;{m_eZ4l۽o)$!%1VRGV>* FT/\w\\|$ſ}!|kņn;* 0y2q[Q! L@AɠDPV!㚏~}Ï l;o~tr˴r{[ MD[?%֠ jЎQ4MǢ^)Ar ܎P3Ok7'%T'fheyE{4^W7\)ӛ@}S ht^M5-]%=D~UzIrw<0$!>ahYʆ2)dی\\YOTe(N~G浢!w/$w4M=# z?i]~Hݳ(䨹ױEVu&݆|ħLvMe jj.j&JN5YW ~Uc])hzX%XCvjj_}Eדl`|~>>/PdDZ{f(hq?Ql >~- g".qvx>q'28Na>E%Lح'Rgq4:NDXq ֙fa ,N> 6t2$5EEE4nYͷk/Rskڵ&<\r3\O4BDvʸN0d9ƕ~0Ƹث[7׫+l+Ufg+~]BAst5Wuگ+~]JuPWRԕ꠮T[v}+CK)>. >Zyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0128-Wind and Surf.xiz000066400000000000000000000054401506652756400246730ustar00rootroot00000000000000]YsH~` tXhږgkKF1~ @[1(/O?\BOb{o9yavuo?.o/fF_eMN-#2򣬻ӕ7{xIq72hIO4[32Sm|årN3 ?#paQCɈ*$Ono6}+1 _hǡm 7vPzE@B⻡댸Y֗t 7~M2^c9:<`btj/#D٫P_ہxa+ۃժmH 舆NaAryѷEe;&a8j<nFe7 LwdzL`RIS#ĮKŷzݵU?P\#榿"6>v"s+S10SY:O''͓&͞p[K#7&4Η.t"te {L#-L@a08 M@fʼnFq,b*ٞ1wEJ*`uqIx_7LOnK^W2@RڞG>}Ts+,>6hq`=*xpYid|Dp{mxgc@ Tyy_x)ѳcE˜t⁊2 d2azR"[#EƞAla]p ׫ AͻA+ 6TTF=儽1?^ A?|]ލj̃=8e2BhBXda2&kg;/R ?0mKl6B&Ux6l0XRb1h{gwr3s/)d5{x4z3;["̆Mm_ 3"!S}YQdApF5&g5gk _/lq=RDpSq%ckhٮQ E0EL*z)攣܃yu?a4V^Zv{LiAh%JE *~*ll{QH9E6 MUdP-T-xB oL5PXG+쓐a}ԾSU&/T٧nWU` r@uH,}bOe6+ "*Tvtl˱m 1 ۠ QݣXvLdak mؑs(QM<%L"o]G9V e|ŝ]E‚!>(8<ɔE$Nlwx.bT~4 'h D%b;bSS!,`UDۮkp +AFQ'g(k*UQ̃vDF\π] DU)Ɔ%6p%멲3VG89%믶=#ytG)yt]yW↔GNCu{{Pgk0%XdJkUvJu}|@NE;n%Z&#:{{~SFs\T*{=GvW|^jn_u#;{H^D EG)o>EG-B$|ORǚ'ߢ+*XFonէxkc&]s\ka#]\Ʈ9Ʈ)zc`Coz'|U;n]$uEvzp-;XݦP{+5{: d,}{0]H8zȮO kuM|*.NJy=gH2#%^`"S?U:wyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/000077500000000000000000000000001506652756400210505ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/.bankdir000066400000000000000000000000071506652756400224600ustar00rootroot000000000000002.3.3.3yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0004-Muffled Bells.xiz000066400000000000000000000043631506652756400245770ustar00rootroot00000000000000Zw߿>@riM 6EG`56G6#,[G6ι=ŞF3H6 O qOΟm?;8d1¡1wGpG~j'M5<ђZeL_][4hn܋Lh+;Y[㆕ [ʓt~ `>זd E;?^$bXLAjbӗw,Jnf}l8=s 7l\%(uad~ucl- GqlުTv(Z2G4  qa^~ %w0\ ĮgӃ=pX7Y8Ǻ!Y[Zm+-,,S_y/O=og9,t_aUlWauqdݖ˾Nfl#`c  im1[A"[y ꆐ~\9>_T0.Qu$+ "#;$5%U4JNJn)50 =?!P Ȣ\[3dwN·*z-"Od<%ptok]Ј (n{0>cK$ygUlG6[ea'LB}\ \.?uGE7`W8L1*ZCi.bfTw Θp s>1%[9 PR#}(?HkMֲM(x0?оzӔl6ynP̾r1nAZ'̀j0ox3f(4)f'F bEq`4ݓ-XdŌ3OUl׍Fn4UѨW -FS*לWuکn]vzN"9[׫ݺ^զ(ڊ>;b>dW `^nCnr'/w)k" z.8_:˨WbbW7+0cv!-?C>}`{ƛK)?/ ?<0yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0006-Tinkle Bell.xiz000066400000000000000000000051761506652756400242650ustar00rootroot00000000000000\w:_mRi{ldcrL 8w FIl~i A/oFǍ t|CKiiԳ|>notjbw;ױM"Rv>xJu$"h.IhҊȽC<?\;8%pkx4Sԣ'ҕLt6^^_9oK]#5>; hmBjÌO4limL|%X:%niWd9^$sܐGs؎ ">+~s"Ӊ&440/݆z aSLZQKzFO` A'%|'w,>qμE5/7u1s0]>.KOu߷EZ鸮otչ@sIDa[hS[[}uK6P$3o\'`1 o("zL4\Q2Hb}Ƅ"1 tFf~D[b6XiJ9[N.4f;ȭrB*4Yp.ISOo)Nn R6#_3n r7K 1\|/@AfP<Ő5:-oJɽBDQ" gJ^ =8v.(P๧o9ѓ "e!3Y-( Dy ޝ4ȑ7`YjZN$c8a ͻmeAO'Wj֨aE=XZjch!&!G|Le:+?mԥ$Zu\ǣ{0 )ʛw˛C"¿o Xag5hrmxg&&9nO뀒4%b"|ׇXˑ:ݩIQ``3G &Dv-Y 3\m7sds8?-r)om%M$JZA2^Tbη JrzKYih :GO-!5 H^SB*|nlbЮ Oho9~?+TO +'Śa_|{`(>gTT Aee*]seѩ 8cO&;?MnoTqvQ4,N[aK2YTلyYĄjRr'gf\ڙ`V^=bM$! "\wj2ESt8=I\,sޝד|_N'+7%*$PN "EEÉ ZD>)۸RQm@HVpST*5;U)F $/ UUr "&%$ʎcWQ\)cd{Ymjb6@0v1=:.hJp*}ڒP 8x]rq:;ϥYfCj- B|T J92eqiػ\ ,GخƱT/FL=6]> g|,%ϭjyJ1]g@I0;d:}&6Z&D5*TU+NBIUIBX^k*Ej٤[r9Xd|2@`ug -ȕn(|vʺqnN?}VRvʱ(gn~(fh!yRH0z#Y::fI%dJHR\-0KYy4,Dy3 92{btz{P.dwԍRp;}xЅ|N/n=^)"nb*W1^6%Hm4jHiSUX9p47ܕRSR̳ˋqiRNT*B10JZ0$V_̩7}6- 3R^<:=Ҽqu|G{mdD#~. Bt`aGˈuIƣ,t2^1}53шbM'$h]L=EBzR⛑lꌸ+.|l܌nGvqm~7ֶe(Ek9¯vh!YƆ *<0 Yr^ArPAN׀deL~e|tt.fd:_] z2&>Χy,#|$ET:m;OWZï7WcW^zA7!-"<b~v e0dc.M❲a= } e(mLkͶ:T#S 96fYG!7B,ۮ<`;⅝#{'Ei ki@ɬQ 4a̿L!um ؅A]\MwJe|iqSuAlscOvlseZmZDA(b&r2qGtdp{I'SSG_{4|ӵ5|0 vfuOƳcJLM-*8Q`Ox[yXObL^T_.v |` 72,@vO-;> Q"υnûsfۧ@ L:`PJc KG;+l?'za$5tau5Z1KPK"1%}"|w+d0rSd(P"~LGs݃ f[ˎt9E2ӁD1!* /vK1EUzUÁPa9ֱ԰}DӚp~crn~Tnw /2ygyG Kxjגd^fMb]jdv-3ܥZ=t똻Q3^( j'ڴ|6M%J1d/~|EqG(fFSzl"e OM c*( rő1 gJA #tSG)WZ05/ј_1 q'69F E+bśX~` ̴MhdA,ŴFrw{ 6M'P3S>4,ƹX\KA.1S=1ۋp nOpE+A.#@o2ض2VRTz 7g!R*3"E@wz`04e<ͽfP?"YÀC !ڨе MWG {">S@㶹;KhJM\_D w@h @W׳b&y5mï$a~8S$bi4Ԇ_p ~;qL7˂[MP]{ij4oE10+(1K7~-GZp7[pWpawb@JlAH:8}P?w$&CUϷ iRi${6zp,=熴_N̐6z`M 8[lRH i7UE *1zCT?ȱhY^ I][6^>ˇZ׺~!RȘhR܆6bjy?I4e_)\F7Cv4Uu%iŰIB*2iݥWqjZ+Q4 ptZ4Htc@q :qG4BBZw U0pM/8.g C&l`Wv 1Q:j^hW%3R,5Y{" ;QѼ53}2 T2&wT6L?:)>5o+'1 Uj9vn^Y~W"?uES5t\*yTq3svh&6SK$A@? o8fyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0010-Metal Sweep.xiz000066400000000000000000000046441506652756400243000ustar00rootroot00000000000000\_w8ϧ`y٧ 1! t dv"qkl6짟k,YlMi6J~ѫ_?/ƚM뗓y|;p\vvsm?W7~q?S-H;^Axl7OtG|㐭tӦƜ⧄vD#6vL.t5af<φQ?7 &Sxaç v\d:.Gq [P7f,YH\?ՂqŰh sf+stLSS 4"5 z:N'\Iy9Vp4M F3YL|}b5[j S5_z^ߍ73m] ,,mDQ5 5s0XlmϨq̱vfɤŴ7$$&Bq#Ǟd:%Aq 8::o2 sxֹI̓01h[RX ō]|dl)*վ;R|ā \յB)d~4 E)d\w8_j6^R(Qxn! rO )'͑Ʈs[lKfx)e^ٟh|&!`("aZH Fvagf)1dI$ +"%4*gDh["а3c΃f h$ \$z 6a9p4#?۵k&NsWřbʘD 5:̣"QdR*Zy!"`x+ F(>u#o} ud'L'WAS@K5%{ TYyǹLyܣAHvā# o,7κGq`<% _9n-TAEi#Ng#95lm ’deyږ@nGmT8F>($IRcP>DJ r-T8CEҩ|`%4d гe!'ӞӪ~<ʹ΄Z[jp9⥠%%@>T`.KyZ`RO6KJ:̞hjx!KԮdm[Ȓγ$EۢN IUh',LS bQgEkaQ4aQi(Za}#0kpf{mևH G%hﴃk~<4*5~7/H~qkFPihTmjhTv$j4S^5v'@Ŏh4wa;hF_5{QQPQ}F/Nqov['͂]FNhF2'm&WʫIEpSٛ]=./Uzw)wdgƽz?{~~{/)W*@^0 H#z!&eϕ)77Yr=rS"톣~-o FNILMZIܽ5%q+8Trqf'Dq" ƕ 4]xY0 /p7L([&/5U+FL ]nz|T >xh_7>,K|5"O\3(ayل&Df^U'k{1l*/׿>hA4Vyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0011-Slow Steel.xiz000066400000000000000000000051331506652756400241460ustar00rootroot00000000000000]Qwڸ~`yς䜦{XBM {{_t چK vnS[3I7#i/_WNmK˺ssYQwYpY]OWݠ۳f~ M-;YyeU_l7ҩc}tkǝ ss>F#3X"4̍SN7Gt@z`6Lkl&) `4Fo~Cbt5YQ7<,Ј.>:.)C4"? gc@ 3<Ӳ>g//c`4c?`ޠLT:ix{g-}{UcjV+[jՖ/yP;Mߐ8 wk|#ғ ɿ,EhW%69LJz1ʛ gۚm]֛B?2sZ0wDL4V')sYmBǶK]ҋd2:KkR@]dL4\屁Yh2UXOANnnLCzjҰ{t]P[AsKoa;dsd덻x$p}H1ahCCGp Y 0x[%G?(y:^}UomЮx|jr_a?wLw`*,=8s$tIڱÍ3o'QGE3w GisC;a\$r>(z2~05 7s3%g*t#H?lKru|H_m -ӹ 4To^C)4]*^@x.e6 ]fq;n6oHKZ @YN#vx2F}*zPs\R db/j]A |Pۈ5 }s%g} gO4 )d(¶WJ< 3(;{˻8MoN*P:E_JǺp4S9n2jzO 6 Z,1>,xy2ybe;{hrY2󐭂1C)Ĕ2ȁ"(d0z&KG P|i Ҫk <6#J0< d J>ȑb[{a(2](5226D(Ҡq}"+OA^|w/X"ڹ X̸T>PN'@x؍'R(%2ĒS7V]KNN[M$g$3(.*}+ 58TQGUx4>goǣȑ Q]Y8z/!,]pMQUh;ZUTUh(RF*4*f?|hg+4GdG+4*_|vrBiln Vh4uhr}hTs˦ʍ_mtQ~BM= +4ZQWuP/W *7h{|hSAluR_g݄f{wօdohF+4ZQk(.PoF/. FPiy4oY?e3.25 Rhk-.639I{Pc^؏$zB)_GuVgߺ?htY^=^/tQ'o_U?DO2-q@EJ/eB|(MhHe# EeVD5ZȾH7G!&${<=ndo92ϵ %|55r*$$cd}amIdJ.-c!Uu!UydW뱆DTxE4^"W4Il g*fJ׃,z>1^ys׍ z,{^4 ]7kz1{еK_Q1lm vm]ێ{*)/{ 4}vj&eM!cC죢4P2N ,|CQEtd)5.}gяwvK obQ0>) hPoΎ0=ҷh k&e%iŶۘ%yT9$,S58EP*F |V,j`A }P F|}a2XuȊ;HP#:rKN̩6Ds?(b&6-^J+fMڟ ޹mҍr)8}%R Q6A@PS-PWRվBRȄgh^l^uzSm@JҨ}"iVSW,ZgHZU N%qRbze5 cܐKT&6,A9"FNԓJ>K4W\:΁B]YdΔlf҃t w&N抗NLfn!8<]G.X'AӒuPaoOSo|?㎍LxW%'0_/ VO`a%'HUuBC ]\R_5kMeiDFeos.kڔv8Sfw;~ ݉IFuf._nq>a&urjv});m8q*.Ú*4t?k;*3t.+p\X_cFF+pbg.@뢺U^3 RmHxu kT;u -SWԜT;u OT-[WݺR֕jTh8jk/_ R8Iyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0014-Metal Tines.xiz000066400000000000000000000264321506652756400243020ustar00rootroot00000000000000v6޾ؤk%ݭxmzlwfznh9HEx~%@%P:t, bw?p%L4q~w'J N~|~p˧ο_n_ao?{7 N袻_dԓY:Ý~a) wNQ<|H?&I4vއClw7 pt8^˝_vt3 hur?==I9~;8pe.!17:J4ۀsԚ.{W;܄[F%P1꽌fCWLddbyW>w_Ƣz *q1>:tyqCH~I4k#|& %/0k@0ŇgI97%Oswo/b֎;.k"X]NFiI i4Igc۩{wKSO7ay %/8ZEMciIuv󃨃;Dtҏ$F6zZ#qH:E 5@/\QrTs jyWo_{[wvr`~ӆO7 *AQ'y'Q/X~% }ڸhȆk}=*{aQM1L&̀ o$|쟝ŤT\e2 4@&Y0~VmZWc4&@N8 q C+ ~djͨv_+o}s._oeSL4Lu$Y`CR2?oYb9~&n$fgCkTR{LkZڐZ}+dHmyVT/g4ё:a*6 VHS/.黷Kd/u?lL}{J'`hLb67&3M PG]A6 oIuV+cyf$'sqD09:IA\<ӧ2E(=4DSawY{Xmlr9dNGYJxV[~gUl5LZmVĞ17Ztf51zwa6juV@gțSP=$O'V\Ik7D *ƑFMGHOzij!|E} H=OL-FY1hc,Қ{nK)H{V߭ABJ랲^FdTU$Ӟ/ >{Xڐ-{BKb!nIlF~4zۭrWhGˍe[4DF9H傴8"ՁX$r3a(ҧVc Ym !D˭->8Ֆbmi%\4S0!PŞ)Th}-sB~F#o$r;h%n1[ittHVleMcyIg*r4i'͝q|K\i~ѮӒuʼei vB]%u^zj)BKӒM:W:-!Ԯj)۪kp,MW{?je0r3pŽ]zw}%ިbE.VݢEG*܈{ۻ>pyg *mZJOҌXY2\>HY"Ni zbԤjhy\ܶ`ȱ:=sn{_ιi}sS:綧umEZ kv;cYol_emyO32Zel{o\F 9FX8FigX-s,cazmwdr,ca ;XqͱC~62NX?0ZXŽ8FXgXŽ8FQ?1h"eѧ1es,1nca oca2(2N8Fy`X N9F`?3a̱S~ms,-s,cag ;Xmc{q,9vƱ3&d3s,#ۛ968msYnsyK9{>x~ek?/O;8oekDͲ5VcEsb9 6KXAɹs"+b+ﱢ+lX {ؿ {a1Vc=ZXK%rkU Q2Y _c-xNl<֊ZYZYs(kYc xYaX*kec- x8l+;gֺZ7Y>kg6z |ֺK`un |ֺZ7Y>kgun |ֺZ7Y>kgun೒|ֺZ7Y>kguu =p9*"*>ƇK草AK԰q46,'EpI1q9~4UwVypO)pd%yu>*,SeczCVQ;w=?۫wʿxk M0fu+NW +e.E`'2µ~w֮JT7a;'W=}Y=*sVk[-WaݚZZ?fxWP7y_^cڰӒL|}J,sMhЬ2k 2E9Ƿp?:пME;y॓N̹ϡ~K :{->>x[;c(ofɵa :P-@j^Z_ƺ˃)o"5 5T=u许Lg|TNa[U}*NAP9 1avE%h7PCYTsa32R*.YBŠ oavc[]T}s#MTq?=m .6!X]l6B M,B# 4{j֖MB"-GB"0VD0cB;zrM[}-B"hEd[S>iJzЋ !P~r VG2- "b3i@3ҔM(*iڷ**)SU$bi\tb..), uXvp5)DȺQ'l&!WN)hA3nEhO07Д$P>ʖxb hfzPF톙bPziPFM!!c% O , GK5 b$2_:*4՘j8s)ho2[T;kZu;qyrc2e%zuʺnbՒZ]V[RfVk.en^&޻wyP?[pZ<N=,66.]۴˩0<$?^5+{d<˂4ג'e/*ЇmGe ۲3=#eѰyHrؼQ5o dj&[ƈRľ5 qW7>_6'?|.ߧ I4(uY&7Jq(>tYnZNZy3k9ix,ZN Ge},!t8G5BNz\`B#l cOe9$y95^s.=_8D։]lAR9(U0|5.Vs.h`uXbι]"9E1sp1S.BFD+P1+5Fp?~t lSS*Wby? 'lE ԟlD]ء́,ȿfQ4߂Az+Fڙ9mN]@Ě{Xl7!V60j8"sژ1 ا5ɒ#%r"l+bk4n>g۱5b0V,'bkĶ<*a$% P9wV1Aaa-؁\:\'jbiHm%r3i޾[ hq DZ9DZP,9œbJ+Iش %Zlbl1V!WĀ$Z.CJrt(bϊ$Z̘0AL%@K\,Vg**@n鏛tX}F:}W e:և!z,h1݂-ad11+"mVi1g`"QrGEZl0Ch=c|4.J&oFuFh1FPŦ#_P%CYV{BAq .^F+h #mvC9nK3_ZjGiQUtx\yB8 .m"'M̈'6/-$aʬ(IgP+Z ouhbX]~Y0lZl\bk0i<6-b4dZ =boFԧ7r qŰbdp\1&Q,s5s\K>ʽP劕2+0`:-& $ *UQ+0v 1f+FFX.c?3㊅/Q0}:a*]tŠ✋4Ss\1Sz`=lmj^+W./?kzhI9_,jfq\1l9KcRjmu\1: o+f5aalR
    L˛G9f}%fۗj%b9e v=b%)"C,S/|DӍ(\vڈBLs3 q3Y\CD8=f赘brd$6STB -0VL+ֲ#ZIQhA$h}[ %aN,a!X VL/lc`k h 7}"@6oTP,\bϊD^,R#.8šKHu[sYQ/p4bCinAd9as5+&<"mկRL.6?">ۭћ?kF%1hhv-Wye:Ur6>iIZׇe(?WY&ʆ)5:~QTX+ww|ɷjkhH:-׮Seiɷv\zӬ]iuH8ÊNRaVWptXH/ouX|&> a~VePZiI:唺G~UkG NƳ,xI~ʗy[5H-丁˝/0SÊz-n'TSF\ޑcDlhK]/lOjr[VZXۇJ! WL*&ʥʡD.Fg5!%r`XLĚ\Iqi[ӆXF"[MĠ*(K.jycKD#'}F˱ OO| ܌HXmKd bkh15RB @t^NjLH&#$GbVȋ>'NVŎ<<rH:))i+lZ޲,tcub8IIqriyŊ FРD *HPFMG*&^F˹Ћg.WJCKM2$rᡘVP} !a$BZbثE"}&*i9L=f-cܢ,Ydځ~X r`f Ӷ\$NQaYF@r`1YmҵvKͺ-GP٬K\+ﲄS!h.ܨ/x|} SNuyrRwX;^Qz_ 71#J{RVVGs`1?7Ч\OT6i:! ͬ(%ߔBs̹O7w/._-Eϗ(| 0Xb,b,Vy E_ cN=+הX́XRcs.  zU i19 aњG]!<ݡp8gYu4Xd->F(Yakv.buP0I V1Az ,~Usb,$vb,f%uX́X́з)9 (Ӏȇq6yhK@4S]^+Qα>BkvL1J&"l&K*ۊe`]ݫ" =+8a&p"ij+v&·/V. *l5rC Ic$Z8ۢ? D<.WJYHD:;cnHD{Vn+P)\>Th1B -@©b*Ycwb`d@DGOnbnn!>KׇGh-r5r5FK͂ͻ[dZ[֍"r P-r@D$ZE }&F -fHQhʟǥbż}1bkHZEy0-g0!}5Zl1 j=!+DZ 鉽hf!?}ߪ=9U/cK UKAŨ24Nx6ۤlSZE(YʽG$ 'ʆTL‘JE\-Wo V=UCp ":fBb7#z/%2mtb*ےMG`^U8XXn?uTw5=lV]roXPJ,*Vޗh)AQ C[gGRv?\7 bFk'" y S*Ar[5]k:RŬ5n@OfbBkITB1! >:ՁYn@XFxb} j*&قP1V!F̯-#ku Ѽr%v=5Zl 3'D{XL,+v(a|yJ5o݈Jˍe$'VLb$ҧbhHD 9HX'Ct^ya"qbQk Z7pǡ7ֹ3pM}A_Zlƾ5A{E2틽Xc!֗Z/DݪɆ9)ffH<$rHf#=*g9vŚN8!ue89XgMMkw\1)bT W/;/\~ɓE~s)c [x/iܯiK: ̤@h߃QǫX=3_ G*4$өWg*ԫ/oQ6K~E@i8o},~%;w0ݳ?> _2L0%^M'5 |0?(DY:h9Xjc=j yl2x;t7D.Da}ttkgi27t\ ?DDh1o&d&qc:l1to+VWqWqWq= \ܽ$p\1s\Uj2h_O.P/U/*\ԨN"I˪"*xccm%&G2b,U@EN 1iqWqWqWqrH 9_$Ẉ dqmE9bY7(EX, "k Fl>εbk/(M@HODo_NPUCb<A:#9#Q) QOOGy0ȪOpv[l}`Řhj5SoohWbє77?vPw NtDyfFIr)tB N,4$$r 1GwyW<.+nw5\ᖆk7E\!aH7EŚpV#չyFX#5p7hWOɂZy3kyh|tAN2@n|`>uL0U_8_^}u&#uU ~ ft-G!#a_9~?ʹjɴ>E(5JX{׏ ]ݗ5y5=tZq8wE#U gk^.]:.ד.]. \\:5-\r%GՂĵm=z<%J‡a4ЂkZgaLlm;;/8p$Fd]Y\FdnM^>$iyf+zQ+vk-\kqq^k-o{yMDy0ZbVO+*ox,>Y{omh=l$e&*xpj3+NL5dnͲai b_ۇ~/ͭA+9VZAbC#m!™^0NэҶȆi㑵e#d~FHlcu'M对59 fnfO?8Ηyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0016-Soft Metal.xiz000066400000000000000000000046061506652756400241340ustar00rootroot00000000000000\_wڸ=K sarb-جmhOX$lf[?5543_VKk˂Fyb;tx?=h݌go;8NQ-H;Yn'?49Ous1툆6vD.Y6`v<φՄԟCҿ)14jZ>GXd"CPx5QA}Y/Ta/\}sS1zFcN7SF-iJ٣{taZ9+4s;`t18,xJk]"}d(,5αF鱎&Vqcx%P^bh\tSC6 '?(ZGK7e.j#p>hl̚D?'4Ӎ&c FxjzQtT{fCJB^ŴBy6b@2{50fZ96{j9ŋ@QEJ$EPYDn`eCUʲEb`yVqSsPIP#ʤ/_{ JMB ZN QtmzS1}  ?&Nօ9Q IDvSK "GoǀFlA|LiһPnj yQ6W"|ڮ,0O0R ٞ-vVKP j@yB[U`Es ; ͑}:Pq>BJ} ,7˞)*ubBn;G7" T[fyxǝ!Vf/F_}%wh:e?-#j0,9 )[iqЙ*ڰp ,#MEBBߡwԪQcyŽ3FNCJ?3B.ܹWfrnQ#DQIӒuP[[|_hxoI93!)g!Hj㖔:SS΃x`Gѧ;˴g28 4sꉆv<'zeOlqG2'%}'/жj]lsWfrQ^d~`N5NJt_4Gx=xT~s&'xRVQ8 G]}5-^5XՌF1UGe_F_3=GejF3[ʹ~x.4mcШh#hT}3򫛣5Jy{8hFCC F(Fΐ=4*^hF3hTUԫuo;??WtI F/=tCcn'I}ޛ$C>y`{ u*(i6y":- /ysDBTyqA؞tv^qX4N(в{bvh 7W;HJ꧂њZq򩹌k}wS q!^9DO?$5 aj%9t4ǩn ` *Agr.?7!].8g[5ӻx 0]>kkWFbj; xΩ?߬_"o_nOVNJb+ )Mhv\zr;hEn*`>BML|aHlaOdZFK='%0Qi!&0v)z~?wU p˽L]2S-V>Air*vLI0Z`?:`)EAǏ'W?V̆iZ`5qlV%,#G9v$ M৙H$j =%<ɪ(L!̄#NfTRsQ^M/>DY(>GF$NSD[Ů؄/P`!UP`P}>e>^Ifv? 4t|yEȉʰI6,| J "GELTVST*5}HTQcڌ]f$%>P6qǓ q'(A}Z>U:yU: $+dXH?H%QgTu .BK.kïRכ4;k T$D_i ƥr(J,8 ɉG6VR:ˡڕA5`uS&S&~Lo&C l)[(l]p27}j݇Zϻ\ۡvqB|a$[y_ ѡM˜MӬl{}ɬ6m3TS.r+!n`@Z"`>BJ/B#/A["ڊ9_oð9M7Tڻ4Uy#X?&QQ}:{RzFE/쐍l4sFyl=:tsmY*uY]_Spb;J^9{f}sx<[ s֧BōH4Q% 7y'?g5rcq0UVv\yhïi@Wv  Z`n\\R$͋zEhNu[ʋjbƶΎGFT3=do{H[yH<~jqƯ`u*^5~}N{i/ƮoF oAyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0021-Bubbles.xiz000066400000000000000000000257701506652756400235550ustar00rootroot00000000000000vFںwD@Rkř#ə`A$$#!h~Hh+T쾊ChC}c:{ 0;ho{yO?%w_(h;&|I#zO}>Nj/4|_t6? QHzd/(+Q~YxO/z~oϽ8E4x9JxE07'K9XW~{Q\{dzG_gCnxs.:{ǩ7 ǡG?%bK:'b  /L›s/|9 "-xyA7yC0R8+JO]>h<{úx]Oq8J"{zU_|^eM&c*&m^6N&{a</~sOyxbG劢YPuԼVFzQܗ4RW1r{~/D>PM?W}jLg(#70~ 7Q|jۯ"^+WSw#|uGPGZqv~O+nn<վ{G=x&}B?lxpA|i$T<,o0/|Gț8/yNQëS AQf=y8LjވZE,E˯. nh({`I4PQp+~\'?iz>ȁ9om5ϯJ" 6ٷ.&C(nr2en>q~5tWjg,[}Am(~X1?w|V'PL#՘4uy;k!JfJI,kǻ=ӏX qL| (r)blj=+Q> ixs7eTH9gEUtu^_Sxr3!{ñ2ډDk\0Pr 8jzq*?@݂n+%[h}sԔZ"֏*bjhاB'oT+;Kkt2X#+/D;=1jto7nBmri}$V*\[A}"n!!9ȍO{FuX}bthhtq v>xiHm=r[9`S:?vqO5 t|KXDG'i|ўSQs=h{N֞="sn}jzcs*='>sWE׺A6ǭ65YZa aZ=!|nsԂ^6-l}>WY/r2+#Uh殫}]əB oh$l `}3y)Vg8Ua)3Jh92Dy#?u5*`q`E5)iJV]{6Vm[ҷ:osouĢVڨ2?ުr8plñ./ܮ9p Ii+q3\&69F񗌒9F9F//#7s,ca 㥌oX!9vȱ08vı0 a6$dq,caoU ;X1@9FS,F ;X1hL 9Fk-9v±p,ca' e73nXXcaxm9FqXXca 86X؀ca 86X؀ca 8F^1'fr,ca #N8vʱS'^NccNcdNce-|7ΜHΛsL͡3j,[-VyK5~"?7XkqYZOuN!YFQᜲYlﰖ:ʨ5֢ZwX!X k9dka-;#v#&pX1t@XV,[;fk3,Nt6֎Cq!Zc 8t^S6Xk_am 85>Xk{lAv Kb1$pXka8Sశ ^,pXka~Fc8-g6 S6pX.ke}o \ž}o8c7pYn5wc.ke}o \־ pY.ke}o \^k \־7pY.ke}o \־7pY.ke}o \־7pY.ke}o \־ !p7H7?_n̶!)B odmͽŌ,?vFzyzبϮ ~gI+ف¹i>,ZǦXe{TIMUR&6v0#(,r5ViYטܲ5 Wxg(KedMW_oߝyVjNǖti ,a.OO\ٿJL.)Wt͜H ͒+6KSkXMKk7L#Qv9[OCo_o7y/~)e^qezYFڒn}QKeNW{E@I$= %knyؤ4R27͈z&KPdt2/Ecd%}Ez>"]뭻TI Vc7{-XH^9?AjFzy>ȟH;- \RPulX'}aT<ƔjR"{<=6J&`3dLoK b&}tf7ofZׇ6ZZ_3⨥f/:az,'l@' <:tQtn.'Z/rvY]*"/3ř۵U̘fnlw/sޟy)[ȓ4z/xmnmi*yrkL͚SJ]>mW GW\+)鐂U"ykk\{53AsNiu$ģ0yAbMwݷHNk)2Lo6{_ TPGA.[+,%rsUB58y RQM0\GlGQ"7(&lG,AL`6m7>:KQ>|zHŊ\Y(Rvӡd(tPWbQFәo-V0ط"DB5 5KsmZnw0qn!G"MCRFSP0N$l*5h a]TVX[D Znw 03TR-T**,Pwׄ5M͏JX#/Zn8^\UR /h9yn>MPԑT僵G-7!Kb :H6@ȜRn!qoE-4Z̆DBjnwHUPh*I40JEMZBB& Pp1z' -fMH|](VH&dLxPcBW&~/sa(DfEW>&+KVaO(4el[6єc6(V]vv;e_fS8{^~#|z;gS~^\INE-2w=;5JvFk,/NlxOq8*$A^Gm4CY償@Ȼ4(]m][5U"3Q7;F5xM' &ڰfh~VN{Q)Bذ EZlʆDzs|FM hJ-d ֮ 6AzXBvH\tN4ZrSkW$r .ۅBJ،)ت^sp ] .C9(?h?033-ὺ C%vcubO$Ђ=06v^0le[_'-˃- 2|jR˚-lh]:wꨭwᚎ.~3Բ\- Z3vJI -"ZeT(qU2B˰fehM2 -N82ZC2 -ˌc]Lp0家1=7X)ZAcZjZ=s?Ib8=A~xjB~4Q(8&5Qx~n4Tqqe .!بNSB͆@6LyxHݑ@ +b/TSB5Fp),Vk 9\[ӁN:gH)\B؜ +nToeZfe^ ^ix8e6s [j e 'I0!ZfeЌTiXbeiT1x4ʷYj鑍[^Xj8HQ Բ,R2XjQZf"xlY>>p@ٚZoXj! ~V!VOݫd3mZy+з]U*~ŵyw"hez{l8g^me~R,R f=*΅Yjiq<ةؚ%|0 5A(=[Z]6>貭`ek.G;-hT ĖZfeZ^AK-No> ixO+l҅/yxzuKZjٲ`Jy6rH)LoG@F)3zh0r\lbjcPu.zOxF^; gIp(vYԲXH" C0-5 AH3(b)&vVv[32b=!0 m,Jp9 -啋 -. eX -E">s4^!d'*}$e_c<ÚpޭeNOW!34rH˱F0Wl``I1@}*60`jX`I*bV[J/:rT rcUF)h7t거ZdIt_l`^0F$.,EMn$}uu5ZTEF!Hb+yp9Zar؈#1BnIjN~21:F렫D7RXG 4Ċ b ebRh:!7ClhwFZlŖYlŖ)@tz0䙧2-زJ܏/ ب9:їMT"jQ%aמ^C+,q*7f{Qq}<œ崸@'/:zlbVr>a0zTydYKpvض*oj 3bˊл.˧-,MoNޑXR@X41\]E{`Y-2-dF"Y)ʒE,Y l-+,b, D^|2dn # mu}z#F.ylg \hE@`O)&z\| AV{}_G6sk-SLe4i,6S [>)ji跶vA[vq~0ۛI7?ɜѤ}789#hrv'q`kupv,b,br8rD7Ց,,; ,*8cfe*1b,l٩Xd b'Q\d CpŎo(Wa(@c(&8yX| -EY(5ڶ5b[tq$r.H|HOt LBTz`Ku.i5Wld},i@>5jN\j\hHt_,Ip^ r1S#>vvMH ȓgRO#mT*jTz+p@*-V,rżr'rX \-Z1AЏCaѓb-gNxE6 UDyA֑Jܮ3c׷{iye)=xaqcNPo ʐ='ڃT\{Nfϩ([SX9yѶ直Zߧ/numlmb2Uc|'IPp,%K-2K-2K-ki.bըEG"&E~n"-R6پ I5 l;2e:햳8"6߱Բe$P/ d'"a2O45M%6GVf#u Oj }w~Q:`a LǖR   ` K6"[S0K-2K-Բ Uh:ֹŷ\+'%B:(RjRV+Z7,*(ce95R,R,Rp-xMxIK-1)e<XbQSc)'Mh/_4Qvi芉Mzt,aÍ o1E5V':Gtar({ӟ)X_ŹҮab`C8Aab@11- GT fO1C8X =#>E! b`h8j8 h%Z8r@a*)r h>$Zg%Z[B˅K#H11B-s^D랽)2#ZȁSQD\`>1JF+lAނX0WTb"-s7hDt.̕DÑB-9 C->܂/Z.,zbh 8b f)5TFɵ8WHbsS-7G*}"!GT/å1sKbIxCJK1YRµ 7\&ْRvRB?GBt!DJkbks8bB5F-V0d:@Qhp+:T CS:,FЍbf(^= # .9 "'\lnaQ6QKěB8xë-̂,̂6,2H?[qLn nTwuaaa^z&q&hefe[p*$=,F}4z}-b"--E+W\fe\fe\VN?#F҂iv-# yUMb9b_\^xs?*N.KZ\6nT܆j>$5k勽p(nѧ:鴹J *œH mbnkI,̂wRN)3AOjYpYA>&~A2 .2 .2 .;pf+Q )˿S0Ga-hNYi0RS=Ń# .{m~m2Ks W?#`*pOwzbgaX }+DKQN}(A.û p 2DG.l VbeZLB L *DZ]!H+V*RXׁbbq0Wx^ e58ThG -@ - ΓoS3E>P? RaЉJ(b.b65b.HlВrcg93F+pAP[+ O J i 8=1Oe2!]vuhvB!LlvvEn܂dbUfE-7HH@6ڰ\jY>O#?Zm(r^|곘?Pl}}r^L-s20]L'B[hq.je֧UİVZB,ҏxUFb觶ʼ}Sq[zXw wcejHƃ켨Mғ|) FiUe@6rDދJە^6 2pT٧B,B2}삞вYD]MɕB fAc_ZhebatnD(&|}ؠc &XקS\rœy- -."8ɍXH.o+5,_K2 -2 -2 -+Հu.sM,Bߗ-L|~rYaZPgZ]0 -2 -2 -2 -[y'5'CgOd~lG?,[ 1y;CE2}+ C8Y(19.cɅK`^(投 醈YrHhBrؒbhX&bh1jf] rH--f4+GBTT, G13b,vb4FK-szb3ĜZ+@-ff0WL`:߅xt |?I!GoB=wrٮx`t;$GKi{W,n~\\,yVl,"sG6CZ?Fd(T^"g[HYdU&6u*:WYDVύԖW٧Vq꾯ӬއnY9ޘ'6mK6Iy/ @aƄGc[fyfƻ{˕ž+8Ƿ~3?&yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0024-Solo.xiz000066400000000000000000000037711506652756400231130ustar00rootroot00000000000000Zs6_Ay%74!w @h-M]cْLrbwڏvW>xe5V,x_5fUirwxp}c8qҘo\~ «f)W4Ğ![l&&<ȡ~&^6?4Zy쎺Io4% >]悾w98mra -"d!~ɂhas=NL[PphD~a!: z>uhs y6U0z,Lؼ^Pռ{^l}†Gcڸ`8j^+/zɤ١[il͕'HԗG4b~JU"Jr|cby"%Uv$]Jp2HUu"Svoo` e*$d`\ӭ5WiX0^qYP[1/px&ptΜbhv<"ŎZ>"CBgQD YH{`Xf_e\͝ DISDH b5hfA0c41PO)=3HMN.q%#U>A~?wP@v yE8n}nHQ@ixd!9Q +4i 1YU fU fXz:Ȥd' ~Sw0oҷͥb`-#d53:re t]έ+d^-lb}b}E3a2SK4FwmzUJUq2]x>VۨЅ*; V~{o}B(ҫ4G7%ea}]Pڛ`>IߵI1ZuYCQ{mps"LPң& 5*mj1^k ALʦ(ߪˢ9ɞ9Pɞc9ɞ#Z-֎/t\R[8]^+ꉮgD׊zkg=ѵbZq]Ot':wJz/wcߔ}ea>«^ 3)~J0) $)ѢpfDڰQdˢL |Y(ֺ(ӢDRgj[&R'WTN+*߅ø_Pr133nʚ/nE4-bǖ)Ģ7|o02?U3}s~l-?&@h VL躋O,yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0025-Wind Whistle.xiz000066400000000000000000000050571506652756400245000ustar00rootroot00000000000000]s8}~cDZ&dwKٛ{01;8_-#Y-a٭%nI!Oϛz$iѧNE"/S~qy4㇏/_m9܅wG=N?u$kxfkͽ} Ⱥqa×8[MBxer ay@lŞXqԁNgb:_:8ݐOEkgv[xBw?7hGqAɝLn'¾+fܸ&3pI k;AN6 ,O*Ѳ ZOZc[AuOt\~JmbVMgwk{`_pnf*Ώo<$@P8 ?_b\YV$5{2;q5Ta|mXylm&DH<IGkJ,7/p5jL4β+r,YF¾9Pga1,u%҆Y'/wX@k)8w_f_$S&7WA ZUi.WPT9!r?ǚWk*Ѓ!N+<rT"tF=HU*zOI;yz_u+0^2"<`w&Wwį-6rį,b*xWąIBfbOi"[4Q'3nwdv˭}Q<{6Fb6 2hf"GEiڧN@N z8dw| 碽O HdXEuH*E[LҲ!b75+(BG۩܉3/fۑ ( g, qc3dzJc˦D7;^)IƾgqjJ% BMnG*`_tPaͻNt.e%?kJuVA3< J9W!BV}$Nvf vV7CPTՁQx=No@|{p tJӘ\OP,isC\}t8ᭉ_'NwAMtS47޼)҆R;19Pg/2Uh`集W2vCc#5څ5Ij~RPvp G*t.0p1̙e+^awPk('ee\{–w1SgmlZm6FP=;1W({5bW"r_@WlUpKErV=B#r;Rp6|yS;3g#gAKnhHKQ?̹zNITXbG'N{dz;ߏ8p"Me)Akd#iԋO(?lK⾮֧bFx9/!~A!)% %݋j[+e2hKD%YH"X+[K xg-@( l :6zcqGŅit?ޏKn - }Cʰ놦, I_i8?:!'N34zqm>Lcʼ}Z4's~Q4v>UFۜeE"iJWy+Ã2yaRk?rѿ&ܔrUa}4,ɼ]c!?|L]hI+&C}"fJe,k |* Sd( E#*3㫩a=Sp%b",RU P)tJmtp7Y>4BszTC#8BŅD UG~EidAl#B"H"ۖ$=vLWxo[2 '6 "ѓa.ZAشDCjE"opPaN5SV5PG<<=#4@gʑ14)S9&jH#>JH@p*ChD 84p|y[i||fu<h,-5B-B݂2sr.'R;㲄] \N^Ǹ>:y9gU=b!nxxInTO+P#B?XH (9m@Yfӄ<22EGG LfRچ*n.<,h|KSE2.]:^aw/n=VU5"5}u2nD ^ 5 T? ky/.@9ڀOV7v|:r/S0-t~|:q.?O*çG @t;6 :+( Ŏ%A'-]6Fţ]gƵ'/M[(erhzYژϓZWNyu~Rrh*@\ddKD^^S$b6M-`}QM3UϳaeYDS=Y([hY,|J 70J?]KKWD5Щ=8z)O5L#W A4f)? CqQ[i^\.qv;ZcP$Sv[Z;4aؽ*uN+3M+5LyWiaƛt7ϊvߌ릝80*|Nrõ))4 J7X͙PA 2Iv2)4Ye_uOשC-B{ȶ7ҖAU«ZZT'Fkm9QOaR)g܁1Ƿ0熎^x9 ?jϫWDwn;|7ї]ҩ諷 /: aFo+$|UlKYގ6倮 fZhk`>$:c~,Pj w&k}~GoWl 7~WoЦg TKQe[+QV"mUaa{P͠"t}[E-B&sĆ11U#?(ahHKUYX.yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0028-Theramin.xiz000066400000000000000000000037071506652756400237510ustar00rootroot00000000000000Zs6=G 3Є&2 Ligrbwiww>,Ί!eppp}݇n]ϵx(qQIR&`AeP+\+Ǎw[d!FriRgJT847`^v0{ӄuCgع,i`}! qK2y˭Ɔ$%-Bd"A`Bna !062Wضey yzD6P B.S›Th<|ǩeb `lxC3Hq;ϝ_O7 ݧ;KgN% ʸ]9l\=yr,@Bq+)4)G~ * S=DI'ДMzýa. :3/?:vM,biSK]"ZsAuHK>+QȄGx H2FY$ 7MF4W4g@z/9)J.kդH3cIʍI,&]% /Vz3Y f4. {`aH?ZʥQt]̞*X<Μ ӄQ()9: \b=h~2lhb B"ι`8\L)?9)FuFA^7[~[xhдzZ-m@36YhT?ڀ㬑$Yt(O}b9tsY<;:"Jv H*H@[Ck Fr;_-+j<&#uRi2RDL~7ޡ*'!.s:#*olȁjC^0/n Ѫ |].n, NQP G&Dڂ;~ X: {TE=څ:*F TJ<(bD^q>Iffhyu{Bܽr !/x}'Q %3 O@2 hh-J.ˠwݭߦP8G0 LS)Q^p k?i9|'Ru iRz*-փ!``/*\{疖E?tp4V}HBJsp ~Tӄz^*`bD{wƝ7 @F0Mg ,Vܘ&-"Ր8_N1_뉮D׊zk|=uҩ苷 *ۿ70[o7dr>*|-too㸦DjL#zVo dZ:qZ7Tix|Z w}Geۯ|كu ,ű1! cXβv3+߾3ߦaZ*4mq.1 m߷!ɣߞ!eH9&CטM?\0{+yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0031-Hollow Pulse.xiy000066400000000000000000001101141506652756400244770ustar00rootroot00000000000000 Hollow Pulse Will J Godfrey GPL V 2 or later Basic sound has low velocity sensitivity, but sharp attack has high velocity sense and initial amplitude. Enable voice 1 resonance for softer variable attack. Also has very slow attack and release Subsynth Hollow Pulse yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0033-AddSynth Morph.xiz000066400000000000000000000041461506652756400247600ustar00rootroot00000000000000[[W6~WygI!lBBEG//,_ߑo<Smh4f>\ぅ;曣|+}n~u|wۡ,Y\vhӘ»ꣂݡGxQ@DxidQcbqKs9VD^ CEqA]=Q>)=f<造dz3&coMCwƏW$ S7u.PCķ:qWlHnp>βs=H1 l1i9QimiA BFJ)ʼn/BoFT(>ҡU˙$-tBg++HԺR_OhҊxbV9iN+fsZRkfprrb}.]c쳊5dq5LR W6R[waCUvؔy нԉIRKέ$@eD{ *4-ٳUe3e؄JUvoIYIF;KܗcYZݺę%3Bjzg`|Q-Uȓ|. TNU|r%j"`6eY4 %f2wC̓Ni!"P]/go7ycD#:C\J(eTNQ)-У)ubnbo ȍ2]M*w UZhXϼTے[=ovޥbB᳓ 8kP?aj}n8)Z^q)e`p&f?Ap _:ѵ݉&(ZG>A`cDDF 28Dշep "mh k>:3t>r'}E6 wOfd'%D{PGȾrQW yn훧⢮r/a(Gp5=_ͨ}_Or>'z*'/'O?xŸgO.qjMeyzAWw饟Ⱥ\Moc?۱nXv[|;6Ԏ˱Ej'h`@/ 1 T s~61rit[C<۾f.9Kz嫗2W$%VpzF|şeC9yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0034-DynaPad.xiz000066400000000000000000000051501506652756400235110ustar00rootroot00000000000000\[w6~ϯű-GVl6%) $[&=KjpfE<8}i9,t#Z˃~O>br>r3tw]~єoOEw Gz-NڈGyL:7O>  ZDɣ A? %sNzr rIJBa &;_Nnd [Ҙ̢(pB`gEGJ Yrژguo >wCr3\ۻ|h1}& |JabbrX?e,YL0IՂf:FU`: \L~| BL\tƬ醴TuB pY>]CzC*QnOA%1[s hb[k7Zp6'OiH94u@x^ ='1kҕv^2)+0$b~`\LQ n8Gd\9'79's(ITwZ!= eM*UP&\l]W._ ;hBbZB s&U"w__P8\\VʆhKe$mX:T8Z ˾07KKcdIV()ybA˓zR [JRZWH@XB k:K]eh-lPNKS}" }/!qZӑ?&7Cl`˘L,|-+t -$dK@ψ*5by$fTQ!P<%V䦇v|;܋ i̭QUh[tJwOF*\U8}=LжbOh&d,"zzԭwOxSگ{6jNF1ˏؽSч;uTݖ uީ*϶ ] j D'j1Զ@r(f-hHn8AI_IS)b$OFݑ X SƦ 2d'⠧6H9Pɟ4M% %tJC3HIPEj9ve-;sJek/6els*Κ*j{ZK3j+B&w+-(}ؐθqCjdtZ@wWSлl\+m$ގW|r`vvlgSW7HH5P3@%BBGQAAdnQ0v1. 9../uWUc65B*7Y-yͥ~87aщ܏zt@h'b)%!ܪC6Cc}] ڙ(%~^Oƣs^,]Q)'7`fw.zH:RpgB/W)@y74WVm)@rY+n0~I؁H}~_˧q: "Rf{dyD-?klm1RK6]y+ q/a0^*q|89(Dsj0Ȯf0x6E"k]"рY뗂mujWCvVRCV DݩC_SZA~SZɁjCєV(XWTVDh-MRyi*+Me`Me *8k4QKo +KmŅCPf%G'M祚9/Ul{9/9$\lVlUY9.π5ǥD19.jKmw %^YcV/޳vPd0B]tkef]2LFv8N/UF*Oԛ%$m-*WkGDZW= eՇDPw #S*O'.zvhtmjWhvⰶ]%nUPخpT"V4W,а|&a馷,7cU.Ѭ:l"+1fq;%f0 W?ruUyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0035-Modular Sines.xiz000066400000000000000000000077201506652756400246440ustar00rootroot00000000000000][wF~_>Ɔs2ClaccL^td$le@b%o u_q;)ׯ.]U]zOߖƳ}h͆|?4輪{͟>7Ϸ/'Vd߶ݽ_Zfz/"V87zv-qkw]e4 <'ւ5Q:(mDG˛tt3|Eó·"|'s:6Z'l6Zj=kٸUσм $:f.]5駈&NRf~q#Ӎeht0 Kǣ݂dKHD3;'UCPyO<Ҟ0ram'컳 ҉ԭ'ӻx7M`NϺڷ ՉK0nbgߞ˻_n54V:򙿌w;l~,ȏ2zY9I`o\(^JNҷsZb |fsVOQT6,OM ׎Xe dzUSq-)r(LX/Ku/46Bdz/DNJ^s#; F/&?McF[0* Cڛ=tȎ=&iU΢Yޗ3Ό333<_߇cWōHpvdS39:޳XW%n&[5R&iDٓ"~0sl3pxI@҃4 Tv:s(D]Fwp&@IWA68ǒvrpj0$do, Υ!NXCa 2WOTy`1͒QukZѺRq:^@0GYXp ;u{YhC2h U2.?&ۉ^ =Wl[A[-L^Tu\@kD<|.WJ(S+Fh JŊL^W *ǜTvYTi_AG#T)T>F|\)ۆd̒?+ƣA5@I[L٤ .(f_4w&|:E3H`+ۗP^]zU|eL=’Uvτ .6Sv{@39R,ǻf<Wܖo~EA7Y%|?:Vri9ڳ/EbCW|\*-e'=˛9;i/noFi[R:}KhEi=MX-@K9Yzt8jsT*Ji|=>CݸgzNj\kiZ>MX 醫4YLO  ep[6);2@)wm/c(r鹱uEg';@‹ L:s !dvNiu٣c5w8 viG q]޵,,5hs']6[vʄkt7y'HUr;~pƎ$Yjj 艑d׌$g՜ IƉO$G"]ɭt%]0Vtdt%'KH'kĜ "k%FGLçMρnzb\;+r6MlPp5'}ɬ?*KvPYPʒSgh',1ٙŒ(gg2A 33n2̚ #@ܚ{aC a]Ze#an@[;s(8qԃŒ>=(̸1)7~8ѥ]eSB!@oO#B.ڑO CNXN >c$0[1~2F?ǘ @F97sds"EX7H|iə}++44nإ]ϡ쩑GK S&'1c# !Ѕ=pJheEX􃳲MU ' D(0 \nZG)Xk(#/~U`c9 |yHQX@.FG.[79Ot,: >blm(8@wM-(:@~]`Mf IkB5Ц5z3G`FA]#P@ rc {=GYn잓0͉bK`ǸX73G-aj$X/Q`ͣ=o3:Rk8"gn^Z0̗lM7lu-U*.ە4I뇗äѷ{Lfr>*謄zd =GefqqP}IR)WnK%0>@ti6b:b̃Ia8/Ta-Ͼͷ+0'T,QݸbN?(S(2sdiWIpcV.J- !q}Ԥ&{q=')̘YA/TWr,rcs!*d*r %.:ʖm̈́+q2ș8{u#> oƣ2I!}T-[GWd@l퀪Pӄ uTuh83c*"2AP+ɥKWy2ZS9~/LWu{'kdɗ:4"|/[Sk5/H.H.\H.\E\\'%O~5te\x2毣9\k)-x. (uz/|^ݯp_{a~7|y]g%'ޢ]d\[ 92\[xU}Y//DUc3wHU.Q^<+;zT.{LsqiVb6u2dp{ۊ Q,Ǣюyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0036-Echo Multimod.xiz000066400000000000000000000050251506652756400246250ustar00rootroot00000000000000\YwH~Osmfƀpf2/:TuhqLJ*ݒ@6X~ZN>gFnlZqY㧓ξbx0edD|DSxтFd؝ #kMBkE?^ZID1QhcOj??tu]gmuZ?u=;{d"/u\ >01>I2V"ƖUdih~Ɋf&F],-^7t A%|tsYZqρk3AۘUt6yF3.n ̻en}&^C;( /?"# 4,km+֣ 57:c4wnl>Y@w݁V:4N|N\(AYS!CPuƸmל1ǀ1Acm50hK4R;ՉXYoh3}lL'sOgtѩ, xR҄3r}+˗F"0;WEXq YdM@U籦_F_]UK1u]x<{a!s~^mF*uA8=$FCKx"+ :VH_Ees}kՌG†׵t_*'ϝpC}~lcmY|b`d B]vnn:f| }!vbyc\W0І0KYE`)Q ERuZ{nhw5[d d%쥭vC a y>U$-%Oz|n[iӼAe$UDLW#09o#yLtbw+HunMUVDW)'^T.~V %*KV>^4ͳ+W936^E*+JQCVRy+үtL%۷8y G[hɄPֵ JJ[`H"p$gA9_P=H(3C,Uބn`Xo4[R[QvYp4h tuRE*qU_ ́8=ڑl8{*6qyCjYSUk]ePSM헞3ij?gNjKŠbP8 ,:+IUzSnh~X4Mihf# ;̑?3W4`4e 6{0ZL 4`ɺhFD.SD]JjO4ds"E3D=jNNF%;u6dJV_%<*Y:,OJ6H4 u9 1 $ى{z՘fK|9O[V#gok~=߶IsMK:KZGGЛH)}h}Wv]K50U0~뺖뺖^뺖9x]i>޴#ڣyDc*Mpデ[߫%S4$YxssAtI#M;tCX>w?)˾$璅_^4}ik׏ۃhᰝql82 -jZT~KY&Sbm F/uN2㑟&VsU|[_^?=FYf!SKm_~M')l1p ͧCxӇ EثHx勔K[}K[x f$,G$sy,S6psfZ0uٰ WDY_->1< x}˃6ڥV̆ȟ0FJOGqHC ݁E.|Kדj74ɣʹOV)}>%ʕA|][˃ʓsB} e%FYr5k| ڞQjYHcE[ ߟt:N M Ě,/U0~J|iT,U`2Gv˟^8:{9}G8 a..~{0]ĥ<3EuI0~H=Wˍ|/_0>^>uU<:UNl}! )~w*1ZOYZujBhmjԍ$)ҦZ.HϪ#SDa א&:9z:4IZS4{Nf`F/ETˑH1b@{vi?_#,:k w~4]$s~?'_3Lw;39Y2'S?b2Lp^O?\bF.]ɜI2,?Z{wx5ݵJw_ֻVV;*]dgY)ۻ*sF[zna{SpW6 )E[ |DVmݕ\BiȑLzHU#n-u^ݛ: Xk{^@wEש@wٺ2hyH=!)QF[/4͈F(weHm^F2Tt T#HOؼ$GliF"}֗ύl i9i6}6C{^ESM>)ۤ%RT˦!ؕf{Y`sJY>շem*l%t4͸DRĪe hBVm3!_ ]O+hF +4[ :V F}@{܏f&€4pA7/ }X€,`K.J"m EC 5o1j6^tawʽU` {lega1TڝI;ۏ\2؃,HrGZN2]uu*\'okT4VN/שurOx*i*{!qZZ÷^Fi-'.̅ӿvZ}NiKm͆J{I.cn?fÌsww4n'(磎SJ6Jt?-i0^nC Y8O 7*YaBTB2\$Ԫ6*퍫tgƶ<`\gL[ ;iS+_ƾ(z}bF'B҈d]E~:z&Ѥ(' +*;#26Fw6700,4VtS(^1C֞QbOwvb<XXԫrE 3 ,Pt(i0z 3u#a; +&y[FIw6`GŽ' ;6rÌ ,8bP~1g=~i= VlOu ,А7OSCip]335#f<YIzϐJypC٤ag:&ĊPҴ~飽HL>MFgeiW,_z{#wdh^X1_HL+ǩosy0o\ I =7/?YC1~cdΣo[X*)~2Pof(_lBabdii(o{{ɇGy =E`͑ <(\?ۼP1Ju#}跠9ml<q?9 WK-o^mV5Z(BC cE[hzZ0k \0zh%,0-7\ 0cp9o/C QŌc Z0-pM8ЌMjTd,@c%w/lhhiz1[( 8ؚqCK?7Z$0oCf-tȁRBqV`C5!]3V[jg1觢V ; ׁFSE+}4xo2`zء_㜪Ṿ(Z90[ Z90Y蠕8VZ961(:L0E:|uʁQʁqB&fr`AɃꠕVȫQl-j*8qG|JKVZ철lpF~keiYVŁtPS GTlT)娻P,kU_I|POèHZ&y[^Xru]N[R*VšOMJ'WuVm$x6}>"% b:aYrPL>V/`xuŖtgd7ʮʦ=Gh$? 0R#G'JK MVNYyzSTy.k_JGݳ"~0*6P:tVfh>lJܯº%z,ʍ|)`Fd%ye5?Ϋ믺BShYވ*{gۮx~;x+R3T^[իċIe6v]0JUڕr |ud*c52].'Q\SPl$m-uuVM׎R2PI^yEJ)yES8p;MEXuǥkZi}zTK^גcYEwYvQWv|вjS̳2+]g1#nͤ$*:?%5ʬ\qp)~`e;G48,oKNˇ{0Eya6*oyHe38Rݳ)^ԵE͡A\3l%xM%xEZՙr.L7:]mV}gx_/V'>\oSoPv2umD(h8S *A}e7U b+ʀ P } P+[+L/YmH_-$f} _EFAXɍmć6*]!9&@Nl%,Zϧ4i+ hm dh&ߨ4Za˼FեKK#$l7E WCf{Y$ьe&8Aul[~'~ }dlhI1իwqq˜WڴR!`$U;0L%nM!,֕F Hք!51t&06euDWHۈp$WҲ\z9?r\~T jW}Y͵Rq[hu[ZY.lR^x+U坵f;kUZ\~MRS5*ҽSw75%ꮺ`%<6?^JCFEwŷy+E&0\K~+SK>OBS͎d丷RBwhq$ WE%%aW3.E\m=ɍ\~9KK}#NIAT2&TdGvP% Nە̆6 !y\b&;:Jp& OEA1J4TuĵVb@spNˢll_-.J)]|/ A0]=mcCc. ͦH}H~1h lM5pI [hu-$ve=^ $jDS׭m7p)nnwӤ[>:̺e "?zG"Vcmu0ƇEA:)4e0aM,F9>ȏ.Jw.JWЧlSP_}^\Q@`o`@cPP[eh!c6ٌ |- ͷ1!ԪAmK\e S@Р(98jDlrlw ͦ wDr֡Z찢-VXr2(B**jϒQ) m/wo)NeB,/rCM-+.Z6[Z(,BܾZײd-Vȷ#b"C}82#0+ȱ ˡ&lN}|֤umwljޯq5:,nHT}_t%TR(jc9Xnow_{b b^Kb?_YO_DD'-ZbXI}QB9p)́J֑\9#tysQ5%AG3L՗1\ii\TV㊭U^;mNʎ+)6b)F>{=m+[TVS1SLs[)kؒQ_e%D#0ϖ-jʞc[V1J:cpMF䊱rŬc$qBxB-W.BXBm\1>4Rh>T$9[֓By60@7mW)ylsSEbkl |l$|:$glC IM` i>2f?1h#öd1M -D \=GŅDE`MDMF+r@+_cVءZ̡|ɡds_8CWRpi ֡a<|Cq~vhBP,P8Z;sh1 WS!ph~Δ(Ck{U98淕M>%b~W{ ;cQ .oB/lП"Ce8H#"ߐQ|(G9G9Ñ?DG 4z BLѺ\~9ܓn} B1Lf]ϊ5_/ M> 0St$a4&ޚf&C-&8.*Σ)s΅Jq=arht.ZD캰nH綿TܧX85"byO$塢bJxɡZ/Bq`U[K#W}],Ñ/MTST䇩w\/ Z̡ZLnӥ\ zAkIaߤUa 찐f`ʲ$ʸ[9ǫU.`+(>Qg.5/&>,bKe{l~?'_%`2:{l8rٮ%4x }ԿYcYo1CcrEZˎm2(Mo[U gKCIly7-Ɩ {l&O@6!4"tyJ^nj'l2t6e!РF Q)[LbK4B2}68 >ړ2k|0]a.Ohrncnl]<6KC"}6Bfylc/.[6" Hf8ݖa-D/բk`C!ȉ曦PKI4[E }QAAe+ DbI;|MƋIݫDF?y?uLTnDR7[H!d7yj57;T܏\n?6/NmVmzM$0($U J.8S,>]eFӂj E=K{rL1;"p f~b `$c9H?J:%?-ebj]3"Za?1SXpL1+)݊6} !b)\4vإS ;C͑O)p(e;By) *PfXb)5("Qcb_ vb:UU86JԌމZ6"-%3ESrFÕc X@6%MzQR8zU0zp;`c9c92b;cmFI]nEm􅸿F9}z{WXvm<`Ka[VNh[oMFH1>S[^Hi4Dj4xi5\#6 JtǪf5KAf>.5)C* )O>>[MkD 4v yl/-E)ۻb Z=Ƒ7AM myb|)|0Cf3'$|-l3|d`#QguH(eD1> զ=Za3 C@?klblJ'0hXh%+Ѫ-Sox &Hٜ-D+c6$E,a$kX@}(6l0Msr<1s<1{OvuP\aTuLFԱ0HW%k$b;p#M0'xb| s[QwYW~ucsZxH$#j ΞA8X0D,L/&`U#1Bժ|#Bʓ*KjnGaM.i/SO'M~vȏ MK_"9(7JD3X ?@>bJ s}P]aǖj;5~S?[yV%(Iq5|4 M)pKOeƍb]6Y\GlIgG%@$(ljD(ƖܴH1'r1VhXgQh'n4_+trȏj2Ŏs$*2ְxXc"<>݂n4uCx:ǣmFhM,Fȍ>fPϬ:Vvk[Omak{MEvW`H-ha~:ۻBfH^m i!`sh1sh1iLI"9e-L%qh1C0~yDz/rh1@g5e@d9ҡ0JUk >姛ZL׿=ɡZ̡(7BWZ pdccEYi5%M8)sP+`)S"~gpq}CtdZUx2luE[КU},uؼ.~sT >Nٗר!J7$ F (dX Pt`WQkrΗjAwbL>{j ` s1oؘ+Vw:99D Q?-a%%=9U*guM#u\1&聼.K6(^ 5za0SUGΠӦv<_'ў%zdalO;Ut{)tœ!̹ة 50!ea<|F8(*fӰ0(NjRqs58:ؿπUً~G[OWO\w\1s\1s\svoBy]n&ly0M0MGmH[(M`mk ~9Y#eσYŞK8(T.m˖l2άfu$Hmw#]-v֗HƏsHwؒؑFY}6A7]F6D50\wD3r ZT^tM>P#MGPTЋf}@:ۇE yl#$|z$lj lw}fĘYcF5Xϼa 6Rkغ2X5'+lnٚ4M!MH;lMEcؖ,΃^U$|xX̐m4X2FHA:ۻB>b;PJs\1s\1s\1s\lL9+Z%w,ՠZVq#qI'r>b=1h:ÖԯWˍÜ%asnnRV(Lq{Zuf9qHEJWH9gI[r_4c& }ʬqŪ@b+K">}8Ik|&2=¡?p?>F9lpl4"LA9Sװ$<]_dIſl&BD0}gSU\1Kx*x bK}F>_|*`=u}xѿ~Uj& /]C1\Xlbtpb]å7mh!"S+9 ^/p\X16c{%= }b%(K]ɭ_ ױZ5͒EZ4(WʥUS.{Rmf|4zX|w ~rl yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0038-Smooth Saw.xiz000066400000000000000000000041511506652756400241610ustar00rootroot00000000000000ZQS8~0S`AB;E qk[9_X$KvB\g `Vo]I~9Gf!MZCapֺ\흴ޟybr9^ӫcxW}$+MZ|&~:/9{<'-^F74q'z҄ds#0=o9B?hptӛoS44rV2[%-38Zӄ)6X-(Y)! Wi@e R<πj2BZw8%/5TIZ&u&{u& #A/Z7H+C% 0Z܀$(LHK3dRi\jJf4%Ⱥ(DZ1V~quJ7C:V1 b2['nM/ LEF0 "&bl bC- o3Jd`u7n`dXb1ҤXLm#o<2C]SVHrōn.!duW WQ YQUH wRe>{d,.ilUnK )*CfS+qnF2#`';% @$QU 81cq~deO9]3sfk:qϫBqyö`^[ьn c ͺ"mVg#pON2jEl*a."tC_XGb53Acj#e)&6ŜZl ey'q;#봙PbL5S1֙ZtJIxPAvWM_ïܚF? WOʺjZ8yrDۮG Gq}g?k?qPTwQm ^ P$eVNTwwxwOvtw[棻Ätwp ;BNVK'[ʻS{ZV`6%j ^ ݼr`Pn>raj Yueܩ'82N}YƝH8^/&8h ۶bR leZ<%S\bю568Y2^+YỦ wMpm8Y;^GV8uPg&M!a{,6S{}}z6?Ŧ?n,yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0039-Slow Morph.xiz000066400000000000000000000046171506652756400241770ustar00rootroot00000000000000\Yw8~_fpN f& y26%-W28KM)%}]$i5in6o?\4'͟?ݨ?ty!1wGYw'g^4Mٓv܈$=&G;xwhnܓhQ(n\7Q>blGlv Ob<[Z >Ћ*J"-PuFRp>h1ӡ7ڸk&'J_rc- -׏0P8V,EȢ1놀NA=@{:z8)f睷0Ɠbv;,3ɺq_A]ht5?z^㟍_gݻ_n lx$lGB1miYe+3Ms.eK5f3oGaFfADkaG4#T'bۆ0CfC}t:T7I,!M8~׷]b|<$N+$:Ue\%`5v^8|:> |jH:hs +Α(Ӗ7Yͱ 1І!Kp|Q6RqbOTAP!8$?xJ@' V >sq Ց|JHʮ"+}/PZ$d.IdnluDEܸUpr<(4_gl ,w#HF_CE6'w+B"ҰɺJ9(N.C"7%tMdޅPE=&fc#))Y2E*J†ok 6RE{OD+-jsl80;He n:Qr%6F㬁ыE7_o'#lÁvɤK K헤TZH&лhi$֎UuDAvv=gRW,WHhMfLvLSE> 2eFA!䥖vQmVz_.Wi' {<0fN 2 J+]PZaTlc$k'@ZɡU;c gUAsHkRz4oe=t0}.):M=^x.5ȂzA*-Yӗ5↓sV,=7%t]_xc[ǔ_1)gv]I5KRI?u]Iwu]Iu]Iu}^Ŝu=x!讀զyC{˲o77H v~/^>u!=]_.,I; )r[ =wa?POS|S-g7o]жXӶ˰L.nPi徸v 4 9gr[յѰH4ƀNn3[/E>_[nzz_C_h L'Nnv%zwοPUʚe;fٶWY[:{>w>2#нcޔJJDMyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0040-Shimmer.xiz000066400000000000000000000045641506652756400236020ustar00rootroot00000000000000\]{_}J I>4!- sHM6wd˖ NHmJbFΫ?D -ӖA;tC~q}o}]M/FqNxW~;/ai'nɍ&yd'$1#s?{ =x5'%`Iȅf>шn ;\Ogx:$a*ɣ&ni2Xz~F:wC\|d gb4g]1]ǵQ4/n%/nb ckM# $4mochdՊRg.@)Ѓ| H'-S|\y/x2_oG77y0[>U>޷we nu=c"}ݍadx$nn<8JCk&0 F_#KNkZL2i')|cB9:{ ęq"l4Tb[u`[il&tHΝ /t[=Pr+iVylir@AdYgDh 5/*)AyRkXPمpzy  ]xWI $gn`zQT-q~ĉBud&- V%p5[-Kiz[rGH|$me _l=Df-/hit3az7@'@,a+0 W UԱ"Q VPؽĔCە ɯ;e -p^x?WkHfUZڴTGq'w$$A5jM.d(Z452~QuDEPXbGn@~  ciVfKL3)PW/*Q"J*^n$֦h|ipM%( 6>yؑ.WPbb" 5Uj(T7.Z<Ǹꉵcg>YY;x. W%ƫJ֍+yVH^YlsWB NA!㥖vRmv+;p_4ۓkBʔ;,WZAJW9FVnE!%ŲVrvevY:ote䥉d|%9k*z6o;HA[YuYsy~m:t!C5;@_f̫e*Yy~}9#+VƟ.t13$(:NWn.dII4r%;ˎ3r,᩷Vʬ8i):fh8rNSy*>f njnjd P,%;RcƐ]8f JuM3% (~۝S@ Cqsq _SN4rI^yt92|mMJO]XS3_Ne7?{]5x]KsY[Y|YA^Gw}/Tg+5nf᳙FmnfMܩ۩; ٰ7G |C4%$|THz0].!z(n|dB!r?r|3aK*K9L JN{+(k:mI3@M;3׫0g0_Ϛ͏DöΪd%Y= xMǾ \ w.O0Rrk t:9i'%]A~8^w? ?,Ѧ\gUT kxW</@Dٯhh:nzYB!j(MT@yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0041-Buzz.xiz000066400000000000000000000035651506652756400231310ustar00rootroot00000000000000Zs6 _=u5鹉zKvu/o7 eb尹#܍ɂf4 8SAÉ}ŬqӰ v{m{-=젻}uCX7g h@,a qsj~QNf Q87%Lqá-rE6O Y2>EDW o٦m7?pnccV`"sW_`ΧƗ~#!$.c0rҼ(crN[+so]q'9ŻW ( &2BS6: 7a] axs)l/8LiR2K&#C(e;Yih u$G%RuY+4}PQ0Fۻ4QqX0YПcű{ F>KOI)G;T}%/+S"F}cD3F=Q:'Qtnw -<"Vs'Z4IpLYAd)"D$}' x1@hp-qFJ߮xh9m@ՆC㹷gYyr:Z-ެrXLp+; -bWpw|{x8-jXƳyHy2i)/:$ĕG ~82Y3;k Fqr=~]~-YS~YG8NZ=7u Z]4}a̕7,U]yZ/IZГ3Quӆxݴa`IpY-n5,_LZY6 *nrz((}("VxuOwUr4Vt ш^} $ʯ^N^L !N:$,4'Ko~HEK'*efՑ+ :~ݻt'gQv<_N&d`9e4MB*d$QQdն ]v֖,8Ɯ~z#%&|Bd]O` 3ݷ2U Ӯ]dl%fcQ҆h@if%$/8{4}ex ?lhЁ ĈI7hiD-i.BF<+?6 ;@U|j9٤IYIY#^L1Ա ޷ Ff %7LQU8 ]ACYJB6~bpP'(WS {dTEPɔN\3'=ݘhBDS,9O%ˤ6-Bxm<'7{Kqz'{rp^ s+(,N44O砵TwB&6"xyKgdzn7MN#k܊ߵvMmwk~\6~ {~EsnQc&^d"+aNɣ׈iF_|絗-` %# fc\y> f(ㅫ5 |N*v*'M.\PyؔWEyI> ˳s|QX N**EtEюq$/ӻ_vA3HΔөQxQfQTDT9dP+.Jڛt<=bq~ (EƂpu("^llJu&|t`N! q[^s0pW_^WӻB*/7HWْG Vr֒A@v;꤭vJ#qfԡ0C@**GǰuNIӌ/0K1b<5?s2gPNf`fYm,@ksk\77T 6 $4q<҆fh}Ng42 LqXe 9t>;a6k<0ƭn&Y1aa0־ }k>,Fy& ! E U]hfو%>Fuz,ȺNd^|wVw8I #)G#5Xno̚¤cdAn6 Ojp1@?2@X1Ov)JΚ ԼqC ds УYQHOr<@;2@k [Ea SR# #k3ldw0M fN cGF23I.zM6iIva>XxX׊>+jF`9MGH@*ҕn,-"~Ćp:3bj#ǒc:0F$#p-rVcCıáv H20`fYP±|̶Y "w38N=$p(b-Cv(ϧkP` 4J1| eXɲ"dleXjH7)ss`uX8Kf# (( c(Ѭj* m8#J fu(NE^fE:J kk`@A $U7̑C7 bv #pX<5k)S8fX;]vQJ0AICYD 'U(J7',b>`DP$`zf*ql2XC(_5RQ<5@w,vl4 o5 gFrdc3\<55{BɃ=.3@cfc5}Pm9`}wqe 'l7`TK਱Q|S6Э=,lj,fWQր9JQހn3\Cyq:$?6 xFVߨKA~tJm<؃ukt̢lF9m=6 eXgFك=Q='(w0w';{6_:<`'lĆVG(w]0C];`#TEʼ\k32.{dRԢV`܉?y)]NRZyBv[OkH?$y?y}%u)E}21c[KD $gVӗ~P1Q4kV-qxت,Vlm7lu]+XƬP_ j QTS^qe尔54zr=9(@5+$rjbLv5W,4iA!b[*>ک5z)@i:צE+_WI[MZ}%o%W*ďndb2eiWCQ!6ϩ\&HD"(rk iQ(JXm%%S*/kz + RAE^@RvطŨL;w׉O(tXuvGN+"eqqY|U4~\^MODluPI!U-[r%й^f9/JwnS7^] 1VV52,tɔrP\z90kv^l)6<8N-iMתMjГZPS((k-ߨr\^JkFRbPSv^_B@anZC!AQs14)oyjT2m}H=uCwFGW.wWiMniED%㷦N+G+~I dGD+:|~_KwgVCtR1_m}WMӖZg%Mɔ̓-T5ɥw t$ہā2s L`"om6տģ|KzEӧjau-u] z]uka^2ڲq׵ ]g^W ;7tt}{D~!K9 `iS36bNr6-')oKc ]\$OazOv `4't;=L;r=}]cr3|-d{>O)L9.~Sl-&i۰vX k*s PD~j!k@=" {&r~{=.7h8.]ʼ΂~:/?:y=oF~IB!ŗ>mYq~`]^'ٶ=L>\ȓIq$kX1 FgZ !{ıaj.j {*)UPIUz$jમ Xw ޅ,>O!VY Bo& _x0mivž4$HZб4gu1 h%9dA00 $ ,\?}"pI=)WT-~%H]+)+Хrp5RW-K>uG'H"4D8NK]AHW160Nl=1N!S_Z|Fl9UQ2,`4*jX?dp1Ķ>"ʐ._sj.#&X / Nfnd3 Z~'\?N{)˝4%n3UTAg"X !cu#'T(љAJgUqBJ_GRM> ,."gzar]^Ea#x(z5^̦!"l:lr>ndw@n0ڂD$(Y } Y#'%ULTWU(5SMVzU# _fcq*JU>3fp4t͡pgQe#ǔDH4el Y#Fz8ʱY`:dR9iKc&fP|r2gw Ky I!g[42կI:贐TT6O!?q ڍC(Bg/i:ezuʺ~$TPɰ14uD "Tu.AˈqSBkjej*375B)%6ʤUS/צntbSnS':RLKrC+ i}&TS&~ͯg9/:g"ٛ U};3[jT.l3rzX>/zH TC3*aUe`E;:O[E,/Pp "DEaʪR<'MZph+,Q+[ږ?VgHB=PoFVh9*uȷc(fаDX؏+@k! ]Ajk0[8y%96CӞz.+7m/y7n?sge/~mÏmsl,ۭijM+z&!TLͩ+Ӟyz̈́f*hP5qj y9a[Uޚ}#} e<\45@}L]kC}OZŪ?R\npp -ڽb[CRJv4P˜>2RMjCT,;{CQښ:# Y\Ж 6{$SsN~۫<VgGkVVhVHV(VVVȷ6c ͠/hc{;_oݯhz~_'_ʇ| RɉZVuF} Dql0ҚGG[ bxJ7LX;{&-5 PiSFKj1#t}2Shr2t>yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0045-Bite.xiz000066400000000000000000000051751506652756400230650ustar00rootroot00000000000000v6=_ջ+K$Qlծ-] DRTyq~D8 %:4U^Ps ~G70ltl:^y:6?.[`8ty&~+~N604/`_NE4M6mL>z4ho㵷Nȇ(pqA} =i6PclwlDYOb<߶4"0ݸ9H$]~ _ݸha'toG[:]Fs܎fkaޜ }"|J2Ne~%&&[7"^'Qqes ZG״  a 8dz6'#oOݍ5Yp~ b?oe?!2ak~6~ U>iQç- QLd@;;F1;Ik(13voBGbu6H.0WT-\$FG*uBxa4<7V7KߤT藦*&M B佀|q˕WuBhwE!I( TV6TRzJ,d~?YZEJ`?gts{=^]ڄ&mi@ԞTeN%ssiTKB %<e ihxM{M@A.W Kl,٦'%qMMx6ɮYL0ݪɑ&魅 kVSicI:ᒩ'e .UVad\ߥ2{ N6P$q;;/3bLu`^}n023#K~K2nopUT;rm`?;?=0zXstviw#x 6LM R%dVX.*$ DQTnF))į4:O+pTa@dJE*RGZw5~&e&i j>Gj4]Rlvg :kxp"En ֪`9"I)[LF j2RxF&\3Qj=(%&fDuNoCڧDYV: Mʊ6 FUdi]!E-3Pŀ`{%oo\B0.Gs6JEz $w$" -V`ZŮnpg[p!~h!~`Pă%4Oa2g1Ldl1~녉;rvfͧK†5 ~ͦ< ꂱR*;+|]#eDDW)@jW)7{2vّB .E*Zƅ+mNyRB YY={`[ABKq%ks,U9u6@J:itЕbX*_;fX梏5Ql(M:L' pڼwQdYP4[ ^N-ah9.{Qo_^Y:hȯ4UYk;j) –ƈ%(G~ ZBؕ'"]f\fxdD.ťRDNZβ̿.svJAdT/VeO)C^+>U˄?4)^/]MmYmkSa6DՏCj3O|e ,Jyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0047-Accordian.xiz000066400000000000000000000076151506652756400240700ustar00rootroot00000000000000]]w}_>M!$VghBZV'$7az;}rkt_’ectϭ-ͷ}Y-[^am}snyysu5O Zf~)V$-O(u,I%e%Z/Tr4\M_k'p =:?ĞK5vыۭ%4,kVؾ݌.dz謎+狽]ߦXVId_w?[ڋl?h-cbͥ2ˊL9Z!yV-},㺻N~y:Yų;zWM,nȜuL:<\ط_vdk\~E=CVFx <Wi?ރ מZDjKǭ~8'koO6Gi/C J.@M'8mOf˖kӦ0Q[M.k~`=$oLt)=-2)NBid+U6}i:Qr4"lBј.?Lfύ!\\͙M}2yوg=2o'6?jp\:qĉb"Z&4^97.]K8%<23VN nGN+Z,bsnrGdcsI:Ӊ/\kH&Nv`H6u'9d-hv-='bZ~ѪGlҾ ٮPhU<|n8:#&DN]Ι*/7tJG:̦.! hphi z:`ḥ^ä}me кV"Z/dSj3# N!izK6|dN !ѵɧ^ZE\܌q<=dBlkQt:QمZvfKȊỒCٍ&ʌV2Q àah:Z+¦C_1t`9J9-Zƶ:C``QF\L>жd7mhW$FaeoW"CF*v^ʺs9_՗nI{IkgYduSLL-"8+ *U0Uz$ r6U]Jw4ٴSj:VV$ɽ7*Ş )f/LXMv[P(LH^lNaYnq(g^N0۫n?Q_\_M3B샥9 `켣{ʈlf֌f'#v{l 1bQˆ=XqBgS^&F{5Ub7J Fbue!v%#z`/\`ViE 2^s,1#`0u0:f6w[2b F lg1#`0Ƃya a<0ͤ̀a,Ɖx0` al$!KrqƞҒh={܊1 qC5 q!`X3CC.gIaœ$C0:CQ4)!` ĵ"Y>yg4r:$r<˄Ќp[GgIt+0MܛT\8o}q\st_ V V V VƙNcF\F\c蠟9:鯀5|F1f4k[9'8,tϯD輟]-Z͂L h 2LfG6`GԘ~HsFzCFCFCU@gFЀk_\\\7y*hZ4Z4[s&ѶT@#5G\cr>k?Јk<qG#h5|,3x4Fv 5/pW=1+5j3ǐk]ktoӬj#ƂVcH`2 F';o2"Th.dmOju \ GI"/{l!7{d> 4oYrXS.UG,+O,8fg.KCضtE<| Hs5su{TE>'] ދ^+x` F2].5G h`***Z Z4?ވk<אo7rT@rT(אBٵʮ5.9rT@׹8E:bP.W`.W^K]bޗڡ:NCTcȪq`+qTx02ilɂAchdȜ`r: CqF\a: #ktn#&gcBi1+6O,]\;KTnks<^lqڊ8 Y.r$Ʀ)Sd.-L3gy`G=)@?K_f}}I0yz "JXɶٰ!v(;c,% L# -vNʹIslAs+3.? 0OCh)Пdg ԴrC*52iA4YBF|O= G`eUڒjDUSA0Q  'G_ֳ( <jFi$6OCf1$S˔+ DLpA}uO!Ë<byDr9-fJz0[Jjӻ0?n.44_PLdanܦȱyAQ)&3fj̡[uj9%q`. rK%h-M޳*Ό4i<P0y0hb{}'X^6!XwI;!^gȉܹ2T S5E)s=Y̥2קP#w儹4+BQN(s)۫V:as/":$wH֩dyuzSm⯿R,uI+ۍ|n_~]+9]'3>lNw'vSp`o:c gϽho_ʿO|nK;V>!=b[xD_ySs[ 635ljGSo?U<Ⳣ[w  |G5TzemοL9A_pĽ:Jq??n.~Uůg_ƛyڽT";W_^(no `j[y*}:5Jxwܤߛ7͛[J`iHsL#inx4Լ?Q5o2޵~!}Ǹ^Xʾfe.\#e.RwFG^X;dz;x9&3{2_l(UyVEe]~˺YW=1냸{Xò>e-B]Dz%%3z)z>騤Wb|6KJv??vV6we;%pc*{sy-|.8zoO]`亷_޺Neyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0048-Pad Organ.xiz000066400000000000000000000035641506652756400237400ustar00rootroot00000000000000Z[w8~ϯ$!!4顉鲛싎"-֗_$ydCzž><'Ģ~ƶX>^o7رل=ם߯\PV*Խ g]ǶB1ұI4MVbxHF>y44{U|D!`zb[Pb[VoOֱ#˧ /x <W cY3H2 V[ 6<рr.!9].Wd fΝ幗Qz`!J%jK41WS^HM #5y5Ub$JeЪE8+Xk;2}~G1<  ٜWMVJ!룜7 d<s3e1`| Cv MlH=IJHʎG.ƚR\T{ީZ{ -K0,I]Xo>`㔚eF\7Itܬ)R?MvC2jrc4j9QCoA 6iD&1 1r3J"sTF(3d;{%1OóA7wRW{e.d.dWHkh !RpQ|#r!npȤTӆs9[㦐Hhk)Kր 2;-Ke^Jh0YzQ,(M@;Ҥ')E${H"n`ﻋi5y)@P0[2TI`dz{AURBlUy^9ݭE0[wV &t4 sB6:.R3I.wIP&A}^FBCD\FiҼin|됏Ak,@'!!Oj%\R/=fem!#уMap,]-|%;EepVpU;_X8Q!\)8ʒ$.Ekwt;Z~rnGcC!T)>FP>5! (/L dUBS Ⴙ$b>SAK X`rś`QMLjPrTn@QAh9xgJ4ɶ__\QKjI(!fwpA'xWm1)GuEf6q ؂ RZЮ3~u[z T&RT m:2f Y}oH[%i(ѷ۾@4T4Bh2hk^P2:XLHk~aUpyY=a@UnE6=V &E T{0N }?5(@E@졳=*L@%ID_Q%DKZFs/8?HYz@Sz@t?eŤ9>xwvwǻ9/3ZKz4[]^ S}ǛYEp;^~j>;S]ܧ!HR}zl Hx;_&+;3q \6(X1H=m qgfMcYTk6+z+Y&eTܹSjs&yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0049-Pad Kit.xiz000066400000000000000000000057261506652756400234240ustar00rootroot00000000000000kWF;Bo{czBz\0`S _t%W4F!$Om;f_֞H ^Ϣ"p\ww{{OnG̒v)nwM~O|q}尷#"Ib'$ZkɣK|$^o>V́4 }`qʁKlt<\ o kCB{5= ϣ'?^ID1DгZ@_sՍ4jt;e]{: bإɍm7v(5ᾌât i%`R@?{@:x85?oOW5noF[pș_ v5q_}? [Y~eHv~>ZVZiX5|=GDs"E_<(H|~ I`8?9 Xf$Mzcvl1Q:pZjv.T8?չrQ=h_=̇8k\D X?eʗ ;$䨙U]yJ ~r ]y `r|{w^[ R/X ̠KPhD"3‰Xـd?ījlRؕNqd,^Y*O,V$\cvH|'XalM>.#L gR.9RLL\BO+D&e.cԣ$RyO!8$!oh;@x;}~?,#gh?(o/S\HI(Dh dx@9c aloV20{V?Yzq"{4;Ga(r1ha`ϮZ(@7F*ȡq j? Z$]`!p<9u$OҒtmU'>i44f10K +cqx8 YfWH%QUBXnIek*, 4SE#;'Ho~}y'_lj; ~5JA-{9{a} DQ}+"/c% M])K~OM.y&Dh6 'g[l/<›y?suu7dp*df>sx*8l1mR1e޼J]Z]_iw@65r,:yE g\F4W{klGžcl[;hZ3Оs&St<|Ad O5q=~oKM9}Cp3M@fmBKBfWnrVm^UjGjB]"u4'KjEVe.i.)_?HXY_;MBie^C鮻@kgtVM?'Im]ieQni"q2jHZZEDU4 zF]ɸ.*2[sh.]uCƺ@+ϱRqR >(̫{!^] Xߗi i3yQlЛFrLTOr,ݿ& XrȘ@&"_H6t@*+M VZFxjV<. 3.H%>r!οB#-)/n2 kKҪn{x R4探 T5VEk2KiYmdmSKAe._߄kʖu~.9jK"JwVȕ;-*\/JK,K{ek;vY@]{0_Ow`{Y#n@ܵRVJ#_J~E &߆V MݪyA[۴UӃvSjnVM{M}ҦCl-na_!_#_%/%J5P!(Z(fVZ7!znM(V볎.~ɛ+%f5fC-]d&73 qY07]0q'Oh.&qӸ_9 oG(QPiɽoR6QtnqEsyoOZt~9-@v&0iXjtԱʉ jL@ꞙ[{>{x=?&}eo$ (lyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0050-Thin Trem Pipe.xiz000066400000000000000000000077221506652756400246460ustar00rootroot00000000000000][sH~ϯ#uJ2 H hhh;zܧ߹w޽rzv mvgڟG߽Nj?vGOg~hO~D:~J~ݺg[{hDO; $(n znFوK:bM>O/n_+;`=>;^ZGC3kōڭ/5kѸS/u;_MtlKϢbX6I+5ŖZQOɢ,w>wgݺ!S~B|iAiRvtoD6UӻOWivZ79ۘOߚuIm{E˻_o/[Vv:YL:jZ|978L[E,9eĭ5t}[Us>0:V"eZcAR=QH0UDXq aq^~9<b(CVl ^Q]Y 5_ť^l6깅n?sΨ"[1!AA\Y"C!t^i?´%?ݸ`oq%lmd7, +Gi#p 6BMvc ૗ 1 Z m Uf!,3a,1@ #!%Fci'a<1B0~d0!v4a'a£IH'HKrLv.$!3IH=qMSMk~d0Vcq菊0$X )wRfzls!;;g26 g º,1Bfvd01H6Y%;Iܚ)J?cºa<1B#<~=1g2#>@K=X0iInԻ~8l8ˀBc{ Ut$81@2ca,1aQ!ƍv<V:?O$d4J]?neYC6f?c(OF2?5С skymPZXC(7Dh. o獲쉡4oݣ<( `5QXۡf.\t-tCgJ2}v(%@=3r$'`YDģHEy}$XT%y{(7ޔ0PrpȜ\DF榁4/nݍ5 LT6hgԬ퀒̺QP׆(r(JPܺQ*`Vϰɵ e Ȯ`v 㨛<ǔ l1 F?6SX.O^'7잛(ouBak&ׁy`u |5MlKLlDy-ѝH~M.Ek;4?b,ün7lDyQ@$ !U'fCRKWJpp|K$)i:)$_Jr%!D(a94)C BcD?L !H}` ~<$?^U!)'oĕT!a5%?I.. I.nI.DmS+[֮lǛS.Fm2{v+g;af`Cvn]ݺ ׻uwZ?يvZ\~'yoc-?|yOҷ+~ON-2zڨtHSki7'u;I<}FW[5]啕L1n[^*/Ndx]Lz_*KdcS~,!>/inαX 8*+x okn-B/AL\ˋH߈/bjڽ6?L\i?^ܯ?r=-Öyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0051-Orc Voice.xiz000066400000000000000000000103671506652756400237470ustar00rootroot00000000000000][w6~ϯ=HIңrmCKV""; o$MK[|3 0|ӷ,0՝7z-$?ݜzߎ/n\j=Fzu{뉟Osx֋_HҬRUz/~>_CGK5'<|- g2 vhi&#dlrܪdOO.Ά7 ]}x|04'"Xza>66-7_lV{x2]~X\sk6`i#sIYLPe68 7 }q<6F[4Yzr(Ǔb fe$S_ikw*NoFgp")SAΪdΩr<_JʄhGp|Uv+3 ƊPeUڳwC.H8~]~06𪒾QǏk_x|Z]Ei}i{67оq*#l֨=:#1M NY^ti6= 4Z(20]Ui()*Wd#`|-a=,U!Iv17t K4jO/6qcBm$J--]S[U%)b(U d̬QRVjsȢ, };i(k(`z^ 5feUu9icݚ]P9iQ)ܰêpEGs`J?bnPvk07=i~hzƩl*_/UdA9]׽G)޲甹VP6=YcE%8QXM`H;37r:lt4#ZifiݩvܖF/y>;x3`!cU:dڙU!2 --)c:jYQeE&&fU0c=jOMWƁ6?eKp`)*ԏ",`HmFSIbHR,A7.z,"%s&R]Sđrd!/ڊl~6$ ahK*,mI[hb4ڌ3VڶRT^+mNöiv۳ӺҏفnwhbņpW8?nD;Zܬ-.`KQjɤuzgk +Sss!} d]2v\\dXL_(#Yf2ۤ$N8٢,ĺQR#]h ngI#mƁp-.'[.}f,1֑Kf7jyɭ 0ᄃ\L#j#Mi6@{RXpꠍ3w+zHv6eAZ5:c8dc9\utjv$5tbԤ9I>EXca8Fg) ]6k(td*$]5S#ME0!9,5DZ48ӎ_vq1 t؝=tt[O(bC n}`tP*3i#a<1Bf0#q"Iw|f8nGjvbN$ɉ܃!!%FcaWog:{Ĝ^!Y Z&_ "Ta\xj>O p5b6ؤ%.lY}v5RhhFA3ڣ,wn Wnr:!lj}2Fn}lc( gw =`"7?i576:@#w5`gs5"R<1F&/J>8uZ@u#j pذB3RB v(%:o謹ی#iaؖ(9 q(=0weFnlBRJ0hNf(I$76rX~$A7J%pI=b % M5pe/ & cg   L9)2[S\Gtq (H9Pd(<Cv{o{8(_ aˠH(g i}X|hWm$8#вMK^6=ɯ,VQL#kx9 PW Q $[^]-== 9…p['G7ئ,{$U=SrE_qeF~}R{tmumA6v(2 lE/ XsEO XL{%gB* pɇ&VLnE.2 z0eاE.$hAtQ&9$. hTVa*CWlER t{A*'[잣WFg߻0ٹ.zW@XftQ*7oH36#lA F(nlFXc9!\B`+sQ $ SkNE)Y _?g|qz4ڽ}K?ZY,ZQG֬ ]s4FOӢYAԒ!3 6c]M)KX+5eڊiE%»0Zۚ7{mzq2|msٺR:s6;|&n5,IJַ ?,#m ^1cGɫJ;ޭ2`qQѬCʼnAYD-U]Q)]{s6 1?Jh2щԛjёљubYKѦ4{޲YLFoY,{oxɽ57@mf߬4ScjӈaYwj$"|W(ق2śLCҙZkҗ-Q\~U%Cy OBYE4\&?R' clۈQőEg Qt4^]A)J[!{,w^yY},3o*wC yBzYk5~MrJܴZ\M- yq]ҙ~JOq eO+R EM{_bikL(MFRlѴD͑Y|~զdw'82ĦGbKEEQ}*6[AXJ.7֎(!'ʞ-ʭaS*588tpHT|h/O /g6t3T/W>Uu_qn>9?c'3%KY ǃU_"NeD>0Z2s#O&CSMw}g7E,{CTb ~`>Cp0/-}gnwjL+2w~y峅';7lv;O HtIi6'vĮw`ݺ uwz'ֵ8ֵ ]^K%2~ludtt#n)6?7Ue~26[U00x3IW5]麗J?̨t]ӮgIJ¬hGTѕPl/:*syبj}Z6-UX ^tY xr>%(QzM^wN\쨚}^SP~Sm|Zq!QB 'ɯ'~UЫyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0052-Smooth Organ.xiz000066400000000000000000000042211506652756400244670ustar00rootroot00000000000000[Ys6~`(/i&vFD-}@$d1p.I %&3yJB-v? {?Vۖ<ӷlu;ޟbr>le(Vw?8mu[%_Z{ G&5&fDl74vZ{w~]{?80XԁG-#3v/r2G1kM}N[pE+̂S'6~H{VfS e}̆f0\,ѥĵ-9.#db{a.ZM[.)q!rxBeeF~m3q_8WƦgp] F,nnbu&IOF5+7B|Q1,[b(&:13pI%ي ,T2 :mm`]8ј_nI:qm{+ۗ_tOʑ2"/eFVymrdv7B+ `D\7WEe?ܷhkyŅ1Jm M,M/q)Ǟ"eGjϬSȖq\,2.LYNibElԳ|N~ #1^Mn8 >iD2};)LFWŧB` Y$`c̱= L!!μɁv!z~?wHȽL]SUI0 E91$ǢYd/8w>Q dZ)v(֞< $d#1z5kCkSHA,(*%(tp|~WUY,=N% d$IM"lKub/DaZ;ECtTT ODzC>0^:pV .qtB˒.f5Qu".GWEUF BPGes*u ½ԀSq"{wB &Q@ͯX-@2ːj r9[]؅;媫FvR],ed]1)NUVI|U8f Np6ΦŚ
    lT(cT Cȅ:kuwX5""Q$I4F mj R*LqT2 LL=S$~=FM[tgU,Uɤ@]egHfeJ2_l4݈N+J9 b[ZE%0 c*܇ I,azk:cEeG@JQ4UH&rf lݸf㠣P!mdzUɺ~+PH>.DzUAr<K!%6ܫZ0n -L|nt}H'EM>э^nT*o]>l;?ضDpPs)ҀLO 㗃LltWY Z$TkNqAKvv0X|>+ֈp!(Xڹ \<%W٭Fh#d{]ºHC(bސ^`>xӲc1y-7LMějYZ MqCK;^>il ɋ7(+<OtQdB 3]O!]| L ~e|d"/l'50J\Ԏ+@ʸѬn#Kb|9Pi,v\#nY&"5/BŌm]JhS9cGm[e?*SPy`?VQ2yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0053-B3.xiz000066400000000000000000000046231506652756400224420ustar00rootroot00000000000000\wڸ_%@ᜦ{hBvM Hw{_|-o&-߱-[G1!g?.Omh$͗f~n{WMfzo;Uqq{ow7Q;ohsD~+~؝~pl7Njtg Z1"@n>;k<#(h5 Kh_atv?\׆݆G9 w^lnCjÊ;6-L=|%P:#n8̇lx?Zftj5f1S c4z'2CsC(خ w! 2jE-aK%l ' wXly j5>5 ?h$Ap_" h.ؖ'͖n2χŚ\6 Nɘ 0\&m0iF(//F Ǿj^4P,](.KDt6x ά/tKo_4wh+SH=ی| *k4Kw 1Ü,~B+ (DbH?܍7Mm=/-'ڙP$U(64߆)H⛭g=e=EI"GFO,8/YA܂3 ־Xf@<_ÙO݈`M>#l iRN2#4!8^NKd"Z,ju) ^Q8`!"a6?/n_/3v 1ݛ {)h'%Yr`pt;Y T 27Ϣ+ߔ $Zz:Vy:07l!ӬѦ.na/|/k˽ w4"=GeM'GcIR@. H9,!|ul!e+=z@*vb:i( %YÁ>t㸡;`IP'rt;E.fQu$D܎v* !F"ǀdN)oTxM0< ^ҩ3@Y? ͓P1!YQ@/X-2!Wl' Ob:”ryV,YRYao_FPRS)HpV 3z1 =AD9s<(_\Z .1 B]Lll:HL]4Fݩ(6.PTLV4O'){r G9<@F筌aww5y_(Twa&sbD5\n[Vy]|]a\pޔj=yͅtS!"A^g"F[ox;} ׻` [|=0,NDP0fr2"S6pc:!1dcFPn]bĀO]HP"[pHx$U1la 7uYT$DU4@>N C>p ncymsWa>7Y '5 JNG'FN+o*xi7xSTm*KyoNQO}/GS`U ʇAvyܶō!Q/X(p$E۞-nb$}qT2Ka^5őؾ4uxdptKG(3^WPʁkٙfյlZYu-ۭǺ]c]qzo3c~5W'n =NGIxYx )|ގ5[S"cKZMbs3 R6qK] aKZqLl\B*:qYۣr\B֭3 Tݾr, )eF5]XV),|(TXCPlɐLRY(Y(\^ ZsEKr&0s `na԰j{M I8Й.r,}wQ }{e\ï~)Y&ΊĎ&i^e|-$CnnȂ룣rG͋1(ۺm|L MUUl~yu1ϋ``̅bnwnBninmxy71|[ZV[ET42X M++}Ow b%:^qBҧ)j+|tl^|kQe;a( B$t<%4K NrHmdS*͈7~z-[WBBI#EjctYVPDV pf_UHa=Խ嬾%O΍Q/{De4Iqpy1N2ֶ-{UeL뇲A&( o)SejVnUVL@+RtLth;xx{x_>mSՀgd@>Y6""mDHڈGlDTڈqBe ѢI -D\qB%8dxk".ۈl#ⲍ6".ۈl#ⲍ6".ۈl#ⲃ".; ⲃ".; ⲃ"."ⲋ."."ⲋ."."ⲇ".{Ջ2ETMIȏE4(T+)[3 0ߓ ZƁTE bŠpix>Մ >:"έ %kJ/k!8X}(I͋M/@@NIy(Kqu<.Q"\OKgH?XqÒ}&J]jL'\GC3#yc0s~xL ޜLUʔ`TW4S!~v9j8>${  )9bdI!# iqB")j8*&.3ր0c[Ok#ZCBv^pa(EZz2.6ԍL WHeYD9xUy"C  : *KcU)ʹ+Ҫ>U`4XM~tJ3lca1~0><:r1AksE9GBOG֊9^AU!YY@m[׃0%%U)v]|5O)6/|%p.YlE ' d ϡOSA1U^DyrN!?khN aƍb_gX.2:XEP&-EC1\M^1h5ѵ"G6$Y#KC(`:Րt}IΙa)G9yFiHs5qťh$d&i5ڇ1ցiI'U12:jŬs ѿ&ց)Gш_@8u})͸40Q41BZXCÉ,^a0zK]1g k@**m WA٬/U˚I5\p*Iv ٶLfzgѢnE]9R^SBs9vʑfENr$U;{vK"MEh9DlWS)jjJn @vSx5 . h ; h hM#A etC6"!4VNz45 }׀IIU"Ά'0ۇ- kj\^ U'.%G[enh3;fWf]Yw[yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0055-Thick Bass.xiz000066400000000000000000000035421506652756400241120ustar00rootroot00000000000000[YS8~WdsS503ZH$JGGv|Hr9<vju-v>~zrΒsM7:5=zTt{,kMڵhH]Qoס?<\Ot]-y2(Q8e40ightɩ۹ptۛN7c4' w\s͡O'( jGX?CUG2' 9 61Sl PO+S< ZVr9Yzdb.vU0o$,uC ]L||A𱛼.%]mųf>[||ۯbzN@$Ė],ol{?6] w,1t/z˂U\/Tuĸp\ۋ摵0NmffbJJ|.RD#C NGg+\O0"'uR%Ze H*{WWd}0OV3pn|zw7Ue.=Pʩu]\I,<\p@P/\sN`Ϋȅ\2mPB/ T9&ky˂<^#¾1LX;~Hsyp3(`*2u6RNNkb6]Fhzn & \?*b0rEg(L#It$S_ܒ.:a2@F^ L8G 5Y񺨁5JY<5^maCb5Qtt7PTaF8Dɜ 6i<IGȥ7g=p֜2/\zhR+{eDI'KRIt7-AJz'Gi%nOQp\'3]oѾH5h\@&vL*3R,m>L<.cNŗ|0t$fRRC| ,r0 E]lKi<{ \Ki[iC)PWY('acPIj='^eF9rJߡ *02VB['Zs`QlhGQ5"v6mwT73w&k2M֫uuKF9Uz:q}̓Uxʸ4LH-8K U#BFVqϛPt(]q&:j sb ˠ<9dQɌqZtrlR,KA}}([K' LLyެڒFu98w3E5q!ެ<(^F7Vb3'=ohalUYstC-yW*RR'*uay3!jo:(ⲳK׵jO+]s\IuK.:$.nqmn#>6-׭zswuqGVN[ՑwutT\QsfX%;lpŪfˆlˆA@$da8$(ן UKPYi؈Qz+*ɿ?xyI4~ ~{d|ftӽ_ݼśFw(.b[+CImon/oMi7YkVSFuwo7FHӄFy5W}t~w%P]xf$22|I0-F3alчKSwgOˎÊa,-+w|yi,͢|>Q_9M_\zi48h/^I#FG"NEƏ_\D'Ծ<|%Лo2M{F~> 1RLȴ&OU0~#m4,QdseCW/2'Q2+<+77}|{{OorGI1y8 tD+а%z7C5Hw#e^c˭6m,*^J=2R9Ǟ ؚc,6Z#Vn0{a\]Ŧх-TOF ҷE0| m3YT An&\iy6ģ|tTL,0fh$9V}aC+8R:h}Iѐ+ ̏%/7qUcVsȞs|VͶm alzx_6ίb]YlHA},ρؘBL^veMPCJ5bЇE MHO,S5wPD/TD}GmƺH@̾HXž,Ri9qʞHMHH< (B>q:z,*P*}"pAs}J,RíEJAHcFbt UP̠H;,"w]i, [#>{YJ *I ߊL}XbD:0# \ؗA;n,:GbeZn4mi1 A2-w܀tJQ5b$bk$xl(]iO6РH]4ޝ-;hoiLexl%F ;M"K2ToȋPi~1r_ϩ<xN5>s^ϩTxN;Z:hg#dsun v!] Y! ds B^~ ds#:7Y!/Mun BֹA:7Y! dsun BֹA:7Y! dsun BֹA:7Y! dsun BֹA:77=7(W\ؼmG^#S} ES]7f*؀bL2BEeYrQ]>LhJњ$֕DAt^RQ]eU*ެd0mJdk^xL X^E[ULevj˫NQyijĪo^SkWUrkh>P!{0, xwW.+ ^TzNe7xzsGPYj}Y*4g_TG^tw+կD ?fOV829*#%Y|*H\YaYY>GRk }5,0(k.*Risuل ^h)}l5)Kc:5̒xO̤Q g\-ǜF)us̛^;Rr+ ݳ~"=|eKZ8VboZ7U]-< ˢ4Tn仳Z[ROWw|95z-fܖ~=t:ʡ[z_}Cۥ[R˲m'l۬i:tVՒU_A_A]HFzXS*(MUvI,%-%{g,vi;JѨk8ij|Qv%e7BU!YAcSSFҢ)m-ѽ~SR\WeylKsèM'Let wZp[[#R)m.}uDu:j"功b#ǰt!++܈,, 6xPt0@R"}r[[s<#qV[H2ݗGm*GFShP`2EJu1hP (r5ayqެG%hJjJ4E` 5 Ey H֪[LThJH)!GU$т\ ;sr%FSN\/R:J7,)WtiH)RUAB"}^ EZB?Bj[{\ 7|ĺW\34bSIe@ȼfؔ4HęڲC-W-;/% NR"r{P-.9 )Wᆇc๡`"&ЇE2-7^߫sc6 U-+׿^|h^-[r*dW8^MJWAڡ}u!XTs_ޛfy鰑33+g*K O@eg\GrV}ܺ9sLpkު)9ueLk-l'9rW7>}8v T )P%Td/Q;ˢ#+)Im\jF+=4L;j4}C3\)PyhCy6а^X)[ G,%QBxȞOyγt8 ՑW8I0rqZXιdO g~*؏E 3=-JsC>0Lx0yZbL̐HѬ$RdvB"5^Wia6D[ia&-> vzlFb Xi$>*R&_?/>4WJLe/"Q`-1jhEqr/;´Q?U!2&/WYTOZy$\^X@z2F˥"b$rB9Ak,9i9G[o,-LqabC ؐB}"G sdHOE XT>Wʑ09"9]siarpDP1U!KC"McZ^؄A4b] R= h r#HFnntŅ9@ԠDG1A},fgH̀b…4ZӀDG]pձh9*܏>{YG;yF=ir06rS>h1/j=A r ^!P݆QxR'TœZH#E&T*>!m(;.cN()ߞ_] "4 Ie* \ 1(9SUcxN3&p\g9 l,J+8ˍb/ ! b/  ~N";)Ӂt eH7؇E_n)N}A7bE@VXV0d(st#77@7-K#Nn ľظH1bQ7b nEO>,iVwu}G& {$ >H#SH-nz }=`+9["r]q*\c:v:F 34ҧb.$ϊ;< q*xb c1ttrqd xr,gXH̾!3RpZEָ:'b#jRi b<<3}ydUy<2#XWY2rXX#( OYGϔs)ydG֠n}p~s%ze yD /ט<Ȗyda=Egψ%~IS<q gw'V`!iwH"gx#v@ud" B{!#g_}Fxd&% o3Ik^xLdg4 U 01 xES RXTM U{*S<]BK ʍ~qNg-I?YT00#?kԘlެ}+bZ#*ǰWife(G]G[(w}̇lDƭ~a5S6ڴA >-g5X~)OĈ*JmjL Pf>ağV*x;X}VkMֽY{\Xɑ A.wP̿`6 KiAAn7  F,fJ%E Rpf0AH:KD} 4NTB mDhH^e Bar 0/KY]A9MrJb=Z)R-C;   ܴbքz;00 C[@>kv$Dž^C,NxC37:Ea+!&L]1Q"ۮC*-ȋÄ#>{W,rÁsab#:!6<\ ȍ`&-whYEF|z(6xVi3Ë\h9-tC%1-$ "LΝN\"&#J5'rԴyuFYBIu\5y0䔥Og2_;Z⫩ v}ЋJP&6;Mƃ7V%ܽ%Ȭ`54 MOؓ?~@ƌz'3¢aE&Ik*ZJӢEв伏c[vT#C6na),`DtND/EΦnJzH57&ɰΟxXאiW.w=#3 t~$9.)ԐHAF%8/ng)䭕q66kJ,d5u=uqnC=#2¶b^#a{ u(j\yrH!YUHqsfVgʈq O،0.} &rh1*F3fV\ afMRz@RvvXsSc2̩mGn}p~sщFI1Ϛ X 󘠿QJ '|RWp-r׸;P'ZJd*'Q^niVU0'%/?9;<|dhOs8tҋ\]D`'UUW=$4_#$k=6 swOLeum a a|6L1&O*YIƖ"mt_' acɐljXZ'#V!}F̆aN CXl 8tXz#<؉\'G " IXȋ>6üY$x+NCzF%cBؗ:5c. lK-0 Bźiqj%ψbﺃ|S|.TlJ]9-RhERh01{09)\(ѡ9!6퇢gN1XJm’BbNVipC1~^g7$rO u=i+0B^2(*`-C3<#XYɳj^oyFں4<#LM?YfL3h4ѸW]qi6K Ͻ"g-r袑r63W_q>L=#3<#ZnzI|m<ڠI b,ZDbhK}mg*2qQd &2½<#L+δڽe'[+FMS}HF1'Ǵ(Jlsr9iNNH_SnX#=a gG>`_, B2QX=tVQXd}V%6n !L,ke`2MGNv,Qb0'KL>pNV;0U!$b)bI&G/@"_ kS ;Jb#1f!@U385nU LlE-bZQA 'OԎل01Wu\ʳD*-GAcCBo 7:lErRYNhs0/-&!H `XЗs}H0F"-7^vyb$u:)a[ِ툴S_o |b_ʴXЗH>,Ti:UPSZc(nbZ^ӪiIjZ'l<ڻ_o1a{up4ڥͭ"dVi3+zLDŽ-cI=&lHajvܩQѸ]Ϗ03P~vAVF*nA)t;{LXV'I~Js>=&l4}}pP9W﷑z!}#XMHblpVp7MN^KH}S:ҋ6 *i5"!y̧Ider_' vؤqp/I{jQyɚ?J]PovmXbRpzx|+ 'W]4uscLX1a1afu6s!c<&rwS0 [>\UJ\7B=&c4y v@d76Tg4)O]gZa蓬? ;YLp a{LDŽyLDŽg*Xz J̒KVYX ?Kp@YnKkVA!ra(_.<+,9Me oâ¡qP5 곘z }>xqb :Ŭ&ϊ gd0bӲZv(@i' 94[it$>'8 :{*67@ X+fHzJLlAp2hNŦeKs+Gb b\(b֍Q~nq3[ze?>Ծl+PY ղa`mI9Lx\T-=ň1AMn[?h{ GcK[!сڶcK:RzGS_0Ōrd\nv{/> ,nnP_s@tRC÷̨ <+,A 5kK8-#}lSKE9 kqo0KՃ&&dux;ب}p+A A1b1(S,hF~5)Z(Să?ˆa؀ bOAt[ ˧C X:iVaX i8 Ĥ Q1rHK'b^X!v2Ǩ<4Su=hf*HYSH^PÔ\A[ DD БviNވs"2ZNXH(Љ&(b=LqK[b}h -8c6'F@ }(;[t9!B˭B![BlE6t@%@K0މT 鈍s &F-egЃ{U$r#-bŌ pRj%tvxFg1U3-WP4\܅?ݖ` xdweeLTWhOZ`:ڊn>~{au,?J=~R^2]_YePMyA)<# =>[jĒi2˳8&$&7<5'6om]FFFQFc[޷QFv6FVf7s,B Zm01ZXm2ZE0ZX[EfQa(F TF R9FH׷L9F9vѱ 9v0M  ?F ZF ;X_1~69FTqq3hcaG %gs,caG ]׿1¨ eveQ8eQ<3e[:Z9F-s,ca' ;s,jew2nX)N9FE7̱SQ4X)ˆ.}Ʊ03ZX#-s,cau ;XX1BM^>Ȃ}3 9vs -XZ@cs{ek ~0zO0N,[#^ m,[cm*2z_rfZȲ5~@@#{ltP9Xk?`myopȲ5pȲ5@p5@:Y:X 8b͡5a@p5q@:XD ` Dc%Ckcek寱@p5@@$ A:!NXs( `,uL AAp5QA:+NY:-X뼠XЖ3:2X:4Xa$9}ΙCCֹA:7Y! dsun BֹAH[j:7ysun BֹAJY!+= dsun BֹA:7yYsun BV@:7Y! dsun BֹAJY! dsun BֹA:7Y! dsun BֹA:77=7(W\XTzUmqMyRx4K6ePty F [5F=zy%}E5 G'JA%)5iQ2mձ_%ԛUr>O(|6LN-y|^{1n*zʅ$x:\u"hKS'V=|sL\}?GBNz%%aXd^Q>#U}xʡG>w+կD !/SUA6;@lYAEkd" Sg7WzHiY_ʬ';!UѿbݓiWc.kL"T^eKFjΞut:kn1%()YI}h^-N=U5a)g4D7^\_S[4_U&5S4yvqOliPfS︣nJ7?~tCץu#*cow٣Z^MO<'I㋠+nHJ*w $2C˫~jDF]^v->uy[$f鵾fyh2譱[11NO)g!UM lnר߼ntP9q>EQb!BR1ϒ.Be}ߵʎHiZknđ4G;x7jp `ɍtq79JYc֪7E)˅E%taզ{K2NZ)9۶F iSpX߳!7llr&(򠥴*7wYXQ jNpZDcTچORVQmm֘Aկ"R{NPzwmĺNpMo˭NMn@mi4^+,+*Rh:zShAO3>"*!P)AYD:%z^JVU"7ZN+-fڰ/& }XDFH)XU>SPHKPĺSGwmE) ZFGMB4d 5&"bs>i3FSfЗn4%e 5 h9@&O:v-T%73#&y#&2PP@˕yC_ZD2-tPV=D'$Ҕ!* ` ,(/ˮ.@ -- -?n]~19[ޤǙ7[-c$n@ wuӇ[-ͧ?="&QzfLE.Ԧ8Q n=48pkҟL=4suV<4<g# ŝ? ? ׁxvn?#3hphϓa4z #p`0)Aa*xryO{ ߥAa+,5{SoLr"e49ܶQbY6J؛ 0˃lx>eȃ<(B\ß0l{P؜-{PX Loŝ)AaAa[3=(99}*52^+9Vm#¶"/%P _EJdʸ -f ^uUyT4Κui%$ˆe:2|S<}γt͞1Κ[L~I^QXh_!7M=Oa ,GH_3F|I :.۫˷wTh= xHm2'O*FsnX- jƨZ=*,zIqQl(KwӤY:󨰮_'igc7P­= )WKL >{'d٢g uE?QaXzTG]zc ni2iTdyR>MqMۤU3|zlB WI)[U0 +ZڱQadiu<*̣¢bj! WGwt$ BP%(qm!b>m!,L*F5\%ܡd%uCwʼnYRC0sIʸaXit aRgO"f芫zޜ(f+eu \-hsoջbLuht G"-'C utJF0sI!&L̾H6J\}XLstjݪraOZ,SR%J_8]v2&`#VЙ(bb i1-i=b4@l f_,n94f we%rŜKr~+ ػBdZZn h1k]%C1{b e[Qh}&$rHOIPUBaAz+>%yd*$hlo-c<&c<&LR'$|*{LDŽ-QS9U^!J0 kO3$hV&d =@ #Q̝Z:I:M<&LlL]7}[AhnIBf л- Nqk}@mlUU[P{=&cE^Ӝ&~דᫍn3Yݦ{LDŽHnDŽS+ѱ&dR=@]vfDŽ-k^o?{ +~ ŠgzLDŽyLX7zKY]ZVm4)[k9#9Kf3 M0QV0 0slv f1N1m;HጲBԇutq7{@!tl1aO-TulgE1aZ_oyaA]Nެ\n6+"h0&Lew/m6' sp@u4 rQެ/rr iX" hF-fHO6˻G}$Y@uࠬ,lC-=⩱ ;;\F؉_=ϜHY$rc Vf}1=X.3 %%1Bb#Jf0dt&*t.TF }&\Gݟ(BVXlh1+^qF8m;V.,Ri+E+s{bvŖeP@#wE*-Nj{b/ aN_FoDf#HCG dG+@3'Bw:{K= (rt=(nW00ٚtG5mlWk#ۍj#&TwpT|/&T؃bCV 2z*w3l2/<6duK>?7XH1=#mO(&$55ƫ=Nh_30a2tb[K,7"nFH_ȓ?^~(:W7>}8]zZ+|{AYE[}\aaй_aH$TVT\P |h>:G31Κ[0 TgyFgyFاw=a=00ɚgeM@s8-#P%abVP:`z2Fo~||kLZÿպ%#\Wy=# #l_,eb1o .FQbºb0;#\7ŚEQO ņ,Nu,lG$#r<)%TmjxoƁػԬcN$ҡ<r i 5DE-/W2i1^ LzWIJpԻ"OZN@F%h9v33w|9aNʼn 1mv:]K히9pK *B7Z̜fbj͎@lE*mhqTaT *Sz&>S.Ds˸lS3S'E.[H&}$bF4ZΣELt=t n:N;#ȕQB}&vʳ{0`$ۑh Pl iHvgyVgyVk83&J̘DaB]dq۰MD%0FhYaWg< M"|41feD<͊&^f*gEfbxdqQ?15<+, zѳ<+̳<+VWuқ-hqV3 }do|9&Hutx3 ݫt'B=$w%6jB!5[כ< {-dcVX}YaYaw`,ݽGSBnW1*u*)xVgyVgyVXAYaYaYae-xVزZgE>h9 X ;0+8%&@RѐjM\9L"F]|^>,dfכ^|X,aUj nЁZBgdIW  A D_ݾ{GNzUx J!q_lNB2-ǰ=[GbI1h'-Wh Ep;P&DDcBHTȓuh1U++7xC̘}taaaU,[Ce0+)wI_󈰁z|My4[G#]R 0`Zruԩz:_L{tVyD"xG#{00Pa,K7xS,xR/ITQg-x aaa0k<$ %J;Snfi`Zi;k<"#<"l~u\ꂠXv{u~}a `u29gb&@^gĒPY[$Άb3bi&gSgŚũbe Y69MA:+\HOĆ:"zx9GƚdZU\zY%3{$F":irŽļK:+ HHvJP Uckvg|HOSD&6/#WLVp >[6@WZlP!jV4z;XE7i0B.&=nj.61@vje}aS/qXL+DˁؐB!$-nXXƄɁQ'bwŜ< ";1^Xt$H]w&$ T){ t:]xNyN焽Bah[S(l `FlD0;7PG֯ly$̴BiYqYd8i,ci<-o烳cKRl_W1&dV"<ų`ŏ^s<'sb5p#7wUy\q6Rq'BŇ\#f:Q sZ歭>?f&uQ3&=',"NNC$/1fO$>\zY8φ9agp-*@ϓl,gƜz+s<'s<'s<'FxN<'s<'s<'s<',V0Sn{܄G*){P`e;Lsš*u J9a',Fb4oNV 0)KeQĿ\0 .0om`jO0_,r2t`̿ܐS}ńnEd fH ,G<$rYؐ?/4@+юSfFb)+ML`ެXP#rgņ&9&#&8+ȋ>BK~c}Љ>v:sardrH#-eЉ3n!G*BHOF]/ 5Щ{rV-1jWMrdCFьLW^B;kR i2NTRR+YzfV|ՊN&b>jcƪL,̟d6WqdnvtaigFCq ^End^D/y:l'cQ h:&%CbEgbLO#.$$w| W_4)*Nl 90e(w>C3p<4 *:̋p<*l譈|ե<*%@!!&3$b:ѿ波kިZ& ?0'*lp]tߍ%+&{:/\^~>"?oY>0C/Gׇ;Op nX EѫCgׇ@] -0p0&[Mx;?.Dr_^-YJLYRj3~s&ƟQ:wPY^uwu_+Xk US}z_s,d4u Go 7ØoU aќ9bt6x2h~9%{tGKPI!YH H5Ka~gƜ^ǟ _A0b$"{L@t7x ^sۥғ}tׁ:VMCjFϡxcst=~_<6X8b8=$s(f3]"Ng |@ e`Ya3ռnz?+衼Wiwʓ jhWXmFSz/ݲ1݄2fX/lKUɀvx2_2/B2Ø L݇QdfʡS"Vmby\/ZLfXz}0}]9v=UBQyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0058-Simple Bass.xiz000066400000000000000000000037621506652756400243100ustar00rootroot00000000000000ZYs9~`yw"]Jda &~{NI40]Sj!}tkֻfyp8_6?}vԝ>=lLYcF~T;^ү~p,/Ӧ]M9RGH?^Ɋ F=L4"X&+' PX% Aɔ{%>%t"{l搀aL9sH#C6*?s ϽD o]Y|K8)Fw>jGFIpro[ۗIEDd CD"($WxkGurJ #孶EP"@ʊhʨ?vLâpia}lQZg2UPj 0;w$4,'}uhAZ:hd1rbY,,\,8 Ȣ5Y֥urC[sR/dZ dٶC!t_&Xٮ=JlO䷡x UJ~JƺB^#{\ &Q@o䭔%@yD!g*4* Zu6"O2rn}WIUݯ,TqܛaW0mwe'2t{G RAU!!zʉ+8۴GYr544-J`ͤ鈑C726CŌONLESy^"6M1LfI,eTU)ي`K41zY,TlvFM;%%}a aQ7%~[yc N;r&ӊd#lcZA뒻 ?E>g4W)U)$N׌ d2l}\e>T(rGa2AUu"(h3 at6w uK'Ӎ ={d+;2~j.]}m9ª :tqbRLKCk4s['l(GA7*N_-|1֌h*8n3o_hPMͼ/PyQwz+*_/JW(}^_`hF[^}l y.77z .xf Cy7rp(Vlt߂&Adl, j1b.(VHl!ne3Q#tbL 5N:s MVyF 8=py./@UkykKxo(Җޤ8A KkY=ֵ|ZYu-߭Ǻ_c]뱾Aʁ~}v6k;Ŷ07 H #zÐ^!&/CuIu>iF'- v=+3dKz)SL'+8R-*?9p+yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0059-Rich Bass.xiz000066400000000000000000000044671506652756400237500ustar00rootroot00000000000000\[w6~`GǶ'I"˭vm+٦/8 Y)Rűw(^pT,yIB 3߀<1؞~j5=v>5ng/>t1Ͼ ?6nϲc~+>蟞qOl7~jh.#!}ki}󂥽3? |ѧ6(-m X*d,V Cbl5 U:,0łUSS~DՐ2 ztPJ6X)&ުh:^FT9eybK "Yblg-|91_060xkdžc߳wFf#pfOvi:ZX+C *j ˑf d8\{8ҹ-tAplܳMs|oyZ$I VU hW Lf!Y H1o mlxp|5u]0 s<7VM? JO撀{.YoB[XY Zfw:_R并I|Z Η^7"+c0: C`j8Td GJidj9~Ko2a4;epP`B@Ž#?[._ߣ'ϝ4˽T]%R6s1A V{&,vfFL,^8{fKǓN+S4W0IÒ@6dՌYxD:jTCڱHyUA6Y"Z'ٴ!yw<**KPd]Ntm@^hz)PL~72V9Cn[BT%}0UA:Mֱg9-=؃O=5Gf C<3@ hmQیm"T tST׹ib*c;YcHyYvm,*`ःv@zv/f dj|JE_Iu7WR#(+zH@41x>$.dZ@@#hEt#@i ldE{{$I^,W,;}`$XR +'a/Q)DnqgNNeD($$DA3njP/Rt|PcΜl}ge/4*(O721Y~PmSC$ǃRLKCpRLKSbM(֛\G~ܓMi#o0p]5y3Xd3EVE'zhgwP3; vv.И{ ELZ !uH O˴MQYR[-K;y54(5~\-U*1-44^dZ8H쌈@΂^g v BG{#\ǨPr C΋uCH$Lqs|Tn^~b)uCAvv GjWBV]jてٔF[eBj(~K5ZD}uE;,*clH(`Q6b%Ôj(cXT.ɵt_p߃}YХz֠Kǃ.OK"VK}ݏ Ҧu;o_WXvUX~;nkg[M!l_ȬK)~2+TVf7q/dCNg? o>hRX7ʅG_ؾ| _J[rOOd]_#(ِJYu%ۭƺ]Wc]櫱Vqj?5y>?zd.~ϯ"<\^+z_"J&T/7t-pW]4-zQZʭUz)-}?IKyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0060-Stopped Pipe.xiz000066400000000000000000000040371506652756400244670ustar00rootroot00000000000000ZKs6Wzرgd[N4%EӺ ,B`p.D %3V)1Xo ޼O,\_4ۿ/ /ͻ滷Go~_'8W)V|{_xx4Oz#竐=ݦ&JȎh"O.xMt8Oox4${ Esҿ6~"I؝z <ݰht\?IڿYNjZd:.G1,ڧ&S7f,$af~cY`a%[h{l[R/$~V".m@nu4pO]pIp4OnL ~|dEFog14&n޴Rd\k|2dN ,,[k=7x* 8|*w&`2.[l]#jH;jqRy*h&:cO<-6mY'#CC듯lCyՃ..(bCb_bϢU G^jQh@֜'~4 p eEfGorbr!t!L}Ooǣ%LÛ<1@A (Po&@N < |j^ \.@6e]aq0JyӺĨ\u5\$fs*q?KerƀȊk ;E2ͨ[ (jY0B\abȪu*[A[Vo)Ye)Ye7Ht] gs+@22ﬤRlCFN!#*}%uHcC p!RoorjO0YaO.$[>qH%aoT},78M Q[F80m lCYsH*Wv[{!b:Gѥ.S6[5gCu6f (Ր U{. w;e;Ow{h,rB>*\>:;mT8GLm )JϞO܃*8jZb_񆀋!t-E8GmViŮfiP/kVYeTσĂo ISr\qPz:J]PWM?>Bd j2dOxzz2Cc)Oƕs%h#}#OEBS5L.!m=j*U'[?8BØYW՛;h|("4IR0VPZl:܏.QAK ~gq=v=|.n͖w@fhdqX0$-dЋ ^q&`Үf^]pW)!kýȥrdV ×qKqV؇g˧ 6-q͏< \۵:VO1}ԦMDxB5C=>d5=Q~q{yT  Ay(]ϛ缴4vR{[-{RFeљ*y/7N۷B NS]@uw7\X<{X}r8OTNTøjMXd>`I_& kzp9w ջoc|4C샐Eԛ}n| O CK\\[nY}a]Wl7ބ7,\ ɾ0CғJ3F3v|ŒS|JSQ^X7QQ WittF[7z±ºQ֍jnTᒠQՍjnT{u{VT[6r&ҶM쮶^me"vj*ey9yYUjY6ۚy{US@eOj/-vGEXQH=knL%S-yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0062-Deep Matrix Kit.xiz000066400000000000000000000057201506652756400250070ustar00rootroot00000000000000][s~ϯ%l1 Im@fw΋K"Y䲿lInɗ3LvǴ}Qwkeo/sx~`{YAàԳlq7?iq/כWgY_ t?'{Y_l7i쉍2|>I0%h' Y:^hO}ߥAh6#5`W7 _ .ӳF"xuGsP fL%|}Ahbݧ 7=U߮wݔ77ޠ?ߎ$Ŝۖm§ff:N')~C<07m7场]͂t6Sa#)?"?ѐ9 C=x<{qMu[u5Onif1҅1 Ë~h4YXݳf>}b 7R_xͣǎl=cA,X7 d :gHN A]֜lU ]$s*E)A6&a[gH2D]rI,W-*| }&vo5fLyEZn$e0LXsa5b'f]B7W ]xP)Z._Jq:_MX vQg3bQhb BɢKwhө>Xх) %L"3\n?\{jĵ9.{˅l:規 UO³# 01% `Dh+"`͞6)L:\^tcNIC0:Xz%+N]?!ފ?Q #*젩4x}9b)I?\=n"L,1Ts?4";3ϔ@±åpQG Y+3G:$w dr!8iKck#ty]xU7Y4\\OZHjf([ClbyO{$϶%ؼ}|7 ȋR4UQ~@~ G+|`vm|`%X%2֣9s}e,zd1WhLG֋0L6`5O!xo饓/~*!f鷜SAtRu6ͅ]޸ۜTmef6/$[uSTН6ޑPf\ Ȩۇ#X=hϯ:MCAuo(Kʹ,RQa yHw$L@Ya1Ake9vҬ!ʬ^̛L7gDH!">b-b1q'JA!!DM$4ugyfE:R+X0fJi WK3R;297vXd %I;ntЖbZ3V{iV4:(3Ș$ܻWS2i6gi55o&=F~8R31l9!.nxysRs'h3⢥$kZ7i}1Ͷ__)FTvBdRZ$BtCg 8,ob9/$[tQ0[9sG\ XfC*a"lvGVQGi[_4 BNQ#N|5Bd$'J=D:ݕ:5w(.؂_>έ}ϯ j?|~S_)%ˌ\!`9$\댛K`,(n~^13zg5ᆬy$jyQRJ}e!0>w"# N[*?#]]Fw w'MA]ܷ/Ч `>C`"O) P TTS7JH݉y Yj)',5ύ"2P0dWS 5sJI&ޒĊ0WWEL)/LiuO \:Bsz1p)Ꟊoc(u.5JF$J}Jj$: CݬEv12]uEKQo^3-!2NꖰGJ!6lJ\łvA5$)x'K6R?EKRoYRv[ nBb(uE`~\W2g]z-!gIoI*x/(u\Rׂߕ(Bys:-V,úE .7A1(}V󼺂wRj%F;k^2FB[cgz<&@9яw0wG:z qK-Kܥ.vny7Bc:pk0D頔յ;]գbӺ յJ~Gkȅ{Y#t յ݃Ct>#aȥԝ\0϶bهK]V#*^"{h Ҷ0TVuڬj]W۪uj]Wj]T)%H+Uv <]k+{} ڢF $̣‡e|>b"1,VdqlN"?1zҳ},^`fغo.eLaa2Eb/1T0W.Bvy .w;3CfC%>4U>J܇EBz(|5uŜ!sT^b`.99yKU9Qл˂Q/+W$Zq{F^~U%Gɛg*ڵWjH09jf>7[+Fc|ր$lyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0064-SuperFat.xiz000066400000000000000000000071531506652756400237320ustar00rootroot00000000000000[W6}!!@8gٞ,$-Pn_t!n;od˖oK/fG#YʸVn˰ݹg9qzoçNN]?܁eM MO)-_zl߾s- K ;6iLy瘮qiFևo^tN 4X? }B\e@|/28"n >l<\] &cVk4xp%ۂo3W`-7_@_Jq}Lrp5^lk!SKcdvB: '~]aCXsaj @ Tl ~OoZVw3GΐVW75;p|7>zڭdd?l}Y=k~<7]~๷>\fh= 30ȸh`3-?ac(}Y?(&x-!m)=KAIl{A0"ްdWBήcv)wvJʼnӔwNu 8u?aE>kѶ4mR $D {VB1r@dgoLlbfiw@e)0lp@` Dm6NEf6\0 *1o>ݛ0ٽ7?@Oa=V[v\.;GHA lDǚ|ݜL>GwJȣ[@"~_%{J+b\C~i@:]5J?aw/hUݏ!XF'J:y*hQg`W)y+?7*_&xNI KޞVnI9R_|դ,8et1$ߍTWI1olcMV|kTʲv'.M|'QjCսW&%UC1M_c(6ǐǐDb) Jwp:' Qf8dܶ[`FDN>WefBuImv.EU8 Ιfr;,r҅Xih3b`x˶)x o\mcwzgv>$^0w]K XWhj@:lQ|)xPđ19ʠg3P"yVaG7K`f]Ơ=X׍1 %L.BD:?b.lX+ظ=$!+Cyg`iJv|">~'$]nWd\qdScGESw0sT6]NYBOEeŜnqP y#e27TRm)% !o/UayvkJqUY%7_겫{R^B -dSEDiD@z+3Y["v6tzr8X96*8vZ⯆T,GTxxxUP[ =ndߟq !O:TCejjpLw ˣ2"*;_.-+qK:Tq B 7X0n<:R6tZ2VUhPT&,QO3ܳ,!͊gtu2Z\`% ^\̓ԉGB bœǦ"n#cm s!:&93K`)7I\8U@Р`BZ28lOCrؚ a$Q"e0`X2)>ʊLD!D+z;jiLo(|U.*HSʘ^ bדZLi_AZ|j{cCRgLx)lW '̇2 n) o7H&zR* hAiT8SZdq6Z<7mf)S/lk:c- NGɘ0c{ߎgTȱ &eA9!XT*J9Z?GgA*'Y:EN:^W H"+B!t܋ܗ(mSȉUtˤ Ƨ ^z}{9+?2kPU%$U@qڇƬ-r Sؼ0hX.VbQ'DŽXU!P$t!܉B,h KYRq3K?J&阅:SXw1_K/Y d-dq5#y|(O (ʒx7XЁ[&@Ρ.7꿠k'14ҵeڟ2iϢ-tEҖO F-bhx'ТNh JYbՕ,kj*x FԎ,)LYUu.[vfhnWܞQ'o]I ^kK3 _5z\{:[uf,TTDЙ:jL ?._gu'rƬZץ[7t4Ja'{ءA+{>u=~{o^IO>}q=du)Q{3[1sF?^,Yfe\BlQfPl7CH&]!Z u6]QӖݩSh[u,yՉKD G5,BcN:Rmhś/I!R1ST} _J~&QfsAM-ITX-[mjr0]_ѿV~u{me: ffAnuLv;z~vp9 oyE+goB>eԴIJ0,X*H0Jd "1Ȗ>y0U8n ) } yޟaS1EË;PƓëI1?717{?YA@5ɩ9o~l/~y⤵ 1O[Y=ɬ5JE^'*xO h* K_)TWA5N>Z6nKߑe<"QѰ.4t+QH<#8JB!h2l3!:̥Dݢi6L>_3 r=wXt}u){ZGtD3/XRն*$?\M~1DZ$Yͻ[/HfgFW~jiTrBm@GxIb+*2 zg}IvbH*$ZQSaѐT֟N3M:f_#\GL6Y\L$J˦JwYtJXI-(zxLI^#Qt뛡H봒A` a'AftDФ4~Xh>&*q2 f^,?0jً0 HSEh8xJI(xzl|>h e~k7H:]}|Q|ҜoT5'Jgi}i: ڒENDǃ4Tхp%ЈUJI2ouN"h /汧C*eA"֍(O]\i 8 >uQFFZFyZT|>Ayq;Μ:T9344jƐRX)HPդ~!=~qd&d4I>5Bd=S'/+5jN\}ҩ?unO]:u_OMҩ{,XqI|v,bb66T7 `u:'4ņO4f4hwdwMCdք&z MiI W:`5+ǺHQy۳>D+ غXyOo7T:;3 4Wu2h[<3l.f/f/nM8`80i%@tڙ\i=օ Fn\0 o6@'(b'>`aeg; 2#ȭ#SnNfp>c@)l>b?BMQp,7`rL0LJIRg^xYv;k2 Dh0#k&=f1>} dsS0|%C.8l|_$(ٷ! 4(v vfNdN3dq$)60ΐǕ0G9xd| ;zܮlߕml{5)v+Yć"ې:]3vt$ㄑ=hN!)"GNYd#'?pqض;g7Kg}GNBsvB;'mr7hSYtןmX#yCv 71GXyfYQ g,R)&bzxC M>-EȀe7R֖cJd`7^Cm | |HwP(;(@kk9vP4=J ;t  hB$u#V.lQ7_7܇8q'e gU*`%2 qTh]ҁڹYxP@x5Byȱ- ؃h" tExl<NM+Է7 ˌ5D\? 39dq(׍D}qXυlمN(@\f-vQ={Eу-N(']; ۂCٺ(vvmq-G YbU'`by;`G H=3cb"ʱ%ǎܒ؁..(=wMHH0mی!6]&`f( " h}a;I!ana@p<7?rP9M`_0JhM ExMpQ4U07&4Mxd]·gYd4nn{i" */{)tf~Y&An$])?weUBDR}VlIhdx#mŴ$~c")G֔M$T-^i>g^N*U]3|ɒmaTT5˛fAȊiɭ[W~ژX(,.Lֹ;1˔pa*#jd"/Rb5%UK7 gYL\#>9 Oƴ[/zWD-|d^zk4P7S: 3SVQEPkHSHʴN!-l}5'(Pet0q./?EpERk&qua;O@cu,\ƅ$:s_](p/^1V/ H#F9.jgܛ..4Nj|^S}S*_y۱vS+;m]`Wdƒ&Z:Խz>Q^Kl}硞CPyOӄ⣆$^+1sޖKf)߼>6ևDݿ ԿVOR ן`6.x93͋yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0066-Sharp Sweep Multi.xiz000066400000000000000000000123711506652756400253750ustar00rootroot00000000000000]]w6֖'9kw|8YlntKNڒ'M_BI,;bke ~\qDn,}fzÛwvy:t5lеQK u_&ʏ LxC1,yLs&qk*%Q >(t]+K̲(;^VQj4Lo.i?70t91j?Lx՚<>7kNQ^`?ŢscW[Vn&Y;Cˋ7Z`T$kݛ?sz𡁇 o>ֵ ~Z~ɻ7-zgquɔ~^P[·9t~ețXjyBSQ]li {rg4^/ Cv۹՗gPu*!tm t>L,}\/礑!͠Ul8J_x"9*`c>B] .>7gF%ZOqYE|qq!v vC/Z I. =^z_;RTŽ% _D }t`hƨ:I%!ic]{N+ 0sPV[: 8cP2+[Fa0s8wq^3Q3pPa |>cL $+,gy!<59݄Iu/ wBSÁq]p=D]#et ?~_OXFV? 2 *+[mlWwf ׃s+0MKSDĩY4^#GRJS†pE-Ά /\t}., S]|jHRa>Hvt-շN:8ZIeu)m jRO.OJWuzdX-SO.V<{ ?ҩ?vOY:u:=K' Vnҩ:}I4 !G*ۑaѦgp»bDKF1w$xUfO1@ ^efU;i>, IAɼ`4Y1D`rQHa+U[(ǯC_]S]hKÖTVy>/+q/VdMJeN*H偱JUJU缪pMQn9 ڱT0_9--&[lɐN.ǃlN]ﶒɪaNDJDUnQ:c1Q(3_8D]tF(tÙ_?U,4LF⃹;N[")5&-DZ1Ă.&>"E=,nL{PGHH{Жg##me4W';yFѤ:$֢ޢ1"p2^dQ{BbN 0f%ak&F8fփi_|B2a5a6a41at;DXW' 02#vBa}ӎԮ:@8옚În#vDa~>@86a}jW ֧aoaԸ1.Iե3Q'AG ̋C xƖQo%1'ĘckՊeQ݆ن1HcVwYbdɖwb=:F84_P4"A>o/)c%Aa-#0)fb0Ĕ0c$4%5aO0[: I,qy\ }dn' vf$9ax]O0+9fJͶyԞN+jnb2Yԁ"lFT.&(aduwa4qŦJY]"#s s[w 3R9fXB:-͙U>2pc G6 s7hR 7ha^"l@:2aZH0 uRIs9<$A g㦅zINꡩw[h\o no)ZX Xbc1Z*Bz1^#%2  !v0 w(X xXo,@-,@-,{9k{¢d*uDX@L=n,$@sjk_E%Kz\#%5IO"dLB:99 QHזhN=0zk>kTĢdl@K"ib1 xnԻ8q-,N@,P@kXUP)X `3n51R:@b,^@1,`y 5 2!Eh eX؀LDиi.b0cBl@%< M#o0n,|@n3k>7wXX"5QDQcqPmL;sX\X =h'6@S.d-rұdc2ƢdcgQJ$Xl jwɳlcFK$; :X XΞGcaPĜc,J#̖.)r,EQ첱yyY&&whf$MFhn$M6Ţ.6L@fX!XL'Fc<R"xnр<:f(39X&6M %4MCp MfhEH_FF f<2/G($J: 0$KPu!I娬*>67T++e/m)DT/JBվi,UfL@8*x ^LYd0j ljU s5udp:},WC:#ʛk*lvչ}\XhP.tQrT K@Vf^Q*"(rYf]Xr&!XOk.x.с +XL[`,|TXXlI] NS*S8~aĒR؀٦FwR: Bp8pDoqa~\RmVVуj\)3r=w% eJղNPV5s `:Aְ/4!gϭ1S[zia5B߳:LВ/wXFKg_dTC='2P4on6LZW|L6W@Tly 9B2+[sEd`2ȾcPk}\.><56gHOÌ"tEVY?H+Ntjd[(R ]g/eB8%[OZ72JCmN5z!YNc׃!UQ3&nн]>jB-mwKʜ(QSw-u RR ,oR{T(E;cw㪕ܻ7gCG2E aLI#o|yq 13,H?`1 1U$:x> gj)/%r"Z 5P5@QQe#fU3T]%>(f<zϽQD[{W#E4* u윽g3#1g4$)zMr1F,D'L3pfb>r?b~/ q!7%D{'dBbSUVO܈h%Y*FpgоFKB4$C_s- OT؝_ 1(!2DLtGEPE y{I8 8gwEH$LտvΓ6C6uLj*_RCi űȼ) y;)~ dBj(gݬW󮐷qV-r3aO_U2Yrޫdu[ץny|+er|+}Muc[׽3RB*Jqİ gɕ xX.&0Olv$ˈYQLqY&vc6Sب= ޞ%!&1Ʋw7\uA$"*ͳ@وG.0 JL3eŃB hv {9oFa UhbsKZԷ2hX*~vHmr ` *LyaIՐ0I #+O3F1xo=*af\N\<8D@+7e_PQ/kE698T/æ40(xԊ%-ԿM5b#6Js%~5˹ЅGI% d&DT ܭ%R"11ͤDLԀ)9(bE@d/+uqj@D]րbD4褹k@&rd`5&RQ0r[٭1" LraA#ۆzb~DPwl7u[PC*\k7GUkBjdYX:=ewih1Dz|{`},V teRJ5,U}:ս4ߣcb{_mɺ-6*o]J74+_6*^6 )hmxFlvuj?Er/UVU_ܞoj V-`.6Z50o_ku[uylb`=Al~,|/S}>H޵`,.;WP6K6fem &4fn$!r^SV<`[+yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0070-Voyager Chime.xiz000066400000000000000000000031151506652756400246120ustar00rootroot00000000000000Z[s8~ϯe@n3M:nbZfi7XDmC=ْ-پqMs0$)gWljm6>eWw|a>ziYlմ ++-P~GqDT *Yϰ0Kbf *x!=΄~Eĉu0V&$ȿHCjp0w'rX voo KhΆ|eܶZAxCbЭ2*{h{o;"| ܭ"&&$ђD8V!aaZA ] 0 w/4I5[0ҡƓ7놿@{Lzg$nn]k'QݱоByD6Gwgm pB}3X5M!)9Zx}1=ObXfe1iILfIrpciPq-e?)EJ TC^b+{>f@P[ԿOl= K1'ދsg EF69j)NL0%\IEjl|=ƫ&E O  jZ^.pmg(Ϩ@< 0l/R|rGMZز6YD$DujeA3oqwn_u` ھhemA2Y*(? x)#-^ex4]xj)iDN80%T3KK<a&VNH~BKwM>AUsQ$>w0V$ak8=M[{vuLG5fn$3ypsShF| 8Wo (#0ڂ}D ȗVEdmy],7ݶLsz%0c]Â?rȦG/2 fLw߰eKuܢZisϚ3 ` &LtGtHt~AN@xw3IV>ʧυGBz( 0ֽ;3z7b 67p*V0.Wz`P ^i%,wU/QYU;vV^ŷZN]T;uکj.vڭj.ݺvڭ*<@Yk}+K rSڔnK#Ђ yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0072-Cathedral Sound.xiz000066400000000000000000000045341506652756400251400ustar00rootroot00000000000000v6=_ݕ)_uNU[umkM_p P Pbb4yjC soz''~:?w;,t#uGݟ޿ylx7 7ϖ>hJцqDt?OiMO͂Q7Q 4 q$hN TXmĉ=v̦-2NH7]wxutMy5 2cI[@ Mè y8vϋL6gKbRO&![?L8۰Dֈ@"lbrƩ :Ap?1S+.ׄ`\aQMx`G4]3/AgeWԁ :D*f7t>;Q hbm{B2mYu#!^ו4N~~qyMɃ 8JU`Kyf-uFd1yA,iuSv |bJ(Nn =F 5PUy%[B!ůU10QFۻ(|]z1dI:rЋ6oŠ{;G. DB2 b "Owd4rKR,IwBwMXphK}Er RW-6?z H)iB%8!%1*4fv7T> H`Oggs ;OW_YV[pCrlx{kL- З=FqCT ZjHM\G@{TZUƜ4Ic~2UZ9`Z%LV6yTKRJ.B)/_Rl_P*ŷ S,DElvJDM¹@{?Ϧ Q06y L OY-$[( @ :K %eLTWl@)&aU؈睑ˉ Cm\@4tmhpA{grDˮ ( gmq4`0Jݖ&a]L ɍVdT }Ӿ.W0rE3 3 *udr6 ~hVخ~x':.f:d:d#ɚj9, kWj)8aȚNЬKB ;l^ex+%DA/quסm'n!{άgBÖq%ks1'M%96LJ<uH1,)|ͮ>RYg&%ؔ_dw#9E Ms8K=WFڽK C߼\J٫.74 d*fm.RN͍_Z#ZaEyZCؕ_o⊍#(e!οrqAv,j<8KUcU:Fŭ ?[~ug_~u_;pG-kfxbY3! FVB7&躭y|pX3i5lItx԰o-!/d3^{00㿡eڳF|ߋ?"W/s|FMu7yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0074-Smooth Expanded.xiz000066400000000000000000000046201506652756400251600ustar00rootroot00000000000000]S8_;8@ʀM$\nť ?rdbْܒPSw ZyB뉦Yğ:^ǢA09߮'WomPM niֱzP;N ]/Ù;gLgٜȈQ.,@TDJ߃ rengyh ,kܖm3z#)_9 DO|SxLpY5Ӈ;g<poh&Y$r^$[ԁ |g֯L[շ INSf/qlHf+ a$?Mpk#N#ZI 04  4!߮iŏc. lNv\*Y}&a%8<&Y$l5;A U%J;;wV3ƌS;[l&pHVw,/`zwD?2mٷ7(d`)'SeûfNAL@ ֕D f2z|U ?$1@D=0|˳fP [r'כ[W4~(4ĸAܓn;xs&H%q;!Dfcl2#89Bs;wz3Oq0 L0YIQMiHI&T Pcb5XHSk. &ؠ{ϔv߮0"j-ow_d |pzv~r*6T\`?:}!^aSo:ɠ6L ZBi8%2qh#ao!㓠%77Ӑ4^ 8du# =RI̅D%:xpWLOM,x}a_"SfԭA"U ]}l7P(<"UɐA 1\OvamQҊY,6K{pbzu9CT?%58-T&TO\˱ 30AU ^9(eD"l"3(չ;C) %O`\fTd68yS݊/\(o.Sl8Q"T ˓ž'Eʼn 17gCF)m;_.Pڌ]`~%>t…ysSg6WjވZ򞯓ѕӾcci!A,CdJl )D8)z%y),R碹CO PSdTEUH*Ek7LҰb{šHA@Z3M2/ufۡ[PX0*1AfHӡʠ5ɴ5ZYC߼֙䢛̮FJQul"򸧀]0)/%Z^F -hfؑʙv@zݴFA}C>)="z^gDlEf sBGqu FA䥮R8]PMje**7 S9[L~aF >UefM99:@K} bX09Լh*٬r,7pz7.;Y]͆"Ur\ `>mv^Yqt~8vX z>oϻ?~{M~3cO?Uoݏ °s/vmS߉NH3ؘ*tPH3fok&Q`kqq~ ɗ[tN x>e(wC>&W0S?VMPD {+!O"Y!gU,I+2HU"SB< '_/"U~\ ûɯqX2^ Y(X_Y/S7 M_7iŀ>Rz-^Eً0](8uR>K!z3#7/4YQ xAJxV#1|NG3rMu~- ӤdD%lщ e,O2J0kC 2ė7ASz=ss 8;?hfF͔=aT\`$8_\xUesa ,dd <\D h jypTl usg!u"qARNP&2U]+g[lI{ȇ1MRF*H{][ bW0CxLm:Y%r(@3- R8<*a -hfN89񼳿"ǶjRb9YB"[بiT/ G0բ< ^ڭsy# EB}.d ]|qܿjz"T+ʵlQsmż?K+\I127{hWdfFB1m6zN+CRXK4_B& RhJUq21%o[÷-95xJh* %֏#>r(۔rTi𠎅-W0P1梏g[Ftb@\$ۊYT Zhk-QŒ. ꧷5Mqu! Wep5nO;J~KhD Mi=do.:Bn}CU#_LMⶕr_AQ S,wSSv2P%aHa2I: #C$q \tvFtsp RmܱfI2 cX@,$,F}@QӒPfY?wTgA0e8NWH{{_e/C7󞐘)J=iw6kV .):0 'y9X{꡵)VKT9z^5oojDe 3hm峑" g\,#/;}{r./fg[;c1Co5e,H5蘽_cVطCS='~}gm{5v'F!ýZ ^ns;9ΊQ]LjMQ5"Vz+i e W0l}P>j6-pBvyY~nwm\L/Q6+ wm;<(Ʌþ + P:o\ KgT}NEO1#{HZ+5^9~O$h Or80-;*V@- :Բ+yR9&d([ m2| NNj%Ԧi_Ϟ2׀ kn }x'?kT4ݨ>h&QLtF5G3эf*D 4-w }4(=m{G!wH]ۃO'<_rYi*pH U|?bmXʋ=S#7TÛUz*k\Oİ rD 4|"X97|^*3=UC 1}pyQEpE3^`؅W4oW1o)~ʶ3ׂ%Q˓ J}3R4Tu9"XKcu 6#c;YK"##ZWtK7cxo}jߡUm тyZjhb[B mzVZ꠭Vm:hA#aΆ]y*8Co<yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0078-Brassy.xiz000066400000000000000000000274061506652756400234540ustar00rootroot00000000000000vFںwKkٞRMkJT`A$M4~ MٕW.S3_|1<'"ͳw$(ӏ?|?}{O;w8.cSS|N_lwER|xfTi|~ɋ/4)t>?]̳(wzrw)$.=ۏ7x=d'ɏ/Y%Zɘ8,,٣{y~w}:=xqq{hMqOejR QZ&"%(͊r&Rݗ/]%Ha-Rj#FӞ3ݞt+3Nj>O9函՟2+sdw+?ΓN>ߙe2zOV.v:Y>Cu"_d㝯)WF3鱊I2ӉT,ߌ,5;6/eO󱸖_m%q*rauGwk&dD2sUwh}-g.ʎ"uE%/mk7:\ Ot*l!jcU~62ƨ-߿~s*cuk㧫{s>^xv,22ı]I>J˗޿Egl%dO^+SɎ/"*+G.Vz$_KtaIG4*S, Y[xe!j61q4O&I\hG눓4KheΣ  ~/C #2r`N{G7"R0OS޲0(\c|uu:Υ!@o1ďWn2Oƛ`;6nƔ@{hEhS&y~J}?&i)^bA(xq2+ 꾣<+O\h>n//}n8)Qϋ$J!k:Ӊ'uu]:Ȭ$(ReWT6*knU"Tʚ5l$f*:MX8DΌ)> EMQ##stxayOeT)q``zjhMgIQUxÞd7j)>xߌ&$XǮKD$Z9h^M&шjѬ23?b^-$Ewoyq%Mh[2'1%7⳵2XߋGp*w=1F3Ww\R>ru[kUovCWV;!® ջ6]O]Z ܕg ;6>956K ^|FP_f-(!p!>cHwE"}vW$ҁ>%$|DڜH:,S>uBM ڴqF/UjFT I,jr #>6]*4)4㈏$D_>,C6~thzYсyHܺU"T" hfjБs.jېd:4k]7#6!ۻ"|ZIN6?E*}S'">`-"YFlœ>d8HOئHHf PfPD@/P>an$|>h-(lZ m0l#lw^t E}fNk:(y )h+lb:֙DE/q"Ұ'QL;-QN7Γ*#HnuFu@^sIEOs YMzuhmS޺z4E6zm=okTӨ֣Q)W^{jZw u`S՚?T 9M\'^2䄮YXJñ<ڡ㹫f_5rP!ۋs  1IUAMf@$"AWRUA/,^PvmzØnT7uOtuW]G^_g;(ՒyՒ R+)MD\BF-w]Hd&~]/LMH(\uaD$o*}dk _/MJ3 쉈gK \s϶،_RO]|IEFn$Sۗt^KLIF;Zmh5.BV}l^Cy'tfLu3[* umW$c5ɱ{iS(J@'"Ciu0A{Q6J{c<zЙ` QT@NmT4dFӞ$(v `jI}jf}jQNpB~g@n)]ߡR~0DNZL)~1RpRjvOtA\H!Ris!1 :^ ׸YE[bL9xd- ui@R0aZ;*7Z$aj;RۺDTL򯕝XG5%aEe\taU(_&J{ea<(.e0c-JAۈLwE>22Lt]Qu(w Coۑi)UͼJM]ai ?44_3(\1El 4Ń8T,œCf`}vC5T,W۫'H痘/;dkB j!BM1hhuH$l&qJSԡK06LiuSlfL h2q@7GOĊg:H#>q98)11hcF/PeF>yLݕ![n>y"6O໺+iNh>41uZ"[\l#N'"DCE@NLvhF4["@f5 4L7 F$DI`zW$ܘГf;k4p۶"-fz*/<ANI䳌myB6ٜ[>)͡TD M6szjݓ*ytb^O STz=MHͺ{z=}X拾~=Uz{PZd̒[Zsf^>vkY9WkҪQz<ٹAǛ\6 tF:ʌlSU }ІOd]b~b*n򘮹b 8{yuqq?F=qi6[s`bVo!*qcy%#Ҏx/QdEOPи6~/JpyLqsj"n_-6lql2Ib@w̱qo:UZ@ ݅>|ӏrw㕡O掚һׄ>j6mF.Z0hftB<7qF[Ou>1hb<?\/1~dPt-"e:lMVo?crg{#AТ'ApfP 7VH.Bmg@bax}p;ntX| ݮw\,|UX9n }: +v '/)犩3SmsjƸss, b+e H2}Xlػ5h6݂t^>ŋQcNlj h"6Sb] f IlHُNƭblav[$|D`'=Oo skؚz|o ]i6װ-Nb(ߊmbAtol l.[6Ђ;]LyHO| ȀdH󥦁"k;t1>)\gJId$֧#D ͗A?͚Bi]p͆B-@63ڴG%?zBX)n-vͧ*M^w9=Z,q.-ְ=ZTݣž}chb,&1)y=YlW#dD E\d1d.<,fJ3WHkf#FRk?5brpCL2ͳtTD.GUBh=4LAь֊D3o1YsOӇy\yT)C/̓Ōżquݥ=YI| `_i޹Џ{{u0&;+_йd1O[0 Döֲ2 `azXg5,b9*<[CYCQlgQ_((װޠ00# auIȹ(LUa _)nKR-c{a IX6Ȁg!6,C! c`fP}Y>C>`C^[>-b-r(aK,\i6:6">cc +P|Pt,T#-d\>tGWE޴yJջBf-lLWHF`K$Gl^dװ+$#8d KSR9*.?/.R䣸(T"N_x e A'lr0Nh7 :d;5C$[ 8akbuu0bpkYkc `" K$|֫H+ix'GliFNv-\Lj"n"!͹Dm.B1 >d#~`V/[#>a 2d{YI[zJ/'l :hCqlJ4[>?0Rhs mʇ5lF :F$t!.(ٲkЏv *Gooo$tX6;B}̢>F;mb|@Dd@>r!OA'kX، r 1 Cf fPxLԖ'ɼHF?>_\>܉%RT\X +{pyt-CicpT>]X@(k[OK'CxRwխ\5 LrK7N1R_i6[s`FZ?T , Dcy+ѰF9* R5QNJyX|\y"܉(P'ufdT)T*J@ȓ? iրZ8zL= [_;^;5$M؁o-%NJyؒ R'y$X1X1k҃I PM &iTzc8p:K}6D〈V:~S0[L9z4+#}%VG[OUmNiXy< LL?0#a>['N@~#r{#$҇lQUP E:`b(|0bŶm{fhЏf >e a+>k ͡8>h>PTh> T駵e1(7wf(V,؆$ҌD&INL:BN g#w[~tXrgH4:8LtsvWGNCo}{-pe-ڂELDl\`r4۰ *4xbfBW$ba͇ę衴6jgbpӄ` ei6g$sa:uF\Z_EM'3!mfIRS)\l޾boⰮg~=4bpq4O(_p!NT?-$(p;Vyg:58):cGZIc{_p s{ֆ"85֞W "Yče!E_jb<[u觿baDФɄo]^)wKOk<# 1cQW#| Q?%qq<y.{gk-v[) <[Lݩ(Y)& Nf]"*&׊Afw#:0_Srd՜_Q?'Ew1YĆbkNَX0bl ag'vW'lM(Lt+a'l>NBP۫m'iwrm A i# %"}q|C`{Ylb">tbsJo)i|-XAn4cqlH>)iM`?md@"BoB4_*.=im"6lb| :H:lHH,4|(G-fd(BXy+Xӷ% cY1tflؓfsBJ51hl3a ZpԝeA&[›lE"ͧГ mCt"H ;\H|il{ ؋vz[?bY\4P^emxQ|箳/-b-q>Z`h15PڣԙBIh!|@m(|2C-V-RHG m$ڭ }$HlEv[BMBp@x2-WoFCVDz;36Oz CWwЏv)ChT X쳙hǮ-V ]HíH4ߒ󲭖Bf[~4j)i6{3E0^p{NJjb->v{z%n7B'|D' ,:>dlX1X1,Bbe* LEDE)=uEeʚU %aH&CajhRҮ_6 Eo,gy>Nw߃Xk@unvD2hK+ $>F}D @uj{bSW⪤8)69IqއjQ*cm8'ДM[mRzNJy 4X1?BVq'M-g2*<%rFE/mdz2%HL.+"qYIX1X1X1SZ;3K=VcŖ0bX1 6u!fm|Sl :RkG9sȇ|i}:mY]m+Co6[A_!@'0{]VTX<_]hHY^fq!S)%e0u١(ye 4R %;q\?}>yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0079-Brassy Flutter.xiz000066400000000000000000000272251506652756400250620ustar00rootroot00000000000000]wF+HIGc;ڵ$$g&s 0$(GADwTuWqFhT]QO}>='ig?9K~>HO?|x/z{z.~?XfQ|*of|_ϊoi?޻sg{p_t~_z,{ozb.qՃ^ݼ|Q7'cx%+>Gi2POg/tזYZe[uzyߋ>\]^zw[W8F ԟ `CjM(-4'(ͦd6J2ZT]%OOI_q-T+W@E#?iՃWЦxݻy>zoeUÔzNepV䇃EG:䃧I|xsO1֞t7{_Rϸ/{\=K',&({Egj>2NUism]\WZ(4תNbefDͺ^:qUV?JqփZzo _fѯ˲57{V l& *rkTfRl,od$oU.6IX*syǷ+9N~qeʘ%NI}Ny?-^"S\t<#Syuc/d4.|r+,_s<Yڏ&q6GjdF&T37 ܻCZI{?hT=G<-wICeٲyy!+D7|O$&񴱁UC05ĩ LѠt>&N9$y)#v-W7HU ?M.J٪`5.peQ9kԞ~ SJ$kIuߚڕU(5ht؇"M4|#c#fux4Ŭu>V|y`2HqsHzHϳBF3>0|wwݼe8HYֈypA$ǓiY%I.~7[9{T%hC'uYlSZmJ+u4Y:Y2[WiG6YhʃVnEO.ܬEb@d/vSkūjJmO2+w{o_M?0Nω5C-u|&D;ʪb'Q]xbroJ*GǮJDat$ roTfjQh1r%)8_jͻUL,lKGrw=#ZNqžk巚-w=w=ԃug69X _ vÎap'2%`%߼FY-(ҡp!HwE"}&vW$ҁ>1i9A"Mg:,S 5\NF+w}E0Nh\jqJLD))Yj|oB!D51h">KGdB"rV\1d+IAGZιb,׺2o$'bRcwE*ГyR >+iA .w8-2=ﻝeZLB|Bl~TX.N]]#1݂+biVb*]nE6HDӚ)J4=.%98]LiD$u [;fcݯ$eTK⌦:{zy~%msjx!XjlSoRO%Sz,%TokTS kt{Y{T~Es`yjZw u@Ojm/|jq8:visC6>KDKХs.}}s[^SY0R(]R[BT౉"o8䅊zf@fE<5CNiťańKZSDҲ 3]تU&C&&C&&C&Z?zY󃍮.X:oIRv;sKE3̱/u2qgӍڙzc, S+wX:3 ;XZ{|c ;X9a<6Ž8ͱ05z9"0̱cmcs,ca S ^*tq1N8v±p,LMͱp,LO9vʱ0xlmhƝ9vʱS׿Zc\̱0uPqg8Ɲ9vƱ3q,ca S _9wX6`ܙca*bqgs,ca SН7`\̱0cܙca X‚C 9Fr,8Ypȱch!҂CP9jXlVR 2ڜ_q5Eܛek!XKk?`-G,[c-u@\fX k?`-xrZXU7_c*,]cm] (nXk' `mdNP~@X;kK ` ㋱vS@X[BY2ks 8c@rޛekE&A%Xk 8gk 8gk 8g݂] JJ?CX;X{qޛ寱 ־A7Y!k d}o B־A7Y!k cx7<ѵo B־A7Y!+< d}o B־A7Y!/LoX!k d}o B־A7Y!k d}o B־A Y!k d}o B־A7Y!k tߠ^|{yJyI,KUɡ!2iPZ蕻6t@S2RJע1j, [(tKut5nMkWS!>6|;tN̼Sufo35MOl݈٢Oh&[d!yJ]4-.%K b5u^L>s?6JuYʱ5LNvhMf }9HLT@OMW B2x#銉0Tee)FTXf6j n܀53Ŀ~^Ӎ9 AnA>8:SE+u'))T)8}9Ge:HAôiO+M-3_Cp`N7o@7cyɧ|hKrjZ)bt=}]ªn$ Sk*jfgEsk"Uh:̿v`+7z6l|zw5ׇ:0jr(qi)BltЗ>ԁ;ۢtjQ(݇\FfI,zWC0w 0:%0݇:-_g3o:'.^)h$gP^u1ɥE-b qX'Z47o>%>@Rmoc:$tWr)w0S+ӭ )\5%dNH&GHR!ޒ@)M]S>Ţ>*4=АF-7@%tH |Ww"-֩-"VarBDH%רI~H;QWV '!;C~TZOasBHH4B7 F$ъ HKm'-wh}D]t3ӛ.?yG244Ŭ~q2,$QS-l>w8ً>csz*=XWMlcAcz^<6ʮY<6Ϯ2c^lvUu@\UGZJːqB/LTv#+xN-nZMkUMF`-=N`-m`2FjXBeU.s*QP=jçك.FAUrN9Nti.UT-];854ϊ9O@Tm踁j/4ɦ+:-ӈ#:>3D~NKIւhu d[--$n(N88w|+.ا,)<@jwb薚ѻ>fs+hF.Z0h}Z)hSmO5Y/ hoЬ*ޟ @C}ML@CA4ݑ9xgMqԪ)kWj#E];(aW{z5,b?{azsxXy+mKʃ.Jb&zYfy ,i`jb@7:w#Kte֨=B/B"#"}aȭqr%Z#e0N@Ua\)'\؉\#x@.rv[hWH{"㹮#%0Vl4A(J#)cac kb,ʡ>w,/ڕ,2 u*DSKEi4MOjZS]ʴTL׀H1\n(b-f@ŋ!NẼVBOZ'CNXBe)\g(fh1kB M޻j C[ځMSrسŌ<y,-v`AhtPaiS{ت b]OҩS!RDb,H,ZJ Z-,o:d$Y5P5},F\JlDÈ?@j]M zAxZkT:?-uIFQ'Q>FcV4sPVj=d9}EGq%XI"d1UO0zEdUyaKƍҞ,4ڜP3O-vtyw.sA91W#xioѹd1O0dbU%@ FbҵR e:6몼|FhbECd1Od2y'sVޫjЖyV7OȴܓLX(9rǬ(s3(J@.kBoP\׈ź,R &p$0LL.&zŶl+kBR0AL 2YHjN >€[9 j! ؗEJ1#1uqcn][@[j)봘}Ckbbl$rw114Mj܇*}tB5@"ov3-&[HOŘ &HOļ<Ȯ{WHFp^he8sy&wD9o|S1׈hh8h9%䋉h1Ax5Zp ib7̗8aTV4Z̳^ IZW[4Si9h1IԭD؈T)٨)m}Ny?-^iMӺeOWlO1OӢ!Ak׸} LYpOk(,rRȎhD߈'d ,kB4KTb-xmū( c c5nV9VC@~0.<+IXj)¢O[2ÊxA/+CuAMfܘ0Vox˜' bL' vJpXy˜9{bd:52K""w.h9Hk޹P޹X\x˜'yXCY[ '-@x˜'y˜'*}u7Ȃ|gQRw͈FC2)>QL#lM4+x>ũ'[x(T"8N\x  Agbr0N@h7 :;5C$X 8kbu!u0bLpkY6bL00~H%i}DUH\؀DZP&hSm̅ Qĭ\>"9HkV{2c1f5131 " Cn'ԣ5B}>ŶC<TH:wũud(b(H!gW<"b$rP>3bR' tAKoSC?%H` J4IY!F]lv$DΙE r \>u?rbr@D@>ˑr!QOA'ZjXČ r C -fP/d[_ʪbmKbG@"\ N?.vx5r(J\;pE5i ka~i0P,| rE%'?z"}&fh ZF,:+h 5rF6F;HŢHt fP/a0בӷbŶm{$fhЏ > a+9k- Z̡89h9PTh9 T2Y:m~tt +bCiA"fHTzҧb!Pņ_ؑ-D?:u\1i1*-]8]bb\)өiW{w4n=p^E.X,[tb^D$a.G pP]BG\jXN^g"g8ha-˳[W,iʂ;h?j@H-yJQHk2AJ&4~C0M}ֺ9iY[iԭL_t0 >ml*-U"(ҳž-b6QCRyX6g<iGҞ ̳Q 5F:)LL&"~N;RYĺbkŎX0#blag' vW' @a[ 8 gH1u.*^u Wl;gN۸%k.]:XcЕp.őB?0AeF%:S݃?r6%TARV.XLAncqbH9)izȑ0ЏHoA#-DLbOZx[ .[LξZ؜􉘂@GZlҀi İ,&e+}!e!X,<Е{Yro Urbr…DTlV ]iŜrM Ez+}$&[PņA 3? bLeɭAX›bE"-Г ޶\:$'bi`т P4E;G3?b#UMZֶG]<;h綼۱-b>WQU]]zTrN nt3O^'tY=ilh D}C:-}%MhS)V= Yjw)/e.*ңǓQ鷂WkawX1۷DcŖlʳPf>فI~vX1X1+8'B cŮp:D|R`HVB,p5kܬu`%A1A=Ԃk{:=19Cյ*͹X]u#$"51h-WAU,&ur ꤹu~ջ(#bDaqKs9D8F@Xt :UH2HHHECBY] 0m-&51rnO[cWh11قŎ Z#UmY3wtv:C h1;d1ہ͏ A##!B1#Ƅ ΃5SZBM&F*}(fjH4&[DkrSb :RkGNB?XBva`19g.;m s1 uaŤ XL8х9n؏jbF+Th znH/ӧi"6ŊIR?/Xj0eILIϽ>x8Sԋ>޷&!_ViH=ؓzz,S9kSz,%Tk\$-&bfeL\]^zw?^)'oF<,X=aXE`eу׽޵z?E. 16W;@{<O]oTܭ[?2쑁`TG`/Ʒ޻w7x) ˜ᄐSI2M*y,Ls&ieKdy$u־~ݒve\W=]g[iZڧ֯;^g4סˬbv^z3;,}j4hAU4,tϊ6?YI/x:%X,m_z]_sSߡ i8_/4Z2=2~tʜ C#gEHJ.]<-ʻ0v^(ԭB-pBB,"XPg>G2e9BelПG,-Ly\(ܦ IA,-;$ka(;|G#tuU-HJ>+7 n,7PRP!d:ӧk].VҒZYB AA>H(ukw2 )K\Kk.p~V86vb zh>}^mpq ,+Iɸ=WCvwC]4r25yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0081-Post Horn.xiz000066400000000000000000000073011506652756400240070ustar00rootroot00000000000000]s~_ݡ5;T-}@$$!!}$ᾏNӧ8voonǟghippD$û۳O_Ɲ=''oaoOtw/qR|wߔc]FOfîya6 ;<|äsf]E'דqpur}i|;/pIy;x)d6l%awMj6-΃8YAdr5eϙ}4 !F\m59s iSOze=U7ן?/nKd݂,.{_62G/:i᥹H*P@'os5J" z?j$iKhM8WyCpK.DM0TŠG'>~t&X[ڻD@YZI?Lozd1qJ&.JG77XtOm:sR,r&$X4'QtWNfF(lԮ5)XqJ6*8Y_7;x>]NifQPYD2\2SͲܷz['E[;Jqm4 -PY@5,!/&-b2-V |1U / ֺXJ`,?oI̬j%PؿpPή<8[QJ];th, --~n~75~'6xY;e~way0mÚjhCyX 7 _|_a3*6vc?nʶ;̆=qdta? e3C`4<8XRl v.ڹƂSu/o`}}ކВ˻;)wWv2xUbX<۟6\?Ż<5st_nQukFM啇@u]Ckֻ<.dKKmeK.m9.K4(dahC5h1Q\VR0|i˙y^7^ӻfYԉDf$fl i2ٰ>b) WTKItnؖQ&a2gPP[Oj U6ؠ-Y }5hK8iG 7m?x5tӪ9W5Ж>sc@l*ײa%:d<.`gUH02f1W; P  0I@ [W-}24Y?l.)'!݉2[' ken8a%9@R#[v!ŵZqԽE#k@zpF7C!-5{fXvj~0吳atd0*>d"N6`@bnn3}$>b*9;0e;@VLuyꂃ^ϴCtPuS5cRj1v{\4P3֨?Xcɽc2K( ]6uj C5qA\6pƩ!ԘĎs\#5vN@@~N}BG(#``% S!q481 fi81@'FkFc|T!#s\p#!-J!rb0:2B%F0+vi0ļBt\b-B 0qj-d gHIO+w|O>[Fcr852h|X4e|l4Hì;:˹³l,FYuڝ8c{l*1Q4u@yJ3mfc 79`d5PCN chtI2<)z!_7jԲdG"Jh'QJ=o]DimF4v6% 9P7I#<"0hCI'Y7Jܛ7@#7JQ; p`5Xy0% M5pe/ & t;Eiϣ(S0U@u hCzC rf}ۂ@{Y7,<=-Mq0D"DO rE4>B 9qoEtdM6-wԊz{yo8c|h3XEqԤW 7( ֽWlWbK/{ppS-Qč9>$1}I[2 lltSLWڶkeFOTXDG/ 飧Բ(@rXyGzeΗ34Qۂ2 ݈2 .2 r e"e8ZP&>$pL=MEtb}|?@ hGzG=O*:9zU ~66:0އ]`TN77J$HX[PI( 5}5jQ^CQ |` jtj(zd@u>J!1M##`"lhӍF~RS?N[5 Ht6#}5':]uGޚ/dNW5Ġ{mR-??؎׵}bxB 7_Q P?Q]nS+;O!^U1xUV6+l5@vC+->JTgy$u$lyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0084-Cathedral Pipe Organ.xiz000066400000000000000000000077251506652756400260040ustar00rootroot00000000000000]YsF~!Y;HTD): e+~{Hinm/9Z68 CS|n6p̓Cwϗp4n~(#?4f$NJm'x%3q5K f|)JU>o4Zҟq'i[f#oTX<ٍxҤNW7Ք~[{EFYO&4coalƷ?zdOv]qt;vG7v7v6Ǖ]G)gbJ? Rk?v0Ii Y/Lc:'h'|(&uҷj2OhlcY7?z?e:X o)vk~=X.ooN#K/c,Z=O偦/k<= ʄBw-(GhXErlf8JpU4oX;_6f[amH? a8&ڤf9"?b,4Nn)Ы:7±[_eKþMמkw$sOӻ5QN8=Ie|UP+ lp9OEݶE#;9lxuEݬI͜ǟG7Wɩ{}su>W%[&< LrDkC wYz1L4Gq[ZEuuC 0V4tC[UNY"00gNJ=RMUab\e@䢂'/^Ea0sW>HYl™Tmx-fUQ{7õ轤bMOf$Ig<=H;gwB]dP.7XDD3=nI#Rjg~R$=$e*lY -8k/w@ɈZڛIRf1 9tmImxѴk>+VߥXVَ6vA$ͅ[$+MmO=P6E3 u ]hafKA2?o.]SrAh12ֱR=a.+q*Z^MGL竚j=VC$G_Yf2#Fm>d+;R'wFHz~zzu8JD5ұD"f"dzW3֔0B[JpN?*IlְW 36nN0osN;J۷Zn!9E56Zd;-og6O g7tQ$"Uf;f/#cFƁ}@X cA喓}a=$@Xm0 'cG"˝ @XbU8F:>;2a9\uVXCB=+$2>2$ĸ;b:b]ΚѬ0;b';b<1?m$89Fajehmrį 1@+C Fu9 FcFGFj=*08fa!mfI;*745;1'{a}II,1@f0 a }nq$lay9%_:m6BN}QL 섳HKrc]@o|D;hsZv@&ڜ%PrEQyNBQ](c%jP&8 dl:)P ljVc16@@M`㴦h#Yf<1 FA2R\E ?s$8"mlGb6B[p(/bCIV!e$pljHH)bYb'-PF6&"Pˢ 9K8l%P :9-(@7ã.٣X,#EX<̺Q"5Js@֕ą=g5J@9Hk<5(!knqTJ@GI^*ʞ\(1p P$-(5FYnjEe8YJqxS Pr̮XJM\тPP`jCYf<5ҡ<5{t({p5([gqle"Hn6LeO > z,P`jO >yjb9%%x %(-%9Hˏ}-RdqF&;&Bc2CV {@ B=4 <Fi_O?Q&Mi9?`Y9w(yy;(l?`ġtNHwPu?`M6XARX*:(y@n*GBrAֱqPꀽ͋[7R,1Ңft9`9(sڹW9e>Κ3ywP|{pe_o{PrFV4+OQڀ'Fft%>J8e?A9 3U/W3D3܅r$E2 XA9 FWucK OT/|/˜\N"fً O/eB(%7r4~t1T{"IWYn@+&++|2V,{ɾPR?f[m׸|>$'wgJlђ֖E^H/ޗo[ ъjuf U &Ke8y,H_\7d֮nHl\~_QJe* TV7QymU]6k f.+A]18_.,ͽmQDe'Z oپD' P-_~]y S{U <<'''ޠqv8| !W^ 8׮Tߌ7W$!pvnWpU>l\J]ܮ/f?[GC:ko?Q]K.qyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0085-Theatre Organ.xiz000066400000000000000000000106341506652756400246250ustar00rootroot00000000000000]vF`g8FGJcZRK*,\U]]U_׫Ɠ~|hZߵ / ?xм^7\LΧn?^bq]~&.o3>4f_ND&wnиqOah? ƹ''*{,~z0rr{=&cƍY>4K<:[~}fRm%й]y>ʵO -+F)'xxqm^녲/109rͅ>Nt]@ o Ǡwtb-Sϙ(獷ԥ醴489_&&טDn}+f*Z5)\,#O7W_v#+7w&yf7? ,W63iK5Ut|#6 pQvR}F68^mjUJ$7 8/>4lUwm47zmbD Ӫ^pP?jZg ƹ4Sb#P5F뛫h&L MXn^Dn`l-us"y,z~Fd%bPU8RëP``<6-̓<DqS&hbXd/u@|J lXQa4N<7.UtЮ:쥪gQl.Ŀ(lw8ͽ ~']cdn .J)OG0Ov& r ]M{v  sϝK( ۤ b[Agdr^ -շΔ:( eXUz#}u+: Ug<乧u͓z(yR:i\[nn]a2f{ShmpNUy frtѪ4U!Gڑ`֧t!"{#ĦKb cL#S!{bTe$r< Gʔ0\.cjTAt uɅVĝ+;%/k1Bf}}$|kfvx7(%:w2Yʒo?a-rɉ ݉7Xͦ9\P9?$)*S=!d!DUbQy@5eQDKs}@F~BhREU_9qxf&f0挡t6+Y38AeԳk|iVE7;]I.FYD:cR^B*YHTL -$wh`P_kSOa:Y`7>rzՙK˔xeJl'ω])'.HVCIYIMo ]NJ[` SWqfg2O* ۄ=lť.e(YQ$>h +*m9%me am9;`kxV⟃xtΐGSq;)ޚx;UGn͢ō8 |戒U5}\lƨZd.ی,k? 08e )TWCω!Vv{TvqoN~սե` 2+*4J V-*nD<\-*;7{~rX{ު >ogf_ 5/W3C#bIeEƃ;}.F<|ԁˠƒ/,2aM7 lDM|C|mE!f ."RKh8u$ ؁jOo#ЫQջa}8)6Mhr3t`X|fmn@'ecPHz@٘PF K &1s7̊ʅKiCU|;7X<]a<1ҶkYoW5$B@ rja$7Щ{G+%4r SY9bWT |&mI $wM."x-|tWjzpxdR9}LƲrc2VW4т Uz3uVlRo6vZsnOaPR)M5!ȋdo Yg$And5V[C[J7x* # K)Aۈy^dlDhfDyڨ$1Ιͅyw9c'4m@3asZ08f6.LvѰ3t0 #1 vU0z 㞏y YE3!$n3~@bd>, u:dO ;vaSv0zΈ̈qwbFgXQuR"1Fg0J=!0'`(S3aV`k]FtjS()C\1)1k(%PlQ'Qn f l`Q2=ј?4zX8IJ8M6aVsh͌hEi|?o3j"F0'SD`TĜ ' CA0c%%g FJj{6HJ>1 LBog9A haCto^m긁rBk̇gذ3,aA* ?cٖP;jcfrolZ4=;+a9,6iQ `6k1o<maF3Ӳ0]#tspukN^R2RaeaFZ,/ZXK&,O:c~yc>=oI6^fFð?H7k47G%iM2d.R$(oaR [s'47܇dguVChm ]be@ڦb(@?0@F2 J  p CxEo`܈F` 9k5V KzP)wA997FcNsc9o 9!519܈!9\ R Nyc@eBdHaб 3lZY,b͍!5:ZR[0̠F߇ԠYjPo͍dbC  9IO<1(vnL|THNౚ!RECTocB\Bm18!  ΆrR癍Av07 Frn8t߈q;K= 7dmcX>l @w`|eNF?9 *zX͍{57VF ]ZPL(@:MgM~&=')Co5~W-Ad~#y@K #LH߈]x81A-ݘosn&w=c`5/ӱ "߂HI;mr?>I+^܏ÜXyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0087-Sub Choir.xiz000066400000000000000000000030031506652756400237520ustar00rootroot00000000000000Y]W8}WxΆ|s6I. QkKYˡdcɒ-9@Kz gF;WaS{$s򈲇sn/~ޏ5Ed5 ÷2/<=z|3*[C,B݆~y#{.4Jç eDd%ܱm;`ؿ!)q{ ']]5h%Hx^}ppJzLn}M4{74O ~B ( Nm 4C4#@K"D Z[Z"9 =][Q? 6K,y qEE9 Jǥp2éL7s<׻\pulş4߼Dj@X4ጆ(&0ӧ""z2{%e< ZLIަWq&/dS-#ʊFX @v7,P.׷W֏<.bੴ5gw̟@=_7 ^3o- ($H\r դTQaoWFk=k@:Np'"[vE=8]3C4q9J gb?^Ȧ44͔=8ԓ:&-҄ d0&52UjQ@\Cg:cnpRGá'lE(ΓHy9[w:I,S~\wy9wৼ:%&s%37ӶR)ëbu3;w>-Hm|eW):PpP"Q?@Rg㮹  uXrL(̷%;*2O!*N!9UJ;`a $t_BT{&D5A8/{*-+U9/;OG]>y˔q:ii %{ )KUPH`2TFeac>݌Ȯ *7Ĥ|$#*r]!du&D.љ8+%J`M8PZK%A :a$  XK{0dchmx߁>E-Zjj+YFHiJdTFRR]"#oPԩe[n8]-hZvLnzPV T]jP -sE*+v8ZMN+Z;]h^HY5op_O&*-dYfeUՂs \4I-g5-z_Vi vV$u΂l#UT/t/,"߈haUmВ|s:HeZ]>,۔k1 od< EUV;o̓u1 xf}ݓ$w*v~@l"XZ浆O 44xjLPUΫ@M]?3 {PhY_H_g gT(k u] XeCm*ޤĨ n "aurH;c ֺ%C˿+Nnjo"ISc}y70/4m \[BJuQ"bV Lvʯ((5j9(e5u.,aߺipwrSwt?{Ο[ z44w,u]|=ѕ:[C쌂 o"L1^(NP'-?g=u8V߻hMY4V8EsbܺnoiDkNBkXuZExKUzgUucgqg32->&%Q!X,wU ~2e$hERQP^5堄bAK`1 C&ðEA[02CNgǁ?t7Y&ϵ{{DCgiumd;8XH;,ubI=`Iji*vEۜ+myk?SP-łqlC@Eը:3Da^fAV7e)X_ ^:מuD7-Cd%^E8!ʘVoFTeCHzn@ӧsSSx`=8MgTA03d0szWr[T2L$/~K>ٮ_j;5dٶ\5۞F/C~qںyb;C5ۉk`@{HԆ8Tn+rӐ%лÄ(̖ zF{#h[IYސQEP\8U_7i HQ2} L.PQ;,%YnV7C`i@BH&4 qD L;pEk=),. }A=)؟V/ &V5jeMAϕG/~@_{(QA5Xt7$~x ǘbI_H5Uhh{FSNPMc5UJ0K}`9(  H/b~4DtqjFULA$UL-GBY^r?Αê\J؋զem5':WFk4b<#>1-7ZG0-Ǎ#L_/{FilL{y`xGG SP$7-VYȳXT/ʷJ7z(0qaFPjb)zzW1Ҳޅ|jI]\$QYlˏ<$ YI7>,"`˃ bW_}ev0t Er:("V[Vyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0094-Yet Another Flute.xiy000066400000000000000000001107571506652756400253720ustar00rootroot00000000000000 Yet Another Flute Will J Godfrey GPL V2 or later Disable Subsynth to remove wind noise. Yet Another Flute yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0094-Yet Another Flute.xiz000066400000000000000000001064241506652756400253670ustar00rootroot00000000000000 Yet Another Flute Will J Godfrey GPL V2 or later Disable Subsynth to remove wind noise. Yet Another Flute yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0096-Cello.xiz000066400000000000000000000073061506652756400232440ustar00rootroot00000000000000][wH~ϯ`y٧ wI2b{ LEGak$FN<~uUFdLHuK}=ZoYf9swa;g޼^. 30?%ޮ?]}Y]#62ybsv=Gtj7vU6!tϱvn`AwD=0dt}{5'w9z_^\ON`l}k#6W[~HP;.I|3X' yXSݸ~;Ǹ6k{aSuw فa76g؎x۵j)O>42Қ }.),?H"gc@-\,E~t9ۈx1^d:|Ofv` °ˠ6Zm]#4]$m٫Uw7\־4kW[ek~GdFo?z _=pΖ86nKsY+˹ZP'Ka:f93ɀ9w83h3d|%3M~UgHw+(/xװ NNYO@5{i-gapb&c62g :Ș~>! Yi*jxus9}T 4F g: w J‹}cK]ƛhܹ<H]a k.h7[g``Yν0 V`̅"u9ܕIg`zkױFpƽn7JO7:>a,r`9 6Sa0ٴD49(Kכ[ óV(MJDXp}AMb1 ~AZy`g{_H*JkfݭخKoSlHzqݳT1TqˑNϱT R.}D1_^kv\AH1Zq6v \Znv)gj%n:Ԣ?hA<-skH<@8z|i>]X+svi Pd>wPk rY#!_$gOοfl黹kze(ѶF.=;3>|ϮLy4TJӐU||-"ZG*Ck"G/.)%tBɟiZl9L)H(}c%v` RRͷnI("yeWD؞OϧEMHYϏ/.u2Fφ}J g{Sjh 팒 RJ8\jSZH0c1Ϝ%z% `rpKC{n1|>ۨԥ6"0s[ߚ=R[X> ܚʨ꾤m+cv)}k"d%&;E{ERod89'\Hi.!r=>y3klۇo-2dD;7*g#E?w% R\ԙ68!k1BG'F<,XbәXf 4[6p4u.YȆpQ;!f qp3wO'}@o||)wm8./oZ .vBC[pܑe`Ǻ˵GQrik!`J 'G#2%0U h)ye 4Lj^ڳ&J [YTwx,7cf(`)Q2BY>@9k;Nmw~!Yaɍ|c.M`$ZJ09 3h+O{j"hcRix{u=lCl1]ܕ+ 40CL3_|J2d3g7nlE[!J"䶼ht hGT67+)'; *"X+{zPs "lx YY ҡT X0P.g8^.\u%$n[(5,r(2n̩JH;-frNnGq{2s2,,d9,?Y\zrMWt1n%+T ,9{,L糜slHK3b:E*n:kMarmgՌj킕D ALPgz.DMImovL.p&(6rT䐟 3gVcO $F .3/*E["/Ge U"1%0DZԚ=Y9FZTr23-p A)>A1oU>o!2䃽܋^AKWa7O}M H IDWzmn, R|g!dޫF6I|m}~>^v=EomTӱ!6i.A|ڣ|R`7!ONG|R5|RW+}哺ޯMStE+*+}=d_uq/DeD^=}*{RURjb {AB5OO,]2^Pس5ʨ}*%>bY%VAK UR^WUwxOե ^Sv`*^]:Cl[\:q?<:C<ߨB'\~|_҉,Z,LYҡ^fa2Nbg[ W.vh-eH"Klɗh1!pBQenY0gE2zDBG\ln#X>2zke٣#XiC8I< ᔭ- >9z.~;{yuf/01RQ2!JąyR:fu( B211U>q0&Qv8d D9 #hI0֛5o̿[6'$%4MF|z>e; ۛU l QBYq4 aVQb.2rweHI._'_8E;( YJZC^9/O7-֝ѯn'k[OVSS+0O|u:'{:S4u:}:s`f-oHo"q:^|9ȋ#g#p`zEک}ϦWpjN?~fN_ ϘjڷޡDZ>_;lLfV?4;}$r0Nm9m6@2XqINrM_#ei&}h7hm#T 4J-U1xݲ*s2} {dS͇n}6V˘Fs|cgϝޯFb:P]V:dRBwrf;.׽Hh@T]30 l b:5cqaamhV4LE&hA>0$%a:`@Ê.mh؀iа3{@j  5 Ȇ16`,SUO {WLL=} chJ9lh0ga*-n6%٪G6}aThI[}R`~LōȌ1=]#6@Ɏl1]33c@^'wl=JvtLΚYɺfLz19w Wah+FG%zg:hd{!0q$g_0Bp6S#`|4L ^b-ͦ}6GhFF h$altk3rwO>f6)|-C"*FOdĘrKl*T ' cb*adhȈy}1dݹ[@d&H(Obn[´룘 > Z𺑻Ϧ룰Fq >@юyQi\^J[t֍BMIhy(ʯd 9LF&!uw tM݃F~,P(ӓꚱ>P6z6PiȠErEƥʥʥ72l(/b6{(OmSOC jPH[&%EirCѡ9JQ`i;-9BQF=ɫ72@e`6VF= Cy~bd4RD {(@xr*w;{ԹGzP.`D C(@/)x(@=E`FtFm6P3^&L^UCdШQDER4로 .M෵PZf'=.{[t%lRjn8B*+HʡX-(C(C@ozrF":MIl:](O -!G*,TW#7:xQKo@E o>% $.;h,7HVG;wYu;M2}kEac%!Sl(a 7r0'P% dsgu{TSEZ. *ݷL;{i>ᖌ(4|DYZ:(_ bu#ƥ3kʩ4|u}/^4|3Ɍ|=0_@wA/أ6 .\[un]! '-pME2Q|1ģ"D" @QޝO&|4nLPUI.ىN e 7飼AbO C^/X^YFBB 4F#!vg|Vq *%y!Ȁ4tBr ؟6ܡ  wBVOd SCWL FFW{Y~J-?CR9'0Y%G,:۟tak`i , t ͮQvͲ%Sι$dj+d9[\\"ҭ''v_J_tfIfI¯da=6Q,D.:\[- :;e) ->Ikf6Jc.0`> 2T:b|^a}߅Pif>g)<-QrXCj %g!x yC~׈*Xư5]ԯ'./ƵKnsx2?u'k~P3qOvs3%z|U~MnaFtu*{`js Q@WAjh%o@vFmibmWP!_E rˆԺU}܊5_:eu: Et.5 7,\| pD|XW9kDb@B]F=dޘkv>o\5^prmg ~DGG'm|o\H#:;_3< W"y 3*otIrیё$ mr&egmBy`.* ?=3m;]yU[Mnՙm˸9!:wktn[,|u [vW]zzDqZ+/Wn>|E2}іis_[omE?j]1o+6;kH~=/E{gc "Q fM!!`WQX0CBĨ^Ff1@Htш߁"v&@,Bdĕ~ZtJŞjR  aHEӫ M[059=BhP(R"Fd{ v0""H#zgfDs;QMAs.Q&E:' d6ӄsLI3B8}ppB~!9j֜yF4PLHNìUg2GkF6*1G:/ %Cr*ܧ+FP NBlD0' ]Ub("zj E1$Vb8i1@4 9ψ6!BJh(M戢u&G'n)D9\9 xBJZ~@@l4(@2nHU7mb "dÈ z0j` bWID F 4uF4(=w7A3Bu[b7@4ۧS=e DLr"F l=#oݤl S u#pmȁ3!+zƬw;f}X`zTn$ r!L4 WgH3TS= n):MP!e=e$`HYO hCn e=]ߐ7JHh`@ 8=PnG% W(cb_(N% 8e *Aiʏ!z~czJ cZ>VFy6F{(F{(F}Mrh L2Soϗ;YF.\zx+b-g^7b_A^A5琱o:w |XO;wx|;FfY` zF7DVOX) e W4iࣤ 4ؒ&TQڀK|7%k%R/[D 4zGl\cz߇w*蘣w4 0;H(qBH:n0kP˛a-2Uʠ^ 4@6My]\hqPKMov|K2Mto Oo?5ڜ ,Qq: 4%,t 3H>QŪ,\òUb5rζsAorΩп!F 5vӀFIh^b7݇(N*ihAҨXHp% $ g,蟍Y*>4ݗG oV`]5o*_Aqh|1~0=P#^484(6)[ɿEo(*\s ɿU(̓ y47IeAo(m}u@MBz5FiIumM- [kN=_hU@/4NmK/i x 8 AGB#-x@uL:4( as^y : =/<:I;Y-FgᠸhY"l糈\ϳ2m'cx/@Q +R ?JZV|3lzpɿnLr5[tZ=1g?J}zȚ?bOEMާעXkQZ.ZT}Ze^@T>]?F|ozq _/" DaM,n؞tGe!w: A28T~" TWGiC1IZ w%Jw1vɵ$4TKI1]rKJ\ V"uUJu5Ts@[/-r`&ꋒ`*jxZpK::OF۩{NWtGP Q;9\+ji 2~-~LNތ<| O(&yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0100-Pad Chimes.xiz000066400000000000000000000037401506652756400240630ustar00rootroot00000000000000Zms8_{KBBft(w P }[EBClIl]ig/Iz쳻߾{=kCȥuQH`S kioqҷ]Ǚ%ߧ1+^ԝ3 kJv"/IbG85cqq`MpNir}4zp$feBMJ: |8k`\׺6W(c/Yu]xpIפyKTu]5}wG{ߟF?#u\bX΍l^FJ_1#&!r(e6E,Ėqnz(r4N8A?3cI 뺫|pyb]`H.ʥhz:ːlO>LO-c<nơC6.@‘kK>FO(3lKEN8.gl!۾XǐSG$7!%dK20J3A4-aI “-O CTȩ'9elpls׉" 4[E'ܳw㒒,!3.㾲5%BILՠ TV[R7 c< pA2 lVbY\& `e,xGnk]P&sϓ:cXՃ Tj{9zU^UoxCPk(!' )iLHUmK-Ȓ7(ZC_Ɗ/v>'Qڢt5CtE1Ԕ7lu/ -R4DFK7fduLuR\C^)'\dY%XuMtHV+!qf44)Q+Hb4`\PG&: ;6,$ìiaG^h_ *XB0t\(A%tx>\E{NY/=8kw+e\X CF2}RsmxDÊ"1)t}5_FKuw4P`xj_1#v)k5JƓf~Ayu~E,=B/N3O 2~^~~T &Omf%o5rP{)^&f`Luvugͺ:xS}q<ջ/> x, !㩾:jԏyĄl1#GL+d`TޜK^s+-}} RfcϧGlwl?;|@V޽Q lbK(yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0106-Harpsichord.xiz000066400000000000000000000072001506652756400244350ustar00rootroot00000000000000]r}W0|ɓHQT-EvU%$o⼠ &e+_ s.f*Ӗ>Ӎ}E!L(w^ϓ 9y;ͻ?_|o?oퟪ.?}7Dq˸m>DG}mpml.q_/2ÛӋsO$Yb_gq~ﭳ0Z~} ~o z^ϼëÏvr[FAOt/r&ۑ_܋py082s-{̤݅seq2h"/Ҽ\^mh^o9էP?oO)D~UDw hwi˳=mSjh]:O3H;C_.*tLȽ.8{K (wx^XטV Y0autC:&Dcx^?QR#&{kzlhEK^%Z7!{%VQ}Sf{‰Ie#Mk#kZ)6 T 4:7e([OU^?cd*MB8? }xENLfBxf]Svzc.Ji_呠꧸-mU񢆆lN~xEo)i a)V4jlr=~'`CCൄ *cr58?Xu['zYI3i95Z֤4v\p߷ 5){g*aElZR}a{g lĖaL!]0 O lLg3.p9KEi|ϘE2 X=a!c˖˚u}0vT#0#ata Fa*00zaT1aL`c=fƈ OYImP J¨Js#+ɌaTaL`9ViS$=0!mBfe3iKΞL˳>q=atf0a"m0! yƖ-n]ڌ& B# rYI*m0 *1/mfk}0)@"]` .IFư-b0ޙ5VRavx2=%0ٓ l+))` $xO2[US0WHgd%SvBgg Oic_~vQi#1 e^dS˖ 3|M@";U{p,%,GD/wL!a&std d, Ԫ,,9S\P|_.7ᗘ` ђ#nڣ."X{¾h݁~o9oo*i@crpFL.5, VHr(/nBt(Ocu K)B:)&?=E9B}/:0OeԘ\h ZP` FLP9 R* X?@qP"pDɉT@W](P>@"lndH*"x]_f55e$Jd4ᠼ2AwQj_&(F=|ZP^(IW2'`nHZrRxM!*"DY ďes<d}6e TA&ǎ+ 2.7/V& ~(g 914^6;WP&99Qj(JЏ8\<й(y ,5&%.J@0JHH = QLt>ظ(}@({E<2G ^`.JHp %0;6iS.|O1uy5.oқ9x6VM GBffׇ/foNo>keE]0e+)^t^ܥfSl۸y_bѧ7TDkj5>V~UJ2Euy?zRb*SV\*{R+(̶Op0UAyS\j3umfod5;}vvqQTA*!H#Y E m2)GM5ƛF"+uwTR*Hyxij""C)'l*on *z5tY.,C>߯::Ϲb"M_U4>k*E) Jw{ݥ>w )PSIqe^]^Nim1$>܂GET|͓8’LG,E[A+?hOf}} i#iAF NuhNei_1RgշfC?^ʑ]bꢗEv|!T)FHlEDziU,y͏Ob.r-hcҖ#RQJڸ+tX 95q.%T$)`\6t@dda/J=Α<_b,KêY ݏsw?؛.i3ǁc)xuM_uUHIiRtRIWm7%lPuڿ{UjCW ]v0t1URvCW ]v0tu&xcP,.ֽC3лXd;;9u=[sqmT.,.Ue|G-[PF⤌Zvtk}? KW];k}Z횰W;J.}.Ji%c@[o<$ߏh;J]8*0&6 Ǖu mj~LCMtϬrUpkj/oK0fyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0107-Cathedral Harp.xiz000066400000000000000000000037541506652756400247440ustar00rootroot00000000000000Zs8~_9Ӥr@Hz/a؜-hVX$K8!3ws}jcvWv~N} (x6a^f0k{~u}{ؾ뎻<܈ŧ)U+%SlPJ#􍬋UثY.)bbbk42Q5pHG2Wq Y(^\Q,$N$\0)[#8],# p$zdjggr*;;5""1_2U UONqD}(IS˅z8nsvp5 Ky GZĔjD\&] Ө26WD4N|xJ҈@jp8dj@2kcshHݒC53]$ߞ ě s;ah1S#dbR6G ȥ{gtQe뒮꒮~+֦:T1KfKTLi1 'J1ב Иd=#+Di nPفQP=ok[,wʡ"N*hJT,\ORSecO#̈́EY?w( )s-{bv^̫ [3uVN[;̋sqҸ1Lë2l_9t݋_QsSj Z%yXDNE|ZY'W$E4R/`&Mi.c͊*JNV8Cd?aҘG;st{O^~2稷v|,Ut-,3] gL`=ӵYt-3] L|=uҩ3 bt||^1!WHSCNCݛng{㡜-fBڜFkR33c~6S (z>kgnOħWX.lz9ZNķzg[OTV3&'FlA5:liDp`a\NWWY v9Yy$uawJ\jԝ ~g~bFhܙ6kP#em",6S_ESQ?Iv`e-yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0108-Angel Harp.xiz000066400000000000000000000322241506652756400240760ustar00rootroot00000000000000]Mw㶒WxO,Jy{♶clxhvE&r("@j;ұH. [|<"w;q:ɦIߏwoWnxtz{?O"1WS_tz%<û,cǓsZ|xJG%5vw=ܜOO.nϮo֭U =F4 ObRpnI~"~\8tQ8-,-R}]h4c7(ϏtGzޞd7Sm&75t>ij|e9w5vs?}??2YTĹIXbN3(ݯYb.^;YZ,fEAhYy7+GRHau^ylڼK:QɊ(S Z<۳dit7D\7ȣqYhD$ 7ьHP`xEN"ԢIMⷑHQ7]WW0o?)o^<>nj)CEiY6IƿΗsH gd+i+&M[3~Ѱ=Q$̣t=b>r.f.9pL`XS8ϒRET&|f\Χ_=DlQh|O<Ѣq1A-R79 ͎۩8'!8S7-6V¨ įƲzyi7Glpy&&9ئh{ZhU&y  $p8Tԣ4iG^Ϣ@0BiSPPq>Kv@xŒ Dx!tId,.C2_wli\,7,qzRWGw_3K|sUD*Yd@Y5EL~!` 0ʪ{[U֍mvPV4V?ve7("YX ?m2TW}JY6 {I[YSD±Xȣ{M ΌP3ޔh*\=(GgK< 'd''t&W4c"f"z~Cc6zcQ^@Qg<0eۀ`Imܔ=R*W,RyJtkfl)K+3Wc=*1WN4:WS| z=`& ]竡`l9}fyo4Wwg-Ng^aчl 1Z92qv|XF01 Cn[Ѯ&BMЪh5¨*́8VCJUnBNGzf4)\"At0`cl;ibӠW&CG Wet4I4Pz A0J HFi6A(}1v+NGv<`mJNT A41کl20M!-tv),4*4CSzt^)QWfM=}60X!Hl">xC5c f460z̦:beg3ڱrMdbxHņlkE` !R~lF u&_hÏW.IT /:<۩Al\i2Ql Yikk;-UکN 5v*?uZgګ_:uUD5^J\8,kN\Pc9oa(]E'*-S3!RPz׳\A{}vsuyB[)r T0Ah+_jS2D"G5{*YF+!lXTtGכoMn2Fizon{ޭ1`o{^M]x6F.[KonoیuѺ#nme/Be YՉȸJ䇖Ϯ=)@e}H׸R1f/5ȗ}Z $2]3ol_ (so 4v}05eH3:3Ph3}qF6 0l$3.̊a36 $30>ӌl}_˶n$Ȇt 2g)6 G Is[ z)rj6`i٦m~نah30:Z7:RC֬6!!5U1SYlKE旭0:@Ž;@f$aϦ]Yymy0]Ҷd噵fQ֞I:f a֍t^nСM)y0lS x^΄/7֏_{9a/yvIbΌa֗IF"wgxo0PVܼT 㸏F6Y1lZu $!ˑ.I9m`p$̺HlIy3d.SiS`dv! lVBD% (J0Vݚ}]g VYkH}#&ŷ[*󸑃kRB465}#}f:_Z%9y\uf>ai=yXoJʨx ˭ڶ` ׄ9N@U:G쀒_nnt^0Kא&sdF*kor pN q#{ͺwFk75Jc\j^H{kM.j7:X]Dko$k`@օy'9%wQъ:nyЅ@7u%P{0RΔ_Pk͂L46F{@i5t5` @L(.j7xA`t mvEW5X>$@: (cn.:FUKeAMb5t[`B.-(z:@d[ԩYCW5cx{Z"ti`otk`ѵ;@mŀjF:769ZXCts`n^!9ٻ@$j_1adž"5D7]pn:p>nhs~5DvSs7(цMC&0m;XCtw`T&4k;cS<(`sxw`a;!;Jj!;";#:;9;T39; ݁ej (Z>kNfQހR:DwjQվkt5>`E&?`Ed@`{݁rAwvdBwt:;"{ V|_9(P5m yePFpTmrŜ-6T1*7B쪚3_=QQ4gI'X 1>PQi2VEVW u[,l1I߫Gcf+OQsRdVVjW6_?}GRdu4˯[K\=;(Kk5chȵ^T.RĈnR鿨fEOc." Z<6'/C^|NuEđ|ѼBI4EBrRTSrgõ)*eZF~Tuj-JC6a捽J,p^؂S[lD B!t[^ayv6ن)IFFW] Q]Ma4_M'\K`2=gg+)֕ @`_a$[=˷W%٦W-cp`2zի>E2FN"|'Ej8G8]57j1LWť%ٺE0]3,<6 mi64amiUhgd|'`+1[|Mav}f5I[]~we"́x]a4x#a0hz}{VC8k.Q„l[/hv/NG<._ go}WIHo!UqqT&6)xJFKKj6E՛59Z?rdjnY[)m"kq W-ꮮ|e]NS QVeMK\z)!q1KOtV \t,§,4&d6mGe Ҙg")w䓼8)=vB+y<)/S6/ 1lV]pu5n^\Y;=#^Nl fPɜwquյdܧG:$؄ J>N-Z.zt6Դr>/[h6i+ ,4Fm,4sJ?HW`PcL<xڏ~쉆^C>O#oDd{1bv`NסFz5dIQAҚ۱ Mi>/${[z̶#L oG]SBivIk뤻/JJѨ!>dCH[ö5 ;!c ̈́l 1z6&uNb#6Ua ^!tKC^!DYMs0:ZDl[> [*5O.v[6{=l'ѵ\̔65gQpŊpQFa6B5O.&{r۝[sb>'P/isG=vo'qדU c&bQIwG2It9V/rN*dD*Sz/zTzϓ?<Ƿ5X\,|J(p1)܊/,!JWa'v;O.D|0y"ʑ1$[=s47x\*kA|lcՙ޸vsF$GiɓI3():W-VV@/2*;ZbhVEGԓLY:8z%v<'[1\̓JCCb\,,h;pyr1slA( wĖ2z"QLLe FijFl3\Nqon![ B `K}l?r0Dh>U~{b|b,hUIlS\2h>At1@MA!X!E/Y.#Bf39v:ھb|^avJp \6rޞ#: ;Oeé I<'3~WGg}xVe9M>Z̆gԆTc/Nh5)Q1'4c5)z d'b:Hfeٽ9“yRVS<&TٓiEziR`ʁs iaʩZ9PȼC*ki(|HC%ZǫsO*VhNbdw<خ T̓aCN<bl6eF('O HBi>) #CK/رӯlsMiBbD8`SeN-M F؎ȐvK1b[XlHuH^Q F쫮h)>N8ut lSl%dJٴmu z0RװlQ '0mec ѝ! ЇlzZW1*n ] i>w)$}Y:Tp 1ِnO-<&DXSyj1O-() 4^,OP<.&bu?ܞ]轊L{J&|YOY2ill|lPT4wO-F߁Syj( ` ˛QAb̴Q%@O-IհNjPTg7{-Kle:),Jy&K&,ڦB@DՅ#nEJ1R\6]=g(bUV&5X}]<޸̟(Ůⶪ0hM!<ֵ)q<؊A=*!w+<`ZSyj1O-be6|}K#p@'-4[W܋4V/ͥr;Pr"o*]K*"z(U'[LM{j1bn%4cX-װŰ4$_ŕЌ)Ba_:"faS(0`(\:Iɳ/v7 kt&j '<7́`ITWiF0 LeU8&N2`:#߆0G a )0uS+/ӏjJGm[ Ƭ 4_ 7dKD4BkL!bf06fLy ـ tv4F0+Fp{RJw"D(=f'|SkHONU7%ͷ;BH65lSͲH:;Ɗ ztO:m#Ͷb^wK"~%2uUv'b_y~1/VH"/D͚U^ՒTM9`s^ܤRieNɈc j'"q5`UhVńJ1jȹ矉n$0~_.]9Íļγ$-aR>XRXqҐ(nqY>X`/v,MVw:VyulL%K,4챕Z)ŢG:R#/'*%zh.)@L'2Β̷yl}sО{afٚ_7b_y~pѤ){R9yJf9ۗ7."\/t i4/ukSiA.7Ѩ6|r}quyP+_y~j+\-y~1/UQi\,j|$rE[OZ29,$smSW3>l~]omu朰s]e$:.<P~ _Lt<<uTItRc$F*(7b}) ၓfBr˓8-~5!JXS׳*{_ .`ٶ4HcnĎIز"P>bR9\lӹrQ:$ ' 8MM/7 )J7*F Z=J |{5nӌDaB=b& k .) Nb|[-eA A}6Ð ll!UiƊQ|Gfپb|)hmɱfCfn|[>"f%|>$l'PteR-ڏ : `3ͥ"YzFm!HjNG[՝l-XM D FC6e =`[YL.TDSX!4Zcvڭgb]̳Bk՟[ۧ&9Vnjj{o3Uq&3gB6=gsOB!L%Ñ0\+ƨ j|ezQWE$f |M3:"6I$k}ɑr.N?}8c}T+zvweVݷSnzXhlX=Xe$(Ţ. חrID)7]1*)=9 YIS~U'd'F*7H5Xb]̳yv1.&s1h&Јf`%"fFhY1sc[XX)hI -9Ƅm?tbSsyN1)Vlp՚|b+ ul]M7 H0M;`syNE'I"|ʒIdr~f Mp*ڽ*S<&.4Ai+u9;֢Zvˊ+sH [=Tq1l PJSE3er,,I_Sl@ҵ_SL9L0RVro9#qH> _Z3Jk'/ jk1P)V8us֙D;Rtudc`V輺~a&)ԑ)s;kdVĔ]Z45/9h"K~l)V=bSsyN1i<eSsyN1)9LO3 vƳHEt1b޹^9wgՙbcFǣAG)~l.*Gɣ s RSAdVOY%͝&*# ''12Ѧ^6)xI]vM#ǹh`-[1J8bKi\lT(v6Ð-n& $!AC`[ẎI\S_N[h>|cE}̖zE}  j˦9DBPC>p*}9 A'eWّoffBGf4A mMZ^Wnd9 m]1`1b DoE)6ddW6!ujQ ۺ"f*9걸 m_x|5 '0a=7|c+ A>D =fC.Wt)}d;#v{ lS ]lh\ iV}YԬGgy_ Lȟ*:GN- Fc6\|f&e[WY*g#A^6q2!.9,$+c>f.8FA=ДXݵ]1y)PMW3t 4XFq ~c-ðq !F6 !W*{@v(oЌHCw*CV4&9,*lCMc1D;5[rS+|DdhD=πMM`9 zl+hZWecSlG--Ytje+z`F|ntj M`s";?tpEpwaa͇σxPӴfп"mviP> .˲OjnSV+Ťj(e04 /bPbP?e_JYz2*Ե 3.ݑBy.'+MKN*O|vEj\.n3dEz?uE򼨕1w( mSrE ' Ȥ*+&I]*RcTۈjsMŽմÅ?&wF?РQ\S:.|<>PsV#tz{y}u!ol|kq<`2#/1UE39uN;1oñco%- }npC$Б[KnK"ȭɍ^|@8r`vlo:6I&!mыn~fg8 _[%'cϳcq@YtP\^@ ȗ{r/ _˽|/^@R0<ȗr? _|/~@ȗ _˃|y/A@<ȗ _À|y/a|5͇NSy(#iZq]#KCL,S\"~IVQMZ-ֳ>\ߜlen(+>'2oLZbEʥiS-Ȋ]#KwlTϳz5"7=q6IHܧ>byݕ&MQ`q4H;Q|.Ɵo?XӄN{wf[7W#aFv-ec"`s?94[u4Z> 1_5?]dYT#r%nww6FI&"IV/ IщI2WYbF*ɘ\ETyAS:37hMkZcOɗ|RK,9عkTt*T! iίWRDj-…qc~%*ޚ4X%[UaTwhcaUٙ@U1?UMCסy%<_.ޓ.#&Վ$]q WF՛ q idkvq uiR= Z{^{^CjpzȧS*5 =+yPu_+ޝA t/ e@lM0s^IӄU=4$u[=HOC>d;2:'*jXNH%m9;q| !)fOjH4ODo?8H%a ?v-~Bܞ]_ң{tz}Gvlb&Fl^ M(uQS0ϪHSҎ%xVJ.T7(A}MWXӼ}M/To6U J_!Vo0l 6l* ԯnމ Km'w} m'%^0rY0m7̭x% .ʲl@]B ȋ035Lg@_"}3i? rg^]H̼*yR~.|TfbT3G10~f@a"ƿaŽDb_ ̈„;3cNZC5Ls}TCO%jgq KW@a,nI:2pjNݻa Cƞ301LR0I\ qm&fvFvfYL7K$5Lݤ8nf:(03FLڨvZ}&b3# `LQwffčL}ÄſaDliaQ5sf1c4֙@zY{; Vn{HIVV~6ۇ„ãwdwFz =3;)60Vqޒg# <9ڦ~ ̮y)I0?q (L$-g*y?[.gFJҫ?3G$3f@a"Ӂ̀Xd>`1 `02aRd>x`D(d>`}lbd>`{bd=`1# wIL;(FR3L.r8u4btq}-C^ae+hr`2cNdZd{*do_x>KUc& $;fd?K;M2gfXVSrx5^cF*YZjGJ_.6;mՌR<%,vU:WX%GDzvޔqt9ZYY.MهJ%ihmd)/_+.,R66.l'2ы -4e`EilqI$>͒l!A7+:XR?} 溇N?~8^aa2iKZX'4KglRq\u^ GV~ :߮ү~j:C&zA`Xr&\ ڡ&Y(8)%MkFrf[;kJ vE٨2Vze##YFy8I - 5ٷ㯟͗[6AsfvgxbegpZ"r:("@/( )i\u"@^s2~$K &N(Iӽo۷߯ht?|??"ߚ4T^$]]޼>Fye7i4{~1,Qh<ޛ]S~?;< UM?I2JBS1[/kR/#)¤'paΊ|>RluF)J8lU5vڮFed0߷7݇CM?,?/]}?zߛFS[2l__||oQlRl_ٛl}y3)󦈒Tni\,^G[ߗO=FuQU:zjM2yoۍX_/Sޭ՗e2/ZƂԃ4#j _O}hȤ_Zg~"WmUcX_ˇ!i i=Ҕcmdl_Czt:OBpq\|27"XUeŰKeeƧ<7(di2 (e4ƕс.kԆ' W5&Iu$#i~~Zbmb=jضBSVWJkj>7ZQZZO\v](Fi Q&Ul>CN~b( i`P&1mT3͢[fyYZkQVy4Xcϲr!lyߔV$H65muniI%Cps˕CZAƅbĞE/x6[4Vrm%Iݩ^ du Sk׶q\ݶag{ۆ6VP5۞jBGlz nzW=weŧඇlc U_jb2 yG;l)@uۛmo!H/nUF2iB4KaiYs)HIteH}X$g">`N$}Wm E" *'l2iDUD d| lJm#}>`3ݑ>Z)ۻbz+|ԶiQVtUg}#ERCH٦"hAPvk$ͲAn8 q6dhbvhF@;Ll2p:?v8b3|UЊfKtU*W$l DI4:ѧl*SqjQnw\:ypw(tw[$ѧl/$MBN@fzxϘ2wjdڝ-:p_5r}Y [Q|Ey\)/4ɉyԱ>Y.HSVOcWYOբ=[= &Pk= QZOZOC6z*5B߫!m]WkjйC腵j/nqJ_ݣ']sަt k;jc%]s}B;!2Q$b 1Qf4fnӔf.l]@O;Hl |٩m|B`  `7HlL;>113*0LML2knf}ilvo g6 J!;wҨ_>hҴ^X /i+} mtzoi6CjmBҬ+J6ַFf qjдl3Y!KɮeygTByQHy=Πn)6lEٺV<=I6}d64yu#' ÉK(ȶ:l'y0 }siQ72la6ː#ov( zu3Uf7)NB$ : kjɕ2SiiQG OkO% X5f/&fZ OyW)7),5{#]FV3@'u`>*Cgv]C=k688}~h :j;ޠط7HGI@:֡4еA_Pu(Ρ7<kHl] X5X;9:*+L-+PGX9FQi\:BsD0Y!$̜DNtH nA_z0c|r #xr:F}[@_pAٹ45.SpZ@%VU[h;\[NA_p(LckoA+a-ĥ@AFu&B'e{odK#S^- ѲZ[ t(uN w}P+,}̶!Z{ifo58]yZЉ87mAm`{tȂFGT>:4>E͛5U)4:4jSG  => ѡk G :4C7;<4~oxh`kN4ɑK] DBgVCf2M`Mn1}th FajS'4U йAy@m>`\$Sd5?P`yR yzXMZ1wv@CvsX7/6U,m:}:I5{iZJm`b&@j4BNu*=M)#c EYrQ]2K@|ْ~DRY믧}o2}9H^Kyl[R{]Q}p]ﲦ;~U92[r:Ž˻tzJ P2p)RR+ '_~=5ݲUO|*bTĔ.[_J{Hҷa>FΖm^t'.DreS₡OS[gYoԋç$Et!FѴHru?].[ ZB"w}~=|{/{17 34sON]ީ'ӚӽCv5erp-93Vk+ 44ђ~dVZju{V(%ѫ$nH^Fb͸zvKnF|7me~sI^S=nX>Dȡ5k < Ý5j-w". ٸNR[ZwLl~*>;-KKpTJ r<(ۄ~{yVw*ɻ%wLV zgz M][S}۷P%E6)lCDCZ[$f,& Y= -sOmQ\I7c5_<b8b{WL_OhU- qFVѯi>]l1%B0̕Ö&b`KuSN&Km0lϛmm S ͸#$l#*4ۼ]BeD ͖ lgK¸8p1%&tl/s>3¬l 4_/IΗI|Ilj)Hj#ފD ?0 mh;p[h>MӶ3NShm h"h"4}F~* 1p9OM]*Rg0פ[R M0\#hRs3x6M5 ]:i榟 vlhfrȆF4WgB"-#n*SMӶoNJ; s߽Be]ZWhF\b w K(lےрD}X>e;Ejn3]ٽjLqQXFL㕫&YI/P AuNu]2s;RS+^7MqY{J`-# Q4zi_,C(ҭ]ydɰ= { }VqȽvBԷq2`*uԎUĚ!"J?_ѐo88%¬-cDNkdpup{؃>iBpFAQ"AE7CTW),-1[\r +-6Jݖ'> zZBV+:֋s-艁q4=C> q=ِ5W8I12qjp\@wLQC؄Sb al{X ޺[!p ֹy]ޟߝ_ߔaTYhX,DW(nJ aG6!sP[I4_/Rh>p RhJq$ZH#D3|""1[7M~Mb@%3"fDCߨB*]MH`qH Kak@f[`[-کLl;k кGglA*/[ C|}6V-SF쳱B}XЌK]5n6u4A.$-pHoB+zMCvoqɀd wٌwGl!RiFc4R@;-pS_V$Gl;yHhe"h"K*Q}![lM lMO ٦v_;*ɓٗN(Ȭ cOP9M_U6Wr,b]?b)sO _<*,M >/3l5cOSf;OQLS3y"ʑ1[S4Mg0ʗ:d1o\xO,V`VwbSO(I8hܷ<)O%8W#BAtdTOMq:Ko|uy>4wV:60dG͵"/i\Fָ 8MbA܂VSZW$_/nŌЌfgGԐHbFlS>egvkoJ;[3o^Ԛ>"[>2h>" e{U'YںBd͡hS{ dlEu/W nFmFm K6C6GM o}m)T ͦp'(OFp+mV@gM$Dl[:Єfȶ{IH(֝,G OD1O3}W]l1['yXېHeq:rG'-a5/8RtL8+d[8@1TjwaDE^-.Eˉyq䳺H'GѴH;'vmgu#{ƕ_|p1PɦQbB'yXzUWtuswN=Qtzzb(b(XOcs30k,(N<_KlpBѪ콻!<}VtA?zاMWy2"Iy郉hWv*)aTY/eZß7շU-Y˪"=(I+nO/ J& 6yf較al0F/~ p6-NqE{uF!N{6Ej3&$$Glr blMD/i4[hxsYV"‘x86E5> 6قd^M5MDuolv[hH; _?,h -4['1mϜ6H1>Df6J}nC``A7BM;gE ό*ok+< +j6قyU">,^H2 >fgFm!ώ]}W|RY!SmKӽMb~ ì5FFll-DX6H $l_j4[ 3ygy ~D3hl^F9ՙkWZ^J0!X>eώLIӵ%N♚p#/E.P.OmD!JI:K kf݈16 ‘l3ŨP,ƣ0)G_KO*"O|KxY["QPPqq)b)V@=ЙYX޺g$Cgpf2WB?qR%L 굅[o c)VY͞)X0ml0F-f l(D0D+ڲ* 'W(Dl;1:n9v!]#mBQv/Ԗ  {0>h>>0ЖM+!S(SIq9">s*4[Gh^1]bl-؆2h$1F"l1ۗ"}6zH7eqF}pdFg(l4߻B# l4m>P1b8!ur˨kQbl ӷA+;يwZ'CuoD}'wxȦ5CV4n6:N]7:^(Ʀ[Hu"dFMvW[Ў-ˠ!͘NbQ@(_8!cQ90;=74.f:56 f$}Dm-i5Lqj t1d` c~GJ Y/AӃ^ /vfAx۠"ϰH *$lwli+J,a6"6KIoŐk]d9-b-b-V) a- SR jrf W)[aJOb?t`l15R<(l;e"+SJHHlsʳ.s q *GcDWyGO4Içy:?tц9]bY.%7l1l1l1exXI=%UXd8 v9-q:hZ$d RڬT³<[̳*gygygMhsD[l1S"i] fgyC)֧OY>Ңƚil}IY}~^BPq8waq7aA; >6Z0XsE7};0(H]Q_bsGA| 5EgZ}06AbTubG׬ syhd- 4[i1D/4">cѺ󗫰5lC#7拱43BH4$ҧlw^ U:`K ckc$'lk3hJ8Pc|}Mc[Bװٴֽ1MAJ!pÃBr Z">bHvFA: xcВ>vzMbb@Sc3.*Rh͞EͷGBH>$Rhgl p+h1JMBF;w$҇l5hE4 fk`c+<4d;EͷG>DC&]b-b-b-W9W W|\ݾ,,L2. K78qf'{Wu,8WwWXi&ɘΒVA'mκb-b ~H1W˻c!"a$_1{u׷n=[lϳ<[OX/4l]6"Il)/J0>FFVB<[=EHl*jځ,s=?f,%y\F:dC:|~w~=X{RU|[.\]Dtl1l1l1qB~Ս l1l| VRX"]NNO!{gEOmzmEfz+ecKPVfgxQĝ4 Oȳ<[̳j36}o]O=*6uWwqP gC`NQ[gm "~ID;"-Nm]qEу->3V1}.r'y4?GIETݞ-Vy cL#BLWh8PE`^6j6*DM0 $gN0J͙Ÿa$>[HFrm,Ɣ?E;eH`!?M0M-Fub|aFPuwjWd[ b GŜ2 3RM/J8] i>L$0i 4`Z֝H8%m)Xo{Psry44vWhIFͽHb h!k%$"pm`#[g}tͰ)UL?vnB̶2&>ی mhnmZL\$Lyb\[Nղs dMbGlKS$Һs",6#A#LKPgۯ[l3i]؁;l4O>,:,b,f# R!Eiq4]k5u.Mr%&E /z.UNY>$<|RTIb,bs 44Q6)d͌b.vt[S7 Pn :6k$΋%K-L_|R_MZ\dS%?n<ΆD g%1.};Tj廕{oW _Kw*فpT_J`_aݩ.,+޵VPǹ5'iҵy(.i=O=0qJs,7_:[w+`1 OZ/[ybzXTFљPd,.ǃp)ʖn6PaJj+zU%i%A}+0STWw)gu}Ab_UX OC(;OhF 36vF.OXZۛ˷%6M{LkDDah]ĕ@Oجq&W/ժj1S nS^Tm{:U۞qzNն8ZjS7֩ԍu=u@i݌O+-Ͻ `!ic-^6aތ_޶&4eqimqI| $96aW7<`_M<`ތ؞q\Rifr ?j|#8/2rM)ĹyM;vk+$gg4G:C  gh\;#װ\?z!EUuT:YUU=~=OAxO0keg' #../y@;wm rLxKoqPfQ7Xbơ{OFv[-)\'Uh^:£glXD/LM!.1巌A3.E#6A! 偰'li]N»N>+|DT a"әUcztr"7]+&6L@L_4|{־wH N?ʏ :鳽+ɉf !阒KdHD="1u'(g|ʼn Uu#w;ؐmВfxm-(\6K41iLölٸpfxíQ6⦼rH݊H|HÚIAH51DL։qLBۧżrw'UaS`9t!KW{+Af3/L fmNGl/fm!LtMşq:$jR݇fuY,9*<&'ݙ$$|10y;޷w^ 5ڻH0(傴_|jg!Z=^Sj(y{5SG@^l4߫m]WZ+g ҫ=%c U Kڭ[yJTE v%ԹcNxnkyK~m[t _>{çliL"{f C"*Z`P #~YW.'pZ0ra\cY/c65rAk \D.* *V;zQGټWǯhFi&86emCDu)]}RZkz>O~'7[5yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0114-Space Pipes.xiz000066400000000000000000000310151506652756400242630ustar00rootroot00000000000000]wF+Hϙdƒ7:kI^IN6{ ݨKPe2q_~Go^,ͳIA>LO?}||޿b8|?q/8g>Ukf˿ϋo ~s7(4|磽~gqc}Ht5͒YmGY2TOYf_ojՅ8S1[]hy%ExMifb:'zi3uRp'~-G>|&_&|Oߌ"vlU#zwlWw5͛tAم[6⧑]=ͷԟeG%٧swc/+RNi.V kQ Za?qhg|dx}r4 |uW!A%i9VH}9tDm(-̕ qb  eXr־aӽWo2I1q8 Ή x:K֑=N/POx|g^ WOb/b{Ķ)vV=wv)(1{mŠ&OJGy騘ƃ[ntO>FzQi8`"l)ms4ɿ$hҙeN-F?b^m_~zߘ ?f4r|^Ԭ2l+:~זi4R-ռkHF}1!^ܕLHnznJMW=C%JWw=Gw nјuLu:'4BK6y_>Kwi]DdwuW$r ThwE-7!>nDZއD׼>$Z@CE[L-χ7!}H&@$c㪁<˽+gaDp=Tl@>32@9]ZzZ!\+!6DS-N}}N[^+RhmʜE . tu[$4h+-'[HO>,tDٳ52i>^*-hAn=bDb3RC b,bhr$4ԃYFHS9ِ4f+nbNgp$DBujk_k5F~}iR&'Y*x{oIT:Y?Q.:|i_NYw|TZ:-A&שzuZKS ^%:nNKu~^mbWQWDcie-lK8iY {0-N1Y M{v'-lKD5JD|kVe/R)3B͆SiFR:|juJLBeFl="-FdgqinʹZW:j'3mĪsS&綧MmO۞79=orn{ª]ߨFf'szVZopz 6b07kmN 8LmU!dNSx;szXaxlNSI;szXava*< va*qgN;0xlNSY'szqzqzc6qz ׿r3NcNS=0bܙΜ$ ea'ƌ03Ɲ9=L^g8N9=N9=T49=T[f1N0eɸ3qzqzqz9gaa*qgN;sNStw@Eֽցd ܛ͂N? 8 r7t\<?,G1r!KX/9k!KXX>X^T*;Jd9k `-kM >@pZvV@p5f@pk@X; ֦@pkmX @TQXk `m@qڜX%ug' ,]cmYv vA/( R9gJܛ`m@)^!k d N_ Y!k d94d}MZ(=d}o B־A7Y!k d}o B־A7Y!/Oo B־A7Y!k d}o B־A7Y!k d}o B־A7Y!k d}o B־AA%JNl;LyqEC8NA|h6QP %#ԗ]%GuK4qeqP8/jyt XQ$r k(pڷ?gE@!uS$ #PDb +FfWI'Z4 )ܼ]*Ue +܊D+dP #s$![B60yWч2B?HAzZس =J$.ԔIڒ_PAݼsf>b}M3FdnQ[߫s0E-wSUįnzR7eS|MT:ZI~8TXr{@Cfާk 6ªsR2q$Z> $bp; p:sbrDꐲ,wN4\` "(\1 r A,[(v[(чNҰݑ8Noh\*%tؔh\ZY>,awe %c a+֕Vo_jJK~kԲE*VZԡl7ɌT1BˍT=OTeU'O[Pu_VfӴtZ<8,Z9U{d1X1UsO^ҧi\y4$IR]RE'n|.;[9q̚y+v4>-nyX $sӦI{jb2p*M wUmRR4`X*J8b^ @XJNhr=rIJQXyb,"l+'oW)#nϡHSD#$rPĺ7#$ZF$H;\#$Zs0cN %%u#R=$Xz$̶[A#ZL?vOZ* 3kq` t:iY!goA_X[ Аs'!: >kaE3ߡLck0HkbN'~.ZLoli Rb3hHG9˜(6!CکNpbr>Zд0+?:myw*01c S+rn [?J etx ɮ Ƶ謖~W]{"TޣiY:5<>^ݾ>ܕqY.6[b*ylG[32ZifV73>Wlm0zG$fmb:G ۾5"ƌmrl2/<4$ΕVG*'ңUUNծyG-6mW";P6oM-bY4·Q\y3ƣ)B5mIa pSiE+4[߿zeA:4VĒ2!݄8 24҈801f)wlWa6½Zȗ̩+O3^X̩UfQ=~oޟ%'ǟ@ Ww.4X߫ $f g{G}Nmzj/9Z>o.?x_$$V8 b&VoWxyXƐоӿ7.[SdVfAƅ7.֡Jqg!+I\^--e zQրi AC01SjDZ<6K%'nyXƫT·qT((-ڎ i>蒹QI{cnx:KvRgIg4`hꓨdOgܬ}QV5g$XJ {0 , dJ:FL@@n aZN?,'v(Ev]B?WH#ЊT I4uHOĺ̷cy"v*X"[1@+Zb(S농 VXs( Gq% ЊbFiiAh1<Pl (vt:Vd ⻇O?{Wbr4(쐛)-5BCz"CXZwe}ri(f\B:VZЀ51Ⴆ"=CKZn -ie]CbNob/b/:`x[zw|-fDSU;Ų T?^^E NeHb6ƊO0&$5 _UJ?k4$ x1x1xH/_?Cڛ:_DAI5J Q|LE2mO3*SI%lI sH/VzNjyNj|.lo\gjAf$ƀ[Z Z捋ZtWoŴeSvt}t)d5`Tfx1\KxլvzpvBK}]0 bP.Qk<^}fيHQ'H׈1bI\'F}"aDˉ8bWHHd b$THzTh9%f9}1Ā$Zt%ZP S%3@I^"+M%Z ]lE JdC- -6߯a?JWp7hӷFRhd]B+R3%"sn ؈+F-P圄XnxyHCWFZ>r2/"=֕4~Ӄ;70Vxa,=U]:4*,~%M]=w TXSҥ5r|dDPyXG?q{Z&-3ST<,ؿ$|_YVOiqEO[;% b+|"}v-&ULb[i92吪H<\#67 J%u҂X-$OAԵÅy(6vvNkHYPp}P'7ZLBo5vB;ڭQb-bHd n%N;Vףpl-m=L\/ X-o*ܯ``Hx8Kf3K3l~i+a<=Σ=Z>/WOs>M"+/-XG)gMbD1Zv{GyGyG-b-V-l& jZ|+v:j1Pi2Jbxe {N:l#rGuWh8L]Cm0u; ׉4{Me5h1h'9+4ۉLx/)N֭e JTa ecYF2P(dCnoW"zsqz R3%b!\RA(V2:ބN2]`X CfXJ"c X2Nu)lXz5"}ņFֈ)ЁꃭЮ1H#$rT$b 3k0vK\rP(.XLzbb#Ti U@ew,b#H!>X؜&VL9md6\Lp11$uM{&Ϡ1} 61-=cPCҁ[>>fJS^Q>P46dwh1ۻqԞC17@tMD|&JC]~|xgb5#,8';~<*QH IR'O]F*zb-c@hQ\JyG-2͈n}N K̃t:kNh_.onߖHƞh_Hq(qjUgḨ UmS#t9CPkrU(/d7q~q:6vkL6 -#Z6 ҭM/SYkv\^}ҭ-*nCtk[JN F$`D F$ڂC2藑5JUNǥ= \TQr-8.Us KL{nqiŞ[-8.T!wr-8.UYPp\*X{rGHp\ #qy$8.Uʕ\ǂXp\dVrǂXp\ cqy,8.UXT`*k KEq^@7pH$+}+O,W/To[c1Qu;xӄ#R^@J5%k~0~_E4QJ}fRQJK."mxF3:7ؔtG9fm5F/ɴUhl2MᚈFTq[n9)+D>/ KUDAI?jeւE)# mjy\"8UW.ǚ@9|rn"6dbXe<6W!\(NT]}VV!qRe+W NI "z7h9R ʳ]!^Q n0b#p-T)%+JM H,(bJLBػ"}\ #}3)>M P0ڏ:,\DhJN稾9&tpuoᐒr\Hx ja=Nf\FsfdlH=FTWW zM~޿T^_v|38?纳sbjx4^p$Voħ$SX U)2i8Mpzup[I2!>,~ݵ.Y@`~[x0_6Y,.q!UǤ $ jJ!TQ [$U!yH8TreFv"$IѰ'3͋s"'0qR%2bScDaI{YFhts6XNFnO$U3N@Wv[$D/!ļGSaCk Cau8hN_X'ܝZuJkdD=)7h$B|c1rL8XTR`S Oڜ~to 1qL iex0kcPڡUjTEv"k"M~0Y)i؏ÿt{zx͝0Y/,Û _SOt|8D'}>ѝO},3}ƄϘS~ 9s3~'~ŷ ET ]c4*WhYi s:OC)yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0117-Boy Choir.xiz000066400000000000000000000064311506652756400237540ustar00rootroot00000000000000b `]rF}Wp3WN2VTv/(ZHH@@2s`ӪMmvLwϰ/UQEovEͻawͤ`y_{nʏͽ^ۦlfO }n+!}| qHG 7v|1G(Pq8sW8{'M=x>ҿmȹU#pJC$6VAlL7c[O*Iz?Mr2v[Z_~ǦDoNw?qDcg"$ڮU)JZ."G&˯7V`wl1he.j6\ۭ}j0Mn{>5B?z}Zہ_j)zzE׆lQc&Ry9w9lfFAa?^tVb(㥛A8g:\6|/lEm$zs?p~WOArPU9Ih",FSeŒlvj8W cPMPvnUzgK"}Y-h2Zy|{y}5=snnϧn-kacӓޮUt#Q]2Gc>ŕk=d0T fΪRhWWG2orղVF0T*mHNMt ?V+Z4[P6|^'Cw~.F?4]9^oiFP}TNnCN`^/UR>vUBScL:нZrs2tv:u߶qB[. ڈ"m%pRQl~V̑ř]$cj]vz10;9e@=4V٦ۖ^9r??RY ^2XAO؄}-7.NjϢuීla1ZfԱљ9f0}[TqX!ފDԄxn+ :LF*7X(%[azz5/{m-bA+u+nvvNo3Ztպ6Е X ,N)hui[]-c-NA@ўnZ Bu%@=T L2@ FϳRc,3@X6a@1e0A=@`&¨}b:a}f:Ȇ1u cs"ƎdyI!s03atas LS0cEsA =Se-X $=Qe0| !#1Gw*!6@ؐ +a   a%)H*wI:l0V g0:g l611C0 ƕ¸2@WѴ@؈a{& D!X m2>Bz<%;#{I!;Fb15F(sFO9B 6 6 h 0'%^eTOI[6ʌ1;*(5ƵOEAlF>R 㯡dԌ OהR41uQe(?A%Y(O?Rԁ Jse9\1K*?gPOw i!Pte9w |ȏr`{aPG &CZ&Բ@4 EFD F$Q5Lck!6>5Q."!F{AD F>P7k\`MSx7"3@SQ5- 7bjh.ȮqmC6jh#q5Z@<?(b eBTqxX "^. zC ƀ&EAQQQ@8G?c4}=Gh\2"8ZszT Kwjqt$;qX"%|Q.^M 7(Rw@Ys?9YI-x~ 5ѻ߱Sk4N7~UZԘ7y8 x7% rR"ހ2|!oOɯIp˄xom* ()o} 8,q2L :xD.wPGQ5_C`t M!HD wY:@ J tQ%K |NeҟXJ\ϦYI}S6I\툔ШjG~T_6br7?Z/*cҊA_}7UvYb?pc݇fjV/SllX_O+VkGK%- Ս"fG ~Eci5.?(a3+lHr#KAce'W=f;9urq}cW˺Sc1T&Ab%F 9Z|ŋ|q~;ЋA;^f!?0vlvu𹥶ȭurӬAtHVC_hۨ9|s_Iy7)>P N&J{mLj IT;Z"V.B-X/ p߬ VyG[vc __*na2 : 4-ӷ3K0eOJAί"tX9%IіYe͢lfѨd3LVCh{Fj(WD6gMPZ6'mGv,6΍%&~7XV;^*cR,eYqn+Dw}-OaVC )`mI"w; δά)oyXӯ9:5hf鼢%EK|̥|)>1y緳e3-Kw%3T8kZ\ӝkrM^5=x/uk/x H'RL{O3K,)Tٝb_gg$LІȏ!dp!DV+h\)w?,4c@%-x\.ߓ'Nm~1􍕯Wy/zl_}jkNƵ3넗4̬Km70#_::sH+e<`˘& XMRz<=P>.eB-$w*N]"j Ss?B_VavUHB"1 sSy&ݱ Z q@#i7Bi+=Ñغtm-qfd8s@|4z̝P$2Х϶;5]H6/9J`ʛ uYL{u rm%-Ŷ;&SEq#[]xe {ԋ- /<{?Ǽ gɨf_99]Ɔ_]<ʹR%W~Oi|g)_j}iqvNy:խөnNutS;ө}zOX +>aI/Pey7w0p/sbyOV0(ob" W#+F:pYJ˵m\S/@)5';`O/zL5D´ pK-UYiTS4l783A[!17?;.V7j+yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0119-Ghost Choir.xiz000066400000000000000000000056371506652756400243200ustar00rootroot00000000000000][w6~ϯvNՖSڒkf_x(HJR_ @ek/P07|??l7{']ToԬm׻T] ?gŷI?ضofdoO>uȗfGkyfY[y^oݺ'h&QУz=ͶZ`u0|~}9^L3 oju>gg}0jsNX50/*ޞne|31br}M5k|`dt~:HnlCcQ:,YB#YK裫|PCNǀ;*zӶ)E4AN7d?``T0D_>1Yw7?k_|{8\]Ծk~Pۘmm["Y=t6'T8WF;` ;V1!? W@ 3!6̔1e͵cqA{܄A&:Gh4 A΃iEd<4:Vw0:+X q('[z" 579vqrIj2=ٜ1̝QFm^0sHz.w[J5'>HzdvM m'{ܧT712H^ZYXBʄ}9|¢ PhCg#ZHR|꣟7>a' G7ќwH|`YjѨȪ3(v*8)pbhWyH]&6VnmbLE.X k)5CVEcyޭ1aٜ_חֲ !-\x`IPBcOO}.E>/_ɑ{{$+;COc:vpHd(Q }V^|DA=eDK9LN9r$`Y2 ^R˚IUNaՎF σwq\VTLxyпeaܝ*Tb۷ uzՠCVepU>qH) mk]; ss mgR ֯V@=섟7Ucsg)L}L}>C-V{d3O:Lzv17p*P_Ar޽S\@}ꋁzYkeK ԿEP?mE GTo7[[Uԋ5$8\{Qz|[]!] ^ H~4*J~ie7,׶_+AHM7VeGkk6ᯌJD_Z/Zh ұTz{D!3ėUTPK1Oew (\(cas}*6{Q~;ܴ`ɪ{):QjzlB|TQHuy(LrXsU$c.ld}Lڸ$B൘ b bEt1֣c .i"Gr~AlK'zar~>9]#/In˒,Q(E=_UMxC7HІ7vnR;Sٖ:?fP lȂV-I]Q#A{lK?JFC5UD#NQm,1Y ʛ,VL&%!3V3=׹rOs895_aCiO$s$![.'RmI5OD\`WVi*#.ٰT;e)+NYvJ[VݲR햕jTe o l݊shݢkx%0QJxB Eskyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0120-Ghost Chime.xiz000066400000000000000000000057171506652756400242700ustar00rootroot00000000000000]WAg8˹ ^Ĺ @M 餻SpEO ՝UWo? z:ƧAky~|uخ.۞ӵC L-(pizf?I@ldyx`SN6\/j?aL]O=ϡ~`\ zP3b"Ɔ$zc?VG&0sIkK dS Fl.5vܨ<ݻ펺7qot ri$K۲ < `dld; v@>YQ؎x%u`2/>4"t6S-+SX`D֐1 ciY*?4 6py/Up7c-Lٵ/n>Xs==M[Z3|6MPOx.Õk_.g?Q˘ysQsq5Y؋l{jxH< $Abx%\tpx!ś+x6bN&qưQ(])y9Y$I$E\x@A_3A h4ҜS"+HNE؀;vN`;e 4Hku|UOd9ixme:puBq.ܩ/E6~ &]&S17& @3: /<3pu)%&>yJ\6𶇹U 'uʵCo8ڔƇE6m'-rGkDd01Sj.k ۡp,(9K,~}mi$~w D^~')ו^_ پ*qtt:'i[X`ǽ&a6_\"~45jakgÉEf qu\;(ŽHըAg&Y4X;ۍRS|JRh=EG}M@<ۖ#ݺ@Ju!xP[!hQϼRqiTq`h6E4Q!B[Zpҋ-.D;mn)fM.IK18$"DCޠDzD&n 9b&]= g.#4\;XSLEiF/SfWD?7%D/H7WXwQΖ1v BAD9)4HPog_h"G !Oy F3![ϔ ~]"D+Qdf{>o!02W$nǕZRLK"CK\Ecyލ"/7&vnEfޜ '0:Zӝ7+e%(&΢\ = nL2|A`QZ&J͈4$=v7x $kT-Ԋ!D55"Sec'D$ę!(ăHﹳO2;IC3dԫ BD+:4lڝ@-ZB Z` 7:vV 'vR'H3;;,j;j 599v )rk#y{׼^_wCml49gno.d|ʇM*s+^ U>͓-;jG.%T11[ E_) ,)D@aLiPC Gؤw`kRB(yzq )8?R@pGe9–`&נ[;9n 1F]Q+W}\qqqH|m Uð^<"u* yV2T幼P > 6 mPr:Tu*"ªF'm3r.n.Ew V`ev;QTqt|E?gT~ѼrtI L*b*MYo&Tyƕg,JR8a&bz,Jڤ "cS\ꭲ Z\m_U~q)Mjłr /UgMWjdl)MӜҌIf NfE<3^Ӽ^zϩqQȎ<*`~MJ_qbPoIhhHqʕB|,Pv/ӞEiƝf0Tf@z-Ҍ(z!j-]eUrag3./*TpSR Q j^5w"S\tJh_f9$kzwMU ]3Jqͻr*.DY&4-2 URoR-f,Vۅ@jk0(jzT);bM']ʮD^u)Zuu]*u)\2W;npy . $WEϫ!<]].a(R7 _ kun W4U_=rm%kJ5٬l%6Wِ9l<6gĖ1sXB7E XG?.myoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0121-Ghost Ensemble.xiz000066400000000000000000000370051506652756400247710ustar00rootroot00000000000000]w8S}MM<YȔF/Ng>%(/҅ݸ $X(PU_ɫtO?Jt4>g{?~}W-nWo`9?qnW26e^|{w}E7̓t*L^W5=o__MtvpblԫëMLWl:]?¸]9fibCn֯YsEq:Q)# ]64juekfd95D! w51i}ˋ7o_~b׼ͭyJ*߿u?M'4{)@ȞAU-N،}J'x-_Mlᗄ>\}^~yF{p96ina}3vyZ~- _i6&sF,],jf]_^|%aiDLd63l6b9gU#F4-cbJt>LGL!$EռhtVJq-,߸ᖇOgo^dJs&ɿjEMyYEMcLf_L:a0M叩 cgrոb`_dE"xQ:W4}lIL4>f,>]^4UfL "Ml<76pGP~IYf$6YMzjQ43,Wd _5'@͖7g4-#,4xFO;iŘiΠI m`wiܦ]K2C+Rp>-3aH9X)%ifkI=g^nc|6r>bMCzD.y7")ǁi3\H4G[t ɼoi9=5gX#?tU>ToHGs/(Rn>,R҇^9u!HI-Xm!-*GHl^O*:NJ!uUA3ZȃGjHC폐l }6/(ZSK CwTt؄ub:")mzXmicԐpѤu˸N(q iyaq{Co}̒mq42O1[ѱ>>d)÷у>]ٺ~®C?>1fz@+s)譨SYT9 lf'/x-XjO/A۞;R͊bt X2.{sy{}uA\HؑDŽ$v$#Qp`%FdA #{so ;HرDŽ%F[,I$X"atbǦS mA gFгDN$Fl:\,0zH! zHةDN%F1dwH?3I$J-0r zHؙDˆ-&xlK$ lB.He zH!=K$\"a $"g?ȢE)([E9$H$-tk{dMx/5_v/;'{NeC.xrA"[Dg9F"&:'5щ$:Dg?:cP$kHtC^GHt# y" :5 :ɚ V' "/ 9cE(.Uҷ^;"@D {5g SѩHDT$k"A$D"AD KODB2j"Y;y|YdM.DH0EzM2(3F "AD1Iߢ5T7E~X7E~X7E~@"koor+F> b  b  b  b  b %go1[7E~X( "A,"A,"A,"A,"A,"A,"A,"A,"A,"A,"A,"A,"AogIW?_{}ٿmK}^Ɣ FS4͓Ōj.֨NF(o(˚3Fi|?,u ZΦpZҭSv~LFYAǶX}4ʶ:JmEMPAK[]&p\W%W 6[oxݮʥUulZ ZN@w,>wyz[nߏH üu52b5˖.SU6oϤ튼T:YtAu{qZvy{ݫɛo+LK_Vd>rf3*.`Nh7[.EJҤCTy仭Mכ E7qGZpKUXnU!^Ң2~K;7x/d0̖c򺺢\f1JDHGyG{k~p}BIY=wW{/5֪nQvNOvWoi6͒qPEV୵]Uў,޺{[*3wJb NߢUuZPU}S< >0j]ornӝy]ׯ 9[6o09pPz[vk:6XQ6-Ŝw2[yu @(NܨE2?% 쳤;6|ۜaz'tE:.c{"o6l_0A_PS+x~xKqMGIS3U/)ֶ7 ǼvCsԚuۙLzZRb ȀQaͲ*-r\Ʋ䧳rx'TdO_ђ5)=mNRʽn2<&HK5_r&?ʇeX ,4/̩'<%v ]b=~k6@?wd웆̾á3ObSʰsu]Rbl1#)c. h0y.Z,KKH0.Zo/,?8XXvSG,dK,b P-?4X$BeG0tb ,W^ `o5mSBU;fa `X|q-d5Сu$\--i-_ʦ%~S`1*7rx,EpO5#@UyFM1!A]! AMQZ+L\J2%Gkn)6 P_" cb| 3mww̼ҔBYo"#ǻFZ 54S'b ihԂL1HĵA:/Vfjut4UzUAHUhbTYB}7!&饑# VT:z'fduw0\}CЃ!"5#-}6w!mruqBvcHGzВ&3RT\u.zEZPmmZZm1F[@ИV[jcߍ,6#k:Ԭ.ne̓"zP$X.b# 1lLTzf&/׶OLfR $)} P^ݱ&]:\B㺂qAI`6>'l=fhÒb3^eFf E]q\ӷfM],niX+I햒s~#fX|%-f[\E5֝ۦnyXN;]#B*uXC(rh)+Xy\n$@daղcR-0v<SQZ18QtœLs]cz(QT-%t%<@u&[ҹ*E)a,S8kqWެB:ZOoA #}}uN!cjk/0Ѽ/<ҧjR _JJ<3h5ACfڤ=Fj6k*[Uh5 ѧjShbT UnTZ;dCmG5^\{1AB( B$AVCbZO+ey}f k0ICMΰV[ cLmq K^0,y+}cEߞܼRk͕=Naz+B+b/KȌB84mh_ `U/+?aFJ,rJtP؃?]|zNs`Q=*}\ޑno_?\:Op4J/IX}D7pFavUZHEYfMwC-;XͬJZ[zuUgjrj˫Ft&HI|T_gIЎV[ QmPoAC5u u껋h#g)48 ݧ8Lzpf)z}%S,[MvBsn{zVgԘ˷% \Dbkjj]SspJBSJ|x~xrηSOߍ"Ejua,Zؖ 3HHK Qmm(Zjjj}sh15u- CMSB+Z5>e\ AM QM{ Kڅ#|}W *'A?BE^*;zGI4Zm D*ZRj{pHSiCϊ hZ{kM;߉~Vے"[ߵ35g R[_7SYH? -XM~>*b @n @1J8X]`nmGdPCޑ=5fq6]ոR M,t5Fj ybj" E^-:HM Wo3ڇE*Xmt5i<5T~Y)QXmN!}q|TnU3>,o1WS!QMw[>VPGzRTx5醇;j ډֳ3p"\InTڇGj/~7܁+FQDd\g+ \C9vaҸ;aRGFl -D)W^>MߋHo " Sl*FӜbUx;!pJ4K6/)>-㞙7ody.^.LgY\ XWXCMU\wn}7W[L} \1L~ŀ?`NmPSMOabsո&F*eGoXyrbII \g!pb+rSf[ Lv~jvEQhi';`\4:/`hm;4.Wl:)rEj| Nh:[a MXcMC"Iji=X؊ 6$s2BюY#p:C8 2pfreWfG7s b|0'P [D&o PAf̢ELZp&r 8$3z0ͨҁ l 9_47&ܺu`Z1J8TK\zykZ;J:TAk3TVb: F_ m#iz(@&IYJ4OvʥAJZMmfuw&"DG s&t:WKoBJZ _줔,v7=_ I bjz It^/@,3C*Z̀G)h=y&r\(ډ>R)蓝(h=~Q`jt=+hjC\h@C- dY[u;b,,Wo%ԊV&Ř`PL.Ogj9R ghًq6[-xVfsx.=Mӑ֠<kg![cޭo˃ N,5 k&שZ1JЋ9`1prX\-aert[ymV [Gi|[!!mYja)1u J+M<:! mվ+R'jj h=&R~S]bz0V-gr)r V̫b Z4gj%4%䊩euC="tD"!ϐ|ٖ-f";ZMO@ _=!%>P9HG⑊;A*t'f1 LDP[!CݫgZw"TC}[)WLqW BkԤh=XRevFbzx^5iXrz7gё߭+gX"+ZOΠ6v=VRΫfWBـ;9A;.rS) hG*b*~@zyE2U T@ 7ļ.t9D0߇l9ΦDm9sKX]|f-z׮r$Pn,0jPwWwu㺹y7U_\XZ4(è U,PU 1#?j2L-)|yl5hr3M((/1bZ>Zbo$\Xѷ6[9 ܢxl9#P}-=T &w1L/~y:Z58-Cp[7wfhܾw{zoUfޛطnXD,gy˵>؎o[;a>o8|q6`FJg ʵN>7V✌'%&}KiIԞB8/)#Je8/) AoL%Ydzϭ8/)bJ)Eފ^zϭ8/ho;p>y >'߽0'EFr:לh(IQ=MYS[ˬhbc[>KKpL7H"^k+Y`f s}&8Ȗu[b2eÎ&pB ֖Ý>@GJbLYT#z@Z^n<ĨmcS6ˆ>@Et+D걕0Ja<UՀЕ+a)NiJ<י4AȢ_SWXyķN s5y*DsUtdHf᪭HMxq53Hmۀڼ¼rPc`i[uI,3 HOS|4/-BL 2w LH[z_C ij;ؚV;Jo%)jz zU*B"Bv_W MAJ" > gGgfsi[q8SRg>^tmV#%9,lK(_RK>\(څ'\~ݺOU %rL:`+m2WRݮ#%l*S"Dnti5YJkxp'R~jlJ`ک7 yҗEXVɗ`\߾~ފ:\ *.Ӭꍭ'V\oڐd2~^_aW:uc7۬'ƖGw65O*Zݧ&_Oe031Y:\)~0ķ>֦H ҿ [ [ĴrUAdoZ|Rp߰ m_뫋 1ڊ!kdt_l{Hp=g钦Q"2xvHvi6ȆdtLfJ\FHtQYY:Bh]|^:okC^:Gu {]#9 usZ`rzEX_%S,/ D\iw%"H,0"گg|{l^=(~K$̅iY"a._ sz0~l^B%],#r=dtɍz#p~-Y%];KtƞDN%:T"a ;HةDN%v*0|!!bQ:gI$L"a)xgI$`lL*X"a #%F)F%v.sQd9wHXD`#I)$bH,:Zt i;rf}pr0_&@]2yn!Lc^z5Zs k=J' E=4[V5>fUQU05+.˺M.ۛ*Wԝ;rZ6 _~'.Umf2 WHcΞtP1d11үB-,,j.Uz>~ÒOqDFjN6E-ݔ' sm2Qycݳ|i$;ކUN]c8kOG.=S~ԡ'sPx#q 1f T␔zE%%lGWTR/>h?^ )\=S,Ce%uzԦ,.+Wh&V\^*V0T{Wʕ!-M~RfE?+KG~+xu-FN1Nk{`}f^Y\XKb,Dϙ߾}K]y~]e=3v4~[[[[[[; [[[[[WFƽcxnYat4ÜtԢl/߾|}wciԞvt3*m^,lONGϸ7͋:@м k9Ͳ+ƍ9QuiNü4mzPbh#BKH~w-~df>]i9oJciV[ $-N aq-Q@>hTF5p5_`V:~sB玪sGեXu:袣_d m#pqQM{tII/||=>WV]2Q{ [gۺU^]M_s{e0,XbqӺyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0122-Choir Stabs.xiz000066400000000000000000000037461506652756400243010ustar00rootroot00000000000000Zs8~_rĐdI2һ܋F"-ΖпV%ɒ! sL2Wʼ~#F-E"z~pٺ[ [o^z2XOmyya]Q(ğh|?O[E8ekx[GGA=M~B^9qDf pU U;VbG+v-0v4Nfh268FKJ+!lm(MV mYm]x~ӾI$jA,<߻1O(=# #^e$gg$LІȏ!c;%!ZWĴ(z4MkǞ{.wWaxj4/fwxQЅcx[W5ck2ysȵzGULMoVǢ`F. ֕GI@7ijV1 3XXSHDvCA q(XA12Wtu~xl}L$VKcL%/֕9B@rB}v;h: G7%NRràD`[p&w un4`&I K!iSU+]MZ]8X=g7.i"d%{״WfDP21`t dFBJ1qʂEzyY;`*edbVޛvqx~Po,M AJrW ~$(Y g;Ū6'?Y EIZ0 !i=BLDXH-ɊOy>@ƫ/> iˋM-qԔmluhT }Jtʄ 'bTRK[=a>\'5`aM9WDw4@>̴DZySAIY+eTվ$0΢EX>Nhg|2EYcѴ5' wWv)v`%$pTdA7ŽRn^ I2!34h6 ΢!5#ѣu(HEXeȩȑӚ@䢈WպCW$[0\m85Q^o`f6?Deg>`` уԿ61_r\o2JMi "?:7!Qs=$zx|*- fI]JT&OgC1 L8 NGd@}61`ʫ /Qa33>.hGŻ~ό 7@/NHyuNO;&Ⲣ׹6t Ûctε& Ó11C"VtO\%33IZ˚=GP@w.*"м܄0(7~Ù.W$Z,e颏#g]K#.1Q5IC&,.k^zdC-=~,:od:ԫ^fp7!^睞m A j"S>B\#k`&m70ǐ&6PqMiE4ٞJu;ʈ2ӽ\}DuZ1 [Mb~wǫF&s>AmAyqR6Rme_zHK ~?Dg"?{R5כ'UY$JGQ˜}Ӿ;}ճMu_>~8P@e׷Y}r8էS;é>?én`yf}_ 'kܥ3:h((~n4{A.=?nXn78Fd+f+3T~Vf}Q~zp(yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0123-Cathedral Ahh.xiz000066400000000000000000000075301506652756400245440ustar00rootroot00000000000000]r6}}"WeRl9QvlOvg_XDHBR8_M 8m[qj*OPh>}A7u18M>oV,eh={?nݻoqzyrjS2].ovwg~ ~k>ӽ߄هߖO|mS]P>Eغ\c&pn&~/M,KhkZznAkMVikf][I>SR<<|9h=ݿc\eӻ[Vae.E)yy}[w%dIt0*)i[|_[[*^q߶Ayt)_CoAw9ly UXI@}!v/K `*TwkEjHO瞪Û]a]q|j.z Qy,"UeVum根KKsnCs֚wdx?D]{V̎2d{,)Z=( 3O(o$$<4ޅyham?L6°(ȿ=ݺ8x󚐩/ք) -#e ZI4=7vg%4e)}[ Tciz՜c\Cm$^9PYEܖ`(1D 8/]RX>M%z4E=48irJ@#=|!ܒRBu˞,DG MgzF#GVUEuOɷ7\ f R"#`Ldrz6]|Rݘ胃UDe-bSfþcf !z״&fsm4|cypGyUU.R,~e@{1t6}0^80j5¹`nC^8=i})َpj׳ˋI3HO˻Z̾Jȶ`0F9<ä;RW҂lQiWtJpmQϢKuqT#nJ'g2= lāV>mpe#cL've# C㴪lXS@ؘ6'Ɯ9}opA'L7e9l/2ncM g@ؐ399ssG6%F6 +z9X_58a:vG  j(tx1 ͊ lĩ ~;EcaܞDCqL;|F6w!llȽ>H}3@؈U;-/@#9#+üEK yIac$YHbp˦X˭)vOXb0a #nQq*Iǟ#D&j(N3D69c@|}JklNdl0a(ʁ|nns`&bأ;́Ef({ƾQ x_92e<5xjsuتlC}rK =ce\0ykc"%\lyk<׎qS7JS&vgJSz{7:pdQ:[9rxeH?{(OVkt;\%UJw O=ycSzuڨ;j J˚(oeP__`7JyyT8gJnCQ2sܾʇbލ#*XOj|":wSQ97ֲ^e[sPI|oX`тlrCUJs+GXOtT]Sz`eKOy5T/l{{ɣ:ۏ}u6 uD*lyC%~ܖ  xۂ~SN(9O{PK(^9{zGV$x <1( ( S */=]pddUE6AU^K(~" X棺!Q݀ŚT꣺{[N}T7`O~8]p6`/]lϸvrmQ݀=nBFunn@%ZFP݀l=GP |/XOS{nC}]fт`C]3&܉Gu&O}a݀E PޏoT7`+{>1>`on y5:TT7pY* ̠?`5X7`":lGu6oy|T7`Z}T7`=T7 x{u@u룺Qva9ߧ,7sVokq])7$(~@L%;Vx3xu> ~4=~֬[^)hSHw|s󲯊C}c`{ƌE~:u6{LM6@2 }i/?W:q= q̾ՠF'W4I[HTy5̶^]щڨqB+66M, mTB~([8?3O*87vlrjR +{چT1\ю9Ċe_=Vi2x[>P? jyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0125-Hollow Ghost Ensemble.xiz000066400000000000000000000165771506652756400262350ustar00rootroot00000000000000]ms6_Mږ;j"Mlt7CKV"P" ަl# ppe2|f8M^yudއ۳W{ۏWht;QOWtzӿI7&Q/0\S&p1c:'+ը?? fI4:o±L=FzՈL}B5 g];I8^߾?%cG#q8^ȯO|o~ uvp}$LQOL-gi4-΂8&`͂8g$Jd i.DAt 1New槎Mh̟xoE1}{/nn?\.'-\,L{Ώ@>br7_Xoq;?Y͏W:tY4sQI.G8W#Ρ9;c|{jsߙE4 aܥB&#QgDo hɞoŜ+ r[,ȒGK7<_c=Tnt] :y,Cm66 V;U  o;A.5َPA8,2cJ$-z*W[)F?3^di Y$P|Wo?uOXԊMQ0 ޮV%fD4[Re/rs<f]KyH'HnaiO8S K>7Z+gTpbUot (y0fxhu--{ˆZjB>I`bM,]L͕(`p0QQ1䓰ABdևmacMLOgh̢q58N"q dCq|FڎZk ~ 2X-M6]77R-﹞Ifɢʹj mW{G8|>uN 4UfGs MS}Tl%D8&hBg0Q4'bad.9tbRcW;jPq:Ϯ0x勎lzbui8GA䫿WŲ"wjj=gWPaiRPTT3OP=N~SU<^u۪i7oUvZDFSy2.  (dTn+>j+ T㾣RZ~PB[<͝L0E2i%]Qa?.\"YV }(D+5ERhN0OmM5v{TU+IqݴlnRNw- qί=uӪ𧓶U*`N 'M }8 /=6-ϣc#Ԁa`{EـNȀ˔! ;0ln ̧#.قH>{ڀǎȀźL6P\.jQ7NcJ%FeR9mun!0Dd[%}$&bcS|+Cd,f6k163:b4jGdTkGר?n_p)Gю7#mFĀ%Vld} bbtߖLr 8,1cbd/Xɉ˹`'tQ8F}wqٜ>b+W=2`⁸Gfx Nbu$(@2CQjh/ٙT-C{ɤ %sd^0Fpo7Z-tdhꮇNQ kdUv\d'H1=xxL:XSyBmM[hӭ[1N6c' =E1HmB!ɬ,77rgĭP^A&r-ML tڀU w@yeL#*cȓ#;8ȆDmMlsQ/d##1!mFyriseݚ$E 9xf~<0[.%B$̦ReCYe@xG9j>PltPY1O#m\|kԫP"@N P& '%vPR3[Pd@У'oʩ(nE(5Q>ȈRC?N=v"|1hATQ>\='I#^rTB63GzZ`: wkdj Pf@qK J Hh %Dz؀$ʨbHQ^C `r Ju&ߍrO1j`C[P^M<#}fj|W 薡$A _maZUNCɂ<ľ]v<2eߍ(g@/gy(g(gᡜA jΥrrܒœO(iBCG/Zy(qІ|{(y]({oz"Fx NYF\b@N5, 8( rq"[}H&خ(P>s=16&Q 4|%hG(F9U{nѹ|Kk>#xmkwK ( qPAo<@%N%FV(1|Ɏ( Wv$vPbc)5Q{|VD=*P(RnDI|QABlǐR(@>J"CЬC|P"50F]N xMLTD/|Dog|D!lȀrjt]S#@k%/o.:)- E e08SQ6=OzL=F%܂(faiD}}tYeX"}'.8.-Ga-qdA:6[vCV;'[& uؖiXcu7oU%$| 0tw. 0ǀuJXia6օ ך[W=J#+UKX\C~I,bcHMREP6Wߴ_+eO?Uo.dcuA9+۶1ɡT]t}PѪ",#g>Vζ`9 YCT[ bzkީ.G[wspwKw^IJliW!vwnTW,W[R7ۍS:İ#IS|zm٧]dW}[O_8*է7A O/ZU5oΧv*@wOoo@w>3|]jr:X@Oa4Υ/  \OԹf^V^2ٟ4RW/WKFv^Ϋ_֟ ܾy;~=^JĿd}|ZݾyI+87bΧ;>]~75ݨݾ1.7ިݾ]ݗKύz.Qo ?ߍ^O}Pm8zn|z7  hZo?5&/!Oa Mu3QO)wAu5 5Pf|hTi#M t0F>iņ#T悉%閚Ld`bJ<6԰^''oTV'Ce>)?)Hp뮝\Y)tyqRYQ71fTG=91*U#=tmjҞ|ڨb160J8*@U= "IbŊ#)O&ayv1Cyqg jh-aXFyR0nR46*ybش1x#'Ҩ'u$Q OZǍph%mTS'I'QN&Ϩp'=$=(1J|w[6D/nj[I-N"^zAzTx^'-z c~Br{L,Q^C:i1kGl7п?C{0F99;uRC:iI?$3f==TWFeP 9,}M\,wDf2_M|CU;i CYumP.( PnkHrO0@+zrgaډ+J |Q{aVOl-6 pf{"N娐ܫJ& *ܦ.Rk*Q668vw-`Sp|(v˩Qmy(A"2dE: (G -k|lk1؀hqOJE;gνemo*Pܼr-]-OdP V=2JдRe=٦' $'+nÁcm0gBJ Mxj[68PE224ԁzƆ)l({BAA 7eh4C))A/9y uP&=F8DQ/L9(@G1X(@cyQAx}H3>nQї%nte Ɩ -50uQ"AՃs%ZP#B jk-9"ND9J$8DDDщfByq5zI>"665j}|Ea6_RC<]sE$Y5ZEe$  (D%C7J (e+(Q( );wQ A5R\P Aanq!| ./or\rys~{~yQ| g#/m\cl0]6PJPJ&GnЗr+S1<]4$@բxk_6e0TAIAO% b5W{ _;=)'ΞY4GW *Hx9,^4Sp hxɃh t+v`EEt9k 4 6Pz+x h{^@up;HBqOݓ2 ޸ ]{bG:їP; zLd`$8{QE_B͈*>%]+}DyPbrG5Zې# X}~B+4adq.4 @\ȐjS/Yi$ p( 0Sl &|v(U " JՂwlRԈ*Ј!HՆ|^h 9b6Bv{I ' ^~RV)Ļ4Ue;X5qG;[`n0lM*]VP:0#4YQ6$jp-5wdp[ىP[.t:01Lg.烴^K8zgk^.DkZq=Dk%6ڛ\I\>j+o/y ,[czp؝l PLg4Vdtն_#++@?~pq|~56T[Xkj|/76 7z*zr+uV)VA}|;/ c%Yxy?L4nUonRWh~زs-*L>B6؊)յTj9֓t5Pct˛j&sJ55.tE&ZFФ+cM Q74D#!XSIߴŏ #|{s;~hpɍhƱƱXq}k70+P-au(YwGWx~cZ{rZ˙~=!R!HڏJ,qU_rj=b~S{B!oqUumG:O/'tU7hڏodvkKRgvm]m{ƯGٿ_Io5kl yoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0127-Hoover.xiz000066400000000000000000000046561506652756400234500ustar00rootroot00000000000000v6=_ԕ([QmѮ-ym9m"! /*/ݯ ,'κ=|a.=/ {B'rw89N'뿏u;.M)|vG=9|dFDhPkޣuI3cyS}4C g@rjXqBx1keVHv&azG@13}dIc_ adP}_r9_LbiAc@HDղ '/%^ʂYL0I,`!puZ$V+(k왖~~.h@&x# }̪zqus1-7(` u(y/>a M}_֯_/ϭC+-ͳ(\N`>M,/LY2ׂ ZfDBf'O+HkhZ3sE DoPuQ۠.蘎 !ހ[fYH ٦Zt H|b{U+RA]M.I#żjj]+"g(Lci|p#5 :/_%  f]`{G>`ydK?$\5 ;z[S߂,uݢEwt'0Dw4sHN8rGZe G209_NCcf3"pL=jVQ0g4t^Z8&o2HFu J7xI' SA3iE Gr ?2ňgWLf'BGY(M>BzD4NA"uu?UyHJqO 4'd&h}milP>VjPlExBn<,C[βE\(f);<@QrW8>F''2MEiשX{ё}8 JT}G#>;2x="3KT}琫7zGIjc{)ymYa4G;P'=xj)UFxp51#Zp [SUd "H/\gRrNR%'3z3*٘P1NGaCJ a|\Ę uS_Lϵ *EvCrR^A*#xkB:b\ H_3^ m/E 2 ն(T1n khFQS@-L ]ܢO,rÚ:,_hLEQdI[DN]N=Вrt:& su }ۃ, _]gy-ΣZA_۱ec^АfB|ҋol Ώ}*UhU 0菇ZkY~j#5Uz9x6H%Ѳu(Y4>yj_-e+ #^VV8y-U: bLJۥ Ubt)>Kw)RyE2)'̢Kx*ߥ Jo2(KA~ŭKd6rW2`B/JsB3lHtmе\kfh)7umе6w+m3k]ҀvY&o5P⟗4>\u )Jo9Zl/~'˖Om)~mjPyhѻieLylY:# ʟz5 dk[6-}SCHyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0128-Surf.xiz000066400000000000000000000046601506652756400231210ustar00rootroot00000000000000\Ys8~e$S[Q-y-9DB'<<{~6(%:n2#'߳6,0,ءqǣ\>?Ǚ;4T;ak7-֑܉Ɋ7ilSkb't:+w Qĺ#Zw-u4< fZӈгu$+B3[VSOP~c]U~L~0Άй>}",{^+~q&̏ɚE $J}zvcDbliS6t DGOgțеFxFn8 A{8MCbit=5t{>d0<}1 c +բr5g^݆_5[Kw,/ В>(ɉWkN/?I uH 2݅f OX#`3?twp +dvJ+p@T*͆wpG t TC7 _sbIEUc8$ %˵^U g ^L?g!! ߎfF =eK45 :x.,@ং^$y` 6 m7y&q=)WT[Ɖ {xi` :nBf-e jsM\&eky!rqǟ!60wL5S9惲`jrOW(A&UP4݌Vذ(N-fh,m<7`?(&#b"ڷk) U7g@k4z]d 'LqsigĠS7y'iyΑK4<{Fge"c1O,3VЈyjz-|gFX_^xu3w%"%?w\:D턫υ;O'798y ~ Jz%朣ϯsCN[͢;/zޙ4w;;=_S|LwwxarM`Ong@0JAR (y!'d&Ig{]z@ED=RNl'7{a4o_(nmrKM[ud<_iUTD>&as̈́JV< C. DeN5V*m|!rr;h %frhww@9T$7Ũ錢o Xa vY/;ƹSBvY;26;O[*`g<**`pip8'?i=Fj+MW[%(7.w]|[Vx@RiO>рXM#~Ʒ[eU:yU: #*H+^luɉvlpa Nh'xAr }WU}B*wYy_iP[`ߨdFq]BNNG~%ŴdkrPuUYwv>)`wW߳[zw.8rK]8ڝ%"՗i[n~G Tߒ J l|j`#~ T !szilJ)i.6!/:A/fiu;ټvSNy1 ͥ5U~ꩂhaiDDB.Նm ]\AAiW5mTCoFh(dx]!?ntbu᭑P\H !?2uN`TPϐP% rwA݉]u6-b@Shg.즍7 ʡtnGMgRWrLmo6 u ; lV>T!lwpp핯]V/c,۾ez\(\<; UIv/pv/nj~=s#]15֤'Sz(탋u#=ӼK6cH?nX7f|3&Ԍ۱Wʾfoh~C쾡Iv_&wq0^(.~nn;Im >Mv=7 %gV~RfI*Dyoshimi-2.3.5.1/banks/Will_Godfrey_Companion/0129-Scaffold Pole.xiz000066400000000000000000000037021506652756400246000ustar00rootroot00000000000000Zms8_c>`2ӴC %@.E#lgI诿~dC{ᮝitj?Z]oz$Qfj,:ܮ}sQwv7YÎNyc3 FfMx y1Zya̢$ !ثrYa"q=NM[PpĎo34 ]7#nLLx]7`8MnozYn fł5>y]O4jo|zOEDG֧E#njDepcǰFD@ʓǖV+.[7$FWDx+3rWgYCVAeJ&"f3ԥ}[5%҃U`H} AZp)+򤤲ԦQH@jsfpMVs#5P>@27B/D0f^aKp̓ wV!9nٴDo'{Oؐ@M,>?=>^ E\ LUr:9EL:%#nh@>xYt+DϮק&kPEqTyo`Q@hz3؋Pnga8j_YH7o~!hxb&b\[R˾Fy&%><^1Аc"Ҩ$@TSz'abp=Cf)է'~Ά.1ah"5\’P}Cq+.I (|4yqB*35DTܵ'|BA:XBF7tj7͖Dtx:=kI;nvn^{pFʸp2=vJuFERk}5ZoZKCf;`Zq/]28 \[U,,HM7 >Qh8<əkGgfl |j1n>i_j{[bޣ'}z8ѭÉ>;ÉnNDC#7}|3>`J/[ܥmug^"E55u.?oW8Ed f-7QkHK/7OaL (yoshimi-2.3.5.1/banks/chip/000077500000000000000000000000001506652756400154025ustar00rootroot00000000000000yoshimi-2.3.5.1/banks/chip/.bankdir000066400000000000000000000000051506652756400170100ustar00rootroot000000000000002.3.0yoshimi-2.3.5.1/banks/chip/0001-Fantasy_Canyon.xiz000066400000000000000000000074351506652756400214410ustar00rootroot00000000000000]Ys8~ϯak!HݵL:j\YNEK͉DjHʱov"z^&QG_hfݸsM]pt/WYo\^翾]ڑ V)7&/ngvȾsmޭo᭻qfkY9aԘkzld_/v0ӳŧmkֵq7iE.t0c{_h֗_N֞O6<i/gjvq|:ƾ6ҵ&N~w#ˍMhmr0 vǃRv Bd9ѥ>ÒP^.M;t-UgW_>ήӍag0=OImBq #{Lnmwc7X?xo|ڥ. ;A,?aa'`U+)^|?Ono0KyYEږhK4k(O:}j6:}8CyDN"a asyȷ/_a:Ҋ|R&F$mDu(Ɵ><2-w@qֽ=ks>s'߀ &~6oGlxz3w_у[2BHu&^[Z@Ww#pm0r+F|C$Jdy܅l(к V܊t>fg_g?0ǡ/\&2*CڄͶ˩]XܔZYZvi]>!LLckUC7"Ri7ЉNn]ܯkm_Q0\#yw,)IlPh>1qZsmt+,N~@r3:vo0Dbg"]gFr-3noVwr&W":=b#j#ފѭW%)|@ۛڍvڮH0lv%WqӏHT8 ߋ8*A! RI%& __fgoe{D;!dUh=w"e^/T >G hAe/9GJ%,n$ bDߡ| tQOH?|od ;aTa AʃXwc)_ mۻV.ˆ9i;:;d1B(A]r/mFB9-KmwKcљ{ouxY~p{nmC8\JZp3C*p^B"m~C!N>_/'%8;y7@}͎yndv㇌B3.̛PhNwk[zn/~,J\6TiG)+,/X>K%|?; omɟǐ倭'&I\CƠclȭo$64($uB=oĉ<$}_U t:& !: q8BȣQǜ!D٠9.Tg`A~ .lG\@$dKfbP*-ql!%>F BH3Xi +\?X^WI.Y[ Hbяb`+Jz 8>vB>r_30:}*=j8eVT%(i!.`Hۄ]@mzߔ ,i`NN ݗrZ*RB t7'$? vAՌ*N  A165[P>EBPp<0R,F\mJOuS*]<"9рZ1:()^GeT=ԥ C2p P$mIK$!Jb85S*DSڱpHCPѦnWLz@ L]q '&0٨XT5MͰ ( (| ACnIe/LurU4$H7(>LE`R>3LK`R *4.4#!N ØkS$]0F_(QiJD%1 $u)\I`u[ $BFH@IFFN%u("p%Q'ĬY %"o7OPı#@3R'!7 Z5 T8G}X9+IGu`)I :/@) UҀƌ4c>~8CH-}P!%1cTPKifjZxV T ~8.VݎmҀFE>UH(JtnU%P'FXVJ} 43@ɠL3J5NG(sX5C*.v@" W:fhU@|b*tc@zˌnX]*(HaRK E?ެP Jg d eR8]^%ٴĎ8#C㤗LS1h@q pq JV;NAq5{)GWAT=$Kh҅j_OJ/':eAf8]^¥vI] aPaF:^Wze+×F%K﯄BJƗw$s.% ׵% y-iH4S8_ J7ub[*f"Ϩ՘Ux`xkP'eE 뾰S}]Tݵ_q^h E^]+{P^ӛ/Uӄ;>('^fCIeQR,ug!ƫI5Ej\2>ʆ/Gv/3˘4%`Ơ¯o=xrw=ҎoUyoshimi-2.3.5.1/banks/chip/0002-Fantasy_Canyon_X.xiz000066400000000000000000000166501506652756400217300ustar00rootroot00000000000000][s㶒~ϯakaF"%R䔬Ku<3's^XDL$R)8~&4Q@}|[-MOÅtfnp&/Gy Fv뻅ʻ{r 7??tr=>>7o=]^}ݜ]^Z6 G~:M&S?8[/v[`OH Da][gfzu:ƕY a?òzk*r(lW^fKXΛKb`g*gwbNcBduނSuvq}s&[n/6n&>y=9c7xb돭Qu*s?6~osl:w)GNܠy,k?=DlpSp/cH$*|6o± Ml#bΛ7aݹR 1_0R;L?|WKl"NWXC|TL/h '5ҫmLQcȹrq 8.x)Rn>M*Op! u(ZOl|6nW $gh[u'Z[s?~rؔG\Pں߶Qw66?8L^“Bv/M\OY<9rDw 4_oZ{L/>O/?NxOL |~LBV,R;3,OJL݅p6s#!U*xS+tHg&ÑZo5iT:qLYqW3Oxwnr|'Y9-9ws1:zq8]ZP=tV[›ՇYvȳI?dZ7d]Lu2H<7C,h893Te`@+LvOf;3wc>hz\!8NQYXYYPνd?Ɖ7yI] |yOp^\ah/.vQvwj>&EjL Y!v/kS@&3)+^'Zʲg\̶9,ÔD-QWb݆2Sbt1FGeeȐ|y6o䭰!~,d,/Qqu5¹xyy4}ѿݸq,!Z=>]g-`^! %/]{DcـdcXrxNKMŹQ*RZ7VLuОuW4r$}<$kPOgßl/݆sdUر4$El W]C׶- dļaǞv0؈7/f4l&a3)ùca֨_"p'WnE_\{S{[W]^H"/n{ X^pev@q,9qbBRuQQUl/›}\QlaD#B)kըU3ZI]9=B@鎢LHjK~ z' H"Bئ*KB;\]S7'0b0 'P_3! 47E0 P?7p)XSԽQ_}Zml4X!t  E()GmTM74c{77L2Vdҡ$nJ0I=N<JXҤg0v0%I c !ocP"Pն :CV@LpZ:,AO.{[eD'ׅI}`u8 S:A53LK`v>84Lt8 kf9Lx@=EIcZT?@Ra"IU6HTЃiFPRꢤ!6BI r\Fs[H}V @xhyoX5ϠPCš0Қe%N>$i53GI'ug6$$k pAXwxݰ]01L$΂]PJtB]Ǭ1CöAn&R`wSÀ)YXt=3J{04'CzvAͭvh[؍mhSªEJaV%cmbPJԺ@!neaWa*BgRڃΩ9J<ưu@CPð(D'u u@%>(D$6>2kb6q'4|[eV%tʌEf~Y&Vm<^sp*Xc/ vgӒdSZ2Odd9;) O;))uOFnd5;)gWJ^w$H*X4q.Sv"}bLRW {=v  լހU3O;L)j .Z^eW73AW١ 䝜0? 價 52Db5 ⬆;e8Vp/AjM*ݤPpqWVe`VS BjX|B8R>Ei-8 N8 NRAN4T2;]36lְ~";u*UעzV7dPkzEbt"㔗&}88VE)'GWՃɤbx=Xu !jg%"rN)wf|(tgΩIdfrʋ@fIYąt©ec3<-SN\b"Աm+R.AbStmؖ\t9X@"uF:EkH ݽu& l6%,gJ8D%l<;= -#lW]YAf-h~ H\oJ K<pf;y!P8G/›}\v`Ǹ1H_rIA%t #0sbL:vԎuj񱎀+T5L5N !]/Na59*( ab*ce%D*$㨍0ͮF8110J&DNJp@LB)p2aΉa%]hZ}E? !kP#mkf(!2dvj+!K6;\&rX S:@s+I{حΚGp=4Lt8 J`AT|բ$̦=4 jkAv]N`AwHb05%);52m:]Jf j#()huQةiv>>"~bW;( [get(4Db3h:7\s'֜ܵLǐޚtEu83 :uaVyN: & ֚4 PJtB]\CöZ{7tHWnuÀ)YXt=3J]Lu XxVc.<:T?H]wa7a76RS9*xu!jAU@6&@ z@”0JC0yk鎆mP$`ApRs[AU=P:(D$6>2kb6ֆ`ׅSqg*zs"O:O47^<5YPtM->M/SH+ gӒdSZ4P'K2O ǀ~2'˶OI~2朝t+'#OIŁ~WI]j}ú"?wIހeLU3O;m$ b%ț&=~̷aV9O *1a*g; )Bkt5$ZC5$Zsհ VæWX ^b5t7Y嶷UjH>G~'yxR<'VÆa6sj؈#VC2܈03Crհk6j a+@T-H"V&&:!VÆIj;ojظ VCq "V,9Rq=_ vE-A%@?e~J1O谳b5$V~7ev)\b50[b5^Yg7쿔}F8sɉc8b5$VCb5$VCb5$Vt[)jx ܅Gyp70 fέ7c"ᷡ'CT6+"3Փ#P<etlIP*{ ^Tl0Q:/oj]^zohlbb+hR5 3N諿ķ0I4ԛrD[fbP*鑈[z\U}/ct9ӣFFBp'AEc"?fqL'M{/C@m&+>;RV-Pjc c49JMN`s,J}61PbHVDkظ* ZC5̄h K4%lʒ. e7ΣRŒAZFsF {D6ǖw!xH_ͩugΊ<~h /~]#DkXְ5L/7%鎶u7]T6m]\\}0qyvL?)sƒ= u~#|+t/B ]|7WBׅ5ü_Wܐ+H{t,t6o8t? By aF-zEB)n B\1 uR_XJHs%\EW>W2~_Ȧ/`W*WxI~TpncVeƾ}Z$ߓ \|bGڽW&`W NhS0Z,_-1yoshimi-2.3.5.1/banks/chip/0003-Chip_Bass.xiz000066400000000000000000000054631506652756400203610ustar00rootroot00000000000000>,`][w:~`x5Ђ 沦Y4!N@;yR>#ce,H6ֶɶLyDou wi:W޿zgg\Σ^G)65ft'+uxJ4fFHM4nId5_}vi;ŚƾCqA,9l6R]Tb7&dz5-&)#>w]2ޗq%5"F R?~P;v$b0nt3^ -#6 #:aI9`0]hSff\@>( ߎwDdL[PU|qf<]lc2Co6_M A𶕴%fޚ_q?ț/oțg韍O;/SpxA=G8|nz2\ij6}d{.3 mdp~d3M a.c uȽ% 9Q(Ĵt,>2$u8t(1.%<<]gbҧd2]4 ?)8sustmc'EHۧ=,0p093Q"ʆ049 0~_n|+Rqf2\H۳0.k:d2\")TjuB{FAy{φE[ u7s/i9<A.( Tmi{*F{r,B)0TJ*l<RHR\yq?`{F ͜=c>Dǯu j_QEQ'è} jr~*LN2"q ӨvMda%Z˙昼uJJ*C_JS%F!tW\yqoOMek8Y<O+"$ S'u`0oΖit4~=bǕi6^)@U1$lRp)MGڒ?> C:%cMiΦh*n/"'m(JC0^Ä)n`V .%۴xBbR?{$_Jg[Ehcl#9/V-ߑErzĂ~ڑ:YR*s>>o`M&<<(5Jw4?+#kA%d6q[i#Όmu}mAan{p!51_o_ح/ܱc*^WG"ܵB7THUɺJqHaXׇ>c=Pz5r(X ) H0"D'ɽyi㫫b.zL~ϭ蹥<|%a͝-"/M[ }#*.i:_G"'-/7Z"-(, -+?=%tI$ӓ sp0ڬrї em𦅽4`i.3/d(Px6ƀ$8o5J7jaâQԉk%u+Vi &4: 4EQ-ElOVȃ[[Y{RD*< ^Y&kG"v%B5P8T]"3T% ˄Eo&N"v ,^2ԩO2tB i'shx90ՀNҧU}U*C.J#u=LûZρ9`L8J*iu{'+hFmeA%ieRe}ZW聲PaM a4n+i* {讲Vj$Қ˂tb:Kul#.`{V'UHJI&ʤJQ) Ud( ?; J^&>m @{P&2eatY\Q""%i%9 IkI}eA2I 4cIUףCZe.2T,Z]^)-F+s&>ZE>>|%|%||z'W8{n}rASLʧ0Jp͟pS|yoshimi-2.3.5.1/banks/chip/0004-Chip_Bass_2.xiz000066400000000000000000000041261506652756400205760ustar00rootroot00000000000000E,`\]w8`س{рMpJ&ҳAS[v-9 WeI8v|ӂիKdw>Nz}8k7YMm7q9-?ߎ۰m//{?}l&-E-u:jbnbָš|khȮqvdlĠÌa2Rj6.'{`%R%0F!';ll zqQf|;ԉZ1·7xI rrMl ɸ8LP .G> e\K(7\Bd"2ǹ+JHx?;:<=j M5.twO)z/6a>9G֮? ܅\ (&A_CO }j }9g! {w㓌KZ7?(db"EƯ}k?eJ~g's|lNlҡi10,7 jGB){GvE+oiPS2 }!QB8a6ʈFk->OWE }s{=Y]Gϑ&I4. ^f5ٞ+K+0bY.0Dݔ,*6H^QJbT3Yk$G؃aNPp„.XƁ1j9C:xi|=C׭BɚIأʊjȘ&1߂26v!( ʈlHSE"[ﲽjo힫&"U˒E0Z-.dE@N)N+$.4چ [=O+872lUFM V <%%;Tڍ Eh.!70<&$ .@UBVh+_ǿߍyu&"dJ7 , Rc?ҙ7OW(*PUWvN3S/aE]^>e=)DWk)fȐV}2CΙ.qX/(ZʝDB>@dD=(W0q$[_<!@oD%e)U_(^0ŗFi 1p򾥦?I Vx1#Mg!R1f[ 2=8PA x -)pH{#^uMHɔE7ՙzREPyA!R*fZ{ @SYmiPR\.09PGzܯd}1צ_sĽg:=׸6G^^̊,/V+7)J(#g39S7H_c6SACfHڃJ'D V+_hEtT ַd tUv x%6 r46U&T=_M6̦BF38mrފ%Zq-}Ƒ}i=wG}x\M?xQ*!2=,;vN=snј_ģ/#[<ĥN}BD=Ւ %ve 3nx9tvPwr7jZ_z@"jVV_»kV_/5I} ;%jR#^{*}T':уӉ6se0&qŒ4N+d9=jzt< dd!7a@="A 5߃׳T"O@g'ԕ| %f}ŋ+sE euxad?IλS|ZNSN[ּb:gSQS+$S'cP@\ n g)?;SIU#TC>u)v}BEUAXh b_-Ӥt?j,]~Ct:ga)J`r0-qVQ1zwt!_ Llڲڴ 6ϫ,l U;`Ax9p!JP!uR[]qG3cϜ)Qq$Š3P'I(B{(s6ݖˠ`Jyf:ߑh4ܟ`ozDȡ]ߤM` DUcD8s: 4&~Vt|bj7PثWs%ј$?^o*|6x7oN4wc(Jxq;x>gƒMA21Q/R=`1)=.ß75V<ΞwsNBBT5b;%b Q>k4 v]Y{fRV)FxgažkFCu2?= %?TSOOui*j&j&I$-Hs58wbîZEA6j]TM5TTSO%?M5M6dSM6dSMIZ$ijTMbD"j&jJ* $֭UKouV2/6Wj+ս?]Ⱦ@, A]ko` Ui6T}Q ^LE{2eGozv:7G R}ÌT0%Wpq|)D?b8!¶"5%‹KemJ/ʩ j@ oޠZNMޘ6\p$XPdOA5f ϫ 'b<'=W|s0Yjxekǫо@DXTP`(l BoQk\vzQkEM `SohoMmjnSvZԪݦV5jU{Mkj^S.viu vnO_ayoshimi-2.3.5.1/banks/chip/0006-Chip_Bass_4.xiz000066400000000000000000000044001506652756400205750ustar00rootroot00000000000000R,`]Ks8Whu=wm)ŖkTcI^INmIℯId%[D"@Aa>l['|lf8k_܍}qFn!cG6?6ft'; G&~<Ás=O&vw8ᄌƴȢCc!Aظ6n[6c׵&]dv3_LG|FyGk5l*:xq bUc+O_Hl(zyC\OtFib4Ƌe"-dgd0IR{i¯f̐L'&N-x ("5љ9:SNPݵK"s&& kӪ\n7Wm*ȏ=v|]c2w` 6AB3Bd56L#J!~xa1ʹouȊٸ頯䅣6~UI(tS.ujT]l+>q9ӻ2<]q7ayniw>v צY(9%n& qySf& *ĤRb( N6"G j<<2+NC\O -7&t[loD УF*;xy|;Cۭ}BI'#1M@ D%UO]_'Ep@s-! mf ^Lhxtl:$eay ADOMr)^u;Lh3-EO5iie#Mhd5OJa uc]T8&"Yfq6Ho2`p z:!-B,g°lQ",ϮT}f̯*Qr\jS+}BRy nW {B~'8^fSwjuSԺVGm2?Y~*[THD7[(-B]Q&sSɣ V0'HZ ֿXL%t뀄&<43F9B,H֦*rl`/4B3>AGiQ:.Q5\ܷڪ3!k ug%y[bGfSfs%XRx[ H WX)r<^7F߰JȐm::v_pYF6k1OTVŚvS0,$c FmUx n@l֩UqSp-9r#O^R.s.nV8ӐpoњE6?1Ù p<_ߎVVkO!N{i:ʖJTq--R~HףR.-|ɂ̪% @f . $,!YzHC@j z x@m{(ڿPpMlLdc"٘%I,UbME,ZE`)Zv%,q`roW t&8P*?D o cHw z#$`Uɮ* ]ՙf]gޕ:{cî|gPp0|(a&\H)  [WͧD W3D С`ZOy4ߍ}B|:~NR;U‡:J(scyoshimi-2.3.5.1/banks/chip/0007-Chip_Hop1.xiz000066400000000000000000000056601506652756400203030ustar00rootroot00000000000000\,`Ms8ZvD&ɔƖ+e6{a$dq" ?{~([C&m&o}m["}6t-ZwڟV_߿z՗Y?Զſ_< ޵Y;ɕnU^h\^++w[<޶_}sFӭ5 \F3v+5:x-W7j!y`z޶򝐾G7ژq(l|˫"l:o%֮Wj|=-swt937jv{;8s؎)/Eѓ1<63D]h"07x'ܨF>RdZX6eҩ9 }̞~=:TrurX[O)>Mm?8󍷝S=paoD؋~IZooZS'>l}tsʩ풾[rVzslG_=tl+:9?_U{γ&fVl+` 1e˱FU/۲uX2Ł{QL;UQ8Qsl }k{;\bF;d/r˚LZl=ˉM9!m*aTzLkZSNprO0r#gT{ـUvi8`繎eSC.b?/0[|}s(_Y½8.HlB9 Pzdt2&LP>1:Wdr(}3S.[푢ye~OR}tnU<2FlMC xohɄ]c"܊C}*I* "Y3 AOnEuZ'喗xF[w5--ύf4;ux:q3lq*"] 2eZBaXްdh(> !ʞ)RG- RU1 Q*(CBR7WޯQӜ]cT>6uȔݨLeۺbVl:NE_UnHOA%cbx㑸bpV@O%dFRu x6[_kwH[C.aN~=b}zn_tI>\kw)7b8+Y'38,k&Jި^r+js :vm|ے(9lr1 r0U)}:Tl b{xGx'$bcQf@gf@k ba bA15 Xck=Z{yB zk=ZbևXC!N bևXC!kbm6>@ kbm6XB !ֆgP!bm6XA Fk#;XA kc1bm 6XC51bm6X@M &k ;r.vŎsyn;b']HvC.FBtaX+'IzrnΨ;Eju֩d ujISɄqȥ?@ Fmjy ''pPi T2ACM&XPi)kj5*X j*X j5*X j5*X j5*X j5*X j5*X j5*X j5*X j5*X j5*X j5*X j5*X j5*X j5*X j5*X j5F4k$hGP#1*FXcTAC Fe4kT@C Fe4kT@C Fe4kT@C F 4kdޠ^  7`PހAy 7`PހAy 7`PހAy 7`PހAy 7`PހAy 7`PހAy 7`PހAy XӼA?_fO~#ZĮz:EFs7C?CL>zY=Յj`PjӿX߈fqu#ng3׍m\7b˹kCX幾_p=/ \ .IɓfղbvD)Cn"_.-ڻQ_2W8 nZqQNTĮbGԥR0tj]1~LoL~r^hR,^MSZ\unyoshimi-2.3.5.1/banks/chip/0008-Chip_Hop2.xiz000066400000000000000000000064511506652756400203040ustar00rootroot00000000000000c,`]sH+X.f.hM2ظBm6{1H±oˀ>h=;JͲtno{X<dog5?M/^oWg/|>^M\qҾk z4O"w,c7Y{߸v7/A^f4X[q8sWe5f}hf4ÎW7j,s﮹(<~\<ڈ+ѭ.+kw w|n7R-Fpw"neWQhWݮyxx'x<'OJ;RT[_ "Fy)=3n"˰m-V,qw:2xWM8r۬Sr #]+/TNiu8bF,U| oõFp&ʟ;)irrRңV9깻G3]TGZ|:QR5>Gi-y噪u'ߤ{U.F_ ҃uPE[=c=܄h5JIVOR X޴d'Wr$, " 'wE}'^#~׈"8FTR'ﮜV\VNƃY=(oaLy䔘K1HOwy\6cSa$\ps7ݿ8kq$ܭD[\_~B)lI+LGl;:⮎[:➎# CL1Ӣiaƴ8cZ1-ҘjL5C5Cϟifhfhfhfhfhf@LJ YRSdC!kRCڔ֫kbmXcF1kmZ TukmrXkSE1E"Twkmjuk6a5lq@Zj2Fg]M-u6d&&`̤ 3)>M@I ,fR^TWY0?L-@Iy` fQX0Y$ ̢Ƴ(,@EB#=@EAY$=@XQa= "<@bD)FbDy#ň0R ȇbHa}:ufff#(k#¨e#ň0jaFM6"6"1-W4Vb ퟯFgçr#׆l|/|'YAvF7ԝ8*'O2M@R͹BɞS=ȶPOVKO{hN 'OIԙwoTٲ8A>֝a A*َ)MK5Z\~;XS? n.ƣIoy!yk_bﴦӒwԺ/>Y{~uY]bb;r! T'T&3?>Ify}ry73rxPO)i/ɌҐ&ssnzvNܝ5֞^s2'r扳1l\x&̚!zʕt촥;mN[Ӗ;mN[:;mN[ЖY٧=㞎? XYѓw䦞ғ#o)VSe4~}lYQWQ WQ|WQWQ\WQWt劶_hI㑽d/8" IrmËtRu1ߥBi)Dˆzf#O2~PN667¶e!f*Q˾[W@:^LZUӪ($%!VSNkby게GR`#U"FGb쟜WC}kR8)_M%f P}yoshimi-2.3.5.1/banks/chip/0009-Chip_Strange_1.xiz000066400000000000000000000070441506652756400213170ustar00rootroot00000000000000]Ks8Whu=8wm)-ר֖̅E͉DjHʱoC &3ɮ2ՍF 4^5(}xn6 ]?{x{~2lͻ]~4~{ Ʈ;.=qĆʟNai6/~ox&{ܳ3;vƕ4sk$#Ixq8WPȈr9:؈N*;_\oW3ƎE7ggS[sj _h?+PI|=Vj%PF?~Oulm8k/C,oNFW% !H }GEoBaV<-%wt6x9ݦ vӎacpzoygZ{2u:${Ql_W/o6>D젪P'\A8bW Po+B kMg=a{zB̉8^m]XhF(VĚN.쀬U^`/V*S}& WWL9=\40ex^ZIȩU iE|Ve+Yϳ_$<04e 5~< @8ڽkz/yYr'D_}7C!^A!ٙo:~dA8)*ԙr[so<қa=g'b%N~bU6i(|oG0kߟ0]n7|O+0}\\]Od [F>xgF*4*&^RkwD>2ϵ"oqѪwL YLc-f< g=q< ݳio-8/vh Ӣ~g`jG9A`ohdmc$>+j?vMkx05M ksϏ3TSV&C9כlSZZGGl W \mGbL)7>?'U^%۠Щ14 (nӈc#!w֪dS}q#%M.*#%UUeѷQdk#eH")#)SQ:nD#%+hm)(lS#-YET lTn6JTInE4Ela*Ale;؉wFEɐPŔ9 vwU^V+QʑnF# +㽲[y^W.$^`e:[m~a?́-ϒ?{( gܢ̯f٩bX!5 dm,XlbJ ٖW6n l;ZmN]ث+v8 WBg\_MgS6fH7lRwV.GaS!yDa70V c d ez3Pdf6BasMšIšIe)&a$a v)5'a$aClq!aCZ k:$uHX됰+1Z$uIX뒰{v%aKZ. k=z$A0=z$HX$HX둰{DvIX듰{JIX듰'aOZ> k]I1Φp6 am@ڀ k$ HXg X ! kCֆ$ IX6$a {D&amDڈ k#F$HX3$) ^6 nF7M&!h gI3$m!Aհc0uSUǂ F ]vP9pd#L7DRsn4sc nkȬ`MZvLАMLАML4IX IX 1VT,!dװ`l] `7ɮa $4dZ5,Qsְ`Bl,MLАMLАMLАMC`Bl,MC$a4d4dec nְ`l4d5,!4b ٤9 &Ƃ $6"a &hԜ5,!5,!5%6P7k&HАMCM,!2XAC6e5Bl,MCM,~!b 3AuMC6Ů% fb4d7m 4d]BАMv AC6 k&ɮakN% ٤9!dHqQsְKIv70K5' Ll R) $ !dװKIq70K5'͡% bE{񟮦V$l l.['ձ{ %[9HYL#%$E@9DT>arzUu.ϮHw)'߫%#+`e,hNv"zL0v"f%SlOUC2+q"$ eԋ+3]%Cw5?^v=RnW!L~Nu$RǀR>ZJҥڋX}EJ_!BIx2O1'Kj)iI^ XiE,6 ^;_7W)˻sJ`yKm[YK_8D9d3+.yGBųӤ;S_\V6E&>s yO u*,PUb>+ ;Ka;3UgQó#dR:ɖ~Fdqi$[\EvI?+ZK+ͱ|.::Z[u(T ?<igCG$D{d9.GˑrD;.GO#r\}3>[EVzC8.:Aѧ6j7cQ٧bG>h1p1Ā>v>1|aʷzѧ T:{N}Ü_y?;gL,L3ٳc49.tb[~U{^ w-,}

    #r>+ VA>0XS-u:+_3z_Q+JQWzkt /=}ONocq wO$lP qm{80?#?WZ+Pl+;U?TgT'Z*.g쓄Jǃx>HPW:/eITJGx>L\]Jl'( <*Vޥ?tAZEbmF]FlٙG4zmY&t`MY-C([oV~U>d&"c[(Q. 6Vf-DŽT8?gǓmOm8R],{$|.nL#Jz<4TmUa*%J?Kj .;(C%pPJ;Ҏ+D^-۱S.&ůX(R B5˞%.asgtI[~IH]UM"B,| ˘'^"[5B$XzrDxGZfXG67yUo/c{(vE;vT.f[ڼo5\C>5\C5\C㧷,HLd Hl 4{\C!5l\қj׆$PHr e_C!TT\C5$P&F5$P=&*65TICި2\sh{9nFTp->[OaK%._ ^ablnBA Dr,,pX0蒤%.:X4蒛a٠L͚t@nK5aL횰|@vMX@ w0`Qrw׀#[.XN# ,(h8)_=0&OM'WO.\q p: uu4Cp:YG!hP\uP:Tic5ԁʺ&ggE'/;sl?7͈Bxq_Un}'Kۈ%IX_R漆f?H{5GTYlRР/6dנ VaWrM='E줄JR668feEgӆ&YnR ~q?Wǒߚ=nS+/"mKƂ*ˮCob%xDz!WJq qgIMAKo3UWGl|y̞Y^t}a.e" #ֻ+i}NҘөz*k6]{I5- K?Q['M p,֎U0%S+VRa 6|\^M'g]eXvLr5Nq:3m6-.8uCL[qKŲ}T-8A#=A*= ;'żt?8B;hE7;8 h 3t_DJ/$FBҼH/$M4#H>0_Dx!QtWTJ5#}+E=[i׌{=;lɿ^To6Q}7Q}&o&oo"M^3%DƨYgj&o&'pMX߄MX߄DXlizQ}FTP+z|xgt~>O Gm]{lWmt6t9ݟ&sw2_ÊwDPu Uy5|yꓸ{x}8jT;ڨYKuz4^qA"W\WXGW_\3ߥ'QQE64QQ(僳_ͶX޿/$yoshimi-2.3.5.1/banks/chip/0011-Chip.xiz000066400000000000000000000060431506652756400174030ustar00rootroot00000000000000\s۸_>$7:YԖ|6}e":r.2% Xvݶde^][9Šwr5/Mj~qGp ؑ=CUgO>i!3X6BvG/^qvE*4Oߵ6&[zXBYY]cͷutv=-oO|5U+5k ,Dw#T!bbލG~wqG͝rLxA[NNhso.̘Y@#^m# {@<ojOX 'c"C)4TJs*0UZ;tFI11VdFu &X?Q֠Džf2dQh֤A 7Q+ *oF]Oov-§|Bdb8ǎw45B+]Xq9q-8z*VqT*( JFz,#3%1J8\]X +N lqqFN̮^,N{&&-P2:ZtA02<NRDOh6ԃy6" 62IEWZ̢ HKՁU6ЩSi A4;S@<r/sf}~JE|!>2_NƾVʗ$nS.gTrKg9ե|R~]Nu)/:O rSE֡[cpg&ęf(#| w Sz/?rsYyoshimi-2.3.5.1/banks/chip/0012-Chips_Funky_Flute.xiz000066400000000000000000000047031506652756400221030ustar00rootroot00000000000000w,`][sF~_` {e)Ɔ 682yj(#Z]<&~[N >}9??oq=Ӧe^#T >~?,FW>fzz?Øo1?lS]'WL^i?p6}dbZǁU<5t)5d^AkbǓtv7X]mF077ޖkx`VnW)=,@S[D`%σfb8G6mLD$ô#'9E&|7 jEtn˄20x/_7Exlѹ=٦Npx2_^6'3xho[4|T"T^85=vĭ{`?"Oo60]kK[¬< _qd!^SVU e<Ƌ4yll#!01ti7-4Ƌ]4IB@l؉=3oRl}Z7 5oC.9Tf(w,xI]b Fߎ71ɶJ`ȱo봄{p15 Dٙʔ(2^5lC,44T[lx~*ip׈)Gn98S {p;jknlj(:N<ځkd?|NPu+iO LS&͏;Pf:1K,=xeR® Y:'wdpy ;ok*My ̄"Dc_(;pjğH޼D+R $ܲ@f3W&SU\PE-x\drqn-\9L|}Mm,ڑg(ijKم3 _>rּAV6J$@ƱL?n2``p*ݦ>#'] Rmh@/$`Kvؙ,DC OS@&O|I9*=1KZ%`uY' Ebqj՞QUJjUBTO7 B QY*9h4erA&!LG9GMN buLOP1%70z Bw\e^<DG>%^+/D_/\B/%%2yu*H;ΧZvA*?t|=.`#MڔvK]7KVEt n%s`Mw_omʞhe^QE &;x\#XKT NVU&&~,W\%Ù8Ж>j>Ij{'I-N?O_TC2˟s3U͍ᘰέG33p)"!H""O3J@4 %I hgg[ t-n TnH;j۝"6F0=F9268sz,Ϊߦ([I&nI&Kvԭ_l=R~oMҷsooI&雤oI!}=}JojR*V IvN)oI&oogzoIH${MmCn$wMrt5Vv$wMr7$wݪ~ 'Hf(/uӴ&Goͦ E~ZEwyS, ӽ̆ NN`1{u\лH*"?ޜ;,Oey*SYSO@J6 zjmS=5S=5YȢE-hy=Fk~!BL#!jUk@&j& TYU@]N!S+, r-tc_={=Vyé_WtH=R}ET_'3ӳ Gb.0$;_縄ѾIڢQR;dj8-\[-M8[0p)Zh?\Wt(O=Jv1圧6 0\CWz޿mڙ^ØoՇ3Cyoshimi-2.3.5.1/banks/chip/0013-ChipSaw_1.xiz000066400000000000000000000077621506652756400203110ustar00rootroot00000000000000]Ms8Whu=$I[&̅EK͉DjDʱoC"E _SfMRe& F7˯e羮μ޾}^L?]j/&1o<=zl-뵆^یҮYrUuTȼ^ G鰏+\9sǤGu,=4+\q`].>L{gJ&R~bVSΞ1 lXHqL{YƧAZwhsD칹[skӚM 9[pheNz4,0é|hT )\[6O{]6N-an( <}*:,>2W5denGkDN[Cۊ4Y66b0Fh:F[5{G6%H,BNrᙉe^2z]J5r?uz .ksCoc[ܬWjo3A¯>hr)ݞU΁ffm3URO~{7dS+g8~u#YF^j'sl||薬-;ۙ od ir6^{ߥ?:k3Y?F30k"? w:'#/1li,|a4i5r=Q,|)7EW97ٷpfV`z~A1 2Ț9eٻW22|eϹU.ڲ'ck(5S·cw]oF/OWoF?_}zbPu)j;e \4/_ggĆ>qG=碹G )Cﷻ^i=QW]-:[-?r]!ZF$#~Lf&7ŠS-eF!qO$N'4u#7l'2A?Wע (a.n`-w&j\*t6﹖;ӱ3 s244 %c4õ!H0t \`#swɳxUkvpv W/ӎ|+nȯ,$cۆ,cѐf,(ZfJ1e.5Jh[(5QkD)R\f/VkZ*5ڥ5MAZZkƢ!X4nCh5]QkJjm5Kq]ʮQƶ mk(vr6Q\A܁\cѐk,rEC\cѐk,rECqhZq;.\cѐk,rECh5 Ƣ!X4 q Jq?m.҃\cѐk,r-ڵ\cѐk,rC!dF! Ƣךt }5ƣdqEkkMw#Z[0ˢ!ض!׸`Ƣ!X4\cѐk2xeBt^ҍ[ʌ&q<RCqфu,Sش˳)i8d:ddu<Cp: щ(&C/:P(yD(P 8W (W 7fQFXh@<(P L\4s` mF\c(@1x4mm “ @#m#7(țap{kBt$-C2 dz2 Јk<pv\ۀk1Ѐk}֮a\@V ZL`u@h`(|.<1g(Ib<qG#h5kph52Bt3ߦB4s5ƣX2 ugXpZ4F(P V V F_{oh` #k(( bF ez 2 Јk|ۈk<qG#h5ƣx4kn6,['@@لmᚠ`oA|4gRˠ׸uLP8m ,P]{w/ 䯱s 0Ə9p<&wt79mng!P;(F1n+M6B&P‍+ t8GbME7((7&7&/0oZVԨWwجhJ ;/nVc G o0JSԩ#$ǭ I1/%:&:/#$iyl]6 ԙbYd] 3v'S$S XTWImE5C*T_`XW׀2Dt:~]oIRJԕgN]fb/LKQuaƛ$ToH+DȻoז 1t'uK]Yʤ02bRjP4㹖,Kۥ]\B6D_?)ypRa}W~(Er%~_ɒɒ_Hffl,>j1k'(#ǵ=ªzhR$d/uLJ ӥUJ%CUI mg(&;@zkK*hoI6GaZ$6GQq !4 pQsF15RRd|" sJCV1oD5kjKβiSyNpH'z*GTpf9?U#>!N$ҩ.8)#elr{Im'Ttš(KǺڤwʼn-!::x٩O#>4b>j kyp0~(^b6KTqS- V.}vu+^xLQo+MV};p?G/i3(EV9@}ԫJ8}S|GZ8}Wz;|Ʃo3Zv;U>_Y(;3;ʩMWN}7:S_Oʩ_cGQo`ԧ%?S?h_O"ʩʩNW*Rȫʩ'=/VNdu>~CHW_yW_ykf]>=Mu7$Izʫn+R8DKȫ0gܴ$7y9ioo^^[+h25OttN!ٌ+踪`8qU9GĪdsXu->ǍQ?H =C稻]'r`~yP}~9H>ilGggTZQJzl'$66*r~j厕}/w wK}%o3O-7/ә() v<6ƾC_8˜8kr~8{I7All|a)is='F%3&+b3]oyyk,\%{NmT8k~=7_3JCҤmwn2B"g֍l涒 yi2}z5 K. /ߏNsmƽiϝX11֖kxvu㩮V`csoE=wr3ɺL\uq ͺKo&uJZ?~0pB֝ݙ+۽Uj.p̂Z-Bs[ԣ1!sNZ|vmjGՉ48zq9'bc4f i"i i|dˉ9U~:8OTJ-̞{i[~LѼ5w6TC: <^G`3:͇6*l@MIuڴ:iiRbh~&x\W`#*&qn':mml+dܾ@MczLmq\ڔ dq;^3˼F e[ `=ldmɥJsz .ks]oc[ܬWjo3C¯>hr)ݞU΁ffm3R'^# YN_kksתe3O4ݒE{g;Ӷ:a !2MnK_@sﻴGXc|&+wF_t #QN0du<5-ŕ/F>ͳF5?c< vM}UC{Me&<طl?_zYLU22\P*-ڪ'kck(5S·co]woF/C#W̯-j)O96ۢ.>Y&k&;[u~Fl^ܟJsܛ#!Mj^j喨IWnFۮv8[?j]ZF$(2NfږSx"u:`Ol?'ji$su-Zob)>rar۬K=rgvLt ux2M~G~rc4õ!}H<`Fx̝ .WMe{82^p xPLZ0V\cQ1dlِe,ҌEuL>/4)(RlQkD)R\&JqeFD)JqUkK+kt4U]kR\kAN\cѐk Ƣ!Xt)G]S+媵!vZ]m.e(pQm䵂\Ƣ!X4\ Ƣ!X4\\v]5 Ƣ!X4\cѐk,rECh5M%+5:es,=5 Ƣ! |]Ah5 Ƣ!8tr-laѐk,qI7G\шk<qMpךiMq}5M|4xpY4_6[6 X4\cѐk,rCS̑?])t2 !x8dszf4!x8d !6!CCqa@p:Y!x8dc0]k'h!xx9B 8'@hh@hAD07" ЀoЀny6PDh5(q4-5ƢQD|cfEm#h5 ,ۀ4'wTƗƺ( "  Ex4(9([Ǹ(P Fvl5:1Ѐk}֮e\@V ZL`u@h`l.k0f*=I1ƣx4F\ctq8x4kPD!zoSQDq9F\шk=G:ugXpZ4FnQ(\+\+\ V Z4_s5v EALB]QDq/qG#h5ƣx4FvCe@2\(P2\z-(,Pj4 ͢Q]"grO5v>G{'z;z_6(xqX^"'dsE^"@5%€G\֦)(7%7%/0nZVШOoبh ;nVk G o0 [ԭ#$׭ M1%&< p:v ;&pVM`N $=. =_WJ3dtVj&uznߊlZ5&LtxokgUu-(۝J\L ;7+bYS]l'DjJ}yS6c^]VSK=dHw%MJl|HRZ{Lϟ9LdvŊM&C0=OE"-%EbސVQw S<-?S/*=c8t'uJ]YexI|D2}Hy\K%yJQ.! 5Ju^#X˕?)JDrjLLj?LJ&G_מ̐YQ*hR$d*IFp&Cc*ҡ"٤3LdkO %EB7$ g#0knHb8M|R8ny;QLT=nxu~1dЪmQZR#xZ<4ޟS=\-3RI 'lYNOO,d.rH}༵xۄܞ@J %]ioqHd*|&Ur뱬6)~`qdsKƵN=2;C849ړ/O+iV^*^ ;)f_Ou?Kpmk^+UǴO].Rd?ygf?S*5#꠾rE9}~uNjuNWN}uPT8~Sn~:O(:3;ʩMWN}oti|C?Q9Ss}C}eʩ]ʩOJ~~В?\ G+r+^gQ_W'ʅʩʩz҃o+EVo~7>-~z>zo[yW_yWxiVG;'[ݿw$WYy?WmE ?H| y挗QԼ43/WQ6MMgkk{<^}8Mo9H6ku >."uh.|bG>e="gByyDl8#Q0'I'lt2J+JXmU8C##W@E6ZCٵܱnjwUGw8_oo~9͋`?yoshimi-2.3.5.1/banks/chip/0015-ChipSaw_3.xiz000066400000000000000000000077601506652756400203130ustar00rootroot00000000000000]Ms8Whu=$I[&̅EK͉DjHʱoC"EP _SfMRe& F7˯es_׍Wzvgqo_?L^뿾y?N/N.G?|~9 -Gqu/W֟.ǕO*ڄw fVbZ.Ͳ9+e\hkI]뵸PɮV::]\ mm-k_ׇޙS冞>AK_xQ2 _ 7z;ëh:5qe=+g(E4ftB{k77vi ,x dڋ=Shg5AsQ|{ϙu<xr=p>LM&2G#uɝ_=,#,;AlϿ6^ __֫ϯW/݇>3O-7ҙ(%>Iu~,s:71HtXy Ėf K)C91*]i\0s<לzSÃg2ke|ȩw :Sq~WRCR;7COL3jUFD6sߒ yi2}z M. /ߏNsmƽi̝X 1֖kdvuvܹ"9*řwb]mrS%.ͺf]7sGmgOӄ{O,py9, [NB49cRj3{nҶykqmZ"b+uyIf4u탞oMsT\V' ז0 7]JM >xld2y~X%#5NmD!߶b?MM 4ڨ΄}ǥM SKAA\ߩtw[.<3kPfZ/p^ SF׆\^ZOenT0ܐMbrJ[xs;ܸ9Ь̳6JjuoM_kks׺e=h;%kvꔍ72p4)/}Ͻa5Lb#}5dFg;蓑חY4WFcC5r=Q,Snꋮsvok3̬о|~AeIK\%0Z[ksCVhQk*5xE`'޺ߪ W_1޶?%mE] >vL $nY3Ya7OPEϹf̑BʈxlnWllwrKԤnFۮV˟}.eWpr>ʍ\bѩL28'R['kdoLA/#jisu-Z^HsqpCk0mVR'ہZ> NaOwG(AC lDLpQ;͝%Z5 nw8nwˀ{e2A0mhF@$cۆ,cѐf,h`ʌy)юLۥFٕmR\&JqM(5Qk,JqMZZFF2R\kZ ru X4\m5 ƢK9jrZ)W ƾw)K5JؖRv%@&J+:k,rEChȵ(>ސk,rECh5MI+5nم\cѐk,rECh5 Ƣ!X4\$.^)QͅYzk,rECEI\փ\cѐk,rECq>Z5:¢!X4ZN4ƣx4L<#5hMqM&9qۈk,zVh5m5m5n5@h5 Ƣ!X4 ^?)t2 !x8dszf4!x8d )6!CCqa@p:Y!x8dc0H'h!xx9BwpN2 ЀsЀrЀq`n6e  lB40qЈk|ρ+6i0Zk<qE̊F\шk<Xi0O޺qoquQFA^ [Le+$k(hQ'sQ/F\рk}vQĀ9Zkt+@g-Sص>kPF5m1_ &O JWF\шk<qG#Z:8?j<qL(̷(PqG#h5"Eݙ9\V ƣQFż7(@@@pصh5kJIUČ(e x4F\шk<qG#h5MWSy4X ߐ?KpMPrLۈkoLReЈk:&( 6Fiv(k=ݻX1G{t'?Zy{D`[v%h@7 Q̃ t 8`D(F5*bME7((7&7&/0oZVԨWwجhJ ;/nVc Gcx!P@N x%=n%P`O x))7%!naBCֱL`|5[ |7u::ʺt})̀˸NjxYMc:tg CI)QEֵ0j*ZqM2%*~V&AIVd^s;$) VOLTxu XM-)CCw/ )#]w4)K]h!4`$2e+ض ´Uf))KCu 2k>}jrRW-x#2i<̤buiTd˒fij( ׏4Ju^#Xɕ?)JDrwIޗ}$o$0;+ZL8ʨqh|**^86>fK\k+;cd2SUJ%CEImk(&;@zkK"foI6 0knCH^8M|R8(sF15RRd|" sp%VlcވkDՖeNsm8isuU៝6:-5 )w%LuQNbsHi;+-LEO_¤ $ڤwʼn-Pu/U;&G{ir%>}6lr+.=tcrw[λ\=w>xW>*xGyK4YypƺIsYԻfүS.*SO*NjWS_πj򙤚ٯ|j&I;L٩٩UN}'o*rGѡ ʩ/:6p/VN VNAp-?_>>_9S_9r?É*R_EyS_9S#eʩWo~[^}|߶++~ӬB='[w$W4Yy?Wm ?X| y挛QԼ43/WQ6MMkkk{<^}8Mo9)$4uWu >"稞Xul.|bG>U=bgzBuDl8#0'iҧlt2J+JDmU8C#mD+["GK^nYr|GX@y*ǣ;ϯ77g[.D?yoshimi-2.3.5.1/banks/chip/0016-ChipSaw_4.xiz000066400000000000000000000115121506652756400203030ustar00rootroot00000000000000]r8}WhX k'RtqM|Y[ hԈoC$E)N 2>篫eD~mo:ÅܼmM_?{?g٧I`X\n^ V){p/~گDoϧn4w[gؽݠunW_B%dxQKhzne$5mhd8;>;ݍsV஼x񭳍]n{/jҗ+JPQY|x1<&IiWWg/|~ai#޾Zg?v[E8~ś PXt񮯽P ̑*mʛbt]H>HǓ,xo s1[ߍnű~:J\,!/8\z?܆84ֿ7߸oZC0sU+QP"˿tH;^9{c9V"Fؼ|Fѵ+ U|hVx69iR5_s]mcB!g~cF(`~,8SJdSŶʷ\~:"z0(7]8}Wڌp >;)rbYC]l  ,Oi/"IKH[s?w#('*|[wm zo-(BsmwI*|>̏@LxnVaϝ;aM]6'&'xz,;`S1Ex:sHRf-(h՜l!JCgOs|E՝N:t:_[郎E -,~؁?u!,$anțTp ,a)Ya7YywDgYsu/7=fH8mJ\ j2HWn/k~uyˆwWo3vv %C^w-݇T"0 u6E J%<~(~>U-^ ĩӖ'7'I%܍pϦTRXH|.,{x|$4ޭ2f$_,Yb"Ɖ7A{Bx}yr]^߈ Ҝ;?>e>޾6" D=\$̚ g(yT5 4& K&wHMNi#7"y^6$2e*>aZiv}a Lm佉9u ;)ۉǞ0 MKi_$/gWhx1<;NJexbqASډ9ᐢ0uzUݐyQjͰ{qBZo5rD\K+ZFFQhkzr-=5BBQhk8C5qFc\Kx1NqCHqC6%Qu\fFFQhk$6D4uhx~ NMe%];8R3)t GYG# GYGQpu|l94e GYGQpu4e G& e];:ތuBwGXgSH;QF8WPa% Vc' 5jbT 4bj1-G \1QĸF1hDvǰ0hk4i0 r:i45q\;c' <= ݠ؉BW=a' 4;Q'rDFvnkr6JH^MЈ]Q7be"vm@ZDk"wڀ\h45qFc\}mƸFZ&D!؉B 45h45q؉x݉G'yZ 45(@Nj@#\F_zok5Ј]ƸF9b' 0^N (@c\ƸF1hk4ƸF1ḫQhHo^la\3@7Nj݄k ߛ 3єebpqWMcrfX&^cY=39ư#r? Otc{j [C@TM,vx@zkP<],2HH"c9zn@ZE,ј/X&f @0,; 9[VH sh M6=vU*tSwƍ\TV)G{key"%ة ,+I&)tJ14[PbeFs?T^vQ(HR8YPK0OR~FJo#owv9:P+XD\ZP nf|˂v.q +ϟJp\g=Q-? 2Q/bIŒX ݺq\bחOJi\3-D|i+ğh綀eD(!%/BPK;E/${C{/z/ދ[ ཐ }m}-OyPv^_8e_mM_dq1w_t;&D7 \RAtjgqu(O@nX=ȁE>iFd:B;07B;0 lC_d 1B;0t~ɻt{BpK7qB؂~+ )d&YuƳ yo:q2qS' TE)e@ҵi-Cu $.$tl[v`L;S3HTYF2H;0~TF&áځ;:C`Ie:C`GZ p}˷ֿ$/8DX{0\E`=WFn:.HEאq ()'kJ{0 PĖ\C-i(D䏬zox~[dFv>"w4 C0 C0rQn-:C`%|kPvadwJ$Db5Uͩ0 H A`:ô 0RȶM6]pLSg<8ڃ=h>AtEd:7[HЋc~O } DZҷ6\Аq} ӧN"1|^rIH&ػ 7Kr ?啎G&a<7$$ڇ0 Y՜F9d% MK.#Y;1C;1CVa8 }J5?WK0bhGF8{'k91! NP)b:9cmwZWBLΑ ưV*)f}ɎNՁ$ZR8/bx2QF۫7 E=ǧ'ә9MN`Ap=Z_a~أ\GF}먖|t=hZI;hmtu]~`O8 'd41aLb•eR*lTh)mmʶڍ"' Ͼ;~?Vy }0\,.W_/} yoshimi-2.3.5.1/banks/chip/0017-SuperSquare1.xiz000066400000000000000000000052531506652756400210700ustar00rootroot00000000000000r8갵{eꭚ8S,ըƖʼnD2|8|6HؠDid08t o}njl9gue;_ݛ->ތk}v5'X$$ɖf]|]#"Qfg$X2$6qj7$|tOR~5z-3f_[uXt6.3G|u75ly}xq<;ڌj&4z~^Zu P~87x1'S5nɓ-ۄO!,/fJдC Lm9,x`IW+h@~/k@-<ȏd T|q{w5-8/73' u<?GħFLn t5k/%?EN?7ӿk@8/Stn ; B7|`DY?x)ߧb&[kě-}7VD-o JE 1UͶgLsGri*d-FCZpc~e͑f//u,3t%* ,%sq 龌Tӧ`dixus9]]ZGw/4#BǺBı-'ǺVH' ywi&f5lSSab`3  BD/etCI Dnl SnZ۱,CS-u!kqfV>97_ ْ-@q9p84dAS6r)>^J E70z8l VX.p;;{iMIkRJx2%̒۬\SqΓHu%)a ?fݐc-@ɶa:!F1ȽEIDΤJ=n<},-F=wK5sFEM`TXOh=Xzu-Ugm\Y` Zdq1MoScz *yCcq=X"Ιz %~AS_F=+5b)>NJ1K7"Ki;H9+K_:1-}^$iT-*Ef>]zRЧ$S s$# U$Jӂ_#+[yD*Cmx ΃T|AHb'OfZ$%1w ٱ֬>IxH5נwD,mQì{b4‹Z:Mhv M8d#.IUz>^*aVݒ={Y-9 0/\嫰6DDhKXwcmz8"aUE[ k*~! D)QCW1y"ѻK\L@p*ƫ1ӎAznTQ=¯ PEpS(Wd^2WZ/ת^JU~llOWA|G:SyTACA}@g__]yR*U]}^R_UW~1/\Yu>'?U?@^_H)gx;fx䋈}$/JofOU4e(9#QLx$dW6$ׇ>HC?DC=x9r^"U iF™җWIx8Ja.Q~@T|)A*Qw$ [lY-yd6ϖ `&uك9w}r=XȏpE Zk}McGߍs757l ;_i ^a+~ Ip~0Ll%ݬ" x e5^qe_mf,m?/pתX܉xK6_7Ped^tPQc4;گ~SNݹVp| װGwoن|~2܀ mɓ/Cá/!/:\ɓSEPam/8)H9[]xpW^Y\ GKJ߲M;~ |>& Nw9 w[q">N>\]O .HwЍb)uŵy;-Gb^*1/ U%FkH!SIRgU

     FW{B3E!?/厬tQvT$O'i g&0B*@B8LeqSE Vg"i3fR8I.~eh"m!\b5Y s|C% "1!*c2yfD,Fqځ-y3gg sYN,ZeU|/I;YȋU6 x8] AY0pWٽ,,z}5 ܈|?Zy V8WTyum}U7@?ͬ~mR7Sں}}O;BA/-6 z`!P3 7-<Фg[xQQL[ltuȞO૛a9@ C֣zHv{Ԅz 1EVFhDʘ3W;۹C)F{=c7)A6AA؀B,v $ajKLVFFA=HaOFu)t1Q "RKZAC ag)!A1ԯ3%= #aal0 ^Sr4K@W  1Q!'M pFVF_ ҟ @aU}ϘG6 >0zߌ lD302w_)^ UԮsI_'X<'TF lHVFFW0gadCaxfYA 5,}e2bv`-M!RԟnalWza>3&(l6F Z;BX!Β~!P>0w2?}=DPSf1cƬ}jƭ6kc8ƀFEVC75=eO,w痃>f@<[4JX@% B-J.8D/N}˂ǻ$#"9G]|!fcJ)~ .0>Yfz0,Yߍ9+FhH{ifA<9@`uء-vrPNӡɅFH-D1;j0[X,كDX4Tu[Kw!\6,"'W }csr2VFؤ`P+*FN`U##Xcɐ,4'`6pSPbtÂFV65r>~7}i $αGyBc\Â̫B@ T`ɍ7+0pxm؈Y%Cfs,`PaɰApw/5oH HE FIuE.Ib*I龱#)]sH9f.]S15ke8X DFC`Ix>C 3l,@lДzo8=k']bdˆ#1#!$V !WYlX/h2l,@66B)5^1A`1 !@s\CCc.Hת ..!l,P6%U}O,Glk6"kc!p7}c!ac2*a!*jNIx=1Jk6?@^=ǰB-"aw>r1 !6B slp({R:`yF~Jyv*J@b .xBz;ܡX6ZoHnlvzx5=')PJ)lq'|bVV|[D2 elJ*J_M'*sܔJBӞ-;DFO`2DR |%sA2^C2c2 Y,mFA}@6})hNT|)3ڄ25T-+}uc%^6bo=~(HILP޳Urk,Qv1kN.$!Xwk|#X~D'VՃOQ[R/[,+Pn8[ࣕ'@,&/)4Ύ!X2^ |WxP9ʏ Rp3abHK xbTT}mïHW\)vV~c]&>$ǥ4rYg$vY-,$rM uY?o.f3ßja 0筼r%/x~ݖm#|fk/dCfENA<׺Rg gwGί':~{İX&\Ym$yWC NdR ̐#dա#GF{a4CD"{ JwD, ljҐCw'}DJ~ƙ#5jf}?ڂ`6$UO?;ŁDaL>;6];ͦd4e(MivLv'L|V]mZ(d!Z@F ` ɅB<CaOW(0[usǕ &t5OL,ĢM,Ջ459>PGGiO)M,Ģ qo{z FU}6j1VZ gHM,ZQfH'suaFAdT9~Bw%d."W4uJ#[c1eb&-ĢϔlX ~28pu(L,Ģ2a=n<26y&/ZyN~o??vw륛^iOJCyoshimi-2.3.5.1/banks/chip/0019-Alien_Chatter.xiz000066400000000000000000000643701506652756400212410ustar00rootroot00000000000000[f{?B[;!1Fl#= ,Δ*l_OD @| ՛hY|_><_Wy~<X]w7oWxgUv}}ojnͧ{~J&x/6_^_m柗ճ7oOoSuZoyǿ=B__>{+v~7{^<[?-<+_W5+<.?{ѿ폹rj^CݺEwYyɾUo_/O匿ڰ" {-7Ol=|ZحџzϏfWg#)ۏ.O.߯w]?mJ>~oWo߽ջxoy1[v\ff+/ +>-7ۏg֛3,[}Wnz$8|ͯ lei>Kً#D,>+.]ݭ?[5սisaw!-ܑxt)_{saӺGkXfq>; \/>zY^׆@4{Ww۷p-P3)^7f)Gz zW||,rniϋr-To;MGyw}X]}!WO\Y6.w>tb %zw?npވr߿z?TnЏA=,VFz/"ܳAz^I[>׳b~!{\-<h˾f냹dj3gzl,._;=)(y3:_~G@eHY=@N3;jYq@;ٵ3:)  -0Vgd5꿟_;[l~q}8STg/7n1?Iw kf!QE7ѪsjhRdNy{l^J/QkG$yuŽ|S}*{U(c~YTO{a'pG+P~,)-n{~;rpl"]ɭK[fl !]0[ՕcXdfM=e3[_--&/Ft*n(oJ6/>?P/^H{x]>y? (ZX;Ip$޽ͼs BkdNRĻ~ @[pW{ ^?;/>$xtq/p 7bAg1S_H隉_=.҂F n+'x z<)|ӽxayw?̯緛%Ruz[ڿv;rʏoZ&ܯ߳7߿~R[|syC"PɹEs{#7w^_ͷ$Y'.<wKDOd_4g2[|n -.MJOLoޣ8H1xCۧ߯O|?Ğ2j':bxջcVyۼUrۑ{;1"}kIh*[wew*BkJ11"kRyhj#` aׄEq$?0iN<{ ,0}?Y+lWt~쁷]|#(/0'mFa |}hkt֐D&vQKewv@>+WWVrz7S2l+J\Ov[߬ʺ'ˉkx3lMѿWTwEk_w/č)}wþwsZZ;ppPݘX e>88 ]Gtopj:o y=YU\s8DOjڲRQPu@9;tG]@Y`>@<Oȃ/it>BC3ro0f'ċ-:ꠤ{XQte,\zfu(V>$-SIWTϱw= 3c()҂_ٸ1U 1K/:3om &iM`)$Ws35v' gf x:# үI_IO(m?I&Ch23yc0S"|hR:31jf~f(NCpnHu&%gp p֤YQRUCIO(9'J$̍I_CIf!v6|ac(i$T.\[ $W޹Qd'9CI}6Hr=-Zo3G`?S2&m-&ڋm}sWa`Re|33c0)ܸh0iC`L*RVc8)ri1$$3PCi1$7; )MO|MI[j>L:sB¤>qc0I e;G|`I,=Gz4E3pc W0[I%=3F+ Lzh4j66Xp3uyBf(&dm\iE@}/gϟ4y#4ѻ#LȨhϑqgO:y#׻{j Rɍ;^j#߶akd}D\vL~=g߅o~> 6ܩ _ Ebvgc =_n;U3V=E5W^EnUa&^kZBcݲȿ/Cu$ TK-$\-zaERYQQ'IǗn@ys+r8$MiJ(ofBMne /7pS.2Yd&mYf4C+j|m<:^D slmVCTڋE bc*[UX38e^VG*4,9'-,JtlD18x^<"pg:BD6"+{OHomͱy]ͷ'rxqDNU&qUz߈Og(Zt*.ˉ co2E&,2.!;:CyO{I w6(2l2 ׍< ~AaY>VMBF,,ʖYdJ.UQ,ь xE:-ỷ 2J," ZĶ@Ǩ @DԶ)K]%H †y\W K0*(* eA,lbgqe&}Tz"9#`Rj%Ţp*8/((i(2)úCԩM=W$1TARN+d$8ljωaJ]SnVrPETMټsvM^mNk= 1ӐsET+f>Kѣq:dF'^/,)E &b?ÊzگC*B7LD*4mAݭ)7bX b8WW$Fdu<_d>|`P2*0naAC%:QEU8ntB/qRpKה\XL2w9/U~` zRNR7hޥ f^~ Qž:ThΉwa 0cgr]ә H9G3wYq\u io %@k ˏn26Y1"se2mUb*NW@ zNSi-LL<,ʺlxz8e>=e^i^QE&@'XA&)j&[>tA5A&‹idIUm  2i ehM*L  `UYքM. KjX)im.qe]Ӣ"Rod9_ۚyTE&5@S+D,[̝T 'LHc69)6xy $G,_Ԍ*%@=~AvMb[Œ(Yqz`1h缷ʺΚz̞nsDƆXPa:)ًOT$e:No<UEӻ`P? 'u6p@4f06mXu7)qX dLF x"1de1 n&ARUv(GSօWVld2zQLI,c*={Qd(&t" &bR iGrd{i@ .vD Ի&1/M[ ,Tu,qD״{J' i=|s%j鷼7idn'bSL^OO9$v:* lgʷ!)4\x"p ^S18 5N*҄BJi'`=jŰ)KN扸Q6ZBDWMVej&G^lPKAٓ)8DIXX`&G!U3+ټ3- K'e٠5Īm*ǝ'/ ꐳ&<i"NEQ55KK^٫m(1>8kj˼)pQ#'IUHKb2|DIhItYےN|@0E%ܿEip ֮HCkF~fXG))Ni!yD%q< rPrԦ+quV^Z ~,KVހ(guEVٶbC9ThyǕЬD?a1 ;p ,կN | .S|7bL!OICq#ya ЊJrC[(]ecjC.`U G!r0>-V2ϗn6{K4~!鏭Ǐ a}CP Q| f/rؙN>jG$ A+1l2R79c<|xOj/d|S0K7ԃNEDʶdtVēE,"t躒Ff)ʦNqJmF6P"sHل BI$WhE!$ǰRS1PF8b˒I<\.ӆ,d#RR8h5)=ڿuQڳf*F&c3Od&>%&˪ȴ6jtwhrWHv ddf6dA\/PAg cYpEB&?ZZgJJ r 4,X"M0Є߶5pj݆O^`\E9j9C3 QZGgl1|3:ɝ8c*·S3,_BA,*dFFw-ujmFu, 4w=_2 Vx~fH f%MIHt28@Z+Eh@lln+4Z@^5 <揌li+P Qk: ʫl-43AٻjS[#aX4"Dj Y4YdCE$eG"r#u&H5[s `o,9t=E<afɀi t_}6iOS]hoY0Tn) m.NHEcF 16,_a*VM+:ޚV=Amls6J2=YSlxk:ARN 4*ZSImU.^A) Ǐ TejUݫLO1 -a% ;ha1ju rSU0#jCҰY@H% J.ãSSGdFmToV=lȬxqN@I ,IZU1Eg=w292 TkQ ;cnX2[ % УhYih.IN,b a֊ 7p]UN%-ܸ`شp&H~DcWMTK*pTir0I4tSm#qqaMeiig aJc He[Eq>yUuӝ0tHe6j96XZLjQZ# R"j~@,DӣfgߌWZmJ؃_W-7tl2TcD@2ɤජ\Ӵ mceZ-#ɤ٢8H#X4 Vas!S= g!$ISB~UٔJLg!$xխtYXh\Gp(F+Ld13H%߾%hTyek ,2̰h*@WfˆFȏG %Ēҷ }ӨT5 7SR3$N+Lᅝh VUUtԍ[4ҁή͍eEƉƨy5i;(Aa4+})۝hBhOaiPt.sZe2eL.WoC#pUTʢ!mȯϠbKH&4GĢtVVelH4& por4qBЧe;),6D|Y-ĥSb[<ʸ(&;J 4uH;PGՁ.f ژ^ sxT|#+GGsDMEр+'<LAHl ]9M6KAچ#HdecDSmr9刯j 7 QD _PPm@* Ӊ J r4 cFBR>Q ("ghhA񩕅AFqM0$]VDQ6;>ׄ+y% ոh%tW91w1}*JXԍ p6'Q/R%'(KMb lOؒi/aEI5Uivj1dd"^6,iz'F$ Ԣ+ƻ:DBuԾ}j(I)0#3覌L3qta(Q~о"Q# 8QUVDF%p^٢\r ;ԇxC|#l[J (cfZk,1 TR"z2Fs{#hA%;)&CC8F{Q j BNYKdlT0|Q9Ԣ^Pyƨ )TT_dH62"j֦={0kM4`e5 y(YOcA:G!bIt-7CfpP'ih&%d hpWxk٢иL\Y\؞E(apMuQe,oHɵ6Sd6RړQ]õT6C ',"PbAҌs6^f6b(a4 /%n:3pB4W+ʆ:0 &ln.5SA Քq&[HиiWVa-k&(F9|2%ϸhSH n>2*f|NiC8@>O˭X 相5ai-\ztZd\3$rE:u`%<ϴh|?xuw6搿&M%Tz[/1- ȿz)+(6pA:̰fc iqtؘbPXi CtAkvn1nZ- ZhASY :5' D2R] mx;]xF';: 0hX2R(@IƒF"F \0Pe҆1``Ssȼ4Ucb %<:42FMɕ*{ uY$c $[,6]c)%FmznA;K]JE1F`V4Hj@D:&i Qj ʯm<69ZES`xcd4uS*"=Y&e$xPxcik@eoϦ`)(4ki#y 3jQ޶*b3eU׺^[T"Yhb]]K0cD&t?6lM8jԀ+u*j@AلP5:KJK- 2Y¿:&I$&=$mAOi1tI2)B N5NM@AFs_aBU6,dxh1-p*m^JpILёh>pG)}-BI#44 )Q{e٦b7zEs[ze4`Z+TW6 =GNaT3 V /ʜOR*E I&65:L3_45$U,_W(\UGI}kY{1b0a TmJNw`#!Ӱh A:JuwGjIѰB!aiU *ԠBIUNߌFO.h #DT@*^acmkp#s,΅;`Z4QOMAEBN5FTFd!SSb[ 4*eR2lFH8g4vm\k9ll ItPH+*Os Mǵ^:հ ؊_,ZMh:/ &% JN,m,7zkR&M3KsOr)QP3SD)2\BUYH\ i;҈ Bc|aƫV0.d %#7ÏvN#D;pZW2f=!yFX겐JtPj~Kt!q-FP?gyظg` gBb^$R%cgAOGRgp8P2J!l8mE{+!cS 7TnYR̈́IaΑhJkhteRU6 oNG-eNuFtO"+]+[y(NN@fqV조KɎ򀔻9>SUL8jЅ؇ }B)sִGI H!P}&!O=f2 TXFD?HYxsX~eg}@zGX|T?|yVz+%^|/O}ۻ ч5ZZU&_ȧ9v-0hbU(\WUGd[%(1˅w~H4"OP$_ úgHCպIFozUg۪9v#ZplQ8~/V׳ago&Uau+Иns/fGWcg_oinɏFg_~BUǐc,7- ?C0dGv|i}*;tHFRã~ջ VfO6~aϫ}oϋKoqXmw]u"Kj3^ִV~g4.20j8+y~L:|_6GJ]*~8G/DVZuvL%*5{#T)wuޠlrZ t"Ԥ4#-}{%Y:6{&CV^ ?3-d ;WGPހyc\s-:UPSXQYcCIJPJiqX8>3 =`/PdچB$%@hy^o0.\yL.:7=Ͼp!I)^` &} (L[МIt+P"R,[=LMsyfΑ93'b'}(c '1o-:*3xFLF4Qzm1$0W&+)93IJ}z̼Q$s3cXi)PP֤YQR8&ݔޟ')*g``W2Pp}qCISeYuH [ CIUgI JDszh&C欍 [:sE$|دH@YAXyV{ &(~h0i`L*RVc8>ľ'yVg` &}=c0L $ &1.Dh&Il?tfi sQ`VZaWMzBß[6c0I eYYY`I,=Gz43pc ~ª>#0d= W0ZP"I #y_L*ڣ0l3Ϗ(/X]-fP{=~ˎ8uw'^d}&Dv jUpyag!Яw(Ӯu3q>G(wOt>Ghwi>GFww>GƵwsh>G6w:25?Z_[[ 72:ȇ2XlZ,Ie[~"Vde9~p}" b~8Uw67=Ɩ埗 :}R+Z=mf4/C^5Qt:D9 f~h;݂-89ϴ\>lfel}q?z6~}ZWOVW&$}Ow#s-G7{k >AEÊb]L{zWggZư Els.'e\O.gLr/FP~&];gbB.fθ vI/tg<`SfW ^*.r 0\B.x!|"G߅\>G!hs;^nrAf)vI1aC:_Ȇ{ۋhXxwWfum,\-G'If#gzp^Gr/c"bav'T"wmpibFTږZ2 qF96I܂6-5 > {DzUZ}wu[o oM~dW7[ٍ۬Gw*# plR7t Hwۏ7Xp>cċ^lVa= ߅ٯ+Y"ų-/_GS$/~8If!ٯɼ0]Fǎ5c+ѝ-L=ڨ ߩ7/~'.0MѶq:;Fg_ k\Op^.\ȶ]Ns/~.~yf`R\.~dp 6d$:Hwj#}a;0\ ]_Q8 4ƌ$_q3k&If?s %MeQtrza;'0]N.~f߳ߚua2?P0D\N.~fIf \<LJNmkP+^N\za;`҅ck{fӄ/~fZzlyf?ٯdf|Y`Z\?l̺|F=x{n^toY2׋^,a:0] g}˾!k~=fZ(zÇf(gսͼyЗծ(/|n}aeb_}ʱv[aod.~j>_Oί緛AX]a}[R~5mn[Lvԏi!P 4_.VWŻ_z>MòlOq<Ǎ4*rcgܷh֜oCc:\~q^,UZ'Qi?W[VI>Z9(Refr^GE${⸉>:~P*Bϭ,s41URFyB}D ԇ0vZoC~7 {:HkZOfX/pv/ڬ:]ڂ(8A!R6HXp^VhUGiMn. Փn%Ar8y)_]^u7RhʆAi4jD'۔ՏH^5K7y$8}Ftb!;[;~de ;PX#-UUfM&DŽu#OB9_EEPL;Ԅ>N[i^1wfO7l9*I|TE[ށndCW+jԹmSfN&bQ5Q^T$M'FU"*0OY(ItEZDN6n\W K0 rE8lSgoɊJNJXY{I#c6O-yɒQQbQ8~O&G)O#EINb\Z1TARN+dQ^GM 9Q6rVn^AM+}9N<8Lݔ۞;g4i&{Dq_E{~mb1Ax^da&m&.k sx?9n\إQ8B_G'^/,)E &ϳ<zگC*B7LD*4mAݭ)7bX b8WW$Fdu<_d>|E(JW^QU7d0(ܢ*iTP!b@ nR{隒 s40x*?֏7IcT8ImI r@ 0}'u%5a2wh%/Nk:s)hò09#nlqllA:\[6o ::@Ј'Rq *l1SW+y` 3`ZK,F)K.*ޟ^2NOD",2 ? ҥ60IQ7bÄ/ɇvXЪ 4_ڲ|l&q& PNͪn¬ldk*PluO_R T88%20u"*:u+난z&l]QU?(̣(5 ?ɜx6bĕG P^8aBôɉH4HykԒM6/Hd0/bJ %@=~AvMb[Œ(YqZ {1@[YYSY Caؐ T`8LSG8E`2{qB@jL -(>@%Y$I|`2{?Qq͞`m"='݈/ꂌɈ X>Z$^2_`e1 n&ARU (G<%.܆zxIfkL!~@F+q-𚈷.uMOlkg:r3rn#lP &`h ] [)CG ;!yyUlʋ~#,M*yn3yM@z~y&\|:Ȃ -&qAz6Gϣa@[q6,``&ThȂl[WlzYR1܋!~͙N4+B&65-ĒuQ#!56]-j% l=a Y`wKST(!E +bi+FW"ы*5VZ.d#ыbJbS^^Vٜ=T"'gŖ C6ж[Y5em!"ȚK<2Ɛ#KJp#Z6Iը\>s6m3lhRձ Z"\,a )тyƴ95[^a42GÀ  &_M/} Ek JUy; 䐔\hLk<\8iffye 6G@i4!駐q|'T65RPd o8)76R5CI˘*=Ӓ =Z^p[V  X5"qVϑR!/ ꐳ&<i"NEQ55^z2^mDOYS^MĄ9!NH$7FZ#L @NϊܖtK)*9-O Dv@MG]6O(Ê>JWLv"O+ *w6]elq NnQuQ˒=7 Y]UdPNU8Zuz^qehp۰{mD8E]G We N|a{JbW쐧$0A^<(D/, >dD"mX+ x.dQLMmXɀ*>_^E=/(Ǐ a}CP Q| f/rؙN>jG$he"6M9c<|xOj/d|S0Kq;m'>:׋ SYD6u%jSM یm<[M, D,-!h68Xj*GClY2y_Veڐ!@%HiJV%פ jf^E%jϲfܪ -GB<ϛ Lh`[,#ڨ ߉w] ؓ'"]faaf1!@z6dA\/PAg-4Ʊ,8SԢT-$ l›3  ǠHâi.!R0. M4eI ZS:l2zGjZN( ֡>=ŸfCQ dɝ8c*·S3,_BA,*dFFw-ujmFuO+ oZ=z^S6#je;5,8.J?,d pĵV\рF0>7V(j*yV*BtWٺ[h*gw%@ -G°hD$@.i0ȆH6UˎDF"M&jJ ZvXr{׋x̖i t_}6iOS]hк(Âr܄6GMiP$opqB*+?5ma0z U2sZִ jgC9dͪrN9I9A#G,Rʭ?96HZ(Zd*SR.^e~BIh+ixA caʹUfpXa4P :ЧXB|[NsP*Wnf&jI o d2,Mk^_S1՘˙ZbEj,[TPɀԃ0C2b9W ߔ`#Ih-!ed| s|47\@͉eԋlh ?>qS$)XB)duKXQcf1>hMUZ~k6B:*A?6,iz'F$ Ԣ+ƻ:D~f=oe#J|h-Hk )m!LdGjpmdx% @,43t'm+ieB" D8lQ. 9BCg\)D#Sh6AٍJgM\E@Ql!.:h2.":0]g|?xuw6搿&M%Tz[/1- ȿz)+(6pA:̰fc iqtؘbPXi CtAkvn1n⊑<[H>HtjNx‰d6Uw0OvZ ud5`VѰHy%? jK2CT2FK7pCIFǀeMqP!Tyv*1Jʤ*16~&We+eYl18n wmPZ(m Y 3L?,v5_(&=RY i?f阤5D-+qhhWM5k⍑ɦBУ;XQNhdњxAa鮑2 2!< vLSLvfPM1P9DyJDUiv_zmARfkh/kMvv/eNqcg4%$Q",ԩ;qfB),"(-MP*d饺y\[C$TeREC 㧴$LZvZ[KCΌUB& J 0N*M2<4P_ۘ86iv%8Yڤ&Ed H@FZ8#}RKR$MaitwZM+Tr5I1caEgR<,r$ʹPl&ec\*~nY֌"0di l{,0!Z{,Fii:yLi2YBCX F`S4pIꅚCD3j] %q aН="J5 @KǛ1Iղh+=z)熵QwD 䬍]z[Mz.qag/&(^ nYd`G%3g$ǫM"mYE#ӀiP ^a4}:AF/ĶSh#A f+s>K-$2͸SF׌SR>Tqd~]c_rT% e4-P)9uށqLâ)cvb[ (k&Eb|mYV%XP&KH u$U9}35?h%(QL0 [ _f-v.Ӣ! kq`&c?5mrD#;5S!_`lL9O&my7wԖ&B%~4LJPfbNC w 3 $iJpEq?AKgv[+REˠ)M%dA)X鐒c tE#FawmTʤI}vq ^S2%6@uz~ H3]Kh*iHQͰ- ;f iMP8zSK:njm_4]JuceAw{  kmnؾt"itULl32ZYxmo`ȵ1qK-K݂.hB䙦}3t JgCKU1H /*m }T5Mv>‚N$l&¸9\!oʘ# 3eBUz|g6͠Ρ~ `{²hz!шfVqDu%&>%&L08 } mϴm$&6Q sB`MϔP3_:t*8ldzM tBM*cnĬ/tZA7qݼ1)&sN 괰2΃#*-p疤_aqphJDm2AiGsFD=6.dc%"0{9@zM_Bm!.$:T[#$44䥭=Ք"6Ē6Θ*3SG<#,܃BuYHt%:|Q(CJ5%->&6v ^}pSB_ZXy4.Siش `)s昇{&n@zV-$EaHrZ-U19z&t$ej~V~ u8P2J!l8mE{+!cS 7TnYR̈́IaΑhJkhteRU6 oNG-eNuFtO"+]+[y(NN@fqV조KɎӬ9>SUL8jЅ؇ }B)sִGI H!P}&!O=f2 TXFD?HYxsX~eg}@zGX|T?|yVz+%^|/O}ۻ ч5ZZU&_ȧ9v-0hbU(\WUGd[%(1˅w~H4"OP$_ úgHCպIFozUg۪9v#ZplQ8~/V׳ago&Ua1M8`Ҟtl~FM-\?SCs̐桅`4l|o?~=`5qO'()-vD tOPn~O2ǟs{PJvxׯ|z7S> /zl@`Ҿ܌?آ#P%m1%IUpHC91DdvI3c Em|,(JR2c(Ii HV $!sCc0I{/ Y1b**`)$ ͙QO ("(mͲ(;tgJJ 3s"FqW2pY6Bc0I2hh4IC׶IRx m0|hRZ31G[I2@<7S14UuXw $ʰ5?(J1X]y1ĤTM:7&i2tnx0I+38 LZ+L~*L gu`'nLAJ f"e5hDgu`WQ3h`̴N`KFatIgVI9>&m&}Ѥ'48ec/0P &îc(kpG3nZ>=3 7M'3;c i޳py I {~'y1/h=O4]owz~o[6z92Z[iHsbziEs&zisd{iX{sd\{iHsdz~#Sc^M㡡Ea~#-(C[jBTG -Ԏw>?UD{NI((dnék;-X.Q/|7l`t\ɭ-Т^n3yZَafix7C۹lg9|a3^.%lf偳rɇOGWﴽцow=҇ rz;oux-o;z}4Ė,Z-}E2nHIݑk`Gm.~5`nҿgoe!u͟]o~c;7G}g#۾wk`cCׁkoe/-VzO^pK^ 8-k%E4nazA%+]CeP0VYz5x o\Å]SƵ 2D)r+O;k`:L0y!T6i/ara vZ;A\p7tYrS \窡 `B.xvq!s.'e\O.gLr/FP~&];gbB.fθ vI/tg<`JCP 'EV{g?dowՁ}= _^嫷}|7{)ۡS2nxb? dnmal?iI2[7?`:?֏hꏸwSGLnr=]LM'}/s< >б,W[^n"k놖Gq۸>p %^# ]rmTM@~@T|)A*U[H:TޑY5/>]Od?79a v:?~zQlܰvA'o{/ݗw ׯ˿[?,/. c~~5luI!|U=ߣg?t֏36nMdW@[Al`I4-(vĚ--9o[so?UM1g"\\lj 0+e@XQ+7%|*`9.D\~->]js$Kھ u59߁`2?%39)ObiYC%>,$WuW XEPanm] ͔ǺOjǸRYF+eoT;!BLdցEc<#d?4xs;*t]qZҨ? <&[Xl{ ~Rc-ji ¥Xv(n]{ 5Db88μJVKOK'L3#zHE7a]A):Z^hq/&1jf6_B?A_ ~g_:H6>n3 Sۋp;AQ)g->#*wb6TBDԌԋYQa6fD>N̆Js1>5#*H]YTQ͖uM!a\\R]WSKjqrYU&D/2NL-%]r#~DfG7g?HAmiAwhY'#tک xlgXQ4z+SO,V *}iv+VW%X!$œ;؛ڋwM`?jv`n2\]UǓ",OKv#9p}l~Ww~/>L42araZҴ.ν8zZ*Pz< OTp=P8!% ABZCE^>ݕ;-w>BX{bE`fbYytqE#8vtr=o,䭖3ӦvfzoSkv>!bɡ#:}Y陃 -)SFP$>(%6HXg8_JY}U!X"7 2sۤdvVmv7d OUH =TL1|iA _6 .Q$,KMo©q/`@-3Q4KpC2>k8`+nTߊaC+W(>X7 |_ywO"D3I @V9b=l#ZڜAmΌW6g{+EٺJhsx9KMqbY A2h4Hp$1#beD5Է&Ff&}L υ 0BSi| a0p EfC}hbaiea0@M#[F.0C$Hb azb#1Q !"a !#i|Q2EE"ࢤWI@EhZCEтA+\(aGpE""i\QzB3T`/N\DNOb*=E-R^Hb[!E-`kZ-hQEbjE[Wհ5p5Q \A`NeLjjTWըF5psTWprո5p5q \kj\W<dX2j8.2j800OJ|0pQcy:{[U6uF-AX+ 0O 0OY 0O= VhLy 0O p2!&1.0ۦtard9j'yޭ2uZd`zet1/#0= b~Fz0G#=c͋?03=70;=&5RIQ#X3YiB`K"`>8A!CAQ#X2|mc{(E5P Pc|k ZX(>5Pm#{hf/@yHb64TM9YE3Fb B$X<X``$?HXlt 6$IVPR*C-C,D f Y݂&=ZRukGx k|_> P=C؏Dr6ː0aɞȒ/ch Ųnm KQ`"21:z-rtr&tiXRKbKb=hXѓ-$GoNO\2< 9Ja#NW ]K9* E 읔a8YPll/*6Ŷ. Y YF,l0pَ=IJIrY椬*,-28n]6i`=Wr?lRNZ#T~I%-ȷB }>x/WjrOIߡ(9i`u `٫2>]WoHZ/_RjʘhVhFgvFoFW^Z V޷R~cozޭAVhߥabonFmF^fX5j}g18ZߨCZН&݄HMN |o5!8`mBp7/NMN.|OV էQ4"yz"yzygryi/~^vEնUwlakdB$c[8.r4Xu)|u)얫U] NoY}MBk_"}5W1G dG(lWWӋ J>f ӎ\:Vsfu/{p^ އg,fO~p[ǎoQaNyoshimi-2.3.5.1/banks/chip/0021-Batman_2.xiz000066400000000000000000000077471506652756400201600ustar00rootroot00000000000000]KsFWpy=$wm-QeV,J+ѩ8Db`P뷇5HXY;_,A?>Ggnik7wiz_ݫq~u6|= /vh߲^ۺYOxҮm O`f׮f^.>r_ǍKh9AX;4^%#Glip:ok{c+m}x~<{ჵ 9^nk 9=?0q#=ۑu=^WrEBX4I{Vj -7tVv6fr<-H<Dd93h Ar}MhJV^{{>oAD:o[5No>]&?Z79qwpe{Ccl=6ngS[?كTMmnӿk?0mO_نk'9h?Rs_[pz맱؁w?OF >ρh6AX ONX֛ 3|x2r-q2ԇ4!\<68Y1Re!8 }"*ύ`liWIbǺ<~Px^XrpJӹVbX(6ikȓO`)5Сkȟ_EXvQE*]՟5JSXuXuQ*.JcEHk]d| YP!J8dC),Z΃OQ75Xe߿576G F`΃F,@ypcŷ\Q49P<Xwt5abkq7 _k= F&w(Q1N:M=\'fE.#.M#GN\G|lȑ"9O܄ 0ÀA8r20GQlj hc| CKaF,y>FGc3MB1ftD(BPǧ (XE­eN7:D20Wֵn|X׼ "W_|J7Tz1/?d>kV4de'I|F_f;;Dʬ$2+xJKeK:U 3ieY_U N+N} T*'{| щ V 8DVɉ񭒣sdAO+\vzr4Z?x:$DT&cuᤏȫ]f}v(\Q? /.]ݿDE2ODK9P#%x}Z؎..FgS-?L.OݭK9m0Ĕv#s,wgS8, ޥ'[,~ۻ_^~b58\yoshimi-2.3.5.1/banks/chip/0022-1234.xiz000066400000000000000000000053131506652756400171120ustar00rootroot00000000000000\Ks6ϯPtl'%RE[rlyjg/,,f$RcקA@HosnFw~ެ[OϽhGv-vNj||pӇ?\͆/_܁mGl"[Sn}q\7BQ"(PkfAnE/^r6AJ4XßF5Dk`=lR"6b%F'f0̦-mE{puʌlh[RAzJہ딸#u9h>O = _LyPLJٿGA(<ȵV&v95t f+e)&\2qmyAPvG׳ۑl`Kc2'xTǤ1X#^oan];.ܤfct[?iAf}]="uǷKᙪ݀$A~7n`f{aICG9VK:ޮ1a8=v'1J3BIk\z"4ZNJ(l;hcrg {ͣv턑g' W|xSy2y#MnSDϸB<=0l<әq.;C~ŵs>wR`KKܼ:xyzt*oWz]v^D>*] Jg`8y8]ō9ty=QtkH<|>,7M;t2" B\ 3Bs8.J"Zr4fGJCqr`#(fL7*m{>UaO]$J('8Şďl}E/@BAnDbsAyh:%i;t$ʴfbrRJxEcqކ\zP|  2M'CZH+* joI{$5?R'uUYKsRN%)x9 UjH 41f%w!G΂]fYoL$`9 +X4S軙]=\3Zo5$ GMAw)A^бSkqrY]VOp5h\CU3p/8(WT0?DSh 'gYDvnQK|#(Ð1$Er{"/RU@ 3J>nB4@ bF BuS:E$Hqd\Bh$jH!>iR~g E/I_q])^{Hr_=RaHIy˓G.#)8y`WpmVQhwԸ%Wf$-] kM7}A7Y^{dy$n (Jf7p80e2&hXdp@`KD[6}$"ZvҮI pVдp#B3UFmجGK]mOqnvm0vHnȆ$)0n ow_z#m)+.| OB:'`|J2th=qd ЪwF72lJ(;JȾ(^ogJwW@~tEimK$sC@E%dYHD΄>n<}-6 #ۥ1@P@5H0` 'g|/n٬2h*#Ɠ%6d?4ؒu]͕lhg&W y>Qm| T+6(eF0`9?:3$zާ/YĚO.wRfዠćpJֻIҧp,{ϯ~J3 )rU,s/Xic>1o(ߋ֬}/~`ܭց— '*)+EOGpPA* Qv9/􅈅$w!,B*t3#cb/WѸu,6$)Q~5 JmZEЧ'a}!(5|ӥx{l1b'!FO),1q-.>b0yv^`9ܷYlaP;Q"(!_r%MOpxku%ݻBwMxlBfr߬DƂuBъHܑ̕` vU; NB]/mA0ypm)+SV;yf$//Hw#D}$o2NU5L+(w$XA}P͖E yk]l*mJrjP\8~Pu!6لHI֎[LT9}6+6pAF5Vt2b9 ٿcx`<ʃxڜ2̷+ ֠یyʑZqūsЅWY Rd]G0,Q Kv.9 GJXDG' '1bI$K?/GZFcT.?oW$o ) נ]5W٠8vll5tU_F/UU_|y^zp]£*=FO~>W}y'kPA_72֮$ot,MG굫?vտCWEiǣ+>j tW(Z : 60W(s͜zTQF) +usiyoshimi-2.3.5.1/banks/chip/0024-Boink.xiz000066400000000000000000000117211506652756400175650ustar00rootroot00000000000000][s6~ag!ftdz۩M_8Dl$R%)'_ )7 A}i+ .\O}"/;]ykǽ{z<{1n5-?5NxtbsZoٟ^l?=U8.Ad{Uh=8{oZ?|{gH M7OAx26a$-Ŀx%bE;z~yvu}1]_]YyyگZA뤭^;JXj:-ܖu:]X׋IgsҎ%$gtB{;77vlՂǀV2[{%|}6JJR|S ;ęH>|ozkv6>٦TȔYae:˖Å@|T(wJD6}{c[<_q\j>NS'n.ڟUh&'Ovb>lnoջQ7CK(z@GXq!}фcpTHvQWwFzh]e*̪3(9T݋,fuz䕉T6N}v~ ͰS0zYPfDӰܐ"=7F9fU | ?Hq9vwI&[yf$e'Yἡ&??;{-!Kt+sL}΢YzpL%C^2/6D5}I:cT_ЗѿwkA?X`X;YAw:P|=-}V9& E3YhnZ'x> oJ0gesTHЇ#ŊTB;aEqg3f[̢3K2d"DԂw{N9 Yw4%pF[Kt0_O'{chpv)ĊM;iم}$ž*K`hU1T+R˨ R- /Mt;F@3'Zxt?~A IjwԲ8 , `!t4l[KV+JGN:Za(u_ Xշ.wGJRBt]H?2l$ťhs*0RJH$9KIǝ%pV~=btW9{Tɥg n*R^EF'D(c4岔u˫>DW?T؏c.$z Q2EKbKb=DIޒ+ OXL]}y&P%NKaN¦0 J$5+Fs06[ZivO6/ɖnDb;yrR󠾔\ؼu.t8OA5cS tt)G:$~^_\]Iw8Dqn=y;m1x&\Ww(ک /~:{0@D`e2ʊL.3YD%2DKtTRڲn)##SXJ<[gJ+<PTHce*sLe,gXY)`zRԚ}Xˎ]<9stgF D1FA\\r&b2$iP O  | 8~DM |I&bAĠ#f^Hr99TIs[ Tߝ0^hA4 9hP=Mq *D~Ptw]OՏiӛ o@=Ӏԗ+ <û= o@!Ow{R:߳ߩO5 gr_~Sԋy! dst_z1mM;#V|~+C_ Zϸ4OdG\PzWGCjL4s-LieC4]OrgeÈ9n<R~!y喜i=IZC3F3@>TTJ khIGTgPTzP6?P!ijI=(^h.KC:+kथXhmޔN=,(EN,Pf`8tiԆn[bRBNnTŀR`MJ.n(AH3pҤI :OpC?P{EODJ:3B,B-caR$¸f>I}H IȎ20>۝I30w7PPiČ`0iS\tkhAo{ '!7 a8i ŕI?wµh.8I]U`;)eqRnK\ObYgKt3L"8ޠSfgF 5BJ85js(P6uƀtP=Ul?iX=U'顛i8) <N<5;qp㆚ =uÆ=z$VHwN@`];hGc AtFNn;(Htx iAfV=t#y\58$~mwE;WC?^,pu8 )s">e<4<{qaθ۫}/(ybE v2!zw(0%A1J;ɛv2`Bi'Yv2>]i'RWNƵ*P:pJ;3+l'iʮWz_'r {75@Ԑ<֘!')8L  ,c rH!i L9y2EC ܪ _LDD$2&œYצ*4FCP=㣪pY^&Uh%AY|݅q49_K゚:#Iu.oMĦp?2Ol(>nNRt\id>`WG|El5 d[Lggl~A\H"Xajo)fT'zPA'RfNe (PLp!c"R4ei|2X3\ -N!"QowPH ~إ}^FQ/EM-DGw^/7gX[EYyoshimi-2.3.5.1/banks/chip/0025-Boink_120.xiz000066400000000000000000000120031506652756400201420ustar00rootroot00000000000000][s6~ag!ftdz۩M_8Dl$R%)'_"8qm}51O!XIV( M'ׁ}q߮mZ-x h%Ӿ7'ht(Ň>(;PykM,BoSu~9_0.rqSa'u縟Mn5]l'l{ Boso'k;zdGO>RɜZnV o?hJ 76_xB:G2 99<䟠6+ %7;bύgbz<۵nV+'Ϝm(!t8Q 5?ۏuF(@ڃP4COPXVžQA63GI 9t9Yz MK./޿;fڌoE՞2kWrޚZwߖ:q/2+MquyW M:XteJZ BձnŽIvF7Qf+Ś |_Ҁ:XcQ: s7m7Lğ`\~4]7T mSnlS"dʬ2eBt>*9%Hz^h]9M}6m `+37ϵi"4ci}'=S^^3]K;V zc%I Q=GVI_dhO?iK]q9`D!W8*$VXYnp_Vwj9#gc0J2rfUB*~hnEeອn=SrD *o7+'>`?f|m)?fK{eS/mLhR(l֊?o'g>6~`\N>en]yb*Iz2pP}rKxh+],} SY^cL =Q`:eTh_;Xs,}vB,}o,}=)Y[>-g ~vd447Uv-֓L<PoJ0gasTHЇ#ŊTB;aEqg3f[{̢3K2d"DԂw{N9rYw97%pFkKt0_`24aG5EtNZv!>%c;vx3#mH_Ar2]Uo6M 83 ƅ2w=q2 n8Ǟ762#0,oѾsyb"ޕd[/o}d[7Ș(ި 0b2)15@Oi^1A+Z#:$E( z4(PNO3 x8 #ъdH}= 5Sm "dW $p:T@ےVcndHC=ǚEjFb^2l0DZL<%@A!/64"%kIW.ddgniAI^PJUvdښm+ы=8 * !GS*!A%B -64S +u_*OPT=I+uC&  zEXdK ȧFJU؎RdY,JsNĆ7*$҂9"ZyNJl+o8PvG!: ';f`J}mۆ v6wF!(Cڵ@w !:`IK(=L;aG"a8 @W`8gAU (U T2jy0T %KNQ8Ic8OD_PpR;N jQTgyL:`Nv[%KV+J.O*Za()u_ pĴUt`R%f&wan?u9,DQg{-at#{P@L)x3c*pf*3.eb29NSXLqJFHCMCz.Xշv6JRB]H?2$,g$1KP"6fWc4bWpB GEFPRM (Lq=lp%FTJq C=JҦmew(B5@'Sy @tt-AטQq7[JG^DW?TXw‡գÉuz"cez/+z%1Wb*Nsrvr,wZ p6共MpPJ'\0㘙4ҢH}`~Lt$29ȓ+*{LܷX 6C$yr r80L'O!Jw*2{#^\u'TdNZ&Cؘ7ӍuqU\zك#郕uKq++eTwaRrR] B@ť:GFc[Ҋ0wX++LYZOk١UB'wLH!bH"(I^G qr#EmTñCUq80`PA/)`P\G |$ 2UN5'GSsn+#kQ}ר5FOz Pz ctx)XDT?' Lv^}%Py>Z=5A}2 S{jP/%A}%@}EYY kP_zv. z^ }]دě/ԋao:ʻ= ;iΡH~(id㕺œR;a؇1i%DŽ}`ߎj<,*z͙̕|l A\ Vxr?-Un?2JB"=\o;|V">qiɖn0"aq.@SԘhJdAG!7,D_l7h6p4˪ rJ)y3(}CU)-9 '{*6ff|ĩ%@V ؛)@@Y0m~zQ 04B$ (U" ::P,] W6IK铱&)T@)rEҨ 0IBP8:nPT'i l'E(N@=miI#lnI't*==xchBH&P:BmynJƼnP궧'j =tBz 5'EgQTQy =uzf'NAq\_nUذGO D4  N5éHk+h #SC2=nHЩm'I5S$!1 n=j{ď^.h2{oSyNj.!EQħ|{O3Ό_?|5%O|SHN ?=DvbvR(Fi'~N L(ċNʧ+YrIVj[vRNi'vfЇy fztRX/a&륂 {I@}/L^*x1ͬ zI_ZGi}oBD CpTHۭRWsF:`^e*̪3(8T܋,fu[zTZoVN}v~ ͰRp:^"4,<78~ˍQ٬$N΄$}vm|ʂK;ܺ$#-<l3U:}eiwe'iἡ&??c;{^АW Yn>cQ, 8ƒ /z.i$CVX{j{2t*Պg4E/ZzP,9w}!7lY-}a_MKfI?;GV|pI&O7%BGUl*$bE`\RD@pJΝ33fљ%2Km"j lUC',t˂z%F:K¯c0^ ܰˣXm#'-ǒS;}x^♑6cf 9.* ߾b&kB͸Tx7 cOPG@Z~7h]At1 -֗7>2BvdLoTU1hFz Fvt'4Scb Ҙ@Z܌yaI=(`FAR<hE_`A>6H 2NS+8*b` mI1f2a!c"5 #A1/jF"-h &`^ I5C[ +I23 FVt7X/B*@ t; Qm6Enq)vy^Jà!)/G'C(VĞ$:!j̈́J=H"W%R #*lG p2,pR%9 'UbIpiA|<'n7(XC3>t6mC;xB;d!Z;jk%ICžjʰ{#v0ԅV0D#Ze ͠**qt^P*~<^PCॉn'(P\i1T O'U"Z/(A8iwEܝm'E(N*<X&jv0n'[֒%^A'BvRN0:߿/o^8Jbڪ mkc03 ;07ByJvin(I۳=J0qf+xcIRԛp'o3n5hD=W3Ùb+R觴OJ;vR0Fi'~]NjEi'^vRN]i'Em'[v◽\ NjW?jmϛ" @9('2/t#{P@L)x3c*pf*3.eb29NSXLqJFHCMCz.Xշv6JRB]H?2$,g$1KP"6fWcbWpB GEFPM (Lq=lp%FTJq C=JҦmew(B5@'Sy @tt-AטQq7[JH^DW?T8w ÇգÉuz"cez/+z%1Wb*Nsrvr,wZ p6共MpPJ'\0㘙4ҢH}`~Lt$29ȓ+*{ܷX 6!ed6z'G Wʚ;S tt)G:~__\]Ouw"sjb7Ƽn< ;lĆ  жI[X\YQTw( L} 3տeAϖJOG2*.922gVyGe4gfXY)`zBԚ}X]<stgF D1$FA\Lr:bj#1(mӠ r lU 8~Du |IuPAGP [QsrԨ>8=b&/'x]391jT59Q=Mr5JD#~Pdw]OXWiꓛ5A=S+ =5A>{w{RWZߋߩOՠ5grpaީwżׅM \AV|[}{U?R[+ ?YkG.$p޵k 5A=z"3Jz摘^ Lӗ k^Sٽs䯐5fʈ(cMߪq8+ǵ-F` /CqUWb,w d|c)ꀊ2DO`H*›lv7~Q/@b)T '|4 ΤBrYߓ,оG*ᇒVA:^[<)+Nv}[.]9MD-rY\ٜy/K ^_[nǦ%`}qmW)ӂPE FcX.đx TH-B>^fgEy+aQ l #W|=UHDtB}͒LUviCLz}"ǭT␧^?ܒ z"8@kchhGjJI\4aM8逽  *UJJ*$M€R%c8k-` {H reS >Km› SQ|[_)J* '4P8:nPT'i l'E(N@=miI#lnI't*==xchBH&P:BmynJƼnP궧'j =tBz 5'EgQTQy =uzf'NAq\_nUذGO D4  N5éHk+h #SC2=nHЩm'I5S$!1 n=j{ď^.h2{oSyNj.!EQħ|{O3Ό_?|5%O|SHN ?=DvbvR(Fi'~N L(ċNʧ+YrIVj[vRNi'vfYvxz`C7H4T/\؅CRT/ zAT c;Lb=-kB(-mCHǍ%0@>c/Rp~n?OZQbGj?PKqzu0yE䮍"w~ rbIILɓDyrOZ?r9ޜjiIyoshimi-2.3.5.1/banks/chip/0027-Ping_Chip.xiz000066400000000000000000000042311506652756400203640ustar00rootroot00000000000000,`\[s6~ϯP}ibIUZrf/,4xHq|Id;8|)}ٶZO|lr f~݇ݬ߃36u }T{۝vނ!GK2|ij{l 4hwP@ZhQͤJAوX:b7:mjb9_ߎ7ՒAl]j9FTtaLj5Bz@A/ wcevݯcm">&dlX !`' ~h# hC3FOJ s9POl]fnO.6\j\ongMnt6}}GdZ[׾}#K~OË/5ƾupl}9L܃5gL}ӏXPÖx-k>bSPX`2XI`ԛE)hXlf-lFZ(+8~/ >3 @ ʐ9& .'2Βe=&\b0֌'עf#ntuڴ8EN@߰IB.:Q4dj5\KQRB0 :P!瑱P#Y+2b8`I %D[t)=dd;e{\}.'ׅ~"qMXEept= >Lt|FRQ2 Ҟ:Cl2 (Ҙ v.(삜&!Y GG )Uh" *P) !v( ݜ7S;WީR}]4ԧ˩>raԧWOejB4_ORJZBU$!,V8HУ+MB"7*w}C.Th@=2'V EEx(UǯG( #[zW҅Iyb:4.ăK!朜4RYwjB{?[DKL++inʽ4( <"R{R[VGRUЌz2(港aQ12KJ/$j{g > ;LEI[$@~)4& ZO7lv[ciyy:Ftg^+Vwh:sh #EruG̥n7@U~HJ@'&TNQpRV!#O]OX[FC:*n+13~C xw&;*FML4 sXKxM \~Ye@1įr1Y3@o>2rۖkFs4ړ8/Bǝ(=saמ);b.x+;1FLD Mdq}'1Bf Dy'Cp.!2^JtQH#/pz o8}NpsӿAN/cd6ow^K xQerFm! o}Cψ}AyoH6&Q:Ш@H{ 9藻>AK/|Sƒ_g @:(ޟʢYT/$Eͤ$?VYv>܌7+"'iy?zBR>A^X')9e5?z|Vhw wf΋O}W'>xVKA'_~-Z Uy*^V S]+>멮T׊zk|=O^,/}|Ϙ3R?cJꯐh|6٬E ۹IGi>m" I'^ru \.PnKPp( CՂ*<O M |7$@׫zױ2"af筙7_Oyoshimi-2.3.5.1/banks/chip/0028-ChipsPlucks.xiz000066400000000000000000000054001506652756400207540ustar00rootroot00000000000000\s8_CbK=%Nz/Zcmlɫ4ٿ@2IeZ ? ^՞ t}75dz|/Yˇwvy3} l>sf2vgk\:zQ'6"q$HƊȳK-Wwpݳh? ڐ@^ˈx/i::o~ې摵sQ\^^4бAbk L}QAJہuFܐ8h6Of2ɋvmׄOƄ:n'72Y L ^;fkLgp,C0Ar&om]&8cS5G[n &upnUl=󄩺Q #t_qS霜nz^YyI"+?|y׍WM$]Q2l&txT%־;kW(7%? D-PnJfʂ&Ŝ9TvX=yD^ǑC83 3v#hz7f ŔYU ,%8t+|fdpY7>W&x&.J~-3<ˌkG-YY808r1ʷՄ9E>" K0{rGAB)f L6 a S-" SfCޗ$Xk|†oę`p M?nnG ;{5pʴ ҄0JO`9Q;Xm!!ѢwzlCpX :0cXlb4GM/b3MNTv6Ov*dyA?G6zԚ}겡TK*ٯ1Szw2ˣ<^`=tLP7{yzZ ^^N*^ry {2Pa=6Z?va~otru8斫5n!bۊ](u`* eWFN&'WN)ryXn]NXO X$r`T#žt#+uTԐ Q 뢘Œb=qЦr]ټŧ,b:c8(7Xc;wӝZ|b&#;SColEJ#3?3>?i4̉}TbT lx] KDm fSTK{V4t2z:v!UxLQ&Rx`"?fBvb 'mw`:TďmBlf2-#{nنSf浘mOf9&UD<=#v" K(# ]nCd$a!Hü8xNR\oC0eKdfKQ\dR;Q)(*_p(e  65{T'WxqOHhNWyAdo+Jd4OXI!/EuZ~` ]hv8͵h?vX֮ Tv(97JG%4 yvpI`~ )GLE<"JF%j׈3p Q!-fٚ=zUZAhijXT8=-pp:mkPuC&6n:l"$k'itPЗAVma\&i:N!9Ko< H]y#H#bO͊SAfФ'2ZdP ⩣L8R,$˭P^ V8.HJXlL!&wNsiR4a.ܑE!CE8oH JiI4;` >3\q} k*L3鑙9+H,^KDt/]ƺӗiF.[az,;/=sFH "NVcz$a"LFk:0{AS۪6?׿}%eË 0+T8 dY?)Ǯ@}w82N_z8 W>ȥ Wo.@x3 ҷ$tYz~3.T{?O;cY W^L+r"U?4oHpt7U7@}ZXls9EMs.?^ި@&+JqSysE}"$u*,*S~S!>_շ)Nk%@-.My捒WH6?(*>h#Kp$2RG.9uS㑬]s; >A:!tcyH3}EԾIj'IxI8a43z}>DUwZWͽ ~'&Zj.y= k)e4$l]!eLMKv 3hbyjuGihߓ*)%OLT;O0l+ ?i@07`yoshimi-2.3.5.1/banks/chip/0029-Order_of_Chaos.xiz000066400000000000000000000077401506652756400214120ustar00rootroot00000000000000]Ys8~ϯak!IݵL:jT^KNEK͉DjHʱoMSSIl ƣḦmo*. ZӺ4Lǫ/7hYf)^v7&Ŵ/~ ]뵧?ոя/`ͷQiX5H&:_̮oFvζw K}Xgm6ZbKeoFQOh9nFjz >Ҹן15B"LïwhzqoXZn 4c57:'`PX~ yHо7`msMjXn?]M?7s0jvjMmk~?8هiϣg`?5Nzw3D]{iA9= ʠpUl͝l4VBuNV~#"Nu:6A7 [QCm^5Ș~ô!|&3Cp}5OLj@Qqt ky6VH#Hk-,V`hjtuq4I PAMG%ѭd9lxf=Aa ṬצDP揣qNzȕa3&Lfz53[a.3ꃧ 1ۖւj}< C?]|~ u WSj $6*1a" TF kŠvFsTDδ `b86l=-TF ۭ5֯:__l>o8I$B v\r_̾2(mRI;+*| B{0v1ܾá\(C[홪ǔ8@ƉM8WQB@O;_oFÕWȽ*!,;CA@[`1Muư!*VH6h;z9n".|+Āf?u7\YW{IPls3^D(u ǒǁΐ@Z :SrqzG `s !]1??yg@n qY |H$Awx1.JJ=d0 b M+Te82gt#j\Iɀ_qV5'!JCh\1C*J(q/0rt Ѥb)Tqm)^9+R:},~ϡ >B- !.fb}PDL gL*d;U!P" 2ŖS>~AzӠb)TaHipNHnAJSˊ&rV1#%,>k!7,gEH 0='):H޲_y=%%z3%Qcbj,I vD RbJ؆a\1)ǔ0w<@{Όw8j(VzmuSTjc[!0<+V6gTbURSżȠpY13$=||eж ҸHɷّ&^UOx3~Fr24Đe& tXUv# Rjc1M@/PB-Ӆ"nEN٭5S(vGByG+/Ib-ahA?Mc/$OZ ?8SO; e>Xxּ }i6a95{+&~4]4=fOmW%E:ɥJf,*wzi!~hENGA# Iy92-e-e~$s;`e~() sOaY8T "0 75)eIxkH '2囧f/4褿PlA Xۚ+KogDh1)*<($5,⇠ ;oxckH:_FW׋T-죃ؾ̟mּH6ZMTG|Y&v٨JP ʿYx1\l+"HTH'o$ C*$u6b@#nHcrf {Gth8A%[_[+퓄f}G I/9~N2)wʝ@м "B޲I,_Vd QAQ=CRzG5Jt~uFFkTOv5eKkTޞWx`}/7X/$հ)zİc!YExQpLM /jXsb?T]6Q}+8 \#_kT_+] WQ_i*m#~`rx'zU{ҫ`Wd-,V*wǻ&|\~B_+m^"rW3(YeN7tasg>snsus|g/ |у%rEdCIqRyAT^P%!wI_*NgxEn3Cq"|Lo“0nx6Ft2Jg"nSH5_$a@Ş\i6سn{Su_7OسmnaH}DBci9؎Tbx2 0?r2Gcک` X_$VpuKlTG l'I ^,/'@^GI$W1BGYn~t A7D80q;Y7 fդNd2l6nۍY:yoshimi-2.3.5.1/banks/chip/0030-Chips_Thing.xiz000066400000000000000000000077671506652756400207360ustar00rootroot00000000000000,`]rF}Wp`3MbdŠD)"HBL4V~mP %9==hղq{?7}yW?հ7'?^Ȏߕ{OI'Wy%{&v8Ⱦsmqeo'>᭻rS2~5 <'2.9:iS}`&OƎgrkm֍/r߽ ڄ\j+ b~Lzp1'v%ʝV( ӢD77'ɍ,7rVv(ج/"j}+Ybruuqē6(NޞϷw3G)h<^zWlߓ:e- #}~_o>4n{wWU_%O$>Gk'm' wY殻XDyVGKDlasZ,t/Xl5/obvo6]/]'t7K;b*bRT Cq4Wq5]R2qJqWȬ==7_t |ϱnyAVά8ZHYlYbOA,f*S(Dt܈FqEzlhidX+۫hU 5 ʾs^TSg_ wם2;bTam'u,RqNb|_0"-K!W5xs:SAե7޶/!- [ 73s{w lB]: w(S]Nh'vR⤴{E-۸/, ;r<m+n7(([(gk>D`脕bMQG1ړ>L }fVwDvvh<-cwڱlְQ5 e]QI5,nZ۩MRrhu@MtǠ@ClMm2W ա} 12W- Ek3@rTs@- Z3B[ Sڌ $@Xͳ3٪aa&[2l a@Xa@Ʀm }d`u!y  aSFFF Fd .60$3m F-FYI_J cFkFȠ8 Fs Ec"+8{ u}#.t¨2@U]d%ia{a\)X{h@^:Kf#Ccq1VDcfYM Νc|a1VDVk7dQ4d5?sqUFcG;}aUF>S0v}0Iicb$u^W1J84|Ԩ@wrwߧ| Aq\Xsm1!7 -G~z<O7  Owy@G 9|%&9 pA^/O)B5Gyr0h9!:Oтto.PfP7 1^7rD ;$(ShKvL-9z0ut@xC9 P@~!7s܈hFW 0 pk"|BXb& EAHl(@6(B`Wk\( FQrU|q )+ L<-(XKE*P+nd3ln3= ]6CaLFqnCQpЁ䣆btJw$ Q~(Q " Ev9 t|ЁCwz6r2}*-P>59$IʧLBh]'hPV$`qBo%yN&$+d}F_]5)öe٦ߣwif gY'$KBT;]eB<4Y37A =I,(Xj_7 >Zh8|ȩEҢ-VK{J6+M҇E8_YuwWN4) ]^A;Ef OtI_?+e:3溤$oοV0t[|^woj9{xI.<ы=H#zӕ$|g8TĨIe2R2}ܲ:y!;xji۬Vv!]ԭ./ Z3V0zq,f̠ ɧK\f&.ۯ/;<8>vTL.(j1TR=QTk({Z PkAj O]TmmCpe|ZM'XTQ_ Nj?vLj.Px E2;NO;2P>C-)ТZC0"hu[Ak3 t}C Zu?1Axާz^܂u"~9Y=> ?Y?NgmYϰZMO:z6md⨭tqV+"vmе+@vDA-dm{dVm )i-ۏ//@m ӯQbF,]bF,]K_d]9^{/ѝG__ݩVѵUZte/Po|? A^dyOjS](*\WڧbOhDzׁ'ۻLinq3Ž7+ Jq`9Q)R.8*rSV\Nr_H}|:pήZ5ӿv7u ? PkjpV6{Igz:ͻ'y&0M=f7G0&_GSk4^ď5O 6`lڪ-+ڨv}Ew+[_ѽ6+__nk\)j\%)`Mk Olwrޮ'Ew|ayys+^zIK'zhzj4v\y49TjSh?*/5vH 6+*M/JR}Xڪ%vd}? yoshimi-2.3.5.1/banks/chip/0031-Chips_Plunks.xiz000066400000000000000000000077721506652756400211360ustar00rootroot00000000000000]]s۸}ϯPi4Ɏb˳&k;/Zln$RKRAp/)سi'y٬p/pͺ$iGΛnDxFwڟo^ۿ/'7_/gӅߺXdCGKn&|MO$ Ҭu⯡Y%J쵡󳋫Oӛ9O8^"kOOOӧ(viVGM}&uk_NuYZ3rz54]]M =)tEBoaYImxafnDZ(,}JU늀L9J!y^%}O_. y;jSϯo> 2 >ܦz}Kv )|ci0}.ЇӚ)z{ ԏL. 내^HQo aÈ'UiݼYC0NleY w YEؽZərES+\kw` o׺>AeBB#[Tq84^ #*g&Wnf`}7*C_FfˏϧFa[?q9Ćx+2ހF}}lp$qWPLCaAxRFT[.$+ߺ*epC$l!|-}/壽~pԻKVl:eο>^\J@?L2X29|KB#aDbLY"XzIi]Q7Jé,:ycGSWq}?Up%܁R^9pSV%iT*w8ME^K%-RLhyYq?]>/b4A_DIK[7Cw2q3Qw:Є%rK,gV%&' ,f͞[bOꕾƼٮl'5)dk+c>wcpU PfG,w52,Ane>w>iս ]TZ3Q"4*)n= 1oW|5}v3:3TUg+J7F~}Օ95<[ (C~53rxlBhYYC)GLF~0p1yUw=u=?|uL`lbeN†('l_YYp'TWH.Np[K+ZX ^e6cK /KŷFWqgYsW4(jNo֬S/޳OϷ/j4a>sZI3&[!熈(6D8 Yjv}q>=?ѸK9:-׺UT:^ObҞe1is8m8EKDg(o5 #?ZUϙ;2Ъ5w8vrQ`-.jm<m0f-ʱlʶbcE3NJgnid &* F6͗ GOxd\gⲨdfMeFc43Y7@ͺTwͺs[ 3h]1ͣLa&KQ.ŵ59D\Rf@1&ƸF1q{h45c=k$HQ#q f((רGFQQ֡rD\#((GFQQhX \FFQQ6urD\#RtS@]Fl7dJmF$ht[@趀D\#(H45j\FFQhk$5Phk$FFQQ+5 =FFQhk$FFQhk$\#((4EFFQhk$ʵ6rµ6r˦lK7`uwfs'̪t+9 *݊sJcmup4e2`CpX꬚ΎuX(/:X0ֹvs[740,pƔljM4!ܘZ:X@aLv,0vPF6|NIqzh42&`*P $F6"G PX@aD1,0"G PF6"\1Zp=F#\WA>bF$ϱB 4bةK4`pQhd6$GE$׆$ϱB 4bL5~j5,"hĮ `pFc!9J :[٠A }j,{@,\FƏ"صs&9PO|7PCAB#\c7p s$װB 4bj Pº nŃ 06un? |o*ݎuxpw;tXi:8ijcU*ݎuvA.؅8.ktpn:.[ob GnJu.*juMvqkgp Gbtv3vq. ]ufX.bq:Hb:pqPRE 6uSE/]y/0Pw@y \,-!: 98L CgXj`4S3,ve kNv:*CuX졆Bo3Ԩݺ ?ԩݺC63,zn:NC !jg*J݄K h d,"r쵪yqKeI}ՆLF#v@^C*NUE|)3LTB :$}V 0_2ﻋGɮPce  &umVF1nDVN ̻/p΄`A)*1Sf?7A& HsR~/U{9%V_9%V 6L}U Q\3=ee*Th+J\0 \(m55Ni&у $(H*/<~5FN$B` ǕFGiR5wrv ;V,ݎ$^}8˃ʺ6oyXͼ3WĆyWRŹ|A3/>5Q). '҃`M*VgTssRv*8T5e Z#J%R{TS*G&5i ЫQ ` W ~ΰnd Y\I=c О*i y"OdUw$!Ë< _Va ksA|/yrEûN5aeFl_G>:hm)?@B~~%AWjI:hyc[wnw¤ܪr3w4uz'*5>Q}Tä)}U=Ѱ*=|$DMˑp8W G¹SH8% G;5_#5`[_}LxP|nLx\#.i2AnijfY7`Y֍,Fnu#7˚Vk fY d]{_p<^/8"}/QgPhP䆹D!O.8Gy:t1%ljyua -%tU"?ͫ-qppHW^圀TkGmLIl*\'B[0ٝō~ *DY }~0ؖyOqU<Ҩ.m ÀMHyj!)nl7d|vM j>lyoshimi-2.3.5.1/banks/chip/0032-Chips_Plunks_2.xiz000066400000000000000000000100471506652756400213450ustar00rootroot00000000000000]s6_C"KQmyibls-Q6TIʵ߂"HvIf ],vt8 }yvp}ٛi?헫E|ߝK=O7[(~e ?B>}?_x\.S1Εt%6x# 7O8smi# -Ztgן;/vh ;?=M' zm볟t;=4H[jZUf^ͯCyޓ V ?бθhV*5H c74of Kr_Jm uM@0P\>+?zh(čҥ4Ze,Q&( a:aK8ȻS˫`jZ量(1e L%g`99Z[⥿rc{I Q B6oh!KswUwܵy򖩛Ns,,6T册YHioLursޥ::dG TZ,B?VM,mW%S1&l4,Q{eeKvf32s` KPέJZ bA, Wnfv }unO>_{x-@)weKkdpAv[e?wC>^^>,-ԙ)nyq⻵ʲ 0\ʞWvgW3z` yPku+V9 <h_m囨^nmH=-*q#?9S6vR0q` XYԙ7O#_Ǚƪ?宺J\OYfYzTzHe +gwZJE7^ (rMco*o񼊬hN_W{9esibq_||QE[:tft趾 y0:zFȆ F$JR=斩`2G8'*ND%^/n./'1tYMQέkUv aqHTT-/i#?i//oE8J! 2am fMO ~=tFynf^)=!CE#G 3,V.=m'6Sᙍ0g-ʱlڶBc3 g74l2iK5 #H( g"Qk2e (<-inY?S1PYY?A1btg 3h}r1Ӥqc&`&OAm>5:DbRf@KcXKMaư&vc2nJxs k4S:İ;!5J(HikuX#Q((dIik4d,)6BFJX#QQ6ubFFJeG血FO4z,v!.*) HiX@JR=P;=(Hik45jX!<`FFJX#QQ)bFFJX#QQPSk45R)bFFJX#Q((oobFFIY45R)b ͬBkͬŲi2kDž0EYۅr!fպYn9YVۡ6{`:wl2`B!8v VSg:,@,D1;1Mh \%<` )3kn) nJK#R%i S` ئTL`X")-p#%F4#` %k4P:%&` &;FbۄԱ!59)>Dڄ9Ph a,!=bα˜ԒIIc ҈]05kĵq3ְhF1XBaLj 0Zy;ik0'zÚZ% TuCd6"qŦ[۝Gcպ] N~VۡO.n:<@ 6S7MPWUZC]28viZL|5g'n:fg`pjVcp֪u+[ڬUV;,6g . @Hb7uv30<30`xA]a]ay:I°DCq*ðTϘRߋ/P0[/Wy0Pw@E qp N2@wXЯ@y;[~ x Ϝ:SuXBfhy;K?4鼝_!:v;,h0g :֯[|ɢ=V!؇|&%B*>w9*6c6U+$+y.ҴBUyj%j_5XR3MF(t<*m¯ݍ .ǒ"ިlO%ˠԗYobY5|y:Q3R2D&Py%Z6||.oN?VZA :; |fjJ1ӍpV'~UjW0g )*19N~ ;o'\K -(/jIՒX7y*TWٰʼn=sKV\wR: Vpysd89E'TL%fQlcT/0jM#V. %B4:ʔe݃)1[MY4q;*MNF5"% F@=sj~=?lқ󞨱^y+WĖu׎ ҝ+/'vLJ2˰7<<$Yu)nCBn-8 LyOCT"dur=m\ܚPMg0"+LmjW*oυRzլġȟn+t[<کT9f^{(JNԉ^hCBO_3 Lfa2WOROBhO[+q'ɍ}90"RV9{q20g!^4<ԀXVNoE~u[߱nAԔ%p݉q%F%׋WxG(dh2ac0͘xߟq*:M~Q9D_h@˿a>AH48AeDZ8ANdTq).#Ņp).RIG+B{ #55`;O}LzQ~.{'cz=4 UY[a]խٮVmWu+\U-Rԩ]" Uw^Wk5~BkOJ?,'<$Xf*4{C5ꛗaJ⭟wa.­K[hjQJ{⢓Z`Cj۫"d9r\kvO@O n+ Kܾ bCVT =|2sa |1^ > ke`pr_`Pe$z c[z< F-En+Z]\ѭ 07GڑRKCR|ypeڵ1@U}{d%yoshimi-2.3.5.1/banks/chip/0033-Chips_Pulse.xiz000066400000000000000000000057031506652756400207440ustar00rootroot00000000000000]s8燛ԑ=vuY%v.q:{0hkK^INJH ,qKS$AAYl?p<}x{Zҳ}f19qOвwX$$ כuqv؈{yF%͗!yp[$ug/w6I4\ßƾkamDրzX%@|K x󌸪Nކ@P @ 6_#&IVQ4濧|⃀K-}/VDU0\4"bN㋚cRYI۵L$hfd(f ')%7(By4] =A_Kzq6=d^-~GJ@dԷA|9So Z mC%uĵ ("7 }u>"YN\A̓Ndt0/ YX[b Œk5 ,fw -,\ EsUΨ%IƉx4crwۊ`>c,k+߶5>8TW%<&Ba 2q8 # &"K<i[ompUmkǵa 9ʼnphZ|ף#Y&ZLl)ɯוخA㵍Q_nHQAv3j'Aי# s4dCʗysqsIzN[DMÍr Ʃ!7֤i پ.Z%l%yȰTc\33>Z[Afv]v. lCkkrH;G"Q5,=7C~ǵn~$0_g‡=f<}Vߖ\黥G6shYg1-Dcj25Pyq(y^?=3-X7ak|)j< spT|.7Fg&1aǓI4fYоh0@MPV`҂ Qd'/׌]D=xU`s{wc:k1}|QEm o}9x`tJ*O)Z&+4{0c,QyD<ɸTy􉈆+Da2!;z>FQu26ѸW Gd:/cx` &%`^m]EH3'aݱϔrе-8AE !8 y(A^m 1qrWnwKt|<| M/X:ܽ%YmEH<.Yi a׌dVG>yřA>mI uH0yQaK7M3`ݐ=[+p"[Jsdfh0V"D5XNՂt7v4NG]kBT(3,dY"  Iƛ yžE{CM8 ;)BYfyh1.R{LW -_UXeb m6WwEL:QÚ!DXI l(~^]gMgH~łӠ+JreHz]qFgFEA+~0$#F.T+R_D*WOzSPE:g #IpH4&b%Ԟy`x8HJHľ)v7.o8puЈy.n'r+.2Aq;F=2~mjﱺ mgmKS?Mpmk^L"-uLFaHmtWgMӔFʲlj7$gk^>Wg9DGpkNY\bָv+?ڰ׆}a^Rذ`O.Tr5ra,Pˇ\S\(J^Hsm-P(b{c½8ّyQX57ܢbR݉V>ܢ|pV`w~GBǩ(q^eYV4Bs  O:N'?5M%Q9 X X(?QUgC|Ƴ|kkY*'lR%^eGT!MsV#.(m㈟ nnjJl(k(KDmOcqT]+_d嶾ԛz`]EkVU&ǮY[F7Y[jOQTX͋eyaMV%ݓm6{=]P7?M51ڽK RĞ)TKNGu:nUȤNʖ -`ڞ? [T&S"nUּwHFwe-5 mF\78ӗe&u-v]B] u%ޕUZZוxZ*T'_G9E##H057f#"n5?ߜ6zN.&7_/_bqzg>VĪ{wMY= I]O~b5.kޅ5+4^O$ Ҭ1W`JغHN{v~zqi|svq7U#$};o h m6ZrXYrn0zzh"Q +K\oaYNMxafvDcX,UJa=Rx|GU_,|| :;iz~S 7]tL>mkSm$Lxs$M?7o0Y=Fl|hy;?mJT#=nj`!c"쭼oV僼,ذyyjbCFmZ g+%)C*یk0zy߂Dz-+ฃ: ZxY̙HOE|-x_o~lL- iԽdz'ZOpKR?6qe3ʀ$~O"+:(=\dwNfI?*٣]%9Rapo4+ f<Vr-ԔBʲ9+վ^usoߝ0mo7>0=2xq9-lN+D0w< dҋeRd?@ 5~W:n1y`iQT bP༠lcoQ^Ҹ;v`mN߯Uշ\=shˆ~}3p{]βg뙼leoh:mgk8ΩtݡS+& q$6w0sj{&gz rF|ši"X+yeVfܸ +ӫ>O'_u EmʤH2y'iJ:N_}qlfj\gQy|XR4.J3OPG)E'M0'%[#]=$T;= `jк)$7LnJS8*%?%GS!^Sg!693eN0,Ĺ ل+=R4 -*ğS-)`rF^3-_xox+~բ+ G+NE#"]! rwnwnl&zm(W #? }qyqv~#Bap93d0» ⪛vZ:aFܐ0f0bNjcT +VFx a*IiciAAV؃^CY$hi gm ɄX&)"2nB`.WOAFk(Ŋiai#\hl 73ZوMFlD w5:Feu0(`!F cAC) lH9.0V7haa,^kF66L #R zͤ0!5BlL cAC z(a!F6LC5X, oA- l@3ߙ>) l@YUA؀*ؑҿ3)!2>0RCe} aI1QaP10@F # 4#c'RS,W0ZAh60ZAXgpw&Vk< S`!F c< L c,NIa aռ^3% ;ZFhaajDfzԂsfRA׺^k'X#cWMO8d%rNC-pFPƐFyQvMKcX#pnl"Vܡ95Z-aAl|1ֺ`[4hb%푼5iįH#XRs"X3Ѝ`@7 HcX_gjw}Rq(~?*?;P[>4|K;.wNyeԬ#h|506[˹;beҦ̋yX,d]5$پT-YUNPgV0E-g?UR} 5Cwq=9(6pFqF1dU)셙Qxʗ NpsHK9gsYQ*b{4_^fX[IZ)d!U>GQ8B h\ ;$gfmW~جv-V#T^kj1?K29tE_k G\1-/'G?#l5sbO7N)9+ Y!ZgzO<\qKp{6dnuf|F\B50'8h1{)vC(ކmoq:M> y۪KUdc4ۣT@kU|3ocqdEg7ɂqS6"Ǹmi69p=mqܝ?\&36ۺ]!?Z挺^io-N?戆,I1nc;DLYqK8cc|1n<o;myD]o;mDŽi˿BƨkVێa[Rem@(kG:CH掜Nmmsp=[Վa?iXVr|8;WDqvdA-/og6g wņtk&'Vm?0xuCaUê>ׇU}]42êf_VKX29D_"c3/gɖLѷLOO WjupZ8"~}bFŪOq2\ZEwrZ)WP˕ġ*}$JR_ڏ RPJ m^;vׇ+]Rl  CjIͪKs|Kk&`Ș>@opډGm-b9ImͰdxy/ ۪dS-ׯxNy3rXyoshimi-2.3.5.1/banks/chip/0035-Darkness.xiz000066400000000000000000000057431506652756400203060ustar00rootroot00000000000000]Ks8Whu=$wm)EjTk^[Im‚%D"5$A)RLĦFF/m B57f5?._޿zߣ7^n^^o~i6ף_Wb!r6KҸ\F%^Wp)x  ƄlQ/I&tt6^^_9'}ۆGvλ,|}l AAJ⫱ꔸ%wƲ ka]$M>ȃsW "ϚF.N`^l C(d;뵳誚JaswTdJ&wt!XY-zl|<#^QKG?l(F{'a/kwz@x S^+)2pM^;ɕrGºhw6œ9ݪNl»;DBBSyp=/(0a:ʎ|A+j\l}yXHdn+lPa[{O<{ss9;o@xY]xWwm2>lH;[F6LyXNJ֖~;L<փWw't>&\aL"H%Dh)  &+ v.d>g 35d_^YXց \R&C4!2q9xNDZYفuHyhݺ;64!J̇c{79joxD=z:mJΒDΝ@%33RY&*MJguX9wڂt!d*PE\^ֱ1'7jV6oOw,a>7H;@EC%I"cRC$D<"d)Jus9' (\f^ ̧Ī fU@0xqB\sCpQ0WDp)wQ &C]i16>ۀDs.wCDQc C@SBTxxK5,'Μp~t96Y(y!*;V7㞄J< 45v7ٹdMfn2^bDF%L ^Öԩ 3ݏ%Z:mrpTd:ʮ2꽗)+S+wpC$_3-&ё%TeNxȱB zYZ%XUi3#_2 "֒Bodb{ay>rKr\)Ŵv"r36L$Sm`MUF5ǣ3r>غH̓i˽ ZE.JQ4]'# Q$^?r,yAFR\;sX9_8,kbي<ÒJr=P:'XӗBP|-Ps%QqRh%c})'9YvyJn4s}@NB9α?Bm4yswcѹ *{9J9| ct#$7/sIs \IƷRUՍma62'}]9Z $J rĪDPXuĪkUezUjB'Ϗ?tjQ"gI dʽ%|SkG'!H@(5 0- KOO;y*Ӑ.Kբ;3>asITrArv2ScR>a>VܠE>esbTZac1c)5Kz혽r%`*W~޶oryoshimi-2.3.5.1/banks/chip/0036-Darkness_2.xiz000066400000000000000000000054401506652756400205220ustar00rootroot00000000000000][s:~_S;S.u@6!S;R >cL8~[ -٘!30uq>I|uXoUUW+pMy>/>|p6UwtӼ=sawGIu]UUvV_}<%Tfĩܒݺ}kj9Td ]DxxجBG'FOfSߖxƣ+XWU}8N2veBzO_԰gJouYՉpMg~dwh>!6mбZ,'lXZa;~6,}(dX˥hɚJA`9H2yb_\{A"x\y j2=܌xxo0X1t{ZuZ.ʳݮ,?vnF* ϗ䲢zLsHU wC~$'ֈV> MX 6_6[x/ '0mlJ4;bL棛m^USg9q-:؉=x :'Na;Ƴ?>5ҷ\ΝbS LP%t+{ pKςLd0TFw (G%uuc=Ρ.XmX7T1 _^*E!u,Vؕ`}<¨ЄyuQG:6X&vzJ\5e 嬋zmIOp)^\c3&JQ= BJ8xZ)o2B }kIg!v;('sh_6C2MXXp1H K!3gBaa՘|慊?ėni~0Ȼ!O9#%ȔlSó% 3uQxݚ#S ;#X9Xhn 1dz/JfW7bp>V/Gg䑍fc! z),w,CR<LIÈ-LA:ۤiaO CeN%[3zQXڞ!&6XIRR,kD.@_xyIa5*pq#nfɀaH>SڕZR#TKm./cҞ"Yk"N68r|<,# f2^K$Q1j]_!,Dp 8B0]hlsE B4jK^MI(z+=<~+wXF BN€|5|*\gl<`^kxH5<KtbX ֌yH>R.KT"1JdyF<R9N5JAdC@n2xB{ڤ۩V~!h^qa hIQIS7,ޏ;Ϋ'I倳j66}.YAJJ΋?T%H@yID+9/+9/`tykrjOJKN^[^՞,Ϸ]紮751ݹj4v Gs[Ӯ5N:b;K/D~$+3 O6qjdK{m툆+9Fd]k1خCG'p6o9dmև,o͡d/_50ݙqCY;حn\oL&ڞ| cq'^,GhXkXa;~mז[a-ɵё5 ~yDߖѓ<'6B+oਗ਼Log7wt/7f'uoV`zF4Yl/gYZ^l_W9~<&ǵ^־g'R]_8 JxO|Cw7=sv t cS2s}A8 ƞGŎ~Y&ÔY_dNr\\w"a;ƣ0>/3:I3o9s#p9aYR+7`d#sxoٯH*@(= KZ/ //&L@쓂4 qˤDG$uI`pC%H@Z0~>)eTX[2}knsi_Y &SY`rEcلf(eK]6h6any{Ö_~/u,_ ϲRʴ<T;X 0f,{{Db) `~3稅E|ơY[v,ز NUb.sh=30bi>w&Iw/֡P\%-w×K a9IG,x+*8X5yS )_nX jFi=:@=yob%\NJ6:tр,yҭ!lH8'➝j ᪡^JV3Vdr2P4En0]'}Q rY㾈Ѹe=sOG߲ lϷ%Zki t ?wZz2=*r2CgZ^k0.yMAu i)~FG+j^ʖc~iLr|i}Iy ۈK=Գ{j452xrHJO^#B$jSqLX3g]TTxT)x|d ?T. vl?G6k$s/wyFv;FANd;__zgDhC1˛怈Q!wHq<si^;OZdD8PWЄ-#kNhL LkHqGoH $rz51 m8[!2w qL8)a UD}Ld{$-%Tmqt& &#D!8Ev0tV{L1qL9>F#2,Zp}f֑f.$ I!.]Pm"QAu")٘|*B߿l/E$⹁Ӳhr! ʻ&",.PdjBޮP}~/!X^Ŝ-GCQZ9prmȔ )H_2ɓeK"M'O'YlG\-YDs|2B"4i86M(BmYfBq[y20PX0Fnԋ<&OvASiHP`^RX]JYNt:NFQ$B\7v5R|oӵѷsօ =)*yB #20[*04N`}պr`?Y뼫)rS8ԙaUBh*"T`-~~axj'zx$:N2!uaϜ}uR*%iă|-OGl5 2vUuĶ c[U";8$AFa=OC6(m}(,A2,J2uedc PXRa3cx,RQO6;prԚ-"tT.A)?/`JЛs)[U@)RQtixie?hϹ PqX Ӄ+*}[O 3"-$ Ok~#i*Y!;V.qp?:}sȒ57[! n?oJݳswҔaQl^evgSw=tN x^DջARfy/C| O0+ ?!B~yoshimi-2.3.5.1/banks/chip/0038-iBrazz_1.xiz000066400000000000000000000057411506652756400202160ustar00rootroot00000000000000]Ks8Whu=$2zęRdF챝f/,X,N$RCR_ $6Q=8e2t7~෿o֭;7?no-ן Ͽ=n>}=h?_LZ{G$&⧬G6~%2]g$<&w[dnD+oΈFk$(n[1hazz>ےй u'=:9x"w#&|}pv>WPbj:#z?8zryvƸ![x|a`lF/V ŎٺQ6ҲE09r΅>lU(4J'E*Ӆ`gwˏg5[n u>$߾9N"UkwUEq]aۦjip e΃ ~'PnqЗZ=Dfw3S] B)< hI^:ɍf@-G ff28Ųrw6g!/h0a‰+ZZsyv2y RtJ'.X}plټw7sq!܎̈zxeC#>@]s/~p@H:DTQam]KDkz hJ{z0ݒJdEM{s''ȹ VW[2t]rwNPL<H"(Y]8vIU,=߅ rR"AgB1*d1S &cP겣KC9ٵW$ۧQZq4!uj90ZNJ,E:v%j,uWn )Σllk/A8fv3݅&up3;J 7 Hz&|է?Nfe|aSf $\@5H1o'3>'w(<<]垲ϗ,hǻv 6)D$7@x<3*aTKQiQ5/3l/X]s,{yK #uClsSȳyS1N}}QRʼ|qkkqLt?ӤOi3'{H;!8nHޏTJ·K]ծVNn t0NOOǓӽ%pvA!q`#ʡmTxUgfD+"Gy7!cҧlP]!S]JA eʄ#t/R[E tAğrlbAVVf^cx;A4xKM%KQ^TN(f 5Xq/aK"ejz/ [)̳r'7tCWy iZq+JdRIؗiB[ure#X}ezzLYaU 7zR7^R7¯u]dA"^}/O5zH,SwM83 =R"psZ fu=-R*Ee:|G˜l|ua), #! =P$QLj fy*PI%|6s ٿ́jyW3d-7;B eK۶sǝC%n`VpPmF)d })Q?B;vVҩSQ-Yځ)m0$_D?H24⬾iBjXa HqQ()|ѡ$T˓+qliЀg[5h29yNh2Km6hwkSTmФx5MB T4 7/ E/]MA E'BC~J᯺T*t٠IW M"o)^oJDMH{9(<(lMx:(lM=O6>a?n2gښ}QM}vP7z~7귉t^&SdNO(kDt5" |@׋_ަ[!Sc|8~N7fw7U/m ~VxZ|8yM̟r9fUNJlJfUPcͦ]Κe3rjck;^XDYH;_ $6Q=I24ͺu熑mQ`ק޽zIhݜ~W{!ql/OW"+yF9icruAvA6 h_MBߍ֘aq/V&:_3- X|qۣW.r0c7j:{(/F*pGĹ]&ד˫th6 w6sS c4z/vD Ϗpq}-zqKw.a~>(gs@ ,)oN7M`VMgWח&kX73c ;}H}s̷ETƫЋ`r+o5'N{?l /z%{JSY >B)< hI^8D3@y"zr#s}rV)bdʻ a™>x}˗/*`DFp@$& @Uq>ϮG*/ ]-E4:0xRj05|S̶{K|gpq='l9-d[ī4s;w̽G"RA%?vQ,Y7vWȕ 3404⹰bK["&𽹓]܆n+rM dib5lZO}p;ZLB(L\&$O pX,p.]$"Zpמ 3O,=ӝV6DD])Хg+Fx@7S!&xDFLLt^ACvr?~H??7`BdqMMXa_ ԬĒ7(# alWRYq<[Af+S Cr+Z*,NfewCd #)@mM/=TKN1(gNb65Y>6"!ndHޏTBå*)PrANƉC2IUJS `\cc+&{-Z'g~ɽO`2D}rtX ۞b@_!;:$3Cf*gG{g/+&P21;Lk`eb/$eiյ3PEݱ98ݟ wk'JG7y!9s#I2I|6b3`8ΧޒB82D;ߋyxbS_'ڂedB+G极y7!c^ʧ,P(@iWT{PB2f$\({dV]`1[owPU|8Q {ХYn%dy})EJ;%)yؒHY`ы¶j< ywCnԆn./6M;nuZ v 9(JeXDD ϪXuxA[Ã0< eXUa^W+shE~iwD$R=[t Δ…B(vYflТHwQ:>v3d \x RAamd`g酑.! = Q z dyNT8&˳tL1dN+o*zjc(iD\hj>})m?|ʡN6vm [$n(5bڟA_]WbCjng.*:>JCے(HZRj iAVR7K-4+ #%^Z/:tw"j{r!Zm6^ߒ 41TجI[=dCpV;WOҟ\}I_0< ]u;ߘT4%E[5k_61嘚IJ&*YcMɮ g6$ׇ>H#=8D#=|>fnaM1QgTH5އ~>~?Nw߅VzGFO $E#j)H/I: /w"+<1 Ԉ$D툙*fjH=b& (Y]Oٮ̬϶[Lb+Mn5GQU=zĺ\rwJ G㚈u .W\rծUxos\=Q9Q" IJ`.} ݱ;-+{ѣ7mT>hرM%cסhusizҘ݆jn*]'x?`VMmyoshimi-2.3.5.1/banks/chip/0040-WindSaw.xiz000066400000000000000000000072641506652756400201040ustar00rootroot00000000000000]Ks6Whu=H޵I)\QŖ?hH|hݞ9)A+3VLOQ;WU5_^]t0ns>폿}'[PǓ8Hhǭ<߼{[ ޼o <ºJіk?iJSb:+e=!Rk=!xa00ذ-#1-c#1Ha a00Jgyjk1ZXNCe.*)+t1_IYo9K*ss1I;Z?8XO[;'o;'vOnĚ!?zO9 =槂A&n+գ;QqcGGְ~X&!:GTۈ]3ص1i19cؑ?pĸ3 C 9nԿ4C'*H#Xk `4҈]҈m k xmB1,@k 1=ǰFKcX1X7jw 1= kMڴm5Emڶтeh˄&d1İFo^Zs2Dzt152bb;`:R FǩXrþkpNĩX~mr 95(%mŒe"چ=Wȝ&D +aKhc u-{=gI:)  R Zs3FKp *C1ll:B'XvZ=d}ϩʰyayj1,o@^`Xހưy~мTֵ.7 т ț n7h Iayvp 7l*day6wk6kGv ؽ`6׸KfTY`Vkf\Y`VՋfdY`VիflY`V=k {;@ʮٷ7{ H[PmmHo q*GNнdb;ZFGVޮ4]($q(|U]*i0|Ǜnz>>,.~YhD/ '(7DSʚ9peyuwz~{wZˏm⬨Hˊ|g/L9mEƔx?+@V8ȓAR(H.C!s0<ISM4YeIt֎H\ *gruv~ye`F8)9ç*uF$./(gS[gBrcL2a\|>0 B0Ǜ>RhM* 65qlLײe7NU(L9'[6N*x8K4vykLj^iN8ȼTh8Lw ~I~&y2sLnRƮ!Fq. IR6`,&r&n&S5TNCnI65R֗Qt05LmQD_3zlq&tV`A֬S>m^0>hP<&\v3#7#_'v`ȿ8 *^z8p-A_`dqц(q-ΡN9CJO)ʙVQz*V\BP4ѩᜇ/'e.1bEU#T-jqU{GZP1>z,nxG\c+ɊUlvry%}X2Lg+2|ϵk1F 02Y\┢Ï( `b37q* j=q9^%5ݸJRZiOPS{kѲ\AWuLJ?T&0+roy~t->sAG P?z+@|UG޵g:ǻmyoshimi-2.3.5.1/banks/chip/0041-WindSawModu.xiz000066400000000000000000000073141506652756400207260ustar00rootroot00000000000000]Ks6Whu=X޵I)\QŖ?hHES &kj~N5t=mBU哬n::_\NfWskC[?'ggk>_BQuy뉮W?ɪ>v^On&ӻmvǍne£N:BAIܭAn㇠-T,yM@W+!59Jx|WW[.3-?G+x^r:ˇ0c[.o/rI}`ӧ8Hhǭ>SI_×~lyE#? %M_~J{_ЁjCb-F`k͋-(IVP0*Ңwv7lZwЌ;qov~"ky#pذn *Vof&EZk;0mTX'&7W٩{}su>J~ߕ&S}|QXAGUc^i]~`KXw 3//X6P:'\J5@6бtʪz)RV`nhE$m@V!$٥  w-wp\ݞ.$H CV^8/௢w/t2B0}DoqH`8L./C4ZF_s.XUѬ> N*nm`RUASO)fR)<^Cu2\$_:qw9yU:,и2MN¥[:),j>Y O^,*A xN ;__. yȵ/.FZ:pyqDVc 08$ pIAafY?@W@ Qǩdk 8H:Hv ٞlBv`!;YȎ-dbe&` ˱c-\ `S±x,ZAAAAAA>TaaѲ ˜ º6 DoWXa]umֵAXa]umֳAXa=6ٳAXa=aPqA1=a|, EmXF #ŞQ} a0fHă˜ #1F l6oj!-#d z[Fw˜ wa˜ a†z"QR)F !0pE00W ˜9DV$w"Ak{!FM0jb0 % F820ZA,!ca[#hA-!lC)!F c#1QտA}=zx'ګ 'Ugx<w9]{ϤDPyg1>wwTnҊƎT?)Ґ%ed;g4`"wZC0 ը|:*Msb=a:@H(LxtWyYxnJ@_4 z~3~:?d" ]/`dMzUutJ=NEĩEUӟOwaG,"/*ZIek)*|uϢvgQtEYep,7a=7R c`cᡄҞXx4CM|RN~e؀/I[҇pADWΜ l!B;կ4_ۭ(V8GV FAU8({0O\J=׸yu9@.mڔ>F1+P^z2ԆH}A4LGZ/Aހ*5d>VpQ\}-r_y%v$ 4D =i)cWd${oR,ZI0+`(ɛmrs k G:|OK-rTum{6b|ŷJ -e <@ř~&8{1Ȗ+ê.G`"q3xG8r{GH"w˓ZǨ,.yrQy`AY:W+̳}ϪQw:?ܬ=rhDLђgFU|qKN.D<]@ӣj%k̋-y>BcG7M+;_TAG$wr vsֆPi^s-<0ޭ(JfN-*}P(z=)[]4O4P{U8&7х3͒ޫK%3H ŹssEsBM,${ h܈8CKTS\.Ir'hܥ/^^UrS F9URt)#acr"z 9M}2`eD)fZFJ`B"-C2:ʜB(T/L8g8[S 89u*r$Y9sЈbYz`Y=i T؅w}9dwB,oܾeᴹ'ƢY9v0DQtǽe1|>$$nٲ2H`$ٌ+ky+LN3#4XœT#((uܛBDZF1Kc>C`Ndφi_mU>SVA:I1%z.MIݨe]ԉ9d@c4nE7𜒌75h`ڃ#s hb*EJ3oD_K{VJڋMTMB{%x/MkTfZ.+rug*2WכC,tkON%3R|enR,%gyk,{Ӥ31>[ 7bDléOkt-4>˃#^}_zWoHX 2 7 JV_C3{zrշb>WDV߁H}(ACv|Yt}JOo&OiC\Q8P.TńwY3z/j^`ƽp0>˩7ʼtH=ΔܘS'hcן4Ҍ3|ɱz#zn}{UYB]˳CvvyҮ͠4_&!NOPWe_ΪF$ ;ĭܐhU} 9I+i4+=JB6[+eTaxrݝ #߆Vjn40kJ SOo?)]OI|Uuײԝ̛{= &xh>5y0׎)ItXNHׁAGk t4ƹjDڃr>DPێ|98&Y5Mgh A9c?9wH4TU?fIE^UENJW[gP>quZޚ?~(l톦+lةn%ɲ߇liڳES0b22`A$Zڠ(NDlp]qlfDK+)Ҩ: i'WM' D`/P6CO^eZjj ^Ŝ~~C&-wSyӽnZpӆdFONKر<}a&so.SjHlJP qOW[XȤȘlgUG2D4A{'Ͱ|QL:aBKZ.ZLL]R$sˌ Y`^9'`0< -|J*C{PyDBM\&Pؾ3v#]Q+ǥ#+z5miϰ/z:&`>Ttl^SY|mB bEy.YOIkp`zS7Ό@bl> =4.ym Jì4,p3~hn%GUg&#YoVN)5ޟDt-MWp YIsC0#:߬'KT|ni¤F?f<=+spT9ϕMWT MUԈH4|wj"gܓpok=a'bz0žOͦa?Y6ZI bi BSsC!r )x6hy~Wl7EfYl `ǻRdk3U%2( (wbPk0칓Y–Z.gχ hħ9⎢bʼn;$!sZcg8qvrC"h>KY4,e {jKI˵>W<'#2AU&(ĻT. )@SmE3hJQaAx~$q!fͅEd:&I;tO1J]u2V4ή8;d@Y2Ifz<AcNLGWy-%j{‘?hsu! ܱ}yR1غaқ8Ds l$ɓ72aX-FHB8]8 )x cp8E&)&3M gYpvBhPۡy.ţ=,Q}|G?.GVF~.@%׃Qtox^%r0 !KP/.9Pq^GI'}x~ԗ0_fꕙC$KP7DgKP_"P:J e^$ϙz0>CէNys/pD%kTtD Y@\o՟qG׺2_ QِmyLE}[]r7KJi͛>פS9~z%SW)+R\| OMcJЯ۫lA^8و݅8TPOWsw~9;]Y3- GɻI OSSl{|cWgw' Jveplao:v)ؗ{dO)xpZG-wHE|i[Ok~l~LzP~nzN wH)#>B#>T] x}Qz}\Gq]1\"} #r~A4^$gIx4apy9X&(x2:% =,)N+_,wf@l @Yyoshimi-2.3.5.1/banks/chip/0044-ChipBass.xiz000066400000000000000000000047761506652756400202350ustar00rootroot00000000000000\[ڸ~ϯu ul`j96%l1x6d_-,[[60$$1֥/ֻ6=sWzB]˳}v~y֩ͻ &a;g۳hqۙMBe?%6w_mTe_7r#+yLT&VHVnH+g%D54]>Yj%!J{Lmx20r2G1oK|syK6}7;7\Q@m5YGuGjg5Ԯ%X'5uX{yӛtwǸ!Ʊ>00>Hv+~qB &077hC]Xf.F&].%q@{y'7uĶE 3gp<↿`ޠ|a+gZc*7F;AmWԯGe-UMοJ;?O1 [A w[ΰ/^53Ie:bS͘7-kYK" 2MՁ̨P,:S RE6MJa'KO,lxոzp-pZj9qmonMyED_;\dm].ؔ@㞮= w&,y v#c %Q*ޫd\kevQNa0tkq%4]4.wJ-u,3^O|rBOëҧTob2Խ5pI MJ7w&܎DʚujM) kǥ#C+z3mu#ȿ^ +*?=l@u~)kTˠx(I KL\KKqDw,awChzPWO$۳9T.7ZT6Gg GY-d W{T&JifCD &%dX"<U%E]GډDa4Ne.Z~@b3[P(1hKneJ>#+KPXPwC<iDITŨg{D9Qb KP/YPo.KP/~wE%5pᕂ)*KP_„~fKP/A zY/A} @0P"LH͙z0%OSU?2U^MKT/LzN7ŅůnDh_^UAw:[~̆lc ʔoGѹPSsmU՝_OW놗> rj.qF|c_A3-˝FsI; OR9Pl5<?pZT*S龲ECaU%euH\#{BuHÃӚ?jY~qDB=-W[Ok~Zi^;]hqlȖW̤ ϾWcpǔ"<1SG>I?5OI{4'i;i/:#xA{}^n/h 6 f^> //9D1R˩Si-{9SQՏr߯hxH_;n1Yyoshimi-2.3.5.1/banks/chip/0045-No_Trash_1.xiz000066400000000000000000000046001506652756400204610ustar00rootroot00000000000000\KsH`9ll,TLwOЀcTRa4 ̯,$QUʒ?":<:[JeUezU{dAާq~Q1{T]~ÛwiԫxU=ˈ+5 <F]QW?NWvŽ'7wfЀ}U}pEK*[k L=|-m_:#nb}OG׿FwdT5}"kq \@TH_V"Fč:$ ^34VX ! fKktKS0x"2 :NGߵ!RS d:MfxopT1.%W'a43|FӛI2|+b_}|Fl Z(rb sI]ˤDڝ DW>]$?FhPQk& ])c$/ځUV S##&{p?]|4AP0vQX thrvCC-LK&SL+طls+/'{ẸB7^Q;r'B>د˞㞤Wpso5Qt̻CҫeeK4zh/ɰ}R-DL&^8 K!!! |^}Zqiy? Xa(,'?@h}qkF%& 7*rM䂓dω4iIq}ehV۸8fA.Ygd<]q`E45}2ody-#)9PG/ewJ&40\ -H2v ɚi>8\qZn[gXF{Duz嵰Rh586ȠeY1tܒ/R~1خmmUy[4  auVn*aٓiɧe40nӠ6mi:͗j{!ܱ):ֵ^xew^x97<ϏxaC9[頽|6zw$>1OA䟧>wOc}_$?up:v 4ۓiaDoptaty98t) E{z)w^KHJ`U?sCq̲Hyoshimi-2.3.5.1/banks/chip/0046-plucker.xiz000066400000000000000000000043221506652756400201730ustar00rootroot00000000000000Z[w8~_gCLNqs9Ù2@f&#l<1Ǘt_%$d =\=ޏ{m/䷏6)VTM_4?ȃho,ژ[1}q׸G[g|,L~Ɛ`zlBbK6U &ŝg𿀆dnã;v4Gh[DWo6ZXxt{SyϢLuK5당{saލW2;qG_αbiJ#%g'&Nv XH/dAm6̒~@׈6 +j|B7Gη~r QlM&Ui!B]ño<+Adhp<{pulRhm *k\%SE|CՏ(ȆA [Sh)!lM=cREӭz"lbrut$ SX2\g!_'۱5Qv ~(MHd `Ʒ~ @ EեX݁]qF̓;wvC!pϸ0yҭC | Ȗ~4Ș/[![|ϱȎ>BHIbȞG )Q-mP.f?dD(dd@Yڿ'Q|ڪ ilu;!.rdR,JOW/QӉ*L6N!8P()Ɖ:8$K+CT㉈n`;ftc\SG- 1*'bж)|md֌a~Ħ봡Ӂ?խZx8sgrDuRr ru)[Z\a`%NSuˊ ƥ!^Yդmt}Ty~1c)ĝs7j+KpnW۩C.$los\$Ǻ{1 '"՜Ƭ:LNƳcIy1I)C-bTF7Ufla^o_J#Y0*C*.f %u#i MWXJhojI.J}@wes*5gO~xBEi\gZ,5t]М|#8cHܥ&d2%4?.Z3Z1"qCv/~r7IF4\ßs¨1"kzldDlI2b &b:$0|ƹhՋV.tl1Y6-L}w)|)PuFu93̛Xw7ܸk£&NR;χt#g['0]/[rX)$K9 vgߵFO;oaVMgwkcHu0{]''??Yk~7 }Gm[锜6n~^ 9&^Y8 Wr[]˧ Pl濧s* fKYKіH $v1 3s<)dDʻE\܄3}p=y˖+ G齢DgiR*Œ^c}-~E*w8`[Fix}s5]܏K Ƴg%j3='7`v&</SK? CB&ewzxl3Xه͜g^4cY3S[]0^G? 锘Qþt sހ-TWb1wgdQe\ tL 'S @ "sŕmM#Q4lk7ډ.yrP~ ?f&Ǵ+!, {D;fJ"&<.'BT=5soF_ʂmۉv;Y> B,Pj6v ze˃;_G^wbYׂ$4}Ծ'm!Su T*jCh} (3ݮCW`{{r6ֆ!6:qqϴTF?(d(h>^A%#sSyE*)Rr,9~*ձi.$  .8낰Œb= `{a;c[9}svQ-ƉA0#q*]fKĎG||NiAG{qbjWX"L]iI2jgu~4Yj~= pj6~gwtLW92 ͋1PȈnl8IjHemm>ϧ#~Tt! KPZin!dxN̲n+"G>%vE&N`@ ];\ޅ21#EpB5J%@gq\ozdNp~h%YnH.bPPAw@#Y))L?nI(Kdh@ F*BJB<) =m^B%m%Z,:C#8[w$se-@}Z`ł]Վb Zٴ]웽HY5_j_ɳc+"ݢWIetO-KgJ@1B+hQ8El}ZidiݳU.{ɶWS 4Zp>a)s#K7Rbm䂐dAŴfq4׭XYֆ35G9z>8:R8^(]ּӑZ݋O~='Q>%-@tmK /u)º֥>u>u+~%`nvAa.egR7 ۽6Ea] B/V}uK|=º֕85 RX{*Kx3%}սzQXºd_)Ihu)a]7|&+η5~[ok;y=3%9wşB_Ab:ޑ]u-|w!^׵d^׵^׵d^:Tu /^aM޵~}Bj﨑;: +|a{`L&hA_w'DB)ג}߯+y=+?g,cgO4KU[ˡcz}tyoshimi-2.3.5.1/banks/chip/0048-Glitch_in_the_Machine.xiz000066400000000000000000000150071506652756400227160ustar00rootroot00000000000000]Ks8bj"HQLɒ݄^86޷\,'Xǿm@~99GΣGvy |V޻h 4n%|zt|=fzÇN/G7g3o`y;+h2 ކYng7<>j?HJmzj_Fӛ#WΓ ?EeW_7/]؞FajslΝ3}X.QP|PP<|GVY,vxsɇ'ĩ:]\}>nĐ>`Nϝ绿v%Uv;8~xa_ ?xߎy46gL'_8*os6t^b f?v0,Uv(A"_g7 Ҁm6XOg7'1X8*q^t`?``'9)[DYv -!HGw̽ن)mqǺA\‚rL\i 2ui8 ٬ߛۻ`f'"ٗ駋˩6+ߦT<##*Ř(LxDž` 愅] {.]'-RKޠ̡#7EUyr摝l%ֳLMjF82&V*Nt*bomIaIk+>@(ٱ DI-8RV{(7tbLOrȉP.2MdXĖ.9/f;50[F(-c" -tt+mZKӚ%7L yG`o<*0Bn+A#1AO< 7T6 bل+)HF~oAg 藾L *r@b+זҜ7$rҭxhAO,:KLj%E%]on:` a ÁLΟdžbQΗ?y2>3?"mQ2QMi'g̝Ƚ6Ցa -mY2N%dx^#3ƙdr?X%q ]R{]4YC)Ɩ, PF+use^F$.986$WsA@_v!$0:KO4 I+])N`!*cwB@Js+ Zg_I$I6 @@ Ȃ S%#9v%X23pYx.c#l] Z myPpX2ԜL6$iOjXbq;va܈iFJm9 ғ;ef(0d k0CIqԆߛ0.!LH!{2Q+ bb:fB32=Ыp;ILe!p-ZI} ` $VRK[Ic0uZymyPpL,fX,0 0dmګP-3yÁ$+,3Pv1j$H0Njfec6)35f#7i)j$ebhXH bI}Ye8:XIN+k%Bnv,f&̌ % eVIIo"iI} kfafRm8V afҾwFCIITf'e7af% -!T] 1bPL,]>p4fV8`ᤡ,T<̤ں$rEܣ@ГIm003M8LѓYdeJzR3MI@Tv6i ;{1I;)e gf`vқ8LJ)9P `Xj(UԕԮ줎reݎcvR_u;܆Io gdihuK~5Ic:p.b921O%j0\\=w=F^|c+'v+-U;93Fh'a Є#b3=X@W"aiaJ,Ɖ @ !xMWN}!DZ"%y⇫lXC:_.Th69ErR(u5PAKI₰O?z'(H+ MTX7σ4sm1\xp@dhp+ܸ0RDxz q4+N@z {M^n,7oW 8k7 O#9bunk%t`2*)Zȉ?\63`X92s: [g}T^VoKd&M 5X-&|քϘ>M%4[ p_8KϓI*1|ϧū?-ޠۄV(M^0«Dw(Fg :{ǣ,jʼƨ́6ö(:4e,!x1Dw/Fl¶ zYĽ¶)w4͸D:2z)Stdb_SnmSkgQLy9*[L91m]ؔIamĻhG\R7}s]/3S5Pp&Uc9./$j" y7G)kjc F#3Dʉx$?s+eӏT]Z[[AI(&G?:F: 0p4Ƭº:sOa=tƘu= iYa:=uAX_a}u/k60G"*iWAd GОòxea EeaEeahRwlҷprPtaea)xg##u" V ,}58 lA| scF6T3jW c&<(HmdpJ;2IweԌ F[T6n #3FG>M;9iJTdd2u c`~</oqX߀QDu uLbȁJEu u%cK,VX(QCb>{!l,a9":Jb9ĥԺȗ#+QDU+M]KDmk%j#N=X2DmDaMs,9k~tPe,%XN@-D+(,+AŬaiA@75Hj#r ڈ\65.hEZ֠eŸ\Kok",A-F-j#X܃6_S"KtHŲXK1n,O h@)Lh@i+HZe HEJh60Pb (e*2PF ,gߥ%XKU2m`i.U֔lK` Fr,ukX =[ X^h5ӡJ4}+wVK -,P6f)-ld’j["/GVok%jc1@] Ե|,5rErX2D:X3!ܯT p %&GPJ&K#%Ul#rM͙XA͙X DmL%%jc:Te:b zLC5KJOn (-.<Ekc~3=4gH r:~^ P[LkjvEJ`yjb~]#P@W/hj]$0.uԺK`by_sNԺN`j'0.Z7 L+֝SR hѺV`by}5, qh6&4bƩDi7F;n tzV{"<+J;i)5[dxMxh?>>|8$.nIYyX®-/PBѓܴ M$kο+L{KH%y#Sd҇=3|J\`܋mԐ$Ϸ0"O-sag{W ڕ]e&.k,3Tº+QjcЕξL?]\&O{%6DN̳)Dʄ0], @1`K.l);Ȼvf]9!0Bv]+?c3:#;q_0't8ٷ5W1f<^UyՊegz^ov3Y9Bx\X) T)fG|S\瓳^4?ߌkv}-&;iH نu.8.Ү(\3XvmѡnF^r6Y4XGceAX5kxc$ycNg۫|z=' [\ah י2VYAmݺ'I0SC 7NL- Z/h%iΈ~mB@GhqXo9of߅d֤9vAǹS Xp @lWryK(11Zxٮ0RCtJh8"HޏٮuE?Er<7 =$Yl7(Iʗ@ɠ'ޏgeg< XU٣xo_ ~s'#R_Ky?ǞmxC0}]14rV G V|ANcC1j HAotK+WҥzIz%tL\|1+'8ꚨ:TRwJbt@Q"W⦆YAʼn!O/W9s1o Hq6 {Y#}mEÒjC*:Plw,$m j4BlT2hdU-j(]*M Nk ukJvE՚FĭSMtp)﬉%K}ow׳l{B^z:Wo4QH\'B% 2R%Dmxޮv2q{#W?: JM4.@j&KnCqBj]#4},ťsm4>{ \ > ,Gδ0^ 2t9)Q@)_RЋ- -5N/|0nÞЂKy k>S+*`| VP vre+@iou| TEN*1{G ^r_##*| K'Qy{ȺɥJlwXTˌAp]1&Ӛ=z.SU)͛K$Q>P:'LM~n,s "5WpT'g, /h06yVJJȼ UU8qjtJЈ+0(QdLOASK+[ +cP c =T$.tʊ=]`ru.rH1SaJS%ul?EO^SR/kwR;7P%YԻ$t^n~xzqJ>M/+l)SR/gR-vMyk S_H>Kݮ>?ք|\{˖wY8^j8t*t]_F5C.G>;u%ܠJY u%ݭ^WC]I竡U1j:zbh+ 7IʈwEHƓx8GCq7R64pp=M%-esz*cᩌ38>D|J?53Hyoshimi-2.3.5.1/banks/chip/0050-Ghost_Bells.xiz000066400000000000000000000075511506652756400207350ustar00rootroot00000000000000]Ys~PJ6$ *uq%*fYu8ټ a _| -We%jzowSa8uh}ݨ݇oݧ_|~}8ϻGtqvOH||#l)>әp5Џͧ8]]9h?M(HE[:z|mtzyvus1^]o?xu}g|zDۦv쯶iw_M3i>uWĻߌ/&w|bk[У2"/6 MJ 3/̂um 4K "nA%%"/X,FߴMJ'hG|s)g]Ƌɻ:w7˻?:7`·-4>Um7{s`·eYY69K;YG~dx-҈MP]pe=K|~ ^ XyIb,tKc-0'dՍxӻA8 ylH`+I* 1ܠ;Y,hKR>,;6bI @fF4>Y+ޑn?]}yc$I@ZR=f<{o<[VS cAypZ=Yn^1Ļ:Ox?i)Bd 9&ԯxnx* 70H񇺺ەʼn:j`*K @״lK̪wo!o$Bg$Q8̃F8iּQdd*> h[Eu]6nO F~p6XYlrjGMPWOi_58/#ޚBŚ~]}#pwAY]"~ՑhO. YZUiB*'LSEIQ1JmzP}A}MQ"Nx( D9a[~l!_UB_!̚2a7IUKg͎:[IZHƷTsv;57zȕL_W:qܭH$Us԰"v(r rtj0ؖ͒"VGZ|]4|p܄:y -Cɏ؝ 4wQJJMC+?y"ni7o&W˓ϒmcWCCc_xgWXsѿ5(J"*I-HPkH#n8#)l"(WֵHqG33P{t Y ^_M/h7FwM%ݍB܀TZWnu}*q`YW>BĥL6@ą[W"#1Btmǀ)$ )*V!'dw[H)JN9w]4=X 9ʱ!lj&]=k=.Z㹋Vy+]c.1qrb?8;f `&5TIްyrlTx/v06!؈* {g %U 9pVfbrq6d l^@ؐ*_Zj]U X1 lIegppxb0 evns @+G0 2 xD;;Bޘ)#s@ϟ9RCϟ?K =aHM]bX㨇{E87}y" )Eڜ|!8M#XK ָi#5N Xj5ΎQl DP"Psځ:@}aF )#sb(y椄c5p_;Fi (r8(\9q(f@PCPS=szJw΁!q w( l_SN8;CaGrh,QM,6&ThA Ʀ` uPM5+%&@sThA* YWUZPu\ee?yje--9D[.]qvPu|ĮPyMX;>J(,z,(ZCeQ;L2FOٳϬJOJZkXS#2GXce xjTbe U (?oT2hA bʬskQVz5Z BԨjP=h}\U ZPĜ{FXX U#X&[kڨjU ZP#;GXxj5z/A 5@*;GU{a U ZPՠ{a U ZF{a U A 꽰 cCQՀj[T5=T5}&T6=T7`=Mn]+r 2y5C9˥GQ,In>墺lEuC cn G\T7`s\.9 \T7`uQ݀)(7f^M׉XuVa݀ː]u ȯ`M|9 IYd6&=fΨ'%9WDzeHsu;[z+]8f~Bo[RRW|T2)43XM_\OӻO>AnjT.YQ~*Gk/_ƖnIS6xJCAƏ}@t*Jn dj2s)i/O*ًGLMZ ;zm^L7AmңjA(7 Bseb@X5[6;W6뫜\496tJM_B=50hcRש7 "^ɧ#>̂@" QtR@0cotit8iw*`UqkѼTnlӶs oBzF@刯j]Z(D/`eQIq[^.uZ!w6+ƛ"'7ifeN~W54y-+_iؒ)*p,%|GvaS0K@i{v3~ryAv>ZR|= LݵJ/`V̪44ȼ?<ȶQmG0TOVcNl\5k5ɚ1pL֤>13m)i5bLDnIP=3&}ƤBq:50&niS ÉLkėB՚Lϩ͔4wu/kIҳ1꣆Aͨ cJډYxbܺhu@@$Rrf,g U)< mռۏr8jn/vP~ᨋ5@P Lod+J%r9N멖Rg4 ],jpR4HJ))Wa$Gk Pk"*ǛՅ*'6\Q$||kb똋hvɊ8[,'FfaiCCPICC profile(}=H@ߦJV ␡:EESB*ZUKIC(Y:8*? .N.RwIEw} Ӭ8鶙N&lnU "~12$)>EyV?ǀ0m MOf%Y%>'0ď\W<~\tYa3'V:Lx8j: YU[J_+\5$ "PF6XHyKRU# ~?[05%@|]YwcigJo IzEm⺭){0dȦJ~ZB7倡[o[@z"ewywoִrХbKGD pHYs B(xtIME ;DvIDATxyx\}?ٵH.Ym-WlB`8y70$My@MZM LKCR%a)6Ɩ,y-k}fcFk6Il?s=r=O$h2Y1]nvVk$X<>5?F% w/s 4E%`pc?^` @~ T@("lSX3b,"%%Etsu ϚLl$Iv"ҰX,tvv"0AЌÀEAAUUk! id_`6 L&ΝKnn.I0Lnr&LoH)^f3z vxq l'l+"qfbŀ$2ddd`2aIii)|<1.I())!99KrݴR__;NFl: X#'%%QPP^Tף|A/O{%--l$TQV+= l 4v\l6fX,q:Rގ$`0PTThx&TUUxH t@UUqLQEm/%O9$bx ASSXB~M~5*0׻nIa.HW\nH+\nvPKUUBCEX(H !!ႉ $IX,q\R/'RʺB% (..Rn7'OK3 O\3U~IHHzeb)j$4FljeNh\.I;0ZX=>8h2*_s>uirR)n" &lމDD W!"‡R(i+tWhКy Y$Y'v{EġhJEP/Z*SU*zFhs]4㦼 Uţz/Z&:7~Diw3NRZ<*/- P#z9ֽՒ@Mh]cM4hM4D&ZDcM j-@ XI$I qqU}4w1܋ƿ'@0(z8rm}TwdG4w32Wa5YȊOf! ;ށNVB 0Őͱ:5C41πυP$,J܅ܒ S3/Q8R}la^?W̲$ Y[YE̲\rG^Ϟ#v@Pjn=-'yVVd'Ko-nQ'9{V1:zhjj>Ж}nޒeKADpBVt+oV|LlQdrͤYcNn1"K.7 QKX (-E :&¥z|YOJq)$Ǚ2}#nNwrڮ^j\xd_?o͓7Ý0 L>UeG]Om‘DV3(IVb$)@ r]5gu R]z8-e=:x-(Ē,+bEv* :Y:KcBg9V ݰ I5OH(H٭ڭ2' bQ׶0mCHMhP& ?~&f#Bek>Ջ\?oX˷k(ʒDdnIUT*cY>gROUM<+xH9FVCQ)zEan6zUU2aevqu{6ZE-mdp_ɍ̶gD[N^ٍUKndaeI,I$ZXPU5u*O2;1bGvT@8?x%5syM*q٩ĚWˆr!噅7Z\}۷pf w&71~ʚ$ɱfkxtE1}~ɯ: F[a2u Wc%B)&q >R'l:BGȩn6/̔IW]GRzY1FaY^L1A  \AñZꇻ:K#k4nt@xLs/Ur:F?gg;yh5Z8Z2Gۊs)8Jɑ3,D0/eͻ&?kYSY%)58LGyj!xU5$ 1/ Pl-.sBUU^=x(=c2 ^/;Ob`4x2k20~m9Q8U@*O׽sQsdG?UʈobGUR֖ MowTv4LTUPZ=~krC+l{nUQږKfmg`Ы'E&.LR`Om ujaU>5X3I#C:C2@M_g,a1,SHS; á4Sz&$ [H;}a:fXnqZN  maq=$ a:(I!qtsuW_H50!1=wU/h< ޅc|.ӱr/M$$ J(T`cjk Ick.4{AzRH =@UEo cJFUק򬔰](20f lKL;EXI)t AY!gT=#;hf ‚q6jrM% f0m7踫$?-t;`%%vI $4}N V‘N|!(xQz~tAf,,+%CN~ML ˒̢qf99q<~j%$ XBgA'm#ɒeK֝B%yY(^ՈWdt|Z}*N懫5K0H*}ʇQ@nͿ&$D?|aW{J_ Y1e)\CʶӍW,&Pԭ`1ښБoNR&slXk7ݬD7/fΉZ6w"j\V夅t>@S0T7jR澀{Rrhm,{Cm1//?^<^' Z/U+O6.,Iۭ%ZـW!." w!eR3>P|&oW5@Mw?/@`u<+$*K7-$ѿp? %+I%t=/tkIoyA8?% nD:FG?9iӹwdvR`-eM΂iL{0:l= ~:_.od;\n-N hjl,|znYɞ!xw/=Sxl=*gd#hL$?UFװknfՃ'p *8ydRlo){<Ž<elڌ.(av\.^Ϩ#0$INLǬ7PA)vlfc@žr~}*$5+eXY;BU G[ɳ[ɲFBP;ȳ}q Ny{12l Wj#O, 5b@ Ѷ֜j6iŤ Y4Ļ{y7,\߬$$9dے9x^U1lh[s>^4 “+FT7^T%K33 x] ^eַ`P:9}J <_/WTAS{ZCӮT "xa$YS'%BG R9^OpC^=mlyA1L:K"WQmݼ[YSCh4x?xctq?Z؎mnTU}k<3;î\Ěw$$T;I1&dIwdʎ^J;8Kus|ĢjF,X1W xV~Sy(2y6 xf'pĚ12=#.j{83@C  dfgꍬ5$_rpӖΚ lZ|}3ߜz ]ǯGyW]ǝKHZӹoqyz_~et# L%|ozͽ$K˽hpIpX|u^O*]T0ԁwCepOZ.&ǖz[0]ʬbj]W>yAVcɴ:6; W8m6vs%;ࢵÍiqU+h袡^ U= SUq%c#-N-$ǭH:,,di\]q'u}mt zpXxtb IQ.#eYfRJ #͘u3eIF(Jʆsm$w@\YH23܆Ax"C4hr4*f- @ i="F hqiR8LqDO'jR^\ξ`d/,zeݺuڵ L^uJJJBk,\0̜IW_GU@ ( z} VIt!!;dYFׇ/=}=6^׫Zɥ&h@Zr+O.A>g#^y[΄xޠ^UU<F|"Dr ((<=XVC=Q+\#׿a8vSS6m |!~[3 Shع}pZQQxtttDuG=duU&Ww0$0===(% ! [b ؔAZZZ%===/l'.zzzfTՁ:{+WM|A8s_z%{sցx7㏇xsARSSy)(.˦Mؿ?#"UU孷駟2@$ (;cz=YYYA9WΛ6xΛz̰Ǿ\*C4 M&h`M_crZɕ ѭL|>xB2j`k]W¹6}g50zygxWv6oLBBBXc$;j๋?---,IlZ6_y2JeM|@$FMff L>&WD&4*B'i2D'uB\7^iz=4 tM C?>?J~<ק< *4ѪM*@,ܧ Z} *.{LOuK"IENDB`yoshimi-2.3.5.1/desktop/256/000077500000000000000000000000001506652756400153465ustar00rootroot00000000000000yoshimi-2.3.5.1/desktop/256/yoshimi.png000066400000000000000000000243501506652756400175410ustar00rootroot00000000000000PNG  IHDR\rfiCCPICC profile(}=H@ߦJV ␡:EESB*ZUKIC(Y:8*? .N.RwIEw} Ӭ8鶙N&lnU "~12$)>EyV?ǀ0m MOf%Y%>'0ď\W<~\tYa3'V:Lx8j: YU[J_+\5$ "PF6XHyKRU# ~?[05%@|]YwcigJo IzEm⺭){0dȦJ~ZB7倡[o[@z"ewywoִrХbKGD pHYs B(xtIME :z IDATxw|TU?3I/ REtQ\, ˺?t+ X!". $tL&aL;y^g=<>sy@a#A@LbahB D@[a a`~' !CljXIH<#0;蛷"1u;ҁm z@g$2}0DG͝ -薹&p?PHf|'hmnsrrb'coH[`eœiYC"66!!!prrBII t (~JU&<3///r477s'"ܟ)@ (0kLH("00AAA 磠߮+5UgS(⪪*dggXਹ[iDs]^z PTkQ"{`xzz>vvv@ @CC7϶+ Qtg5_888`+ZOsz`hDxY_n/e#..1S (J466>Z$niDw  mǓObްC}}=jֱ-0 ;}VMʆ3ʘ @:_~~~\ h4LabR@FY`Z0, ,X%Z> `m,:J\__nd[Ui׮RhaB*vc*jj7 e@wuhP4˺pH(H`ccӭul /1Ԯ(-60y`4}[[[vlsdt @ ,WAAdA RAP cD/ .=xyKfO:0"1nI6M(խf۾&o^ ^l{O-h&;A+$RAХ @A @AX @vA @%Z', , ’]A @Ed(AX@j  - , C  \ Ha1.¸AGV!-2U 6+%6p3< ,V)Q"dUC~];fBI`'|npE14 .6$L*.gLaKrSS;uPi:_[n~tX 8@R :Vڻm q n½[hT6w?-J*Q܈Rz{`d`T77n@/g#'¬Xua߻ex.>BE+.lہ&UAAֆ3<&%q/#Ϭ]]G)}Zoxdkdmo}YK繟 6p^2^N#W)׈e,RkE/g,9c +ZluK`Hg;%_5Vȫn@nUkѪh}^܎婿`oIv5H%̙KYxf(+\l1%:B|1"N)SpN`],kK1lßa&5ceyl=ZZ"+L  {q<=Gsaˍ<WjU(g@1M<ͅ!ZOaj FbBdE={ji56WPӬfDOӖF$1NikßO|/ ) ǼIVet ?\͂\{Jl};H k,Oie֮8pFLJw$Yl%3g)U69↦sW[Q~Z{_p]̉HpTeS \H'ҪB/G 'Ǫ:nT/LX/>_տBA?|;'6 Zr^g+qX1 8Hz΢&8v?]`p%x f@{?d#٣qz`/ct{q^Qy@ڰ ~[V& 0?'{8k=366-> 2Vy@/>79O}8~)xk`5: qcq(yF\6}|9|wIeb鑯8;>`EB!3?v[1tN:ϻ=W΀@LϞ QPWG]8#]Wu+|%դ1@yS-fx* {wqhHSN ±'Õ#2!lJ;ig̩.|Zn%`D,hD%aXTgvVӆ6H(3GbZl0ťM 1N\g-_?`2IƳr{ƥϒj){$ 0HH(Ė9z{R]r0 P܀'e-uO1#C|ɡgz{{ xCx"+l;̛ZZxf,z2oIˢ]_Eo65<&ۇ<l1̝4̽B SXW 7;c$zHL{r(B\˪ XWϐ_[駘;@Gl/q?,> kN|G|"|>no!~Vh1$YM`VyWI zA"IFэ W)uVwuQj-{Fvbן|o;IHN[<0&n?uӏu<)$_7;Py1\<]Rn`ۉE:F׷(q<Yu(Ѫ[jPWG$Eh+x`켙XYNu1.gcp!sra_f!jP(G>vsr@R?!%6ҭ/@#zN1|S)mwdx%GyWSº 1?9/qwdkȮ^"XYz k ~w˱F.o| ai'l:-j{䥎ӷq$gV5Xq?W`?s;skMv/f=vI{u;ۙ1,Kx fYl%D? ?8˿)'7+-T"bAɩatER(ǹ{ܮiť 9dDC\!!J]g fU˽"=sEv R߫bmY 3w9;H0ԟΐű+՗!tc=y忎s/yWgȮd΂ k+~Q~,Vœ>9}fiTb _G7rxSٌV5H-,D7/o *:%.ٍ^ YCj%홣=]:GfrU,V^^!e'o%`Id[ yf5q,379;yہ9v6y s{u(1[k~.7+KT=fE'dǏ+Po:1:yy.R2wlI?kSY@|/Azoy>v8$9ǾT91E+gf{ JQ !>8hZ^8ܚvwbsPo֯㞌BYaD010_\ze:;|nGo0" =9k&;eH/FiMJ|tqP?_W2YW>hOUV`{ f 7?(;oc%"L e7kmrtrY3Va+%LYݶ" Xִս\t:V)@f|tC粖}2o ͛/9#tZX|bCJY.s=^'#wf_E7ӾBlMc**'k{1`k[~C^uX8|ܜ@hǁwK2fL5 xaigGOP<ͪlgn>9OMrQ%L#<\CᙸQo}lj^={u_aAA.@G'x9)X]6BzYI [Odži8<ߗ_G^od(m#[_7ӣ,-Ofpja_{Fۆf&l8\}a[ێhm3߅}㗗na dTbȗ{aaq nUQFs6Wo*ÿދ -v|N}8 |?M2 1r>| jg/?GwoU"zs/:Y[έMs0]HA%aɜAAH)Dg;ZWT0ȪncއYVLCsxbio4`#x~i<{V!<6Ƈ3*Y/;~F /8ofc0mm<|KCp`Ê{0@ 85.!8^p MA%|ao%uEK.nZ5hsa鲟`^ф S~t/0_^?.L4);8`cD`Oκy?@sc3T SX/ c|y; jؙ/.B9"c=qhiJԵLm/_eRZTZ=ćaf񀕰bW/95i=G3E阣)h3c>]ØUY%8sGsgbvpԠUSSXͅ%˶&7:e=/`X7{"aNpvT"wgշ(QӬ@nUrZZs]Z#w֎_ { L Nts 7gDy:#pA"Df%dJZȭGNU=2*jQօ4pvbkIZ?opueXx` N\~"+H5I1+ffeǾFA]=İ|hЧkJ6#[ǟ]9WV5 ${|Yv:5rƅGcm ?c_”TD 0%b }#ݟIDAT૔N7V9$V"92dV$߆~|-2?Gg<sbG@$χ 7JJu+6ĺH-ϚW[)?on NhT6cC1v WJuZHIBq`' `Rb%‹}b$ܬ(曧֕Zc^+3Ƥ[0'LENu1:p$Ju :bx`!_2misa+5CkKqNIȭ.BR;y zbdP<|" Ƅ\Ţ $ UE][JycrWk+1pC/0?==u~, $!.X; 4w+PPW*ydf4ZP b9#՗s0vbk 1 '>U 4Z S6RgP @Y9؉\^, ,h#]Aa.@[YAA$MdA rh  - YA ¢\ YA ¢\7A@%Z$0L\ºrdTݥ7I a1]+.ޕuo_O0wdv# (@)]4 @dA rh10A"soP(}#ˡVY˭!Ht҆&h4rbrF&RXW\>׮]c-_j.]6#==|xWtRwLL 233Y׬Y %$$ի+WIJetV+W0`r @).$ @%)Z L ’-A1  ¢\A @E$o K(H  tHWQlj+ͅ7~^^!6K8 v=---1% D"XԺ~Fk>Efj{z/w.&5r\(J(JR6茦Y\@)Y), `$ڵk}^{ yyy-´it҆E&O.\wﲖ/Y'N[d rrr8o:?;;[gg>0Ϻ}GGG(^aB*rGGGNVY݆; @\@)YYA)HU*  "]A.AaQ.MYAX@&UA @E$r0>%XAAϟp͛7ڵk:iCQQgƍqe]RRY?… :}\lٲ7nYUUUxs +qFדd˗/LtĥKp%uWի)' C(YZh  D M0.L~@O xz -Zh)tƆEyV?ǀ0m MOf%Y%>'0ď\W<~\tYa3'V:Lx8j: YU[J_+\5$ "PF6XHyKRU# ~?[05%@|]YwcigJo IzEm⺭){0dȦJ~ZB7倡[o[@z"ewywoִrХbKGD pHYs B(xtIME ] LIDATx{pS?!Y%Y-?66`):@ نGɐd)3ilȴ.LKRͤid ,ih ! %8a؀yluu_$qIG3ѽ9sJ%] L \Ayx H-~-IR{NNVRRɲ*)--l6"A`.Ɠ)v"bic@TJŦt\.h4^UUm+q&Al٢@EDQdРAX;)v`yNN555A0nvJ'j@k e;eĖoi/^~bX3g4ipf%A54U\ӴAOL&P( PL1F_ֳOmm|ڨ[LjU2zQQA0=_T`#~Mj|׬`<0*./`N]FL a 9hTwriiu-]t˝1qDA`}{gJ Z,J$I2 >$I6M:gOoIVZ>POI30JrOy+t F&+6dIt]]ԍi]ˎStl/N\fU0)oYGB@0/ེ=lo8HgH$IT .aVc1nQ~rs2{p&l3v7򯕏09Fw0>?L [BcG'=ybj0Cٷd r_wU,:8լ;S%g 00[ĺ}u,ܴMyK 'V^h ':9eL&٠w1\Lc/<"f"WnħA-ePҏ,}`.^NE|5[1/M+4y4\-8~NVH/O+!d鼁5sMxA=F;zv7pd;3GuEU9ƶsTDPWv./ 2ӈld[)tt<sOdL͎SkouL+Qtp5y}(01/ Է-X |~C0dDxo| ̅@`cDTW%0ʝ "hE:  A~=l[ vyokB%GvO=. (`i"aDz 8&AJHA` ۭ;Dk? oM@Lr; "ct712tL4 &وIl@$B;5|U76f&Ӗ *tRM)$x$B r̈́"U!8 vYdnQ,:Wij4#OAiHXͣ{T (TҌYX4v}lKO(!JEE;/u02+ڮ8mnd6RQrۉs,|]2mq2>N1i# 3I%!XEquÜ~4-&uPV}ut:3?仩wbCPv L)Jn##'] Q{=_rVfXZnP^ǂ1ӱR\`7p\?r +7|H(/5_g'#_*ryl mK/@ڼ, D[rKX:y>/o?owV].nSg7cڰq3(1~& ?|Py3"jF;\lO~99$9#Ͽdt&2NICRI6( <|t,53h ?*ENaT$3ylƣ=)ɲn\fBILOL:'X[VOF+sʹ=tDA 75'>#LnN%| ͢=I( ؒI5 {j!'Xf:g'JRHM0i,MW@".ptL-x9D(lo``&( "Szh}P5wjvǚmȲQv$! "$ ŠH$Q)m8|eYwߛ+JaL-zA͊+>pK,gaƌ:S47vZ-[FIId<˗/tF.]J{{;˗/'--Moo~zgFl6'N$//O{,SZZԩS{UlrQf3ƍB q\@ee%Q TUжmۨ&q wo򀁖 i˓ _ˮ]AEQ? uuu~ᖖ<;w{`CCC񥱱z W ;( WW_& *?<,Gz0D4ϟ ,XS ٟ`|233Yx1.׵&đ#GXr%O<SL͛7qF^x vxŊ|>^|Ev{~ʕttth"Glذ;ߙ~d̙=4i.W^y }Q.E"ٲe ӧOI֭ٳgǤc0={vL<|ppP$B.S YA ~_ cϞ=>}gEQeǎ:TUǏؿ?݁p8̥Kx<޽;^/w&===*˗VF~i B!pիWkE]( =N4Ѐߟx][`n_nCD,(lϒ a1n >_EGFNbL~ ڭZ6\:@|_\of3`Qp%Y sRt( , DBZ@ݖElzB]F3iTPDIENDB`yoshimi-2.3.5.1/desktop/metainfo/000077500000000000000000000000001506652756400166345ustar00rootroot00000000000000yoshimi-2.3.5.1/desktop/metainfo/yoshimi.metainfo.xml000066400000000000000000000112601506652756400226400ustar00rootroot00000000000000 net.sourceforge.projects.yoshimi_2247 CC-BY-4.0 GPL-2.0+ Yoshimi

    A Software Synthesizer for Linux https://a.fsdn.com/allura/p/yoshimi/icon yoshimi.png

    Yoshimi is a MIDI software synthesizer for Linux. It synthesizes in real time, can run polyphonic and/or monophonic in multiple simultaneous patches in one or more MIDI channels and has broad microtonal capability. It includes extensive additive, subtractive, and PAD synth capabilities which can be run simultaneously within the same patch. It also has comprehensive effects capabilities.

    Originally based on the 2.4.0 version of ZynAddSubFX (Copyright 2002-2009 Nasca Octavian Paul), development of Yoshimi has continued for quite a while now in its own direction. Originally these included major optimizations for audio and MIDI performance. More recently there has been progressive development of user-level access to all controls, including command line access. Since V1.5.0 there is full Midi Learn capability.

    In the V1.7.x series ALSA MIDI can search for and connect to all viable sources, almost all controls have been made realtime, both key and channel aftertouch have been implemented and there is now the ability to change the panning law. Refinement continues, both visually and within the code.

    Version 2.0 brings fully resizable windows, MIDI sync for LFOs, and extensions to panning control.

    Version 2.1.0 extends MIDI sync for Effects where relevant, and adds extensions to NRPNs. There is also a new HTML User Guide.

    Version 2.2.0 sees a major revision of the PadSynth engine allowing significant morphing of the wavetables in real-time.

    Version 2.3.0 has backward compatible high resolution controls where relevant and comprehensive GUI theme management enabling user defined colours.

    Version 2.3.1 has improved microtonal scales and the ability to export .scl and .kbm files.

    Version 2.3.2 adds the ability to set different left/right repeat rates in the Echo effect.

    Version 2.3.3 has improved memory management, extension to keyboard shortcuts, better configuration control, and expands theme colour control, and adds realtime theme editing.

    Version 2.3.3 has a new 'Omni' mode added. Warnings provided when overwriting edited instruments. Revision of XML files for cross-compatibility with MXML versions.

    Version 2.3.5 has a set of LFOs added to the SubSynth engine. Also tooltip sizes now track the respective window size.

    yoshimi.desktop yoshimi https://yoshimi.sourceforge.io/docs/user-guide/images/main.png Yoshimi's main window https://yoshimi.sourceforge.io/docs/user-guide/part/images/mixer.png The mixer panel with 16 parts loaded https://yoshimi.sourceforge.io/docs/user-guide/add/images/voice.png An AddSynth Voice https://yoshimi.sourceforge.io/docs/user-guide/sub/images/sub.png The SubSynth window https://yoshimi.sourceforge.io/docs/user-guide/pad/images/padharmonic.png PadSynth Harmonic Structure https://yoshimi.sourceforge.io/docs/user-guide/mlearn/images/mlearn.png The MIDI Learn Window Audio Midi Music Synthesizer Softsynth https://yoshimi.sourceforge.io/ https://yoshimi.sourceforge.io/docs/user-guide/ yoshimi-2.3.5.1/desktop/yoshimi.1000066400000000000000000000111101506652756400165670ustar00rootroot00000000000000.TH yoshimi 1 " 2025" "yoshimi 2.3.5" .SH NAME yoshimi \- a software music synthesiser .SH SYNOPSIS \fByoshimi\fP [\fI\-option\fP] [\fIcmd\fP] .SH DESCRIPTION \fBYoshimi\fP is a polyphonic multi-part sound synthesiser utilising three distinct 'engines' that can be used separately or together. These can also be stacked into 'kits', typically for percussion. It fully supports both JACK and ALSA for MIDI input and audio output. .PP \fBYoshimi\fP can be run in a graphical interface, a command line interface, or with control from both. A number of controls can also be accessed via MIDI. The CLI has its own Readline parser and built-in help system accessed by entering the commands '?' or 'help'. .PP The CLI help system is context sensitive, and apart from reminders of common essential commands, only shows the relevant commands. However, it is possible to specifically call for help from other contexts. .PP e.g. Within the 'part' context '? config' will show the commands for configuration settings. .PP \fBYoshimi\fP has a very extensive MIDI learn capability, exposing the majority of controls. The same MIDI CC and Channel pair can be linked to multiple independent controls. There is also considerable post-learn editing capability. .PP Other extensions are the ability to import and export entire instrument banks in a safe and obvious manner. It is now also possible to swap any instrument or bank with any other, in any bank root without disrupting the rest of the structure. .PP Another addition is the ability to load a list of MIDI-learned settings from the command line at startup. .PP Recent improvements are key and channel aftertouch, fully resizable windows, MIDI sync for LFOs and Panning extensions. Also,inclusion of MIDI-sync for all LFOs, and all relevant Effects. .PP Another recent development was a comprehensive revision of the PadSynth engine, with additional morphing of the wavetables. There is also support for Undo/Redo. .PP Further developments are backward compatible high resoluting controls for significant areas and a comprehensive theme management system enabling user defined GUI colour choices. We also have improved handling of microtonal scales, and added ability to export .scl and 'kbd files. It is now possible to set different left/right Echo repeat rates. .PP Part level MIDI 'Omni' now available. There is now a warning messages if action is taken that could overwrite an instrument that has unsaved edits made. The SubSynth engine now has a set of LFOs .PP LFOs have been added to the SUBsynth engine mastching thos in the other engine types. .SH COMMANDS .TP .BR \-? ", " \-\-help " Shows command syntax." .TP .BR \-a ", " \-\-alsa-midi[=] " Use ALSA MIDI input." .TP .BR \-A ", " \-\-alsa-audio[=] " Use ALSA audio output." .TP .BR \-b ", " \-\-buffersize= " Set the internal buffer size." .TP .BR \-c ", " \-\-no-cmdline " Disable command line interface." .TP .BR \-C ", " \-\-cmdline " Enable command line interface." .TP .BR \-D ", " \-\-define-root " Define path to new bank root dir." .TP .BR \-i ", " \-\-no-gui " Disable graphical interface." .TP .BR \-I ", " \-\-gui " Enable graphical interface." .TP Attempting 'c' and 'i' will produce a warning, and although it is possible to run with both disabled (accepting only MIDI) it is not recommended. .TP .BR \-j ", " \-\-jack-midi[=] " Use JACK MIDI input." .TP .BR \-J ", " \-\-jack-audio[=] " Connect to JACK server." .TP .BR \-k ", " \-\-autostart-jack " Auto start JACK server." .TP .BR \-K ", " \-\-auto-connect " Auto connect to jack server." .TP .BR \-l ", " \-\-load= " Load .xmz patch set." .TP .BR \-L ", " \-\-load-instrument=[@part] " Load .xiz instrument file (no space)@n to given part". .TP .BR \-M ", " \-\-load-midilearn= " Load .xly learned list file." .TP .BR \-N ", " \-\-name-tag= " Add a tag to the client name." .TP .BR \-o ", " \-\-oscilsize= " Set the AddSynth oscillator size." .TP .BR \-R ", " \-\-samplerate= " Set the ALSA audio sample rate." .TP .BR \-S ", " \-\-state[=] " Load previously saved state." Defaults to "HOME/.config/yoshimi/yoshimi.state" .TP .BR \-u ", " \-\-jack-session-file= " Load named JACK session file." .TP .BR \-U ", " \-\-jack-session-uuid= " Use JACK session uuid." .TP Regardless of their position on the command line file loads will always be in the order: session (or state), patch set, instrument, midi-learn .TP .BR \-V ", " \-\-version " Print Yoshimi version." .TP "Mandatory or optional arguments for long options are also mandatory or optional for any corresponding short options." \"nroff -man yoshimi.1 | less yoshimi-2.3.5.1/desktop/yoshimi.desktop.in000066400000000000000000000006601506652756400205150ustar00rootroot00000000000000[Desktop Entry] Type=Application Version=1.0 Name=Yoshimi Comment=Real Time Synthesizer Comment[fr]=Synthétiseur temps-réel GenericName=Synthesizer GenericName[fr]=Synthétiseur Exec=yoshimi TryExec=yoshimi Icon=yoshimi Terminal=false StartupNotify=true Categories=Music;Midi;AudioVideo;X-Sound;Audio;X-Multitrack;X-Alsa;X-Jack; Keywords=music;synthesiser;softsynth;microtonal;multichannel;midi;alsa;jack;realtime;standalone;lv2; yoshimi-2.3.5.1/desktop/yoshimi.png000066400000000000000000000057341506652756400172320ustar00rootroot00000000000000PNG  IHDR@@iq pHYsttfxtEXtSoftwarewww.inkscape.org< iIDATxyX?AADP@q5,on\2Ǵ4-ާū|LkeJiJdM횎bn>3{ g<{{9#$I!0A BeImR$? B4B !YMun2'0j]PPvւKJ>88XR(B #,m!@!ķJ+$$DtCYYYIJsxf!z{ՑY_PPBH4UX< !@xxJqGiӝi};7_Wj9v'64X];a?X2oy7K,~긹K|U,GRDaL_tOan+AвRJYѻMKv$OG/X]j0iy#+15S0j{\,l؝uĦ&^&h7*% {k9f>9Y2CBdO'_o>72ݹ._Bc;ȫ(fAt43Uٜͦlԙ\TJ>Ey]5+`Rye|GIͼ [ys0RZkcvMixTgӠU\ΠO7_Y |]>u$&k~ o@au9>n.2zz^zhP^L݅ ] az:OVBAFik֠W\sŚ2] k\Ք]ZiP) R(⧑Ur£$tk@qu l;҄VXU8^\2 W@h@7}8" g'T *f*>OB:h'|;7Bpu%5*?ݐzr.йe;k`w).#Id%% 7'g^1qQϐU\G{xa-x[Y緜a\^f25ؽ\Od|i#217cQV)$y^6ܺZMj]xQ[Nl;|O#ӇH۲ ؖ Vܲ ~:'s0|Y xAn7{'ɋX bxXۆӠ+%5u/&dUDzg5RC$.j41Q,ؽl9eZ;9oFpdl=se7t5*_Pp@  .eu=~@M_<9z+h塡_0f7fXHo*u5d]rU-\մq-wPۿ\ "-nqt0C?ﰒc/_[li x(:hl6TX[Apڴi4~jIMMG׬YCff&Gk׮2yšVK1c͛7Ϸ8\L:={^^x1DFF2{l޽{$&&>zӧLl#-ZN#66@?99١ $ڀç>-[jZfܹ2\rr2gϞ ҥKA/o6^te+\,===tzIII$%%Y/^},Yb0;p;v,^bjԩɧMtt42~BBɓ's'XbzI&!? ]Bpx ҠV%**e˖Ϟ=Kvv6'N4WZ``޼yf`bb"z9sMwvhd6a_VApÆ ߿uZZ'O$!!A& m۸rE1 ~WfӜ^`x{{EE@" :CSZ>> nAAMh7|,mݧroqOWƃӠ%2 +JgdZfi&x}%hn _?*L]WIENDB`yoshimi-2.3.5.1/desktop/yoshimi.svg000066400000000000000000000156741506652756400172510ustar00rootroot00000000000000 image/svg+xml yoshimi-2.3.5.1/desktop/yoshimi_alt.svg000066400000000000000000000161511506652756400201000ustar00rootroot00000000000000 yoshimi-2.3.5.1/dev_notes/000077500000000000000000000000001506652756400153475ustar00rootroot00000000000000yoshimi-2.3.5.1/dev_notes/0_WARNING_0000066400000000000000000000003411506652756400170330ustar00rootroot00000000000000 There are spelling errors in some of the code relating to instrument files. These must NEVER be corrected under ANY circumstances. To do so would break a huge number of existing instrument patches. See Yoshimi_Policies.txt yoshimi-2.3.5.1/dev_notes/1st_ReadMe.txt000066400000000000000000000006461506652756400200420ustar00rootroot00000000000000 If you haven't read O_WARNING_O please do so now. Some general notes on new developments as they occur. Please pay particular attention to Gui_Interpretations.txt and the 'Yoshimi Control Data' html reference manual. Finally, this is still a moving target and the numbers may change. globals.h will give the actual labels and their numbers. Hopefully the time will come when the numbers are no longer relevant at all. yoshimi-2.3.5.1/dev_notes/Automated_Testing_Support.txt000066400000000000000000000271601506652756400232720ustar00rootroot00000000000000 Ideally, Yoshimi should reliably always behave the same as ever, allowing musicians to learn handling the subtleties of a given voice. A carefully balanced MIDI score should not be blown out of proportions due to some development work in the Yoshimi code base. To help keeping that level of compatibility, since 2021 Yoshimi offers some support for automated testing. A major obstacle to overcome for acceptance testing is non-determinism: when playing Yoshimi, the sound will feel vivid, since every note will be subtly different. However, since this randomness is based on a Pseudo Random Number Generator (PRNG) with very long sequence, in fact all of the computations are deterministic, once we start from a well defined seed and initial state. One single isolated note can thus be reproduced up to the last bit. However, as soon as you send yet another MIDI note while sound is being calculated, because this second note essentially starts at a random point in time, the calculations proceed from an non-predictable state and turn over to complete randomness. Based on these observations, Yoshimi provides a dedicated test invoker component accessible through the CLI. Once triggered, this test invoker will terminate the regular sound production, similar as when shutting down the Yoshimi application. The SynthEngine will then be re-seeded and ephemeral processing state will be cleared out. After these preparations, a sequence of test notes will be calculated by directly invoking the SynthEngine functions, synchronously. After completion, the Yoshimi application will terminate, unconditionally discarding any unsaved state. For a typical automated test case, Yoshimi would be started, possibly with a state file. A CLI script would then be piped into STDIN, to set up the parts, instruments and settings to be covered by this test, and finally the test calculation would be launched. By default, the resulting sound bits will be discarded, just capturing the calculation time. However, it is possible to dump this calculated sound into a RAW sound file, which can be opened by many sound processing applications and libraries, when providing the correct parameters of the produced sound: 32-bit floating point little-endian, two channels interleaved, and the actual sampling rate (e.g. 48kHz). If we store such a calculated sound as baseline, and then repeat the calculation and subtract the baseline sample by sample, the result should be total silence. When detecting any residual sound, we can listen to that sound and determine if the difference is sonic (=bad) or just noisy (-> maybe acceptable). And we can measure the volume level (or RMS) of the difference to get a clue how large the musical impact might be. Within the CLI, there is a special test context that can be entered with "set test". The following parameters of the test are exposed for set / get / min / max / default commands: "NOte [n]" MIDI note number of the first test note, default: 60 == C4 "CHannel [n]" MIDI channel number 1-based (1..16), default channel 1 It depends on the actual part configuration which part(s) will be activated, the test invoker just passes this number (minus 1) to the NoteOn() function. "VElocity [n]" likewise, this value (0..127) is just passed to the NoteOn() function, default 64. "DUration [n]" Overall duration of the sound in seconds, default 1.0 Can be fractional, minimum 0.01f (10 milliseconds). From this duration value, the exact number of samples is calculated and then rounded up to the next full buffersize / "chunksize", to determine how often the MasterAudio() function will be invoked. After these calls, SynthEngine::shutUp() will be invoked to clear all sounding notes and intermediary buffers. "HOldfraction [n]" Fraction of the duration time for actually holding the note, default 0.8 (80%). The resulting time is likewise rounded up to the next buffersize. After passing the corresponding number of MasterAudio() calls, the NoteOff() function is invoked, thus turning the active parts into note release state. All other processing, like e.g. reverb continues until reaching the full duration time. "REpetitions [n]" The test invoker can produce several isolated notes in sequence, default is 4. After each note, SynthEngine::shutUp() is invoked to avoid carrying the calculation state from one note into the following note; this call also clears out the buffers of global effects, so the next note starts with pristine state. However, the timing measurement only covers the NoteOn, NoteOff and MasterAudio() calls while excluding the time spent in shutUp(), since the goal is to capture the performance of regular sound processing. "SCalestep [n]" Move up/down by this number of semi tones before repeating, default is 4 (major third). This allows to cover the whole sonic range with a sequence of test tones; if the note number reaches the end of the allowed MIDI note range, it "bounces" and the series continues in reversed direction. "AOffset [n]" Launch an additional possibly overlapping note within each repetition; this allows to cover legato and portamento effects. The second note is started at a well defined reproducible point just before a SynthEngine::MasterAudio() call. The start offset n of this additional note is defined as fraction of the total "Duration" parameter and by default the hold time will be defined by the current "Holdfraction" setting. "AHold [n]" use a different hold-fraction for an additional (possibly overlapping) note. Together with the AOffset setting it is thus possible to start the second note within the play time of the main note, partially overlapping or completely afterwards. "SWapWave [n]" Provide a new wavetable to the first PADSynth item while test is underway. When PADSynth detects the availability of a new wavetable (which is typically built within a background task), it will reconfigure currently playing notes and possibly perform a cross fade for a smooth transition. New notes started after that point will only use the new wavetable. To cover this behaviour, the wavetable of the first enabled PADSynth kitItem (typically part 1 and kitItem 1) will be built right at that point when this command is given at CLI, and based on the parameters set at that point. Any parameter changes made afterwards will be reflected in the second wavetable. Each repetition will then start with the first wavetable, and after offset n (given as fraction of the total "Duration") has passed, the second wavetable will be swapped in. Both wavetables will be built after reseeding the Synth for reproducible test state. "BUffersize [n]" Actual number of samples to request from MasterAudio(), default is the global buffsize, which is defined by the Yoshimi settings, rsp. by the Jack or LV2 server. Note that SynthEngine::MasterAudio() will ignore values larger than this current global buffersize. Some settings behave different depending on the buffersize, and some sounds can be notably different, especially when passing very small values -- which can be investigated and documented through this test setting. "TArget [s]" File path to write sound data, default is empty, which means to discard calculated data. Yoshimi attempts to open a RAW sound file at the given location; if missing, the extension ".raw" will be added. Warning: an existing file will be overwritten without further notice! While calculating, the sound samples are just interleaved and copied into a buffer in memory. This buffer will be dumped into the actual file after finishing the actual test and thus outside of the timing measurement. "EXEcute" Shut down regular Yoshimi operation, re-seed the SynthEngine, launch test and then exit. All these values can be changed by "set [newval]". If [newval] is omitted, the default value for this setting will be used instead. This default value can be inspected by "default ". Basically the "execute" command also needs to be given as "set execute". However, as convenience shortcut, it is also possible to append the "execute" at the end of another "set" command within the test context. Moreover, when in test context, the "execute" command is also recognised as free standing command (without "set") After re-seeding, also the PAD-Synth wavetables need to be rebuilt, since they might use harmonic randomisation. Depending on the PAD size setting and the complexity of the instrument, this may require a considerable amount of time. These preparations attempt to establish well defined starting conditions, while retaining loaded instruments and any specific settings done via CLI to prepare the test. This preparation is done in the function SynthEngine::setReproducibleState(int seed). This function resets the continuous LFO time and beat settings, and then re-seeds the master PRNG of the synthEngine with the given value. Moreover, it visits all parts and instructs all existing OscilGen instances to draw a seed value from the global PRNG to reseed their local basePrng, and also to draw and store a randseed for the local harmonicPrng. This randseed is used on each NoteOn to re-seed the harmonicPrnc. Moreover, the setReproducibleState() also triggers the rebuilding of PAD-Synth wavetables, which will also draw further random values from the master PRNG. Output Markers: The test invoker will send some markers and data to the Log, which typically (depending on the Yoshimi settings) can be captured on STDOUT: TEST::Prepare The regular sound processing has been shut down, and the invoking CLI has waited for the SynthEngine to reach muted state. Moreover, Memory for the working buffers has been successfully allocated and the output file is open for writing. Next step will be invoking SynthEngine::setReproduibleState() TEST::Launch Start of the actual sound calculations to test, which can be a sequence of notes TEST::Complete runtime ##.# ns speed ##.# ns/Sample Test completed successfully, yielding the indicated timings. Next step will be possibly to write the sound data file, and then the Yoshimi application will terminate, discarding all settings. Example for using this test feature from the Unix shell: /path/to/yoshimi <mytest.log set part 1 instrument 36 / set test target test-out execute ENDSCRIPT This test will overwrite the file test-out.raw with the produced sound and write something similar to the following example into "mytest.log": Yoshimi 2.x.y is starting March is Little Endian Card Format is Signed Little Endian 32 Bit 18 Channel Yoshimi 2.x.y Clientname: yoshimi Audio: alsa -> 'default' Midi: alsa -> 'No MIDI sources seen' Oscilsize: 512 Samplerate: 48000 Period size: 256 Yay! We're up and running :-) /usr/share/yoshimi/banks Found 943 instruments in 25 banks Root 2. Bank set to 42 "Ichthyo" yoshimi> set part 1 instrument 36 Main Part Number 1 Main Part 1 loaded 0036-Harm.Princip GUI refreshed @ p1+, (Multi) yoshimi> / @ Top yoshimi> set test target test-out Target RAW-filename set to: "test-out.raw" @ TEST: exec 4 notes start (C4) step 4 up to (C5) on Ch.1 each 1.0s (hold 80%) buffer=256 write "test-out.raw" yoshimi> execute Main Sound Stopped TEST::Prepare SynthEngine(0): reseeded with 0 TEST::Launch TEST::Complete runtime 119753064.0 ns speed 622.1 ns/Sample EXIT Goodbye - Play again soon? yoshimi-2.3.5.1/dev_notes/CLI_zread000066400000000000000000000013371506652756400170720ustar00rootroot00000000000000This command is not documented in the User Guide as it is intended only for test purposes. It intentionally performs no error checks itself so it's possible to discover the response to values that should never normally be set. For this reason it is sent via sendDirect() so that no preliminary adjustments are made. It is used to populate a command block with raw byte values in the normal sequence starting from 'control' It simply performs a read of the given data reporting the results to either the GUI console window, or the CLI stdout, so reflects what a user would see. Entries: control part kit engine insert parameter offset Currently we don't use 'miscmsg'. Also 'type' and 'source' are fixed. yoshimi-2.3.5.1/dev_notes/CLI_zset000066400000000000000000000007031506652756400167460ustar00rootroot00000000000000This command is not documented in the User Guide as it is intended only for test purposes. Out of bounds values are trapped. It sets up a SubSynth engine in the designated part number in the range 1 to 16, ensuring that the part is enabled. If no part number is given it assumes part 1. It calls the same routine that the banks code uses to set up an instrument when it creates a new bank root, but returns as if a normal part change had been made. yoshimi-2.3.5.1/dev_notes/ControlModel.pdf000066400000000000000000000347171506652756400204570ustar00rootroot00000000000000%PDF-1.5 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xXnI}+VrjM%JOND\ff'@ԩSc.RF{ˑ|q>RF]^wկQo:V}Fީ*gN]L:aVXux*'5'cK߱Y򯬭~̚0R Md?~.z_oNsx4"l4 o]5 թnDf% :=gSb1MKϬyuftU]/f`;zh|JrŻ_X]VfSUg뙯=>2{3D'_ l%ȏ=l*B(6ِoDbI.TIS)`Luɷ*H7wngcw>GRIzTl~MGR0> >> /Font << /f-0-0 5 0 R /f-0-1 6 0 R >> >> endobj 7 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 841.889771 595.275574 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 2 0 R >> endobj 8 0 obj << /Length 9 0 R /Filter /FlateDecode /Length1 10264 >> stream xz{\UUZ>rnp. LK`e"S: ^2%C35Cs F^"Im^`NohL53u~>ެ}[{u ;ioBؔ G* ~ln = ~T7g͜o 9ĥ}Ǟ\xtx3caɃ#UM[X(meO,d+^gF DTZ J7|*I$\\#qimES%:ɼD~n HHaY"l$lkN7l|ykiN>4K 'Kcyʓ , :)Yv`i)PzO?Ѓ N>Q0Ew܍,Rri6?O8,h $ !Mi~5͒m)ISC28O[ A7@A^c4Hml3grNkԜF4<;lppSFPF$%IhܧާM'ZslY#GyFоQNUW+r{cZWXڷ:j>>Gq0fN%Sf4mqGɈޣߛu魣JsqmQ{"11Tv*ٍZkFBTE6Cu3 nl*y>1H0&և!Դŋ+ {};'Xulǫˤ3ycoy#\q+ĠJIDq漃/s55g(;z2 >EĊ;om*uǧ,o-rϲ9}'I5Բ]+كS@^t0;%ht.9Ii]ǕZ І݆K`$=4a} ҎŔTŀiM3x+Q`gm;HG'_^~Ϟ_#4ɟFSӄʕFlH;hl.+AR8U$2RAj6IijCT;U橅* ӅީMʻQ%3,B>{4#X=LW:-=UPk07}'$sȶpކmN;c贘4oZ\Zd?1ٱe1ee޲뒫[c>냼eȑ(;hN'e%3KlZrc ^ޔw$g)2 ϻp8{ ۮU}MNn3e4*8Cic %toЈf1$U4FRAa^o%t|rMwk{ӹzԕ^f RHVB&*6NfVDl!]SJ]JiM8H`,ӕ<p'-KqDHRJWJRJΐjMQS\Z#Y.*Mwm2Ox=q5Xo*O)e3gsob"BE&܌=.1Eꬵ1\IQDbKRkzVl/v;"WUDKq5$d6Wa -%U@ t+9umhW1daGbŲcH?-!o31N& 7$ Pe0TjZDd ukQV):`4 &0M|ٌ,ռS@(y:r)aA zb$H,IJGt$KS!+啖fK, }yCQ\Y4̅ƬZxzb}EzV1WNo/?Ӛ7ʖ/_aܭ\ĨBFbu6gg[[Lpd?u @ 28M7Od!`ƀen"1XJWMm)ck<%Peus/3(6bVJs)D*eSݠDh H^%0PJSFt4FQ_D&\ȕR@G,9OOEPZ^AVr(y\I*&6K&yYQV.)˙M#X"ZVwhsv98(\S[r&r(ďU058ZLQPթ`wYZc5~~oyX-B.HnȘ - 3(`0Fu UIIhBZKG M9s 9C͚$i$!J(gh ˓iE!mi+k.KZĹ=j7=O{mi}-,=6Fo55r>s~ٶ9u`G2ҨJ5&b9&Rl/wxgbŷ]4+tŪk"sbRajeB̃tShDV|֩.K'v4d꤃PLm4Gj~~v?eky=p/el 7jN<3dI皢xzXJxuՌz ,$->%YMk)Y4H6 FJ~iX*pu6\vw'liiE~ŲOf=;Ǥ7yJE8I?ӄI^Zx#B%6ۍ*lE fpZ$RSSxR@UzXPC<=Ack$Ѿ jE1t"P` yCh<#\[' Ď庺GW.x!638ޣbTdWWk_MA}4yw* DM]_ {_Hẗ"a,I!>$d{l{i^i/@ĸ8n2ukUcFݵV8cݬlo.m.vH􀹸jm]s~Lv8^͊nT/{8e4%cHFҐ:%%&׫ucݢ"b[v#RL%u MX7+,{aVȷ'nmA;f عb]+v :mC?jkhZvǩOx{.:^=ut *сgY56H4lo95ӲMv*#OS2P^H`m(# S(pfXhzVY"[L7hhnIgDp~]rȺ*Z0Ji`brȡ!fJ 0e|iU]%0fs'O^rjThj 9^5tDrb Q}737f`,1>tݛ&:^xIӞ{nЙtdq.r/teV`bȜ'~`Nq? jďHvwț&B%hLn^rRFeqXf_WVTlʊd׷bȕ+b//цf/ﰘY(]RBpo%+/!+*V,_.K___B {=p sfȀ3MZY|4^1$r3r8Fu,DD'j+_'y=wc˂ [,R-ciIYLfy"g RGE%yd-F.X"stGu0Sq{[!5EڎR$ϭQ5Sj$_WU^c'{kG uDp|6a2^w3'>W1ل:gM=X{ <U6|֫A#Gy=&0">ko|~kKF -hi9-gysrITO.l >(u1!<`l_bk3[хBHȣtaűCK v6|?› ck![ZHLғhlo1/yX(ZVRZ=V ?'~_+?<{'AJZ ͭ}+o +MMJh&7_oZTJ.rpQ.&IggK%pn8i$?+HO|,#g* N 8'Phw#mo 8.zo 8j@] }3ox(ǏLw{z%pP@ȇWχ}{]|$V#erAvK/CRU ;lʷ x ۞N|lu 6 TiTڠ?|cw`ܺ7s֭׽ JSa_X_-`Ux|N(_r7 C)J+ ˗|e,P"X%K3,PE>xZ" h0_0hP(`<0gOGZM0] ZaL;Y㹭0YB#}0IDy0^7 7 0{ 3DŽhQ6[JQ zZa؛pX *`.> w v;\0xw8`  0he꼟2u6HJT U>U U={x|=|>NHAOI( A@8x!b|AJ0J@d+tx! <PRaBp \ %5Xmk(4'|M`qvJh 089 D+О/l6_Qj7 endstream endobj 9 0 obj 7372 endobj 10 0 obj << /Length 11 0 R /Filter /FlateDecode >> stream x]Rn0>pHJ/9bSbCz=Q*Ƴìn"8-E:OhI4 v}(Sz^h?m+ʏy^U< R/ 3(x* 9ę|/Wo7Wγy%{1Q> endobj 5 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ABDJBJ+DejaVuSans /FirstChar 32 /LastChar 121 /FontDescriptor 12 0 R /Encoding /WinAnsiEncoding /Widths [ 317 0 0 0 0 0 0 0 390 390 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 684 686 698 770 0 575 774 0 294 0 0 557 862 0 787 603 0 694 634 610 731 0 0 0 0 0 0 0 0 0 0 0 612 0 549 634 615 0 634 633 277 0 0 277 974 633 611 634 0 411 520 392 633 591 817 591 591 ] /ToUnicode 10 0 R >> endobj 13 0 obj << /Length 14 0 R /Filter /FlateDecode /Length1 2784 >> stream xTkTTw{fa;À ߈QI:ҒHV㣔HcHb051X11cDmS1iJhMRcIl1/dڕ9sν߷{Q8(]$LMdIqYF.G =s(i7ϙE{e a{RA+_dy&8[p$vOl,B0/\(8b񜊱OV-UN&*c^v: F|] S+M:8O^HqS)e:ݨDؿlyH}yfP<:^aQ.=, )m6 Ζ^gvw$ep:=!3kNhHXP`$(XsJTGjfFȬZLmDMˈIZJKtvE/ހ7q~ZKj.H+CUhG"SlIa5lD#4^Cq}Q!ξ᷄Ĥ@K C5J(_WzSoUˤfj56m2 `G0Gvm)M]t:s Q'-2%:LV@%hͥuҧzAJC/+ P]FIoR_jP%d :H%.۩vRhqi i4S7TmPvSVQmnH۵.*V!T&ߐXr~ Uꤺbݳ'"Mu˴R2NseI,Ҏj:],Z?O@ K-32mUezHl},To)!Y̆4VZQ&R%OOR-U-D&͓*K( ~H=G+rr~Vj֙Pri闤"5YJIF xg&(%mdÒۊz* >;2M:yzarsoE_+\~܆[~JɥuF]:cΘл%{y'% <1׫nL#0dzd,D";_=a/3 Oht*\Y=@ rACS\fS:#57Ws7>S?.I8 b ⯌ cq>b|s\>>x?]}8xqƃ0v8݊?1Njtqr:O$NƉg{~՞b'x֡^chceW_2031ZhYV-Vh:PZTxխ{q~+~c0^bE;^V/ѩn;`b܉vsg>4K2?3Ķj[jk<M~zڏ6SV$c}}Zߊ5znU_z?6L=xl̺qXUuQ+Ƈҩn:ƪGj~̨adxV3# bT?d`,cY$F!ƒ *XĢ * ?`O9j^>dWc2Qʘ͘5%A<bw3 #TQ/6^{$=9(Af8taF^nŷӦjc)bțdhLJI&0qeeJSwӊqe|qNu wdG;kS(a c4Q.u{ 5ʅL2i$daU+[pҭH P v!> Tn5pmUජ#q[R'}DC }} AAxFSr(61 #'!:r`T#;lH񎌅a &na ft1@X|M eJfZ] _GY' endstream endobj 14 0 obj 1981 endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream x]Pˎ >$(Ҫ5 `RCj03`y/w =`!\JayQ7`NOķU2mI8Ѷ \mp0aģM ? k'DׁA}fSo2vʶw z%*ru\@o+bu]cnU}ʔWDtU9s endstream endobj 16 0 obj 227 endobj 17 0 obj << /Type /FontDescriptor /FontName /DIBKNP+DejaVuSans /FontFamily (DejaVu Sans) /Flags 4 /FontBBox [ -1020 -462 1793 1232 ] /ItalicAngle 0 /Ascent 928 /Descent -235 /CapHeight 1232 /StemV 80 /StemH 80 /FontFile2 13 0 R >> endobj 18 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /DIBKNP+DejaVuSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 17 0 R /W [0 [ 600 629 688 ]] >> endobj 6 0 obj << /Type /Font /Subtype /Type0 /BaseFont /DIBKNP+DejaVuSans /Encoding /Identity-H /DescendantFonts [ 18 0 R] /ToUnicode 15 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 >> endobj 19 0 obj << /Creator (cairo 1.14.8 (http://cairographics.org)) /Producer (cairo 1.14.8 (http://cairographics.org)) >> endobj 20 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 21 0000000000 65535 f 0000014046 00000 n 0000001861 00000 n 0000000015 00000 n 0000001838 00000 n 0000010476 00000 n 0000013886 00000 n 0000001989 00000 n 0000002217 00000 n 0000009684 00000 n 0000009707 00000 n 0000010182 00000 n 0000010205 00000 n 0000010946 00000 n 0000013023 00000 n 0000013047 00000 n 0000013353 00000 n 0000013376 00000 n 0000013647 00000 n 0000014111 00000 n 0000014239 00000 n trailer << /Size 21 /Root 20 0 R /Info 19 0 R >> startxref 14292 %%EOF yoshimi-2.3.5.1/dev_notes/Control_Block_Test.txt000066400000000000000000000002471506652756400216440ustar00rootroot00000000000000This can be called from anywhere in the code with: synth->CBtest(datablock); Where datablock is any defined control block. This is most often getData or putData yoshimi-2.3.5.1/dev_notes/Default_Maths.txt000066400000000000000000000013351506652756400206320ustar00rootroot00000000000000There are four significant constants set in globals.h At the time of writing there still is no standard consistent across platforms so please use these in all new calculations. #define PI 3.1415926536f #define LOG_2 0.693147181f The above were always defined right back to Zyn 2.2.1 We've kept the values the same to ensure consistency. #define TWOPI 6.28318530718f #define HALFPI 1.57079632679f These were introduced in Yoshimi 1.2.2 Throughout Yoshimi these had been computed in different ways, and it was thought this, along with unknown compiler optimisations could give varying results. Typically: 2 * {some calculation} * PI {some calculation} * 2 * PI PI * 2.0f {some calculation} * PI / 2 PI * {some calculation} / 2.0f yoshimi-2.3.5.1/dev_notes/Defaults_V_MagicNumbers.txt000066400000000000000000000015701506652756400226030ustar00rootroot00000000000000A new system for defining and accessing default values is being developed. Initially it is being applied in parallel with the existing mixture of labels and numbers. When complete, all control labels and anonymous numbers will be replaced by this. These will be constant settings in the resepective header files and isolated with namespaces. They will be directly accessible from any file that includes that header. The data available will be: float min minumum control value float max maximum control value float def default control value bool learn whether control is MIDI-learnable bool integer whether control represents an integer value The first to get this treatment will be the rotary controls. Next will be the sliders. Then menus, followed by spin boxes and number rollers. Finally, check boxes will have just: bool default bool learnable yoshimi-2.3.5.1/dev_notes/Effect_Inserts.txt000066400000000000000000000040001506652756400210050ustar00rootroot00000000000000This is a simple list of all the effect inserts, their control numbers and actions. These apply regardless of whether the effect is in System effects, Insertion effects, or individual part effects. Control ranges are all 0 to 127 unless otherwise marked, and most are MIDI-learnable Reverb 0 Volume 1 Panning 2 Time (duration of effect) 3 Delay 4 Delay feedback 5 Bandwidth (only for bandwidth type) 6 E/R{reserved} 7 Low pass filter 8 High pass filter 9 Damping 10 Reverb type (0-2) 11 Room size 12 bandwidth 16 Preset number (0-12) Echo 0 Volume 1 Panning 2 Delay 3 L/R delay 4 L/R crosover 5 Feedback 6 Damping 16 Preset number (0-8) 17 BPM Chorus 0 Volume 1 Panning 2 LFO frequency 3 LFO randomness 4 LFO type (0-1) 5 L/R phase shift 6 LFO depth 7 Delay 8 Feedback 9 L/R crossover 10 {reserved} 11 Subtract output (0-1) 16 Preset number (0-9) 17 BPM Phaser 0 Volume 1 Panning 2 LFO frequency 3 LFO randomness 4 LFO type (0-1) 5 L/R phase shift 6 LFO depth 7 Feedback 8 Stages (0-11) 9 L/R crossover 10 Subtract output 11 Phase 12 Hypersine (0-1) 13 Distortion (0-1) 14 Analog (0-1) 16 Preset number (0-11) 17 BPM AlienWah 0 Volume 1 Panning 2 LFO frequency 3 LFO randomness 4 LFO type (0-1) 5 L/R phase shift 6 LFO depth 7 Feedback 8 Delay (0-100) 9 L/R crossover 10 Phase 16 Preset number (0-3) 17 BPM Distortion 0 Volume 1 Panning 2 L/R mix 3 Drive 4 Output level 5 Type (0-13) 6 Negative (0-1) 7 Low pass filter 8 High pass filter 9 Stereo (0/1) 10 Prefilter - before distortion (0-1) 16 Preset number (0-5) EQ 0 Gain 1 Band number (0-7), 0 = off Band parameters. 10 Filter type (0-9) 11 Frequency 12 Gain 13 Q 14 Additional stages (0-4) DynFilter 0 Volume 1 Panning 2 LFO frequency 3 LFO randomness 4 LFO type (0-1) 5 L/R phase shift 6 LFO depth 7 Filter vs amplitute 8 Invert (0-1) 9 Rate that amplitude changes filter 16 Preset number (0-4) 17 BPM yoshimi-2.3.5.1/dev_notes/Envelope_Inserts.txt000066400000000000000000000037701506652756400214030ustar00rootroot00000000000000This is a list of the envelope inserts. There are 4 types of these, some only having a few of the controls. They are shown below with their controls. 'Par' is the parameter number that must be sent and 'Con' is the control number. Par Con 0 Amplitude 1 Attack time 3 Decay Time 4 Sustain Value 5 Release Time 7 Stretch 16 Forced Release 17 Linear 32 Enable Freemode 1 Frequency 0 Attack Value 1 Attack Time 5 Release Time 6 Release Value 7 Stretch 16 Forced Release 32 Enable Freemode 2 Filter 0 Attack Value 1 Attack Time 2 Decay Value 3 Decay Time 5 Release Time 6 Release Value 7 Stretch 16 Forced Release 32 Enable Freemode 3 Bandwidth (only apples to SubSynth) 0 Attack Value 1 Attack Time 5 Release Time 6 Release Value 7 Stretch 16 Forced Release 32 Enable Freemode For all of these the insert value is 2. Refer to "Yoshimi Control Numbers.ods" for more detailed control layout. Freemode behaves quite differently and when enabled, the following controls are used instead, and are the same for all envelopes (although 'Stretch', 'Forced Release' and 'Linear Envelope' are as before). There is additional control number 34 that returns the number of defined graph points in 'offset', and control number 35 that detirmines which point on the graph is the release point (and can only be in the currently defined range). The axis graph controls are 'Add point' and 'Delete Point' Both of which have Insert value 3. Also, 'Change Point' has Insert value 4. All of these use 'Control' to define the graph point being accessed. For 'Add' and 'Change' 'offset' is the X axis increment and 'Value' is the Y axis value. When deleting a point 'offset' is 255. Out of range or errors usually return X and/or Y as 0xff. yoshimi-2.3.5.1/dev_notes/Escape_chars.txt000066400000000000000000000007341506652756400204740ustar00rootroot00000000000000use Hex value Character represented \a 07 Alert (Beep, Bell) (added in C89)[1] \b 08 Backspace \e 1B Escape character \f 0C Formfeed Page Break \n 0A Newline \r 0D Carriage Return \t 09 Horizontal Tab \v 0B Vertical Tab \\ 5C Backslash \' 27 Apostrophe or single quotation mark \" 22 Double quotation mark \? 3F Question mark (used to avoid trigraphs) yoshimi-2.3.5.1/dev_notes/FLTK_color_map.png000066400000000000000000001477461506652756400206730ustar00rootroot00000000000000PNG  IHDREHy`aIiCCPICC profile(}=H@_SED2T"*BZu0 4$).kŪ "%/)=B4#hmq1]^! ~aVf1'II{zYjb@@$1ô77m>qexܤ ?r]segtj8L,XicV45)∪/dN4ue4r= pHYs~tIME-NʧtEXtCommentCreated with GIMPW IDATx]yxE~19 @8BX4]TT x,"`5*Qr QAPpݿ?*i9kIHO?C꭯#yyyP@-Ny (@Ş(Pس Q޷o_FFӧ[hK/=D}ZV1_~eܹk|| x/_oٳG׏1ST~rw}*M<߇[w 9rĉ9k׿u֭.;?Ν;+u˗/GDD;wn'OQ^EYV󗗗KGE… znnO>}׮]sw MOODs~.],\M^eժUj`0TիsGݿ.]oߞ Qoj,]TR}ݷ~}+\8|0aÆB* N> #GxCiii~uFo ++k<<<::::::**jŒ$k> {&.\Yfu:}ܹ3X1bɒ%ݻw@(ߥK/b6-;;ߗ >|8K}%I_RSS뗙)i  DQ|$%%8tв&MbEEE+WB}q)_$."ٳsrr"##y/_f>S3PŮ]3fΝSN_}>zə>}:agΜ9xwM2=ȃ%222p8چ ,X@~yyXvbW\ݻwRRRqq1Ro;utW^y%<N:.Lis׮]&%%`02/e$7oվ3:j@mڴi$I7oܕǎ[fMdddFFFdddiioZ;wEQOؿÑk6cǎtDn1a=g}g[\R=#A<;TTT;QݻwtttnnF#ѣGjݦ|/xn߾бc]v 8d21xFq~m)T ?77nCZ;wn۶mx~o;w6L5z饗Fgffvh4hb֬Y{^ddd$''ƍϘ1o߾/QXXHM7dE@k~`D]N9{$  'It}5%H_)R'StDPuiBH*PڗMa;Wt>΅%IX7E|'۽(UqcjC2R"[[شITrμdȻ2OJzqJ㴼$I$ |ιe:+s]m(|[,dUzJ$~wΗvff {%^LL ߵ68ߒ$;* WW'DGG{,C$68w=8퉍eU=%l߾]{ťS~~>[Be=uQq9]x<\[}ܷ$+guCWl|H i|"8 RSS_PNlSCTQib2ښ+uQvG\R_*%ő޶h-G# Ut׸j7qqV^U)- E- ;%!qmض|؊F۶m1m4j-ռ\h~Y~m/7/רqqXdtt:# nJ~-6sipHy*0;sʩ%6;JMMi4۷yp,IKFWĔ@*[eAXm7|p $|4s !qqqp7vYW̢[-O֭X,=XP*xg=GGwՆmf_v@ @a&6fd@n7,^ط:bY????==*3SU n3K-`{޶mdJKKIKK3Lj z\H<;;{ZT}ذaѣG]5jT=}Nԩ)S{}y嗽(4x~Oׯ߿aÎ;hѢ޽{;V|[n݈#zѿ3fi&zyݻwO6mڵ&Lp/`0hߴiSڧe?9ҨQ#W"bQQQ bѲVѣ CDDDg*F 66`:W.Ixv u|dآҿz=g2EƶXu(}X--̂A]P3ٳF#-?"LBpZl222lQ&N2ς ln:$$@ va_^VI$&"m(IpXn&HETInW;jԊŋ{V$|udZt{42PȭZ͛j_xb[no'NLJJ_|Ť7xiTK 77իWzz:]I."`M`ҤI={LIIȠ|.\\\״iS}- >d2)N?|='NB L&kVXXhwڕ /2 q7|3///66VUVZ >En{NHH(((8|pnn.+|S.ވـ.]P6Lf:y`p:zbyΞ=edǏË8A^^^߰a]J x_z|~)Pβ&Oӝ;wK{ȩ?cYYիW2^Э[7zBtǏWT3gtY~q\fffLLȑ#GAA;:'q_~9:Ǐ۫***ܥ!~MـԩSQQQ=z(((Io]YiЇ,AXXU A0xqƌꫯeM7o޼zhÆ =/_+VdeeqGE ?7L ڵlۮ]vS\K DQ߿vv9sRSSv n}{rJ|||ǎf͚іU? Cbm۶mժFٹsFq6z7x\M<@>}f͚dOgFXXXسgOo -@fsvT*Ubbǻuh\SKwxIwqv5kҥKÇWo߾~vAȑ#G%C=soـ*E;tQ&?>Y7n9oVxϟ(#"2r姟}lr0o<ԩsǎU`Tgϝ>|d@%ܓZ$'':U`/DG}gSSS333兽>?k@iJF\\oCg~VT*L GϫjY !8ο>qpRH,xp8F3 j@qbpT4?T &PUz&LpW(Ɩn۶p̛79i6h~_~Yre&Mh Bh,]s.ѳg͛7v>BМ4ȏ~_r"WΞ=h4j4Ҭ,BK/c[~fZ,Vj130J( hm6v]$a1̂ 8vcEK}*+*l6$66f$b1[,_u>~ذaؐL#.#ErnߗF߽{ƍ׮]p8},A皍,8H1ϪT*6yŢO^o7|e ˗MY- Ԫsyjb"B&O~ l{xr#1tLz oʕ+/_UeL:u3Qxlhz #ʉ8f̘`Ŋ+VzFڳnHj_bIrs:Z0ɴ'0K#,<썙oC|%V!0d`!_VgϞWNeQt<+Sa'Ш%/*'[QQ!IRu~NLlɤO"v˝ZۏFO%uf!Q@ B:_~э{A <axKޒZ8FҲe]vߟ6ʣGh4>#GusW^y5k蟖/_.g BA|#}bi߾}G:tEqɒ%że0%q oI-js#h4 .ի(:nرSLc ?S}#F8s uVZ5c CANOOOOOw=|dpc̶1KNQ-[/qxsrr%K"|򘘘A)|sAUqqq4?$Is=W2e%V ?+PP$i[n~'VX1o VpSڳ$I/233ccc^ڻwo̙3 ~M(oʕ+׬YC΀x@a B.++[hF;wntttii)q< Ob)@A={֭[NBmVrmw4C v紴483Wq$Q9s#n˰֧w#[%j( ڞk w~f0 %GRcbbcbb"" Kcj4K74DMnN⅋C1l28``,_YYp84iX\\\ӱGEFcY bIIɚ5kv{~~=ܣ| ?ל-A*).)/-Of kP#vpD0ڧbAVym۶,qdϏgi" !6͹ۅ}WpssmƷXZ^^n0ҥKaaaM4awQTV|<ϟ={},U*UAAhl׮KU*UqqSN&E3ǎXـwCgoh4G}tҤIǝ;w78tPӦM'Ma$1b${'= ,#Wp0;Kv&,4mc˖-[oi|նm|m剉C j4mUyy*rsCnsll,l7nЭ[7*r@5E~V YرcϜ9Ӿ}_~9,,]ۊ .8qΝ;垛ȁ773\__Óȁ?+P|ĉSnܸQhL" ?+PrVwW_ ?hѢȁwSgVpC4ֺu:GG"rshBnL7o^fs\\>Csg-[9P hrB{Vg}߲c|1~^1>LRCT*-z#1WH)=&Şks)NKJJPQQ]Z 48l˖-%If'͐)=&Şk]ve${n޼"b}ݘVZ'QAfj2vnvd2,o2XS$&hdi_DQZ$F=ZsFEARYF,k׮U}=y?ϳgfee=u?XY^^ڷ8===???"""???==8C߉'5iӦ}ARRsrrO?[nĈ=z߿3/&%%ɩ~餤@AAIz왒!;/Fѣǣ>wx~=zgINNNMM؀T[.~6رc-ݻرci4\fӦM HMM/CŞ/_?~۶m&)---'''--d2m߾ݝ>t)))6ltM[{3gιs碣M&Ӷmz-z@ fowu7|3///66VUVZ o+:uJӧO꫇θz??TҬ,YXjSLs˗//Ol6ۉ'~mLeeٳ+**JKK͛W\VVj*y)#G2d{~n8|rxxxƍQFiڴ) h֬Yzz̜9s۶m_vlϿn޽;`6lXti&MN8`Ղ ;vcƌEqrrr<F߽{ƍ׮]둢Vb,^xմ3gOrcmڴiСq˗ 4h̙tυ PƦ[cJsh+L/$3ϟ254?P3rHQPPcJtTnkҤI~~~yy95={c^~紙e|IN֭[7:>uɓ'EXbŊ+ϟOLLt%:ՖkإKlj`082pt{nͿ իWO2yYhD& = ?>|z5r KV&**6/^:u*u,ҫW>|vd{6m믿o߾}͟?^{衇***i4p@ZፊkPmyZי`ҴiS"+V9I`[Ux$I;n(.:uJPj*//o۶mwq;v .C>мys(?;;{Μ9t&,fggu>>/^'лpVt$_Փ=_zw޴3v̙aÆz:AAgdli`UVݻwpǩS ><**e\=8 dr>~xrr<ЧOYft::֡CׯEO??w^Aْ$7nܸq7v;շ^|9oh޼/rҥD">>^ov9 w}ܱcGFF9wޝ.HLL|SO={^`ԩ]v͚5tjb۷/#Gn߾}K,lf/#%%e˖v߿p8GvPW{i1r ]v@-cPG !gq\.\ػwoMvw={s͘yy@ d2Ɓұݻh޼ ڵ?~V_6 KEN7v)SGFDDԩSy1c5.m:t~tJG~'N8Qsw7}t-11qٲe$Q?Lc _t}~jlْ>Xmb΋OӟTo#IQQQo߾}eee۶m{=U ?+`08O>ӨWٹMڵʕ+}i ?sSOe)))۩W{V5xF9X7PGyVғjNcNzzZ8ι軼F!WjZ:_Eݺy~̘1h":դ111111IIIQQQ,z tG,F~GJΨgRTT Hqq1!qƌ,K|||877@~)mT੧rI0}tǏ?mڴ_|Qg Bݞ=8~Bg BΞ=N8q+V8ʲ) njʕ+͛7ر#f͚0)P?7h{~w)䄄QF(qDYi1EA|pLxtR)DW># U@ Y_> o8v蓸٨ BVڳi}<>9`$a` ph ʫ@' 0k0d(NK#C X|]ex\ `a Ô矉$ٶkѻY(tr]S}b3gR| *iP^^>gΜ]vEDD?~ر>9`Vp0RXTW;LlPۀJ@]Zj`}9[U8KSE8KXf+[zߞI3|`˗/ϟ{ϡhi?U9!UDfl 7>4w)pR`[kqWQ$$.2€ 7{n΃ qĎ~^b,QII%CA(RB$I< %Iwo.ܽgr=yW${D]I\v1o.9[l O?z=ͦhUbcLLLiϷQE̲$45x[Vʕ+;v;5kVQQѼys.].MpII%CAhtaQ\g&sG@GxTu(򜕟5jTXXXPP baaaϞ=vnٲeҤI[l@gEaE+-~iڇ^"=YI^ Z Y;0sV#{€pWkPXnq`IBeK8* uf"C,* 񰬌xa* A $#3hmitYV Qy:m7ՎDpYW_B!Dl3>[@ }Q;i3jg $H:w/"UJp@pTKᠧ=&lBelDcv\EZF?5ΖQ6fxčv&PfgYϠgݺu룏>q7~V:7B-zkD{UζWgɩQ N;U\Kh5 G{^vb53?+8?Y%7~@wKuUQh$[;7oV~NHH8sÇ\}v*WzQUd=GHs5\Swnqygm .ΉQ JnkCu`0w=o;4oyٽxBĢBp~>.ӥjT`ŊYYYǭ_N8^(߈N Z1s9#R0G<*\.|ʕ͛w3S<ߖx\T>]V((a[3pBaa!":K_R9Կ i1-!RujEH$8ml" i˪ p8F9j(gm?7@٣c|3c2\zvi ?JKKxLu,@t$Ǟ<j̄.kgq?t\dAY2<8ۻ6A> ̞kg~c>=P([<b[#P zl5x<hckQAEC!@[0ºx@xx} 8%|O0}D]٤;}g?{_E[Ue#` , * ߇Gm?tdWd *8*#,APADd$0ȦD w:Uս?*i:ބtҒ:O~Uu{ιb&T?І#`68FQ%%ktP| Um,(GQ*~ *h?=S?UEYGp;aŧLe{?LV-:5\!& pAgt"el=3pE7 Tz#B8 cm epkBObPUj~^;ρPqَęp~ۤ9_흰^OgYv"]fj64w8~6lx {5y޽{p:SNݼysjj?nܸ =3Pl:D6 RPEdP v)8 ,lOB&<6gTAzr4!XGNB]Ցm,[K8*Q9Smpc-D(3bD!{޷o3<X,?ã>r)SlܸpTVVݻw0`@t|fuTb tp&zgj#Nơ5ҡ Y-]WOYC_ 3p(C[qL4N8uΐaozݙv-iϹI&3wޙ={ڵkꪍ7^|oֆ ?mڴ)Ğ@s#)2EEoF!~UbV7 D`/G:Ѿl0=8pJ=zٳwe|E6lu]IsrJ{cF,jX/wlq"];v@~~~NNΐ!C.\a&>'a7E[v(bpdࣛ"U,60h4,&qŔ@Cïa]WIȞt`ҥ~jjj\.˗;N svI֟y("mN'H mM o1/={ٳkJ 8^͝3gիCpҴwD<${Nn&,8f>5DlR)!{6~jРAO>ox޹sfddvv[zzرc̙SXXhϭ9&H:J> pΰIDp r:M""|w7Ν;k׮Fs`dL|nweGW:=&pKI}UgcV'9̙ۧ[+\OӰa-Zdݺujժk/`FIy6ue؉zB@LE9 B }!{yL>tv}РA,w˖-999555QF DID 1S삵`Hz<%&߾K}\q,;N6W^q[\H2 ]K_ #F1bD^{-ƻL|nØC O؞7ɒd EYY_EzM@pþQA$^@ d (A*AB&`B|6 pD69b.'mиŘZKR'819FʍIEE@+*V^E aC WN~P*34Ty.:| ^zI #T/Qq K$^zɓ6s4$%xgJ7qg`r \U;c{'uE I[W K Or?nki?q֐>H%5O+~> |fe.XT]wfIc]>S7Gu%iiu揯/[W@&?]{cߔ pU'~p}oh\= 3#g0&bCvzƘqv,GC_}yyy=yyyӧO?|pnݞ~Ǜoi0biH&hRm왺:RSڜ Ȋ,ɒ5ݚ%SWlqTO3.jK+m.җR$wXH:(dB(I)%% >/?#E)-6.vȵvIy<˗O8vO8?l۶-GI6ӡ3cLc>s98cL4|&\*/8׹u>4& 0XѸgy8tέU 0QD >Նhs1 \.נAf͚|pݺun{6l?~66XhQvvv@ļb :ڂf?Erٯ7(ܘD ޽{\WHUUՒ%K\nmC-ׯ6#!-΢8=gq'O>,0}wW'1sBuP{NKK3&׮]F)բE233j/KZpΛ'Na P~۠.0ʧWUYYt'xB֚RQQ6z|޿cDEQǴvĹs87tSl0Z7'I\X?FK$Kpm@oš*$ul^pKKK*C`k֬ 0SHB 8B'ꀥʢ|Oَս@0+!B \Nh/P7AȞ;uo߾Ǐw:voT)gxܐYUY(Jo}^Qfμ Eh%o$l$>}|k׮0aڵk\xcƌ L0 ҥKnnnv)#Mm(gX,>*CB_ZA3Os]x䂠 !{zy-[t^Ґ;3dlƃh}N{O=xyy&Ih?Nogdd̜9gϞ555=zxWaqo's Gg[w IDAT''eak9DJf| %!tt1̲sf>},^8rݤ&>960ƛy'f( Z|SGǿ"ϵ4dW!VtJ)#'{Bk{d*Q"'!*IariB_AbPPz RǛL4Zƶy Qx(~24 qtp :t:ՙ1MJLS5MπsttͯؿQy5z,B׹Vi"|UkLoϒ.eSP:IE;/M+Cb@vӭ3@U3>}|ކ݀]{>a>ƪw*Im/$z~7m7_xʿ2|ݖ̪>r[{S9PōI^8@8^YxV៶G Ä$H6vߚjy{le*:\ՙW|4i> g:5|&hc{]ϭa8Z n^[R0S;@8M&bjsV?O ̀v r\9w.W_]jՌ3rssC>\nB'R>a<0 }R?79 B'f j%~aE ?~aKB 5c%!̨kˢ :} 5ҢMo8,櫯"x0ĊXj_>%J8@BAJ  u%$n=ahhPi5NGuYZy$GIj#a).c֛;fE#q[^4Y ̵ rk6= 9o*5+o92=^Uj9pB}q'"DbuGOth 5l e ]$ׯ2ؼ`8I~ <>]eITP߯jT"E2Ab5tnILֶi\,YJ|׹Zfee55??}#<Dy.s9ag(DN'_}]7@R`Q PZkQY?.P%g1*UȄ:y.o'g`vt ޫ׷)]E@}BoɁo>g={>㓺|Bxy䑿uS,"|^o\KQU縡;8B!-sz5,p~hԭ~ס7`}(t9j?TC۱c{#.k RM>ݺu{77lT>iHZ+m=aVBо讝]|i_uLnN> WP`wЭ&~C)w<))ǫmY:nB|arѼw<| RY)}=Ko3KBZ[=jJr]yy$R\mbq1ƝNF@g9JU >VQT+{dʄsJCXCIfzHS}iFKǂ퍒Q(`[o,&t?46Xhr 4h֬Y6m4iuֹoذan/g'# clokc Qca05Bsu3 , 믿x?޽{G݄mSHFk ۈR\݀:*S b91 "R3cYv;fd:T M 5BJA(52hx<>gtߎ1& lق:NrE[ɡsj״~]`O^_wgջ^})\9mZs^OhL<ױq^B]W_i&>9b4m&]1XrhHj JFۦO.~f3 L|EH3?G$M%$ZV*⑌K; FuٳuSN;~xnݎ?cǎ&>"$evsܼcܝVh~H]ЧOk׮ ^x&>Og= ټu~:ݞ=˵" ~zk޼y˖-s:ڕfp;QJaM!|`!#^- 222fΜٳgϚ=z+|&>'$"~ubXr38 <ҵE x8`sk ~tMnՂ"ZF%6Bd5yW7AͺgH쒺78Wn# >Vp @XKx%Bt`/1RKX@@}@!B)VB LU*?CY%J,YeJY(%VE**QBVHL`Róڨb XE_ bf `u튴1/]H Mc!asb<k%)Y;P _@ /(%>N1_JU_诅 qh*櫾a"c\QBtд pؠ,i%6%zŞ.T7>ߏ2 ` nwdm~T@&ʌ4/tcFtm;d_nB~_dNBwZ챛kɑbˊeQHo,IڥM^pi }Z<7c /rcB= ~3֮]+Qz!Z;[0>ZaH-Mő3mo >P_wads gExЮO 9|)=t67%%>kW@3 >إ|k=2}HM ?vFk∛âlZuSWϧ-=Ԏ*H1~Oq>ϙ3gŊϟ??++;в\GÝ]8c.]_84=GO߯sR!gQuMR!g<:@ >xYeOZELTTh (}vqcś8iJRY=\ ꫫV1cFnnn?SEQV\Y\\|gUT\N> #MxdXDuQi2H4טz|˳;t`$?Wϭ^Œ^_{>,'p}WcM3Fgq>]t)((سgOII ={LU&>*  jQպ;,ɨpKќW;WWB4f7.]Jh<gyG56u=#t;mo껃jX65 Mu^P[ӷ>@)(@H?/ҙP>(zt7Xh<jmz7|sxfsI_YlƷm׶sf[f`,F0Xyn$?I8EQJ.\}Gس)͖̿=p7Q*^?\۞ׄ}\dM48 p>%%%:u:dggWWW3G}.V!ɨ9رk:"ȳ@st)xOhZ kĉEEE'NOL#m#-V:tŋov8&>'MP^YѴZ("~~7K!󔗗Gx߯$}G^4??ID3>Rc+!-;EFi)SL2%IL|NFM 28ƋW6ĩ!K.MF]?>C˘1cP^^fM|n s,$*6s ߽ H}gB%P\H.Qb_G$Da!rG-B&Qe=v*S'EvLi2,~PgRVI*=e ?XI;hD#'V3Yrs?k;.P]BߛEH5pZz*p}5ޓ{{B2.c߿ '[$̫TH(**~&#I(w1]7Ϸ?#Q >&Ck*&)@Us8(D W3ۿVgl߬t!Ϡi=ggjv2wW]@_Q}jYX򮗊K'Qzxy@РKU\w$?D]^&Af*ZQ>77b=0gbaK> Ƹ19v6lX,wqDŽ (Nsԩ7oNMMǍ ꢵ@@g؁<0}*ޏn*h^@B!#q 侃t ƢF@?Ŏ%^L xRlX*Ɯ;`~̻Lvo0 ۼ8"vDׯ_߾}^t:uvZK/8sN7p(Æ ?\nNcćaI߾}"m?]vYQQ|c[=sFf#OY/܋ݼ un!;7^ٳc=r,_t:_/4!-QlJ,[hc۷"rM6:p 6wzj3~>).KK$rfϋ/~g\nǎHe&>NldX4ʑ$% 44_P>oFNN΍7_{UUQ\Yj?DC4C8bnBEٴi|7|6ݫVu/`w$aUSMoKɰޠ?!$&p0Z-]vիݻ RSS`ȑݻw۷-[rrrjjj(F2G/ɜ ҹJZ QAL>'++g_?~ǎM֫Wۭ9Dl;vmYd s9gΜ9!:YYYZ8-h)gl i]؜TyMuac-_*+˃Yi$.kt>sYٳ`z jd( ,PBwBa 5BA%)b"*0 ;z[jv@j% {!F3۷'z84d{ <`sv.5CH)B!q+HD)%R8v'^]@_Ptj<9x$ H /DEʫ15m%pF8m8l>gA@=r5I 3Ӹ=SRp cJ3y[ULjƼj\?"SW}g"Uˀ^H%O+)h||>І ?s'oj8O3D|`9 udqAέ7>?bs7KW<*g .]Sr`ojƓb;j?xL<+U ?G $^EykppnҔ3ԞI y7Νk>:| @g~U0>J4tzt>s4Mz4!LgۣyDT3V{t>θUZ|ԯ5~ph>/Ə V5hI8Nj2()I'&2rQuѢEه{0">'wUi DK/2( ҥKnnnNA3~6ŔdRUBHx,AsٌM9smSVᛱ XDsUM2l ,^=1t$ɪH**D,AH|CQP*ˊ!D`sI2WR"ZIKB$d8tWU%ϑڷ`2tqGDNz1|lC IπI!- g\πPe~술~~K[YT>Q}MTfQAGm%QISL{n<>ߍ۠?0gw U?󯻲^>baf {2xwZ6n>Gc5~'㱥>xǿ[&g`[ 1(,ޔ'AU`AĔ3О ?]6`=z:t0a„Çg?>tQc>Uπ1U4_3s]}~_%1tB. IDAT>KT5Ƙ{B49|׹Quy(7 4ܒn… C ­詧ڹsǎ_%+skh|999ӧOٽ{w~~e]ꫯZjƌ!͵ss4)++;쳃9rSRRF _`?{gN} ` x7 Śl)-oGg;w45kV׮]暬,c׿o߾l3gSVUO>cǎݴiӃ>?xn3gڴis]wj|ҥιs=z0ӧfdd̚5m۶&>bJ={-[f$I#T^xqnnnϟ߻wh8`)$=8p` ,^\PUU5{lM6N3bf?DvNNknذtJ4z[z^7&>'ϭ333g͚u\]w^aa hlb?:|AK. >2~>{EEEp7CSL1Ӊ** |f]*YCX$CqP>bʲ 8lI)B(Tt3,v !ơbMn+PcH|dscV^YKlƅ Z5?|v+wWi,~LJ_Uџ?޴Fo)r9٪kT5(~<,^Ƨkk}tziYrUr{aHq D}>pZ>VQQf>=7@',].n oVl"׏eDf5JDgO1&RB~WION.g Z].PYiU =Oqg||KD Ѵz|0c3,0u@5ՠ)w(76ۻ pid_{a3Ȱ9&XOf=rA~ڿ']5Ǔb[fnj7W/կ5hݲ'#X6(zܭ[~_~@s->kUhZi`t*5[:g*5&ϵZ}]t}]3UMxqι髺3U?W%Mtp~]P&@ɤ֧I03UD L_Ȳ\YY/o۶|ĉ'N 2^y~8.Ƹ>- VuS}7ן[=\A͚5+`aaƍ/?s6mڴn:=~ 6?v!g3ןSbŨE6lضm&Mw^_}8Ram3eh 2d…`vvv5d&>'wup˗/7|׻tb4 WHW#[mC8p ~XzuXϦtlvmcǎ5\k`ZEM1%cǎKl:uWC-az|%*_oߖlRw}轝_{KAe[/o=|ժ]KFK)Tt+VIdrQȄBСC*g`H m2Oة,rk4EAxU_FU}6&8UԬtUuVi2P*_nnnVV_Sw1tuK`{aX*t@{w.FrOӧ]4Wp5>QlWm=W0h8zw7MݼF@a~ź|1.g@v~''}#Įw+F;z)M(SJK۷Qg`ϭ̞ ~3֮]+Qz!{FY$1&PJH P}" * SJ _JD(! ,˔0)~xJ /|j\>3|̙b MnWXρW`ẗL``L LT10.ØAi1C_gyqD/i\n-,gO?Ueʕo>,bl?'cℛKЭ5~3Liyyyvvv$UUx96ןP;ZY@.]ٳe={ 6fϳ&J9"ANN3<裏y䑀/`1L1Eɓ#G۞z` ZC:uf̘1DETݻwϛ7o׮]~gϞcǎ>|0wܹs#bsX+ETWWo߾=8<`t29)ȥ5|'$ARU7޸e…E:o5jT;vlƌ+WAǎ?jժu=ni> }m={vs9s EQJ.\}G|ͨkP3~nU']3g\lY ?xǏ^O>]t @L|NBLD'Ox9眄:a„믿~˖-[lY=G!C+ 6{=SPPMo~sәd۱cwy'==u]7f̘+WL999[lzd#h׮݉'N8aR$Aφe^{ +V^t~~>ӧoĈYU#UUUezw}wΝ _tiÆ XjFS޽yfs cp8zk&##82`}Y9`ʔ)Cjv5Ju! Rտɓ_#F|'[nH.//<qj׮Yge0:_ve!)//?t萢(=z>^XXxÇݻjqWFR(~@rbrM7'N4,//7f; EIA40g X䁺F UT'HX ]~;/~U.MkǓbUvxӶ~GWX[ރ%klr\>Yef(::b(//g*--5SNv};ڵ @?vϟ?܈ ԩQ4o޼ .[lܸqSNǎ˻lOg)g=Ϸb5 ÐdCC ?;3}?V,Æ [/zkÆ ӟFOχ333|ޘC4*엋?݌KD瑢{1 1;>4?~b6m[-o_}|'Nx-K4|۔z}+Lؿرc[o@~1xm׿FtmSDbߎ[{s}:t(%?)۷7X  sYzu=Sbܑ4Wc*Y|yӖ [,^xنt7&%Wl\s5Ɵ!$ `s vDe۶m,_r%ƟH9n\UUUTTԣGh$a܊Ҳ"?IIjjj$asϿ4%??W_ݱc+xǃ۶mu}'N1[n{ケsn޼ /=wqGxGo;wO^}Ձ1Ɩ.][XX1xGy$di2A (o??p@߱ciӦ$aL OSG(..6/}>ٴi<(x(--/v|͛7?>pw7nmy9eԩ|8qbnYf{?c+VxȞ?YjذayyyFC ofժU!kf e޼yN؀}(//7C[6{{VkYYMP߈s7"Cw:ݐ$n^q+b#?駟&}:8P6ސz +]"ZjBaq LT`u@з!)v;xX, ;dYfv@#Ş's_xo&ǎoveX4iҭ sΙ:u?!|'E]/o߾CQFpΜ9s֭F%͛9穩3g4֯_iӦZjgGTlp+x|PQS=_W O`5*Pv+oKAIx<ط(: UνP5X!0aB7)J?OTVVfTJqdƌ~?@`74hkvԩFb-F4C9tЙ3gz<ET.+8$x|ذ70ȁy"0@=ȞOmA &40"O뚺J@6jxp~mڴ1~ \p{СC$. K *u!{&xÊx||ڷwg3l1xJ-yt`\vuW_S:1E3<>K/[@ߞZvaY1Kw 8˟.JVk<<}R{||&/q1A***\.(#c* F^J"16r/ !%%u'ݺu1cZƞC 3f]VQF=CAsڵk%h>q L ~Pb;8@$%VbkHRjm鎶T3jK,)&;5eGA-G+T-Xڵ#х KR_QE,d&% Ҿ}{wil"sYbquϟe9_:L U| Ι^Yg_}i'I_ǎ;|џЈ])C Yr3=97O :4"1HC1$g}vAAi3yѢEهMIIy衇mVRR/GtݴiSyyy=m۶PF o={vII[֧O.$;v Qɲ`)HOO+߿?@ҥK`*fQG<++C%HTUU-Y$FiܪwޯE]$I:toXʚ7oޠAԠA~En4TC{ƌjZNaɓk+mȸq}=zPJSSS>o޼gtK.{))) D-:tgMЯ_?m3ᥚ odY?!9?r,CȈ#bЏ%)>?3,O?tZZ#(??2T rrS֎%%%:u2*wbsϦtܮ]'N3N8qWKi~]tͭ&f)hC]xQq73)i?<|pJiJJc=L40Ŕ琽ov}ʔ)SLm%gSLIFqZ ~PXy|rHQ$bhJ,YVN$+@ llTRY@_*jPeHV+؜LmVbZָ|2Yٴ禉ӌW3\JO/uE,~}¡nw.ЏNSk>HG'u|HG'X.ЏNr8#EFaF\{/nM)de0A`pj7iJ Ih?̺.*%{~DXXY Q;p{>K(|Sіw}>Sg[/X|!(N⼑ek},}َu:N?>~Z-)n|MOQocOojs|aυ;ߐb|2!j9á:~,f,RMYՂ!Ok*9`Æ zaaa^&OܻwoG}:L0!lXl\z<Hg7~&`*Aiڥ[˽|6%";2;t|GaHq<<"] &"^/D⸰ \qapd08\WAыWT ED\F QC:NgڦIWX}xS]}[_U}o52­tk~hu-!_XΚGD֛5EIJFDehW>\gtz_رc ðX,}?j*5zJG7n\nnnLJ4?) iPI à (RC5E (jr{Q C3t] 0Ca@@ %'Rt=jj( %V#>I f׭[7S%+VO~Çx<֭۽{wee7߼yf3q4n}ศ{лwoB_:to~٧OKgPQQѲeH둣GviΜ9=z`n THZ)Vl2EQ,XvСiӦ^{ @8?_iϦ̙3tb E1(ӦMs~$ڟuOdeeY,G}6+N4iYYYӧO3G3x`Æ }Y^%KVXѬY7|ӜgTSv?pB;wx<3gδX,/Rvvv]]#+{/^g4ikurE㷼$)7t5k׿JtaFlz7]W!9iEÇ:tФqg?sV4(@!'' yE"4y E" ^Q͞Q^"BDY${ID,&Kd٬V%lIn%F}g~#1 bCO5T0T=R}a-y>1wԔ`fY kp~B4M1t= @QJC^HІ) ǯ;tL@7pB篛\RRB G1?P0R1 "AdIbuPO~FjPfiDgPrgw?s=ϬK56=1nXG\z2=6Wv+]S>PI߾~h `o 'oj+^^yVc3-_מ_j1dmInZ3soC< g;8:vw 6b{Kmsڕ\ΐ3^͖M[׻<YwS2Ewy 2_=} z.+ (Jn۹m'4m^nvmm-W&IN:RQQ1iҤjj̘1X3s|i4>b3ЈFACzȧ zDz?ސ(iV3 ha>?Sp(L)T=M(|afՒI^?aGޱcHyy.--t\n;aaKsBՑCnܸqС@`Æ Gk)~Gş޽@Ϟ=#ݻw',|)?#fTDuȑ#"Ç+1 >.kȧ~SrBDL!KSoG;V!6U" ;-ٟUGv;sj̑HX@\}sUW]c~~~B) UGڷo`ݺucvsj`ّRAxؖ-[UG͛7w7xc^rSx~g UGMֺukN:I& c*\W&f3?Iu}K,a)|4["AGkQ 0#BDA?$Q7Q@}ZQ~/A<͌??_ߦ濆ω4yž6m(e?Q?EO6`,ϯ,qa rrr*++srr ȌpoM& ~chaBH@E*;(hR|ns1+JPUGFc{TEQAgNM!IO! =͉ 8?7h~fSsT\rgv=W\qEUUձcǎ9RUUIxqqqzJJJ,Yү_?w}1qs*? ?>|w-9rdqq1K|9]Qzv}„ &LHАևmgB~m<)a?U?!q~1!H"zBXr W&I#>qZ$ `exN{X!XD$ [DDHV U$(e$!X2[I&Z`Dy VFrU>tll Oo^u')Uā/xz6{;uLf0 䠯ޭ'^s)z $9 aUf%'58?=?oP ov|-  !R_}W\{}%;]Ygَo߇Jي۱=2IJY[ ,#;@P_&ܟ?VS_@H2-aWq`< ?'n5_#3OAN`)>/e_{6bBa~;s8i"tz(={t);qO>r 2dРA 3P 䱵J `y)*TD3H t 6{@)!ae{E>eLz@ o2L0aÆ $M2e֭ 3G??'3|ݺu>}zÇ׿㏟y7og)>.P ;vЫW/Y{uV9?sp?z=z@AFFFEEEEEs`9,..;~Jϩ ~G.WĎ]A3MI+W1cFAAA̒Oϩ ~G҅#UAB;wq{q~H-3Hx)rзó"Q.Gmm- *% v6GJM68?#U9A3o&k֬uݔnӦM"~6LO\g;ğy5tO?-.. ?ևq ssB=3^ܹ(/_hjB_|&=1Dꫯ6q~3E9<'| @hg5@DVX QMHV"lqV;A[~p@ 㴋o| ύ(~ X B&i<^e&_aCB :(k0v DUFn0~ WUG.E}"( (z? 2(#^)_cZP=B#Y_clf9MzlվT֛5PC o Fk*C{djOlהAπHR}ޯZk'HR-"Z pt۶sZ|;u,zCpo] t% -h )ɨgu=oU6 aU d'-Ӿ7<7]c8f6f({0u~ڴ믋  "gύ9jVE[o[^UAAaOUàT3P]14EAc3 5Ѓ>Pց2aua!&v\ {N:w}~&̙SXXh3gN~6I*++$;vz/^Of98.&?''IXh/\L3# I$Zx.]Ysw)# I䜓SRR#$ -[6j(QOv.Zps=I4<~hP$ĉ]t),,4#>N#NO(ZN9^DJi|ɓ#EN "X98RŸh5JDIO",z(JAx3s"M^՝T5@P /uQ=t}A)ZtRZjZC? BW)>@i@|@sM(egU3s~X{ҧ3xf]h0e { n-!2~ڶ=z?H.7 W?5+8tԢ>É˦޻t!r{k>X=sWi z}oof!z]^#/ >\9 Ov!:ŨPUPtPEXcjA5M C1P M b3 C #̢g`@ )A(~/(Bn2铜|rA 7nܿۿϜ90 4(r?z;vuݔ.(/// |y;gg IN(]iںuZlGUׯo@sߑt^UV={Z6t^L"98.bL邖-["JI&H(k׮p7'|i ~!.ON(]tРAlݺȑ#G~yq&Do߾͛7Xr~NMD?/sNg`bɒ%Ǐjժ-yi=zڵk-]wAs4X?x^Y7o;_h޼yBKϗJwr,gr믿~ΝwyЧO1"S ?'. L4cǎ`077wر]ve9|&=-Z̚5LlC`XL*Et9,bB Hdw"A-T.kjwB(9 mNX.B#C>l5#v1J{9-iw16Ԍ*0= ka1 Yv2e4UIbݷw{{edCג&[H\u䠡^Xn/b>Zπl IDATX,Cb80vT vaT D{sKA@$BReT{? {A~k?kӵX"x^5|\@Ս- $y!j|\怵gmUb)3}WOn;y`@.㶍+ygbj͐!Kg'^ZҊ+*WdՏyۭg;}{z|Liܟ?+P25T)Tkq^g>Щ:40/ThF)l .ES@(ba>9pNzL8[nųf͊G3eN7-'d!m,md{(c)?ӞXtgv=f*++4-eeeـ3>@UV͞=~ן +\inR9H3cǎڵO?кu9SS%K #%ׯ۷!e˖sBqm۶m{ s3u977CM63xᇣ ;V!C3&##cĈ/ 2ρ@`޼y%;vxꩧ:$I!i/4f̘qq*¹6{S^I ݻWUONGFj9?3.]*rfffĤ?Reʕ@KlڴoL6N,^8^8zf'\E-X@իWs~ ׻`!CHMKݻfm7 CC}㎧z*71]=ԥ.,,o}_{#7~_~e61w5OyG c~cQ@uuu~~~6mڶmW& SY` Mӣ;zhE:aҥʑ#Gݻ0~aԨQN81|;wXWW`sGԮ]ʲ o޲eĉ@ ~_|wz뭑y>9s~|/ԆΝ;0XQ={ddd 4Ÿ \qUUUǎ;rHUU'0QSSdɒGy$fZ˖-MPeҥP7 ڡC+Wi&њ5k|>>@_}cǶj _۷dEE>lZF0z?ǎt]?_?|Ϟ= 6p1bӦM L>=''_~ŷ__5kVYYzM[ՀXf30|pdzqF>lذx~$i?WVVVWWG$qÆ %%%Ǐ뭷~{ڌ !7oHg>cJ=:zhs\=~?++ph޼y̧YYY?S!;w^z])՟g`'L0a„4,6d+N dHDI6쭰]d[]K3M '6'!C~U+VfggsEC=C/^|-ϯJY'NTUUrM4~WQ_ލBF5Q1oY1~[ 9ҽ{{nڴi^I&}mTڸq#\hE|wܡii 'mժO?7idM-**ڴi? ^ /K?yk&w3gΜ9sfڐ_klgDsE&\ {,+/J05D( -b[<0P!kh0 h2t98ߏa0[z/WTTČh$ܸhܸqs駟nƱcF6aAAA3L͛;On2cƌ^zi6{5=3cƌygC):uĉ`O>dmm]7o>~35k#'Fpw9r=OXCm0xΝ$ū\iH%]GJtEX4P ^UJtE( H t]D1yMؙ% 矢k1 gA1 +?7ƔF:G.nhCJeE ..،)o=9-ag΍QJم-188.'%IENDB`yoshimi-2.3.5.1/dev_notes/FLTK_colours000066400000000000000000000003231506652756400175760ustar00rootroot00000000000000 FL_BLACK FL_BLUE FL_CYAN FL_DARK_BLUE FL_DARK_CYAN FL_DARK_GREEN FL_DARK_MAGENTA FL_DARK_RED FL_DARK_YELLOW FL_GREEN FL_MAGENTA FL_RED FL_WHITE FL_YELLOW yoshimi-2.3.5.1/dev_notes/FLTK_event_keys.txt000066400000000000000000000023471506652756400211120ustar00rootroot00000000000000 FL_Button - A mouse button; use Fl_Button + n for mouse button n. FL_BackSpace - The backspace key. FL_Tab - The tab key. FL_Enter - The enter key. FL_Pause - The pause key. FL_Scroll_Lock - The scroll lock key. FL_Escape - The escape key. FL_Home - The home key. FL_Left - The left arrow key. FL_Up - The up arrow key. FL_Right - The right arrow key. FL_Down - The down arrow key. FL_Page_Up - The page-up key. FL_Page_Down - The page-down key. FL_End - The end key. FL_Print - The print (or print-screen) key. FL_Insert - The insert key. FL_Menu - The menu key. FL_Num_Lock - The num lock key. FL_KP - One of the keypad numbers; use FL_KP + n for number n. FL_KP_Enter - The enter key on the keypad. FL_F - One of the function keys; use FL_F + n for function key n. FL_Shift_L - The lefthand shift key. FL_Shift_R - The righthand shift key. FL_Control_L - The lefthand control key. FL_Control_R - The righthand control key. FL_Caps_Lock - The caps lock key. FL_Meta_L - The left meta/Windows key. FL_Meta_R - The right meta/Windows key. FL_Alt_L - The left alt key. FL_Alt_R - The right alt key. FL_Delete - The delete key. yoshimi-2.3.5.1/dev_notes/FLTK_event_names.txt000066400000000000000000000021211506652756400212300ustar00rootroot00000000000000 const char * const fl_eventnames[] = { "FL_NO_EVENT", "FL_PUSH", "FL_RELEASE", "FL_ENTER", "FL_LEAVE", "FL_DRAG", "FL_FOCUS", "FL_UNFOCUS", "FL_KEYDOWN", "FL_KEYUP", "FL_CLOSE", // 10 "FL_MOVE", // 11 seems to also be window resize "FL_SHORTCUT", "FL_DEACTIVATE", "FL_ACTIVATE", "FL_HIDE", "FL_SHOW", "FL_PASTE", "FL_SELECTIONCLEAR", "FL_MOUSEWHEEL", "FL_DND_ENTER", "FL_DND_DRAG", "FL_DND_LEAVE", "FL_DND_RELEASE", "FL_SCREEN_CONFIGURATION_CHANGED", "FL_FULLSCREEN", "FL_ZOOM_GESTURE", "FL_EVENT_27", // not yet defined, just in case they /will/ be defined ... "FL_EVENT_28", "FL_EVENT_29", "FL_EVENT_30" }; const char * const fl_fontnames[] = { "FL_HELVETICA", "FL_HELVETICA_BOLD", "FL_HELVETICA_ITALIC", "FL_HELVETICA_BOLD_ITALIC", "FL_COURIER", "FL_COURIER_BOLD", "FL_COURIER_ITALIC", "FL_COURIER_BOLD_ITALIC", "FL_TIMES", "FL_TIMES_BOLD", "FL_TIMES_ITALIC", "FL_TIMES_BOLD_ITALIC", "FL_SYMBOL", "FL_SCREEN", "FL_SCREEN_BOLD", "FL_ZAPF_DINGBATS", }; yoshimi-2.3.5.1/dev_notes/GUI_Interpretations.txt000066400000000000000000000052541506652756400220140ustar00rootroot00000000000000 data sent from gui float value (mandatory) unsigned char type (mandatory) unsigned char source (mandatory) unsigned char controller (mandatory) unsigned char part (mandatory) unsigned char kit unsigned char engine unsigned char insert unsigned char parameter unsigned char offset unsigned char miscMsg unsigned char spare1 unsigned char spare0 string name - handled via simple message system. Elsewhere, unused chars are set to 0xff as a general test. e.g. If 'part' is 0xf0 (main) and 'kit' is 0xff you're there and it is main volume, key shift etc. If part is < 0x40 and kit is 0xff it's the general part level controls. If part is < 0x40 and insert = 0x20 it's the kit engine enable controls. Microtonal (scales) This uses part number 0xe8 Midi Learn This uses part number 0xd8 Vector Control This uses part number 0xc0 Effects and effect sources. In 'part' we use 0xf1 for system effects and 0xf2 for insertion effects. For these and normal part effects, 'kit' ORed with 0x10 is used to denote the effect type (reverb echo etc.) and 'engine' is used to denote the number of the effect being worked on (the limit depends on the effect source). As 'kit' and 'engine' are not relevant for effects it is safe to use them here. Effects 'kit' numbers offset by 0x10. 0 None 1 Reverb 2 Echo 3 Chorus 4 Phaser 5 Alienwah 6 Distorsion 7 EQ 8 Dynfilter These can't be inserts, as Dynfilter has Filter as an insert! engine 0 addsynth 1 subsynth 2 padsynth 0x08 - 0x0f addsynth voice 0 to 7 0x10 - 0x17 adsynth voice modulator, matching related voice number inserts 0 lfo 1 filter Use engine number 0x88 To access the filter component of the DyneFilter effect 2 envelope base 3 envelope freemode graph point add/delete 4 envelope freemode graph X/Y 5 oscillator (for add voice & pad harmonics) 6 oscillator harmonic amplitude (for add voice & pad) harmonic amplitude (sub) 7 oscillator harmonic phase (add, pad) harmonc bandwidth (sub) 8 resonance base (for add & pad harmonics) 9 resonance graph 16 System effect sends parameter type lfo 0 = Amplitude 1 = Frequency 2 = Filter envelope 0 = Amplitude 1 = Frequency 2 = Filter 3 = Bandwidth (SubSynth only) envelope free mode 0 to 39 = point number formant filter for controls 18 - 20 formant number offset for vowel number for control 37 filter sequence position offset used for offsets to some parameters yoshimi-2.3.5.1/dev_notes/GuiDataExchange.txt000066400000000000000000000167241506652756400211030ustar00rootroot00000000000000 Publishing presentation data from Synth core into the UI -------------------------------------------------------- In winter 2023/24, it was established as a goal for further development to get a better separation between Synth core and the User Interface and especially to remove direct data access from the UI thread reaching out into the Synth internals. For sending action commands and for retrieving individual state values, there was already an existing and mature system in place, the `InterChange` -- allowing Synth and UI to communicate asynchronously over a set of lock-free queues (actually implemented as ringbuffers with atomic write and read position). However, this existing system leans towards high performance data exchange, since it is also used for MIDI control commands, and thus has very limited bandwidth. Yet obviously, the UI needs to retrieve extended information from the Synth core state, most notably to display the various oscillator, transfer function and envelope graphs. Thus a new communication scheme was established, based on a component **GuiDataExchange** residing within the InterChange associated to each SynthEngine instance. While there is only a single instance of the FLTK-UI, Yoshimi is capable of running several instances of the SynthEngine, each performing within a separate thread and relying on a distinct InterChange instance. Only one of theses Synth instances however, the »master« or `primarySynth`, loads global configuration and can cause shutdown of the application. Conceptual View ~~~~~~~~~~~~~~~ On an abstract level, GuiDataExchange establishes an unlimited number of _private data channels,_ allowing to push _arbitrary data_ from the Synth core into the UI in a thread-safe and asynchronous way. NOTE: a prototype / demo setup of this system can be found in GuiDataExchangeTest.cpp, which originally was used to draft and verify this new component. Each of these individual "virtual data channels" is represented by a connection object, which in fact is only a front-end handle. The connection is _templated_ to a specific data type an is only able to transport data of this type; data to be published must be trivially destructible and copy/assignable. We refer to such data records, which are used only to transport data from one subsystem to another as »Data Transfer Object« (DTO). Connections must be created from the GuiDataExchange and will automatically embed an opaque yet unique connection identifier, plus another identifier to encode the data type that can be sent over the connection. Actually, this bare bone ID of a connection is encapsulated as `GuiDataExchange::RoutingTag`. Given such a tag, together with a reference to the managing GuiDataExchange, a connection can be (re-)established. The Connection handle (object) is the primary interface used by client code to publish data. It allows to `publish(DAT const&)` a copy of a given DTO into the virtual channel. On the other side of this connection, there can be zero, one or several receivers, modelled by the interface `Subscription`. Whenever a data object is _published_, each of the receivers (Subscription instances) will get a _copy_ of this object delivered into an internal buffer, called the `MirrorData` block. The idea is that some facility in the Core holds a connection handle, while the actual UI widgets in need of the data will embed a MirrorData block, and refer for local UI actions and the redrawing activities to the local data copy emplaced therein. It is recommended to define the actual DTO data type in such a way that a default constructed DTO reflects the _neutral state_ of the corresponding UI facility. This way, the UI will always come up with a valid representation, even while the core has not (yet) sent actual data updates. Implementation of data transport ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Actually, GuiDataExchange acts as a mediator, it maintains a registry and uses the existing command-system of InterChange to send _notification events._ For the data to be published, internally there is a circular set of _temporary data buffers._ As of 3/2024, the number of data buffers is a compile time constant (see GuiDataExchange.cpp, the local constant `CAP`). Moreover, at the moment, only a single »slot size« is maintained, established at compile time to be large enough to hold the largest data type to be pushed through this communication system. If memory consumption turns out to be a problem, these implementation details could be changed without impact on the usage of the system. Whenever a new update is »pushed« into some connection channel, GuiDataExchange will claim the next free buffer slot, and then just send the index number of this slot as a notification message through the command system, using `control = TOPLEVEL::control::dataExchange` and `part = TOPLEVEL::section::message` and placing the slot index number into the `offset` field of the `CommandBlock` structure. It is assumed that these notification messages will be received within another thread (the UI thread). Actually this is done in `GuiUpdates::decode_updates()` (see MiscGui.cpp). Next, a dispatch must be requested, by invoking `GuiDataExchange::dispatchUpdates(CommandBlock*)` within this UI event thread. The implementation will then do a lookup of _all subscribers currently enrolled with this channel;_ it will pick up the data from the designated buffer slot and directly place a copy of this data into the MirrorData block of each subscriber. Note however, since this dispatch on notification happens asynchronously and typically slightly delayed, there is no guarantee that the buffer slot is still valid; if too many push updates are sent before notifications are received and dispatched on the UI side, then data may be lost. In such a case, the number of buffer slots could be increased. There is a safeguard in place however, as the data type-id of the data found in the designated slot must match up with the data type expected by the Subscriber. Bootstrap of the UI ~~~~~~~~~~~~~~~~~~~ To bring up this communication scheme, initially the partners on both ends must know about the (opaque) connection ID. In theory, hard coded IDs could be defined and maintained somewhere in the code. However, doing so would be tedious, require constant attention and is thus unnecessarily error prone. It seems more adequate to just start with a connection object in the core (which gets a distinct ID) and establish the connections by passing the routing tags. This way, we have only to connect variable definitions together. These can be named to be self-documenting, and moreover the compiler can check that the data types delivered through any connection are consistent. To bring up such a semi-automated connection system, a special DTO is introduced: the `InterfaceAnchor` When the GUI starts up, a copy of the InterfaceAnchor is placed into a slot in GuiDataExchange, and the MasterUI object is initialised with the slot number, to establish the first connection. From this point on, updates to the InterfaceAnchor could be sent any time by regular push updates. Since all UI windows and relevant controls are more or less directly established going down from MasterUI, the suitable fitting connection objects can be passed directly to the init() function of all UI components in need of direct data push updates. Thus MasterUI holds a MirrorData in a public member field `GuiUpdates::anchor`, and all further parts of the UI can assume to find valid connection objects ready to be picked up through `uiMaster.anchor.get()` yoshimi-2.3.5.1/dev_notes/GuiDataExchangeTest.cpp000066400000000000000000000152001506652756400216720ustar00rootroot00000000000000/* GuiDataExchangeTest.cpp - TEMPORARY / PROTOTYPE / DEMO Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ /* ============================================================================================== */ /* ================ 1/24 This is a demonstration how GuiDataExchange works ===================== */ #include "Interface/GuiDataExchange.h" #include "Interface/InterChange.h" #include "Misc/MirrorData.h" #include "Misc/FormatFuncs.h" #include #include #include #include using std::cout; using std::endl; using std::string; #define CHECK(COND) \ if (not (COND)) {\ cout << "FAIL: Line "<<__LINE__<<": " #COND < { public: Heffalump() { auto h = "Heffalump.."+func::asHexString(rand()); std::copy (h.begin(),h.end(), this->begin()); back() = '\0'; } }; void run_GuiDataExchangeTest() { srand(time(0)); cout << "\n■□■□■□■□■□■□■□■□◆•Gui-Data-Exchange-Test•◆□■□■□■□■□■□■□■□■\n"< simulatedGUI; auto sendData = [&simulatedGUI](CommandBlock const& block) { simulatedGUI.write(block.bytes); }; auto pullData = [&simulatedGUI]() -> CommandBlock { CommandBlock getData; simulatedGUI.read(getData.bytes); return getData; }; // *Gui-Data-Exchange* : central facility to manage exchange connections GuiDataExchange guiDataExchange(sendData); // =============================================== setup a connection-identity auto con = guiDataExchange.createConnection(); // has unique identity CHECK (con != guiDataExchange.createConnection()); CHECK (con != guiDataExchange.createConnection()); // can be copied and assigned GuiDataExchange::Connection c2(con); CHECK (con == c2); c2 = guiDataExchange.createConnection(); CHECK (con != c2); // can not be assigned with the wrong data buffer type // c2 = guiDataExchange.createConnection(); //////// does not compile due to different template argument DAT=float // =============================================== setup a receiver MirrorData receiver(con); // holds default-constructed data Heffalump& receivedData = receiver.get(); CHECK (receivedData != h1); CHECK (receivedData != h2); // =============================================== Core publishes data con.publish(h1); // not transported to the GUI yet CHECK (receivedData != h1); // =============================================== GUI loop pulls and dispatches updates guiDataExchange.dispatchUpdates(pullData()); // buffer contents were push-updated CHECK (receivedData == h1); // =============================================== dynamic registration of multiple receivers { //nested scope MirrorData receiver2(con); CHECK (h1 != receiver2.get()); CHECK (h1 == receiver.get()); con.publish(h2); CHECK (h2 != receiver2.get()); CHECK (h2 != receiver.get()); CHECK (h1 == receiver.get()); guiDataExchange.dispatchUpdates(pullData()); CHECK (h2 == receiver2.get()); CHECK (h2 == receiver.get()); con.publish(h1); CHECK (h2 == receiver2.get()); CHECK (h2 == receiver.get()); }//(End)nested scope // receiver2 does not exist anymore... guiDataExchange.dispatchUpdates(pullData()); CHECK (h1 == receiver.get()); // =============================================== bootstrap a new receiver from a published data block size_t slotIDX = con.emplace(h2); // the following happens »elsewhere« (e.g. in the GUI) GuiDataExchange::Connection c3 = guiDataExchange.bootstrapConnection(slotIDX); MirrorData receiver3{c3}; CHECK (h1 != receiver3.get()); CHECK (h2 != receiver3.get()); CHECK (h1 == receiver.get()); // cause a push directly from given index guiDataExchange.pushUpdates(slotIDX); CHECK (h2 == receiver.get()); CHECK (h2 == receiver3.get()); // the new connection is fully usable for publishing c3.publish(h1); guiDataExchange.dispatchUpdates(pullData()); CHECK (h1 == receiver.get()); CHECK (h1 == receiver3.get()); // =============================================== can install a hook to be activated on each push string proofMark{}; receiver3.onUpdate([&](Heffalump const& h) { proofMark = string{h.data()}; }); // on next push-update... con.publish(h2); guiDataExchange.dispatchUpdates(pullData()); CHECK (proofMark == h2.data()); cout << "Bye Bye "<> 8. channel aftertouch D0 = DF becomes CC 641 This is translated as CC 129 and implemented as channel aftertouch and for MIDI learn. Pressure value is 'par'. The reason for these conversions is so that the commands can be handled by the MIDI-learn parser, but are ignored by the normal MIDI decoder. yoshimi-2.3.5.1/dev_notes/MIDI_Learn.txt000066400000000000000000000060721506652756400177600ustar00rootroot00000000000000The learn process comes after *recognised* NRPNs and vectors, but before all other controllers. To learn, hold CTRL while right-clicking on any GUI control then operate a physical control. Along with parameters, a text string is provided with precise details of this complete action. Control capabilities: Incoming CC and channel tracked (in that order). Multiple actions on the same CC/channel pair. Range limiting, compression or threshold setting. Blocking of all later actions on the same CC / channel pair. Muting of this action. Status bits: 0 block 1 limit (otherwise compress) 2 mute 3 mark as an NRPN 4 mark as 7 bit NRPN When sending internal control messages to the GUI (instead of passing on MIDI actions) the part number will be 216 (0xd8) - a value that is never used in the rest of the system. This is used for updating the list and filling in/altering line entries. The gui never does these directly, but requests them using the same part number. Name strings are passed across using the simple message system. These are not editable in the GUI. These transfers are done outside the RT threads. Normally the data will be sent as a complete instruction for one line. data structure: value line number (used as an integer) type status - this is unique to MIDI learn control normal use part 216 kit CC engine channel insert min_in parameter max_in misMsg text message number For NRPNs, CC has bit 16 set. This is so that even one with a current value less than 127 won't be mistaken for a normal CC when being matched. Currently there is a limit of 400 independent learned lines due to the use of miscMsg to update the GUI when loading complete learned lists. In the future, the GUI may be restricted to 'viewing groups' of 128 lines. This would allow a much greater number. Control numbers: These redraw a line in place. 0 block switch 1 limit switch 2 mute switch 5 set min_in 6 set max-in 7 returned message to GUI 9 set NRPN - overwrites a normal CC and makes it unchangeable These move a line, so a complete redraw is inititalsed. 8 delete line 16 write line 17 set CC 18 set channel 20 send list size 21 send ID of learn type message 22 open MIDI-learn editing window 24 incoming activity 96 clear all The gui always does a redraw (except 20 & 21), but 0 to 7, 24 and 96 don't do a list re-order first. 0x80 load list 0x81 load numbered item from recent history 0x82 save list 0x83 learned *** UPDATE *** How Max MIDI-learn lines has been increased. This has been achieved by inserting a 10mS sleep every 32 lines while updating the GUI. This ensures the message buffer doesn't get overloaded. There was no other reason for the earlier limit. This still comes in at less that 1S for a full list load. Time to scan is very difficult to measure. Finding a bunch of 5 controls at the end of a list of 20 usually returned less than 3uS, and very occasionally one at around 8uS. The search is fairly straightforward so presumably ones right at the end of a full list would be worst case around 160uS yoshimi-2.3.5.1/dev_notes/MIDI_Learn_Sequence.txt000066400000000000000000000012251506652756400216030ustar00rootroot00000000000000 When receiving either a normal CC or an NRPN, the first action is to convert this to a float in the range as close as possible to 0 - 127. The ratios are fiddled a bit as otherwise you either couldn't quite reach 127, so some controls missed out a bit on range, or you went slightly over which had odd results depending on the actual control. Next, the value is compressed or limited, and/or inverted depending on the Min Max settings in the MIDI-learn window. Finally it is expanded to the actual range of the control that was learned, using the limits code. Controls that have a wider range than the incoming type will have an evenly spaced granularity. yoshimi-2.3.5.1/dev_notes/Major_control_updates_on_window_refresh000066400000000000000000000007571506652756400254410ustar00rootroot00000000000000Main window 28 controls (one being text) Mixer panel 98 controls (16 being text) Part kits 145 controls (16 being text) Part controllers 24 controls Doesn't include sys/ins/part effects panels AddSynth 71 controls AddVoice 143 controls + graphs AddVoice List 48 controls + mini graphs Oscillator 285 controls + graphs SubSynth 191 controls PadSynth Harmonics 24 controls + graphs PadSynth Envelopes 81 controls Resonance 7 controls + graph MidiLearn 0 to 400 * 9 (0 to 400 being text) yoshimi-2.3.5.1/dev_notes/Note_Tests.txt000066400000000000000000000030531506652756400202000ustar00rootroot00000000000000 This is a new test facility for checking note on and note off behaviour. It is disabled by default and enabled at compile time in ccmake as "ReportNotes". When enabled it continually checks that all notes at their entry to Yoshimi are passed on the the actual note on/off code and reports any differences to the reports console or stdio (whichever is selected). When working entirely within jack (including LV2) there should be no messages at all, but if using ALSA for either MIDI or audio there will sometimes be a few different depending on the complexity due to the buffering action. At any time hitting the GUI stop button will report the totals. However, this report is done *before* the stop cleanup so will show any notes that were still in the ring buffer at the time stop was hit. When you stop playing or a MIDI file has finished is the best time to check. You will then see the totals and there should be none shown as different. The master reset will zero all of these figures. Yoshimi's virtual keyboard is not supported by this system and will actually produce negative numbers! Bear in mind you can have more note_ons than note-offs as two note_ons at the same pitch and channel will both be cancelled by a single note_off. These will be reported as 'hanging' notes. This last point is no longer true. Note_on events are counted and will require the same number of of note-off events. However, if you change the incoming channel number while a note is playing *within Yoshimi* the incoming counts will be correct, but there will be notes still sounding. yoshimi-2.3.5.1/dev_notes/PadThread_Explanation.txt000066400000000000000000000321041506652756400223060ustar00rootroot00000000000000-------- Mailing List Message ------------------------------------ Subject: [Yoshimi-devel] PADSynth background rebuild ("padthread") Date: Mon, 31 Jan 2022 04:20:52 +0100 From: Ichthyostega To: Yohimi-developers At 15.12.21 at 13:22 Will Godfrey wrote: > This now has an auto apply feature fairly well implemented. > However it will crash on extreme wavetable sizes (I don't know why yet). Hello Yoshimi developers, As we all know, concurrent programming can be surprisingly tricky, even for seemingly simple stuff -- and so this new feature kept us busy for quite some time, until reaching a state now where it works without crashes and sound glitches, and thus appears to be "feasible". Some issues (most notably XRuns) need to be sorted out yet. You can see the current state of this experimental feature in my Github https://github.com/Ichthyostega/yoshimi.git Branch: padthread /Unfortunately this is a huge changeset, going deep down the rabbit's hole/ =========================================================================== What do we hope to achieve? The PADSynth is based on a exceptionally fine-grained spectrum distribution and uses a huge Fast-Fourier-Transform operation to generate a likewise large yet perfectly looped wavetable. The generated sound is conceptionally equivalent to results produced by "granular synthesis". Rendering this huge spectrum is a compute intensive task, and can easily take up several seconds. During that time, event processing in Yoshimi is blocked -- which leads to the idea to perform wavetable re-building as a background operation and load the results when ready. At 18.12.21 12:12 Will Godfrey wrote: > Ideally I'd want as seamless behaviour as possible. > Looking ahead there are three scenarios that I'd ideally like to see. > > 1 (manual) User moves control; nothing happens until setting 'apply'. > Nothing else is interrupted apart from the discontinuity of the actual swap. > > 2 (partially automatic) System tracks control changes applying them as they > arrive. If they come too fast the build can be interrupted so only the last > one is completed. Again, just a discontinuity at the swap time. > > 3 (fully automatic) As 2, but instead of a swap, maintain both original and > new sample set while morphing between the two, then delete the old ones, > but keep the relatively small 'framework' - so a form of double buffer. > Morph time could be made user variable, with the proviso that further > harmonics changes would be ignored during this time. > > 3 is really icing on the cake, and if it can be done would be something to shout about To translate this feature description into a programming task.... (1) we want to move the expensive rebuilding of wavetables into a background thread, so the event handling thread is no longer blocked. (2) we want to ensure the following conditions * whenever the PadSynth-Parameters are "dirty", a rebuild should happen * only after that rebuild is really complete, the swap-in should happen (3) we want to prevent redundant rebuilds from happening at the same time. Addition to (1): under some conditions (CLI Scripts) we still want to block the calling thread until the actual build is complete, in order to ensure predictable state. =========================================================================== Challenges The Yoshimi code base can be described as rather cohesive and tangled. Many parts are written in some "I know what I am about to do so get out of my way" style, leading to code that is hard to understand and maintain, and easy to break. Notable raw buffers of various size are allocated and then passed through dozens and dozens of functions, at the end to be processed somewhere by an algorithm which just "magically" seems to know how to deal with that data, and often behaves quite different based on some implied condition detected from magic markers. Moreover Yoshimi uses effectively global yet mutable state even where this wouldn't be necessary, and this state is often manipulated from a totally remote code location by grabbing into the innards of another seemingly unrelated facility. There is often no notion of ownership or hierarchy, parts are mutually dependent and have to be bootstrapped and initialised in a very specific order. Thus, to extract some functionality and perform it in a different and effectively non-deterministic order, we're bound to trace down and understand lots of details meticulously to identify which parts can be rearranged or need to be disentangled. A further complication arises from constraints imposed by the lib FFTW3, which Yoshimi relies on to implement the Fast Fourier Transform operation. This library in itself is very elaborate and flexible and meanwhile has been adapted to allow concurrent and re-entrant calculations, albeit with very strictly delineated prerequisites -- which the existing usage in Yoshimi did not need to fulfil, since up to now it operated on the assumption of a single deterministic computation path. The necessary changes were especially related to the feature of a "FFT computation plan". At start, Lib FFTW3 requires the user to pick the appropriate feature set and invocation scheme. Some users e.g. want to use complex numbers and multidimensional functions, while others (like Yoshimi) just need real valued functions and prefer to work with "sine" and "cosine" coefficients in the Spectrum to represent the phase of a spectral line. Actually, libFFTW3 would even be able to perform timing measurements and persist or load a FFT plan optimised for the specific setup and hardware -- an advanced feature Yoshimi does not exploit. Unfortunately this definition of FFT plans turned out to be not threadsafe -- and Yoshimi sometimes happened to re-build those FFT plans during normal operation, especially after GUI interactions, thereby relying on the ability of libFFTW3 to detect and re-use similar plan definitions behind the scenes (and this caching seems to be one of the reasons why the setup of such FFT plans interferes with other concurrent memory management operations. To overcome these difficulties, we had to overturn and rearrange all memory management related to spectrum and waveform data -- to get reliable control over the actual allocations and change the point in time when allocations are workable. So the FFT plans are now prepared at first usage and shared by all further calculations, while spectrum data is now arranged in memory right from start in the very specific order required by the Fast Fourier algorithm, and with appropriate alignment to allow for SIMD optimisation. Thus the transform calculation can now be invoked directly on the working data within OscilGen or the PADnoteParameters, instead of allocating a shared data block and copying and rearranging the spectrum coefficients for each invocation (as it was done as of yet). To carry out this tricky refactoring safely, we relied on the help by the compiler: Spectrum and Waveform data became encapsulated into a data holder object (based on a single-ownership smart-pointer); various function signatures within OscilGen and SynthEngine have been converted step by step from using raw and unbounded float* to accepting these new data holder types. =========================================================================== Implementation of PADSynth background builds Whenever a new instrument involving PADSynth Kit-Items is loaded, and also when the user hits the "Apply" button in the PAD editor, or by the new »auto-Apply« feature detecting relevant parameter changes, a background build is triggered. Further changes during ongoing builds will cause these to start over afresh -- however in the case of »auto-Apply« with a short delay to integrate several change messages caused from dragging the sliders in the GUI. The data storage for the PADSynth wavetables was likewise encapsulated into a new data holder type "PADtables", which can be moved only (single ownership). This result data will be handed over from the background thread to the Synth thread with the help of a C++ std::future, while the rebuild-trigger is coordinated through a std::atomic variable. For the background tasks a rather simplistic scheduler has been added, to start a limited number of background threads, based on the number of available CPU cores, as reported by the C++ runtime system. Incoming build tasks are enqueued and picked up by those worker threads. Since these operations never interfere directly with the Synth, we can keep matters straight and use a simple Mutex for protection. Within the SynthEngine thread, at the begin of every buffer cycle when calculating sound for PADSynth notes, the readiness state of the future is probed (non blocking), to swap in the new PADtables when actually ready. All of this state handling logic has been embodied into a new component "FutureBuild", defined in Misc/BuildScheduler.h|cpp. Each PADnoteParameters instance now holds a PADtables instance and a FutureBuild instance, and delegates to the latter for all requests pertaining wavetable builds. This FutureBuild state manager has been written in a way to remain agnostic both of the actual data type to transport (which is the PADtables) and the actual scheduler backend implementation to use, allowing to tweak and evolve those parts independently as we see fit. =========================================================================== Integration and Extensions: Cross-Fade and Random Walk [30.4.2022: added these explanations] While "a transition by cross fade" might be deemed simple at first sight, it turned out as rather tricky on close investigation, because cross-fading is an ongoing task and need to be interwoven with the actual sound computation on the inner processing loop. It would be a simple addition indeed within a processing architecture based on processing tasks and a scheduler -- Yoshimi however takes the opposite ascent with a single top-down compute-buffer call, handling any variations by pre-coded forking in the computation path. Moreover, the concept of a "note" was shaped rather accidentally and then extended by copy-n-paste to SUBnote and PADnote after the fact. And so, especially for PADSynth, there is no room between the triggering of a note instance within Part.cpp, and the actual low-level wavetable based sample computation. Duplicating this sample computation code into a cross-fading version was not deemed acceptable, and directly hooking the cross fade into the computation was not even considered (for obvious performance reasons). Which leaves the option of abstracting out the actual computation as a wavetable interpolator component, which can then be wired either directly, or combined with a fade. The details of this refactoring however turn out to be quite involved, since a set of wavetables is maintained for each PADSynth kit-item in its own PADnoteParameters object, which in turn can be shared by multiple note instances, which additionally can also be legato or portamento notes. The "check point" for integrating a newly built set of wavetables is at the begin of the buffer computation cycle for some note, and this might happen at any point and for any note right in the middle of the overall calculation call. At this point, a new XFadeManager component was added, to take hold of the old wavetable, mark an ongoing cross-fade and keep track of all users through reference counting. This could have been implemented by just using a std::shared_ptr -- but this idea was rejected, since shared_ptr uses atomic locks for coordination, which might add a considerable overhead within the inner processing loop, and thus would necessitate extended investigation and timing measurements to be safe -- on the other hand, the actual SynthEngine code is known to run entirely single threaded, and to fit in with that image, even the note-initialisation of PADnotes has now be moved over into the Synth thread to forego any necessitation of thread synchronisation (beyond the FutureBuild used for handing in the new wavetables). In listening tests it turned out that a simple linear crossfade is not sufficient at this point, since the waveform of old and new wavetables typically show very low correlation (due to the randomised phases). Thus an equal-power mix seems adequate. Moreover, even such a mix would still be noticeable as a "manipulation", and for that reason, a typical S-Fade edit curve was devised, and combined with segment-wise linear interpolation, so to compute the expensive square root for the equal power mix only once per block. And finally, after having built all this scaffolding, it became simple to add a user-visible new feature on top, which hopefully expands the musical viability of PADSynth: it is now possible to re-trigger this background build process periodically, and even to perform a classical random walk on some parameters, to break the subtle trait of "sameness", which, after playing for some time, arises from the fixed wavetables. Even while the sound superficially might seem random, in fact the patterns repeat after some time; but rebuilding a new set of wavetables will completely re-shuffle all phases and thereby randomise the patterning in the sound. yoshimi-2.3.5.1/dev_notes/Part_On_Off.txt000066400000000000000000000013271506652756400202470ustar00rootroot00000000000000This control has a degree of intelligence built in. If a part is on, then sending 0 will switch it off and sending 1 will switch it back on. These are absolute actions used mostly when doing resets, state and patch set loads etc. If you send -1 when it was on, it will again switch it off. However if it was already off, sending -1 will set the internal counter to -1. Yet another -1 will set -2 etc. Anything less than 1 is regarded as off. If you later send 2 the counter will be stepped up again. In this way, if several routines switch a part off it will only be switched back on again when all of them switch it on. The counter has a maximum value of 1, so repeatedly sending 2 once the part is on will have no effect. yoshimi-2.3.5.1/dev_notes/Reading_Values.txt000066400000000000000000000007431506652756400210040ustar00rootroot00000000000000updated 5/7/2020 Reads are made by direct calls (not buffered), but if dynamic values are being read and an actual write is taking place the reads are temporarily blocked. If bit 2 of 'type' is set on entry then the command is passed on to the limits tests - see Limits.txt In general it returns a float representing the wanted element. If bit 7 of 'type' is returned as set this should be regarded as an integer. If bit 5 is returned as set then the control is MIDI-learnable. yoshimi-2.3.5.1/dev_notes/Resize.txt000066400000000000000000000035531506652756400173570ustar00rootroot00000000000000FLTK manages window resizes itself, but not text or some user drawn graphics. Our resize code fills in these elements. It closely follows the context idea that the rest of Yoshimi uses. The way this operates is as follows. Triggering is derived from the 33mS FLTK wait(0.033333) call. This is passed to the normal update code in "MasterUI". This procedure ensures that there will usually be a steady 33mS between GUI actions, resize tests and redraws, thus reducing processor loading. When "MasterUI" first gets the call it passes it on to all the other top level windows in sequence, but *only* if their size has actually changed. It then passes the call unconditionally to the other main areas, PartUI and BankUI, and finally runs through its own objects. Part and Bank will themselves portion out calls to subsections depending on whether they can be dealt with directly, or have to be passed further down the stack. For an extreme example, the Amplitude Freemode window in Addsynth Voice has to unconditionally receive this call. It's complete route is: main->Master->Part->PartEdit->AddGlobal->AddVoice->AddEnvelope If a window is visible, and it's size has changed it will then perform the actual text font resizes, then mark itself as 'seen'. Font sizes are calculated from the ratio of the current window size against the window's default size, and the font itself multiplied by this scale factor. Fonts are defined as integers so will visibly step up and down in size. Other drawn elements will change smoothly. Usually only one window at a time will be changing, so apart from the tests made on the way, there is little extra work. The FLTK file chooser proved intractable so has been replaced with our bespoke file chooser. This actually has other benefits, being tailored to our exact requirements. We have also implemented our own code for the 'Alert' and 'Choice' operations. yoshimi-2.3.5.1/dev_notes/Root_Bank_Program.txt000066400000000000000000000016041506652756400214560ustar00rootroot00000000000000 The internal structure of this has changed so that you can set all three of these in a single call, always in the order; root, bank, program. However this full command is very pedantic and if either root or bank fault, program change will not be attempted. This is to protect against loading a same-name program from the wrong bank. You can set these all singly, or any logical combination. On error, the returned message will be the first failed one. You can also load a program from a file name by pushing it to the TextMsgBuffer and giving the returned ID to par2. All unused parameters should be set to UNUSED (currently 255). If you are setting just root and bank (and it succeeds) only the bank will be named, but the root ID will be shown. *** This has been changed yet again *** Program changes are now handled by a completely separate function, but bank and root are still combined. yoshimi-2.3.5.1/dev_notes/Scales.txt000066400000000000000000000035071506652756400173270ustar00rootroot00000000000000Microtonal uses part number 232 (0xe8) Tunings and keyboard maps are both handled as strings of comma separated numbers. All spaces will be removed. For scales, ratios or floating point numbers can be entered. Ratios are in the form n1 / n2 to a maximum of normal integer range. If just a numerator is set it will be regarded as n/1. Floating point numbers *must* include the decimal point and at least one digit (or a zero) either side. These will be padded out with leading and trailing zeros in the form nnnn.nnnnnn In keyboard maps, non-sounding notes should be marked with an 'x' instead of the key number. e.g. Scale: 0076.049000, 0193.156860, 0310.264710, 5/4, 0503.421570, 0579.470570, 0696.578430, 25/16, 0889.735290, 1006.843140 1082.892140, 2/1 Keyboard Map: 0, 1, 2, 3, x, 5, 6, 7, x, 9, 10, 11 The scale/keymap sizes are generated internally by counting the number of entries in the strings. When saving scales, for floating point numbers we now include the text it was derived from. On re-loading we then use this text to regenerate the number rather than the stored string representation of the number. This eliminates progressive loss of accuracy which could otherwise result from repeated load and save operations. However, the stored representation is still saved for backward compatibility with older versions of Yoshimi. We also now use doubles here in some places instead of floats, as the conversion to and from string form seems to be more accurate. When setting scales/keymaps, or importing .scl/.kbm files the following error numbers may be returned: 0 empty entry -1 value too small -2 value too big -3 invalid characters -4 must be real numbers or divisions -5 no file -6 empty file -7 short/corrupted file -8 missing entry -9 invalid octave size -10 invalid map size -11 invalid note number -12 out of range yoshimi-2.3.5.1/dev_notes/Simple_Message.txt000066400000000000000000000032211506652756400210030ustar00rootroot00000000000000This is not intended to be used within the realtime threads as both push and pop use a common semaphore. However, they are very fast so you'd probably get away with it :) There are three calls: void TextMsgBuffer::clear() int TextMsgBuffer::push( string ) string TextMsgBuffer::fetch( int ) These calls are accessible to all parts of Yoshimi and provide a simple asynchronous means of passing text between threads and functions via just the integer ID. TextMsgBuffer::clear() is only intended to be used internally on major resets and just adds a bit of insurance that there are no orphaned messages. Pushing a message will return the first available ID and Popping a message makes its ID available again. There is a maximum of 254 possible entries at any one time, but it's unlikely that limit will ever be reached. The ID 255 (which has the global ID of NO_MSG) is a 'do nothing' reserved for calls that might want to send a message... but then again might not :) If you push an empty string you'll get back NO_MSG, and fetching NO_MSG will of course return an empty string. Remark by Ichthyo, 8/2019: In order to make MiscFuncs stateless, I have extracted these functions into a singleton TextMsgBuffer. Moreover, I renamed the "miscMsgPop" function into "fetch", since this obviously is not a stack, so the name "pop" might be misleading. Update by Will, ?/2023 There is an extra parameter to decide whether or not to clear a message when it is fetched. This defaults to 'true' however there are times (especially in development) when you might want to look at a message without removing it, so setting this to false will show the message, but leave it in place. yoshimi-2.3.5.1/dev_notes/Some_Coding_Notes.txt000066400000000000000000000041261506652756400214510ustar00rootroot00000000000000By Will Godfrey Will started to get involved with Yoshimi not long after Cal forked it from Zyn. As well as comments on the forum, Will also had a lot of email correspondence with him, and got to know him quite well. Cal was originally a C programmer, and made it clear he really didn't like C++, and was particularly frustrated with FLTK and Fluid. Look at any Fluid built code with an ordinary text program and it's pretty obvious why! Cal did try to tidy things up and as far as possible unify the coding style, but as we know didn't have time to complete it. Also towards the end of his time he was making unfortunate mistakes. When Jeremy took over, quite a lot of code cleaning up and improvement was done, but this was from a number of different people and the coding style fragmented again. As is well known, Will was talked into taking over rather than have Yoshimi abandoned. Will had a lot of help from others at first, but after a while (with several exceptions) people dropped out. Will did the best he could! Kristian joined in about the time of V 1.1.0 Andrew started the LV2 code with V 1.3.0, which Will had no understanding of at all (didn't even know what it was at that time). Harry did the initial work in the bank structure with V 1.3.2 and Andrew took this further. Rob dropped in occasionally round about the time of V 1.3.8 showing up from time to time. Andrew dropped out of sight round about the time of V1.3.9 About 2015 Will met up with Paul Nasca in London and had a long and very interesting chat. One thing that Paul made clear was that Zyn was not initially written as C++ (as some people thought) but as C with classes, Which probably explains some of the strange quirks! Hermann came on board somewhere between V 1.5.8 and 1.5.9 and amongst other things refactored the PRNG code, making it better suited to Yoshimi, and future proofing it. Notably, Rob and Hermann were invoved with V1.5.10 Amongst other things, Will has tried to restore a unified coding style as described in Yoshimi_Policies.txt Since then most of the significant coding has been done by Hermann, Kristian and Will. yoshimi-2.3.5.1/dev_notes/Startup_Synth_instances.txt000066400000000000000000000240571506652756400230160ustar00rootroot00000000000000 Intances of the Synth-Engine ---------------------------- On a global level, Yoshimi has different modes of operation: - when enable_single_master is **not** set (i.e. _false_) in the config, then there can be several independent Yoshimi processes running at the same time. There is **no** coordination between these; they can overwrite each other's persistent changes and will compete for system resources. - otherwise, when enable_single_master= **true** then there is only one single Yoshimi process, which then manages multiple "Instances". These "Instances" are not segregated, rather they are different data entities within the same process memory space. - in case of LV2 a single process is _assumed;_ with a trick we manage to access the engine from the plugin-instance (using a non-standard extension to the LV2 standard) The following discussions focus on the case of multiple "Instances" within the same process, which can either be created by user request, by receiving a OS signal (in case of `enable_single_master==true`), or as consequence of loading further LV2 plugin instances into the same plugin host process. The Instance Manager ~~~~~~~~~~~~~~~~~~~~ All these Synth-Engine Instances are owned and managed by a singleton component known as `InstanceManager` and accessible from anywhere in the code base through a static function interface `Config::instances()`. The Instance Manager is the only one assumed to create engine instances, and is responsible for progressing through a well defined lifecycle; the implementation is kept encapsulated and all other parts of the application shall use the InstanceManager interface to search for a specific SynthEngine by ID, access the global configuration or to trigger global actions. The Primary Synth ~~~~~~~~~~~~~~~~~ When Main starts, it always immediately creates a »primary Instance«. A reference to this `primarySynth` is maintained within the `InstanceManager` but not exposed globally, other than allowing to access to the configuration part through the function Config::instance().accessPrimaryConfig(). This special primary Synth-Engine instance... - is always marked with Synth-ID == 0 - acts as a proxy for the _global application configuration_ - maintains a global "is in running state" flag for the whole appliacation - loads and saves configuration and history - coordinates the application shutdown The Main Thread ~~~~~~~~~~~~~~~ The so called »main thread« is actually the GUI-Thread. All UI event processing for all Instances together is handled within this single thread. For this reason, it is not necessary to synchronise GUI code and one event handler can never corrupt the data or see inconsistent state of another UI event handler. As long as the application is in running state, the »duty-cycle« in main-thread - repeatedly loops over all synth instances currently known - for each instance, it processes the UI side of InterChange with checkBuffer() - FLTK-event-handling for all instances together is then done through the call `Fl::wait(33333)`. This call processes all pending FLTK events, then processes all pending redraw-events, and then waits until at least 33ms. After that the main loop resumes. Starting an "Instance" ~~~~~~~~~~~~~~~~~~~~~~ An »Instance« within the Yoshimi-process comprises: - a SynthEngine instance (allocated into heap memory) - an associated MusicClient instance, connected to sound/MIDI backend(s) - typically, the MusicClient launches one or several Synth / MIDI threads - the SynthEngine instance embeds an InterChange instance - this InterChange instance holds a number of ringbuffers for the Command-System - triggered from the »main thread« the Synth Engine also manages the "guiMaster" which is an instance of the FLTK generated MasterUI class. A new instance can be requested through InstanceManager::requestNewInstance(), which first creates a new instance record internally and allocates the SynthEngine and MusicClient objects. Any such a new instance record is flagged with lifecycle state `PENDING` — a marker recognised by the repeatedly running »duty-cycle« as a request to walk this instance into the boot-up phase. This entails determining a working audio / midi backend combination and then to start active processing. After successfully starting the processing backend, the new instance is placed into lifecycle phase `BOOTING` — which again is a marker instructing the duty-cycle to proceed to the next step and launch a GUI. Yoshimi relies on the FLTK toolkit, and thus a main window widget must be heap-allocated and maintained by some anchor point within the application. This role is taken on by the InterChange component, which resides in each Instance and maintains an std::unique_ptr known as `guiMaster` to hold onto this top-level widget. Any further FLTK widgets allocated after this point will be automatically associated with this top-level window and connected to UI event processing. For the Yoshimi UI, the actual code of MasterUI is FLTK generated and configured through the FLTK UI-Builder, but it inherits the Command-system functionality from its base class, which is class GuiUpdates (see MiscGui.h / cpp). Furthermore, after creating the MasterUI instance, the function `MasterUI::Init()` will be invoked, which is alltogether Yoshimi specific code. This Init() function creates and configures a lot of further UI window / panel classes and finally delegates to `MasterUI::create_window()` (which is FLTK generated). Notably the MasterUI is outfitted with a direct back-reference to its associated InterChange instance and (as of 3/2024) unfortunately uses that instance to access the associated Synth internals directly. As a long-term goal, any communication between GUI and core should be routed through the ringbuffers. So notably each Instance runs its own CommandBlock / ringbuffer system, completely separate from all the other instances present in the same process. However, all Instances share a common »main thread«, which handles the combined UI event processing. So, technically, there is only a single FLTK user interface, which is comprised of several top-level window widgets, one for each instance. The aforementioned »duty-cycle« in the »main thread« loops over all the Synth instances to invoke `guiMaster->checkBuffer()` for each of them. This function retrieves all messages currently in the "toGUI" ringbuffer /for this specific/ instance, and uses the associated MasterUI instance to dispatch these messages to the associated UI components and widgets, albeit all running within the same UI event thread. This may also entail retrieving and dispatching of _push-updates_ from the GuiDataExchange. Instance shutdown is initiated by the closing event of one instance, which invokes `MasterUI::cb_masterwindow_i()` on that instance. This causes the window widgets for this instance to be hidden (disabling all event processing) before the associated heap allocated objects will be deleted. The Instance will then be marked with lifecycle phase `WANING`, the associated Synth and MusicClient will be stopped and and finally the Instance is removed from the internal registry and allocated memory is discarded. If however the instance represents to »primary Synth«, a shutdown of the complete process is initiated, closing and unwinding all other Instances and prompting all remaining threads to terminate. Running as LV2 plugin ~~~~~~~~~~~~~~~~~~~~~ While actually the processing scheme for LV2 is well defined, and the standard also mandates to create a «parameter port» for each setting (and based on that would be able to generate a generic UI), Yoshimi was only fitted superficially to the requirements of the LV2 standard. By relying on a non-standard extension and assuming that actually the audio processing and the UI presentation both hapen within the same OS process of the plug-in host, Yoshimi kind of sneaks in its special and very elaborate UI. Entrance-point: YoshimiLV2Plugin::instantiate() - invoked dirctly from the Plug-In descriptor - called by the Host initially when loading the Plug-in - Actions ** creates a new SynthEngine instance ** creates the (internal)Plug-in-Object and installs this into the MusicClient ** invokes Init() ** loads Banks and History Before actual processing starts, the LV2 host will invoke the YoshimiLV2Plugin::activate callback and starts or connects to the worker processing threads. Either before or after activating, the Host attaches the LV2 ports and thereby provides the output buffers. When Plug-In is in active processnig... - Host calls repeatedly YoshimiLV2Plugin::run(LV2_Handle instance, uint32_t sample_count) - does the audio-processing YoshimiLV2Plugin::process(uint32_t sample_count) SynthEngine::MasterAudio() InterChange::mediate() GUI will only be launched on-demand - typically by "clicking", or "double clicking" or "editing" the Plug-in in the Host - often, already the YoshimiLV2PluginUI::instantiate() happens from some UI thread of the Host, and not the audio thread... - `YoshimiLV2PluginUI::show()` is invoked, which delegates to the Yoshimi InstanceManager to create the FLTK gui and to establish a connection between SynthEngine and GUI. While the Yoshimi UI is active... - the Host periodically invokes `YoshimiLV2PluginUI::run()` - this is the UI-Event-Loop and directly invokes ** `masterUI().checkBuffer()` (which does the returns-processing of Yoshimi) ** `Fl::check()` (performs the FLTK event processing and redrawing() ) The UI can be deactivated or hidden by the host: - Callback externalUI.uiWIdget.hide = YoshimiLV2PluginUI::static_Hide YoshimiLV2PluginUI::hide() - hides the FLTK-Fenster windows - FLTK ceases to perform event-processing for hidden windows - typically the host does not invoke `YoshimiLV2PluginUI::run()` for a hidden UI However, the Yoshimi-GUI can also be closed directly via FLTK - Callback on the main window - invokes `SynthEngine::signalGuiWindowClosed()` - through an callback function, this also deactivates the YoshimiLV2PluginUI - NOTE: this does **not** terminate the Synth when running under LV2 - but it hides all windows and destroys the MasterUI instance yoshimi-2.3.5.1/dev_notes/System_Values.txt000066400000000000000000000020001506652756400207030ustar00rootroot00000000000000This is a means of exposing various controls to NRPNs. All of the commands produce log output in a manner designed to be compatible with both the GUI reports window and with a CLI readline environment. To access these, set NRPN MSB (CC 99) to 64 and NRPN LSB (CC 98) to 2 (8130). After that send the following Data values. Data MSB Data LSB Setting 2 key Set master key shift, key-64 (-36 to +36) 7 volume Set master Volume ’volume’ 64 to 79 key Set channel (MSB-64) key shift, key-64 (-36 to +36) 80 root Set CC to control Root path change (>119 disables) 81 bank Set CC to control Bank change (>119 disables) 82 >63 Enable Program change otherwise disable 83 >63 Reserved 84 extended Set CC control Extended program change (>119 disables) 85 parts Set number of available parts (16, 32 or 64) 86 0 Save all dynamic settings yoshimi-2.3.5.1/dev_notes/ToDo.txt000066400000000000000000000021631506652756400167570ustar00rootroot00000000000000 BUG! instrument swap partially fails when going across bank roots. Only seems to affect non-writable areas (with no related warning) BUG! Vector window instrument label colours not updated when engines are manually changed - it's OK when loading instruments etc. BUG! Loading a state file with an embedded MIDI-Learn window sometimes doesn't display the text of the first learned line. Minor bug Multi instances produce jack error reports when main instance closed, even if they have been closed first - been there since V 1.4.1 :( Add dynfilter filter types to CLI prompt. Never been done before :( CLI waveform (in voice) changes don't update GUI unless waveform window is open too. LV2: internal sound banks do not appear to be exposed as LV2 presets Visible in carla apparently. In filer show actual extension (xiz/xiy) In controllers provide dropdown menu for choice of modulation (LFO) function. Off Amplitude Filter cutoff Frequency * (default) RPNs (channel based) 101,0 (MSB) 100,0 Pitch bend range 100,1 Fine detune 100,2 Coarse detune SYSEX - do we need it? If so, for what and how? Documentation! yoshimi-2.3.5.1/dev_notes/XML-Storage.txt000066400000000000000000000074271506652756400201640ustar00rootroot00000000000000 Handling structured data stored as XML -------------------------------------- NOTE: In spring 2025, XML handling was reworked, because the project was confronted with the necessity to support Version 3.x and 4.x of lib-MXML, which are incompatible on API and ABI level. Yoshimi maintaines a large amount of _stuctured data_ persistently, stored as (optionally gzip-compressed) XML files. - Configuration - Instance state - complete »Patch state« - Instruments - Presets - Microtonal scales - MIDI-learn data The actual XML handling relies on lib-MXML (»Mini-XML) https://www.msweet.org/mxml/ written by Michael R. Sweet The access to the details of this storage format handling is structured into several layers of abstraction (See XMLStore.h|cpp) - XMLStore is the access point to setup a storage with structured data, and to load or save such a _data tree_ into XML format persistently. - XMLtree is a smart-pointer (with automatic memory managment), referring to some location in a data tree. It provides functions to add _XML attributes_ and _Yoshimi data parameters,_ including the flexible handling of defaults and migration from older versions. - XMLtree::Node is the abstracted access to low-level XML manipulation functions, an can only be used from within class XMLtree; it inherits from a _policy base class_ -- which allows to accommodate differences in the API of lib-MXML versions - the C-functions of lib-MXML are used for all access to actual data, for navigation in the tree, parsing and pretty-printing and memory management. The client code from the Yoshimi core has to deal only with XMLStore and XMLtree objects; both are lightweight _value objects_ and can be moved (not copied). They can be placed into local variables on the stack (no need for a heap alloc). Since they rely on the ref-count by MXML, they clean-up automatically when going out of scope. Class XMLStore holds a `Metadata` record to maintain the version numer of the data format, which is identical to the version number of the code base managing the data. An ZynAddSubFX compatibility mode is provided, while the Yoshimi-native format uses a different XML DOCTYPE and a different root element. Each XML store is marked with an »XML type« to indicate which kind of data storage it manages. See the Enum `TOPLEVEL::XML` in `globals.h` Usage Patterns ~~~~~~~~~~~~~~ Store data ^^^^^^^^^^ - create a new XMLStore marked for a specific XML-type XMLStore xml{TOPLEVEL::XML::Config}; - add a top-level data element XMLtree conf = xml.addElm("CONFIGURATION"); - add parameters to this node conf.addPar_int ("sound_buffer_size" , buffersize); conf.addPar_bool("hide_system_errors" , hideErrors); conf.addPar_str ("linux_jack_server" , jackServer); - add a nested sub-node to the tree XMLtree xmlKit = conf.addElm("INSTRUMENT_KIT"); xmlKit.addPar_int("kit_mode", Pkitmode); - save the data tree created thus far auto& logger = synth.getRuntime().getLogger(); uint compLev = synth.getRuntime().gzipCompression; bool success = xml.saveXMLfile(configFile, logger, compLev); Load data ^^^^^^^^^ - create a XMLStore instance from an XML file XMLStore xml{configFile, getLogger()}; bool success = not xml.empty(); - enter a top-level node in the data tree loaded XMLtree conf = xml.getElm("CONFIGURATION"); if (not conf) Log("ERROR ...."); - retrieve parameter data oscilsize = conf.getPar_int ("oscil_size", oscilsize, MIN_OSCIL_SIZE, MAX_OSCIL_SIZE); hideErrors = conf.getPar_bool("hide_system_errors", hideErrors); jackServer = conf.getPar_str ("linux_jack_server"); - optionally enter a nested node if (XMLtree xmlKit = xmlInstrument.getElm("INSTRUMENT_KIT")) { Pkitmode = xmlKit.getPar_127("kit_mode", Pkitmode); } yoshimi-2.3.5.1/dev_notes/XMLStoreTest.cpp000066400000000000000000000154271506652756400204010ustar00rootroot00000000000000/* XMLStoreTest.cpp - TEMPORARY / PROTOTYPE Copyright 2025, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ /* ============================================================================================== */ /* ================ 4/25 This is a demonstration how to read/write XML data ===================== */ #include "Misc/XMLStore.h" #include "Misc/FileMgrFuncs.h" #include "Misc/SynthEngine.h" #include #include #include #include #include using std::string; using std::cout; using std::endl; #define CHECK(COND) \ if (not (COND)) {\ cout << "FAIL: Line "<<__LINE__<<": " #COND <::max())<::min())<::lowest())<::epsilon())<::max())<::min())<::lowest())<::epsilon())<::max() ); CHECK(VerInfo("55555555555").min== 0 ); CHECK(VerInfo("55555555555").rev== 0 ); CHECK(VerInfo("1.2").maj == 1 ); CHECK(VerInfo("1.2").min == 2 ); CHECK(VerInfo("1.2").rev == 0 ); CHECK(VerInfo("1.2.").maj == 1 ); CHECK(VerInfo("1.2.").min == 2 ); CHECK(VerInfo("1.2.").rev == 0 ); CHECK(VerInfo("1.2.3.").maj == 1 ); CHECK(VerInfo("1.2.3.").min == 2 ); CHECK(VerInfo("1.2.3.").rev == 3 ); CHECK(VerInfo("1.2.3.4.5").maj == 1 ); CHECK(VerInfo("1.2.3.4.5").min == 2 ); CHECK(VerInfo("1.2.3.4.5").rev == 3 ); CHECK(VerInfo("x1.2.3.4.5").maj == 1 ); CHECK(VerInfo("x1.2.3.4.5").min == 2 ); CHECK(VerInfo("x1.2.3.4.5").rev == 3 ); CHECK(VerInfo("1.2.3") == VerInfo(1,2,3)) CHECK(VerInfo("xx1.2.3uu") == VerInfo(1,2,3)) CHECK(VerInfo("1.2") == VerInfo(1,2,0)) CHECK(VerInfo("6") == VerInfo(6,0,0)) CHECK(VerInfo("5") < VerInfo("6")) CHECK(VerInfo("5") < VerInfo("5.1")) CHECK(VerInfo("5") < VerInfo("5.0.1")) // the following code is a simplified version of loading the base config string location = file::configDir(); string baseConfig = location + "/" + YOSHIMI + EXTEN::config; CHECK(file::isRegularFile(baseConfig)) cout << "Loading from: "< are used to avoid confusing natural wrap-rounds. '~ ~' is used to denote undefined values. For numbers in a range use 'nn1~nn2'. This is more compact than using 'nn1 to nn2' For a specific group of numbers use 'nn1,nn2 etc' Other examples: 0~2,8+(0~7) 0~63,241,242 0,1 ret. msg No. yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/000077500000000000000000000000001506652756400230125ustar00rootroot00000000000000yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/LFOinsert.html000066400000000000000000000074101506652756400255470ustar00rootroot00000000000000 LFO inserts
    Engine is 0 for AddSynth global
    Engine is 8+(0~7) for AddSynth voices
    Engine is 16+(0~7) for AddSynth modulators
    Engine is 2 for PadSynth
    Parameter is 0 for Amplitude LFO
    Parameter is 1 for Frequency LFO
    Parameter is 2 for Filter LFO
    LFOINSERT::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    speed 0.0~1.0 0 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Frequency
    depth 0~127 1 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Depth (100% is half control setting so waveform can become re-entrant)
    delay 0~127 2 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Delay before LFO starts
    start 0~127 3 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Point of time in LFO cycle to sync to
    amplitudeRandomness 0~127 4 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Amplitude randomness
    type 0~6 5 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Envelope shape
    continuous 0,1 6 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Continuous
    bpm 0,1 7 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Sync frequency to MIDI clock
    frequencyRandomness 0~127 8 0~63 0~15 0,8+,16+,2 0 0~2 255 255 Frequency randomness
    stretch 0~127 9 0~63 0~15 0,8+,16+,2 0 0~2 255 255 LF/HF stretch ratio
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/addsynth.html000066400000000000000000000131361506652756400255220ustar00rootroot00000000000000 AddSynth
    ADDSYNTH::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    volume 0~127 0 0~63 0~15 0 255 255 255 255 Volume
    velocitySense 0~127 1 0~63 0~15 0 255 255 255 255 Velocity Sensitivity
    panning 0~127 2 0~63 0~15 0 255 255 255 255 Panning
    enableRandomPan 0,1 3 0~63 0~15 0 255 255 255 255 Set random panning behaviour
    randomWidth 0~63 4 0~63 0~15 0 255 255 255 255 L/R range of random panning
    detuneFrequency -8192~8191 32 0~63 0~15 0 255 255 255 255 Fine detune frequency
    octave -8~7 35 0~63 0~15 0 255 255 255 255 Octave
    detuneType 1~4 36 0~63 0~15 0 255 255 255 255 Detune type (L linear, E exponential)
    L35 cents, L10 cents, E100 cents, E1000 cents
    coarseDetune -64~63 37 0~63 0~15 0 255 255 255 255 Coarse detune
    relativeBandwidth 0~127 39 0~63 0~15 0 255 255 255 255 Detune multiplier for voices that have been detuned
    bandwidthMultiplier 0~127 40 0~63 0~15 0 255 255 255 255 Value returned to voice user interface - Read only
    stereo 0,1 112 0~63 0~15 0 255 255 255 255 Stereo on/off
    randomGroup 0,1 113 0~63 0~15 0 255 255 255 255 Random group on/off
    dePop 0~127 120 0~63 0~15 0 255 255 255 255 'Pop' suppression
    punchStrength 0~127 121 0~63 0~15 0 255 255 255 255 Punch strength
    punchDuration 0~127 122 0~63 0~15 0 255 255 255 255 Punch duration
    punchStretch 0~127 123 0~63 0~15 0 255 255 255 255 Punch stretch
    punchVelocity 0~127 124 0~63 0~15 0 255 255 255 255 Punch velocity sensitivity
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/addvoice.html000066400000000000000000000411421506652756400254600ustar00rootroot00000000000000 AddSynth Voice
    ADDVOICE::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    enable voice 0,1 0 0~63 0~15 8+(0~7) 255 255 255 255 Voice enable
    volume 0~127 1 0~63 0~15 8+(0~7) 255 255 255 255 Volume
    velocitySense 0~127 2 0~63 0~15 8+(0~7) 255 255 255 255 Velocity sensitivity
    panning 0~127 3 0~63 0~15 8+(0~7) 255 255 255 255 Panning
    enableRandomPan 0,1 4 0~63 0~15 8+(0~7) 255 255 255 255 Set random panning behaviour
    randomWidth 0~63 5 0~63 0~15 8+(0~7) 255 255 255 255 L/R ange of random panning
    invertPhase 0,1 6 0~63 0~15 8+(0~7) 255 255 255 255 Minus (effectively invert volume control action)
    enableAmplitudeEnvelope 0,1 7 0~63 0~15 8+(0~7) 255 255 255 255 Enable amplitude envelope controls
    enableAmplitudeLFO 0,1 8 0~63 0~15 8+(0~7) 255 255 255 255 Enable amplitude LFO controls
    modulatorType 0~5 16 0~63 0~15 8+(0~7) 255 255 255 255 Modulator type -- Off, Morph, Ring, PM, FM, PWM
    externalModulator -1~6 17 0~63 0~15 8+(0~7) 255 255 255 255 External modulator (from lower numbered voices)
    -1 = off
    detuneFrequency -8192~8191 32 0~63 0~15 8+(0~7) 255 255 255 255 Detune frequency
    equalTemperVariation 0~127 33 0~63 0~15 8+(0~7) 255 255 255 255
    baseFrequencyAs440Hz 0,1 34 0~63 0~15 8+(0~7) 255 255 255 255 Set voice base frequency to 440hz
    octave -8~7 35 0~63 0~15 8+(0~7) 255 255 255 255 Octave
    detuneType 0~4 36 0~63 0~15 8+(0~7) 255 255 255 255 Detune type -- Default, L35 cents, L10 cents, E100 cents, E1200 cents
    coarseDetune -64~63 37 0~63 0~15 8+(0~7) 255 255 255 255 Coarse detune
    pitchBendAdjustment 0~127 38 0~63 0~15 8+(0~7) 255 255 255 255 Pitch bend adjustment
    pitchBendOffset 0~127 39 0~63 0~15 8+(0~7) 255 255 255 255 Pitch bend offset
    enableFrequencyEnvelope 0,1 40 0~63 0~15 8+(0~7) 255 255 255 255 Enable frequency envelope
    enableFrequencyLFO 0,1 41 0~63 0~15 8+(0~7) 255 255 255 255 Enable frequency LFO
    unisonFrequencySpread 0~127 48 0~63 0~15 8+(0~7) 255 255 255 255 Unison frequency spread
    unisonSpreadCents 0~127 49 0~63 0~15 8+(0~7) 255 255 255 255 Value returned to user interface in cents - read only
    unisonPhaseRandomise 0~127 50 0~63 0~15 8+(0~7) 255 255 255 255 Unison phase randomisation
    unisonStereoSpread 0~127 51 0~63 0~15 8+(0~7) 255 255 255 255 Unison stereo spread
    unisonVibratoDepth 0~127 52 0~63 0~15 8+(0~7) 255 255 255 255 Unison vibrato depth
    unisonVibratoSpeed 0~127 53 0~63 0~15 8+(0~7) 255 255 255 255 Unison vibrato speed
    unisonSize 2~50 54 0~63 0~15 8+(0~7) 255 255 255 255 Number of unison sub-voices
    unisonPhaseInvert 0~5 55 0~63 0~15 8+(0~7) 255 255 255 255 Type of unison phase inversion
    None, Random, 50%, 33%, 25%, 20%
    unisonEnable 0,1 56 0~63 0~15 8+(0~7) 255 255 255 255 Enable unison
    bypassGlobalFilter 0,1 64 0~63 0~15 8+(0~7) 255 255 255 255 Bypass global filter
    enableFilter 0,1 68 0~63 0~15 8+(0~7) 255 255 255 255 Enable local filter
    enableFilterEnvelope 0,1 72 0~63 0~15 8+(0~7) 255 255 255 255 Enable filter envelope
    enableFilterLFO 0,1 73 0~63 0~15 8+(0~7) 255 255 255 255 Enable filter LFO
    modulatorAmplitude 0~120 80 0~63 0~15 8+(0~7) 255 255 255 255 Modulation amplitude
    modulatorVelocitySense 0~127 81 0~63 0~15 8+(0~7) 255 255 255 255 Modulation velocity sensitivity
    modulatorHFdamping -64~63 82 0~63 0~15 8+(0~7) 255 255 255 255 Modulation HF damping
    enableModulatorAmplitudeEnvelope 0,1 88 0~63 0~15 8+(0~7) 255 255 255 255 Enable modulator amplitude envelope
    modulatorDetunefrequency -8192~8191 96 0~63 0~15 8+(0~7) 255 255 255 255 Modulator detune frequency
    modulatorDeuneFromBaseOsc 0,1 97 0~63 0~15 8+(0~7) 255 255 255 255 Get modulator detune from base oscillator
    modulatorFrequencyAs440Hz 0,1 98 0~63 0~15 8+(0~7) 255 255 255 255 Set modulator frequency as 440Hz
    modulatorOctave -8~7 99 0~63 0~15 8+(0~7) 255 255 255 255 Modulator octave
    modulatorDetuneType 0~4 100 0~63 0~15 8+(0~7) 255 255 255 255 Modulator detune type -- Default, L35 cents,
    L10 cents, E100 cents, E1200 cents
    modulatorCoarseDetune -64~63 101 0~63 0~15 8+(0~7) 255 255 255 255 Modulator coarse detune
    enableModulatorFrequencyEnvelope 0,1 104 0~63 0~15 8+(0~7) 255 255 255 255 Enable modulator frequency envelope
    modulatorOscillatorPhase -64~63 112 0~63 0~15 8+(0~7) 255 255 255 255 Modulator oscillator phase
    modulatorOscllatorSource -1~6 113 0~63 0~15 8+(0~7) 255 255 255 255 External modulation oscillator (from lower
    numbered modulators) -1 = off
    delay 0~127 128 0~63 0~15 8+(0~7) 255 255 255 255 Voice delay time
    enableResonance 0,1 130 0~63 0~15 8+(0~7) 255 255 255 255 Enable resonance
    voiceOscillatorPhase -64~63 132 0~63 0~15 8+(0~7) 255 255 255 255 Relative voice oscillator phase
    externalOscillator -1~6 133 0~63 0~15 8+(0~7) 255 255 255 255 External complete voice (from lower numbered voices) -1 = off
    voiceOscillatorSource -1~6 134 0~63 0~15 8+(0~7) 255 255 255 255 External voice oscillator (from lower numbered voices) -1 = off
    soundType 0~3 135 0~63 0~15 8+(0~7) 255 255 255 255 Sound type -- Oscillator, White noise, Pink noise, Spot noise
    ADDVOICE::control + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/bank.html000066400000000000000000000172111506652756400246150ustar00rootroot00000000000000 Banks and Instruments
    BANK::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    readInstrumentName ~ ~ 0 244 0~127,255 0~127,255 0~159 255 255 ret. msg No. Read instrument name (bank, root, instrument)
    findInstrumentName 0~159
    ~ ~
    1 244 0~127 0~127 255 255 255 ret. msg No. Find instrument name (instrument, bank, root)
    findInstrumentName ~ ~ 1 244 255 255 255 0~15 255 ret. msg No. Find next in list (or '*' if list end) -- instrument type
    renameInstrument ~ ~ 2 244 0~127,255 0~127,255 0~159 255 255 255 Rename instument (bank, root, instrument)
    saveInstrument ~ ~ 3 244 0~127,255 0~127,255 0~159 255 255 255 Save instrument (bank, root, instrument)
    deleteInstrument 0~159 4 244 255 255 255 255 255 255 Delete instrument from slot in current bank
    selectFirstInstrumentToSwap ~ ~ 5 244 0~127 0~127 0~159 255 255 ret. msg No. Swap instruments -- select first
    (bank, root, instrument)
    selectSecondInstrumentAndSwap ~ ~ 6 244 0~127 0~127 0~159 255 255 ret. msg No. Swap instruments -- select second and swap
    (bank, root, instrument)
    selectBank 0~127 16 244 255 255 255 255 255 255 Select bank in current root
    renameBank 0~127 17 244 0~127,255 0~127,255 255 255 255 msg No. Rename bank (always returns root ID)
    createBank ~ ~ 18 244 0~127,255 0~127,255 255 255 255 msg No. Create bank -- new ID, root ID or current root
    deleteBank ~ ~ 19 244 0~127,255 255 255 255 255 255 Delete bank -- new ID, root ID or current root
    not yet (it's currently in main)
    findBankSize ret. size 20 244 0~127,255 0~127,255 255 255 255 255 Find number of instruments in bank(ID),
    root (ID or current root)
    selectFirstBankToSwap ~ ~ 21 244 0~127 0~127 255 255 255 ret. msg No. Swap banks -- select first
    (bank, root)
    selectSecondBankAndSwap ~ ~ 22 244 0~127 0~127 255 255 255 ret. msg No. Swap banks -- select second and swap
    (bank, root)
    importBank 0~127 23 244 0~127,255 255 255 255 255 255 Import bank
    not yet (it's currently in main)
    exportBank 0~127 24 244 0~127,255 255 255 255 255 255 Export bank
    not yet (it's currently in main)
    selectRoot 0~127 32 244 255 255 255 255 255 255 Select root or read current one
    changeRootId 0~127 33 244 0~127 255 255 255 255 ret. msg No. Change root ID (always returns old ID)
    addNamedRoot 0 34 244 255 255 255 255 255 msg No. Add named root to given ID via miscmsg
    kit < 255 create and install bank / instrument
    ret. value = 255 -- not found
    deselectRoot 0 35 244 0~127 255 255 255 255 msg No. Does not change actual directory contents
    ret. value = 255 -- not found
    refreshDefaults ret. 0,1 37 244 0~127 255 255 255 255 msg No. Used for reporting whether bank structure has been seen - Read Only
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/config.html000066400000000000000000000422711506652756400251530ustar00rootroot00000000000000 Configuration
    CONFIG::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    enableGUI 0,1 0 248 255 255 255 255 255 255 Enable GUI
    showSplash 0,1 1 248 255 255 255 255 255 255 Show splash screen at start
    enableCLI 0,1 2 248 255 255 255 255 255 255 Enable CLI
    exposeStatus 0~2 3 248 255 255 255 255 255 255 Show CLI context level -- off, on, prompt
    enableSinglePath 0,1 4 248 255 255 255 255 255 255 Make later external starts open new instance of first one instead
    enableAutoInstance 0,1 5 248 255 255 255 255 255 255 Enable auto start of stand-alone child instances
    handlePadSynthBuild 0~2 6 248 255 2 255 255 255 255 Set PadSynth build method
    Legacy, Background Auto-apply
    enablePartReports 64 bit 7 248 255 255 255 255 255 255 Warn if instruments changed on load/clear/exit
    bitwise flags - system defined
    banksChecked 0,1 8 248 255 255 255 255 255 255 Confirm a valid set of banks - system defined
    XMLcompressionLevel 0~9 9 248 255 255 255 255 255 255 XML compression level
    defaultStateStart 0,1 16 248 255 255 255 255 255 255 Start with default state
    bufferSize 16~4096 17 248 255 255 255 255 255 255 Internal Buffer size (powers of 2)
    oscillatorSize 256~16384 18 248 255 255 255 255 255 255 Oscillator size (powers of 2)
    reportsDestination 0,1 19 248 255 255 255 255 255 255 Reports destination -- Console, terminal
    logTextSize 0~100 20 248 255 255 255 255 255 255 Font size for console window
    padSynthInterpolation 0,1 21 248 255 255 255 255 255 255 PadSynth interploation -- linear, cubic
    virtualKeyboardLayout 0~3 22 248 255 255 255 255 255 255 Virtual keyboard layout
    QWERTY, Dvorak, QWERTZ, AZERTY
    savedInstrumentFormat 1~3 23 248 255 255 255 255 255 255 Saved instrument format -- Legacy, Yoshimi, Both
    hideNonFatalErrors 0,1 24 248 255 255 255 255 255 255 Hide non-fatal errors
    logInstrumentLoadTimes 0,1 25 248 255 255 255 255 255 255 Report time to load an instrument
    logXMLheaders 0,1 26 248 255 255 255 255 255 255 Show first few lines of XML file when loaded
    saveAllXMLdata 0,1 27 248 255 255 255 255 255 255 Include disabled data in XML files when saving
    enableHighlight 0,1 28 248 255 255 255 255 255 255 Highigh latest instrument loaded in GUI
    jackMidiSource ~ ~ 29 248 255 255 255 255 255 msg No. Jack MIDI source
    jackPreferredMidi 0,1 30 248 255 255 255 255 255 255 Set as preferred MIDI
    jackServer ~ ~ 31 248 255 255 255 255 255 msg No. Jack server
    jackPreferredAudio 0,1 32 248 255 255 255 255 255 255 Set as preferred audio
    jackAutoConnectAudio 0,1 33 248 255 255 255 255 255 255 Autoconnect audio
    alsaMidiSource ~ ~ 34 248 255 255 255 255 255 msg No. Alsa comma separated MIDI sources
    alsaPreferredMidi 0,1 35 248 255 255 255 255 255 255 Set as preferred MIDI
    alsaMidiType 0~2 36 248 255 255 255 255 255 255 Alsa MIDI acquisition type
    Fixed, Search, External
    alsaAudioDevice ~ ~ 37 248 255 255 255 255 255 msg No. Alsa audio device
    alsaPreferredAudio 0,1 38 248 255 255 255 255 255 255 Set as preferred audio
    alsaSampleRate 0~3 39 248 255 255 255 255 255 255 Alsa audio sample rate
    192000, 96000, 48000, 44100
    readAudio ~ ~ 40 248 255 255 255 255 255 255 Read audio destination
    readMIDI ~ ~ 41 248 255 255 255 255 255 255 Read MIDI source
    addPresetRootDir ~ ~ 42 248 255 255 255 255 255 msg No. Add a new preset root directory
    removePresetRootDir 0~127 43 248 255 255 255 255 255 ret. msg No. Remove selected preset root
    currentPresetRoot 0~127 44 248 255 255 255 255 255 255 Select root directory as current one
    bankRootCC 0,32,other 45 248 255 255 255 255 255 255 Bank root CC -- MSB, LSB, Off
    bankCC 0,32,other 46 248 255 255 255 255 255 255 Bank CC -- MSB, LSB, Off
    enableProgramChange 0,1 47 248 255 255 255 255 255 255 Enable MIDI program change
    extendedProgramChangeCC 0~119,other 48 248 255 255 255 255 255 ret. msg No. Set CC for extended MIDI program change
    ret. 255 = in use by (text) miscMsg
    ignoreResetAllCCs 0,1 49 248 255 255 255 255 255 255 Ignore MIDI reset all CCs command
    logIncomingCCs 0,1 50 248 255 255 255 255 255 255 Identify incomming MIDI CCs
    showLearnEditor 0,1 51 248 255 255 255 255 255 255 Show MIDI-learn editor when Making new entries
    enableNRPNs 0,1 52 248 255 255 255 255 255 255 Enable recognition of NRPNs
    saveCurrentConfig ~ ~ 53 248 255 255 255 255 255 msg No. Save the complete configuration regardless of whether or not it has changed (dummy text)
    changeRoot ~ ~ 54 248 255 255 255 255 255 255 Store the current bank root ID
    changeBank ~ ~ 55 248 255 255 255 255 255 255 Store the current bank ID
    historyLock 0,1 54 248 0~5 255 255 255 255 255 Lock given history file group against changes. This is actually stored in the .local 'recent' file.
    CONFIG::control + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/display.html000066400000000000000000000104221506652756400253440ustar00rootroot00000000000000 Window Display
    DISPLAY::control:: + value control part /
    section
    kit engine insert parameter
    base ch
    offset miscmsg Description
    hide ~ ~ 0 all 0~15 all 255 255 255 msg No. Hide window
    show ~ ~ 1 all 0~15 all 255 255 255 255 Show window
    xposition 0~max 2 all 0~15 all 255 255 255 255 Window horizontal position
    0 to max width - window width
    yposition 0~max 3 all 0~15 all 255 255 255 255 Window vertical position
    0 to max height - window height
    width ~ ~ 4 all 0~15 all 255 255 255 255 Window width (will rescale height)
    max width - xposition - min window width
    max height - yposition - min window height
    height ~ ~ 5 all 0~15 all 255 255 255 255 Window height (will rescale width)
    max width - xposition - min window width
    max height - yposition - min window height
    select ~ ~ 6 Make list selection the current theme
    copy ~ ~ 7 Copy the selected them to one with a different name
    rename ~ ~ 8 Rename the selected theme
    delete ~ ~ 9 remove the selected theme from the list
    import ~ ~ 10 Import an external them file
    export ~ ~ 11 Export the selected theme to an external file
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/effect.html000066400000000000000000000274001506652756400251370ustar00rootroot00000000000000 Effects
    Part number is 241 for system effects
    Part number is 242 for insertion effects
    Normal part numbers are 0 to 63

    Note: offset is used as a BPM marker and may be set to 1 or 3
    Kit numbers 16 + (0 to 8) are
    used for actual effect types
    16 (0) is no effect

    EFFECT::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    volume 0~127 0 0~63,241,242 16+(0~8) effect No. 255 ret. 0,1 255 255 Effect volume or Left/Right ratio, Gain for EQ
    panning 0~127 1 0~63,241,242 16+(0~8) effect No. 255 ret. 0,1 255 255 Effect panning, Band number for EQ
    0~127 2 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- time, Echo -- delay
    Chorus, Phaser, AlienWah, DynFilter -- LFO frequency
    Distortion -- L/R mix
    0~127 3 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- Delay, Echo -- L/R delay
    Chorus, Phaser, AlienWah, DynFilter --
    LFO randomness
    Distortion -- Drive
    0~127 4 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- Delay feedback, Echo -- L/R crossover
    Chorus, Phaser, AlienWah, DynFilter --
    LFO type (0/1)
    Distortion -- Output level
    0~127 5 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- Bandwidth - only for bandwidth type
    Echo -- Feedback
    Chorus, Phaser, AlienWah, DynFilter -- L/R phase shift
    Distortion -- Type (0/13)
    0~127 6 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- E/R {reserved},Echo -- Damping
    Chorus, Phaser, AlienWah, DynFilter -- LFO depth
    Distortion -- Negative (0/1)
    sepLRDelay (echo) 0~127 7 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb, Distortion -- Low pass filter
    Echo -- when '1', changes delay to left side delay, and left/right delay ratio to right side delay
    Chorus -- Delay, Phaser, AlienWah -- Feedback, DynFilter -- Filter vs Feedback
    0~127 8 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb, Distortion -- High pass filter
    Chorus -- Feedback, Phaser -- stages (0~11)
    AlienWah -- Delay (0~100), DynFilter -- Invert (0/1)
    0~127 9 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- Damping
    Chorus, Phaser, AlienWah -- L/R crossover
    Distortion -- Stereo (0/1)
    DynFilter -- rate amplitude changes filter
    0~127 10 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- Type (0~2), Chorus -- {reserved}
    Phaser -- Invert output (0/1), AlienWah -- Phase
    Distortion -- Filter before distortion (0/1)
    0~127 11 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- Room Size, Chorus -- Invert Output
    Phaser -- Phase
    0~127 12 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Reverb -- Bandwidth, Phaser -- HyperSine (0/1)
    0/1 13 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Phaser -- Distortion
    0/1 14 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Phaser -- Analog
    (EQ) 0~127 1~14 0~63,241,242 16+(0~8) effect No. 255 ret. 0,1 255 255 Controls: 1 -- band number
    10 -- Filter Type (0~9), 11 -- Frequency, 12 -- Gain
    13 -- Q, 14 -- Extra Stages (0~4)
    preset 0~12,16
    ret 0~12
    16 0~63,241,242 16+(0~8) effect No. 255 ret. 0,1 255 255 Chooses the preset (not EQ)
    Returns the current preset, or number of them (not EQ)
    bpm 0,1 17 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Lock LFO frequency to a multiple of BPM (not EQ)
    bpmStart 0~127 18 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Point of time in LFO cycle to sync to
    (for effects that have an LFO)
    changed ~ ~ 129 0~63,241,242 16+(0~8) effect No. 255 255 255 255 Value changed -- not EQ
    returns 1 if value different to default
    Insertion effect selector
    effectNumber 0~7 4 242 255 effect No. 255 255 255 255 Set effect number
    effectType 0~8 5 242 255 effect No. 255 255 255 255 Set effect type
    effectDestination -2~63 6 242 255 effect No. 255 255 255 255 Set effect destination -- Master out = -2, Off = -1,
    Parts 0 to 63)
    System effect selector
    toEffect1 0~127 1 241 255 0~2 12 255 255 255 To effect (control) from effect(engine)
    toEffect2 0~127 2 241 255 0~2 12 255 255 255 To effect (control) from effect(engine)
    toEffect3 0~127 3 241 255 0~2 12 255 255 255 To effect (control) from effect(engine)
    effectNumber 0~3 4 241 255 effect No. 255 255 255 255 Set effect number
    effectType 0~8 5 241 255 effect No. 255 255 255 255 Set effect type
    effectEnable 0,1 7 241 255 effect No. 255 255 255 255 Enable/disable effect (non destructively)
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/envelopeinsert.html000066400000000000000000000156331506652756400267520ustar00rootroot00000000000000Envelope inserts
    Parameter is 0 for Amplitude
    Parameter is 1 for Frequency
    Parameter is 2 for Filter
    Parameter is 3 for Bandwidth
    EFFECT::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    ENVELOPEINSERT::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    attackLevel 0,127 0 0~63 0~15 All 3 0~3 255 255 Attack value
    attackTime 0,127 1 0~63 0~15 All 3 0~3 255 255 Attack time
    decayLevel 0,127 2 0~63 0~15 All 3 0~3 255 255 Decay value
    decayTime 0,127 3 0~63 0~15 All 3 0~3 255 255 Decay time
    sustainLevel 0,127 4 0~63 0~15 All 3 0~3 255 255 Sustain value
    releaseTime 0,127 5 0~63 0~15 All 3 0~3 255 255 Release time
    releaseLevel 0,127 6 0~63 0~15 All 3 0~3 255 255 Release value
    stretch 0~127 7 0~63 0~15 All 3 0~3 255 255 Stretch
    forcedRelease 0,1 16 0~63 0~15 All 3 0~3 255 255 Forced release
    linearEnvelope 0,1 17 0~63 0~15 All 3 0~3 255 255 Envelope is linear
    edit 0 24 0~63 0~15 All 2 0~3 255 255 Local to GUI (opens the graphical editing window)
    enableFreeMode 0,1 32 0~63 0~15 All 2 0~3 255 255 Enable freemode
    stretch 0~127 7 0~63 0~15 All 2 0~3 255 255 Freemode stretch
    forcedRelease 0,1 16 0~63 0~15 All 2 0~3 255 255 Freemode forced release
    linearEnvelope 0,1 17 0~63 0~15 All 2 0~3 255 255 Freemode envelope is linear
    points ~ ~ 34 0~63 0~15 All 2 0~3 255 255 Returns 'offset' number of defined points
    sustainPoint 0~39 35 0~63 0~15 All 2 0~3 255 255 Sustain position (within number of defined points)
    envelopePointAdd 0~127 0~39 0~63 0~15 All 3 0~3 0~127 255 Add point -- 'Control' = point number
    'offset' = X incremental value, 'value' = Y value
    envelopePointDelete ~ ~ 0~39 0~63 0~15 All 4 0~3 255 255 Delete point -- 'Control' = point number
    Returns 'value' number of points remaining
    envelopePointChange 0~127 0~39 0~63 0~15 All 5 0~3 0~127 255 Adjust -- 'Control' = point number
    'offset' = X incremental value, 'value' = Y value
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/filterinsert.html000066400000000000000000000213321506652756400264130ustar00rootroot00000000000000 Filter inserts
    FILTERINSERT::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    centerFrequency 0~127 0 0~63 0~15 All 1 255 255 255 Center frequency
    Q 0~127 1 0~63 0~15 All 1 255 255 255 Q factor
    frequencyTracking 0~127 2 0~63 0~15 All 1 255 255 255 Degree of frequency tracking
    velocitySensitivity 0~127 3 0~63 0~15 All 1 255 255 255 Velocity sense amount
    velocityCurve 0~127 4 0~63 0~15 All 1 255 255 255 Velocity sense curve
    gain 0~127 5 0~63 0~15 All 1 255 255 255 Gain / damping
    stages 0~4 6 0~63 0~15 All 1 255 255 255 Stages -- 1x, 2x, 3x, 4x, 5x
    baseType 0~2 7 0~63 0~15 All 1 255 255 255 Category -- Analog, Formant, State Variable
    analogType 0~8 8 0~63 0~15 All 1 255 255 255 LowPass, HighPass, LowPass2, HighPass2, BandPass2, Not2, Peak2, LowShelf2, HighShelf2
    stateVariableType 0~3 9 0~63 0~15 All 1 255 255 255 LowPass, HighPass, BandPass, Not
    frequencyTrackingRange 0,1 10 0~63 0~15 All 1 255 255 255 Tracking shift -- 0 = -100% ~ 100%, 1 = 0 ~ 200%
    Formant editor
    If 'parameter' is not 255 the command is inside the format editor itself
    formantSlowness 0~127 16 0~63 0~15 1 All 0 255 255 Speed of transition between formants
    formantClearness 0~127 17 0~63 0~15 1 All 0 255 255 Degree of formant overlap
    formantFrequency 0~127 18 0~63 0~15 1 All formant 0~11 vowel 0~5 255 Frequency
    formantQ 0~127 19 0~63 0~15 1 All formant 0~11 vowel 0~5 255 Q
    formantAmplitude 0~127 20 0~63 0~15 1 All formant 0~11 vowel 0~5 255 Amplitude
    formantStretch 0~127 21 0~63 0~15 1 All 0 255 255 Sequence stretch
    formantCenter 0~127 22 0~63 0~15 1 All 0 255 255 Centre frequency
    formantOctave 0~127 23 0~63 0~15 1 All 0 255 255 Octave
    numberOfFormants 1+12 32 0~63 0~15 1 All 0 255 255 Number of formants used
    vowelNumber 0~5 33 0~63 0~15 1 All 0 255 255 Vowel number (not used - local to GUI)
    formantNumber 1~11 34 0~63 0~15 1 All 0 255 255 Formant number (not used - local to GUI)
    sequenceSize 1~7 35 0~63 0~15 1 All 0 255 255 Number of vowels used
    sequencePostion 0~6 36 0~63 0~15 1 All 0~size 255 255 Sequence position(not used - local to GUI)
    vowelPositionInSequence 0~6 37 0~63 0~15 1 All 0~size 255 255 Vowel position in sequence
    negateInput 0,1 38 0~63 0~15 1 All 0 255 255 Negate input (from LFOs, Envelopes etc.)

    Note: 'offset' is nominally 255, but for DynFilter the upper nibble can have the preset number.
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/main.html000066400000000000000000000343261506652756400246340ustar00rootroot00000000000000 Main
    MAIN::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    mono 0,1 0 240 255 255 255 255 255 255 Master mono/stereo switch
    volume 0~127 1 240 255 255 255 255 255 255 Volume
    partNumber 0~63 14 240 255 255 255 255 255 255 Part number
    availableParts 16,32,64 15 240 255 255 255 255 255 255 Number of available parts
    partsChanged 0,1 16 240 0~63 255 255 255 255 255 Part who's instrument has been edited
    (read only)
    panLawType 0~2 17 240 255 255 255 255 255 255 Panning law -- cut,normal,boost (not effects)
    detune 0~127 32 240 255 255 255 255 255 255 Detune frequency
    keyShift -36~36 35 240 255 255 255 255 255 255 Key shift
    bpmFallBack 32~480 36 240 255 255 255 255 255 255 Default BPM for MIDI clock
    reseed 0~16777215 40 240 255 255 255 255 255 255 Set random seed value
    soloType 0~5 48 240 255 255 255 255 255 255 Channel switcher type (solo)
    off, row, column, loop, twoway, channel
    soloCC 14~119 49 240 255 255 255 255 255 255 Channel switcher incomming CC
    knownCCtest 0~127 50 240 255 255 255 255 255 255 Read only. If recognised and in-use, returns the name of the CC this matches.
    exportBank 0~127 60 240 0~127,255 255 255 255 255 msg No. Export bank ID at root ID to named directory via miscmsg
    importBank 0~127 61 240 0~127,255 255 255 255 255 msg No. Import named directory to bank ID at root ID via miscmsg
    deleteBank 0~127 62 240 0~127,255 255 255 255 255 255 Delete bank (and all instruments) at root ID
    loadInstrumentFromBank 0~159 76 240 0~63 0~127,255 0~127,255 255 255 255 Load instrument to part from bank and/or root
    loadInstrumentByName ~ ~ 77 240 0~63 255 255 255 255 msg No. Load instrument to part by name via miscmsg
    saveNamedInstrument 0~63,255 78 240 0~127,255 0~127,255 0~159 255 255 msg No. Save named instrument from part via miscmsg
    loadNamedPatchset 0~63 79 240 255 255 255 255 255 Msg No. Load named patchset via miscmsg
    saveNamedPatchset ~ ~ 80 240 255 255 255 255 255 msg No. Save named patchset via miscmsg
    loadNamedVector ~ ~ 84 240 255 255 0~15,255 255 255 msg No. Load named vector to channel (insert) via miscmsg
    If insert is 255, use channel it was saved from.
    saveNamedVector ~ ~ 85 240 255 255 0~15 255 255 msg No. Save named vector from channel (insert) via miscmsg
    loadNamedScale ~ ~ 88 240 255 255 255 255 255 msg No. Load named scale via miscmsg
    saveNamedScale ~ ~ 89 240 255 255 255 255 255 msg No. Save named scale via miscmsg
    loadNamedState ~ ~ 92 240 255 255 255 255 255 msg No. Load named state via miscmsg
    saveNamedState ~ ~ 93 240 255 255 255 255 255 msg No. Save named state via miscmsg
    readLastSeen 0~5 94 240 255 255 255 255 255 ret. msg No. Finds the full file spec of the most recent entry or empty string if none
    loadFileFromList ~ ~ 95 240 0~5 0~24 0~15 255 255 255 Load file from group in history list (to base channel for vectors)
    defaultPart 0~63 96 240 255 255 255 255 255 255 Set part to default instrument (simple Sound)
    exportPadSynthSamples ~ ~ 97 240 0~15 255 0~63 255 255 msg No. Export PadSynth samples to named prefix via miscMsg (from PadSynth window)
    masterReset ~ ~ 98 240 255 255 255 255 255 255 Reset (clear all)
    masterResetAndMLearn ~ ~ 99 240 255 255 255 255 255 255 Reset including MIDI learn
    openManual ~ ~ 100 240 255 255 255 128 255 ret. msg No. Returns text for info window on failure
    startInstance 1~31 104 240 255 255 255 255 255 255 Create new numbered instance (not LV2)
    stopInstance 1~31 105 240 255 255 255 255 255 255 Close numbered instance (not LV2)
    undo ~ ~ 106 240 255 255 255 255 255 255 Revert last action
    redo ~ ~ 107 240 255 255 255 255 255 255 Reinstate last reverted action
    stopSound ~ ~ 128 240 255 255 255 255 255 255 Stop (cease all sound)
    readPartPeak ~ ~ 200 240 0~63 0,1 255 255 255 255 Read part's left or right instananeous peak level
    readMainLRpeak ~ ~ 201 240 0,1 255 255 255 255 255 Read main left or right instananeous peak level
    readMainLRrms ~ ~ 202 240 0,1 255 255 255 255 255 Read main left or right RMS value
    setTestInstrument 1~16 203 240 255 255 255 255 255 255 Create a SubSynth instrument with default Reverb effect. Currently only available for the Command Line usage: zset [partnumber]
    MAIN::control + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/midi.html000066400000000000000000000077341506652756400246350ustar00rootroot00000000000000 midi (incomming)
    MIDI::control:: + value control part /
    section
    kit
    Channel
    engine
    Char 1
    insert
    Char 2
    param
    eter
    offset miscmsg Description
    noteOn 0~127 217 0~15 0~127 255 255 255 255 255 Note On -- Char 1 = number, Char 2 = velocity
    noteOff ~ ~ 217 0~15 0~127 0 255 255 255 255 Note Off -- Char 1 = number
    controller -8192~8192 217 0~15 0~127 255 255 255 255 255 Controller -- Char 1 = type (controller number)
    instrument 0~159 217 0~15 0~127,255 0~127,255 255 255 255 255 Program Change -- 128 to 159 = extended form
    bankChange 0 217 0~15 0~127,255 0~127,255 255 255 255 255 Bank / Root change

    Recognised MIDI controls

    (not to be confused with part controls)
    Value
    0
    1
    2
    6
    7
    10
    11
    32
    38
    64
    65
    68
    71
    74
    75
    76
    77
    78
    96
    97
    98
    99
    120
    121
    123


    128
    129
    130
    131
    132


    640
    641
    642
    999
    0x7fff
    0x8000
    Control
    bankSelectMSB
    modulation
    breath
    dataMSB
    volume
    panning
    expression
    bankSelectLSB
    dataLSB
    sustain
    portamento
    legato
    filterQ
    filterCutoff
    bandwidth
    fmamp
    resonanceCenter
    resonanceBandwidth
    dataINC
    dataDEC
    nrpnLSB
    nrpnMSB
    allSoundOff
    resetAllControllers
    allNotesOff

    Translated values
    pitchWheelAdjusted
    channelPressureAdjusted
    keyPressureAdjusted
    soloType
    soloCC

    The following are generated internally for MIDI-learn and are deliberately well outside the range of normal MIDI
    pitchWheel (seen as 128)
    channelPressure (seen as 129)
    keyPressure (seen as 130)
    programchange
    maxNRPN
    identNRPN
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/midilearn.html000066400000000000000000000163731506652756400256560ustar00rootroot00000000000000 midilearn
    MIDILEARN::control:: + value control part /
    section
    kit engine insert param
    eter
    type miscmsg Description
    block 0~399 0 216 255 255 255 255 0,1 msg No. Set 'block' -- stop any later response to this CC
    limit 0~399 1 216 255 255 255 255 0,2 msg No. Set 'limit' othewise 'compress' incoming value
    mute 0~399 2 216 255 255 255 255 0,4 msg No. Set 'mute' -- disable this line
    nrpn ~ ~ 3 216 255 255 255 255 0,8 255 auto set as NRPN
    sevenBit 0~399 4 216 255 255 255 255 0,16 msg No. Set 7bit NRPN mode
    minimum 0~399 5 216 255 255 0~200 255 0 msg No. Set minimim translated CC value
    maximum 0~399 6 216 255 255 255 0~200 0 msg No. Set maximim translated CC value
    ignoreMove 0~399 7 216 255 255 255 255 0 255 Don't change line position
    (used internally when editing lines)
    deleteLine 0~399 8 216 255 255 255 255 0 255 Remove selected line
    nrpnDetected ~ ~ 9 216 255 255 255 255 0 255 Mark incoming MIDI as an NRPN
    (used internally translating data and for UI display)
    showGUI ~ ~ 14 216 255 255 255 255 0 255 GUI only
    hideGUI ~ ~ 15 216 255 255 255 255 0 255 GUI only
    CCorChannel 0~399 16 216 0~119 0~15,16 255 255 0 msg No. Set CC or channel and rewrite line possibly moving it in the list (engine = 16, any channel)
    findSize 0 20 216 255 255 255 255 0 255 Find current list size (not currently used)
    sendLearnMessage 0 21 216 255 255 255 255 0 msg No. Send learned message to GUI
    sendRefreshRequest 0 22 216 255 255 255 255 0 255 GUI refresh request
    reportActivity ~ ~ 24 216 255 255 255 255 255 255 Toggle GUI activity marker
    clearAll 0 96 216 255 255 255 255 0 255 Clear entire list
    loadList 0 128 216 255 255 255 255 255 msg No. Load list from file
    loadFromRecent 0~399 129 216 255 255 255 255 0 255 Load numbered list from recent history
    saveList 0 130 216 255 255 255 255 0 msg No. Save list to file
    cancelLearn 0 131 216 255 255 255 255 0 255 Cancel MIDI learn
    learned ~ ~ 132 216 255 255 255 255 0 255 Send message

    Note: 'offset' is always 255. This was not available when MIDI learn was created so 'type' was used.
    'value' represents list postion.
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/oscillator.html000066400000000000000000000274721506652756400260670ustar00rootroot00000000000000 Oscillator
    OSCILLATOR::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    phaseRandomness -64~63 0 0~63 0~15 0,8+,16+,2 6 255 255 255 Phase randomness
    magType 0~4 1 0~63 0~15 0,8+,16+,2 6 255 255 255 Mag type -- Linear, -40dB, -60dB, -80dB, -100dB
    harmonicRandomness
    (hrndDial)
    0~127 2 0~63 0~15 0,8+,16+,2 6 255 255 255 No label -- associated with following
    harmonicRandomnessType 0~2 3 0~63 0~15 0,8+,16+,2 6 255 255 255 Harmonic amplitude type -- None, Power, Sine
    baseFunctionParameter -64~63 16 0~63 0~15 0,8+,16+,2 6 255 255 255 Base function parameter
    baseFunctionType 0~16 17 0~63 0~15 0,8+,16+,2 6 255 255 255 Base function -- Sine, Triange, Pulse, Saw, Power, Gauss, Diode, AbsSine, PulseSine, StrtchSine, Chirp, AbsStrSine, Chebyshev, Sqr, Spike, Circle, HyperSec
    baseModulationParameter1 0~127 18 0~63 0~15 0,8+,16+,2 6 255 255 255 Base function modulation parameter 1
    baseModulationParameter2 0~127 19 0~63 0~15 0,8+,16+,2 6 255 255 255 Base function modulation parameter 2
    baseModulationParameter3 0~127 20 0~63 0~15 0,8+,16+,2 6 255 255 255 Base function modulation parameter 3
    baseModulationType 0~3 21 0~63 0~15 0,8+,16+,2 6 255 255 255 Base function modulation type -- None, Rev, Sine, Pow
    autoClear 0,1 32 0~63 0~15 0,8+,16+,2 6 255 255 255 Autoclear when set as base function (not used)
    useAsBaseFunction 0,1 33 0~63 0~15 0,8+,16+,2 6 255 255 255 Use as base function (if value is 1, assume
    auto clear is set)
    waveshapeParameter -64~63 34 0~63 0~15 0,8+,16+,2 6 255 255 255 Waveshape parameter
    waveshapeType 0~14 35 0~63 0~15 0,8+,16+,2 6 255 255 255 Waveshape -- None, Atan, Asym1, Pow, Sine, Qnts Zigzag, Lmt, LmtU, LmtL,Ilmt,Clip, Asym2, Pow2, Sgm
    filterParameter1 0~127 36 0~63 0~15 0,8+,16+,2 6 255 255 255 Filter parameter 1
    filterParameter2 0~127 37 0~63 0~15 0,8+,16+,2 6 255 255 255 Filter parameter 2
    filterBeforeWaveshape 0,1 38 0~63 0~15 0,8+,16+,2 6 255 255 255 Apply filter before waveshape
    filterType 0~13 39 0~63 0~15 0,8+,16+,2 6 255 255 255 Filter type -- None, LP, HP1a, HP1b, BP1, BS1, LP2, HP2, BP2, BS2, Cos, Sin, Lsh, Sgm
    modulationParameter1 0~127 40 0~63 0~15 0,8+,16+,2 6 255 255 255 Modulation parameter 1
    modulationParameter2 0~127 41 0~63 0~15 0,8+,16+,2 6 255 255 255 Modulation parameter 2
    modulationParameter3 0~127 42 0~63 0~15 0,8+,16+,2 6 255 255 255 Modulation parameter 3
    modulationType 0~3 43 0~63 0~15 0,8+,16+,2 6 255 255 255 Modulation type -- None, Pow, ThrsD, THrsU
    spectrumAdjustParameter 0~127 44 0~63 0~15 0,8+,16+,2 6 255 255 255 Spectrum adjust parameter
    spectrumAdjustType 0~3 45 0~63 0~15 0,8+,16+,2 6 255 255 255 Spectrum adjust type -- None, Pow, ThrsD, ThrsU
    harmonicShift -64~64 64 0~63 0~15 0,8+,16+,2 6 255 255 255 Harmonic shift
    clearHarmonicShift ~ ~ 65 0~63 0~15 0,8+,16+,2 6 255 255 255 Clear harmonic shift (local to GUI)
    shiftBeforeWaveshapeAndFilter 0,1 66 0~63 0~15 0,8+,16+,2 6 255 255 255 Apply harmonic shift before waveshape and filter
    adaptiveHarmonicsParameter 0~100 67 0~63 0~15 0,8+,16+,2 6 255 255 255 Adaptive harmonics parameter
    adaptiveHarmonicsBase 0~255 68 0~63 0~15 0,8+,16+,2 6 255 255 255 Adaptive harmonics base frequency
    adaptiveHarmonicsPower 0~200 69 0~63 0~15 0,8+,16+,2 6 255 255 255 Adaptive harmonics power
    adaptiveHarmonicsType 0~8 70 0~63 0~15 0,8+,16+,2 6 255 255 255 Adaptive harmonics type -- Off, On, Square, 2xSub, 2xAdd, 3xSub, 3xAdd, 4xSub, 4xAdd
    clearHarmonics ~ ~ 96 0~63 0~15 0,8+,16+,2 6 255 255 255 Set harmonics Amplitude and phase to default
    convertToSine ~ ~ 97 0~63 0~15 0,8+,16+,2 6 255 255 255 Translate harmonics to 'User' base function and set defaults
    harmonicAmplitude 0~127 0~127 0~63 0~15 0,8+,16+,2 7 255 255 255 Set harmonic point (control) amplitude
    harmonicPhase 0~127 0~127 0~63 0~15 0,8+,16+,2 8 255 255 255 Set harmonic point (control) phase
    OSCILLATOR::control + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/padsynth.html000066400000000000000000000403151506652756400255350ustar00rootroot00000000000000 PadSynth
    PADSYNTH::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    volume 0~127 0 0~63 0~15 2 255 255 255 255 Volume
    velocitySense 0~127 1 0~63 0~15 2 255 255 255 255 Velocity Sensitivity
    panning 0~127 2 0~63 0~15 2 255 255 255 255 Panning
    enableRandomPan 0,1 3 0~63 0~15 2 255 255 255 255 Set random panning behaviour
    randomWidth 0~63 4 0~63 0~15 2 255 255 255 255 L/R range of random panning
    detuneFrequency -8192~8191 32 0~63 0~15 2 255 255 255 255 Detune frequency
    equalTemperVariation 0~127 33 0~63 0~15 2 255 255 255 255 Equal temper variation
    baseFrequencyAs440Hz 0,1 34 0~63 0~15 2 255 255 255 255 Set base frequency as 440Hz
    octave -8~7 35 0~63 0~15 2 255 255 255 255 Octave
    detuneType 1~4 36 0~63 0~15 2 255 255 255 255 Detune type -- L35 cents, L10 cents, E100 cents,
    E1200 cents
    coarseDetune -64~63 37 0~63 0~15 2 255 255 255 255 Coarse detune
    pitchBendAdjustment 0~127 38 0~63 0~15 2 255 255 255 255 Pitch bend range
    pitchBendOffset 0~127 39 0~63 0~15 2 255 255 255 255 Start position of pitch bend
    bandwidth 0~1000 40 0~63 0~15 2 255 255 0 255 Bandwidth
    bandwidthScale 0~6 41 0~63 0~15 2 255 255 0 255 Bandwidth scale -- Normal, Equal Hz, 0.25, 0.5,
    0.75, 1.5, Double, Inverse 0.5
    spectrumMode 0~2 42 0~63 0~15 2 255 255 0 255 Spectrum mode -- Bandwidth, Discrete, Continuous
    xFadeUpdate 0~20000 43 0~63 0~15 2 255 255 255 255 Cross fade ongoing notes after building a new wavetable (fade time in milliseconds)
    overtoneParameter1 0~255 48 0~63 0~15 2 255 255 0 255 Overtone parameter 1
    overtoneParameter2 0~255 49 0~63 0~15 2 255 255 0 255 Overtone parameter 2
    overtoneForceHarmonics 0~255 50 0~63 0~15 2 255 255 0 255 Overtone force harmonics
    overtonePosition 0~7 51 0~63 0~15 2 255 255 0 255 Overtone position -- Harmonic, ShiftU, ShiftL, PowerU, PowerL, Sine, Power, Shift
    baseWidth 0~127 64 0~63 0~15 2 255 255 0 255 Base width
    frequencyMultiplier 0~127 65 0~63 0~15 2 255 255 0 255 Frequency multiplier
    modulatorStretch 0~127 66 0~63 0~15 2 255 255 0 255 Modulator stretch
    modulatorFrequency 0~127 67 0~63 0~15 2 255 255 0 255 Modulator frequency
    size 0~127 68 0~63 0~15 2 255 255 0 255 Size
    baseType 0~2 69 0~63 0~15 2 255 255 0 255 Base type -- Gauss, Square, DoubleExp,
    harmonicSidebands 0~2 70 0~63 0~15 2 255 255 0 255 Harmonic sidebands -- Full, Upper half, Lower half
    spectralWidth 0~127 71 0~63 0~15 2 255 255 0 255 Spectral width
    spectralAmplitude 0~127 72 0~63 0~15 2 255 255 0 255 Spectral Amplitude
    amplitudeMultiplier 0~3 73 0~63 0~15 2 255 255 0 255 Amplitude multiplier -- Off, Gauss, Sune, Flat
    amplitudeMode 0~3 74 0~63 0~15 2 255 255 0 255 Amplitude mode -- Sum, Multiply, Divide 1, Divide 2
    autoscale 0,1 75 0~63 0~15 2 255 255 0 255 Enable autoscale
    harmonicBase 0~8 80 0~63 0~15 2 255 255 0 255 Harmonic base -- C-2, G-2, C-3, G-3, C-4, G-4, C-5, G-5, G-6
    samplesPerOctave 0~6 81 0~63 0~15 2 255 255 0 255 Samples per octave -- 0.5, 1, 2, 3, 4, 6, 12
    numberOfOctaves 0~7 82 0~63 0~15 2 255 255 0 255 Number of octaves to cover -- 1,2,3,4,5,6,7,8
    sampleSize 0~6 83 0~63 0~15 2 255 255 0 255 Sample size -- 16k, 32k, 64k, 128k, 256k, 512k, 1M
    rebuildTrigger 0~60000 90 0~63 0~15 2 255 255 255 255 Trigger wavetable rebuild after generating the given sample time (in milliseconds)
    randWalkDetune 0~127 91 0~63 0~15 2 255 255 0 255 Param detuneFrequency random walk
    if rebuildTrigger > 0
    randWalkBandwidth 0~127 92 0~63 0~15 2 255 255 0 255 Param bandwidth random walk
    if rebuildTrigger > 0
    randWalkFilterFreq 0~127 93 0~63 0~15 2 255 255 0 255 Param centerFrequency random walk
    if rebuildTrigger > 0
    randWalkProfileWidth 0~127 94 0~63 0~15 2 255 255 0 255 Param baseWidth random walk
    if rebuildTrigger > 0
    randWalkProfileStretch 0~127 95 0~63 0~15 2 255 255 0 255 Param modulatorStretch random walk
    if rebuildTrigger > 0
    applyChanges 1 104 0~63 0~15 2 255 255 255 255 Apply changes and build new wavetable
    (Note: happens automatically when control::handlePadSynthBuild == 2 )
    applyChanges 1 104 0~63 0~15 2 255 255 255 0~4 Status update from background wavetable build after "applyChanges" or Instrument load.
    (offset = 0 when done)
    stereo 0,1 112 0~63 0~15 2 255 255 255 255 Enable stereo
    dePop 0~127 120 0~63 0~15 2 255 255 255 255 'Pop' suppression
    punchStrength 0~127 121 0~63 0~15 2 255 255 255 255 Punch strength
    punchDuration 0~127 122 0~63 0~15 2 255 255 255 255 Punch duration
    punchStretch 0~127 123 0~63 0~15 2 255 255 255 255 Punch stretch
    punchVelocity 0~127 124 0~63 0~15 2 255 255 255 255 Punch velocity sensitivity
    PADSYNTH::control + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/part.html000066400000000000000000000670721506652756400246620ustar00rootroot00000000000000 Parts
    PART::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    enable 0,1 0 0~63 255 255 255 255 255 255 Enable part
    enableAdd 0,1 1 0~63 255 32,255 255 255 255 255 Enable AddSynth
    enableSub 0,1 2 0~63 255 32,255 255 255 255 255 Enable SubSynth
    enablePad 0,1 3 0~63 255 32,255 255 255 255 255 Enable PadSynth
    volume 0~127 10 0~63 255 255 255 255 255 255 Part volume
    velocitySense 0~127 11 0~63 255 255 255 255 255 255 Velocity sensitivity
    panning 0~127 12 0~63 255 255 255 255 255 255 Part panning
    velocityOffset 0~127 13 0~63 255 255 255 255 255 255 Velocity start offset
    midiChannel 0~16 14 0~63 255 255 255 255 255 255 Incoming MIDI channel
    omni 0,1 15 0~63 255 255 255 255 255 255 Enable Omni mode
    keyMode 0~2 16 0~63 255 255 255 255 255 255 Mode -- Poly, Mono, Legato
    channelATset 0~127 17 0~63 255 255 255 255
    ret. 0~127
    255 255 Channel aftertouch -- off, filter cutoff + filter Q
    + pitchbend + modulation
    keyATset 0,127 18 0~63 255 255 255 255
    ret. 0~127
    255 255 Key aftertouch -- off, filter cutoff + filter Q
    + pitchbend + modulation
    minNote 0~126 19 0~63 255 255 255 255 255 255 Minimum note accepted
    maxNote 1~127 20 0~63 255 255 255 255 255 255 Maximum note accepted
    minToLast ~ ~ 21 0~63 255 255 255 255 255 255 Set minimum to last key press
    maxToLast ~ ~ 22 0~63 255 255 255 255 255 255 Set maximum to last key press
    resetMinMaxKey ~ ~ 23 0~63 255 255 255 255 255 255 Clear key limits
    maxNotes 1~60 24 0~63 255 255 255 255 255 255 Maximum number of sounding notes
    keyShift -36~36 25 0~63 255 255 255 255 255 255 Key shift
    partToSystemEffect1 0~127 26 0~63 255 255 255 255 255 255 Part output to System Effect 1
    partToSystemEffect2 0~127 27 0~63 255 255 255 255 255 255 Part output to System Effect 2
    partToSystemEffect3 0~127 28 0~63 255 255 255 255 255 255 Part output to System Effect 3
    partToSystemEffect4 0~127 29 0~63 255 255 255 255 255 255 Part output to System Effect 4
    effectNumber 0~2 40 0~63 17 255 255 255 255 255 Set effect number
    portamento 0,1 41 0~63 255 255 255 255 255 255 Portamento
    humanise 0~50 50 0~63 255 255 255 255 255 255 Small frequency randmisation
    humanvelocity 0~50 51 0~63 255 255 255 255 255 255 Small amplitude randomisation
    drumMode 0,1 57 0~63 0~15 255 255 255 255 255 Drum mode
    kitMode 0~3 58 0~63 255 255 255 255 255 255 Mode -- Off, Multi, Single, Crossfade
    kitEffectNum 0~3 64 0~63 0~15 255 32 255 255 255 Effect to use -- Off, 1, 2, 3
    effectType 0~8 65 0~63 17 effect No. 255 255 255 255 Set effect type
    effectDestination 0~2 66 0~63 17 effect No. 255 255 255 255 Set effect destination
    Next ffect, Part out, Dry out
    effectBypass 0,1 67 0~63 17 effect No. 255 255 255 255 Bypass this effect
    defaultInstrument ~ ~ 96 0~63 255 255 255 255 255 255 Set part to default instrument (Simple Sound)
    padsynthParameters ~ ~ 104 0~63 255 255 255 255 255 255 Apply PadSynth changes
    audioDestination 1~3 120 0~63 255 255 255 255 255 255 Audio destination -- main L/R, part L/R, both
    172 0~63 255 255 255 255 255 255 Copy effect ??
    173 0~63 255 255 255 255 255 255 Paste effect ??
    instrumentEngines ~ ~ 219 0~63 255 255 255 255 255 255 Find which engines in a part are active
    instrumentCopyright ~ ~ 220 0~63 255 255 255 255 255 255 Set part's copyright info
    instrumentComments ~ ~ 221 0~63 255 255 255 255 255 255 Set part's comments
    instrumentName ~ ~ 222 0~63 255 255 32,255 255 255 255 Set/Read part's name
    kit item name if insert = 32
    instrumentType 0~16 223 0~63 255 255 255 255 255 255 Type of instrument -- Piano etc. (needs revision)
    defaultInstrumentCopyright ~ ~ 224 0~63 255 255 255 0,1 255 255 Load/Save default instrument copyright info
    Kit level controls
    enable 0,1 1~3 0~63 0~15 255 32 255 255 255 Kit item engine enable
    AddSynth, SubSynth, PadSynth
    enableKitLine 0,1 4 1~63 0~15 255 32 255 255 255 Kit item enable (can't disable item 0)
    kitItemMute 0,1 5 0~63 0~15 255 32 255 255 255 Mute this kit line
    minNote ~ ~ 19 0~63 0~15 255 32 255 255 255 Kit item min note
    maxNote ~ ~ 20 0~63 0~15 255 32 255 255 255 Kit item max note
    minToLastKey ~ ~ 21 0~63 0~15 255 32 255 255 255 Kit item min to last key press
    maxToLastKey ~ ~ 22 0~63 0~15 255 32 255 255 255 Kit item max to last key press
    resetMinMaxKey ~ ~ 23 0~63 0~15 255 32 255 255 255 Kit item clear key limits
    MIDI controllers
    volumeRange 64~127 128 0~63 255 255 255 255 255 255 Volume range
    volumeEnable 0,1 129 0~63 255 255 255 255 255 255 Enable volume control
    panningWidth 0~64 130 0~63 255 255 255 255 255 255 Panning width
    modWheelDepth 0~127 131 0~63 255 255 255 255 255 255 Frequency range of mod wheel control
    exponentialModWheel 0,1 132 0~63 255 255 255 255 255 255 Enable exponention mod wheel
    bandwidthDepth 0~127 133 0~63 255 255 255 255 255 255 Bandwith depth
    exponentialBandwidth 0,1 134 0~63 255 255 255 255 255 255 Enable exponential bandwidth
    expressionEnable 0,1 135 0~63 255 255 255 255 255 255 Enable expression
    FMamplitudeEnable 0,1 136 0~63 255 255 255 255 255 255 Enable FM amplitude
    sustainPedalEnable 0,1 137 0~63 255 255 255 255 255 255 Enable sustain pedal
    pitchWheelRange -6400~6400 138 0~63 255 255 255 255 255 255 Pitch wheel range
    filterQdepth 0~127 139 0~63 255 255 255 255 255 255 Filter Q depth
    filterCutoffDepth 0~127 140 0~63 255 255 255 255 255 255 Filter cutoff depth
    breathControlEnable 0,1 141 0~63 255 255 255 255 255 255 Enable breath control
    resonanceCenterFrequencyDepth 0~127 142 0~63 255 255 255 255 255 255 Resonance center frequency
    resonanceBandwidthDepth 0~127 143 0~63 255 255 255 255 255 255 Resonance bandwidth range
    portamentoTime 0~127 144 0~63 255 255 255 255 255 255 Portamento time
    portamentoTimeStretch 0~127 145 0~63 255 255 255 255 255 255 Portamento time V frequency
    portamentoThreshold 0~127 146 0~63 255 255 255 255 255 255 Start/end point of portamento
    portamentoThresholdType 0,1 147 0~63 255 255 255 255 255 255 Portamento threshold type
    less than limit, greater than limit
    enablePorportionalPortamento 0,1 148 0~63 255 255 255 255 255 255 Enable proportional portamento
    proportionalPortamentoRate 0~127 149 0~63 255 255 255 255 255 255 Speed of proportional portamento
    proportionalPortamentoDepth 0~127 150 0~63 255 255 255 255 255 255 Range of proportional portamento
    receivePortamento 0,1 151 0~63 255 255 255 255 255 255 Enable portamento
    resetAllControllers ~ ~ 152 0~63 255 255 255 255 255 255 Set all controllers to defaults
    Incomming MIDI CCs
    midiModWheel 0~127 192 0~63 255 255 255 255 255 255 Modulation (CC1)
    midiBreath 0~127 193 0~63 255 255 255 255 255 255 Breath control (CC2)
    midiExpression 0~127 194 0~63 255 255 255 255 255 255 Expression (CC11)
    midiSustain 0~127 195 0~63 255 255 255 255 255 255 Sustain(CC64)
    midiPortamento 0~127 196 0~63 255 255 255 255 255 255 Portamento (CC65)
    midiFilterQ 0~127 197 0~63 255 255 255 255 255 255 Filter Q (CC73)
    midiCutoff 0~127 198 0~63 255 255 255 255 255 255 Filter cutoff (CC74)
    midiBandwidth 0~127 199 0~63 255 255 255 255 255 255 Master bandwidth (CC75)
    midiFMamp 0~127 200 0~63 255 255 255 255 255 255 FM amplitude (CC76)
    midiResonanceCenter 0~127 201 0~63 255 255 255 255 255 255 Resonance center frequency (CC77)
    midiResonanceBandwidth 0~127 202 0~63 255 255 255 255 255 255 Resonance bandwidth (CC78)
    PART::control + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/resonance.html000066400000000000000000000066631506652756400256700ustar00rootroot00000000000000 Resonance
    Note: offset is zero for all padsynth resonance controls.
    RESONANCE::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    enableResonance 0,1 0 0~63 0~15 0,2 9 255 255 255 Enable resonance
    maxDb 1~90 1 0~63 0~15 0,2 9 255 255 255 Max dB
    centerFrequency 0~127 2 0~63 0~15 0,2 9 255 255 255 Centre frequency
    octaves 0~127 3 0~63 0~15 0,2 9 255 255 255 Octave range
    randomType 0~2 10 0~63 0~15 0,2 9 255 255 255 Randomisation type: 0 coarse, 1 medium, 2 fine
    interpolatePeaks 0,1 20 0~63 0~15 0,2 9 255 255 255 Interpolate peaks: 0 smooth, 1 linear
    protectFundamental 0,1 21 0~63 0~15 0,2 9 255 255 255 Protect fundamental
    clearGraph ~ ~ 96 0~63 0~15 0,2 9 255 255 255 Clear graph
    smoothGraph ~ ~ 97 0~63 0~15 0,2 9 255 255 255 Smooth graph
    graphPoint 0~127 98 0~63 0~15 0,2 10 0~255 255 255 Set graph point ampitude at (parameter) position
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/scales.html000066400000000000000000000143211506652756400251530ustar00rootroot00000000000000 Scales
    SCALES::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    enableMictrotonal 0,1 0 232 255 255 255 255 255 255 Enabble/disable mictotonal scales
    refFrequency 329~660 1 232 255 255 255 255 ret. 0~127 255 Reference frequency
    (also returns ref. note number)
    refNote 0~127 2 232 255 255 255 255 255 255 Reference note number
    invertScale 0,1 3 232 255 255 255 255 255 255 Invert keys
    invertedScaleCenter 0~127 4 232 255 255 255 255 255 255 Center point of inverted scale
    scaleShift -63~64 5 232 255 255 255 255 255 255 Shift scale range
    enableKeyboardMap 0,1 16 232 255 255 255 255 255 255 Enable/disable keyboard mapping
    lowKey 0~127 17 232 255 255 255 255 255 255 Keyboard first note to map
    middleKey 0~127 18 232 255 255 255 255 255 255 Keyboard middle reference
    highKey 0~127 19 232 255 255 255 255 255 255 keyboard last note to map
    tuning ret. size,err 32 232 255 255 255 255 255 msg No. List of tunings
    keyboardMap ret. size,err 33 232 255 255 255 255 255 msg No. Keyboard Map
    keymapSize 0~127 34 232 255 255 255 255 255 255 Actual size of keymap (0 = full linear map)
    importScl ret. size,err 48 232 255 255 255 255 255 msg No. Import .scl file
    importKbm ret. size,err 49 232 ret. A note ret. min ret. mid ret max 255 msg No. Import .kbm file (A frequency is read after import)
    exportScl ~ ~ 50 232 255 255 255 255 255 255 Export tunings to .scl file
    exportKbm ~ ~ 51 232 255 255 255 255 255 255 Export keymap to .kbm file
    name ~ ~ 64 232 255 255 255 255 255 255 Set scale name
    comment ~ ~ 65 232 255 255 255 255 255 255 Set comment field
    clearAll ~ ~ 96 232 255 255 255 255 255 255 Set default values
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/style.css000066400000000000000000000030621506652756400246650ustar00rootroot00000000000000body { background-color: #fff3df; width: 1060pt; margin: auto; font-family: Arial, Helvetica; font-size: 12pt; } table { table-layout: fixed; width: 100%; border-collapse: collapse; position: relative; left: 1px; } #note { color: #7f0000; text-align: center; } div.leftnote { color: #7f0000; font-size: 9pt; position: relative; top: 2px; left: 45%; width: 330pt; height: 43pt; } div.rightnote { color: #7f0000; font-size: 9pt; position: absolute; top: 1px; right: 1px; width: 140pt; height: 40pt; } div.effLeftnote { color: #7f0000; font-size: 9pt; position: relative; top: 2px; left: 25%; width: 330pt; height: 43pt; } div.effRightnote { color: #7f0000; font-size: 9pt; position: absolute; top: 1px; right: 1px; width: 140pt; height: 40pt; } div.comment { color: #7f0000; font-size: 10pt; } thead th:nth-child(1) { width: 19%; } thead th:nth-child(2) { width: 7%; } thead th:nth-child(3) { width: 3.5%; } thead th:nth-child(4) { width: 7%; } thead th:nth-child(5) { width: 6%; } thead th:nth-child(6) { width: 6.5%; } thead th:nth-child(7) { width: 5.5%; } thead th:nth-child(8) { width: 5.5%; } thead th:nth-child(9) { width: 4%; } thead th:nth-child(10) { width: 6.5%; } td { border: 1px solid blue; text-align: center; } div.titles { position: sticky; left: 0; bottom: 0; width: 100.1%; /* slightly oversize to hide right table border */ background-color: #fff3df; color: black; text-align: center; } a:link { font-weight: bold; } yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/subsynth.html000066400000000000000000000214041506652756400255600ustar00rootroot00000000000000 SubSynth
    SUBSYNTH::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    volume 0~127 0 0~63 0~15 1 255 255 255 255 Volume
    velocitySense 0~127 1 0~63 0~15 1 255 255 255 255 Velocity sensivity
    panning 0~127 2 0~63 0~15 1 255 255 255 255 Panning
    enableRandomPan 0,1 3 0~63 0~15 1 255 255 255 255 Set random panning behaviour
    randomWidth 0~63 4 0~63 0~15 1 255 255 255 255 L/R range of random panning
    bandwidth 0~127 16 0~63 0~15 1 255 255 255 255 Bandwidth
    bandwidthScale 0~127 17 0~63 0~15 1 255 255 255 255 Bandwidth scale
    enableBandwidthEnvelope 0,1 18 0~63 0~15 1 255 255 255 255 Enable bandwidth envelope
    detuneFrequency -8192~8191 32 0~63 0~15 1 255 255 255 255 Detune frequency
    equalTemperVariation 0~127 33 0~63 0~15 1 255 255 255 255 Equal temper variation
    baseFrequencyAs440Hz 0,1 34 0~63 0~15 1 255 255 255 255 Set voice base frequency to 440Hz
    octave -8~7 35 0~63 0~15 1 255 255 255 255 Octave
    detuneType 1~4 36 0~63 0~15 1 255 255 255 255 Detune type -- L35 cents, L10 cents, E100 cents,
    E1200 cents
    coarseDetune 0~127 37 0~63 0~15 1 255 255 255 255 Coarse detune
    pitchBendAdjustment 0~127 38 0~63 0~15 1 255 255 255 255 Pitch bend adjustment
    pitchBendOffset 0~127 39 0~63 0~15 1 255 255 255 255 Pitch bend offset
    enableFrequencyEnvelope 0,1 40 0~63 0~15 1 255 255 255 255 Enable frequency envelope
    overtoneParameter1 0~255 48 0~63 0~15 1 255 255 255 255 Overtone parameter 1
    overtoneParameter2 0~255 49 0~63 0~15 1 255 255 255 255 Overtone parameter 2
    overtoneForceHarmonics 0~255 50 0~63 0~15 1 255 255 255 255 Overtone force harmonics
    overtonePosition 0~7 51 0~63 0~15 1 255 255 255 255 Overtone position -- Harmonic, ShiftU, ShiftL, PowerU, PowerL, Sine, Power, Shift
    enableFilter 0,1 64 0~63 0~15 1 255 255 255 255 Enable filter
    filterStages 1~5 80 0~63 0~15 1 255 255 255 255 Filter stages
    magType 0~4 81 0~63 0~15 1 255 255 255 255 Mag type -- Linear, -40dB, -60dB, -80dB, -100dB
    startPosition 0~2 82 0~63 0~15 1 255 255 255 255 Start point -- Zero, Random, Maximum
    clearHarmonics ~ ~ 96 0~63 0~15 1 255 255 255 255 Set all harmonics amplitudes and bandwidths to default
    stereo 0,1 112 0~63 0~15 1 255 255 255 255 Stereo on/off
    harmonicAmplitude 0~127 0~63 0~63 0~15 1 8 255 255 255 Set harmonic point (control) amplitude
    harmonicBandwidth 0~127 0~63 0~63 0~15 1 9 255 255 255 Set harmonic point (control) bandwidth
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/toplevel.html000066400000000000000000000131021506652756400255270ustar00rootroot00000000000000 Top Level
    TOPLEVEL::control:: + value control part /
    section
    kit engine insert param
    eter
    offset miscmsg Description
    guideLocation ret. msg No. ~ ~ 249 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Shows location of latest HTML guide (read only)
    windowTitle ret. msg No. 0~63 252 0~15 0~2,8+(0~7) 255 255 255 255 Builds window title. With text if ID passed in 'value'
    dataExchange ~ ~ 250 240 ~ ~ ~ ~ ~ ~ is init ~ ~ ~ ~ Start-up hook, complete setup in Synth and refresh UI
    dataExchange ~ ~ 250 250 ~ ~ ~ ~ ~ ~ ~ ~ buff No. ~ ~ GuiDataExchange: push-update in designated buffer
    copyPaste 0~2
    ret. msg No.
    251 0~63,241,242 0~15 0~2,8+(0~7),
    255
    0~2,255 0~3,255 0,255 msg No. Perform actions List (find type), Copy, Paste (delete)
    partBusy Ret. 0,1 252 0~63 255 255 255 255 255 255 Blocks further action. Internally set (read only)
    unrecognised ~ ~ 253 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Invalid entry in interpreter
    textMessage ~ ~ 254 250 ~ ~ ~ ~ 255 255 128 msg No. Just sends a non-blocking message to the GUI
    forceExit ~ ~ 255 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Force exit (16) at any time from any section
    instanceID Ret. 0~31 ~ ~ 254 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Returns numeric ID of current instance (read only)

     copyPaste variatons. This uses the 'type' field slightly differently.

    Command> value type Description
    List 0~2 0 Returns a lists of all the presets for the current section.
    If 'value' = 1 returns a msgID for the preset type.
    If 'value' = 2 only returns a msgID if there is a clipboard entry for that type.
    Copy 0 16 Copies the selected preset to file, or to clipboard if no name given.
    Paste 0,1 32 Pastes in the selected preset from file, or from clipboard if no name given.
    If 'value' = 1 deletes the selected preset.
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/Sections/vector.html000066400000000000000000000121041506652756400252000ustar00rootroot00000000000000 Vectors
    VECTOR::control:: + value control part /
    section
    kit engine insert parameter
    base ch
    offset miscmsg Description
    name ~ ~ 8 192 255 255 255 0~15 255 msg No. Set displayed name
    Xcontroller 14~119 16 192 255 255 255 0~15 255 255 X controller CC
    XleftInstrument 0~127 17 192 255 255 255 0~15 255 255 X left instument
    XrightInstrument 0~127 18 192 255 255 255 0~15 255 255 X right instrument
    Xfeature0 0,1 19 192 255 255 255 0~15 255 255 X feature 0 -- off/on
    Or read all X features
    Xfeature1 0~2 20 192 255 255 255 0~15 255 255 X feature 1 -- off/on/reverse
    Xfeature2 0~2 21 192 255 255 255 0~15 255 255 X feature 2 -- off/on/reverse
    Xfeature3 0~2 22 192 255 255 255 0~15 255 255 X feature 3 -- off/on/reverse
    Ycontroller 14~119 32 192 255 255 255 0~15 255 255 Y controller CC
    YupInstrument 0~127 33 192 255 255 255 0~15 255 255 Y up instrument
    YdownInstrument 0~127 34 192 255 255 255 0~15 255 255 Y down instrument
    Yfeature0 0,1 35 192 255 255 255 0~15 255 255 Y feature 0 -- off/on
    Or read all Yfeatures
    Yfeature1 0~2 36 192 255 255 255 0~15 255 255 Y feature 1 -- off/on/reverse
    Yfeature2 0~2 37 192 255 255 255 0~15 255 255 Y feature 2 -- off/on/reverse
    Yfeature3 0~2 38 192 255 255 255 0~15 255 255 Y feature 3 -- off/on/reverse
    erase ~ ~ 96 192 255 255 255 0~15
    > 15
    255 255 Clear vector (base ch), > 15 clear all
    yoshimi-2.3.5.1/dev_notes/Yoshimi Control Data/index.html000066400000000000000000000050151506652756400232210ustar00rootroot00000000000000 Yoshimi Control Ranges This work is licensed under a
    Creative Commons Attribution-ShareAlike 4.0 International License.

    Note: Although command parameters show their numeric values, they are nearly always referenced by labels defined in globals.h and may be changed in future.

    Yoshimi Control Numbers V2.3.4

    Top Level Controls

    Window Display

    Configuration Controls

    Main Controls

    Bank Controls

    Part Controls

    AddSynth Controls

    AddVoice Controls

    SubSynth Controls

    PadSynth Controls

    LFO Controls

    Filter Controls

    Envelope Controls

    Oscillator (waveform) Controls

    Resonance Controls

    Effects Controls

    Vector Controls

    Scales (microtonal) Controls

    MIDI-learn Controls

    MIDI (incoming) Controls

    yoshimi-2.3.5.1/dev_notes/Yoshimi_Policies.txt000066400000000000000000000070551506652756400213670ustar00rootroot00000000000000Updated 28/12/24 Yes! We actually have Yoshimi code policies. Look how many there are :) If the version string contains a 4th number this will always be just a bugfix. Previously it was intended that it should not have features added since the main version, but this has proved to be impractical, so now we just won't tell anyone about them till the next release :P e.g yoshimi-1.3.5 {main version} yoshimi-1.3.5.1 {first bugfix} yoshimi-1.3.5.2 {second bugfix} surely not! To avoid possible confusion, from now on 'master' will display the last released version number (including bugfix digits) with an 'M' suffix - unless it is a release candidate in which case the suffix will be rc{n}. e.g. Release was yoshimi-1.3.5.2 master was shown as yoshimi-1.3.5.2 M xml files created with this will have: Major version 1 Minor version 3 Release version 5 We now implement a build number. This is only bumped up when I push new commits to master (both github and sourceforge) so may represent several actual commits. We won't normally accept fixes for spelling errors in the *code* For a start, from bitter experience it is fatally easy to change two variables to the same name! Also, there's no point, after all they are only a mnemonic for memory addresses etc. 'volume' and 'LFO' could just as well be 'bigerizer' and 'derfingwotwiggles'. We do however accept some name changes where the original name is ambiguous or no longer appropriate. Some of these errors are in the identifier names in the saved XML files, and have been there since ZynAddSubFX Version 2.2.1 THESE MUST NEVER CHANGE. To change them would break all the instrument files that have been created since then. If using Fluid to edit GUI files, please close all windows and collapse all menus *before* the last save. I know it's tedious, but it avoids storms of spurious 'changes' that make genuine ones harder to see. Please follow the coding style throughout Yoshimi. In particular: Indentation 4 spaces (no tabs) Braces on their own lines. Also, try to avoid creating trailing whitespace. Code change information is available in the changelog, and also from the repository itself. There seems to be no easy way to copy commit messages to the changelog, and people downloading releases won't see them, so please update this using the following as an example. 2017-8-30 Will BugFix: Disabling a part was resetting all controllers. Doc updates. Sys/Ins effect controls now transferred to lock free. But could be improved. Indented lines are continuations/extra info keeping the line length short, and may be expanded on in commit messages. Alternatively, please send me a brief description to include when I next update. ACKNOWLEDGEMENTS The ones that appear in the GUI 'About->More' lists are those who have either made very significant improvements, or have consistently helped in various ways. Some them go back to the start of the Yoshimi fork. The list in the 'Yoshimi_Helpers' file in 'docs' is of everyone I know about, some of which may only have made a few small suggestions or bug reports. FILE COPYRIGHTS Always a tricky one :( If you're the first person to make a contribution that year, then by all means add a new line (in the same style as the rest) with your name. If you're the second person, feel free to add yours. However once the list starts to extend I may make an 'executive' decision and change this to "{first name}, and others" but only after ensuring that all names are in 'Yoshimi_Helpers'. If you think you've been unfairly treated contact me and we'll discuss it. willgodfrey@musically.me.uk yoshimi-2.3.5.1/dev_notes/Yoshimi_Timeline.txt000066400000000000000000000002761506652756400213640ustar00rootroot000000000000002009 Yoshimi forked from ZynAddSubFX by Alan Calvert. Officially acknowledged on September 1st. 2011 Maintenance taken over by Jeremy Jongpier. 2013 Maintenance passed on to Will Godfrey. yoshimi-2.3.5.1/dev_notes/switches_and_flags.txt000066400000000000000000000034301506652756400217370ustar00rootroot00000000000000Details of some of the internal controls. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ partonoffLock(int npart, int what) A semaphore locked version of: partonoffWrite((int npart, int what) This sets or clears a part's status in one of 4 ways depending on the value of 'what'. Zero will always turn the part off, and 1 will always turn it on. -1 moves it toward off and 2 moves it towards on. The rationale here is that if a part status is unknown to a function, but it wants to perform an operation that needs the part to be off, but then wants to restore it to its original condition, it first uses -1. If it was already off it makes no difference, but if it was on it is now turned off. Once the operation has been completed it uses 2 to restore the original state, so if it was off, it still is, but if it was on it is now on again. The internal value will become progressively more negative as processes use -2 but will never become greater than +1 for 'on' If you want to set its state regardless of the previous setting (such as switching by a user) you use 0 and 1. partonoffRead(int npart) This returns the part's current status as either 0 or 1. Be aware that the audio loop takes a copy of each part's state at the beginning of a period, and then uses that for all operations within that period, so any changes to partonoff will be ignored until the next period. This ensures there can be no inconsistencies. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Audio system muting during critical operations is handled by a single atomic variable 'audioOut' This will be one of: muteState::Idle muteState::Pending muteState::Fading muteState::Active muteState::Complete muteState::Request muteState::Immediate ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ yoshimi-2.3.5.1/dev_notes/z-Release_Code_Names.txt000066400000000000000000000007511506652756400220170ustar00rootroot00000000000000Mostly songbirds and often with an added byline :) 1.3.8 The Swan 1.3.9 Skylark 1.4.0 Diamond Dove 1.4.1 Lyrebird 1.5.0 The Robin 1.5.1 Jenny Wren 1.5.2 Goldfinch 1.5.3 Swift 1.5.4 Blackbird 1.5.5 Mistle Thrush 1.5.6 Fieldfare 1.5.7 Nightingale 1.5.8 Kingfisher 1.5.9 Sparrow 1.5.10 Redwing 1.5.11 Waxwing Only doing the more signifiant releases from here on. 1.6.0 Reed Warbler 1.7.0 Pipit 2.0 Northern Cardinal 2.1.0 Marsh Warbler 2.2.0 Blackcap 2.3.0 Painted Bunting yoshimi-2.3.5.1/doc/000077500000000000000000000000001506652756400141265ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/1stReadMe.txt000066400000000000000000000011061506652756400164520ustar00rootroot00000000000000These files are loosely organised info. Some of these have now been turned into proper documentation in the Yoshimi User Guide, and with more detail, in the Advanced User Manual. Such files will eventually be moved into histories, and no longer be updated. Any additional notes are more than welcome. If you like, you can send them to me at: abrolag@users.sourceforge.net For the sake of completeness in the 'Histories' directory there is some info on ZynAddSubFx from its beginning up to the time of the Yoshimi fork. Other information is being placed there from time to time. yoshimi-2.3.5.1/doc/Colour_Themes.txt000066400000000000000000000044041506652756400174410ustar00rootroot00000000000000With the latest builds there is a new tab in 'settings' called 'Theme' which enables you to manage any new colour themes you might like. The list will initially have two entries 'classic' and 'demo'. These will be located in /home/{user}/.local/share/yoshimi/themes. Additionally 'demo' will appear in examples. 'classic' is a reference file which you can copy and use as a starting point for any new ones you may want to create, while 'demo' is a rather extreme example of what can be achieved. Clicking on any theme in the list will immediately apply it to all currently visible windows, and to any others as they are opened. The 'Import Theme' button uses the standard filer to load new themes into the themes directory. These are not applied immediately but will appear in the list next time the window is refreshed. Any time you chose a different theme to the one listed as default, the box identifying the one now in use will become active, along with the button for making it the default. The themes are plain text files with a list of colour numbers and brief descriptive text. The colour entries can be either R,G,B format or hexadecimal #rrggbb. There must be no spaces within the colours themselves. If there are any errors, the line number of the first offending entry will be reported in the console window. When creating a new theme you are strongly advised to set your greyscale first, as most of the other entries will be affected by this. You can reverse the grey values so that highlights become shadows and vice-versa, and entries with a grey element will also swap light to dark. The demo file sets this as 0,120, and changing it to 120,0, gives a very dark theme. To set up a new theme quickly, load the default one into any text editor. Make your first changes and save the file to a new name in {user}/.local/share/yoshimi/themes, but keep it open. This will appear in the 'Themes@ window. On seeing the change Yoshimi will recognise it so you can select and immediately test it. When you make further changes the display will be immediately updated. Finally, the 'classic' file is a copy of the internally generated one and is never itself used. If it is missing it will be regenerated. Similarly the demo file is a copy of the one in Examples and will be re-copied if missing. yoshimi-2.3.5.1/doc/Formant_Filter000066400000000000000000000022451506652756400167670ustar00rootroot00000000000000All six vowels are always available, and from the main filter window a preset stores all of them, their formants and the sequence information. When actually in the formant editing window itself you only store the formants of the currently selected vowel as a preset. No other data at all. Even though you may only have three or four formants per vowel enabled and active, Yoshimi will store (and recover) all twelve possible formants per vowel. Initially formants have fairly random settings for 'Freq' 'Q' and 'Amp', but once saved these values become fixed. Only the number of vowels selected will be active. This is complicated by the fact that the sequence doesn't have to be of any specific vowels in any particular order. For example; if you have a sequence size of three vowels then these could be 5, 1, 3 in that order, or even 4, 2, 4. Yes, the same vowel can be used in two places. Another trap for the unwary is that you can still edit vowels that are not currently in use... and wonder why nothing seems to change. There is now a warning of this in the form of a redish patch that appears behind the vowel number if it's not in use, i.e. not seen in any sequence position. yoshimi-2.3.5.1/doc/Formant_Filter_Design.txt000066400000000000000000000023601506652756400210740ustar00rootroot00000000000000The easiest way to understand the formants/vowels is to imagine at the first that each vowel contains a single formant. In that case each vowel consist in sequence of band-pass filters (with Q/frequency/amplitude). These vowels are arranged on a line and the space between them is controlled by the "Strch" (lower right). This sequence could be used to create some simple words and the current position in that line is controlled by the filter LFO/Envelope. So for example, you can define two vowels like: "vowel_1" which has the formant at 1000Hz and the "vowel_2" with the formant at 2000Hz which will define a simple raising envelope. You should get a sliding bandpass filter between these (eg: you get a bandpass filter which rises in the frequency from 1000Hz to 2000Hz). If you define a second formant (you set "Num formants") to 2, each vowel will get another formant. The sound is processed using the first formant (like in the above example) and is added to the sound processed using the second formant. The formants are bandpass filters in parallel. I preferred for a vowel to have several formant (raher than the other way around) because I've arranged the data according to the high level of abstraction (that the vowel contains several formants). yoshimi-2.3.5.1/doc/Formant_Filter_Extension.txt000066400000000000000000000024531506652756400216420ustar00rootroot00000000000000If you open this window, you see a graph with the controls alongside. What you can now do is control some of these by placing your mouse pointer over the yellow lines representing each formant. Hold down the left or right mouse buttons and move it sideways and you'll change the formant's centre frequency. Left button down and moving vertically will change the amplitude. Right button down and moving vertically changes the formant's Q factor. Anywhere on the graph, the scroll wheel changes the octave range, and holding down Shift at the same time changes the centre frequency. So now you can control most of these one-handed, quickly, while also playing on the keyboard. If your mouse has the extra buttons on the sides (mine hasn't) you can also use these to switch between the formats instead of moving the mouse across to the next one. While making these changes you'll see the respective knobs/sliders moving too, and these are still full functional. A detail that some people haven't noticed is that, uniquely, there is no 'default' value for formant frequency. This will be set quite randomly, but once saved, will be fixed like all the other controls. Finally, remember that for the formant filter to take effect you must set an envelope too, as it is that that traverses the vowels and their formants. yoshimi-2.3.5.1/doc/Histories/000077500000000000000000000000001506652756400160775ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/Histories/ALSA_Setup.txt000066400000000000000000000015201506652756400205360ustar00rootroot00000000000000To be able to reliably use ALSA audio you need to set a card name, not just "Default" In a terminal window enter: cat /proc/asound/card*/id You should get something like: PCH K6 Go into Yoshimi->Settings->Alsa and in Alsa Audio Device enter (say) hw:PCH This ensures you will always connect to this card at startup regardless of the order of this and other ones. Another benefit of doing this is that ALSA will now use Yoshimi's internal buffer size, otherwise it will force Yoshimi to accept its default size. You can also set the sample rate - bear in mind that not all cards can use all of these but 44100 and 48000 are almost always available. If you set a MIDI device as well (such as a keyboard) Yoshimi will try to find and connect to this at startup. To find your MIDI devices try: cat /proc/asound/seq/clients or: aconnect --list yoshimi-2.3.5.1/doc/Histories/AddSynthModulation.txt000066400000000000000000000011101506652756400224030ustar00rootroot00000000000000 Some people have been confused about how to use an 'external' Mod Oscillator, so here is an example: Open the adsynth editing window and show voice parameters. For 'Type' set Ring this will activate the mod oscillator. Click on 'Waveform' and set the waveshape to triangle. Now switch to voice number 2 and enable it. Again select type as Ring (or any of the others). You can now use internal for this voice or select Mod. 1 Change the internal one to, say Square Rinse and repeat for voice 3, and you will find you can use its internal or either of the two previous ones. yoshimi-2.3.5.1/doc/Histories/Aftertouch.txt000066400000000000000000000025151506652756400207470ustar00rootroot00000000000000This is a new pair of features. Both Channel and Key pressure are supported. It is accessed from the part 'Controllers' window where there is now a button marked 'Aftertouch'. This will open another new window. The effects that can currently be set are: Filter Cutoff Filter Q Pitch Bend Modulation You can set any combination of these and can have both channel and key types active, but not both with the same effect. Filter Cutoff and Filter Q are relative to the current setting, so if they is already set at maximum they will have no effect. These normally increase the frequency/Q, but if you set 'Down' they work in the opposite direction. The Pitch Bend effect normally goes upward with increasing pressure, but if you set 'Down' it instead works in the opposite direction. It assumes a starting value of zero, so would act abruptly if you are using the physical pitch bend control. Similarly, Modulation assumes the physical control is at zero. Its range is from zero to the setting of the part's frequency LFO Depth. These controls are set per part, but are actually per channel. The physical aftertouch action will affect all parts on that channel, but the effects can be different for each part (or remain off). These controls can both still be overridden by MIDI-learn. Like NRPNs, by default these will be set to block normal operation. yoshimi-2.3.5.1/doc/Histories/Banks.txt000066400000000000000000000101231506652756400176730ustar00rootroot00000000000000You no longer have the concept of a default root directory, but a current one. This can by changed at any time without requiring a re-start, so there is no longer a need to display the (confusing) contents of all roots. Also, roots now have ID numbers associated with them, but no changes have been made to the actual directores to achieve this. Instead the IDs are stored in a config file. The same ID system is used for banks, again without making any file system changes. At first run (and whenever new root directories are set) unknown roots and banks are given these IDs. Once set they will not change no matter how many more roots and banks are later added. You can however, manually change root directory IDs in the 'Bank Root Paths window' accessible from the 'Paths' item in the main window. Also, there is a new Banks window so that these can be set up, moved and renamed in exactly the same way as instruments can. With these IDs, roots and banks can be grouped/ordered by function instead of alphabetically. When using the GUI you will always know exactly which root and bank you fetch an instrument from. You can quickly step between roots, banks and instruments with the so marked buttons in each of these, and if you right-click on them you will close one window as you open the other. The significance of all this is that your MIDI sequencer can now reliably use these ID numbers to select roots, banks and (already available) instruments. That Rosegarden or Muse file you save today will be just as valid in the future, unless you make the deliberate choice to change some IDs. Indeed, you can now start with an 'empty' Yoshimi, and via MIDI, set roots, banks and load instruments into parts (enabling the parts as you do so) swapping banks and roots as necessary. While the MIDI file runs it can silently pull instruments from any root/bank into any non-sounding part without disturbing the playing ones. In Yoshimi->Settings->MIDI you can enable or disable all these features, and can define which CCs you want to use. Bank can be either MSB or LSB (as before). Root can be any non-reserved CC but including the one not in use for Bank. Also, Extended Program Change now has the same restrictions as Root, and these three are all cross-checked against each other. As an example you might set Bank to LSB amd Root to 0 (MSB), effectively giving you extended bank control compatible with all sequencers. Also, different instances have their own config files so that you can have (say) the main instance with current root(9), bank(23) while instance 4 has current root(2), bank(6). You can call up instances by number and thus access saved settings for that instance. As each instance has its own MIDI and audio ports, they can behave more-or-less independently. In doing all of this we have completely changed the way we manage the structure internally, resulting in much greater efficiency, at the cost of only a slightly slower startup. Swapping roots performs *no* file operations. Swapping banks only fetches the directory list of the newly selected bank. Changing an instrument doesn't have to search for a file, only load from its already known location. If you change a bank root path, either through the gui or via MIDI, it will always reset the current bank to the lowest numbered one it can find. This is because there may not be a bank in the new root with the same ID, and even if there is, there is no guarantee that it will have the same name or contents. Also if an attempt is made to reload the same root, nothing will actually happen. The same is true of banks. Both of these are kept fully up-to-date so there would be no point. However, reloading the same *instrument* will be performed every time, as you may have changed what is currently loaded without saving it. This provides an effective 'restore' operation. Finally, it is generally advisable to make root and bank changes on channel 1 so that you can more easily keep track of them. However they are not channel sensitive as they don't directly affect the sound, so you can set them in any convenient channel then perform individual program changes on the desired channels. yoshimi-2.3.5.1/doc/Histories/Banks_Presets_Update.txt000066400000000000000000000056061506652756400227140ustar00rootroot00000000000000Banks and Presets update Initially, existing users should see no difference, apart from a slightly quicker startup if they have a very large number of banks and roots. New users will see all the bank roots that Yoshimi can find, and this will include "$HOME/.local/share/yoshimi/found/" with "yoshimi/banks" and/or "zynaddsubfx/banks" if these are found in the default locations. Unlike the actual defaults, these will be editable. After first being copied they are NOT kept up to date if any default ones are added to. This is to protect any that you may have changed. This is also the case for existing users the first time they see the new format, but these roots will not be shown in the roots list. Instead there will be a message informing you of this, and inviting you to A: add them to the Path, B: not add them, C: ask again later. For all users if any banks get added or removed by external means this will be reported, and the associated bank roots updated in the master file accordingly *without* disrupting any other banks and roots. Previously if new banks were seen as added externally the bank structure was regenerated, resulting in bank IDs changing - this could have broken old MIDI files that performed bank changes. There is a really strange anomaly where phantom empty banks sometimes get added to the first and/or the last bank root in the list. These are always at bank ID 0 - which should be impossible! Work rounds have been created to hide these (and not include them when the master file is saved), but still report them to the CLI. Also there is nothing to stop you adding real ones at these locations. We don't recommend it as many sequencers try to set root and bank zero with every program change unless you keep resetting them yourself. This is a ridiculous waste of bandwidth and is *not* a requirement in the MIDI spec. Yoshimi reports, but ignores unrecognised locations. Repeat calls to the same ones are reported as done, but ignored. The complete routes to add these editable 'defaults' manually are: $HOME/.local/share/yoshimi/found/yoshimi/banks $HOME/.local/share/yoshimi/found/zynaddsubfx/banks Further to this, at one time some distributions either didn't include the default banks of instruments, or put them in unusual locations, so yoshimi didn't find them on a first time startup. It's not known if this still happens, but if Yoshimi can't find any it will still create the "$HOME/.local/share/yoshimi/found/yoshimi/banks" root with the ID of 5. It will then go on to create a bank "newBank" also with an ID of 5, and in this it will create a SubSynth instrument called "First Instrument" with a prefix of "0005-". There is also a new editable presets directory: $HOME/.local/share/yoshimi/presets This has been derived in the same way, but in this case we haven't included zyn ones, as they've changed most of the filenames, and we've no idea if they've changed anything internally :( yoshimi-2.3.5.1/doc/Histories/Channel_Switcher.txt000066400000000000000000000052231506652756400220620ustar00rootroot00000000000000This enables you to seem to instantly change just one part only to a specific channel while alowing others that were on that channel to only accept a note-off. The command takes two forms. See "Solo.txt" for GUI use. In the first form all 16 normally accessible parts will be changed to channel 1 but only one at a time is active, the others have their channel number set as 17 to only accept note-off. The value of this is that, as you are not actually switching parts on and off, there are no clicks and no messed up note release tails, yet with a pretty standard MIDI controller you can instantly switch between 16 totally different sounds *while* *actually* *playing*. The second form is more directed to post recording automation where (using all 64 parts) you have a base channel number and a group of 4 parts that reference it. Again, only one part at a time is active, the others have their channel number set to only accept note-off. However you can have up to four parts responding to just one channel, and it can be any of the 16 available MIDI channels. You will, of course, need to load up and activate all your wanted instruments patches - either manually or via root/bank & program change commands in your MIDI file. You can only have one of these two forms at a time, which can be set in the GUI Mixer window or from both the CLI and via shortform NRPNs. You use these to assign a specific CC as the switch. NRPN setup. For the first form (single row) set MSB to 65 and LSB to the controller you want to use to perform the actual changes. Sending values 0 to 15 on that controller will enable that numered part for recieving new notes while all the others will only see note-offs. An extra twist is that if you have any vectors defined these will behave correctly when that particular base channel is selected. There is a variation of this whereby sending any value (except zero) on the designated controller will simply increment the active part number, looping round back through zero when it reaches 16. For this you need the MSB to be set to 67. For the column based form set MSB to 66 and LSB to the controller you want to use. So, if your part number is, say 35, your base channel is 3. Using your controller to send this will set part 35 to receive channel 3 and parts 3, 19 & 51 to unavailable channel 19, so they will only accept note off commands from channel 3. Although this only gives you a selection of 4 parts, this is *per* *channel* so if your processor is powerful enough you can utilise all 64 possible parts. Current settings are stored with patch sets. Note: NRPN numbers start from zero, but will be displayed on the GUI or in the CLI starting from 1. yoshimi-2.3.5.1/doc/Histories/Command_Line.txt000066400000000000000000000071561506652756400211760ustar00rootroot00000000000000When running from the command line, once the 'up and running' message has been seen much of Yoshimi can be controlled here. Commands are not case sensitive and an invalid one will return a message that attempts to highlight the problem. There are a group of commands that are always available. These are ? (Help) List RESet EXit .. / Apart from these, the command line works on a system of context levels, and normally only the commands relevant to that level will be available. Often you only need the first letter of a command - as long as it is unabiguous. The above examples show their minimum abbreviations in capitals. However, Yoshimi is quite pedantic, and if you type the command in full it must be exactly correct! All number ranges follow the same pattern as the GUI. Most (but not all) start from one. e.g. The first part number is 1, but the first bank is 0. The prompt will always show what level you are on along with relevant information. You will also get a confirmation message after each command, but - for clarity - those are not included in the examples below. Starting from the prompt: yoshimi > Enter: "s p 2 pr 107" and the prompt will change to: yoshimi part 2+ > This will set part number 2 to program number 107 from the current instrument bank. You are now on part 2 as the current part and all commands will now relate to this. At this level you can change the current part simply with: "s 4" yoshimi part 4 > You are now on part number 4, but that part is currently disabled. Most of the controls are now checked to ensure they are active when you try to change them, so enable the part. "s on" yoshimi part 4+ > "s ef re" yoshimi p4+ eff 1 REverb-0 > Sets the part's effect 1 to type 'reverb' Notice the two capitals in reverb, these remind you of the minimum abbreviation. Many settings are optional and if you omit them, either a default, or last used, value will be assumed. Also names are sometimes truncated so the prompt line doesn't get unmanageably long. From here you can set a preset for this effect: "s pre 3" yoshimi p4+ eff 1 REverb-3 > Currently the presets are shown only numerically in the prompt. This is because most of them include the name of the effect so it would be tedious to type them in. From the top level, many settings that follow in a direct line through several levels can be made all at once and you will be left at the appropriate level: "s p 5 ef 2" yoshimi p5+ eff 2 REverb-1 > You can't combine type and preset as they are both at the same level. To go back one level: ".." yoshimi part 5+> and to go back to the top: "/" yoshimi > These last can also be put on the front of any other command. Starting where we were before: yoshimi p4+ eff 2 REver-3 > " ..s vol 70" yoshimi part 4+> Part 4 volume is now at 70, and you are once again at part level, not part efx level. The help menus and lists are also mostly context sensitive. This should help avoid clutter and confusion. Originally these notes included the currently implemented commands, but as this is very much a moving target, it is simpler to just ask you to run Yoshimi and type "?" Commands with '*' in the description need the setup to be saved, and Yoshimi restarted to be activated. A few more may be added, and the organisation of them may be changed slightly. If any configuration settings are changed, either here or in the gui, you will be given a warning when you exit, with the option to continue running so you can save the changes. As well as a 'last used' history, Yoshimi maintains a command history file, so provided you make a normal command line exit your last commands will be available on your next run. yoshimi-2.3.5.1/doc/Histories/Command_line_Config_Roots_Banks.txt000066400000000000000000000017411506652756400250210ustar00rootroot00000000000000On first run of Yoshimi there is one config path per user regardless of how yoshimi is obtained, and it is: /home/{user}/.config/yoshimi/ A distro install will have one default bank root at: /usr/share/yoshimi/banks/ It will usually be given an ID of 5. A self build and install will have two default bank roots: /usr/share/local/yoshimi/banks/ /home/{user}/{buildpath}/banks/ Adding new roots is a two stage process. First you use your normal filer controls to create the root (or import one from somewhere) /home/{user}/newroot/banks/ It doesn't actually have to be banks, but traditionally we've always done this. Next, in Yoshimi: add r /home/{user}/newroot/banks/ It will report the ID it gave, but won't actually make it current. Later you can change this ID between 0 and 127 provided it isn't already in use. We don't recommend ID 0 as some sequencers try to change to this on every program change. Yoshimi will not respond to unused IDs and never changes them by itself. yoshimi-2.3.5.1/doc/Histories/Direct_Part_Control.txt000066400000000000000000000016641506652756400225470ustar00rootroot00000000000000Using NRPNs Yoshi can now directly set some part values regardless of what channel that part is connected to. Set NRPN MSB = 64 {same as for vectors}, LSB = 0 [8128] then (all value ranges start from zero, not 1) Data MSB (6) 0 : data LSB = part number this obviously has to be set first 1 : data LSB = program number 2 : data LSB = controller number carried over between calls 3 : data LSB = controller value 4 : data LSB = part's channel number 16 - 31 only allows note off for this part > 31 disconnects the part from all channel messages 5 : data LSB = part's audio destination 1 = main L&R 2 = direct L&R 3 = both all other values ignored 64 (0x40) : data LSB = key shift value 64 = no shift Other values currently ignored. yoshimi-2.3.5.1/doc/Histories/Instrument_Kits.txt000066400000000000000000000017141506652756400220050ustar00rootroot00000000000000The two items under the kit list are described below. Mode: 'Off' means no kit is enabled, so you only have the Add, Sub, and Pad sounds in the Instrument Edit window. 'Multi' means all the kit items will sound together regardless of their note ranges. 'Single' means only the lowest numbered item will sound in a given note range. There will be no overlap. e.g. Item 3 has Min.k set to 0 and Max.k set to 60 Item 4 has Min.k set to 40 and Max.k set to 127 In single mode, only Item 3 will sound in the note range 0 to 60 and Item 4 will sound in the range 61 to 127. In multi mode, only Item 3 will sound in the range 0 to 40, both items will sound from 41 to 60, and only Item 4 will sound from 61 to 127. There is now a new mode called 'Crossfade' described in detail in: /doc/Part_Kit_Crossfade.txt Drum mode: If this is set then microtonal tuning is ignored for this kit, otherwise it could make drum sounds very unpredictable! Also, Legato mode is disabled. yoshimi-2.3.5.1/doc/Histories/Jack_Audio_Destination.txt000066400000000000000000000023411506652756400231720ustar00rootroot00000000000000When using Jack, Yoshimi can make individual parts available, either by themselves, or working with the main Left and Right outputs at the same time. The individual part outputs will have the part effects, and any insertion effects that are linked to them, but not the system effects. We used to register all parts with jack by default, but that got a bit silly once we had 64 parts available, so we changed to an 'on demand' model. If you open the mixer panel window you'll see a field just above the Edit button. This determines the audio destination on a part-by-part basis, defaulting to just the main L+R pair. The direct part outputs are only exposed on parts that are active, and have the destination set to either 'part' or 'both'. Once activated they will remain in place for the entire session, even if the part is later disabled or routed to main only. This is so that other programs won't see links suddenly disappear - although they will become silent. This setting is preserved in Yoshimi's patch sets and will be re-instated when next loaded. As of Yoshimi 1.4.0, in the Jack settings tab there is a new checkbox for auto-connecting the main L & R outputs. With this set there is no longer a need to set it manually on startup. yoshimi-2.3.5.1/doc/Histories/Kit_Mode_Access.txt000066400000000000000000000013621506652756400216160ustar00rootroot00000000000000 You must set kit mode before attempting to change any kit items. We'll set it to 'multi'. direct 1 64 58 0 Kit item 0 is always enabled, although you can mute it and enable/disable the individual engines. To be clear though, we'll enable kit item 4 and work with that. For kit controls we set 'insert' to 32. This means we also need to set the intermediate 'engine' value to 255 for some controls. direct 1 64 8 0 4 255 32 And set its minimum note. direct 56 64 16 0 4 255 32 Then enable the subsynth engine. direct 1 64 8 0 4 1 32 And now change its volume. direct 40 64 0 0 4 1 Note: You only use 32 for the kit item commands, not the engine internal commands. *** This is no longer available as we've disabled direct CLI access *** yoshimi-2.3.5.1/doc/Histories/MIDI.txt000066400000000000000000000033141506652756400173630ustar00rootroot00000000000000Yoshimi responds to the following messages. 0 or 32: Bank Change (user selectable and does *not* force a program change) 1: Modulation Wheel 2: Breath Control 6: Data MSB 7: Volume 10: Panning 11: Expression 38: Data LSB 64: Sustain pedal 65: Portamento 68: Legato pedal 71: Filter Q (Sound Timbre) 74: Filter Cutoff (Brightness) 75: BandWidth * 76: FM amplitude * 77: Resonance Center Frequency * 78: Resonance Bandwith * 96: Data Increment 97: Data Decrement 98: NRPN LSB 99: NRPN MSB 120: All Sounds OFF 121: Reset All Controllers 123: All Notes OFF * different to the official GM spec. Program Change (voices 1 - 128) also user selectable CC for voices 128 - 160 There is also an option for making Program Change enable a part if it's currently disabled. Key pressure (aftertouch) is internally translated as CC 642 but currently implemented as channel pressure. Channel pressure is internally translated as CC 641 and is accessed by MIDI learn further translated as CC 129. Pitch Bend is internally translated as CC 640 and is accessed by MIDI learn further translated as CC 128. The modulation wheel only affects AddSynth and PadSynth, and then only the frequency LFO depth. Just to make it more confusing, it changes the level from 0 up to it's current (gui) setting only. Therefore if the LFO depth is set to zero the Mod Wheel will have no effect. User selectable CC for Bank Root Path change. For more details of bank changes see Banks.txt Instruments inside banks should always have four digits followed by a hyphen. Otherwise the results can be rather uinpredicatable. Further details on NRPNs are in Using_NRPNs.txt *** UPDATE *** Key pressure is now recognised uniquely for aftertouch. yoshimi-2.3.5.1/doc/Histories/MIDI_Learn.txt000066400000000000000000000064701506652756400205120ustar00rootroot00000000000000This now completely implemented. To learn, hold Ctrl while right-clicking on any GUI control. There will be a pop-up window detailing the control you selected, or a message saying it's not learnable. You will also get a message in the console window (or CLI). After that, if you were learning, the first physical controller you move, or CC message you send will be locked, and you'll see the GUI knob or slider move in sympathy with the physical control. The pop-up window will also disappear. and the console message will be "Learned" and a line underneath with exactly what control was caught. If you now use the 'Yoshimi' drop-down menu and click on 'MIDI Learn' you will see a new editing window displaying your recently learned controller. Along with a number of settings, you'll see text with precise details of this complete action. There is also a config setting them makes the editing window appear whenever a new control is learned. If the controller you learned was an NRPN this will show as a hexadecimal number in the CC field, and this field will not be editable. As of V 1.5.2 there is a checkbox so that you can set this as a LSB only type (some hardware synths send these). There is also an 'activity' LED that flickers when the associated CC/channel is received, provided the line is not muted, or blocked by an earlier one. From version 1.5.2 some check-boxes, selectors and menus are learnable. These are identified by either a pale blue surround or pale blue buttons. Note that when learning a menu you have to actually make a choice while holding down the Ctrl key. There is currently a limit of 200 lines. Editor settings available: Incoming CC (not NRPNs). Incoming channel number. Minimum & Maximum incoming percentage values (if Min is greater than Max it reverses the control direction). If they are the same, then it becomes a threshold setting, and any incoming value below this will be regarded as 0, and an other value will be seen as 127. The range can either be in the style of a limiter or as compression. Blocking of all later actions on the same CC/channel pair (including system ones). Muting of this line - nullifying all of the above but keeping the capability. You can delete any existing line by holding down the 'CTRL' key and then clicking on the 'Control Function' text for that line. You will then be presented with a confirmation message giving the line number and the text as a reminder. The same CC/controller can be used to change several different internal Yoshimi controls. e.g. you can have a part's volume being changed while another part is having an effect level changed. Adding or deleting lines, or changing either CC or channel numbers may re-order the others. There is a button at the bottom of the window for clearing the entire learned list. A complete list can be saved by clicking on the 'save' button and you will get the usual file choser window. Loading sets follows the same practice. If a loaded set refers to Yoshimi controls that are disabled, or don't exist, such controls will be ignored and the 'Control Function' text will include a message to that effect. However the 'block feature will still be active unless the line is muted. Finally, there is a button for loading a set from the recent history. To come: Paging of the display so you don't end up scrolling through a massive list. yoshimi-2.3.5.1/doc/Histories/NRPN_System_Settings.txt000066400000000000000000000020631506652756400226420ustar00rootroot00000000000000If Yoshimi has been started from the command line, all of the system setting that don't require a restart can now be viewed by sending the appropriate NRPN. Most of them can also be changed in this way. Please also refer to command line. To access this, set NRPN MSB (CC 99) to 64 and NRPN LSB (CC 98) to 2 [8130] After that send the following DATA values. DATA MSB (6) LSB (38) 2 key Set master key shift {28 to 100} (equivalent to -36 to + 36) 7 volume Set master Volume {volume} 64 - 79 key Set channel based (key - 64) key shift 80 root Set CC to control Root path change {root > 119 disables} 81 bank Set CC to control Bank change {bank > 119 disables} 82 > 63 Enable Program change otherwise disable 83 > 63 Enable activation of part when program changed 84 extprog Set CC control Extended program change {extprog > 119 disables} 85 parts Set number of available parts {parts = 16, 32 or 64} 86 0 Save all dynamic settings yoshimi-2.3.5.1/doc/Histories/Output_Levels.txt000066400000000000000000000026061506652756400214560ustar00rootroot00000000000000Audio Output and Levels At the bottom of the main window there is a pair of horizontal grids representing a bargraph type display. The upper one is for the left hand channel and the lower one for the right hand one. The grid divisions each represent 1dB, and the brighter divisions are therefore 5dB. The thicker bright divisions therefore being 10dB. The overall scale range is -48dB to 0dB. As the output level rises pale blue strips will light up in these grids. These fast responding bars are the peak levels and should never be allowed to go above 0dB, otherwise the output is likely to be clipped and distorted. There is also a pair of boxes on the end of these grids which will show the highest peak level seen. If clipping has happened the box background will change from black to red. To clear clip and peak level indication click on this area. As well as the peak level, the display shows a much slower responding RMS level, as a yellow line on top of the blue bar. This gives and indication of the apparent accoustic power. If you open the mixer panel window you will see vertical bargraphs for each individual part. On these, the faint bars are 5dB steps and the bright ones 10dB. The peak level isn't shown numerically, but if you exceed 0dB a thick red line will appear at the top of the bargraph. This is also cleared from the box in the main window, or by clicking on these bargrphs. {more} yoshimi-2.3.5.1/doc/Histories/Part_Kit_Crossfade.txt000066400000000000000000000024341506652756400223510ustar00rootroot00000000000000 In 'Edit->Kit Edit' the part's kit edit 'Mode' menu has an extra entry called 'Crossfade'. When this is set, you get multi behaviour with overlapping key ranges but with a very smooth cross fade between sequential *pairs* of kit items. This follows the pattern 1+2, 3+4, etc. Each pair will not affect any other kit items. It doesn't matter which of the pair has the lower range, as long as there is a range overlap. The code is semi intelligent, and any that are not paired will exhibit normal multi behaviour. i.e. if one item in a pair is not enabled then the other one will exhibit normal multi behaviour and will not fade at all. An interesting effect is that if one of the pair is enabled, but muted or has no engines enabled, the other one still fades through the overlap range, so you can get sounds fading out (or fading in) with increasing pitch! If you want a fade to come in then go out again you need two sets of pairs, with a hard non-overlapped point in the middle. item 1 - min 0 max 60 item 2 - min 40 max 80 (fades up) item 3 - min 81 max 100 (fades down) item 4 - min 90 max 127 The feature is backward compatible, in that older versions of Yoshimi will see it as an ordinary multi - it uses a new variable stored in the instrument file that is simply ignored by earlier versions. yoshimi-2.3.5.1/doc/Histories/README.txt000066400000000000000000000111741506652756400176010ustar00rootroot00000000000000This motley little collection is a snapshot of an ongoing experiment exploring how to improve jack io in ZynAddSubFX. And anything else I feel like exploring. See INSTALL for instructions. Bon apetite. ------------ Changes 0.058.1 switch fftw planner flag from FFTW_MEASURE back to FFTW_ESTIMATE, enabling plinky-plank to load in realistic time 0.058 all the rc5 fixes but lose the debug code;welcome Jeremy Jongepier's Dubstep bass. 0.057.2-rc5 fix a deadlock on loading instruments using PADsynth. 0.057.2-rc4 more testing of issues. 0.057.2-rc3 Further adjustment to xml file reads. 0.057.2-chk2 Reinstate 0.057 interrupt fix. 0.057.2-chk1 Possible fix for intermittent instrument load failures. 0.057.1 Fix inverted reverb panning. 0.057 reinstate jack midi pitchbend fix (from circa 0.022???); incorporate Nedko's lazy signal response fix; check for sse availability, and step over things accordingly. 0.056 reinstates PADsynth functionality - a stuff up in XMLwrapper::getparbool(). 0.055.6 possibly fixes loading compressed xml. 0.055.5 Add airlynx/chip instruments. 0.055.4 Drop double buffer fltk init; add --no-gui 0.055.3 use the correct #include and move it from MasterUI.fl to GuiThreadUI.fl 0.055.2 add param file loaded from command line to params history. 0.055.1 check for (and require) alsa >= 1.0.17. 0.055 pre5 becomes 0.055, no change. 0.055-pre5 a jack midi bug fix; some subtle performance enhancers including slightly more granular locking. 0.055-pre4 gui ignition sequence adjusted. 0.055-pre3 a few gui fixes, maybe even fixed the gui startup issue; LADI 1 support seems ok. 0.055-pre2 shakes a fist at the gui startup failure; getopt replaced by argp. 0.055-pre1 shuffled the master gui display about a bit; LADI 1 support seems ok. 0.054.1 attitudinal adjustment to a few more pans. 0.054 a few things from pre4 fixed; ladi1 SIGUSR1 handler in place but still untested in ladish context; interrupt handler now handles rude interuptions better; instrument banks now shipped uncompressed; mostly harmless? 0.054-pre4 First cut LADI Level 1 compliance. Some new code, and quite a bit of old code moved around, so expect issues. 0.054-pre3 formed an alliance with the random_r family; dropped no gui option. 0.053.3 fix NUM_KIT_ITEMS, accidentally reduced 16 -> 3; improve handling of rtprio availability on thread creation; 0.053.2 set the priority of threads in accordance with jack's firm recommendation 0.054-pre2 fixed random error in randomness; more menu madness. 0.054-pre1 improved xmz file selection, including persistent history selection; prune some extraneous code; 0.053 no change from pre4 0.053-pre4 reinstate 'last bank' recall 0.053-pre3 sort out the oversights from recorder fixes:- settings corruption; stray mushroom clouds from recorder 0.053-pre2 utter rubbish 0.053-pre1 reverted to 0.045, and just added the sane stuff; recording should be fixed; missing ~/.yoshimiXML.cfg no longer a drama 0.046 to 0.051 should be considered as just unfortunate medical outcomes 0.045 use pthread for managing SCHED_FIFO on threads 0.044 add alsa period size & samplerate control, and auto-record 0.039 - 0.043 dismissed as unfortunate medical outcomes 0.038 re-fix load parameters, flush record buffer at appropriate times, and attempt to reduce xrun impact of private moments (patch changes etc) 2009-11-12 0.037 Yoshimi records 2009-011-11 0.036 Will J Godfrey's load parameter file fix 0.034 Somewhat experimental in nature, adult supervision recommended: use fftw threaded routines. 2009-10-24 0.031 restore some sanity to the metering (perhaps). 2009-10-23 0.030 unlink jack midi semaphore on Close(). 2009-10-21 0.029 put the red line back in formant filter graph. 2009-10-19 0.028 the theory that started it all is debunked - revoke the reincarnation of the "three tries for lock" theory. Hardcore jack it is then. 2009-10-17 0.027 fix a little (weeks old) noteon velocity glitch. 2009-10-16 0.025/0.026 a couple of little optimisations. 2009-10-15 0.024 fix (ie disable) right-click instrument rename from main panel. It doesn't work in 2.4.0 either, not worth the bother. 2009-10-14 0.023 fix jack midi pitchbend, update master panel instrument label on bank slot rename. 2009-10-14 0.022 more bank management fixes 2009-10-13 0.021 fix right click instrument rename and a couple of bank management issues. 2009-10-13 0.020 a private matter, not for public dissemination. 2009-10-13 0.019 add commandline param for client name tag: -N . 2009-10-09 0.018 tidy some "isshoos", and change alsa midi client name. 2009-10-08 yoshimi-2.3.5.1/doc/Histories/Scales.txt000066400000000000000000000031511506652756400200520ustar00rootroot00000000000000It is now possible to fully control scales from the CLI. For tunings, either ratios or floating point numbers can be entered. Ratios are in the form n1 / n2 to a maximum of normal integer range. If just a numerator is set it will be regarded as n/1. Floating point numbers *must* include the decimal point and at least one digit (or zero) either side. These will be padded out with leading and trailing zeros in the form nnnn.nnnnnn In keyboard maps, non-sounding notes should be entered as an 'x' instead of the key number. CLI tunings and keymaps are entered in CSV format. e.g. Tuning: 0076.049000, 0193.156860, 0310.264710, 5/4, 0503.421570, 0579.470570, 0696.578430, 25/16, 0889.735290, 1006.843140 1082.892140, 2/1 Keymap: 0, 1, 2, 3, x, 5, 6, 7, x, 9, 10, 11 The tuning/keymap sizes are generated internally by counting the number of entries in the strings. When saving scales, for floating point numbers we now include the text it was derived from. This has some accuracy benefits, but also reassures less experienced users, because the values they enter won't seem to change on re-loading. The stored value is still saved for backward compatibility with older versions of Yoshimi. Scale shift provides an offset to the scale start position, and only makes a difference if you have uneven interval sizes. Normally (for the even tempered scale) the scale starts on 'A', and as the intervals are all identical changing the octave start will make no difference. However, if you have (say) a 5 note pentatonic scale the intervals will be very different and the scale shift will effectively determine the key of the scale. yoshimi-2.3.5.1/doc/Histories/Selection_Structure.txt000066400000000000000000000064731506652756400226570ustar00rootroot00000000000000 Yoshimi very heavily uses switch statements, some of which are truly massive. This might raise some alarm when viewed but is quite deliberate. In order to make all of this accessible to developers a spreadsheet was built up at the same time. This is "dev_notes/Yoshimi Control Numbers.ods" and has details of every command currently implemented (and a few still being considered). The development has been very much an incremental process, initially with numerical entries and large gaps to create grouping, allow for changes, and give a clearer idea of the various structures. The intention was then to collapse all the gaps to give more efficient switch statements. However in the intervening time several CLI users have been using the direct access method to reach controls that were not yet available formally. Although this is now done, the actual values are being left as they are until (at least) the next release. This is further complicated by the fact that MIDI-learn references some of these numbers, and people will have saved such files. Therefore many of these will now remain fixed. However, now that command structure is pretty much settled, the numbers have been changed to global, yet isolated and meaningful names. e.g. namespace OSCILLATOR // usage OSCILLATOR::control::phaseRandomness { enum control : unsigned char { phaseRandomness = 0, magType, // Linear, -40dB, -60dB, -80dB, -100dB harmonicAmplitudeRandomness, harmonicRandomnessType, // None, Power, Sine ... ... and this translates to: switch (control) { case OSCILLATOR::control::phaseRandomness: ... ... The use of namespaces combined with typed enumerators not only gives clear compartmentalised identifiers, but also gives isolation between sections, protecting against name clashes. It is also still compatible with integers and unsigned chars without needing typecasting. This is important, as all these are passed through ring buffers using the central CommandBlock structure - which is now also defined here. Another point worth mentioning is that Yoshimi has different priorities for access to the structure based on the following reasoning: 1/ Don't handle data that's not actually wanted. 2/ Limits and defaults are static so can be read directly at any time with a cut-down version of the overall structure. e.g. all part level volume controls have the same max, min, and default, so no need to test part and kit numbers. Other reads may be wanted in bulk from time to time (such as updating a GUI when a new patch set is loaded) so should be as fast as possible, but at the same time must wait briefly if a parameter is being changed. Writes are the only thing that can make dynamic reads wait. This ensures these reads will *always* be seeing valid data. Writes are also much more complicated. In the first place, we have made them all serial and synchronous with the audio thread (if they were not already) so how do you realistically time something going through a ring buffer, interleaved with other 'somethings'? The final wrinkle with writes is that they don't always do what they seem to. Loading an instrument patch for example, just sets a flag to mute the part, then passes the data to a low priority thread. This can take its time updating the part (as nothing can now read it) and when complete, clear the flag again. yoshimi-2.3.5.1/doc/Histories/Shortform_NRPN.txt000066400000000000000000000012501506652756400214560ustar00rootroot00000000000000 Note: NRPN MSB is CC 99, and LSB is CC 98 A new concept is shortform NRPNs. This is where instead of the NRPN setting up for data entry of values, the NRPN is of itself the entire command. With a suitable sequencer like Rosegarden, you have just a two byte MSB/LSB value. The MSB is the actual command, and the LSB is the value. If you are using a sequencer that insists on a data pair as well, then just send any values - they will be ignored. There are only three of these defined so far, two are for silent channel switching of parts. See Channel_Switcher.txt for details. The third is for shutting Yoshimi down via MIDI and for this you set both MSB and LSB to 68 (0x44). yoshimi-2.3.5.1/doc/Histories/Solo.txt000066400000000000000000000064541506652756400175650ustar00rootroot00000000000000There are two commands that change the way Yoshimi responds to incoming MIDI so that only one of a group of instruments will get note-on events, but all of the group will see note-off ones. These are both in the Mixer Panel. The 'Solo' drop-down list enables the feature for either 'Row', 'Column', 'Loop' or 'Two Way' mode and also makes the CC spinbox visible. For these modes, if you have a programmable MIDI controller you can set it up to activate a specific part, or to increment/decrement which part in the set is active. You use the CC spinbox to set which incoming CC changes the part that gets new notes. The *value* this CC sends is what performs the actual change. It does this instantly and silently. Most importantly it leaves any existing notes sounding through a note off release and effects tail. In Row mode the whole of the first 16 parts are ostensibly receiving channel 1. This is most useful if you want to play live through a piece with multiple instrument changes while playing. It works best with a foot switch that internally stores a channel number and increments/decrements it with every press, then sends it. Although this uses all of the first 16 parts, you can set the number of parts to 32, and then you can use the 17+ row for normal 2 - 16 channels (you can't use ch 1 on this row as that would conflict). Also, if you have vector control set up, Solo intelligently recognises the fact. For each one it finds, it will switch in/out the whole vector column appropriately. Loop mode is a variation of this, and if set then sending any value except zero from the designated CC will increment the active part number up to 16 and then loop round to number 1 again. Zero is ignored so that a simple foot switch can be used. Only the press gets registered not the release. Two Way is similar to Loop, except if it sees a value between 1 and 63 it decrements the active part, looping round to number 16. Channel allows the user to Solo all parts set to a given channel. When activated only parts assigned to the desired channel will sound. Parts assigned to other channels will go silent. The channel of the incoming MIDI CC event determines the desired channel and the value determines On or Off. Such that a CC of 115 (default) with value greater than 63 on channel 1 will Solo all parts assigned to channel 1. A subsequent CC of 115 with value greater than 63 on channel 2 will switch the Solo to all parts on channel 2, and silence the parts on channel 1 in the process. Note that a CC of 115 with value 0 on ANY channel will deactivate the Solo on ALL channels. This allows for assigning an arbitrary number of parts to any channel and works with all 16 channels and all parts. This option is best used with a MIDI controller in OMNI mode that supports Latch mode CC buttons or footswitch and is suitable for both automation and live performance. For running Solo in Column mode you need to have 32 or (preferably) 64 parts set, like this you can have up to 4 parts switched per channel - independently of any other channel. However, this works more like vector control in that you have to switch in steps of 16. For example, to control the channel 4 column you would send 4, 20, 36, 52 to select the wanted part. This is more appropriate for post recording MIDI automation. The current Solo settings are stored in patch sets. yoshimi-2.3.5.1/doc/Histories/Using_More_Parts.txt000066400000000000000000000064301506652756400220630ustar00rootroot00000000000000Yoshimi can have up to 64 parts. By default these are wraped around the normal MIDI channels, so 1, 17, 33 & 49 all respond to channel 1 messages. This was originally implemented for Vector Control, working with up to four sounds on a channel (similar to the Yamaha SY hardware series). However, these have other less obvious uses. One of these is getting far more than 16 completely independent tracks addressed by just the 16 channels. Most tunes run with instruments having a relatively narrow pitch range, and this is what we can make use of. As an example, in Yoshimi's main window select 64 parts, then on part 1 set (say) Steel Bass and maximum note as 52 (E). Next select part 17 and enable it (easiest to use the mixer panel for this) set Tunnel Piano, the *minimum* note as 53 and maximum as 71 (B). Finally, enable part 33, set Rushes and set it's minimum note as 72, but key shift down an octave. With a 61 note keyboard that gives you quite a useful working range, on just one channel. However, the idea really comes into its own with a sequencer like Rosegarden where you can record multiple parts over the full MIDI range and track them to the same channel. Also, in Rosegarden the parts can be separately named, and identified as Bass and Treble in the notation editor. This makes it very convenient for those wanting a more formal musical layout. So, with very little effort you can now have 48 tracks playing at once! Ummm, you do need a decent processor though :) Yes, I know you could run more instances of Yoshimi on different MIDI ports, but where's the fun in that? Another possibility is getting really smooth transitions between different sounds on the same channel. If you use program change to do this, that part has to be muted, and there is a variable time lag (while the new part is loaded) before you can play any more notes on that channel. However, with 32 and 64 parts you can actually overlap notes with different instruments on a playing channel. This is done by pre-loading the wanted instruments, then switching channel numbers. If (via the direct part NRPN) you add 16 to a sounding part's channel number it will then only respond to note-off events. To bring it back into operation simply restore the original channel number. An example: Enable 32 parts Load 'Simple Chimes' into part 0 (part 1 in the GUI). Load 'Silver Bell' into part 16 (part 17 in the GUI). In your sequencer, via direct part NRPN set part 16 to channel 16. This will now be 'whited out' in the GUI Record some notes to channel 0 - usually represented in sequencers as channel 1 - yes I know this gets confusing :( In your sequencer just before the first note that you want to sound as 'Silver Bell' insert two direct part NRPNs. One to set part 0 to channel 16, and the other to set part 16 to channel 0. Now when you play this through, the last 'Simple Chimes' note will have it's full release and reverb tail, blending into the first 'Silver Bell' note. When you want to go back to using 'Simple Chimes' just reverse the NRPNs. The only time this gets complicated is if the new note is exactly the same pitch as the old one, in which case the NRPNs need to be between the old note-off and the new note-on. Some of this control is now made easier with the new shortform NRPNs. See doc/Shortform_NRPN for details. yoshimi-2.3.5.1/doc/Histories/Using_NRPNs.txt000066400000000000000000000045541506652756400207550ustar00rootroot00000000000000 NRPN MSB is CC 99, and LSB is CC 98 It's generally advisable to set NRPN MSB before LSB However, once MSB has been set you can set a chain of LSBs if they share the same MSB. The data CCs associated with these are 6 for MSB and 38 for LSB. Only when an NRPN has been set can the data values be entered (they will be ignored otherwise). If a supported control is identified these data values will be stored locally (if needed) so that other NRPNs can be set. Whenever either byte of the NRPN is changed, the data values will be cleared (but stored settings will not be affected). If either NRPN byte is set to 127, both data values are cleared and then ignored again. In Yoshimi NRPNs are not themselves channel sensitive but the final results will often be sent to whichever is the current channel. Yoshimi also supports the curious 14 bit NRPNs but this shouldn't be noticable to the user. In order to deal with this, and also some variations in the way sequencers present NRPNs generally, if a complete NRPN is set i.e. Nhigh, Nlow, Dhigh, Dlow then the data bytes can be in either order, but must follow Nhigh and Nlow. In these notes, where practical we also list the 14 bit values in square brackets. After this, for running values, once Dhigh and Dlow have been set if you change either of these, the other will be assumed. e.g. Starting with Dhigh = 6 and Dlow = 20 Change Dlow to 15 and Yoshimi will regard this as a command Dhigh 6 + Dlow 15 Alternatively change Dhigh to 2 and Yoshimi will regard this as a command Dhigh 2 + Dlow 20 This can be useful but may have unintended consequences! If in doubt, change/resend either of the NRPN bytes and both data bytes will be cleared. Additionally there is 96 for data increment and 97 for decrement. Data increment and decrement operation enables you to directly change the data LSB by between 0 and 63. To change the MSB add 64 to cover the same range. Setting zero might seem pointless, but it gives an alternative way to make an initial setting if your sequencer doesn't play nice. Although data increment and decrement are only active if a valid NRPN has been set, they are otherwise quite independent single CCs. e.g. start value command value result LSB 5 inc 20 25 MSB 7 inc 68 11 LSB 128(off) inc 1 1 MSB 126 dec 74 116 MSB 128(off) dec 65 127 yoshimi-2.3.5.1/doc/Histories/Vector_Control.txt000066400000000000000000000160311506652756400216030ustar00rootroot00000000000000 Vector control is only possible if you have 32 or 64 parts active. Setup is per MIDI channel, so you can have totally different vector behaviour on say channel 1 and channel 5. In vector mode parts will still play together but the vector controls can change their volume, pan, etc. in pairs, controlled by user defined CCs. The first section of the notes below is for NRPN control. The second section is for the Command Line Interface and the third section is for the Graphical User Interface. ################################### You must set the X axis CC before Y, but if you don't set Y at all you can run just a single axis. If you only have 32 parts active Y settings are ignored. e.g. Parts 1 and 17 can be set as x1 & x2 (volume only) while parts 33 and 49 can be y1 & y2 (pan only) Independently of this Parts 2 & 18 could use filter and pan from another CC Setting up is currently done as follows. In the required channel send: NRPN MSB (99) set to 64, LSB (98) set to 1 [8129] Data MSB (6) LSB (38) 0 X sweep CC 1 Y sweep CC 2 enable X features 3 enable Y features Data LSB features values Features: 1 = fixed as Volume 2 = default is Pan 4 = default is Filter Cutoff (Brightness) 8 = default is Mod Wheel 0x12 = 18 = Reversed Pan 0x24 = 36 = Reversed Filter Cutoff 0x48 = 72 = Reversed Mod Wheel Setting the sweep CC for X enables vector control. It also sets, but doesn't enable the default X features. Setting the sweep CC for Y sets, but doesn't enable the default Y features. If you don't enable any features not a lot will happen! The feature numbers are chosen so they can be combined. So, 5 would be Volume + Brightness and 19 would be Volume + Reversed Pan Optional settings MSB LSB 4 x1 instrument ID 5 x2 instrument ID 6 y1 instrument ID 7 y2 instrument ID IDs are instruments in the current bank. 8 new CC for X feature 2 9 new CC for X feature 4 10 new CC for X feature 8 11 new CC for Y feature 2 12 new CC for Y feature 4 13 new CC for Y feature 8 Any data MSB value outside the above list disables vector control. Sweep CCs and feature CCs are sanity checked. An Example: From channel 1, send the following CCs CC Value 99 64 98 1 6 0 38 14 98 1 * 6 1 38 15 98 1 * 6 2 38 1 98 1 * 6 3 38 2 This will set up CC14 as the X axis incoming controller and CC15 as Y, with X set to volume control and Y set to pan control. You can either go on with the NRPNs to set the instruments (this will load and enable instruments from the current bank) or enable and load them by hand. For channel 1 this would be part 1 and 17 for X and part 33 and 49 for Y The (*) CCs ensure that the data bytes are reset each time. This is not really necessary for the earlier commands, but should be done if you set the instruments with NRPNs as well, otherwise you will try to set them twice! ################################### An example to set up vectors from the command line: Assuming we want just a single axis on channel 1 (2 in the GUI) So: yoshimi > set vector 1 x cc 14 Vector channel set to 1 This command must aways be the first as everthing else hangs on it. It's the command that enables vector control. cc is the incoming sweep CC that will vary the features you set. Also, if the number of available parts is set to 16, this will be increased to 32. There are 4 features available 1 is fixed as volume 2 is pan by default 3 is brightness by default 4 is modulation by default We'll select volume for this example so: yoshimi Vect Ch 1 X > set features 1 enable. Set X features 1 en Now you need the set the instruments that will be used. These can only be the ones in the current bank, so, assuming we are in Will Godfrey Companion yoshimi Vect Ch 1 X > set program left 20 Loaded 20 "Bubbles" to Part 1 yoshimi Vect Ch 1 X > set program right 120 Loaded 120 "Ghost Ensemble" to Part 17 If you now sweep the the controller assigned to 14 the sound will morph between these two instruments. To go on to using the other axis as well: yoshimi > set vector y cc 15 Vector 1 Y CC set to 15 If the number of available parts was less than 64 this command will als set it to 64: We'll use panning for this vector so: yoshimi Vect Ch 1 Y > set features 2 enable Set Y features 2 en yoshimi Vect Ch 1 Y > set program down 107 Loaded 107 "Angel Harp" to Part 33 yoshimi Vect Ch 1 Y > set program up 78 Loaded 78 "Brassy Flutter" to Part 49 Notice that the directions left,right,up,down match a traditional joystick. Now you can save your ultimate vector sound: yoshimi Vect Ch 1 Y > save vector CoolSound Saved channel 1 Vector to CoolSound At any time you can reload this. yoshimi> load vector channel 0 CoolSound Loaded Vector CoolSound to channel 0 If you don't give a channel then it will be loaded to the same channel as it was saved from: yoshimi> load vector CoolSound Loaded Vector CoolSound to source channel The file extension we use is .xvy but this will be added automatically. ################################### As of Yoshimi V 1.4.0 there is also GUI access to vector control. This has its own button at the top of the main window, which opens a new 'Vectors' window. Initially most of this is deactivated, but the base channel can already be set to the incoming channel (and part 'column') you want to respond to. As soon as you set an incoming X CC, the rest of the X controls become active, as well as the Y CC spinner. Also, Yoshimi will be set for 32 parts if it is currently 16, and the required ones will be enabled and checked to ensure they are set to the base channel. The two instrument panels behave in the same way as the main parts one, in that clicking on this brings up the instrument selection window. The previously mentioned features are laid out fairly obviously as drop-down choices, although at this time it is not possible to apply the extensions to change which outgoing CC they emulate. Setting the incoming Y CC is similar. In this case it will set 64 parts if it was a lower figure. All changes made are immediately effective, however, disabling them will not disable the underlying instruments, nor will it lower the number of available parts. This is done to protect other elements that may have already been been set up. The options menu allows you to load and save complete vector sets, and 'save' will double check that you have a valid set! Vectors appear in the saved histories file, so you can re-fetch a previously managed one. Either loading or saving a vector set will write its name in the small panel alongside the 'Close' button. This is also editable and will be saved with the rest of the file as an 'internal' name. The behaviour is similar to instrument names in that a stored name (once set) takes priority over a filename. Finally, you can clear just the vector set on the currently selected base channel, or clear all that may have been managed. yoshimi-2.3.5.1/doc/Histories/Voice_Mod_Oscillators.txt000066400000000000000000000022621506652756400230640ustar00rootroot00000000000000The AddSynth voices and modulators have extremely complex relationships! The names of the voice and modulator oscillator selections have been changed, as previously they were very confusing. Also the oscillator selectors for voice/modulator 1 have all been greyed out, as they don't do anything. You can only ever select Internal/Local, or one from a lower numbered voice. The modulator numbers are syncronised to the voice numbers, so Mod. 3 will be defined by the settings in Voice 3 modulation editor. It's important to understand that oscillators always exist even if they aren't used! If you set up voice 2 as a square wave, and voice 1 as a triangle wave then set voice 3 to voice 2, voice 3 will get a square wave. If you then set voice 2 to voice 1, voice 2 will get a triangle wave but voice 3 will still get a square wave. Voice 3 can use the oscillator from voice one, even if voice 1 is switched off. Modulator 3 can use the oscillator from modulator 1 even if modulator 1 is switched off, but modulator 3 can't use voice 1 if voice 1 is switched off. However, if voice 2 is using the oscillator from voice 1, and modulator 3 is using voice 2, it will still get voice 2 oscillator. yoshimi-2.3.5.1/doc/Histories/Yoshi-Zyn_Sound_Differences.txt000066400000000000000000000063041506652756400241610ustar00rootroot00000000000000 Sometimes when people find differences I get to hear about it. In such cases I will always investigate, but I can't do so if nobody explains what the difficulty is. The first time someone told me they found differences between Yoshi and Zyn, they were actually thoughtful enough to supply recordings. Imagine my puzzlement when I was unable to reproduce either of these! By degrees I worked through possible explanations asking about the other's setup and eventually got round to asking what he had in 'Settings'. At this point he realised they were quite different (and different to mine too) - problem solved. Later I had another complaint, but this was much harder to pin down. The person was working from the virtual keyboard so I did the same. Settings seemed identical yet the difference was very noticeable, really quite obvious. Eventually I started to deconstruct the instrument patch bit-by-bit and the difference suddenly disappeared when I disabled the Addsynth voice 1 filter envelope. Inspection revealed that this had very extreme settings. It still took me a long time to hit on the answer. After going through the code in great detail I could find no significant differences. The breakthrough came when I realised that the filter behaviour was critically dependent on the starting velocity, and *only* in the virtual keyboard were the *default* values different. The next commit of Yoshi had this nailed. However, had the settings been checked, exactly the same sound could have been achieved. Some years ago someone sent in a patch with spelling corrections. Unfortunately this changed the name of an XML parameter. It was quickly found and corrected. Ironically the only patch I found that was affected by this was one of mine! More recently we discovered that the jack and internal buffers had somehow become fused together. This would make a difference to some sounds if you wanted a very large internal buffer but a small jack one, although it's a situation I never came across myself. However, this in now corrected. The very latest (quite obscure) sound difference turned out to be a regression in Zyn. This has been fixed. Whenever in doubt my reference is to check sounds against Zyn 2.2.1. This is getting harder as I can no longer compile it on modern distros, and the executable will save but not load instrument files. Also, some features like 'unison' don't exist. All-in-all, my experience is that provided you set up *exactly* the same configuration in all respects an instrument created with old Zyn will sound virtually the same on both new Zyn and the current version of Yoshi. There is an extra twist to this though. I'm the sort of person that doesn't throw things away until I can no longer shut the cupboard doors. I have quite a few computers of varying vintage and have noticed that there are small, but noticeable differences between these with both Yosh and Zyn. At first I thought it was due to different distros, but by degrees I've brought them to pretty much the same standard. Therefore my conclusion is that it is down to architecture variations. Finally, wearing my musician's hat, to me it is more important to get consistently the same sounds on my setup than for mine to sound the same as anyone else. yoshimi-2.3.5.1/doc/Histories/Yoshi_Zyn_NRPNs.txt000066400000000000000000000111471506652756400216170ustar00rootroot00000000000000Yoshimi now implements System and Insertion effects control in a manner compatible with ZynAddSubFX. As with all Yoshimi's NRPNs, the controls can be sent on any MIDI channel. The parameters are: - NRPN MSB sets the system/insertion effects (4 for system effects or 8 for insertion effects) - NRPN LSB sets the number of the effect (first effect is 0) - Data entry MSB sets the parameter number of effect to change(see below). A yoshimi extension is listed after the parameter descriptions. - Data entry LSB sets the parameter of the effect If the effect/parameter doesn't exists or is set to none, then the NRPN is ignored. A full example is at the end of this file. WARNING: Changing of some of the effect parameters produces clicks when sounds passes thru these effects. Some parameters produce clicks when they are changed very fast. Here are the effects parameter number (for Data entry coarse). The parameters that produces clicks have (AC) after their entry (Always Clicks). The parameter that produces clicks only when they are changed fast have a (FC) after the entry (Fast Clicks). Most parameters have the range from 0 to 127. When parameters have another range, it is written as [low...high] . Reverb ~~~~~~ 0 - Volume or Dry/Wet (FC) 1 - Pan (FC) 2 - Reverb Time 3 - Initial Delay (FC) 4 - Initial Delay Feedback 5 - reserved 6 - reserved 7 - Low Pass 8 - High Pass 9 - High Frequency Damping [64..127] 64 = no damping 10 - Reverb Type [0..1] 0 - Random, 1 - Freeverb (AC) 11 - Room Size (AC) Echo ~~~~ 0 - Volume or Dry/Wet (FC) 1 - Pan (FC) 2 - Delay (AC) 3 - Delay between left and right (AC) 4 - Left/Right Crossing (FC) 5 - Feedback 6 - High Frequency Damp Chorus ~~~~~~ 0 - Volume or Dry/Wet (FC) 1 - Pan (FC) 2 - LFO Frequency 3 - LFO Randomness 4 - LFO Type [0..1] 5 - LFO Stereo Difference 6 - LFO Depth 7 - Delay 8 - Feedback 9 - Left/Right Crossing (FC) 10 - reserved 11 - Mode [0..1] (0=add, 1=subtract) (AC) Phaser ~~~~~~ 0 - Volume or Dry/Wet (FC) 1 - Pan (FC) 2 - LFO Frequency 3 - LFO Randomness 4 - LFO Type [0..1] 5 - LFO Stereo Difference 6 - LFO Depth 7 - Feedback 8 - Number of stages [0..11] (AC) 9 - Let/Right Crossing (FC) 10 - Mode [0..1] (0=add, 1=subtract) (AC) 11 - Phase AlienWah ~~~~~~~~ 0 - Volume or Dry/Wet (FC) 1 - Pan (FC) 2 - LFO Frequency 3 - LFO Randomness 4 - LFO Type [0..1] 5 - LFO Stereo Difference 6 - LFO Depth 7 - Feedback 8 - Delay [0..100] 9 - Left/Right Crossing (FC) 10 - Phase Distortion ~~~~~~~~~~ 0 - Volume or Dry/Wet (FC) 1 - Pan (FC) 2 - Left/Right Crossing 3 - Drive (FC) 4 - Level (FC) 5 - Type [0..11] 6 - Invert the signal (negate) [0..1] 7 - Low Pass 8 - High Pass 9 - Mode [0.1] (0=mono,1=stereo) EQ ~~ 0 - Gain (FC) All other settings of the EQ are shown in a different way. The N represent the band ("B." setting in the UI) and the first band is 0 (and not 1), as it is shown in the UI. Change the "N" with the band you like. If you want to change a band that doesn't exist, the NRPN will be ignored. 10+N*5 - Change the mode of the filter [0..9] (AC) 11+N*5 - Band's filter frequency 12+N*5 - Band's filter gain 13+N*5 - Band's filter Q (bandwidth or resonance) 14+N*5 - reserved Example of setting the gain on the second band: The bands start counting from 0, so the second band is 1 => N = 1. The formula is 12 + N * 5 => 12 + 1 * 5 = 17 So the number of effect parameter (for Data entry coarse) is 17. DynFilter ~~~~~~~~~ 0 - Volume 1 - Pan 2 - LFO Frequency 3 - LFO Randomness 4 - LFO Type 5 - LFO Stereo Difference 6 - LFO Depth 7 - Filter Amplitude 8 - Fitler Amplitude Rate Change 9 - Invert the signal (negate) [0..1] Click behaviour of DynFilter not tested. Yoshimi Extensions If the Data MSB bit 6 is set (64) then Data LSB sets the effect type instead of a parameter number. This must be set before making a parameter change. 0 - Off 1 - Reverb 2 - Echo 3 - Chorus 4 - Phaser 5 - AlienWah 6 - Distortion 7 - EQ 8 - DynFilter For Insert effects, if the Data MSB bit 6 is set (64) and MSB bit 5 is set (32) - (total 96) then Data LSB sets the destination part number. 127 is off and 126 is the Master Output. A complete example: 99 - 8 ~ insert effects 98 - 3 ~ number 4 (as displayed) 6 - 32 ~ set destination 38 - 126 ~ Master Out 99 - 8 * 98 - 3 * 6 - 64 ~ change effect 38 - 4 ~ Alienwah 99 - 8 * 98 - 3 * 6 - 0 ~ Dry/Wet 38 - 30 ~ value * these repeats are not needed as far as Yoshimi is concerned, but some sequencers get unhappy without them. Change just a parameter on an exisiting system effect: 99 - 4 ~ system effects 98 - 0 ~ the first effect 6 - 1 ~ Pan 38 - 75 ~ value yoshimi-2.3.5.1/doc/Histories/Yoshimi CCs and NRPNs.pdf000066400000000000000000000531431506652756400223160ustar00rootroot00000000000000%PDF-1.5 %äüöß 2 0 obj <> stream xIH >Sj3C;ansh6 {ZcYHbmUbz;Lgzs1.Z裇_龗+t?8.Mݯ7v?OF<4dxq N&./'3G.0;"h-n͡ṱIT#QFNAIoE=@Zv3&OeёGd )KW>ITGҟL/hn(NVtD  bN>Kw* ;o\`U=O '\Sb@. .B'6D&ui炙(DܫNܫ,scg[! $Q703~IuA/.bz3w Q?!vJtq1(y$.AhK%M l!jYt.pip^4CEj}VOq0\)ܯou-b$ {EؗF+qK8//nXnzH0J"2A\5'L^}l?J^=އT9/r~g endstream endobj 3 0 obj 1325 endobj 5 0 obj <> stream xKk0)|.XՌ#X[`[BүÎl(dW_cFpO';)$ F3 S;矇v0V#?t+tۏDcQN0HDI&~.8(i~+H/'$uiMڮL)̹N^ⷴ.)ks%l*lSVSJA0q/Яv1r;> stream xݼ t[չ0>hf˲,ȓl˖؎cm9 (!$pBI$ϥҢ :Ľzj)+pKCAJʥGrkzuG @ lf?"~6:BnG/Rrk7n,P%]7։BƜu+] H6߹ }_lZWUv)Pꦾ;xE= }30qG?:*h0,PNo0&j;2,wDn^~Aa$XZ W̩[3=l("#7}SIÙo~&QR4:BotAh O ugѾ)tSpqt;p1:^bh]6.C O ݋^V?%)bǠ!8ُK8JKHea]jt/+:?z`VE>4mqF׆N$g Q!ӏ@kh-|0̝(jK~Zw`:oK(6zkMLNo0bPK]W%:<7=٦֖eyWG _gZ5 {|tKh5$;Ri/Z:``UilL̖\`5[VtKB#x_bb5t)>aM* Zؿޛr-P @)>^N>O]ANOo] x@j:RD5. B8,yAa8a꯭'VrtuAפk% goxCj-ayNj(<3u:FhU/m?]._BZ JXE 0T0dA[G eygGUz oÕjH.Ŭ@2M3\J؅fao@Coj :ۚ&Qo/)."PMw 5T"4#gQ\fPv*a7!:(zd,!GY~OfM Kg>f01AJviiUFD]! U(!Gx_/4%I>Q&|'|l܇"$j*L151v@I r{dt4OחJ{l%BNnEpȮ,/!7b9oW2k.WUE k3;̠++[}lCucH^_з|‹H53%(*#E|Vص~lIg~⧳F~lI?&1?OZx֓-(lLz/D.z< 3m[[9)\ (JC@#3,0Ll&WQi*ϥQSy>ܐM9?pȼ ##Xy1ے]GagqtU촅:1)f+6TLQVwIs-sYVb*3^Q1.ԆZ5L]`CtJaCݣeV$Te6dCs*m/}@GMXVSo]K){Ͷ51MxaZ=!@5i4W5dkZkJZ]ǭW,MX~U[ڨzRzNxZA]ҨfP|[ad3cns`!Š=F7eY)~KHEycݦ|=/dγMo$'vuuk}XntDZT|T&:<QF'Zb,0I>%z$s'^92![N|yI&IkTfni5ZژΙ,R62r{RmeӤg`dӮnipx[*wqNGp'ƺ_xVPRbS.q c*F%6Te4+,-Dc4EFHA[#X_\#E^"P:(= 5O#KL9Ahp#loE~!/G +F.4DHne|Ep}`)P ߈Gp,.hkdu4!(&!BIjۓg66L%gTJ!iI<&}Jg̿y5E _r1>C4>=HntD&K{HK-V)@ ȉBRDTC$ ] ] q,v6x.XlWIb/[Ϊyc!H)YM,?gmRXJE+e3n,# 6Bi5#تv<:\#aLJHM]w2*V6]n{qgVɌ`0Y:xOTw^ #2AT15QayXb ͎ fJdr jF$.0e,1;ʋix!r SOݲK@5oהVKZV,AEˢ;w<5 'qxwpsx&fv6ZGeEg1~mUyЮU`0wJe06"ɦ`.hUz^{"&H5_tHEqH,JMM)rr6_ eaE 1=SᖻyS̊dE HX{QO7N$@nUIWQ9'd. (wkytM3_ܿϪuiJ+$8UTd {Z(egȚ: 3#rCIC(tˍQsR;1 . A1!NQ\&WWtN^1G  jGk\tKB7m9GZܸpvf8b^_SdJ#drAdFv.D@ߔ##o7ZiAF2U77 <&J1ԍPCh{!JفMpk3rrlA2TSjLs?{;Z)=Qfkz<aʆqW舴-3lV}JiUԩT[VȎbRNS]ߡ::b ثheTJd`X^,a֊Ow#?\q78ENLӛӏ,xTs>)**\%r)"sQ!C("9@/V[I鿭c;_xBpp>Qxl( 1_cxp`!Sv4Or(N #c[69[5yRMYi2x@@m1Ho{ |-ОdǨ!h"FZdzƦ*thkp`-Pڬ]Yxnj",^b,,fgDΒc1,oSBY_S97:)wS )bGqk;AkuX K\tXSo iT;t vˎ@$6ݍ$0lU!yGO1zzZdfE۬ӿ8 t(#̏@|rp=b'fuDgz,fttt٭iVTMT*,Ua5[(j<`-bknnN 愗kvELmˉ!^-()э:'G[ }Y*uMG:\R٬ag+>XO߄/M8[qVKLLsm$3Be0ETs;aFFRܔ5ԛvF+'4C~TǒNS$T^}ۿO1rֽ=SM{BP41UGgY2̌93NfqDeݽ5҃9`'an&TDua=D Fkia#`a!=L/HS*:Kf0QOAJ1D*I۹dS0>NMOceȼZNt>3B?rZ[ "wdޕy,2.=[,, }ԔQ~uXNhI)* },HaJ ΦsA̢тw[܂"0e@܆[NflJ mQ&̴BzhcAp r(붺.w7ݻ'/p_ri4d^rTr,PR#,QntDcnLx&ՠdWǨt[&c).+qF)]P]jQpp2/*FY~0F6BD꫚T4-_@ݩcmJo4@nߜ\y{ل+W|⽸ucz[q/IG(L~ymgݑZPw=Tl|z^~xΚ5 α.ZIN>tmx K?x|?8x?gP_Oaxe)5k1:b2332y9X JD $`_aMx@](̇KR8NpmiZ2 ڋ\-%h?kqTvj +avvVQbPbRpƫ̾^E\`f}j,L@VT̳2( CM'@vl6Bp}l& K;w5{R ܷ\2)2GK λ5_ÿaq'闛F0K6'=Ō[֭[VWmkk偽A;mS,32ԋ9}H>G!χuѵtLEۥe\jܯWR2"*˕Tި0ʶlsږU*yuPT~#5U]+"'\&]S.E-J*K ::tQޱ;*KSaEJ@YԈ #oMvmQ=D*=bFdPbS?' -d^¿kr9*Lw%@{2Aںԅ˻ wѾͫщ.<ޅ]\]Dv-ilcvubNB]XZ~v~4*0Cɒ^xJ3Ց BAEU9=`9QmT +,Y YZlrTc٤URR#e~$ˁ -ׄ% 4BO7تG JcZV0rasR 6`f__(XUD`G*M>pO8"YO>YOYsù9!48W/ܹ yvS-xN2t1jNSR_MeyUXsf˶//P(P`ؗ/UK`yS)V{vuΞ]W[Uq(=er#5db),'xO TͰfUkX5`Bcc'ٺβZT/{XKJk%N&b6VemxgZۊۋ<^_f*{`<"f"x2YESGo]/ CO*Gݲm+vd3"|ݚŵÂKÊۋ/k|uW5gZ EErjؽcMmطDӇ7#DWύ/.Z{U<-V毬- twPf5:<4Ҧ$jFe6S'q)@n57W͊wf6`k3cZN2cR(-& 63 1 ,C7̗̟E͘*àϏ!nA'1ݔ谾z51ƌ$[mlOD ͩ4%^Ǫ{̎7_ne?dgKX6{?$NYdmKHvL&)Ei(];OOؙ^;ڱ)xQ򀁘YeĄ9j;²%S(%g#2 6 ,0 éEތ8R`2AQcA;pp V&_Y%7/x>qPﱛ L?FM>:>/A;v6朏:aYyf#.dJC99"%Hb\"\*ϞLԳZdtk54Lb.dv 0xܪn'FQj:9q,q- j1۴V%'8T!XMx#_/w ^֜$x "?_Yzs(C*Qkj[r6pFb/_ /K&)eFp%2T ֥ײjwh/Am"@A7)0#6!)o<L~1}Ə+2_^w@N}hBZmnBӫRP0fYeO$gtt&R+&u}ٸg6YD=neRrӑr7slSec7|5n<@#Ial3V[A{ $H>)XfnTqix/ƻlb{@47[ BC C{TUD7ǚIy9|zp@H01ŕcy9cjS[}@{T˩ I{@vw{)-2JO7$tBv"*RUwүӽ59u9o}[nTP5V` E"˃Kpy$1o>onZhGUVyﴰpdi~ґF/!oլno^]3/ qy?'@ogTrjрW>hr VmKT!okEvxxIu1jV$CL/OEXT-\XVVG>@XHɏqÚ 1jFC[6iNa[V8i);uO]=+ .\뽳ZRk1nsu' 嶠~gM>ogAp7:<{(>{y8edc>RTs6tp}Z[XϞ<_vvVfd9mQ+|3,_Lrk_"s90|9Nh.'Y̦:rO!~^ҫNEQi<-~ B. 찀,} Vp gW ui9srn F9 MlTy<Dž]hFE0K`\l'`ڎdnFup`]e9{9$E!9?W|HNX W(fB8($`_TfYLꍄ FB/污4c^z^T]I^2F;{+5 ﭦoʮ r;PQy˜}fYSOoYXܔUVf EIv?QW76UiUݭz7=b_E;`Rָ(R@2akYVUt4\+©;'w7eǰ׊gN1Ε2^q.KW ^SILg[i]r^VQd@dTU̅û&}s W?{F6Zw^'  /OGUqiS%5<8;5e&730) iscsIl+s٢!duqxTdD kuvn79  |sST[&# }P>JKJ KkŬ`UBpy'GT7@| W8wVrV=8PܻWUS+5o5sr o&M -WGjmf9yіoYH\ 2W~(UN+'r, "O}_zz<'/3z7F%'FzZIBJ[ahd\KxIB-q }B?WME=U2i:_ϲƒe.A%TG g W/~p0E[~;f ;P"j'e^Jg^w2Nltzy>q2 '>NqC'N6F:'3p:w@'weN\J+"CCiס'{yIv8qB9movW'>T. aKH{=N ~N#$4U$50*!L)ML98T2ia焓xRc ]B7cuW}@}AU:ZmeFzFu? ~W֜om\+hJuӽ!mf;l3~ghnٛ?ө~kUp +x%rs#128 ׹g;`Œ:f',#.`ˁw^Y![xl-w÷p|EW5[ȶ6Tde ,Xn4;-f?kNV~!l]53~|lR恆F3җlD]m?|˯FǨ[@[ FV bܨ6EEWpN^Zy52 W'OǼ( 㪇"D,` ݥ0"tgB&ȗa]3sq!zJ]->+]aPEShczҼ>h>g:BY/=/vuUv,;n~{8G՜gs&)QLDuKIIțjȣh+Wa)p: ږp:΁eT:@FHǕ.t!W!+NȀZC׵_=-t4d1$iM1L 20tAs)gfk:Ρ,p:@̙t\>c.*ϾQq:EU*ס۹}Eqׂ׮)JK+hxw5%7ze1ց.[]?lFm]?:vƾck6zBܚ^90:Fe%%Koѯ]?6>0 7{KVxc}ǽ}m*.\f@\30:C`wl]?ֿ~ m  4>uo||`lhmJkdЦW6}x`l0u6.mo{܈Ͱ8S0Eޱ/m~ 臡 1fdhtmp 냩o^ m%^m ܎FzC Ta_%Z0b f*Ս^oaLN @8V.\ Q#6A|1/Ԣ}>@ E oP-YtҚk!mq>r6˽d<TR]+)qQYʭm m *&פ{,CAPb:qHZ4V#m z548 T8t }.ee0 R'r-I["6zCe<`Sk^" kqCerS{$vҐ֝Xzr?) s> cD]+q=z8>bkyfv,7˾:CL20+Si;U2 (zR(0[cxl -4:j!2zoR> endobj 11 0 obj <> stream x]M0 cW6d#5@I@9n+03<6=Ӹfݚi6}ғSbl:W_%Bq[0&ɾg?ҧa>OIΏ%}x__5͓Iw}>w˗2z> >CɿRkC~mzM7fo7 =b|H5!5 i[j;P p+bdls+%kmߙ=M8| +7Qk_*ӿBCӿ2`5e_п/IB_m__xOAO [xZ[|/K8 G OK/6c= BAD|/%_rǝ Gw/]z-`NW߽ì3i'wޗyA~ endstream endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <> endobj 15 0 obj <> endobj 16 0 obj < /Producer /CreationDate(D:20200812174129+01'00')>> endobj xref 0 17 0000000000 65535 f 0000020856 00000 n 0000000019 00000 n 0000001415 00000 n 0000021025 00000 n 0000001436 00000 n 0000002444 00000 n 0000021194 00000 n 0000002464 00000 n 0000019582 00000 n 0000019604 00000 n 0000019800 00000 n 0000020360 00000 n 0000020768 00000 n 0000020801 00000 n 0000021299 00000 n 0000021396 00000 n trailer < <73E38BEAE8BDB07BDCBF9D465A8B2CD2> ] /DocChecksum /8DDA7A1E47FB4A2F09E5A9F51625FEC6 >> startxref 21571 %%EOF yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.3.5-features.txt000066400000000000000000000117731506652756400226320ustar00rootroot00000000000000In response to suggestions at LAC 2015 we have made the title bars of all editing windows display both the part number and the current name of the instrument you are working on. In the addsynth oscillator editor you also see the number of the oscillator you are editing. Also, in response to suggestions, horizontal as well as vertical mouse dragging can be used to set rotary controls. Additionally, the mouse scroll wheel can be used, and if you hold down the 'ctrl' key you can get very precise setting. Another request we had was for the part effects window to have the same layout as System and Insertion effects. This has been done and it is now almost identical to Insertion effects. The most noticeable GUI enhancement is colour coded identification of an instrument's use of Add Sub and Pad synth engines, no matter where in the instrument's kit they may be. This can be enabled/disabled in the mixer panel. It does slow down yoshimi's startup, but due to the banks reorganisation (done some time ago) it causes no delay in changing banks/instruments once you are up and running. Some saved instruments seem to have had their Info section corrupted. Yoshimi can detect this and step over it to find the true status. Also, if you resave the instrument, not only will the PadSynth status be restored, but Add and Sub will be included, allowing a faster scan next time. Requests that don't look so likely: Oscillator sync: Not possible on SubSynth - no oscillators! - or PadSynth (Reset the wavetables every cycle?) and debatable on AddSynth due in part to the variable nature of what oscillators you might set up and the complexity of providing an interface for all of this. Subsynth filter levels: Changing apparent sensitivity would be potentially visually confusing as well as possibly changing the resolution. Further confusion would be caused by the fact that these are not absolute levels but normalised ones, so changing the one with the greatest amplitude would change the relative level of all the others. Instrument kit note range: A cross fade overlap looks interesting until you consider 5 or 6 kit items all crossing over at different points, and different ranges. This is assuming you only want to control and maintain a reasonably consistent volume. In Yoshimi V1.3.5 a number of existing, as well as new features have come together to give much greater flexibility (especially for automation) using standard MIDI messages. These are: NRPNs. ZynAddSubFX controls. Independent part control. 16, 32 or 64 parts. Vector Control. Direct part stereo audio output. NRPNs can handle individual bytes appearing in either order, and usually the same with the data bytes. Increment and decrement is also supported as graduated values for both data LSB and MSB. Additionally, ALSA sequencer's 14bit NRPN blocks are supported. Zyn. System & Insertion Effect controls are fully supported with extensions to allow you to set the effect type and (for insertion effects) the destination part number. Independent part control enables you to change instrument, volume, pan, or indeed any other available control of just that part, without affecting any others that are receiving the same MIDI channel. This can be particularly interesting with multiply layered sounds. There are more extensions planned. With 32 and 64 parts it helps to think of 2/4 rows of 16. When you save a parameter block the number of parts is also saved, and will be restored when you reload. By default each *column* has the same MIDI channel number, but these can be independently switched around, and by setting (say) number 17 taken right out of normal access. In tests, *compiling* for 64 parts compared with 16 parts increased processor load by a very small amount when Yoshimi was idling, but this becomes virtually undetectable once you have 8+ instruments actually generating output. In normal use, selecting the different formats makes no detectable difference but using the default 16 reduces clutter when you don't need the extra. Vector control is based on these columns giving you either 2 (X only) or 4 (X + Y) instruments in this channel. Currently the vector CCs you set up can (as inverse pairs) vary any combination of volume, pan and filter cut-off. More will be added. To keep the processor load reasonable it pays to use fairly simple instruments, but if you have sufficient processing power it would be theoretically possible to set up all 16 channels with quite independent vector behaviour! Direct part audio is Jack-specific and allows you to apply further processing to just the defined part's audio output (which can still output to the main L+R if you want). This setting is saved with parameter blocks. Currently it is only set in the mixer panel window, but it will also eventually come under MIDI direct part control. Again, to reduce unnecessary clutter, part ports are only registered with Jack if they are both enabled, and set for direct output. However, once set they will remain in place for the session to avoid disrupting other applications that may have seen them. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.3.6-features.txt000066400000000000000000000057601506652756400226320ustar00rootroot00000000000000One of the main features of this release is improved accessibility. The effectiveness (and indeed usefulness) of this will help shape future complimentary interfaces. Also, a number of first-time defaults have been changed to make this easier. It has always been possible to run Yoshimi headless, but now real control is available. In the first place, when starting from the command line, an argument can be included for a new root path to be defined to point to a set of banks fetched from elsewhere. This will be given the next free ID. Once running, almost all dynamic setup (i.e. doesn't require a restart) can now be done within the terminal window. There is also extensive control of roots, banks, parts and instruments including the ability to list and set all of these. You can now do things like: Path add /home/music/yoshimi/banks Set part 4 program 130 Additional controls that are frequently taken forgranted in the GUI but otherwise get forgotten are master key shift and master volume. Finally, we have the most important parts of vector control exposed to the command line. For all of this there is extensive error checking and feedback. In parallel with this there are more NRPNs so that you can perform some of these via automation. That arrangment looks positively steam-punk, but is actually very easy to use, requiring only a utility that can send MIDI CCs. NRPNs aren't special. They are simply a specific pattern of CCs. Yoshimi's implementation is very forgiving, doesn't mind if you stop halfway through (will just get on with other things while it waits) and will report exactly what it is doing. Another significant improvement is to the handling of ALSA audio, which is still very important for some people. Up till now we've been insisting on 2 channel 16 bit format. Tests have shown that virtually all motherboard sound chipsets will handle this, but many external ones don't. So now we initially request 32 bit 2 channel and work towards a compromise :) With external sound modules in mind, endian swaps are also implemented. Vector control has been extended so that there are four independent 'features' that each axis can control, One is fixed as volume (if enabled) but the others can be any valid CC and can also be reversed. The vector 'sweep' CCs are split out very early in the MIDI chain and the new CCs created are fed back in before any other processing. The result of this is that once we eventually get MIDI-learn implimented the control posibilities will expand dramatically - sorry about the extreme delay :( When using the GUI, there are additional style improvements and tweaks. Also, Yoshimi is a bit more informative when there are insurmountable problems, especially at start-up. In the 'examples' directory there is now a complete song set, 'OutThere.mid' and 'OutThere.xmz'. Together these produce a fairly complex 12 part tune that makes Yoshimi work quite hard. Finally, as well as document updates and the usual crop of bug-blatting, a couple of obscure regressions have been fixed. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.3.7-features.txt000066400000000000000000000044541506652756400226320ustar00rootroot00000000000000This just a minor release focussing on usability details. Yoshimi now remembers most window positions on a per instance basis, and will re-open them at the same locations. Also, if you shut down with these windows open, they will be opened again on the next run. The 'engine' windows are a bit different as they may not actually exist so can't be auto opened. Also, you need to use the 'close' button to fix their re-open position - they don't seem to like being asked their co-ordinates when they are being forcibly closed :( Almost all window titles carry the instance number as well as details such as part number/name, engine, and whether it is kit mode. For addsynth oscillator, the voice number is included. Bank and Instrument windows, as before, show the MIDI ID numbers along with the complete file paths. The top menu bar has been reorganised for better grouping. Mixing unrelated operations on a single menu is never a winner. A complete clear-down now has it's own button, 'Reset'. This is as close as possible to a restart, but works independently for each instance. Re-aranging this group of buttons into two rows means they can be longer - "Virtual Keybd" is a bit more obvious than "vrKbd". The 'Controllers' window now (at last) correctly updates when you hit its reset button. Other window layouts have had a bit of polish. There is now an option so you can see the version details of all XML files in the 'Console' window as they are loaded. Command line access is now more than just a proof of concept. It has a half-decent parser, paging and history. All these are developing alongside considerably more controls. Breaking news! This release has an experimental Breath Control feature - CC2. I'm not generally publicising this yet as it needs to be tried out by musicians with real breath controllers. It combines volume with brightness, so the louder the sound is, the harsher it is too. In the 'Controllers' window you can play with the 'FiltCut' and 'Vol Rng' knobs to change it's performance to some degree. My rough-and-ready tests suggest that you'll probably only want to change 'FiltCut' and leave 'Vol Rng' where it is. Do keep in mind these controls are per-part so won't affect anything on other channels. If anyone has a breath controller, please give it a try and let me know if it works for you. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.3.8-features.txt000066400000000000000000000070071506652756400226300ustar00rootroot00000000000000Yoshimi 1.3.8 highlights We have our first code name: The Swan MIDI program changes have always been pretty clean from the time Cal first introduced them, but now GUI changes are just as clean. While it is generally best to change a program when the part is silent, even if a part is sounding there is usually barely a click. There is no interference at all with any other sounding parts. Sometimes MIDI CCs don't seem to give the results you expect. Well, there is now a setting that will report all incoming CCs so you can discover what Yoshimi actually sees (which may not be what you were expecting). At the request of one of our users, we have now implemented CC2, Breath Control. The 'Humanise' feature has had more interest so it's been upgraded. It's now a slider and it's setting can be saved in patch sets. It provides a tiny per-note random detune to an *entire* part (all engines in all kits), but only to that part. Audio & Midi preferences have been improved. If you set (say) ALSA MIDI and JACK audio, either from the GUI or the command line, the setting can be saved and will be reinstated on the next run. These settings are per-instance so if you have multiple sound cards you can make full use of them. Barring major system failures, there are now no circumstances where Yoshimi will fail to start. There is greater control of your working environment. You can have just the GUI, just a CLI or both, and these settings can be saved. If you try to disable both you will get a polite warning and will be left with just the CLI. The CLI can now access almost all top level controls as well as the 'main page' part ones and can select any effect and effect preset, but can't yet deal with the individual effects controls. It can be used to set up Vector Control much more quickly and easily than using NRPNs. It is also context sensitive, which along with careful choice of command names and abreviations allows very fast access with minimal typing. Yoshimi's parser is case insensitive to commands (but not filenames etc.) and accepts the shortest unambiguous abbreviation. However it is quite pedantic, and expects spelling to be correct regardless of length. Apart from the 'back' commands, it is word-based so spaces are significant. Some examples: s p 4 pr 6 (set part 4 program 6) This sets part 4 to the instrument with ID 6 from the current bank. It also then leaves you at part context level and pointed to part 4. Additionally, it will activate that part if it was off (and the config setting is checked). In most cases the words 'program' and 'instrument' are interchangable. s ef 1 ty rev This moves you up to part effects context level and sets that part's effect number 1 to effect type 'reverb'. s pre 2 Sets preset number 2 (we use numbers there as most preset names repeat the effect type). ..s 6 v 80 Drops you back to part level, switches you to part 6 and sets its volume to 80 (but doesn't actually enable it). /s ve cc 93 Goes back to the top level and sets vector control for channel 0, X axis to respond to CC 93 leaving you in the vector context. Whenever intermediate values are omitted default or last used will be assumed, and all counting starts from zero. The CLI prompt always shows what level you are on, and the help lists are also partly context sensitive so you don't get a lot of irrelevent clutter. There is more, and a lot more to come! While doing all this work, we've alse ensured that Yoshimi instrument patches are still fully compatible with Zyn ones, and have now ported across the new refinements with thanks.yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.3.9-features.txt000066400000000000000000000033201506652756400226230ustar00rootroot00000000000000Yoshimi 1.3.9 highlights Our new code name: Skylark A major part of our work on this release is attempting to future-proof our code. Many distros are moving to GCC version 6, and code that built quite happily with older compilers is now rejected by the much more critical requirements. While doing this, the very extensive testing also shook out some more obscure bugs which have of course been squashed. However, amongst other improvements, we've split out roots and banks from the main config file and also created a new histories file. The separation means that the different functions can be implemented, saved and loaded, at the most appropriate time. These files have yoshimi as the doctype as they are in no way relevant to ZynAddSubFX. The 'banks' file is saved every time roots, banks or instruments are changed, and again on a normal exit to catch current root and bank (which don't otherwise trigger a save). The 'history' file is only saved on exit. The 'config' file is only saved when you specifically call for it to be saved. As well as recent Patch Sets, we now record recent Scales and recent States. Scales in particular had been requested by one of our users who composes with very different scale settings. In the CLI prompt, when effects are being managed, the preset number is also shown at the prompt so you'll typically see something like: yoshimi part 2 FX 1 Rever-7 > Yoshim is now verified as being able to use 192000 Hz sample rate in both ALSA and Jack - if you have a suitable soundcard! There have been a few minor GUI corrections and additions to the doc folder. Many non-fatal system error messages can now be surpressed. this is particularly relevant for CLI use. This will be extended over time. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.4.0-features.txt000066400000000000000000000057561506652756400226320ustar00rootroot00000000000000V 1.4.0 'Diamond Dove' highlights About 18 months ago vector control became a 'thing' for Yoshimi and later, was first demonstrated to a handful of people at LAC 2015. At that time it was only acessible via NRPNs. Then about 6 months ago it became available to command line users as well, and 3 months ago vector saving and loading became possible. Now however, there is a shiny new window so the poor disadvantaged pointer-pushers can also have full control. This is currently reached via the 'Yoshimi' tab, but we may move it to its own button. Also, saving and loading vectors is now preserved in the recent histories file so you can quickly restore these - the same as you can for saved patch sets, scales and states. Vector entry via NRPNs and the CLI have also been upgraded slightly, so they will now automatically set the right number of parts available, and enable the required ones with the correct incoming channel number. Some other usability enhancements: Some people don't like our splash window - Boo! You can now disable it in settings {mutter}{mutter} Many people didn't realise there were two types of resonance interpolation, detirmined by whether you click the left or right mouse button. This has now been split into two with better tooltips. Jack audio autoconnect is now configurable in the GUI and stored so you don't have to set it with a startup argument. In MIDI settings you can now tell Yoshimi to ignore the 'reset all controllers' message - various bits of hardware and software can send these at the most inappropriate times. A right click on a button for a child window now closes the parent and a right click on that child's close button re-opens the parent. Use this a few times and you'll wonder how you managed without. Actually, this has been possible for a long time with Root/Bank/Instrument windows :) A right click on the track of any slider, or on any rotary knob will return it to its home position. There has been some shuffling in the GUI to make the different windows more consistent and easier to recognise. This has also enabled us to increase the size of the smallest control knobs. Most sliders are now indented - it makes them more obvious. Scroll wheel behaviour on both knobs and sliders has also been adjusted to be more consistent. By itself movement is pretty fast, but hold down the ctrl key, and you'll get very fine resolution. Other matters: Yoshimi now has a build number, and this appears in the startup log. That's probably only of interest to those building the master, or for reporting bugs - whatever they are :P Actually, there are the usual bugfixes (ancient and modern) and we've also made a small improvement in the way we handle an all-jack environment. The compatibility work we did for V1.3.8 ensured the all-important instrument files were correct, but we didn't have time to implement all of the controls. These are now in place. Currently there is quite a lot of preparatory work under way but its not ready for prime time. It's still really proof of concept. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.4.1-features.txt000066400000000000000000000103331506652756400226160ustar00rootroot00000000000000Yoshimi 1.4.1 Lyrebird Art imitating nature, imitating ... First of all, we have a new quick guide that's in Yoshimi's 'doc' directory. It's just something to help new users get started. We've always logged warnings if it wasn't possible to run either audio or MIDI, but now we also give a GUI alert. There are still a lot of instruments out there with no internal title. This applies to both external files and instruments in banks, and means once loaded you don't actually know what you've got. From now on, if the internal name is missing, Yoshimi will use the leafname of the file. One of our users always likes a specific setup that is far from the default settings. This needed to be done manually. While you could then save this as a Yoshimi state file, to use it you had to set up a command line state startup. Well now there is a switch that allows you to autoload the complete default state. Recent discoveries with very unusual instrument patches caused us to review the way we handle loading them. All input sources have been improved, but LV2 gained the most, and can now effortlessly load a huge patch that takes more than ten seconds on a fast machine. While investigating this we temporarily installed a timing routine for root, bank and program changes. This turned out to be very revealing, so it is now an option in Yoshimi->Settings->Switches. The first thing you'll notice is the *very* different loading characteristics of the synth engines. You can now get a realistic idea of how far in advance you need to perform any particular in-line program change. Following on from miniLAC2016 we developed a simpler way of of doing part channel switching to emulate a program change, but with instant switchover (and allowing note tails to continue and overlap). This now takes two forms and is accessible from the GUI, the CLI and NRPNs. These all provide a command that will set a designated incoming CC as the channel switcher. The first is aimed at people wanting to switch sounds while playing live on a single channel. Once set up, your defined controller can be used to select just one of the row of 16 normal parts. These will be set to receive on channel 0 (counting from zero) while all the others will only see a note off. If vector control has been set up on any of these base channels, this will be recognised and fully operational (for that part only) when selected. While using this, if you set 32 parts available, parts 17 - 31 can still be used as channels 2 - 15, so you can solo on the switchable one, while having accompaniment provided from a sequencer on these other channels. The second form is column based and requires 64 parts to be set. This time you select 1 of 4, but per channel. This is much more suited to post recording automation, and potentially gives you 16 switchable channels. In this case rather than channel numbers you issue actual part numbers and the sofware will recognise the base channel it is on, If you want to use this to change parts on (say) actual channel 3 - (still counting from zero), send 3 with your defined CC to enable part 3 but disable parts 19, 35, 51. Similarly sending 35 enables that part to respond to channel 3 messages, disabling the others, which as above, will only then see note off. To keep it all lightweight, you need to load and activate all the patches and parts you want, but that could be from a saved patch set. The channels are changed from the very first time you send the 'switch' CC. If you want to look really clever the whole lot can be embedded in a MIDI file :) Hmmm. I think I said I wouldn't go on about vector control, well... Vector settings are now stored in patch sets and state files :) Other stuff: First time start up has been improved slightly, and you will definitely have 'Arpeggios' correctly identified as your current bank :) Startup with GUI or CLI can now be set within the GUI whereas before it could only be done from the CLI. You are prevented from disabling them both! You are also warned that if you disable the GUI then next time you start you will have to do so from the CLI! The 'master' and 'instance' configuration files have now been seperated out, and the master settings are now 'invisible' in the later instance GUIs. This prevents possible ambiguity. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.0-features.txt000066400000000000000000000052571506652756400226270ustar00rootroot00000000000000V 1.5.0 - The Robin Still learning new songs and singing sweetly in the middle of winter. Vector control now has its own dedicated button on the main window. A little bit of shuffling meant that space could be created for it while actually making the window look neater, and the master controls more obvious! As a further protection against rogue sequencers making assumptions, any attempt to set an invalid bank root will be ignored. The same was already true for banks themselves. Also, on first time startup, discovered roots will be given ID numbers starting from 5 and in steps of 5. This makes it a little easier to re-arrange them to your preference. We recommend that you don't have zero for either, as this is the usual assumed number. If working from the command line, listing roots and banks will identify the current ones with a '*'. Also, we forgot to mention at the last release that listing instruments, as well as showing the current bank and root you are listing from, will suffix each entry with A,S,P depending on the combination of AddSynth, SubSynth, Padsynth. Channel switching has now matured to a 'Solo' feature accessed from the mixer panel. When described to a sound engineer his response was "Of course it's a Solo. A bit unusual, but where else would you put it?" Another new feature is one that has been asked for several times - a crossfade for overlapping note ranges in instrument kits. Filter tracking could never quite reach 100% so if using it to get 'notes' from noise it would go slightly out of tune. Well, now we have an extra check box that changes its range so that instead of -100% : 98.4% it will track 0% : 198.4% These new features are the first that actually change instrument files. However, they are backwards compatible in that older versions of Yoshimi simply ignore them. Many of the controls now have active tooltips that show the current value when you hover over them, so you no longer have to click the control to see its value (and probably change it at the same time). Also, many have real-world terms. dB, Hz, mS etc. The biggie is MIDI learn. Yes it's finally here, and very full featured. It can be reached from the 'Yoshimi' drop-down menu, and tooltips will remind you of how it is used. More details on all of these can be found in the 'doc' directory. Under the hood: We've made a small, but useful improvement in note-on behaviour and a more significant one is in the planning stages. Note-on is when the greatest load is put on the processor. To build yoshimi fetch the tarball from either: http://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Our user list archive is at: https://www.freelists.org/archive/yoshimi yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.1-features.txt000066400000000000000000000043311506652756400226200ustar00rootroot00000000000000V 1.5.1 - Jenny Wren Small and not especially pretty, but brightens up the Spring with sweet song. This is mostly another one of those incremental improvement releases. MIDI-learn has been extended so that you can now learn aftertouch, the pitch wheel (to full 14 bit resolution) and most recently NRPNs. A number of hardware devices send these for greater control depth and to provide more than the usual number of controls. Also, there is a 'Settings' option to always open the editing window on a sucessful 'learn'. Main volume now has interpolation so there is no zipper noise, and part volume and pan have better interpolation for the same reason. LFO frequency and depth are now fully dynamic. Four common MIDI controls now have a window (right click on 'Controllers'). This is so that they can be be MIDI-learned. The reason you might want to, is for linking them to aftertouch - a particular benefit to users of wind controllers. A number of actions are now 'soft' in that a fast fade is performed, then the synth is disabled, the action takes place, and the synth is re-enabled. These are 'Stop' and 'Reset' as well as loading Vectors and Patchsets. The 'Solo' feature now ignores a value of zero if it is in 'Loop' mode. This means you can use a simple on/off switch control to step through the parts only when it gets the 'on' value. Visually there have been a lot of improvements. Main window key shortcuts work correctly! General layouts have been further harmonised. The AddSynth voice list window is now fully in sync with the voice windows themselves. More tooltips give real values on hovering. Some also give small graphic representations. We have a new splash screen, which also doesn't block anymore. There is now also a 'Util' directory which has the tools, instructions and examples to enable you to create a personalised splash. There is more information for making custom builds. Both CLI and GUI have been further isolated from the audio thread, and there is now intelligent buffering of incoming MIDI where needed. To build yoshimi fetch the tarball from either: http://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Our user list archive is at: https://www.freelists.org/archive/yoshimi yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.10_features.txt000066400000000000000000000034741506652756400227710ustar00rootroot00000000000000V 1.5.10 Redwing An international singer Once again we concentrate mainly on the command line with the completion of all editor controls, and a greatly expanded and more intuitive help system. The command line script option now has a 'WAIT' command that can be used where a buffered command is followed by a related but unbuffered one. For the graphical interface we've tidied up a few loose ends, and also resolved the confusing situation where inactive controls where shown as active, leading people to wonder why they didn't seem to do anything. These are now correctly shown as inactive until such times as the appropriate selection activates them. Very occasionally the display used to show a corrupted window. The cause of this has now been found and resolved. Under the hood, we've revised the pseudo-random number generators to give them better performance and full portability. We've also added the ability to completely disable them for test purposes. For those interested in the details, there is now a new file '/src/Misc/RandomGen.h' where the type of PRNG is defined. There is the possibility here to change to more compact and faster routine, but be aware that this will produce very subtle differences in complex instruments. As one of Yoshimi's little band of helpers said: "Random numbers are too important to be left to chance!" Another of Yoshimi's little band of helpers has kindly provided us with a very nice classical-style composition so the 'examples' directory now has the state file and Rosegarden file for this, along with a brief explanatory note: 'synth_prelude_0.txt'. There are three new instrument patches in 'Will Godfrey Collection' these are: 'Echo Mulitmod' 'Multi Rushes' 'Cathedral Pipe Organ' Finally, the documentation has been updated, including the comprehensive 'Yoshimi Advanced User Manual'. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.11_features.txt000066400000000000000000000056531506652756400227730ustar00rootroot000000000000001.5.11 Waxwing A colourful international bird (requested) The Mixer panel now presents parts with separate left and right VU meters. As well as showing stereo balance, the reading becomes more accurate. We also no longer show 'fake' VU levels when a part is inactive. Finally, if you click on a part VU meter it will clear the red limit warning for just that part. (requested) We also now have a mono/stereo button in the main window so you can quickly swap between the two and compare while running a project. The switch is instantaneous and very quiet. Sounds can easily be 'lost' when switching from stereo to mono, and there are many occasions where your listener will be effectively listening in mono by virtue of distance. This setting is not saved and will always default to stereo on all resets. If any controls in an effect have been changed from the listed preset, the colour of the preset background is changed from the faded cyan to a strong blue. Previously you had no indication that the preset didn't have it's default settings, so when switching between different ones to compare the results, you might not notice that when re-selected it had reverted to the defaults. When an AddSynth voice or modulator is using the oscillator from a lower numbered one and you then enter the waveform editor, you now see a warning in red at the top of the window. This tells you which oscillator you are *actually* editing. In the microtonal section the 'A' note frequency range has been fixed as 329Hz to 660Hz (slightly more than an octave). Previously it was 1Hz to 2kHz, which enabled you to inavertently produce no audible sound (while still showing apparent output). This could potentially cause problems for some audio systems. Combined with key shifting, detunes and internal octave changes, this still gives you far more range and flexibility than any commercial synth. There are many controls in Yoshimi that operate only when others are in particular states. We now ensure that *all* of these are shown as inactive when not available. Previously many of these seemed to be active yet (confusingly) had no effect. There are a number of new tooltips, as well as some improved ones. Also warnings and informational messages have been updated. If your setup includes autoloading multiple instances with complex state or patch files, it can take several seconds for the main window to show. To reassure users, there is now a small information window that opens instantly, and only remains visible until the main window is displayed. CLI users have had a text message to this effect for several major point releases! On a first time start there is now a small window overlaying the centre of the main one. This prompts you to check settings via the Yoshimi drop-down menu. It also recommends the manual, which is accessible from the same menu. The code continues to be refined, and bugs hunted down - some surprisingly ancient and a few others embarrassingly recent. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.2-features.txt000066400000000000000000000023231506652756400226200ustar00rootroot00000000000000V 1.5.2 - Goldfinch Just because... LAC2017 :) We now implement the fairly new LV2 state:StateChanged URI This means any change you make in the Yoshimi GUI will be reported to the host. MIDI-learn improvements: The current learned list is now included in state saves. NRPNs can now be set as 7bit (LSB only). This is used by some hardware synths and controllers. Min and Max values are now shown as percentages and have a resolution of 0.5% Much of the controllers window, and quite a lot of 'switches' (such as engine enables, kit item mutes) are now learnable and act silently. Most of these are 'next note'. Learnable checkboxes have a pale blue surround (a similar colour to rotary controls). Learnable Menus and Selectors have their arrows the same blue colour. Note. To learn menus you need to make an actual selection with the right mouse button while holding down the Ctrl key. Under the hood: More Gui controls transferred to the new lock-free system. The usual round of ancient and modern bugfixes. To build yoshimi fetch the tarball from either: http://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Our user list archive is at: https://www.freelists.org/archive/yoshimi yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.3-features.txt000066400000000000000000000047621506652756400226320ustar00rootroot00000000000000V 1.5.3 - Swift Small, streamlined and fast moving. We have revised the whole of Microtonal (scales) for better accuracy, and fixing originally incorrect range limitations. This is now much closer to the Scala specification, although there seems to be an ambiguity when you have a keymap defined and have an inverted scale - which key is the pivot point? The GUI representation has been improved so you always see what you entered, not an approximation with strings of '9's! Microtonal settings are now fully accessible to the CLI. Vector control has had a makeover. Amongst other things, the name field is now editable and is stored when you save. This means it will be retained on patch sets and states as well, so when these are reloaded you will know what vectors are embedded. An entire state file can now be loaded silently in the same way as patch sets and vectors can. Further improvements to the CLI are full access to all configuration settings, and better organisation of command grouping and help lists. Some data was not ordinarily saved if features were disabled at the time of saving. We have added a switch to allow all data to be saved regardless. This makes for larger files of course, but does ensure that you can get an *exact* recovery if you need it. You can now directly interact with the formant filter graphic display in a way that is more intuitive and easier to use. The Console window now scrolls the right way! One of yoshimi's little helpers worked out how to scroll the window to keep the most recent line visible at the bottom. It is now possible to run Yoshimi stand-alone with both GUI and CLI input disabled, thus responsive only to MIDI input. In view of this we have added a new shortform NRPN that will shut it down cleanly. You simply send 68 on both NRPN CCs (99 and 98). Under the hood: As well as additional Gui controls transferred to the new lock-free system, some of the earlier implementations of CLI controls have been transferred. One result is that much of the code is leaner, and easier to follow. Some needlessly dynamic memory allocations have now been changed to fixed ones. This gives a noticeable reduction to DSP peaks. There are a few more old and new bugfixes. These days, there seem to be more new ones than old ones. In a sense this is actually good news. To build yoshimi fetch the tarball from either: http://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Our user list archive is at: https://www.freelists.org/archive/yoshimi yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.4_features.txt000066400000000000000000000013031506652756400227010ustar00rootroot00000000000000V 1.5.4 - Blackbird Singer and mimic with a clear strong voice. This is a very small release feature-wise but with a lot of cleanups in the code. It is now possible to MIDI-learn *all* rotary controllers. Also there is a new one in the small MIDI controls window. This is master bandwidth (CC75) and is most effective on instruments with a rich set of harmonics - especially SubSynth. Some of the tooltips were a bit ambiguous, and these have been changed to be more obvious. We now include "The Yoshimi Advanced User Manual" as a PDF, which when installed will be placed in /usr/local/share/yoshimi. If you have a preferred PDF reader installed, then you can fetch it from the 'Yoshimi' dropdown menu. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.5_1.5.6_features.txt000066400000000000000000000113321506652756400234340ustar00rootroot00000000000000V 1.5.6 - Fieldfare Goes where the Mistle Thrush can't! Our new BSD friends turned up a few issues that don't seem to affect the common Linux distros, and a couple of fairly obscure bugs surfaced. These would have prompted a bugfix release. However, at the same time two new features were requested that are quite useful and easy to implement. In MIDI-learn, if you set Min and Max to the same value this becomes a threshold and anything equal or lower behaves as if the input was 0 while anything higher behaves as if it was 127. Breath control (CC2) can now be disabled on a per-instrument basis. It seems some MIDI controllers send this on joystic movements. V 1.5.5 - Mistle Thrush A seasonal bird. Not particularly colourful, but tough and dependable under difficult conditions. Some users wanted a way to store the Controllers settings with an instrument. These can make quite a dramatic difference to the sound. There is now a superset of instruments that can be saved instead of, or as well as, the standard ones. On loading, Yoshimi will look for the extended version first. This applies to instruments in banks as well as externally saved ones. If you have an extended type loaded the instrument name will be a mid-blue instead of black. This is reflected in the stored instruments in bank slots. From now on any improvements we make to instrument patches will be applied in full to the extended version, and as much as is viable (in a compatible form) to the standard ones. Under no circumstances will we change standard patch format. There are many hundreds of these in the wild, and musicians may have their own reasons for preferring them (and older versions of the synth). There was a strange, really ancient bug in 'legato' where if you fumble and hit two keys pretty much together you end up with alternate silent notes until you lift all keys. This has now been comprehensively fixed. While we concentrate on larger issues we don't neglect the smaller ones. For example: You can't have legato mode and drum mode at the same time, but this hasn't been obvious. From now on, if you have drum mode set then try to set legato, you'll still see the setting, but as drum mode takes priority, the legato text will be shown in red. Cancel drum mode (making legato valid) and the text will turn black again. If you are using a legato MIDI pedal, Yoshimi's part 'mode' will show this change, and again will turn red if an instrument with drum mode is on that part. Load and save dialogues intelligently recognise the history lists and offer the appropriate first choice. External instrument loads and saves are now also remembered. For saves, on a fresh start you will offered your home directory regardless of where yoshimi has been launched from, but uniquely, in the case of saving external instruments you will always be offered the name of the instrument in the currently selected part - prefixed with the home directory. There is now a specific menu item in 'State' (Save as Default) for saving the current complete setup as the default. This will always be saved to Yoshimi's config directory and will not show in history lists. If "Settings...->Switches->Start With Default State" has been set, and a default state has been saved, not only will a complete restart load this, but a master 'Reset' will load this instead of doing a first-time default reset. A final detail with the history lists is that in each list type, the last used item will be placed at the top of the list. This is especially useful when you want to continually save/load an item you are currently working on. When first implemented MIDI-learn was limited conservatively to 128 lines. With experience of its actual performance this has now been increased to 200. The CLI has had attention too. A few more controls have been enabled, and the existing ones smartened up and made more consistent. As an aside, there is a new experimental branch with an interface that *only* works via the CLI - not ready for prime time yet. Yoshimi can now run happily with jack on some BSD systems. Techie bits. There are a lot more minor optimisations throughout the code. This has resulted in an overall drop in code size, as well as some critical operations being slightly faster. The last few contentious parameter changes have now been made thread safe, and by default we run with NO mutex locks (the calls are there but return 'empty'). There is a single queue that all settings pass through so there should be no possibility of interference... Well, that's the theory :) CMakeLists.txt now has a specific option for older X86 processors. Also, if none of the build options are set then not even sse extensions will be included. How Yoshimi will handle on such an old processor is left as an exercise for the student :P yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.7_features.txt000066400000000000000000000075641506652756400227230ustar00rootroot00000000000000V 1.5.7 - Nightingale A small, but delightful singer. This release is mainly focused on usability improvements. For example, the Master Reset can now clear MIDI-learn lists. All you have to do is hold down the Ctrl key when clicking the button. Usually you don't want to, but it's there for the times you do. There are rare occasions when a very large PadSynth patch can take as much as 15 seconds to initialise. If you try to do anything on that part that can affect PadSynth (during that time) the result can be fatal. Well not any more, as now you'll get a warning message: "Part {n} busy." In the bank selection window there are two new buttons 'Import' and 'Export'. These allow you to transfer complete banks in and out in a controlled manner. There are a lot of these out in the wild, and the 'Import' process lets you copy them in to specific slots in particular roots. It only copies in what Yoshimi recognises, but informs you if there are any unrecognised files. There is sometimes really odd junk that has crept into 'wild' banks. Also, Yoshimi will never overwrite any of your precious installed banks or mess with their IDs. Similarly when you want to pass one of your own banks to friends, with 'Export' it is easy to identify the bank you want to copy out, and Yoshimi will not overwrite any external directories. Following on from this, many people don't fill in the Author and Copyright fields of their own instrument patches, making it hard to acknowledge them. This is now partly automated in the hope that it may encourage people to do so. You can set up this default by going to the 'Instrument Edit' window and filling the field in just once, then while holding down the Ctrl key, click on the 'Default' button. From then on, just a click on this will fill the field with this text. Going further into instruments, we now have a few useful key shortcuts. If you hold down 'K', and click on the 'Edit' button in the main window, it will directly open the kit editor window for the current part. Similarly holding down 'E' and clicking will give you the part's effects window. Most voice patches only use the first Add, Sub and Pad engines and there are similar shortcuts for these using 'A', 'S' & 'P' and clicking on the 'Edit' button. If you use the left mouse button it will only open the associated window if that engine is enabled, otherwise it will open the usual Part Edit window. Using the Right button will enable the engine then open its window. For the QWERTY keyboarders 'D' can be used instead of 'P', putting these in a neat row :) Now we take a dive into the feared AddSynth Voice window! The first thing you notice is these are tabbed, so you can quickly jump between the voices. An extra detail is that non-active voices have their numbers in light grey text, while the active (or the current selected) ones have clearly visible black text. This is all fully in sync with the Voice List window. We've changed some ambiguous wording in the Voice window too. The 'Change' buttons are now 'Waveform' ones. Also the highly confusing 'Ext' or 'Internal' entries are better worded - it was quite common for people to ask how they got the 'Ext' ones and where they came from. For the voice itself, the selector is now named 'Oscillator' and the text is 'Internal' or 'Voice {n}' At the top of the Modulator section, you have 'Oscillator Source' and this time it will be 'Local' or 'Voice {n}'. The lower selector is titled 'Local Oscillator' and the text will be 'Internal' or 'Mod. {n}'. An extra detail is that these entries are greyed out for voice 1, as you can only select the internal oscillator or one from a lower numbered voice. Returning to effects, there is now interpolation in place for the controls, which makes these crackle-free and far more useful with MIDI-learn - Remember, you can have up to 200 learned lines. Finally, there are the usual code improvements and bug fixes. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.8_features.txt000066400000000000000000000025711506652756400227150ustar00rootroot00000000000000V 1.5.8 - Kingfisher Bright flash of colour. The most significant changes in this release are all usability ones. At the request of one user (and agreement of several others) some of the microtonal settings are now MIDI-learnable, and appropriately highlighted. The CLI can now open and close instances, and switch between them. There is a new 'Solo' type 'TwoWay' this works in a similar way to 'Loop', but (apart from zero) values less than 64 step from right to left, instead of the other way round. The highlighting is also a bit better. Both 'Loop' and 'TwoWay' also have debounce protection of approximately 60mS. The CLI can now clear a part's instrument. A fairly obvious option that somehow got missed. In the Banks windows Instruments can now be swapped between banks and bank roots. Banks can also be swapped between roots. This is an extension using exactly the same controls as those already available for in-bank swaps. The latest feature is autoloading instances. With this enabled, any instance that was open when the main one is closed will be re-opened on the next run. If these instances were set for starting with their default state, then all those settings will be performed. Therefore, a very comprehensive and detailed session can be started with a single command! A lot of the documentation supplied with Yoshimi has been updated, including the Advanced User Manual. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.5.9_features.txt000066400000000000000000000113321506652756400227110ustar00rootroot00000000000000V 1.5.9 Yet Another Sparrow So common, but what would we do without them? There isn't much visibly changed for most users, but for the command line it's a very different story. Command line users can now run plain text scripts that behave in exactly the same way as if the commands had been entered from the CLI itself. The actual script command can be initiated from any context and is simply: RUN {filepath of script} To avoid any possible confusion, the routine will first set the context to the top level, then perform all the commands, and once again return to the top level. If there is a fault in the script it will be reported along with the number of the line where the error occurred. Due to the buffering used, the script will return before many of the actions have actually taken place. Therefore an error report is likely to be some way up the responses. Typically it will be something like: *** Error: Which Operation? @ line 13 *** Here is a simple working example: # A script test set part on # These two lines are spaced in a bit set add on set voice on set volume 45 This will make sure the part is on, then make sure the relative addsynth and voice are on, and finally set the voice volume to 45. Now although this starts from the top level it will use all the last set parameters. So if you had previously been working on part 7, addsynth voice 2, then that is the one that will have its volume adjusted, ensuring all the intermediate steps are available. This means you can set up generic scripts then apply them to any part, engine etc. The script routine honours any normal abbreviations, blank lines are ignored. A '#' at the start of a line marks it as a comment so will also be ignored. These will be counted if an error is reported. Recent developments in the underlying code have made it possible to greatly extend command line access deep into the synth structures. This created a problem where the command line itself could become unmanageably long. This has been changed so that only the current context level is printed in full. The ones higher up the tree are minimised. e.g. yoshimi Part 1+> yoshimi P1, Sub> yoshimi P1, S, analog Filter> Rather than stating whether a switch is on or off, there is now just a '+' sign for on and nothing for off. This is actually clearer than using a '-' and the slight shift in the line gives the user another clue. There is also a new command in the 'config' context that controls where this is displayed, or whether it is shown at all. This is "EXPose {OFf, ON, PRompt} 'OFf', will give just the bare prompt with no other information, and 'ON' shows it as a separate line above the prompt: @ P1, S, analog Filter yoshimi> Default is 'ON'. For the new commands, first of all there is the part kit structure. There are three forms of kits the engines can take, multi, single and crossfade. These are exactly the same as the graphical controls and can be set when in the part context, so starting at the part level prompt: yoshimi Part 1+> set kmode multi Will return: Part 1 Kit Mode multi and show a new context level prompt: yoshimi Part 1+, kit 1+, multi> This is now looking at the kit item number one (which is always enabled). yoshimi Part 1+, kit 1+, multi> set kitem 4 Changes this to: yoshimi Part 1+, kit 4, multi> Which hasn't yet been enabled so: yoshimi Part 1+, kit 4, multi> set on Then for example: yoshimi Part 1+, kit 4+, multi> set sub on Now the SubSynth engine on that kit item has been enabled and will sound. Also the prompt line compacts as you have moved to the SubSynth context: yoshimi P1+, K4+, M, Sub+> These new controls are added to the part context help list. The synth engines, AddSynth, Voice and PadSynth now also have their own contexts with appropriate help lists. There is also a new list which doesn't show directly in any context but has to be called specifically. It is '? COMmon' and lists all the commands that are applicable from the part level through the new engine contexts. A typical example is 'Volume' which is a context sensitive control for part, AddSynth, Voice, SubSynth & PadSynth. Finally inserts LFO, Filter and Envelope have their own contexts above whichever engine they are sitting on, and again have their own help lists. Currently the greatest context depth is: yoshimi P1+, K4+, M, A+, V5+, freq LFO> Envelopes and LFOs are slightly complicated as they have groupings, and one has to specify the command first followed by the group, but these are displayed the other way round. So: yoshimi P1+, K4+, M, A+, Voice 5+> set lfo frequency This would have set the context shown above. The need for compressing the text is obvious. At that level just '?' will list the LFO controls. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.6.0_features.txt000066400000000000000000000171111506652756400227020ustar00rootroot000000000000001.6.0 Reed Warbler - an original voice modulator. Yoshimi is now 10 years old and (while fully respecting its origins) is forging it's own path into the future. Do come along for the ride. Our headline feature is extensions to AddSynth voices and modulators. You can now use an entire lower numbered voice as a voice source. Previously you could only use the voice oscillator itself, but now there is the ability to include all filters, LFOs and unison. Even the voice's modulation will be included, so extremely complex sounds can be created. Also, modulators using a voice for their oscillator can now enable the modulator frequency controls instead of the voice ones, giving yet further variation. There is a new AddSynth sound type, 'Spot Noise'. This is a very rough sounding noise and, with careful application of an amplitude envelope, is useful for adding a sort of 'grittiness' or sizzle to some sounds - especially percussion. These features are partly backward compatible in that they will work and give reasonable results, but obviously won't sound the same. There are extra mute options. At part level and also in AddSynth Voice, the lowest possible setting now silences the output. Previously it was -40dB and -60dB respectively, and this could result in unwanted sound 'leakage'. This doesn't affect any higher volume settings so previously stored MIDI recordings will sound the same. There is a global bank search entry in the main window's instrument menu, and a button in the instrument bank window. This opens a list by instrument type. It is derived from a scan of the entire bank structure, so you can very quickly try out a wide range from this list on the currently selected part. The Instrument names are prefaced with the bank root ID, bank ID and instrument number (as recognised by MIDI). As usual, we like to keep people informed with precise and relevant information :) In the main window there is a button to temporarily disable an individual system effect. This covers a bit of an oversight. Previously you could only use the 'No Effect' position in the type list, but doing that lost any previous settings, and the only way to get them back was to re-load the patchset / state. This could get quite tedious and also was a bit of a problem if you hadn't at that point saved them! With Insert effects, you can already use the 'Off' position in the destination without losing the settings, and for part effects the same applies using 'Bypass'. In the part editor window there is now a 'Velocity' slider as part of 'Humanise'. This operates in a similar way to the exisiting slider (renamed to 'Detune') It gives a small random velocity reduction. As well as reducing the perceived volume it will affect any velocity sensitive feature such as filters. We've made an improvement to the way recent histories are managed. In all of these, the last used file is placed at the top of the list. This works well, as the reorganisation means your favourites will always be the easiest to reach. However, this 'mobility' isn't always what you want - especially if you are working from the command line. There now is a set of config switches so that you can independently lock each of these lists against change. In the locked state loading or saving new files will not update the associated history list at all. At any time, you can of course unlock the list again. Also, the history file is unique in that it is entirely internally generated, and the file is common across all instances. Although treated as a config setting, the new switch settings are actually embedded in the history file itself, which ensures consistency. All the above features are, of course, also available to the command line interface. 'Reports' and 'Midi Learn' openers have been swapped. We generally try to avoid changing the GUI, but users tend to just leave 'Reports' passively open (or not used at all). However, the 'Midi Learn' window is actively used a great deal. It now has the button on the main window. There is a new group of easy to use NRPNs. Those who have been using Yoshimi for a long time will remember how changing the bank structure enabled us to reliably make bank and program changes via MIDI. Well, the same is now true of all of these histories. Specifically the following: NRPN high (CC99) - 96 NRPN low (CC 98) - list type 0 - Instrument 1 - patch set 2 - scale 3 - state 4 - vector 5 - MIDI learn DATA low (CC38) - list entry number (counting from zero) DATA high (CC6) For Instruments, it's the part number to load it to. If a number greater than 63 is set the instrument will be loaded to the last part number (if any) seen by previous NRPNs. If there is no previous part, the control will be ignored on the basis that no change is better than an undefined one. For Vectors its the base channel. If a number greater than 15 is set, the vector will be loaded to the channel it was originally saved from. For the other lists it is advisable to set CC6 to zero, in case we make use of this parameter at a later date. As usual, all numbering starts from zero. All of the lists can have up to 25 entries, so for live gigging musicians, it is now possible to set switches on a hardware MIDI controller to send these NRPNs. At the touch of a button you can (for example) change patch sets, or entire states on the fly - and without so much as a faint click :) There have been improvements to Copy/Paste. Over time changes had been made that resulted in altered saved types and confusing titles. These have been sorted out, and for compatibility, where types were changed both are now recognised. Also the preset roots follow a similiar structure to that of banks, and you see only the ones in the *current* root, so no longer have the confusion of seeing identical names in different locations - possibly with quite different contents. There is tighter control of startup. A new feature is the ability to configure Yoshimi so that on a desktop startup it checks to see if there is a main instance already running. If there is, the new one sends the running one a message to open the next available instance, then gracefully exits. This is not only a more efficient way of working but makes session saving simpler (especially if instance autostart is enabled). It also gives protection against bank structures getting out of sync. This capability can be set within 'config'. Incidentally, whenever we add new features, the default is always to keep the existing behaviour. The Advanced User Manual has been considarably expanded. There are corrections, updates (where features have changed) and a lot more descriptive detail. More attention has been given to explaining 'Why' as well as 'How' and 'What'. Under the hood Ring buffers have now been changed to a bespoke type. These are are used quite extensively in Yoshimi. They are now specifically tailored for Yoshimi. The code is self-contained, more efficient, and easier to use. It also removes a dependency. Almost all file system operations have been moved to a single source file. Eventually the remainder will go there too. This will mean that future possible file system changes will only need updates in one place. As well as running headless, Yoshimi can now be built headless. Thus not requiring any graphics capability beyond a simple shell, or indeed (as a simple performance unit) entirely controlled by MIDI. The command line has additional protection against overlength lines, and corrupted data. Also one of Yoshimi's little band of helpers has done some major code re-factoring here, and in some low level functions. A few more bugs have been squashed, but these were mostly regressions since the release of V 1.5.11. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.6.1_features.txt000066400000000000000000000046471506652756400227150ustar00rootroot000000000000001.6.1 A rather unusual new feature is a 'forced' exit. This, as it suggests, is immediate and does no double check. It is available from the CLI, GUI, and MIDI. It also gives a return value of 16 instead of the usual zero. The purpose of this is so that with a cooperative environment it can shut down the whole computer - particuarly useful at the end of a live gig. If using ALSA MIDI, there is now a search mode where Yoshimi will connect to every readable source it can find. This is also directed at live use, where you might be working with an unknown keyboard. Alternatively, the 'Fixed' source setting can now have several comma separated entries when you want to always connect to a specific range of sources. There has been a correction to Scales note and frequency allocation terminology. Instead of calling it the 'A' note, we now refer to the 'reference' note. We also identify the selected note number by both it's value, and the actual note it represents. If it is anything other than 69 it should not be referred to as 'A'... because it isn't! So 69 is A4, 60 is C4 (which some people would want to set to a frequency of 256Hz). The settings are sent to the log, and the GUI has tooltips to explain the structure. The mixer panel format can now be changed from Yoshimi->Settings. This is to allow for use on very low resolution screens and window managers that try to be clever and centre windows that are taller than the screen, chopping off both the top and bottom. Exactly where 'Close' icons tend to be. The CLI now has additional controls, particularly in banks and roots management. There are still a few missing, but not many! Also some of these have been changed for better consistency. Other stuff. We've had to do an update to allow for the change in the MXML API. That one came as a complete surprise :( Quite a lot of the drawn graphics were using dots and dashes. These were virtually invisible, looking just like solid lines, but FLTKs handling of them has a significant processing overhead on machines with limited or no GPU control. These are now all solid lines. Session/State/Config managment is now unified, and more system settings can be changed by these files as Yoshimi instances start. For this it was necessary to change the config and instance files slightly, but they are examined at startup and modified as necessary, so transparent to the user. And finally, The Advanced User Guide has been significantly updated. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.7.0_features000066400000000000000000000025751506652756400220750ustar00rootroot000000000000001.7.0 - Pipit Small but with a big voice There is only one major feature change here, but it is certainly good enough to warrant a full point release. Up till now, only a few controls gave an instant response when Yoshimi is playing. The rest only took effect with the next note played. Thanks to the work of one Yoshimi's 'little band of helpers' this has now been turned on its head. Now almost all controls will give an immediate response, and so will many of the switches and menus in the engines. The exception is the PadSynth harmonic structure. This is due to the way it generates sets of samples to play. With a combination of MIDI-learn and external automation, there is an almost limitless range of sounds and effects possible. Also, the (fairly new) instrument search window is no longer modal, so doesn't block the GUI from other actions when open. Other bits. There was a mistake made with V1.6.1 where some startup arguments were lost - Will puts his hand up to that - and this has now been corrected. Some slightly irritating behaviour has been changed where the current selected part could go out of sync between the GUI and CLI. There have been internal improvements in the MIDI-learn code. All slider knobs now respond correctly to mouse clicks (not just drags). Resolved build warnings from GCC8 - a moving target that we try to keep on top of, as a first-line bug defence. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.7.1_features.txt000066400000000000000000000071351506652756400227110ustar00rootroot00000000000000V 1.7.1 One instantly noticeable feature is a new 'Pan Law' entry in the main window. There are three settings. 'Cut' is what Zyn 2.2.1 used, 'Default' is what Yoshi has used from very early days, and 'Boost' is a sort of average of what a number of commercial and hardware synths use. The setting is stored in Patch Sets, and older projects will automatically get 'Default', so sound unchanged. This control doesn't alter the internal panning of Effects which retain the 'Default' type they have always had. The different behaviours are most noticable with a changing stereo position. Another quite new development is both Channel and Key aftertouch. This is still a moving target, but we are releasing it now in order to get feedback from users, which will help shape the way it develops. The controls are found in a new Aftertouch window, which is reached from the Controllers one. Currently, you can have any combination of Filter Cutoff, Filter Q, Pitch Bend, Modulation and (for Channel) Volume, but Key and Channel can't have the same ones. The controls are per part/per channel - a rather curious combination. Two parts can be on the same channel getting the same incoming MIDI but having different effects. Both Key and Channel aftertouch can also be overridden by MIDI-learn. There is a new waveform shape available to AddSynth and PadSynth - Hyperbolic Secant. This is similar to Gauss but has a subtly different harmonic distribution. There is a new channel based setting for Solo. In this case you can mute all parts except the ones receiving the channel sending the command. This requires a toggle type switch operation. i.e. CC value greater than 63 to solo, and less than 64 to return to normal. If the 'on' message comes though on a different channel then this 'takes over' the solo state, but any channel sending the 'off' state will return Yoshimi to normal. Another significant but less obvious development is a complete revision of how we handle Legato. The code is slimmer and gives far smoother performance. Instrument banks have also had a workover. One somewhat obscure issue used to be that if a 'foreign' bank was inserted into a root directory externally by some means, next time Yoshimi was run there was a good chance the others would be shuffled about for it to fit. This would then mess up any projects using bank changes. What happens now is that it installs the already known ones first in their original locations, then if there are more entries it scans the bank for spaces. A further refinement is that it always steps in fives. This means entries are spread as evenly as possible, but still evntually reach every possible location. A further refinement is that '/usr' directories are scanned for banks, and if found, they're copied into '/home/{user}/.local/yoshimi/found' this provides an editable form while preseving the originals. The final detail is that if no banks can be found at all, Yoshimi will create one bank root, with one bank, with one SubSynth instrument! A similar action is performed for presets directories, and although existing users will still see ones in '/home/{user}/.config/yoshimi' they won't be put there for new users. Storing and recovery of GUI window positioning has been improved so it is more reliable, has better defaults, and allows the user to fix the position of more of them. There has been significant refactoring of critical areas of the code, resulting in improved performance, reduced redundancy, and greater clarity. As you can see, Yoshimi's little band of helpers have been very busy and apart from all the above, general code cleanups and improvements are continuing. yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.7.2_features.txt000066400000000000000000000046711506652756400227140ustar00rootroot00000000000000V 1.7.2 Once again this release is mostly small features and code improvements. The most noticable change is that in AddSynth, Voice, Subsynth and Padsynth the Amplitude panel is now shown as a panel, not just the background colour. It also has the controls re-arranged and an extra one. Random panning is now selected only by the dedicated 'Rand' button, not the pan position one. Once selected, the new width control becomes active and sets the left/right limits of randomness. Also, the original Pan control is still active, and sets the centre of this width. So, if you have a width of 50% and position of 25% left, the actual panning range will be from 75% left to 25% right. In order to maintain backwards compatibility as far as possible, there are new entries saved in instrument files so that older versions will be able to interpret random switching correctly, but will not see the width and position in random mode. When managing instruments in banks you can now set a config switch so that the last one you loaded or saved is highlighted as bold text. This is particularly useful where instruments have a different internal name to the filename, or no instrument name at all. There are quite a lot of these! There are three new options for LFO types based on randomised variations on a square wave. These don't seem to sound like LFOs at all and are probably of most interest to those making experimental music, or EDM etc. These controls have, of course been made accessible to the CLI. There have also been some small changes in the CLI commands to make them more consistent and easier to memorise. Some bit-rot has been cleaned out from our NRPN code, and there is now a quick reference list of all the CCs and NRPNs that Yoshimi recognises. Full details are of course in the Advanced User Guide. Some of the original text 'notes' in the doc directory have now been moved into the Histories directory and will no longer be updated. They were copied into the Advanced User Guide some time ago, expanded on and kept fully up-to-date there. We are still sorting out occasional bugs of course. It will be more worrying when we can't find any. It might mean they were hiding better! Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.7.3_features.txt000066400000000000000000000007021506652756400227040ustar00rootroot00000000000000V 1.7.3 There are no new features at all in this release! It is a maintenance one, with a few bugfixes and quite a lot of code refinements, preparing for bigger things :) Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_1.7.4_features.txt000066400000000000000000000013561506652756400227130ustar00rootroot00000000000000V 1.7.4 There are no new features in this release. It is really another maintenance one, with a few more bugfixes and code refinements. However, there is a check for when you save an instrument but haven't set a type. This asks you to do so, and also recommends including copyright information. You can ignore this and save without these, but then it will be very difficult to identify your patch on a search, and impossible to acknowledge you on any songs that use it. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.0.1_features.txt000066400000000000000000000015051506652756400226760ustar00rootroot00000000000000V 2.0.1 This has no new features. It's another maintenance release with a smattering of small improvements, along with bugfixes. In the GUI, analog filters that are set to Low1 or High1 now have the Q dial deactivated. Single pole filters don't have Q, and this control seeming to not work was confusing some users. There are a few new instrument patches. Stick Hit in Drums. Scaffold Pole, Sharp Sweep Synth, Sharp Sweep Multi, Surf in Companion. As usual, we welcome all suggestions and assistance - especially regarding documentation! Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.0.2_features.txt000066400000000000000000000014401506652756400226750ustar00rootroot00000000000000V 2.0.2 In this release (in the 'doc' directory) we include a new user guide that is currently under development. This is entirely standard HTML and should be easier for general browsing and reminders. The original PDF version is still available, but is now in the process of also being updated, and is titled "Yoshimi Advanced Reference Manual" There are also a few more small improvements, along with bugfixes. As usual, we welcome all suggestions and assistance - especially regarding documentation! Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.0_features.txt000066400000000000000000000136231506652756400225430ustar00rootroot00000000000000V 2.0 A happy Northern Cardinal Yes really! A springtime version 2.0 is here. The most noticable improvement is that all windows are now resizable... Individually... Up to whatever the window manager allows... And their current sizes and positions are saved. For most of these, the windows for each Yoshimi instance have their own settings. What is more, if you change screen resolutions such that one of them would then be outside the viewable area, there is code to automatically bring it back into view. In the process we have also tidied up some of the windows to make them clearer and more consistent. To maintain style and resize consistency we have devised our own file browser - a sort of cross between GTK and KDE. This has the added beneft that *all* file handling now goes though a single header file. This is the most recent addition, and may change in future releases based on user feedback. Another significant development is MIDI sync for all the engine LFOs. When the new BPM button is checked, the frequency control becomes a ratio setting between the time code and actual LFO freqency. The range is from 16:1 to 1:16, so should cover just about all the combinations you might want. All LFOs are independent, so you can have one set to (say) 3:2, while another is set to 1:4. An interesting lesser development is the addition of a few more instrument types, to make it easier to find ones that you want to use. The new type names are: Bells and Chimes Single Voice Choir Wind (other) Warm Pad These are backward compatible in that older Yoshimi versions will see them as 'undefined'. Also, if you save a newly created instrument you are asked to set the type if it has been left as 'undefined'. It is a request, not a demand - Yoshimi is your friend, not your boss! Along with this there is a new way of managing the internal names and the file names. From now on, the internal name will be the one that the instrument was first saved as. Whereas all other references to the instrument will be via the filename (or a copy of it). If the filename is changed for any reason, the next time the instrument is loaded, the 'Edit' window will have a line: 'Derived from {original name}'. This ensures that with further development it will always be possible to tell where it originally came from, without interfering with bank positioning, instrument development etc. All the Default instrument banks have been revised to remove inconsistencies between the internal name and the file leaf name. It was already impossible to tell how they were derived so the names have just been made the same. While doing this, where possible reasonable types have been set to many of those that were just marked as 'undefined' - also making use of the new type names. All the types that have been adjusted were previously undefined. Most importantly, none of this affects the sound, nor the bank positions, so your existing projects will sound just the same. Also, this is just the defaults in /usr (or /usr/local) none of your copies will be touched (although you may want to re-copy or adjust them youself). The recently introduced aftertouch feature can now be reached from the part edit window as well as the controllers one. Also both key and channel aftertouch are saved in patch sets, and in Yoshimi type (.xiy) instruments. You can sometimes get slightly odd results if enabling/disabling options while aftertouch is engaged (i.e. key pressed hard), but apparently this is quite common across other systems. The currently set panning law is saved to patchsets, and by inference also to state files. Resets will always revert to the default law. It is always worth switching Yoshimi to mono from time to time to hear what effect this is actually having. The maximum number of MIDI_learn control entries has been increased to 400. The estimated time to load a file with all 400 entries is still less than 1 second, and the time for an incoming CC to match the very last entry is estimated to be appoximately 160uS (based in tests with 65 unique entries). The number of entries is greater than the number of CCs available (disregarding NRPNs) but keep in mind you can have several entries receiving the same CC but performing different actions, and entries can be applied to all 16 channels. CLI scripts can include a delay between commands. This so you can be sure things like PadSynth changes and instrument loads have fully initialised before being accessed by the next command. This used to be limited to 1 second, which is normally more than enough. However there are some exceptional situations that can take several seconds. Therefore we've increased the limit to 30 seconds. These are still entered as milliseconds, so to delay 15 seconds enter: wait 15000 NRPNs have been brushed up a bit. Some anomalies corrected and some bit-rot repaired. The command line has not been forgotten, and includes access to all the non-GUI features above. Also, some of the wording has been adjusted to better reflect what is happening. Much of the supplied documentation has been revised - including developer notes. There is also a new user guide being written that will include all these changes. In the meantime clicking on the manual entry in the dropdown menu will open the V 1.7.4 one (after a notification). Under the hood: Data storage has been brought into line with the XDG specification. LV2 performance has been improved. Previously the DSP load was significantly higher than stand-alone. Some x86/AMD64 specific calls (such as anti-denormals) have be replaced with platform agnostic ones. Bugfixes! As usual, we welcome all suggestions and assistance - especially regarding documentation! Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.1.0_features.txt000066400000000000000000000027111506652756400226760ustar00rootroot00000000000000V 2.1.0 - A Marsh Warbler (that can change it's warble speed) In this release (in the 'doc' directory) the new HTML user guide is the default, and it is also the one fetched from the Yoshimi drop-down menu. It now includes an appendix. This has the common Note names, their MIDI note numbers, and actual frequencies. It also has a complete list of the specific CCs and NRPNS that Yoshimi recognises. Midi Sync has now been applied to all the effects where it is relevant - such as the Echo delay time. NRPNs have been extended so that you can now set the System Effect sends. Related to that, you can also set the Part to System Effect sends. We've changed some of the CLI command names slightly so they are better identified, and a few can have shorter abbreviations. It is now possible for developers to make precise, repeatable tests of actual sound produced, so that in future we can ensure that no unintended changes are made. The new file manager has been made more consistent and the performance improved. There are also a few more small general improvements, along with bugfixes. As usual, we welcome all suggestions and assistance - especially regarding documentation! Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.1.1_features.txt000066400000000000000000000042241506652756400227000ustar00rootroot00000000000000Version 2.1.1 This is a relatively minor update. The most noticeable feature is a new button in the main window for access to the MIDI CCs window. This was always possible, but required a *right* click on the Controllers button. Lots of people never knew it was available! Not only can these controls be used when you don't have a MIDI source connected, but they can also be learned and combined with others for greater expression. We've also improved instrument bank management. This gives a faster startup (particularly with very large banks and roots) and greater protection against outside influences. A setup with approximately 7500 instrument in 200 banks that used to take nearly 5 seconds to get to the main window, now takes much less than a second. There is a mechanism that properly separates out instruments in banks that have the same numeric prefix, but different names. Also two that have different filenames but the same prefix (and are in fact the same) are treated as just the one. This situation typically occured when banks were merged in the past with a mixture of spaces and underscores in the filenames. We've removed the switch for disabling 'Enable part on program change'. It was only relevant to MIDI and nobody could think of a circumstance where they'd want to select a program via MIDI but not have it active. If you *did* want to silence a channel, CC7 (volume) would do so, and if it was just a specific part, there is an NRPN that can do it. A double-click on a path in the filer favourites view will now select it and return you to the main filer window. Finding the user guide is now virtually instant. The only delay is opening your web browser to view it. There are also improvements to the User Guide, adding extra information and clarifying some of what was already there. Various entries in the doc directory have been updated. A few more obscure bugs have been fixed. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.1.2_features.txt000066400000000000000000000034711506652756400227040ustar00rootroot00000000000000Version 2.1.2 More small improvements and extensions. MIDI-learn had remained substantially unchanged since it was implemented in 2016. It's now been overhauled, as due to some internal changes the very oldest saved files could have been misread. This has now been resolved, and a degree of 'future proofing' has been achieved. There are also more controls that can be learned, with some learnable buttons given a pale blue surround (like the check boxes). PadSynth status can now be read by the CLI so as well as seeing the " Need to Apply" warning when changing controls, you can check if you get distracted and forget. Just enter "Read apply" while in the PadSynth context to make this clear. "Apply" is also a learnable control now so it is now possible to change the harmonic content in a running project. In the CLI as well as setting GUI/CLI saved status you can now read these without changing them. The CLI can now also read the currently selected MIDI source and audio destination. We continue to refine the development testing system and at the same time have made changes in the code to ensure the minimum difference in sound output across various distros, compliers and versions. However, there will always be some differences due to the complexities of floating point code and differences within the processors themselves. Some parts of the GUI have been made a bit clearer and more readable. There has been more work on the HTML user guide, with extra details and new information. Finally, there have been a few more fixes to deeply buried bugs. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.2.0_features.txt000066400000000000000000000045651506652756400227100ustar00rootroot00000000000000Version 2.2.0 - Blackcap (a very smooth singer) A major feature is the revision of the PadSynth engine including a new mode control in 'Settings' giving 'Muted', 'Background' and 'Auto-Apply' * 'Muted' is the old form where the part is disabled while the wavetable is being built. * 'Background' (the new default) allows you to continue using the existing wavetable until the new one is built, then makes it available to apply - this will then be done seamlessly. * 'Auto-Apply' as the name suggests will seamlessly apply the wavetable once it is ready. In the Padsynth engine itself there is a new control allowing you to set how long it takes for the new wavetable to fade in. This can be up to 60 seconds. Also, there is a New experimental 'Retrigger' window with various morphing controls. The retrigger control itself set the time when a regeneration will take place. At this time the other controls will be applied by a random amount between zero and the control setting. With a retrigger time of around 500mS and small values set for the other controls, there will be minor changes to the wavetable giving subtle 'movement' to the sound. Larger values can be used for specific and more abrupt effects. In the main window there are Undo/Redo buttons for comprehensive Undo/Redo operations. We've had to make some changes to the main window layout to accomodate those sensibly. At the same time we took the opportunity to make other changes that had previously been requested. * A new control allows you to set an internal Midi Clock over a wide range if Yoshimi can't see an incoming one - useful for synced LFOs. We've swapped over the positions of the MIDI channel spinbox and the checkbox for enabling the part, and this is more obviously an on/off control. * The instrument selector button is now far more obviously a button, and with an editable core. * The Edit button is now the same colour as all the other buttons, making it more obvious. There has also been a very thorough revision of our documentation, including the Advanced Reference Manual. Not forgetting, the usual bugfixes and minor detail enhancements. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.2.1_features.txt000066400000000000000000000025231506652756400227010ustar00rootroot00000000000000Version 2.2.1 There is a useful addition of a reset button in the part edit window. This sets the instrument to the default in the same way as the instrument instrument drop menu down does, but is more convenient. Also for both of these methods, if you hold down the ctrl key it will then offer to clear the entire part instead, i.e. controllers, aftertouch etc. The confirmation message has also been updated so that you know exactly which of these actions is about to be performed. There are more windows that now stay open when you change parts and update in place. These are the part Edit window itself, Kit, Effects, Controllers, MIDI CCs, Aftertouch. All of these will also reopen if they were visible when Yoshimi was last closed. If the main window has focus, the Escape key action has been disabled. This is so you don't accidentally drop right out of Yoshimi. Two new instruments have been added to the banks, 'Ride' in Drums and 'Nostagia' in Synth. The user guide and various docs have been updated. There are also a number of code improvements and a few bug fixes. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.2.2_features.txt000066400000000000000000000007121506652756400227000ustar00rootroot00000000000000Version 2.2.2 There are also a number of code improvements and a some bug fixes. Also the reproted metadata has been expanded. The user guide and various docs have been updated. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.2.3_features.txt000066400000000000000000000025411506652756400227030ustar00rootroot00000000000000Version 2.2.3 The Command Line can now use Yoshimi's Copy/Paste feature and stored presets. Currently this only partially updates the GUI, and can sometimes produce spurious 'Not Available' messages. This is work in progress and while it won't be an issue for those with sight issues, we will be developing it further. When editing vowels in the (GUI) formant filter, there is now a reddish background to the vowel field if none of the sequence positions call for it. The fact that you can be editing a vowel that isn't actually in use, can be quite confusing otherwise! This is also reflected in the command line where there is a '?' after the vowel number, if it's not in use. Both the Formant and EQ effect windows now use 'human friendy' numbering, rather than counting from zero. This is also reflected in the Command line. The command line also now has a specific context for the formant editor, making it more obvious where you are and simplifying some of the commands. The HTML User Guide and various docs have been updated. There are also more code improvements and a some bug fixes. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.3.0_features.txt000066400000000000000000000047101506652756400227010ustar00rootroot00000000000000Version 2.3.0 - Painted Bunting A very colourful singer. The most obvious development here is the changes made to the Graphics UI. Link buttons are now quite distinct from action ones with respect to both the colour and outline. Also Learnable buttons and switches now have a different colour and text font - people were unaware of many that were learnable. You now have clear indication when control knobs and sliders are moved from their default positions. Knob pointers will change from black to red, and sliders now all have a green 'core', which will also turn red when not at the default position. Less immediately obvious is the new tab in 'Settings' that opens a 'Themes' section. Initially you will find two themes available, the 'classic' one (which is what you will see when first running version 2.3.0) and a rather extreme 'demo' example. These files are plain text and laid out to be particulalry easy to edit. The 'classic' one is actually a reference file auto-generated by Yoshimi. Rather than changing this you should make a renamed copy and alter that. Almost every element can be editied, and changes take place immediately the theme is selected/reselected. There are Import and Export options available so you can easily export a theme, change it in any text editor then import it again, optionally with a different name. Under the hood we've found a way of making many controls save and restore very high resolution settings. This is done in a way that is transparently forward and backwards compatible. Old files will be picked up at their original resolution and losslessly converted. When resaved these will still be readable by older Yoshimi versions at their native resolution, while versions 2.3.0 and later will enjoy the full range. Deep dives like this tend to shake out a few bugs, and this has been the case here. A right mouse button click on a knob or slider should set it to the default value, but a few controls had been missed - they are now included. Also, effects were only being set to the default for the first preset type. These are now set to the currently selected preset's default. Finally, all the documentation has been revised, including the Advanced Reference Manual. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.3.1.2_features.txt000066400000000000000000000027041506652756400230430ustar00rootroot00000000000000Version 2.3.1.2 Although marked as a bugfix release, there are a few useful additions and improvements. The most obvious of these is a change in the presentation of the Copy/Paste windows. The title bar now shows the section they represent, and the 'Type' field shows a human-friendly name. Less Obvious is that the clipboards are now persistent, so you can pick up the last ones used even over a computer reboot. Discovery of the built-in HTML user guide has been improved. It was found that one disto used a rather strange location for documentation. Now, on a first-time start (or version update), as you start Yoshimi a thorough search is made, and the location of the most recent copy is stored. As this can take some time it is performed in a background task so it doesn't slow down Yoshimi's startup. From then on, calling to display the guide is only delayed by as much time as your default browser takes! The developer's information has been updated. The PDF file with all the command data had been causing problems with merges, so has been replaced with an HTML version. This has been further updated and expanded. Being separate files for each section it is also easier to maintain. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.3.1_features.txt000066400000000000000000000026471506652756400227110ustar00rootroot00000000000000Version 2.3.1 There have been improvements in the handling of microtonal scales. First off, you can now export scales and keymaps. We were not handlng Scala imports that have comments attached to the numeric entries. This has been fixed, and these are now saved in our XML files. We've corrected the handling of zero size keymaps. This sets the same map series as if there was no mapping, but the First, Middle, Last key entries are still active. Unfortunately these changes are not backward compatible, but Yoshimi will still correctly handle older files. If the virtual keyboard is visible, selecting instruments from a bank will pass focus back to it. This means you can quickly try out various instruments without any external kit attached. Window title bars are now more consistent in both style and content. There had been a number of them with poor descriptions and a few with none! We've revised some of the MIDI example files so that they use bank root 5. This should always point to a copy of the default bank set. As usual there are a few bugfixes including an extremely obscure crash in PadSynth which only occurred with a somewhat contrived setup. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.3.2_features.txt000066400000000000000000000016231506652756400227030ustar00rootroot00000000000000Version 2.3.2 There is a new feature here that was requested by one of our users. This is the ability to have independent Left and Right delay times on the Echo effect. This can result in (apparently) random left/right bounces. If BPM is fixed as well quite complex repeatable bounce patterns can be generated. There have also been a number of relatively minor bugfixes, and some significant code refactoring, such that the code size is now less than half what it used to be, and runs more efficiently. Despite the extent of the changes, our own specialised audio test system reports no unintended alteration of any sound generation. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.3.3_features.txt000066400000000000000000000034021506652756400227010ustar00rootroot00000000000000Version 2.3.3 Configuration control has been improved - using start-up options no longer modifies the stored settings, but if you change a setting while running, just that configuration change is stored. There has been further work on GUI themes management, along with unification and consolidation of some background colours. Added to this, there are improvements for those wanting to edit themes. Most notably, if you edit a theme currently being used, Yoshimi will automatically update the display as you make the changes. To avoid unnecessary processor use, this is only done while the themes window is open. A new 'Monochrome' control has been added to themes that converts all window colours to grey scale values. This is to help theme creators ensure that the display will work well for colourblind users. It revealed that the default theme we've used for years behaves rather poorly, and work is under way to develop a high contrast alternative. The range of keyboard shortcuts has been extended (for the current window with focus). There are new instruments added to the supplied banks with particular attention to drum sounds. We've updated the built-in user guide and also made general documentation improvements. Some long-standing display issues have been resolved, in particular relating to graphs. There has been a major effort updating all the underlying code structure in keeping with modern memory-safe practices. In the process a few rather obscure bugs have been identified and squashed. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_2.3.4_features.txt000066400000000000000000000024741506652756400227120ustar00rootroot00000000000000Version 2.3.4 There is a new 'Omni' control. Any part can now be set to receive MIDI from all incoming channels. This has also triggered a significant change to the main window layout. You are now warned if any load or clear action could overwrite edited but unsaved instruments. These would be inpossible to recreate precisely. The same warning is given if you try to exit Yoshimi with unchanged instruments in place. All the part numbers with changed instruments are listed. e.g. Instruments in parts 2 5 33 52 have been edited. Still Exit? However, you are no longer warned about unsaved configuration changes, as these are now filed as they are made. There has been further updating of the underlying code structure. In particular a major effort has been made to enable recognition of MXML version 4.x as well as 3.x. We've also made smaller changes needed for FLTK 1.4.x compatibility. For improved consistency some yes/no configuration controls have had the stored setting swapped, so we advise checking these the first time you run version V2.3.4. Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi Or: https://github.com/Yoshimi/yoshimi Full build instructions are in 'INSTALL'. Our list archive is at: https://www.freelists.org/archive/yoshimi To post, email to: yoshimi@freelists.org yoshimi-2.3.5.1/doc/Histories/Yoshimi_Early_History.txt000066400000000000000000000115041506652756400231370ustar00rootroot00000000000000Written in 2013 Zyn was originally written by Paul Nasca when he was in his early 20s, as a linux stand-alone synth. The Windows port was a later bolt-on, as was support for the Jack sound server. My understanding is that many of the later problems were due to the compromises made then. V2.2 of Zyn had been dormant for a very long time, as Paul was working on other things. Eventually he opened the window inviting others to contribute, and showed interest in the idea of someone else taking lead role. Alan (Cal) made a number of suggestions which at first seemed to be ignored. Mark dived in and soon took lead. He then started bouncing around lots of ideas that many of us thought were really diversions, and didn't seem to be paying attention to the real problems Zyn had. Cal eventually lost his patience saying he didn't have time for all this politics (few of us knew at that time he meant it quite literally) so was forking Zyn. In the mean time Mark had pushed out Zyn 2.4.1, which to my mind was a total disaster. He'd eliminated freezes by killing the audio output where mutex issues were imminent. This meant that there where horrible glitches if you tried to run a complicated patch at any speed. It remained like that for a long time and possibly did Zyn's credibility a lot of harm. This was later put right. Meanwhile in a short space of time Cal made improvements to the stability of the synth now named Yoshimi. Yoshimi is Linux only. Stripping out the Windows code made a big difference. The next thing he did was add in a decent set of compile-time optimisations, which made a dramatic difference. He then steadily improved the overall efficiency, eliminated crashes when very large patch sets were loaded (still not sorted in Zyn) and behind the scenes, tidied up the codebase. I've been looking through it recently to try to do some work on it myself and compared to Zyn it is far more elegant (that's the only way I can describe it). A major problem in Yoshi that cropped up was what we called the Heffalump bug. It was eventually identified by Lars Luthman and was due to dnormal behaviour (I don't understand the full details), and I think was related to Cal bringing in the boost library. This worried Cal for a long time and I think also occurred at a critical time. As his illness progressed Cal had more difficulty concentrating, was able to spend less and less time on Yoshi and was beginning to make unfortunate mistakes. I was in frequent contact with him and regarded him as a real friend, but eventually there were no more emails and we found out he'd died. He was 61. That was coming up for 2 years ago and it still gets me sometimes. Since then there have been sporadic efforts by a number of us to keep Yoshi going - although the current lead dev wants to back out. There have been bug fixes and a few feature additions. There are two outstanding non-critical bugs I know of and one odditiy, otherwise it is rock solid and still manages to be more processor efficient than Zyn, especially on complex stuff. My tune 'Ride With Yoshimi' on a single pass, uses just two instances with different voice patches on all 32 possible channels. Last time I tried Zyn couldn't get through the first section of the tune - and I had to load each patch individually, as it crashed when trying to load such large patch sets. Zyn has some additional features that haven't been ported to Yoshi yet (nobody to do it) and Mark is in the process of a total rewrite of Zyn. I have no idea how long that will take, nor what the eventual result will be, but I will be keeping an eye on it. There have been many criticisms of the GUI some quite valid, but it is an insanely complex synth and IMO the only way to manage this is some form of paging, although maybe not to the same depth as currently. Zyn/Yoshi is the only soft synth that I know of that lets you take baby steps at first and eases you fairly naturally into the hard stuff. As a comparison Phasex (also linux only) has a single panel with row upon row of controls. I can't use it at all. A few facts about Cal himself: He married his childhood sweetheart. However she died when their only child was still a toddler. He brought her up single-handed - never remarried, and according to his daughter, never even looked at another woman. When he was diagnosed with pancreatic cancer nobody thought he'd survive long enough to see his first grandson born. To everyone's astonishment, he actually fought it off for FIVE years, so not only saw, but got to know both of the boys. Through all this, he never lost his sense of humour. For a while there was a picture on the Yoshimi website of Peta and the boys, simply titled: "Three reasons to be cheerful". Survival rate for this cancer is very low, life expectancy usually less than 6 months. However, it wasn't this that killed him, but in his weakened state he developed another type of cancer. yoshimi-2.3.5.1/doc/Histories/Yoshimi_License_History.txt000066400000000000000000000047051506652756400234520ustar00rootroot00000000000000Software licenses are are something I *really* don't want to get involved in - I have much better things to do with my time - but I found I was obliged to do so. It is possible I'm the only person who knows all the following events, as I was the one that instigated them! The first time I saw ZynAddSubFX source files they were licensed as GPL V2. At that time Zyn had a number of very serious problems, and not much was being done about them. Somewhat naively I asked Lars Luthman if he would help, as he had offered a couple of small patches previously. His response was that he would not do any significant work, as he did not agree with the GPL V2 only license. I then contacted Paul, explaining the situation and asking if he would consider a change in the license to V2 or later. I was actually a bit surprised that he immediately agreed. When I next looked at the sources, the licenses on the files had indeed been updated, so I passed this information on. Unfortunately Paul forgot to update the website, but I wasn't especially concerned as it was only the files themselves that really mattered. While developing Yoshimi after the initial fork, Cal queried the license situation. I told him of the conversations I'd had, and passed him a copy of the email I'd got from Paul. Later on, Cal - in good faith - wrote new sources and placed them under GPL V3. This would be quite compatible with V2 or later, but not with V2 strict. What I didn't notice until very much later was that Paul had only updated half of the text in the sources, leaving the actual licence in an ambiguous state. To the best of my knowledge, V3 is not compatible with V2 strict, but V2 or later is. However the *complete* project then becomes downgraded to V2 strict - although the V2 or later sources (such as all the new root/bank code) can independently be freely merged into V3 code. I doubt anyone would actually make an issue of this. However, to safeguard Yoshimi as a whole, I took it upon myself to change Cal's code to V2 or later. I believe it retains the spirit of his wishes, and the only person with standing to object - his daughter - has been totally supportive of the work currently being done on Yoshimi. Any source code I add will be GPL V2 or later. Update. The original change discussion has now been located and the license for both Zyn and Yoshi is confirmed as GPL V2 or later. Anyone wanting to confirm this should look at the Zyn user list archives August 2007 and September 2007. yoshimi-2.3.5.1/doc/Histories/Yoshimi_Only_NRPNs.txt000066400000000000000000000016371506652756400223110ustar00rootroot00000000000000 Shortform (doesn't use the data bytes) CC 99 CC 98 MSB LSB 0x41 0-5 set solo switch type (0 = off) 0x42 0-0x77 set solo incoming CC 0x44 0x44 Shutdown Yoshimi gracefully 0x44 0x45 Shutdown Yoshimi immediately and with exit value 16 Full (requires data bytes) CC 99 CC 98 MSB LSB 0x40 0 Direct part control (see Direct_Part_Control.txt) 0x40 1 Vector control (see Vector_Control.txt) 0x40 2 System settings (see Dynamic System Settings) 0x60 Load numbered files from history lists 0 Instrument 1 Patch Set 2 Scale 3 State 4 Vector 5 MIDI Learn Dhi (6) 0-63 Part number for Instrument (>63 last seen by NRPNs) 0-15 Base channel for Vector (>15 preferred channel in file) Dlo (38) Entry number in list (0-24) yoshimi-2.3.5.1/doc/Histories/Zyn_ChangeLog000066400000000000000000002013301506652756400205100ustar00rootroot000000000000006 Mar 2002 -(dupamasa - in jur de ora 4) Mi-a venit ideea exact cum sa fac cand ma plimbam pe strada Pandurilor 7/8 Mar 2002 - Started to do diagrams 10 Mar 2002 - Started to write "voice" 11 Mar 2002 - Heard first sound 12 Mar 2002 - tested with 200 voices 16 Mar 2002 - made "Note" the main class - added vibratto - added glissando 20 Mar 2002 - started to write the Envelope class 21 Mar 2002 - Envelope written (almost) Volume envelope almost written 23 Mar 2002 - Scris relasenote(putin) Envelope-ul este si in dB "glissando" este inlocuit cu "Envelope" de frecventa started to write the LFO class 24 Mar 2002 - Corrected a bug that could crashed the synth (forgotten to disable the amp/freq envelopeenabled when killed it) 25 Mar 2002 - Started to write the Filter class (wrote only few lines) 27 Mar 2002 - Scris filtrul(putin), si FilterEnvelope 28 Mar 2002 - Adaugat la LFO si tipul "rampup" si "rampdown" Scris filterLFO si amplitudeLFO(termollo) redenumiti si aranjati parametrii Adaugat LFO delay Scris FilterEnvelope(corect) si FilterLFO(corect) 29 Mar 2002 - Adaugat RingModulation Adaugat FM/RM Amplitude si Frequency Envelope Corectat un bug minor la Envelope-ASRinit(); Adaugat FM 01 Apr 2002 - Corectat un bug care facea sa se auda paraituri la sunetele care incepeau co o faza!=0 Scris cativa dintre parametrii globali Envelop-ulire,LFO,Filter,.. 02 Apr 2002 - Curatat putin ADnote Adaugat VelocityScale la amplitudine, la FM si la Filtru Global 03 Apr 2002 - Aranjati toti parametrii ADnote in structuri 04 Apr 2002 - Mutati multi parametrii in ADnoteParameters Inceput sa scriu ADnoteParameters 05 Apr 2002 - Inceput sa scriu clase speciale pentru parametrii(midi) (LFO..) 06 Apr 2002 - Continuat sa scriu clasele speciale pentru parametrii Teoretic merge sinteza multitimbrala(Adica se poate aplea ADnote(canal,note,vel)) 07 Apr 2002 - Completat(aproape) transferul de parametri midi la cei reali 08 Apr 2002 - Added FM oscil at parameters and corrected a small FM bug 09 Apr 2002 - Inceput sa-l fac real-time 10 Apr 2002 - Merge la keyboard-ul MIDI, polifonic 27 Apr 2002 - Scris interfata la OSS, la latenta scazuta Corectat un bug care facea ca sa se execute calcule inutile, ceea ce facea ca polifonia maxima sa scada de 10 ori 29 Apr 2002 - Inceput sa scriu interfata midi(obiect) 30 Apr 2002 - Continuat putin interfata midi (dar nu am terminat) 02 Mai 2002 - Merge in timp real cu latenta scazuta, dar se mai auda niste "pacanaituri" 03 Mai 2002 - Inceput sa scriu Reverb (acum este doar ecou) "Pacanaiturile" au fost eliminate. 09 Mai 2002 - Reverb-ul suna a reverberatie 11 Mai 2002 - Adaugat cativa parametrii midi la Reverb 18 Mai 2002 - Adaugat filtrul AllPass la Reverb si adaugat parametrul Plohidamp 19 Mai 2002 - Adaugat InitialDelay (idelay) la Reverb 24 Iun 2002 - Clasa Filtru nu mai este dependenta de FilterParams(pot sa-l folosesc in alte scopuri) Corectat un bug la filtru care facea ca la rezomante scazute sa amplifice f. mult basii Adaugat High Pass Filter Rezonanta filtrului este exponentiala Adauga LPF+HPF la Reverb Inceput sa scriu Generatorul de Functii (OscilGen) 25 Iun 2002 - Scris cateva forme de unda (functii) Reverb-ul are volumul in dB si daca este zero(ca parametru) atunci se dezactiveaza 02 Iul 2002 - Adaugat inca o functie la generatorul de functii 03 Iul 2002 - Inceput sa scriu generarea de functii la OscilGen pe baza de FFT Inlaturat DC-ul de la OscilGen 04 Iul 2002 - Adaugat ANTI-ALIASING la ADnote si insumarea armonicelor se face in domeniul frecventa Corectat un bug care facea sa sune rau dac OSCIL_SIZE!=512 (era declarat de 2 ori) 12 Iul 2002 - Adaugat posibilitatea de a folosi ca modulator alta voce Adaugat parametrii MIDI la OscilGen 13 Iul 2002 - Adaugat Randomness la clasa OscilGen 15 Iul 2002 - Adaugat si Panning(incl. Randomness) => instrumentul este acum stereo 16 Iul 2002 - Adaugat Randomness la LFO (faza 0 => random) Inlaturat o eroare care facea ca amplitudinea sa nu fie interpolata 17 Iul 2002 - Volumul FM-ului este exponential Adaugat atenuare la volumul FM-ului la note inalte 23 Iul 2002 - Adaugat EnvelopeStretch Corectata o eroare care facea ca uneori sunetul sa se auda foarte tare la inceput Adaugat fade-in (f. scurt) si fade out in caz ca envelop-ul are A=0 sau R=0, a.i. sa nu se auda pacanaituri 24 Iul 2002 - Corectat Relase-ul la Envelope si adaugat ForcedRelase 25 Iul 2002 - Adaugat posibilitatea de a nu folosi AntiAliasing-ul Adaugat Frequency Modulation (nu phase modulation) Adaugat Delay la fiecare voce Adaugat Morphing la modulatie 26 Iul 2002 - Inceput sa scriu clasa Part 27 Iul 2002 - Se face controlul Midi folosind clasa Part si nu ADnote 28 Iul 2002 - Corectata o eroare care facea sa se instantieze clasa ADnoteParameters pt. fiecare nota => memoria era ocupata excesiv si "manca" din procesor. Cauza erorii este ca trimiteam obiectul ADnoteParameters ca parametru si nu referinta lui. Asta era cauza pacanaiturilor ce se auzeau daca apasam multe clape simultan. 29 Iul 2002 - Adaugat clasa Master (Permite acum mai multe instr. simultan => multitimbral) Observat o eroare la Envelope 30 Iul 2002 - Adaugat EnvelopeStretch si Forcedrelase la instantierea unui obiect EnvelopeParams Durata Sustainul-ui fortat este acceeasi indiferent de paramentrul EnvelopeStretch Adaugat Ecou 31 Iul 2002 - Daca VelocityScaleFunction=127 atunci orice vel. va face amplitudinea maxima (ca si cand vel.=127) Inceput sa scriu Interfata Utilizator 01 Aug 2002 - Toti parametrii sunt convertiti in REALTYPE direct de ADnote,de LFO Inlataurate mici probleme de AntiAliasing daca detune-ul era prea sus si la unele moduri FM Programul incepe sa fie controlabil de Interfata 02 Aug 2002 - Inlaturat o eroare stupida care facea ca sa se seteze valorile EnvelopeParams la -1 (scria din Master:: prea mult) 03 Aug 2002 - Terminata interfata pentru ADnoteParameters.GlobalPars Adaugat inca un parametru la lfo (continous LFO) care faca ca LFO-ul sa nu inceapa la fiecare NoteOn Corectat doua erori la ...[nvoice].AmpEnvelope si ...[nvoice].FreqEnvelope Scrisa interfata pentru ADnoteParameters.VoicePars (fara FM+OSCIL...) 04 Aug 2002 - Scrisa interfata cu FM (fara Oscil) Corectate doua erori cu provire la FMampenv si FMfreqenv Inlaturat aliasing-ul la vocea FM Modificata interfata (Voice si FM-ul sunt intr-o singura fereastra) Inceput sa scriu schimbare voce curenta. 05 Aug 2002 - Adaugat interfata pentru cei mai importanti parametrii ai ADnote_VoicePar[nvoice] Inceput sa scriu interfata pentru OscilGen 06 Aug 2002 - Este mult mai usoara schimbarea vocii curente. Inceput sa scriu OscilEditor Nu mai este necesara changebasefunc() la oscil pentru a schimba basefunction, se apeleaza automat. OscilEditor este (aproape) complet Toti parametrii ADnoteParameters au UI Corectate cateva erori (cauzate de faptul ca nu am verificat daca ADnote::...Enabled!=0) 07 Aug 2002 - Corectata o eroare la envelope Adaugat afisaj spectrum la OscilEdit Adaugat parametrii noi: extenal oscillator (voice si FM) si oscilphase(si FM) si interfata pentru ei Gasite mai multe erori care apar daca misc widget-urile in timp ce cant la clape (probabil este vorba de thread-uri care trebuie sa fie sincronizate sau ceva cam asa sau memory leaks) Inceput sa scriu interfata pentru Part Adaugat bypass la filtrul global Adaugat conversia oscil-ului in basefunction Corectata o mica eroare la calcularea oscil-ului referitor la faze 08 Aug 2002 - In VoiceList valorile sunt actualizate la fiecare apasare a butonului "ShowVoiceList" si formele de unda sunt afisate corect. Corectate niste mici erori la FM Daca se foloseste ca modulator o alta voce, interfata dezativeaza unii parametrii FM daca sunt inutili Inceput sa scriu interfata si parametrii Master/Part Schimbat putin Master si Part (atentie sa nu se instantieza ADnoteParameters la fiecare apasare de tasta) Inceput sa scriu control-ul pentru Master/Parts 09 Aug 2002 - Scris parametrii Part si Master Inceput sa scriu sincronizarea intre thread-uri 10 Aug 2002 - Adaugat o noua forma de unda la OscilGen Adaugat sincronizarea intre thread-uri=>programul nu mai crapa daca in timp ce apas clapele, modific forma de unda Adaugat enable/disable ADnote Inceput sa scriu SUBnote/SUBnoteParameters Se poate canta si la SUBnote(inceput sa scriu UI pt. el) 11 Aug 2002 - Scris controlul armonicelor Adugati cativa parametrii la SUBnote Adaugat AmpEnvelope la SUBnote(si UI) 12 Aug 2002 - Adaugat Detune la SUBnote si schimbat Detune-ul la ADnote Adaugat FreqEnvelope la SUBnote 16 Aug 2002 - Corectata o eroare care facea ca VoiceOut sa fie inlaturat chiar daca era inca folosit(de alte voci) Daca "Forced Relase" este off atunci se face relase-ul liniar Adaugat BandWidth Envelope 17 Aug 2002 - Inceput sa pregatesc pentru EffectManager 18 Aug 2002 - Adaugat inca un parametru la Reverb: initial delay fb Scris efectele de insertie Inceput sa scriu efectele de sistem 19 Aug 2002 - Continuat sa scriu efectele de sistem Inceput sa scriu interfata la Efecte (Reverb - terminat, aproape) 22 Aug 2002 - Corectata o eroare la Echo Se poate schimba efectul de insertie Gasita o eroare care "crapa" programul daca schimb efectul de le Reverb (rezolvata temporar, dar cu "memory leak") 23 Aug 2002 - Corectata eroarea la Reverb (a fost din cauza ca am pus ">" in loc de ">=" :-p ) Terminat efectele de insertie(si interfata) Adaugat Effect cleanup Scrisa interfata pentru efectele sistem (cu exceptia sendto another sys eff) 24 Aug 2002 - Adaugate doua noi efecte: Chorus si Phaser 25 Aug 2002 - Nu se mai aude tacanit la Chorus daca schimb Delay/Depth Corectat o mica eroare care facea ca sa nu se afiseze Pinsparts corect Adaugat un nou efect: AlienWah Nu se mai aude tacanit la Phaser si la AlienWah la frecvente LFO f. mari 27 Aug 2002 - Adaugata o noua forma de unda: Chirp Adaugat Waveshaping la OscilGen Se poate compila si fara UI Inceput sa scriu Salvarea/Incarcarea Parametrilor 28 Aug 2002 - In ADnoteVoiceListUI se afisaza corect daca vocea este activata/dezactivata Scrisa Salvarea/Incarcarea parametrilor (cu exceptia la OSCIL::UseAsBaseFunction) Adaugat File Save/Open 29 Aug 2002 - Se poate salva si oscil::useasbase Se afiseaza corect valorile dupa incarcare 01 Sep 2002 - Adaugat "codul de intrare" sa saveload 0xfe pt. a sti de unde incepe o noua "ramura" "Codul de intrare" este folosit pentru a nu incarca "ramurile" care nu se potrivesc cu specificatiile (ex. nr. de voce sau nr. part prea mare) Adaugat header la fisier Imbunatatit OscilUI::useasbase 03 Sep 2002 - Modificat codurile de parmetrii: indicele par. sunt >= 0x80, parametrii <0x80 , controlerii speciali(urcare/coborare creanga) >=0xf0; Este util la versiunile viitoare, la forward/reverse compatibility. Inceput sa scriu clasa Microtonal si interfata pt. Microtonal 04 Sep 2002 - Adaugat Pfilterbypass la salvare (am uitat sa o pun pana acum) Aproape terminat Microtonal-ul (cu exceptia importului din fisiere .scl) 05 Sep 2002 - Facut cateva mici modificari la Microtonal si Echo Adaugat un nou parametru la ADnote: PVolumeminus Adaudat parametrii noi de Detune: Pcoarsedetune(coarse+octave) si Pdetunetype Adaugat cateva tipuri de detune 06 Sep 2002 - Adaugat posibilitatea de a folosi ADnotepars:Globalpars.Pdetudetype in loc de Pdetunetype (0 = default detunetype), asa ca nu mai trebuie sa mai modific la fiecare voce detunetype: setez la 0 si modific global-ul Facut mici modificari la MidiInput(OSS) 07 Sep 2002 - Corectata o eroare cu privire la detune si daca freq. > Nyquist Modificat driver-ul OSSmidiin Adaugat driver Alsa cu port virtual Se poate salva doar instrumentele/microtonal. Adaugata un nou fel de waveshaping(Zigzag) 08 Sep 2002 - Psysefxvol[][] sunt scalate in dB Nu mai este periculos sa inchid fereastra principala 09 Sep 2002 - Se actualizeaza corect la incarcare la Master:Psysefxvol[][],Pvolume,Pkeyshift; si alti parametrii la Part Adaugat nume la Part Panic-ul (Shut-up-ul) se aplica si la efecte Part->Penable controleaza de fapt daca Part-ul este activat/complet dezactivat. Daca se dezactiveaza un part toate notele+ efectele insertion sunt oprite. Nu mai consuma CPU daca folosesc multe part-uri. Adaugat un nou parametru la part: Pnoteon care controleaza daca part-ul primeste mesaje NoteOn Adaugarea extensiei se face automat. Adaugat LFO exp_up 1 si 2 Curatat putin de memory leaks (mai am de curatat si interfata) 10 Sep 2002 - Adaugat filtrul HPF cu un pol Interfata se inchide corect. Adaugat textul cu Copyright in interfata Traduse toate comentariile in limba engleza Adaugat licenta in fiecare fisier 11 Sep 2002 - Adaugat descriere la fiecare fisier Corectata o eroare care facea ca SUBnote sa aiba amplitudini f. mari la freq. f. inalte Adaugat cateva macro-uri la interpolarea amplitudinii 12 Sep 2002 - Modificat extensiile (*.mas.zyn ---> *.mas_zyn, la fel si celelalte) pentru a nu aparea fisiere *.mas.mas.zyn 13 Sep 2002 - Am decis numele programului: "ZynAddSubFX" (Zyn de la synthetizer (inlocuit S cu Z), Add de la additive, Sub de la substractive, FX de la effects) 14 Sep 2002 - Volumul din ADvoicelist se afiseaza corect 15 Sep 2002 - Adaugat inca 3 moduri de waveshaping Limiter, UpperLimiter, LowerLimiter 16 Sep 2002 - Adaugat Makefile 17 Sep 2002 - Corectata o mica eroare care facea ca sa nu se incarce fisierele cu data intotdeauna Nu se amplifica freq. f. inalte daca freq. filtrului este mare. Inceput sa scriu documentatia. 18 Sep 2002 - Adaugat functia de resetare a tuturor parametrilor(master si instrument) 23 Sep 2002 - Adaugat posibilitatea de a conecta efectele de insertie la iesire Master Lfo-ul la frecventa incepe de la 0 pt. startphase=0 24 Sep 2002 - Corectate niste mici erori la Chorus/Phaser Adaugat si "substract" la Chorus si Phaser Limitat tipul detune-ului la valoarea maxima 25 Sep 2002 - LANSAT PE INTERNET - PRIMA VERSIUNE (1.0.0) -------------------------------------------------------------------------------------------------- 01 Dec 2002 - Corectat niste comentarii - Inlaturat o eroare care facea ca ZynAddSubFX sa crape daca dezactivez un part utilizat - Inceput sa scriu Rezonanta 02 Dec 2002 - Terminat de scris Rezonante - Adaugat filtru trecer-banda (BPF) - Scris Recording 03 Dec 2002 - Adaugat Gain la Resonance - Adaugat "New Instrument" la meniu 06 Dec 2002 - LANSAT PE INTERNET - VERSIUNEA (1.0.1) -------------------------------------------------------------------------------------------------- 08 Dec 2002 - Inceput sa scriu Bank si interfata pentru Bank 09 Dec 2002 - adaugat si "make debug" - Continuat sa scriu Bank/UI; acum se poate folosi (dar nu salva pe HDD) 10 Dec 2002 - Terminat Bank (mai trebuie scris un "config" file pentru a alege automat ultima banka folosita) 11 Dec 2002 - Am mai lucrat ceva la Bank si am adaugat "config file" 12 Dec 2002 - Filtrul BPF suna mai tare - Nu mai ar trebui sa fie probleme la compilarea FFTwrapper.h (fftw.h) 13 Dec 2002 - LANSAT PE INTERNET - VERSIUNEA (1.0.2) -------------------------------------------------------------------------------------------------- - Corectat o eroare care facea ca programul sa crape daca salvam parametrii in timp ce cantam - LANSAT PE INTERNET - VERSIUNEA (1.0.2-1) - de acasa -------------------------------------------------------------------------------------------------- 21 Dec 2002 - Corectate mici erori (nu mai dispare "Bypass Global Filter", inlaturat zgomotul de mica amplitudine - cauzat de reverb,nu mai apare intarzierea foarte lunga de la inceput a notelor muzicale daca conectam la aseqview) - Adaugat filtru de rejectie banda (Notch) - adugat randomize la Resonance - Inceput sa scriu VU-meter-ul 22 Dec 2002 - Terminat VU-meter-ul - Schimbat modul in care efectele de insertie se calculeaza (suna mai tare un pic) - Adaugata o noua functie la OscilGen 23 Dec 2002 - LANSAT PE INTERNET - VERSIUNEA (1.0.3) -------------------------------------------------------------------------------------------------- 24 Dec 2002 - Adaugata posibilitatea de a incarca fisiere ".scl" (la Microtonal) 26 Dec 2002 - Adaugata optiunea de a folosi numai OSS-ul (fara ALSA) 27 Dec 2002 - Corectate cateva erori si modificate cateva lucruri marunte la Microtonal 28 Dec 2002 - Mici modificari la Microtonal - Panic-ul la Reverb functioneaza OK - Inceput sa scriu Scale Degree Mapping la Microtonal 29 Dec 2002 - Continuat Scale Degree Mapping la Microtonal (dar nu am terminat) 30 Dec 2002 - Corectat lucrul cu ScaleShift-ul - schimbat modul in care se face keyshift-ul (nu se mai schimba armonia, indiferent de sistem) 31 Dec 2002 - Terminat Mapping-ul la Microtonal(incl. incarcarea/salvarea) Corectat eroarea care facea ca la Microtonal sa nu se incarce de fiecare data din scl_zyn unele date * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 01 Ian 2003 - Corectata o eroare la Microtonal (erau probleme la InvertKeys daca era folosit key mapping) - Adaugata un nou tip de waveshaping (Inverse Limiter) 02 Ian 2003 - Adaugat afisaj al acordului fin (cents) - Butoanele arata f. frumos (am adaugat un nou widget in loc de Fl_Dial) 03 Ian 2003 - Schimbate butoanele (putin) - Nu se mai aude un tacanit la ShutUp sau AllNotesOff - Corectat putin waveshaper-quantisize si butoanele - Inlaturata o eroare care facea ca programul sa crape daca schimbam unii parametri ale efectelor 07 Ian 2003 - LANSAT PE INTERNET - VERSIUNEA (1.0.4) -------------------------------------------------------------------------------------------------- 08 Ian 2003 - Am inlaturat de-a binelea eroarea (cu efectele - 3 Ian) 11 Ian 2003 - Corectate o mica eroare care facea ca volumul sa fie negativ la ADnote::voice[].PVolume <64 13 Ian 2003 - Corectata o mica eroare la VU-Meter - Corectata o mica eroare cu privire la panning la Reverb 15 Ian 2003 - Adaugat min/max keyresponse limits la Part - Adaugat Filtru si FiltreEnvelope la SubNote 16 Ian 2003 - Curatat codul sursa (ADnote) prin inlaturarea unor variabile - Durata fadein-ul este aleasa automat (a.i. sa nu rezulte click-uri la notele joase si nici fadein-ul audibil la notele inalte sau cu freqcvente inalte) - Corectata o mica eroare care faca ca uneori instrumentul sa nu fie salvat/sters la Bank slot-ul cerut - Imbunatatita putin interfata: La ADnote si SUBnote, butoanele care controleaza amplitudinea armonicelor sunt colorate diferit daca au amplitudinea 0 17 Ian 2003 - Corectate erori la Chorus si la Phaser care faceau ca sa sune prea 'sec' (din cauza ca wet-ul era la 50% din volum) 18 Ian 2003 - Inceput sa scriu Preset-uri la efecte 19 Ian 2003 - Adaugat Preset-urile la efecte 20 Ian 2003 - Schimbat putin HPF-ul la Reverb 21 Ian 2003 - Adaugat tuning-ul la Reverb (si Freeverb) si Roomsize - Schimata putin interfata si modificat putin widgetul Pdial 22 Ian 2003 - Amplificat volumul Reverb-ului cu 6 dB - Buffer-ul foloseste liste simplu-inlantuite, asa ca nu-i mai problema la "configuratii mari" (multe part-uri) 24 Ian 2003 - LANSAT PE INTERNET - VERSIUNEA (1.0.5) -------------------------------------------------------------------------------------------------- 26 Ian 2003 - Inceput sa scriu GetAudioOutSamples, care ar putea fi apelat in modul callback 27 Ian 2003 - Adaugat o noua fuctie la waveshaping (clip) - Adaugat suportul pentru Jack (adica programul poate rula in modul call-back ;-) ) - Inlaturata o eroare care facea ca npart sa fie foarte mare si ca programul sa crape 29 Ian 2003 - Schimbari foarte minore la OscilGen::waveshape (la clip) - Daca dau "clear" la OscilEdit, butoanele care au amplitudinea zero, sunt colorate corect 30 Ian 2003 - LANSAT PE INTERNET - VERSIUNEA (1.0.6) -------------------------------------------------------------------------------------------------- 31 Ian 2003 - Inceput sa adaug optiuni la linia de comanda - Rata de esantionare (SAMPLE_RATE) este setata la rulare si nu la compilare 01 Feb 2003 - Inca 2 variabile sunt setate la rulare (SOUND_BUFFER_SIZE si OSCIL_SIZE) - Volumul la Part se aplica doar dupa efecte de insertie - Inceput sa scriu Distorsionarea (fara filtre) 02 Feb 2003 - Schimbate modurile de distorsionare (exp -> asym1 si pow -> pow ( altul ) ) - Terminat Distorsionarea 03 Feb 2003 - Adaugata inca o functie la waveshape (asym2) - Inceput sa scriu Controller-ii - Adaugat controller-i PitchWheel,Expression,Panning,Filter Cutoff, Filter Q, BandWidth, Modulation Wheel - Panning-ul si volumul sunt interpolate - Inceput sa scriu un nou program (Controller) care timite mesaje midi (controller) catre un port ALSA - Panning-ul la Part se aplica doar dupa efecte de insertie - Panning-ul la efecte se aplica inainte de procesare 04 Feb 2003 - Adaugat posibilitatea de a seta intensitatea/dezactiva la controlleri(incl. UI) - Adaugat controler-ul FMmodulationAmplitude - Corectat o eroare la Buffer (care facea ca Buffer-ul sa nu se reseteze :-P ) 05 Feb 2003 - Corectata o eroare care facea ca programul sa consume mult din procesor (denormalisation) - Nu mai este permisa o valoare a lui OSCIL_SIZE care sa nu fie putere a lui 2 (este ajustata automat) - Adaugat controller-i Volume si Sustain Pedal, AllNotesOff, AllSoundOff, ResetAllControllers - Adaugat NRPN, adica toti parametrii efectelor pot fi controlati prin controlleri 06 Feb 2003 - Pus limite la parametrii efectelor a.i. sa nu se seteze (datorita controllerilor) la valori nevalide - Inlaturata o mica eroare la controller-ul BandWidth - Schimbat putin EffectLFO::updateparams - Controler-ul BandWidth afecteaza doar FineDetune-ul - Schimbat putin identificare controlerilor si adaugat controlleri la OSS - Schimbat putin interfata utilizator la controlleri 07 Feb 2003 - LANSAT PE INTERNET - VERSIUNEA (1.0.7) -------------------------------------------------------------------------------------------------- 08 Feb 2003 - Adaugat modul "mono"(monofonic) la part - Inceput sa scriu portamento-ul 09 Feb 2003 - Terminat portamento-ul 10 Feb 2003 - Inceput sa scriu Equaliser-ul - Inlaturata o eroare care facea ca la parametrii efectelor care sunt 0 sa nu fie incarcati 11 Feb 2003 - Terminat Equaliser-ul (adica adaugat vizualizator freq response) - Corectata o mica eroare care facea ca part-ul 0 sa fie activ chiar daca cel salvat era inactiv 12 Feb 2003 - Mici modificari la EQ (UI) - Adaugata posibilitatea de swap (stanga <--> dreapta) - Adaugat Q la filtrele shelf 13 Feb 2003 - Adaugat inca un parametru la Phaser (phase) - Curatit putin codul sursa la efecte - Adaugat system effect send to next systems effects 14 Feb 2003 - LANSAT PE INTERNET - VERSIUNEA (1.0.8) -------------------------------------------------------------------------------------------------- - cateva mici modificari (de la un patch primit de pe Internet) - adaugat keylimit la Part (si first note priority) 15 Feb 2003 - Corectata o foarte mica eroare la Part 16 Feb 2003 - Se poate aplica filtrul inainte de distorsion - Adaugat filter stages (adica filtrul se poate aplica de mai multe ori) 17 Feb 2003 - Corectata o mica eroare la Reverb si modificat putin filter-ul si UI 18 Feb 2003 - Corectata o eroare care facea ca semnalul la voice sa fie intre [-4.0..4.0] si sa faca probleme la RingModulation - Adaugat modul Noise la ADsynth(voice) pentru a putea produce si tobe - Adaugat parametrul fixed frequency la 440Hz 19 Feb 2003 - Corectata o mica eroare la ADnote (aparea un fadein nedorit) - Facute inca cateva mici modificari la ADnoteUI 20 Feb 2003 - Imbunatatit foarte mult Controller-ul si adaugat la ZynAddSubFX ca program extern - Modificat putin Waveshaper-ul (fct. L/U limit) - Corectata o eroare la SUBnote (care facea probleme la glissando) - Adaugat un nou parametru Punch la ADnote care face ca sa sune ca si cum ar fi o lovitura (f. util la Rhodes) 21 Feb 2003 - Adaugata inca o functie de distorsionare x(1-x) 23 Feb 2003 - Corectata o eroare (cu mutex) care facea ca sunetul sa fie extrem de tare, daca in timp ce cantam, modificam unii parametrii de sunet la ADnote 24 Feb 2003 - LANSAT PE INTERNET - VERSIUNEA (1.0.9) -------------------------------------------------------------------------------------------------- - Adaugata posibilitatea de a tipari notele si timpul in care au fost produse (optiunea -D) 26 Feb 2003 - Adaugat inca 2 controlleri (Resonance Center Freq. (relative) si Resonace Bandwidth(relative)) 27 Feb 2003 - Adaugata posibilitatea de a modifica parametrii (in mod direct) al oscilatorului extern 07 Mar 2003 - Portat partial(doar interfata) programul sub Windows 08 Mar 2003 - Adaugat Virtual Keyboard - Cateva mici modificari in vederea portarii pt. windows - Adaugat si controller la Virtual Keyboard 09 Mar 2003 - Adaugat pitch wheel la Virtual Keyboard si modificat putin controller-ul la VK 10 Mar 2003 - Adaugat Filter Frequency Tracking (adica modificarea frecventei filtrului in functie de frecventa notei) - Marite eficienta la LFOparams - update lfotime - Adaugat mod de normalize prin RMS - Corectate doua erori la Distorsion (negate si mono+prefiltering) 11 Mar 2003 - In Windows, nu mai este necesar functiile getopt (scrisa o functie proprie) 12 Mar 2003 - Adaugat filtru la OscilGen 13 Mar 2003 - Adaugat mai multe filtre la OscilGen - Facute optimzari la ADnote (adaugarea unui element la oscilsmp si fmsmp,etc.) si curatat putin codul sursa - Corectata o eroare care amplifica fm-ul la rate de esantionare inalte - Optimizat si curatat reverb-ul 16 Mar 2003 - Modificate optiunile de compilare in Makefile.inc si coduri sursa a.i. sa se realizeze portarea pe windows mai usor 17 Mar 2003 - Inregistrarea se face in formatul WAV si nu RAW - Adaugat trigger la recorder (se incepe inregistrarea doar cand este apasata o nota) - Adaugat interfata PortAudio - Corectata eroarea care facea ca UI sa nu ruleze pt. Windows (trebuia dat show() la UI in thread-ul 3) si corectate alte erori din windows - Si audio-ul functioneaza sub Windows - Corectata o eroare care se manifesta foarte rar(Resonance, i era de la 0 si nu de la 1) 18 Mar 2003 - Adaugat interpolare la filtru (nu se mai aud tacanaituri, daca frecventa filtrului se schimba foarte rapid si semnalul contine putine armonice) - Adaugat interfata Midi in Windows => consider ca programul este portat in Windows 19 Mar 2003 - Adaugat interfata de configurare - Corectata o eroare la OscilGen care facea ca in loc ca amplitudinile sa fie reduse la -40,..,-100dB, sa fie setate la 1 si unde era intensitate mare sa file amplificate 20 Mar 2003 - Corectata o mica eroare la interfata (uneori disparea butonul ON de la ADvoice) 21 Mar 2003 - LANSAT PE INTERNET - VERSIUNEA (1.2.0) -------------------------------------------------------------------------------------------------- - Se interpoleaza filtrul si cand se trece peste pragul Nyquist (in sus sau in jos) 22 Mar 2003 - Corectata o eroare care facea ca nr. de esantioane scrise in headerul fisierului WAV sa nu fie initializat 26 Mar 2003 - Nu mai este permisa alegerea unui fisier wav in timpul pauzei de la record - Gasita si corectata o eroare stupida (am pus la NRPN 0x98 in loc de 98 zecimal) 28 Mar 2003 - Inceput sa portez programul sub VST 29 Mar 2003 - Adaugat Master fine detune (-64.0 .. 63.0 cents) 01 Apr 2003 - Functioneaza portarea sub VST, dar mai este de lucru... 02 Apr 2003 - Modificat synth-ul a.i. sa se poate apela in mai multe instante in VST - Continuata portarea in VST 03 Apr 2003 - Continuata portarea in VST (este limitat la o singura instanta) 05 Apr 2003 - Adaugata posibilitatea de a interschimba/copia parametrii efectelor - Mici modificari la Makefile (ignora headerele inexistente la deps) 06 Apr 2003 - Adaugat posibilitatea de protectie impotriva atenuarii a notei fundamentale la rezonanta - Pitch bend-ul merge bine in Windows 07 Apr 2003 - LANSAT PE INTERNET - VERSIUNEA (1.2.1) -------------------------------------------------------------------------------------------------- - Adaugat efect la part (adica efect care face parte din instrument ;-) ) 08 Apr 2003 - Adaugata interpolare la Resonance (peak-urile le interpoleaza) 09 Apr 2003 - Interfata la Envelope este o singura clasa - Adaugat Envelope free mode (adica de orice forma) - Adaugata posibilitatea de a copia de la o voce la alta la ADnote - Release-ul este liniar (in loc de dB) 10 Apr 2003 - Adaugata afisarea ultimului fisier master salvat/incarcat - Adaugata setarea notei minime/maxime la ultima nota - Pot alege daca release-ul sa fie liniar - Facute cateva corecturi la envelope 11 Apr 2003 - Curatat codul sursa la UI si impartit in mai multe fisiere .fl - Corectate niste erori la Envelope si adaugat modul liniar/logaritmic la amplitudine 12 Apr 2003 - Inceput sa scriu kit-ul la part 13 Apr 2003 - Terminat de scris kit-ul la part+UI 14 Apr 2003 - Copierea vocilor este sub forma de clipboard - ADsyn su SUBsyn check-urile de la PartUI sunt actualizate 15 Apr 2003 - LANSAT PE INTERNET - VERSIUNEA (1.4.0) -------------------------------------------------------------------------------------------------- 16 Apr 2003 - Adaugat modul "Single" la instrument kit, care face ca sa sune doar primul instrument din kit disponibil 21 Apr 2003 - Adaugat realtime priority, care seteaza prioritatea mare la sintetizator, daca are posibilitate; merge numai pe Linux - Gasite multe erori mici(dar potential periculoase) cu ajutorul programului Valgrind 30 Apr 2003 - Adaugat "Spectrum adjust" la OscilGen, care ajusteaza intensitatile armonicelor 03 Mai 2003 - Normalizat spectrul inaintea adjust-ului la OscilGen 04 Mai 2003 - Adaugat mod "egal temperat" la fixed frequency (440Hz), util la tobe 05 Mai 2003 - Adaugat modul "Drum mode", unde sistemul este intotdeauna temperat (12tET), toate notele sunt mapate si transpose-ul este ignorat 08 Mai 2003 - LANSAT PE INTERNET - VERSIUNEA (1.4.1) -------------------------------------------------------------------------------------------------- 09 Iun 2003 - Am schimbat in .H in fisierele .fl (ca sa se poate compila si pe Debian) 10 Iun 2003 - Inceput sa modific interfata la filtru a.i. sa pot adauga filtrul formantic usor - Interfata pentru filtru este o singura clasa 12 Iun 2003 - Inceput sa scriu panoul de part-uri (care afiseaza parametrii importanti ale part-urilor) - VU-meter-ul poate afisa si intensitatea part-ului dorit (folosit la panou de part-uri) 13 Iun 2003 - Terminat panoul de part-uri - Adaugat posibilitatea de a inchide automat fereastra bancii de instrumente, cand se incarca un instrument 19 Iun 2003 - Modificat modul cum se calculeaza frecventa filtrului (se fac doar adunari si doar la urma se ridica la putere) 22 Iun 2003 - Aproape terminat filtrul formantic (fara UI) 24 Iun 2003 - Merge mai multe instante in jack (alege porturi diferite) 26 Iun 2003 - Continuat de scris filtrul formantic 29 Iun 2003 - Adaugat vu-meter fals la Panel (in caz ca partul este dezactivat si primeste note on). De asemenea se arata daca in partul dezactivat s-a cantat ceva (apare o liniuta). 09 Iul 2003 - Inceput sa scriu interfata pentru filtrul formantic 10 Iul 2003 - Continuat filtrul formantic (interfata) 11 Iul 2003 - Eroarea vine de la Makefile pt. ca nu recompileaza si clasele care folosesc o anumita clasa, daca aceasta din urma se schimba - Continuat filtrul formantic (interfata+adaugarea interpolarii la Q) 12 Iul 2003 - Adaugat la filtrul formantic setarile de amplitudine formanti si interpolarea acestora - Adaugat grafic la UI-ul filtrului formantic si alti paramatrii la filtrul formantic 13 Iul 2003 - Corectata eroarea la FormantFilter care facea ca sa nu se interpoleze intre vocale - Adaugat parametrul VowelClearness la FormantFilter care face ca sa se evite vocalele mixte 14 Iul 2003 - Inlaturat parametrul Psequence[].pos, pt. ca era confuz => fiecare vocala are zona egala - Adaugat parametrii Psequencestretch si Psequencereversed la FormantFilter - Adaugat parametrul Pgain la filtru (-30...30 dB) - Terminat de scris Filtrul Formantic - Corectata o eroare care facea ca sa nu se salveze oscilatorul la o ADnote_voce, daca vocea este dezactivata, chiar daca era folosita de o alta voce - Prima data se cauta fisierul "default.bnk_zyn" si in dir "/usr/share/zynaddsubfx" sau "/usr/local/share/zynaddsubfx" 15 Iul 2003 - Setat Pkeylimit prestabilit la 15 la Part - Activarea unui Part din interfata Panel schimba automat part-ul curent la acela - Se poate alege ca un instrument din Kit sa fie procesat incepand cu un anumit efect; si se mai poate alege ca un efect din Part sa fie trimis in afara 17 Iul 2003 - LANSAT PE INTERNET - VERSIUNEA (1.4.2) -------------------------------------------------------------------------------------------------- 21 Iul 2003 - Corectata o eroare la FilterUI care facea ca la fiecare afisare sa se initializeze FilterParames::Pgain la 64 25 Iul 2003 - Corectata o eroare care facea ca modulatia in faza/frecventa sa sune diferit la diferite rate de esantionare/oscilsize 26 Iul 2003 - Afisat corect - valoarea OSCIL_SIZE ajustata (in caz ca a fost data optiunea "-o" incorect) - In windows arata si numele la midi_in_device 04 Aug 2003 - Adaugat filtrele Peak,LowShelf,HighSelf la filtru si foloseste parametrul Gain de la interfata filtrelor 30 Aug 2003 - Adaugat un nou tip de filtru: State Variable Filter 31 Aug 2003 - LANSAT PE INTERNET - VERSIUNEA (1.4.3) -------------------------------------------------------------------------------------------------- 02 Sep 2003 - Adaugata posibilitatea de a incarca de la inceput un fisier .mas_zyn "-l" - Se poate lansa programul fara interfata utilizator ("-U") 17 Sep 2003 - Adaugat niste simple patch-uri de Frank Neumann 02 Oct 2003 - Corectata o eroare la SUBsynth care facea ca la freq inalte si Q foarte mici sa se produca filtre instabile 30 Oct 2003 - Adaugate posibilitatea (+interfata in config) de Dump (avansat) - Adaugat ModWheel liniar si facut prestabilit (si posibilitatea de a alege in interfata modul de modwheel) 04 Nov 2003 - Modificat putin interfata la ResonanceUI 05 Nov 2003 - Marita viteza prin inlocuirea de (int) cu cod de asamblare (cu.10-50% la FM,chorus,etc.) 10 Nov 2003 - Inceput sa adaug posibilitatea de a adauga comentarii la instrumente 11 Nov 2003 - Terminat de adaugat comentariile/autor/tipuri la instrumente 12 Nov 2003 - Adaugat intefata pentru FFTW3 la fftwrapper 18 Nov 2003 - Inceput sa scriu Sequencer-ul 19 Nov 2003 - Adaugat un buton "i" pt. instrument info si facut ca instrument info sa se afiseze automat daca se schimba partul (sau se incarca instrumente,etc) 20 Nov 2003 - Continuat de scris Sequencer-ul si inceput sa ii scriu interfata - Mici modificari la preset-urile de la Echo 26 Nov 2003 - Continuat de scris sequencerul - inceput sa scriu inregistrarea (fara timer) 27 Nov 2003 - Se poate inregistra (dar nu rula) - adaugat timerul de inregistrat - Frecventa maxima al filtrelor este de Nyquist-500.0 pentru a evita instabilitatea filtrelor 28 Nov 2003 - Adaugata favorizarea portamento-ului in sus sau un jos; ex. se poate face ca portamento-ul sa fie doar in sus, sau portamento-ul in jos sa fie mai scurt decat cel in jos - Inceput sa pun pe cvs la cvs.sourceforge.net 01 Dec 2003 - Am facut niste mici modificari ca urmare a unui bug-report 05 Dec 2003 - Facute cateva modificari la jack 08 Dec 2003 - Inceput sa incerc sa fac rt-safe sub jack, dar in stadiul actual suportul jack este nefunctional 11 Dec 2003 - Adaugat aleatorism la amplitudinile armonicelor 13 Dec 2003 - Adaugat LFO frequency randomness 14 Dec 2003 - Imbunatatit LFO frequency randomness 15 Dec 2003 - Corectata o mica eroare la ADnoteParameters (lipseau niste break-uri la salvarea/incarcarea parametrilor) 16 Dec 2003 - Eroarea cu break-urile se dovedeste a fi o eroare majora :( ; adica corectarea ei, necesita resalvarea tuturor instrumentelor - Am revenit la suportul vechi de JACK, dar cel nou este disponiblil ca JACK_RT (nefunctional inca) 17 Dec 2003 - Inceput sa restucturez Part-ul (am adaugat clasele Instrument,InstrumentParams) - programul nu mai este compatibil cu versiunile anterioare - RMS normalize este prestabilit la OscilGen 18 Dec 2003 - Continuat de restructurat Part-ul * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 01 Feb 2004 - Revenit la versiunea din 16 Dec. 2003 - Pus iarasi RMS normalize prestabilit la OscilGen - M-am razgandit ;) nu mai restructurez part-ul; mai bine pun acolo o functie separata pentru salvari/incarcari par instrumente - Inceput sa adaug suportul XML 02 Feb 2004 - Corectata o eroare care facea ca numele la instrumentele din bank sa fie aratate gresit (nu era pus un \0 ) - Continuat suportul de XML 03 Feb 2004 - Continuat de scris suportul XML - inceput sa salvezi cativa parametrii 04 Feb 2004 - Se salveaza parametrii XML la master, part, filter, lfo, envelope, resonance si adnote (partial) 05 Feb 2004 - Se salveaza toti parametrii in XML 06 Feb 2004 - Adaugat salvarea de instrument in XML - Adaugat export la bank intr-un director XML si decis ca bank-ul sa fie un director cu mai multe fisiere xml de forma XXXX-nume.xml sau XXXX-nume.xml.gz 07 Feb 2004 - Adaugat functii de initializare si renuntat la masterdefaultbuf si instrumentdefaultbuf (adica salvarea la inceput si incarcarea bufferelor cu instrumentele prestabilite) - Corectata o mica eroare care facea ca sa se incarce subnotepars la adnotepars (eroarea a aparut azi) 08 Feb 2004 - Modificat putin formatul XML 10 Feb 2004 - Adaugata salvarea parametrilor pt. basefunction la OscilGen - Inceput sa scriu incarcarea parametrilor 11 Feb 2004 - Se pot incarca cativa parametrii de la master 12 Feb 2004 - Continuat incarcarea parametrilor XML si la part (neterminat) 13 Feb 2004 - Terminat de adaugat parametrii la incarcarea XML 14 Feb 2004 - Se poate incarca si instrumente - Rezolvata o problema la coarse detune - Corectate cateva erori la incarcarea XML-ului - Frecventa LFO-ul de la instrumente are valoare reala intre 0..1 - Corectata eroarea care facea ca functia de rezonanta sa fie trasata incorect - Adaugata compresie gzip la fisiere si decompresie automata la incarcare (folosesc biblioteca zlib) 15 Feb 2004 - O mica modificare la envelope parameters in sensul ca envelope-ul prestabilit la FM nu mai este liniar 22 Feb 2004 - Adaugat normalize Full RMS la Oscil 23 Feb 2004 - Inceput sa fac ca sa pot adauga Bank bazat pe XML (adaugat temporar clasa OldBank) 24 Feb 2004 - Continuat la Bank 25 Feb 2004 - La Bank - inceput sa scriu partea ca sa arate instrumentele din banca 26 Feb 2004 - Continuat la Bank 27 Feb 2004 - Corectate erori la snprintf (nu dadeam parametru "%s" inainte de string si daca acel string continea ceva %, era periculos) si alte erori - Micsorat timpul de marire amplitudine la ADnote (doar in cazul cand amplitudinea creste brusc ca la un LFO expdown) - Corectata o eroare foarte veche la LFO amplitudine (amplitudinea nu scadea corespunzator) 28 Feb 2004 - Se poate incarca si salva instrumente in Bank 01 Mar 2004 - Se pot schimba bancile de instrumente - Introduse si celelalte functii la Bank (cu exceptia salvarii/incarcarii locului bancii folosite) - Se poate importa banci din bnk_zyn 03 Mar 2004 - Terminat (teoretic) partea de XML 05 Mar 2004 - Actualizat Copyright-ul la 2004 in fisiere 08 Mar 2004 - Corectat o mica eroare la OscilGen (se aplica gain-ul rezonantei incorect) 09 Mar 2004 - Adaugata posibilitatea de stretch la LFO in functie de frecventa notei 12 Mar 2004 - Adaugata modulatie la OscilGen (functia de baza) 13 Mar 2004 - Adaugat HarmonicShift la oscilgen 15 Mar 2004 - Inceput sa scriu partea de incarcare MIDI - Inlaturata partea de recording din Sequencer 16 Mar 2004 - Inceput sa scriu partea de analiza midi 25 Mar 2004 - Continuat partea de analiza midi 28 Mar 2004 - Scris partea de incarcat fisier midi - Merge partial playerul 26 Mai 2004 - Playerul merge bine cu un canal midi (rezolvata problema cu timing-ul) 03 Iun 2004 - Adaugata partea de play speed la interfata 06 Iun 2004 - Adaugata functia sigmoid la distorsionare 12 Iun 2004 - Modificat modul cum este realizat bank-urile, adica directoarele de bank-uri exista in anumite directoare si aceste directoare sunt cautate automat de bankuri; adaugat optiunea de a se folosi mai multe bank-uri 13 Iun 2004 - Adaugat filtrul "sinus" la OscilGen - Managementul bancilor de instrumente este complet - Se cauta bancile si in '/usr/share/zynaddsubfx/banks' si '/usr/local/share/zynaddsubfx/banks' - Corectata o eroare la filter la OscilGen care filtra diferit componentele sin si cos - Adaugat posibilitatea de swap la instrumentele din bank 14 Iun 2004 - Adaugat __DATE__ si __TIME__ sa stiu cand s-a compilat - Modificat interfata la PartUI - Imbunatatit modulatia basefunc la OscilGen (adaugat inca un parametru si inca un tip de modulatie ("power")) - Adaugat inca o noua functie basefunc la OscilGen (sqr=atan(sin(x)*a)) 15 Iun 2004 - Adaugat posibilitatea de a face armonicele ca sa depinda de frecventa ("adaptive") si rezultatul suna foarte frumos pentru ca tendinta este de pastrare a frecventelor armonicelor si nu a numarului de ordine al lor 16 Iun 2004 - Inceput sa trec configul pe XML 17 Iun 2004 - Adaugat tipul threshUp la spectrum adjust - Terminat de trecut config-ul pe XML (inclusiv setarile bancilor de instrumente) 18 Iun 2004 - Incercata interpolarea cubica dar am vazut ca nu merita pentru ca OSCIL_SIZE e suficient de mare si pentru o interpolare liniara - Separat OscilGenUI din ADnoteUI - Inceput sa scriu modulul de sinteza PADnote 19 Iun 2004 - Adaugat modul liniar de controller bandwidth si modificat modul liniar la controllerul modulation wheel - Adaugata modulatia in frecventa la OsciGen 20 Iun 2004 - Nu se mai deschide automat fereastra de instrumente daca a fost deschisa si s-a descarcat un instrument - Facute mici modificari la FM-ul de la Oscil 21 Iun 2004 - Inceput sa scriu conversia in sinus 22 Iun 2004 - Continuat conversia in sinus si facut teste pentru posibilitatea de "draw" cu sliderele 23 Iun 2004 - Modificat modul in care parametrii se afiseaza la OscilGen (este o functie "refresh" care face asta) - Adaugata posibilitatea de draw la armonicele OscilGen daca se apasa tasta Shift - Corectata o mica eroare care facea imposibila modificarea amplitudinii armonicelor cu tastatura - Adaugat randomness de grup (adica se aplica acelasi randomness la toate vocile care folosesc acelasi oscilator) 24 Iun 2004 - Inlaturata setara de normalize la OscilGen. Intotdeauna normalize este Full RMS - Facute cateva imbunatatiri la interfata unde sunt inlocuite comuter-urile cu setari mai usor de inteles de catre utilizator (ex. la efectele de insertie se arata "insert to Master Out" in loc de "-2") 29 Iun 2004 - Inlaturata setarea cu gain la Resonance pentru ca este inutil (datorita faptului ca normalize este Full RMS intotdeauna) 30 Iun 2004 - Inlaturata o eroare recenta la EffectUI si modificat EffectUI in sensul ca nu trebuie sters si reinstantiat pentru a se reincarca valorile curente de efecte - Inceput sa scriu un nou efect (DynamicFilter) 01 Iul 2004 - Corectata o mica eroare la EffectUI care facea ca efectele sa nu apara activate - Continuat de scris la DynamicFiter (mai este doar de salvat parametrii si de auto-update la filtru) 02 Iul 2004 - Continuat la DynamicFilter (adaugata auto-update, adaugat preset-uri) - Terminat DynamicFilter - Corectata o eroare la EQui care facea ca sa nu se actualizeze efectul curent si sa nu se obtina graficul egalizatorului 03 Iul 2004 - Corectata o mica eroare care nu activa la EffectUI daca efectul anterior era dezactivat - Actualizat Swap/Copy la efecte ca sa proceseze si parametrii la filtre - Adaugat Bypass la efectele de instrument - Imbunatatit interfata utilizator (eliminate setarile "-1",etc.) - Scris calcularea profilului la PADsynth - Adaugat OscilGen si Resonance la PADsynth si inceput sa scriu interfata utilizator la PADsynth 04 Iul 2004 - Adaugata calcularea automata a largimii de banda echivalente si afisarea ei - Inceput sa scriu partea de sinteza la PADsynth - Auzit primul sunet la PADsynth 05 Iul 2004 - Nu mai face urat daca schimb parametrii in timp ce cant si apas apply - Adaugat harmonic scale si position la PADsynth - Se calculeaza corect si armonicele cu largime de banda mare 06 Iul 2004 - Inceput sa adaug filtre,lfo,envelopes,etc. la PADsynth 07 Iul 2004 - Corectate cateva mici erori si adaugat autoscale - Modificata putin interfata de la filtru - Adaugata interfata si parametrii la LFOs,Envelopes,Filter la PADsynth - Adaugata fereastra care arata pozitiile armonicelor si continuat de lucru la acestea 08 Iul 2004 - La pozitiile armonicelor sunt aratate si valorile lor reale in dB - Alte adaugiri minore la PADsynth - Adaugat interpolare cubica la PADsynth 09 Iul 2004 - Modificat modul cum se calculeaza profilul armonicelor la PADsynth (nu se mai ridica la patrat) - Corectate cateva erori la PADsynth - Modific amplitudinea in functie de sqrt(largime de banda) => amplitudinile armonicelor sunt echivalente cu oscil 11 Iul 2004 - Acum nu se mai intrerupe sunetul la notele care canta in timp ce sunt aplicate modificarile la parametrii - Se poate alege marimea sample-lui - Adaugat multisampling la PADsynth - Cand se incarca parametrii ADsynth se da volumul ceva mai incet ca sa corecteze faptul ca normalize-ul este doar RMS 12 Iul 2004 - Inlocuit codul de D/W sau Volume de la efecte cu un cod unic in EffectMgr - Se poate face efecte la instrumente la care doar semnalul Wet e procesat de efectele urmatoare - Modificat modul cum se calculeaza intensitatea Wet la Reverb si Echo - Corectata eroarea la FM care facea ca daca Adaptive Harmonics!=0 sa se calculeze FM-ul gresit 13 Iul 2004 - Rezonanta la PADsynth se face in functie de armonica reala si nu de numarul de ordine al armonicei - LFO,Envelope, Filters, etc. merg la PADnote - Inceput sa fac partea de aratare ca parametrii au fost schimbati (butonul "Apply" se coloreaza in rosu) 14 Iul 2004 - Butonul Apply la PADsynth se coloreaza in rosu cand se modifica ceva - Adaugat fixed freq. la PADsynth - Sunt salvati si parametrii PADsynth => consider in mod oficial ca PADsynth este complet 15 Iul 2004 - Facuta o modificare la PADnoteUI care arata foarte frumos - Completata partea de save/load si stabilite noile extensii ale fisierelor: master - .XMZ, instrument - .XIZ, microtonal - .XSZ - Inlocuit memset cu un macro (ZERO) pentru ca memset nu seteaza toate valorile ci uneori doar prima valoare cu 0 (e o optimizare la gcc care face asta) - Corectate niste erori la makefile care aveau legatura cu compilarea in windows - Corectate 2 erori referitor la Banci de instrumente 16 Iul 2004 - Adaugat inca noi tipuri de harmonic bandwidth scale - Adaugat inca un parametru la filter la OscilGen si inca un nou tip de filtru 17 Iul 2004 - Corectata o eroare care facea sa crape programul uneori dupa ce scria instrumentul in banca - Modificata optiunea -l ca sa incarce un .xmz - LANSAT PE INTERNET - VERSIUNEA (2.0.0pre1) -------------------------------------------------------------------------------------------------- 18 Iul 2004 - Corectata o mica eroare la afisare care facea ca la PADnoteUI sa fie trasate liniile in mod gresit 19 Iul 2004 - Corectata doua mici erori (se incarca gresit parametrii filtrului de la OscilGen) - Corectata inca o mica eroare care facea ca sa nu se coloreze butonul PAD_Synth Apply in rosu la anumiti parametrii de la oscilgen - Se dezactiveaza butoanele Edit de la PartUI ca sa nu se poata edita module de sinteza inactive 20 Iul 2004 - Corectate cateva erori cu compilare pe windows 21 Iul 2004 - Corectata o mica eroare la Bank si alte erori 26 Iul 2004 - Acum este folosita biblioteca mxml-2 - Corectata o eroare care facea ca sample-ul la PADnote sa nu fie ales in functie de frecventa reala de baza (cu detune) - Mutat functiile de waveshaping in Distorsion.C/.h 27 Iul 2004 - Corectata o eroare foarte suparatoare care bloca uneori calculatorul - Adaugat inca un nou parametru la PADsynth la base function - Nu se mai arata butonul de apply parameters la PADsynth cand nu este necesar - Eliminate blocarile de cateva secunde din threadul de sunet in momentul cand se incarca un nou instrument care contine parametrii PADsynth - Adaugata schimbarea titlului ferestrei principale la load XML 29 Iul 2004 - Modificat modul cum este stocat lista de banci root dir - Gasita o eroare care facea ca sa se stearga denormalkillbuffer inaintea lui master 30 Iul 2004 - Gasite si corectate o gramada de erori (eu stergeam elemente din ferestre si fltk le stergea din nou) - Eliminate warning-urile pentru -Wall 31 Iul 2004 - Eliminate complet stergerile in plus de la UI din destructorele obiecte - LANSAT PE INTERNET - VERSIUNEA (2.0.0pre2) -------------------------------------------------------------------------------------------------- 01 Aug 2004 - Adaugat un nou tip de OvertonesPosition la PADsynth 02 Aug 2004 - Am pus din nou schimbarea schedule-ului la valoare corecta (l-am scos dintr-o greseala) 04 Aug 2004 - Am corectat niste erori la VST - Merge VST, dar nu intotdeauna stabil (merge stabil pe vsthost.exe) - Corectata eroare care facea ca sa nu mearga MIDI - LANSAT PE INTERNET - VERSIUNEA (2.0.0pre2 VST) -------------------------------------------------------------------------------------------------- 13 Aug 2004 - Inceput sa scriu modurile continous si discrete la PADnote 14 Aug 2004 - Terminat modul continous la PADnote - Corectata o mica eroare la OscilGen care facea daca adaptive harmonics e activ si phase randomness>0 sa rezulte si aleatorism in amplitudinile armonicelor - Inceput sa scriu Presets/Clipboard (Clipboardul, in stadiu actual va putea copia doar parametrii folositi si nu cei dezactivati) - Merge partial partea de Copy in clipboard 15 Aug 2004 - Corectata o eroare in main.c la pitch bend - Scos Swap/Copy la efecte si la PartUI si vechiul Copy/Paste de la ADnote voice - Merge clipboardul la Oscil, Resonance, Filter si partial la ADsynth,SUBSynth si PADsynth 16 Aug 2004 - Corectata inca o eroare la pitch bend (aratata de Krzysztof Korpiela) - Adaugat refresh si la Filtru si paste la ADnote, SUBnote si PADsynth sunt complete 17 Aug 2004 - Adaugat clipboard la LFO, Envelope, ADnoteVoice si Filter Vowel 18 Aug 2004 - In clipboard se salveaza toti parametrii (chiar si cei dezactivati) - Corectata o eroare care facea ca instrumentul sa fie incarcat la fiecare salvare in banca - Tipurile de lfo sunt compatibile intre ele la clipboard 19 Aug 2004 - Corectata o mica eroare la XMLwrapper care facea ca sa se salveze fortat toti parametrii (chiar si cei nefolositi) - Adaugata partea de salvare/incarcare a listei directoarelor unde se afla presetarile 21 Aug 2004 - Am lucrat putin la salvare/incarcare a listei dir. cu presetari 22 Aug 2004 - Corectata o eroare de compilare - Makefile-ul modificat, a.i. make-ul sa se opreasca in caz de eroare - Terminat managerul de preset-uri 23 Aug 2004 - Adaugata posibilitatea de a se vedea direct din lista cu bancile de instrumente 24 Aug 2004 - Inlaturat complet suportul pentru formatele *.mas_zyn, *.ins_zyn, *.bnk_zyn si *.scl_zyn - Ascuns Sequencer-ul de utilizator (o sa il continui mai incolo) 25 Aug 2004 - Listele de banci si de preset-uri sunt sortate - Corectate niste erori la Oscilgen care faceau ca sa se calculeze randomness chiar daca este folosit de PADsynth si pus automat parametrul randomness daca PADsynth este folosit (in caz ca se va importa la un ADsynth) - Gasita o eroare care face sa crape daca lucrez mult cu bancile de instrumente 27 Aug 2004 - Adaugata posibilitatea de a dezactiva aratarea starii PADsynth din instrumente - LANSAT PE INTERNET - VERSIUNEA (2.0.0) -------------------------------------------------------------------------------------------------- 05 Sep 2004 - Corectata o mica eroare de la SUBnote (legat de pitch wheel) 06 Sep 2004 - Eliminata variabila "disablekitloading" din Part si din UI 07 Sep 2004 - Modificat id-ul vst in 'zasf' (inainte era de 5 litere si poate cauza un crash la host) 27 Sep 2004 - Corectat un mic bug la salvare in xml la parametrul FMcoarseDetune din adnote - La VST, daca incerc sa inchid fereastra principala, se minimizeaza - Eliminate setarile cu indice '0' (zero) 28 Sep 2004 - Adaugata salvarea tuturor parametrilor in hostul VST (trebuie testat) - Adaugat installer pt. windows (cu NSIS) 29 Sep 2004 - Inceput sa scriu interfata utilizator pt. incepatori 30 Sep 2004 - Terminat de scris interfata utilizator pt. incepatori si se selecteaza la pornire modul dorit - Adaugata posibilitatea de a compila cu suport jack si oss simultan si sa se aleaga runtime ce doresc (jack/oss) 01 Oct 2004 - Corectata o mica eroare care facea ca sa nu se inchida ferestrele cu instrumente cand incarc din banca - LANSAT PE INTERNET - VERSIUNEA (2.1.0) -------------------------------------------------------------------------------------------------- 02 Oct 2004 - Corectata o eroare grava care facea ca sa nu pot schimba partul curent in interfata utilizator obisnuita 03 Oct 2004 - LANSAT PE INTERNET - VERSIUNEA (2.1.1) -------------------------------------------------------------------------------------------------- 04 Oct 2004 - Corectata o eroare care face ca in modul simple UI, sa se inverseze panning-ul - Adaugat un icon la ZynAddSubFX 10 Oct 2004 - Si controllerul de Resonance se aplica la toate item-urile din kit 12 Oct 2004 - Corectata o eroare care facea ca butoanele Addpoint si Delpoint de la Envelope sa nu fie afisate 16 Oct 2004 - Corectata o eroare care facea ca partUI-ul sa nu se actualizeze intotdeauna cand incarcam un instrument 20 Oct 2004 - Corectata o mica eroare asemanetoare cu cea din 16 Oct, dar care afecta meniul new 07 Nov 2004 - Corectata o mica eroare care facea ca sa nu se incarce corect instrumentele in linia de comanda (-l) 14 Nov 2004 - Nu mai verific in bank daca este un director sau fisier simplu, pt. ca poate sa aiba probleme 28 Nov 2004 - Curatat codul la OscilGen (acum datele sunt stocate mai bine si nu in functie de biblioteca FFTW) - Corectata o mica eroare la OscilGen cu adaptive harmonics care facea ca energia vechilor armonice sa nu se adauge in mod corect la noile armonice (la note inalte) - Sortarea nu mai este quicksort la bank si la presets pt. ca am vazut ca nu merge in windows intotdeauna - Corectata o eroare la egalizator care facea ca sa se aplice si la el par. D/W 29 Nov 2004 - Marita zona de valori la adaptive harmonics power din OscilGen - Adaugata posibilitate de a post-procesa la adaptive harmonics(adica a adauga sau a amplifica anumite armonice) 05 Dec 2004 - Corectata o eroare care facea ca functiile getChunk si setChunk sa fie supraincarcate in loc de suprascrise (dar nu am testat) - Corectata o eroare care returna gresit la canDo in vst (netestat) 17 Dec 2004 - Inceput sa folosesc Dvorak pt. VK 18 Dec 2004 - Continuat putin la VK 20 Dec 2004 - Se poate selecta la VK dintre "qwerty" si "Dvorak" - Corectata o mica erare care facea sa nu arate BWprofile dezactivat la PADnote * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 04 Ian 2005 - Corectata o mica eroare care facea ca sa nu arate Force Release la Freemode Envelope 15 Ian 2005 - Corectata o eroare la controllerul bandwidth care facea ca sa ajunga la valoarea 0 si sa dea peste cap SUBsynth 22 Ian 2005 - Inceput sa scriu suportul pt. DSSI 27 Ian 2005 - Corectata eroare care facea ca in cazul in care sunt 2 banci cu acelasi nume (sau aceeasi bank root dir sa fie selectat de 2 ori) sa produca confuzie 03 Feb 2005 - Inceput sa scriu la Microtonal ca sa se faca butonul apply de culoare rosie cand se schimba ceva 06 Feb 2005 - Facuta o mica modificare care interzice punera notelor "0" in dump si alta modificare care mareste nr. de octave calculate la PADsynth - Renuntat sa fac modificarea la Microtonal inceputa din 03 Feb, pentru ca nu am gasit cum pot schimba culoarea butonului automat cand modific un text 07 Feb 2005 - Corectata o eroare care facea ca la microtonal mapping sa nu se calculeze corect (adica sa se stocheze valoarea corecta) 12 Feb 2005 - Controllerul prestabilit la Virtual Keyboard este Filter Cutoff in loc de BandWidth - Modificate cateva preseturi la DynamicFilter - Adaugata posibilitatea de a mari sau micsora cu un parametru detune-ul vocilor de la ADnote 17 Feb 2005 - Corectate cateva erori la PADsynth care faceau ca sa se citeasca date din zone de memorie nealocata - Corectata o eroare la Bank care facea ca uneori sa crape programul cand umblam mult cu bankuri 19 Feb 2005 - Corectata o eroare care facea ca uneori sa fie calculata frecventa la ADnote=nan si programul sa crape pentru ca era folosit parametrul bandwidthDetuneMultiplier inainte de a fi calculat 21 Feb 2005 - Se afiseaza corect numele fisierului proaspat salvat in fereastra principala 26 Feb 2005 - Corectata eroarea la windows si la OSS care facea ca pitch bend sa nu fie mapat corect (trebuie verificat) 27 Feb 2005 - Se afiseaza corect valoarea lui detune in centi 28 Feb 2005 - Corectata o mica eroare care facea ca sa nu se afiseze intotdeauna corect detune-ul la ADvoice - Afisajul VU-meter la Master nu mai prezinta variatii mari in timp scurt - Adaugata afisajul RMS la VU-meter 06 Mar 2005 - Facute cateva mici modificari referitoare in special la warning-uri - Corectata o mica eroare care facea ca la un Paste sa nu se actulizeze unii parametrii ai filtrului in interfata 12 Mar 2005 - Imbunatatiri la interfata PADsynth, adica se poate da "apply" direct din OscilGenUI sau ResonanceUI 13 Mar 2005 - Facute cateva compilari in Makefile pt. compilare pt. Windows (standalone exe si vst) - Se compileaza in mod cross-compile pt. windows din linux 14 Mar 2005 - Mici modificari la afisarea RMS-ului - Actualizat textul copyright-ului la anul 2005 22 Mar 2005 - Corectata o mica eroare care facea ca la schimbari foarte lente al parametrilor sa nu se actualizeze Format Filter 25 Mar 2005 - Corectata o eroare care facea ca uneori, la anumite setari ale lui SepctrumAdjust din OscilGen sa rezulte semnal zero Corectata o mica eroare care facea ca daca se foloseste setarea 440Hz la Padsynth sa se aleaga sample-ul incorect 06 Apr 2005 - Modificat installerul pt. windows si pregatit pt. installer (folosit cross-compiling si nsis&wine) - Adaugat icon in format windows (si la installer) - Adaugat parametrul '-Y' la linia de comanda, care este folosit doar pentru installerul NSIS (parametrul este necesar pentru ca NSIS ma forteaza sa dau un parametru la program pentru ca sa adauge un icon la shortcut; zynaddsubfx ignora acest parametru) 07 Apr 2005 - Pregatit pentru release 08 Apr 2005 - Corectata o mica eroare care facea ca sa nu se incarce configul la inceput - LANSAT PE INTERNET - VERSIUNEA (2.2.0) -------------------------------------------------------------------------------------------------- 12 Apr 2005 - Actualizat pentru MXML 2.2 (nu o sa mearga pe vers. mai vechi de mxml) 27 Apr 2005 - Adaugata posibilitatea de a inlatura complet interfata grafica in Makefile.inc (in acest caz nu mai sunt necesare bibliotecile grafice ca fltk) - Adaugata posibilitatea de a incarca direct un instrument cu -L (deocamdata se poate incarca doar in part-ul 0) - LANSAT PE INTERNET - VERSIUNEA (2.2.1) -------------------------------------------------------------------------------------------------- 28 Apr 2005 - Corectata o eroare care facea ca uneori sa fie frecventa prea mare la LFO daca era folosit random - Nu mai afiseaza optionea -A in help daca nu este compilat si OSS si JACK 29 Mai 2005 - Corectata o eroare care facea ca sa nu se tina minte ultimul bank 27 Aug 2005 - Corectata o eroare care facea ca sa nu mearga functia Dump (se initializa inainte de citirea configurarilor) 21 Sep 2005 - Imbunatatit modul de scalare al profilei unei armonice la PADsynth 27 Sep 2005 - Gasita si rezolvata o posibila problema la PADsynth care facea ca sa nu se foloseasca mutex la stergerea de sample-uri (daca se aleg mai putine sample-uri decat initial) 09 Oct 2005 - Rezolvat un memory-leak la FFTwrapper * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 16 Apr 2006 - Corectata o eroare care facea ca sa nu se foloseasca insertion effect la master 20 Aug 2006 - Adaugat 88200 ca rata de esantionare 14 Sep 2006 - Se afiseaza spectrul la nota cu frecventa de 440 Hz la Oscil si pentru parametru Adaptive Harmonics 30 Oct 2006 - Adaugat un patch "standalone zombie fix stripped from Lars" - Adaugat un patch "Extended mono" si "font resizing stuff" de Gerald Folcher 31 Oct 2006 - Adaugat un patch "Extended mono v.3" de Gerald Folcher - Inlocuit fl_ask cu fl_choice in fisierele .fl - In mod prestabilit nu se mai seteaza volumul la efectul 0 - Efectele sunt numerotare de la 1 si in la "send to" din partui 01 Nov 2006 - Adaugat patch-urile de Jack Midi si LASH de Lars Luthman 06 Nov 2006 - Aplicat un patch "Fix for ALSA system lockup" de Lars Luthman 10 Nov 2006 - Aplicat un patch "zyn-extendedmono_v4_update-061110.diff.gz" de Gerald Folcher 14 Nov 2006 - Aplicat un patch "zyn-CVS-extendedmono_v5_update-061113.diff.gz" de Gerald Folcher * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 19 Mar 2007 - Aplicat un patch mic de la Daniel Clemente care este un workaround la bug-ul X11 cand tin tastele apasate mai mult timp 01 Apr 2007 - O mica modificare cu xclass zynaddsubfx in MasterUI.fl 09 Sep 2007 - Schimbata licenta la GPL 2 or other later * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 02 Ian 2008 - Corectate cateva mici erori la dezalocarea memoriei - Codul de recorder wav a fost rescris - Adaugata functia de export la sample-urile din PADsynth * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 20 Feb 2009 (Mark McCurry) - Made several functions accept 'constant char' over 'char' to prevent warnings - Changed several 'delete' operations to 'delete []' based upon the usage of 'new []' - Gave external programs Makefiles - Gave dials tooltips showing their value when they are being moved - Gave dials the ability to have normal tooltips when the mouse hovers over them - Created tooltips for the effects knobs - Standardized the code, so it could compile with pedantic without errors [it looks like some errors may have been missed] 22 Feb 2009 (Mark McCurry) - Fix improper deallocation in PresetsStore - Fixed errors with drawing of the Oscillator as reported with valgrind 07 Mar 2009 (Mark McCurry) - Added start of DocBook documentation - Incorperated JACK output patch by Emmanuel Saracco - Incorperated QUERTZ layout by Achim Settelmeier 29 Mar 2009 (Mark McCurry) - Started to use Doxygen within the Effects - Started to use const within Effects - Changing tabs->four spaces in hopes of generating a bit more consitancy - Began to use Initialization Lists - Almost all changes contained in Effects until further discussion on the style, so consistancy can be reached 28 May 2009 (Mark McCurry) - Added some more Doxygen comments - Added Audio Samples classes - Added Stereo template - Added Control class - Added DelayCtl class 20 Iun 2009 (Paul Nasca) - Bugfix: WAV export of PADsynth yoshimi-2.3.5.1/doc/Histories/Zyn_HISTORY.txt000066400000000000000000000255101506652756400206440ustar00rootroot000000000000002.4.0 (21 Jun 2009) - extended mono functionality - legato mode - export functionality on PADsynth - inclusion of LASH client - inclusion of DSSI audio output - enabled tooltips for knobs (both description and value tooltips) - added support for newer JACK api - added quertz support for virtual keyboard - started to encorperate cxxtest for unit testing - many bugfixes - code cleanup 2.2.1 (28 Apr 2005) - made to work with mxml-2.2 (will NOT work on older versions) - it is possible to remove completely the graphical user interface (e.g. it can run without X). For this you need to modify the DISABLE_GUI option from the Makefile.inc - added a commandline -L which load a instrument (.xiz) - now it only loads to part 0 (you can use this option with -l to load a master file and after this the option -L to replace the part) 2.2.0 (8 Apr 2005) - the VST version of ZynAddSubFX is removed from the instalation until it will be more stable (hope soon :) ) - now, the instrument banks contains over 300 high quality instruments - added "Apply" a button from OscilGen window for PADsynth - added another parameter to ADsynth that controls the amount of all detunes of voices - adaptive harmonics postprocess - improved the VU-meter and added a RMS plot - Dvorak support for Virtual Keyboard - many bugs fixed and code cleanups 2.1.1 (2 Oct 2004) - Removed a big bug that prevented changing the part 2.1.0 (1 Oct 2004) - Added a installer for windows (thanks to NSIS installer ( http://nsis.sourceforge.net/ ) ). Both VST and standalone vesions are contained in the same installer. - Added a new user interface for beginners. You can switch the current user interface with that anytime do you want. - All parts, effects, etc. are counted from '1' and not from '0' - Added the posibility to compile the OSS and JACK support in the same binary (look in the Makefile.inc) - VST host should be able to save all zynaddsubfx parameters into their setups (this is untested) - Bugfixes and other 2.0.0 (27 Aug 2004) - VST version works (there are some issues/bugs but it works) - Added a advanced Clipboard and Preset module - now is possible to add user preset LFOs,Envelopes, Effects, Oscillators, Resonances, Filters, etc. - Completely removed the *.MAS_ZYN formats (masters, instruments,etc) support; use 2.0.0pre1 and 2.0.0pre2 to convert - Corrected a error to pitch bend on VST plugin (thanks to Krzysztof Korpiela) - Impoved the PADsynth module - Because the PADsynth module takes a time to load, the instrument that contains such modules are shown in different colors - Bugfixes - Other 2.0.0_pre2 (31 Iul 2004) - Updated the XMLwrapper to mxml-2.0 - Many bugfixes - Other 2.0.0_pre1 (17 Iul 2004) - Added a new powerful synth engine which is called PADsynth, you can make very beautifull pads and even some strange sounds - Now is used the XML format for all zynaddsubfx parameters(.XMZ for master parameters, .XIZ for instrument parameters and .XSZ for scale parameters).You can import older parameters. All parameters files are compressed with gzip algorithm. - Some parameters has changed and you might ecounter different sounds that you saved in the older versions of zynaddsubfx - The instrument banks are no longer single files, but directories that contains instrument .XIZ files (you can organize them even with a file manager). Also, you can use more than 1 banks easily. - Added a new effect called DynamicFilter that allows you to do WahWah,AutoWah, VocalMorpher and other effects - Speedups - Started to write a small sequencer that allows to load and play a midi file from zynaddsubfx (unfinished) - ZynAddSubFX is available from CVS, too. Please look at the sourceforge project page to get more information ( http://sourceforge.net/projects/zynaddsubfx ) - The waveform generator (OscilGen) has many new parameters :) also if you press the "Shift" key, you can draw the hamonics amplitude/phases - Many user interface improvements - You can load a file at the start of the program with "-l" command-line parameter and you can run zynaddsubfx w/o user interface with "-U" - It is possible to dump all MIDI notes into a text file - The instruments can contain comments and copyright information in order to encourage sharing of them - FFT3W library is supported - More "randomness" options - Other impovements - Many, many bugfixes - Added the full changelog (since I started to write zynaddsubfx), most is in Romanian - Other things 1.4.3 (31 Aug 2003) - added state variable filters and other types to analog filters - small user interface improvememnts - small bugfixes 1.4.2 (17 Iul 2003) - added full-featured, advanced formantic filters - added mixer panel which lets you to see/change most important part settings, and shows a vu-meters for each part - you can choose to process the instrument's kit items only with one Part effect (eg. you can make a instrument kit that contains a reverberated piano and flanged strings) - enabled to launch more instances in Jack - when is launched first time, it searches for default.bnk_zyn file into /usr/share/zynaddsubfx and /usr/local/share/zynaddsubfx directories (useful for binary packages for Linux distributions) - bugfixes 1.4.1 (8 May 2003) - added single mode to the instrument kit who alows only one item to be played same time - added "Spectrum Adjust" to the ADsynth oscillator - added "drum mode" to the instrument, where all midi keys are mapped to 12tET - added a parameter to the "440Hz" which make the freq to varies a bit according to the key pressed (very usefull to toms and other drums) - (for OSS audio out) if it is launched with root privileges, the synth will gain realtime scheduling priority - bugfixes 1.4.0 (15 Apr 2003) - added instrument's own effect (effects that are loaded/saved with the instrument) - FreeMode Envelopes: all Envelopes can have any shape (not only ADSR) - Added instrument kits: It is possible to use more than one instruments into one part (used for layered synths or drum kits) - Amplitude envelopes can be linear or logarithmic - added interpolation on the Resonance user interface - user interface improvements and cleanups of it's code - initiated a mailing list to allow users to share patches for ZynAddSubFX. Please share your ZynAddSubFX patches; look at http://lists.sourceforge.net/mailman/listinfo/zynaddsubfx-user for more information about the mailing list. 1.2.1 (6 Apr 2003) - improved filter interpolation - bugfix: wav header is written correctly - bugfix: NRPN works correctly (eg:the controller was 0x98 instead of 98), now you can controll all effects parametrer realtime via MIDI - bugfix: pitch bend works OK in windows - added master fine detune (-64..63 cents) - it is possible to swap effects or copy them - started to port ZynAddSubFX to VST (not functional, yet) - the resonace can protect the fundamental freq. against damping 1.2.0 (21 Mar 2003) - ZynAddSubFX is ported to Windows ;-) - added internal Virtual Keyboard - added Configuration window - added frequency tracking to filter - improved the OscilGen (harmonic filter, RMS normalisation, etc..) - improved the recorder (uses the WAV file format and it starts only when a key is pressed) - added filter interpolation if the frequency is changed very fast (it removes some annoying clicks) - other improovements, bugfixes, speedups and cleanups of the code 1.0.9 (24 Feb 2003) - added keylimit to Part - you can use multiple filter stages in order to make very steep filter rolloffs (eg. 48 dB/octave) - ADsynth - added noise mode and you can make fixed frequencies; added the "Punch" parameter - added an external program "Controller" which enables you to use the mouse for MIDI controllers - other improvements and bugfixes 1.0.8 (14 Feb 2003) - added mono mode and portamento - added the EQ effect - the output of a system effect can be sent to others system effects - minor bugfixes and improvements 1.0.7 (7 Feb 2003) - some settings (like samplerate) are set at runtime (by comand line) - added Distorsion effect - added controllers, and NRPNs for changing all effects parameters by midi - bugs removed and other improvements 1.0.6 (30 Jan 2003) - Added JACK output ;-) - Minor improvements and bugfixes 1.0.5 (24 Jan 2003) - The bug that crashed ZynAddSubFX if you change some effect parameters, it is realy removed (I forgot to update the file before upload) - Other bugfixes and code cleanups - Added a Global Filter to SubSynth - Added keyresponse limits to Part - Added presets to Effects - The fade is smaller on high frequecy content and larger on low frequecies; so you'll don't hear starting clicks on basses and audible fadeins on higher pitched sounds - Added tunnings to Reverb: you can choose Random of Freeverb 1.0.4 (7 Jan 2003) - It is possible to load Scala (.scl and .kbm) files - Added mapping from note number to scale degree is possible to load Scala kbm files - Corrected small bugs related to Microtonal - If you want to use ZynAddSubFX with OSS (or you don't have ALSA) you can modify the Makefile.inc file to compile with OSS only. - It is shown the real detune (in cents) - Made a new widget that replaces the Dial widget - Removed a bug that crashed ZynAddSubFX if you change some effect parameters 1.0.3 (23 Dec 2002) - small bugfixes: "Bypass Global Filter" from ADnoteUI dissapears sometimes ; removed the low amplitude noise produced by the reverb; if you "acconect" zynaddsubfx with aseqview no note was processed a long time. - added Notch Filter - added the option to randomize the ressonance function - added VU-Meter - Change the Insertion effect modes behaves (it sounds a bit louder) - Added to the project an external program called Spliter that splits the keyboard and alows you to play two instruments same time. You can use this program with ZynAddSubFX or any other synthesizer. - Added a new function to OscilGen 1.0.2-1 (13 Dec 2002) - bug found and removed: sometimes when Master/Instrument is saved, the synth crashed 1.0.2 (13 Dec 2002) - Added instrument banks - the BandPass Filter's output amplitude was increased - few fixes of FFTwrapper. See the documentation from "FFTwrapper.h" if you got error messages. 1.0.1 (6 Dec 2002) - corrected a bug that made ZynAddSubFX to crash(sometimes) if you disable a part - wrote Resonance - added the BandPass filter - added the recording feature - added "New instrument" menuitem 1.0.0 (25 Sep 2002) - first release, done a lot before it :-) yoshimi-2.3.5.1/doc/Note_Envelopes.txt000066400000000000000000000044521506652756400176210ustar00rootroot00000000000000 The first thing to keep in mind is that *amplitude* envelopes (particularly release time) set the point at which a note ceases. Frequency/filter envelopes can be shorter, so their effect stops part way, but if they are longer, the last part will be ineffective. Across all three engines, and kits (if kit mode is active) it is whichever is the longest that sets the overall time of the note, and you may well hear other sections stop if the times are sufficiently different. Also, within AddSynth itself, it is which ever voice has the longest envelope that sets the overall voice time, and if you set voices with very different characteristics you can hear the shorter ones finish before the overall sound stops. Bear in mind, that each voice can also have a start delay set, so you can get a late sound pickup that is then the last bit you hear, even if it's quite short. However, if the start time of one voice is after all the others have finished it will never sound. This sort of idea works best with 'Forced Release' disabled. An unexpected twist to this, is that taking the combined voice envelope time against the main (global) AddSynth envelope, although attack and decay times follow the above pattern, it is which ever (the voice group or the global value) has the *shortest* release that sets the AddSynth time as a whole. This can really catch you out! With regard to the 'modulator' amplitude envelopes. They don't change the overall time, but if they are shorter than their voice length (or any voice that the modulator is slaved to) the modulation may end a bit strangely. If they are longer, then part of their action will be missed. Also, when using the 'Morph' type, you *must* have an envelope set, as this is what controls the way the sound morphs between the voice oscillator and the modulator one. Finally, there is what I believe to be a bug that goes back to Zyn 2.2.1 - original zyn! If an AddSynth voice is enabled, it's amplitude envelope time is active, even if the envelope is apparently deactivated and not editable. Oh, and by default all the voice times are quite long, so again you could be puzzled as to why a sound is longer than you expected. Because this has always been there I don't propose to change it. To do so would quite likely alter many existing instrument patches, but do keep it in mind. yoshimi-2.3.5.1/doc/The Short Yoshimi Guide.odt000066400000000000000000001443631506652756400210710ustar00rootroot00000000000000PKV^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKVConfigurations2/statusbar/PKV'Configurations2/accelerator/current.xmlPKPKVConfigurations2/images/Bitmaps/PKVConfigurations2/progressbar/PKVConfigurations2/popupmenu/PKVConfigurations2/menubar/PKVConfigurations2/floater/PKVConfigurations2/toolpanel/PKVConfigurations2/toolbar/PKV manifest.rdf͓n0M!鉶A;f)13Zn{@죈 Dmn]b+EYQ P 0|i%[0Nz*ԫO$+,.7B5}gr-pjm'y4n$LC$U9e,\ѿ0Azp~svY6n^2pw1LPGh{V ;_)pgRTk)s^7(˳V|bཿPK$DPKV settings.xml[[w9 ~_{JnMN eKHsofF7{ ߯4&% '`.-K>D{їw#K= [W}2㱌(K@#]-2z,N j&|ZP_yRR?\Vާju67vR=G1|djkہ-f4'ӿKq =$dwˤ첂C=J=[-I+;~eru꺜ew`7 ?,'^~Q1g9@N}txrxAs*܊1 \yn:ںaHX(DR6{Yx=η3y;^Vɡw_Bp[ɮr)<D #c) I l}r~z$CtSc}jDsQYWc{!D˥7y[pۥ%"o8CܲxaҾ0&cucu!“"+k"aŗٸ"o~$YZ 2Ô{ָ=A~k*M'o3*!z;CKxӠ%ĚLqI%V̂Ko(@ AuGTAz8 *gchIP1|D_ϯGa 0'`s-tw<'i\}[-5wKH_f-9|c :J8uA:X8h{ʈp #Aa{ic kF+!1܌D eM2q] a}+̬ťbC$Bo8ᝫ$|d [8X qG zc̛mmK?A ͔6/6|uKKM;^(9Vr2=@@CIH F!oiLxK<ݮw,ˊs`2F|D9kR KEuoQ"R8 Ձ2$ bQrK} )OH~GsbD+WnryB_Bu`D?[s c)0Euу) S؄NR ;&7'a\/vR 2ʫoƹr>}Ae>P KqT"'hM2%@Qη﹖i7-I6_ u8Ct/Eg(!P =Ǽ![.WjRp8P7׽ˡrNZA"T!*^CţWAՍ!ERH%x]6YsʆwmݑooN0m.;|٠=Xݶ_;/te(<3QBb[swXSF:wmn;s^d0}3v^~;`vTW~&٭BWuԂAPQwcRWȡi]yZO42UfwX 8b&,TSqAG&\W[^FB1֝~Չ'Xe*R햎3)A:}3sIAͅYMb)y0/Aen07-8u&?`*ٺ8`~@%HkQDƻXhRlRZǿ49UNVR-PKl#4PKVk~~Thumbnails/thumbnail.pngPNG  IHDRjpfPLTE ###,,,333<<ԧ4iv4>M}NS>ԧOSiv4is;M}NS>Mn%1VSz_K=Q8g(_4f}9/kgx?ܣz\ㅩ{ܧg-l??#vW?~Y;t& a;:2/k4N9! .MC'<96ݲϪ<2ij]j~?8a?oyڧmsԧocX'>u/?UY4XS瓷C?q?~[GOf8?9c>|l _x-0Ťu&6`쳮ni3}MqؘLrvh](6ڌ#8(taNO|3c1@g>{>M}nOS>ԧLs5j/~ny^9c׽&ڗϬ"7KE0+uo㛅ϷGMCWc|uTag_ s7} jT̀}*1[>ݮDz/Pև"y[PDAc,X$p=gy|3諹F*>Q/ϗ6yНʟBqwEʐG a jmCf)SW4]Ѡ4TIU\&,rJa;/-se]M!ppx>`:nu4IS_P>J}CTܻU/Sr0 i'L6xf&>Ż$)-E^y\tNzŐa${^Sa=;nK!xsA{8ݴhO/̴.ӎ.YpQNuG4V̌XU)Z n#ɬ6f?cꆞ2@B `&cbCЍo{^=hjX~hܗۥS[^s/M2=^ZL/mKk]qc/V.=jtg@0Eub^:)6Qb p^شe&_*&|/lOFٳf_{]@pRmf>9cL1=Th OH2gVQeH!GU~>&MR婌2bf/Da4+[t`<>FOhJT0_AY%:K߅f{BC n# K3 EK|h=[t:Z5_DÑ M1˚#kfsAAXcD;Ŷr*|K8z>]v4is;M}NSM*G›[I4OIjm0_)sI:!5$"9uzÆ__R+նSݭV/eݖVkoZ1h孭/oyq*3\CdSҌ%lD>s'?o\5PƮl% ^y S鼏iUǶVVӌBCv 5{-0Mv!\g)5#INֲͼ<cBv'lpi)fJWq5aDƭƎ(wX0Gʸ$ydjJg*4DThiSEF1]c*YZt?9mޫ(J)V cV*UK:+tB`Iܣ8xKh ab1)IKƠIQУnsoZFL:/+N84 kWCMrEW-]֌Jah&cLK~Rcl RMMC؍=MtՌ9䨰"#TL /r02I*=E {U*\Jge%bꞶoê\&J6ɡj)rej:گ&\`YO UƪbClnHփkƣlSRojq!w([9_,nI9tNv.21[,>+o3wݝp=@~(ظݽƟc0~믯 M}+ڢq{R)Sb@'f\C Prq3)-?v͊9}nn~D[fG!o/ZܸR~+ͮ~Jb8-A(hUɋ#JyDQ9~Gf]c-dC)&djh0HYM2ڼ軳q+&2Vtq~dwt1-3\شE$:FTE&?k]=z2 _۴ L{&7W5I2 0xlF{k- Hw ЦSI 0>&6e $a@T˵Dkf,nZtM{z^&Su_Mۂf0`HUp34ITA raI-HExv%AgvQg@pvaz#G,F7p)/ ~?HKM~vL~e3ؐoXcjg0kІz3*藲&p!=|h>[d{I. tW 5E I+>ƥh :޲1n4Cm(K}x6Hn/-&0[ Oe W5'FS]A]xzuyA ֗yI̡505jpT޵nTC4YmO@'w$c q`cl(`hjL r\TpŃa)b4L^C*?f`R!7D:&tSj-Mm$rp}]o >=& 2w-05OMO{y7.jӋWnp-w=S8+zOi|寜o5w>)*H o_v6v͝o9My}o9&>4 #7/FEWMbTb n=ދY=l :̒wI9WQІ'1 lmNeeNPkdN1隸YBힻͅŲE^c*mš@z%eC۹Kޜ&N*ZX\WZ%G>cUX}k,h'_֋[$n=LM1<.KJBM@SrRr=d 4~qH̃QGz\mTEcxL\XM2ܚ"u$ҬQ˶ ʼnSR rD\K~(r-i O޵pPQ!1'kX qWReи^7:0^5NjT[֚]]NӺpz}Gst/~*̍گ~\իڸ1loG7O'~ڿI\צ'ʞ-5WqeW+Png_e>7F^3SoͽU]7>6?$~WH{P>1̓[o3+}=FN_MS{1z7k`ڗ|73u6\جV5 g}-V:kKͷd^3ݖFs=d UЮe-;XZ0v5:w0u{lR7RO;֘j E1vi63C&OOqZ;F@% 0 @hv ) ]h4Ul`jQ`!0S,<ėzN^fԊw1>hsJlwߗU@lČΥ,wr$s!J)w8B|VEa^{€mHɠ+̋>ZsZqL[L;<\Ps{{ +kN>\؜hAAɸ(BZ2_n, bKql\6MQ96ŵ%{Wfbg)Bه# -fst[bi{)Kw^K1m(8+~;i?\es;M}4>M}nOSۯ4YxcxgYgRS׽+!y}}n_Mq*t]кtMKJKG|XklR+WP?Q>_ʜ|'n0_|S|Y^=&ug*^M7|,{v4'r2!qJ-W>+vQvvZL pbI$E:MufGw[)ᇤ5算NQB0Ʋ`"~^|zWS܅Lkkm:$a#;mrt{u!]Ot1^4z]֝+QZf5 ΍l1^36 ,} %%)#Z|N#;$׮j786OkEOl3Uү57Z8M}nOS>ԧ4iv4>M}NS>?M]uf>HW6C<\+*\^0M}g?9yY.%~Rsw^e%}`"+gFKt.X+Z陡?+}sUVY.e/*;vr[٠M,YמRKvnyШ )AĥX.soI=.*KW.[*bJNzdKPJƑ :7}I#[jFmIi:5Kex026C ~'ٴ@f(+=Emō[bV3wkT1,TEqrUE)R12l3\0Xugj2,NB&(Bt$kdʶy:UH賕NT Tx R}YbiuU4,PNԵ?NEmh[pS6oʦP @)0RD]YbzC1uRC8`VֺUU'5>J_nJc5`QUf5Wjkz&]PvmfT.d]N#l\#'|SNוⰖRp;Yj/`hDuc}%ݒ\D:/qA}n%}&/?)_5z]}U* 'S GVx,%YQG~RQ5ۗr㪳qm,]?Tw\S2{_sktYmXWAuz?r,ѝ8FEXUCQ6Ś1.ՄemVJLD%5$BtfT0MmOЃnpgqp4ܬQ#(?VC%^".8cXK; XTɅձZ aME3Q[G>5b6#(sZP Xum;&kh&@m Z}my7%򝢪Sg/x+G d%ŽRdRfS..e̵㪇) XMxl&Ԓڛ2 mH+V)p*xA_j>?MtTnemp%K-3pur4'ij8B'Sw37a8z9FeZ05<$pPW41N7fls~ s fK BB%;Q&:8 t+ j7|R3&z⹛R3K [pN4gHԏ=k-ZJV|o`\8M}NS>ԧOSi꿳_XWu ڞӦv ]P ?D>Q[{Վɽq4~ i̱ݛ}Φ{Z\_6OS|#8pf_\h+Oь7&cnJ{}r_}SYIMSR63-j s9lEЙ#-Z3{?1ûX ~ &ߢN\7م,LfV}K%[mS J 5ڡ}q1! kҽcX^j7jޱB5Cyl+C/DkQyf Ϫzf^g0̶4ќ]=P"wћ&51[u+&a #L=e NySvFxMmE&feڵnUv ]ro81TXQ06]gEi{93jD"z6x%(ވ)cC{ cgwD4ZWKKq@u5"e 37.aTeW&6BagX@S3.hw6 ̖ijcX l+:P<&\*SW&qZ eQ:3{2F2ì,j6cR<.;PU rV=y' P:[HַLuA {a6hW% }f7Uf36xYYeT\EgRANJW t^{WntFg|k }'h&6NepщDE%^l& ̽fTs(r,Mj2 _=u}pi6u-;PM*IxBd0 1D3&t!L\iV24Z 9A?@~|r^Vu KQ{ʙ6_cIfŏB"QS]V 8緘on wB \59CC-.YnT%@x,]g~iSbw9^:x֌Q(\,XrE 9޼e96ޏ̢͌7#o︶+(=||.d#c)ubijދ]ċZ+w2ZHIO7`*ݦu3:}@8,Z\)5sQ?WK5 *fKVɭ%2}c%6/{V[h=f|)PJb{K.i ;RCg6^T"h%d,f&GMNP}ك!T' y<!lĎ)S'2Y=Wʞ/kw 3J\-\`/ɄKq= "EpVX]ޟO ?`C$e8H؁aMq!2>,POb訁Óq$xEE:=E-Y )y: ! څ*dF& ^tp10”iJئ$%g/VU@XgN ̤&(OFb[2ČfrD{_ܛz=Ua%@rJ8{Ⱥ GG&tՑ` ,"]PJ]\!Zˍ6pWVOZxSCZ#u#G KWtl@_Z4(0,Q*o%PQLͿyD c[Qp"0-{aJGMr{̀: ?eGbeu76QQ atmaz8s #xTnyj"qACIa!L\״M2S̀:~R쉞Df9L$eE^ܝW Dh4TԎ ^8ɻL=pOrlK @ƃr\=YkO\'L\""褃ǹhsS$h:\c'_V<Հ4:{M@NA?hj>1ޚn̢Y\7ݦl~O]x*i?Wœ>ԧOSiv4i_}}ٯ{xbY7T =W{1Yeס2 kLME;T1l@=S\C\YB+Ҥ5gmi/Yĕ%t;NliՋ1[^{)a3QՉ+'͈5ZDG!O!4׼_J]3浛*TnF|zf+UiCԞo7lCZ+!Z{8w|fͼ@a{VL({gڮ 6I(xHȼBؽʦdۺa5S$1& VK}3GdqVPDwNѽzf{(BUlp-+.=Umr\uM`\M. aʻl,>-Ԭ]pCp=M}Yz )LM$y3gmP^j*S:'kraWtLMJuh,y{Xg%nd~tY}e[j3: rM5$(r5 #(;Hb~TVZT6f (`ʊ.6J@> Գb s~Fg/R^ƫ|?>"UVGz~}?m~%Pגs$lYv|YjyYȗ6~ə㿤?7m-}9+曦];)\c˧1d=u;~5=>)-s> 炝O9Ř׷4 ֎#x:-ehD+"Q}I Ç,$f-X>It\w_1k(ƆVrXWdRbPkȅ#)"PV^u}+v\xBYyq @Kαb>^6;#e~.15_g,oMj9+SšyS{r}yxNW- 2)- 44`̚3U. /rj)Вu7]nQE*:K8_vuVX"{< fdpj@@84j#sLIWtVDvgO'j稗B'ag"oD擘Y]Dgau8~xz"_ IfHlP]Cnަ9⟼^nΖbEخ r^ݧ*z ~sajR5;v0~%pCO_.),׉IDa\^=,p-3wʠT99==xs_Mrnu#u{D7 @ͩ76 JlFPA oD%{"4M/Xb`FgGRZr؝B&{Q=ȹ>]+KOgb%ړGrOƶ][7Kd]x[q;V2:|&軙.'0ϝ.@?ZKiT+Wńەl}lWZN?汴Tz>bv&m+WmYr͡˳ljF?ȹ(ʒmd Rx [P2 Mn>r{JeF` t!-u+\STQ`*oQrwzK}ݞ~\I 3:`q_[%~HU7M oMJ;Tw./?aۓa֘/?Y[b@S]AL_{ k*71."]* :! >` */O$8?K< KaJ[B4mK9jRA%x3wf+cs9r;^ cuGa&dfS_q;NKas0G9 (R\pt_^#L;ڞJ>Ci^Tˁg|'MJ 87ƙhd";asNS󆚍Z3m*q.# Muc3@ {dU*5W^5{Yy 0lSR9 8SdLڶaʗ&ZQsRϱ}\8OdW-.7*j %G 8:(ll &oa1u<Ьj)X:sw#ǥ9GYŗ.ÔIٟHNN4}R:#93yx u,LDe\ c澊. &Q1ZFE'H=d^792婐CaOG Nn='‘4]".+K >S?@˾Cκ XN1e0lŏ(쏵??:D-_㳂e}19?{󏯦yVXmX-ܿjݟ: cƱ|="3o{uǼGz{ϳ'`R"'3jZTT]wPPGp!X)2(u _(;Wu-jn񽥁">)`S?s~h?cu66&{w}|- /N8c +UxB|sM3cȉ#.:@dFD3lTMO$f\fdV՘m%0FC WÆR9qq+,KW|du7(ٷ9Gޛ#M:o߹'џTކK^%w:;,B4õا=F -|9k]FT|~+Y:MK>_Ÿ)Q#7AMipnγ͡bS̒ڇgxqm[r E!cJZ6Dӽ)>5=RS_żks%o܊:g_USsxSUotgEM}NS>5(isW3~Yj}n-MSYIt2O_b{i/&]Uo} q_mHyQO)Ń+Ǜ0QThi=8)Ab*EN~qG_LYJf+sf&oBcLvݬ-^'^΁=XP~[+a"ݦ;ŜHW]ޝ3FNR[ԸIqOߋy}W^\ +z Si̵dukќrZ!=4rKh6} *WhIjb˨#Wiki&3WmqM]HP<$,+V8Vf'y/Ud~Qc~a `c 2<TDQ^ٷǕH«eU%:`^s+3%=sp59*C0ćr,MVY.+J0W&28V7#0{ׅ#w5ѧ٫eZe.GCAi{#3ڙ7r*\bkk2[3r1u;PWP̾4R9E"b:2{ќή=U՘L}jP^G [%CUً ,jжg&u.:XE)1k#:Nj`HȾ1nne~}0G۲nc}2îmxI@]5ˮn ~W^ m+Ď  hb|D'rLm+#^m we22Dkx;AQY%o~-tX~DhʸK}[k] ڃb?r}:8lUVpk =%]Ix+5R<.b;޺w |;(ø:*Gۇe5?,EFo .EK^un!umi_mϙ7n W=u4qo sv?WÜ:)36rW>f+#9r3KEMp+x ރ̦c.F\m?3'xWir,.y5X+veJyY uƊ9tۏ^TvE%hԝL C"pT`C Cxh)+S7~|Fx64 UJ; =gaL* 9E[7c P=+(VBEI7NjNmYXveh)X/&.bCEdʸg#ЛӅ<Fʳh#"q(#&/TrS>z msժ]#]6| l:p2u61mc.o%EcŶ-v0FuPwX?@#ԹNLTǍF ʧ4ɱY 3ݮb 0'E5vinYZR75 S0G'7CI}\ihL>n9-Ҧ'se>?x#z%ٶ'ZۛЋ{PwVlZDY08 l /M"%0x%Sx_fFS |YX3q`>AePQ%MN+@8g< {s^j=>E9^l5 *\JH9bpPQ>A,9Rcv;o= ҒIbs'wM:_28݁քNDohmӈ%WE)X[ZH=ϜXqXCkï7.RlBoտ&uX_ y޾W?OJOz}` ojZ xy¨w\گOP̽r mo_ύ:.`|y=_FiS xғYxZq[ſm[ڮՏ/G4u#]Cru8ŃDW]_SW&SM87ֲC!5BA`S98pt]i$z ć >]'DH=D@m%ĢA]k"]Ku R y$Ep=E! ř\jʶ3+/̩r/l x,F}r" %ϹӺh/ {X38=gî2Q6Pb+S2rبQ ۪LrJyEPT¬LfQ`wA詠OaهKiNID-^.ut񳌣"{3XB;;84`AE_!w\t\wᒅj2ƤqjfH8en*qQ)QUܯ!lCm/j HXH KISJS5J|Ӌy-^Wm,|X.W1%d˒n4٭MtzI}oL8+G]SuP\^.:C#Yi.Gf|prEG_rN#uA:O kp+9J13gK#=9%FmҴ8?9톇SN)Wruy]c@MqUW ta1}a"B /AZnIIȎo,C^_W$ݫRRD$}E?BY *-BјIXrx.>dQ.wN@LKPr箬-wW~=o$h_9O۷[ c'?tWxN-3Sc%k#mF+yjɵ1:]qqy \?e?:m?>qx>v}WZ0'֗;^}X-?'\_e> '="3a҈=tץFKl$"L=+'۴p6ٗgxu‡ rfЈxϰn^"#ȷs]ɮ3_4;(tRgQ r4YR3XtZ[MRl|^A*B p=1 ):e$$]Gm=o-Bƕ922c_ph#t}atO (Q@']/?ONS>M}nOSiԧ7uZ(S>o+^lw!,%۫vۭ|.wٮ4zUӦ^qW(6O5/^|+~Uh7~yGa|y.ߞEޮ[X1tEѬ׏3u[\ѷВ8AJxe%v_rnlQk;Δim/3ƕ=<V+~ۢ+O:2K^jC`X_4vGqaP"jw{Gh~AĄBimT_9xvJ[r/ }SbCKK^.xe؝a;!8@MVP#¾*9WNGuIfC*YP~('irQ}{6IcZ6[Gl謐ڮ#DHGrٕ.[pμBʅYhjҝgvYx 3^E&K_LqĴ[0X̀ U%Cga2ct Cek(( $f$\0^q eU!CjѮ#.l[%("U6#9Ϧj#9z]cwej2ׇU^EϘq]&ˬhURy>&p&$9*ahM0&{8S4=}@ Ag|9ighױN"\ ΢& x%uѩ- $a X|YiL} hQ]\-(&?}*\Cmga~ \~ZxҺ$|*)cӟA@ϡD [M/vaƛ;,L_عֻѵ䡎㷻_})9"._^2/\Z:5|xIKg~gV\X?"7n[N;h]{0Jd?t'Œ}ȱۗf]9k9vQaKREevە0dem;fe^o҆^ZIMm*L&. zׯJ[=ԘBjkh[*>0;nI #"R+WOY{䚭~8dPd[6ND2rܼDMNm.GPZ KAO8|ԒKeϜ7~Ճ=Jlj\C\ܾɩ2`/' q#Zo} 6>̷f~5}XQ1J]Ǽns}኿eۻ{&l}J.Ӭ񭾼)yՖ_?Pus>׋fP[{n"}11>5rYcEw:yŹO,'x`NyZJZkXw[ P륏gԫ/M[6{M4ڪńMk ;Yltc僼{,7fJs(U ޷Lk\(кڀJYUi.[Trl[`__p)NRܲ٨/r؀n &jބj*ʶƒ"("9| ^vx0|5rHMY6*EXpIReݜp}d|8r~䒂wC#$/2I-PI% V0al;T:4sӣ!0 /*Yi 'n<7gT4ITGF\4zS~s.h Zy0ǵYqBv @Xsz ~+9Z vU s kSv6uY.nS5,: :d[2+nY va(ܼ ?QuږfGBݮ,0жTQ^*QF*`}fp3UA`ʈ>4ז'V*`\yrp4,ɸ뤖̻;ɱ:H\ZHJgC[x뢶p$v88ԻKeRw2I?gՑ`9,i5.I\QnEvƆE}pMU,Eg:=UI##nYeHMgl1.uՆ:+qp]Y}y1x"]l WFS\Nd~. |`鵢;#3vkV{^OixdzاҟWy7_ gMSŴ}sy`Z)@8o7L޾m}Q}'կ t`˼Ē1{7'sʉ ̡SSMǂ}KS̹})?M{b-U͈}#+0dzRAv /]@xoKm5EU~s\ voZeMD457v1]}(^F g74sC,}ͩ^WRWz NY45(])D(F g:) cmwk}3KsIׯENBZ\|cVH[O:Ic b8n]j6NSM}nhX/+GO5Ǣu #˕L9'VYk ThwԶq̗eN-e8i^06Ws)Aqɶ}Id779F3XZ՘mK10م4CMwl4%鲊x9xK*p0\&Jjʼ=Mi%$`F (ԟ.Դ9Sc%Fׄp )2u2/'L'{"6EU.͛ii]d=nl>v>HsD&kSocn*y;cWz|Y]K2)M}~GyrB|~=n0_wvR\i,Oe9x0~0 U^{a[m+'";+t4)ʃŰd}yC<,J^'U99{z K\i}L uIm͊9}n٬7$9jfWӪuŽqKRibn6pձ﷒^܍_J$æRyɮn+ےY)aE̮6"HcHŘȒ5M]j9 ^Z6gM.[C~/1bͤ&|Z=yax=v%GLS8ݪIw6jlmqU5x$1ZSp[۰%ꦆlI\Iq%7$Vb4"iufp [zL݇mqS/ iEgYtlFjì^2F{+F}ό`T"9$bKq:drE T]f~(= >j,jM\0SvYf\~nH'=WJdA`!($qqQlzuq\8/wNVJ{CyT6W4I6V؃sy- w6˅H31r)  7j\zÔRk:qQwO(]~h'N4nMƀ~[7ir{LouX豏ΕI(\i)B[]m;eʚ2{⢖~Z6F"`i,巁92N5uP{Sgd; ^fUxWs>/ԟ0L+Փ+sZ߱h2,͇jB()ۃφve(ٰsg^Fd 9uA,ŖgK,%?ooϪ3t JQ8eVvۀaƴqr"PdTe._M'1!&t ٷhTtɞ`!-(_Q/va׿-C|!2޾/l;.HR4^>!8*sD $Q"|iv㦎\250ӰTgrc@mJ6Q'pAjZ֢WT;h_˘ؤ5*J*(Tu["}{2`^Tn4ZYh}ڣ$HJ͊i]R|?^by R~e`< Mw鴟զY\y S:s ;`;LM-t[lӗqj\Vh W ei0Q{Q3P7K9%\6$2PQH gS/%W!;[RpIC` G:{ދn_1^uGn3pKd%Qaq+"ih.pwRG"| ?r[o j C~~OTk4(tߤ?}SEGgt cY}P{=FgC9ҩ e8^뢎Nς.;iu"~VBJeKS^1f+S[ *Ŭad{GTx88Ao%>LH89Ϭ,#q.l?bTsA|Jdku0gߍm.Q41N2x_dܻٓA)Ojxfu[ 0\NM{lD6&gaSah"7@P8ΔQ{9 (J_@m4MĹC*MF]}|5+'ȆL{`Y%O/yW836ܧmюK4Uĸŕϊš/M~II .m, 5FauP\*qţD 7lN?X m[rL,cY8dgK9kBKɇG1Oʡ0?= b("n2puv-+9\|2]Kf]3Cу.~I[ v=.e qawؾ&SITO5|^Z ʡQX|J㑡twU:s5yK$ wzbTp6 i*3j>lrapa192覐)w)fz8Y % 8)VP\(#p〇%tksfٷUg 4}L?vVXܙݓК%FCxP ۍWE1GBj5?|c`>mvpc'奵y?85lB_gSR?}QپxB.z_Z}*xE 򻙈H_F乽==1ϰ ҠʼѶgO eV$gHp5F+*Иd|ɚ/ oθ~q[l}.FǤZ#oaZƦ^ 5LdJK$&jw2e|(#$Na-]Bg O];>)픣WS;ƘUw&2_mD9h天x𕢢kdڥ\2jM2]h虼]g )a${)Emsٺ=dT{a)h?;s:SЮ) SGew)/ytv l+9^JFjA윽ﳒs ~+w@n㉻zzF]zw+wVk|< :hW!rS?^&|>M}nOSiԧ4i껭F5#pr`dl2:cI6~ͫ1jyGM}nOSi.SX]cZ1@iQx:,hmw(mq%-q䑽3{;DBom{s W{e(0:۴ՔӾYc3"q_I}U sS9'۔5ugۤÐwd8 0moB .֐ȸO)L>,>fnrg*o`b2C^XYL߸r(:VU&oSK;+H9MA8HLNXճJ6b.]Z]mc5(ªmJ\;iڪ"K)ow &Ӈ bDs]B/.{5~ԸhJF"n_$)Kj=5w)*9Cg4&nQgb .9D{+fFQ5лtV F K}x"vv5ע1jĽLGfoFmURi +CS04]=@w0.O b%- Hv%jg=e;(7u1"c!}enȂv%ii.ڸ oU>=}L~_Dp*Lieޚ/#+q5)=kz/!O{W:ZƏWB{VJP3S;h–T~ `L҇ cO LnQ-oKINA VKª/ i HHi t;&^zԘI.}p)iu4@';7ƂJ5Q#DYKˊ+ P7 T=M@*ŕ\(T^Ыc çY""WߨFKF&TX=e~ƛS|Ɯ('](P = 7+)8Җ@5aMWJ-%#_]̾TzJ_ԦNKz oUQeǖ.TCaپ.(K[F Owh|`WNS>ԧOSiv4is;M}NS>M}nOSiv4is;M}NS7XIENDB`PKV styles.xml[޿P~%W\{]$~ h٣D$J> 9Cp~ G7?r:Ǽ" iLp_߇৷zv;M:Dž+qڤU5wArEqzOG$-$py!Yϣ}!{?g$:RT˚ܳtGArW)'%h^bPEMr\mDa%.n7.FHΖgO>} ^=Dt|1RsHW48+$y'#VQ1lW7egR ܍M2P)ʌSDwljW6z9*$ , gYJpC  &@,g] ٱ Y)T.(X()e.4${D P+JVWKVHcW`X>DB}!Z9U";V$Z0)[DaGaPHqr;K` /܏0[z@h= CpAx0h)=4QXQX6˕CA^[? 4fA^kCa..&8 +? ׆b,8oR~֯ ڇAK遠 /B_ů 4..%<.`Wp?/vd_ !4cB"1;A;rL st Q>$r5ES +hi5mzݶ#ci 54R\1<:/]jWҁ5IZjmtt;]OeL qbPzЈq"_%b_?7z>I<۶Qv$kw=$nQ՚&.V۳7_̇ݮZo7ϧ]2)_^ggSTR'dc}-iJLL/qj7jgId䋼!oe+GG_W<NRۃG ˅OY>,1eMJK0gЍ\,[>s4y3!j6l Jߓ\9>G?7Ԟ֓ ]PK(I :PKV content.xml}F} v.QH;%U\Ggn3mwȠDŐydf1@v`_cd#I2RG Yb0>ӧu8 TU^-}wvG+_y2JRoG+7IFW4ݼ/G*^nn*? =z{^a?-{HE.ټi|c0{4L=7JE7TD,*^'3È076,^)ɫHe*u_ _G"/t۷qlݵHWx}gh&zJ|9|G{dmW]_7" A*a}|iXiNڝ"tɋ,id(Iop9 v9*5䧍|$BzUe2ܒt5 .i|9YYI k @}={4kXzk+oҚ}Nzܨ8-s'T>!*"Fy>拍N+>%Ш~ɒ4*^Ű}_IgE}&- 2y φ>S-6?6?+6;恇H7h,S^i0XLgrY'fQ1stB)*gh>W ^9#T,ile:g4Qr5ə4vW{L [s8i2r=XmsN`l4FsNm abƜ,lg[YX3eVpN13[ù7jDf9Vp.'c grۀJ陙虭BH9'X.sI13[m2 `yn+|o@-z9V,z9VaόFXg=kⴟY,wܱ\߰AYܱ`ѹسcX4U?97zf+w f AK3`9k~r֊bY35<Ղ>.͘j[4gZt1vz ż+wh,@~Vo zZl:pǿA*?D T@~V侏!z?S/Q#O}Xo}|'L3LGmƥ{:X9WCWFt&Wt zPiO2E n;0x0hpb̘`<>Əd[| B1ЛJkj:/[ 7[<"X%#/y'';qN{Z󗌼g'Ȼ:qx{C%#!A/y'}yEd?dWim_2ayO4ID޹gs֦~纠efbq2d8G6?,I(<~F,  ÇeUq̦A 8iQy_=~ާqwƓـ9I6'8ɞAt4t${NОtY 9IS Ng5jNp= Hp NgM<$1h5<{Xmh noH}ʆ)r!Pw=kiMG:v$yLT$?Qky5tߝzqr7no 'QY%}RcOJ ;H9R+i!,X#"0Hy:Ӡ5lH$ SOĀ\T8:Oumח-9+96z~ x O˧*BP륌d 0VyDL*I58J'i([ x @~eGC0q2$*6c̍JYœ 〛WE)<|"%!kć#l1 zuye%p`DԚ?x8E.m|/aK*5 Y]G +#ڜ.k^@ȕG4:0O#%d"G0o%0*p, 8Aj:![1qtE[pCdR qq MdMDMgQy iN<Z?.1a9x+w29i~I\yɒd-H0*B-)JsrE|ۅ1ZT+D)LKǯpp5J BHČTpP(4PPl@~thcp JlGM+ЅeU-|'߄KJK!4B`lf2=zN@dʐdZ3vP@˜*pK&y*v`^p?VvI!|\@"]kG kT)VjM*uh^KJug-4C&+\A1ؽ7$8 7ƒ9AqK^l;d1@@gD`5H]b Tq QQTO3߆Eh]EaC` 6!uNFQZ؃`Y.C[L8nA#H@L^Zsa}j0^4<ؘ* Z$p,+nzS~*r-sৈfu]/qs6~Tx@ h*r\\!rns, bxu/4@YanmVb tDr4ĘuW ~Mm@Ҟ T`::$ZG03aVNM1+XM~. rh]+dN97TKlcbq&AbLMt_Y A3΅l*5v,pTteZuRI`#YÃy+j"%%8 1a2 v@.Y T:Z`]* ս@ E`ۃCǩ;hH- r[MC˜Y*BMGdb:R։;8_ B[`A/* ["1?T)avxy K`e4~_Z&yyMfl &]ʪSqL+_ QO4&@)0*/DPg"1-$NFwv89$'˗?*}IR| I1XܐBB(ix2,u"$ɱ'n0+Qt8ubMjӼhJ*|?5TڌFo "ntzHنי|k{5K6\>—6piÚh'/ 'A=4?b2ʇİ/Bʒ Q"1' Y5H ao7~J~l"U5O*44֕Mx! )5UPD@@NU\rk"qp$äͲ |5\H]^B6(=㕜|1Uq+VlCokn&!.-axOdD S}* =!KUi6#w߂ "ȉa^D,4r)p3 ES@%`;Al`3,G [@`Or3TFdE^T^:ߕ2 AKEi=IypXZT qwo-G/$uAo7nM?*X y_;fۨ@SX\Z{t^SZ~e9Klݥc ERyhsj)*јaL:G Kn?)xrš}If„Q1@2_$j)ѵml.'ytnX sF%`k: %31w&oIUЍM:ƞx+7/,tOa ~TSQ/OUl+7bqS~2;_Ewߴq\vk17@NEaH"M,0 IoPcieٟW=@5"CĦv&!7fzMm:MA *`d"O{IpLɓlZ ?뉲N$ 7AB)xdXهf#zeh؄T*aB.C:CRK]H0LWyLCG~_yH?Q~#R]n< ͂8ESYbT!+FjVJzS 5Xv%V@:ƙaݯ~)S/tA|*.h5Jo =,6 5;4 ? RVdT̕1 A  ~p2AaWpm-#Ӎ_=_TazꗶĊ<U?[ӝY6fc]"KpV W>j}y^ ^\/cWȦ "dY{ڀ"x$ QTP;&k)='1~"'j`OKɢ")8JO]5Q@7Hwdwavxqq"T'HQ&(G#R $U tdmH*x{̤at8]Fe#@VQ!輛-M`7%u5zbA z=)22Py^P.4F9NU-d002WSޭ俘F# e1R,.l#Qdl.bcw)-%[EX4^e+VڤAAzզp?|PU+x5*b0hfbkJcG&oӡC]KA3w9W*O&vJ)sbz:dv(w}vYcj^9Q|hjAttʔIʁu IKڰC4dSEMSh}4HpB+R*76,r$ojnDp9h*Aj8-8;=WuWI4,>s,Rz hj\=l_ er79)b n%͘:+=\u!$c> ;Ӑ`>g$pN ;L*NHr=ݢ?+r)VҏP5$VЉ'WpwuhE3? ahRT$)u*|HK ^N_QcFtqJ2=i8r92?Wsa:y{B SAA+c窾5 [B 0*WAr%G]d-f}ZgbJ#ԩH= PQSxH9R$y4TJRr%&Ɵ8@KLJBh0ire=m*_\yS˷-m9dJ ]tޣL .Ǘs'4ORtQosl<.SScv255-; y+WcZD9 1U£2?H)^&C"t@)YB i!Z3]_6|з s6hn12M mR}P_ϧӼ ZJ8&7SU]#ҀP1|}*Q4zuֻK1LZy\_W照DE,5vEq" {F5)b5L"6rǏ}!,>l^09TP9D+rAqjkЩk :}IQ^_ ZֳK?7t:GZǔvG QDG*A`Q rY6IQE%xN~Wg|GТ]@i}W[B,d1aH.O'M:҂0}Sհ>s>iJPU<˔+[]<^WS zVP54_b?h( ]Boh0{+JZ0ɶ5R+ZR-ԫHVR}LfeEg+<M/ur7o}eXcQx Rdd4pt‚T]O3)ti_7o:EW_ksuꨫ`SS瑩)<jz@nY3՗WƸfINU1VVdq|~n!Y)Ro]JǛ:H0H6¶ !TIrޞQ5Sqƍ7Z;W -2 lFC};A: }rT.݉0+5R_%/׋7l'nX;K1WKkSoUb + M#\[\ț$|+-pEKIɰ2rMIX/`s1Xyl>Dݥ!:a^Jnc@a#N+Z /BkБZf4efNQA};Ҧ1a倃rK lH܁SAҬEG,P/z%<#L|0>u]E"tH2Ks1`>Sp ? 5$ J&&!4^|ψ4ܢuU{׬~s#Er=E}s_CۜTةr4ŮN؍#F9 ++қ4ujeMq?ޚ6҇ԦwpΊ;Lxs}!(v-3eB$Ry$hwt q~EvLցٚDfM D sE^P)1aS>SI'N{ kնȰDx c68Б`+/0"khL]w!*&VԯT,RisߴB8%G?_^%,i:upN &ߛAݱmOwEHn5T>{˪bߤ0D(m7ڐi;$ׂ3s &N.-S܄kec|㶾 6aB FJ/yn2a*8F k[NhЧ gHS9nc5r-\n7[ǮT򇖄}zV) Ӿ=*M=~ͲjUs,ڸÏfyΏXl^zɛ{hC`ca  ZoV1Z~iBJa)Q)O??B%/oX_]t%hݞX !=@{8ߦ)C~[#o}[AC[#hh06ؑF%*.#4=mK?N.UOsvX/Kܡ4wv.F8y&e nJ7 zO>y$Ïwƫ e3Rq|^i N׳BC}Qe- zʃa:v*g(=Dr[o4q~_iCP3w_c9N^ ſ_ (E+{PK,PKVMETA-INF/manifest.xmlMn09ϦYT fL,(ܾ@U% jv-KY[t(:}x{z}ztqkdX?)m &Hbv(@{= $Rr+aJ)@(mg+@vrvz}/xf70?b{ $_2Vo5(@tR]r6 +Z 4K]$@kv f2)i/+@Mbr}A@[{h'2Pj{Q)@<(d`vO(7Xol(@&bM}jBL$Y:&@Hhk&+\ $@=_xQ{rhX6- =Ym}+@,(_}x{z}ztqkdX? (@&Hbv)m0{= $Rr.+a;)@h(mg+@vrvz}/xf7,(@?b{&$\UtRo$@/MTrkProphesy @]d[vA@Fcpx; !_9Vjx CnMzxt)x{ V{tk[B C@Hd @]r/kKJ '4?IPX]a f)jmjf_XMD9+QJnH@0ToLq*J@6L@4tbB J^6Tk}L{m[B"*HlJ@@d{}ztqkdVH@@+Gi;]v{rd9Ea )G@Rmv}rh[M?7C[4D]o}KE@.zrdKOC@Ct @_tFA@{qdV@Gr0RC@m9{vk]@G@ Cl&Ro{{xrjM Jo C@?_v5raF J@HW7Vm}RzobP; Gf +RkH@x}vmfa] Y:V@ G@?_t\{xApvz } zvro k f _[RF7/6RhxGE[RCIGW~}xqjaXOD9+b>@C@G@k&=PXT2U>_G_C]N>@G@C@n ;axUCg>dGbg}{vrok fba]XTOIB9-SC@>@G@;_vKvk]I>hC\0 GcqG@C@>@n/Mfx5} xv(z J[}GdA_ aztqmhd_YRF4J@A@G@4'7+}A@A`G_JN^ 4RoA@G@J@\}E{xQr q k f a] XTROKHMeDJYGe@=962/+'"gM@J@G@b &Fbxq[D- DA_GdJYCJ@A@G@?G /Kaq}4Tk}2}zvrmh_R@) Jn  4DPX_dhk or!vz{xtqkhaYM; KO{bH XjxJ@~"Dav)t]/s{ x qmhda [JnVPIFG@:IM$MRkVY]_ d h kot x{#(zIO@rhR$Mx /RmJ@#}zvqmjd]XOD9+PJn72Pk}P{ vrojbVDE$-M@%J@uxP4E@4/MTrk Tunnel Piano @]d[A@*laECI-HS/KYfqv{C@xoL]adkzH@Y{x rmdVH9)JS -KbL@rE{vojd]XT PVY]abf jm-jfb]VD$)$HZOj}J@Jzt qt x{)x{xtqk_6GL&MhzH@%{ z#{ g} xtohY;EW G@"IdxwzqfR"CP )Ibv9E@2} xrokjfaYRKF@92)C@C[ 2OfxnzrhV" EQ $7HT]dC@h kfb]R6GS 7KE@XafaYO9K  CL G@0BP[bf aYI #  " & +- 0JY;O_mz C@qxk]H)HS)IbrJ@4zobTD2"K " bG]H@6Vk}A@/x_-CS G@'Kfz{}zvqkfa[XTOKF?6'E&F_oxxmaR@/  C@ +6@HKP TMIF@= 94=904 2FR[_ b ]TI@94/+&$ &)/0 6"/&@6Maoz@ztmhda ]Y VRMD9/Gi 9[t?tR0BR]fkqtx{O{q[6E] 6[tG@EztjTC]E@=_vJA@>G];C@C]KG@]{xrkd[RH=0'"'+/2 6 2)C@iG]G@3LS" -6A=@@MI 9")L@7BO]HM IR_jqM@vz } vmbO0 $0;BIMIFIMPTX[_a fjm'o)hT2MS4Mbr O@ zvh$LS M@B]qtfK$ L@ M] -Tq$ztq"m khd_YRKB7- ZM@+Ohz?r_LSH0 '9IXbmt{K}A@zx t ojbXI4K;Xm}9}JSL@vkY2&Kh{X{qha[J@adhkorHSvz }@z tqkdXI4o/BT_horv z{QH@JY+}xtmfb_[P7 "IbvZJ@L]g{rfXH4  ZHSL@rTd ;H@[qYzrhajxSZT@vhV=A'PmS@Q]-zm_PD920 27=DIORX[ a dh"jf a [ V PMIF@;6/$,@]q7Q@OSzto kqr v z/}.}xrmd]TKB;40+ Dat-O@#ztokMSq t x { Kz tq k hd]RD4")6OboxvjYH;4?KVafkfaM@LI]djmqvz s}ztm_K)#DatQ}vohb_JSafkotv {L@A@ {x"v)r mjhb_[VPKF@?#4Mar?zod_hov{LI&J@ {xtqmbTF;0 )Oj{vHP&L@o{jB 8H@h/MTrk  Multi Synth @]d[ @]d[` n`MA@d072E<@@-&-29@FKPVY] b h k o tx}F}x tQr(o@r.t#r.o\kKorv z } 7@%zqa@<@-@@ 7I;K!>:$6DPYafjmq r vz({{A@}zvr\okh d a_?[XTQX#YE]ahbOfNb5a ] X PM H F-B? 9 62 - ) $   )   F7@>@;@F9P A=>I &9IXbjm*j f$mrv{sA@Tq-19@A@;A@;7G>@ +@R_hmrvx{ )@@>MA@ }zrmf_XOH?2';@7@?@@2&-29@FKPVY] b h k o tx}F}x tPr)o?r.t"r.o]kKorv z } :zqa@(7@@@<@7<><);K$6DPYafjmq r vz({{A@}zvr\okh d a_@[XTQX#YE]agbPfNb3a ] X PM H F/B? 9 6 2 - ) $   (   r;@);P C=@I7@ &9IXbjm)j>@ f#mrv{sA@Uq-@;@< 9@;FXA@ }zrmf_XOH?2'D@;@K&-29@FKPVY] b h k o tx}F}x tQr(o@r.t#r.o\kKorv z } 9zqa@6<@7@ ;D>5@@$7B6DPYafjmq r vz({{A@}zvr\okh d a_?[XTQX#YE]ahbOfNb5a ] X PM H F-B? 9 62 - ) $   )   U>@;@(9I >BA6 &7@9IXbjm*j f$mrv{sA@Tq-A@9@>@&;:@47@+@R_hmrvx{ ->FG@@:A@ }zrmf_XOH?2'7@;@>@<:7:@&&-29@FKPVY] b h k o tx}F}x tPr)o?r.t"r/o\kJorv z } :zqa@7@670;?>0<@$6@@DPYafjmq r vz({{A@}zvr\okh d a_@[XTQX#YE]agbPfNb3a ] X PM H F/B? 9 6 2 - ) $   (   T;@7@>@ ;D C1@= &9IXbjm)j f#mrv{sA@Uq-S;@<5C@@@9/A;+@R_hmrvx{ +;:>0<@9@IA@ }zrmf_XOH?2'!72 <<@(;@A@>@x&-29@FKPVY] b h k o tx}F}x tQr(o@r.t#r.o\kKorv z } 9zqa@b7@ <@@@$6DPYafjmq 75r;7>(vz({{A@}zvr\okh d a_?[XTQX#YE]ahbOfNb5a ] X PM H F-B? 9 62 - ) $   )   U>@7@2A);@>5 &9I9<Xbjm*j f$mrv{sA@Tq-OA@>@ +@R_9@;-hm@'r73vx{ t@@1>9 A@ }zrmf_XOH?2'W>@7@;@@)<272/&-29@FKPVY] b h k o tx}F}x tPr)o?r.t"r/o\kJorv z } :zqa@7@ @@)<@ 7(;7>($6DPYafjmq r vz({{A@}zvr\okh d a_@[XTQX#YE]agbPfNb3a ] X PM H F.B? 9 6 2 - ) $   (   Q;@N>@7@C) &9@5IXb;<jm)j f#mrv{sA@Uq-C@@@;@A3+@<-R_hmrvx9'{ IA@<@9@>(*C2;2J}zrmf_XOH?2'gC@;@>@!@( H<C<<272YH@-C@D7@y@@<<@;/MTrk8 Great Organ @]d[`3oZ>A@&<(7(@&-29@FKPVY] b h k o tx}F}x tQr(o@r.t#r.o\kKorv z } 9zqa@<@7@@@77(;(>(.$6DPYafjmq r vz({{A@}zvr\okh d a_?[XTQX#YE]ahbOfNb5a ] X PM H F-B? 9 62 - ) $   )   a7@;@>@792 >(A( &9IXbjm*j f$mrv{sA@Tq-59@ A@>@;A@;7G+@R_hmrvx{ @@>MA@ }zrmf_XOH?2'O7@T;@>@<.$6DPYafjmq r vz({{A@}zvr\okh d a_@[XTQX#YE]agbPfNb3a ] X PM H F/B? 9 6 2 - ) $   (   `;@7@>@;P C=@I &9IXbjm)j f#mrv{sA@Uq-S;@< 9@;FvA@ }zrmf_XOH?2'5<27(@(>@ ;@A@x&-29@FKPVY] b h k o tx}F}x tQr(o@r.t#r.o\kKorv z } 9zq7@a@`;(<@>( 7($6DP@@Yafjmq r vz({{A@}zvr\okh d a_?[XTQX#YE]ahbOfNb5a ] X PM H F-B? 9 62 - ) $   )   d>@AA(>2 ;@ 7@ 92&9IXbjm*j f$mrv{sA@Tq-^A@>@7G;A+@;9@@R_hmrvx{ .A@ }zrmf_XOH?2'f;@7@@@!<@@$7<$6DPYafjmq r vz({{A@}zvr\okh d a_@[XTQX#YE]agbPfNb3a ] X PM H F.B? 9 6 2 - ) $   (   `;@+7@9 ;P&9C=@IIXbj>@m)j f#mrv{sA@Uq-q;@C@@@+@R9F_AGhmrF ;FCF-9@@;@-C@6H@j7@ZL@<<@/MTrkZSmooth @]d[?BPd<V$F]o}~{ xt8qmkh d ]VI9-  h0Vqf;@Z7@5;M@FCCh>@&;@jC@9VFCC!}zvqojfba]Y T O K HD*A@B =94/)" @7<<<@0C@->@;@[/FXjv${ x t q o kh@@mor/v=<@=ro m h ba]VPID=60+&  7@M/MTrk Bright Rushes @]d[@ noE0xq ZOd?avJztq m/q vz ]}{vqmjfaYO@0O@IMn'Ibr GzkMM@Dat!L{tk_K'i Fbx$L@Mva)4;Yo}}vX/Bbv {xtqkhbYO@) ?'HbvM@8Lx}vofYI-69Rdr}.{xrq m#qtvz/xrom hb]TH0aD_tkL@J_ztmd]RB+ D&Ifz{#xtrojbYRMHB?= 62/)$yBat J@4G}{xR{}9AzqaD:-Mfz]L{rmhb _G@ d h km"jaR? .)=M[dmrvrmf_XPKHD?;4-"`Bbx-L@ON} z v qhO$42VoFO@-SxmA@{tmdVF/)"=Vhvn{-xt q m hfb_ [XT P MI="S@P6Xqi{Q  B@}zqb?$/Ohx-xhH:4Tk}%Q@-Osz]"&Hbx2A@O@zmRyLx?avKztq m.q vz ]}{vqmjfaYO@0I'IbrIzkM(Dat {tk_K'5L@O3 Fbx2JxO@ va)5;Yo|} vX.Bbv{xtqkhbYO@) ?'Hbv2}vofYI-49Rdr}.{xrq m"qtvz-xromhb]TH0aD_t{J@LxOztmd]RB+ D&IfzTL@Mx,{"xtrojbYRMHB?= 62/)$yBat!M@#}{Qn xP{}:AzqaD9-Mfzs{rmhb _d h km#jaR? .) =M[dmrvrmf_XPKHD?;4-"aBbx-Q@,Mn0} z v qhO$42Vo`A@{tmdVF/)"=Vhvm{/xt q m hfb_ [XT P MI="P6Xq!M@H{-Jn]B@}zqb?$/Ohx+xhH94Tk}YJ@lz]"&Hbx2A@+zmR5/MTrk Breathy Ahh @]d[x0sp &n 'I<@br GzkM>@ @xDat!{tk_K'*@@1Ax FbxNva)@x4;A@Yon@@}vX!>dBbv {xtqkhbYO@) 1@bv0}vofYI-);x 9<@Rdr}.{xrq m#qtvz/xrom hb]TH0;@OD_t9xhztmd]RB+ ;7d &9@Ifz{#xtrojbYRMHB?= 62/)$yBatd7@0;x/}{xR{}9AzqaD29n-Mfz;@b{rmhb _d h km"jaR? 7n)=M[dm9@rvrmf_XPKHD?;4-"Q7@Bbx;xm} z v qhO$(< 2Vo;@OA@{tmdVF/;d "=Vhv<@S{-xt q m hfb_ [XT P MI="H>x 6Xq0;@9{ B@}zqb?< /Ohx+>@xhH<@;x4Tk}Ez]"7n &Hbx;@ A@+zmR7@/dGz]"&Hbx2A@+zm>@R5/yoshimi-2.3.5.1/doc/examples/Arram_Koth_Finale.txt000066400000000000000000000010671506652756400220160ustar00rootroot00000000000000Arram_Koth_Finale.mid This MIDI file will completely set up a running version of Yoshimi, and play the last part of the Arram Koth theme. It will set banks and load instruments as needed. If the Reports window is visible this will show what control actions are taking place. The only requirement is that bank root number 5 points to the default set of banks, as this is the one that will be selected. aplaymidi -p yoshimi /usr/local/share/doc/yoshimi/examples/Arram_Koth_Finale.mid Depending how Yoshimi was installed, 'examples' may be at a different location. yoshimi-2.3.5.1/doc/examples/CoolSound.txt000066400000000000000000000004321506652756400204110ustar00rootroot00000000000000 CoolSound.xvy is a vector definition file that can be loaded into Yoshimi via the 'Options' menu in the Vector Control window. It will set up everything needed for a two axis MIDI controller using incoming CCs of 14 and 15 (although these can be changed to suit your controller). yoshimi-2.3.5.1/doc/examples/CoolSound.xvy000066400000000000000000000271441506652756400204310ustar00rootroot00000000000000}kw6~ =~Jm:gq/YI7xhDd?3 2%N s?|g$]ċq:I}}Χt̓'QVCw2QWy4W<:"?e+h{^]ðޜ&]/&JeO_q"uD5 v Wq OO6蓥a(8Yx╧mjH}Ma!|q{\cv<XNl#s?p~l??hx>YDZ5$mǣ4m2x|JhChc;N uŋ<'$Ý;L%.z"8İCDiKMF|.syUk1x XJ ;_Y:Nr)^9Q5MUlt-Q*QvrFt=~pmJv3x2Yp\&&(gV婞]^]T\),ޛ?٬d~yc߁rj%,^\Aj\e6qd)dk uV* sWV%*Qf,]BX;s}PPn7Hxv;ho\a*ʄEC+< 6% p(t $չEId{'o߆7.om\nG7kb98#noGw^.S *p^H?=&\bΈ}Y5w` >wٙT g^B8xq/EKKӑ?8:z?´<*_Sx aI:f%F=Q4f,VWLm>K1xRNI8THS[\?Q !FE츶еx¡u&y488őЅX[~׃FͧPɾGLI I79!ody|POߕ4 g! w"/gIV)5[nbxKp^uNǠ+7|-爗*\>Rq0DwuF*6p3r4l/+s&"gu6^BS)DR3ݐI"՘ֵ5&kL SQ`?:ǣ{xTmo hybz2O`FAuJfltM)Nvfgy<ӈnO'%ջgFEQ Y4l(4a Z ~UL`~([aoCFPcXxy!coDoAQ^':\]\ZB!xHWth#5*]RCo6oTIZ"m$׉a s< MI(ϥ9|߼-9=;n3=Z;)ljyfB`]-Z#s`NQLT?j>Zg-ozKjzKjї\Ef6ç-%zӲ8C+jVĠơuQh ٚif2A`)xUeS7.i $Z PG(mX^9d O[:z m}^#\_\]2w! $k.;?KRW0Z /ГW߯ Nn(9.ojG\OpGd0'6I/W0k:5.D4 G8~CTwRcG𒍭hN6KCe),V[ b` l1j*m1΋QwTy:Z[Y-83,Rru94~L2:vƶHmVCc$~mX}},KZ+ɢw&P,zRݡx.m-F=bVſtGW.;#4jvޝBL:vXI΀H1 ;E1ɖޝs;aE9Qi .nP]=QR,z3%b;nZު=M=X]8ΨbлmHw6bЇ;s-Eo_qhYs%#e3#\IQY,7e+\BIDrvc/=. pgH^m75IvC=A 8O\2"ȓ,#XLK WFlL/:%F 2i7# ]LZ%zO$z4FO3* ËB3B=~X<{Hvc;Ɓl] 1Od@ b,5v[* D&G=eQ|3QZ0ĕ@V]y(=OҧێLi[B t+YˡPFX;BC qLu`x zۂOzSk JKqvvĹ*'bŰ{߳ $Wjh@BrWgz=c *K2}Z3s_5) qiLuU(eLm -CBuR:_L+T"mV' V@*>nZkX0q·wU܈33d%3e= !u`R|a)>cCk(`54.>/)FVt>!Kc_# R8#Z,Ԓ']Q3˸A>ƺ{!֞0b*y+kQVSLv&5%ַR=5ܴd+ jz[P2UڂmAIrlezycFr)ZsXQ4w&KVL?c1ǓD2a;N|+ӫő\$[^)"%[NoaZ;}Uy*-o&qACWJlFފO鏂}`GZKoA#iVooZK}\BL6l-*EC ,{fzM+G"  Ȼ+|C;BSY%sbt;f(mxj @ L;s7 a +o}s<8BV? `+ӷ2}+ӷ2}+; zNRE6x\2=(+gg+2=[ xOo+Y$ a4B_B5J;[xWUzAT I8<;eZ '+Ri+gwU##sl @Ucʼr~4hnA&nS AJf iPx"=TWǠC.ƄlAL婻 l-"l} B@C `m]NeXZTmag @G3 0&Xޞv̾Qv`BES]cVҩޟu H巕zӷDn.&3|}+\xTi/h>DYY]o|=˓,eLZi&U@19["pK̒|=I=vd鸋}s:3#Y= < [=D~*YJ!@PJ7$ȡhOB {AxtZzJuRֆ$tեEeΠ RF'fU8l &gxQ'g);ɣNTZXUτ8 e׌m)܁H~lF Ģ`x- Th)hTP1{ED^եCW{<ﱹ vm.ńWl%!h?h `glĔZo!Vz jMRҪ38:zoH@\> 5X^rOzHQ4ʳX-9b[i2.~J(Ap ^\i]ﰏ!n!>[>Kc&}}s[4맧NB̹A]hg<ƟHj-GG‘a_5||)I6>|XvJΆi&utކ6L})363p *\Cʤ܍x̤fq nZZ\vQ\iw ZSj݆g C).~-NDdVi B ]VԼƬdo8t nwld5QVk7p:pG(oL$`W248GލNoY,2W㊐^Ej0T]%G\,2'"djJ3\ Z?hg``Tʻ* $>(xZl3M|Q/vmh&K׊WnVX&QiF;Q,!JX>'PX)Vph)HRNO> (|k *F5s _cf_oPr/nMwb7* mq]tW7UP7\㦻zloƃMw`]tS}aVq>wK'IʯWWs_!g!7|{%g ^SY<%fRdL8c8m[MĚtbx6/xAF5dNcr֩sm''Y1("44`Rj'oF4j'7  D D{El}QTc.@*xaL*bM]لi67-j}%Wlz4Waף%~pׇ-شw8BQmlb9P ivtN5g"a $$Wup;U? V(wzzzÛ8s0ѿ?.O?"A ?r$ @[#)ʔiUէb[PM֡"Ӈ*~>E&\d"V|YI~"x ~-FfRIg 'Oa]6 c㜡6L D4+"D4q/SPBdJ_V:TCb?ϴW >Q_]wE`xu+W_f;p'(BtN_BTs}߭2#5 =GEPX2LIa>oƚikMr/[08ʌ9S|(ҡk&(K$k0Q=m¼ٌz#O_7'=t^o~~|_6f]#Čk$U&+Sd03OW3#>fFjG=g8 p ' Ju_ ߚO9;{uça䞶w v{1"R? ( N oOPP}%_4I ;Aa^z} Hc(AٜpӶw.{;s͹StIP6?gDuٷa`#>䢻Hu0og uPen˔9̧S0߆A|w9 dj qC¼7$ç b@$3M$?V,WssBdAcM zO=*#G2C z;o^zit\aާh;s3\S'V.f_7ehK-&hk Df;t? ^s{@YGMf:nP~959Ak>9)n`ķ)}nC%HiekޙF/Vw2O@Lu|q^FY^:L`KH㿗ZHwmB^k{_P (`} h7xj\@o F#l]#=ޔ)_H^v@On})oPoZKOC/yU-yxy PD ecS\R1s*K-Ͻ _T5uo>@|5:/RO Mq6//_|~N xT8N:|M>;xw|L\+)߁WRS yޔ+|ߧ| >;k^L%w}(߁3Q|Owxm'n31Ͱ*LtU Y5D^$j5,oT圇+C$ FwJd(g7*l@ Vczk C }<+6h`9LI2KUJ+)-i,ǔ,<&c3:kq2ν͊a`8{ueY[;j(nA!MwSaC"څ*З2&\R]`Q~<*Wԟ}->B!y24 Hqj3#nN46o56Q6ie!2>8fCfk'$XrM<߬-8#ƫ>uXj;.8&ي*Me'AQЖayyJ@qnmPRId{qr}quyv kR/wň0x^Lݗ [ (K Mj.s8C Ts`eL_??v] Z# i(=j-Wn(dhv:Č]Φ)"J@Q q^_[Xèµh*pKiY-ÇjJN8[sNZרf%^DE3{ʓ{Ⓒ{{{ڬ{&"o>|Uu@32,YI>HAZ# ɻ# ?&FZiU+)ɽm8Yԉ6\0ObltƖ"mFtlì6 R6[X1{bg4ۻ߆өy'&ݻzU]<ʊe5V|y^r`.W+:܋\=ʼnn këZ&-Y ĪF Tzh`Dx:b< M I(E ]܂MD4o^f@;J&Z_2:f~l̐nai--guZK*7ߢCGPa IWVÁ:O*ַc1Tk)ڑ@V#]ЍfC7ұ Hj6t#ݬЍfC7 -DZBU.}4w1*sT 'U2UH,GJV9Y1 rd  *Q+QsߦȉU{DquPU\)gQ"=ー"3ɇqOL#T#+䃏S!s}8o[Q^DںZhՎ"Zz ^c3_+ݏ*JMmm> ֊c+vVܼ,!F;2yI<*槷7sAml a ˭Ћ+EϵZUsЫR呂coop?7\ 9 *>.֝RL֬B=GTk3: OU]Ii^NG89T-x8XIJˡP2j RnBoBf.ax;iցQwq:gV{oN:oӫU1F~}g,, g^-s%kS4{\Hﮐ O.2R7k6j 5ms>j)J-QH8pd$GY"b@-4M15C^@o``f 1騇o1w%G(LwAtq .#TX(v&ҁj<(|x{evC :-DQD%^fCfh1|:I q pUMkX_Ԭ.B<>  h-$`YY1 TͺvpMlcP2^\ƄT?cߊx(o 3HKK4;(rwr5sBw^=kL;6 +mI5k9"9pF%jpf":'^J-Z "G(&wI~9e1˳/;90cnuӠИC}IePHx} :P6}ps0[,׊ށ)`XLh6u>$cG~qQ`"H:\O>\Y43ECú5{j_p1v3M{5ĪD Y1>B ,/y/@haG^=&<胘8豄K,&GL愙0N|uRe .k S J5a 9yi  ]+L)Z=w1g֞%EMȸ ȴs# tʆ (wb_< cqL:"]} }ޕF%"ӀșoIA}BCc7D@MY8m9n@YqkcW0yk𪆑kp"0P!D6*2တA8 3j ðw0 5t;N p|]^''E&M`]2lSFM|85P1 (24|{^'f^\p~r{-ZLyDFJR>Aq 9;А1 %BA?D sS6N:2W U)jXWWPZ!6 CrossFade yoshimi-2.3.5.1/doc/examples/Microtonal Keymap Demo.kbm000066400000000000000000000013401506652756400226200ustar00rootroot00000000000000! Template for a keyboard mapping ! ! Size of map. The pattern repeats every so many keys: 12 ! First MIDI note number to retune: 0 ! Last MIDI note number to retune: 127 ! Middle note where the first entry of the mapping is mapped to: 60 ! Reference note for which frequency is given: 69 ! Frequency to tune the above note to (floating point e.g. 440.0): 432.0 ! Scale degree to consider as formal octave (determines difference in pitch ! between adjacent mapping patterns): 12 ! Mapping. ! The numbers represent scale degrees mapped to keys. The first entry is for ! the given middle note, the next for subsequent higher keys. ! For an unmapped key, put in an "x". At the end, unmapped keys may be left out. 0 1 2 3 x 5 6 7 x 9 10 11 yoshimi-2.3.5.1/doc/examples/Microtonal Ratio Scale.xsz000066400000000000000000000015621506652756400226740ustar00rootroot00000000000000W]s@}ϯ[?3 Qq?m' k ,T{E`يsޏsĻ}h$NhkyO@zlݗ|z]8}[?4|1SЇŝUyQxPB,(, "?Me\I9y@As| fWN^?3~ 5І2|wI+ˆEYc09v۩dH,NsnGM,GSڿcj[r >̘7Ct9RiVV> TEro,$d ;I>aڹ W|0<FC"\Ytp}8?cʣ)T&+9:](ݕvqn.n/s`O~*@w\[\q`-8͋j!? DY486ULVg)^A+d*N{I9\uwA)K\D[)8rhO{4^.oG tֳV/jI6cUt Ң4+txjq V`}ONYiCr`EKJQ'~H0 fqӨX| Aٽsec^Ca0[F6A TGvX6NZ}YijJTPZtDi+|9y &|z$`;JsMl6#z|ZH^,y԰Xp$CXdr1/$<tWûp\kaTjm q>^feXtoA+9?(pTg} 1(GH!G| ^.`0_oP ZͮUX(i[8NEfm}Rm#P֪ q=i >Li5ԙ7e  />̣bª֦92( 8I,l:jP+;b (:P܌CV>hE>DEkڵo"z'ۋn/zho{E=v` o#cj hüWu5)}y K{1""9f$" >M} u2ҘFKcnR3҈^k!`4ZHcXaY$R1?{l02;p[m/cn>8v5>v].z -|s7 5j71otkWUc؝>Hn,<|̩-n^#W(R nF:>֗jvA&1qŵQgA%CI'sԑ@bhs1Ǽ$09H0{@4w@9ިpq@87 6 ' jœj u h @YRuco;QÞwҘˀ\j~`'ҰWc#GwZ9!/x;/9E40g`fjU?痋NT%wW@ i%d= u5'ߺpSF|e["WO*S֤Ltak4ޖ ;3L) &H&acWK]x&0sޗ`Y9ٓ'|+uT&"ytBO錄5ngxUQ!xSŮ=EɘW ~0h&fR2d4tSu maM$D cy9QWKX ?Ho^~{ynT2@Ph6 ]$ #RZ$_\L:FcYXAT1`)c.o}xY k(1N3PUmtÂF3i]ud 3_zQm$${*0#LÓ%t%DM3Ia:HCo2|㬌hɰumzGJaXJ%ÊXu*JOrK;} *FḹA% 4Iu-,@!/RW06_v5fff!{4s4efw,{4_̑Ok=|!Ӎ3xzlhWdG_`M*WVϟRTP9ݠPn:Aq~sé]k*|+ Rǁ+4r4ߎL%. ?FQ=\<ÌVjcܪej{j_ #^k fmKJTz6X\RB5/X9\Z ܓ5ɶ.H/ٵ▏íȖEEG^Z_y _#_kNB;f.4D:=P|(Ԕ]P D pMkLasSJ+R17dt6ve)Ol2|El2.LnΐMBRMJPɈ9 T$.V\6Me)58F @[ޘ:TCGԠ59U2\ OQN/;>xvVz/̀/8^8`\YT/_嶍ñ)(cCeHµ>&/&BX1ߌ)86Ma 3;BƱ)Tr8BfS*dEsD4cYSL yt]CKc20WIxmTypó5m 6 5vy}N:͹ly^'KZS$C숦dC"2@"]A"?3ߛ%.R N /+jV{)U~?!vdw.$ޔ IbB2YRR!B*YEL3]K vLjVf9&].&ҀYxS.fɡ^ REXH/X, ֤s{zڣ2HK6UkB\.$2k˅`< b6&R(Ϧ*N oC(*QKUx#+NK[uXkIz՜46QvPYH̫o3g)_^x$t{\OƳhp ^pFSg_&sٚOֲ1sVg@ōV5Kçr(z&1Y{HԌsBFVP9u1g-b;Xr"tyl>5"Q!,B_֪M)fpGT' -/E3Wy}|X-\DHܨ ZJN5?b4Σn xyάXDN~'(|&+( sožLKw u0j4M> G70#S>(i$+L<)K$Sd%&Ջcx󃳀MfÛ:|Ycv 6Vzfh4KDE(& 2:X 8B7Wdz R-\# 9}Ap4]ᩱ9 uY4*=X9 -WE>ׁI/8^N9# |3/MbH&iyυcEzel g#?Ci@l{/Ŀf"D3:p]}*]sM4?^o@߂ ǿ61{NpÖ<ۄ|9kyVҍIIhM0GYZ%"c}/gf-gsvD=.'}ο$}k}+%8$3w.[;α9':@SaG75[4f*lFñ&\]\]9T9.X:0W49ݕu_@܁BO:m.ԌFY1.^ZRHy9^$wLt[֥teR~rK|喦~<\$XR`0b3DH$슦\eiR88D($DQwE4@i@HS["Ffu`4nK bpqFc+c>rc#e[A wG$㘃8ےDPF6X^w8f<:׌ٿ7P+@aCcs3Qm9λN[Ʃ#Unq9qXs#⡟[f5J+U&MJ" Å@37, ez 4kp%?%OE 7kD;0?@D-'zMѪQn]\1薍47w92E:hkWǁ-7q [;hT#o.@@ڔz(tP$/.ƛ8ߋ˱#{JGmrDwȽU^,}limBL)dAz}\o--Mn o]t ;~(][j3lwnڽf ӜȹlXcC~Y g(6j,7'%<É*jg}-,c T^i©&;eV2N}fCt8)fȺ3+u/YyqwR"lFe$lC67KXߕ ,\D(aSP^UL]޲2!-.=lu%Ք1lc%u%u:U뺿@q5-EG}d=J_5v=dk: Eĕtxy9<+B#_z+#$GI7K/qY&yYMz|)] NREnfD34[;HgVL7^p:d 3=34C g}M?J2Uʃ19EfҨ؍4I,Dw-pā$@sVXVUy53;Lu J0/L^7(T$6z(LkfU5+TU`MdV"4yŠy*=fR(pY;, !{^碝=V+>QUpYxhʓv|Cղ-l*6IX!O?ys)=( 5Jk@-zSW-YTXmyZtƛb~}䭥ҖFZC^\r>NNbt jKf_"Ѕ2 )idhe+o*qJ\S+X*q%J%P+&TJR| I!@cU+Tп! >w1@NC&-edr0tª^dUOǛ>UO?>r[h}mJ;YX+J^MdÇs &Ve0 G*wz^{3 Z?xT\^`džz~R5Q׼ ;qw8kK*ZX?ͅk&| &:\:+p^8^X@<@d:ө385:VoO7D-ێw'oRy OmgLţ?ag[<;%"[-=sL+p0;750gjT?;XLfi>wye,`̀ +FTKŏΡj8@LBs4mC&-mN9ge#Ϻ pl[sszi;#EMm2; /kE"!˜Y3af\qOH& M/iv略y|X,\J$D*`ϕ82jhNv?qCm }Ίi铦eϟͅo LܙYCcDt.\Jw%K/8Qb묖l<{sL 2yIFf7JhՋI"L9xlPlvuqV*_,֡T;X 6+ k9;WW['2t`VFۻUi 2hŪ#Wb/HɃ x!n`R+.NHeXUry`N̕sGIw: w_7.V` rGs點 DeuZ.bBsBs_Mܱ0B@GS#j2i5xH\GcK,U#w + |(vS1u,5L](1*a>O}SRl-s7\SVU:6/>ܒ!WLi^5A~kjE}/巼VTZkb'=('צ]t;HtHwm{T490z0 Nu :h24i;5֦QMdLw]Q׽؈)B%h~&n+tfJM5 cv~~vQ. $aQf&%&xFTLj@I޹Cbk[¥B<,^BZ@IZgSyɺw)$Rb&:;V #p/)#9qi)yIQ]g˂Ki=ڑɣC3 dt`?5 .3RlIYْ>G,ƩD^}boCFf<*(%p*HS8(Ts39i;|i1E7ߋqT*h2+ Z&Ic/ vX LA3˚!QGZ@@̎8M3{b IvH:n5Yy;rĊ!Z$瀶=V;p <8nb\ 7߱(ri'N27R5[R/pHlfnv9͙0O,= GѪERmqcYc|4#CF2Ao7 h&``[`Z\yh`0>.wl;?.{$@R~o %. J^F|yeېJޣZߗ^.-|kM_\pCWȵ2[-V3%ZOogV5p \BĞל[3^EorlϯR>f3"KՓ͓3]!I4|#jO2qp#֍ *V*cLUJ׸ZUJV#a&bWc7L?nnKB@gnCȽzz|V:?#EG"dBXZ? f K3 m9"a>|)]*"*ܝPQK(IXwgzFC(%j6 Q^\-F+G/jFJa:EfP+%GZ BCǴuL+Ã{dO:U{VյiMRB1; MM8CPdžOQ*]lh,&F%GmhBq~Z93R^qV<[TKs.ܷeG'H藻G{~#S[/~+u/^sdv<4;gᯆT~$z>CKАIx;m~vI#{xL /-&`AҠ qW_ *[{qq/?V;Pb~}߆QGx]ᒑJip^FLV\)&Ẅ$8teP[SO^+ZJ|VϫU3#T2Wl剕)Odxb%p+GX JɱQZ5׈Z !1ZjL-t$4|hoN,WpڒWd8M3&m2JR!$bmKGo8K-_*kA&֯/+Ip)#6 pvE7oet\f.K,Ҋآ444߹4߹4Ǿ8-M= ` \mY&3]ݖi23QQ5^ IOPI@)Znzh9*16,mXvj9)j$dd}$#pLdde$#"D$Hܜ!M$Kޖ"BdBՈV#S:jDULF(6ujDQP[ 奔FF3<{>u[Γg!EV(z*o-4k).P|{M;k$^7P}(:d.~!~I-bD-:~cw![Vu![/u,{j y:=Z_}b[R yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Arpeggio 3.xmz000066400000000000000000000063271506652756400246200ustar00rootroot00000000000000\ms8_+;M;ԙz.s/Ţmeɕ_E$HA/{|k/ 7Alj_^xV{aG0dz1_ucvEA/t7Cwlp&r|>ucv=|&ڸ|I9sHO&a[3?LxaJk% 0^2ñe)!}j 0ćqrG U-ojsiVq `ɝ&9)_oCh]Ml:JqXwxHޏܠ8+P Ӟ3Qʓ|ҋ2qe0?Hn˼[X8х f㱁J4ݛ@Z6n܀3PJZUȺ,Z9Y̘rq:_KO={w*sš5G&!D.Da!\~FXߝ Wlu'Orσhf&rKhNx-X$UilyoHCg_a{CLx$j-*w9}%\d sLITekQbƒd9j h TsfR~y4K#ozj!`|V2di(u1 åˏe#;W |7n}N2ȰRA``~ͯf9.&c z7n™{ oQYIb  |60nnb^/רdHwkJwWHڪJe , m^Kܡwnddlq>"i;7Db8ֻpq>*c' +` +&ձ.#~'So6,w5h+A`Q%/~U<ʨe@{4x#ťU!tQ̙u?7^'ٍz쒔^)V!l8ƮY&QK?6p1W#?flj`m ` ʠ1CU\ 89 ڲ* 5[{8"l/߷26/, N= v]Nm_|\\jPUD1ȋ@ $Ry *9R I;4 \/Ov$ٝOyJmaK{Uԕx'%'5rhX`Ӈʴ za}Vhk JX8Į˥81U[4rorI#/gL'@8Q&k :)eH~Ɗ{ oͬ}'78k1҈A ^}|5)'+??pԉ|R/~9 N|CZ3[e#:ͮh$ae]( V(L!a%=7޽4pHP-E1N3wȍG <8{yjE0Bm,b*HĞ?!IqLWV`$#,dXqNYĖfl~]@rUo =VVg(T-1d)s3JȈ!]}Qp@ohDDܡ0SsԺFFm8Ilj=2"I :9969Q '̔G݄Ϝqh3,*ݚ"~En1E,YB) MF.r O?A0ۭ`#>'F>=gy7lùs8?t=Qή㋋2ˀ*ԓ(kPp𶍹ڊ'AliMC-KhPCfK!oSCd&Z!"ygE-ZɷHA5au=mjZ3ZSUHmj#肠nnbfu Wzmu`$kuoȟH+0м}z@OD/:Hf# * V^!Řo=a(#z [M]+cS{#(u@FW>EϦ>nqhRuaܰ= 6v[Y7E9Uo*L`m7uCure_W Xn}H}BJi} M@PYPjEl ddiHۇEco8.GMNO ENB{HwY4I⼒n"fKE /O W\[(k',.ۢhj6Hic0qLp`LC ,/S"!PfdgF#&mQ(>/[r(^ϥU5Umj(T EMPDT EMlS5٦jM0fuIy5i<_GB`e1~Xl ʨ{\s>q3ghq3gz (q`a?s`<-U ,Dx}=MIcA\-~񥮶i"EOkkU#RqMo\*<& fj-b50 Doh=-j?h!'ۖ_j3;]bq>{(u,QGQk҉:]GQȢ*Rהclj;7G4aSqOސ6 @t;败jz;"9U mi)O[?ڧQ^Lm8 Yj6dpj$Q ;SV!\ϔֶ޸1 :v:~ :;M=9hOTtqG{w'|m:;~,|mTqGyMԺ5"M;"%*v/`|y/]yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Arpeggio 4.xmz000066400000000000000000000062051506652756400246140ustar00rootroot00000000000000\[s~ϯ|Jڸ:6xomeJ a_zh.pyfKs6ç_l֓^|n[[n /x~|hç\O__v>:vbûl0AO>L.Yc;^ڭ2<;h; 7`>῭E޸%HdLd;xV;*oِ|8ñ6PY:JKl݈xAD$%lK L]ܥ4G_7 F  "( gk@=8BoI`Q f 4EO漗pԪ/$^{+!.1ܥ=1ލd*.1j᪘,'pJ2i[ Rx{ <~\ v oI6#P*4:UӻxtEl x( PȲhב/dB'"1 u$7QCG3 QV<8衍6NnCԓ:L֣Ueg^XDuK)sxVZDGW މ;S=>\ʮ 9j׋zVciUzo }vϏ7 _^C, dzd:U)]ʼU d2uu1|K s-_vʚuvej2S2#Mg4P::e`x‡:A҇}蓒||*˩EeZT^B@;uf._SԷr[/[pQWm(gJ-:sy—⏎PsNսE7S_A/FΥ-fV[ qJUCvqߣ=J։j_cנ=&ں5m]NJqE9p+!ZcT:x2s! uᡴoVK!Lg&0uDL jhhMWT{6U&|tѐ2>|klƮgrݦR6*|pMk*UfK5jT!$hԦR7jTMo*~S 5PN>vYΖrלkΎHӠ9}kHXyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Arpeggio 5.xmz000066400000000000000000000055761506652756400246270ustar00rootroot00000000000000\[S~_ِTͰP:I:c+;O+Kˊ%SS[͘n]Z_j}|MyIGnnnӗyu=Z<ޏ:} 7ϗ79??}8E 4_Avrl>Ou:S7s}';yЅǓnO'I2Nl:} 5SAGNWv;=ο #r? Fl^4[8|2pM?-_ݤ$ 4K nk NVԕ81u$eA5| dx^wY|y=9 `bGjW'1[y!$IB]?u_ͦdx C| A6Z|?Mh]ѷ : E00hځ/!JhXCH1񢗰uU'Z F e !YjO)N@V~HG<Bˍ¦WB 5"JX`=J!o=bYp=s88WTGi!G gre#dLܵgU4L11WjRg $*eH!Z 8 ^& i*''T34F%K3фaq9AvXeWKdDwf9f1.Pȑ`QW&q*Vhz䙕6oaJ.CqXR6MeSV:'QOa;&A tB`Ar)p䆿gwϦ7ۑĥR8F>57lvk'X93c:Js$(]qe.+R7-J3J3ܴh]xPÅQ]OO,C;?#4Kѫ񪖶@ +E*ejYW*(:JItlVbƸVKJB pc ,Nf,^$X=u I*j1|p<'|R86bCȹr>ܑ>oQ0*^"^"U7^C ?C6R&eЁS:$uL^Fs1&W*kǺ'=|: Et:A 4}`cQPUVcl{Ď2(K4oG䏇x:eM DϨCQ2P9X7x7[0G=4H6V4Ԕ Cw) zCԡZ8I:#`=ck6 j-sF֮v<9DF?G{Ɓ@x3QfFDEb%Xd{P*1FP # x2C 3T9 6-ϕ͌=2[G|\\ Pa +̢j^IzZE;)VHE)b%d6u * kp7 3+ؒAٸxM.6"~B0' WC%.…`jϚn,TGSXHW< } P-%N ғTs&Y_*Z')ӤWMG9y{U8TVj *ԢZP]W\||iJj nTJl ٕr n>Dǡ@qKλ]Mnīұ] .l[F}zQF}vQF}qQCI;pqq0#A?ܸ '5Uvts3Z0UBQ(T.1Ď7 I u4QnQӏrh200ܫd1jieMi@t'I>2{pe־VZXG,?*kR.WvVIvZ(KPC/0xP$-FX*{=),ud^8GI}5ZGaX-[|ekב$C73P%Q^ctMAWINRvu'.DoD[sVjҝ[Շs PwnUέ8U[UbȻUK}p6wDlrʇFن1BXH\qFaJ=̐TڗOWJ3l瀓ѯGli/,L݌Y:eJA?*V J?Xۄ ;0\H~.rL~.drLn,dj&?Hc2yiOjim~9m`t6тLWc+Gm^PIЅ $䫅ݾ=ec791fTơ%!,貹YesБ͂+ln.Yfa"rk)]0l\ ~4nN#4tN#=#MI#(mW 6fy%R}( 'B o4c !Icp|l.Mb,vfԍ:-e{[?3Y47g_؍/bk5YƝcu[ǧ>D 0bm l-)Wh~{HI T|".f8T?w;f;8PYAbLyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Arpeggio 6.xmz000066400000000000000000000060411506652756400246140ustar00rootroot00000000000000\Ys8~ϯ=#S|T%rjm+);h9HOCAlfS8__ }av4 c#/^ciO>bzz31./܅Gp7_q v *m~GOs;S/w7ܸ۰ 'p1NMm7Ë160niw;= ɼ #r3 Gl^ڸd,9.F 9 rOIeyQ=fD9tS~é rDwBnq|lpBDqj'}uo#1߬xQD$=?=uQ_gt2@֠Ԩt?9|+~QIx;O[7, Eyw8-!3 Y|\ kC{aOk!:7K@$uءh€ݔRS^=GKuڲJ $O] ]1Je옇dthڥ zg r\Gr{e[B_䯔~!? f9&皜hyL#\Ŕb\Yg93/{jH1/`ڠ]*!GEHQ>&PULYhpe:?Ӣ/tnuCq YYAJM輾+CTci ]itut")L|t@!mi/Smʔ<4\`#t!H)ԾP@eqi>5|:,-R˿Ҡ*Mh\O5jK SVdICsWn q}F&Gj .K7ɡDJ>9HNY޷s&s8NXBTGTz+GTImFnWb2/sԴTՂ,JjJw(Bw6T[g-٠eKNWAGTk={}2a5_%JH;8@ا/ՌTie+]fizTwYX5P! bc;|B/ayIzv[lB-cï#T ~UmRZf`?ziOc?هm~pV݆B6C[aV:h7~ mvC[V:o79 }rC%˵{ڌ輠A:/h 6 /+rt%9x]RE*uЦJfT ovFS+CZRuiQ/z3> {:>)74|*iy3-_&>VOײa;3MWBn᭝SӯfB6bT=n ,ǚh.cyMQ^4н*wz x8NՕrO( ;-\?Ě7eD}!8տī$Յm/eHX]l)D!/TH^% uwhN;UJ^38z$N+WqszA +us# CDQq&,oBr{UQ8C$hB*S;*rSB3*!RR*Q$V ~%h'i]G_=k£{A3_dVG38P2BmSlK#ḐU6vq5 !F2Au WXyJkW|r$t|JךOIZ) _k>%kͧd|mͧok>E[۞q_ݶԫ:S f>\,KdzEɖ]% EY*jI>.Dtr|/֩n;H*`H&6 eb3͠W&6 Xdb3@̀D.Y 8dSQ:TZfF쾅Z#0n̷t6+[DI" (A&hF?(Ơ$=iFO4BSWɵWju6Ц! @(OCqټPNIX qZ [ٿ{d*qZrFBm x2AO_L-tբ Xxmt2 ʯN׀N巺l/;bZ/Bq-,?8$Ј-5g c|ٱ}ّ.. UH -|ȌZyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Arpeggio Dist 1.xmz000066400000000000000000000066101506652756400254750ustar00rootroot00000000000000][s~ϯ`yb.*kZ$ٗ) [I8?-h$pDo6Lϵ/_4o^50r}}Qx v͏޼|r6|3j m{m|~D{C?q7"VEl=׸6&9L Yk}fx=y=D Y |F d?Nףh:K{:Z[d.>I{~qc:"׋pv,z8˥醀N0SA9ͳ9]]{˶}{݅כu[u=I[`l`y8O$w|cNbc#pS2˳d>k`&h~hw]+Fmۣ0V32/n; Ϗ4\$&75YpNȈ*dznW>woYCl'x|v"ب'v>װYd:_Y^/;Ɩ 6ko%2Y0oq}( A+ȼXgpk-aAsZ#GypV/2ϙ5)8/%WOdaἲrؗiEt]Awv9ͧGy7KHЊF/OSP Ԃ$~ J){&]&2*'KԴI|Ay[M.2QXZfރ ۭfh$K'DPAdy< X 9Ӝr<<+㔫LhG 69]|ϦE$m㩱 봳ivTevoks$<_{NNx~vx44܌;˔=w=~ID(\䷍`= &kX^< 5- Q=oU;1F8qH ƔM?*~ @Gt2p批  Rp/':ηVgkx#X:tNBd!p` se\̒9u{183ϡp"q1h|9%Q]=@B0BHPړ|oA|smAu2Ugw݁@S^[hol蒄N{0kǘN[ |r]lM!O[Aw]\]9@*k}@\H,ͬbƄe;ݵuW@܂BO'tThYB./yޑȽsdR$jDZs':u])2k)?{irK Ad.,) >:ьGͮh֨x+ӂP88D(DQwEIҲJY`G8G4nKƚ75_FH}GH &m1JuQܖb0byl,foP;@aCQc9{B/9(٣U<~sUz|/ɎDqӘ2z07;Y89>%q\D+A$v?BU -]ڈU9$~}4裣TNd&n*CՂQqpu ?yXlh8nSd܋&оvXa{xt>q#bH^?n/D+Z4O a׍~[J#[S$j';~>FZFf4ҭנ_7\к lF 5ME! ZwW^G_EzOwnujf1`w_ei9s |x:,7ae KxUG}< >hI%`(bRgm&|J65)n\f%vAiWrB'm)H1msOѵ:R<2+{:w%k 3#?݅Ulo`B +Z!AeOxi2;v]"zǮ˄Xw캌cוxWSKpZוxZ*TẆ%vd}@lP"dWl¥ p+]k騱Չu u3qk;|aAE9r~reWQ_O7Uմ<4|ArVdZL 7;<-雖Ǣwet2,  *2 Bq|[)ӑ;S2(MDeJ)nui:M)MDsJ)nui:Kө[pWaV4*g]yي#Vh|>,mKދ;Kǔ$QU$CŴ-Ɇ%_KQ̃.+(YEd"3($Ldud"3̠Ld]d"3"AY zH#ܑUؕR^):ȶֈTTdF0Ո'鳜GEZȞs @bj NE$ϥIR qfCRRد|Vd]CTfCV Qi}gF)y(S*&QeHuо![547ͩMP% /sY"b9yۛs4::mֿOжgۋVl}x p}yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Arpeggio Dist 2.xmz000066400000000000000000000066171506652756400255050ustar00rootroot00000000000000][s~ϯŀ/Pdq-ul˔, [I8\z4q%bz=_3~ͺFߎ-׷޷?./ڿx?q'8_o+7'67MVkf'փgknCl~=ZNfS_hE6-ڸ7O6vhZo[(ܑe-f4]"-hc=x>%q^S4I.KnD[Φ+5(gjT d|IQf4_ֺt7f 'nK+z (M |Ks\("Z\&+w&[O0X/ot5E,ܯyc摦Ͳ9GtO[_֊+gHCaxo|lM@wVK#Fvu`{ >E*v xE' fӱv$-6]6Lt~-(8nmJ6i,#IB>Rw=c$Юr1 $ыx&V1lqoa:ۭfhv8O`3P..t'2b`"sfd<,۴Qki­oX8׿KC4-x]kKl^봲nT0M{6, 6. IΏO?f7c `\F{Hx26N,#̰8' "ud]+#ck@~i74FiD{/_ϐ)?#8"kvQB]c :څvI@$pio8m/95wÒE ez^D\}6KC$قc-d, v'l9s}u|E.!Dv`E1bhҚIG{ sf{؁U:8އVK!E!JE!A)yo.3X9NS9h^!t`ءv$.'WJ!>KM`VN%G%;r{ s'.&u$/JD6J'i6ώzpNTz.O N&poe"W(2e*ýL>[n"rU_+%K9gN5ē(^e>&n9- " 8-6kDŽq-&>Pf)-B.)o ; UZ).X(h]] g ݍuW@܂BVO:m.TFcJ%oזT;@r\6DEҳ S&90{er}dz咦%M=y8H6/b1!:jvE3E.Y2^4`)\pJ\dY PZ?R)ZZT2q.iJ̋7u}!}G. Q#5X&pvD4,Iwtiqwͯg9=fdYnv<3MGV#5bK< QpL)|Lq,`BBmc1V".Y)ς5qBD8)E#SH.Q9QI9\AwtC8D! BhbbAgz8e#tq+`hi)AnѾb򫉶qbа_+:$E1/  /r㠡ٚ9{a9?+]~{I~!<x ]~{][4mﳆ~KR˅~[(6D~57ǛG UdGceǂȹ&e7g34!`~&5DM Ҿx>_ fHw5ǿ:kƚ~ˏ'qIs3J7+f~-=Sg77+y!{x |9#x}gw*fVZ8? JLK偒UJYu=bݳ*ÞU]MF2zUzUlzUW5r/O tܐHHp~= L‡|IƠfZHz(+D,񣋴Gy!0:0wV[MjgcV;KI[&++vp}eO`ꢝq_uO4A_M3(~+\t9]])hB2}w5޻zUr8, =ī% fU{@Ϫt6IB@oyq1 |U 2z ܯ wo dz) 7=R/areӊܒixyCi2ZQ^ivuQcZ| S#1~S2,e*)nue9M,Օ,oe9U 1ҫ:ۊ-ҚxzRNj3Tv Z v$F;"9>P^$1d3I̠[&1 ze3ÌE&1 Hd\nFd5(g!ܞM瞪bFaR贁_2uTCk`DKC0] xe{ K0 UGW nL 18AD sνnI_]z)\zI !5jxjJJ2kބ7kWR*!V[ Qjȗeibge& $ 7[u/8U&<96?UV,~ mƒ|d2YNׄkcllzim:CǕ%1Ox:՗lScw/#򝿟,u_#yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Arpeggio Flange 1.xmz000066400000000000000000000066301506652756400257700ustar00rootroot00000000000000][s~ϯ=؆$[kcf_d$lm@"zЌңD$zaz=|ӼyղEZ5`~pmor|1|;h]w$|ī{r #H|'od!g<ЏGNJ⬦YZZ?V1Y{86+/H Xxs ԋXTS?1w\7П{b&&Mp }{&s&DDE}ϴ_tol<_?0נlը}h]3F/2Wۥ0q5 iڍ L4BwTi~$!5qç4Cs^ e#Ӥ[Xh2sdqd钦͎CVz&\\[!tGv6?:{X+ -^;A'zШ맶5Vd]d -ùn{AlsV4\,bxzP4(pLVk,b:޽j14:!KKuNp4M> F370#rۄ)}(ؤRB$y^rخtwH*(L+$F/ ୖ燘Z77QfI=ZP qn3ðy3)hL?fVοȃÙBz8x{;O6II*MG[:!*CXa199VD=&}.>$zhC'D3֤N:Z;'ߕU$zw@Ɖ ;PWMaE9WK+Rqv(Ё:Zh=,Ё7`rY|X9N39NЌBCfH\ B 'bpȨITI0s a0J}hѪI9/ Fc 'llzoNTzcy;C{\= *ucB2";ellqS*"{g J瓟N5OI< .k2ËAu| Eyq8%$羰bebj ixZ lwd(Vy n!:кL Ӌ!uάݕs_`?܁B`NS0uF)F0cJj$oR;fF-QK&J76GBpUDxT zUcj7;Ӂ3nJMftÁ:۾ꅐ(KY'puD4,IwrqY'72򿷧Pݟd1csHM&MȹCY̩cN/DwWSl.E\9QOoTL "mOCF\Lo'ǏJMsLqjv=Co! 3؟ܷX?ܲ^@~9*{ /ZZJk+E/IC~jkcw{w6NZAMsv2NV=Mjf+tmhw[߽~ 5M]EsQlWikۮad;?bs<vR0.{w?X,7G{!} ]`+>:54u#}>׿gW ~ҍ֊(o~c 3?KY<\UGTK앵QlbkCi2J^^i| M^GGY Ƙ8(r4Li9)SZNsʔrRZN3Ki[ZNrUcSCeV]u&;+*XIkllJU/,7S؉*j3T,T0c)yeAH61 ,eM̢W61 ,Xd@M̂DDְIr(T~*ٕR^1r0a!QaF0aL#`:kFθP;UWf505 2\cpݯ|1~CXsX[ċ-y-ZmlSQ4J !vzxfs &%̊P~xjr;4* lQ@CNQ۷Tp* jxrjm?Ub 6ABmYפk 2y 66#Up}Xc0Zs#_1du4HG?}םnz:@yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Arpeggio Flange 2.xmz000066400000000000000000000071011506652756400257630ustar00rootroot00000000000000]r8}Whu-U%rkm+)ɼh9H!ĥA$|)44@ͻߟ6֣^?v|rex˷?y?r򯷎UvcDP7M/t؏n꿚\Ng7tvd"~k^oP-1lt3^g6Z~6Y(:iMr/^byЍ,Ϗhq@,~ArW+w){TF *>)NۀtmIxKVƪAi*5t;lފ+wVF? }+r{&"ʿ:M]8}t];E- 60׭11?iu-?HܸOZ+Ԣ a$6f,m-un e=S\߾[kpw쵵|rdsu ڱ-ҽ쭧 kE:lk_R>؀fGdN[}S}>Z<-<De%h;)tTI-bGw,Y`yey@ dXvP_BlI|1x3,O91#?";[I4J$!)'R3^r1b%%ދ-cWۺZoʷ2mb=@c0E kZ ky-bE.,t7W˳b>θ)|!4_>X0pd/_аğhAYrrvQ\]ʹ^&Y 1Nax|azV`rH8LU`L:g{d+,uhҤ#[` mtܵm ƺ -ΙӡZq<9(oI (FTi(IV:;0"vn˫k J!,lD{|0ȫI)1쥝Ad0GKZwN-^)^\)F^~k0PARrY0W+d =9!<wvr%ӝSjE>dۆf؟ޱ^2#B:w;_4 7.E/vIC~Őkb6ww7.NʉrfkԢ^9?+Q~K~!<혳x~ ]~-C6w߂EKAC~PwQB - !-_&+~ha1fgs"k5,ÏD]COD!/5|?+>_5K@s\~A>jOYӯr_m_d%ѝ<Ɨ[={s' '+OCtO#w'%]?#.1b{WohB&($K偒eJ֬Ftͪ˄XkV]{Yu%j2U] ժTNժj^&D:NgdS9 D+|A҇ftPrWp 1g/]D~ ] K&~@M{R/kZ93ܒf2wL*A x5$ׅe=4~pȘ%9Hr䔨Li9%*SZNʔSrRZNqK)--෴u (9u1X 5b1*e5Tf ̨JeF".r/E1֡\9*Z$ 2̑Ì+ $f0E&1%27#Ij3!\Md{SUY*ٞRb3R*tژݧtKD6fƌSfbWg(i2Qexn0 +0 L Q|fR,PU8Y=R)(uúgLg 17Y c'8p>R8do 1cә=55 KqQ; bыUF/ߞw oԉ* @U3u\^tL^=.RW3v@]{*U/htFV5XWZ#kjVGƺZFPZjV!r>*$}FjDSXWz;j յoFp|?r򯷎 qֆyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Choir Reeds.xmz000066400000000000000000000076261506652756400250320ustar00rootroot00000000000000][s~_=K lqR: dMl2ӶeҒlA Y͐nI[׭}O2eIyjs95z ;Z_:ʛۛ;Kh~<N4qI g{ͻeďdy.tV5-nz;ƽ(k4ww}?Njg-_7[?jq [Soq1, "?Ր1 =$.&Mp>z#w{!ѣ?e3s̾_`қxkX`Ycaр-N#c/j/0ΐ^#skVa%`H`!~T ]s1ZXՁiD4g>n%.3{4KȦb(p K@ eGB:T6R4&q쬃=b#Q5i/4$*ΦhgPu!+8z3 Lj`9:\tnEV|ŦCL\]\g:d/`3zbzi.i֩jO{*zdAL@fRm/W>)/o @ ,fE,m4U|2qLͫ%婆w ޒ0TD6 ׿PXtgz7!_u$K/ '5sLhCv|f:/%K)3*hN 0wxRӌeDGfˋHm`tq|mqޝ;%{8)zaQ@ Kb}Bj#[H:JE lL|*;@[poa4e)M)M#yIp1x2HdsTG#n8 1$j^|%ί>.cY* [߹;,օWBjE$ eB58"#qwxr ӒLP젍L,~w=ctj y ](c)EL;}ۧ%m5 rk_ .'cog\wor|:Ǫe“ŴfV$q~p 4s"RiIuCRLrgSRwD򓪽ٮۈ_5*w68v?h^# FTN6qר@n#Zw GJ>p-\}]_ǵU_Y\VC*[~nYfǛުYW=, *LB.⌯ٴٍJ횶Od׮i+kJ>Q'϶41kL{ޢB-$@6^Kȋ8ɡZF$\( :'rtuGskďhY=T*(S~Gf Š?nn$ Gϛ{]vvÍ7𼀛$Hi4 y FRU J x\)%kl*ġ{ϋ0TWB(9hrfn\8Vn}.4&ZDN n*_# ,5`% S ̀f_-Ld"fh*P L OKVJ[Tٟ+yu>IuFi\n('_Gk7:r76ō T?lB^ %aVr7b| 0Sr @fy >fp)63 : X8BdЯ") YJ"!a8(OL3?n!lĐr6~)YM卾sr t@ZV D{g+RؚR29#-RͶy)޶7ɂ,("OHWp`z]l"ʢd7"敠lb d+HIF\vY u8۹\M3{!29`3P&9>YgT\?kF5C] a|"Eϔx}ܩxFQ$^ ;˺ƉŤ6OV&F3? d&kTU\oP .b`s}[uܮ͹>9׊$-W)ϹkDe$_UKЕMA UzlqST =KkzxN^A'k^V&!`f U-zoS^=Ԗ^X>B$\KkU+־x e;z5P/)ms@c\ u@=43 <f;@oYOQH=P=qQZ3NQ+\cUDP(ݺݚq:*_]OIzOIՌTOWXN>fQU߶h{-Ԓǵq8 ?TOFFzN5nwJznC ޲F@v O/>}RXf$lByu-LwTxLRpFMG1Ҷ^G9:َGa,SK6J~k,U̓r8'o?襛*ȫRB'-5NOBE X'EU?.5N8=+a5Nos>'W-ef+Dl!3[y2Ud*?*~O,J'#*xN=FRfW|9}A:aWƵ&&~*LPx쳀(zT|lEJ>5/yT'=u(ZE_;P%_ <9Yɗk?%#]i:X-DK% 1S)ZԌ\䓆F$'Ee|{]/x[|S8%'oe>Y~3+1E*oku(G_Q9^bW.g6OX@9^Ix%*m X2~cb]ƽI" fG&6d f0F&6-2L`˝{ ]3쐑oMA1Y!ckޱY/pUڌ@jT7~͖ÙmxiGQPkn6ڣPJQ0Dz& ibVqأk@I;w?e8 %1].Y.[yj]t]wsubӇ֖yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Choir Strings SynthBrass.xmz000066400000000000000000000132111506652756400274650ustar00rootroot00000000000000]Ys6~ϯ}">U#׺֖KEK͍D*扣n'|JFF ~Z6Ώ Nj0z|iv?QhXLw[*{oK )yo~o2OЏzny_/'w7d Z>_n/Q;%к}8yûh6=*\yѕs6#L0 V[ol0&*l"/xxǦ!`P#S{9r[tKu3¢)K/-?o>9m}6 |Uxsuq7MkYZf?M*ۚ?w7 Vg@%=Eql{K/NHhP #8'[{KT}tW+ڛpT#d(ArIK[4QOb"?C Zplfp0=̼FE}bXZԎqt쓈,d3Ob82 `;6兔ᵎ/*^Xe' }K pJ$_tvf4\|j zۭ ,sF.ZlS{E/|Ļ&ZlYKQ7ewxJEPǕU#ڮk>ěymb[31Q J%\]"X}\ QwO7} -~Xh*%A c*lG \~vB.%m@Un˧yoHqD+.:yD ݕ['feLMuoaQ[*A,0TqXK3ցsYXs 9 Bw:\q*Rw}!D|Mޡv$.nc a&zk(SQ~<NѶ|^;'hְd@',K6JPGYA)Ib_{0iїRT2^՗8w\0b=im'g$t EIYr#n4#pWY2ͯQ,;l76hNvo硸/:yXͲnX>U;fp!Gp5RY׍0جFlu#6uͺ>oru=xGy=ox7<H g`"Baty9+QSF-ah.j)ɬX򼫞ͳP2w4K)__nr}y!7|y w!&p|V/f_`"KU&Q\ RnmSvu{K Ln?نm /_ ufuApa( m`H/(KeMon鼈ߨ:$Yf\kEk5xv~3|%OE g>b6w4v4>,r"ih'*³|#<-zp.S u;s(M+^ H#S >v6ܓ% !.܏_0f`%5QjLB_l8#&ŚW98.m&[HgW,-+U,bi \Ebi \9bi \&r8 爀K |'&./dCel%&UG&A|30B3)8b 36O(8yB!%Ʊ?Ȋ/KL!%qOx>mBG ڏ|J)eRWDoR*=ff$psꔺ*r;zv)SΡ2}3Dډ9xQ=ϐep@ZVQ=mc` OUۉ9{F)) ]majËo. ؉i+)5[sa79+ ؿ@؀cCub YVb.bu^YquMQHg_漓Vv[+aI(>{ON^$}?&of9P~\tpgvL#xU/76[g:?.|X@ɯ7XpDŽI`r%u%Ԡ&yTʛPclcuw(BSXcqN)B jRrkNyj(o ݡ< %r-u<l}HKnPq(c{|ݔXvSDG6ˍMX9. SSOMXjP>ydG gAMk5)Maxj k,R)?sP7:R[KyؙSX)x}RkN5~8iRVR;KX[U3YWK9Xc \*HZs9å ōMk,R)D2cq{=u V_nTT']ʛĹ.]җ7ueqnIG}.F`ל"P|SVP)ei 3vI]qo}"cNjre)3"2fɍMv0\ť\; 1*X-ݔX-GMO0jnlBUF㋴\W&}4 ~+ (Ai/N>ⱏQ &jC ( ~}KS 2`Y̰Ii4Q+%Նj\N-0+MA/x *7mb0Ż?va$'=VXO^BmތBV}*/&䛮xU]!jàB$0]TW S6%KR%t³3:~71Zq-,ϮOBRZWF #/r0Zґ& WZL]wa00YѬT|*-/+ 5_]mYNLo(үxv7)6uF/OAhGn8>z:va0=x652綻0׆)}tTP7dln7T:qځ:q# P'nč8 kWU^;:5 ^(ͼ ΦP|S~ȰEr*-HtoY 2yQ,,x'e(.$ӕH)teiDҵ 5;ϖPAVQ}l]M㎍tl$+fFѱq]Fݒc+Xt k 4a肠6]MƒiLb/~+j$+#v JDH"$nUzѼDH3\>"'$,vE -_ zp깿 [}B J/NU]kOUOuOziۮ_Z{D=>!ewXYĶX)-< '/z٫-':=tx=d82nݥkOt'C5O_r#gZ'\/nS,Y0:A˂sw@۲rLܣ."K㩺`ҸxWYnO|W ;:1cugqx2^_M'xx$Kf+',ni>ګYÚA7/5[5ϏXfA\Idm7eGķ8'*<#W\ϱNt1SKVySOU"Cu8d:PM;ly]~8iěཱིFym=-gDe-ftoCGV6ZK^r盡o'd]FuuOף(aޛj k={4Z/6KSU;/Wb-Mzv2v鶣Sm]G巀D_+6Rnu-l! R@0E b KTPϭٗwtC80szx}su9t{:A{Z6[o`9}ov˜XeE :V`o;X[k C>V%ס<]MnFX)Rhm|SY/qpFKz]#`vNcrNJ NFa|ҌGZ sHgboh+βϸKvT:@]ǫΌOo/V;ošǧ]8~a@<˄|u[2Ng{Yі9bZEKge+?su{2[j7,@2q1i4>]9@B Dv d$~ނ.u~;}ӽtzg `Nu4zpꐌV-0GsH9f)m$Fu'WW т_\ə ;r@M95֜;v6i {&hmE8Y%&CX{yȭ}R -'^::Z_UU&뮥$_9&Wj ~3)}>O.F=vu5ϖd?pB߳2R|,?\axhs.lOZp: w vXQ}Lg.."em3Wwm8}XwKDZsYQlQڮlnttC46T@V量}omޞoz_ ALR6h6`B"j?H2f=$]@8ñ_ ऽ)\(feQwRe67&:ۿ|2HC#iq쥽 mdA3ZɖCf $n6N'˳8Ø{w 5I$9t$#Wt8>hj>}I6$&/a4WzHM_*Re=[c뗙_S de/~M71eؔʲA M7o]R8FC^! <#51+"i{ތk_cxFc@Q8u ` B;渚!w{s*P[ݫ/fo-DR&`šuʬ+SRqhAšuCrRJ / =8ЀV x\qpcpC6#ܒ=IO 0bt6qЏ(iH%ޕAa;Y;|oxc9`~MJ۸qV-3vOZ)}R1sC>r>W㓁eJq u[S0-l + Uri͝}èL&p@s"6`khGk#mO#3w'_ EF@fBl巛F!Zre%Q#< 2kӧzr4#;9 Td>wY Λ:3LF Pw/CFL dZ!s̺NÓsf85uycL dUCc$XCAQԇP <% h̏A?yY c0դkb Sb0ޱ<čn-Y?0O1ˀyT_!gl\lzXOfCK!, ϲF≩nK)Ӱa>tOQyfא+Qqu.5{HgfEM{‘*R.  %XzkDM%=E:Zn`IbWcҎ&.|b@i/1fiDpV >ܨ|K'zTnFhֲdyY^$y;HCR"YOwU.=ikMB4#`C^S-/zKy^y^)d=S[dbZ(_$K;ه<s-w %UԸ,Nn|` hw)-ugT{j["sGc-oMR8pUt]bWe+-̦:|lpC|rVUzv L@8d*Gy`(zvڥ <+JgB}&gzG.t<dIsWUI교[V/Uݲ$S$j8I>??MK凘'4OzO2؛eInuDQ!y)cz^Us[65d[e!mJcvR$__@ 1**禥X CH$nR&jU퍶J't+羪rrUgfx[1oTNYTU6XTcY}aǤH5#5>|R.Ȅ^*$v.X; K{Ju|){; Qo{KEѳ%eB)UleTV[ɹh`BΕʣQ|11g)dVم(x eB.*?DܥP+r|^Bt$ -_Rz yr(䲳W&A~pRt=Y?A,~4!'x ḻ"cv?9'&'ȯv?Q~;*$F 1O*3YQf6'ILexiߙFR.QB ;T_aֹ3Lzie>=v+T IM![n uꦐ+U72RuS"U7*RuSh"r QYvB)WQPD(WQTedjq+FPR5}_Q¢؍Y%ܗY^FBUEAUr0፦ɘ P/ ukϱ3HW+;**TmU_QEe*1T |eQHOac>/1̎t,l|:.:8qzir9^~iGw%#yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Dist Guitar Strings 2.xmz000066400000000000000000000107361506652756400266120ustar00rootroot00000000000000][wH~ϯ`$sXp9yёAؚA‰o ]RZ$fTWWWWU_Vړ \{x3zO>NvN~?FOw^o>l;C~?ս]}qކhO Gt0k{c+]*xGk8sh^nP.7[wq?'quIM+rB Oj5rC U`zAٮ/,  ™qmQM@&iA;9œ>-=nj{YĮdIu̪&_°3.j/ c9,?fYgOlot4@kd")8hz\dvS^֦ ȼhY ׌F_A4ƠH Ld=.K%cQT5oj*Jw4R=@pضl)[%+L{WWp *`{8P}w{w3~ݽ%AX)Z57{`!|WHq6sEeՅy\Yn7/D>ڛ3kc{s9A`=lYIw7>M8B`k񞬵z*&*lvC<̜9XKhN0"~P 5T6]b,P'Zܳ@Uwb L7; ?7&a 퇡b9j·(x Z/pmhqlᄣY!2c|/ΖYM@kp6^~;H_EhۛYv 6hA|vKz{pA][Xyh#G,a^9ڃfhN Bnh Q} n༞;d3zk{']=C(4Z [ak} /o\Tn_>|*y͔tԳXWzj*zMtCFT^IN3ymr$0:YvR'^'<Zm4ۙ5V`y$?͔Khe2Ua]5vx\ 51,%ޑ NJJJ?Ȍк<M.?λ+q'k\F(Em6˂_iڑˣ&q0+)*^е!XXދ%UKz<hf_ >DF X , J. \E u2XC,)P?R ri^1ss ,Ɲgɬ̅@pk#FG, M\5(:ؒ18ZC6obqܙ Ko|;.0dnj$,0b"ȿTOfKUv^qo q1z7 EUA fԋWvۉ1r/9lň[pD ', 7-dq!$rpB,ڹSS*tY;DQ<nⴄ{=;z;~SKDn<Xhj#UTm)76@cN^KG~ϐe_) Tr\rfv[(M~r/_Bc{yY [ϭ#oG~Ezɔ}V$A h\)uI(?_Ȃ%\L5xя$ϝH.ڼ2_.CRh8N0پY9+k#e ,$ug$B'b`at7#8w4wH ??CΣ\Ȏ̍WA\X%J412cHL z4jk ̐ Y7ɬ*nb1I[~AR'!DcV  ^JURsfvnNh8ѾQ~^_@1٪B2nɸ&??{'gD>Jqk"ljoٽd7}btY\m&%q>E=eT0xɩ*H/9aϒNe0n?~'i܌L.kx%,n~l,ܣWV$Ij(^Z(SzUkE֊jU U=^pGiq=6 G\#.֤qEeۿ_NvN~UbR8k:#xp+bxQ.'ITdKōh/NҥSBХ.'.Ձ]D3Up]'ڋgbOtj"֩YM> &}]$/,"yMDN^Q/1#}.Gxts#]_q= p)/#ϩ<)]߄;><"b%w>x! {JT`D&Z0|DK '؂21lIRM]XpG[teeLb)dl4 aD jAXhZAO @p5?0L;<59Â.v ɱTxL{J _8W)8C|@;A4:il9dA3u.R0YAY0g)m~Tþe/?QQ|_=U9D{ #L+ O&S`Ll "=lɣ?LW)ov 1(۷ H5Ѐ2qPFf)@g஼JqnOܕv%(~ҤAe7M vA,x懳 dVCnsiGc{=-Z)CڐۭnIA*bMo6~+fC~g Aߛ1Ư1~k݃́ypW0˙ _.uF~ܝ&.}5׼xk_c[E})3t#_sD iBw^Ē+\>!_䲆K?h.ZF3'7p,o݈9{tI\1~_3+hLl䍱Utf m`TĹA  ?գ}ɵ 0XJ2T:,XI^9|VZK>ݴdWj-֫ZK6Pziw?ТmwG><>>jPzqWJ}!TXz*9^ ٞtRg.UF]z혤Sa饰߷me14'%E9B 0E7P!yd-*t 2ݠBfո 4T̢MxTR(fQɛb6..hWDUF[6ZUMasdN*Ws[*-iWHUU*WcYUXQʶIjUߟlz;ySZ [U)%cjdbCL:C2G&z+j4Z/2W PUli2ZIC0T,ê.Dc,lygR:g:eϑP \QZQ`6xۧwqq09:;]GIr]$՞+M'5JIt&g-J[P!1̼Ɋ)bU6 f^MGTǙRbXh%օM,˱hQN%|H*2BR)dKEPG*2\HEE*2*R)4r%,\H1Q!e{%{kP&*JFV^2jĨݛՁQ#F:[FaQ4;r*n:)UcQKXL2A<O!.[\v+)  ?rfT+UGF[("R# |RQ2 #X*#IEzױH,AeJ%[4l K^u>Rh^>A(cdzכ'k5yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Drop.xmz000066400000000000000000000060411506652756400236350ustar00rootroot00000000000000]YsH~_ރwD'Xkz_*d0Zv{fŀcCo"?'>$3YdOض:S;^]Qx.dneEQ蓈}z_Ϧdx<ژtdKI`: t$4N,Jh( ل |~oZސJMlFB9o={%K x呥Sd qIag=K("u",#=:9j)bYt\kyeźs ьY}h>Osb?8od\ JP1z&`ԏלeLE1,Hټ{'18G_$PɌ.kWTh|1{M7g8y:EN|~wTJJC z$WVN5f2aЭMDe(&边[0x֛{p 0dXd9A!%%ƛ纤G=b>?MPpK@ x|uU>iR5DRO#~:_v|7R ي)Qذ *l.s7`н `%nRBlyًZJY^loBlrj&,Wu/]0Q>:p*m R4(.㦐!X최?7qRa:b(}KKH)% 7 j}J } , 8* !Nphۘ.Ea2:ھ3HcۼϏ 9[dH`iHI9`35qx7^<)#f<2CPh驸ļ4JHJCo--zx)hKg4C9Wrr WJR /--E!pL!`ʐZ, d~Y+?D +yw)d෩un]t=ofHH7}fhCCI}V73zn"Un/g:Y")ơe^ *b#ڧqLĺZ#QXP*݂juF;Boe%) @F?&OE^ Π2" V*|}lv`E͵Z`HZJlhԄ0bMcN &#V%tbK, #FvJVZE Pl[o:@VB_t |F"%ơIY7ּiL&|\{Tݶ;ҥXksOtK]" hm{|D m{~*֬MmoP۶}m{_ݶ}ՋOGޗ_mNާt} m{_mO0m{hfm{߾0mkm{_{_mݗ4%耽D{h%*@F޷PҶeTt:x@Ӈk܃O}SF mkv > ߞ*h hkFLgntF肇 (Ca ,Bs%+k/w|vA{ 3 h:D|$Q& އc~JΧ}M##_W;ˮJ˴lJq |ⵑ/sE_23'4l{5(#WY H .1lZŧ2`/ۿO3 /7Cf2_~ėE.|7bJS>|kS3|>cŔj0ME߮k̸j8MnS'˶ӲdSd(jՈWjޞB '>Y=HJJ,JJJ՝%_++R JT0nuFZ^!1EOchagK#!2mFŨDJfpQDhƾx,d%>?V bW_?xUԈ \E%i .L -}%*5geƏ+?rv A9A>xv-}| #?`2ZyNwcoyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Fantasy 1.xmz000066400000000000000000000064371506652756400244700ustar00rootroot00000000000000]Ks8Whu=dd$S[Q-y$ej-Bg(!)'_ $ R-ͻn/ w?u;4X<~\ܼͻ\OG<CםonuR~?Ž81_ FVr}8L9A](<t< }߽^'A&ۄPo3MHT_Άwh6ϊ%mdO)gYI_^JnјxA 9%BW+81U8iA% H$n6pOd ᡺aДx }=k>dQ@bޓ(ƻlNP=5X'5fA:Ze"p[, Ԃt0ItBfxT*E35/?I6"n%(:Ed V _2dpG?|p|J\n1\ra]"!b:99261B_Cvs# ]>̱Z3xDka'K/ǠAbos!V v"l偔m3 g ]飓 oxq OǻфM?Ca^36a?(l~ {\.1,0t?.Χ-}p-B~Qb 2bwayPrV&讶krlS+l^Q]#VF*O'XedPW4rpAA&_Q`MCٟ<8sӵ@r!n:_f|;R I(1hN,N wl!|j#t>D+/pu 0l]֥R#+nTQwQE 2(9t 9++W v1_Y$&ě0d<ֱ6Xpn*;sŘ) ScfUƝ\҅ji8)Yh4cd%uR_ ܉챆,VLky| KBRs cJBFDbKMҊҲIVǀp0j\Ģ9Pa'"BN % dIr!^~x9=z]\o ] +EY*S/|w'h7P]xQF/h[_0,:HXY `+^ )CB|vD~8/>)kS–MxSrȔ,ewa(R6pa{Ҵ3mM!q|&Q &fr'egJXaR LfwYhvzo0p P !c2 @NH0aMYRP>lCP>}#ːҶE'bgϗht]\3c=D>II&%trDRKpf蕒ben h"h/v$iСyqXPpZ [hyIAnFM>%WW0{un])e贒_"\N ,)I?n*C1h1A ؿ 1%")Laga 1NX`G)aP>3C2xCТWܗ~tRURcDq84`.RԉLMY%n(|MzEGW<azvóީt{إUUw>$iwm<'J-2D(8c \lhw~;B_E=>qh[ĦZ}OW>_+rECڀou/G%`;]-XU28Ud 83I vԢVoξVʆ!@ ͽNc >9CbKr>/>f!I|4w:_dOPȟolv<|äs.&{˛e7 CN:I8ݞ^)Xdш* ' %:]*Յ~~ nί{s嗦`~Iw^KqM`̓8b%9#d$Dq4T8tUA9MUx|89p-?޵MtBݖGfM_ {r`egyL$G(~߫?ߜ_Q4քr 7x],2L˩ymN:hJsFbINQ֡_:iH8uY0J&U!t0ꢹ P( & ~$I|R,EZdSj xV:<$%\<ڰӲtѻbQ2fN.+gY$4}U(i,MiE9ODSEKڭ9_G`sE6=\dsE6;'x- m)C7eٖvyU,+ pW5W,+ pU p\WQf+V*~m>be߼nSGeeXYuP?VW,+s``Y05h8c^6;C.^Jf/^6Zf0V!әa0B'|Ʃ#0V!SGa0B5Y$Ya0V!ӞGa0B'| #SȢ129IZ&9FF=aP_3cdֳzNS 0 C 2y>A=zOhC{ 9l 'jS'g,|vŽѦNm xNh&aF 4 )@SuƩS3N jUoVssu }ה9J >C>3dsf8!s=S3%;PIq^=zn أ@!=zrV!xq:n{lXqDVl=rH C&uxq:^l=^Gnššg Y?>}u>g5q{x^Au8 x ġ; xlò:c78K;ʬ[liV]pkL{0d@9 vIapմ<:u̝aȫI͕|4 퐅 "Z27QCA|cu6*F>ڍsK` &4m9l6Qwa9 )uB魰 (7(fP` {(QhA m(z^'@Ns]7,[ 7nE`<\(56w{(1 2^QFqI33 H#-GXxib 7nxi5NGa>6_> 24a7/^QA9afָGv'Ql (ƫ}tw (@3>?fّ\(<|TW7B `&k*!/' P6^#/W7jvAE؜8GymYЇ~9Ź# ܘ@mΡ> #c,P ]#( 6vNk0ㅑF㚍l(j.3Q%geb x-n_6wPg%`}6Ln5/=TMKrH$#n=tIl,U)P<bpf"eJ-*o@&J7%!jej |UY1_V#F_>}e4Y,LĽ:r0gF-OQ?Eɣ+dW, EWˇ G5rf"AZUU@Dࣲ&QlXM*dDƒbiYR{ va4":IRGqMKX%4s ݗ`$98Ȼfp qYf^HsWKO z쟝D!(r@GSNnn2,J:M, *zͯaQ4 atH\$'ӅeR&`5Wǻ??n.>Qo{}nL2FF-y|4iABY%}ʕ#;UER1ZԐna CFk4C|_ ckfc3Cyt Fd*VBavV~5Q֩dpZeRѤy΁X-KAӀĄ亵hGzT萭X|;`HfUCFn?7*q9@ΗfWfWd]%ԯcK8Gy+=/]kP *mDh[CK|*O˗&Wk\ein^|ZxXviCo|Zw*op=VQ]{+8aMWW{?TQ%k(7OH3xnKT\n8?P+U`H(Rs/7Օ,,&ק(bOG7,i',͈Hx|3޲K!MK4\;B/A͈V d{cLUr-H|V񚏗~_|ɞ6GYZwnsYr"IiR^LCCc*Q z]$0"ʾ+stL:h?tclۧcotLtLtL3Xt5;ܾ| y}9*111KiUN=Kc#[a;( TtA0GIԊtA뽽2'.H[ im`.X0Cf${m`}hԥ*Ѹ05eYS⏒.hpk Z{|.km`{“/tA6]p|9X.tAc@tލ9&;\mܦ i6]M|צ 5$Qe`;0|w螝7K. NoZu{x,17No9-i)wVԪ | uts<8|=pQAX NŀLi,Mk.h2:oJ$G S:{fð/(A0܆I0{RW.e/o׹_n(ڴ6-ymZ=èM Cy,VŐH׫vYHTuz7P~6/Q^o5WUwuON|y+JK.uBLb}!"ҧ(pf;Zf0/CbࡴJ#abk4{ 4 x@+Y?G##D4-!lϋtFgj{5 Ri Bڋn򊺣7aITmhB*?Bm\G_ hi/DЂޏA"hoX9Ʃ!$2L'A h!XB uh/Hq ɗMB}Iֵ$F_R$K'hK"֒*ζ$Orڴ5I$y'H}4HZ5 Evqһ &3!'48#(CP2zm%o3,sen۴u [A#OeS4lZL fVmEp'/imZ`蠮.nV*ײ.1Z&Z)߭)}h u1^)^ˊStZײ,P5 Mpvn*W9]MJJSAzB$U2A0v0wKrF XN9Gob3ޤTWn]rƻ)x4TGTW/G3^sFs<2=ZZuzKuυ ϨWVu9e\UNK|NR/u̷JU91n.9RE e#ʙ63%m*g>zT|P|cA8k5n =x͇A 8GFYJTd1BlWĊڼT55 l!1,$]Ā*Bb@66Rrq!X߆@߸B ?qժV,~/Vtjr-GQ#(l-ΉpXgzZpkQHdZ[JT~S9`;:ILAJZJ ZUCځ 'yiA VĨ5Э.8]o 7f?5k767kn׬^YwT-{}N_zIG_ߌ<|7 %yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Glass Choir.xmz000066400000000000000000000126761506652756400250420ustar00rootroot00000000000000]]s8}_އL*-]Gumemej/,ZlȤF۔4)YNfo@Nߞ{_b?9Ka6?|xsw?޿ht78oO7O9U/_~ReX|/^_&q1^N˛C>˦{i~rx_^Jwtuoл[WW&ID?$^Vk :ɣI<-Y2&"/4g 8*mJyNb?/`?tG}&b-+CuݽAӆK6ϖfK&q2s"?Vt>Ky2L&_d}4^_^5OcM,g@ {_"i55z- y9#4 ½4˓KZ MRZ'yEkZ}tU~^:RsFSJ?Lx'i|R,GUˮ<*utDJ`xae3؛~?(%j1rn~)M쭽,&iDJ4R OyDZ+|> [|Ipt\E¯(MkMlX,r8Cgz1[%:^$ IJ"¦Z:RˠPK2H?,d6(m;d唴\VU־C Oԯ|9JN2nh*{6|gևdr iLs&ѮO8ѿ,9)K')~2%VVx 9%v^ZcŨK jkLr-K%QeJt<ƆZV4LI'2H* izY }pY>g$r~ŌJ\Lo*^I{TATӺ,ZjG"&&}.G,G:[Ye;<Ɔֆa7d|wpP6(tZq^FAyNwlG5K,*jK7o{wtb(7Y0.{4CDNp}\;lN0/hu>-y֔S?OYC IhCCy'(<41qhT;>P&m.z梧m.zh 8qS-l` LRw)˶M޵TV,'\ӯkXY+V}beXYrbeJχW,?:ux/+ p\X\WghaZbqc^6;#.^Je/^6Ze0V!әGa0B'|Ʃc0V!Sa0B5_0B+ic0V!>AcA)dsz$O$!IV :*r;Af=;Ȯ>O9"ӞSds 6W")29xRt;Uǜ=E>md᳣ v6uLSuF3`=Cf>7ga7agH95D{SCga:AUTw͊nΑ!v}98ҠssMv4.ϑ1v~Qpv1Lyϔ|C%']Sm48@p!Mq48jp1NjCq =`Ê#~ n]ȷCoHrTACu8De!Xq^:^:^<5#z>D!PrVsjPNj@PCnoGPwwXVB]!u&uugI[uy+5̪ .8`G" aڍsK` &Ԑ9l6Qj|7sRF1[a Ej QnQ\͠~Pd?#Ђx.kxF;QtAo\( cDG0c0K#{FaV'͠jHՐz4k4gHEq7ck4'0^j7/^ Qwos ð͌!qA N4QhW*Q`vgB~]dGrm ƮPR 6_P4CٻNay}ѭ6n Q4^w a,oteqH70bpsh옣( 5C`GE؍Xp ;0r8 #ZavUk./4 U˨S3" Fo;QC;Yi2/PȀT-hdUzu@k`5' BkuIҿwHrп8L1RBl U!L!Fûǫ^Oݫgm. Rd1?"*42D^R'A~{̊o]*+ V'N_>e[&"a .&ecDdPI0 ٍ}-xZd3*󒚉+rz7 W@>*W_LKE}^c P_& a2"iIզĮGiўz5csJh1xXdB^^dH Uf^3dU@nT-|,;Z/vPj&A‡`.zɻWdE_`MWWzRTQ%oI(7ψ[8 ǩꑷ+T\m8?P/U`H(Rw/7Օd6!'$FDlO9,kͬfĭZ&Q=^ /|<[7d:@h=zI ] xmFR'=15ɾ.HVqOcvluZ(Kuo.K?\r8)Pkrh2Us~?R|9+`DpIkaHrsh+B1Wd58ƶ&S~kf۔ֽ|<z5K|ߛEyoD;6Gy$/ˋ^RR 2M^omT\ RT fX6vcK5ͥ)U؝&A91Uf91\-y\?@.MWV]G*MK%U7Tͻͥy4YwVD;3@`_IҒS4R稛t@=кo/nඖ#|ϛk!]ݕcyYY^G؆fYJ0Zldp7ZLR&3/{S'cҽWK7[l*x'YY+`g'.GV]h9>:<]h=0~[7<~q\noW;bkRdщV*y̕ߔ׍Z=m]:Gu?#_bkXՉ ={]-蝝-}- Լҽ렟#s:v;ƺvUͪnfUo?.+ruXs}}ݳmʛ[ p?gQf-ᒍQJw 0JRРg"`u%grU4Aʉ'F~ܣ{ugvrm=_VZ=LDƵ_Bۉ[WqQ @s8}+qx AX0 XgUBÆJi3R0h\.9= 8(,BqֶPek-UP^a79e\SUr >-99ޒNoGLhA7b ubSdi3yLFg)Sn0y!LFp Aף#%W`Io*f= fU:&m}#K$鳴Sل;/lrU&W^%kohc.1pNdžX.i+нt9eL_Wue&@2+ 2uՅJ̟UprəifggSwg+g&+gfc+g+g++g&*+g-gJ"YM1cb#nEgKQ"YcE55Fh{XuҘʲJP#!1\!1EH "$4nc#u-'Lm+L`{B\H-oJݴjU#TAFƻþo(jdŪ֢x뜨 &ӫ(֢p,֢ȴe6mkUq%.7Qq]/㕯]i_G(%pFA|SOu D"nMmv6ǡenݾ^u;ۗN^u{MfQ:(ub'ſvGy,mKyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/HighPass Saw Strings.xmz000066400000000000000000000104141506652756400265630ustar00rootroot00000000000000]Ks8Wh}=ddaKUI4\Z[HJj2-R6g$R!)'_M  Khomn=8A#㣖-}}\\ͻOoƭmwȂ?n*=b^^E+\Z2\kX9ήG-8nFݛб!k_ՆmQ|lތfb<Ց67sڮ ?E N2NҚĂF&4N`^EbcBZ9K "T|S[܃."K*o㡺aЄxٙɩ?Σ޻+60'cygqX}4^_ͦdtXvYщƋw/rIZ ļetZ9a ~i9\-mMeG$6М`pkH^bX;wVзKtn\vɂXaf[`aS`B %})Uض'=4{wfZ$``rt݉uu50XVf5Zkl"{be{)[LAGd;`*` F=\|<ݞ%qLY#w xw}.2'ivZV[dq;!\n7O;ɼK3XhûФAVpHd45> unqqk >;/) |Eﰋo^+t{cA)/t+joF/r?[NhJ է\~=!IkЯ> tꅣ,2s`z )^7uܐhC;I]}}/.Ns8JMzGb` 4/NHV׿}H\&IXiq!KDV*R~~oW_wQo"'ەrR/%4E?OHlR@R}5p 9#S RyDSγ۪i%? *DK:1FJ)3δQ:i,B=klFLiFc:9fU5*vEGG󷏁{wOK?'ꯇ8wGx/8/HCZM&czfVU5bϦ"l ,\^+kQI3D[ƩbnvW"b^X-% Ps M5"bқ +[CO2̀ V\Ϲb t9 [JN1/W!yyA#8r БqP4YS?*:kl/;HdӰ_,9dVJ+bd}Թ<|ۡc9c!^v{NIhJ_v;z:Yn&Q3h<!)Ъ) <){OJ(M̨u:D'՚>/$IƲM~JE`%rTVUl[Tt^-gtEcj$4X#4H'1E:1%ND4Z.ʍd.gd U۫+/،Jmo?*UT3ȍQƌsgF(:DNyk:6B}d*S B> @Ƴ8sA0[W$GY};tfn: q5ΥeX 1G\':DV;A{z(r[:.2(zu}:DeN'rǚTy}Ezf+Nxp*[5wmވh&t5n4CʎxF3 aB0ߢABٛ ^ݚaբf}ul: ź s'R";ݺ I 5ZwT{uGWwT!735jҨ4ގ[ op1b}?gXO:оA,_ȶۋ?Vd}x1o~4yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Ice Rhodes Strings.xmz000066400000000000000000000103661506652756400262550ustar00rootroot00000000000000][s۶~ϯ9mi&IGǖڒ+)/Zl_$@\/$MaqY,Ň7~^5m' / ?x|qvw7u5}6~ tpۅUvn/oD"w?#7pdj> ڹ[ÜY7ZF^Ԁ/'Ԣ:YlAW\ڙCs ҆+AW჻r~9 /]gD^ywu/5:˭WV%,lf ,ʜ~g3Ǘ"+=P ڸA{8 QY Oei Z DRlO1j[s?h\F^:rB޴HQ6Y bXynXCV]EnFp4JXD4F۴S!gFR >eÇd(_7hC|"'rlu;7]Vfſ>]8 |ӢfY| QS&+gi4 bm=P.=}2͊-_wl.?90q^?P0-/^[< U:i9c7/ڪ&{r0 :y܆~ގX&_S^lB?/Lbj u>)y_p;`<7ҫ;QV1I<>+W#'h8 㖝*fh+hjMt&ٻ_O8om9Ô.l0`mYbZNs 7+? Z^Bi2^,}\x+:Y" < b8̤Kq=q8d:(]GkhYCiM2>/u{zpՁԸNuTG20^Qu-Iw CIt^աg8ϱ.ĪNU2[ 뎛[8jA8X*@s)s7íEJz/igW~ m(, U;֝} E-f6JYW $YQ aJZTzQYZmW8G&XS!Ei!iKK=xp(4D<*9dZ{p60RNYMYot֯ һ|FS97rW:hԸ.;%,N_8lf4܍G7$N6 d!G,jnۖOR-Yy\yEJ5׍#%OX~=ZN&+L?33&r|`:cd l;qT1wFQdGnLB 9 o]ۀԃ@O§8x hp/juNF7S"#_:ceY!G<ⴏQC(4E蘚9.a'Yl߹A!$ID6D$ZrȬp[l"agdѼ{~DMG 9Z" qsF> S>AfF!dzRrvj[Qf;]$k߫t[m鬭f˼KKR9|Rܶ,)n? !BkR\X~!Ce۹~BG~{޷ffϹc 0#\ݏj`&b}+V`b:| 0]W_t+w?V0XRmXme)$_"HBpmuw_:bDb96+3py" 9K:.z .h(,Y55"gXu`qŪA+V]Xu)-7\եd\ս2\U *Hu:lqIls ax}=K%#h4IX0լe"_}/z\. .ǣd|{jl|y+ ۆKDޗ 3' fMShP`hr fXC%!㤬K;/.mu]K.G867TNq ׾ qMG^ZyD'݀%̈́o 4ٟ/a AT%CP!4n@!Use(_@ӔVd¢pO5Sw2 p8ՋF)Hc@ۊ>xb>m)6#h19`0jZ#A0L!sԙS"ظ)nC)Auxڽ SӰ+dE/7 ؇(`-8+eӘY!~)@ _>䨋^EͣE@QB;:m&yi&-C5*>=}f@7`.~ 1$l d^{58>D+UM`z~gh ܯBj᧱7'l٫TQiK1$ߎC{pAD#_e#Ry! ]؟ i"#[Fc@9|'M $黊Gl(?8$֩k!<1/iI TA>I V*({ Q^ b`M?U'@ PN;A(^H")QAH').=`S|";6u)"{IKtf|ٻǺquic:~RMKTբ'lf~|FԳl:k %gF-y{RNK5,dY-eN)Vĥ(*q)G%.uPK]:RK]+RKPvpAHrqw 꽄^bVm{i ߯>[3l0m scBY _Ym3ߡж6C;R{p)59[!Rp7=6xHFtGco+: SR"CG)r!e7]{ʫ]锃[a:VNt0"T-Nh fbXUf[,%5j6ֽ:G'KJI`% ʊ*Ep()mb#.Rc1PR#, Ff-E,re#(#E,FfDffZ,zJWQP2l?+Jfi+V#JjV#IT[{jwZhjERgmQNTm(Vt@?Pܬ|c "}3yt uFX^;:ݬQFIS4 !C}H_)^+µήjx8 O.NN[A9)-g41Z?ʶ%|T( ZaؓzBsߞcIam06~˒cMiӧlvm WIUڶpޢvB[Mur Ģ _\T*WjUvr[_m*V*6?.z?כa'8_;7'&w#;ۍ<[9> ݹ=v%}y6ƣc ʙZOV;>_"`O{٘+3nAF xsZM|X&1٬Z,=2{1G6byOd8|r)Xwvȥe4KV[yte.Gp40X 4(jt`Ok4JOkQ K$LƈO=`~,$uU>Ȭ6q@il,,q` *@1OU7g4}>ݝ՝#Yf#wЬ7Ĺ]|Ϛ-{&Mcs^F$8A?:A4󇥐:0Rb8FS 2vXYuPW`!!F_.@+2jwJ {n]Tz_shڪIo|Fhs'R:[-lzpNTz]½2!i# J M̙8ӜM|;wksqq:H$4N7:,y(e|y6n<>)ҊЍz%_GLhq=&>Pf*,\.a-xG"}Z_H+: oW'1Ce#ݕ}W`@܂B`O'tT hX[ U&VfiK#'%%g"QF)`Nru\no\^s[rlE,ghfS4+T0etQ`D)D.WK*F#1WbQ8j͖| ȅ#۱1*1(.K|V1o({ៃxty2ҿsG~豹EkT+o*?~NFtE18rSUo,>AO٨){sY_i;CTPɕ MeDU.|?da5_xr=,C34vPAhO􈓫'\u>Sk jJj6a5ޕY#NϬ#y#ܤvxHjZQkLvkj=6ŖP_lM΢oEf~{/=׭ٯ* K&񤿜_+oG/򊿜_&^hJKW^;߄cyO췏^j1bwke9s۝OkukVܘp_{{(>9^/%:|?`+>59XS4\YgB#+M"P}3JaωdYGV$B7Yy;H?;.Agġ'?EU2l/,S4U 2!eb%wAUqXuaǪ+&݋a+u+|{US'QEG!{vpEZ\$W^Ë,"JkB4]X%N|"<)KRoҬC,25;BvBRE9z_+GUINzN+GD#bµrT4rsqtZIJ zk1 X~fnH_ݷ/4ϛ}螭QjWֻVMI] T.u BE"__Z_;❱}aUfA_M(Fh=k*Ngl2Rݬ=SxKr wǓ9_%pY9?-BV׵ fGM )E˖^X*, $ =ȋx>$xy#{&XOX-Syt RKK!q:)ޭ~.BI5]D[Q(Ư^Y'y.Zь4IPXF8ȴJ2eو+op%Ld~•+U Wr[•p%׃*\ɹI?KǪлex]l_JnRwo>RkU,h%sߕ1S^J)_W\疁xt 6S#1S'eD9FurZS2bS93T-/h̳]=e8x3lJZ3gc]"mZzqdᘊJdUIVbٖ% 79ޗ"+WXED2$f-Lb2$f"Lb$2N7%Ej3QnGEvYEW^1r0lnAd a.F(u֌⃖֌٦5C; R)ô ?BQk Og9!#EEPd9wN1(3W vJ:F`5ĞZ OLqVT]]PVCVY Qn}GFTd)p`2Duv:FJkҩTZ1uP^Kh+&ڭt&]CdĘѦy@e;b:T6 '|<RE$4^8P@oG-~zQ(ɧ [?Ǚnn/zرyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Legatto 2.xmz000066400000000000000000000066551506652756400244650ustar00rootroot00000000000000][s~ϯ=$[k] ;LHڀH± ң%$zK\{{OUэb/Xt\8obr>|;gc'6~bս]Tzx~(doyl 3Y$g[{:Ɨp~5B;"wA}p;lbׁA وÛ|4e'$kNҚ_xIF$ڬ]?)c"r.6tM@n⃂YP8=*⩺`Ҥx V0|Ѓc/3%>Xq(I.\LE'|:Ok5(gjT >Xd4MQ,vi>nUga@O:VwK'z (M |K4FP>2EFݯ;{EM6>.ajٱ ^Y>002r楎Gv6?8{VT]9Uu%}o 'Qy X=ԊQ#FGxKytWK@]?69/,[`H.R0X=uegcI ,ь[{tej9eI}3M+U.FQZ#"8&WM-bYo_` :[ّXãvQ T\ -o8o sߟ ZX+׎5@9Vp4GМICpC(!z~*|h␀gl]hz t z褀5]b8aɁ!2a=_-Ct܂>p%C$ـbld,ોOp✛\ +">矋, 3ňJk'7Aα&:@]a7><$.L$@Z :Nϻ Cc%N-9&Bƃ:>x-@˫k0ƋChFMڦİvO%G.*c{rISg 8A[,WOf[4+TdilS`D;(8XP?S){=tR˹؛qY*i2/߄V|!G. (Kl&1(.KVFXu5pz3_0#Jx1G]V#=4Ŗ 6 zLqCSmkbм,ACu yAb ͂5qBDdlwxw <&;[CJ79#/[#Pq/B?we2U0 /ZZJ[۔"WL~Cdqbв_;'Ele&h~e`cHr_lMF,f,y.Bֲ_}]~{ͮ-C{wE̪%qrߖ:*-_+~Pe{wh7X9~KXv{/v?-k Xᵇ!z(Nz/C {肭K#}}\3r=iÿ?CWYbAKʹP2WЃYGi58/HBDB ԥ@?Ȧ;SZ9rQV%VFa1vL3NT 2l uu}! bGm2B}*C"k}z]{9c9tr֨A?KHS[LN[:jW t;Use;ؗV~C5Ӡ,j]4"Acw;pbU &_Aq'tr} =&uWg\豇j' 4qqZ~ ;{5 WC!SfA&ğUK--'*- mNՁ ݧ0!]'+JEjʳ k(٦ *#/-oķz<I!Q[^P^"/&6!FL`H>ڲ,$Y:RӖ@>KW ӕvd& m eµ3U ײTZ&*\q rMµp-RZ$]:V .-gȣ3r!x>T1 ,A4XI]˄5yd`^b6gRR+?M!176A.tG OrSԢ☩,֕;Щ,oe9E+˩[]Р1ƕO 7Pz. QѦ:[5b>e+&gDAVQd*Jgx9=؀r D$Lb2$f+Lb,2$f@"r3"٤F9*Jφb%߼Faﴅ2uTCkaDC.ZK}0m-xe  I2 UGW .M 1J .?$T ?mcS|WMo]Ps3wz;%K`5ĞV OL1=a2k~_+me'ݨ}ݨlDuQp}Mwj*W5fioHdj:~ mƒ|dڻkBXpϸ)61EiWy@mh;b *Njz92'<=\_*3$Iu#jlwop Aqf˿:vbx/ yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Legatto Strings.xmz000066400000000000000000000102461506652756400257440ustar00rootroot00000000000000]Ys8~ϯi!P!U%rkl#)ɼh9# I9m q4x@Wlo6 @Û~_.nyQ?}\] '_nl6^]v&?ʚ{tBh=YNc8Gzq_ .j8VNh;Km"z{3Y5@ިwӟG9n/gãiSiڒH^.#{冶Gq^~\=Ed;8Vua ӂ;}[Ef=ޔ ^xMo & cf-';zl` ?~Н#k/ƛp2{kN:kD >Z?yLI2kgјK3`jAF x\+y>^Y??HНbp}n 28Ep,̍>S$GM>/^5ta,5SH0l& oY[6!)^9/ ϷAr NcģNaͣ^ Q+|lp X8t`d/bXNd[Ȁ,ǩtM0JX.Ȣ'+/"ʻUS5~`_e-KqL~C0쑡 ZU{7WO[U6R1KzjOl9׿RJ{NyZX}ap )W8&ZG1u쇄ԝ pHy[ $g8d9:P;h{6HyɖwQX]GʙfI6yNwu N6Ÿd9;jK;R\[Țq|HHv:Pe?4޹C< *ζTzl={CL3@Û%0tى:mkpp8Ӛd$2H .ZGtD&i0+2>>7m\[Mۋe+R7Cxx2V<,6,1Dl9|\ '?8H=b6$X!`)=9 :hTogm0_ںZ f_P8~n8*xD,npL"(}O="#m?fT.bQ(*-cAHIR|+de4L:wquTEVTqf2Ϟs݂@H;Vq g!KnMBqk-@Px4S`X2MBZ *)Xh5u S{S@\26S@vS Kx, ̄⬊:lf/Nᘞtx)}DVsa걚QɐrYpdR TzMkE֊n5kZ+*״VLN0Nj̚ ׌hqAZ{\5)i\Q//o H!n\+(i3 z4zLSeI6IP|RAm>8@wܲ)QgqRg|9L):.Vi/xRPɗ&cS5 1¡s x eQ-0Tk6 üe"z-'.(p0 p5\wa #$$}'0+ V $z2ɜBf|^k%aRI h; U~} Bɗ-B2 iŐL^8(*\05ZćB)DVW2G/Q(#g/b]W|֤(*j)(b PG xŠֈl9raKz|;ЅxX(n`p" qK]ukž,e%ȅ0A[5X=Tz9& X\\*d/ (x2 %GZ7/4,ShzV/c8ˠ4e1B[]4 KUѱb21 VGG+`e? M?1⏒4DJM& ! ʹ 86!αp".c s 6az`؄HcW*J甥9DWl'ik >VpnpLPhǀ&_D` 7A' [8u(pB7V̀ _YTdGWqO']܃޾fL0cExIz_m~$O58pq\Vu8LWml`;Zݟv›+hAJ`v-(̮ג悃M1QRM[9lش|hɮ^Zr״5m G,PNm nhw&Q!_ 0M147ܗ7-`ZpqP00M_4e86/F˨QmVY09Y˸GY@P*%2VBJi/If`ƒ@X@g9ͭ:c;ÊVK3,`UfֆV!O:_'Ag|.Se[Mep:I0u$κlHg]6 .[ 9ZoCAnJt7.&@] ۚ٪HY`qhJ )lE}6&i=%TJtPۆeT RnJJ^G[vfF:FX2 w&.FaQ$mjT>f~&ݥiTLt@ B#ry2g`"8wGPoDV07hšo2l+E<{;RK/rmL|*ADdڦtqM?Cyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Octave Strings.xmz000066400000000000000000000064071506652756400255720ustar00rootroot00000000000000]Ks8Whu=dɎUI\[Hd.(Z,N(!)'_ $ HI-o ՍgFv^ɉb7?خquWq=Z}|Ƕ?ڶ ~S?ŽY_\?JTɖ~Y׉Z~{}(:/ƫ| <?dKcCEN @z +{b|7YMˬ8VFv:+jx$ ~v&.&׏hsB-~A88U:Qӂ/JYN޲lwM>Cu7^ ICxmVL⭻s;+Σ>>i^-l| XuYV0%ջA*v||[^o`@OzQ'^@ JQLO|NAiC4YCuN TO0dpG/xZO N5輑ED')F<9^vmǏm.D&vjq E [,|8J˥C$ /)M]sGѠZ9$vp0mō-, b1Q4? -\jK;j OQ,V@(QXCxq7Mb~3H`1oa*1U\"` a%nƒc{\,B(h[㤁akJ#4ZqG*kU@-Ӂِ#@@s"Ca̗WSZ.5Yu e4ԴAfjO>`br+SKxX:אM -e5Q=> fw̤N_^4W4+DH[9Ŋi-6XaILH<\a&l!N!#C+ѵײIEkUiѤq#tC P@H50ebaUZ\]HoG10K|K!ɒocGh)aFhvΛ"B,>:pEE%lGgWl㌲g p/}#˘x/Q2ZByY@XbX+~_Jks-`i65,(Do~:]^PN"!Ms4= ًMPE7N"j/vi!Dz2vĵ` r& kეYL~8]}*K\oo`ܨetZJ(^ /C+PAI=$3ޡc rN n)Ih0%%KaG%f 5fr -|fz ;e U2A/0im%c@Wʍ!d%Ӏ< Q'0Z4I"ku!G1dPt498案⇌h$zh*މts%UUw6$iw]<'J 4DH87(9'x8##~g/j.PIS"6mxE}q/W4Ĭ՜7Q;u}Q;YCGdi_E^+먝叹 ȎڙyV]Eh*7ڢʍU6CUntGLUnt LUn@F7vpq i5o.3kvgս-~AP**Թ);UjR%B#8Gd eta^qRw=۬h*nP>gu7n4G&!4G˧Iܐ)brg][OW[OW[O1zʍzSb3_$zNa`4Vlk42QdvTLnG6]' G5UZw a!""b=Hǡ!" dR3I`Y&5 `dR3`IE&5;d5f3QPX_KS1ao #3w0Hz IzjWFqi0r"-(i'2dzP" V(e 4Y'Ӆ0Ao%w_X, *2&ϔE[:2dlȐ4+Ui-vTǥbQ=i;h˦ӶzvT v}܌_ƽ lo!SĪ#K$ 9yof~g4Kȏ;vq}o: V{LE'ǣ5N& !__Q _{xWWԴy(<)*9nڟ%|i988n'NpӁ_:IPEZ:I qqR~ArioͅkJa?. H7 t({畭_C| |Q:=%[<Ұòvq(~3Ǘ+ +?axoe ,QSYBǽb@ֳo̧Xk%\$(lFh2oBz|y oZH^d-Xp,'?MbZ%A 'pZhaVd65Ou==_ǠE9$/b LKm} LKGG\K>DY`ڿF ͮ7X#}S +O'S3pW73r+犫bdz| "VHst! PkZ]>S'ЯtB'o7H UQDKCm2Py1f["ϹaK`~su u MG_/8yK PxXT30n +FKP-[KzrR;`R[^.W.+`C+6jt"j祰.J=dzƏ@Y1){_MJV--BZT:bj*"bʋ՛+ׯ|2ranG?W)@Jt%v~u CoHnh3Po*V7mJV";Il(.SNb eMܫX| V.\} .Ka ,ĕ3M=o{wiodfͧJ;e ΢Z͡E3;K^DFֻZ'No^T-Tj? j vg0~I]4|+BYeL0Ls2k//C7z0Xmk0~Ř++G@Ѷ]!Yhvv^P?s-=/TC g3*A96V5N4nwh;Hr|^]sCRAS.4w=7YfFJpᣟ`]pV0K[ ZAMߎ}\^xђ+ҹ,`)(NGKMP*F;TؽUPÜi)iGam5nZq\VP0Ŷ:AHǦ^Tj]mO >RH3? 5t%ט$ XA~c$X沺t~~7($2C\iiW'3I]ZJ;ZDzvNmqiZ9,bĠM躖8X h!#aދJgzU3>-z>=\gpU_U}uh p=:\;<ܘpI:o&++mzy[5KH<Ԏu(2/ {"Flj/ܲ`B7sI1,x˚cSb's9tAc wY1eD31ds vMZ(!f3<aӊ(5>ART\#BwGxtwW¿>{ 8(Nov Yx΀0W-YLˇB.)DcK=mqt!6EJmMehVRy!\*Y;^gRiyi9ТPxg GinvP|'С w,,$ڸ"5ζ4ZR@O"iN=HtǒFsg~$s%-1x%P39`6PM䴽'!V&yrFMbi#0C &Nk9⵶Ђk叾OfRC5+){RC[4{SbPXʙHjՏzH<sխ8ĺqQ)=aaBRp-W+5f]dFubT{:Wk!?ZT| ~X] VG6LLK]nLձ4ќ2\-:-@@r5-g(a(6 ~}Y}^_l/Y|G M)h]}h[ tf578\~.~h<X:ݿG$\otK[=36h%IKr)ck?R_Yr:$CR.jOu'pG[kIϐdR#UU 3c`1jtZW`j,|kKtpPs=d.Z4mf^b*gj3%Rj_PMA6j5˖cg@ݛg8}do”@?_`= ̼ j7Q3nc>9Ωц%v ܷ SݾDƂV3ѾD wѭ|IAXӦvRC®(5t N|}< 3ĎHB0S옚kxiZW1vL~QtEwW9F)!>69衒҆ѸpKyuH2v1'[CyIEwv*w#X#/^n#Qè bAnQmcT, m.rwܜ予^/s X4T: h,oJ$PߍHsu09XC G  ? EHH`0#GZAa  @*   ,ap@:KSz'9X% Bu=4AidEMwZξb4 `/gd0 !?8LЙ] E)U;m#Nzw}Ͻ\hKoF$ d%]Um m͆nx}fa_>OðH%9?2{AZ9:*y!}bx"dë(\hjS(JW%9|u賴7ݫ+=]vSKƆLJл&__=I)Ox) sኧ0!4X4 `I< nQhi!df>)Ї}fbNy[' >ôld>p>#NyYz}&Nga̿07 <0;qZ'NSTkTp-PfTJ*-k=\5]IײzvMLYX_a]R]h,ܐǜ gA^|ͼq›Uʋ^BN3Am\e9.'ʕt9S{ Q4KZIN!drpޞJz՚ ŏ0},80(/.˩<7A,oSٔb{LbSy\\INTSyUTdU9[UNeJVS EU4weA1 jd-6ŌFb-LÛ&pEFË́*+ (8ee.f՚$655&($L &#L &(#L E01DӭT)*!T!P&U*Z*wFvMѭiȎ}h=FFvzS5rbWg DkQGV CxZ݉coe\Q܍<_o=,͜=ލ8{P7zVKxO[y:7vU9cT!LR͵^Dܢz`SozzMGUw[E@ZEkuXUoVo)V/xVlUZgbUPYZX%|9Pڎ ;GчM຺E UN4 Yy~@p eݥTѥ[P0&zgYl:{/!1;1t{Lgk ??zOyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Saw.xmz000066400000000000000000000054141506652756400234660ustar00rootroot00000000000000r8=_{F8VU)Mר֖2MB'B|LJo Ս v{q׾QG7kYrv~k=o]/SǭWê}/6^7d6ENLp -ڿ_&A&YB=w6| `2? ܎{ib:[l}')Mꅬ|!?ۄD4&~qAjJ!tÉfX)PZ>CP5{}KT"݌@. n\>d8IN{ ( 1uW{CL.l:AJf1ϭaj/ _0ns?3g[- Ђg {AҤ_z:TXɗЧ$>Xąh\TBH4p6r߄wΆYIũZR!j1@e C3Yg trRo d#;,\IQT? F51s!,O]sM&t5dZ%tHm(G1,k( t/`7g+Ҿ,{R i6KMz}Dz$ SZ|UKDB'T7$cWPdeW~B*X!hT@ºe&7ܧFQNJ]bl_f0];n$>H,Y8eV0qH4x Qx$Y:>7G9 VO QPVaR͆:lpi`gCQ1ǘxܾcWq)y9T8=&16;K gu-o:2"lav:XK> LYHfF?/;d44ϣt6A C*$!%Ws\ag+:qDk6:2 #@Xt QR~)+zW~-gvjVl&5?Zꏉ |ef6\[ܿ]>jMEk{z,Tqg"V.JE:Z7ljrc*pA"YKďUr<}=ko{"e(ҷ+"C%H|R>g)LGZi T!$*QTC)+l")٤ю "I <Q *ROc_k4h} X2`l O,1` `w Xc2X(V8 ɴ~a86cf4Db!@ŤGx`!_,(~g~9G !J/(~-6[CB((-t)咢n^U>IVj"~cMʓ>v_yDICy̲wm V( ZрVeOSr+5XbVLoo侀ﷷ@ﷷﷷo"y8'[ Ryoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Space 1.xmz000066400000000000000000000131271506652756400241100ustar00rootroot00000000000000]rHWj5w#h{B#1# Ml7AP )n7v6Uzʪ:/:}g$K=ߋA6Lҧ7>۟~wwOz{}I/Ç$5G/IZ*-h>y9ҽbO߿}wsѿMYe4o?\sC(/חxw@t_<7~\I5$$r>_ aǓy8gab9#6PF@U}44-V3O V#Wh8,s [}4m(>gc궔=5k-~ H̉:lx'i^\S4քj  :yA ,mE43K󽠳fy<ߣ_xjIJ$p}INYiCzp@3Fq= +:4q8J8"å mU8 յ˦br Eh^:>&%\<ڰӲ%7Ţd]Ϝ\6V-O4铭EDNci*U_m@Z |6 [| q:Mf<MWɪqT5/$:֊q^K1 d([NCM_)aڻh1>LA|% K-YsL2-WEkXqԷ^N<9 ŷë~fUPY~=3YPLV]AaHؐ;Wk8֖:Nk@GEǦEÇn6n6Ү1ibPtZe/0cfu \^]_]4 >F8tXpY[Lsf h/y2'ʮblm8J@W4va4SijpŶ媅>g5$CS] >!2ړ\Dd=\^֌h6dN&H-AaֵY| (QTkQX2ץj71`^JSa%92q;}6bDd mN2)%bQ2&#)U)mt@)9Cǖ~Y:{eh>PF_YZ)u`N2"j*M/Q/`8dhMs:~)C5!yF,,IKN4nY5e/S(OcV+'|ѣE/zg닞/N& l(;*e mRKFoػ*Vd;W5W,+ pU6\W,U{ p\Wm3U눕Lzo,+ pU]} ==/ E;S3+L9hͦfVKSu =Fc8y #q]0NmvXa0NqvXa0NuXa0V!Ӟ]0V!>AcA)dsz7ga7agH95D_N995tvΩ!>b\ϑ%v!k ܺkK#{FnV3!?Ci`5FXK#ȟ"o q`j}r3-ЩiָQl7k`h0曜C;tðɨ!qA9؝| Ӹ\ r,kz?Ft #Q(gytSN[\^cW(r)ЍS7ݿzW Bq@!' r(;ț@ nƝ;З7:-Бbhsh1G^jȇ8  HAvqb 3vp8`G X섡=;xT?s5F.;eaXmJC.AYo);jſ JU/l1C qz.)blԤ.$y)ĐpqU6tS%''[DfeTO%AIc%kHU͒o,\Ey9L:<' LdDT>)DC@Y.Of=r!?"Um1o+~{a9T>8}T% N?DV2s]cq, Ps3i y8V$|icb#I>)bv_.¡ŠF7(S.Ht3ʓ`w;58pNzIV)A_O:bK&z/}4D&PFRd4Úτ)7ivAc9.$O2X+?hܤ{ػ,%_ ܘ eB~iJ,@t,A:A;T~KvՕ]J%6V25u YcHG{j[CysMLKt1 u cGK!Qԋi48Tp*4>nTzW*em7)6J_+nye$eHғ~lAPa>"'Ւh5ʯ~ 64fGKIjڛ֞raTV7`Oi]-;]xHd^p쾤|Vjw![3le -|Zm"p [B§k_6X-vš44l{.<%z~ԬC(4oS<4zwy]jw$iV]TrO姭 CqQ`@u*3vgx:49'q>t Q7wu}I~3ˈc|FsM/\Xj8 ךdGpߩ3bD8H@CrSMmgO5Ĺ73/usT^{5{R_wk&bsGJAOIqhb/PQj k۪x`4jZwa5<=a9zI%): xuJ[a\`a%~*֘Y=|L>f;k4 Yr"Y^3r]C(]]LtVELw}++tCR݁"~_xuҩ&>tJpZqIC&Z!2ۜr\©l2K wϑdHLfi%ˌT]2**sWQ"X6!UvJKwe\R>pI(Ǎ[ :[0 M#G[;.퀕M`6r}F;,c.Ңcls\;^7$PԈDWPss뿏zD+k>lhc:V^lQBq}$N`9&&I2>! 9 rmC nw\*!1ݺU%X#^S.=.#64nO1ǽ)6_Ǫ/Cۘcc@ژޭ9&[\m̱A0vx 1%15Ś+8G`@' 6D2KNA;qFcCۘ6f~3t\q11y2Č6ySQt} GABHr)q0kFW}I"ft1mLj4XFiYmLE/;^/Ĝ njnSTMPk DŽҘPkbB"$K/DHH4์Z,`NU&ўaL5Mi2IBp@VYᦁ`w-3)L[+Ǎ8 [[jz8Ewt#N[ِۖmin[[:~5"m.J{!jL}Z׃DȉFxnàS ϭ~o@z JЩ} cNC몽6Լ1%p5EN8DZa[ :mN0 :mNU~F߼maiF6ЌY# Wz\aR[d[+Q+%B0Wzvd ^)]E$*-&<Òne=ұZ>=J f[H?C[x]k"<\k=ꓒ#dGVHǛ+qLx,N]A̴NJ\p(%hk və"9#D\M3h73g733g73x`L7躘j6oJyݾ-(a0TkR"k J6V4Dd_VΈL'qXQ%!1.$Ā:BbWH (#$tMt-'L[(HAJs|jdVjdIXj&T#۰(l-_Zᴵ(KzMPF- TAoٻ_*cDC)_\]pjb'|GΙO95Ժ1UK @N6~U6n G1 ņ}):,,ldݞ]nd^wYMm-nBc\7_ҋa??v{_n;=gAw~׷8oOlJ_iU(ty4ӝx>ڥ/?unzk$FwY6Iq~9,PChN>'ݝn>붣۳v}-jߢp0觜ī&<xMi4Lgt>NҜ=H(JƁ 44,VOV}Wx0( *o٪:4UIׄj ~¼{*bg|h9G;dLcFbi;i'e'+(P4Oh>״4ի~^:SsFw#J?x$$0i&Z{VKޱTLg؅-ټmwi;x}^-+`'C]wrnٚr-E;ƙ^̳Lbbg =dq' ʡAxXpRMZߜU'(Չ[M8U-h2.zǫ.zh 8qShϨ)y Hk`}b XY+V *?okXY+VZ?}beXYjbe*gګz+ p%}vYY+V: 5<=* Ȣi@Sq\nF2+ %vޡ: a<@c8C0l"ab<|VaG)&9Hq>Ǣ^WOoLN8rfj)gNN93tvʙ!.Ǎ)r>EPR*97֔yy=Vcwធo䤃=mi@{p i!Y`b&z@ F`?)#gtЁ4^tDS=u8D/QY !Xqt8u8u8B}.d|P@."nN yq#((4G췣@z_Q0C[.Rqt[#Աl{?v!r|cu8H~wgC-8@V^hZVo(~ > ' W:eB7N"X4@Y NenNϦF0t7oYH;tN8XP044mlϡec׉(X6)4^ k(Рmr ,EhXEZ@B^c`EIQxh @X-AQ&o?gPc` 4xif`QA\c34Zi5xi5^ųX85f VQyHuFXRlױk! 04:АN(D!-Axu(C!A@~$6J<hŵ5vh0mw)' rѩ/'ڸU0D Tpm6n/X?hFkCCF`u,P 8 HAvr 3V0r*XøkV`؀0tـ (h YȤ:GǸN^kz'+B!;(ds-IC!AYo:);jſ ӽv [CttwnK.$5ک I^ rWgW7g/fJ2W^# "˨KJ֐^Y.+ V'N_>ruVyN2/OacD\PI Ye|0QЇ,+E6ڢ2o/|{QTUeA@t(tIdX]*̈#JKdQT~IFɀG%NsqHRpr 6#g'GVsi Y$#wƭs受 FOa~8 OOŊ,?) :јC᭻J%lՌN~"͸a tLz>Y\Ҵ|)PZA&ts~p2Y&R1InൟS"18'=5Ce]^Xecu]mm\Đ3f\31"11ƶPfcsxHp= q c*1%DRH>b S+ ˫F`Ѧ,5Q0bдe56xi(-HҬ:,JO[;.9(\23Sg;4]qjthr"L3B5<3D\Zf>t;pߴlA D*ʛdۄBoxsPzO ݧb)}:*ԸI6YqHȒ |ccLODDxͪ3fJ.Ðpf$mo ~sj)WnT^*`WrOVk?Y-;*ͤkUKu|@lyzת%~J.ת|Zfy R^B}UIgC{oXs*OO=VcU˃P~COA9޲f*;~~|ъpVh^*k[UxRRطbb1[U=Q 8ӥWSLvJLail,V+[us΁8|S`UF끸(%MoPߨ|gk3-{N:wMx݆+ѓ\:8IxOK^6qwIpEN6y_!ZFk;A|gt;QaoguayhXߕTl*njЦ3m*Vti\7a t̓xcU[fM2%2kߦ<@~ euk۔g#w||DmsN_rmS lSצN)B)Hy~:wbvL׿YN>Il2W$xmЩ+7W緣hؿb0en:QLvJ>q8{q=e/S(/0AWS׸8)^؟@k᪔)Ki!y85T;qs!CUV6O+:9+ ar]UWY zia)[:DOcm(rZv}1L勇5* }cLY'V'2㳪ΓI.mY2yxX\O=ds']f,HÐ}p,tߟrUgB+b|nſ_!ij wҟzkx\ ZrtGqiTj0,ghZ=H|#*hoXΣt#&ur7l ʷo(*$S7vvm_=LUIZM^bῨrRk4?u -("G^ey-DgIjisՌjdnY* ˬQ/Ut*TBq D1;ff'Iw׌^P: В`% m2 jd`'H1oǠZp ކtskBtG[ukWlܞ j/f__s.Kx+  K1/hU^]e euVFE{*ArwFE>oO0C/0x:LTA5"Wj4aP:QRe51 u[3̳]Nu&UpM}z͐_4Vjfj-NZM,wmT(19YAA DNld 'F hE@gJQ)]DHYDHYDHYL)z9bzEBEc^T-U~d^Q^Q^'ngJ+J+J+J+J+J^ЫzOcZA,azEbzEbzEbzEbzEbzEbzEbzEbzED 1"cL+J+J+J+J+J+BmW4zuBNZI pXJ\^sZv[i B Bv[Vm.\k. a]J+0"~E|k30ʡ_^Nͬ|D`cui] Jt|vYB7:$e.ם!z!FD]+~.`N!zEfDցfWp&څ݆w@T8${VPh.zxzyԩ$*GQ0Z0.ih-h-h-h-h-iaH3xp-.L0_muh-h-yI*2{nzO [@SJGP{cnc=KomZ#5pOY)Q !! HkKr;TᒽeJP2(O-^!Icl0g ŧ #7(_F- [Ơ|van3000ZO cqe0DJT ӧH0C,ҧ1L\҃LCDLc>)iuK/SIaLHaKR1L]8oɖ1 1L6˜"}jay0}xb>e0DAporbx>.瓲.Qb0%E_,|Qݢd1Eb(>1lg)RXEb.<"%l dKv1 xؼzd[f;Ѱ?< mɵ9JTpZbHOE y3  i['I4/˼S" Զ9 ֜Fc Aer2<{gn!VFQt]Aj}vtw~u-),X-8G9{>㨒PJTqf}ݔdVFIq 떍iӈr5wpyw$6ZdZ5>$ z,Ѫ7j*]Tϛ Ҷ|2b7{)^!_*Ѱwȕ޲@fjblf0fט6IIC@-3K (ެnM޵{2-E \U&2Hl;|p*3h)2~)ͨwt?uL8r´Cx]Hi kK项:,pB10ٝKC碴W^)bGp4.wHNj%]N$]N$]N$@op5CFֱJ@,e\oիZ֫֫%BzJ̗[.p l]]zs%+`sF<~ _zR*>L*3bF\JǞ3&+/d5y'3~崷W.dsr7?fo<[m0uI\=vn)ꎒ{07.'p^%{$zi1U8kTojaݏO}ʭ6RU+l3~CO;xs$! \Gfj חF+ HpfJm靂@[ѧ2zGb=D*_edҮOfeR91sej7[$DLC\Sn Ͽ̪ݲ^#K%=uOq7dd4Q/2L^r<;-?~wo?~ʷq/?$GLeSڗd?ޝB +Rg_.nh1> N`E]-ȕaodR Bq ~eIюvS)h/+_&3(^nR)&8)+F;0e yFf;@q9O]*c#3m,1Ki4B?ؖ׃J^:P.$- `paroFѭ_6#ʨf.gJҹYcyuнRƽ{߃ãLi#޾TyV^ei{Q l//9|^+r]C+[~/%wiF^3N8\H Ttҥ4]%q7p؅.6p kC@UIA\iPv/./oks_qLČ3Ddn6D$))X,zO ~%vdt'>٤Z7㚳Ș>exhc([[h%p|;.Q:}ܿ)p~(ϫр5rrWDHPsuE>K  {~ĔOXa LbJ Ie5)ĤN)LRJB.QCbSqIdL)yD1ؚJeɳC?FןoLSEVф'v vUKV15  ȭbj8lMTx rpԬpԄp\p4pŴUEri㪶 ^CUT\y7^G1[w@U0 |1+K@ 22uD!E;ɺ!$!Rd[z FSb1Z-ck*rI>;rrxK%9JUl'Q_u%+adH!BL"xD q"C)ą R!kZrvݒf@#j(6QvH5Sf:l_p6CA5S,T5_/m"?֥[ u W dT [318܎FC_T  o =u{q9Pr_v*ALx8Ǖ zmx뵭c ׶K^:zmg /Ҷ+7}8/n4tӻM4~I7%yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/String Reverb.xmz000066400000000000000000000067421506652756400254150ustar00rootroot00000000000000rI_ABa{P hOcݍddUGVU7YGVYݶdΚ ]yk}~?h݇\._ƍzqZ7S:àMq/x$>S+XY*mYmƟLgr2O=opy7 ^{ Y|uf-Ř܍r<_ģ%d ݏG:!qB{ B0-x ؛試Am?SA xU[uL'Yl-L&¶ML_<:F>,wol牍BE;ϖLN2ASZ_d6 ܰ4\/|ixln$$=Y{.b5#4Yt!e;l׺*qֻd6Ye^6khE6-@D#fpgT&s/E╋ؽp|lX,Ge:%ڝR,_=#;b4ϓVNmyvyMc}!;oF`BEtd2],oeղZ)GBm#|ٳmI{t_PFu@!u^Asp&(^QwG`5`F+1 )Y|.@֕oeN4þ,?_im;Ȣ#݇1[0t8GF Wl0 &J'.Gy"宽kyÞWH{QU>(<9ݍ#`ɔ>& Ɛc]UGEpK&6AuC V^4ќB TH} vǮ, vyrHEСI[ "1|TLZF+=EVL5PzHiāmSzCtkjժ3xɁ眜|W;KʐgG$:=A M/.UqM.vsUNs-weC+ 0].X4LCpZ]P)BwkM }"3!&JzT/͂ݝ?CB6M9jʉ@&(rDXH*0:2n: :e2J&<$ׄI.P^x F\}hWl]DgC}B`&5 pfذ0(c-Խ AMB P'IkdTr_xZ834Fy1{\yx(_NPkmCޡ%W,I$Wv1ΦKZ`LvR:Jڡjn#ʃwL㌩2Ok r |doef4`9>b}8Y dW bMr $A$ӴfQSLfܴΒ*|̬a8)_, &LIJ4KQ\֤9>Κ$*k'\&MZQ( 6YZ[Bt4j#A{O؛ˍJy,"(>Mfۊ߳" )"W6Hz_`Fdkh"<(" .;(ġH(s,&8A$]¨_٪.&1^5w!^YA<}vP~ o._zˇ/z~txsښ|/Q~''~]dXZR_H(t]H(>S~# z~ ƿ5ӏ't.8+8`jWNx%Fh3` :VkL@ Kp:/en6 Ufoltq/zCwo\*Iԁw"ߞ'4 I3r "I5%x [UVIϷyWj>e6 ΣKEQM+R)T͗Q3@brs(u-7$G7 W>)_"/0<^zKQ'5Rֶ͗= SΗJ|Y<uJ[OxR e J#XxY_zƪLf\W˙FԘ?MtJ)+IU>nK0bt!c{)SI)Jj$Lh}dB3p ͠LhedB3"A xܒ!UM 8_EF1i!|YŤ|?2HF_)j5SxјGAyPDQVW(@?$ʓMBppɳ,}YjUIB'΃':mM&݌4$0' Fŕp̆8V qK#a7)Uה5p+Y2 u8O}rlyJ5cfJƐQNP 崅 1Pp1~R#^F1M*~kH;;&ک*oUK5PՌh[qQTDJU3V*6c*U{U RR:Xӧ/׼5*C,E@?Z5j?euH|UTg6lO 9E+ͅyWbZxJ^&oBTZ?|´?Oޟÿ.G/w_/au'?߻No꣼ h?̞uHxFyu笃6=o[:+rEA+t]2~ G=r5<}v;2`<ɺc=-g]YWݓ'W?!~-bVd^xaRA@Dܛ c醀NU˂4gs@u3.fmLX9H̫ 9g Yq2$+oObo/ƣhؿ lը?u{`6Eti> Y;Ak-`̀,LZ^+/nVDzQDa$d$n-,^:_HnMf0} 9{ w2C^9ֲWzrΧr|S::bؑfݏ)+]6}to ?$ Q7iH6=5F{YF~h2`hx'5|,D0DG炁xNWybNGaӂiC w)c>17gO5gXAGM<8w~Cw ?`HZ>˄=GD9kvOQFZY0G +2Yb΢0̚ιx Zx >ƃ?_.%w=Gh9قCYO2ރ滂ߝՕR:偦SSDwc袟%ՁOUxh24Ik^Tv7*fP)W7p/A=DWr逭h6djϜ{V*iz-)H̃@vM3j8D#%_NͯvcJ'7{=^t;Bjg2{^-{-J%[Ib4vR&^h+eHb`y7 e֤+/B'5sBx+{l@YMJupyG;jY:19`tuM.-n p24҉nhR3/]n ΥuH#]WFAQ,XqR1+>30C'i<!:F5O}ݴk )|'Ku1G0ivSָ8IY&Y@nQ#hPP nڀ^jEZxJ1AD|.jW/6τ>>l7lq 2k\൹#WNqk4^Z&?EmkwJP#'/rQ7ϴ)Av][캶 bum*e׵U`̮k]g68w5Vptw;ܐdqee;\L)W!O\ڊvP@=7zJCy=gJ囟e*oh)[*r1Nǣ%sCo{#ɃB y )PXy'T-5BP1|^? 9j2%+Z@o=/!D eT HXJWtjt}tVTkyk@ HyC[)zMVjmXMV\M[yЦp؎7@CQG:*rNʟje)% ~mK+eY  vd ūP:Ǵ@@+0"2[Ub+T%:Tb+R%#Q2ETb+>=uh+2 4VbfWƞ|o2!=.AŅq4HI JlubtJy]Ad-r]gx~-]5tt.ԍ\z~PCh\褁=L'zur{6Te:e:"9;t\twt)rQ.ݵŖ.?Tl=OE~k)[H}"КpS)N 7✨5d0t_H?,.I~H`' {h]UMۑ1:bVO%|H&2t Df,A DfE&2*24qT]bb8m((&-doCQ1 4V#y5ҨX[4jDo9مEX 1aRm, U(d i]e7Yϊ1̭ZaMi G}g{9M͸ѱuGG0%sKw85!xyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Strings Reeds 2.xmz000066400000000000000000000076571506652756400255450ustar00rootroot00000000000000]sH_t`*gZlImeJF.HDN|G# 6$3Mͻ_m֍G']{lrl8ҷ]}m7q9X|5|=]ֶ" ~eͽX4dO\/}gvCxbK1]F֣ky[knBtv3\ok 8ɋ.tlZ6-nGv8ތDYr}F eAr:Dl;G]Eߗ6Su3ä S/'>+61=:z#tG^7t1 {kNj4?;h",M4F_vֺp6fEv6IÏZD`Dd%__H&K J}8ukڿdzh⦖[$~ހ 5p`.=dU|ɩ@ $Gv6koědʱmS*+[`hp=(@Q;kEH|$ƨGg/BsR F|5?|mbX;Vd] YS^tƓbf4YP5}3DZ6_ۛJ6g(P3u0:q! YԬ``'+Tk>| $kNSuHlN!^?g#s*O󐀔k˒#ml\i:Ѣl8 :h^Nb$`+me‚^Dqmmk7q'ꕣ_df ɤr]^n͎Йxq 5@pBf?&|HD$D3$N:Z;"_]wұ@^Jy*&\Pm:o͡\f8m4:NgH @3Vt "!k%hک`s/ȹBkzHO sυ0M(PZ{HvJ+Q:/m3"rOFfΟNM*dҽ-2]JTF.okl%al4BZ<ϧbd"k }ڠ-"~t=@ڔ%͔Z)4Wh >v*{Z!A"R1_/ͽݍu_>܁AVNǁtg,N]teڭ-u9 "v)GQIs+)aQ>Zul`dSSbWAc +&nn_!>Kky2蝨 6!R9V mJX0 ~1+hx1 2Si QiOKؑ 6GV9ˑ]^F:d9E` /J,VByJz,̥$THӎҶ KK|k\.(|PI ƏlUx/[\yu3ub@R*uh=z w qmL?T~tsCWRaJFi-+zY uy(|QRݭ~+fBX`K}7U|=-k5+W|3k 0¥prg;t/| p+#F{>-iH* dKŗ+TejR|TT3K+VUT'5|jR31TJ Q_" z K)tQ\E͐r2Qyh@UJ<#*E"шYBff%ffŔisVV'YxPF2rSw{YHNefDaOf,8`vi/2O[h!JOkT~ .GY'_|lT|~O|ҷt*I~[e>o'oe>o'mdΨ瑞 .qFR3M.Se~f3W;v4C-Ÿr]WSI<j$F!4cӨ#Ftlec"F4Hܙ%ؤZ>)(j:=E%U^HREuz*OZ{#S#(6kr<&LSEpkI&r4wf8 w%ac3;w  !d>|ww[ۊoEyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Struck String Big Reverb 1.xmz000066400000000000000000000075551506652756400274570ustar00rootroot00000000000000][wH~ϯ`y`0pN9w|ɼHؚH‰o5V_[ ћ-U_UWWyxr /'͆,B 7?ί~x_Q`8o;7+&7b!{q\ȺNh:K5s< >%PV5Ʉ_w[k7 N bs ,wtB]]P%,o }@:zq҉{ .:^Zy Op&MSð3/?zK>1=>XqhXp'^_|2@0t4?;h,vi>nl1wWfP,HN#7nFHjQX @Nk[ :A4FA6F*~{۷^Zl>]Rb"Z xW#"!ZF׌%iAl y`'LBDV_gxN^F>([4;2a 4(X5+cPݷ}c{M:ˋE-M8oI\u=V2&=Hck v KQ//7ŊU3խzx{ws=xiܠ諸]@r;@f ,<$Ywϸ "%L-סH6`휟U4@E$`l8vf%@:~8_|6% H Jk'-=(o#6jӽdtNwt!j0uG>hYQh),ݡ]g8wzHb݁HjBkწ:o7 AXX/jmJza'ChSI#%;=$C*߀]j+@b &%lu;SJ<9.EÒaJJdfGkc*c"wF'.t(^gP ,!QxQDTt4Bce-̧Ũў{࿚Ф(,r5 mrUHTPK*tGF-ScgZWdvqM63vWCpkxйkSuHdIimvJȩHzXAz!4BaWC˝#f,8{lʔV&]E2h)J1JҢᝅT|F{Ҏ ok`.ΏjٟqX*03uM8"&X>|db8b۱ Yp=RAȄv&߆3PdC##zb5RB.ŧ^DN_N+D81c||̃Wv!H|KF\`#FR2Y0.=Fd = ?/>щ \;7*1֎MjfLTt:']KeDZ[ ځ_wD6􋖖 ~ `0n)@,["+YYj/+~ 4_<Ηb_[5 6tN} /no¾oi ~3'%ޠߨ5v-i!}~qܩ[\_ vv [̏R8F{u\5e:o~_ W}~+DNGCYs`5βqg55ݏۛ+`x@v~ݿ` ˟ʚc?o>c@7:\0]G?ꮡ);@?:+2Xz/+~KVɜk;'dszA !Es-C|qNQ rR(nDo&-?7ޒHQUt+# FV?[s@!jrOt8 ݱT.t:ٽRcr J=b O f5$3 */U QS#=ҁ?%/}m( 1%JdE1 w(vs4E2rvj)"G oIB5\;sik٠l/a25πI;- &rbʣ}@TEM2*~G+Žǻ8#׬Ft7&{{J{oVJ\pIC F٦L}[uƜm/@vV6)q2u(L!rq:~j RfV9C;\&:96ߟȐH$9<ӄ;rs09~|cK\M7={M76כnw|W~psPcݯI8=cTp a!J1?q1fBURz{7eXz|cϢ;9pEfX."MZf-N72B[bm*p|'/m!;Vul;V]&H{Ǫ˄Xujs]ԭZՕNUݯrW᪆tOK"# ;\($C~(WVŜ$7s=KHC:H/I\*?RKn0K|K<!]8ZNIW j1дǬWm98rtֵ4\SÚr,LVO@u{7ҭ*(quEVREh+w1ϧ%uڃw'=瘁!!ٝy-Z7y<ԴrB. `,K0K_H 'V:rW ca> B^0e$/%M+*o}F :rjp-%.5^>Ge?P7ktB,]VCYcÂߒ$)٢*!5p%(•ZZR WQ•p%;C-\ɒ@LRV@_c>jE\V wgx[Pl2k}z <37`;o2of˝#H.)X.9%ʨl1%|l1Ŷ)[L1mS,æl1Ů)[,sPQ\׎ޑS2]u|Uxe6_'ۗ%cB +s ՕU槸lKGHGč1m{vdw;6Զ̳arn,yQϞѺGh螶\u(pvvM.Giձw׶{Zf-XP^6sԋKY[ HW~ޑQ~`O23gomgͽ;}BC KߖOjC7nLVeA@FSrR8!Ro-YP `JÜpXusu llIujuֱ#@#)8tJ9:ls[NokqcQyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Struck String Big Reverb 2.xmz000066400000000000000000000075501506652756400274530ustar00rootroot00000000000000][wH~ϯ`y`0pN9w|ɼ5jR_[ ћ-U_UWUyxr /'͆/7?ί~x_Qgh۳om+7SەWBM/oJ&~VEl=߸6^ڿ_Md y7l"dž,o_hA\و |4%ͱVwrmڽ%7&n"vBQnVT#DY}tu]@Nö}Cq6TTW޲dwA͗5Ku;IKx0LLGw'+}: }ex{}1' tk vRACZ/jEn͇׍5 qiAD (9B+ >IL6kbl~MZ\,;'ֽ'8[YCl'|e-BECY׬T B`<ҲyB`qQi}>>ZOl k ڝJ$\<#bϓ 7v(Y`b>"Z\HցLVa`Ł\ ͅ\Av16ӏIa=<fhgVhbD7?i$s|)R[:Pk:X^ jiA|RΓ&mu.Ј,Ym\ H\NpjUFe$:$o0t@fGzx@+QYXFfvlg\2i] !. I98Ѥpo+߉"(QΗx44܍$sg*" -mr0CDϠ \86 ϱ"̃"Z<K>mb*Cg͐gϤ5T@KVh\8t–/GpQr@IGq0{ˀD:Kgkx#vht&PbrpxV*I0"cPh6<%@I~8_|6i% F JZm=o-;eOt U';\AxIxцHՄ@3XFv;s$ @EjB]k,:o@7 A,C5W>%b!s$Ν!vo@.I4Ck[(=%V6wxK2ϤO(4bIS}'"YۈDeRULEb/?pqΗxΠXBW <*c@'hF]1ZbOQu=5IC' |_k1 u@媰ضBp]); 0j^[F|wuLffz(PA KЦ 6UTyQ$`Ux::L5hGZ$ W:aLy`:92ahG^$F!yJ$Fib1hJ1JBҦᓅPJ>& J L*)%*f:ƭa@m̊o-GQ#+0lɱlkIqX% ہpg^~&N;E gLޞBmvYݴdp!hՈq9>K1=˝TڸY)s!%IF6uϙ,!daĜ R@fJ.v dS\b.)Pq~s.XCO$c$\iw\=LN"ߘ!VpKӍ4T" t=x²ź<~M1l0'c}c ǐ$'!'$o 󰄪0ƐE7vr,^Ksib85kqos\R$NѣCvCqYQnh$qrH/w dY[(X=%]Ω2T{K GSouZS/{FW/ÚziZ8S[u=S̫ÖnWGCM-tUըD|:QRW]xwۣxp \9{4sU\+fRZȩo ׃l鯅K$K!*D%/҅)#,$$M|),Z8{kt Y /ȅ[$זoC7BO0͚]FE V=^VHmYcaV:-#Aߚ#:{aRS+WbjJXK\ L+%r%E\I Q+W3ʕ4 D$tTE4V _De0;{:}o ҇`{?0p4v8g~~:ush $Y=ez  z!N2*[Mq*[MmVSTͦl5E)[MkVˌ> wC(#wL`W_ZƗ.GR&J AӅU֧nK:G@ăOHDuTEۧy$ H鵡?eE{LŬc`;r}˙;}iTR˫pQ6է)EW>^ATjԌw4:r/jo/w03_d@ot7Ej LG)glYpv[z$Gh0ΓZрͲGem.ӘUksGcD?0єF\ #}3W [N0A7';Fw|@wv1{NRZwlu.Q_u盇~viJg|kgà] /T%IW&L>y4ҍ߅ǓfO'! N@kvxlDWt;=Gv8ތ<N/dO)l$]/eD,&^f͂F-yM@9Ƕ)`P-HD\؀lu3=%+aW 4O.t͙Wt@.V 3yOrbob:^k@5a:Z|e?1Epݚowl {jAv0eItBŢX ]801@9X@|b~@}F\n.ŵBb45f,(YG!u| $ 6~𠬱96&VP\E4`8, a@"Cb8+h'懎YT\erjՑ*%еtibh-C 2U > RA2oZz`0fĺ(dd!'_IkMi8]pCL=5ebQ-`c8ta(D_.R8d,!k,b'SP sR'Ҩ/řZd6De#:S/'hgɅHj1PVTXѶrSR5 M82Uc8BU1SI~ȋ[~7/ҙa*;Jp!4ۖG&\`2=^]]vp,lq q,xT y0 SOn PRGg3R3OF?F[ !RYL,xIu'>B+uuGD\L hpVNwx1CJrD;p(m< !ҡpYsd̪޳x=ң:4 Q![iEvzXvU˰&3$24Dm.itDNnHBl@k~M.zK@YK,zyg}LuBC.7~%#YrA;g-l kc{TB0%7I N\gu&sr}̶Ӟ`L_JZEpR.f`aZ b(S0\&FuF5jה)}TjN$"M?UL^PS\TTT4iEmyxu;\zM՜PR6Yl{;8;nTN >)yˮZj^>\L% ֑W/yёЇ 5 GxCo>g|C׿=ccDĤ:َF U.(k"p]srjGZEOo?*0$`tMDAyŘOy{p~k`zbnԾut?"&ʁK岩ZAy_g4gI ]RV)^"EҒ,io,Ҍ`3<ؑx-x(s>JiRrtpmvtTP]:t}LE|W| frɒ03ZBBzZDB=\kMV TnaMV)Tn#MVܪ4[UrUUyhv-8"ӫy2ڈ #kxkEJP{gꝉV=^"6jyrn{K}M4?%(w/ؿ~9ӿQdw:WYO:Q,Ͻh1"F]C׽Ou7COh߿xΊpHb(,dwL\mwؽU=M4~**8-{2aZ$E8Ka-rdCx^QH5t Ӽjjqp_t$ުTX4c)lEF#yOX-̩X}, (Im5NrPn2ʧsM Ȳb/ey,\0^bZ9),oYY^/Afp%s̠I=L4F:>q?DpfI'2S˥-m8 գ^X ExY:>!:<ƲñCq(y;+a5j1 OM4  qAf~%'h$0w-9Mx6,J5'4EI:M5tRuo0| + >X!"@{GV͜U_;_Lyܧ/qX䚚T*"$t|ht^k&u"-m4kk{MGއ(qdyu.TubǪ_/ok0CHBs&0JBIs rRIlrȺ]= :9i4y8&|8[j;I;GꣁΫ%w" rs,M:p0Fpu-,\O|g(FMeFTe/Њd3J"h|ֺwEa6@|# : сYmb&|fKjfKj8V:zz[q:hrRyl<]t,dϓQ3ſ/vk| DA(l6˿ig}~ˍ0>_( [Q x)mI͡X I&.+(ZM1{Mq#HyկwUX':r#lMt;-MO#S7R"ߓzP ؒE_ .0~H]aVqw II_?zY[@ P3PO!IY{ghʆE93Nފ2p(;cjuows vnbyd_A^Pm sTW`;R|;$$ϴ:o`7kW;1ad#ځ__ p GhvN>o>+12?v..:=XPqpYh2(b>͒"jFkZ8D'q R 4\k`?w]}w`zso$ۄц<:ʣ9r2Yzq $K uI0g0I' ^V`0mV?60ysڼA s.;1jxd x /gk嘆91Rp^!Ej3gK7tGtvhRHI ڼ@/Lb D f;7m'PE w6,lţUP͓3"JIzcgJ';j 7}ϋ|.o^G)O.ώ}g :qFSԦ ԟEygQ6J*mD}/skyl<xہqh@Q;'\C:B-c)л.O9;dw'(\BJ!|=Nz/.蝯eld + bB:(fлy̫a `9}}u0݁s$Fp>1}Cп? <@_##Lj#4F5Eɇ "VZd"Hd . T#RuKc3K D>vՀ}] R!χ 5j}Bng%}G W=#wc.3 X5ز&q b(AFsIZ\Ȳc WM>lq}-~+#<$.6ƍ579R{gh&mʽ2eÉڔzp dJ3zhq}-H ڔzN|mJ=G~z \9 f;~PW86LwnJ:fT\Hbi##SAuLn^]C-ÃJ|y>R n|079l@*ʘ-ҧi-o2lR[ML0L=W[_qVPWbSGЬXZBP_U?gXZBV_U, bi bi 9||%x҄yy%%׊++e b] bwyb@>&'&K\nM3''1a,1a<8%8#t&<܂0NpPSƉ?xf00NzPSCWĔA SSʤ't$ ܑ<Rf=ڔ]mfNݫ1 0SM{nQOmes}F{B;NQ>;mgWSn!/ F/{Bf ?17mH<'fMjG( 濜pLrNp,~_m.81tNp'z qӆkCn.(CL&MYb¢3_P!'aG.(sS^wJvK%G-$ΓS^KCS^MCSmC8<ǓL6,9dh <0|E\lj)Q7vNNޚ24MIG'b~$ױ?xlCy\O:2 _yYvJ5 ]DF b<9u F'Aru~;;ڎH J#RrFxނm%ȹCpYQ\ڳ.8dWE* +xLxr"'dlFndp NZ :9@5u _nl*t wޱBd)k^濛p9&TvOIq K`/Lh@M6v椏&PMTH)4ފרBI=7W}3T`D"  -]^3B~yNESYBc&3!cSH"B DX=vNk<5eT fx34&x5k)^)OMųXDx> )^fޡ zm~'PAcS7k<5k<6֡ Vk)^A .Cؠqz9ƫ;Td -;T`᜻u|L ^;9,T76ekNd o 8?U|Ǜc:BחY5* MXnP6.!c ~SP~d$[s2:Pzc5rBEXF؏،=deq2p876`7zl:TD-#N,HC @XrcSo;UwTȀW#TȠÞJ}jzuYs*d&{Pe @֩ ughWabl[e 1}QzUU2 ]H,jE-+*[0d9Z4{Tm"*ifZ׭+2y f'wO5uUJ˸8!-bwO3(- KObʴU_$^e J^,3E%ThHS?ܿJbZ9+94 ! Ή"D epYKƠr [OB E Xc0D7-1JAH~?>[K2wF#e#~&^년Meu%[\Bce!l؃/xr6~X+ӀBM"n̫fJC'@2[6B;3wtVF#Ƴ҃tu#6PST謌G:uȬTG:Y_ѹV5P&qҭ.f~WpZ,es \.:;ђN'q]Eg'hNԔGؔzٔNՔNՔ%TmLHp (j GܔiPTrn&&($B(ZDEkO{`0N[3횉$IDDEE҈"#EF"E!jg#I!|8*?1pyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Synth Piano Reverb.xmz000066400000000000000000000055421506652756400263000ustar00rootroot00000000000000\[S~_ِa+ 6u auc+;.O;Ke 5͘H}|<(v[QC};p\[~yŧ].Ɲ^,v}vĂrqABg_>L.٤Vl[XOwl~;ZNfS_hEd^Ƿ[ntɆb"Ww;=̿cr7n|c ٺKSLTI qIH#qO*]-8ѩ4J-- vj._ΜZ$S<loG6wJ⍻݊'~\gttmit/d~vut N6??Hh܁/ <*HQb!Q <Ůش!ؠF8BԷVɂpG/XYY>%Mv>7`ZFlt{9_jDYYd scO2;Ͳ:ߺGiVV%XQԇjq^>*(PI,_E$3Hd?{]H#N 1QQ QaώĆbjc@-2]dyU:QO$O4@P67r? ;gOcVHKl:bpȴ/cnNߐW, ?^iĀ[{"cn*1mPǣbNh=hpZ8͌ñyJisP%*~~V7ײ~ogl"m/HEba^a* cZO]uFƅ͡e܂%CF;A8%8 A_܏esA/O9 &BMK㽳>V;"( DezsAG0(buJd _N+F: K h?a#aNЁZW%0)2|Q[ ~i0fN>u*~A? (tZ$,;/l>&ϓ^Qf7=tjV57ΐͥ GUQz#fmU0D2{-t:*й#^W2ɇ[⩸bA:%0:7=qYDNDNpNDNt~0LHTkhkd rRA\le:./K n߮f^V9r?*R WXlnnCŒyCGV=pXx*&0R1I90?Bqr[veÝz]G%!ZLgIf RK0f%5ܙ7Xeo[ِgs JOZ~xJ6.|Ύ:z!!?] LoS428CU.{s~Q}V`QUPQTu*sSen]̍G$:DbYt(] &*}bkZJBכ^v-8c|Su/1|9h )N_e ߀ <5|l&SQǮ͵lyi^qB02Gn.,{2##|LVǧEm>%,ji]/O|yMiʧou*[O|jgl1EhjߘmGZr{K-Z6,@& JF5U'հt!b{i|ԭI"H&6 eb3F&6 Pdb3 y#5#|-ńBF}-CńAHO #&f0#}UOm.MJ#(2?:ZG,M+GG9 t<2AnW1IJFVyx*׀o=;6Jqn737ð'u,0ub]j1 r>a`WL1L쌌RYɪ0ӼԶVrm i-Z~ƶV=nkՓV=ikUxZ8'm O[jldՊYxA*=K\Gx5̪@U9g]mح{jWZ\( ]Y;N;iGy6OS'?-Lyoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/Synth.xmz000066400000000000000000000102441506652756400240360ustar00rootroot00000000000000][s8~_CLNO1 ImI<6M~d],[ѧsӻ~_.j:rP4I}wu6<|z{xssxU~:w"IOpx֮͢_ ·b8VڽE-Iw?ɝ4-6nĿ}7]'8ִ`)rZNk $n]k7dYaR@?@?85}@u,(㥕7T]0iTG vF{T[p`'+c^ڟ=/[ƫp2.ykNj fҟ|hEr4_7ޢ6f@&5Y ďkZV B'Y[ :AKSh_cUCf!0P9"<}w'O0ek"C;__RGG Gv6Z0;MYlQxs CX>[-J~*[S(4Q+F޻;Ĩ{Mxcs|ˍxD쵊2i6 %\ L"XjKs1OF Et[mqۅ,إT%yX2$] WNF4K|l@zs@v/&+MXbfI`vg%*2흝/pTOYH/wj&޹r~xqDgն``m- ! &`)yeSw텳hqޮJJ;|u r8 |N#{w 2&N29oy3 ߋ2Od~ԂiϝqL?~F@l]gr+4.` n6 KNλpÊFZ݉qb:yL`goZF8: @6p1q/<rwc(L:Йq\ ǧKޝDxxpyAAuPZpH hq;{┘SȡFE^67XjMSX7Uֈga4L.تXlF͇٬)ƥT Pl LyFqB%m66S=U.ș|U|~-t%l>X!W'E}zQNMy@?qNfӜklA$wl[5Xp]ltخayĵت]}OlW dϗ4!σ QW*Z=:Bη2+)Fo%< G#oG~ yfal5PH;VmgvAӮj+޵ڊy;6ɮU Nž; y*oV$P ?sb< !Ms\]QsI+ :#Am$eLq #N:Kj BAUȗ]@bE"7Jt6`U<_8b!pe"4'F=3 Sv`FFm/#&Gx^B,}ԋ'f;ni(u6p[EEngq驚P9S.Ź$bX)sVQ~v~tFӤ%iklbi Bi!jU.Ni=kUV]J|s-0 v(|ps80l8.J\)P hEe\uX0 vq G,~~]*NA)@. @I۵MX%JLΞ5Lfe{lyOWnUE~O奬%fF%+J̅&:CBJ6saǔАM!=&t V u9g 2,V ܅' ]ؐ[b^*waNÂ܅VhJM|hWZ%Vꚡ[ީV9UbQiQIqpz/&.9m{e '>O,ʉwOXcbqp .`o4]2DzݵZyx <]yȜ6BZ|:`Ft4$eet)K)K)׶tʵ4p4rm+Moi:8Ƹ򙢇-3[-Zq͸?8 uo؂+) DVQV 63tDQ^9"f3/>?kx yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/bent_synth.xmz000066400000000000000000000063441506652756400251140ustar00rootroot00000000000000\msH_=cW%l\/}`kﯿifzF^=/=O?uG/GwﻟO~x?.7w~;Q>G]dR]r~]& Av/0;?,s*-$"䞛eӥ*[v_j$W$ Ƌuc@[h+6͓ (X*W`|KT rQ%mMɭk.e6N#i{7ڄd8V`q>ʥc' +`+&ձ.#~('Uo6(v5ب+A`Q%/~U8Ҩe寁hG K!bB薯ˆ3~0n-N R,BXq]ϳT~2mMRcSG5~e!̎bK^+"Ac(+{ose(.'5{8"l/޷26/=, N/'vW]Lnl4\\jPTX1ȋ@ $Ry *9RI;4 oFOëvcOyJmbK{Uԕx'%'52hX`EiZ=ϰT>K_`FA΃;%,`__*JJ- Uķ٤FGW  S^yxD(]_2`$T?Kc=HϬ%o5' 7ÛYy2O+6Ƿ8i1ҐA ^~\kٔ{֓^iDIh_Ngg}84ߐg?!+eVW!}Wi x". ]aڥV_0H a%=3޽~4.pHP-E1N3wЍG <8e{ynE0Bm,bJHĞ?m!oHqLWV`$#,dXqN_XĖ(gl^ ]@reo =VVf0*T-1d)s3wJȈ!˒]~Qp@hDDء0ssFFM8Ylj=2"I :9969Qg'̔G]Ϝqh3,*ݚ"^In1y(YBɓ uFs ?F30`#9'F>=gy;lùs8?t=Qή"̀*ԓ}(kPp𶍸ڊ'AljMC-MhPCfK!gSCd&Z!"Yg-E-Z7HN5fau=mjZ93ZSUH ljB肠nnlfu zmU`$kuoȞH+0h Ь}z@OD/:}Hf# * V^!Řo=Ua(#z[M]+cS{#(M@FW>EO' >nsfy;R'¸a{ mޥn rުUPEwnV_䊾*A(2e7Ԋ4A] %YӐ-tuކQ]뜞֋ƅ(J"iDVq-y%e&EzM嗗*^,h QW@$Nfi]E7y|a&+unmlM XI6I h7,h0f~ =[kr}Pl`>A1(4īO,ZY^DBȲxfόGIڢ"P}z_P 2ߔ/L\UQCQ٦r(uPD^W EuPD^W Q!UC0[W c^KWDJq!4 VbjkxWFݣMdy*r&8=J^cr#UBChCh"!4ZZZZPGΡ(5\d;m9V3, _8CK_8 D !_1.hpJ,ؗ`aF =FiJ g%m;4US5/u5Msяߴ.zZ6^sDozzhZ5i5SkMS5pPTn }GmmeMWOmtD[=eݦTc爀ED1qƞ{K ;%|I=DmTe='j\#NԱΈ:BU2T{fTSUܹ->! {Z{>ܹD-UCmyΩZhNڀ5O)`x >bj %űR$KT%A|j%BAHiI=*(weKvmSlS+jvky j>!vz-9hiAK{Bb[=[ҞLkb =[uƅU>\}#vjz#; 'T ilklO~/2 Z=^yoshimi-2.3.5.1/doc/examples/Original Zyn Patchsets/photons.xmz000066400000000000000000000136671506652756400244370ustar00rootroot00000000000000]]SҾ_~68 !ڝS9jd^l nbg۶eKj}2 0$Ro<uG:4ïOu6>|2:S4_|/>~TiC$'GP?ۑex3MF7d"o~~]x7cw&n VnfDi u>2oJ^MH(ݗ&w$=_?E}i@?5o%x_\~w]{:$;ݻ8QV] |=AҮ\]ތ'%$Svi'o\d/)<`sբiDqA͒U*y_] @*tѣHcjE֛uTʠѠFקx5 |灷j,v3&hT, JTjy8{ kBCl ZI07Kc0b3vbǮDYfd[,aav&<L6`sO{jd%jG jYb=b ߌI@W2Z0Dŏ_`t}lA־#@Fm\:/~҇u>cR,KpsUKonrrVKxV~ʇ+q:| <0,bin~kE5*? vZ4&JM5jY8vh*sbޤM 2.3d(4f H5= b̉1#[7[]J\EVs|q:2.?Qa뱦*XǑMuqgiHMOEUFl49O(,rk>/|ւJG ^g.WZӋ4@J{wʦfDW*S 8_7ǵ 1U5i? HWݬZ[[E*z/_CB ]s)BR 24Z,܈~–顇Cs,0+]\8[a ,_Wee9ĸ\YijM"Be*nQģ*#]li<62X76,bX2.+׶|5cI:MrXor1700ldWYZ c,0}3%>I׺`AINN%k8|0q]ku uq]a~qݗ1_)m4 =tj_ ^XkZF vUY{Ϫ}Ҡvf!!`Kp%yP4Fz7Z6=0KMD֬eq6kDZ.΅uo3,O>C~Q6U@zwBtHK1FI <|y!.\%%1yfQވb.ox$ 4!pj(nB$o;ϻo+&CITuyjEVZ$H.JbaGfPKh޳Jb/$=Pr˨P`2Qf=h:YLmT>DV %^FdM Afц$ #}F6lJPԑY!?_OnƗ5 csP|mR $,J C}b+n AY{U;ȶWRvջ )k0qLPA)SYDKQ]eJ22]ӂH%3 BiqΔLj>}fүݯ¿R%7|J R`<)uܨJ'O *$IXrSH%GɨE"(*z+2SKsPDg b *be "ңZz8A-E9;H&EJA!H{(R`3K|)0`0a)Rd"A|,CJ7pRDYS)jFb8ztoMAYzw(F(ٳVwZzeJ~ =MJ[^@95lQO S$HFy lL@a2Jm;-o|1$5jYD8±Qe]yE0ɬì8f㑐saoRs FmwuBϓlؓ>O 3 #fKYʢK;DuO@g*"g->bJ(\_7Xg9T̳ZdScɻ2z˹Y˃%˹8BFo97?("S@(,g|y4$Rߟ܈; j\(~Y!BĴ6%|{_-f~Lگ~}֕G񭍿ƻ_{?zI6|5EY7M&Dbm2$ }.5Țl"f-Y˖7'CL-o?%7I8uXo梁hTWk[АZ5ŷV[oM U/%?2 v~1rPke5Gw:ʗ^*ٟ,ndv-%^KPF񚀾sDh&ܔ2witRἭUmAP1X58ÿGH՗ˋ׳Q Kpt%4){L3rrAZcyK R HI-hG(qJV?VՏSTd_zvQ<Yҵڤkxe0t ՟H)>RylU5`ulΟaѧ^<+ףOn`Iׄ:J֑Y5lpf=5Y:pYN%K(tGx[-d^^k#Yt͒M]`gqR-\ &۷Opl@$[у{QV zçQ}R}Tʵ-vog<^z{ˠcxqfv&xcJoi߉zp(nr pw"T V{*&TVe#NXb \քWzLnOs= kE8=Q 2kR!Y\E`L[<;>IK6'KdW5MLkG,X[\ғZz$P~ASX-nBiDS`(nNImfx5cI#K/8Nu M"Dl"BUg^LFWBz MD m"f-?ҫA dR\+ƅCݭB ̵ KZ5d`/ZD2G~Lf#r5$Y{U;8ɬ x }i-\Q%!R-Gq\zz #lJ˛&ེm[pz,= Wc&nȭɓ73@-"wmW;?l}ק*pGDP֢  S*"_{@@Y0Z93΍ =nsfHq gĢx5 |yw7Xre(䒩_ Uw-@" z!sx6'q}+IQ@ 3=d FP{zk̀B# QSYzJSCȭ ~&.5+J%H3]DFFE}GJX;?P I[a| '5 z#W>wniT6&s,-b zAK<.دu~k䥉x23 Cm)Qe=d(rĩ,pAIΑ4NN&fKe Z\U}$iMIs{πc &޵@X3H][b{XwֲqΡ=X*$4MtI> HlNד%&v&YN[sD>@ՖCX ֖gZⰌaD*P&ɋs\!VW %$VVқ"X'=&f_S]2&q뚘_ Py+94o@dzF=d6c"hfވF1}k rY+㢘IbI&$/BZcI~ՊٕTkjT+'eiV+֝ZHX&F~:)=˯W#B^2<yoshimi-2.3.5.1/doc/examples/Out_There.mid000066400000000000000000000226251506652756400203440ustar00rootroot00000000000000MThdMTrk%Q XHOAO@O@$Q?;OFL@L@Q@Q@H@H@L@AO@O@}H:.L@L@dE2!C0$E@E@ @C@C@yC2D@@@@Q<=FC@C@H@H@C!!H(gLO2$0$7 4"XC@C@<@<@%L@L@-H@H@O@O@ 7@7@$7$B<0@0@,>@@@@m7@7@k4@4@<2>@>@ <@<@h< 59+)= <@<@c5@?9D 5@5@9@9@ <=c<@<@VAG"@/A@A@p>%*@@@@<$R>@>@><@<@a<*)>2<@<@Z5@5@I9@9@#<%k74>@>@72F<@<@ )@)@!$G7@7@L:@@@@"<@>@7<@<@7;~7@7@]<6I0TG@G@ C@C@@>@ACLG@G@+G(>1C@C@1G@G@:2@2@M;@;@7@7@>CAE>@>@0)51 9'Q+@+@)FkC@C@AG.EFA@A@ ^ C@C@G@G@ CR9>@>@IGLC@C@E=1G@G@i;@;@2@2@CL 7@7@E@E@H0 9 5!1AF!C@C@&@&@)L@L)A@A@AI@@@@A@A@>(`@=!>@>@#$Y6 <@<@,@A!>@>@N0@0@-5@5@%9@9@$<@)@@@@Z04!7UCL=<@<@4@I^C@C@>8@@@@6<2 >@>@G+L $@$@57LS<@<@|7@7@);I#0@0@4@4@27@7@(;@;@B>8y2 !;71>@>@vA2CF-A@A@C(tC@C@ C/yC@C@1;@;@^C@C@AC7 7@7@ 2@2@P+@+@>C@C@2 7; &@V C/-CGXGT C@C@sETe>TG@G@ C@C@RE@E@CKjGIZGG>@>@2C@C@CLG@G@{JRG@G@0G(>1C@C@1G@G@92@2@N;@;@J@J@7@7@JD9CAF>@>@0)51 9'Q&@V@&@V@)F1T7L\!J@J@C@C@AG/EFA@A@L@L@JK ^ C@C@G@G@fJLH@H@CR9>@>@IJLC@C@G=1J@J@i;@;@ 2@2@CL 7@7@G@G@H0 9 J@J@5!2EF!C@C@YJb)&@&@)LGL)E@E@{GOJ@J@CIG@G@{S@S@Q!-EF!G@G@FC@C@A(#CCE@E@!@= A@A@#$Y6<@<@-@A!>@>@N0@0@-5@5@%9@9@$<@)@@@@Z04!7RCD E@E@wCL><@<@4@I]C@C@C@C@vQ@Q@1Os>8@@@@FCCp<2 >@>@7$B+L $@$@c@(}<@<@o0@0@4@4@GF.7@7@C@C@7J?G@G@A7@7@22 !;707;: @@@@M:>J@J@M@M@wO6[O@O@Y;@;@ 7@7@ 2@2@%7@7@(>@>@;@;@O@O@?+@+@+D79JFj;;]>= G9J@J@iC5:7@7@C@C@;@;@7%>@>@C0b;(z><G@G@RC=-JQ!7@7@Z;@;@C@C@>@>@)K%5HH7 +@+@C@C@1J@J@9=)<:1E2,A=5@5@9@9@ 5IA@A@A<<@<@)E@E@H@H@#9B9@IL<ABkJ@J@]E( MU9@9@zL@L@>@>@A@A@E@E@9BE<M@M@<>?MACMUAE+>9@9@E>@>@A@A@)@)@1$CLK72E@E@E@E@M@M@<@V@<HG^L@L@kC(57@7@<@<@7FC@C@CE$@$@(F@@@@%H@H@(<9e@3iC;>7@7@R(@(@$A5C@C@<@<@9+@@@@ HPC@C@I%=G@G@wC0QC$6J@J@G(a7@7@n;@;@.+@+@1>@>@9+DC@C@C@C@v79JNzG@G@k;;YC7>+G*>=GGJ@J@1C@C@>@>@G@G@0C597@7@C@C@;@;@7%>@>@C@a;(>CG21G@G@><C@C@G@G@ >@>@C@C@ C=-JD%7@7@Z;@;@C@C@>@>@)K+@+@!5HHX:J@J@9='<:<*A3E5EGNA@A@E@E@ <@<@IH@H@A=5@5@<" E%A0JA@A@E@E@<@<@9@9@%5IA@A@A><@<@%E@E@(9B A@A@1(L A@A@EK9K)A@A@M<< H8 @E-HB@K)E@E@@@@@H@H@r@(E:H E(9@9@)E@E@E@E@ @@@@H@H@[E@E@<@<@9TH(@@@@LFE(@(RE@E@ @@@@ H@H@M<@<@M@@@@BE@E@%O9;25Q@Q@@A C'@G%5C= L<C@C@ G@G@@@@@ O@O@~@C'G+ GG>;@;@~G@G@C@C@;= @@@@ G@ L@L@ C@C@G@G@ @@@@ @;@C6@G=o;@;@ @@@@(@(@BG@G@C@C@9@JH9)<%G@G@>@v>'E*A3QL@ ABA@A@>@>@E@E@ J@J@ > A3E%RE(MMA@A@ 9@9@>@>@E@E@fL@L@>@>@A@A@E@E@9BQ@ M@M@8>?MACOU^Q@Q@gE+=9@9@A>@>@A@A@")@)@1$CLK72E@E@O@O@<@E< @@<C)HGZL@L@-@@@@<@<@C@C@5C(57@7@<@<@7FC@C@CE$@$@(F@@@@%H@H@$<9i@3eC;=7@7@V(@(@ <@<@$A9C@C@<+ @@@@!C@C@HPL@EcC+@H!^C@C@ H@H@(C::HC,H9B<@<@L<H@H@ 7G@@@@ C@C@=H@H@ HF@%L@L@>$@$@+<H@H@@@@@ C@C@)CF-CC%H@H@jH87@7@C@C@w@@@@%+@+@!HKC@C@$? 75(H@H@.<)C'@%q<D@%C$eCBL'%H(AC@C@ @@@@<@<@H@H@FC@C@ 7@7@s<@<@@@@@ C@C@rH@H@!L@L@$@$@k@ <(7(.X3[YMX@X@uX?AY@Y@V8JX@X@@@@@)9C 7@7@T:@(V@V@".]DT@T@B@>Y-@@@@ <@<@X[=5]@]@b[@[@Z2k9@9@ >@>@B@B@9Z@Z@nZ<<9@9@Z@Z@5<*9AB@B@>@>@)1Y@A< 9C&@&@6:@9@9@ :>2A#YA )?<@<@T@T@&V@>@ER@R@aR:$&4)@)@:>5#:@:@JR@R@T"52:,A@A@0V8JT@T@V@V@QRF2:@:@ 5@5@)>@>@kR@R@T6J<&4?7<&@&@75@5@< @:@:@$?V>@>@@T@T@JXDMT?#X@X@kT@T@O@=7@7@%@@@@:<@<@'< A9()4@4@7@7@Q<*5:9@O@O@uT;BQ@Q@c9@9@<@<@A@A@3$@$@kT@T@-2!<@5@<@5@ 9@9@%Q6B4797TI<FQ@Q@9XL!T@T@HH@H@H@-YD>X@X@3XL%Y@Y@ECAV?X@X@PT/>V@V@USE@E@T@T@0HG-@-@(<Q<(S@S@G?bH@H@$G@G@E(<@<@9> @@@@ LK$&;9>%-@-@5 VDY@Y@yL@L@J?V@V@LD X=%J@J@MRL@L@X@X@>Y2=&@&@ >@>@:L:M@M@9@9@M9@9@65@5@N4A5@7C5@L@L@<@HA+@>@>@Y@Y@J[CH@H@5[@[@Y:[Y@Y@J<1X=ZLOQJ@J@OAL@L@7@7@*X@X@<@<@ &:+@+@2@;27=4@4@V;wOE5V@V@"O@O@.S:M@!O@O@ &@&@)XDfM@M@S@S@A$F7@7@7<'@TB452@;@2@;@75<2L<,X@X@rL@L@wT@T@ <@<@7@7@@@@@OVTX(%C(QO@O@5T@T@7@7@ <@<@4@4@9$@$@X@X@>C@C@jE8A>#92ABIE@E@t>"1A@A@B@E>@>@KALV9@9@1A@A@H@@@@6>@>@ 72<*CD@A@A@=C@C@ C7'7@7@=@@@@U<@<@=AP 97>8C@C@A*&%'>,!A@A@n9@9@NA@A@>@>@0>@>@AI A+:5>@JA@A@eA@A@%:@:@<>@>@B7+@ @>@5&@&@$.j<5.@@@@e7@7@R@@@@ <@<@{<@<@r$@$@4AQ&3 A+9L>C VGVY?V@V@ EQA@A@)E@E@XL=FR Y@Y@cEA!F@F@kV@>@$;&@&@)P)@G9F @$<5A@A@6(Ek)@)@~O: (@(@ T@T@-K1@@@@^QC$@$@%&< O@O@%-@-@@K%0L<@<@9@9@ @@@@h::>+AUA)@@@@bR)!Q@Q@,)B&@&@F.P 0@0@AA@A@@V8R@R@M>5A>@>@[V@V@>A@A@>@>@:@:@Q-.@.@ZE8A>( 9( )@)@ &FV09-FXJB,Q@Q@!E@E@oH"6J@J@BFEH@H@JELW9@9@1A@A@IF@F@6>@>@~V@V@:T=&@&@ $B72<*-@-@CD @E@E@:C@C@C7'7@7@>@@@@U<@<@f$@$@)<>Q,APT@T@ 97>8 C@C@A*CH,%A@A@o9@9@IA@A@>@>@T%%Q@Q@H@H@EI A+:5><EJA@JE@E@IE@E@wCC%A@A@$:@:@=>@>@T@T@A@RC@C@7+ @ C V!fC@C@>R@R@.]!V@V@EQA@A@wY27E@E@X@!Y@Y@FRoEA%F@F@lV@>@[$B&@&@B@G9F @$<5A@A@(Q<@T@T@rL2%Q@Q@@@@@1L@L@>$@$@$&<9@K1[@[@FQCfO(^Q@Q@<@<@9@9@@@@@@RF O@O@%Y::>+AU A)@@@@E)?-&@&@YA@A@R@R@#V<Y@Y@R>5aY;-V@V@>@>@EA@A@>@>@:@:@`>*7+> ;/A&0Y@Y@IV+:)@)@M+=(>@>@5V@V@:;@;@>@>@7@7@"&@&@=+@+@)<%4"7+$F_,>@@@@m7@7@4@4@^<'>@>@F<@<@.< 59')=<@<@]5@!+@+@"945@5@9@9@<:`<@<@VAG"@/A@A@p>%*@@@@<$R>@>@B<@<@]<*)>2<@<@.5@5@<%:9@9@J>@>@174]7?E<@<@!)@)@!$G"7@7@<>&@*)<@<@<=@@@@92<@<@O7&9@9@X9C%7@7@q759@9@<<7@7@=<@<@E<5/<@<@@3u<8^@@@@CB+9 $@$@F<@<@`@,)C@C@`>:@@@@"<@>@D<@<@5735$- +@+@?<6V7@7@ 0<@<@4@4@0@0@7$@$@f0@0@-4@4@27@7@;$@$@/yoshimi-2.3.5.1/doc/examples/Out_There.txt000066400000000000000000000005151506652756400204040ustar00rootroot00000000000000 Out_There.mid & Out_There.xmz This MIDI file and Yoshimi patch set will play a 5 minute complex 12 part tune. Load the patchset into Yoshimi then, in a terminal window enter: aplaymidi -p yoshimi /usr/local/share/doc/yoshimi/examples/Out_There.mid Depending how Yoshimi was installed, 'examples' may be at a different location. yoshimi-2.3.5.1/doc/examples/Out_There.xmz000066400000000000000000000515341506652756400204120ustar00rootroot00000000000000}[s㶲{~yJlJd3If/_fٞdgh"ZgM . t+V՚XF/~NgY>~Iǃ|om}>;}|<^.?׏dop?'ʧﶺ[/ٸjd1+|I|0Ofɸ9Y~+eُ~Oly`hT>1Rzbo &է3| /'黭:=[|N9,۫t[e?||q|ڿ_\BI2-O0Oy2ZVg5;<œtgcx> fg)Nonҁ]#`PX!y9Ծgk ]5|rmTǗhR|GwG~A no{IKԝO}A~\_^$Uz睨tցtB$Seuʏ 1x?{[x\::}/VW:NG6x9Q~lt%%4׫F?m7U]PܶepɆv]f9oʧ`d<(gE= $UrTD]!L_9_Q> xFϹjR,BN>ʏfYQzscFS=|)Gh!l FtvyuvU^=ߦgPkT/fQ|2>tt;3J`1{|qu9N~9(w.teg3@N :EgٙߥXJg>m!*aF־meHMc~*#GN T]=y O{i_.KB Սiv{wF;{ltz.7ƢSͮaym[V2S('|MZ*4yJ ?rD8S&p:OlLy6L$h,ͧ|pW͞ɧtnHR|7 `*r(qt,nGry'[:K+./?{:TɾkQkUFGH4y2)/.|9\f.m{lkpNN…r$i j25p.7ϪM >}EFVIV<#^N퐦N@J@ܶvN@&7֤v\J!>cʼn8(v({ :Ii?Bv]sb4&L`'U>\}/~ծ_z [ G|13$]O|E]}ʐv5Zs}ZB%ST"?N8yH/<-r4O2fT|OAO0Fa_IE?ICbbyt?{%5_%5p6#fwF`2ۮl=$H:[N LcK!!M)_gefkVE L#:PqфWLfAQq]vCYo ^LڷbKd~JļBjˉC  SYoa8+rRL{XT}p?8qĉ~?vEb;g-7"76*.>Xff7`^h2TDd0Mg8\oݽRa)>:#-"J5-:5Y)k} vC-8g_+NJ ԾюsΆJui;gmr5NJ!xb#"dKxrI.'\!]{;_!i'\νHȗpNLdB]&inBHXv0O$ې]BX>]Nt ;3L jSNCApN[d:)Jqӆ˚l(}!aQ:}gBXe#$l]0J¸]FV0øޔK}q"nm3#/RoDY>HR쵈rgלt -#-T6!kl "C1~)-+-kE"NIP"*PBu'u.QpϦRXOXDDXyWuj*TXfDT\ oP̦BܪQ~57ۺ.͜m~̩H'M]BKcMpnbcM|2Nd`.lo*RP*T jr K*XfVZp!)H ME j|o>=|1*h[TԀbG^;gNX@QDE9uߛ; I]*x&uzUnRpϦ298ڥlx''k]*x *Ոu]*xvǺd-]*xzlTvR6KXK @%T).Ǩ"ޥIԥmKMxBذf rNU,PA2pSu<8]'K2>{VQK*/aB fS>dӥlVc J-8u=`{SKJ9A* U:>#>`+T /-TͱRKEXA kNUIVu8M [թKМO%ش@D̉50VBȑ|PA)-rvW?cK;fL:GEQ J{>=5>0|pc1>faf`'?@V5GGpg6Ћ^"vnYO,ܰvJk a%+Ȑ~S%r:_H^C6}H`J#}"a!}"(ҧЧÿ!Χ2Z~aM p%e~fZ fg?¨/Slôe c.'0  x`35 rP$2x ÎKFr| d$V|YՋ@yon\$ ԭ*ZA]iUEF2sZv_K-} *raMJ[h;.T IEE!\uw<9 - -- -- -ҘZZg[Z$ 00W0tnccPnc-*Ƽ7' +ǏWWT6 Hf0UҠX ߁I%++mayT.$h wER yFFگiڞga~"ffDĴljdrEjG6a( 4:+U$Y>Hb;'"hi8\J3Y"Q }~vuq~rb\@'xt_ o肨.,LuL`FO jI$ʼǷT|77u[m( {Z -lTP ?/ȉeSbʢmT{|:_b6uf88#]J2Ҟ9gTt;̕G,&ii &%%ФL:YgijC$FRVo!ͅh³"זB*{A?CqbfR!Df[Đo֨kʓE$P8ՏCd_;(D>y XMb@ (V lؐ9Q{ȌZYc@ %O{:C Imr 2#퍽!pH=hdF`=y{sO!r蛥Fa^„zf*Y}2#hɪje™R|[#0BFEӒdC21F] )|!L:8V|e^كrJUq}_0RZ cl$W42 JOҼd5'F_kp+ DZ0ZiJqn$fL7_rR%RR3ՏTxOmr6ӏ Bf٤U+Ι]Lr]FK0#rGiZdTkUF;l)z4hTJeLm)u.hYCB+Y@ ?)vhBU3YXh@A-EALuUh vc_fH>ci^E:l gcK\9}VeVϜBUS)\~ ~K:q3^nVA4׃<%bx-hWUͿ.鲤\S$iL"'o{i? 0lX_ d0s {2NѭR[h`ǐneb[e.+K Xlp7 9<^LmFHh- TWo83]a^[.8a8 vV X=< ]N¹,qr()ݦ~0`_6m)zKXyLV/@Xm{ OπSJ `$" Dh,x`uj0`K!cq\<=π! `64x`j6[My`1D0`π=:Uȯπ)^`]Jfq+S˯_gW#2x:^Mrʂ+^'ʼUm3'߀dR"+ZVhI[`ѩR1˱2Rul:3n(c%ld! IuK!OZZڶmY9I:@TB^߬lCFQU&25@TpG뽁=Dۜ %V/iP2L|\gF )|EkG0TkGs⓶=ڭڑXA)gIݦ5]b[ vH JJUitkGq{ Oh%(=ȎvU>!5[e骂!iaǦk@pMWtUwnUbftUhV[&,J֚@CVKCӰو4(! n:d%/8+RI>!IFmtQZ3ŋL na9xe <녧~44fô+)$1@oEBa9C>{I v1< 0sF “o%\r.>`q-cb JT{$5Da+L#dG,j+pԤ*fvn|MR#_n~ԨXjdLJ<ϲ( PL%Dwd8{h:C{8J*SSݱLY'z,5XH0ťOR WKRj^Hjߛlt%5Tvs8$Ji:Tq`U8W,) ƹ5s\YaD<[f% _6 Ղ+ॼRa_Q?|ˇ~IWd}ܨtG4a?>Bȇ5Ϸ,!>W['?`ռ@٨%zTk"pK?x>SC›7VUuwG{=쭵Kŧ$mlOڈ@m `)~V@hRwStKW7/F!3UC{4JHK6Ψs(+s$PkfoBCS]h0&^% UyCNṔ2aOz)sC8i@mI/9K\٠e2U:]T`YPLuYU.򊔹D1j 1ϴJ70e@~ u-;~jvjڒllFS]62B(y| BB^tF(N*٬sZe:cD_^zUw%2l1jnQ(Qu!k<5h͡PgQlPlJh벜t}ѿ{o17qr=@Zl}Ό%b4XB q4NYWyѲU,rɰE`!FrbB!D D.!D !{U`fO7t&p%y2L7G7nt|/:=||q|ڿ_\k htnm2e}@k%ChΆB7?m%zkB8>×{M4G y([ PKm:sg,ud7s&kW>U+2u23yb-"wNƃ̖R}*b&찼gIf_#-W:z5j_|Q5sK?A[ Cנ]מ+Pu6^kLͰD;e|tv&$k,pK%%Z%3![wR- j;=mB&_mB#$ 9Tk:;rƮv^`΄n}MHXUPvOA0QE6!a"d{#$!a=Bª; Iv c3[p t=B8 7'rw$ jUsܝ9 Glul]BXn0A:SΔ3h Aǭ!a*t$ggΠƩ޽u=JMH;u=JqG%aܴTp!38OaߧNI;UاNIM}gB؃n0&K|dNB9wmU;Sm w:v]?!%a܂_YN6wgn?V3'$c;䐐]v)K]0]P)``"wzֱvo Έ;"$ЀM\sJ&hs%aw$q&sQUܶv({#dǸEvG;W;7Jq %!$ *ڡK~ը󒕵gn+(~UM9`ޔQJ6u (R~Q~%bI;<#z#^ F; q+jԥU߸gQw+-\Rzߤӟ5eq6ODY}rNy^E"1&vل7){Prg܈8`hKkvYB، A.C$7+-T(@G9 hb3T8<֊DT@Y5*8W 87aQ 0TP䐛9X[D7ٔ{oJ: !݈ f٨@qS(ndZ*D hZ($`S"2J9&8+TcETبPRK`c_ttHyxis  "܂MD5*f#*ho*j*lPcT+G֜:E9KKF89R̻;T[.9`]*rF1Twm΋ݥ"KE*$5g>c]*rHu{ vAgS{SiP٥BEՈlnFԠt؂̩kvfըkv־RllKjU>j&~%`6n쒱$bfbp;gd{>Ze]UY3(jfd>$U0Z>P!|6Gose_`zf O7G,=?hzb/Onu)LqI] "t^|%,\G 8Y$"zRNFL*yhy[R[R3|xvhxfX@>gx0q9"2IC&Y*X'*Noi[_ SNc῀}ЇZkZ :FBɒyf,;T{bĵAQl:f(F'm y|՗}Z5M^"V&wc,@LG$EjY` w(ސYeX3;xR߹MSA40-}wy2Ee-U-$sX{΋?݋w ݅{*tWwL` +5j*]$6ꤴBc7MG^N_c^9PP'.ҍmԱ^bl)%>ѭ*I؆kZݬ=?[xkb}fpD,-5mE) wIwIjcdeZ()  * (khi}&fm[ uZ:@?p;C@i-Ph"%%<*p~HZvނ3CخێOTM]tnSPC i)e1HuMoh^WE~C  L33ħ㚋OU#H#.4Ds#چu ҰRH4X׹.k ֐f4ljXԹ|H?k:Ld1bw:_kkɏzTՐnCw*jImya!i<qTբ]Qx rC9u&tPUrs婐gy3%ML`iN9pP)t6oB-%E ғB4&QF6Uܣ(~mG^e#CBk8#r4dե3ɥ;҈/:2ڜR9U TgN5w9NVDZ[9 !vJnպPt<% >J϶wp5+EXΐ4>c0f`x%0ctBJ, yzO%:,ٍD#k׷`jAO%yjź#y p#m֣藞KE27&gsOPO ex 3ZcA6eL`m !2s3 f}{FlJ}8udՀH ,*>˲Y?JuFթ\fS oӢ6H#F1uzGd zRkՈV]󓪞e6ģ&p&^hյ@ґ/BW]u]תƖͦk]*]`Z5Z{5Z[ l0`GfS6 ld ߁.#6z)`{|ڿ_f&M] V{: l0`[f,! 8̂n퟽ at$v49@UB Xy(x`6x`>hT @ اgzxG$ kƆܐBC? i/: k0Y; kUZP7'vF.9o1u. $5@# =( t8<_ֆ=t8BVB]:=< >.[GVM Uں/f>@O ^;`r+ty1<&[ p`u췞ƃqB&'&GZ$G R{]fM']>l4S}>vig}SWA~_/5yI@~7lqעFh1rN3,,l0>z &.C̎ȂGwI5CG&x#C"?:W&T/eK,Ǫ16op{h'F< 2L狱,,e?jF'0{MVƵNjAS#TqYOCACʧmXa+-8L?8di1jZJ2_ޟ]]/t̟ ht_A+JO`w~OpNB 8@LҮSNojRxk$}F*hRҞf)^d֌L>R܇>6Cr<',I8~$Pg%3MH;0$>wN6.$N&]^AFZZD!],m(mtv;S[:o5eɸvZS[|pM\xNpO^|dڐQO{{;4& C~o 'Kws B7)X81rB6Q|+6ȋ<Ja1\J`冽2 Ah_$.(N`G F s&81X[?T?Ikh!NJ5VsW20E2f$ɩw"ƇG/RcTEXWs8"p|"{ǣ]X=Cas !) ^~f4ҺXE:Na:JH4DT53=1^SD PVx_ PNe8W !n)$)^5^NQ^YnC_tm.ڬz/'Wz\ui~9)E"HAׯk ;2ajPږt K( "׻=f[U f}R/0N8'x 8 ﶒa2g``Q`,.H4%,)%i~+.Wp 2=*3%&^ЫI8׋zNf%g5c=jT:Xnnn7pf!(RCMRɛsM:dwRìpW^ߧD{5tM(\Eca >xۇ^gWp5:̆^2G%~C{ɮuPua iqGVӲt~>>eCS(= /6="$P-IxZ\ZФ0=F8[Um.=AHhû$)eks/6!&+ejՇ*@Lu}EO=0շljݦ,J*!]*#WzKC -2KFD\AE RZ*DYUX UlAuZwL[c&Jk ۞ m;HCY .V& ,DwyֹPN*O݋%Y8 KқRMmk5jŽk+WnT[Hc7C.INXy:PzG7Qq^+H*HG*`M'9eJģ)GBBsCL~Eкq*h~~E(R1F;Zb1@zM IEzb %qk{]>{ QDGE=T=6Ũ \bTä"P(ѧ3`R:[̧o9P4T &cm49BFn5aXjV[IK2wVK_(GY ml#CJvHR?DWGCaWG' #,+C+fGoW`}WF3Gwv^tB9xANCL$F@$sFoZizG0xPZ058ƬRk;(pj[1\r+_s)puv R til`$̋d2LCΌH3vk:o%\{1`;osE|3XMKG#¸d٫ڿJė]ʫtk7_CjF6 rU"Z^%^+؉yđPpQG @d76Ec&3s4l[!4 @3J !:jG> pF)zMl&2v/r|ho >hJhO |ué{t:̚0 ZZpI֐Xn+*p}5J ɽIE-?du!Q$SVZ*g:$!vކCqG6NC,8xQ/~Q`04MPA)17$&-nI@Z{*`?>(`U3G :$[U4JYHIS( b^ e `Mg ƳgX~TN- L{Ki𘖋z;3;r d|+E+ro)([,|i,}+vgW''PkI[`sgAp&N:$~t5܍e-JtZBX+i& i:Y/fQ|5INO;b ΃f&TuKt}{4mG. qzsw K+?[<]7Aa>,W7cIȯnze{ΛU$DlxyV1j =2,Cm <ȌOɎMpkŽmͭsA3v) glvM ?yd>mcdpL.$* LEdحI EZj (ZlvWAi,=pPB ֏Z Un Ru`i7rB@dxM6'_A?w[jvűMp Gr>yo;{3,i.`{<%\`1JfrQ@$"@,\t˜6εm3O|"ΘŞ<зZqI\_ףx.]T! 䰼OŐ!KBO0Ac<>Ź1$0A |12A+ݴ!i:+JwlhfՎv1Aw `@mmq+U̜,hERRazM*ӬUKwpS_f:d2g#s+bmZXO4r5ς~fGZZRIo456Ђ4|P(h@sRt hS hڂE h58r! tE!o+R z@hE &vZ{`]}&v։)?z̬3CQϓ(=5]j"p@a,F)ؗTWV}C|$OΑ!(5FOWR0ˁ)^27trW Y{aͺBpiW<44w쬦c 5K)5Jӊ2|#*@ . qE, I_"`0h'5o=ϠT( Q։"N2۶SQá拹FdfDT\MA~kOU>,E x.MGqm;KFUUFq4螦4*VwTN5/hoGDj=@rH.\ԲkT~}FR[_rLQ>0QgZnI>5[r&\oxQvGF("YlȲfŲ-|<hx*.GCCN: U#uӭ_FoCn'v G$:{ѳ_ϧb"PH7frDe&` xGHy+|G+6zld;W+]^qmY K]Ad t_"[lvcd]\`/'KpMDXQ$9 #i=̵vT Nx|^"ﮇ/<lJqr]*b%`&;DaQ%ݦi:OD>`!nցb%8{*f!GfM&, Ӕ k%'NZhe^vlU m<};";1'J+*_i23ZTRq }6NReeJXYbڀ;'I_mb 3WXn D}@]@Ϊ€;-Mk c[Z( g7ٷt4lA4(Ý fW. ២Lrd1ba.#;L*by2^ WAUs{<} [e^~Q'R-Grn&*t]HyrkQq (fU]xϱ2 u8oF)(hykt9nG-z"x{b@؋8.tr8)x w.v}7{V xE)Cyr2^,5(d-%\ycNH^C! )%gī jDm$XˁOn2 LAY{~C{~C{~C{~C2+?5iqGF-nIH>ǙNy2 n^fe2HeZ-..,eTU;Q.{Dyu EfއPڗlZ~)8Ci9惻dU.`׫OWմ2jɧ(l(\XaHPk׹Ei1\#o E!tQkժe5C\J&&kgcК^7 "X4!UlzP;PT pWq:Y&߂yؕ狈u*!כ*hxux^me&]YR簬j^,TDYJF9¦Dz,o>PdGʈ +43k̆ZdƍG3}>E]RPU@ZWWcm}BdlBO""OjjPP^-W\e ,.c)Ty,Tef^[ |x] OufSWCGQkjTmI7v2#d\lR:M=ѻy*T~kJ :5S^;%TSu4.%MEPʟ7TJG&hGeśzWJG>ݞ=Kh S*o꩔bl꩔>j]Iݢr"/}[^z5E~kRCo{ߕwZ';H+z5ѻJG bDӳ6SO~6g-:zuHTS: 1heI%ݞR(`D:Z[n϶tt{ JG&ä>l$=uXTrU=0z1eJEvITnkMtFա4tk2L)l2\S z;/leI }Q2KH+e#І $ VC}NSY.W`-+Lrm#.hNI8F{nC!q7b8ЙheōchPlu6J* 1L[R1d@BZ$˝ 8jI:2ksOXz@ +cȅZ: +9.Q_PX6٨H+Jɝ~6HV2_ l@ hhGR 䚁\3k۲<į\[^ f`r~o n3 Tk[`×q7ku0[BT@5pꂏFRX]@5Pe,VrgW''}T]5jۯ6";φ|umgHvͳzγk(/ՕyMM݆R]@}PTN5<k$y>|ҧȵث.JJ_CnkWb"XKl4 ŸYJP%+]¢GH3\D"ƞGkۿC;֥qkx+ix+}=ر. ϣnۿ׿r?kZ"Z2"kzC33Drцff:O =Ujp-fH2k\ǵiĦy"ke#mDTchh. TR66$; 헪s߾ʤbէ3Uޏ%@o-' /#a> nd<Ӎ\v L>>/a2O~Vyoshimi-2.3.5.1/doc/examples/synth_prelude.txt000066400000000000000000000015331506652756400213740ustar00rootroot00000000000000Courtesy Lorenzo Sutton Licensed Creative Commons BY-NC-SA In order to avoid potential license issues we now post a link to the files rather than carry them ourselves. They can be found at: https://gitlab.com/lorenzosu/synth-preludes/tree/master/prelude_01 The .rg and .state file pair when loaded into Rosegarden and Yoshimi respectively produce a very pleasant classical style piece of music. The simplest way to run this is to start Yoshimi first, then Rosegarden. Next load the .rg file into Rosegarden, and finally the .state file into Yoshimi. This should work for either Jack or Alsa. If Rosegarden fails to link to Yoshimi for some reason, enter "Manage Midi Devices" and make the link manually. It is important that the .state file is the last thing that is loaded. Otherwise Rosegarden will reset volume, panning etc. to it's own defaults. yoshimi-2.3.5.1/doc/examples/themes/000077500000000000000000000000001506652756400172315ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/examples/themes/blue_tint.clr000066400000000000000000000072241506652756400217250ustar00rootroot00000000000000Slightly blue classic Demo ------------------ data start marker 0,255,100,120,180, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 0,255,255, Panels (R,G,B or #rrggbb) 0,0,0, RESERVED 186,198,211, Knob shadow (#bac6d3) 231,235,239, Knob highlight (#e7ebef) 51,51,51, Knob ring 0,197,255, Knob ring lit 61,61,61, Knob pointer default 225,75,75, Knob pointer changed 0,0,0, Slider track 0,170,0, Slider peg default 255,80,80, Slider peg changed 127,127,127, Keyboard slider backgrounds 63,127,255, Keyboard mod wheel fill 0,0,0, RESERVED 120,190,185, Link buttons 180,180,200, Inverse link buttons 63,145,255, Action buttons 160,160,140, Close button 220,0,0, Warning type button 250,150,90, Warning background patch 255,0,0, Warning text 0,0,255, Inverse warning text 255,255,255, General text background 0,0,0, General text 255,255,255, Inverse text 0,0,255, About window heading text 0,255,0, Midilearn activity indicator 191,255,255, Midilearn text background 0,0,255, Learnable text 0,0,255, Solo selected 0,180,180, Midi/Solo release 255,0,0, Midi ignored 0,109,191, Copy/Paste background 255,255,255, Copy/Paste text 255,255,255, Alert/Query background 0,0,255, Alert/Query mark (!?) 255,255,210, Tooltip background 180,180,180, Tooltip grid 50,50,50, Tooltip major grid 0,0,255, Tooltip curve 0,0,0, Tooltip text 150,150,150, Tooltip faint text 0,0,0, Bank/Instrument text 0,145,255, VU 1dB marker 63,218,255, VU 5dB marker 140,180,220, VU 10dB marker 63,182,255, VU level 255,255,0, VU rms 255,254,254, VU_text 255,0,0,VU overload 240,250,230, Filer favourites background 0,0,0, RESERVED 0,255,0, Bank/Instrument select lit 255,0,255, Bank/instrument rename lit 255,255,0, Bank/Instrument add/save lit 255,0,0, Bank/Instrument delete lit 0,0,255, Bank/Instrument swap lit 255,180,0, Bank import lit 180,240,255, Bank export lit 255,100,255, Current bank highlight 160,140,250, Instrument being swapped 0,0,255, Instrument original name 0,0,0, RESERVED 0,0,0, General graph background 40,120,190, Waveform graph grid 180,180,180, Resonance graph grid 30,70,255, Harmonics graph grid 0,255,0, Waveform graph line 0,255,0, Waveform spectrum harmonic 255,0,0, Formant graph line 255,0,0, Resonance graph line 0,0,225, Yoshimi instrument type 240,250,230, Instrument info background 253,246,230, Instrument background 127,127,127, AddVoice tab off 223,175,191, AddSynth background 159,223,143, External voice 143,191,223, External oscillator 175,207,223, SubSynth background 205,221,173, PadSynth background 245,245,245, Padsynth harmonics background 225,225,225, PadSynth profile equivalent background 180,180,180, Padsynth profile grid 90,90,90, Padsynth profile centre mark 90,120,250, PadSynth profile equivalent markers 0,0,0, RESERVED 180,210,240, PadSynth profile fill 0,0,120, PadSynth profile line 150,150,150, PadSynth profile line disabled 200,0,0, PadSynth spectrum harmonic 255,0,0, PadSynth apply changes 191,72,191, PadSynth building 0,160,160, PadSynth pending 255,255,0, PadSynth fading 150,150,150, PadSynth built 255,120,0, Pending button 230,230,250, Occupied bank tile 255,255,0, Formant filter marker 150,150,0, Formant filter ghost marker 0,182,191, Dynfilter filter insert 0,70,150, EQ graph background 80,120,160, EQ background disabled 200,200,200, EQ graph grid 255,255,255, EQ graph major grid 255,255,0, EQ graph line 200,200,80, EQ graph line disabled 0,0,0, Effect preset 0,0,255, Effect preset changed 110,110,130, Unused bank tile 255,255,255, Envelope control point 0,255,255, Envelope control point selected 255,255,0, Envelope sustain line 255,255,255, Envelope line 255,0,0, Envelope line selected =================== data end marker Copyright © 2023 Will Godfrey Cold Morning yoshimi-2.3.5.1/doc/examples/themes/demo.clr000066400000000000000000000070721506652756400206650ustar00rootroot00000000000000Demo ------------------ data start marker 0,120, Grey scale min-max 255,255,127, Panels 0,0,0, RESERVED 100,100,230, Knob shadow 255,230,230, Knob highlight 0,0,100, Knob ring 200,180,100, Knob ring lit 0,0,160, Knob pointer default 200,80,0, Knob pointer changed 0,150,150, Slider track 63,218,0, Slider peg default 191,0,0, Slider peg changed 127,127,127, Keyboard sliders background 63,127,255, Keyboard mod wheel fill 0,0,0, RESERVED 100,000,150, Link buttons 0,80,100, Inverse link buttons 0,255,0, Action buttons 70,120,70, Close button 255,100,100, Warning type button 180,90,70, Warning background patch 255,200,100, Warning text 140,255,0, Inverse warning text 100,50,100, General text background 255,250,0, General text 255,255,255, Inverse text 100,255,155, About window heading text 0,255,0, Midilearn activity indicator 100,140,130, Midilearn text background 200,120,255, Learnable text 0,255,255, Solo selected 0,0,255, Midi/Solo release 255,0,0, Midi ignored 0,109,191, Copy/Paste background 250,150,0, Copy/Paste text 80,155,100, Alert/Query background 255,0,0, Alert/Query mark (!?) 255,210,210, Tooltip background 180,180,180, Tooltip grid 50,50,50, Tooltip major grid 0,0,255, Tooltip curve 0,0,200, Tooltip text 150,150,150, Tooltip faint text 250,250,0, Bank/Instrument text 0,145,255, VU 1dB marker 63,218,255, VU 5dB marker 100,220,120, VU 10dB marker 63,182,255, VU level 255,255,0, VU rms 255,215,80, VU_text 255,0,240,VU overload 0,140,130, Filer favourites background 0,0,0, RESERVED 0,255,0, Bank/Instrument select lit 255,0,255, Bank/Instrument rename lit 255,255,0, Bank/Instrument add/save lit 255,0,0, Bank/Instrument delete lit 0,0,255, Bank/Instrument swap lit 255,180,0, Bank import lit 180,240,255, Bank export lit 100,100,255, Current bank highlight 160,140,250, Instrument being swapped 100,100,255, Instrument original name 0,0,0, RESERVED 0,0,0, General graph background 0,230,200, Waveform graph grid 50,180,180, Resonance graph grid 0,230,200, Harmonics graph grid 255,165,0, Waveform graph line 255,165,0, Waveform spectrum harmonic 255,127,0, Formant graph line 255,200,55, Resonance graph line 200,200,255, Yoshimi instrument type 100,140,130, Instrument info background 113,96,100, Instrument background 0,0,0, AddVoice tab off 122,075,091, AddSynth background 159,223,143, External voice 143,191,223, External oscillator 075,107,123, SubSynth background 105,121,073, PadSynth background 80,105,105, Padsynth harmonics background 0,100,100, PadSynth profile equivalent background 0,0,0, RESERVED 180,180,180, Padsynth profile grid 90,90,90, Padsynth profile centre mark 255,0,0, PadSynth profile equivalent markers 190,190,140, PadSynth profile fill 255,210,120, PadSynth profile line 150,150,150, PadSynth profile line disabled 0,255,255, PadSynth spectrum harmonic 200,0,0, PadSynth apply changes 160,30,160, PadSynth building 0,140,140, PadSynth pending 125,125,0, PadSynth fading 100,100,100, PadSynth built 255,0,255, Pending button 140,140,140, Occupied bank tile 200,255,200, Formant filter marker 100,155,100, Formant filter ghost marker 0,182,191, Dynfilter filter insert 0,70,150, EQ graph background 80,120,160, EQ background disabled 200,200,0, EQ graph grid 255,255,0, EQ graph major grid 0,255,0, EQ graph line 200,200,80, EQ graph line disabled 255,255,0, Effect preset 0,255,255, Effect preset changed 80,80,80, Unused bank tile 255,255,255, Envelope control point 0,255,255, Envelope control point selected 255,255,0, Envelope sustain line 255,255,255, Envelope line 255,0,0, Envelope line selected ================== data end marker Copyright © 2023 Will Godfrey Dark Psycho! yoshimi-2.3.5.1/doc/examples/themes/gray-dark-01.clr000066400000000000000000000073761506652756400220470ustar00rootroot00000000000000A darker gray theme which tries to be balanced and not too heavy or contrasted ------------------ data start marker 15,100,78,82,82, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 15,15,15, Panels (R,G,B or #rrggbb) 0,0,0, RESERVED 30,30,40, Knob shadow 75,75,80, Knob highlight 60,60,75, Knob ring 30,150,80, Knob ring lit 30,190,85, Knob pointer default 110,140,140, Knob pointer changed 30,45,30, Slider track 30,190,85, Slider peg default 110,140,140, Slider peg changed 127,127,127, Keyboard slider backgrounds 30,180,80, Keyboard mod wheel fill 0,0,0, RESERVED 40,50,50, Link buttons 52,60,65, Inverse link buttons 80,100,120 Action buttons 70,70,60, Close button 120,0,80, Warning type button 250,150,90, Warning background patch 255,0,0, Warning text 0,255,255, Inverse warning text 30,30,30, General text background 230,230,230, General text 60,60,60, Inverse text 255,255,255, About window heading text 0,255,0, Midilearn activity indicator 75,75,75, Midilearn text background 140,200,255, Learnable text 0,0,255, Solo selected 0,180,180, Midi/Solo release 255,0,0, Midi ignored 0,50,50, Copy/Paste background 240,240,240, Copy/Paste text 100,100,100, Alert/Query background 240,240,255, Alert/Query mark (!?) 80,80,68, Tooltip background 180,255,180, Tooltip grid 50,255,50, Tooltip major grid 0,240,0, Tooltip curve 250,250,250, Tooltip text 180,180,180, Tooltip faint text 0,0,0, Bank/Instrument text 50,55,55, VU 1dB marker 60,65,65, VU 5dB marker 75,75,75, VU 10dB marker 5,160,22, VU level 255,255,0, VU rms 255,254,254, VU_text 255,0,0,VU overload 60,60,60, Filer favourites background 0,0,0, RESERVED 0,255,0, Bank/Instrument select lit 255,0,255, Bank/instrument rename lit 255,255,0, Bank/Instrument add/save lit 255,0,0, Bank/Instrument delete lit 0,0,255, Bank/Instrument swap lit 255,180,0, Bank import lit 180,240,255, Bank export lit 179,50,179, Current bank highlight 160,140,250, Instrument being swapped 0,0,255, Instrument original name 0,0,0, RESERVED 0,0,0, General graph background 32,97,153, Waveform graph grid 180,180,180, Resonance graph grid 30,70,200, Harmonics graph grid 5,160,22, Waveform graph line 5,160,22, Waveform spectrum harmonic 200,0,0, Formant graph line 200,0,0, Resonance graph line 70,100,225, Yoshimi instrument type 66,66,66, Instrument info background 50,50,50, Instrument background 0,0,0, RESERVED 80,60,60, AddSynth background 159,223,143, External voice 143,191,223, External oscillator 60,60,80, SubSynth background 60,80,60, PadSynth background 60,60,60, Padsynth harmonics background 190,190,190, PadSynth profile equivalent background 160,160,160, Padsynth profile grid 90,90,90, Padsynth profile centre mark 64,86,179, PadSynth profile equivalent markers 0,0,0, RESERVED 93,128,163, PadSynth profile fill 0,0,100, PadSynth profile line 150,150,150, PadSynth profile line disabled 200,0,0, PadSynth spectrum harmonic 255,0,0, PadSynth apply changes 191,72,191, PadSynth building 0,160,160, PadSynth pending 255,255,0, PadSynth fading 150,150,150, PadSynth built 255,120,0, Pending button 100,100,100, Occupied bank tile 255,255,0, Formant filter marker 150,150,0, Formant filter ghost marker 50,50,80, Dynfilter filter button 0,40,80, EQ graph background 80,120,160, EQ background disabled 200,200,200, EQ graph grid 150,150,150, EQ graph major grid 180,180,0, EQ graph line 200,200,80, EQ graph line disabled 200,200,200, Effect preset 140,200,255, Effect preset changed 60,60,60, Unused bank tile 255,255,255, Envelope control point 0,0,255, Envelope control point selected 255,255,0, Envelope sustain line 5,160,22, Envelope line 255,0,0, Envelope line selected =================== data end marker Add your own notes here: Copyright © 2023 Lorenzo Sutton - License GPL 2.0 or later A dark gray theme which tries to be contrasted enough but not too much yoshimi-2.3.5.1/doc/examples/themes/green_tint.clr000066400000000000000000000072251506652756400220770ustar00rootroot00000000000000Slightly green classic Demo ------------------ data start marker 0,255,110,170,110, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 0,255,255, Panels (R,G,B or #rrggbb) 0,0,0, RESERVED 186,198,211, Knob shadow (#bac6d3) 231,235,239, Knob highlight (#e7ebef) 51,51,51, Knob ring 0,197,255, Knob ring lit 61,61,61, Knob pointer default 225,75,75, Knob pointer changed 0,0,0, Slider track 0,170,0, Slider peg default 255,80,80, Slider peg changed 127,127,127, Keyboard slider backgrounds 63,127,255, Keyboard mod wheel fill 0,0,0, RESERVED 120,190,185, Link buttons 180,180,200, Inverse link buttons 63,145,255, Action buttons 160,160,140, Close button 220,0,0, Warning type button 250,150,90, Warning background patch 255,0,0, Warning text 0,0,255, Inverse warning text 255,255,255, General text background 0,0,0, General text 255,255,255, Inverse text 0,0,255, About window heading text 0,255,0, Midilearn activity indicator 191,255,255, Midilearn text background 0,0,255, Learnable text 0,0,255, Solo selected 0,180,180, Midi/Solo release 255,0,0, Midi ignored 0,109,191, Copy/Paste background 255,255,255, Copy/Paste text 255,255,255, Alert/Query background 0,0,255, Alert/Query mark (!?) 255,255,210, Tooltip background 180,180,180, Tooltip grid 50,50,50, Tooltip major grid 0,0,255, Tooltip curve 0,0,0, Tooltip text 150,150,150, Tooltip faint text 0,0,0, Bank/Instrument text 0,145,255, VU 1dB marker 63,218,255, VU 5dB marker 140,180,220, VU 10dB marker 63,182,255, VU level 255,255,0, VU rms 255,254,254, VU_text 255,0,0,VU overload 240,250,230, Filer favourites background 0,0,0, RESERVED 0,255,0, Bank/Instrument select lit 255,0,255, Bank/instrument rename lit 255,255,0, Bank/Instrument add/save lit 255,0,0, Bank/Instrument delete lit 0,0,255, Bank/Instrument swap lit 255,180,0, Bank import lit 180,240,255, Bank export lit 255,100,255, Current bank highlight 160,140,250, Instrument being swapped 0,0,255, Instrument original name 0,0,0, RESERVED 0,0,0, General graph background 40,120,190, Waveform graph grid 180,180,180, Resonance graph grid 30,70,255, Harmonics graph grid 0,255,0, Waveform graph line 0,255,0, Waveform spectrum harmonic 255,0,0, Formant graph line 255,0,0, Resonance graph line 0,0,225, Yoshimi instrument type 240,250,230, Instrument info background 253,246,230, Instrument background 127,127,127, AddVoice tab off 223,175,191, AddSynth background 159,223,143, External voice 143,191,223, External oscillator 175,207,223, SubSynth background 205,221,173, PadSynth background 245,245,245, Padsynth harmonics background 225,225,225, PadSynth profile equivalent background 180,180,180, Padsynth profile grid 90,90,90, Padsynth profile centre mark 90,120,250, PadSynth profile equivalent markers 0,0,0, RESERVED 180,210,240, PadSynth profile fill 0,0,120, PadSynth profile line 150,150,150, PadSynth profile line disabled 200,0,0, PadSynth spectrum harmonic 255,0,0, PadSynth apply changes 191,72,191, PadSynth building 0,160,160, PadSynth pending 255,255,0, PadSynth fading 150,150,150, PadSynth built 255,120,0, Pending button 225,250,220, Occupied bank tile 255,255,0, Formant filter marker 150,150,0, Formant filter ghost marker 0,182,191, Dynfilter filter insert 0,70,150, EQ graph background 80,120,160, EQ background disabled 200,200,200, EQ graph grid 255,255,255, EQ graph major grid 255,255,0, EQ graph line 200,200,80, EQ graph line disabled 0,0,0, Effect preset 0,0,255, Effect preset changed 115,140,115, Unused bank tile 255,255,255, Envelope control point 0,255,255, Envelope control point selected 255,255,0, Envelope sustain line 255,255,255, Envelope line 255,0,0, Envelope line selected =================== data end marker Copyright © 2023 Will Godfrey Country Park yoshimi-2.3.5.1/doc/examples/themes/high_contrast.clr000066400000000000000000000075351506652756400226010ustar00rootroot00000000000000Do not edit this. It may be overwritten. Instead, copy as template for other named themes. Don't add or remove lines between and including dashes. This would corrupt the colour map. ------------------ data start marker 0,255, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 50,255,255, Panels (R,G,B or #rrggbb) 0,0,0, RESERVED 186,198,211, Knob shadow (#bac6d3) 231,235,239, Knob highlight (#e7ebef) 40,40,40, Knob ring 80,220,255, Knob ring lit 40,40,40, Knob pointer default 225,120,90, Knob pointer changed 0,0,0, Slider track 0,140,0, Slider peg default 255,90,90, Slider peg changed 127,127,127, Keyboard slider backgrounds 63,127,255, Keyboard mod wheel fill 0,0,0, RESERVED 110,180,175, Link buttons 180,180,200, Inverse link buttons 63,145,255, Action buttons 160,160,140, Close button 220,0,0, Warning type button 250,150,90, Warning background patch 255,0,0, Warning text 0,0,255, Inverse warning text 255,255,255, General text background 0,0,0, General text 255,255,255, Inverse text 0,0,255, About window heading text 0,255,0, Midilearn activity indicator 191,255,255, Midilearn text background 0,0,255, Learnable text 0,0,255, Solo selected 0,180,180, Midi/Solo release 255,0,0, Midi ignored 0,109,191, Copy/Paste background 255,255,255, Copy/Paste text 255,255,255, Alert/Query background 0,0,255, Alert/Query mark (!?) 255,255,210, Tooltip background 180,180,180, Tooltip grid 50,50,50, Tooltip major grid 0,0,255, Tooltip curve 0,0,0, Tooltip text 150,150,150, Tooltip faint text 0,0,0, Bank/Instrument text 0,145,255, VU 1dB marker 63,218,255, VU 5dB marker 140,180,220, VU 10dB marker 63,182,255, VU level 255,255,0, VU rms 255,254,254, VU_text 255,0,0,VU overload 240,250,230, Filer favourites background 0,0,0, RESERVED 0,255,0, Bank/Instrument select lit 255,0,255, Bank/instrument rename lit 255,255,0, Bank/Instrument add/save lit 255,0,0, Bank/Instrument delete lit 0,0,255, Bank/Instrument swap lit 255,180,0, Bank import lit 180,240,255, Bank export lit 255,100,255, Current bank highlight 160,140,250, Instrument being swapped 0,0,255, Instrument original name 0,0,0, RESERVED 0,0,0, General graph background 40,120,190, Waveform graph grid 150,150,150, Resonance graph grid 30,60,210, Harmonics graph grid 130,255,130, Waveform graph line 120,255,120, Waveform spectrum harmonic 255,100,100, Formant graph line 255,100,100, Resonance graph line 0,0,225, Yoshimi instrument type 240,250,250, Instrument info background 255,250,235, Instrument background 127,127,127, AddVoice tab off 196,148,164, AddSynth background 159,223,143, External voice 143,191,223, External oscillator 150,224,250, SubSynth background 180,170,120, PadSynth background 225,225,225, Padsynth harmonics background 225,225,225, PadSynth profile equivalent background 180,180,180, Padsynth profile grid 90,90,90, Padsynth profile centre mark 90,120,250, PadSynth profile equivalent markers 0,0,0, RESERVED 180,210,240, PadSynth profile fill 0,0,120, PadSynth profile line 150,150,150, PadSynth profile line disabled 200,0,0, PadSynth spectrum harmonic 255,0,0, PadSynth apply changes 191,72,191, PadSynth building 0,160,160, PadSynth pending 255,255,0, PadSynth fading 150,150,150, PadSynth built 235,80,0, Pending button 248,248,228, Occupied bank tile 220,220,0, Formant filter marker 120,120,0, Formant filter ghost marker 0,182,191, Dynfilter filter insert 0,50,110, EQ graph background 80,120,160, EQ background disabled 150,150,150, EQ graph grid 210,210,210, EQ graph major grid 255,255,140, EQ graph line 200,200,80, EQ graph line disabled 0,0,0, Effect preset 0,0,255, Effect preset changed 120,120,120, Unused bank tile 255,255,255, Envelope control point 0,255,255, Envelope control point selected 225,225,00, Envelope sustain line 255,225,225, Envelope line 255,80,80, Envelope line selected =================== data end marker Add your own notes here: Copyright © 2024 Will J Godfrey Higher contrast theme yoshimi-2.3.5.1/doc/examples/themes/largosdark.clr000066400000000000000000000073541506652756400220750ustar00rootroot00000000000000Do not edit this. It may be overwritten. Instead, copy as template for other named themes. Don't add or remove lines between and including dashes. This would corrupt the colour map. ------------------ data start marker 25,65, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 0,255,255, Panels (R,G,B or #rrggbb) 0,0,0, RESERVED 186,198,211, Knob shadow (#bac6d3) 231,235,239, Knob highlight (#e7ebef) 51,51,51, Knob ring 0,197,255, Knob ring lit 61,61,61, Knob pointer default 225,75,75, Knob pointer changed 186,186,186, Slider track 63,218,0 Slider peg default 255,0,0, Slider peg changed 127,127,127, Keyboard slider backgrounds 63,127,255, Keyboard mod wheel fill 0,0,0, RESERVED 40,40,150, Link buttons 40,40,150, Inverse link buttons 40,40,150, Action buttons 102,0,0, Close button 220,0,0, Warning type button 250,150,90, Warning background patch 255,0,0, Warning text 0,0,55, Inverse warning text 0,0,0, General text background 255,255,255, General text 0,0,0, Inverse text 0,0,0, About window heading text 0,255,0, Midilearn activity indicator 0,51,51, Midilearn text background 255,255,255, Learnable text 0,0,255, Solo selected 0,180,180, Midi/Solo release 255,0,0, Midi ignored 0,109,191, Copy/Paste background 255,255,255, Copy/Paste text 255,255,255, Alert/Query background 0,0,255, Alert/Query mark (!?) 255,255,210, Tooltip background 180,180,180, Tooltip grid 50,50,50, Tooltip major grid 0,0,255, Tooltip curve 0,0,0, Tooltip text 150,150,150, Tooltip faint text 255,255,255, Bank/Instrument text 0,145,255, VU 1dB marker 63,218,255, VU 5dB marker 140,180,220, VU 10dB marker 63,182,255, VU level 255,255,0, VU rms 255,254,254, VU_text 255,0,0,VU overload 240,250,230, Filer favourites background 0,0,0, RESERVED 0,255,0, Bank/Instrument select lit 0,255,0, Bank/instrument rename lit 0,255,0, Bank/Instrument add/save lit 0,255,0, Bank/Instrument delete lit 0,255,0, Bank/Instrument swap lit 0,255,0, Bank import lit 0,255,0, Bank export lit 0,102,0, Current bank highlight 160,140,250, Instrument being swapped 0,0,255, Instrument original name 0,0,0, RESERVED 0,0,0, General graph background 40,120,190, Waveform graph grid 180,180,180, Resonance graph grid 30,70,255, Harmonics graph grid 0,255,0, Waveform graph line 0,255,0, Waveform spectrum harmonic 255,0,0, Formant graph line 255,0,0, Resonance graph line 255,255,0, Yoshimi instrument type 64,64,64, Instrument info background 64,64,64, Instrument background 128,128,128, RESERVED 102,0,102, AddSynth background 159,223,143, External voice 143,191,223, External oscillator 0,0,102, SubSynth background 0,102,0, PadSynth background 0,0,0, Padsynth harmonics background 0,0,0, PadSynth profile equivalent background 180,180,180, Padsynth profile grid 90,90,90, Padsynth profile centre mark 90,120,250, PadSynth profile equivalent markers 0,0,0, RESERVED 180,210,240, PadSynth profile fill 0,0,120, PadSynth profile line 150,150,150, PadSynth profile line disabled 200,0,0, PadSynth spectrum harmonic 255,0,0, PadSynth apply changes 191,72,191, PadSynth building 0,160,160, PadSynth pending 255,255,0, PadSynth fading 87,87,255, PadSynth built 255,120,0, Pending button 50,50,50, Occupied bank tile 255,255,0, Formant filter marker 150,150,0, Formant filter ghost marker 0,182,191, Dynfilter filter button 0,70,150, EQ graph background 80,120,160, EQ background disabled 200,200,200, EQ graph grid 255,255,255, EQ graph major grid 255,255,0, EQ graph line 200,200,80, EQ graph line disabled 255,255,255, Effect preset 255,51,51, Effect preset changed 40,40,40, Unused bank tile 255,255,255, Envelope control point 0,255,255, Envelope control point selected 255,255,0, Envelope sustain line 255,255,255, Envelope line 255,0,0, Envelope line selected =================== data end marker Add your own notes here: Dark Theme by Largos yoshimi-2.3.5.1/doc/examples/themes/photon.clr000066400000000000000000000075411506652756400212510ustar00rootroot00000000000000Do not edit this. It may be overwritten. Instead, copy as template for other named themes. Don't add or remove lines between and including dashes. This would corrupt the colour map. ------------------ data start marker 100,0, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 20,20,20, Panels (R,G,B or #rrggbb) 0,0,0, RESERVED 75,57,44, Knob shadow (#4b392c) 24,20,16, Knob highlight (#181410) 10,10,10, Knob ring 188,159,118, Knob ring lit 188,159,118, Knob pointer default 180,180,180, Knob pointer changed 43,43,43, Slider track 188,159,118, Slider peg default 180,180,180, Slider peg changed 20,20,20, Keyboard slider backgrounds 90,114,142, Keyboard mod wheel fill 0,0,0, RESERVED 0,100,70, Link buttons 75,75,55, Inverse link buttons 90,114,142, Action buttons 95,95,115, Close button 188,159,118, Warning type button 5,105,165, Warning background patch 0,255,255, Warning text 255,255,0, Inverse warning text 10,10,10, General text background 180,180,180, General text 180,180,180, Inverse text 255,255,0, About window heading text 255,0,255, Midilearn activity indicator 64,0,0, Midilearn text background 188,159,118, Learnable text 255,255,0, Solo selected 255,75,75, Midi/Solo release 0,255,255, Midi ignored 188,159,118, Copy/Paste background 0,0,0, Copy/Paste text 0,0,0, Alert/Query background 255,255,0, Alert/Query mark (!?) 60,60,60, Tooltip background 75,75,75, Tooltip grid 205,205,205, Tooltip major grid 255,255,0, Tooltip curve 255,255,255, Tooltip text 105,105,105, Tooltip faint text 205,205,205, Bank/Instrument text 100,100,100, VU 1dB marker 188,159,118, VU 5dB marker 150,150,150, VU 10dB marker 0,100,70, VU level 90,114,142, VU rms 180,180,180, VU_text 0,200,200,VU overload 15,5,25, Filer favourites background 0,0,0, RESERVED 188,159,118, Bank/Instrument select lit 188,159,118, Bank/instrument rename lit 188,159,118, Bank/Instrument add/save lit 188,159,118, Bank/Instrument delete lit 188,159,118, Bank/Instrument swap lit 188,159,118, Bank import lit 188,159,118, Bank export lit 0,100,70, Current bank highlight 95,115,5, Instrument being swapped 255,255,0, Instrument original name 0,0,0, RESERVED 20,20,20, General graph background 100,100,100, Waveform graph grid 43,43,43, Resonance graph grid 100,100,100, Harmonics graph grid 118,159,118, Waveform graph line 118,159,118, Waveform spectrum harmonic 118,159,118, Formant graph line 118,159,118, Resonance graph line 255,255,30, Yoshimi instrument type 10,10,10, Instrument info background 255,9,25, Instrument background 128,128,128, AddVoice tab off 0,80,50, AddSynth background 96,32,112, External voice 112,64,32, External oscillator 141,80,80, SubSynth background 20,20,120, PadSynth background 10,10,10, Padsynth harmonics background 30,30,30, PadSynth profile equivalent background 75,75,75, Padsynth profile grid 165,165,165, Padsynth profile centre mark 188,159,118, PadSynth profile equivalent markers 0,0,0, RESERVED 0,100,70, PadSynth profile fill 118,159,118, PadSynth profile line 105,105,105, PadSynth profile line disabled 118,159,118, PadSynth spectrum harmonic 95,95,115, PadSynth apply changes 64,183,64, PadSynth building 200,95,95, PadSynth pending 90,114,142, PadSynth fading 105,105,105, PadSynth built 0,135,255, Pending button 30,30,50, Occupied bank tile 90,114,142, Formant filter marker 105,105,255, Formant filter ghost marker 255,73,64, Dynfilter filter insert 255,185,105, EQ graph background 175,135,95, EQ background disabled 55,55,55, EQ graph grid 0,0,0, EQ graph major grid 118,159,118, EQ graph line 55,55,175, EQ graph line disabled 255,255,255, Effect preset 255,255,0, Effect preset changed 60,60,60, Unused bank tile 0,0,0, Envelope control point 255,0,0, Envelope control point selected 0,0,255, Envelope sustain line 118,159,118, Envelope line 0,255,255, Envelope line selected =================== data end marker Add your own notes here: Copyright © 2025 Tillman Jex (www.tjex.net) Photon yoshimi-2.3.5.1/doc/examples/themes/red_tint.clr000066400000000000000000000072161506652756400215510ustar00rootroot00000000000000Slightly pink classic Demo ------------------ data start marker 0,255,170,130,130, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 0,255,255, Panels (R,G,B or #rrggbb) 0,0,0, RESERVED 186,198,211, Knob shadow (#bac6d3) 231,235,239, Knob highlight (#e7ebef) 51,51,51, Knob ring 0,197,255, Knob ring lit 61,61,61, Knob pointer default 225,75,75, Knob pointer changed 0,0,0, Slider track 0,170,0, Slider peg default 255,80,80, Slider peg changed 127,127,127, Keyboard slider backgrounds 63,127,255, Keyboard mod wheel fill 0,0,0, RESERVED 120,190,185, Link buttons 180,180,200, Inverse link buttons 63,145,255, Action buttons 160,160,140, Close button 220,0,0, Warning type button 250,150,90, Warning background patch 255,0,0, Warning text 0,0,255, Inverse warning text 255,255,255, General text background 0,0,0, General text 255,255,255, Inverse text 0,0,255, About window heading text 0,255,0, Midilearn activity indicator 191,255,255, Midilearn text background 0,0,255, Learnable text 0,0,255, Solo selected 0,180,180, Midi/Solo release 255,0,0, Midi ignored 0,109,191, Copy/Paste background 255,255,255, Copy/Paste text 255,255,255, Alert/Query background 0,0,255, Alert/Query mark (!?) 255,255,210, Tooltip background 180,180,180, Tooltip grid 50,50,50, Tooltip major grid 0,0,255, Tooltip curve 0,0,0, Tooltip text 150,150,150, Tooltip faint text 0,0,0, Bank/Instrument text 0,145,255, VU 1dB marker 63,218,255, VU 5dB marker 140,180,220, VU 10dB marker 63,182,255, VU level 255,255,0, VU rms 255,254,254, VU_text 255,0,0,VU overload 240,250,230, Filer favourites background 0,0,0, RESERVED 0,255,0, Bank/Instrument select lit 255,0,255, Bank/instrument rename lit 255,255,0, Bank/Instrument add/save lit 255,0,0, Bank/Instrument delete lit 0,0,255, Bank/Instrument swap lit 255,180,0, Bank import lit 180,240,255, Bank export lit 255,100,255, Current bank highlight 160,140,250, Instrument being swapped 0,0,255, Instrument original name 0,0,0, RESERVED 0,0,0, General graph background 40,120,190, Waveform graph grid 180,180,180, Resonance graph grid 30,70,255, Harmonics graph grid 0,255,0, Waveform graph line 0,255,0, Waveform spectrum harmonic 255,0,0, Formant graph line 255,0,0, Resonance graph line 0,0,225, Yoshimi instrument type 240,250,230, Instrument info background 253,246,230, Instrument background 127,127,127, AddVoice tab off 223,175,191, AddSynth background 159,223,143, External voice 143,191,223, External oscillator 175,207,223, SubSynth background 205,221,173, PadSynth background 245,245,245, Padsynth harmonics background 225,225,225, PadSynth profile equivalent background 180,180,180, Padsynth profile grid 90,90,90, Padsynth profile centre mark 90,120,250, PadSynth profile equivalent markers 0,0,0, RESERVED 180,210,240, PadSynth profile fill 0,0,120, PadSynth profile line 150,150,150, PadSynth profile line disabled 200,0,0, PadSynth spectrum harmonic 255,0,0, PadSynth apply changes 191,72,191, PadSynth building 0,160,160, PadSynth pending 255,255,0, PadSynth fading 150,150,150, PadSynth built 255,120,0, Pending button 245,225,220, Occupied bank tile 255,255,0, Formant filter marker 150,150,0, Formant filter ghost marker 0,182,191, Dynfilter filter insert 0,70,150, EQ graph background 80,120,160, EQ background disabled 200,200,200, EQ graph grid 255,255,255, EQ graph major grid 255,255,0, EQ graph line 200,200,80, EQ graph line disabled 0,0,0, Effect preset 0,0,255, Effect preset changed 125,115,115, Unused bank tile 255,255,255, Envelope control point 0,255,255, Envelope control point selected 255,255,0, Envelope sustain line 255,255,255, Envelope line 255,0,0, Envelope line selected =================== data end marker Copyright © 2023 Will Godfrey Sunset yoshimi-2.3.5.1/doc/examples/themes/retro_classic.clr000066400000000000000000000071771506652756400226030ustar00rootroot00000000000000Demo ------------------ data start marker 0,255, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 0,200,255, Panels (R,G,B, or #rrggbb,) 0,0,0, RESERVED 186,198,211, Knob shadow #e7ebef, Knob highlight (231,235,239) 51,51,51, Knob ring 0,197,255, Knob ring lit 61,61,61, Knob pointer default 170,60,50, Knob pointer changed 0,0,0, Slider track 0,0,0, Slider peg default 200,80,60, Slider peg changed 127,127,127, Keyboard slider backgrounds 63,127,255, Keyboard mod wheel fill 0,0,0, RESERVED 160,180,220, Link buttons 180,180,200, Inverse link buttons 63,145,255, Action buttons 160,160,160, Close button 220,0,0, Warning type button 250,150,90, Warning background patch 255,0,0, Warning text 0,0,255, Inverse warning text 255,255,255, General text background 0,0,0, General text 255,255,255, Inverse text 0,0,255, About window heading text 0,255,0, Midilearn activity indicator 191,255,255, Midilearn text background 50,50,200, Learnable text 0,0,255, Solo selected 0,180,180, Midi/Solo release 255,0,0, Midi ignored 0,109,191, Copy/Paste background 255,255,255, Copy/Paste text 255,255,255, Alert/Query background 0,0,255, Alert/Query mark (!?) 255,255,210, Tooltip background 180,180,180, Tooltip grid 50,50,50, Tooltip major grid 0,0,255, Tooltip curve 0,0,0, Tooltip text 150,150,150, Tooltip faint text 0,0,0, Bank/Instrument text 0,145,255, VU 1dB marker 63,218,255, VU 5dB marker 140,180,220, VU 10dB marker 63,182,255, VU level 255,255,0, VU rms 255,254,254, VU_text 255,0,0,VU overload 240,250,230, Filer favourites background 0,0,0, RESERVED 0,255,0, Bank/Instrument select lit 255,0,255, Bank/instrument rename lit 255,255,0, Bank/Instrument add/save lit 255,0,0, Bank/Instrument delete lit 0,0,255, Bank/Instrument swap lit 255,180,0, Bank import lit 180,240,255, Bank export lit 255,100,255, Current bank highlight 160,140,250, Instrument being swapped 0,0,255, Instrument original name 0,0,0, RESERVED 0,0,0, General graph background 40,120,190, Waveform graph grid 180,180,180, Resonance graph grid 30,70,255, Harmonics graph grid 0,255,0, Waveform graph line 0,255,0, Waveform spectrum harmonic 255,0,0, Formant graph line 255,0,0, Resonance graph line 0,0,225, Yoshimi instrument type 240,250,230, Instrument info background 253,246,230, Instrument background 127,127,127, AddVoice off 223,175,191, AddSynth background 159,223,143, External voice 143,191,223, External oscillator 175,207,223, SubSynth background 205,221,173, PadSynth background 245,245,245, Padsynth harmonics background 225,225,225, PadSynth profile equivalent background 180,180,180, Padsynth profile grid 90,90,90, Padsynth profile centre mark 90,120,250, PadSynth profile equivalent markers 0,0,0, RESERVED 180,210,240, PadSynth profile fill 0,0,120, PadSynth profile line 150,150,150, PadSynth profile line disabled 200,0,0, PadSynth spectrum harmonic 255,0,0, PadSynth apply changes 191,72,191, PadSynth building 0,160,160, PadSynth pending 255,255,0, PadSynth fading 150,150,150, PadSynth built 255,120,0, Pending button 200,200,200, Occupied bank tile 255,255,0, Formant filter marker 150,150,0, Formant filter ghost marker 0,182,191, Dynfilter filter insert 0,70,150, EQ graph background 80,120,160, EQ background disabled 200,200,200, EQ graph grid 255,255,255, EQ graph major grid 255,255,0, EQ graph line 200,200,80, EQ graph line disabled 0,0,0, Effect preset 0,0,255, Effect preset changed 120,120,120, Unused bank tile 255,255,255, Envelope control point 0,255,255, Envelope control point selected 255,255,0, Envelope sustain line 255,255,255, Envelope line 255,0,0, Envelope line selected =================== data end marker Add your own notes here: Copyright © 2020 A. N. Other Retro Classic yoshimi-2.3.5.1/doc/yoshimi_user_guide/000077500000000000000000000000001506652756400200225ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/add/000077500000000000000000000000001506652756400205525ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/add/add.html000066400000000000000000000101601506652756400221660ustar00rootroot00000000000000 Yoshimi User Manual ~ AddSynth

    AddSynth

    addsynth global window

    AddSynth is the most complex and feature filled engine, so is split up into various context levels. Although based on well-known additive synthesis, Yoshimi extends that considerably.

    There are 8 voices that can all interact with each other to some degree. Each of those voices has a waveform oscillator and optionally a modulation one with five different modulation types. It also has Unison capability - effectively sub-voices.

    The oscillators themselves have a wide range of waveform shaping controls, almost all of which can be changed in real time.

    The image shows your entry point with all the global controls. Much of this actually consists of standardised inserts that are used across all engines. Detailed descriptions of these are provided in the following sections.

    Volume and Panning
    Filter Type and Style
    Envelope
    LFO

    There are also subsections of this specific engine.
    For a start, you can have up to eight quite different Voices and the leftmost button at the bottom of the window is the entry point for these.

    Next in line is a button for the Voice List, which as its name suggests is a list of all the voices, whether active or not.

    The last of these buttons gives access to an overall Resonance that can be applied to the engine.

    Local Controls

    Stereo Determines whether the whole of this engine is to be Stereo or Mono. If the box is not checked (i.e. Mono), there will be no spread to the sound, but the Panning controls will not be affected, and neither will the stereo spread of any part effects.

    Rnd Grp (random group) Normally each Voice has it's own harmonic amplitude random element. If this is checked, then all voices that use the same waveform oscillator will be grouped so they have the same harmonic randomness, assuming this has been set in the Waveform window.

    D.Pop (de-pop) Sets the time of a very short attack ramp up, to suppress the click some sounds might produce.

    P.Str. (punch strength) Sets the amount of amplitude boost at the start of a note.

    P.t. (punch time) Determines how long the punch should last.

    P.Stc. (punch stretch) Increasing this will give a longer punch time at low pitch notes relative to high ones.

    P.Vel. (punch velocity) determines how much the punch amplitude depends on keying speed.

    Detune Detunes the engine by a small amount.

    Octave Allows you to change the overall pitch up or down by up to eight octaves.

    relBW (relative bandwidth) Modifies the amount individual voice and unison detunes can deviate from the overall value.

    Detune Type The menu options control the amount of detune of the slider and whether it is a linear change or exponential (i.e. has more effect the further away it is from the centre position).

    Coarse Detune The inner single arrows make a coarse step change to the detune, and the outer double ones change by ten times as much.

    Next (SubSynth Engine)
    PadSynth Engine

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/add/images/000077500000000000000000000000001506652756400220175ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/add/images/global.png000066400000000000000000004252571506652756400240040ustar00rootroot00000000000000PNG  IHDR}sBITO*gIDATx\YgqƬ3a1(Lj %$'s1`̈J *9ĝ޾{owv[})&9nݺuN{;|;JJJJJJJJJJ`55΍O/6L=Օ˧[IIIIIIIIIIIIIIIIIIII]ou Go_Ok`:;oqNu1spVOn!*Ç'z/~vr;"i^_nK SV yݔCvЪUK|nFw-vWXV|pRL`f[7`펵Y0ݤsv]:GdiۜȽ5QS 'n=W&}zuŚჿݿў7@eEkYٓ77=D1rmϮpt ccLgN$iR`w_N Vـ3G9_9@LWOv[J Ki0B((þւwŬ62SpKgxq读un֭[wzh~5T85<׼%HtڷӫFݬqV_»H?k .UB?}°#.< o'cX3ۜ~vh&%mP-d9'*(\ԅGƺ;")e6C()C~ش>;jrb7=d+#wŮb[dtu mbԽk'icK}1afN4Tch+VQ6-aϚT,ohH&&j,nul!Ķ|6g'vYMnC&L^dFOF-)iC dS9T[^mXKJZ)=ݙ b+,#ɭu떲N':.0wV8dkm] 7Ƕ;vj=Wݭ*ՠ^gvC3xwԥۓ .X3MjZ< +=^{|!? 5h =Wdc`@r Yl<4}4 ;Z$[e'{X0)D{&^v TT)k~ZKk.*Q?JVxigh!L*{/:W3ݫv"N#|pfQgKJڠt9ѳTG[^{ib:.)iT qք<3/"c9=WMm'{.#W]l5;VJ &m#vKP8j&NX[2YP {_9sY/ @=;w^ 6[׈FC{Ub\ueXḳ&A,f|{ؠ^,V; u^>Q _hHhrγXPWsy@^ckbl)5i9L]~]E_4CY9TykuZRUP0&wVAӀ>.!6.f5Tx"Nt1c*VRngKJ4\NoWҜ5Q龕*_JRR<~:[sd<&3w[{GBW3M_'bc [3DB,TQXcOEvmwJ1 $Q!tX?HeV̫bL-6.^QbȣXVa1س7V:{|l!wAB5T='I館1ZƸ^ip+z*a]B#WLdOd~'˛Oa5f#X=G*oNKʻ z,#֔&wV+o]c-آSLqrjv|"Nf0bYM?gKJ4e'޲ZACjy}HJxk3ƿKo27me-bwɛ\8zwE^oݝ=sYUpZ&~FU!c8,:,OФ=Tay&->oWhʎ߿RULe=oiyR\}kW2RAlѐo~ӕ'5q-DMX:XykuZRUPV=EH?+If<—;wl5OyD*\K3Krܙlqo M  M8d6X6XE/Z5Y>}67tu3YlӁu3& 8lj@Z7=^w1Rsu愑AQm x5V"tI?9͜0R-PL%PY:-Qy7Fyd\.EZYw=kX_vnօCg o'؞;WL;5)i"}kָF{ba$k_Gq6'k6($^_;j )))i ӲqeKY a&Q4c&YA+J [HJJJZj9טe~]0idёblUYAʱ"-_3a2SlMJJJJJJJJJ0bHO{-4"%%%%%%%%%m*1 @'2&!!!!!!!!!iHIȘȘȘȘȘȘȘȘȘDdW]ԩS$$$$:}j}DwȘ@BBB,1 1 xjtRT1 I'cO<ĂpMU.I˖ĵQ}?mdٍ4Zwk)..~ ft5ӒȘƣ)233OƕjƑ#GO4m4%%)IMAɘ.b\MCrsʬi֪UTQz<`WZ#-M i6>'N(\ei@ƭ:uR_?!h?tņ j 澾t5$`ٳgO6CA5kBȘv)D(}~ޥ ڶkW!cTo[wnF|%^~ʆ flZ͈IҨQ#dmIBdLZ4(+|pk9Yv_ 2@6`SR0SOƜG uX2KkV[5W=hm`_g-װDD$ <̬ċb $DƤH\] q+7nO+J8llB\~H :ܜMOdtsII+ՌӧO#8p) 1imN&E_v[ZV[` lB8NFt>ug,Oz:4hDM)`XӈIy-[SLkJBdLZ+=5,jp,5X1s~=Ljaq3럌|1..ȘȘ1QV/_^52VSUy4hwe%!2&y5]=>l,%Yav;wG<;sJN{;VȘ' 2&%2&d,'O<^Uy<̙CȘ5ڶeOSܡ;L,1ꮕdP8QFs21˖ѐzOƶ|BIb G͛ƌ8IgLdLdLBd\!CxG}t1$DƤ5[Oa/$cLm 4+$cȨk28|odkׇ痎5 =o@dLJdLBBBBdLZuΑaUc6~֭٬GOF~c]\C 4;4G=em#%2&!!!!2& w?nT1qyd@N{E-q+LRhcSM2\@:mfvnL^:vdc yJ $TIIHHHIk_Zmjܤ $c"+ z&G\ JT֏.I6UDD$$$$DƤQ{0hk١)luKIT7ͭސ1i"f ǟ}S8)Ơ$|̈}WxAAOJdLdLBBBBdLJJJJdLdLBBBBdLJJJJdLdLBBBBdLJJJJdLdLBBBBdLJJJJdLdLBBBBdLJJ!!73E!G _{0wpa\q 2?LƏa|РA)֘X("Zd\׭[)ϯgdp-aavmm---?C"騉IHHHG9%&Ndt++숼]Ѐ~~&MTAy ??g2 }cϞH\?8<;k6[ww{ŅSȘX$ XJsV>uuWOF)641YWBN\]/hԶkWH=qIIPZ2;:{EynXcc\*׀"znRjrOy¿'ޢQ*t1)⭠~Ns蹩Bgg 7tQ'Kɝ\׶؜R6>7M\Ȧ';ܩg29lG͛s(_~KDEaùwҵ_?)z;iJϞ5sqAm|Uqq 3` fLm[뚌Vp9oOٜJy(e\AG+2˙׌-6mtb2zO_īBݚbчgSa0@6qЙ3Sz}:W)JښXL]tٳ:%c0D9/Xaw޿]dE={x=z 8m@yHî](;2u Dkjך]'py$ɨIHHH<Ñ9ٙsFo(#oVjsM؁[|*=m>vKw+I?^|jI:hېdʢgS8;큃tqh7X3^ڄI Fpun &=ST4ɩS^ a( .q>rt+&Au++k~z=x4|AmG/)ܒVmka2cf­c+ |tAe0My\2pОvept&T#`#F>n?mC'4E 17,>8R]#2wմ|OfoQ(p&뜇pw>P.C*,.c LjwJCq11я)j1q4с1Y&`Ӹq#/*LhxXۋ`gPH Rxd⌿{ĉFip10P' w/٭G.El!\]vw ޛ*lkԀzxkQpt"c"AYYFc0h﷝S gB#b֮z TVK]Q!w%Bb>qA`d2ϱM2FH3ټ?s6O,B O>7?R&Ey̦c][adR7s}LL=%C1MHuB)~ȸ{].,?tb=>W˞w!AmcO>&OaD$$$$Dj&I2nDw}QeAF |vj[|y\JU6FW OvM&X?#W8q'%066OYY&X/5~Ricmabl 24MLԜ|ECcb>c1.V1X1beGOWWՏ>z^ l߰ <Dzwy^2ă(J >lad7ygn{W?>yLcc~LJ^akC9;x4/ 0;Sq3>y d#raC鱱o (vrV٤0^OwtVMwyk"0KІi([nSvW*<|z݆MS2eВɤD$$$$DƵo4:DZ+ L:)+&s;wYX_K?.r6'p?*bS!Vf :eMq<fLQ^LO2y ?}E(pM0(WdSưMŷ<~#h }o`U/5 tw+xv*C- G ް4Șȸb__F C>/}M'/(/_t^eAϗWV霼̻rΣ@O^{GOf|7fl nrS`wcTr/7U)S8Bod zNl]Ǐ ֘5ڛ>ȘX;vPCC3Q h)7ܗORU,1&0_bRU ݺƽ'>-,/48-h}Bs-A?zV*],}Bױ&AdLBBBBd\d`0d@I#}!)/\xX"[_(BiyC[Jn?s`00FfRc Ly-~/)s`8ZS臌\^/wXҗ )E }Seչ2y!7imɰ 4vΣ^ "zJ2F;6Qo$hU]/jxvه#El8CۈIHHHk ;%&2Jh9S>s:1tP+w 9ʺI&tq'ޒ򒌒Q +b#u xƽw TKL$)053EMgf2[mXkM28y5Q̤3fΔ~GTkV)ɜco\09Uν$3EI Iȱҝ_lޚ8iJ9ɵr95) [U`Ztom7wGWpkAGdLBBBBd VRR{OҩݐT$IY [O0,aXd Q<ip_r xWnͽW:JoLb&LceLsc8g7(qMBdO U"w'W`;ieo@&}ӀјUd|l^l ֋r<2/~KW\r{8n amJgHErW (g { cf=a^qq5HƗd`RRRRR5g,{`g2LL 2ca#,zy&wI(eAHMJ@!Sy5[1"'aV1k6꩜ %IeH4eLxӸ}Vy2bɺ w5끌;;%tw/#M0*,/J\Kptx%hfqx!c</+LiiZn8p,*u&!?2ŀZy 3 z9UenfM ūI*z>b+*b[^vn^RSE1+j&lqAhl)EX N$r p<2ԪЩ̘U 3V0xX&8Yұ7 o]?隳 ~}hn.82?e1Q3F<{U*_zV*ݰGGĀ ٔԐ"c=襤U͓ʈ<<3 a0/ItTQytWoܮU`jBʱS8V֘5Ytu8ӐBRRRRRe='cs{{>p3piw!2 O_ 2۱RdL,bT1I2C0.lEQFltS.zMb _vb Y\8:ꁌ) !~!Clr2*28~R5/mԆvlc!ˆ/җLeV+!d&rX&,˼o Kҷ-du+COޡWAK/J]666Y$ctTRRRRRe='4_)N|-#ck"0|Bp&ɾ.yu_yH] YddʈP%@^YWYZN^tRy@f,[?)6% An9FS蚌10s 3)x g*e5U'VrۏRm)2l+:{iμV5[sXsj[Fێ[YYEV*tُjW?:X1kҪ6Laa5Hƈ3㞔TqxǍ߭L|@Տ| zG3IƊ.1,P‚B7 'o ˺Mco98^u?,8wTvaH&끌)'}:;Ј{O܅>y0>%5ʦ9{93G`1p f\Ozo0#0QeCd2{1Ga#y.Yy({4vŌ 6NV/cp~ C%bb*_KgZh䳬INdx5HaKJJJJ^dt)X1SXL)n,2m2xcHb1n{"h_,ŶUYeC`c1^{b}QOw_1([hzLƫ C|;Y%wue†ц{2Xj'$c|"AR]HF>FF۷3ZseU t}iYxС  %dc>}㓗oaY3I2]G&%mzubyׄ?Cg oO;v$epA#@⒐ƯUScA$ ֶ51ZM-,Q%7ܴ./;^^t}d(XFf@7οr JLY/Aw%K.<~?=A!8ѿ e̟$|ip Y͎d۰mg͒Lg 3O^\;Mk2fmrE"8;{/"˵.nxU9R{$)5}.Oğλr\GĪLOQX߶&ahaәU ..2ߑŏU [')0 1i liWUxb= < R"c!ȥ%Zȱt?yrI.Suu:ȽR/ 4:NzMŸt 3O夥gGR\϶TS` ~5~|]y?q^6 *nx1UeY։aI̤ʾo=:l gLmb#XcEVot9pA74"[~^Lꟑ+?n+kjKMvDamBni3f>6pۡCefZ5nҤY˖'L:rmҧ{ƍ,'-[' ;9C7G'k9 N G/\+A$-E^.Sp#[q\/O_"tDan*e^:t"oMD͎Uĸzo =ā?yuˢroɘ**{̀ ƔS|}+xDm,F%=lr lqƈ>zW7p|Nv_Q4 1J+x11iω)t…hY۶@U ^XMG/dGNƠg)9R]0řFT({4j?źc"cҚרB|yڵp#]ce._sW#'㥱X >w-~ؼyTQLwwg1=dӦ~Ȇ #cMvTy'af 5BA&[nؕҿjCHUKd\kg~笥#Fv~x-^kqPp&ɺ̧ƂȓO% #BJK ]s@poک]N fbJH=\RS-|E6kxg߸ƽ'>vPDb/a=y-u?/}+f`^9 a3^Nș cP-_6fª}}~;Xt}c9H߼W/{ ;SYLEEW!}.1[ Yjt<"cR1Ν"ݖ1B%=yR,`GNpolcϞloo)XeMNNydɎ* P =Ҫ@VSU.%2]d읖3]: itܼƽ;,[g2D?L<Dћ IA+2Σg ,w \2oѣzG1SQMk2߶530vvѓg@cWo?rAb6K} p*_6~UTƸ`2K>=yl뷩C\vO.؁1ܞ`7|#Ϟ+U ;wI*P6؃FlbOa LI!2&mhq {7+oZ5K#c/IwɎَ. n]ƌ)[U޾> ai(3hD"c"c=%>9:-v9(_5 "ٸtn31UdLE +kRl1 V3e]n"x߇82?O:iz-q;rljI*X4EyW! 8B:;d-k^TAAm#Pjy!کa@ƈf f``&dɎ%c= Xפ boft771%ls0 wTydk}82+ȘȸZ:x0ШaQh蜝*,[t.c+E$kRt( N_"ˣW O w8)qPYFaaeL 7EK)tMQAxߍ£=fLѵE^znk~|neLpU 6C[̪7dz.򗍄}GMF*[Tjں C]JC{ml񲧕q;˻ ٭-upu]*R}K0Sଝ6Odr5 {`&;V׭͚݊}ҢUsDUoRMּZȘXd씘(TlȐg5N\_|=585KJG("@ "fB*=+ #~X1tUtGw$YNngyuyzl =b??ubqÖx؅[orOh7%e2& dXfU]֥[{RO |mzO^۶1캽gEnb4m] *BM8n@ttj!X-:"7T8|>QJ6Od, ݷi5o>xddЄ5ٱ d̪0nyqcԌ#$kl' wTyї/͝|8N{#OK-2xi]?_{?mK~%U&㈬қ׿߱[ Jd\W8D] g9p%JvmLClR g^SezM"Ew Dc:@#G4zPno'~_LS_M2HOg*iL4%zA񍼢/]˹xe#1O?!UG|*/O0۱Hcƪ$S=gg&!C筬= w|C>~7)_=iNV֛SY3<#Xµ#2:ߪ0֬GsCN8swm1[oI2BEwZbqm;mrd\//vB Bl !̥$K ^gY$K|M>r :KPˌsUR@=_rn )'WS职gF1xo̤7`MHD h,W|(ɺp}͗ÒT!Șk `_$pFFc̰TZmk TJ[f=ڽ Jn~*8αmȸd]I!2&dl{.=|o 2#NRO'nd9M* e( 1|@0Ks/>_!h^%1Q&|oES@3˟,ٶM;Apۮ[gOԂ&˿MKM1mdjS/M2vܱEGM̞ÇO;ql+, YuA`э,LqJpa"n@ e]4Fna`0La?@4*&6>r\=\q{WwqňͬIA7@2ƗZHV32ygvSSꓱo3%~}蜧*l%2ֹZ!1GyfF```=i@0܅SمY2 o #elF?+A<-I[2dh hKS臌"QnxpMy&hL.f\8Eϒoэ\*->S yHݜp`TZUkuUKJdYYp [1/{: [vttrű"6FK2]=#9sǏc2fX2_1Xg%%%iX%cn!"o١&װrȱ@xZȸk?^!ZL_q>ŋc23lzG/x;`\{#?q6ؙGO!͓4/-n͂g}ghEgApCQTg1?j3hMac䬨gC]عpwqǚe+bPq"3?=R_p4[OƦ[l2}G39mMJa-TȦTm8u !CaMpX$cb]o!m\z~\gOȘȸ d|u)$IƘ0mϢIvvdl̲e| i"oB/?}.X9ۿVX淽8ԶJ_M #IwdĀi-c*>8xFw1Z2L=uDcgٌg!KK,#jznɑ8tL)NE@湺/ssZ{ba}2>xٳ#Fa?w[po'E<-}H9zRx8+Wp.8/q,)S;c[IW^'cha0_W,[f^BlmўE)))&&&۷6m_,[\cnn駟nz{ekd|3fiӦI&ӱF*_}22ryL&L ::XM(b{S5E"cs!=[uHvW\\e](k0۷ץK>| kkgϞUf W 1imݴ"z-1i=vB2.s )SFlGO؊a|$n$F:uKxjGG6\ozl0ZdS (D%2&%2&%*qlcꮼ[ Qxՠ'22ֳNOȘȘqHDVi)WyDƤDƤ JR=\SNJJZ[c7c%s4'WX7"G>}d>h'-["e<}ԱG^^4k.;9"%ic.\sbeԹs;m~* ڸqbP3y t3&%%%%m(d&鱈RX?Wo2J8 'ف'2VOƠ-=bM-,u.,J>vG88X2ǚ8`cc5!н{$2&%%%%2dI0C\ p-ڵ l&c~nu62gEb;)1uRxݹs͖-X.@FDƤD$xy&MHᛞh1˖5c>##h8:]1ȏ\Y˖uUԉ9k#CD恭| ʣ6;vi2tz9jK>Vf-rD.Gff>&8|X( HsDFFѣE.8E dv`Dz:GfB1nw5‡"D ox0"&5/tˑיmu6_~ &_.:>1\pΚU2X?ee3f О-ڷO |[kO_}3Ԑ1ۀl<Nez4qQT6k4Sr2\OAXw޿[]bCKXf@Ъ@/G?ѲOKR2Zb x-h 2+(V}MMrgMk֦|滻O^x?ӅXJlBPOj*^GKƘyO E&@1"cMøan6 ?X%.Y"-!*1zY$ |n 6Y@Ze>3}~ͨ0a9jhcIcH~gj cU#ZM妀n9WNNzp#AѓXTuqX\ >aCBsU cQ&'JRX5J̏XgH/\~&h<]dMB+:6K$xJCԄ"[[#p%xTOO5"/*:z 3<((P؄%cmi'9pZNj.4閖C 5oñKЙ3DmddYd-x|SߦAڪKmE$6!A8nf&Ɨt@LtNfh>芰/Ze[ jf/'2^{oyyҭH:TArSo1Rա a׮ f NH@B|1%I:POx@[Wxz2"KAՄx19qbS瀠y7s2VZ[ c0ms[u(7Ãw}GjyD7;;-jn ?_?cS;74!rS++zkB;ҫmH'{r{vqvRSu;rdm'ʜ D*/j~cH?ƩS3:m>aKKvٳjd?bD*O_}3*8A|Z 9*"\Q/㌥K#ĉIKgf AƧOr'd` M*|e3#1 gԼ >ꃩQ E=6V1eS8]GSUgN3VI6HɌg4tպuˆuv~mrvAN:tQ1d+X 9@JDTŋ > W)RogHe6x* RU:4hݵT/B_)unZNj.:sjVg::vjVmmuT[V(*nōpoŅdM{Rp[}&c$\+999y79ϝ}ĆKPfLA!pltL(ʦ +8cmҘ1= YXL"(>?&r-ݸUT_d\~suK:"U,VJX^+QmUƩzH}CC:R_}䤢BT+GNSfLAAAAYGϞ(ˆWt5 @ b ?sQv0M,"a <l{m21)TU'oltq q&c~M47?6\T~wᄉN2 ; r *"("4aE'WǖxdVrRQU!{{-VLX=e|E*H*bIwh 'uӆ[X#l=c١bh )4dCsKoƔOB6έ.Fʞ7Uo>{_Z ^╯~+b8gvUԸ16|n.ln!hg89r(F 4",Igsڟ }kNJK/ܰpy Iΰ\Ԃܧ`‹˫* KvchAO؄E99A;΃&+_TIV94(mrF@9o9rRp\f=IEղٟx3cRRBAAAA!:3@b74DALENd }{TP< ^jll1:ܸ͚o~I+O v, O%|D'cr3`>+.)*;}NQ ҽ!XPT]|,*qU]NQQWZYa``m夢jc!1!w(((((dwK-).#[)w;vfxw p\M8Q)ѩ b /_hʍN*,.(/{n&$UZ}{DEk:Sus9E%rvjtr^uollU-'U+gZ3c8B{GAAAA!f QQvpZu qz"XpN˴ش¸".b;)4uE`sӲ xơ1Vk%v͢hZPE\9uȹr^qpUk7TN*>6@ep<׿(((((dwKʌ6ǎ[({Xe #8>C;.-IK*e'g䝿ȣ?s&JaEj@Ԁ0L\ԇQ|Q%IT.!A  .hR9Z<66gLAAA>c)3g̜ ;%Q0>p2Bt#qn*8 vbfqb$ $AFQL!DQZ/3f̱DT"'2jH/!h&R*;ިQjʌ!Sf" `hAL?MBS.ֿy8xz!,44 6C1sJPm*#/1Ű1i1L}bN\JVlrfLRơ'*YԱ?p<(%]{r- +(*s(jH/\Eߴu䤢jGEH1kOAAAA!27ʌUu.qW~[x鱽jQf;`3+5vjn "n&ȸ!ĽJLLH 6l!_Jv[V4Q#/dbyEM@;&ΠB93j;g.^#ؽOurRQ~ 603NoWRPPPPnIqΎu!1_8?BZ V+ _^PQPvzXeKOTBfD\JX,/4&b!߶M~QJ!Ch^ [ثϴ,Q4>Fv(DN ӝk;g/w;NN*>)3|)(((!ǔ,mA w >zmEo }PH/JsŠgYEϲ*pRքg"(4!&<8*)(2qm"|…5n6*٢s|̊H[  +XVDT"gDΞ6vHYU''Ugر&PPPPٷlʌ&1Ǚ޹b/ fέ| +˝S<좊͞c%`k7l~$tts .'644ھ{ohtl9>B\on@dh_H̙KE H!*jĒ;d /o`d)lNGJ*K<"v(ET Cz⌐9:9Z?:::jʌaRf\1<?s\gQA8JR|9u?C0ÆANWIEWh A7}~ ߹76&xׯ-YvM }?r$9Gvk$mӦѯ DtfZZM ڂ~fڮ^W\STaՆ CoHÏ ]ZMy[7[^"X2 aDxrpKڋJlo45R*ξf7Noo.3^XWdbBKݻ;v(x>GSyng0ZP"3aa7ܕr,*_GX)g~#!Œd JYq8]P_4_{o6(rƿUfƻxsr{d ~;QzBxR=nU!ju6JVrv;o{wɓSl2cɓ9b2F̸>/a͚+rȌnx؃/ߚce [w%@`1X N,,Šx??ϱQ08..E<Ó`>|iǾ)`Hx9;_Q!jiʌ?,$5׮y->iڦMxr׮ϻtOz b.N|W;oX 0!$Fq~`8!Hrvϡhg}]5o޹W/Pmqfmm>ifmڷ2qGaWW]3hݺgܹu7nʏ]i޲%+6eJg1YejŌ׿̶k:zFǧd2Rsɔ_M/ k/1ӰphrWU],(}| w}]]Z&v_iODms+U=E%r\b'|'S͇ݡ)3n<כ>]ЁVAyE}Y1Oҙ_xɓſ_~X̘ d ##y}1SRb33Ò/YERraҙ .aw[*e3gΗ8&SfnӦM?~xx8pHHW_}%n۫39v vDzl#Fp5&)#*1=2!-4> zP{PUJ!Ǣ0 aMk7mvJskS5={M:n왑eغ];:63|E$[ q-?8&C83P=3j.3NJJ"o3i``@vx<#/+++IČ3H|y ODΜ۵kWfE Hilf ,;tǩs"ݹ`:v}@j(`H,?'fo~-#-Ti=cFfu!Yfq6J{]=`= 8hD'%d#0GXlxׇ\ݴCoa!-W$fu+kyH>z#Fձ(3Жe1H)=Xflp]Ol go}iiiIG֭0- ]>1t bn/A-p-iQxt.~|P::="NC,ADeA7Rfj=TT>xɉ_ֻwk2c ʌ)?ߑ7DZTm8 pDDjbo*gmȑlxݻg-D񢈛kh(71lt ?rc$q]]\?FMicu=P?rb䑊2c ʌ) #a2Ӈ0cmԨQx5(dԦ 0" ݃ōcV7f \Px wx] w>v6#2N%O [Q6fQQW~Q2c cpֲUۼ2NTm3}3IUd9;h43fg<}tDYp.Ӵi؃av7MgLɰfӖڬټcCu8rzcv/Zz)2?~?CQ6fQ-׮*sSPNlPfLAAQ>o;}43~q3cT͌tI(7v:@SDCژE]gPm =t)3P=OG>GStS5Hݡ)3nle̘!_&'tPAMic#+'N(Oe ̌2c^N~f(3VvN>(?3&PÕY ÇQREMMicPlXYxڒ%TƔ2c ʌ/3ƣV_{}{izLhtH>> :^f;ʌ)(((3X֍nb[ݾN6ǏO*ҪgZyPASDCژEu 4ѫM4 >)3̸v+FuOf+ݤl y""_lm۔ MMGxb8y2v WlJ1cHy#ǎxՄ^G/o_YW̘21cOpա}SPP * ~9ŒoS(3̘6` WA[6RPPPPf"^d 鍣 Ik<9XjFu:R[R֭u9&ZռeKr'YSgEG }G7o?mM5k?QiٷC׮8EZuRѣWӏ> BBTt-۶E}./F-t$~ ɞCn?nWm.\P݀#Nņ۷L_`r?o~d 9ï3j5PJbf=823mmo#-׬Yy5Nk6xmg~:+O߲e#,-˝;aD %K!|ǒj٦ ¾9^ a&`fwrܵkI&M<)~CppMGϚ2.ugF|7c}A ?iǣGܢGq9~pt񏐷zO^,]uc"2~; .WMWď|{P3PJGnVQq#3:gל;"JRL#]\GO^Ҁw۝ vO瑂2:3m:Rڴoouׯ[ 02YrFWW 6..ҍw9qwޘ.?GSVd?b/xE'gcp .# [w o<(paa"W;1F&9~~h#x|dN7tK'188l[1c,;w&&̥k9eڸ7r֍!f%vl$oj977?9h&ؿjʼnC_8eABaԪp#擀1"l'w{T5Ό7anD:t;$?j:9ow>O?i3K>>?]9ZWoΌὓ8|ήX[uK\Ȁķp-; "s8A )㷣OHY}| 7bSuzxDf,CrJ? XHS}}+:6+W[WzimVґZ C'*!-= [VNWZ}'"i HAō X,cC*^b4Jpi7=Q{OPf,'3Fr7ꗍ='"gpJqb(=q(I=dɌeJcllT3&IZՙhST#L>Cp BoglSRuf&?$f/ˌ…" Ȍ~fi$22 '^˟*w^|ӳox=68c3dpqqKb.mu/wua>{y=5]uһt\`4]8ŽVV8^=Pf,c)IpU\3fj]쉘B+Œ0hAE%m0Ee):UqDML:ETpL"(24ׁ-gԩI^JRoCLn&'u@L2c4oVƌ~I\+’3⊗yeQ)! 9@(_2v8tg/T3vMj*~^}yEjQ/4 >fML(3ƌI_=rQ 尯lY:3cmp!VdLc˖XVi]]-IgOĉc~ >KVX$# ztg@Q-U0cJA`,Iƒ'0( 6ݽҟB5N )&f62J9GRLuRoG}T1P^k4'! Q酄m4,3V!2,7+W0cԂXjee^pF~i(EhbNXbnXRnax+]TQ򪢲̼y J ڱDGy#Lc}'[j];\/F,ZB:Z-Zs`=U|) w*<̘l8>I%(3V7f ?p '[gD[u-[gf8iFΆ( Rg,CE"qXLG <Ш,l%r2E!@m)Zr]*gL>iVУgOW7m)G\Bd06$P;ag\,_% ߎZɏ 60.}L@whaz J&}j++|J31%H^x66<|yy< EgxRh8GtJ~g JWgJOcD~5/K&>:N$߬M9g"8j^sozQE#QF86ms^w_zQ9c +g>ioڟ72''8[Y߸_]$=f}g_{@<=L'Od`eƍ#.1̸vUGSPPPf\5 c."xyQձC*mk}'^:jw=Z|.ǔ|o;{;idH996_B|̸13c:9x0ʌ)((;3suX0͐DfI{cxXE\z'/?9; tdf23.^*~Q;Z֨#Sc*q=߼}ˎ=~I#UgyڮYy\UvW(.],-F˕> e( >/eWWWWs*(3hf9C.$?g$&xz?o`v:Ňѿ:Nn̦Lu 8єE0-m=xJu*^p#K?;mFhD4>S^IeJnibVq\z!{PuPsSpc}}MȫOfWh:yʌ)((((34\løHNQP -^3KKx9@ǻ88Aɋħdb3-X$jGVEnq:f 7cqWokW䆢ڬy\,E{,ߡRj7 EPNDY9ʜY̖˸p~6a.V>YR񢸼*"&ax,fGy1Sl_tf{>7B6pTkf]| uXGӘ O[RS>(*5 bY`OJNirNIR!p&)*<#:)=*!KtLt}xWvs6e5I a_^okmw>L:jwUP)xA13ҲrYM[vTXi+&&Ŧ3 ɂ`j c EcQΞm@ρܛ83diY RRGGQgUWE/'myei|🧁v8 lyDBzD|jx\J@xaz"W_w#)::* ̭%۵&O5@ǡCzg/c TvWkcj:0:x5.9^xY\J8`u\Roha9K;^E:] I*p89'N#C/3,w;0꽜B6R 6n*ZA4N~f Gȣw(((((dwKf-,D̤GWL\X_Ip XtfF^3e?/o-ǧuBl|6xFPdB@DEn2cMtd2 G5xɄxEHd:{JVVwy[qAu{?Y0k#>nkov8xµ[|4 Ν BxѿN/*%(pG 91 2u:F&BaE#Fp1Xqf GȓB6pTkfJ4r6LS_QKck׌zVw9Uc7[yWQ0pb19RaqCb|9)^IJ8GzYn9uLL_r5]Gĩ];:vr_y e't첵裈GO˷wU- 8ssWD^Vа0c0RvC@(j)EAZx|G'L+M/QxbvLRFTb.PN3NHH )(((((dLe<{*BK00`X}cƌa Ǚ*^"|r8 ᳰ88(#'Ή tSsrnȯcvQ=Jt &oU>-.2D&2$8a ZyxLbɳh[\ a0dm Iѓa׿5wx/^N41,:AMuv14*^d6<ɯ# ZFglwg4C<a|Mvob"3Wy4gw B)nG ײ$<<eə$r/KG""1BbB9jz.ΥXqfl}* X<ˤin8b,1q42A^J+ߔ ~8jwcib EPШ*bﭬgd=-I{c7Hňsw|OU78xl#NIn>|2eE=Ԉ9L^ [Gfw¡XʧSjcq:Νn:z<lL!to68-^s42184]!3Ϟc1 .!hTPl(ȣ'ϫ:f֦55B4.OczhՄXþܾ/FyF럫*^"; 6\Ѱa^?|:}*0L`Ncw}g- d"| ]($QB^ߌEZ6ݲ ;.7] c!X?8Ҫ򗇏022:r$dC8T{S 6/ u<g|6ӓB6pTkf]<ҵh DxѮt_j/70 D6"5|ZXE(Kpl&xmO[ws:g#JrTP  %,kO?auĢ":>%Lj,#7ȸ)\0{=lg#<8~4?,65?\E|1h17Pq㑉co>c¦"6 qʷ?3F1nAԗKJ/O`4/@TRY $+\?""5u 5[0Cp$y~7^c>Cѣ''+?TjU.QGvЎ|!Ix9REt!ǘ'q:NuunMطr4Lm aL| wff?MHGe\8}3&̘%hihGE1I{oA9F1p<|P+(>xMAɱi3&7[ R10V4=WVLrftRzhB6\q'_ #U"d"Tg+86pigy>yQ gvth`aYRkFqw#_L h$?-ެ":\"qV :v_[摩g<^$&SBp^&vτf3 !`@@A[(2c812 >Q3ČDH HtM#76&{6޿/rFK]k( U )(Ό\] K3"SRQ7$~dd„d[T\tDզy$=>IE"X&@2~47Jm 8x|Uu]n̘X\ b5i)4 F J#,,LLȞ^^/gM^ر$T5DT*cýH$( pU f|323._GX^Htrp4pꂋoP4벂%8M0L嬧wqm{/g4e3"ѱy-+[Nt;ْcu1<6[A ϝK]w}bO-EG/*ˌ7ܾȨuM6mݮ]CC?~ŹsƎO&8Ⱦ"ěc3cO* D,ty/ŏ,e8N .xI@T{g\q򝉦OWE>(l]DzԙLF)i3ZRFo'LGof oXas$( τRyx((§?d" Geׇ 1 ʌ)g_8ucxlGx٤I;Aܿ/rZBӷ*(!.*@^]\ԟ3GlfV+Q,9qaӢE˶m?iۖwoD犔33 IǓmaUU̜5opO`W@gF 9G2*4l0jTV2VH\]`g~겫TsKຸz=|#]~y6hl+-ӱ#\)WYxVQ:~JulyF nƨgsoD#i88GHAYZ 2)O@_}?1&όX"-̘BYoQ`N|} D=liA q}AAoTPL61K> sg]]+Q2oۡG=A:D=ƌ!{+)3gf痨 4s6o*i27xC0C%r< f=A/n?f<غQb&KItDuL;=XO<^Hq{V/G0Mo< 1*#pt^3W@T@tja3EO;cӋ“nN @h4a,եK6X-̘B⌥1eN} }=ϖpۃdB:FD4k/M͍ejk[[Qq6xp\V(xQ "xȴz͛!ڬdԨ}O4M!SfL^xq|10 Hހ:{p}ƃKNj˸2Ω v,c)rn$IAf|.rawdOVo3c##SS,.\?Tca9{Uׇ2x+w67| UpjRKNw_9.]#=;PbC cĈ ^TG<@GgpASM̘2cK=`q;vN^t6133ca6ϳrx3jTDeǏj~x(-)w[==<'LuoDtkx_)uO{Sm)JAfG.^f}wͷneh.:mv؃f :yRtCE>>V[>}1Æ eEK[854t:@͌I9b"ab,O/@&˗sw"^Ccfj­hn]1cF ǻlm.? 51qƍϠ;#)K-6;1|~JF1Ì,4I< 팝?_Z1F{~0l$"[ZM3cHѬqĉCk8:VW9R~9FG$V4hH7!X۷ :FD`}{?z$a4, oa ʌoDS65]M"7?F')#x:Z8@Bc@ߺ\wVy gD^J>ّȌE2]w/O 9rf 21گD]V)Vgf|,1qֺuzzylַ>lu7cfk sްQ={hP6||Y }'[v]G)kw^Ot.uƐ ;o8e6}F͌Gy+'R?ʌ{IP5ٱ1@Xx.2>H;n̘A aٓ<}ّ?ٳ6yԐ˖VSxѣÄ&_o?Qq'~/kÆ_q옪,\8TIEpB)C**xwoQ(.ڝ n2L^0H=٧hk>{F/D  7,瘸r%HUmV0USԄWdϰSIx"앥ȋRI$33!&'{vŐXU ߐ&-fN$P"ZWݘlj;ƌL!6x>) cfw 7 >Ee(k]Rg>SSDQ'.I"qQ PwT!D z!_; !An@j8jp.ŲLB\)?"$u[i ̌X`l߮'{vŐ։<۵:8d? 0c8jˌ7\LLazÇ_hÁW]nx<|+n`Ƀ*Oӌիkp_w{G'awy>zlP@K(!Eskfc#F|hr6 ;䧳OA1Ee+~p*okޚ`M8,z9+`mV.|/Ҁw=z۬\-A%n7 +W n**}&CN\~s̼=\H!b9CZ-j䁽'ܕj8Ctu;{_0x>} ʌ)(((-[QfMGWXN8u G3xx hY!9ʌ)((((3f2H($Q|###_ _pO=zlhd$9DrĈ#/aw68VEN}箲g/$xݪ>}* bhݝ;uHҔ!eEr)Wf,Rpܻ:NR$2 D|`%a5n8 z2cʌ)(((yB6 U[x\+’⊗yeQ)! 9@(_2&MyxٳfϑhS$5}u3 f3!TPUW]򊗼҈<"dh 9))("r1r,xq񊋮$6zMԔ!u9G*>j*\ӡ{hkGgγ/FffuKZqʌ)3lf2aܤ+Xt^7Xk3sÒrÓr=ƒb3Ab.ފgU<{񴼪23x%mjST|>Y('9ޏr5^ȗS dxRd#GԘԂܧr>!M]ع6k5eH궾)rJPg5lPzmD:5b-6eƔSPPPh*3F3-}kLge=Tml6`2[$/oߡSeFw|ÜG=}QP,"=P r6B3>q/f2eamBrF'>y$$fAb;Q/*n&ϞKxя* *BB"UX muaKR #bMLL$}`7ӀLJTżX">AUUaCmnD[7/ E%> q9='z ~vQv\Cu 6I3Sh}>91@e,'Ndd 9&L0iVp"[ϙÕzXN^z8~8(^*"2O yrvQQU}![1GRVQRfAbF~Tbjƪ'rmϼPsRk Njy+Q8Fd\jnѭ["T`G:"Y%I yiݖQ`c#OO2)QnDշ|PMRrCg=Wh楂cqMXO蓜UD4D;.wұŴ\Y,.O+K(D;sSr2ST>qdͻPFʒ1 &L0iVp"[Y |yiJ NeQ=2bgȨS%OHNk>9|m>/P*5aW/J|-#c3f„ -ܴEƦ|] _Zs LT YQy At +FF\M׆ʜB83b2'匚C6[LBeCEHyw;_T< ,(=w~hccc/ ɽdES0a„ fXۦȘ$c©g0kxvSn.48(1#ȑVd /,SY+Nn8|r!'bYZv9Ȅ[vKfŃZ$M4*.R)pՒit4z<J" B7"*9JFĥ:qF:HdRU3E U]wKgM}31U`JQGH;4$Z,1!c>安o2LVac g7PE{甑%5fd8 &L(r]GKuT}(~tC!p`MG XN¥eWLȸgtΐ\6Z@YqGUw)+.%~8_X =tlKym y!|`Ȥ(y=&E4 biHAj:K|-B?>g &=8> n 9$qc>2 #I8+@8D^/&6\gFMח &L(ܬuCƿC\Q{ѝ{8x )Æ jymT c52GYm)ע; '7ܾVF@Nf p`QIUJ5n([s E<%LXc<8<~xDBVXTrhdTg#0)Gh.# aJoVU#c'<Ǫ}y? 2R 11mR!<}x@0 "4@ I rD¦1q%)D%33MȸrK@@a1_&L0QFEPi:fc'Q^m遜 1~5>|F3p~[8+t 'ea _h (Z~nQF|)衔wBz>'"wyU9U}v54Ė5|GW2"b3 84̃1"zFhDi'=2d 2F1L0a¤Y!yxJQˮNU.(, m`;Bwa ]q p6w4paG .(B"pJUnbVjzjf>z Tep=lȢl>2̧6JHTbOo=ȃ B"䅐g}U؀LJT&ˉ}?7z]*cg_CJDS^Fz;'sx24%`wg,Ez<@99<eC-Mxi=dLnL0a¤Y SdLj"j (J'NmsH uāDI 9W?c~,1å:  Ħ8tcOlݸ 6wDzf@YPUHS!'  i@Z%8EZ7o*.k&%cC3 糏$mRCKI%2<]^}피JNC1g 4X\Zuy@[t+Dd|+* (<60,fӶ]bq"cV,zWu}>XNo9c`d蛁ɞׇs{{+Tb18Q2_ﭬڷ7>r-kxOf&hKΙkaUX_SJ<5Fe.,R:%ցXa;!̂r3DX\yKy93nc(FZLz@hūs,b6BB[˼_3i9,LxZΟ#`eE5鷶[S6m@XL8sjUmyׇ¿jiEvkS@ԥr=*#4-$5(>L@ k4pt1f+ ~v?.6fnܔ-DQ?yoZNqJ6Y >$AP*dyl x=k3dN_0rvqsҥ4 U?]B=?=m$}ag_mJtnaQPz )pDk3[fka1|'A)OEA)ٟdǏ¯ y.(|smu&cXȘ˨lBl}䝗גdҥC< ƍ[|dE p09sىsvdݻ쭎Ikw.t:~on6_s/UYQ@b8^.h@@y`Y\8PH8N_j'=Cſ5:31f8nLrVRF>: ħe`q"5 8U눪2:pL#T%&[Lb= Ȥ"Uh;Qb}>CZ}.Ih!}o<)cwsV4<@ȥDV[9O-vVLƭj#V,vKkéS,,Ou_'YtS9(H|G_ܝ3\]32nN땛kGvN7G38 D\1cMlhz( @45m,6ڃC5v+@E)91h.Q">I;p"<0s!vs2Y% Ȥ v AG}>p;}L =&(4%ncXlk7=t#~w膀 !73Ƥ\qe%βq򰘑1UgϒPt$i2«+iOJ]ѥ yIϞdM8%E&ԅj۶-XH"}G]{-zN3v_@4Bim%knv1#c"v$mm?X}Cވ#+*)3*)d2|HHxBF7#(p:7p`|:H Ơ l x NKhD ;jtԩ:{)q)IjgpM3K=[rKcX⌡9C(mwOblm5IԦŌ %]{;v 2Fޘŋk}و!eǏKq/ssHCɚ۷g,!Q|n6'89QU؀xj%<_wcMOݒԋ3&(K7ڹ|ԣo_F~@i:ɆL_'ϝd3%<692;|)am,Ҥ9xX~r8 >x2[ff2a<|ofƣ-ׁ1)aQ.Ԗ@:~ nLPKI gFMkZeҙdR k=v`~`$;U/ZyScRILw(4Aj&-cHp(#FI| ? x_^ w+? cbw۝-{j)J1jɚ%ǎ5ؿa5+dxu~mbBCǎ ];p-řnn"2ׯYT Ox!c'".84:JIt`wԘq2Gq5LgR]PYڶ`%h|@Nfb0t#10<Z !eWդ;"#VYvGogr398͢_F|, je#L -Z&e?f3N12fn#"q1VJ5 G of >[e7ff"FРylBqO4#^ 2| /ֵ>Yj?te?kHGR;@QLs-F\/9zT޹}ɧ!|,zHƞ&7Ӿmv?CݽJi1@SC8d]2C!E8n2gVp2^Ū[l۵R%ωjTt/pĊpj(i@&! khҙ|AeAa1ѳ#F|htZdr~\&ؽ̒ļ?#C[k 22f_ ܨL5!c)<Jwh)F9'o@Uĺ˗*lqȺ#,rqvF=fX"nsʐ1uTC/gOcնnZj[B/.CI|4 xKDY}[؎kRZI<p*lق`!!C6t^c&Ko8+i9UyCν'N&8p*,_2jMێ RLE>G:8m`W͖m&jKu-e+k}d \'&H OLeHZtFL> ף АgTx~̌/?uJ0J2d֦׻~ JO H0鞑eiwY2Xȡ :}]%-{dy]V4_o)2Fn(z13\xii16,'S\{2}:iՂE?_V%|'Osq`?xM;&LU8 8m cc.Yvm> =1;:oxq㍛^p 4 r} >\^N{m>xU>1#,_D5:Lv뚐1x7zVV3&Q=\1 e*-ȺXF=K W];C+ϜCV?ɴ;4B]ebd{.!珶N% X4py㏅e=* *S\x'%L,n 4Yd̍'O)y017a܅KVݸ #Eùϗ۶2W)I9ϾGr 9p̅ 15wڍ\\w>s=Vs1{D;z[02fd̤Z1iyQ@]'d,?=3Psh|}gyx G'8 O7 1R0@t)& >17 HNbAFA)Y^PaRv_γ A-fd̄1U~PmZ3ޕ(ąK3j61d(LPD c?M8^UżPnV[JN\@oЬvz*12fȘ x:SӇEP d1RHaaBƴ,|]Roo^[_9y&JV-dRv_NFEYJ9VԵR1#c&L ǥUۮ4WƷ\#xd w4πȘ8rDiV|wѣ(8x{6/#Ѷ OqRŀLKk]sl19R6%x?#cFLtd ?_OtxdLy~͛U]Zʓ<t"Ul %C`{}^LȤ'Obbwܹǎ`nnlj a%>r]6uEjEmYUhN#.$_kС/G㜢`qV~J;6kVwQ~w@Lou}F3a„1#&;#NH!ZkF,XЫ`<&NPz5_a7ffZ$jΪTE۝>>BO͵I۶ :|ٯ4ٞV%SUډJd۶]ϝ[V؛Jg1<ɦH90lm @bdκ&c&S6nJZZoXC[j7>&ZiأLJ_~մެ,%2OD#~~*֩Jg1< [OFں5رKt6+Z ' 6._mZYhOqԎ:+39wP/@e!3fK@L*R}}ĤVUX31}jC$D':{¡ڒ'݃sU}aۿ׽X!;c:;onL{Ɓ'p*CƘ>`KEImkl]P8PGRUU'N\zΜacƠҸ /+6pj&uzStA0#xFjiGE)SQ`v9sxGG^t]~1J}:"cu!O@kO>0Lm+k/Zol|[*Io)U*=3M$~7} G60i՞hM!`E1ad G䀋fcrs1`Tp ĈB'89aMē.Xy1Cŋ+d<ˋCLOO4jUϛ{UҪ%O:֫V:Z$cC$Qap3 ̝`=[^1~p l$*O)>JgPxC@qz[Mho 6eÍGؾH-'L4G"TUEzegA%a~&f=mxdjHsWzb'fJ*g$Ok.]lH2W6mB|D=MM޼)=O1GϴBƪFIG07@Ǝ.;wWR̐bPy07ׇ`K;G7ȤkW?V>O1uSIg|iVJö0,\XB>1jUU̍[LOz!'K7ޓ%%20C+Љ-2G[ <TOT:#GxjfM##`M16$aUM{$f]K4%BUF#&Lŏn=WFӑ66;O&UHd`><㮁1y1{Y]Q(G=gTau+*q2L!hQ5JF࡜ 棡-f͠* 1gJc,(.{de! IJ.0N%P*[VM-lUB7 &BeڶTIu1N$eȘ8ewI\qvOːétF bb5v67t9gc9)]ɆCo༶xIH3W.Kt6a+(Obj#'vttk2pF#-hDt!4a6q{8u*`Te"zgQ#J xxK#%3\2n܂/9[o8$OzDj|fPmH0B#.0N q#EN{z^UXvKZU4P;l=UժN:kL&LDˬG#ɋ͓WƠOY HZ'cŇSo laNxF5`33t;|ZHh:}k"N[ g(a[DC*TUuml~#ccxNZ }FZΞ3w^Kq)i9؄Kw=g"2mI3JNs)`2y||5leؾ%.tR+QiG4b8rUVUޮ4Wu)7纐?wɧϞ]w_l{$Љ6( 0Q~؏;v,ܞĐ-UI8cĚ{ ţ *#gczGލf^ꔌ.mar2" A8Y4_zr!W8' R_84B(xz<)ph1YnmͤjbVm27n|QzO:~5n_lqNw)Jpy8𣰟7~Ė`k:M*zYcUwdp͞#c!#F\F#(P'S"+ӛd.[~7Jp,7u^QUe.*gDU'??8t9,\kc4=Ey=> :jhycMl8dA}6_QUd8JG-Y|D3,B"Z;}0a„ Kt_2,=g,m߾%~|3}$\0'?zڍr&uFiazꎛ7Ilo[qd\~sIU]/VZ{osFBTpF>B&U3V⌿1߿Age.6p`O(qȘ &Ls2J՘_3c}EuSsqAݔ[qYx/k *=xQѽg=xWTfk7]&M_VUkU}SERPb{%`{r+b*ʼ[ww9={t1,]BcRe cLa a|Cwa<@4 XqKA;&2Ғ2ql0,wwFL0aXdʵy@I",~ .k‘ "薐]S("(9=PQGwn}XRY3k\*U%JFUEb1m'SWnc8ד*Yy=Nf$ TM+Uq>׳`pHVe{02j1G)9 D3!+Fࡒ2oxj?'@@^ Add̄ &//#4t@6q}3mLY\{~J/Pn%|y**IJ _Uy>Vʚ{Ee2}'*#*衪rǵ02oB '3IgU$ss!ClJTwfg܆Uwg}Sd<2"^GZA1"Rl1o3f„ F-DvLu,--kzGH(%*5Vj@oa%68s9z\q+UUܮ/+U7t0i}P3a„ # NР!'r-(,8JjK@rĒ]b=~NA݇$U TSTUX)bRμҴܒYsI&  *\4Q tjQUDla?]DC4b1X6t\Bca|^[Z\#*..<#4=$-c>II ҳ*p6f DdmKhl.*M:GF=?pHצdʐ16r"h@.hHCxzƨ[d+=hE&L0Q,[#o ʊYbLLѕVyȵ /Sv 8 9b7' 8AE9E)YeUT,o"J,jJk tjUUx ˶𥦦3{ayo1 ,.>PČ($VpRU]ę]]Ulbb"j Ȥ2|,I\MmSڴTbٛ7kF%L;<_1L!!J/Ppwjk0a„bRx]#&ۇc5juݮIkSF*[XU_KFapZy:>,!>N%e%e$fG%HBeMZtu!Uu36@(3h7X%c8SX\#@'%7ou-u"T@g:GY%I yiL%2ZI%ٶWWwWvUl)Y` ھFEi);yoOH7_Y#SHȯ*. &L HƓ.u_8M1:w|?)ЇPry q֙ xa\3pq)9SJS/7PUڪR‰:*:A糹4@e^/09FqQ4yZQne津8ܱHq*Cɘlh(]%Sp#$s&L0aXpG29y27.WR-vݹHV 5 j\qBx+8Lg | m%?QUj@V"XA/=kP a&Eb=>c-QN|%[6|1)IYvH L*t $pZKu3~Tr[` ~1܈NkxvS~#.C% !8u6ssYBPQdB-;%F!*pQCUVYKu!C머D'z;2NYVK(`!1FhO +8S9_lETrK;t⌤GܼD:c:r (Og 5qc?$QN#M(lmJ+iuO m{OyeS5qcW? BkQ1#c3f„ -Ii6ߙTi݃'wLDž Gh+(}'9x<2+n&d܈K Mu߳_JVyk߭8э$7MxYqGUw9#O(%^X[,2iCLjI=kym y1T`?RLʁcR]j&yfMHzȐѴ E;Ku.ǚO`;] WSNB]B˖SLXHʭ%pk=SPv΢? < S87qt3#cdES0a„ ,=SȘ4k\Q{{MČ"TpU #F  y#nF+Evhq=:ZTҞ}G T[j均\=--G AwFChwV֊ɘsĒp4,IC_A{OmuX']ģ/(OdRV ,WMέͫ>|⪺[+k] K44Eڜ<NkL:fFML#h X).nsX[`d,8 &L(rW|pu*jl1\cƜ0Hh>O1,"Ƿ(UՃ@W¢SpWo&zxk3V^ aqSUMظѪ&foFCϪ;1 % '+h ,s>Pc@g9OTR8t@cӠdȍxC'0 ҶtAaAq`)P]PXF)^YN[`d 2a„ (88xc'? .)6⼛e1\]$!HgXB-8a.;43VRU evNU%xn4 ߾[TqkȘ2;cǰؤ6}@p*%Ǻz*g@&V)w$45)Жڤl\v-FQ(c"RTB{ p6:茝STe z`\qiuR;+rn2dlςR0aD !p):3n޲TT^]Wz/nFb&(hC@{HWcFkB(60尘EK4Mm܄ᠭU%U۸ U{,\ug٭:Kw'@pej9FHj}Y'{b?qDɀШ%f@&E(@j9$N4Hs>"1 E8")*@+CN5Wr8lwrٚ R;HI<ڳd+֥䖣_LR&F)bqbS?seVLX, &L= zƘi?TTRy&-uaZVFVb2w9=c&Irsw0 ߱CXT% T(5!ǹoKSsQZ6MP+H%ܪ̳DqQ6}7m9Zщ3S+Mנ1gq)Xb &L4+zZXi/a.3LMr* oUgr!n1 ibאny&0e& N@3̱Qyc !IB[O@P1ӖQu5΢K|L^cJ=3.p$1`9=_oyy|`_!PBH„fCI^TBaZQ*HhQQ9Qe_VYPЄ88obe ZB H;q.2"\+|~ i 1y79<$l(hQFĦ;tcO);̫*Sc?1ܖmS=)Z0dwcمLZPg,"caCBO41zFBsA7;w#9tQtN#$-QGcq{Z yhⲽwCnFǡ>qQ]$4PJv+ŧ EVyXPs]?T%6 \TodҊ)+Cƈ3 &L(wd앓C t/篛3o(1)9tJ@@31$0 6@FbIy;sf{%VUS]$(mt'_K /o# vzҌܒRϋX=g̑6no@8^0ߋ#$mgT(\vtk?`gn9q:az #61JD|AS%=;J%)8nNqlobZ&UD%#6?Hz LAu˽YS1_`d -&L0Q,[#C:pP@7p4XWG![(-$5(>LtQb6f85Dl e$Tpm.i+W*M]U8Ɇ0fQHU%%Ȭ7ע,roZN1M 3Iܱyb1bj g-~浘 0K׀.z.i&nFur[lF̓*3籓"Тq47â}T:5&%=U.DXc19"΁+TJ L:y&do )iJՊ)+CƘ"dL$Yĉd>dS`gX,XYv5xY_>]={Z.\%:]Ld zJ O~3u AE)YHJ( Dqb1qpb#x ANh0`Dr wT;i6&*SMdPBTLMJ}vXgQ9&9+)#?!=q%tQEt,jQUq6zlfRab(y/|0ɠF0g|R JVp3G >Z!Z 3G(!൐Y:<.JD2Ra4հT.d\chvQqK)G xkx|Js9pLh g*OT` ^\qm)Hܹ2rdȚM׮Iݲi5ls)ViVz?p}Hޞ_Iyyִ,63<ť"?O\\l#8`hBE'.\ٰm4Y؈TUEU(6lNQ;e`ؔ،b)nҏ?/A",8")/ (y\i=g)q5 w_, Di4PQ\JL|l5=1՘˖@6H́JqO+SDA=>8geO/^.x?oܪmNNt~Dd(RM.AGDD`j'8qP$ NI6BIKe2MSCiʋGj+r1erbq޽@"a]{oMһu8u; ;uz5!cy֧r6Io>Y?Օ1#cC"cd>YN 6FԿMd3%<692cqi7y(>i1.de|M1PTTJᄊ >x2<#&MR&Ģr|imRC HcGᱩcR¢9&]-*J0~ n\KI g sJI6FQ<9J.<ϸF h(aSvmG#)_O1`@rf~VAyrN)ׁ9Җq@yam 7#>.p+) 2.VL#i( S rx> ]S(/8X̛Cv[d$#c&gLM|G.m۶mk3JL^gZݓi?Տ?ƌadؐex7 x#av3v՛E\J LY"k1_0e_K wिi0qqtMITލ#mt_I}r67O01ݒCR"sh3#}b3F r&Xv8tk2ᗎ<Lk/uRQ1D:` ^D [w* ݡQQ&dEYXZ䀏↧ϛFIjaDdܯ;'=x__Hߎ>~wd;J2.P(azT_++ruIo"쉋K s!,?yu11ѱ猥mRGd#17w:(pk" *n&f!6-%g([rԈ CcsyCPPA.M ΰs5"z4a3Y$7Y[pc'Mn;TLS|9ω֒ ;#&r{t4^91B2lkۘz4))ܗBfd [1Bq%#2n}xf>`VZ,5ʟ|l5!#؝g~(9YS# `9_"Nal},ȧֈd>n<~|+'c "&Osqvӎ 6S0cirA¡(@.Yvm>J=rt2o1+:vn&u:}Z:Mµo$d'dxSU:$2P t۸lp'J9ĉ/w \cP!FըT]IB'6s[L5dPbwEQ3dĘ3VȘ1Í~b W,;~1H/Xyyh ^ z+QcWl,&aP7Mm2ȱ#qOwjomvj֭aUmKeH3Z o#koˢqMJ˓1)H ` ()!;`*c.mkdQX` L.0i%+n\rp\?{bpYG6 U:gHwcʂbZQRM* %֬w FQ^R Q"J)%Qa߀%U*q4hbv3e+] `8:ܣ0rA1 c63} B6>xݸ%M2a{ݻC1] 2t)~.49==c/gd%$-_ 7]{̏ꑱ+Ѧ-@w^_r'MƟoo$[.^ĕ_/&>>qO>&"T{^CO' \/uyQ/3ڀT%tU;T;bLamwnS"2[gFGqAÇK;v-=|<9E>abb*1!J%SB 1d3BQs~.!c%)6D=ԣkl8IXFL 7 mIRq%ڵC9O+Ŏ$cQPvoKCߺh*Id,MQkESw>V@QQx.`@&44Y1>Fż_O*Caa!0M\ŋwVr03gʈ0vƬNmٹn嫝Db鍱|)U5:Z|ѕՖXShHƐcb2Nؔ d`⁉Ѱٳ7̈rà/?>Ș &:"}2X݂xpC ywBQՄ>2I3*Zo12;1MƄ^O>!/JM+5qn`l]WB A cB W22f„~f*ON"c 6Iƈs#E6B/)TVT> ŋ>yy-y{R'7l?wca%>r*(E;Fԩ #g /vΩ] * 2?^͉kHgd̄ NpҪmJ~wf[v.GӪmCƮqqsij*#;KKRЉ)8x˭LA4]#k~zضj(&EOnn:z4wkz-0aaAKƤǂ}nތdM U%c ad̄ //"?3aȘȗ)ou>fݡ_,wAQǎ)`d̄ &7ߗd?3aXUi5١!cAO12f„~ gU݅1& !J//d,]  C?T>-(·hW+\3l֬Ca/@mD/bHT+aQCǎvbO?pbvcV4oa߂Ҍ},,Z5+%xFL018˓_d,/[(s©b%- da~WZ fPKNVX7:Oi#c +Œ3aȘ1#fȘ0"2xĝ](CA5y!wUgO|GCfƐ*98>T`juK2?辈&a2'BNZذB2V|oo3\v[=>M5;1/~Z޽ θƌ $cU+yJ1?СûۻwYfEFF jjj3aPDsx2vpmx{aXhg+Q>A AZL"aڷܳ |S.@.Rc{ݻ1;o<~׈lۮ ]DA8`9{:5}vĉ6'Fll!д-#o xK3y5hvLZVx%%߂/Ud +Ib$%K02fd̄--!#c"G=Pii jG-%]|ѬJWwN ^ɑMAtjNcǪ6(G߾{glm R>DxM@.0PE4JUM!?'sީݭ=:p!?ʛtL/3Kbds^Қו+GI28q"9kfffbbɓ67~cd঴1(hΝ.9yiƚ)˖-ܵ wE3ILD'ș[ϙ3l461b%>y% Zohn:`m Xv/$\P(Ǐ 5^)qT?Y1uF`R WW8̈0 "?^ :/"twuSJW߷p !ϥ<j rP>WUz .:8#>_6*Ľ;2VްB2V?:+o=h4[Zy6#䌓Kjb᧨kSt]ɼr$;-?>c6!!aob0fΜs"|o>o֐_Q?NSĎ-Xoyls{ϔ%^^MOqжm =j^"#ӰJޠl!pO/)Kk0aqƲ㌅kpbc/-|ꖐOсPL[$Flbȯع+Nڷd`eE ,Zh2wZ}!$ꈌ7Olp.jފ8.~ o6/=㺸(^Wʧ*2d߾}iii?$N:/3Q&ڵtgldC,)|k=ޮotT>i?^_|F`e}zc=ȑh̾+>~Ӂ.B-ggۮZelj*0g ÍG Tw]EX7Y nנAAɟַL7OƸ4۶m;KuZ|_D'iJ}Z'c8;+,kwFFc[b]`Q].B+ Ҕ{,Xcn͗ܛrYyif~\e͚zZՊ"cVHq=pE-|zByu LtM䒖I #!cUy866FBĬY&L>TIƘ矟={0?EX?++6o(7J,662sv6$|1ͷ~NaNCcwXTXݫ?\pIwb FS!){U XX4V_HFZO.sƍ_}Yݻ">?N"DHxg@an}5X)on/DáeGt7ͯ/ml[؝lx:H*fF3w}HU.J 7oċb`J!\h'X|fdTy4>` DA cK]|];\wr ,02(12;snn@Q] 0x0"Wa>aA\I_BacY``p}[A\U$c PWp$%B.)-CDoJ2߉Qk aye}B+n7lbxe~qzIcbr^i^W :˓qaa ڒ ֭[dLY[[j38q^sS(bc -ffxu-B!Հ>}̚=gǮ=/yr.\BIYF6ݶ-ߐ޽g̜7]B#cîpЌ3MLLd{Z ו[$i χ_,!UˋBt@ Soq5nݸU+zӀA&fgZ»d>1o{!cu lCFO@Sùs2~UNjڱvDGՉ`n֭޽{W^E 4`N#27j`?&+<ɓLppֶ-^^Hjvi7mi_)?pPgO_CYR۞ -'/^˭{B6Qp\a/+.]whX㬬DvH=6qJ_tH'/bHExcq3U##GY z/ :z6+{bn" /xËOE:#V&n vu#cFƬIc+fGU ֌=2O!+2Innԃd3ݠE\w XtTqДi ),ŶU8SWYz{',}aJ@8Μbr r#72IkjSSչ9xd,x3ff2-𵓩JȘ1kp `%*:5|lbjjڪU+ZC d8jm1)2yduרQΝ;/[ Dm2,رS_P뮟ByX> ُٺy̻g |GoM(0d,|,~)>ૼE֮ߠX<vSZ;XߐŐٽ[OU69\Ou] )5D\#ce1o{~ ]v _Q G\0$K NEUs22f5޵E\& . *_U و)Se=}{ sBU#oB,yG' ѩT%F&e>ztU!߷O\&^&ugPkq!R׻!QiRey #ۛ)a=aa0.ڼvd,2Fsd'Kr)k0#n{H-" hHYMc17kdV,[OdzR ʒˉsN.zeT ǚr`v KD˥-z@HI9yEs f+fC (3u=BrCaUc:G61s~TW8M>1p,*b5XcMe Sd ; I \SqmfB3a.b1QM>Cf4VH@&&IͱY1Iщ gΖo35 ]P厪L8k,݃ 6y%вkNiR8NⲢ2#<*{BCEbZn#CvC:f82^u8d(ǯ?U5X5pʕ(d+rk>)R(62`/f{4<a4~ ba(HCQ531 KKYc5XSp!otqkI4Xw( G3bizRUa{h"faoJ"aȒp26aJa̔z }9qaT*gQ'cXA_b5XcMe Sd<|!T@>}Jsu+qIV F*)3o)ԏbZ;g0ceb[i=<)lS׭YyY`$cX(˰ LOp0d^IZaK%̫JH.ø<.BlzhtRpT$2 2F ez9+n;)]!#J!wirMoʚHqA-eb0!݇Blu k}\*uh⮺kx~ǹ#(޵`_^!A U1 kƚʆxEx@D0Y0>hmD`n1XYy<3UJ4fPDB`xG%)*|lpĉⵞy%DɌ{3>1T%p87&Cɀ8̡-gR瀡CnI?Ő: f|ZTO<*igM g_~rxZ$4>9 .^~rL& ѓITIIƜ3 @[,%pMEplx(y7(e-(ЈobH J3%(!'c-TnАoSUP,Dac3)#;f.z:ěO?y9aVjc9qep0Uҗ6:O>'OZ%ܠkCqg5XcM{Ș$4w_'g?z_Xd:& [Yu/Nx< f"}EzF9pLp޲n!1=-z$-+nrYEĴY v =/_w/y_$ Qq o6F SP+ YE/2]Mj1+!'cMUƶ{:WU/rK/^(q> ^߂<8ܒO KJ3 .xU^N㊫eY5AL%ꨄ<BL0aD'" cg7;EٙU@ Q8 q30daaA0]䈸C'Ⱦ&"89`WxHߑD{{8zZ'cIhdAI)9EedY7ɤ?a8Xo,b5gW$?.x H>pa%ʼn s 9sdbH ="R55R5G0zUs/>sFj[ |II9ius J3rƿh***UXy%ua4i'TC #cFL0a6f\V6לe(M˙ [(g8ЁCGF.zR,yG3 "lܼca^>3ad̹p Xle[g9s( Ua?eÙJ HtPߛ@ѺfH:jffʃʼlܽO\~mf=‚e>B>p sIfJ6W;(,/ Ny!+ף'LNQrX^LpUbdȘ &L2sSgn6mUKJ_V̫qǘax= .^vS?8~LF;d2/ܨ>zWU&\sR$\G`MOٸiH:yx|2Md9KW32f„ wIn:47ŔEgJoQ!Ip!P'[qwB n^k9vm_/ĘN̏H|+#xU7EJn2WW_|Fq"8#0lưa?Г(ygX+} 6 +4F~Ho9oC*O*UMSaU. K.#r_;kYHYZ5d|Y(mj#ԓV24V G*U"bRr#cFL%w޶mŋvidƍ1'O6PڵksΫW޲e hmmMN6N:F1!R_۷c.NJ>|XZoAq/D'!5;%^rf>߅o"&a1S\f5bڸyOA?` `MD 9+fAxʂ,FYaPUE#b20/EsS9,Z5 +&̙P,.ի'/yw l c z(ysnWQMl۟-kaC*_/C\Uzˆ= *jX@JP|e B*"yqITrPDν^e8؎+Ұ!B;*2OӫJ31F2t钰N+++u6u/ٯ9/2>yT9ft[~}Xex _)efBZN|jvl ]%0p=7 i ZaJVC<-ہQ7ܱ߾OfUٳjOhh9;|KɎM  PM=sdSQ zE@.w.^~Sa{”Qi%!v7mC*OeN0u` WBRԜbD14lAjL p1R 2/$ G5oq#~Fc*UBF%4nJ?~Tg|W8cFUA~CԲeyPyժUo߾M{+UF=Pq@v(бccǎǓk3gsAE)Y1ItJibbj5<!|UxLU栣F) pͨgHg;1>-wa-Wuk\#F8^sQ?+N Oj=N\%o32fvҥKQu6FWRx_8prٹs}-֭{uJ@O?ԩS^^^k֬Wu~Bd.X"q"qx!+@g@ydS E8Mh0uvqё#z>}b iF;(Su8+Yp@n *\3<*by ӣ"IBfmG"V}C.Д y\hNXD>su}Ș1߼yMΝ;w[[[|:th޼y@@Q,--)ceްQFt2d͛:u"&O%Uw :t8jso = |?裻wIg}_y 8ҴiS\,ZnMW2^wY0gyD'hą8aHjrx֕[.pk&Lg#h"B[$ bC% AL߾+{+2Tp'*R^O6aHe'401<<` YO~Tх,2rȐ8T՘3+R91㬶 25o{E|ɼGJ\jSf\ɋ#ԩ8-E~jMaECZثL%mse+}o32fv1 {N<ڨ5EfaW8nݺk(eb!r劮ȨL`e{؄+$c2gչ:'c} 1K`ccW}HħO&{2Gd}M0AԩS4h`2>h6z4ȗƮvfPDB`D"qT  1Cl3Ok< }nny02<򉅤.\ L:>nL:_ڄNR,nh'Q[͔?U*y(!TI?`ޫ?T)OuH-JHGޜ2IΚ4y "O%  8 7Pgu53qɸ3\Q#^ Uy.TbdȘAK,AYSfxJ?~Yt+a[ Sʄsp)vmCӳPJqwwo߾=1u;js2ݺu {FV36u,1[!TUb}1ڲ\o[m-60`;A9ٸ ISj4ptXn" fY y\m;νnɫ\ȍ 10J2moDJU 5^#(#с3A[8lfP%7?qXMUBC10o},08Pxh Krb2F1Boct7mw`o0w"EXir(RYZvY2g(7 zi`d1nx읰߻W~Hp0w`W@_j;D @ƙU-."J^KEuv)䡸8B 4WgntrRh66( (o߰䬰 rb o6%̴ޏZA[~%޼Q_OGWǸqQ9\ˉBp .oc"SI~ٙ4ٳOned+-pTojտ42|RO3yy1|W1 ??c@h%:3V.^(3|plNBfϞ 29Dxa1 ^,2 OYB=}1ݍ֧/ Q㪄|ɷ}$n{xEƤ+L ^'z NHy1V=|?Ock}`b(IK ̈́P ʇez\/db7*b ġד veR5 iՀjiC0}!n$28./<}Y7];^ #S?yY+Ҷ޹ù ա*l c0}Ȑ*4Vt֭u6<(x:dH'33|hgbo„#FoܸvgΤowp\⣖-[c'8O=Q{~osySƟ .߱J JM\ 7.K6lMFAPݒD]HeWGGV/$^ȥ`ffmi\` 8"22٧TW0tH&;.4RCS ȉ LW)c.֭C$mx'c,M^Oǎ#H~۸Jcx q}|ü%qw |Isp6"4L1J!MYVv__lN^_Z1c\l.wBnzK@×] }'f)-rTO3q`b2nCC[~б =|46#cR@簕n Z+9K.w:uM^\iWةD+DJxc^%x_dd:uf쏎^ӧ_6_>}S2&l+^o܈;9Ey{Ƥ˛ yRZ4HE_Uv?wuTp?/&[dN~Y*WDu\3zO> Ԫ_ys&۷Htd3 g95Qcl&O;%! ʨhScOT\~z!p2d5"G\Z|ȮT&0KBRM;U  2:W%44574>m&ry&[wd#y%ď<4!wU7hb\26y|pOx`B~ɘ kJUM nn -.LYT_qt]&~+2 Ug[;,WeuFLT8mNˣ6wm*:ӚXM"*lɉ,42o.[qֽGj;ؼug.1ʲ~w1HֹGx,єai?OR|JT;Ǐ'5og|E}ƍkWQjOoӝ#[:(*M;}J5R2ad̄qȘcOOS33qeb2j̸Y._a6 -]~l[(oG3lŋ|)-v%W:8c ) G)*T~U6h:''n3sW.1yQb&yHfCWJb/JOSkҪ,m{ mү-ߤ UFKdL8XfݛZ2F٪UMWf]͚" dGgi_i*QKb5NzVZTCOO" &FAĭCg_1GVIPnnޔwP`۠;ڷЧ,>z<-?{V5gm3ew#g78015;xfM;w.5J}\9!22a$t{kԮCQH#,pJzÆqd'c_ aQD6Yi$/d^u8B3rc/D$-ߟ0 ,6m4k,`!Vτ|WtbV2VT2}tH$ )ztj&={bڅܩLd ha*ݿ_䙏s>DEVUۃ0lK윝~muD? ŹV%^ȘK2rdxԩ}X4hƌCC 0]S ?c,ֈ%o(&  -鱲zHWۺ5̺L2IvLh[X::n{wl_Y-(ۻf3Us'9V<[T΃v*)֧ONCFw4I[2yus MF:Lk`bVʝ {ue<~>?Uŝ05c )/jdk*)#dl6kFn ,V.$~y0Oj4鱴|Dz֮ͦ[-КK`h۵ks:m۾޽$\'^^^K.5QMcb\؜/R^H,u4<d$*kPm3w!Uݤ6Ͷ_}#jϴ"Wj.zoI˯>ȘTGHmgJVXe̴a<5x9i0PexMT+"kr]Elׯ5JW&[\Ϣ.k*)kaFX2]X:KLj Cl{Dbf.Bݐ!OIB e'9|pndHWWӣUzݧogo~l?yTzϷZ؝ZNtK~-Q~}Dƴպk&._~X IL۞Pwȑ}  Ģ?W?Ц3hQ>c1k4(m.Gt]VM\F=+0*O^ Ot\E΅ RԀ2=PTJ Yk֭;vj~Fƺbeξ𩠫 \諯YfU\9o2w}9m@+ʕhƯC3]U٫#UI烦M[}@HUzvӗX%>UOZ8Mw^i;cy#v?v\V蕌&䍮@:%KZ[#Ñ*qo:lXz{{Lc 6`aM^8lؘٳ8a#NqJR\ /[2c\i6x??x0Eڅ qp%)ƌyD;!2YlY>u@5Ɍer[ W6tbrVCoJ-or醷T\">\qrߴBiӱVR'.'w)%܈_t9 @Uz=D#;}_-6YcwyL#cU y݌3ײZ$4"ɋh)yE!Q )6bTGT{ ܭxL2]ֶ+J%&t9A:D^eH}k'Jq1YaDYx<^Lh# P&2RPuMOT`5xPԾcP ^5'NٰWJÇh̔|Z]XFƬƚNo)kq& HT?ɃU=Yb "!6 QIGO_>x܂WѣD%pgu`υ"ݘq4 +V˗sNÃuQHfx}OH>*=I#yf CF|iYQѢbg5Az'QQ#ڝ=:;|jERjՏZ2o0in:Vz8Cs!i6c&Lt(;@'A'I$qH[NO*͊(WRZIA㼢[wc'VZa/gbW)',IO*pI={68sU꣧!FJEԳ޸qޱc(vDEϗ}},Eȼx֭PM7moߨA3h:kldL:+wt]dӖ1E9XJ~" Є\p$/>3$!cs J2/\Tf'Zǧ?7(DT O6|U ҧkw΃%EFY>]u䠀%[_-4>nӎWtM3iĢFKZn֦͡73uzZC脌3F\`n嗨9q9+eŒ3KUda˳3($YN“0R֒^R$qY2s SƎ)OTBB1^fq%1moONQ8i u7X*]|/gJ܋ݨvZM1[W蕌 #.:{Uǎ(mY7nt0`t~޹[ܿ?Ǣ_|e71!UHQ'>iK?lrJ)B\su nA]ZA׹t:af-P'l p'X!?ahյk2p_UWũn_\xIcFXJٿ:d ϫW޸qoisvLW4i9VAA#cFLEPYWn 伨{1iz8 (aJZ~Jf~RFuw]ןY0_*UAa?<1*ջ(Y  ӹJVV;}^KW[cZ{XW芌W^;4eeX>VnDgg̅7UVrdz Nsg}>?R%,t xW'P];`0# A0P M|:~H  6S}C8۷O\%r*W&,?X.Bx`A~`rڌ3a"Yf wI{ajְhs&p$5$-Az놯" )/^ptjpTbPD¢˅G={;?Qs[PSCO}>w^v Gia*.-W* 1ktMI+=*P1b+Wl:i֗i6lB،ەD'iH\m:'cD֭A_e͚EbfXhp\F\`E$^sS@yu LtM䒖I #!cוd !b֬Yv$o~ D?-Z+cڼcPFMƚֶfD5kQQ `'Lw7']j^ )Cd>h2TR8LwAo I ݵ2G~'*U ؇hjt+oTq!Č|ݪԻwo@t6>3zn10rj޶Oq۶]Ӈ1I.FӸD`iMĿ@1 2=&c@ %sP fO\d,JڴA\wAfWCgd)܆"c1$''gΜ9M4f~wq2!+Mz secF1Q&Bz!Htms؁E%مsJsJ71\)X v> &(67$Gu䔃(wX|WWN:]_*Jhsfݪ Q4gu>n.b  4a ?< 6yv/8}T!֦ E^2)UHkBE^qW:ّLWd2?@8 EAֻ" 3J2Iy+}h8BCgu[&)7iB qrIXM6Õg]KY4^9:3qvv#G@3""Bsss ydw<:ⷀ9s2^l=gaIeڴi~~~ZsIn`Yٳ gΜԪ IDd2GHԞWYly ͚3o0׍;7l?+~{L7f1ͺ~I&aǤ'c4 t@rxQ3}C(,Ⓙ<(LW~p\E*AacY`tRϘC: $L[N2 `+ayGR"?(zXX$U~UNZn`d,?i;xe}Sx ݌C ^_^Rwr^i^W yPlmmr-q2IܬiO8Q)aL+Vؽ{=,IEom'2gVΝch֭d IQ$[$ =DnGȜ H9io 9J/<\QO|XDe 02fdl ޱـl42V;;;0+~d"@+!&jnܸ҉NBU[|X޲cmg,_v}zNajvAL W7^צ5" ɣg?>~1 <{Ce<nΜkkm"$gMS] (J[Lҗ0Q2l~09{\s۴TPDB$a3N.Ы!E1 cRiJTJG]WO.#cXc=$cMDDJ! &f`wg̘!\ N2d \N .8;!ܹ\rŋϔFy+>5;69+4>lJ<>N`#|a :(HNjKwΥ{_uhƲĦM4)ə֟~> *xH*MYĩeL:Q}jxV>Yc!{ʖ#+Ƿoߎ䫌X 1>ce? b"`p,$cÑN`+l du.]*hRN)jG6褌tTم/" )0}ie "Q`2 :A0Ӡ[>ox]1F((#."36&ǥf@R^-!-S/?Pe"jX #cXcdoW*LY?cY x¥p4{PIƤp.ٌ':|S:xuؔdIt2> &:LaXIm':9}QڵkPd8~BdB'*xҫ)*~HYT5U⯺9}nV>Yc7I;OxbdLvJ99922Wa65X$d3?c dz޺іcC"Pe7 "nD,CVlX\Nrt:L(Zh"F֟txȅ!m3g,U 筯Xۀ51DHi3߮adk;K$G}Dr 1M"5kǼytpSe-YcH|^Gȑ#8Vpa >[ R)w칶~!1ʮOH橑+.ƹtV09ɟd'澑=trʭ\mʘ/_?HDPZճ'JJ!.bU"W]H'WQ3٬k7-+IJك<x*XRϘT&*C#24:25ĆHrF غR)Hx+V@]T K K%Ql/fSP}ٓə./TC 9\/UgϺWJJHֽw TY#{,gvm#N08k&p02 QB\foAk`Dg]L|v|1kg( w$aIA1U[$&nHM`GppAPAFHOTd>s )F>JWJ}ѧCN+Dq2!zi)kk w #cM}A3QGrR (X9)T#)d"g'ͻ :\P@_F*V#RcSiĈ>m*Pq2!+Xc5i3~qE ri"|9TOPF'onsd 7nPJp}~c5XcMnȘɻ&Ĝ>}z%ҿٰuӎum{W4ezcBI|?Sa6cXc5،vddlx Zl3\2%)Xc5Xob33y7_:Xg*>dLw|Xc5Da22f"yS!iJ'F;=%h{g*>"d̄ &L/;z V:rT26}3a„ #c&L4JD9_y={ѣQ0„|WtbVjL[#c&L0ad̄ &L3a„ #c&L0aȘ &L3a„ FL0aV1&L0a„ &hLc0a„ &L0yEL0a„ &L0a„ &L0axL0a„ &L02f„ &L0a„1&L0a„ &0a~ˑ#G>P.WVZ*Uׯ7,ZW}R9vؐ!C>䓚5kV^I&[n)-;7nLyիWӓtѥKdtrĉ۵k0۹s߾}ϯUVdúu뺺 7ܻw/#Ȅ FL0a֓PBU}||͕ b2uTd3>}zJGXԩStm޽۴iSߨQ#!3a„ #c&L01"2nٲe7eΝ} VJ;٣>!k֨Q[nzvm\N2V 0Zp nذ!W۵k|)0a„ #c&L01"2a5/i 4ݧЯ}nݒmYk2VXYYɓ'i'lɇ6mެY3&CpRΝ\2+0aRN3ge˖ѻpWsqnЭ7"Õ1g!ȑ#}؅DŽ qA,d, 6kI qϫV}M F % @jD>4F wgy&L@7qttm 1˗/˓PgxZ3^^^}pfW&Ln L4~ uAgǎGM2F0jբw֭[:aВ;XŌ0aXK2D"kR&nMNxX'd AOڵ&Lȓ10qիW+0VZٳij;3g{#R֭[N>H'֬Y@>csFL0a~j>1 GSBW}ӅR' %!'Nݴipe΂Fiq^ cٓT΢7My &!0_aJ :<(# ]]v4Nw?;u6cd̄ FDVKat40T A /tO8Khe9b,$czNab q! 3aD SreՐvfedE>FS@`&stҥ }u' i Ƅ Fl oJ01ܸ9yrq6]ϪUjÇ^3gG۶-"x]u;d6mו+Wbi a7EFA$ܶm۠\׮] : &B(&MR'mAda<"J2srNHuPH>[ԧL"^1&ksj'jxugOpld _|,8cb 6fMeM#(X:L0abd 0bN#2&dтӤWe= !?^ȵ'cdE! J=x5<%B;201^3I޴)YHg?Yv'#7^1W1 C />0b7щT8ed ޽;&a@xGnt"/!_LFdܱ<̰7L2.]TH<&L0ѷ u1I44l@0a"QDEŕ*}x?y2Z%y g4oժ7j{~/5jMo ~o`dX*xj%9]V׮?ի^6?X 2& -x =U&Ku8 ;_̙3AH*;v'^HlJ2!N'fՒ%Kp 얾c„ HRܬpb„ 9|@XvRa?Loc޽!`@dܡ?%\J߁tyi Fz,,+0ʕ^~,;A>mjc!cѿyfTv*{FD9] Jqb„ ܗg #0aڢ<"RuԨk‭˖c[Ytȝ;Ӂ)d8%S%U166%&ú GDn^ְ fd%'Lexy>51a„ <\C@ZLZmlHr( HB,y/L[8_"-&MzN-^g (X2Fx SNYiuX屘0a„ &L*VZGq!wx^oLܾ'ѿw=W^@&Q66(nٰ $e><&L0a„I H(> ѣ0hH&%=}p-.\_| YA%@`;v eGݚ ]UCQŋ8x9a@ܭBJ"Y%XXXl*SC<HӧpMgF =j0a„ &L*\Pȃ|xcO.WX&YD c0"v|*`in(L:{vF#"_ +tJxaÆQK79V%_D֭J|pB.~;ȘVF^աER$GaFRؒ[jeooc1a„ &L ? A񿁞j٦/& D|M`_3-sgr\H={Yz;p3L=ZV!49C_: eA +r/ml;hX8@ݹs猚0a„ &L0 GN0"s=#_N}XTvb7$&11b]QDH{GJ{o_MnLafp0g9g:gW5ܠW1bĈ#F> 6iىppĉ9wᶋۃYq%Xn;1bĈ#F:,7I_b*\pCOJ{㯊8.) .dȘ#F1bĈQp-r諧܍X:s J`b/W|?ΒǛ7o-d|~F1bĈ#H ^MeBBU\ol%)?`FsB##H!}ܒg9E1iq˟˟x{ . + ȫidn#gggRzN* l`ĈJTXEP$,Ak-V8ӌ'MG1qٳ7Eq!9! K,y󰨸&fP- :~3d̈*y#6V(Gƕ^AIU\}ۉsXa2f#S @ ;IyClҧ%OrFƍ5JQL!c1bTӳS6\0bƊsPExذa;_,ns^A?{3G$Gu7n݉##DzL*(/+v%9G9drШmڴAWzdȘ#FC︽fȘ#FDƨAd\EڵRSrCLLőRL^QtCƛg#|fh p=h !2FfBs%*4iGBEVzdȘ#F 3bĨ^!cBrAGGGrd۶mpkݻP\Q迾=yi|Ca1 Y%/8ٗ]Ui8IɎMΊI41+2@~}aKСY(SԸ&Cƌ1bȘ#F6F޸qcrbr04e,2NV? vdX:~(> 8)NsM]y8ǀi<Fh|VTBzD|=o2>v옮 cjOWzzz䠝\5qd̈#TEd̈&gs7IVSS瀌X)~.z |L1,@8&4!1 yStܙ~rM5qd#F=1bc[ jXE1W.熓 j;*?Q` ?>~<}~ً%q0h  0!2F X1Z}傂D+UzJ X#FX#Fs07ŵkȑ۷D3q$JsJ8' ܒg§]2>~\㗅^}4o޼e˖]եjV&8;\nywefǥ!Dd̹R?UK?ŏH'\ޏʰyh1=x8/[VGsSԱ!cF) 2V}eĈC55KrPP]ƎS]mMA 2+/ ư ?}??,o<{3>}] E06ge2fĈQ}`bĈ  ju_ȸc<~U@x>͸ 0N @Lʂ@fcZ CD$`nq281bĈ#FG*^ c֑15.#Nnnԟfħf&gE%fH* 'g_!c8x+E`e f@gXafFx_uZf{zz}d[XNΈ*}fbĈQb3*SJ Ƀe\?<dʠ##BbӉ٘8T쐦 a c!,&醖8#0mSnbS22f1bĈ#FSU'EU\G̥$w[7m/1|aF?B_esyɎΞNn7^Bd0޸qN cF1bĈ#FĻdt-(2! (&=BPb ~HI ⍻ ?J?Cƌ1bĈ#FtFݘ) pm՞!Cr|Cj;E$ *28gH[9QL| Q/X_Cƌ1bĈ#F{ cg,m4Ru<""SYe(FLpjn–VpՇ`sW]G22d̈#F1bHwi֭pĈ'93cO|/;8P', v.^W=)&8hP?pBpe 3bĈ#F1z4zh׾z5X+Vwt:vf\l;Ab섘"bB[l V!Cƌ1bĈ#F>ۡ<8p͆g`ögZ/ - V-&Cƌ1bĈ#FtBEVmira[6n #񈑣x`33d̈#F1bHWȨh۶mUĐ1#F1bĈ#"cb+ cȘ#F1bĈq7N=Lr[l2Zߑ1|*0f̸1 (a}1cƌ4l2Zߑ1qCd̘qctmYg̘1cՇM@;2s-R#LʔkM1sE^Jm5sp5f;6lܸ{}ܣz(MKI͘M~ ~U5Y`$_YQ֭SO6o~A6~ѮwU'`Ș!c5':}.77E2E(-M0l &&^̌jƍ ""5m6&&LxC\֭amnіu#ܹAuEf׮S|-4iޜ:"3  Dj#cEjIAF?x!c1d&$96CRAg8` n߾=j;ę{ )"BT-l 6}Ǝ% V=ۨIѦ]La2O'-qM-(T\a͛GڛyyI\'M{6㠠j2Cl blDԏvcV&ϐ1Cƌ2f`*1%-ׯ%$,"nnM5ÑzzhɞÖE5Tz lz  0̚bt)ל?s{>!wT{ mےب !cj2Cl b!9ظiSщP lT Cƌ2\ z֛7%Tv_D2$$l}[2UMςG [e'5WW?|͹s['?P}EgM>#gM^MM0ĝ{Op|:I :gZ$WOgȘ1:UًN\p[Xw.!2~W5rvv"c yCn,:Nl%[(xԵkW2 ..U. 'abQ>!BTz l#W`D??alSpU[QrG˰07eggՄ 42̽_  3fnDʿAo D*\d wvl ,>ԉZӓ[ 7VxpPx˖-_n]޽9>| 366nѢE @ l򫯾mll2fȸ&&$—F{v)?w"8P2XRsjBl?&$C$d<:AEPm'Bⶸϯ@ ddҥv3d_Su&z[' ?39Dۿ_l@ߢ I7r"3񈆡Aߧ7A0UȘjd ) wވzWTu&}>H8:4Qdpg̘ D*U#5`06Fֶ%66Y>& dLQ7EEa95ozmM"cP߾}4iK>^|yРA@8ߞ8q1cp]v8hhhأG~\gϞ +W7l l^UB<ϟӧȀ7nܸ}k֬  LZ0!QO8!|YqEBۚޢR0!W.[FoqC ?Hla!=]'V;#]LH uӬzXd3vvgȘ142UF{RO!"^vZ1pi osr›[/ n"cPBsoZ"'bHjKXhǏ?/]ԬYjȐ!5"cڴiO... cQ@R{{{77s}ʊ|^UBpޝ0a=r <۷pO?̙3^^^;vGXʫ#ClBw*o߆{ƨaCdDСslz6b%$(l4\sslb@yR.Uz U0(VAQ*!$![li!T%dZErJ?|s$_ 6ivݔxf2f" D c07iuhy]R}\BBj4:Õ|nHx`د@:Hѱ!d> ;׽{wEE"c\ܹs[d###{Uɛbٲe͛7&̙OLd'OܦMe`Ș:,;!uF$145:T2O0"g#2fZ7ɁKSr+X,c7(Iq,hnىkvL6.j8pKbnY.XW# [d@S齪޽K-2.B1(d `WV[ !B%p-fkxS&? &fgmc~ƌ@T:9pi)pY-.#BwiC 2&Nb*R 9r$| U~F0H333\ʀt–'y|x-Cƌk VPSyp [Y_!cl 3Q@Hɧ\d(b cɐ"d<~xG)} JUUd _gb@o'4-CƌM~ċ\YHXgoȐ1clz6 ׯ*2416sLu' K.UUtUVWpPWz/5`1ݻExΝN~1c:4oK 󵁌E7?0d̘1Jˏef`M\ WXXXPT T8{,p6~ܹsݻ#zB蛊X@ƛ0G uaȀH^ߋ8<@[VG3֭ SOQ[߹"磞^U3f\O.@.m$e[{rw ]@ƴ:4r2ȭ (4D!i1`(Mh'Nlݺ5F?3ؒt_+\h/ fX 2fX&չ :T 3fUADWrd\ ."c̘M0 3f̘ \vVt__z."+3f Cƌ3fJ*CƺIp/O*1dfMly#̐1clz[6ܛB!cƌ2{7̐1clbXA"ʐ1cھ ͛>d3fWM\˨f3aȘ1c .Hdg}1c6picટԢߪNKL{*k׏9sȨQ ׯaၖo?vMZx ? - Y+Y[x}f#cSWXh CǑ֭憖o׊^TZâOQ,xZsЪӧ1"̪vmEƀGw2rd?!{ب !\`bTш5vvcg21N9YrWbz+ʬO$[!HHB7,zzV[:&Y]do&le{kז7Sz?o8 voos)n<{ ׊._vVSgɃJD1ʊZUR[TcKK C/꙽ud mbc٘Ð޽+Ο?V aP!JP`ക+%n3FBVM[vv+Q{͚+pAmYAt8*TfW˩=e֊'Xx}?zBݧ-}"zbهn8en-LKi˨tbgӳGZUHj~5p`֭5nڴ¯F.\تMowիQ&m?d-ܳmM{S>?q֭Aʨfoq!s;]\>Y˖8688ZlmݡkW|ձ[7^ϡC`UW߬Y`$DFa!bЫWDpn߾͐qAƛ/\ jۜ'o9d_$4rxpi.hf|7>aMoszd_ e֊'X6.navvFY)&7]ڿ;pec O.V^d= EUE~~6h0xLgXHK;8(o>nb jаŋYY-8tU۶'l߰qc|ڑ9]%dM˰0VR\ʀyzg&͛+/:zߍmuEL>s~ةȸ2ׯ)2...!cب_QkѢEϞ=wA駟LLLf͚j zyy O߰aCzѤI//k644W?MwS7o駟N8֭[cS n~lvAEg4H$+kjpAr=o152ۮ\N%Ufg3FG6v_1Sޢ2kgAd|( *LVly/n rp?[٧ʸ~"3~! *TZ?ɮSpOJ{ 7xYRQA*:q&L^@JdGqdٳ#ʀwdrdh@]%ϜW\SQ@cqUz1N`,glqw iyEeEeO㈵1|_ׯ>'}͖l.0_x }-(4"*6~nzzzlU&G' )U[Wfmy5== W} 8p>x]wO|,9o]&#)J%:Ӆ*<*mj3+tDTTekڱ{v]HF'Aa.sM@?|Xyi{@g!^fo{T &x/]" 8K sP6j4Xx[|e֮~O2V)o~Qv&݄@O~+VPrMhI;9s& ܹsC%N0||򢢢(u EP =[ǎK666ȑ#xʂ5d=z(""{Qf\1:?I 5~||KG x_szv#BիcG\kof h{[Oq>ʵO WO>]UKةM$23'^[>}?':}"l``@[FFFʽ?IHDE߶mۖ&8y$ioaa!BӧO'G|||ȑ+3?AnG겲2mEJ`q@p}a5񕀤wx=X?zV)B/Td&z/6GGy?<Xn~Ǎ1V]vqIzre~;qvc8`)V#Uϵ 8{U3Vk_(E[uX d k9d)7oTf͚5Ͳe6V.2"24w\2p9GM92s'l²@He^>}YEJfLECT8t Yloo>~]-5I%e1r%_\8]ab(=oW2key۶ Яr%NcNȘE} 3‘f㜂B˔ܲ| ҉?8SZӗ?AҲ>t4_mzy:өJ[\Rg5RQlԸKmm1M;p@SgƯ@G?mХ|"}1rS uƧ|3o~$tf)1,3)2T:QEv_|9`||<#mCژVMg ѷ#߶o^XR:2y\诿*,, pD)X! }lB?&dsONHBN(81#`ڍV`HA6eǥ<-zY~ɓ&OUD1m!F7v{>0ŤT3JHώJ)~YP)seU\2' ]2Cۜܽ_d 4YʬO\=xD1%S#s-6)3k׮>\njC4+R&ٳ/^DqȷgNMM}>}AAA#Xrsΰ"#ahӜAfurrShNN.aK]h;as#n#,[9'π(|AȐWW8QvAYlbr6wV/ U{wr%-.9Hx+0laDNBb(LW$r:{QNu2OV;_Tn5HXʬO\]0w6Meչ.{IAOvTX0 kTkKBst"s/X'4{ BL-~Pn,+"éSU9}jzɞNU uƺ]E:N4e ֒J"ӧԪj"#\*}0d,Kyy'D>vڥD@}mAQR/Ե~aa>2`#KQbBOSx(1D&Gऻ>!Q)8{tB¬Ҍ{>d³&.\{h٦#71G|"ΑcsU3gNJB`|,(y%śv\hjD\ Re^BԸr톨Zą{S-SN.޾I`slbGd\TyUo8sl$U Æp&Xgff8}>}va8cUGƠPST"`c1.Yyڵϟ?>b_bI y C$IKu`ZN+I+8a(>9T'$P) -0% 93=‡""xNH<\@|:Dhvq/2/]H(sBFJgMI)rR beA8*2CM _*ʼL9{Nlz!X{ʬO\h-|L[ևE(IPB#JlݰW d0i~2m~|+Făp'L &Yӟow I3xIlH^*ݬܹ{/5gTH)3nljN|jN\JVtRƄbCٳ;qDS#D3"ppt Uʬ-O\WND[m/{ dR% qk! OvGx0jP\j]χe foڤ^+[CIO5өJ;%*m*+LhNZS)UTΣO?AZUKUL F9sȑ$s9GDXjfŋ"]s?RPT//xTd;&93:1#*!l0^ DsWI+Kue.nUD`-)V0hR&VpVR,PH&NT#X 5a#*c v<><sl%ΚB2VF.^G78293q=WY[sn3.&F@<$H'!L<@oe&O!{x\ZZ#v'B%LcXˌK M I:}'Qh8ȅw]kNly+ n$,b=W戁sD6C0͚]b ψO K -EqQNp@27oI|64%e֊'ȏb#** CI .#B֬۠|:}* Qo} JWɤiCDTSrYK-MpϞ*%/GEff8:24t%JhYۮ\!w9e~ BI3, EK˪2l*Q 2 Nj}%FbXabcgOFL7"v8"0PsJ1ژ1cQGaZ`~.d#nj$FTģL<&+>܊(c%3,.,Bİfoy˲Tī(ZD]6K ?*-_aƧ5R"jíZOc*k*6TPRBA(xAכCϪ0/)m$7~';{(%Rm:wN#bT^dHm"c8i`K HTw٨I(PQf2 W dJVD|IQs386p3(DȜ(R5f~갈~qt6w%*uJ ~!R"UX'(BĎO#[a )`sM,㞎qvܭ}7?.(,AJAwlE>"2fXUdtSIO^p5?qIyt~gd4E%ϐ7GKhT`DXߐNn;PyxI#Ɛ3%6Y VwX戍ӱUj`hH$|q? KIesHJfim/s 2ghE*)C|jhRKʬOy*B6[L r"EqBĵ饲EK*$H>f1"*lfь|j"8xؒ`M KDܔnMI7e[&y"$6q~a7볌Q_6=ݤk­KVߤJ+L*$5Dl֒Bk b*HAm@!.KUZ,jI#p##\EI $[?y"@>idCGaC)({ˤɠ]u2brP7 R~ 09rK+4@3~, @'4# 0=S`nԟDNOP gQ̗%ǰp@Gm3fB9SH YqfhzU`p!CtVQDNkO:G"-1 V.a$KzQLfϹ Y$=-}+qܚEcV+WHRH@[pM҃ZHj|?-YsqA*zN)^ɖ/RO1kNWo@HtR[$P`Y=˪!*(|(r}VQ}'OUF׬I-~ܠ2fT1c(s1  b/FaA  xFܸ0F'ВOA@r%_fN̓ s)EEӝ^|*DxKðHzI6C.sRCمO2QrF{ʬO\iddD8pE>$J DI휈.*4:yQy@.dLR4+99"]WXI&f1BIP|ㅒཱྀ܊d(D"P=$AP:dߐ*t^ "ۮJ3R SK*MLQUQvގתr',")1@#AoBH^A.5#CƌXdLN)[gHp4aA 1c*;n```cw H8 OP +`*&f5߰Dr㎇#&>HCaQ@r35D:_r8l̕8*n:* 6L#x.X:}BPܕU/{ %EzDicZTfxV`k. ߣ/ewi#$&AݰBU$2&=%O^`.z,2҇Nf߃ y$T.(.V#άXiV1^~a6Vi&"{:xni  PUZ%QsZФUQI`G $K$V´GjI̛><.Xi4bDߗs\Q7  u sn.".X<~ɪK;2fT+G?)z ExJ.{۞{S 8N`ùyicys)/(}<\iKB0L .y򪔳%Stb  K.C.:Z 'O~6#G@P~$$;Bt`V AufD[AxBlDg8!|vxt>zOg#@U6yGn:V7=vM!,63߯՞NTJ,xS)Zm-Q:!-w´J*!JO(aݷROr&Oc'"HK2fTw1nJZdeÂ(Ss' 1sV7^Wv#T-Iȑw5Vf*EP H.3$=8wc,IT1g-aG<+\&ǀ $`ʩ$$UcN*VNTexv2wYQTr5 Еb$Bxbm"I1NAid|(mj#smSe&ܕK xz=T$/65W"1d̨!}$;6/[JLҾ$gJFMHqҋ1P>ժ0bo@.FLտtɋe2yz*zաCCkdl2vbRrH5;=V1 k@H9D[@{:x ] 0@D=武5e֊'.sσvNxgLdydI|Ysb2nMA}tWRĴT~9 { MD(vHcC |u`M v`pOd9$Ar9+B1% 7o>0;pTvEMx@t/p5ӉJ7LCJeSb"Ъ> ,'jLT/% R=E=$K JA3ըJrdܖߑ@JE5jVFAVEbȘQ=BƜ zKw(ÆD%D%fD#kZ0T%;XQЉ A@p!p1ݼ t+΃d_BKe.{5&&g $UPHnڌ/r8@N2[G=0SBT'wcDr;WDmIItPEY۶ܕoǦ 86%{X[̛ 9gx<{L 2ƱG@YH˹Zr("!n'H7 qL> ԋ^6n>a7xykLqq`=RSZ=cT*V@TZEP#5)Ї*:>˄"*ޡƄEi8$_dNZⷠ 9rU=_W92l ޫ+w+ 6 -Cƌ2FqyIIjzƒm;vEĥ?)4&9(:C'Zye#"x~*zF<a0:.e09{!atkNxa5hQ K M'93 ,nr̙RCD5{PVεU&tME[ R20O'E&f͙b،4)x-Ils+2ycKpuWÆׇJ`;v}Jt3;E-+)op@@հ¹AKP }MիeϒǍv1NT%:Q)uVDTQ94&Yp@nU#Z.w<=]"F8'!5"㚼rd 't._`]"1d̨~!cDccnz.\qvW\P!_"9mp uph:!%]xtGM\җe-@Z`5 <.,&b2V;\u ,TdD\\2K|ÒLy3G JuM2?;uJı*:=/ʕEfиtx><&%ƭ?|q2Mtoq6-+ڮ c4626%F&cZǼ5*.RHN4ƙ/(xTF X7»T҉Ϛ+ r_,=}VOtaӤR"l,OԓLn~ EzSA\A|z$Ou IPZqȏas|U)jʑq;;wT]X)$_"!|BRĐ1zw99nsH}O[mRBχq=툹e"Y.Mo` vO҅n築2sGhuj6v57b HGt$SQÒd&K$GgO o޻p\Ųr"Ǥ*re"q9;k'aG OA66~zBƐ9LTs΋Oˁᄈ$cJܖYx܅Ѵ[njW;Lq`$y/nVwKWCyI\/t>G^bvr'hs7ɏB0gU*G!+R VE̙3(1ئMFn.٧O}}}UZ٭\!cg*dGuϗn:}_OP"&LPYJxǛ s\O^5n*ǖ\s+LEn@-n()ϭBH.K)EgJi;Re ^הO|k]VL W96+QȇI$" LO0 a[I,g#G*] bp3/,/,)#ƒxt%ēq(_rtw82TѣJ?%]DkD<*%HDE61xB`sŹg)b}ʇZ­8MA~}58sμfm*G=%y"at^dfDUd; hЌuoܸNq]v]jQνAuhт!r>)fV%a9e]}=uJc;a48z FR \ٳn!zձ'ʙ=ʊ9y.CͲ;y37 **DZn$)yUTZ+wC:SBT˔8ٻ>|Ȯcɳ"Fx.o3YsD};;6XaÇu>}O? @xϟ, cX1 _:'dxU $Zوdqws/ޥ`9pr"$őr袈&;8F,Q̅¤K+H_^=y޺/);Yn]%QʴrA^'R?y;vN_|<=Hmgxu 9TA°H6Lmc z.I&oיs.;:-Xi+ͥ.~A 9sp?/ +(&06CnT8ѕbo{RTGISBྸ&6V 9ѱ.Q *3YUJDHA.C" R}fwe˕*JCVݨb|jJxA.*1RZ(0L *"i:]5iRoamFF/Ϛwڽ׺ŋ n?li'Zq ҴiS%m&M{(4Hr uСqƝ:u6mv~!k>uT}6l8ύv <ۛA~{ %R駟]t!cE1c20 ZMvfxђQVK҉ 7-[%U8$ q^lI.l&sy w0>U"*yK 3A??5D}e긐V!waGmgԱ O"&xAhW"m1W= &KW](VdLVjUB:n{Ap2᐀b( @Qr7 {?ƍ`O'*E*WۺR٥Έ*,7Ac t0[CX]s}nw lݪBrS7ilH|iĉdѨf-Z,lS2nаCбwǘUW<{mV(Z`g% lllYѷoCuܹe˖@[aϟ?Ǐ711O;!2r~E37o`=u?SN qҥK͚5䵲dtVd>vL@Gݽ{w$MKa _bȸ|Dn$ fY֪9:t_d]v( K[L0'OE):nrčp;t_:.pҢ%]=,na~Y< $b2#鏽ZZ aÇ;% 7ID. 5(DT޵Rw)g>N`=R+ztSiT)UtDTLM2'0& F4V" 1Uq@tk1.vm4vW|+,4q_z& i|';'Mvݾ]Ș[l̘sPI;t }W:&IfϞ-/bzW-d .즓'OVz c0@,5PSIqA6cvΝwLJ| ޽;@0 č(2V~)Mc!>~UP_~cZڝ޲UY%ԛ))#ۨcŅgJs6lm`hR5q!q9Lt̥;@~b 33NZ9]d2gׄfU۞:cG{U]3֮.P W)U.邨VG8x1rysap'@<]}!Ge06wuA$Ց[`O;1zrrx9屡W~l0L:>| ;os 6Cg͚%l`\VV*\7ZhG}DqbȸJCFӦ٩k2+'Lb{[Xc?hs iɾ֏8YѦ)2uYH6t|e\۞.Va&8bheA)Θ=w+AE.;s`Yʞ}W5ݸ9sa-^Vͽ;S){aQ9vűh)N`Ͼdb(w%ٜ,2F (4Tz^ T}Mӽ.Reꈄ_%1Ș7"&L& Wp c ic;xʽ)  @9s&ܔٳW^=y$ڛ E׼s<(p-`wGGhUV*x_֭[AqbXvi"|XX-Ѩ+S sva.YbAkcg۞6oe eRb*.Wyĩ7qʴ%+lasA6lݵh* Q᮷"ĉhGKA ۯ^Ո枞C R찛WV`xWxL۴;6#Y_}D6*fET%Oln;e䤑jbHGA3ڥ ,_ @wuڵ۷\7m:azA#ٌC[V{ho`wx_!E6cQNb8Wd\2VQlX=&ifk0}ž. g,W. .*h@^7j#c0 % F?ΜWy7cƌxUP[}•qz"**.fΙm׾Vp벲?-Rg@OO_vãI!2WxK7_  R{"d|$<ðO davC> IhdSw3MMiۭYg B"9s樎E~܈S1{M?"h+ҥKqSUvvW{D5vv{iʲeӧ._Ṳq!a&<[{-EƤ6hpMhL˭妞wPRT3sC`H4d$g$ !(QE]TXu>[u]yuW]Ϛְ;s)nUWUtΜ;nݻ9 ⬈OKCK>* ܠ Bd&#-oذhYÆ%b*>Stʂ&G}v03#^t pÇ}rǜ9sI"6>D Hސyv+V e/"#"jؽqM{Ʉ bSU+QhcS$." KE *!w>u(gF7Lȧ{fbsX1Nμ}\}XL]V֪&Y#:ʁ>x{egavM=[} |MMm\vℝܫWc845IKʸtht]3S/-b3VC A7`pS8< 1<4dckxƸ&%K36HիxLhkߴ٦2K>f2Sfk ~\=k֒;=F̐5wn`c^ q\~$iˉS&ǽ7:`2E2w¢eyܱСVq?mU!xI`^@ ~^E|Xq (7ݕ_סp` /3oƍK ~-Cph7ъ!Ѻ^ Zy$d dQK+7jT1IFkMo 3b``u,vݺފӀoU;lEOܴ hܩ wʼfL2?2^t(efe7Ö*Ȇ2^pp{F89{$*(JE8)X)c+cF*c{Nw9rxҤI+۷owI>AQ[aRư"\]T#ݖ<eh/ٳVfeCu4b87rڰЄuvṴݻ5h\Uo29)REřTuGPB54 qק/N܌gA eug\9uN܏Z7TA6S?΂cᬖlXΞs0jŚ5S*WvCCMx'OBMظbݠ-ٮk ظׄWD?e!{V.\@#p-*[Yw޹FXq{:20({88w\*c+^zq6l2qeT(cx2!7s~l'ܹ"{=2;|׊+Y|ך>2F: 3 7Ѐ'X[A`*B m&f ިcGi x~{ٮgl{D`#LZU>f\ Ra3.0ͰA,UP;`9]hS*dXVT9z63˒x =Ǎ^;"%um݊pÛR^&߸R} ܛKxr(oqc:20(Q-@nn?Ou]cƌYtW__hX!(cR}]%Dxq_D26(B7j=37" KC൲`l- ?\ WVQL9394{"vzWcIKYaxq LHDN0hvgx3f Wq7;;1D>DC2lKdCJL Jh*yV[ e|޽kiE)݉+,R4umpO/kJHJHU$[bE͈jZXޏEQoL۷o1~H:)f,v0ʗ/)S|g+>Q[2.b72.)>@W_/RlYWC+@*cF#8\bW֞?IaHϞŝ7n&>Yxbj}E'NS,N9-exkkڋXeFc PğkdRh1]S1 Ot6ràAҶjOf8R,U~jV.y7Դ))l *mR]kƽFwSKX`}8 k!LݱCkfDZhhfxg[Ee U<ɓQpxU~T(mToL_yyUXUee8#}$" xY` +cKX886*kϤ,ŤVN2*08ˆ6$+elK26.UVϝ͸iF1ӊ ڂ}،WƦ ظx Vۗ/W[K×5n:>.ŁQQXT)Ztix?#Se_oUB"#?Pvm~!7mޛTi9-pc{qbW4eecˬx&H`wXҎ/p5s\0|)Lrú0EQa]^A&f튆]'Jב#AȺxf(<&]`6ސ+c X i4g|nb2q2F XyP¿B-PƖiѭ(;~+i#5n!\wQmƍ_OSNNNժU¥e˖d5VƗ/_7dff+/f͚ P6x3ts~Ɗ3mZ?c33?㄰c'/򊳻B],tsU]){|22.g3=qel#b i}X&C6'kp!AʜENDILZ͒daXl<NCzuFFG֝c6V9$fDR#<b:TܣGZ^*c VgظTE[EMaz"ޚu[)t 98K/d(|yT>Җl(c ظVD?e YOئjjkxѤg)zkp{駟6VoaL0vҥKO?ԑx*[{66ɓ'ŕ˗{"Qv]%ދz >[L@6:#`p.- ?طg cGPD#tXC\g+t``Z6&%W+ϋ L ;E9?r$`wb `Pn2z+ qNT0 ϔqjj k^"Uh {AS`_tŧ2b[6`^[Qv Vۗ$H3V7 _M::209\ɰgٳX*ǎ+H]Ma>,g\rǏ +2^\gX)H,\f EpL;rC'Hzp)ѱcGqUSN!ЄP0rÜ%e  (O>9t63.1ITTd4ޱـ!,¢uNLw*cEz0Bz:#տ2Ɩ#G&99\r0rܹM<$I*c*cҙ6x8DIW1|mܸC5@cܦfUA`΄pvqv-ZDU.!2v(ICeLdS>111IT$IR+ch'䠍o:DnQ^1IT$IRc-HçUe,ͷN1IT$IzQOjC_^1IT$Iƀ _AeL$1I^12Gz$8#P$I&h+c$$gDʘ}$IR}ؤMte_1IqFtmI$ՇM DWxI:g$Iѵ2f'IT6)@]%7ߐ$gDʘ}$IR}ؤ͘$OG[I$-  ex $b|I$M8Fk I2(z A$IR TAAAeLAATAAAeLAATAAAeLAA  ".aY$  ڌ  Q1AAAPAA1AAAPAA1AAAPAA1  26Q/#$]ie43S"ePg1:$IUYXHhiE򧀼"~=ҧ䝑#oD),4S"Kdz#%2faua;k3XDӦusV"e+m1T̻_}ݏϿ72+X/=Ͽ?F?+;;e&))eO\Bf͚TN(kkң{Izĺ3Pϩ'ŗ\8lV͚ :u2HZE 2femeR][Qfeb|zu1Wѿ}wZ]FU3e_#XmHm z ڮh3Va ~}۫ڏnzcz╷>?'[~nٺuy$e|AzW^8zRs=yGثjp(YDJڷo9gd(D@ -Z4^$'>1=kjm!#>`Zs]t'=$GK)#. ߂OL$ː+orHÐK3; "9a2H7S&ٛS ?GwEBZTY2pV&THZF;1f^/h/vҚD@c?[똭cLq@۳g8lrKm8Z&-Ơg6c~<_OW{cqw>2`W}޽*TH oɰ4Kqܼy:uj-eUk1q8TZAKw #0-F$nKvcôJ".=?&סqeK=|;ȴ=pPRVaJ>uMAV-wnc3_/fq[]G#Pө(ceܰcn3^ٴ1 dIc0M{7m=]mWRHGwч8iS鷾ߋ1WưFt uey>-^eȔ[j{7[NÇ)k?uϞ0W ΅Mczkй~*U2fhI#N'Yy/a8&1wLqq YT)ϹngTD+V, gjt5E,BbayVF]Ӭc3QPx^;WYaCK12T'YDjY' Y@EX)<&&98s?Ү #ʘΟΒ26mZ~M!cNgVkܴt]flƹʸ㞗}uq^:ټss)*ÇC%++Y;w{6bŬ}֟XS?*OL= Zx7BөO`x 8 UFK'!* 1jz,67 .)j$ S0x̙'Z''}YRƦM˟6cx mrZƏoƍ[AO˸Ѯh3V3g,bS,9ޜK>*Uwd80ecǘ14 v*LVg(v!!, ȠGZbAJΣby*—f|=*ٖnaH$yf}-R_ ۭ7{QD~&)•qu!xE]ՋBflqh3XgV`; {%ZqBv%cW/v%L_vv}}ZKnbS6-d Q=}^-o}`yC^B{jhѾgDVjx"dlK]2V, LRQ[p> q:11qcE-܍ݐΟrq֝$Zc\6-xP0 +za>~45£t6c37~;XĖSr G'NLˆV!ƅ .H~T؟/cÉ)1L#YO$-xjʋVlH  bK9@%{w37Ñ㸺 Ia+ԕz (ch/# cJ߀ༀCI~45£tt]fN̻O|=L}?Y4q$?+;; ))ea*X<~1cG:AyGRR%aE ړ>Fm3=UVׯlZsuffZRZelڃ#r)cX5mlg6ℬZq \`$1X#"2|+$VǑc9$ =h;fIG`4j(K.FT,xn#6kQƘ{0.WS5A mI+2V. ؂V`   m ڰ*!V=VttJ2n123سոn f32.+ڌS؛,9ヅlI#IldlI1111IRʘguJeLelJ…Ө9P$1I1ˊ6c*RyDe)$IڌIڌMAo $IeLfL1mƾ2o111IR$mƬo͘ʘ$9ۖp==uNT -1J=:fJ߾qZބ,;vk~aUe˔]j_g;+މ%FP#-~M2vX4E 2@j?*n0_GU`&ݵ"T@o\Zʚ=!l2x*Wpu% BM_M:#ξ ?v{BQ߿W{yy|- +,pH7G%sifUJKG(cY|w235Kè[Rqz|s־bk0θ"թUK)jU+Ux:;D>ବ6iFz'KceeͤNK~==x~g\X\٣2}:On1 B_l!2KQ~OΦwk q=v,=zפ=u7GC$EFх+A_>,'0udɌNׇsLm)ezd Tԁ)|?mbm5{DΛS=/3Wd 0j4=:x}K3[*&ݚ$ S2M=űj) X}$Q8H^0Oa V m_fr B槶F^EkU$ҧZvP+fZZի }dm¢0}eOukU gkgT2~)6lh 6sKj4¨Ձ5ݣeõIhGlђm]Z'-a)?Hlc d7-߸]bhJ7xJybT^_;WKPޝ#{㶢btnl[Zȏ;ċ>OlJ'OraWD7-X1|w ֨Kr 1GU*6o\W傫hL [*SMW}*EjT_ܾ9SݦDHԴޥC Jukd5DKEd>ବMS߼w\扁b[d݃;oífN@+\XQ2biM~qw, 8wwp;l&ӸÆRCggF(0"0.}ap1TN BȳiqcV-J^G6/U3LV)F.Z>}c򔞝[QJ&ut^]"e&i"<WQ.mm5[&獓^1MrT;p| yʏԝs(6O)jEad<5Mkͪeg)5͎㲲f%a#{S▔)ݮ)ʛ'_S|Yx~SW/wyw, f(Et\;Sa,nTNS[#]+nf 2A{Pn_]sWZ:}Y29>)LEQXܾt-zn$jҰ\BfrhBЛQ\@Wq,ا8ٴєB/gFу:psJxwh#nVOy,NvRvQnb,(hV'nc $niúvlg +,ݳ &5+Ŧ2_O7]S)QगQOhm>gSGJ<Ȟ_ؾՓfFW4Aw'/1җ<[il6"ڣSKw1RR4j' dŸM^4FY5cTonKB)}M);ҧI3bmm6|L9|R_!hiJL۵j=m*4lboJeAsǘzcUӭfҮv֤>ժT4 8Y:-KnNNV\aDNSVoY]plQȊ zH/DBZrd}r\UivZ: û⸳k_&cu]K&Il邫h޲jcz\1MrT0rŝM]x:ަЉfSm(M/++},~ >z>#Jʷl fM_(em*ܡmcM|,K)'7Z?:r ?OFg7llѯKk-ƀmק7>lBoK)>K.vx\3c"Ofb+8`Y XȎ;4?tH 2thL4^Om'hiCKڨ~M`WNzH.i -Zķl`)縡F_iz(׊iۢA0M-Q:_.K\EgSMt[*RbP,Nm5 E}C(E]jwEad<Դ9#Ll-d|sZTM&v5y.5RNl 3\4'BP=NVUI)'M-i%] 7MLF)#)wE\Sg1{DW*:)Ôb0'G rhUVoۧRwEPN-zvnyhtge=G(4<% ӝ7̐)=o)UK_}I:@ l%@y1SlUʙ?NƚM-bեͣ!`z`K銹LQVښ9ހ]Iӓ y'oP:Q['hզHtkōV%ʽ -ZMK6j@GZ<ʢ!?-q+!pnQ8yP3YG4N4ix+Ƨ}ӖM5/ TK KbˤmzAzZVoJC+׊%JI~Z4dvW`;^VOʚI]1|`VVVG)E|K@TUZkfi1iUACr@MLj㶽:]$6"[\oT㷹i\|hFutcGvkm6`ЁtE]mXo)_0)a}ud4_#t/.ݸp,maY܈Aڵ݂V՞0g" i֨4FMӸ~MA{MѸ%2 Y1wlJ0{UFڊbu#|G#+G] 8}rSenom6[7@AQ&֧e+u[D[&xD妫>"+׊%8koz5@m(ʳsd+/ -'kgee͌& 4BO߿r +++keq)Jzn|5XYYYYsΟ߽zwDVVV֜e q~lOׄ5h>FazFXVVV֜AJ-5giFv'yˢQ.'0B7,`eeeeeeeeeeuq\jx7=ğJ u:v3caaaaaaaaaaq%agaaaaaaaaaagaaaaaaaaaaqqܶ]_z#s5{ { \\XXXXX A+9S)uC ?O vᘀ,,b ޽,Jw/Yg)psba "%! o!!!! oW!xxxx.?W!B , Y.!!!yLRvm+W/_^7otׯ_X TPk׮˗/|-Zr^^^QQQϟ7e˖"EP+s*eرݺu*UTU?~g ɛ7oś4igsbgawCV^-V%%%IWI!~ժU8xРAW^5sTZuNjժ.\; >g:`xx&.?C<C< C!gϞbY?p@ɒ%)L2#F:uj۶mE)Svu@@/"[ٲe9$_~ cccq@ڵk';S4N{ҤIգK L0\~x.?W!xxA<|E`'N@ݻ"ҥ߿J)]p)n3'O0.Ns2D4KٰaC'٪̜)q1` \~B , x.zPPaury{{ ^'L{KPB̖{ɔqrw,c0YScl̜)&{_HH:AExT5z$+2{Ыn:w!3gv޽VZh cX өS'< &W.zzz̞=!~߾}衎ǗeNHH.Q , :{?JQ) tR04Va$ po۶Mfv,U# )))኷XuO=a-?`04tw |!b !ΫBqwN`(/m\\ !bTZiqM+ZVE09x :T*8[2X*/YYaww^LuKZTB< [ TC#Gʢ k4NQٰ-:Bux2*Ut`ȌneiRAs-X:?T"eMIu8SiB9w,aS!.W >6;wA)y-?^O bxs}2K]It[AUa@߹lgXJ*%;=ZFLDޘno @ԢE }>~ 'HDK UHoVнFQ85w] 'xVG H%fxQbݺu  7+abDNX-־}2 b\`qK.xZ/8³w局<ŒF.dR?ߪU+lK,U(t<:zRG |D/hݺ/6:XGY"[~tRa "j "X] Hwm?LD|'/NDZX0<xaS VRHVǎ=^:e!^] ̬"UhDQtyrK<טsGW-NBRw&)K$G EXDž M{'̓v4ĤCL"QbYIkBJʈT!^;j,ěuq=/+AJix 7z&J#uXBpPBp1RII_MM} >{Ŋ?Q tL,N4H S:@4VNgWoZK?TdIJF9d|(#]S 8n",0HOdEOċ 0'Dj);sC)4:0Ƌ. Ya_Ӂ.$̆O>`P( 3XbG7 FBj*OܹowOiz ?!\Eʮ]={~y굢E5LJzI L_LXrw0=ۭ[d r ҥk"رС/~6 ޓ@C%\*` ` XH7(=ŋcs/zՐ6;$(mocApP|} qYLj17j- G.wqrS2cNx= \|`p!3*,]|q[ui)e!u/cLT J(55<jڴipaUVE@@0AIO4G/);ҹvGʎ/…ك5$$RJX7|!%^pCj6'k10t Zx|[v&>D<qx iZxZ&=1 !1LA?3A9-Ì7X`QH^*` <h~``1^Lpw~&N<*D5 pԀ,Y-[HzٲWfѢ XqqF}J?{ϐ=Jc/ߟ.\o{ϜA)e·& = wDå^|O!k ;7V!FV03s qbgqEqT-e~?!dH63ЦwSa/wo=&E%KS(|_rFXrC-u9\%N}K<٥9˒9eDt'A\xxVVVVVV&xB_,] q o+OlH4!ޱo+#b+ . /(؊.S \#4?>nۄ %k2[x[9!!޾,=c~y}=3,,,J!dgw\x1$wagga.yLR@UM |)XXX̲(PBժUKĉ" DcǎIwRreJ/Y.ү^*69ypM4?+V('B{%ܹ!!! ><<<99XΝ8l0n ,,,΃x=?@>&H?zH?>%|ám -϶md.Rq…at.X{4iR"Eeo.q/Z(YXXuօdСRXSfOOOJiٲ֭[-[&VPb-,|}}i֬Cs JKKkڴ)6)VX222VA?/2g̙bۻwނ VRe4Im:uB3V^}ʔ)ZN!O%-[dy;RRT)um=0^N⁺r >xKl"G1112:^HtѿJ駟`Ϣ{ [oEkU !k 5g "۷ocoȖ"׮]?޽{ڵk+d-rūW>rȫ!^J0= G,:7kܸ1 )))cƍimÆ ԩٚ5kH_ti|ڶmh"x-_taG?w {IF<߀)EG*?9*O)JcM\Qs t4'MreNA ~W^q O& !XmV RWādצM0kM6={XDH*UwEgAw0Bhna%|2-bpA7l i1[B`5k=3ʕʉ0Ļ2WP!E9|}?n8PNT kF_~łz( x2gf{h6`:{׿<h>|_}FmXB<"^ITX=~"'.2Cgl%xw)|IA/ ?xXA8JATxY/;G~x˱iZ#* % (BC"$y) 2_(<%^@J:-xȃ]UJ,.r*Th.t)cOW'xxx+D:U-$cWX#sO<:mo2kS!O ,kmы#4gi6}% ^ˡѿƜ9sP)EڃIHF38Tms߅ ]#n DL$x7{lb (ۢ 0OѴ*'b^$o.G<A ~@yԮq`lrh`4s*ϛ7OՇ({F ,)#G_xњV+[7C@v!&0OZyyi-&]4ĤMo[O8CBLIF Z|I` ! s SxeyD0x DzO>5jD, =b'V[qtЏ ۷oov'XP6-t"x`WՃ{m_,oܹonoj*\'/:r; `C0\tPp-(LlA 8] 1` Y&mKUhE1cuN)H{U 4Mx/k׮]zMRpvҵ"| ' "x!^ P_w"JE}3 SEyׄ%;˭irģ|ɒ}}^b~M~i!!?!^dOdNnpZ-$fB">'\0cw}-4+Kر"qO-z#GZh?dWx؊!/}AD 8 EWi O.]G#5^4օ`iӦ-Hh`Cʌ,Mw&@#Gb$y #jxP8N wRG$|@suRȃRLJwҵNhx"f3m 9V7 *psu zeZuaj#}Hf ^p=ҽ`$8Y1pqE #F) :R o0I׊#7,x\D44c+u4߿ovVCdCf4q/Č7X d0g'īHRR^NʕCɍv/]0 B& 鑗 6=^rfs-,,bfe╂LllBFK8`A`$saoE"H] 4X,*mضB)2*݋ѢPL'MDC\g 'kb"VpCt^bfaXs4 >׊[@< Cu;wH[c^u#=@?x[?Kxա{x|k͞a&A}&C2ī@o) {_'T5H{ޣ<#+G4xx ƝߣGB'WyyyuD v[YEtZDHD[y# ۥJieFSmf2aWϋ!>؄!ޕ!ގ6q }#<:O1c>5}|o`gsX}ZsOYWVzBl?}ʵ5k׬#RhZߤľ#ie5j$`wȐ!>0d+ZNsK9´ <c6'd~o1i8/K!^!vvjtiۅ6f6kS? m;`\gt|&v_=a{6l5۶`my@--53j~TkR"(!> C J.0C`OFCH [ay/N` ǰ"s"x!@46tNui,.s%wr ċp\+dwēa>kěͦkx|(>Ӧ}>>>v.L s]ҙe fx,b(Pl8"uPh9/B0K&/f#VfOA=Vg/E Uq=±^\V!Um0g [9Ɍ/`tS̚D&UBȀ)~IȂlWDulbFUD(b /]Џ6Z@0f"JVYeI௏񯘞QNEI0f'{=CNJwy9rxҙ.՚(}>ĉ[:s-h)qϝf33iw*ǮkIb*A|-L!K'؅B_kī{Ѩ@q"dOǏ2y]4XYϞ5NڧqTkJ?ID9sqw0)C`.4Ɏ;2SNi~nf ^nr&MR2TR*bVY6̖99&&3=!gEOjYk)$,,, ʕ|a:6Mu&M}]zDKK"AlٲrvQ & 1oA.\(&YfJS0}teTddd03koy߳>:MSĿlmXYYsKO?@|ʕu֔ӲHA 0+0@ Vm7R={vj ,XndMpݻw o˩i|kėBgR:NP&*o6[ϝ;gx 8 G[5B<>+Q .AH\K[OfY\kiRYw|ķ߲S=A ,xZ`"oŋ,\X|mOSYVV}eW{YYڜ45WAl^y{pNd{`gaao(  !m쬿pLsFJ!^@!> ՈH ؾ~w3kKWܝ&Ҧܾ X[ ;O [U C< CyZuV6N1,C|x[#OɓQx!0JUe&;W0 .vbkժټgnbǎ!rzM}|AD>CbbYXyZuVVS];/}ˢYyP?n&!:fѢrժ!KMMXx6Ab,,<8!Zv^??~[DYZm[zBE@'f}Y3ܐXrV Uge9յC|$A?3.@UwٷcO?}~o/j,/_&ϿXzΆx]ʚrn,2-5\ V Uwz.B(41MT0fM骙7UPnb I[p9Fo,OM͖JsQ*Ѡ$%) kLRbZmv+ lן,S]#b`_|;K!ޱB2;+νΗ?Џ޳ =矽ֿpӪ;U_R9m*~tmiӤ::=]4otU9sn"JG8!Syse(j njQ-GZ-$. ,]"֭]'T o`_\ n;Ϫ̻'O5RxK#1 $΃xh2e`;Dy4Z$9iZ5_T݄jذ!~ `RUgqHFB*؆ PD wERضmE͝;Z%Jؿx^*Uab<CXT, >w0}\a;v[0 p1g81! +&\/]< 9we ``_g}tgbոx0v45hP0fDh(SN:% -qWbWz]/nܷ!>[7}Vmn`xk{o|!Rݺӳ!hG\vX\9H9Og-.^HeU :bF LVT,YͿ˗/ ;=D0īA<`WqDBLZG@ԝYa1< ̈y76l(&ރ4H|7nPh>WVk)^\O `$d6i%ċ)\v;,jxŕ虁gǼ >sV+-Y1:f/4- W_=}avLݻw㥄Xa4׸!A|@"""a:!xFb3f`ٳg6Wrwē%tvKzy!뀈x; ҋ!&OCLfO^2IF/\(;5lѮKs+2=w ~߾}[֫W3&ܭPīÖpaoa07;Ӫ .v#O-|2@:ZQJ.]0 ] oL? N0,A C ZߧOݣ ni!^xbt ޷ odOqg>~_[} ]8%7oN V^s0),2=&LN 1 Ç-[̌;,-R$9dANp/Xɓ'i>dБٳ'zz@<lv˘M}|a?s}ĀTB< Aa'VF QDgȤEŴP)]鰺,Ŀ[dWnFt,)+yMf;x-v4RϳޝF*{S,<:Sv0 jJ.G"ݒ%#x+1qb0eqHlt|Z!8j Gw,1y)xؙVpTIXv i0nCIZ50~ΜYYFǚXŚ!0\*I- f͚5 q2x@]۷o + ^,]U|ʼn0īA<Xfq>B<9C5j$xį>!wP>B]\c`lUUp6 xP9 az畻%ڋsջwoX˙ڨV!ަ [iف3bhؚɞlGe=2?G\YJ9ٳu۴,p^qF[YZO9T0ى't&{Bh!# #Q!Q4H3Cqt r8 !AA>]>SX܂.N \6m(BLam8޼ySᆪ!`2#F`[sACo\sziknZ}wj::CQcc`'?xS /kKZ^N{8Ań`gtT,ĻKڋ*UpFN/ ETJ\ 0OY*09y3 .VBx 'xLwKh!>Sd~'2[FɖWC< CKCc;XYbx0#%⭾"\Y(VH#NN`ugq"| ޑlÅU:R^۶ap ,?R:.e?'-wqE 㯳85N]CׯwԨ=zt###6lHftp[wF!M&{b ѝ1F@bn`Ǣk͝+] W@<󈤤%df,yEWC<+++C< C|A< 3֬Kd==4|X<]z1%UU$Y wFRNJ~?{٢G? v_OcfXܢewiñ[z7F ұ֩X֯XpFT3Y3g7R qN8ujҥCz ԱKE$-]poqޅl/=s |ŕolcmNz ,, zi7) )㡠:JboT]#ˉmys 0̺JfU*]sMTp4DGChJP*Ty[1}"K9r#_G$$/C4SqJ+j4mi IDL<<eʤKX/?d-8sfĬYkVsȹY޻WcVz!3C gի-@ݻz1`@{-.ܵQc̚Ffdtk FN(YXmЩWW>g[vD~mش.?~_tmͷJ6_{4lQId0^`֘UC64 ҉@6 ^ZaKԷdU)y_}_*!^_5kӸʕVz-Y;4#C;CǥVU D[۱(j^jo#N0dxqT#G S @ r޹ 3}mN7tti[%;;e[.;dk'Xt } M2CzT1pBoWg:.d{oE? e0?y2 fl[Yrpl))A^ˮ>O/8ީse/?~5uN:[nڼܪsmw>BYkFߕ*_1P>em'A o :alf4u}5|)M=mQCCC?\~oϾ mF}؛I`!y} ZDO]8#a-%ħݻEAA:tЂk^:p'GO @|rzbx !112PYڪmgIz Cd+jөSYlh jgΟ5xG&gQ܅1FsSg߃ǩw! E{ /m "[-H=?kf*[՛ q;>s bbzC//2Ƚ{ъdzMl9sp2=qk,Tlcc n~;NU ϝpb UAyǾ O T.]B`'QEMwe%w>4a/Ao'"9.d{Q/!+T[ n xl_vEe \o!|}}u7nKy~ӿ?yo~t<׷_|goױSg}|O?f_,'FVs52' _wjZwZ< ~E3@NfVC;xl&d:㘵0#SY9ٳg?xaa"p ;dkiX^ˤ˕ǘk Qc#xK1~:PTcff}"iAw~eO|tmg{b/׻[]r}zHe]xOexOzC^d~nliZ/a{|w?{/::~`qϾXe# M5yxu̢0|>}XM]a-9.YŋeyΜ9Spa???{HIIiժy*WܥK6C+N>kDx]H߿zG=xڃw=| ~ɳOgonyAchfYȬڡ`񰉙dCXA4ȡ@_e+X4pP&[iĜyqq}ݗǯ̉.YEj}`knJ(^5x-Lj#FO7[o՝F %wTjq{zzĠ*֝2bgcSh~)S7jջYvGH~bFXe_ymx[iKK\T|ǎ)Kv.}4dVr)) u#11Q'::˗/WnNZl0uTa-ի JH?ޯ0HΧ@x.bw X6Ox~/w~5dqŬ6ɐqaVp<Bʬx@#N~\?rtͻ_7& âU<5gĴw>8ޣW#8Q8pv{Cr4ީ[>g־C<&OީOؿՁnFX{I]m/ȡZ,cZzьN0]_6d?:"OXoٙ,i+pAO1"{O&q#E"dMIANϞۦ Z= Ї,]!&&|}IC|!!&GӂjBl3zlJ;ңGw f~c]4tз>ӿ_~/6Pvp.b{*4ba^' ,22oQ[wGDƹbVkr$klWQsXo7t`n_0װZ, #0"\rCݾGX, \ WczČ=L\*y3gԉ]R0鱓nYJQOV#b,mwk1ǖȉӒI{/ԝ~Bn#Ș б< aE'j O<3r H *"[XX& D u<Ӥipo؈>MehpuBD\w7.^ ;zW^-s<@VxsnVmAo%7~j @}H4I]ʀ$2HGRs021^jGR ί\y@rO@ⱌx guZkۇ?iJ\ Wdx*Q0 PУ#zvGYgJ{۽*>v`^zڬlforP,Nj~-~Wܾ(H;Z+8HJGDR*H5 R[z()/i.Ѝ{ZEaYY6BƎ} \ci .Ya֢Ex& BD GGG*ӈ?!^ns*z6@׋m۶[ne!3ISN, p"c8xĉqH:ZY0 7,\RArq0 p":QYZ^גv2[LlU^Hת,SYN™U9 J0kbN- !}#c1"; oA5j {r:=kglp)\8 ia:3wVnjxctaAzJ;>[9:6 Z/t~]8(!c` XfIiRDdcpVz)taA!J=S,e\_/fD,֊|Eخe5F5 \t:8sKd[囨f̤r[\w3:h .y!SVƼ ֹ H~:zjΜ9.X5@%#!o# Rr5]k_Am r QDH8uX9λBҠ&ctYmE4+ɝ/5L#˷6kmm9Nh_DWD"VWXwvq"ɉ'PNTt#kp!1Pivi{&cG5ԓ<.j.?[VcZqS;qŅhV0k̪ƜE\L]I}Q}Wo޾ac\q޾ܧz7pu raq:~nJhR1!^[~sTpd 6 !G3Z};$<񑛙;x{mGymsiy/AĆDe{"hjhC2bbo//fKTK7.]tifTsTsx&C%AMrogQ3ر7Wgw@Fw0/+ ƍx&4"C#zŊx#Ʒ9"*t XpO1~ڬQ GA01Y1x0t^l.  h>WRPZ_\{lZW\?o.̚N"ܪ9 pr.$ڂxھw~4u ˆ,}OP}fVVh&tY:x5$Nf 4dOx>O?:n%n7 ,C9 |Zr͇s7UM ܾx~ҴMLL+Dep _sSE\۹BM=F]Av$]zw`"AxQ"#j |e +6@n޼9??_)@g7? e&,ʥ V01 OW2` |w8}]<9x!{5ly0bdMr1:zUbVIch*oDAp~%O&3ŕEBZQD1ʂ`CdfE7Bqx?/Z:z^^ޝWVKԡDVojC(!~sttKH65mpGTpr ʳΔ~l9lV?"Dc'Бgd ΁kQ#+8b@p}\)f@J#aGFsva㦯l݆j.p;瞫.(2u*{ \Nn+`ylVRh 2/&G؟؟LG Ao5E^K׾!h[??3@=8`@y'N9g䮹ʹ fe ^Ufm鼴f:ȂuXz'N2ZMYSͣf?3 WWYۻX yJٟ*d6Rч}P{dtJK`zjqvt'i0:pJ14Spw^Rv>˄= ߄y`J稷1M2{7SX[v&֙c oB~x)s }ךYc=DO:ȗn%d9ȥr}.9#艼fkG\ht.2^ٶv:0=?Tw3u'F޾IĻDQZ.]-^QT-v[F%xɸG0~:Qg:3UPvvΞBL@[၌~wf@Fv0 $ 2Zgi+<4uT6ʃFFy= @sp :b!, A91R&ˍOj;>%%[u7YcsG[GmŜD[?оgSg-0M4ހ&&O,>a5-HUN=(Wa W ! r!g=㟎NOꆍJXw}%sa' Q؉T  '47ap" 7{±ܥW Z31Qu*bkbksbkV=}ݤf3յZMx UFsCNt~ȐYPIks7 ³~ +\d76{x/&1h' ׭pbLgҤɓU`V TcwƝ~<[g+Y1)YL0;१TܙhƬx>~}seYf=w1U~4m.$ڂx}*k՝&bC#b[-iGbxwwM./Xqyz)Ayeeŋ]L ),,'7q\R=Yԙ!Lݡ݄eҔjJ> g*LqپQRap- )VEsGB3Z`_Lq\KVA6'T5Ԟnj/Y<"tѥj|;ܷmW:մ9qb3sM\OބL?f=@ z !^Lb32\<ei]Vs U6մ/%%ft! {w' ̃G3o*5:Xs͙v5oX5-dyxdD$ZxھBb͘;W[ZX9S;f,^xcGT8xKx*۱c#RXC?jn":V6l+cKP,ԙRE{m w{-q,ُONJܙFob:kK艕EKoFAL :щ>!ѓ&Mz5Qf}0a'iY G(_w̪Eg]OH6۾Z̮))]{dSs'r 4;̨,ViIẗ_i&oV=܃bիWGŲ4l>eU~G(5 ^+x/͈0ԍ{ hk"Vw4ߤA`$ EX">-_ظ}@2-$AE2dEB.ã|>Oj+ Δ` AR?@=O xdT\ڧ>d3c.#mVIn7q[ O_@2|$ ! VuY.4w#DzX(Ltof? U-O'?M HނUp-]Ù*RY;z1v!~ /:>vw@9tbQ>^ ͖ꫯb6^{By__6G斦rsd"+^{3cХ.VNsխt\Ba7($%ێnaSЁJ]_aos#ij~|5|`h9R7&fd+Īkjۉo]v`GD?,H< |?f&Meh=GgV0N8YG2]KNv!s$b}⛚0}"Q3Y{fXa +!Z0b,) )ɷnߑq^eVT0+@a ;(2`AI)GN%y˗ yH[UߠM+\{HuB ^)Arhv;:LLS*@P==Y-c[2q/=#H,H)<~ьV~x% N+ÂE*BEo>#ebnyc %l3Y_7q3nU?W)>~dcoPt\ OG9Mirq>36''VjNsuz?>eyjO?iTN}rNyt/Ws$L`֝VvK-۷Q/l[{'Dl @o<|'iYHeIp[&#u]{Ht⦭9 D*5p+A7ihZ(~"B" 1us"L(yuuu-,,!^h&!d 2kvusv qĈ̝1sm4]fbvNHخ8m;,y2) ^*6Fʱ':4j(z-v1sx Lh6x"VQΚ3.+ʁTB9Q}5vܳsZ^7e9}Xi[HT\tqRb,:-_Fnm(uֳ3x+A7gञ ('זIo⥗^{!%B^^! T kÇY3hEW Prē UySPM>q(2N!~v\iMJЊ'N!~ Rq@'K8cXx#譍FD<wD>dbo)E#6W+MR{`p5}|5$] -B8uXJBxuHcƌ_V^^cccg͚B̈́0LjÞrJDF'/BOg8=&u>+FpGpx.w=.O!Ǭa־Zw|Mx#|',ĩSҧNbK39,,JB8giu-?Ƀ IgD4I-.aV0,*d:1v,dVũFdȁ=eh:ǧBV08 f>TVmЛYYmq|sz#4ҺX ˖M .|50Pg1;@ݼM!~׀\oŞitGx1/fċYb![6ܓ@?_^:B#tBiF]x1dϨ(o޼􊍕GDVIQCgR;ɗݻS6!kת*oE"CI˗몁[o{?LS2m~GmӽKK ^)+.)t!QMRmO@DEI.)f/zPW&Ѻ^;7>+('x{G(B~[Ro ۉ/Bԋ.s@:u*V,3c ?CǏq> :NJc!+c{y꥗fu@Mrߓ']aЀ];U^Grrz_vRNH0f{IMeLP!q >vU7k,'yEbE>dL%}aGwt`i)bGԍq Sn. Ųaś_hnv;voQzi!N"q{o{KqqzxKеۚB~z-I/!B+xTT&Y7[Uu1ё*x ɽǎttorC|PYagY7ooE%22ȮbhAc4/76QV%~ķO>aak· c|4oٳi!WpcO?c+y.))t^yK*t.kN>jwp9zx|݅'%q&Gc'˪0nnf>)7{]_][5Wx()*'|3 "19dfBKrB33!xN(M\Jl aދ j $xK=Ϋ4VWe;{&(9v˓=w4fJrB9{yt161-+{7 DqK濴RׅHBzģ!+:5s)+z%e/!BDt )6^;i֭P.ݳLqOV`p*3= ~zZ"B<Pv?Ɣ>Ab:6zgE|.{'&⣀|QhG ,)5ggqVXXRڂߙ8-/B#iDE!^i Py\F=U!~GPBϑ<_x-Tz* ʱm#6$(,)}t x*/kT]{핅x!+4䳉OLw繁i@OrjO< ,nQ45zBȜ&5U;F|08f( P۰PZdf&xq[ XB]$~0c_Z9ERdN @ 3tf -fxKEr!G~s.YDM4!^рK!)3U.;\p.s۷,?5Oxs媂* S\ı$cLk$'#âq ؿ_6s̾@Vz.чY8 ^.-R`d*/C?qB^xMvSSǞyF饩 #Ų^s!->&Z_O[9>Hjd #D_! "fc#a(wa YddHckBz3 + 0AOO>mlolx&݀oUlP?Yݏ^ m2/izL.=0_:wA '@m뎘v@!y.g矃$Ş\])XK7#FiI%`Ć+ᅬF`zK x dT ܜB֭K+uz F(if|Sl$3_t ./%e/1}$!UUQ]]e{&>::믉u}aT~3֮a 71إf֭0`dwa޽jgxBQCTd3q9u{W0nyyk\\V:8 6@iѣNYY_S&cQ2džSvbsstqqyxFRn"j5ĥK7NX?4@Ϗ%(?mF {$\2QA#GNhoMH _bϡC( 'ezEF5xʘ4Nߵ / zqݟ}fa{ {JF(/pL5+ORKؾXb<]`dXSu@^>=.5o4 +<=xo,f.<<_)ė2 1yd潧Oӻ@O6-1Y#$F;uq)gݚj8Zf0M _߉Y:͸( qf,q xq/f1 +xoƯZAyR&8^O6I H|Bp:p3ċ!],f1-?į?|Xbɰ"P1C<a! X8D0x"UkXK*id9^iĐbH˲!ly ~<-,r_&jTYu!!~ &퓜Xr!,톕1ADW//DĻKtf&rd^HC夻Dq擒u ol*nn3** 9Z|uFicAAlQ8aT)t&U\ċ!],b؊I'f1(VƉWǛAcvU????{n7}RS zzQ?}Z ]=<ez%cgA\| LJ!L ^wuss ES Py|} CHS<Uk(US$pΝ!jA|UUJxoHCY#*ˆN#Y#ʱU8څ^ty?yt'GXv>.vs!>"r9X6~®Op}=v}'PtV&~%>\Gp/FrFgK`?ɡZyz9x4\QQ~pu599<ʭ" Z]"│-m-mU 'JBvNj8ߊ#3+B<7˼@:͐/f1ye3w8!f1yd@Rl맻|.9 _IE|ٳ Y.*KPPf R3t\؅SZx.فO!!o5  4=WEpP;mmt#Tmx ^{ ^ *f1,–a,f1L=azZكM}Khvg}-}_^oT[.S;rf&HA5M\yi?ZCw2aP[ )A|)p{9ft~s!.J }AADb6`c *)vg&W \ojnYܲx?oxMh` CɎ&ŋY^뮻>?_0b6L۝t>yܢݢM{b66E1&,K%SS '7dLNHPi)}ԩu  bgx9@2uʚ |*Tj{u[@EQi/M@Q&w1@:W^5z֟pf6^%D=cpA)kjOXf^\,ՃxAj'OxܜP'f0aaҒ(:[]]q ̧w[%/]ezwhB<`]g wZ !i`Ni@7ptUCA!JVxĠՅ/8jVF<ߙ4IW9;jkjj@lϏO}ݝ|9v}U( ]'\$e62]JUxk=yj;:J`$itF!~5.c.p&9MǞ!m>n.Ҹҝ$eJ { 1I_ :)wQ ѣ儘(JNI=BLzx8B<(e@rUA|6!~Zc0!E.dGīV`ZmA8W~q:$Sn)R͍> ك3ym96O-׏K"Q:fr[*UμWpReee' 7/rf1NCU xI`Zൺx8h┛8deqp#}s+!=X03vйz"ADxs8b A?0؝0J''?_]-P033Eh'^k~=cSK,,J/d<u]Nõ_Ͽt?%7^v?wgq_+|+h XӼ`-hߡzG~~?f}ۙ6g_.N. E38$kӮjI@3wAx6duJV/0z⹡jՃxVA]dnN猕{4h N=9suj*= 2ֱۿ7Ͽn||A8c@wnd+&$=Znʞ@mȩʒ"ᙊ'iMcKFqU~y0s媁Wlf^b(Y]: F+lT/k!#$f-+B<,+>gmW{*xaR2{&6/ۻ[ŋ%+?V.f6v1/ &8tBF9?@qyjZCtwсvZZb<Oi裏PK>(?Ξ@lGdYlBpx"7`C!v3 lڥ^kamǟ}9e%{ @cc*[x >w`i`9vYC^ %:R?g/cA<uܘ1c(gpRnn.&G/f1 w ؋\ %kTd;@F9 xZiApWJLje ^kW::+*ݙNyߛ:h-,Txe@,޹=`\և8矧g~0s ϊh[M ?57F;vl+'''sosDEMB0"CU(Y-C|n!?<0x:xq](B+-Hv'ORWNX|7 ^ɤZ=^i)gF N{oo&b'jjO?7[2_ ڂx;/!@pU9; W/rс}cNvxs {Үc,|1ȕtjN#Ža7\C1Ȑɕ% 'H4UN>ayUC8b-p/*vY٠E0ZԌ-b(wTбA< Px1Y!<4RBHjp8fXZܹ3l_D~Aawoo?!cyNevpB.t`&MԄL*Fp|LiuİC'hi(V`UX:2ecb+&q*rQ[$(.Sja!7/f17 J+$NjǗ!^b]Vµu6@󭬬T^ju677O:r-r[G:ypCǘxddFjݳbF?1A!UE1 +,U_}gMÁ b첀i:u͏0UaF/Bܤ1euQڡj!^b]\s9Jp ї&V6^>=}Whx?][ظpOPw_BijnY(?vqbPzO-ňzbC=qQ .gdK.ﲴVOq^b?lbX?^FU7D &skkos"kR]]힞nnwd #v*J+J+f=@|`m ׯ6w)S>68> ,<ih\|}ܥK'M>nxdl`ct C12l?(b4nǎ׫/vuu!cͽm=W{z() F?ͧOMGSD ӊ1 b  EpE!wDZ1 8tRxUb2b5 @}RbHcX;zM'*}v;0oj꜐ BdH #㧅@iIppˈWDА9qvpG*t;ui 8&F&퐨[1]ssWMQ 3澳biGNř|f)>%:S7EUƇ{pj ODYW.PS*:c\~UC{Ml i~d߯*ձ ^\˖Yϻ']?l%zO{wٿP2Y .rC:=),Tjn%u.D0%=]e5;8/}Uà b_5cKhW(#Ҫb ; ˣ]1+cݙy'];] JX؇+ojAFn4g.6Ǐ/+cW0rp(+D,3PĊ6[A0(=!*Vh\ ̭&-l'D[HD_8ҤwQXC5S+pL 76Fy8ό7 F~ҵ/q_=zߙ?Г.B 0션* {/y}G Դj @QL+&+~V#m/ g+?;M1:c횤 AQ*ZAxEPAMNVvΈ|l^dԽXiTvfl싴 PcMswCAtao/)ӰuRUK_5Tynd@IjV*l-3R~1X<6cczʍۊࣣ)i(ob♛kw ,.fsPyA_Q*,,,#66a&wmqx͘Y *-F ޑGm\yut¢#-ùyH~)VvH qe0ol\s'uf3lɄIl}Qjmq|sPS{T' o1'FC>8Y c塼2H'q>2oFqe]K{[ӫcG\EQkU񊠂 % 4v!&.Z"s HkSXy,ogz3A0WX(G٣خk>s0o`Haub8%4{APHe -*B`ST ?Ь 1+ fg ?7Kqn#\}؅0~Ƕ^WAofTSw<7.(/KvgJn}OQ|ZPXbg'G2v3ԻfW: !Oq]SZZ7I&֭zu66Ą{SnRYS]~7Ju(a6%*UGexs2UA"VE>v~O\D @ 4i_'r<B`pD jK{ ./|ǥ5vW0"y|ו UԷe8B3aA@W{+Ah\PZy)kTU j,ZdhSg^j[Y,mpڷ}Wo? p拾_0 ibj0̓رdf10gr} $zwOdh*J *2Fc꣆1J!IYtTF[U};iJq?~6, 9n A|d`sC⡬%ﵦH4yJrqnOvǮ=_l]ڭL4Y4( e 7J#*$GM&N82PFYxCt$} ;x i]%6~%xҹvzYpIϕ`VPx',ݺSg:s¥[z)VO3{8)b?[HvհʨaxZ^40h&_@9dfjPvT7W6? ED-QEmȽ9ɖVVtabE{lWUl`*P4;OU U!D P$])֏݅$/xIU1q*n6wAȮW/]mutrּI^: e=Y---^7uLň8^=TB%ղ5#-"ҮIK=Ԗ%c֥evjKk_b1B*. 553=pCHx=;>4{3+~ 0t5^F4A*RPþv`jgLz&ɾڰwB<_je-̞|x5i LItj%rƎ]fmjHxtrg%̝,@Ȩҷ" E̺ cг8>:Zsē~|hB`0qb$( OF# 0\t: w_%<~!/^43S3 _I:/D3駊0a0  -T $N{̝yo@J<'gKɔr^)DI!p/v=W[A*g_}RHnd!wT=dؾr[(tQllt]&{ wjْJ98^'yVDg]P^_\SP6R`.Eh}"a+B|V֔š,yS'WҷQb\RT^jĄ9|U#}hQZ6#d[A&gu"Bw%AN0S]6D%c߇LE#)7_*$Lq~t׵֜wcm!Ƣj8P &Js F| ZTڀQ ;rӰ -WEimؒ"-Mh|FĢѪά)2cUг(OxCܰZ juDH6Ls9jdm%G!jh[c\UafƌOc&M"CY]a\@VT]*VR$M[JVz 쳏'O> ~5b ~o׎'̳3.|9O+pT0t[>9Ye :&J2}i2l`\"cG@ 6 /]R.߄ɗo|qؓ@7 C -lʼnSEDz mEj11 K tޠX꽢T#ꜷ*Ȼ}kw bքJZ 4&=OSZ Mzc(HL.QS'jݾcC|`u`Et!u,J"x diD_[U؅!Hj +;Ԉ)%-Dj]Z՚kEZ6"l´.߁±1vP -CCܰZxx8%IauP@ 9]F!N GU6L4/tƶֵ6pZRTS 3'ʐ+n }ݵ8UeT1"qY֬ۈk?{uǎ;v;Wɲ-˒{"JTa{bI{])PrMv߾0Fݏ;wfs7 D7·'@N$ vk!ř)+(@CzljKXd$ p)fÊ {8ǰ0IFmKoUcgAY 6c)~(OqcgeŎIl5V %$u&(60!R-|MK##- %:r~7V\^cAΉ@|hue MqD#!=t*J b*Opm88̩H}l޲ExZ' BGd7Ns.7wbSgXEqvd*K=klੵD8 ȳ5@B}TP[EoQMF Jh]e=׵QbY\ 1 B Dex wLB"bpDI @>Ff?/8SO=]PG{^F"<7o&SxH98)M4[uEI W 3Y[;$SB^An1=DdkzPh˒b'4m[& !#¾^Rk o@tV,VoAU4ۍ/""U8y}2`)AIZ@wb(5 2֥;/8pN@)3rKQ4%p)'tWޮf!Ux<>iis*w!A4g!⒖4,yȾȘ8p45KCz툅E,b5\iCTqBsEG6*YPzZ:</>2YIJk߿e/htrM֌e%+ x\=58y~ޑpU7 ӟ?@ =B |ǭnh<2@4yʇu 0:{7GD Olb 'J/6K R b4g+k U.i-ll'TD]*N5Vgq<\u@=J{ĈluF?93qΗ]4q{.p x@BŇÝV}[Ie0ؕpF xQ, 1Hϩq_(!Uu.t )y;3vgxkp2H#=4diq!RQf(WԞ[V/v6HWKYn˸p- NMNY{ੵgv 8h# &;Q qRPR /pA't􏃛lʇy(t \>dV '@ǵl F_i8.~vGN"R83xz?>$}>ʡy)$H16]V$ĔϬ]s R+8SjHpT \n(AhdB}~/'Cr 9~3Сn<4nO v #F~Q%5ɂ]RT՜SR{H[*Z==_x"͒:MA:-Cj%j I%6 lo< ̃/9vk㸸q+5W7wgNl8xW9~ Jn#AD4Q'+h8:;!<n05H+@3$q|i玜GE4__?7͖3B"J |l&mhNͪ\(Fx16sq?ǏЖ,> `c!5y#2enh?Ej) 92`mqT4=s\8gjּğ>'ϞCb66֧Quj ,NgfyZ'D.,dQe0W84ti4-e>@+o|X< "EvijF*k-^7=xi'j-9bGMƱ :+p߁#pC)Sb2h.3Hkd]kX̟yy9>0j O)"YؓT)±BGPDjrRgW?LO? :+56m =&arXv~Ga~es}9ߡp`yfq\'iBts G[gFĐp ģdJD?@"v N4ROQ /.X>kwmVQj &&$~WHy9)Ս:z`Ѭ/8 uDPd #nQ: [ѩuQ:lo<@ ;&nRv+Cm`Z,yܪM\;3 ?Awiȥ!&bмRU2` aeN0alqTFHw;ۇ9o5ΐ/qQXш}|r CED!H>%_ A見tCgA6|E0{r+-e)!(t֖.qfȔanL|i ,:gnܿg킝gxv)TG^.?͂:ɸoHD#(D OV{{Ԙ]T)%֗*z[LIlIl}qei3 5[׭3N#Q8)|%X_~g'9x8xIT4G(U"S(r'ŇC<εT5Kl61CCTҥ]BUDt\}[]'Α.!:ŌJm- iz\qh^ Z_ *'#n n  ʟ ^ TZw*W=;2z-ZVP [Bў$'w o욹k#x"vƽp`r`AEfi"x^K. G| @٣ó0I9`[*)BM$P4Mۼ"l#4108-ႴYcf4 įONˤ_g9)7шG;<t4cMQ+CKS n2PA₏zMD+KA1ʧ7$>ؼͳvo2> *3DP̑SpH29w\2%g7uk/3OiPMJyWXr rc1~˯{޾ʦҺ&׋3s/b6WmPВ;m#FpYMM.mY@̑!$1?$.SAX 0j*H'etqܶzǺGaq*p@_ѢiWIMFAA cu"x"`AE[$Z8'Be.\ LNpJ9Bd@p<*.s0v h. U趒TZ<=%-,(,^+ҦW'q8NgMP"%b ҕ|VL:TRSbbh^9w"w}o Q" h`OA;u YRհ=o4uHZEUSi̓ܲHQ$]ꌳ}mUV:_vQSFM˧13DR-;M?u, ^E!Abm&2[#DMP5U$&-7q6 HͯJ2$UEQC[iyi-uWljh #A[ZOaV3xYsR<4UuʹR=v9s晰\ )m?>¹ dN&%^'W?$2t2P~ @b9^ee9@UVL)EUX) G ޻W$Sۺ֟'^|߭{AM}fzw)_8rgWOQr x<%ى1u|*Y쟘')K8Kg:}^@,t(:% +c34~&^$--U!8$OzJ2v#-8VQQ$mDZ1TsV;UJo ֶmE _x'R=J]A%\8W|?I_RݒW^Ϛ~oIȯN DOYsUu3 &y~J<W OY&giO?]~II*#*prxj-#N:k @?%1<Ʋ8'xP#l6lbs1㕒?'ɱTxD 8$.hӦؤ=Mp+y>"FW\\›M+ iMFGZc7#Cr4%=ܕpG?__C@A-[݄cALPiFRI>Bi^*הHKU+- p>W;_(~d/P[d " L+ xen 4d#u Nt $BhnçȹPIAB؄7!"n 2\/|Y+@MzS/ZYp5hՎV\c>sbfCCQ5 w<"P AP8so~ )YE;c?Zɪ*{fhjjd˶gx $F^rt$@Ċ!|cH1"BD#G$%@Ez5HH xib=CpM:bO@=krv<读gUE+J* 7Y:r%1$@Gӝ$JfY)C 7 \ieTpkg,@( qSw@W_{̂^zY\q Ó3ĝ9g; ==Š98N͓ 4cg_C$Sv\A&M AA/5'1UVKھH篷F}j;ﯿ_mLL; dl~^xޏ>G鸝 Tk ̩[[r220V.l qjW_CV/+x?læci*<*FL$,쨨~%<*_ ãyD8^@Q%5=|TT8_ &j..ȅ؜wc 5"Isru bLܴTD oI|m`Qc '*%El-(FT q+PXȦy@Nj@A${=v'/|J ] 5l 3* AqbB;T O ;3*;h^Ki-m#yH''5*-+ Muiݼ|A7gVe'^,d EyjAҕ6|Mv`[< U8:); ¨W7ܶ/5g7;<]v G{ML1-ɉ09gY;%33'aiiwK?Wc<^Q(b_ xa7mV8͢gIˤۀ9Գ5=2 >il~2׶ 乚ў{P#M,0=7~u@||ooPpp1.BiF^cDn*(88822,55/F8ǵ !$:M&s$~9gPw ؽ{!Qo@BL6L%!aƂUO<6I9\4,|Z~QC,K: =8, & >4))~`G*/ KIs/\LUQ`+ S\HR3tUUt%e08oyAy(*&KL$j!; S īl|hx5`;>>6<>f+&tE'vҫ<}|*+P?XCh_OdIs)v *-kƯb0MJ42(,c1KB0 NaTlI2 "#;RfRo]X ;$668$$4>G_Qd̒xɌ !\x2/Wf)}uC b:oON6XS;`79+gN:(3֡+V޾exK.,D)9yg=KtM[iw@<ܱ 䙳@U=^b`F H=aZ@V?HvxǞX΀46ƶ$ HX_ ǹB◊SWD=Ƕ)?O}j .* 9ꊮķI#@*+PAAJZE!Cz/^c Sc'I&كM7㎎x  gu[#pNV[Q/ &В lDay1 a1pI"P'KMjG@S'A'jpl t>ӈǓ "GH~pؘ">"BT>jbppEѕi$ ^D7i5".SgfS@ ^[#7YguYg⁕0<8j|[6&#C;ƢbUkg>qtSfK  "1?=MDԡqfă,(JWVR :@ fz[5@/*< Vzjz}醘^}\n"F|b;,#P𴥅Gp2ǨMl[T UdM 3pwjw}#tc'^!tWjT-%,Qz* +Nc7zuF$䎵Yh GZ ޳^{d0Bx磏>/_ /G?`KPȨI0Gs&A ?Gz+J^f0d_coKOxa9& ^uՎcHB%&Т @8)p@N;^㋼@|SK8F4qIeC` ,qi/%+ùPFKMJxt$!(fN/}Kے"`h4b+L?Ņ+Ll5ċ[#Kϛ#xR:##r ŬfL<㩵4_0_y] +x1|jk6>a?P daTO\ ޴#6[ڟ\sr^شPb4įqs~g%&Т H;%D t ]PkxKH 8q<)&\{ gkA1:[6_d ZKEPbSaQC*`$HRѷtZRF9JK\H(UDqF76zuFXݞcby&Z̒<񱣣@ޕ|s7tB?ի_}70\-n @aeW\q?ӟ~z /PȻ$i o> x4_޶ _e'AB'?뮳YyDE2_x W?v {7= _^|=zzWKsxćW_}յ>' 穧c|u)1):Γxf TܱvB1ktOEA{7v^+x]<@n3<|=IR_Cy/nܐSW0p9xnF~[ $ѷoFEς#*5 mX"/?>yR_?OIs|ވ~Y~* T[ _ݱ߂3ODEaџlŝwJ]ߘ@<;9իC0:"wP̚?oDk,W֢ s"~Rh%K<Ўs=&x9~ʇ@@ 2eA<0ƴ$FIvH' 3:_YyDӟ(+Ÿ<[tʕ߅ \vE47 N1 V>/<Ę@3HAdQGLΖ|<.޾bww} ^)h5". Τ #o߫ .12:ի#2:w}R̚0oDk4Wr ^^ã\R?1.DioڵK/F#/:X/S w= $FI#>2hG:4^ P=JKyD(S >}t} ^ e\ի#2:w}R̚0oDk7B q%|۟wqy,8>T^ݾ믧6UW!oMï򅡁p #ܐ䠍=Zz $HȰ!=of DY1sZh򒫫qߕ1 K@=κsvk N^{⎵YEhZ#1\3a["P l i1Dmu^^Wx4j0py/mpS9dyyxf:ZsFI~[K ?f2 #ƻݰ0*֦|nH:ooE0IB olDk>>fx`sL d u֗9W`5fq~cbVy&Z3A<#FLhS4{9\'>,|P(~~}h~5J[Q|5@@Z)&Ur.Tǚ`0 N4ӝ*XBG4u0̀wZcU';lP{DŃ O~rM8x}cJL 8IYw[a=:뎞scZ'Yg}YvYgxYgxYgݹ@; x  @;s}G֬Yab :HeeA_ֹ_|?seee-++g1W\qmW744O>75݈OK.WxP_׿_ 6''olܸ۱3ݾeUFuYw.ij:Ny g?O:;;f`\|kx`8}|ˁx^zI^veC=433 //O?swvww32ҁTκ3u&3:%T2ht֭[ۭ}A+((v]vQ}v5E~ZZxb]tE:A|zz:>Z*22=44>p;- GOxܱ:ߚ#1`H\jzٌ-cm:4N≿O(񀘏>(5\"릛nB @Ix!hށA.ûolmm ޠԏ{tիWF '.|AP 3#mDil R>툂3!9 >,= ;$E&$D'NL(;{'Mjyyy|xM8z[YEoegQ]TTDC駟V-6@<–(ħ3/qn/x`naⓦסA|PHTjkp0~,:.|݁X&ӰnC/6e7; 4Hsźuq_Sy@1G#؋kހC1Ģ𢺺zΝ?OQڈY 9o":{Q$&^[l-"锊@ےJxaq2񾾾#XS) /R ,:3Ť\CBo\xo\|_zt"qj9ڨ bYmi0}e;J:JQl`bAxVAM 8jćggSyB O2<#FZw32B!4( _~ P ˂xux/*b.p/ҷPN߂F|J*SO=p})/lW]u:d" /_^xAE=ע0tbta\UiDYH6` ?M~?%E?W_.+ %KIn!ǂ21f.MA(ԪEWU5! V>B1U0NrΏD}xp`6Q\G}!BU~߿:cl`bs#S=1r@|A7-C2A&8 .}  'Ot͉+qF, ♊\8 qLhރݭT8os+ /GEHxS ۶m:=w}'9rG ^_~I>aOR͇ $sNl6:[6w= =wC4oØQn}_`u m\g'UqWFG nu zS3mԎAN޽x,$T}ŏ Ld%A|{@|dyL2o鋂#F}u/Ð6B d!23 S[ O*]xv;8=0h{[E 7xGL}mne!KAU񵵵<g!y\.>>>E\|192Jay*f GRoh{/%%%,,Gz+"螐m K7WUUA5ń`dD9q9 ^#hw~W_Yb͚5Ob  S|F8O#6b =~x {ʙ۫M񄸆2[qkkUYqqHe ԖU;ɡ,:"pt)UȀ…F\L6h݁-O1^2xٹy~iÒ_auEq]]g`B-ZC r0u<_*V ^6x{ͭ"Hcm"w.R ڎB P`㝏y۴@YJW_GaAUaVs/ѥ%8դ4cOX˱'tk@lI<}Ni'/κK1iN+/M[[h DiI 33K1p*xX[ Dw<~3ϺE&Yk CSǧZ,l♊`qU=x+Ycmyč><\kp?7!?DL+x 9gB:J?Y5bj _+ʱ,#ʱZ쐝TE` 5㯴:oJ.< r(_i MKX)Qʷ- ♊`yT@#YcA33QK?c G)nG?K|ׯ_Oˀ[www|q#l[o[bx~$$$p<n : ;`4=݈">l LߝV՗<ݱnѝ ZY) r78p'O/i%=YڡO&A(QMZЄ2~GGpd c g.nP GUT-$ {bCgAooƀ1uu:)QQ95ah(/X\C8j, AL{;H?$LLo0y$_`* ⅐]B-3;ō7CI@5kHxoZ#'-j/OS|(!?'?iѼh{0|̀Jx \;n?tc@@l'&:tO)@Ƹ]MSx >_[GGp?'{kF)ȏk ^z~Wt '=}gbQ35KY ay ?,<[kH`23Bj=5 #X9Gb[Zv)Ww/2pkA.GI0<*x obR;&~nlG։pO? F o[= X4p:??5~ 7 P QBikN?‚%|!?[6~o XHimbDY7˔Y;qӦ}ilǧ7D EU7F|T&0LIk>|_OxхtK ekij$`!0&M$~ӖI" 2,p*eeK:1aψ% !a ϥ`Q^QȰC -]S]dOˆ⻻㺻*+I肞a{[? 8n!J]pw8~ؑ%Cd*b{!`;8hƇpH+VkVׇx}Nn8 D2+: 1Y _୧/x7|S{d 'u늴" >r\Hw k&^wu&RJ>ii9Kd0y{\B⾹"gb\Q=F@+M*A΁Թ<{xw c&qAtn4vtی*)&tHd$, !aw*mQZ MV3.ʍYYljyp8YpRi[QCQLBڝW~H(lB5o G0WITIJWVG B;>#Z}viL4?(ܜp1B+"RHMh? \Ő,8& p=+HxзŤ" ^D1@1x=8ǚd;Rㄥa,wmٯ?t˹ų_Ɩ knش5"xo/8x((g=q#Σ_y>UltcQ g$d9 Ta3,Kp-ZYV1B#u V/aL M`s;XT/kMt8GD#[R,Nթd)^S,[5#譁@eL{;_? ^+$h|qn b 8RMZMR8- 8cq2;/O;%d8rlJZh@A2$pj ғ;P\Q'= "^99,qe*qc]jH\> `eV[XL(lQv62m~w\?hI*$;TVMap 1m(} bV!fFclUͭ@hwO~-A/g`!gR&(XJb$gXX<5DeM(0] 3@72?r G81T} po0v;vi0{XPp߶Mő@[ݤ'v/bR2*Y,0 m?k-:@4BnD(jp|^~aqdkxBS  hdccsKoX)X+KHWeܭ)b+wgTu$LE,ca}tNcB T9zį^ZD+08>k-O8KxQUMYq/1NĩCNL;ގG} U45wxb`s{(1:$d@L[Z2qD"ƼJe&g=<5wdrL 6孾M!ǎ@ fpʪaӳ󄓀S>Ψ5 T!_igdX0C.8`5}V<ؓXi>dD?=qG4w *~e~@wьāUM[).~›AqP!RGeP ^z|X[ :n&$iJjO1\81prਖ਼C\?x s?F 0iCS #ÓsJ/Ewuqq #( IZ/1!QDd8@ePu\8 Mj:8́IWWd8 t"ROB9g3s I pN 41'*lv΂9Ν;vDα;H,f> XtpùymڡLDQB`%8?.X +|> ^ukpyH唸2 vW ĥIev[~[TIMɁdRv`hni 볰7*Y}O>Lg+, ؞y}5 :C)5t>9% p Ȇ^ߢ FmT tT0R݅eb& M 6*@9PYۄ[I b:Md4mN 2H=HA}{&={m,-9ù$BL%ϯWp+mT7J?-qk O{[2 |3VG)u{P?RZEJ ;pp"P Ĉ|>`N}!C8 @}@pJԎ}Prig CCJRZ@qA [,bՕzwڡiș3G=w9Hܥ\*RXmd{hGNɗW, Q=yh즔0u0w`Ҫ#Lr9w1v _j3@ݙߟ{=w0KTU:=GM P|Љ^>-كȓ@Rp\?ŷHQ3U064vjmݟ I$!&&@ILJ& sqP/CPb;V^ *C'Ey87?3+_p%$!-;O-oʤ2y*zlu{V?b]$d#";c'\'#b]tRCZtp"{l](2,rp6b&틝ıV86=z((˅{'21Vc. twߠ @Ԁ8 V4t$^@b&.glj>ObTy0"1_SB t:~`G9DVk[za j &Idal0  Yܸ;u s8indiWAlu.$!6<\X]nyx᭱lxw\?[%侅c<4%3ŠxLE0ϚQl&j@VVz}J1gR=򛿁^OO6t̕յִ&iP 7&ۑFstrtZe   '>] 1R RLjҴ[TgVgMTŰbh`fҞzfo`J#%ʃ<4yݕ9$`"[ Wɀ[ݞ6"I}Jrrn1K7YIꤘD%E>>VYwtO|Vz(( <LOp|_a}}J.B-̨i([Tռ_./ݝ]Scg,A$S|E\_}g yS ;a !o@bOt"Ҋ!CdZ'A%W2lWS[߄8O!aqgR8mGJSXypH˵ [vWB#?X-o5T[e2%JT_(;KI;NQ^=mTgyoLE0Ϛ ;*GTR(?Lf>{i=pRSp Ձr0LX1p>#;hYXƔ]EBÀ ,'ҐS͛&OV9΀Zn$xw(?k@Nh۞kZ FNIF͕n!ag֎`ʓql!7*ZIy'@S״ID.p$m}Zyp' ^W.TpkMV2yhT:ȼ7Z]Zpm%9o?wJ2NG\:̻XgEg* >,,;K⊕+WK靍xģoO" ty10& ƀGAAX ˎ'}k} Tym@7nF<S=25N}s}.pmP9[pbUs/ d~yCPF9q듁NB6eIPv7$󰸌iP2mC8  9XPZ-AcuD0se!p*N-o_ N@to AtTP\nOQXHIM.xo15L%I}yKshZbp"  .kDWw6j(w^4OR׭n%58B*09ևC(')9_kEdݵmLJj"SDt1 Jwy([<zh=YdѨSHL9&Ox{{ֵ2Aj(K#J$U7  nDӒ5}GhKjL8*L< )BVғS$o0e>j!NlUW&W AȃqiVwޞ6P[[IL?f9%Ts@|WWu]}uuuW_O=;5 ;5'7p|<*l"U] +jQѻG?*6䗔ex_lae3,SVquBZ.H$KqMq?s`P#&D"1NC@*rKJW6fҚ  ٺa 4!jGh,Ţ<="ZʆT91\g+.0%U}W'4ҴgeEIQ_ 0Ab!nhHD4ie%Ts@|NN\W^W]u;5ij&x֤I ģ41yR3m+hAAT$iM&\)-,7tQ˔Y'>5UnF 4?2n'{ .A+%GNWP/w2esbl{OBM$"ZM,+bFvcdn!D*^j~u )@yb:E%ťrɅgNGdvvD~RGMM M |o ܹML,.KK MJBRȢCWAҕi#$6!`jVK3XQI2*(Iwxx8ݸn:Es|m$w6j(5M>gs%=CP#Re H2ƮΑƮ1s*{ y˄⢹8guhEGDշт3FmΑ*"3!3ZJmD\&Š4>L'At)O ypTT#' G;U5,xK :1WQlN58PO`N5egBƫ#%vKOW%,&& 'UlMk9/Eֿ5xt2= dV>rŅoVSLE80 GDDڵk!o靍JN &nvNCOz:Q^>9ŕҘr!fe -SBZfYY2AQ,5vV7bwT6uWSZQP;wf{n/WLoL1l; UUsQG"ֶgx*r|"!i-XgbSџRE%!Qx?A gL(ҿF[Q_WV]YB\] @G$&$@ !r@N9kVwԤ923<ϧ>LOuuuuwշz}rreKoЪ*v{cJRZj_wGi[++KwwtE8g1i'Q oCGx!CX4}pђȄ@<]$[z~DU "]\\C7n+K<2EK^?CGŅU"9l#ث˒.Q1ImgqMQmxBVe>%y!}{ⓒR#4Z߇3:BCdžQC~Pn?(9}y.yyvxGx4kB,$aǢ. S[&Fʘ1cƏ\We2-[ɱ[TMAgϙ w(g=&%LXO7`Š$AVoؼ61L6I Xhʠ(v,f{yIQk2!+ \*:w5$g2, iڙeXCmR;8gtYYEfǂM588:ԣᜏgH5E]uV 14⸐ b9*YWxxx i MM57Qef=yn5`hv5v@py9SX!)59=O w_%j?;ps.Z63:B/OO2PQBla&4`ͦvھ6h8GkJ:I!@l,uEXq'ѣG_x`naH ^>_ " !zS*ӧc`=aɃ'pRn` ֧^~+ (PG)aHss^v/5,?)ѽlެOY>AA6u pdzm=C˽H".= K`A% 'AN[L bŌB.fvlT  *oP n1 L >x5BIS"4,nuE;z2wIo/(:zZ=s|6\/>c WRXuEJzXd=29l#ؾII|E f,kv?AF .pS:!P]\(wf]h" 7d A`xGHPw݃]:]pP)P9ys< Ob9kv?$aA; | I~@_ln5UMx. ]A< Cz1Z,)J6BmFS7#Zp90jZt,+"76B%T@| Jl[Ŵˊ/]gd={I EP?~4r\q?[AA*3_oڱcyW_u۴fҤ7a w~rO78Сc^z}g|c=[^|W*do9^M|hϔ.3#P?3-AZ|bSQW%LH-?>Lqc#4SntLJhC|#GhZ\}(0Cmki)Jжhh7mVY_BO(K~؆GGGWUUa7xe_50Z_я!5 ;EPa.B!?C-ch:?SX9aÆz(wމ{_fy P y+_^5k-ȏ2ŀώ;t„ /UW]ueԨX|{ {5?3e۰\}Ϡ+ϤI'|}84rY?k /Cv-?m۪X6__mzuوk?!n߮]K-ͳFC O<-ѣGy`{v}]r%_~O>%8q"n?[Ç_z͛_+ޫ&^d ݮiի4YD 38' ҢF P= $bjg'wŠQzu3ӜFY#GhZi6ދIH 2U͵4V!Yd.S٫C.q bZX,hdΝL2'$$ϕcOCEPa.<xeN{^<ă 7lCQFW*AiX+24vP'R^{38Qї]J0V[5,8/;qfF<82ta`3v9`=@O__|(=5w[$mGZ] x,nO4 a@jA6/K~www̍)< 4l.E: M‹_<˵[Y|CC3Ƚ11b%y4&Qf4).0J(GhCҌR^^iӦ0(2#ڵkW̰ M6V\iUlw"ca6jĆx uOa+ˡ#7Z@ 0ƫ;(l-'3*/7fb/*k^^i\p?k2w%'@Ylvf RRb0OSr֭ I*hvpmݦѶC #ï;IrX^xܧ0ZbSEᳶ F]k145t(  /JC19bˁ+Ji(jmYYS LU_teiIej6XB# QqЄ^Jn"@+:㚚0滙MͿqLGhl,<*Z?S@]uv"̆xXO4kuI4?ĂYȗcbb.?(t<ޠPxNNd{xtN90IJSW-(CX0|nNv7,JJtM.Bӣ>c&V4 iu1L77~i\Jvɔ_+ޫ' 񶢢7t̂a/qP0aQ/b %8Ek̒U %`^3' HġboAđjnj_ݙɽ^ xlP/[wܸ3ey:op8X;wC\uL9&N+9 49 x!)}W`| ׽ǎ5tpQarX^u  e"#v_Sy1s֘3uSl~}Glٲ4Gx]% ǙG}dRՉ;0 +9s5 oο~W_}&7CBBmaa TpEe U_?ԞFӠs9ݽW `&?;g_5u]dY57LOq@ı^"rfND9 Q3ځ0C<7 Q~9x mya!6OPQR8B!G.*<|Y8X c6"ZS@]uEb^|$l`#3`&D9s&7ľh" ,u 7y2 +x4 5?(|^a'\|&XL|WXf'a~Y55UmNj]tШ 6=*2 `TëVk\OO=unlC(?8|zؾCY9&7xIX೟ıwDquue^ňݎ{CM;-[R !ka{/$ӟiEqjb7m/n%O!A6x.Š]I=/# =7X}a61iy@g%4+xȋ/ GQPP%jA TоCtm?< 9=;JƶO7"`KHHM7xᅿ!CO 9'׏XcxſÛM:obhZo<[o 1T$r-K,袋 A<eBF ql\+ޫ,xJhlW,yw|Dw,!~Nb/!oABBOCky SD]^A~. :9ÊqʒE|I;:(Q$ ľCr B<]tJq!?4vxxJjBOuJxxh㺻)Q #4yO%JE(bU{YAn&Ka6G;eSOO%xJ( ?G [l1 x{ڸUyMRf'ͨ- S(Q #4yO%JE ^^ 3B!U̲KV\% ^#,%g 2gͲ鞝 xh)Q = !(Q.r~RXN6l[\ŠgϞ:į_}]f] BMIIA~XX\͆x]5 gCÍ'nYxCg!^m $$$$ IHH.}nnի_z% +??fE# x,쯿:j(2n8|>sW_oT,>.zO6zZ HOBBBOBB2x Ϗog+={LAi$,dF 4yVȦM,wWI!AwkOΫ'a \^@?A8v ;?vߛq/‹1t? 0 ^,&L0#""ҡl)**oG炂٨Q8HthЈ96"jW[ vcΜ93f_|lْ8CXlufԟ ޚӯL+zDr9wgĖ<#m"ZPpuEWR3;7G{ql4 l۶M;V0U^:#8sɓ''PxsJF!^)pTCлC *j{'|*v@<ʳWk&*xě!}aqssC:J8O|* ij+̕gsS6O2qHUݞ_(萲W[|O&NpJkzO/v 겄Ox}A5u-e5i؂<c/j:x3a;Npgx'=B-~{ ox^P2d>5NԹW)ƽMkHo_x7Vʋ Xvm'HX&^)꫘@/x mM7f`&~e Щ >lEގz;abo$$$ŃI_v{qеqlTK;;`ggv7L~ {{*)  ūd?k 84L5\v|m޼W7YhTbdzV4PedwGNNNI*yK$$Mai,B4U-]:1*ϥM;sFClҜ_@N5-qM8uܨFWoHpa_s#U*!)$_M=SKd/âs1mA:`M⾓6| B,y-PlsbQvJNA<)ސMIz !G12MbqcrGcфPQ XH^W65UUēTЉZ ƽ4c a N09[IrԲ=9H%׽C(W~El%NdÊDC{pv8Ǐ9U6sm! ǷW7:a";;6?f,V Vc ^<+A[c+c+/ Eavoyyy؂pV7B/k6CpO7: Qb}iO\Sn 2ɘɑ\SK 7qgv2CUk:ꝅܨ?& Il^7iÛK)Qr3n[*$*f^ Me00`0hln85R|r/ {+v; sgΜ)x1OBzB)Š(!ky o,`?NJN먗.aK<ܩCW_ v6sEzDP ojD9S'7Y&L<>WAQ˸{7iG}a8p[RV\հǏa$o0]ؖ*t)hq8ăb0o|l,6YOYD<~05 ή?ڳރ'?/[a;;ض&͡\ݎ۷og$O?TDgf5+&ɳd "r һb+Pq'h*VR,?.C.kVl馛 Jou#^Hx |,?b /b` /F u{NC~ L=WŬgÅZ!cs@ւxjpL\w7%JΙ5/Oo<03i@m:Pa\[4tQkchl?"`n]{^iMhUJ/3ZTX%bu,CO>!`.k1xԵGċ Wx 1ag P>1ԉ!4xYv%?]悢o34{Y@p?9y@:zB;( \kus>v5jȷ Am$""nLe^$N}S:I1cN5+f4p9QV1]xh"IGݸ?Wn4kNCPsCR}f&^߀+:W4 06`jx(u0$8ɳ_6'nر 5ɱ NyQxbrݲW%' uԁa&ē9 4dSAəilAc61+D*si@sKV4GhEcEL;- :"%}gyb _7FbNo0+& =ړn5`1r4j HmWٰWX԰GN~vkC,ݚ(nK7$caʠpXp2u;Nwl@?9)ʴɛoqP/KB/ 1bP/ûQJ;jDQqth>.Q{,\d(:Ĝ%klc+|%8;ޙ@$ۦM5& m_;EE%FO|qy?TV.ᄐگMm`un ,)""8"ZF*pw|G|ӢBM-; O7B;θ8g`YPg!d6XSSbDY]R Ew)oemX>J cy5%?CVDf'g'8š ,Q,Xܹj|[Rb`]w;f94&0"Ɩ!&IHd'C6F3Xe'n#eyE^M< e:U6a?8^VQC_^_*V%&B8W῁őK^ӫ9~ N@o6/K,6)I %%0W\ ..:2XtC@1I"'2e[cֱ^G_PRX\q=231$'2 rc2&[J\fμ8 8~d]03_@ձCVmxz!> @xU2ƓA<f3cQa!ސ3U4+kؐ{ЊE>NX|{adkq<4=_ ggPWgҤmY9,յC iWl{{RؖFB~P@ :2z54~ ~l$lol\m𓏏7Cxawz"~ף`+6B^Vx }]dmebc|zMK `Xi-3B℣Ԛ7mUT@kޣ=N yՂEI۲veTWTk.ͫhJLˋIH \‹٩! g%!!) Ȁ;/çHT:0 %}tK F_v+;Zn-l+,mnK.zxtxYѣo'O>ևر,?]~O<:nb$MvE ϗa3H.7va 跛F8qɰ'0_fݰAQUЊ -Yt ~o I9˗̶&(Pٹ׀b1DxcyMڣ G-~vCA|9U& Sʼo(>LV6#qoZpOR4ʯSTycʦΝe Y㷁! 1:7*>؟ywyhJ.nJݔ.):n/ÐIH|o SÔ,F5+dw57npy„a=4%;|Ĉ_4_eeU +Ƈ?v*{FF%'@Ylvf RRb0Os4Wb&]#X+] Vz_݆$RB!EE̜Hm,|<_7nd &񉉺/_rZbNw 񾂊]C iv Y!a.HIS=:N3(*UX} &lί-knӶ%.0L V7ICs+ʬx,ycA<|P!^o|t%Xr̄7Fy3x}k?`F ƅGL*a 9Y6*EO챢`W]{q̉V]<E[_^+πO; ׬{-ސw_sb/6n{Ggq[f6vð?7pyTayH7,]u?D8[## Gw knyzAC,eD٠\ib^ ˗+-a}q{+N`z.))l=lldl79q;Mf r˻rjO#8`뮻C^N(a>n |}\&Ls0c4BV}T._ $$$%XN{, ^&4jо xFՅm)g>P,T58fҶg56L'O>&p[;˖7 {bΛ'V0ΝW])SG#NQ/~r5G+SϰgGimu!iOSS@ĜFst -Y2($,OOgV.̴¦] 4$5Px~U##-؂y5b 7 M-kLV%+-A^_,ZbEx'Q E"s8M.  Z/XQ`Bgv7ωz># _~\pK|}/ʑ/sÕ[0=.(cNìkti)ctFc1/1[{V36Xx.]O?hT?NY`72`0 F5Ži\OO=unlC tZ1qQ>C~+_{_zC~Մ| ]""9y:._. VɋPڶm&Ya*@!ċ́`]#2̝RqSi$l%:V=I"** #VsIpva«@/>c ;r4I'hR!MPcT1c3`Y wn1)ѣ@Tml " tӏ^-^>d#bz;^|F8~oxgH5C5Ju>烐nk&E4C6$tRaHCL&'KBLW QkkR#~iI%hbۛ v;j5;J3Z֖֢㎭ IHHHHHHH g:^wO2Cgv5``<35Hպ$g@I)>G JZP'fQx՜FaI]bNSlzO$$$$$$$N EsϓZ+ ~_0_׏Vby+ON2̥Ŏ٥EY񸍫{$-zVWgbO$$$$$$$$&NA;;Գ>xя ߲Ȍ2 =Ai`v/0c;H(L1cΒ%^JZ2upuss p`}0}:ؠPڵv`J%KW >߉zc&EOBBOB2 k-믿\x?#r-`СCafc9K81!~AD.4Y 32[up5g粅=}w2יKg̚:sR*c ~*#*ě񅅅^{-GySSS/r|7n3,٤IHIHċM_,ǏBF7lcIIU ^K7nftw_n%E^͋uJZӤ_m:33j}~Q+ 4ꭀ*"y C|ll,{[6>3ze>M*J/ēOBBb(H@|CC+O8e1%%epCy,btV4bb^)/,~{Pl*Fɪ?JTr'X]j[yhuiI"q"ݽ|[;^x ߟ=jm4iےS&e#!!'!ڊCd!K ?c|omut6cƬY^~;Kdd+s/6r1qtFjzEARlp_dJ}-Ϟ.6g i#LITguOٙ"uٺU-}/#xUי3ͫ3nA9(MyL&[ xxZ ̚3W"ZLggT:x!&/ 6%'!!'!Şd{ºrű8ä}cKGNU6w׵u^:'~vęCNUT׹͝+. +*r{` Zga+-;TRa!,m=X v).۶){ Bc=x=% &л0@|fēē cS!sz4~'~7Qt!^x pv 0q?OZʦO>yxqEK_ QhHF6Mf& +*L&dzUfp Q`EOOB2An ޾/ _-]5{ֶ&|F"4K:lض_f EׁiU :g-]-5wu%''!7d A< I?A< |+@P;a # ?zX[{u_5yZ!auSQeCv^qj!'fqʛT=#"4Ռ:.9kQy׮q~-G,i%spU:v Y*jXp('çvءIgt{u޼޹'!!!!!!!_5k[0hoq h[3xjwdXcI'v-4 ]+j/۝WR#^uPC,.GT܂ =:PU+[PC&+6 $oˀ*fm[Q+^PP\uw{֡kumI}{cہeLJ76Zuwwē8#/zonl ';+Jksr +2svgܒ5=S0 R ΣM茡ͯl-QX9oث/DlI{M[4 ZtZ2hI5OM{<=Y;,o*czyPpkak]DǢa >Em-g آӥǷnnnh[蹈埛k9/MOBBBBBBR>wDaI9tcg=}  x:BG >nϯUK|CH \URhya@Y2s]EׁhBK +@xJ4ih]t*U̓&卌 /.!~g!| k7X A< A<<)#=-:x3YǨKy#򠐐b`acbrԌCǰP3`|YV4-xBZFϖyZR $@Fhn_ܽRIW #{ =ph?xԊW.hE=wԁhq^Oqm[qUCXN K)Qr$~4BmB<'=Ļ/ѷϜ9qpa}AQޠЅV@ÎϺ,:wZG>;Gha&ȃ}q{QMjNSlKRQ#9gXO>rGibk^Â-8 "$wWOz$;-ģksk)QJ*q<#xjJ$gO8n{G`#3]0,Xc :nh[jրةs'|y,W GQOc1uGɖfD}EX1ϟ?0jC.h7 Ż=p{-kQTb98..N aDR٣E7?%JNzGVĉ E(OJImضNC >Š?;-N`|< Ӌ䌼AQ}gĉ}\εo#ؽb7>,Dpi^!{^!@0ه->8$61E[y&;Kf@3;:HCCy49OSiObKqҺbfCkg]K;=4{5:`Ν<% ]>C% |6.`<1uƭ9 <Y<(+芭ȍGHb #'?VXoJ ^A!&CӬǜF6Dyid4Ǐ?O#\pW\' 1c^f;vg@^}Ux b1&vq* +K/#,(j`g`0kCV?O(`ƪY\]?WaYbbF3)Kf}+ Ş<y6i[ZAx⠉o ,(+6C-iӮm9[ηbOvNUH`FWݦ Z~y4eDOϔuόV OL E ؼ9κ5)P{6nbŊS1s/**)S :MIIqpZؐ \D$ܒWR>j#F`DXk ! ,>@7 -)9ǘШut#fG|&5u &okF0Q*PS#ΜyJj\>qKpX!aMi;_F!!uF7(dCi8̠eŦ&1%9Ȭ4ga!>' @ۛg 6~<>d oC+駟r1xÆ [=<<$*|&x ;sϽ#<܇+wAYf]x-ȏ2g}vر&Lx.6BXcμi HDDٔĂAمՅ5l!VS" BB"׹Μ%4zY3jPxyڸPk!Y^P7B"MsVc}pxU@dI(9 "`pIb7eDK9k6/di|&]M!|YA-[8&c khaį~l$lol\m𓏏Zф!vgМ_|ٯ؈ gcZa`.[2II>ȀϽ9웖ۅccFFbZ5wt8(آrDŽ2&eK]7 gfϔʄB\l nAvbN.y'^HNNKj!UXXaÆK.E-_ 4kVV24vPxzzZh8/?-&&DAMaO`S wVdTg֦L)ߚ/xnۦ`!Mޠ^eFȲr#xji]Z[T9E{$63Px>Pj6lR6ZZQe5kX :V|l jB ;J@nkH Cb1D ڱü{BQJK.5 5l)=S&Rhu5;,o\29/v= V+PoΝ;c=f@,hJ ?j3\s5xU`]x_dA-xه/MHaYBMcgy4!hX F6c!_r/(|5>|_AA4; &LkB {t$ QT*üoR=m{Z۪ZҋSʔPBauVlYY)b c$Wٯ, ޾7?=SyӰ[wC|?2of$x b/D4y+0ޑvlnap*@<,O0ڵkuI6'O8q"x/_! 2$55w4i϶rJcA|']YhI`XTL|#$G!h&TVfyxZf>{[d  <#0a3grX{"P-؄W\_2PR"{Gz;@57<=̀C%*n>Qi\iQ pȗ+g홊Ld ,!Bх`cw\ ,sk[$JhE Wz[~2w"*#JZZ6W>˗8Jl4K*lă>\(ql뮻3ψ!}1?SFW?XC*_ ԃZ %Ѻ̅L94YA:i+[zCҺ 㶆 6OysqtuK.EU7i.8O=þ^4),o<{MxZ8|$SKCoɺaF'\ά\M!>4xM$|~U#Jb &RBSK+UJ)o8""B6P$g˖xgJOv4iElJI~ŕeUؾjnC BXc+qfyGt)bR;B|!~Μ9FBep ov?8!["Rxa3WpӡtOڸΟ?}=<9qQ/bgtݏ0^*x+_#c˷n]լ8X^;,t)Zud_o;fvndP>IOG |wFT|%bM磉 ʪ[_t4f<̆xb| 1 {q /9!!|3gd?Iot(oF!^|G!>K xŒgӦM^g>Q`A B$C58F(L^kך֪,[3f6EBo5㕷zo~}O _o{{pjSP1spN NxI[`QZ:ɖ,}BC5NxHbL`A!ċM`]VehݖP5fN#K$cwA 9)VB1i6 L@} B|c#Rtx)Z^wBZUe63pŞq2.7oYIp?yĜF|yGRE ?JbeZYZZbFf'a-*0I=m\uFx%&[V @n4[73y}qqK}AZh=ڠu!hJ,fKNï"lפ$F'pxJ6< 1f|񂍁Z͎*IPB(A9ZTcܱ!n~ǁx'|[*@ߏ G{JNŞlxM&'88yL + ê 4m{Oees}}LÀO[j՗^݄:`Q!А۲?RHe%u3g-6h @m%K:K`<*&A|cniQf{hCelik_S|Ku%fr`ԯ CLe4&duw)O<&o\x#{N/-]B!Ø]"9-#6<"УlxJY`p<-"u>|:m6ƸǾW¾~(Sf&o`+YZs.~s.: muDyJTUU_-Yn~z4W3_u ^p mv...(9<DŽ<\ii~~Y]m<йoWdWڃ撀CQ@@ ưv&ŰuCLZt35 gӄt;m7OrrsxJćkBN &SQ7mܓQR~YLدfJ7?%z<-xxv8=TXKht +z +HD <ˋyO7?%z<~BY2uA$=ao߹Xso+ F4) bΚxJA$\fh)QlV&FD.hx,[)߾iFe @Ix6^}F]T^a*+`kaA#-o7clԙ/cyS"J&(N7?%zv@aҍNl//ٳK_+`Fni~_n'= eJ6x'}ԩaÆa!Cu]sٳgxb_׬YZ Dȗ^ y(ݛ/l+;a-sm{!rk (<0GPx>!0<ޔx_SYe\g .N9GQ aad$/K߶$RT <|ƬYF<(ZV gV3\<u>oRO~۠ |En,OO%lOOd.V~w#X2S ٍB Z &Lv56 3*E>CO(LS:ujnnի_z%v~~>͊F2[Wm |8jo54YP֚ +#(,Pkė" j%vV#Z1ӈ~Lm{{W&]FuHe9*_2Ě|Cn}EI om4ᧉla tl|Y s. ZbS kms讳cs?{q{˖,K,r&;%rKر\["ɖ#z $ AtD! $VQv'ol9{vegݳ眙3;goȼvs\@KWAڽ`Oe7 L YG#kY|ԞW-B e1@1U;y/7!7n ޤIg ħJ9۶ͥ.bmfb|1 PqEFz^ںhҀ^^aq;gLSU|ux_A~ގtj:7 '2g= LIU40*>yȹfGA?9O(ۦE4!fYH=O`]nojjb R-swW^{?|ʯ@?oo~xw K< =#cSvK(/%AF4 Koo2B466N$%M2tv]W%Wd<`O4x7*5 4&M:# Xx[ךq۶gyGw{mڔyΝfK7lRgz `9oIͮVP."a⥁|pC{*Q,\8 ^v+V( r&UUlaa(vɒhWf= O;L +Unnbɿo.ET{@ . MVm5(O3 XxӁxw=;;%_zoY{a %tvvbo90Xb_|niL>pϯ) ؕ G@>쏐l40X){ AWrgnXng,[/Γr83˟p-1yESyHCgyd]N1[R̛4lڴvܥW|EbuEɵiiY`ArJj]cWJ?*}\.-zkacتu|[ &dSjVZ+o謪>?(cu?i~vyܚ^꛲tPs+_dYN9<`+`>W. dϚG=35%!ޭ&ڄFv@y^xՉ)>AWYZzpE@ICLJfMQ%뒒(QPDOJm>ZvPM(#Ctd;d h?!])MbMk׮n;g4_mcS˚͛X NNM;qj̼tSgS] u,I])zCLZ.VIZbӂ ecCJRP4IKNdɒ+7nW`}%M pZ/L!^OS^A97P3\N-3EMÞ4OLfݺUW3 A &*.!??<w:%?:*gB>1)HW_~c3.Lp˯n[ox%.!QmP 1l~ŋ_ys˧_?1~W޳7~뿻UPEZ HD6x, WGtwnį\z :k׮g{.8 ^v5c%# r2%KlɈ 7^r̛zNYWcQ/)u V@c 0Im=L(Vfc\p'{\p)Ca(h w111r#Y%?02Oy_RUU7|Sr{Ί* >O,ޮݘx\=y}`c`cpӞyƞ g/ߜʥk]cgéb݇yQ|^_RPfʕ#d9z₭ZD=qW_~mƫTHrsG$nv .d[ߨ/_"g?4~kC~,#"<Eg Gά^?f{~jBU GPS^A<Ŷ0BJ{ ;LR[x eb!&g;x9=Fթi,yLN _/CLfeeCLK<άr5(A<":֏/K_lEv1J' y'\w_?ٹ2&ƫ0 +cc%/_j~F\G&f0t~R}jFZYV7^2u`,=#gl4iPAoW;cW<{ ;0gї2 9 n{+'?qD)ڠyǤzq2| (M ^ xU_CE=qeo%9q_=8gO8uR𩕫Vev~D$ z6>qNz(N-w񑳗ϜȖU8(Ma$MHSLRV\>u%< c3 ߰i3h=z/O!:K"f ^v?ڹG&4u<vb1ӼiCaNë?[>.+ps, 8~*u%"j %| g5%C&k~xh]zg?7Hh*###< &yYx}s( Mpw؝y8@T<#o?WTT;r2e!Wp*-2wnjiO"yF[N^D}<*2ҫ$W=Ϟ8}~x\r`[a!]DoY"Y/\;FY mu{ |1ں l+nƓk6?/ ~r'1>9j? ~AC^3DZ&1H5q3x7!-BIC<;5>3Alh >^.XFBDjN}ӗqy[Y*&P81~X5kx& 3䊵!Ea(@LOj=aeYh+}ԞCpź\  nIΒR m7'fx+Qw;5ҍ6x(i[uH #SR8~A~@= -r~*׬뛏 dI7FWrG'У]0j+>;~kXp|١SOgdLY*<]d$Jl^ yTAɞb21eI0ı;ē]~ēI*<+!~&E k«jlϓyb"qxlB`'&~xʐFİiѣ'sO-eSճIpi-p8I;tTLacSG1~DyX^.%CgzG{OEDMwǸZ@+/?+g/_Q˗ktVݺTKiT,\۲NJ@xUx )+jw"ƹIvyF܏/U[Y, !dD2;vS-GU9'<9P0;~gp)l.$΍ *{0p28΄љl` '7)n-+7l [οV}}"=3bPZw!&@CIt ɛPY BKV^x Ϝ؅XjwnoR Hyu2|d#Qy=A^a>vȱ9{*^5n.&Z}+̞}~|Q9\>o6:)I"vQ#:@:ⲜA+V,;){ @ZX*0q|au /6ց0.A>捠kC^)Sܕ]1f'yjc@O62U:x1< gTdT!M[TVy~fn@#iwELl\9E-QiM{:{N,3+KC8X%C ]}ԁ0~|QzT itT`.j S}jE I)]ii8wrch2칃x2t1+0~z|bISǩZbUɯ>0 y+b Z@XH_[*ꛧچ .ɀA/|_ L.tˍĤ}#]GЏ8e.[a34+e DqҌx$eWYexwP0 ~SvwH߶MLyE 8y| z/ݏQx9>WoJ/K-Ư&*mԹ+g'nɁ -8^CXa:|d~khr2TVG/W׏K#ۡgZ]zu8BU Ovs۲Zܬ ެ!^WYŗt?4&Jw"CG'JyXI|`Qcpf}8: 0'` \!젆M]GkYv,\ԓFMkz4B+`[4.ta8ZQU;2!\yn~+%ecM4=Pl&UyUCq<8 eUVyfwwPP4QIR-HJ!5d"@_2_:4Cl:rmͺpsEn V|x}x\rr`-̐`xBK=}JUmūTL}(A5pP [ؾb*^.ISW%Lz=<륳b&F 8it˱K7_#W d_+1~UVy La 1˷\ҍq Bwt2x rUF1xhz:[fEy< x2ݯ4V>C#D9 4SϋQīraȁ>j/4k^IGV0axB]FyXq+>!2$u :A>U* \W|6+WI%B bOl/*a?΁1d`aOz_xb!؍'#*6%{\o(\ CƉ/.+륣SG̤k%Mјܮ*{ c2b<)gRSPlqšSBDqS/a n\W"=~N6;H!UB0f0T_47(_e=ehݏH~2dfQ*j݁S&ڥm?/r+Q\D m  9$J5Rg{ 1>5LF`v(*:>@O !`#bXIR;>է- XXJqio)_}{O8 벸}e4cn> ^AJ*Jkh)uև?7|iu jt!x|b67$`<ն[Z|24SEo۫-Y'KgEDӚ)r>s`*; ̽K.3>>î*o+SYѱrt\c0qfi W>X<ؿqOikÍXQmg@y5,xAm:v #H - 6B|Mمt[-i'ٔ=okiM;2wɐNuN 8f6F[ |'̥_0En~ɡ:.>P%p GpoQq&daRNF8KMK&,M. 4]G!٢*7 '?>my{/̜g۴t=cKKcկ?J*d-  G|ɲYU}eo*#l>r{xIRH:3Ks*Zޑbjݍ͒KVd둁#C<0J4cG:/}} ֯1D-q'㜢Cr\ {P*MG;w ࠩO[hf4;>^*;gjd)YhG-)ȍ 6ȥքmd_08 $TS*F8+@9!]9wFs9sju]#oqxs o~w])cjnn>?yyy=;˿ljj 2J*d!ONC޸w/bӴ@8%T M׶(f &.5)l⩙]Pw |S8ßlJ T_Yz,HneFب ,7xDQzQԌ L!Cmm/^XuWMJwXUWw;Ń?\HcMS;FZԷfq?ʫ9ާzKͯ``vc4IlJ1nظQ;wbQ$D5S9FW>*u_ev8LxN*O.[/*)#0ΑaE,NOF]|CDy9De5͉i;hqr\-VQcqt]v8#g|uf,eo쵵6O=QQQԧ_zII'xlILL'>{g>SZZ6m wYs3n*/ʏΣeb4*44*T`-j˕WwsGOw 7vlp3($rեa+3u2qJ.Ȋ-hK/ DZh+<ҚV);v/^Ak)g.ߩ\~RueN K+ <M3nv56XqjcS]u嫲~ w?ފGNF-[Q׶V]mo?vZ NT/hrΔTﻴj8ur r#QD=.%o]bU4Y}U5iyrť{h fcM8&]b2ķM=r|[DFgdDmJNnm "#bcc23Sg kw;@(XP@OF 6~?K^1@wpag}򎏏眑}DD'}k_'?)ߛxg*4 >W,`:)[30g'{2W 86i[s6ohH#4hXj`ؕWaXBնV:ֶct,|^rc/*!lz%K 凪tCr`eĴ)i>t'%AVoBQ@ZYJ{ھ q[lB2Q;媫}g颖ޓXdXqM ej{bꄔmy5+?2.eԀzkwz99|2Yƌuм֌OԌ=:ζ^jKCu*}elAT%O}{_۱<-2Ӹ?ZR gLJ^`72.nzwv?n=ЈjpNko,.jV7յl,k/j_[vX֑.Mt ރ!XTuJ}> ᦮EeNcю>{_ƒ܌+ي;[7(i;eq 0}1yxa)ػ76/OD'~y.[&VVUwN (cD7x4*_{ $EUoDgo~r60[~x*4/ &a]zk7k4{ ii.϶.|SbZFv~ÓjNغՓ[e3fP]~HJ!YX+I䙺cMGc;5i4#s8 >/J/&501զȸ# 8CR\C2wY~Al(s !- ; ꝼ4~d\geqrʞ@1 #ۅ@|sde!Ini#!MMz9x0FFn_(XLttXΖջlNM[!:G(WIBW/>'>r\ 닖iWޛ>im溌5҉Ai\USG]x<Gv]mxr&ǘCГ Y)iNK|߹,=%:Tu,3 ~P4-۰AǦgn#簈5=~PPIM;ikkPCw ]|f5.#xL3fKcrn`:bIZ]] K9'*4=vAQcz9 >@tl'4 R~*4/ ^M - _1g ߘ3YyeŰ;wM3gၢ-vvj/Zx2ȣg= $wwgr9boqyIe6"VAGWnOu[v8PY{TɁxB.?66;ŋ󾦦jAeA9k |/=j%ɚ8=!~;iZLB44= p7YAg7w_@ONb8S-1G_u!~PsC1,<+keL̒UW޳|]eb呑qӎ&9!>ݏXϕ5w@+:{0+LoA?`)'yqnGbĥqXIAPAAݘaSWsNNA̐n☨`W޳e<9F%:UA ;hSOwߦ\v* ^eUvfa=C[HF{=Y%QY8&&Ջ#Qy*F$?^ =VU-|yV[~WLn<?En%~K_wnaIxUV**Qgns+4,5hI%yZг\ xGԑH!eeep[?qt#-Bx} K,Nou*FYBM|!ëǪ/Х&Jw[d|l7-w r;۷׶RS1/fns\:jyK32xIKF?+OR 53ϥ ?4a93^#ZS)A;,soܵk.O72e{Ŀx>1A0JZZ=V7x.!J{gDAv][Kz/v_=#,)/g+׿z]oo% P\_gW–~ _ чow|_=rZ*o??XNi9|_]}w%Pʆj\ nX7[!>cKDQ{C&gaLff\Aݻ@Ӭ>m˳f U"dsg= t^qdRCEmҘ&?y=p QYgK 8(?T=d:h8O9C Ğ߯\(UWq__|kwi?{u[n+*ߪ3p@L/,;!y[?O!x)r}">d;^}]ܡ@z5:yDY_~ -P?B|֭)T_OX={ mS%AA z:O8p>Ǥ1!^ѡg:}XaF,|%zi }!͖>7B >pg _7HwXOoa3v~o}?g̊ vt ޡb.! YNYM8k .?- gFjW2ίmPW7rL#AljiBrxv~ ֭Y`+WtT!%;@;c<~fj;_eţc+nxYbJ 7:N^A<.Đ}R~i8/Sl-wԼA Ȱُ '$[i@SO$`Ƙ ggO7ft}rS&z-]>C>I9?Qn!d6ӄxwu#ĻdBsZv0 l"q--XӽxqvzöJyU}{&!W!&}5 k+E,aOc\;KͿz^ڿyּj"u(GT@Yi{W(LhA<טvX<5y0@γ<<|x+5f=9b [~GD%QM4/vANrQQ񃀪RT=]_s)Լ<\4uM^vu}ٚ!ɜwhRT7A-4bg[jEj\45ͽӹDnmn1ԇ /?ٳ܄1 ~ddD~;::} ^>X;_~]1}wYCWP'!_ 3hA裏bvX )s|L߮%?䓺l.\bFZri$J!N T6NI>=pHM<(+U =^ .K1iLTz; -/Q|E[!&]ΡѦԊ`/_/ ß٧#yԟhz===P&^~ܕP&=⧌lrOP^ě,!y|F&r#Y *ͥ _3z_$@CxEy?/}? ި/s|_ ۅ/x=2ݱ.[Ȝ48sjOK!8ŋdHB1 kWo&gT4!m[A X,-a`Db=;umOwo8`3; ĻkL5g2s$̔Jz: -7b圝h}Xkc7KMzo([=BxL/dE2/W9?l %c ) G> e'Qk1Š?wDˎ*s~-!ě ~|:5yS=:L&4?EwC̻ t/Ln^+(9]>ܞ^ov+iY+Ĉ&#?"M{D8.yĻ$('>o!QinC3y)ee…K#E5-俿f$.=v⽪ $^g!(s˨H*jWzqiyTg93» Z[:ˑXG|ѱ_j,Ť1ځn[~D+(\'1RjK&PEтGr΍^N#/Js)cih&&]ŋ^ӻٍu01yq0R#.!^(3,{ix6j`+?[!M60[UR >ٷIhYF'ј)9nEn1D!ޫ`X2G1ڮ]G 1i Q)~uI &J$%,K)KLy\PthݕbҘ~xvu-n G:9bTew%J-X!gP`u.h4ŤVzA\W1oO`ls ~:7{nָO8!!X&ximONybќ 1x![Iej6,|~ʢvPs/sl.]ւN[5RBCi[-d.Dؓ9ؓJs  ^e+YF:""弜xc<+`}֦!6/CL",<  z|V IfXFTWqƟIkQkTV ć,EmѯRg~=L6 ~IAJAUV UVYAR$wV ^%?&U4`@ W|Ryd:]̫.!FoSawx+O_ yLkQJJg|rjī6QYeJv&gÞz- URIA*+WYٚ'fgoCt- URiFC<my*<4:*ϟ 뷿J!x/<3 īxUVYAx/QPY̸e ڪ~z?}{r1oܛ޺!:īί'xG}"ٳr;3ʼn+K*[īίϫ)B|yy9˙س>Fe,v:>gzꩧ~|gmmmrO}Ss}4'>񉷿{/+󓱑_z|XCm͚5sUlg|IrUVyd_RAxo!LYa{B{^U? 1?qM;6lذ!&&(77?.|ig!x",FDDYX$ݾKKATVydy+R輩7~vBߒEwqx#я~|8ç x_\\>??a>))Is}K_J*J* ޥy,1kkk8% Xqlĉaʛ~UUU8^lַ{ /!u dzo~sҥHؘsS0 ^%TRI%TR?#zFFq +:H555SRRhWWWjg%c1Gy.v7!&x ?@G6(=333,{wܹ3;;jتJ*J*4! .]ݙRҡQn#Ζr-Jj=B<2w܎bFί^PJ*J*4!/IS.29ސ2 vl 5v&c9d߾}:k/Nŋk!= ?6xL3"vͪU5<oW[˗/_dxTRI%TRIA܄ D2j`t3f$plݶm[ll,X܉rvX)VɏO R|#6m뮻$#AROćd83 gqUVYeULJO4eW?3 ~A|\o/hy**<rfrxcl B$)W3g+Ì*σOAnٲ%L ޫ UUVYeUVyd웙.((`gVT ^A< UVYeUOI??!ԩS +ݖx5*K={߿?>>>&&###|u-SS}}=GGG+++9022w{---KNN6/t46FDDpHnnnx ī*x3m6 6_lcTT6-ySo`xBIII|4/1b|Ł҄oⷸI3C\+2:**ϫ<  Ν;g`#p|!ig(,,ttwwrRF^!&yNo-3o nAa0͜p;ޱø="*JnOnnvؓX]X[+72ujrԞؽ{#DDG&z~ci}}Qii#9 199z*@|NN/ %+o߾xBvww8!4\N 4s b؇6Ȥ!^SJG^hrKK6a]ByMTVYeOuJԞԐ4&Rzzz sjMK-{(Emzirk|#|bʹ!'ċ?٪*WXhc}ʀt# Џ udQEgd%ۚL"bssWФ!Tw/..cBBV}#Gv? crlU?C!W?oWM/ă[,BO;Wi+xU G>kӆz?X WKgAE!>\,"dgT1]Dė:#"#m%yU9@JwwJg'-@+1#qj?M!znbMʹ ZyԣGcB@/^ ^Al'O޽[k[1IPH@'a7ypÁ<&Cؙ_ 1!`3v1c vGϧL{Pf>KAp7]ԂX) OflM|;Mǚ V7)PH3qk9T:&irp492V+M ]H=Dپ^*lp2=Er`MyI{8"K7kf R`ݚCi=C ^d}'?cy Kԡ?8~A!y.պ۵ʏD^WpKt}p@g ܵˈx#ldq:&*!:ǚ N(bq,n8k;І} =bкDFJ עQm+1Mvv ,fؚ+pxFWZBIA8_ e鱆tn^sⵖW|&1+iY Ģyǔaj3j})?~I#f ( u 3j]A➣h 'YT1z B=:%NN~Jɼ F+lOLuJ469_Si SV8?r8 _9yA23Kz!.(1i\7W>A|E&@^$dz-zBJRm*Ş&j&t ;wsEwx+ڿɏGLbL4[zcqL!E5ĨsCڟk !"ċPm&@jvACmM G/ ŴLwgRxpcGGQwW+Ei8){݃c])dlR @ёpWBRo+Hjt^I㘵_s&@Kk"#_UW^yK+KJ*UTz'k3T.C1*9JDg15o9c " МѠN/9(w`qv11>@<gNJȞv9bB}%/ Q\*ь eDvw;*'[ ma)>46ogKy9bmcsIf+Ͽ x>6ݺNO{- ^%ěo999+&bbjhoqE*cGɴvd4⭷xTRovA|YY߬^Ɗbn[[|ī*<!ݤ11cbr+oi* J戈w.W*fV$YpX= ڵ+̺n*7lS?]MtW * gċ=…} -<ī)[@;wB΅A|{z$7vf6x90` –{"]...nhh.**{][ e* ::W** A6#"AJ*)LXtٳV7ҳę$ݨGcse\kѝGr돻|Wyݍ~w/Xx"rw Z1JІʜPk6ŸK,Y">T̊iu105vW1}vۗÚPiFY^hƁ،M_rmP9òJ9uC{*vtWyP*oSI%,'?Ga#(NpIq-zs5%u3ihy/ K[mQT Yru[m߽7o_~^ywyP[⳪z%'X龡\j>4 URi^@$iGF[2[;?Zy> 1 C\\n"1B? d;@l%\N5bI?-cbd$2e}̀ rߨ\[[)rqK

    wh\c+#SwILjmO_}_W۶#ggyh~pl}Et<-Ͽ)aeaťe'O;W<2:ηK5')Eb}N\pn(\DLLL?ީQC+Q)p53G̷Fc+@ iq-=A+Bw|p j.xt>+TR|%nU=BoW Ņ\|f@ttq۷Z3xο,1JvXE!uǪD@lڼexdt*ڭ7ɼ[`֗_ݱ7E$gَM;m øbQKZX7]Rʼn{ R3" ۆrP.!~JãMA:D ^Aװ=Ҷ3c#1]|n!~6쯶XuZΜyp7;h\ zt#8^T˗o؅͛-lԘى\RUwh{b¢jkayCmܴZ5=nPZͥNA:d&] +=ɿA<:ca'cbeⅣ*,,4:8eb5:Z\!ƥ¹^s''S?DO+)qlQ\Da>\6zNQX•6:<S6{L|ϏBr-$[1'76E 2f`*dtҎiY0;r-llVA,CgO]xr؉r/oX~%ҹ RiYp0uZxԥ5=*Qm=6xЩ]}K,5.SnɼXщZquj&'ʸh( H6_ȁ};qȫxꐠbAn'G\|`ifB: g8H+[>KR9D^2v#(4iJL ]9>n˼g 4 <՜&{N kTr!}KYl]G%+KK\,iZƮܧQUiy-l7<6a%v_vpY9FQmuSgjJ9PA< īCBveGU|aGrq]l)TPш5n\xįIKCB#յ+Waα.wjn $J6R]G+:u|OIA:d&Xʟ|AyޥTVīɋ"r7^yXrcH @=tsg'D bs5ї-#vGy<(bCl1ĞkFcAE46)REK{i ĨX&{ss577}SfLs|3~_ZԵwgǚ}r*VV:}!ѫZbte}O+x24/fӮ}PcKj4T޽uU~Y e_R8*3WcP~e!^3ʏ7|CK,\njieX߾}R!x *<[t سW!xs$7c+Rgcgk؃5Tv&采?WжNQ@q\%`hl·?_~)B&p$ǭϿiKg:SuIMIs$,^2c3a'/[Vl`r]χK.R<=J%S/m}~]F?Œ T}o*m!h ~۶m>>̜93:$ǹm˖-o֭[͢p\[!~ҤI?^uSE~ԴDQ!tԩS]}\)TY]9#u8Nvٟm]I ')=Xʰi柦vV{7a>>4y+P/K I F[XP;(fCM7ܷn۞ Sf耙A~p~و>5FS2SV)|Z]R+ITEr6xqs/{6>;݆29|4S* ̪YQU7Tφwe>+%6cO<ٮf/;v0;L6ͬQ")GM>{]<OTՐSM3}gcn0;矏ߺn:A &ݻWWX߄a⽉Dx}nWjjLMʁQ"7w?콏~Y`>¦oRhO`~G)?TkDr*[#;ŦkYiר :`ItDlgj2Q]՞Kҭ%q ._ݏ>]qϿ:W$CGiXĦ @.ٲ{Œ6DcL?keUUP2xͧ+jċ>vļL݆_~젠yF}}r->nޥ^/ TA89'o"eEEE~'.A $:o޼Y~־KnC|fC|69MI 8~$M&zO^%bTw?..}+SzD ;_>bÎe_K;^SުU=kuqf2J=¦>oKqYH*VVG]/8Ḃ>"Ŧ%\օ <,PoƥP|J迪2φN]lsMWLx-%>I:U=3`nI-ҢBGEjQ,U4@ZM 8"]z{ = Ǵ@.ě.J]om7.Y&R?!*@|O{TϞSj6"^$4wKCD"~?#Fw~K[+ ܴ%k-\kk밚4̉JҳKߧoCd@k°;ep>5SEZ)l_\lQv"\օuTIWPo(4=FنY) O}cMDL(w[QL|oA,;FW>TJ̥ȔRx 1';ǖqymذ!d{zN ^u %ڴiY,ķKjiAʕ+Mr1=V/^U$~w/˗/9.M)èπaۭD_~=Oսf@_6 L͌B?P|Km_ru'{*Mu;;?K/)Yln09EbhEuUbӮEYMNC"zů'Ohl&{gCe <4B1iLRE*qs./,)\ZmK a5߳8vd|ibܦSxu6`z(ɷ&1ULiTʘ}!-9%j6"Ee(C>Zr$M?m0-Ҹk;_|e0X*p9WfNX3iѬ:_Ϙڛk2=KRDJkL璘O}}yρ+7_1odQ6fP*H]m%}Gx< z oKzKpB3Z JT@90+Ŀgz3b8b&F;hZi/z i q)&^uv9w!^ }(ӓoM +- ǝ^nڮD5Wy 9t!E{Ao|r}o|܋?|%&ޫo̦_a{%zEVO0.jD(7o$ue˖ZC|C|\x3s'%/ׯ_/[MCgRi`aA^<(j9K?|Ek]^fHkAqIȭ[3$t~qE8GO7qޗ(Lt&d %g;9]"ԕ+}e] >=*^TC_R*ozLUx;jŷq>9VTRL *ZcGx9L11zkq07T2'xI#ޟ |kIvPo;1?yiCpY_c9n=ז EռCFlݽˮ}h kf|lܺ(>ZܾYN_j}`0jwhO>i|̊޳+d^xM̏釿2"61r6D/|ɺ W:Lg}>PkhlnhB, ^4CbEzy^@|_,: F W9(Ig=Zr?MQbz fR1(d(79= !iT U~C fn:X2pCټ4kkٴ]R USbH>O~eQi񼕓g/>癒@M :lƗ4pVTEmڭǒU4f#ڸc\ڥ QJ%iaJ(Zm~5J;yOtgӁsdP3JW5ԷX9 UmysI}hO)N'*ALܗ@|` ^䐖sZÛ\|1 +yE`weѼW_&7NAߕEaC|ykm0qD}=rs k|BO%6iNg60 >C|k; N]>ޥKi5V˥qS DZ:i(JN O >pZ`q Z17fl4=aF*%+)"5$$JKʕrvTQ՝7Wt=ݺ %T<`ruk؊.Lqh( OV \ !>B O0MF8MTc2펛Js(^)7@|%7QNtT)V<\Daߝ35n\ E*@Oⱊ<6g~@B@|J >"T$44i 8{UƽFCQxJnl_C(gXOEF !d"߿زeƍ1hP=D*~k+M>`4M#Z)jMT6S%U2`߈k_OgI62&WcAx?5rcWFKe<P@<Etu&[i&`,mvj;) :Qx*N/MPx7U<A@O!BP( ē.B@P(Hu|@AR&s/~} BPP J!x ) BapT"q|!;j -SuG{0BP(Q(TI!UXlOP( OG-C&#SE5B;/P( % E}:> *I6x/!>ݩOU4x BP<#A{aMIOP(#]Ŋ$'x |{G$e˖xs;P( %"l?GJ |A_lݺuڵ֭{駷k@]TVFٳx 0 ˅x %ŞFȦ&Mb?ZꫯDUV{l_|Ѯ{ǫnϞ=bxs=WA5k1[CuA~a 0 S%L#;#>]?tnСCBJ~EuY 64{'{ӦM/sw}Ys)H,!>v1 0 9#a]|9?/A{SlD 0 Àxx0Qr=;́z~jժ;vKE`ҥZ:qfGb-yƍ3[NGiRiT >aa6 >OUToFr믗 tя~Tctע|o?{N'o> 0 Àx$V 3ċ-Zgo?Yi8M6mx뭷"'cƌѢ6oIޟ"XgD @K Q*vMHz)Fž=UCZ/\18@LIHsy発fxW"D OoUI -/_\gy=*NF~?O )&99گ^x?AuzRhUPxdV%P!wL| E  R(@U, >3Of雩#D {F+vY<$h1[aDdj#D xFˁ޳ +bpe˰R+Yx"D`XqLoTqA#$@"Fgu,ZŲ'+׀x"D`Xd{: *NxW" x@y0-ӿ"D`HFʷrXVUx,@"^SC XyK?T,@"1YS❫cx_@"/g*_ 񴘃o@<+@^YAt'x]%p%>` _@"0$3%xB<@Vz`O@vYN@".&ñUxw xI1I@"x_-Gi1 }{Q( ũ@d"' ҫħhviz OߥKsMmڴ_@"1\x _@"0#xWѩb9kd E @ tx\pbį^]v't1SVVZcΝlذcǎvZ5j֬ټyl0aW\q'׭[Zj׿G ӿ"D`0:M@xW"@-@|!< _vm*UjժoRnL=Ȯ]W]ug{ׯ_@" @|X@|.'Md6m^9}tA(S|5buxW"@|@(7b9x˯/6C֭[W:Uݻ<,Y$v?vعs^xvD #GSōWCU e_~)㏏Ub._߸qcD +^<OL 9[x٪UN%QVMԲeK&{R:hѢFr)wuk(JPӿ",A@tOc@<!!tV %Qć CHD :]*N A| | D "0ݘ ОۖO[MD@Oa˴O!R)@<@ e, '4a1# @U`VB4QVYl!$".2W @ i@T<ڵkkV&M\}ƍ9/XR2d!!jJ >&V43x58qb=z׮]3.)S8#G4UJ a %Au) 3=8_@<- _lYz̡6lx=<]t}Gy$W6CWn݊'D`T:}o0R943ǀxT(A-b۠AUVovVZׯN8A65jPM۶myʆ :vxiik͚57o.{64&L+N>uVVM .bںu벭sWn׮I't1HBVzsr"x ZСCx"*AVf-0.OE}7}=XiРAZӦMWseWXѬYu;w\n?9/^QFe^z6ۧ;Sx"Q-4X94Sa ċ%٢E Ic^׭[gS.]Tnrq}gvW>v4&[n|wyYz8gΜ+W._̙3MٲeK*U=z%Kal;F_uUgqc1rcQx߬ٳs^v.@"0g~@| Q _'^%^IJ8bo0SӴiS{cGCNשS'RLBHD`$:Jav9nO -0.OE*&B,͛7?'^/kֻܸ 7&۷oJ5+.\Ko*px"d2+7;SwC~WxӔFyfLJ|*F1lHp;{X#mY_a8@??@|D`nEr&+4X:$A^w!!0ӥOo=}K3ŀx G 39]-Wf7B`Oɸ$N0.()2tCѿ7x >U c@<)&=B ;fg@<-c@<pګo0/%o=]8z{/Sʀx E/^})swf;1a0UAx"@WUхx~:1 *c@<@_%1`ߠ@r:7\A9=胳t :c9x9՗1 BB!Y")ߠ!x+8SBcǯYt!Cv8gl54fwz Ϯx9h$+yĻPJL4IȮ .ܶmlذaHcAGgtg 7H#vGh1 >7/'ɓ׈k3fL^^޺u(j߸q#[~38Kwߠ`;35W 1cFAA]5SN-,,,g?sLN3o< ^e@3JH RQ@)S]V2C*Fn^w(>??f`ah"}~]{guF+o8OxgLA2 +`Fa3e:q#FUJ.D 3j;Xb?TM&Os2  1 ޭ1|w -ȯ9 @;2*Q6@<1 ߠ'?@?BdNpFxFE@ #1 ># ć_MT_c5vpmA;"YdYDZJ!>@j1*Ϙ1,Λ78+-[>l\/^Y6lؠ擇TJi@<#,.L`820:4pA6M,.A(9G])k8[vmBL|S˞e߾} ׭[OӆxR8#0@|09ŋkqԨQei4^/藲,us/V &x'ymZK +@] "^{1!4ӦM&}^zuf/+^0 u5[SxdƵKNgQx+9zk֬Y6X J 5Ç 6oެxm„ vNXI ~B D`!>jx it?Qaxg+@<OR;❽_ ~+sgoHD ;&? oC ӿtY |M tu9[a0i mLL ޢ '}O7FehUr!t1 >GR(_- "g0hvqA/_!cӥB5h90'9SҺ(ē12v+?ӥ3cE) wy9B3{  )WQOۂqħ}P,~s4܌k{qE`h ^qNy ХR\@|hG>&V4A?]x3t&x_v?N{}ZQ,w "o1+|x'!ݏC\kPB<s@K:\Ź7TˇxWGJ c@ss(4oE2~]xn!D +||x'!~DMtn\H{@|,4Q+|&O|/@$*)@3S?&B3{vDM-O׿JQx+ S "w,c\{qO4\5`p,~fl+=S"Q8,ULJSxr=Fk<8W Z⶟U/'>x >Lb |6G,7N?g~a.a OsWƍcUHS'ޢ~ ;>`wø 3{ D rO;?UTqY+Y^f|.!3Ͻ','>g;QBr[b>2AAkˣG{6縫`YSaC̚L^K0}Ńtckʬz[]Y3tn2Z=D o@|@˕b OӻSТ΋sm1[몥"~ԧMNkQnݪժNW]ar&h}iq>q-Nv159K? ~N7?Z5jAv}dGw?I'jeSN.Yyuwf3ڼN[<'3::_]! Rzw8|cAcn,U$1OhRoSzAѳ! z\c |N>_r?Y޹Q#sgjT^]^?IF XZBq[Ӛ*Uغ|lw\aw0֜Qrl˙-}hMyi[QÄ} mчz_gUu9˅xfp_z9-.(^xE?,W?SifRt]KAJӔ(F1|#sfTvIŲkt86!$\ѓ'WS ʃD`. "k{Yx/D"@<{VguF+o=- D`  Re O/[ol[VZuΜ9xb/͛Ⱦ^|{[;{D c@<ﻁ*UC۶m׮]k ۗ{WBvEM&lF/nݺZJ+g̘Q"Ǽ/ >d_@"ǀx Gg5U^7޴iӛoY1۷oע"mn9uT5XVZSL6mn"UﻁO@"x 1+x릠x^Zx4U|Nn_@"x? }W'|Rׯ_(@rʱc*wM޽M8^6O=T׮]xGҿ"D s{(A⯽r[zv@|!^6felܸq TfM QHQ*Fy*|A;+e=TEI#Ǐs[A;D ٔYFwtGg֫Wzjs~Zwq"4 >aD ?-Չ{?Ww[t w}f?ϯwѣn֬I?xп"D }*c?oԩ򻛟~} .8Zj@<;D ALmHZ[fs7~p⧾zެy? 妛~h~'ժU8k 'Ov WqY7y;_wM4V|αӨw?u??z p1%Ghꌧz3x˯wg G @? C~M KWm|/Elm~'";;ߩ_&-[^v.:~B[D`fIc>0_@"z}_Q7|<Z[ KcNz|8uװWF=RM:|9g?~ЀO*J[1GhӦ+_T^ %LZRzE@@"-ğS?U{ˆi˘1R)Sڱz9>1}iZ9sNqΟ?>)ֺukϝ{sߡmv=:.M3yg?I'x\BPT|W!>BG lu?hP7x{=5k90YVK.i3rd_m<[N TZ%+I@"$&I_5 obwru;3 -NָUרHz _>m{._qL% PPw4%_@"غ leԲTfN_Hw$evP#Ncsx >W"D!^.p;C%)&,򂧒'z*/d ;vcȐQyfg颭n+x%ˋCcC߯@<)[9;gtvW"D'{dO@|3*{,[SI1)?}t9sJWcgL0 c9,"_@">x36?_ǿ]RcCʬY;uC/Ցah}E=MdOTFcA'{_RxӤIKq _skմiccE^&m\.7eMh!>5D @ >;Rv;)`Sw!>z_@"@|'ϲf "]x@OD cXoyZ)"D a@O<jV!>i @"0 = D x x D cXx baa0,Ob rp0 Àx \y 0 #a@|kSTU?P( BiE=௭fMaǥ"44444444,%ĊŽ7CxĠvܿw- '?HaG}W3}xPcknD\t$FuXjEP? l)Qf {dHLq)[9o⇣ ިa|3{5uOEG,[Kď'^;ȡKZ;*֦kL)?7~wꥳRB,yVbr(C "~[NK<ʟ.CYFٷ^JCSOFLaYOaGU%/4-@}gHY[xl-)?Tr. Q6EP? {\5v{Ib^?%@s }Ś.GtܬN.Jojt8\ 3}K{ L)?7f]0+ᳪ6R>q;ۃeu*.* M=51 f-ӌŽ[/ivo^JJ/fnv;oXkV!_!|n4'ՒP(3߹Z[XCǸDv!8Q^{6t/4u76$oTF؍TC.p·}ygZ;f r>wfLYAG{[S2uXվ8YSkRohr;Xl2YZĔ|^j4͚mee _RԾ;E5mO$B3wAxϋށt.b}mYhԈND>v)ҏ4j,h7fupS&!fLN Yw{bC]a2\:?g6QipYGBJҝ@+ǹ|hʹp[k4Ϝ|݄w҅_ps9,lϖeId&n916ԗ_K9ݒS?3@>QGjFޞ2ajjmbHY=myc\J{a9k3p@@ _8#B% LBme Fډ*UxP]v\+J1LaL_XNr]B6b OmE kGSc|ѯuXrt b$/]$wo3;VId&nuyOɮ1 M!7 dکZ12ׯwT1` K2rJV$1}+CV fuxh]!!tȕc2SrbVhwbǯySlM|Fc2*>FS6Q09Be)<x5y 9G,7jC53$sia.@~8v\vۆJ{xǥ# +?zLǞûغnQޅ;*xne o<9,9͚$36c$+E;ssK 1W8!acF4cBGadko j d,ӖooMTXҸSr;f_-I~$u?H|h}p>BBuJCSZbTh|[:_gњGSBo" 0Z="!sObRtΜhJ F~j]+{L>8ePI#%VF{^tf6{ ;]}%y'sJQˇCJ.DXBaGa7Øx<y-F !p뾜M^W8QvIźLBPylx#hmwZ8C "7ƚK;T'O:{Á3QoKGhpђ>eGSWXVNڽOl\&.7ia ΀Asf*mw|IUO3MTXҸSj&n}ݿm?oƤ~ BJCSZb9Vh-˱ִ&$0aFS*]=M|&!nG6v4y:m?y`쫡wGz&Wv>gv/;C<#>1‚yA>~|_ǃmK$7fW:}l_NB [ o:o?>E&* ܥk8ۃ;Vvϣ[p]::\,2 1;et o;l#qΚh !}wYDuVӞ Ho,TlU10}ڇL1sh8ꉓ7e?e7sA J" .&!Qn) 9sDƧhwGɯk}u )pm\"C9/sJ߮OH+3.s>o2Yw߶`Q!㡵K^Zԭ7_CC3A-3656K?hL *S֩lԹذPY_cʁΗ3'M>5eYBcĘ>ž o’̰1G:Z6<%[FI*46Ck:{4m}Գ-qk,=z9g݊V_pͩ7dy~GufNM`Oz|zJlZ”ycdi#P4`+p1v@ȁB5q qJ>hS)Go[ {)QI+O0+&{zyA& Uc(sxЦwbE408۸tѣ \>ruZtnWϡ}GBI]aYe::7Ŵmf~ \)eKk SDŽLaR7KIc/3,tdQNn[:~(#xĬWBC#SFډ*UxS݅=fŘhhhh<}:к޹q"\ A'''NwlMMMW)L`Uq)Z;@}/dcĉphРA+WӊBe˖?K,\;oҥK(dMJJzƌד&Ml8p ]xK&7:t֬Y$HIcSV[[[ JDЕc&,`΅m ; `;: ߟY.;v@ᄺחz?R;پ3"ph-KJU_u[)P7A- WJ~A7"Ԥ,'aD tK8;vk jS"$O#I/*| T"ґh;Y5q۹ Ea|=ӯM@HR.PPULI9D"!0 ""L˖-_~)I= B`|V,3xB?3gΓ /jNMM:mM۫WVh ~@$,t־)o |coRO*w@;i!gjxaPt,]CL v̛7O;TK_7EHI餕.;&~mKKyey؅R^IA%A  퇢B h,V{"LYM:Y?0qwzH d@ i w-i>~+і%հ|3@RhFG כ lR i@B{4x0X{-`A2^wP7—,o@uzV>=v%v;jU &Pw!㏥]ZĒ3f̀JdēBwߥ H@7 Je24vd5q):M]J) EH@ n;T#amYR;w/$f+PsA1TwpGBeccCɭ-,ZeD[кB K)uS*|T-\NO&鮏( BZVkS vP( ؁؁BP(J-'GBP(J}Wc2 BP(B@P( ؁BP( ;;# BP# Ke o0 BP#/v $( B鎨4ءY= X>XAorml)~qE,}| N8>9嫗/_k.XM~}K1?>eB +`>;gPʫYK.2QÛa<&wzCP'¼KaG['sK1B1Iu?{o'{]|ޣ$u ׾+XPGz,{ҿsbi5sO-!bǎbLh ;B RrNo%xC1".uܹkY(ȈX0.;;\ne'צ )6>ix?wئM-֖y Vp411QM?x t(;FN<|℃`{ .cGϾmu v8v(sw=o޹WP^˕,XWTվ{%Jܹs)ˣ*"v v v vD'֭GoAŽ#GL3fi hcd%;E׷ׅ;v@;U4ܸsie%5QP^WQ`L MFM-s2߂KccgτŎEwh̝3}MnIME@6 vUPʞf[%o>lxx;͕*jBG~ݼ² Fja>v 'sR$%%ҥK aܹsqh#(ke ;ڜ;v:7hI2c|9~ˁџ}RN6!#9e>scGqվ1;UISmsܽߺ@8&Bءp(h}]Juޥԅ^zFhx.ŏ-?@KZ3fڑ,\f$W7ydKKK؀SN%<<}:&K({;0ta)8ءp5rI֗/ eb.Ki8ѦԯX4 V>g9hq42!-&BdyQ|ZH98c3YgRpݭa,\5ł326h 8.:M S9&3Wݴu-V!s@4\ώikڟ(ƝkӃU>Ef` X3?}+(({QZI?d9 B:+p*Va CT`p+H 6r`A݃ӌҗy;P( B44444444-aG@B~DP(۵v $( Bu;(Hx#Q( #Yr>uP&Z?ۦ`Ho_cNplj7k.___8S5.,(4oJY & O+Z%V(sTeΐK9t3Kb-& ?``2Iy;`J=aWw/:T;rR8;ʋ2cDyԱ{^Q^쳔>DVf{C1".uܹkY(qR,i?\E0b~`!v(Z=).Q;O:FׯsW\΃Ȓ~EeW`%QŅq{\^'#$O~:|ɓw;mL %&&yc)Op0l8űcGXO v(sw=o޹WP^˕,XWTվ{%Jܹs)ˣ*"v v v vP'ƍ<6i ; 0A$>;Mh;&Aquq9qk 7+jZl`GAI |vUT798X;>Ntt :qXh~ ^SʕOeAb#2C`{8h;Y)]lSKCvXY`^[ h(_^L歺U<\*(9s&`;hSzgʔ)VVVMFWEDP)=~;W.8vi075#| .G&=;A}0wk7ywMhS;Pi;|m9.g/YyVcI[+-^N}se㣊ڇ_r7lQZσ;;III}t钸l;wN:mYCt1aGCvp}CKWaϞɥ.8vPz7!p)7hБ'L.v)bjɩ"yt{TwUU81-/J:m5<|ViU㲚euncN 9ew `8~;v`Ic9,!ҴcHߤsq܍I6g_ dYvp4;c:vCoPSdP<- cNd^cހ&[ukme sI˾}Rءo @1;Hɂ% ˳C9;K:Y 6+[cdwyL1lx^lgѦgzs6ctlIMCzu-M<{[Z RTqpz.,^zɂ%;g0aG3?)7uӦGe㋸e|vmv§X6{F1~|.Yߎ6^:ХT\J]륷 +jonV O^pZ_t^K1cK)e6Lr-'O ?uTr#%%lF DRt)ERt)ŎC%ȪUOe2ՙ퀦t;~qsf}|)vKB]Tt)m㥩CKi:;;2V^- .C / 0GTRhŒyt5~!CK=lF D@@@Pqrtuo:mf.lӢz1ZI~IMipQL\Tsz֬٤ie:zp0~##v(7Ḿ_eGCKEمbi4JQ^qUQe⪤T'EsL>ert\k4?\ NuPjb$2¥r+ḾSeRp'FZR̞=Ȅ Ei!1Bg͞Ku#8v"vpŎ vX\8@{S¨onS9;nqs17Lju3g6\iM[2X3C2-)ih= }w?5Q(c9+ ųm(߂RT_0^4(-]vAL rr8@+0!*08vŊs$ ؅@^9iF˼( BPb^ !?P( Z;H Bv $( Buߑ,Zp9fC(0V7VyM>oJGq$1 G8|5ݵk/ҩ1WS`\'ɒP+L&p0vp6p01?E5 ?``2Iy;`J=aWw/:T;rR8;ʋ2~uvs>CC:qM}',`o1&|QĥC;w5k03:RGkfCpY r8vvHc=ʟ"|cI'yY؃GO}͛ktrHhi';4;v<3O_&LI'7 5_z})g5fCf9{[di{հ' v-y?~kQeShTwNSuO^_/^|!YU\Gu;voo_T^9qz%;LojbGeޠ;D!1r'L?C?mpq6vq6zׯdWD{> ?jdrt…( +y.yǛw_hr UjilɹR0w\aJ?:baQcG4G f͎&$v}||+DDDDFFm=u;Y ;||}{]cg\sܼ}ZEÍ;.[QPR-u vΤVia){=a„CN8166V>mB@@@˹准_Xa](v;"=4ƽѻ~le਑;mc5KիO>ׯ'!`ovjʱ= b=/ce9z9o6~ym36WVVsh̙>G}N)SXYY6m|4 ?؁؁؁22z6q4> MFM-s2߂KccgτŎEwh̝3}M0`!CIG@H "`$:v6 vm9.g/YyVcI[+-^N}se㣊ڇ_r7lQZσ;;III}t>wt ?㳆Z9dŽ9i68inaGNՈR[˗[_.8vPz7!pvA>ar)UM P9cch[n%Æ cFܙQGe(q:G8v̎)hi}qUmw.ᳺO<((wc3pP,)KTlKǡSܱ! vta;D&~^e=ǺNeA{O#36 ;% %E&I&JXzC"v anIs"4iܪ{Xhc.c֗MC 4x@LZLe};dbĈA"(N,\́]R PSAǺ? F cŽazg{uM. ;YN%qd1KeOjGL;4VG'm`ؒZ2?oy <}8r*)\:Y:!;vtϜaŽf~;S:0tС?[`ffM\{]Ƈooo!|e7o$A·m0Pݷ#vP ;]Ja$$ :zÆ .Ĩ7..dۅ7n7B`ǃ'/8ta/~ll:_rǥΘ1ݥӎd2&ɓ'[ZZ:u*9ᑒBi#K)K)bL6b?{?'OU}^uLuy;¿;θzkܜY-_ʄ0e{#wMM1djmDLh;hk`t]XʫwcX _&J4}X28h?J)aѣavM6C9eRqҦYJӅyŋ"a0I,;taNn=ԋJKjJk{4xgȤLӳf&=,L+уӅ!v v v|,(Y+ "bm.Dg&I+EyUExCcS-^1}tqMQ v`Rp;p)8ձC j;/_J-צ1& rZX\] H+@ٳ8r!2(>-$_hٳq)V1WSbB+Rnmj1ǥUܨ Ď9&3Wݴu-V!s@4\ώikڟ(Ɲ9T4r0RZL- L}#>cs׷ҋrqK. 㹢9,ٹh0DǮXbDk#=8(}BP( BP(T44444444-aG@B~DP(۵v $( Bu;(Hx#Q( .Z2cصRLڼJv SΈ}޽Gl]Ny:G;phD&&&pHKh\X\QLx-RpFHzQPBvXBf(L> 2bH-וEwĎb?P()Ek[Ӷ@j ;Y % i>)ki})@6G kradV"Y Ekeǎ<_$ %vv}7쫨ڡY%;oWW?o-lJLωIL/T啖V {[2YbHb]^"v}{ѣumL&&&ζW vpŕmO8ePZ,@\~ $rpp044ݻ7YX-vgdaEG-h툈(ǎ6i ;\]aBbرCVmB@@@MNՌj+WgʄGfxx؝:B*LP.]ګW>}_K Ԕc={d: b=/ce9S VaZ;J6[Y(l(\\uZYM^a)FA;;;;:ygĈ&'2]u;/_wtpW//?BAyRSc$7`Bfoo"@D,9 oY:Cە΂L ~򧛕 o5T߿Ua ʆG#n^av\yjŽl(yyy a;''G:mYCt@2ڜ ǎC]LvǍ?ְ4o@`Xr2l;89%]]w__&R5;Y[ر1`t[aÆ1u@ K' uT~/ءix,g/*iꀶ `[%jxӪe5 .prŽ4*322FP)؁U=3;^`NJ?Q)1px| n>>d/<'P$e&MD(aZ!8v0bI3H8n=izQ{ 4x@LZU{'WCYa{WJK:ɒp3"رc..U7~d3 ;<%ؑ&vp F:YN%qdM:ʞ"հ vhvv]ih^Qq g`` XW@!#W2.Y=aiiзC9 ${ vH-$Zh痼|a};Τ}Ovx>FD8;<ۉ|;2Uz.[ wÆ .Ĩ@.g* +jonV O^pZ_t^8cX5GPyT$h#K)1K)a?) τO&?o4u@xDzHSR̄0͍Υ\P; B i-`w"vt 숎队4.ziһRZ}1tmxWTiIzXbbbļ͜A:;;&ݓRcee""vC}rtuf)U߸d2߿?L/wtt`$-G@q'0:,ũYsԔ<h-EՑI!Q'*,dӅ!v v vh;T8W.SkF;Txv\\\YW NW򊫊*'W%eƦG?p4uGpM.^ %:]X + aC+j;. ebec_Uء;}Xɴu03|>&BdyQ|ZH̹@Y;GwťI;S9tqx`G\Lh)79&ءw<LP ̚ZZ؜9qꨉ)u1u v;P:!bs. e,gqgCɧRy~C>റAp^H̨n[9hG];A(c@mfr8?wz謄i9J 6r`A݃٢7vP( BhhhhhhhhZŽzBP(Tk(Hx#Q( vQ(FP( }G̳̳%Sweb*+%03(ݐ2lbHhXOe~ *'ĺ4zQAB“ĊdɽyC(+9] x.)XC9K)QLLOY0Gמ;©Ӆ3.g)RpŎ 2^}vs(K'G99C,eኂ2CEnfff8K)HdJ;bGUPv(\M Ô"bE&ir#4$!-d{b-ϓR߷?ɂG+vO vh; Z{hwq҉HdkkJvm`76WHH`=/ ߋDs%߮O[*sbӋ4U7>~Eqyh3Y `DŽ _Ixx"6 gg+|;vz{zy OI2v(\DM_~FFF]a988ݛ,G-… ; ;Q9;VҊ*<{+177/i߽PRpt}σ84 #v v v vh;._W7J1kI4N0! Y!mbjK <LJBDDDdd$نQ;E[v]hq^qU5`Gay|vUT7" J v0y|sĎ,OOO(^^^.\FA;;;;:^ +[opt;BϞ Hw;u3'$U$0*J;}z䬭 (,]W^}Y~= 166 x٩){tDzJ_s?@vV/m>QRP~>ǵRSSSҹ;P;`GS *?|!0Χrc#vxyy{C`KGB;3H4߰0QjְCe @СC!P$ȃ0- vPGqhRYC>N^t^ƒjV6<:laQR!y+,;~VeBQ ;(2srrFP)5D랓vhsގ.|/[VHkabҤ} NN yW`חɥTN*0̄_͑,0E9455" RnR.رeáC?ӧu[L73aӅM>唽=z3a xqvs#!s)`y8ǎ!CPh#%b@ A];c~Ҹ륕WKKiбA˿G^QUTR'@ !m 2M'''K@؁:'GOdՙT}2ˬc0]wX(2:<< k`ǩS{L-Z[ 1[ 3n^1cR.D&ŧĜ st9@H`)bWx`G\Lh)79&ءw)ZZ؜9qꨉQ؁gK>v؜BYiܙC`r)TPgEHӏvk B;js69bXÔ> S?P(xv0[f BP(~ MKQ/Q( ve o$ BP; H BHyyRdLZeE;xsX tʕh`'?S@a+V9@8$֥у|dgsF & O+Z% Lta* ;cŪ,D11>ade8b6Zخ=aWwS Sg\.R8;үebʑmzJ_J9oEM91Ew?|򢸼ʚG\㬻KG﵄>> {x 07oʺ&ӆ[bbl{E`Wo/W/ϸvC))Z˶+L"CC޽{S(9e]p!b~a8?G{JZQEu?޼szEÑ65j[ nݷy0y^dm`GZZZ1kI4N0! Y!mbjK <LJBDDDdd$نQ;E[v]hq^qU5`Gay|vUT7" 111,;<==4zyy]pA>mB@@@֭njy˖CwrӋ gʄGfxx؝:B*LB|r.]ګW>}_K Ԕc={d: b=/ce9S VaZ;J6[Y(l(\\uZYM^a)`p흐X>mB@@@ШQ|_ Vc#vxyy{C`KGB;3H4߰0QjְCe @СC!P$ȃ0- vPGqhRYC>N^t^ƒjV6<:laQR!y+,;~Ғ;mF)ΆHɑCAt|+ 9i6Bhܹ=f d p)>vP  KNm'+Rf' v C;;000uV>l0nad<";4"=vG`9{UISmsܽj.QguV5>.yPPVw1`޽{b%#-- 파DP)؁U=3;^`Ghh`ws_ISP,qCvxeIBYFInҤIV^c+90ݟ4>IčVÚ'@^^ͭ/@te_wrU ;;gqEPᩴt{C,QQ%Ud75O_;Hk]πf`G'Thad9ĥ69({TJ~G.ءX:Y.44_]y˳W0++EUI"աG,X _u3gW'v\?dȿNI$*a| vI>}p-vx vDge;aq)]l ۷ h]JOQ;ЁT]JalQEUaEۍЪ 2]X[~ΗgMLL]JῚ#Y`(shjj*Ehѥѥ]Ji\J71⿿avU ;ԟ.L~h,;8 ;` KQ;á>v 2@)ZD*hc:'K^Zy.V{ +@;+zUE%eڻxkb 2M'''D DWbb'2RqeQԿ.;,^ӅHZ`e sL^u9ZI~IMipQL\TejjF cZEU. /P\wOIˊ'CP#!Rp09YW NW򊫊*'W%eƦG?pP&K)W.,ו0ءp5rI y22KYxr>{LZ[ /{^7/1)"ϋBb9v\  $6+vƿX#rP jJafCлzL&MLM-mlNۜ8eauG᳃E[;TlE4̡vh09Qo#660׷RvѮw];A(c@mfr8?^ Ky謄i9J 6r`Aݳ٢7vP( B!vP( ؁%Hȏ( Bu֎27BPn o$ BPץg%f],1L(4oxxsXU,@ :[t!.MZGa9Aqv0gTK$roJRiQK8ŐXڜ(&&',HKFz0Okڝ'~YJՙ'G Ŏ 2^}Q(KdCȂph2CEnfff89:HJ;bGUPv(\BV Ô"bǵir#4$!-=e-ϓR߷?.G vO v=ڤа㢵҉c:Ddvc/j|{QPto S,d{A#66WW?o-lJLωIL/T啖V d_rR %#vvt{Sؑ^Fƍ%%Lzjby>;\\a xqN;;;;ɒymٳX뤍A'WvX,v6ChCX!"""22lCɢ_CTH @;U4ܸsZ>; *DX;<9bGVV'F// .GS4ZɨQuR#YȌtS<}BBh;Y\I :XښҥK{էOדccciwᛝr,gϞLGAQ;`,0Gpj!s@ 4l@kGif+#% wy\++,555 \ e;!!6?|4 ?؁؁؁!#K_wt|c#vxyy{C`KGB;3H4߰0QjְcL @СC!P$ȃ0- vPGqhRYC>N^t^ƒjV6<:laQR!y+,;~Ғ;mF)ΆHɑCAt|+ 9i6Bٱc\क़a| A 7 0,9/K,-T`yXC@:֭[IaØQw:*lPw`>ŖW%Mжq~D =xZAAYżN.{UŽ4*322FP)؁U=3;^Bb㵽{xS(d @7v(K2Lr&M"zj-`G;^΁O $n4=prjn}< &-Rءo=+b O dp`РcG3lZ~d3 ;<%ؑ&vp F:YN%qdM:ʞ"հ vh09N 5 +;n׵d4=~ lky (pJQUR%ǹtH{uQ' HW]&{ FFܫbv&{ʷi3"N$oGP ťtٲe0ho߾6lu)=}&FM@Rw)ѳEU7n7B`ǃ'/8ta/~ll:_rGM711aw)jd(ΡIF DRtcDRt)7syQτO&?o4u@xDzHSR̄0͍Υ\P; B i-`w"vt1ƥ]/Zz\J= O_\=򊪢2]<Њ51s K&ݓRcee""vC}rtuf)U߸d2߿?L/wtt`$-G@2Ӆ9J K/Nͺ{$w@ oo~&.L 255#Ӆ1̢r*N؁؁vp\ֻe`!vd)8,+O+EyUExCcS}#8prt\HɫGJBPb$BXw,vh<9e=-x=xlL Ei!1EgI;.Gj;^_,9W(SvZʍC5C!v=&&66'mN:jbb ߣҢǭ*6PrVwP;4|(7 N{[AaD);h׻ 6Ik39C/ˋ'z#(9vM~ZTٔ^t'/+-@,.;p{\^qJ?O11k>ѣ-:D iD5<^^q9SR m#hׯdWD{> }Qr2rd9pBp'y^Ay#GmKkwo54(ݻo`08N' Ȉ;II7!m v8ÄĢ/dc -7x` drpDNBWo9n޾wƝ{UMVրuQP^WQv&4x*-,;<==4zyy]pA>mB@@@4rg׀ZJʍ\Xco={V&wAQgBIBIL'LkTgIь&J&p5TUrȵ kD#J` h bQ#gNۙN2ӤWe/voN>C}+Q>}#""Ԓŋ y|}}}M?.!}e9Wzi[Ćd;^|E;N\\GS1ONoPhj^߶mWޛݠϽ@;…~~_DDܨ?|HlGND^/ +Х599YkU YV~~^Qia4Æ Ss3N' Ho琐֌vhknUu3yE; +_Z.?~篵\KE;Z.v_?u<8WUI23yPN.E_F^}znct>ࣆ ģ;p[lZ;O>Nwv˖K>>_ed8_;4$! *+RSyyJJldtO͵jU fJJ¤lPPܹsnRfvP@:KJlz]WoPÅݺοJKcl2_R*vd(C40хRHI)%kǁGϿ.782h kQy5{Iujz$tRR_ޔvH İk=a8kLj#ݘ@+aht-f|ҭǚ[4ҳnHÊ؆Ҏ!%;ju;68b VWyVeffVVV6+F<?4僣3JaIOKF_;Cpa Cq͛SRRd0IkX3\Xj^pa5MU{mmWCҽE; gwm,QÅ*Åh_aj|nxӡ6{J;\2t&K3T쬕CM-]x44sxSyU~I3'\ݏ:0'ю>'X3$юm] Lg~~WjOvX{J8m*Vg/l~dXа=)%S9 ǙaT;|3Qqph29Ǟp^ZLD&'&%1y QQL|;\-np!*U/A;xg7tQ^.E@V_ pAÏz޿3C ~<sEwEE+eXn|wZf#/o-E6 }611FZN7y#ˀcMDī;Q{IZ"he/ipIK[F9Y`Z` kQChwv7ΠhvvhҎp pa8^UiG]i 9EAkÁ|oю[5 9EAkñuj;ybF1 }IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/add/voice.html000066400000000000000000000142411506652756400225470ustar00rootroot00000000000000 Yoshimi User Manual ~ AddSynth Voice

    AddSynth Voice

    addsynth voice window

    Once again you have a set of the standardised inserts that are used across all engines, described in the following sections.

    Volume and Panning
    Filter Type and Style
    Envelope
    LFO

    There is a row of eight tabs along the top. These select the particular voice you want to manage, and its modulator section. The tab colour changes to cyan to indicate it is the selected one. Voices that are active always show their tab number as black so you can see at a glance which ones have been enabled.

    The On button enables or disables the entire voice, including it's modulator. Also, with the exception of Volume/Panning all the inserts can be switched on or off.

    Local Controls

    (voice)

    Delay Individual voices can be delayed against the overall note on point. However if one is delayed beyond the note release point it will never sound.

    Resonance This determines whether overall resonance is applied to a particular voice.

    Bypass Global Only use the filter block for the voice, otherwise it is applied with but before the global one.

    Minus This inverts the phase of the entire voice so it will tend to subtract from the others.

    Bend Modifies the range of an incoming pitch bend for just this voice relative to the rest, and can also make it go in the reverse direction.

    Offset Shifts the overall pitch (up or down) for this voice.

    440Hz This fixes the frequency to 'A' regardless of the key pressed. However, see below.

    Eq.T (Equal Temperament Variation) If this is greater than zero it modifies the effect of the 440Hz checkbox. The A4 key remains at 440Hz, but the frequency of the other keys vary according to the key pressed. When set to the middle of the value range (64), the step size is exactly like the classical equal temperament, i.e. one note step for one semi tone and 12 steps will double the frequency.

    Equal Temperament Variation is useful for sounds that are inharmonic, but which still depend on frequency. For example, with a very short envelope which quickly drops the volume to zero, Equal Temperament Variation can create bell-like attack sounds which change with frequency, but which don't get unnaturally high or low as you go up and down the keyboard.

    Detune, Octave, Detune Type and Coarse Detune all behave in the same way as the global ones but only for this specific voice.

    Unison (on) This behaves rather like an insert and enables the voice to be split into chorus-like subvoices.

    Size Defines the number of subvoices. Between 3 and 5 is a common setting.

    Frequency Spread Sets detune amounts of the subvoices from from the nominal pitch.

    Ph.rnd Gives a variable amount of randomisation to the phases of the subvoices.

    Stereo Gives a variable Stereo spread to the subvoices.

    Vib. Sets the amount of vibrato to be applied to the whole unison.

    V.speed Set the average vibrato speed of the subvoices.

    Invert This inverts the phase of some of the subvoices, depending on the number of them and the amount set here. The more there are, the less noticeable the effect.

    Source (voice) Each voice can be fully independent or can share the main features of any lower numbered voice. Voice 1 is obviously the lowest numbered so this control is deactivated.

    Sound Switches between using an oscillator, or one of three noise types. White, Pink and Spot. The last one is random bursts of white noise.

    Use (local oscillator) This enables a voice to choose just the oscillator waveform from a lower numbered voice.

    Waveform This button gives access to a highly detailed waveshape editor.

    Phase Gives an offset to the relative phase of this voice.

    (modulator)

    This has an independent subset of the inserts to the associated voice.

    Type This enables any of five modulator types.

    Source Local uses just this modulator's controls, or you can select any lower numbered whole voice as a mono source but with this modulator's further controls.

    Vol The relative volume of the modulator oscillator, compared with the voice.

    V.Sns Velocity sensing level. Max is disabled.

    F.Damp Degree of high frequency damping.

    Follow Voice If checked, Voice detunes are applied first, and the modulator ones are the relative to those values.

    440Hz Fixes the modulator frequency to 440Hz

    Detune, Octave, Detune Type and Coarse Detune As per the voice, but just for the modulator.

    Waveform Opens the waveshape editor for the modulator.

    Use (local oscillator) This enables the modulator to choose the oscillator waveform from a lower numbered modulator.

    Phase Relative phase of the modulator against its voice.

    Back to top
    Back to AddSynth

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/add/voicelist.html000066400000000000000000000035471506652756400234520ustar00rootroot00000000000000 Yoshimi User Manual ~ AddSynth Voice List

    AddSynth Voice List

    addsynth voicelist window

    This provides an overview of what voices are active and an alternative route to the voice editors. It also has convenient shortcuts to the most commonly altered voice controls. This is particularly useful when making small adjustments to improve the overall fit of the entire sound.

    Clicking on the No. checkbox of any voice line will enable the voice if it was off, and vice-versa. It will also make this the current voice for editing.

    Next there is the Edit button which will open the window for work on that particular voice if it wasn't already visible. Clicking on this button when it is already active will again make this the current voice, and open the window if it wasn't already visible.

    This is followed by two small icons showing an approximation of the voice and modulator waveforms.

    The voice Volume control is next, followed by the Pan control for this voice.

    The Res checkbox determines whether this voice is passed through the Resonance filtering.

    Fine Detune is next, and the final control is the Vibrato Depth. This is the voice frequency LFO, and is only available if it has been enabled for that voice.

    Back to AddSynth

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/appendix.html000066400000000000000000000566621506652756400225370ustar00rootroot00000000000000 Yoshimi User Manual ~ Appendix

    MIDI Controller Numbers

    Summary of the MIDI 1.0 controller codes in decimal and hexadecimal

    Decimal Hex Controller Name
    000h Bank Select MSB
    101h Modulation Wheel MSB
    202h Breath Controller MSB
    303h - -
    404h Foot Controller MSB
    505h Portamento Time MSB
    606h Data Entry MSB
    707h Volume MSB - (formerly Main Volume)
    808h Balance MSB
    909h - -
    100Ah Pan MSB
    110Bh Expression MSB
    120Ch Effect Control 1 MSB
    130Dh Effect Control 2 MSB
    140Eh - -
    150Fh - -
    1610h General Purpose Controller 1 MSB
    1711h General Purpose Controller 2 MSB
    1812h General Purpose Controller 3 MSB
    1913h General Purpose Controller 4 MSB
    2014h - -
    2115h - -
    2216h - -
    2317h - -
    2418h - -
    2519h - -
    261Ah - -
    271Bh - -
    281Ch - -
    291Dh - -
    301Eh - -
    311Fh - -
    3220h Bank Select LSB
    3321h Modulation Wheel LSB - (rarely implemented)
    3422h Breath Controller LSB - (rarely implemented)
    3523h - -
    3624h Foot Controller LSB - (rarely implemented)
    3725h Portamento Time LSB - (rarely implemented)
    3826h Data Entry LSB
    3927h Volume LSB - (rarely implemented)
    4028h Balance LSB - (rarely implemented)
    4129h - -
    422Ah Pan LSB - (rarely implemented)
    432Bh Expression LSB - (rarely implemented)
    442Ch Effect Control 1 LSB - (rarely implemented)
    452Dh Effect Control 2 LSB - (rarely implemented)
    462Eh - -
    472Fh - -
    4830h General Purpose Controller 1 LSB - (rarely implemented)
    4931h General Purpose Controller 2 LSB - (rarely implemented)
    5032h General Purpose Controller 3 LSB - (rarely implemented)
    5133h General Purpose Controller 4 LSB - (rarely implemented)
    5234h - -
    5335h - -
    5436h - -
    5537h - -
    5638h - -
    5739h - -
    583Ah - -
    593Bh - -
    603Ch - -
    613Dh - -
    623Eh - -
    633Fh - -
    6440h Sustain Pedal
    6541h Portamento
    6642h Sostenuto
    6743h Soft Pedal
    6844h Legato Footswitch
    6945h Hold 2
    7046h Sound Controller 1 - (default: Sound Variation)
    7147h Sound Controller 2 - (default: Timbre/Harmonic Content)
    7248h Sound Controller 3 - (default: Release Time)
    7349h Sound Controller 4 - (default: Attack Time)
    744Ah Sound Controller 5 - (default: Brightness)
    754Bh Sound Controller 6 - (GM2 default: Decay Time)
    764Ch Sound Controller 7 - (GM2 default: Vibrato Rate)
    774Dh Sound Controller 8 - (GM2 default: Vibrato Depth)
    784Eh Sound Controller 9 - (GM2 default: Vibrato Delay)
    794Fh Sound Controller 10
    8050h General Purpose Controller 5
    8151h General Purpose Controller 6
    8252h General Purpose Controller 7
    8353h General Purpose Controller 8
    8454h Portamento Control
    8555h - -
    8656h - -
    8757h - -
    8858h High Resolution Velocity Prefix
    8959h - -
    905Ah - -
    915Bh Effects 1 Depth - (default: Reverb Send)
    925Ch Effects 2 Depth - (default: Tremolo Depth)
    935Dh Effects 3 Depth - (default: Chorus Send)
    945Eh Effects 4 Depth - (default: Celeste [Detune] Depth)
    955Fh Effects 5 Depth - (default: Phaser Depth)
    9660h Data Increment
    9761h Data Decrement
    9862h Non-Registered Parameter Number LSB
    9963h Non-Registered Parameter Number MSB
    10064h Registered Parameter Number LSB
    10165h Registered Parameter Number MSB
    10266h - -
    10367h - -
    10468h - -
    10569h - -
    1066Ah - -
    1076Bh - -
    1086Ch - -
    1096Dh - -
    1106Eh - -
    1116Fh - -
    11270h - -
    11371h - -
    11472h - -
    11573h - -
    11674h - -
    11775h - -
    11876h - -
    11977h - -
    Channel Mode Messages
    12078h All Sound Off
    12179h Reset All Controllers
    1227Ah Local Control On/Off
    1237Bh All Notes Off
    1247Ch Omni Mode Off
    1257Dh Omni Mode On
    1267Eh Poly Mode Off
    1277Fh Poly Mode On

    Back to top

    Note names, numbers and frequencies

    Note Name MIDI Note Number Frequency (Hz)
    C81084186.01
    B71073951.07
    #1063729.31
    A71053520.00
    #1043322.44
    G71033135.96
    #1022959.96
    F71012793.83
    E71002637.02
    #992489.02
    D7982349.32
    #972217.46
    C7962093.00
    B6951975.53
    #941864.66
    A6931760.00
    #921661.22
    G6911567.98
    #901479.98
    F6891396.91
    E6881318.51
    #871244.51
    D6861174.66
    #851108.73
    C6841046.50
    B583987.767
    #82932.328
    A581880.000
    #80830.609
    G579783.991
    #78739.989
    F577698.456
    E576659.255
    #75622.254
    D574587.330
    #73554.365
    C572523.251
    B471493.883
    #70466.164
    A469440.000
    #68415.305
    G467391.995
    #66369.994
    F465349.228
    E464329.628
    #63311.127
    D462293.665
    #61277.183
    C460261.626
    B359246.942
    #58233.082
    A357220.000
    #56207.652
    G355195.998
    #54184.997
    F353174.614
    E352164.814
    #51155.563
    D350146.832
    #49138.591
    C348130.813
    B247123.471
    #46116.541
    A245110.000
    #44103.826
    G24397.9989
    #4292.4986
    F24187.3071
    E24082.4069
    #3977.7817
    D23873.4162
    #3769.2957
    C23665.4064
    B13561.7354
    #3458.2705
    A13355.0000
    #3251.9131
    G13148.9994
    #3046.2493
    F12943.6535
    E12841.2034
    #2738.8909
    D12636.7081
    #2534.6478
    C12432.7032
    B02330.8677
    #2229.1352
    A02127.5000

    Back to middle
    Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/bank/000077500000000000000000000000001506652756400207355ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/bank/bank.html000066400000000000000000000230321506652756400225360ustar00rootroot00000000000000 Yoshimi User Manual ~ Banks

    Instrument Banks

    Pre-designed instrument patches are immediately available in banks. These in turn are contained within a bank root. These bank roots are themselves contained in a root path. The entire structure bearing a direct relationship to MIDI Program Change, Bank LSB and Bank MSB controllers respectively. For normal work that gives up to 128 Instruments in 128 banks in 128 Roots - potentially over 2 million! Yoshimi actually has an extra 32 Instruments in each bank which are only accessible to MIDI using a custom extended program change control.

    Note that Yoshimi uses the standard MIDI numbers, starting from 1 for program (instrument) changes, and 0 for banks and roots.

    As well as instrument files themselves, a bank will have a hidden ID file .bankdir. This serves two purposes. It speeds up bank searches. If this is present there is no need to positively identify at least one instrument. It also contains the version number from the last time the bank was updated.

    We advise against making any changes to the bank structure through any external means (such as a desktop filer) as it is possible to invalidate Yoshimi's records and cause it to perform a complete bank reset. This in turn could change all the MIDI numbers, breaking any previous projects.

    An instrument bank

    This first image is of a typical instrument bank, and the first item at the top is a menu of alternative banks. Following this is a button that opens the instrument Search window for loading an instrument by its type classification from any bank at all. Next is a button that takes you to the Root paths window, and finally there is one for the Bank roots window.

    The menu is quick to use when changing banks, but doesn't give you the flexibility of using the buttons for bank roots and root paths. In particular, a right hand mouse click on these buttons will close this window while opening the wanted one, and a right-click on the Close button (bottom right) will return you to where you came from.

    Below this is a table of all the instruments in the current bank, with coloured backgrounds indicating what engine types are being used. In order, these are AddSynth, SubSynth, PadSynth (a reminder is shown at the bottom of the window).

    Clicking on one of these will load the instrument into the currently selected part, and highlight it in the bank, so you can easily see where it came from. If selected with a right-click it will also close the window. If the virtual keyboard is visible, then it will be given keyboard focus so you can use it to quickly try out different sounds.

    The buttons on the bottom row determine what action is to be performed when clicking on an instrument. The coloured underscore shows which is the currently active one, and by default it will be Select.

    With these buttons, you set the operation you want to perform before clicking on an entry, and regardless of whether the action is successful or not, it will always return to 'Select' Also, the next four buttons will only work where you have filesystem write permission, as they all make actual file changes.

    Rename When chosen, clicking on an instrument entry a small editable window will be opened with the existing name. Changing this will change the name here and the actual filename. It will not change the name of the current part.

    Save Clicking on a table slot will save the currently selected part to that location. If there is already an entry there, you will be asked if you want to overwrite it. It will not save the default 'Simple Sound'. There would be no point, as that can easily be recovered by clearing the instrument.

    Delete This asks for confirmation before permanently removing the selected Instrument.

    Swap This is a two stage operation. You select one instrument (which will then be highlighted) followed by either a second instrument to actually swap with, or an empty slot to just move it to a new location. Additionally, after making your first selection you can change bank, or even bank root before making the second selection, so you can move and swap right across the entire bank structure.

    divider

    A bank root

    A bank root

    There are just two buttons on the top row of this window. One taking you to the Root paths and the other to the currently selected Instruments bank. These buttons behave in the same way as before, with a right-click closing this window as it opens the next.

    The table of banks also behaves in a similar way to the Instruments one.

    The first five buttons on the bottom row also operate in the same way. However, when deleting you will be warned that you will also be completely removing the instrument files, and exactly how many there are.

    We suggest you avoid Bank 0, as this is the one that many sequencers automatically send from time to time. Yoshimi reports attempts to access non-existent banks, but otherwise does nothing.

    Import If you want to add a bank obtained from elsewhere (via the Internet for example) this provides a safe managed way of doing so without disturbing the rest of your bank setup. After setting this option click on an empty bank slot and you will be given a filer window to identify the bank you wish to import. Use the normal controls to find it, then instead of using the navigation controls click on the filer's Import button. This will only install actual instrument files, any others or subdirectories will be ignored. Once installed, you can rename it if you wish.

    Export This also operates in a managed way. It will not allow you to overwrite existing directories, not even bank ones. On selecting a bank for export you will again get a filer window for deciding where you want it to go, but the Name field will also be active so you can change it to something else. This will copy out the entire contents of the bank - it doesn't expect to find anything other than instruments and the bank ID.

    divider

    A root path

    Root paths

    As you can see, the behaviour of this window is quite different to the others. First there is a list of the known bank root paths, preceded by their MIDI numbers. The one with a following '*' is the one currently in use.

    Add root directory Clicking on this will open a filer window so that you can choose a directory. Note this is a directory containing banks, not a bank itself. When you've reached the required one, clicking on the From button will add it to the list and make it the current one. If there were no banks in that directory the filer will offer to make one, and place an instrument in it. To do this it has to use part 1, so overwrites anything that may be there.

    Remove root dir You first need to click on the path you want to remove before this operation becomes active. This doesn't actually delete the directory or its contents, but simply removes it from the path list.

    Make current Makes a chosen root path the current one, but doesn't open it.

    Open Current Provides a convenient way to open a bank root. As usual, a right-click will close this one at the same time.

    Finally there is a spin box enabling you to change the MIDI number of the selected one. This can be any number between 0 and 127. It is only a number change. No files are moved. When changing this, a button will appear marked 'Pending'. The change is only made and the list position moved once this is clicked. If you set it to the number of an existing one the two will swap places. It also makes this the current root path.

    We suggest you avoid Root 0, as this is the one that many sequencers automatically send from time to time. Yoshimi reports attempts to access non-existent roots, but otherwise does nothing.

    Note
    .local/share/yoshimi/found/yoshimi/banks is a root path automatically created on first time startup, and is a copy of the installed default one. It is provided so that you have the contents in a form that you can add to, move around and edit. You can't do this with the default ones.

    divider Back to top

    Back to Bank Root Next (Parts and Channels)

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/bank/images/000077500000000000000000000000001506652756400222025ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/bank/images/banks.png000066400000000000000000001134301506652756400240100ustar00rootroot00000000000000PNG  IHDR<tX sBITOIDATxtTׂA$@ dIdA"(dr2#r#D20" L$69:03k~ߝp\* T ]9kٟv,Pr=/@ ~8גN:@ ![X[@ 04Ӓ@  þ ,i !|uam&?cV k5gK cs.Kxmۻ|hH:Նti"&y^p|,1}QBІ֚>ó}u'wOi{wmSϜ ײ!U*E7;-_bjoJY\a,H=aک}4B> 7 )RXKSLSM_[Μ; $L؜ի8Wbpse?rg9X_وi*ڔ1:#|~ \~Z4"e tme.qaBG0y?{$䞰sdK<<„a3w={AXY9AٻDϠ>GK*.|0_%NeιdGj|j[0eO${=^bϜ #^J}o~wc[6ė/C\Xr{B{[vnv!1 mWV7ɻaј=mHۭUjj'Q-\}ZoLͫU*5nP62?j6lk޿U.}ǶҮo$toJ:"d*z9ZS11-lf݀0ODx}xwsq}L̸!]L̛{ZO i^1?o\2f9mnX'K*WбM#,?x65`eMu=cƘK,1ؼZVv{67g;9 ifMk"+WxТ,S&uDmǒvᨸvuѰʗWoKg )7\ԎYm8^ݕuLu@|Y3EY5sBF wݔm>+5SF]œ1\=0g[Wz5֧vIo)uD$E$ f7߅NeV*)g7JY9ȓ2ҔkT=yb\C놮yz&t`s)w1TQ6:41sH$ew{MP:m*_;d1%2Q>GLn];45O2kw҈g0qci޸GĨ{Mnff9>yTsS=W`w sppq|W8?K"k"֛v7*쪲m3d5 pi#O>ߚuΚei&XyNstRMʢ3~]s弡楥3 ײmS/m#?{bOR&{j0cœ_hAavۭeϸm[mY: >LX&>ie{-:]X7e*IXpsi>1i-9\]a^]m3nyoސgU][X%?_1wvLN7>+L`&]'`v;Ef,oe|>%F'ur̨j[:sIIZ"O|6^USګM>ު;g׿Ӛ#Y1#O>ߚuN`L]rR^J*T^Kl܍t+:^^jE=[iuJu;iV9zv, *xFy{QW!Zbb6.~w:_4|uZ[fկ{Kޡ2ɼ#fnnu7o'ytK=uS3\}:LdwgfBQ)kNeRxVs_@3k|/=MI{OָS9Vȓi(bUۼ}gnvaC~gcX3ْ6():@'YytP6:wO\Fk3^0$rVqytNSe%Y:c9&cDԫTh٤-lDb{tleM$lCuT lic;c׺x%rxo;˫gPf~8̷iH(w3Vj\nߑ}#0qcnX[|&2ͽ[Y%cVD'aϥ7O &߸mpt+:nG VguNv1_,jT|$ۻ?n~d.1lw7e>k %ڷ5QgL&u41LP+e}?;u3}lc?S5oD5_mdQ+ڒָ9U\ET }*޺#ɶbޙՇrZV~pdH߶:rxY~ W߿nq2bV 7i fLY6zWZU &fۻ]}G #m>rڂ!0qcʟ q7 [/T"䓰lF3i?26Nc/eQQbUWu&j$O@P|·6<{ozx2inv mw?ZH5ۭbq.aV">ϳ -G`EJ62)<<`ָf޴N罹ImE}*[_<_οa};se[SX֐n׈s3FEVOr圁Saٌ'S)fn]ƺPnv^*+UhPzvߦ'x9O,ܪi]*~({IMlY'bn:ój#]}G 'N=O0qcQFTo>a{)vpD'aqr3io>ؿn<@{A:h-xi@Qڂ${ cxRB6/M>'ia m< a¾un8 Ɠ iC^ΣT~W^)RAㇲwJҖ$jb'SdPPPP2etz\XŐ"!c5^)lOo8X&W˾A5U(Zzڬ}K -딮3hwO%*#3:e8ֆ6tniҫnSSVpɦMv'NU/xi{`AmwzՋ/ް{WKN, ݦY&bJa3N7>wR_m 64/ϜVbŢJv2i5zM{珵t+cjn5innC6H g1ɩᕵ[az'ф];M[\k5Mn5:2i@ڵhҖ?G-PomM/]]!kՓQsXbv뿚x<i2ed]vnͶv_.\ZFev7ݨz/sU+vӷeuH>6'lP1ݜ_+Z(H˕60<1[!7ɽ\Iۀe]J_nҫۍmj|kGjj^fl?6-Ѩa\ؘhq7xG܋gUi Yr%jBڤDQHmթ*Y&҄j߮o鉴=H|``f[ T[p—{]vs~ū6nji{6^mnjm'+iZ0ybU~5R h[fL 8f7w'O6YJaF-k?մ9[ā.yvycuzݦԾJMi 3SQgթkM] *ՁyRv)Seo#J /^6Zl-W"m/W<_GC\<1,>RFWkQӶjԴV64mnC6H.4O!+;lʦ SUޮ%9߫zNܳC'#ՠzH[69TֱRmi?<6ukSsu*5~~wHUt%m1a1#U\|"U^<\)e)mOeiiUa`q6P5uy^O慴fZNwUAtBՓ.ͽe m6MBmhArڨk1ծZz5jLNQ݂ iL,mp>QCjzj3Ԑ́5V5O͌^g"U%ֺbk͕Tz\ :R ܌D˝ij=4Yа\COM0j"mG\=1,NmuΩ'RݘꭴX;OO?ݧ7nn][H[xH$HexRBx)|i$xO*VHsxRBxIE@PL\ '+ < g* m' "Gi#A~GL<A6@ڀ<[V N5;/RJfY~׫WR__~yiC6@|&mvm(_>d]:}z͛-i[jV۞H{׮}k6 i g&Zfcy,isF6lXn,Hni&W*QxW/_>ڴiTɒ%t!C-i1 BU 'DHCiY*W^ye䰰 1c^͒0Vm\ھz6 W<|x駟.44ni[N+jc߾FΜJʏ]9!m i g e˦R۷կ_w={6=ʕ,Յ 6UUK9UV\1ҦBC߿ CHH$m_m߾^ҸqDzYj5s,m?[R/7r0[PPЁ[תA:`!VhZ"fĞʍO0 6@ڞ ܱc{iU4 K"""M5m*Uݻ@/KcE6 HIZ*ݻw^Lړ'7M1#55EX#iS75u34:UUz65֨m[bŊitȉ4Tu U!m i cMT729QT53=}u|Nm{"mfFڵkƶ2eLddmI"/^<ݨE&zuMJc-33CʨqSWQ" x!m҆p6&HG ]C_AI / 慴%ّd1`Хw5mR@ GB`'i5jpxxXpppDD gZ;/RJfY~׫W[G+%Kndܟ~!mH mGwܼy㫙{ʗٷo%mV- ?pi[nӧn>y*W]6 i ͣ]Q#bY[Ҷark  2>Cf0/-w8͎$ 5&@.%iw}|>mc$ KI"@@!p3I JH,/rf$ 6 iJHMTH -ܷow4YR+2UܣI+5Vpi޼ِ]V\I5eHHYMir1i i6-%U{IСm۶=Cʥ; Z\2'Z6fϞǏ򫴙ueʟf5xHy 6SͣF O/^ȑfwȐD7•+UeV۳ o=GCƍflldRFDRR*ȑI X:d0`.u :OttCQ-^IE>,}֪U6o^!my i(mlz.[6/:x75m$Ss޽<~|ՊX"x/4S6 %*4mervZӦھ.>ztVa M6ᥟ~jАᄏ:FJ~PZ(H`M"9fwe!7n­[gFz,u}עɒ'mڵAd٘U6u8-JlunF+>`IݻS{˔)mպ6Ѻi cd0ȃ5m޽;Q06lݺ6T7oTjsLnM6$m˗WujGiq+)&((N}?dT (H`رOxÖ-*Z-1&aR'۷Ϻ0f'mM]…&2"[\6 6 rIMO#F$ak*:VG4١(QW) 7N͘#߮]cmjN5H̅U0C"4ZVnM}4`IT wUghH m@#˔lTav9ԩNeWk4 ɔ6.\Xul֫gic۶YSUe\6M-/Ӎ)\zBrH m@#A~\AEz ~.1RrCy57 OW iKN#~c KIj]6Od0R;i." i{j d0ֹs{kMai54?~)6=3!m@ @%mO +x(a7o.XЂZE6T ̗ҶfYh޼Ʉ ^i,H|fwZ(nZ@ZV548SRfHͶܤI 5ߴxyT~oZu~̫ͫZDJiO܋Z!m@ @<"mZhV!&աC<)W|STHfI[\\~ٍQ"RfPjn:#ڽ}-aVF…3qpf6r*ޒ6שSsڴ 2B-Ν;ҫTkݹsBڀ2 yA٨u^Z.v_Nk)4_|mYU[&K۷om[FFwoUm&2K՚k &Rk9soI۩S{DkvtPP5VLHP U̙ܗC&0~z vf["LmرN^(3!"J||\z "7=șxKڶo_mTE7&&dd0ȃF7wݒ /^LN ӘS94uA?\mט65_*޴Z!33ix5miUإKcVHP ɓ7w_^IMM)\s_ i,O}Mh*ڨi*tf{N,IF}u5^|Tuc5W}4@UO=~|nҥ#'N{<7[# m@ @@6ɓK-+^ԩmrxBZv13I-^}ծ4=zvZJS?FU%$l^]?Z!m@ @VDpеkGy<iT2MiM4"ѣK0g*Ke[@2 慴%ّd1`Хw5mROOpӧ yd2t)靴 ~bIG)xA=J:H'` ׄJl 6# mMD3 ۷&ToeY~׫WۜAd㯽6iC6@|<~jժ<nMmذl/X%[lPZϼ+y=wMdUɲ6-d,ߒ>.=}:Yx iHqiQ#bڥ6Jjܨ/%xէQTOfMٿ/ۚ6[ɳMmuԜ7oUHմU7 iHei3Cm_Y…3M7UM4JG=TdlڐknۖfeHH6&?4]H:eB+SOϥMUe D6iճgfA]z謮ig7zΝsիW]x=S/.]JCS͐R&kѢI^] iCi#;@ mh&HG ]C_AI / 慴%ّd1`Хw5mR@ G7˖͋n i۸qÇ~U CCC6Pi(㴦g|$S^qԝ;߿ܯh -cp) 6 򠴽3'iVΝ; i8ׯ_&'RT+V\: :6lq'ȲyԼWAZcNV]6ԩSBi@ JGUͦ.hvҖKKA5d&R 7\9LtV#m/1̙3yN{)d=MۦM+[n 7o*"A6 U,JAd !>m?vl5(!}d~KpٍJ27fIjرC-ԑ::ݾ}Bi@ J:=xpф.jU:th=ٲFddlDԽ,,۹sK[FUm潗.9qby4!!jWSj<Aޟ\׶y֧O7շiD`1R4;,xO; m7m91(55ӤLZvΝxNR%Z/66ڭQ#n5̪zJLz͛ޤ\ 5cO?V&LnM0ᇫuWGI3b|nH㺅& 6yG 0h#6-URZE3r[kH4}V[Q wi=cTZ6Fj]i߽{罕+9呚`RfٳҦwЂ19{Gɥ믯mݚj~6GHQۺVObGlVOYB]+Ii{Umݺ[zUoGrjVNqz>l߾b0:6m%ӝSi8n\2ի' $GEEzU ػwrz5%eb~{z =D[=m/ 6L%Ai r3'/P?mN/AK[r6XN#EЈEY5y٪UIjv|it*E)ctfcfܨv%7ٞ\WhHn4H`KZbڮ]KݞܢEUXfpjEynSs2=u7i܆9=xia~2QVZ{^i iVDGAR1.k,c}iP'\v ~c 5ajl4%SiKN#~c KIj]6Od0R;i." i# m@J2Ki[x&_ *d7+&JiFs%[3и ZDah,W[# m@ id;wTuvҦy5G5 v#m-}zȤ4He* QUմvؑ#ۭ:f'm6,7ZVB+m-^IڧÇMWj#6_86T Җi25tZ/[6Ok\x(mjW;vhLֈТZKHh15-{GZMBuxzƍSws6T Җ;w@ҦEXdiZK+:#3;BhhC@(S Hk~ɩS jW7nE[elj3=p`")dKg*cHe*i˺O;U6uP۴itRH҈*NOt頶T71 x H{{Ĉ$6k >СffQ5z455%#cѣO *FOuV QU흤ҥ#j<Ցj MH8qc >P ?I[r6L<ƚOnoXfΜIMj233*W;w"wX'S UF6z7s7UPAAAl5us9M:N{EՊko>W5v ,zҖ!mH m^K:fYIANFy6*lTR7ɍLHTotGu`Kj|oqeQVAͬR@TիQ96 6M#FթɓVIK%JjjJ…#%нe˖V?WIF}u54RmҌ+Vԕhp@XXΝF}zꃴ mSiytѢE:ujktܾsJ*Iy&Ŋ-]TttԔ~u>ztY*Uސ6 6 ;f-m]thٲZo+,+.YĊoݾ}o=g.^Jڞ>-!m m-=}m׮O5kxXx-ծ^B >xpl7,9ymȑI:bUݛM^D D>n._>d䨨ڵk`KH mH;i{FZկ_?(ma 11>vlZQU isi۸qԴl i i|'mo1zIڰ={6=ʕplk/fd '9gOF-^6 Pu댉߿֒k>V8""߿HŋG$ 6R6ȏ&R rm[覎eWf̝<׼E.,_@{ܾ}NUn'N )}oֺu3kOGikԨM+M3U0;wW҆12 m@?m󨬫Uh 4`SW.lݚH),KK[l8wƁ6iI@(m۶1Tly݉Ghhll)SDFFڐ6!F 6i `ْ6A:Ol*>HkB|H_id0Rһ6x)xק 'okF]3+V{Ҧ/7o{rEG7Ԍ?t[i0avaH~Zw75A0/]ڬFi@ PMS{əC @+&k>P?~|V3Fecbz-Z6}cXmSxYn@h6Kgw<'A(Yݻ|5Mn4 675ة[?}zxbGl7C$*)*7o^5hP_-gjyeoGrjVNqz>l߾В0:6m%ܹH}tcʕх^=!\ YzU ػwrz5%eb~{z =dܸanϬ:h_~yt]-`Xf5Rk*}ݥKh3{d-Sn-}JR+IU!zpu>Q-fRRAtuN߅AJ۵kzo>7 &p_ixNhq J۱c;u`s|IxuԔHkL-TdZյƠ6lմukմZԎ%X ͚5Bi[wƪz:=+}ߛnLL/S)]CtjUuojSEtsL6ZZr3k9Xr)VvsN߅AJxI:RX~Yzݗ3f226Yk.Vת"v)g N{2eJ[DTx4iNkϒW_n< nՙ N}[JC湴~4\WՊZ5 EG]XX}/ _Uy"mHTԏ ӸMNyԽeL3Xm|]M'< ,R$QiiSjhv-tjִzKGtpMTէbYJ=Ni恳O]νԝӦ!f6桴iPԳlÆh kz)y鉴yrH mH"BJ5 e^MCp5$52 ~e#TsYӔ mρw9Җ;fGH A@մK>m>M61`ХwF;],' D2F@ڀ2 d0ȗҦM4rPP!yG4u5&,ɲj`MNӪU5 1iL2| mXk~rppp}Ԭ>mBiZKڬU (؏?11 x Hsi *ӢִRMԲy'FlO7nPrMMlUdZ"E,YB]Lc iyd0 ҖǪ/}#mӦv]qҥ,4-_|i.Դ&<2 Juj|IC&jÌ|:ݻw/.\ ݌MnF|^Bi'mVAWѶ!Uvj MH8qc z<2 K[r6L< &\kjԤk:Sz>m2:ujZ#OmMAaLY[ҖORW11=BڀG `@(e*`M`ˮ > d0{ iKN#~c KIj]6Od0R;iŒ<'NRFS5zt 6ݼEpd&Q" m i 6b>ڶm 쨅XI?|kɾ}kJ*XV5٤fԴ_}uiC6@|&m|ȐĿӢƫV-4ZE2ŋ!YJYƍS 6 i Ҧnڸq~_nŬxY (/Xܴi%mr)YDRR֟geoZWK7Fٹs{]ђ/542%e1ujZ[K6@ȎAޔYސMQ,Z75t~eEG7P9aIj<%ٕeVO?z}ӦMɦ&ܹ'kc߾F~AfU񦕗o:cv~_k1KTTPH mdG@ /KA;CLJ%~29}ڄjdi̶M{iԩeʔjTxՖ+WFf"b?PuoVҥsUcHUiei҆y\T&O;MUbݾ}NZsLIM@ = e*6@(S HHPi@ڀ2`H m@HPi#y (S 12i@ڀ2`d0@iL26@ڀ2 yU>kHk#e 4;,V7|nv-(Kiۺ5QFŪWz ;i;s#mv7Nݹs7n`$ƪ/<H)HSi۳gٳ\9>~…Êm6ZHW_]u*m&|ŧ]t;vi*HHHۓ'76n\_~y%55E=M43C֏_ܣ1Fnz& mّeH m>6A:Ol*>HkB|H_id0Rһ6x)xק '{ER_֗Nq>˨Jڜ^ڍmߦEMX?w@6+vb6]ILǸЪB+z}S}}oPTlH#mQG]3t,ͣ.m{w\rVJK&B{0ܕUvӷM+F"d9ocBmX.4?OualZ=IOr"mUι_Z*IM}#m?YM%m F!me_ਏ6JՊR89եJU1K*\JzU{]2#mN/fRPCSKÅWjg)mWei6yG TMvM滉h1:kL剮'W[VN!U0GKlyW]fWbїE'LҴ<u!饝J64sxgR5VU4s`́~ͤK&VU5>W'AT/=S'Ҧ w ʹGM m1@ kܯ/T,ƗϤMCp5$52 pGy֩qc37W iKN#~c KIj]6Od0R;iׇB@v^C.^}z_g'ɩ^"m# d0@~ ?xgԨժU)ZHuwXg^XJ*X'EnSJۺuK=c6ӦMپ}{/n6G2 ml!.zʕoYyiĶm[HJQDq~wt{uk6J!m7Z5_X1={v4"m@ d0Իwr:,%e@ d0 F<Ǵ}ǚo>7/-[6/:رiSNʼZ6K?tN/ϚsIXm]HYjlIeգGg,ͺ;~6,sӧM~zY?oܸȑI *IvfUKo:ؽ} 2`Tdm4W6+)Y´~zj)K5s"H)cLkS{˔)mՄɓLYd@ӻZSǙs<\2//t#mOUl޼!sJRJ*mϣy.]:W5He*iˑ^[Nj˳$÷5mV9s&n?,P vvaCTUrޢ VzZ5ZoT>GWiO鴪n5zh*=UQ%>>iL2 mٗ6U Ik׎R7[ӸQc>mjtڧQm覺IF)RoH#@ d0@ڲ)mfѢl )ũXvSsD9~Ğ%JyEiL2 m,cE@ڀ2 "m $\v U d0 A`^H[pIk#M ]JzW/7}H A@I.1w?qz7'ѣ# m0XXM] D 6 ijY+Tijk"(5b&o*Z܊ZzZ8KiӪz6*_r{eoHHH#iZ%O$Rzz6m^lvtǞ??Yk(={6j H1Ҧ#G[ %7̒5kxXx_r\rfq,3"8(<pNO_㦦MM;w@oT#iU&v iCiCi|!mg`Aӧw߿ cSmVMifbbϯH&]l#H:S o Iwc0G,i[xdlÆfq6Xaj?5ӎhGoWLttCkHkC> <<4;,$rVJӧ=HH=ΝxNR%wի]D/bv7mZ٨Q}7ǯ[ѣxdGOmժ[ngFʖ-=i( mx'mk,q,]Ż9s&vg۷.]T56o^e<:c*2V'OUÇzZNǤ2;F@i@ I[xxBLLCeFڶnM8Ϙ1CmשSsڴ ?xsXvG07ns/6@6ȿGbfΜyi hIk##k[ 5!!޶y4-mQ $j=Uc:9*Lx„AXczTTVx9sxRf/>ҥرCxZ|I^: aBi@ Iۓ'76n\qyMՑRpaUv3266ukHROӻǏRZ]-itȉtjT |GG7(o^|Tv< aBi@ IĨUh ,VhTTdz :MN^4ToF^z]f\vhffF2zu}=6Pշiitt}6;=+"H m6A:Ol*>HkB|H_id0Rһ6x)xק '|YG\ZEԯ_WNNٷowM$YR+򭴭[E6 6 9?\szMm+m2ѣѣK+W?,Ӽ۶m!:zt>6d0wͣW6Pf͛WiCie#G[K!+/׵_>BCC4 ;ZdII}Q0{dWn-ݘj0$ i 6wҦU>]@|yiٲy*7BnܸȑIVLu:jW3Hb̙!!mH m6V6=w_id7ע:cD6S8qedl4{~6 i@i͹1[N{w&ۚ6`pju}Tf]VΞo"ϟ?Xt) i@i͉]G]vjƍ;Ois扴iLO_CM]$g{Ĉ$6̘Ui^u;_>SU&KСW33hM-55%#c]Ti@T>mYJ4F/ f!!mH m-9y|&Oț7O3ͶfhPշUXvNTݻƮ\2繴i5"a;# mH ms &m*ˮ!qyf0*y!m iv$Yy42t)]Mi_#Y ]Jz'm43Œ~@ _i9ĠD`o@xҦY5sjU-R~]aԹs{kIٙT!!e~[T:}Ij]DqѼyÇӑ6 (S`Msj"f`=ztiʷ?,ӒU=ޑ6׶nMumr =I8~zꫫ{l<~|҆e* rh͚6o^eIۚ5K<,jdlvsY`j5k "iv/_/^Lbt֭iKOpxpl7̚R&Q`:)e/m4JK(A8 ҆e*^Ie>%ma 112'uk-:ujN6AZRMUqZOUgN_|z)9Vfϟ?Z@uj&]TրۻHZ WԪU]xطoj"6 (S 2MԦMsobx~cIY$+.vSxo߾VcN-SUk*UCݵkGK.J,"ܺufԨA! *:7v#mVgSǙOܫWk`&҆e*^n[N{w.HVfΜ6\ddmkW&$C@8Tgl1Ҧ4{f_oJ\ֺC&jѣ;ZR\2'k 対gF^ڬUHHDzK,XP]\bVu{;rd[KiI]ȑI XAUfVOY YKh$r@H#H۟u֪Upԩ&o۽X*U\-OWԯ_/88844dذ_}uA6@|#mvm(_>d]:}z͛MСm۶xѣ;J(ݗ+W]tMV/}vQQ?pO!:HH@vMjfӻŋ;rd2$QM˔)Ȋ_oV{h[R`A.Tv ^xI%Kt^HkB|H_id0Rһ6x)xק '}zs7Rr]ѫ@ d0@r<*?Q#bŋ9ݼ4dHBҶark СU*ͲFddlr3zOnM"Q;iS{」??!KۥKGNإKy4!!^hd0ҦQʖ-]Hp:5.ks}tUXvNZ8O MDi5\:F*֯_ϥ-33CoCBUB6!m@ @VD 6L2˓6m|.*2 e0/-w8͎$ 5&@.%iw}|>mc$ KI懶ffkK8=J M rQ6@^@O0 6ȿvvZ/^Z*7;wn_9;[j K.ռyÇӳ!*U4+ mHH mH&Ucכ,)ұmժ[n/uLreO֚Z!fϞǏBڐ6 6HV2}wjk;Iۚ5K<,\9 9]oOѣ;zq[ Y+Ԩ,3rdRBL*9Lծ]CZ6@ڐ6@ I$mlIڷomI[xxBLLCeYӦJ2-wKݿA}5SZ̙I>дijcM[۶-<%Z6@ڐ6@ 5ޭ^0;jД`;yIMgW=fSW֭3F RYPPؘ۷ϙx-ЬfVmڵAk4[6fuz:uU(mm6S# m!mAR D([tmȐ>}9qq13gN w|ǎmM+[n ͛7ձڜ9e6H mH m-\81>>>vڴ [Vjj!mH m@s"mC=fϞAOPW2ՙ}Ԕ… <݌Mvfx]mR>˔uk:th⫯Q,mQCڐ6 6 KTVH |15隦gS/5:U8[nѝ)Sۀ5tzر[8K۶-r0ݏ!m i *ZhM m/T>kHk{?l'8y/B|H_id0Rһ6x) mH mH=@ !M_̘1v-_H mBH,@iC66}5)U mT1Fʐ8 qA~҇q8H[~6~ <)2$نm^o͞˟>CʸJ-I?HlC7uRi!e&ҖO oS!ې8Mw6A)4ې2NiˏƏ')CmHvWsp폔q8/FwIHH׫*W PI!HQӚݪ5zNW)8&(qYAI!&^n*5(٬]ܜ2Niˏ囏GRNͺQ#j6ouAn?GL.s[6kW.#jk-q>%Iz3EԪcu+FL~E: VL6N7)ypvEBy?*`h9Y0)q<~FGc ԾC&j7qdmyN~Vr͜6( g%iNVQЭo8OWkweRV[KRM><~^,UvM]=ɛl{-+ޓft&kFRXx5wMxcު\2NiˏҖU~Ϡ*W9z,*/eS j*ѧ56hܢ >yRźz2fE֫L钠c*Unճ299lϼshWMW}|XxrrIn_xڸJV}̑ i~VfwރyJn?eJ[}~3B`"kE6jܲgmkϊ/)oYP?,N{hY8#1Nҥm٦#6b뉠z)hдw垔AڐV<ױ{+fkg-ےOżeK,^ziF|KbݧP *ZҶ譪+:lڽ9|@^=JlY$4& 87WHڲh9Y$0isRݛ^{7^hqrbdlsWl*Y%w@Hې"x+һb]۽/!vٲ}wm-w vzYVn^IcSW,|ջrO mH[ 3Ŵt;cFSWOz˔~'wN?qwiźII[]ThNTu?xb41];GvBj:W̫Zdj`INNr 6 iUy6}$`f.٤Ua6J@6Ռ?Ŵ%vL;mcqmFxK(}]g􇮩CUHe\2.mS]ZppRJ4n\dJR?j ^QUYT<,]2rJڼ-/L?0#zr;Sjld@6 @1`Ԉ78|3~"I 3^T3Se؞IU}U@HZ5([3|`\-Vfɵ)Җ^dlwJ[jꂨ:rS4$&v/STbE+Uh4lܸe&J K@< ]B#YT_R]񰛷6Gꡯ4ԗo9J7lFR6-8&bMKWm]=J0/~)?jMg啴y[^F|4m}fVL3Z45beR?7RifP5V=7LVhM38o]j~VMPŪrRCsX9~LVQ?~Mʵ)o1}뻮ڵ:<<,!ێ:XurK\d^ݴiKK{{ݺy^:{}kߑ͜9i(Y5 ^RSõL37?/)-XSs|Od2ݫ\߼?~VN89-/L<ٶ '6^gwf|4 7}ËiU36m"E DP(QΝMdǎdf˗Rܹdr&^1u#۷oc q(`6~L- 794qHW7jduUV" ѺuSm?fZ۶T6}ؠ UPBH cIACya#;~S$!e\%Ni;v>mNkڬ#7mZڴinګʹtRz ?0d8)?4qHW(GG 3yۆ 4zT؎UhΝ3i[b…SerjUś4NVv=c?p޲r\3:!I?0d8Ok~JW)i2'i4j=IyV_~3P7+&%eZj8߲e͛ѣj*U}4ۜ9GilG>wA)7E8MRUⰌU~6~ <)(`6/,q0ZIC!e\%FM?lߜ1 98M}2NiwƏ' oG9Cx8H[~/A9H[>6i@ڐ6 i@ڐ6 i-gUi{҆c4'mxHso##mHx)m@ i;Җ/08H[ޗ6  w r9I_||{6@  >ε#$l:@ BJц%Iۙ_든T@ |+Ei < >IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/bank/images/instruments.png000066400000000000000000003716231506652756400253170ustar00rootroot00000000000000PNG  IHDR^g-sBITOKIDATxxTG1c "sI 2E DΈHL`2ƌ0{xƜs~oջ[CSҳS޽W_j_UM7tM7tM+׺뮻뮻s~,MB/rt]wu]wu~J u]wu]wö_:\Bÿu]wu]wö߿DBx_ogŴo!B&/Mǿ}ձ]sq|òq1z<8ο nÌU#4oZBb'7 gՊ9Ӽ^5vmPVmZ6^:kUմq=yЊBQ~21g6ժEH9;F>P~ԫ;;xt),+n|΂PM[raK_XԿ=XX13a||f"B]&Ei<5{ yj1ŬՋj~&k`W/R2?fjO.W%խS*G!nu.(W Uay~sKaVML҈]?;<~o7=oƧ nc wek&Q7>gA-w o||>{(bfB A"QFՇ;WnSgAm妣|7BĊ +35ض9gJH!f-*%Uh{M7oZX#Z!@>l#^jnw?-5W0}@h=`qҨ~* F߷H~vJflZ5 |)&ww;pҨ>Ԭ_]{CV_*L9zv}Sbu^<Saܷa˒YhNb'ϛ\ezN 7բNC!b79Ug꘾PA^ݶG Q91= кkԪY}d|G D?QZxdyk3F mEp7j~xA#v]:[fPs//\\/ < t~t, ?}qsKF- ~Ж]|%ӫ94ٔ-J맊϶nPdgG Ӓb F7]pv!4k>a@gnu>a{kacpz' ț!* .%x} vli%; Ӭs2q6}sqʡ%Hʕ?䏚?%K>ʜ Ϯv+^.?h{CB{`/{yPٴ|ӫR䷗1'~?u17-R6oRQٿaCNًگS~0J;, j>.'+䮹C;Y6BΉ9Su_Uxd,-%}(-9xcήN9+\Q2a~>!wؾƧ$E x99[ L$N.\ Q⳼.سnw07MIls] *4{R߷P|)9;o.+ܾwOVjԻ*Hɱyt׏,U3w!Ϯfw<6Hvj,i(E-~EHhhu)jշ}&$1ЃB!fF?^Vwß(.(z%*o%U}qC >go m:]SXg?Y!urBqYHJɈG|p:j*cX6k S]-/KLj#}Bgwpߎbwdvo,3լ&nfAqռw/?:ѹN?Fr_ Dhw*^n‘wꈱ .Gk/g53|`gfV.׻cqDQ+ŬE,rKf 1= NLYp~g.f/H;4Y7IvAp9KvCw_Z޳Q $QU9-).o}p1"&~/ܶ*/j$[QZ <تyWȫV>E.y`Tb &DZőkV?$)A(?RBC)l_=^>7LX]4mWm?ߤ܌F:?c@9wؾ7cR>4OMtS?k{׳]8Gg#/g~/-5G%yPɝCg#Cڕb@6^ 9_0O.1iI}c\ 7j (#mIۭcK-=itzI+3+}Qs'/3=LbGg~&MLezNvO}Efw7,C~ ӭTϛ}J58@ju7/fؾG> Rqwؾ;}|>47\aWf{SҾ<$ؘ7$eo,:dw峆&,l݌Fฟ|ؽ}|\~!>.px0ux,sSFYC[(r0z}nUڜ<ҊYC}H8Eq޹~jl7?JV5/SC3wl9-+\-&ĭSJ&R^G~Ev͜IpCw_঩b9?8$27YDwbyձ[thDN?Jk.޿){b qD~h'qG2V%*BvUcZI#T) G[,0 JitJHn۸t4)|K6x?VyxW @>wJ·Ǘlwtg}A'?fÒQGGTZ57ykż#)>C\a\1;Ađ>yZiGLz780/:ʔ$@WO7JG˷Է{Wd./Ao_WnMnZ<ǺcWby"BALݦ :=:{ ɛU4*Y^X.Z϶Xd3~wmw|U/#?'ztGRC8}SY!Q?0y:: #Xq8{V*\{"Ҿ9ϳtF V 5jŏ3{S lkH2K ^?WrݝiN&^ bX|?cBA$hO}3)7~p#j>bթ!'*NI<|KFrn[ xjDӓb@){Qr9Sۦߒ@{$w -}ڧ+1G;f_R}#';)B^ya:&=9"4iX'Û&P& .fƃ^߀Wq{kX:Q-`ضrs3INɑmWAS;f8(Ůwy^8ߜ{x`M^5BMa6OVkN4t* aq<'/A(&Sn$K!.UCgBiUЗLآI=0SRU u_>sYJZ~'!wc5;]yyɺ뮻3>VԶɶDB¡;Ŝu˾*e`4g϶뮻C_49ζ/G3Ax뮻뮻m_6-.0}޺뮻뮻sσ馛n馛n ,ctM7tM7¬I(n馛n馛ꦛn馛n馡n馛n馛nꦛn馛n馡n)۫?eׄT 7AI&k֬oժՊ+κihn^~.K544Bd<]+Unذɓl111ҕ+W#'No~yѣ~5kȑ#[+54MB.{@ACM WPA~իW||~] UhX~}~<kР45jǏ߿3f 0}ӦM[X=Dw=&GQM+Hֻw!C|Kٳ;uTlY̾}n…}]pERRwp;ӰaÃrƍ\r*U t-띫Vk.}e ioO5cƌvaWcUjԨQ\#F :v0ɇ76QwE*Tڵŋ]ܸq@=vw&7x`S[`_KэXk~Xw=&GQM+Hf ABŽ8uիܙ3ggOf޽{\im=R<<v={}OаVZǎî6pڵk8uY Wff|xlu7od(+4tQXUyׯ?zhM6yI&%k׮m߾֭[]Bݻw`+Jn%.]444$+qcPFFw…_`?hr>u9A!9!ڵkaJJ6㴾}cX%{?J裏0x}@l`1׻@^:;;MBj444$ h(c ł` m޼ (=KtʃK6-6P>i h~xQ@C(~pO67`ׯ&"=4 XC u+thS54[2yx* u0($!v;w۬ŵJݺuc-@PDX>}%Yc 2l06XvQ@CۯpQG7)- Snހ)bR e@srr2f׍7 e u׾䃫 Pj2eީXV3ihDPz2ީ޸Ѡ x&ݺp#GhhXt*_W[k>а!vl8E,˰uX8\Z5BY8a.KI5 XG:t`_0XauMġ7 )mP& Ym\ڢ Ě&'|@{V(߰St֭~SBV- iаaUtRv-۬aBCaà e[AC̿Qč~s5&U' :l @!'7dy̨ujl/Yq*zDBŚ58^LHSMUϩk%2!}ղ;7MHRn0n q)3">IejhڈЏ핏Bx#fHmeԭunOUmމ ;fаĢ.Tp)VШa O#TuXqRMCC݂ bŹ ͛[e8קO. 1 ,]u c.Y O0nhW-حjWTmPAeƌIXq#NlѼ״) 0lٺmg4r~1N M[a~[u۶1[6UϽ6mx[JaĎ1^/~f};ja8*:|d$ۼO)Nť\cƌ1yc<b^&ۢwO@b5D|̫X9:4 ]Ǝ%hyp8n EnNǁ$FP f֬Y&}vs}8a#:L"O:]@gdddVV&V^׿"n~XdNLB$#g3Z '>Ϭő#GͿ7|K +4_+Wz/s+d$0&LoX@9v_? \+^~-&=1hB[(||2'ް&6jm: 62 [fB~0QXWnRm37 G!S=cXvA?[ +GӏQe4Jia;`5bWgcZㇹr44,`a+Y ӋjN2U6ٶ1^4?h%srcA10(|Bx*y'~WCCL$%w-4v/`cNOi%դA"7b26Y`ϭŽ|ˈS*'gH>L*a tr(>/v>˗/IE qb+2 @Lx̋n-. Rh`DհSG|ObcEuQjق' Mw%:ڴޓl!+/[LPE!kH(Uh3Г\R(ۓ(T:&,l|`#̚.'W9=M!b:Il!lڽV%/N4ILUI$ 3gl F6X@E,rٌ3mОX(|+eAj LX@ MG9碂J |7P V?vP|H#I JqT!L\xM, 1X8նm[Gc"~<!E$ߋD:=4!rcǎeHnΙ3 5} e~)//Z`M#@7А@Imhhjj(j^E2ȸ7D:հW^ YV.!(GJ 3jx0Z-!}w `h`0OzT ٪Ngy%U 1BCA y<F"p*%8#5;"p7 Lӊmq5n|;uTn~{.*h%L `9 e+7Zph ܸqcf|XNBBC !*2+f]0bMQzrd/oU'Q@C "SLoL yHNx&:=:!c{q2>͚5#E3X]BCq|X4SCC=bi,А8Ф9 @ܽ{Ct2V0kIXF8 8!6$>N[6F@/ dž b4Ƣ"3 Ӻw.0-͋2VXf8_!/1?ۭG) X.j^! qL]64iF9h) zvTb<>N[y9~<½[/-M0dd$tA2K]GkUnqjITdv~dfG6>U7%8.ٱ`G.ڜD >=}˗>}2ٰ=hdo׿5w#Gvti zl~.zNP￟g=V522>43GMh ?@FdDp (>lo_ OȺre2vfիmJBC>PWNil hչKU󌩯b3pbh8z9p ?נ.]:{0aZ̝b!# vn脔%5##ʹ)L;O)FD8I8hNٳ;<ӧ7oF* \%#˗ύ,ҥK}5)8;+kg0)qh84A!01┵cZ@Ҽ~#9R+B  ߿<0p$  ̐ϽfH?㲖ftrݶVm^uBFM&7:WhإK\Ufp)OƘ0DSmȾˉ툠 ī'l1+0*!͛:foB֭[Uy4Ʀ`ԩ/;C.VC?'!^ 1w¡lW8h8u(K,+Kd)nOq E_10|GNM,\ie;.Grr"\y\gWh, BSg!o׳ġ!FAC\oڻ}A#Ka-)'\9{.rSpI5 oz. 4`VI6F!pÀ5dڀ.=|=exÀfl>L 1-8@k8j4dƏU@b8DK:W?-_!aFrcb4 %Xn8y~L<{1̏A7$`E@h֕"&hi*8ͧ)!xpnxF =Zq=;~7J&Ĉ%>AC[ bjZ.T*B4d]1a0, I@CC96j̖mv:h,~Zj-*>ݝ7dit({4Ʀ@ 6"YtHD 4աD,/z {q!)lȸ"DOts ΄Wa8t4B6^̄P-sނue( ӸχfY&Wׯ_ FIg#NYcGAcc>,scM%N}Š? bΔ ^g =| Yi)h &<#b ?D0.4JEzS< Bf*Ql AsOًpfӦV;0c`D'fSBC"ԪC8; U}ʉ1<* lט= I^S!IB|2\I54,Ĕz=֬VՂhRr`#dB BC}@!Z#8$.XF )@֢^{/SS$+De? ttNy@DW2"i>M%yGM Wqb S!ߋL,&LG b8;v8XFLgNt!npH^~*ABVjnURkk@iuy),hHSo k+4"*uҬvshOP?;!YIm[wnА,{a`Sbc%3> z ;vlGq hH/kh(֩SG￟EYCU)CR\xfN2Q/;dI+}VCPR_4VhvWOhIP(Y(H} ѡLKrV7hHRSAe`$Yz Rۓ'-)$15?ϯ޼ФTrDٽ{O] T]Q^]Ʀ+'M…3dJ#QK$o_OOԞP FCcv 49ɨmkE>5yExR^GT$ubl9P :-/Ο?cNکJ!ZOl:)yXCp芝;C/Z23WIBnKFC' jJgz1S9MRJK&:<ńw٧$ge2GBl 0TҤf"'hؿo  I]Ƨ' .84@G92 &C(zJ;IS?0Q+#4i𧟾АNUY).QٹSٳ;ӧ7?'QȎTFMq[ P4$vv!ʗ ͧ`8AC586V'~ @&,XC9"PV(yP 1hh4@)Q5E z$r ٕPf/Ix$C576m%կ ndB\BCNDI,Q,l6W;#<"ɖg*D-8&~CCT jh(:QV ur7%erurӣۈ h(|Fii VCk̈́\At/:< 1S"uۤ%e'1U4s{;;PfW^[0a@C9" ?2?Y7e ;ՙ/7g{hH_:n _Q,FhH+Eh"cٟ|"5 b2d<' r ٰCOD:b b ?yHaF$/;NX2&r)l!ʋP8,U*F)Vtoh8fL={EPQC۷` $ed,W Rbh\\ӷ`ByJ_t]BCes,Bx12`tVq[  R_ޥ! 'w8QCN "C:+1;)2LP TNB'bo˄Q,c= SDydl5NА(Rl_Ef e׮Νsh44,&h5w 3,1]`:Wݰ+/=mݴnYN!{!Ni!wf0=4z K,k׮A{>t[xR_ -ine(2M} Ee(=W(Ԉ)dy5\bJdPN@A#44 ^jؑ54T+YM M5cqQK6\caʗ+GAҖL:xUа%ZCC.!%k:IIwnJjb44 >аEƲFHE^(, )]ƍt?c|LuԢgQL= qLxٳ K鋒E! Q߂"%NէG/z=ah}U/J|tu)FŧBXeJ,?]qU1-A]oհJzB2:zJ$_0fT)lWR*MȄs IN) -6%/PRtt[LGH }h )D2}j$&g@[*)#1B1}I߭M(l!DI_^h`Ic"#+S`>'2e44S"jo޼V߁n*A$1))uI-M,*#"*tԞN^W͙XW81 ZGʾ KTyU^9RisF7ĩGF7|*Q_9n@wߩT9b1G.NhHj/m,էx:zsExrX F,Nh˘yG:*]qʩ#΀5SRYf/ "B82f,9u,v6xW!Af Mu32[Zg <44}INPPqb,69-<ɴp #׽0!"Fݐ'h/ыAn#4lly &F/n:eeK4Qu0v~SAҥ(.>ŰQZpN?wǴj d%m;Q;o$ ne1{E^n|\3d'z ߿oQ|~)n+ hJfڍeK;vdr֯_a8&_zT]<>{v{>}z=BCW[-W| q!^ ;6ή^ӥRK]{}w޼{ VQ嘖m3&aJQ)ٱK'Xa0^F]rvuʻаuF74UvϢ! Q[+,E耹Z1Ks,sz9wmѢ:XCC!scc!Fy C)Հ{Y9ƛsv ŋg5dxa'UH駷 z4tC}&|S\$>=tΈ{1f&0lD/&PU=>W{!1eCCC:U۶m%wիWqn87_$rW!hsHpdiKf/NWZil0AC[@B> :D~y=ڏ'u8ۘzXs~<ʶuƄm0 71V^z݌R`w_!d{jC-ݳhHBC#O`5drDp%?:+һwW <݀.=|,h2B!=q p`g%(V^Lyxаw[N@8ACF'zY#͡>$i}44רQ p)Sv颐G?v,Qz-lN 4Ŀ\vU ~vՏp%c:ZB{ХD`5mv%SAi횶Ly*#f5(xZq=;~* CY4c mGfEd$-v=® N:YЉX 2;؅C,p(S݉^zuӧt"nJa5$Nȼ~x4TȣGG`+XtP '4Aæ-Wu(?x%WeW@CC_?]D֭_2C#L\r]%4Np(WhH*CzpÍY4744ҚpIv4ġMeM8 RpA D~0 T,_Dw 5j}yJCCЂxcQqYl>Ex"S bnM'>Wbƍ+źcpIhHĂJ 'a O7@zNXCNX\f 2fN`f8r$ag6pѬ>} asyzޘ*L!ng܄`qÆTM4qz$0ܽ{G,mJP, bK 0JM%P0,yB4dԔ?9p둗q,˯\?OlL6J%!}a-?4 C,fh" Y52gj^HVn_z|ٶ{C-ݳh}"%pl8rňӈ`#>"Y4+b# "ɓ2T ՠV_ǁIMtl( '$5HB٤N&^7)3Lb˖5S5q!q#gI1 JՃ099% VPA}XZ ]ʑXP1&G6}¢fEػED}6L3R-Jb@RZDk?BYפׂnaH}P7tM7tMo>>t[xR_ -ine(:\@#^PZkk6IYN"ʿX%^ک)а;W0v#iho,j?(~b V,S0cސ^IH"w˓ w)Vp˖11#"*7S jcau˗+G~6L`~S~"6˶ 1hHBcjQԶE֒tڰy9tyHku汫U$޿%(6YJrJ~BTI4TMܫ}E_lB9 eԌFb7АT0M@BÎۭ\…#P[;B~ϒ5׷#y"86:'}+EQƬ b\UQ544fr/R pL67^af/ZhHBCJ-J|tuٰ=zʜGOnugq44'.^<, W[DNu~nV /r4$ӵ +4u1f^!d)6嵧'kLN^/3I$7AS;32Qo+)#dByk)}A{YfpFGQ`S\:)(@Enݳئ nK9ɨm5|cc֦2O5TCI/FA/ @I$_pBT$7?P+ʮ/C..(q&=" BQs U e^f6Tv]z;lWj+>{#N䚷.n +wؽ姮Qy݈Jf-ҡPQJ1]:@3Ta=wt'%%p8;fZJn(2eJZAYGmΞ=H6&ԩ=ex{ACՐ#ҥJAJ_`$%%UA[l=;Tnl`{44P(9yQ[Qpeƌ񐘏df__N:J-Z(4E̝;U܉u])dh0@DX MuO kΏOC#6!g{r6R^zT:shH5X^ِر]|TvϢ:\)ӪUs]z!%57#F}DL6+@7cSm6ʟ$]tGjqTVĵ5FA/yJ`=yr 7@%Q XCC#E01(BO^ZAw_3u.5UswAC6o%QI3;t)x\( ORK5뀀Nm᱾茾j=`-\=:|3_z/=Id`HBC`O:I-ᠰeʔٵk=&C޼ LXʉyrDtZxWwN鎷]HU8ϰsz޺u|u])Lh1b)"h/qv(0Fc>quk!~i5kVu0АTSGfL}PgemD{hlҤ0t8JE%UFXR17*rӍyخjFVlD/!06sdM444^A_ɳ c3e(N)[ҡ<~޲{a뎝n͑kZ/RJg_/~edĈU44AI_7cR1ۛf/FE̺BАrw>j=[V-bdQϞ>a`ACGhR:4ȉ Uq&,e<߼y BCr:qq=.2-56S M7wb]7? )h#Ea'sj#< |?"j5$W1┰DrO?%o؇17?#٧nl?Jˆ8&0Ryֈ%ysW?Ѩ}|bKq_:v&޽ Rhh( 821読LkP 6,y}-4UUrkmCON]##$d<%Q~c8 ]BCS2PNy cnԔ<&qn+4AlrB&ݫW=\GDbtpO8/`AC^9#8&hXпsp7E-QL/O8.anVͤىy߿4P: Yk}RmlP!АMFh kM-)8hѦ,V^%HQ4dن#̵k$ŋo޼ދA8''K21Xp'AQ٧XCv@bFH%CSPx!%4!ƖP=NАp5C2Χ<]y]𠐇 qB QΊE’5mpº+4Uh?_4O(w3_r (<~ٍWr2e=.a΃S]jhXe'JqIҭ^ hD'VB޾}Vq0$c #:TQJ}#4hj e+4e Px+r,[6 ꧆8AC'usP0.G)%f61^altg'n%4fbM9pN6G.W( mZB5_|B>-vq{\a%ԩDL V U0!Π#y$&P¡]BCL *_N|{hZa72ǧOĘGL֭d eW ܸqXҽ{ kG$1a_?~0)f̘f99{0jҧ#ĄA ~0AypX"ԇ``HIl\\)W|gyP8|L3NP]A_ q)fvnKz&~0VAu" SG2{F54dise+G|-DZ8+m?mo*%!=aƭڜ+p!&QC/{>h%?]@C`l% 5)yO˖e~(Jy]Mд Eс9$wϿ~ ,Aݱ#bj*^2c9n֬,#较[)>K>b2aRQ^ `e(5/_>FXP -Av54ܝ;lYS(Pu+{+4`A9(ey _ddJx )!o`Jfϝ;$L6mtrޑp V43qh!VF4A7B0{kPKG!6cЀ, E w GfMS_S_^ n!BCtM7tM7Bk[4kЉnI}6릩[Q?`{.C$ӂ% й NݘɢĔŖ_@#B$LГ|kZ½^S_ RDZpaęLE44 Ucau˗+GcjL O5SϔŊ†A#V P^CC_Nn9JRJ7wEH2JBrқoёZ lYM> ի+BIIAL[ y!.EB_T P^`Bd!|.4$ohI ~ϒ5tĕR2O5H%WPD+ [l*K<~|UCC@N)IJmS}'ĩa=X4v i?=z1,^%cv+W.pYmI|U/J|tuȒ''OihP,7#TaAß~"ԯ9A )ni=O| ө_BCҝS7Hq.+ꚠ!Lݼ5,;<:WD4# 4fY$ ߽{HmLϕ)BU<鉉١L}LJYMm[RFc2j[ Ż ?S E z!&MY PT#А:ڡl%=m@jz KUt[Un>F[S( Xpp $,3I: S$UWZRļyHc[wSB냅| ew!nE5[NJJ0E5*@zP`x=Ϝ={2שS{Jq8 4*N# FR2yh\[Nj(?%OG Xٳ ٦9yr}V-z$ڵ $p9FR '; %˥8(MAJQFY&2?d 6,<>t&DN6+c6PPVP/S . #>J$N|2D㣻k׮H%-IO0VӦc8XЖ1kũ:Ij`$1BW2/=}  ۃBAqʍZ0Y X!kPBRovQ/oa`ƍS01wT),e_sSJ'˟cD)Ń7 ,ubZEhemێQaYZAbP((/fVѻCڡ+` ) MAYR ) SAfs fo"),+kD;ܠ!4۪ gT+Ӽ~#XWnvU3N׿oQYNl;`D:s>`r({3f,bZ ȹ FT©<9xFCEt7V\0OU -QoҤapyH C(yibdNIаk׎rw>j=[V-3Ϟ>a`PAbD:X\I8 w d! a:~|ShΝIE&9yBJ)Q++-N7?9r^U 14q`S .F:q-0"̋rk%nPW\d_',gÃa\\pL}7%et8Gx@1F>˷)zELw %K EǩU0dl >-pֈCXoG[7jL@PisʒקoBC G8CW4 ߸q+"IBDpN!S˜0qoyL,VhpXAr<Ð=AqL?#B`Vh(v)p56Ĭ$I(t_@ C!_ܽ{w5mQJ"I^C^BCK$1# '܉V|v2''_E^Xz1 #޽ |a]&/BWL`,I*c7 XCv@#_my8PڌFb:6HФ4^R%3Gr ]njI[rrG.A!XD^*D\Ά 1k )yS>1F/[Q(;%e2V:,IPCд +`g4xׯ,J=,7#Oԟ=b,R 1&hbsćV,CpCT`%PzY͢"  o4ՑތQE؇en3m3`c8L?S  c^CAYne 1$E͘0Ez("ؠa8JRƄZÄE J$[!  rqk GfMS_S_^ n!BCtM7tM7Bk[4kЉnI}6릩[Q?`^|5uN^0GPP^e+C,4Th'}+|_"ҥ>Y)d/"G }}S޺u _N)ˑU&7w0LtĎiQQԒ1?$u2H^*ihаqzf:5f lGCH{_kf4ܵk=3HGZ5:=Ĕ8{lAhMZD\Kk_eo)Y_А< T+IJCXZCІ߳dm S .T\AIC.cڐ>mnBCR4$٬@gXTz!CzʁRLYYo8IBm]Id(iՙVp~Qfߴ@Cċ M}ň ըhP@hH5.43r<%I(b램#10;Sh$OEblP!keٲo\+S(:-S1Bm|艉54ɳcۘy#O~H>j`PAL;"(1yp"5Annޚu=>?vI`')L~ g( $C9mlc] 7UtݐT fbpS aI0Isnh 2% lGJ"(ZEۢVT¥B,/ާТ1<@=LyͰqPlE !5E5nNTCm &uc10KًQ"L!JVhصkG)H-t\ߺu j"< l : EL(BT8)j7ЉmlԨbVC}%뼎)04d7Y#SZ;C#W`{qV"yY\Ǯ.! WH `4;aԙ3q"SCC:!CLVdž8߇ 9bj$![oFV3^)1R*!,H0 ~d xpE[|1]0"޽F%Ũy!u>fNe 4jp%қ!Q(#!i7X'|煮00`|)؜Ohh>6+2j׮IЋw߼y`NNȩO.=6g cu,Z$6]ӖV5 L pOhծVhg/x+L2,[{l8nH"ӹ4Tp>/XWgo4eáDz4>FhY)frIt80_h"Cq1"x$(x:'hmÌݾ}Bk(G43 D+a⭝FhHܚ{hv3`#x_W_=qܖjh4XP8А/glcp(Vhu suیL.!&kii WfWSKACC!c;Sf\;4oZ` +&`\Mk9rAcɡ,2¡,5?1gbp(+.ء "ˏ^Iz+' lTgRQ+^=̗L`i[d zejş@rYM~@C^yԣ픊B K%B6ˉ .4c)oޜ2 PMecJpCv Κ8eb7(5 e(~.$&b"~ʲes0BN9[X(w~Ubƍ+Ow)U$*J}S :b "HΈBBH^ gx8j 8p(W붌6@/Nn,[-F>ӣYyHt PmmАf )q!!lΝs[?lj1:~V^HƂioD7}1%!]jep-ʮP]5ɠCu ,h a8̓>5 @N 9$;wHp9_ӦF6Q 0E@KVihԪÂ!֧3Lt2r0M!Ė1Fpf0 B irYiOz 0">F%2~]~:͉10 ɶLرB`SBu 꿛cF"1YqH Tęx{  }ÆX#֨)71wQO~0Y0LRCCX{ĴP&3}^:+VC) @A '݀܊q뀓C9T8(BC, =Q+ʃ>ݚPJ&L,Gs3K](/?܊j4jZ2$4 |\RĩDАVC !C| B2\@bt~P_L}pna455릩[R-4M7tM7t-OoC n2u< Ew-J5M DhXs`dQ:¸}!Gz()$L a-_nK44аА٦GԻT 0)HPYZ 񎤦2R&^'+ 54,b4jq'?A"=EnI 7kIc oٲ:&}DDQ L% O[$^%Q_0dHk$1y q+֍(jW phX,T4Ƀש\X| U:uҧ)S2B@=KP*2qBXY4v (gА,];[r GH 4$˗*,Nj&]Y@hȤw)\"_.mC *H,<T E.44 (PCt(MmJOocZ̉%=Y%4,HiPޥ1}㍶ ([!Yvl$.U m[YR  𤹯V-Қ\BCǝQTNfkO >ebl(l+R(FbPT!ZF02v@ʑ&`dnVV=>?vH}ڍՇ䬧*YD#'DRROu$$'2ŵxàEʤ_p@Tl+ڡ$-MPëDT<Ƃ1da QHاД>eJخz*EPJFU7"$Ġ5ԅOAQ5xX{YnE5[QBHC\CzЉj( gΞ=HqEcԩ=Y Y} 44Ӈ: 0ěLSe0^Z r&~笛xjti ldJ!90#RtYs wF:Ο?L2d$?^ҙXo2*#-u kΥ'wi Kp[vaObd T` (jDF{(;S֭әQȶ+Xт*|i>~5( E eI܄/5Zj.NJo=yr\R-;9J*%4t" 8egf>@Amq<Ɍ 4p Ped,J&?Dz&00bʥ=QCjuc|w!gt鯩w*cNd'ISOabTZ5 :KO| ۃB%jh?4$Sg0ב>mh.F5qٺQS5fdU?!OAlq&qިQC[  i^jѢ&F)VVfi~m 4d@5QA0XEUȝ"BSXAώ]&OLܺݜDc+jv5K0ZЍ`fKv-ƧOلb0plҤaѹ@CໄN7A~1ݍI#}Xsw9SNW'PJM&?D{IXA?^ wy.|b 0ib%+4*:oݺ]jWy 44а0!'m̄F!Cy啭$ԍА_Y" ,Ws 39)!8&zjW|#WO; hXpc!\6qL89%dfa5雒%RR,0"^0ܿVNEXBx)AeT<(%YM ge, ihb2U@CໄN7AÔG8CM 6mܽq$5 ")ܻwAp EʫS7F$΢d8 WU BWxfܓh||ӏ/`4m֣c$B[ (>( 3Vk <_}ҕ+ǝp((cL w XC2K17DDiv^ykڒa#%0 @ ``˸ÞL2_ER \J0Es['hxPvM"^+Mxsrl^qJ㳕4T OP7AC5sV(wüL0z HPCI]d WMIa / c(x:'hm: 0co5BjhXhpUq%d!zFB FK bZBE b4=1{H e߈7;:_FHBÞ;Fwu <`xbA` +&,D!q>G@C'Wu(;itQ8F48Ex~CC@FOްZ[,I2@4'hزeS:&"LHS]blfxU^9gYuz΢h*FE¡gL=:N8X, ԩ/BL>]28:ʳ޺ VhL"1aQ&e(˖nzòB֭6MXZ3ymV/0W|#VV}SB_h@ '`a`"))8Ǽ eՖ10`VF R%K9`@DBf-8 gАf )1!lΝs[J#ۮ` k>e(5 =#~C1csNΞ/pK54|V6 Wһs$挕 nh*7X| ^T=2y d5%Q {LJBA MP 0ݻ_~4/ؑa{0XHCC ^{/!c:Yo.eG+5,L$AH^3~`_D~q,M@5(&^zÖC dܹCF v+Uc4P@Fq7buЈB:L8l cZuX:Z9"b$4io#+VbH܇jt&/ | D6iVFĦu'KBCk֯_;0 5N,aǎ  K44mmʽ74B% p܀~%46$83 ׉N+x%SAD8"5jA&uc>*n)eBòiL^+4g}^:+VC)P7](O vb S>GaNЅJíYQ` +TP?+fdM[hh ih~!@C]SkɃG^9X V x^}e}#4DPeS(|A/IO/KߪS4*EPMTC4DeͷPKNsS] x~R( m2#aU"*QcI0ԃWj|jEGE!Pf jS\\Mb`А !P2嶱7cJ7<@LyͰqP&Lő gZ#II F󛨆BEHcPٳ)H :"b! /hȼo2Kt2 JRZɑT[7c{hHN4ŚsrQsIT??vҨ}*\Z4\xt6rnZr444v>lY $֫h,k+&h0I٧DRP[C)o_&hj׵kא>6)תUsf͚<0́АlUV-@p0*\h 4Dm7Ж1PLMS;4d2b5d5OP?p=+},xӗ|Ɂa{0XHCC  1`?pS߂ rwsʒUCώ]a`Z4ļO0D;X /o;S\BC&zn{V>}S,eiXի;|\RJCC-9;(-ykSsF'hπZ!J'?\?m8{I!lcj<#ZN̙8ۘz_(2ʒ%bGd`w:17!JթlnԔ<&u˟r q+iP 6i!>>Ǘ_~t0XHCC c$t7АiܽWBè͌АEXC:Y ݮiwέGPFӅb[iwN{ hhm %$4FHj⦛$ 9Y|DŽ3l׮]/y `2err$44!>%֭ӈP>f D+!J}b WMIa 7(q2YbҧB3cÌݾ}۷* ih~A!G0@C֔3D8A f0eNP[1'OrlF_jԨ&-PCC#`~eZ +Ta OeծW6 J\2=sβF}6v|ꌦb?`SgAl8 ih~!X 1PfF0|ſ'-42MH,9C3]jFMD}싓7sb_:nBO0TukMi>E*YZl6͛ӈ6JCC-9N3}a9:Sf@[$n߂?wTp Cƍ+Ow)U9믟رv'(l! Y "( !V@V5e{5@ÔXAA m w4xׯ]t;vd 4PB\ԍU,-L$sX+{2î(Z,XrDEnvu(?;~9$@/`\>aLcTY'|!&L؀xʐglYC" Vn E^6nV8*P'v Q/^ȑC|a@AC_wX-]PCB丟9 שglG[qj4*^i8?)6R6WGFZcj֭ӡP)5lXkxby S'42m"RBy K44аᰞqB2|좱SPOu eCUM[!n){tu{h.TBNV*PhHCbȻ,v{|8,Y,9As)z _q?:mjWHhIS5!%R%pBjhXPhGGߵh1Bzߛ"bn(kD`Eݼ5 "pۉëDT"91dZ|?\PKblR3iٲo~ ^!ٳ)-"BNɡΏOuW1o4j  ۀʪSi&K!+L{Ҡ(ݎcmNEAj'h׮mFFVyTb` ɳMu)i`5 D[S˨9WP4lP6f7Ar[E&LK H4vb?#??~$(hLA )Gy # C} e ڳ2%ceP&0G.!j$%%4W"0^釶Wh~))PCÂBCHڡ呎-6i?C4:у}'kհџJ=> >,EU=TPՙ%4\4!lĕbѣ;Hlz/P=y߾L6WXUt  1M aƺ\M)u3X#||E3ZL>TB'ESbȑj'4˦m=㵏P؍VC 2::PtQ 4<ɌL&P-S4 [kאfۘg( O"Y&%ϟ?fV"jhبQɓlժQ+jf `̅F&8DBC=A{?ztvyމglGb! 54,2dQ%ktGVs[ H;<3јi#\{q5# hHSsTxvS@g>кu jբ5;B0c2  aiFs=`Fe4Enh؁;w-Fʛc0j'4dVL< 8CWvW>9xF Im۸[Rɥ\%$G]B ,-( ;2ׯyhNjcTtpHl CubZE9X&7^*@uhؿoa׮.yO^3OCLI4dN-KK 1cSG6xOtCd8a* ˿ !e8y\ g _YDe쏏cˏի9>{t@C,HTphs!h5ě,u?e*4܄<+wbvt=qq=2UxBCPq V{!`Cv6tԄ8 XȲ9e7m+Ei7N eS>A`TAg(?S K*նm+;^: #Z,Z<@0ܼ:um$M,b>wPpXyO^3OCLIZp'o.Q!AǗgnalB eaώ_&Wreb a#r]axh> d@ KѢb~@CfSA ѡ,ԡ|r(U ¡LHK!#ijCj!4\;}>nA¿T9)w~+Xr`f [l*wSS ygq<eXԩU0L!agr7%eru|jAWƠgY֨v]G蟿a3^3nFSR, Y1˜X,9V KD6׀_O`40k,IMWh(^nɑe( _l{v,CoݚN$a b2wׯ]tgL&pտ ̷&2_@W2r!㊜8!:3>?X( 3~J(WtNO'Y= {!^LT7 a:E̟O@;Yt6 3,tg1<|GsdJ7 $$D Sbƍ+Eސca K+D޾}kXkZ;6 4THL^YMk &\ `zR o/ރ$k! %5V+xv4i))PC")# _PBe;%5DbLmua"֠uApL 85"H^cmٲ`^y!R@4G߾= \OTNJ{2a(1.F,$40j]hG*KqBAM9kبBk&/sv@7k3ōkDR||x܉ ˹c:ԪÂbIaKRDzbHD!% j; 3DbPؐP| E{(A!nc0!Vd0ĉGc)I,5ePC!嵳t0Hy ǹHwʑ?}T S$#GR3 }ħ!XHCC CP4L:YYb_CC *%τ*>=t%CZHM>8#DQ?dHa >Gd$FKaLw GfMS_S_^ naHwM}>8u f+oC nlʺB,XCM}k|un! ŸPPtDAt IBui,?-OPCB"k l3@!in,aIk6YJ}w˓`ǔ4J\BK[54}%=4v)} ̼rE~Z/kU/O\' Hjتa;4TWC LhظqQ^OCC݂d!䅦ܧ%;}аp!ulRٶi #"*uҬv hH>9WTV*_!'}+)d>mb$+IP#y劢6.jhX2$tC:BTDW^R Z|Fp&jPlٷ\*˦srgrnUCCa@6`Jym;Ne]:VF*(]R+/YyF]Ֆ%pR`OQOB E3khh-4%v7o r)_]6>FeRc⼘[{ b(Y  da?EQ(o30kJ7j {jz [vI_$m5+P ҃稠Ci͈ :5mz#6n }./LK%j^QyO_2ACtĢSbzJyVSL24%*ge"~zv˭2D"Og#TB\S$y[ŭBD4FIȼF! 9uX_K<K0,jRiBZ5@SX544vCyfkr8h6d`&rڰ%+4T! ^֔x9 j/3\|Y=%U0V7q9" 0XJK$p*c.˕0jGmyj߉ aWZ3fױ=4P1 EٱK|3Pta6)'u* B$=3sU͚MWNBk(pM#ZEuq[BR* `dbQCj18آ-(h?v*`YZ0Hhhh ;>+Wd\ږa~a.`ǂR؛o4#aIE߿<0p$aPkč02#0I욑UELʮ];݁+}R ?{vlzT[SА B!O7mcGp1PiW2]k0O6N'y<+Kc~ի9[$4dG9=LyWBgcfw lyFA;'ƀ3a;ݙ3q1OqE7o+W:c$d.2@GxTC A1b(܈ʹ}}? g׶Isy~$"@թlnԔGYC%}pXyOj_AzL}ܓ kGE|GNv0.>kBY0u(RVkڒPe+4>4]6OBCN$_| ݻlIGo-dto66DujT>bxu+ex*ge u5 {7)S&''Kx ȧϡgoce"u֎Qpa ŗgna[GhFF`j14-&@ O0|(ʨCCS"\5%%Ppgq髸' ~xuQo>8Կ)ݻ7jh[.C1[5 [l*=5u~L ?ii }QQ,۪oOFKT;8lqΌ !7כL8Q%/ QΖ%K8NB|Oo P%%W(:BH&r%p(dL) @-hSP#*n)M}1?:S8 [ӉOǡ 4 p%[QLYqJcJ*%;V2wK_%PvBHr\Dz:+!kz sj,fPl]C HIf?y3P@i/4"пxG3k\& mվ1 ޽{G ~yǎ ۃjB4iPnzSdϸCOԪ#r K?2)=J\h74dB6a(48K &pe\`':w,U* !#1$lO]V糘"5C%[v/pX6mtrޑC;D F^ʚ%t e{XO ~$u e u hÃE&zh/t554 %'!wXl\aACª-̚&|BCtM7tM7Bk[4kȑnI}66PP[^^|2Bj29YGQK*MP'(44&qsYґ#R *p^~5ܜE22[+N4$S[44t3BP*3Xո2HlKEBzVDTRаqzvR'4wJdo؍(84tS(x-cbGDT ^^])y -y Idg &4/͛VNe߮_)ħn hJu3:BqАY=hx/+dd!6BCYt*)S 8!*>un($4$/炢UV&a ^ٳ)ÅtԞ 1ۀy>#Mt!q=>?vX|91~xJTGX0f`KQàZHkc2_)h}II F[(Ws֭SSQorƺ@Cݺߛ"bn~<ѣ;bӗ|o߷/b!Ut>:r#VCL9[)`߉=({(hA}&\ͧOӧ$/ҷ p~m};%]IH٩h4#ӇGԷe֩dNhsF@kYCYNP!DjKҼy`ħނLRr g֬@C5`W`o{`022!E/mG LK>wi:τPNe%}(~ 9J_m')&s\z-.BJ "#ҍ3~"R;X= ayS\ N!˸hYE{O%$ %Ϲ9j"yf^a-UJOyn hӧ7Jja2#[h+]O~5{Y*}SG瀕^vFMz+Ć++}R ORL 0nã6fKm5-|!$F[⛐NNJ5y70ɲ (&cٲ9h؜@%۱)s & ݻx_FL#G;n>[l#5[x`to66(@jՉ4}v2D+l7>%i˜m߹8Ba"𫳷2Z;{dBf ŗgn{p)? *BCCF*$Ihh'@CFjF 1vx5m# pՔs>ˏ+pO_ŕ>)mRY.tPhh[x92ƣ8AC )WNmuL`tI-"hC9* q+PB9:q*\#ğ.%V6?YA}A5B}Whh)+4e/GAw1hRp8 RX 11֫c)d&cLMeL8 M6_" 0-[6~'C;ujdRl_*N}{*jhO7Vi+Ho+>I1q(s70Bih[`޴#6.CK`#c d7\pvîaV0kڴʽStCرÑ[䜰E¨ЂZM`lYÓc:"W;wH td4p=+S0'4dBߠVA )@U"m3~ˏbʚ=9NC(Jdv }1GfTt#QLۼ{!74A4'IL(HMUr !)H GU ԦQAJkg.R^#"57/.cPUobp*.I"QFKBE]dĀϟߑ2QÊR:ujOǍlԨ>IO, )WWA62PslLɤ/k#4*$lj(SAN-\a9Ha)K~є!Nt^hH9K T2q%Ăd-XpБp`nQ&MYTFINAjCzP !1qD'-ArƺsF2O7|Hb]& p3M-PlcԱ=WjDr% m_PƉD+yJ'CzU'0ڇܭb+Js2i|q/ѡ BCC~uC2 }ՔM]bՁyxW ;?> |R  6d[v.uNX4Q2vh$Js2i|q/\ɻ=|x<ұcm[ih[HAÑ 'hh_yݑ?Mc'd¡5~ A|VA6iݺ]jQ͚tC 2IFAٍ4n^cHGFVќa IT(YZZhhUH yd݌-+ƃR?H&7^\3LwB:$11p@RJPЁLWy~%4& FFM'O/$Q(?SCC!vD/؀1;VC'bL [7jJcK8R\}_|\<ݻp[&t~54-D!|'h^]ÞLd d,a #4إ"D37o^aӔ%ak> g޽  }2@ ~:Zr)Ne[l״廿y VBt4KK$l&BCiUǧye!k ~# Wgoc b/p>eFz44a1@06'Wa(.Oi*$Q44ƁA P& u~^Ĕ"d` 3c,s'ebUitjh[BC  ~e4<;q}hDS "DY®Qten#68~q t>nDٻDâ8^q%'thjVM%4GIz exJn?W*N[p~e yVg$#E 27Z$bQfbB4믟 *Vظq%7`'bC.VnwgNF?vxJdq<8  mf=w۲eOrZl>͛0euk:=kl:eK}#qkcmr HZu:ɵ&Q V}S&r4fd!a2Xle('[Аb+;c&\<#I{,Lwe7T.C4ձ Id",NaqRtL$"N= ݨ}6%aeet8~8eHO:{8X 4,+l'E_1SVA#pnAzSL) XCnެ^S B1 4kI9K)x b5mmʽ#D5Ām^:+V "?nJ^v5t%YPY`%OW+ϝ;>Ж $%,0C CCOd06ZNӘᒅǎΘ´DZ>D Z)kѠ1BXI5)0.4ªIij=4tD' ɉFGTCC7j_nPHyMDyBjUc@k2O:AtrS&aA?R$h( ~S^t1M]/KS߶ƄOS'tEd%ȸz]-U3Q-4[5M}M}Mz-!55馛n馛n|!Pi֐#“mh-mna+zz! Ew-e(#/7!0B*@4ДF ꄰZɤpsYHdjMOۨdK>BrLPD% )rNiL{fͮ[:?N4l\)n0D:}א|"!.(fCӲ~}׷(6hX@P"АrիVA5; mɉ }9yׯ_!fr$ǧ0<<<bvŭJ R?+S!5O}X)nN-jC*]w-ùz LL *Pˤ…3ԵC,Xib$SơIDFV6}#NG*88IL,klزbP8&6եps |U*_HMNmZ HPuZ}dXC(+"6eƦ)}AuʯO:A#D!Vhv.75j4GVndj8gx>'},KjhhRt6RJT$RqGd/yғURl_V]kk׮!ggo},SY:b(;s֭әKSeN[4L?DTѵBCF{PUMz2:b=|~t6$`naS;[ sO7>>eGVmvxd>p=;:FFBCB5'Os"UEYd 7!AӇ2cdz$uz `=%o*3_ϩvNYijKfӡ)57䩎-eQ A'8]AtZ';ퟘ!6lHGx0ʷjh[@ClfB6E:|ǂR4Hb>А)Ò)gMJ8]z "Q1*BXJ.EtK8(;XI nBZH|V% Q Ofl''mimZWPcœgLDZ J#Ħً) 3Nt7ZB]vX&ONrN,aаTB@0 C8Y h ;mvj'wt! $ 0j TCC_/z^Y7c Yֹ ȹs LjT,L w^'(tbDh sH5B4{!ÍpwP(񈍡*W!qo4FOq}Gin8MH5aA38~E[y {jv@"44#+VZMļe4xо}cge ._>&]vGxq͛W8@dq QPwzԐV E+A2y#ʹy>uι-[ֈ˖qz!շ*&rRRC}\k^ ) }  SBԷT%G SR&3#gO Hipb =]Be(5CI,CMԗ!nN9 `=~,Cf=< B5H)y +bA Yl˥녣 :A#D$Yy| fE&:ynzSDlLԪ2ރ=#{]&#E`HA(r"` BLN"0akݵ{g_Dޞ!hS֜Sos꼯aR?zś\bL 7QJ'(Sؙhu(ڶB% ) )BǏqh{;5j|*Da1_A<'dn{54ᄏ>>A/r{Co7<*ؠ!iXuZ\Y8իl,:.q-L]D 4% 1\M8iY6f}o0Cs׸ܚAd}y, :kQ94,W)*5+C}hRay㟖Npwϣ7#8耆9O)6mR^QR^KV&`"z] %؅= )9uHM zhD鋒e$/$υu/jD#y%S|kLH? " -UI+4-%̊H_//% .җ>J"E)RH @)!GRSk1PJ؎}ن"LFe^H_H ,$ ) بO:۰ (Tr,А,6ql0Ț3 c9%hXva:!6& 4hXy sIhW6Yiu#صVrFT'(bTާԸPD#Q-yO~IQmdN1q5H֧OwxJ6oȖt [ndd$)iZ̒OaH5tW*!)IsXj9uKԉeC14 4А_ EE!!h Jϋ .4t1 &Xentw:kPҹs+8@C>zt!l&)Yrr *XdΜ'0A4Q6D֋͆|J)0b]`uhpܠ-Mpת-LXvuuE0k䄩I %] *QIVK?qq>4(z @7$`tH[EFւH3rCük֌K*rȔi\RE䐄n"&&HqXHnBVRP@F D#"9y3T=zteCaJM@_}#l())Igl(c հ{/_ڻJߡ1-K.e0 Ef񚌝ɗ (V*H S$ 4CCխ[6< j~{zQI\|2o@:_7 O2 !hH]9}N)ve{4W"NIBηv>[h5ܹsӡC0C:bĠ6mZQ C%33s1Ĕ޾=~ gBYbţGwyZ,.P?+e;ܾo?5?˂ܛ#+0#DeQf]u*g!|`lzhoJw:dF d⇴_^O7@={*P`/Vj 4|hH?ZڷX %h~)0h(%'tfA4u١ ߿w{vN:΀ Ja2ڶmOW\_E7#ĠAx[|0?OYA-0rڂ JCN^YʚY!/I2ǯw`/ 4dy֡$ŃX#"T/@2dHzS,CCBRR\RR"sƷV_z78FaVxٳy<S0"44L`-$Tn9|_.mh˜wig>1c"rwz3m4]etEӃnb&S{u޼طʀr>Wpޕ2홭l;+/-g}:۠!ڀ۾WoK/49s>-,WӠ?ibbo/bG,I2ǯw`/ 4d1Wp@Gh^hP.E&WrxF#Ȁ)24"r+Db;uҥc"pժE7n❭w@-CuY^opH٧L~6vV WE?|x^[bhGs7=_0h( CC"U 43:&zu3CCuXQzi' c]B~ gxbńʕ'On-e7g|:{OfWjZt.!Zʛ6e.S^Dɖ `c3`(}0%?/$| US P@9s@h@Ӏ[0?#4cJ+\j &so&yy0l3UаE:TPfÁC9mf>w _6*$P3`_xԂ2DzA$4 M:y ݖdt{`8YQ_+zϊIHya-ΦqÒI3kT7֐l$iP]^x=<~#w fw_j5tQ&sQ˗m_0~Y0= 4gg2P.w>P,'=FeSfYϤζG1w4+ 1N8iY(ژaY6X>4ĵT&_@ò;Dj/ Z bWh8ZJH_D/_J]/}+4"E)RH%XC)S|Cא/%c EjF6 |lC";KG;_LP8CX㲒 E@Ð~<3 4hXy sIhG[S߲&^rgV::ƒDeh6C~y 7ld˼j1DI"ѱilCCrcԉ|T% &.RVzbǖ1%05h% Bhh7Q$}tyO-|GhHczsG~@bWjn^Td2[!Z uekJ',?Zh6 ;\EY8q:_?l_ +75 4 HtaŊ'N#5АD܏]h( p(+he@c H1>ZZeYsu*ͪzDM+3}TZҥ#IGZm·3ѯ]YƤ'=Z~sóPY3gX?$2WT[ h.$O|Pt͘f-pˮb%%&V jCps֬:ʴ#SS'DFւr`Yl1cj|vnѬ}>خnڶkOǀdР.OW;5VBX݇"Sc67}E6M[٧@ӆ0nȚkv#1PȨG.nwc"stMKVMZ8o0( SwheE0{wmQ=\` 3 BL/#>J7⺦政WxwVUP:N $9YҶdE["#99+bZ,ltNTl {24LACD5Ee{ >ZWmVCz` L|$c94VwCB^\ C+|)j:3sϸu s :K//j6mZc@ɂ<X:4Mxy=+:_z˝| [3kL|>p-&C&z7Qr?ҿt(P7oGaBCǎ4d=8}t 49)wz3Po-+ mQCА] >1҇׼ߦ=Y2 ofbz|I xCڢڿ^Ձ"; aIbMAmZ\0*"]_7#!Ogn!F@PPݶ4 ~#+F3~g_{-`bէlc97rsF(AC_Ǵ cH\k4vmA7^@p`*JjNz0d$7ya% :WpvYO7XmhѴ$ 4|ж-JO ,HNzmzyAV_.mhBX|LSeRR"6CkN4P?Q=DZ_~/>EhCC>1#4תi@ˎ O\p6 '5?uRR0! nb Q 'l}ƭX UP_; ؇[uGwĨ?;|8-#^1DoV\v[py$*D&J*D4A/XoC~k% :W7w8-wNw űwm"HXՋ@C)e R13/4|{aɤnVsgLױS1K % si!L\+ *PL]z%\ovV-BCZs?8 4o3nH&}z DP %HyyZ#xbK~_4yҽ[lb>yKx֫b:M's>R<7Do 7ZgY5 h<M䫇m(;X?4̙Y70jU-.ZP{ǡ?nF~NFƂDFԕOxِ L`6ڇ e[}ƭDwTx:x#u&N bŊЖ*X! ʗi@mH[e ~O|hgDo7d[C9=s`ӦB/0opSg 5U,fmc`P$_-PJpAC0J`A]Ɓ(L0tWO%gTo19ŎeY <Ɇ-N_3gK4vOeog1N|7n\P02{!Uҥsqdgg#yӦL'UkGr&ku&؀t`(*4cJv>/j k}ePdJ:N:q0`l={gIͳD#!ƍST(//:ʗꈸ= NoNH {"^ ĴBjU;8VfOf0D pY* *9 4 |/^S@Qm (4tػ6=0aH'/o7-PJiް٣7 c &uu}S> AC!֬(WkDԨQV) p{ 1yͻ.iܸ!,IU*B`&@#ׂ!]M y0~%7v] l?Z6eF\=͆x{ĉЧcڊl>h ǖlq;j<0%e tlc4CCeS/= 4lZ Hx!#;iDϸFĊPEP͡iB4j#y$ J:% NOyPpTfhh + mc,HlMJ+Vo"_\8KdU"5R^4 @:+ȋqwq!JMM?.t>a@#6?#;̇tz~PXa8|7/R{APRXBR¬E"zRP"}^)RH"E/J r$%ztBOAԡC[+4֬qP.TN0A_Fj񒅆ϲyBq/غ} Uz`šk0wF ~3穦ljܛ;I1m f)+;44}CSֱ驳 6l%5АtξP 4h(%8!0~ɯl1cAM6*}LVhȴԮyKktMI(O5"1,2oݺ&=|(q (G[ *CvUpBß~мyha+4L>`A:vl7rVAVkh a DVf X`& %%e4 aȀ e̘Z{ ^[c@מË e) }Gpvr˭ۼ ؠ!柔)QH71lۊ0)u<yvGѻر]n[CN6|e}2ʗ+?Wru3!@5rԤQQ= ԠJp0cWJ)3LP] Js 1@ʝ_+ kͬޡ!.g̃k۷(%K0PaF3&ã a]EhS MF ʬ*ܶm8 &;ۺ@i5V> Q;wnΝs`ddPo)WJ}[ǨP<0[x|2 ^6|0{TdA^T_}ʽ=/3ؠ!@|-jnA#[☑[ro-މ0Q2:* u7ѻKG9 H=i`Y O$g9I`G?aތА`z0 R7PӇkvŀT@C)e,9EGg ?cS,~u֎-ԙL qo =cmtʅ+}T!pE5Cý{73;7ߜ8M _ten{B4T7?>MM#GV7*n&V}Ru [ ݾ}Njnn b Ihڢ 6hg˿Jiiŝ˳6ftèv y:[EI)VdJ<~-q^p҄X|[4lLĪ`!mrii zԛVC Np&R 4dhߢ>=zb#@ r+-wX&BRCIIL~{[SX6}zld~Ty30)a*sPX‚r^=vS'[r2l5-l#4z4^7qgr-IjuR~u3gNҧcCBG_mobbopƜ1ֺxwOnCV]k (Zj #FC=9r 4tTjK kD$^!F26T\379M0ؠᜱ44ԣW{~(]1 $PJ^diO1b>2䄌ӓ9ihۼuOkHe c#.hrGիekUgfLFTU[- \Dݾ׭cȨOO>:JA( >DIG: !^ 4:^Mk,N&Q PÖmcZ3y7Eal7RVZ.@ djP~+6UEӧr>rP6m Y~(ܴܵG$PJ{%<Ƥ4`5lݤ>]>eJD'uU_UݠqqnOFFƂvlx`xT@^Nh^CBaИbA۷;JCƺaQ޿WɎVC]an#&&Z:Z7oT)}R+V<|xfh/&yא=FOPS6xCMQGyA:ܐ l̙M6hXVtɃGFEaW!mԻ=BC0H֠Jp0w-ZȬJ .hHQ+R8P!OL8eg{#x0(|T9w:nA:阎T c%]~EϞWj݂ma GKZ+O]٦f5ĆCLui5y іqa8xh`n٬t(PRJyDy֚1-̴֤ \ժw}w7)ЧQ'jRf`DȵҫI+ _hHbR.Y31ib ۣn͛7nMyMg("n]okӦv76@FDD HW #R^s̴dMyͷ@s =b,Ē6%e49)HZKJ1cj<5֭m3 %^lРc%7 >IØ7oɤ`O  EЦM+BD5jAyM(#DX83nڴߩr=(*P@C) m 7G7Bg̃X d*%4a}#p!@`[>w$fzTDgL5-Y2ȑ G 4>PM?ݻYֹs0Cgf.~(9Z x_h عswcvG|"z:y"R8{ @gReBJ `+8A0{y>hF}g6J/_|Z 8xmۆAC7 yܾM@ҥCYgQFY_~yĠxh(E`# S~u}԰ h8 n;15i4?YRj2O =аm!AR]Y~2&Z[1aU >zt C P1V߿-4;@7p`_S[V)^C]p^>>YuM@U ?Q[hn(W/VrōK0dp>Gh&34ty:[E'#o= N32  }h(E`Vmb\Ln95 —?u>ܼi>={ ?xQ u&Pի'9OX3"|v _RDfo mi4ʡ3Č p+*cϨ¿ѣWcҟJLb/DGCCo+kا~4|å}WbmCzАXF+4ty:<}A*ܐ]Ɵ}vX8 N(А*P@C)A }"<}#]ƝZ=zGhә)HM 2X 铑@z+ȯoOdHok&!XCŃh}3PN|*J"E)RH @)!GRSk1PJ؎}ن"6~xJ_D/_ E,4 4hxA!&g>Kת 0Km;vclu2" 4,ٹSu_63ouUzbzIg\^::/@!ҧeM_gU8i7H3٪qӏ}ĥ|pƈjo:+^K?5r@ҁѝ=wI|L;Djݱ ԗ U?abMYFAt͚5wWIĦa 4,P{ _5;eAd9s@4Wt8ԛ;uu[T^5}.R^|yxKV|] ]a)BC:6=uv“0lA_}\?ׯסCohRjn^Tdѭ@CC700h?Ͽ@C _,2)L'z3+F;=Cyg{=/w=#z'W1&8TOHU)'YMYBh^k֌`Y ͵0}z2\ |$Ys‘Ed L+̡!T׎D:`5}X`I! 0H̼E$$XQuֶIĸHA5k1cխ t@(cy"}F% Ȉ;Ch#"j@ ';>7-`SM>}~ɟ~мy(lAeݡl0 :6xF󆍰@CC70 CRbuS.a,4 }M/*!@C) YXD޺hA @ܰzwd?f9b<ҿwsڷhB 36-ٝ;7:T .\vmڴҨq@ɂV7z+n7CCDIOb_Au̚DoϤ_2CLeV\ 3W(gt9mSOf^_bᗄ)Q0ԤjznY4n(Vwg0O5FF֢o|PDeAEuȀSЁ 6rę2WNqGmױ ᆴEQyVkR:R}:xp?wm۶֧+W.pKee%$[h>y?M{йԱ!ʝ˳܀@sЈUf ȬOsrV**۷)G7 c-7Cîm;9Q G(ҧ/w~kOv6Oc|-^\p!{nDr[C=+c2MЭ9k*=ժ]0Y0[ն֭[YƠ" 2h(%t!^$I q*UVC&}CA?9rA]'F ׇ 9n,@==j1ll3G#4AOg̘߬/p;ӳg~B)eDVsQ 7*?PŤH{9n]'uD`?L8pp^ڀnŀw AjvFP<4T$ vz.hBקD )ɢ4"Z+8jo B ndQH[Z!AfVhHOMD*hh; @xr:v x1COPP7 Lg4䳼6/U_yV8R(ʕSߡ\9WVݺ(V;& Gh aSD?eՄ7teqܥW8F7hjj*4rzuw萌 XȊ Wʡ71([!'eI2K6&&Z$u:0e:aF*@KG;ECCuBeWi1v끟:c6BCSfC"#Լ4."COZ߿7glڴ9А tЈ7+cBF,b;`7qr(M$ʡLYE;h(ACJ\"XƁ6S||,! H70fS .~_Hr,"?UMQ%h8g4a>ж -fiҹ3X>iS a  ɖd =f[j jK^ ~> ӎАޅ͉V%td 'GcQe~Wp__\9 @Ǫ͆|jhw`Uj}!o^"O[DBCO We_4ParɓNg*K=ATQpSCC٠ M_ʎ|5; '`26*­C )&1V62$bRMK&ʹG2dil,FqCp.'!}v0 u@! 8\E@ XƍA5(r{"k"_Buu}ǶM7T iz@/J^3&E]&xؚœM'OC>~C  ÔƩSdzkUatsŦx1D`"^[@62ElB~F5.*š\a@C64ԅ@CRJ vhY{'Y- 1puz=7qb8e%B& fij֮]ެYcX%O_ J*UQ 9OOfR[v͚f3خ Jx\j'" 3fhh@v)SL`+q,d͉A cj ":B6gC2Guk#) t2AgTM[ FuD$eǎ䈈0eC%P@CRCC`*czAfZlhk5dPIĬ\!2S7Wb-lriwc""YiE8ݲeW_]xHNJu}ɒ9Gdf[B۷0| ee-SM;wn:t(Ñ GV64={*h`/ &ЀXn&㫹y[ _nYr[VCE@<>r$zIۤq[?{ @CڔW"U؞2HdϛY aic/M}@afG) 4h(4K_~|zl BCT\9=pگ4riӒ9?5rB}T@uÌ ֧<3*m|cn>SDnn6]0u4.ii[; Zq4>dgɅEEV\+TVN[SpKzQЦ8ABݞ4P"+@m lݺ`__{P2 4h(;YGVsQʌC E)fLΘԟkN:Oŧ`<03'|>8NFѣuBO%& heJl?11v>{!=8ps`;bWWE0d3Чc[S߾݋pKzQЦ2{D}:}ؘ}u ~A.!ǤD ~{[ `Q} 4ƛcjP#Phqns-PDq9AØh}Z8xz꒺~Nz]ɅA"!OqblTޱKB\q(cd&Bʊp_Q]*D~w=.--U Rd^2V<\`CV*E3Ċ4t\yn@c0 ~wl9K!urrqT6$ ޻7n\/]:oQvvvlڔaC=`9 ԝ3uI~ =˕+h'69>}zWm$R-4GơXPNc2d$Ol+!@:1 [}lC[פ~C6ZFc87% 5cRkɺ(= \)Gɠ.:F@А5sL&1KQ+ﭞ֨QJh(PzR8_P[Mآ2P¡,UÅUI?/hx"#rt_Iq?By 4y0'}p0+"}^0H_Wh(E)RH"%KR§I O˯!_J8XC)a;t""}ن"Tm(RBv2CE鿬!@KرB M|t6ŀ ;I@C)/ f].ZuC{u2 XML+0foYY3;FH> mhhK SӤ#!y N~36A@B3D hH2syKybhzit~\WM6 h8wuvLj5"Gֱ{ . 4аsPjՇy?n Ͻ#\|-hHUfhغIsE~@E^:Fم! 5 d'3YoYL CoCg0yU9k^6۝Κoe5аuΩ 7/pаjy7 4"k˕Ӭa]c "6t؄AgaѦ"惱X"~F3a]Yd",=CxPNo|&0#E]a=2,&i@N鶎VNZDbTص׽"5rԤQ~1B*nC9Z4B65#lrTY0VT^ܼӧ' ֭ qqi%~#pƒՇnuϗl/߽Rܻ;>h(E᳑0E쏡խ<`_EjsGEzV&W(Va9pTT]?rJZW`A6ɴnB(LTۄ1p`_}:riӒR> 85Ƿi$ͤn+5,@pZ@{t~JVR]7-[6/![pCݺSz2|ro3w3,h,3Y3=+c2DWN;ڮcn iP|38BCGCnC:l[Xs 4tl0`~:끬?Vj1>Yu-qtSgq|XlD4U\Ȩ䷗vٗW_ɝ@@φM[`h(Ea.F;CӧCx]G9D:moԏ?޻vdѧt\g۷կg0pKS }m?\21  GL*i/S3ߢcТ ii9NTr~_| V:*fΜO U'AĆ#A3sD sO_\1 ؽ9| .ry] /4d{=Ry/C]7f!NOЯ^=ZDul&{`Q};4Sw& W27:nK [fQs'zW(F/ҧDBC D~$꼼y "Xc1՚D5@:U_yV8 |=͹Ct QPA+a@nC;r݄hU#M!StbVx~P4F vKSLo!9cGPj-/q!FԳ@C)a 'VDB|Gu1U.2 mz~QɮWǯCY+2C jH/ ñ>叛 $/4tZF 79~9aLL>MOGuB+4|:j:pE3?hh~=X:ڼx +?X7+t/ʙY7 /8zxB42Z`hD1Ę/P9P&r5;uvA <ԅ+[4zlO#E5"?*Gg0 _\7GEg O\Lڻ3sʠw`^r9U/g !w˗oܸZ]g!;m(:C$K-{XA!p:`Z7{sг}'бchQΙ3cXN>.K<_vvdlڔaCFАloׁ^;^{-b={Ɨ+W/44,5! p(# [6j  Nf/зcǮ@Neb#HAǏ 6e80A 'O[EEG7۽Ux׳ ?qc4ɩmBCGѳ# eSfYdHfP[n I< !0%eLq:O:ˡz6FmCa2P 0ޡ!;?L'yMm5MJ.C&L5x5)Rt{c\Vv_=^FSYtP=o@C) 兓 )a1R/j%[7PчCY8Jyec 4 5Ӄ@$җ#q$/$] | -UI+4-%̊H_//% .җ>J"E)RH @)!GRSk1PJ؎؆R$]P$ 'lCem}ن"Pj(C dF,P@CQ/EK4_0{vժ{w.]*;f5dIq5H֧OO?=0}[T^dd6oIIB;}]KL&PACn745oȖl~+wXBۚ.*LXQhX PJACn74Au\YE7,[Sa+Zwz/7702D[J) ' mlf(6t kԬ^4.b$l(O]YHdPԩȆl=yauFU21h CUKf./~z˖h(Tw?%?-TH ZhI&}p5_5Avܤr5tTV2-Jcoٲ.]x$'wFdZ=t(Ws(kEU;<+ ;7u9ǡ*d͡ EŃs_nYbB@pB7Wb-3pĉv>B1(}x1XL[,*?rd'"cEw7hPԩôךCOB Z6,bU۠p1L8?|ۗn|.RtoeFpp1HP _t͛@Z͛7QKsza:N |9A(c_O:eb&0\/;PJiCCv-6Ɗ<аk2YYLКUf&]?UW*Wᠮ#FxQ/Zn1cj۾0p`_mF/CV-Z4-[> M6kޏoCgu++2ү\R?g5D{SFu -J_hؽ{g}:xp?%G{u 넄ndnS,@G"]Ċ|9CvQBfPd? Ts 4АxDZW3MoM8%)vʅ`{c,[)݅ |t`֧2j1(0+%3[ŜR+W(P~IBC7s1Y)+_*aj|?]G9eb1)<׮,B,ؾ}1oli%%_Xn`M;<}=򵚋RfXhV f%1=b$ Fygm"k1llR8v -J_hjD%Oŧ#|g-5;XKpZc}1}(}=۶mhl5Gq_3Yܻ ȂE7;0s$}J$t Ġ% Dk eq?0? HJ)%h둟-(FЉM0S\Vhh}~o;4ZllWU*F뷄|:3M2|_:u' q_ JPi!w뭡chQh9~b5ϺivV DM<+LK0]ڔ6* M WZt)3 4c '$mFp;~K!rD\`GËhh>KktAKBCTT"R^84d MO:8*r(\^*_ ph8|VO\XA]a19Ёh9*jUrI" ASM8%١ۧ p$|޽O/_><=QeweXRp„aQoo$4L0tWO%c(k +"<>@:e?-ܳ}[BCǎE9gδc9}..Mp=VoڔI.R<"x@"P-ׯ_vSoQ/ 8t?onWJyР M0# %fn!mN6mTYn]M Qqj44@I1N3 {MecP&nZd ;1\u>aS\F(~@C% mqc7l5M4\jkzd"xP ʄi(pL^cg*}%7;:Lock2\m8"$!mX}0S(?qM7dwa׺v }: I(GIl/зc_*k rd_[MACAނ`IzKQ!:򅆆Ξ_u ¡TǏ`Vch(R^vC{;r%76 3]`dSY*+ꔌ3@C8u\ }[w)04ْ׸\`1e#o’"PJ!ʳ)bJ(%VLz+ D)T,V@C)B7hRV  4|c[aSOpˈX‹'7_"*zјaUdhh/Ex2y{YE2𥄡EBC)RH"E)!_5>7HJxJ_~ R¡8J ۱4BWFMH.26\ƾlC ^hhuc jG JhC7QNdZKS BCz Y0}[fɲfͧiXτҟ!DyRJ)f^\/|ݗD Rԓ t_:Mȴ^42q4/cаs\NP?5H 4|ABMssGMY_̓DLԡ 7+P@C؏&Oۿ*5&H'eΜe2e엀CrqȈ4ã&ڵ˛5kLwCC(Y3D N_`.v[O5?hPƒorvb` &<9rС ը9?z횳evjƝUF󆍠Ê2ĵj Mw5u嬑&RK e$66osEYh1vT>Ei8wӓǎVnmw6 /)PJs(ǴK8L}X~~suժCy=gݞ>l  ֜[wiBSQG9Ǧu0;P0*eRN>olcPd߅1&k](AeZh/^952^d ב#;,Mks>"4Lt ϖ甹jTxn ?4o2ʟ Њܠ!px$MyW⺦政Wxw Ʀu0;Fc@QG  aexh %wb5HMn&+ -cXKaG}:xp?}V=}0a޾}M߿^{v hCÞ)4|/:ߠS.4 wqy?M{_X37CCk˕Xb@|O:wmT~bzGVS4tz0;m۶֧ _9X([5j(d-綞h(%,!(fFjkN:amק3fL}bܖoØێuNaT?76d&NJJDe|muo1*cѢ~5qCO_GS/J1KmUGh9#2:OI&]G̞ s߾^tt5Jo cVv|LpCK 4p•vq*UX FOԧ]bb$Ә̚oncSOyo>={6O>;ρV;_~yԼye.XC) ; p$r54*0D i#4t РAc>B ; yyaK5c)"\jэY}=6u 5G%f?U_yV8xwԩ;iORxW2"H 4ܭEh1fEa,s$5:(0@C) MQ4АYmʔq#J Mp(?4_P3NBC]ikƍYb իcj04jo%?N]k}:ss! E6P9@XʳgO[Ť:^FƂڥ; adn 94dǖ, 4d2⒂ Zi6-wlzt(CY_PCY{۷=:iݺtC2 'L:,/o4UĠJL).|p`B |88D!c܊ׯPGzofXb^RSt,|r ̙Rӧw L 1h<`(O%c~wC$/P#FurrqD#ja26~m?MLKEďg_ȦM= : c'2l;(0@C) Y|Ui cCq(3Y\CY;uB@Аƍ~L )h66aޱmCцIv+倍zV;φ~د_O [J MhȐ?1maKSsBC*,ƚ/:WZ f&&rB?~: G/АD lD`FSB N4-"ubǥ cذe&^~ j^aQ1)C[oCNznFE7b;g-;(0@C)z6nGmĕկ]Akuwhȣ `1Pv5neK%+OXkΠRS!cnh(EBb㱺)CYTC5e@CdKk Cp3HGˮЀ6 M1êh(c_~p0+"}^0H_Wh(E)RH"%KR§I O˯!_J8XC)a;t>UE"z"}ن"EIhH6rxp:;&D3Unǎҷ&ЖD |ǡTU"Pa @K5Q:{wri ȋWJv[N_BE:@ҙ!ҧeM`fLfh* IcFf BCIl^H߄B55oȖnH> Ci%Y)}P M$5*>LLǖ1А6[Sp[Ǧ.ذL@CüsXmj?u 蒎= &ha&|/M/Ԃ(t!fy``C9sjF-Ea4a?Z=i?*jy9X ѷ~ޡ[O&jDkhjv`Qt|Nht@@C)a aKnmkpvۻbdbex:# ZkF1x:3 &/Ahh\#|q,y;itzъӧ(hTԠAQ^"<垫WO8BCu]6Bϗ:g$H=إWqD4dg¤#<"&䃫7;YB``}n PTߞBK h =4mmXBC( 4d2ń?ڿc^&OBkpz*&P3t iBC|v+V<|xXeՐ= j. ukJ_OOm%<~|i#u3Y͡2YhŷQVi;@O Iteu(+W㣏-7Yg@W<%5x0ح V7Y?_ lOb~zZE6-!IF0(R?U9:]P I1 9b)Ã$/[!sLdqW_TQL iC",#oW~!%>v!gCq)"b2VP\ -ߦbK!OWqju}ҹ@3'n}ӦLRՐ8PN_OرcnuC;w؇0OqG셗a %d>89БĆ&v(+b&@v(nCmCOπ@;agZ zѸ % ?AGj 6?ĸnܸw| ̙3!S eP 4dITӌݦ8k}qˁC{lGjjܥacQ 4p2FꨀSdzkL g*}0S^-҇{BF /[Q"@=>r>`Dn{OzVᄏ kB ~ ߟ'V 5C͹v"+y6^%{lxLjFIp,b]])9Kj ްͦ~M뿁DK:H¡,PGhӃ/NM e,Bx_ $(1DtS|H@^AKaUl GK "eK CP>ׯ$%0n. 4I_CoYCO%4(~ ($Kmhĵjuw!T|ww>vl7Gpbҥ?WWaHںu’"ʣ‚ і?x2F݊c\-6lz(s`8M*lE[ڃIa=hPƒ#C3f;TP#G:t!w'fM _~y4cD(ׯm}""QbJI;XrH,n;%e49wxRvOmڴr@57e~RJ)h[ #\KLp&F  gBC4ek`ŸT2`yPrdGnUA+p ZF!emܞ^5xxVm4j8g!qʹn>vaΪlu=ebpa֮|pmՈغ/l!_m]o؈4.}@ :HdB6~(\QQs8f]@a BCNSc?%kZ`Bw۱c1z`q pa~m&T/sCra1v+49,m?}p&UX]h(\(֭k. 2hN ב6?/Y2\xN|JP^3z0C_@PRJ)Ih^&xp5C |x,2g1{{} yu);@öS@^d(_vOʕy:X}sU;L~{i}gώ3yi2 ͢){OgnbR+U2- ?;vXM 4  & JSeAfn1 YէPn*=ٛ|ք5!7\i" #u6sx,5#4Aɘ[ 1L>Y{|48} k{(//P@C)AC+RfS0At+F,6h#I7q=G_bbH>s쉆'h癜N>㝅#Gzrd>SW8=}/>#bBCw%ncl~4hh2 ̦ c&@Kpf_?9rL2'%%^Mq֭ 4$/h/4Ď%@N6Fz;wG6bè81WJuoq۶-m&C¡O[O۴iO^҆ l|Y+h(E`I^ӣ]Q}zGb3M}6hh ?:Y%1VrIS59xRACu 7+| ?:=N]v꺲,6*Qk,f`p<=M44Sw +\W*Wazmc1p1ȌX^[o^^jFHD 6ᄏSB3gDjբ7NάH/O&ܗ.k1&/w6CCopA 4RVCL;zOX`LJBC][4zl lؔV7L %T׷neu=u T -Be64@lV2Yi@Cu3NPWCl.--c&0}x ,)hHll0k J%kǪ&zm(l>:Blf/Tz#PAACe +W =7or&LY1/o"U=:T@03tCXsZ)_5y %1t 7=dL 6-6󖒨6DׯPJzg>}{!~{_?" R3_iSzI*.i ۘ >-޶D`TMI 1jqGh^FRJN4_}""m ٙHCZ٭ .H 6!l|@5e4|8xdXp9Bf  F7EoUJU ,ͬFcl[?m瀉|65ku{-4ĕկ]b^s6^amb'X4{Y~ϮaI0" uk  mB_6e.K&{׮:</W.T[uhhJyaC&nkB֔M7T)YO놎a9s7xi=IT #N :WZ I ѷGƔ!,KV[8J^cxg/k&N"d-DԣLLCY@C) >2 $p(KeC\g e2@ ҃ÅUI?%X˜ҽчqY7nYܐDl"; XÑ<{YE2BC)RH"E)!_5>7DJxJ_~ RDRM@C 9ht~I_D?983ن"PR aKF U҄=:@4CKcETN6[ҧen嘶Ja7oȖ Ѐ6R>ZVz" >VԵF%CpGSǖ1%0Ġ!uD2whmڸqy""j OzT_i@C) ŝ[Ǧ.ذ$@C2>;quN;_"4ǥ _MĐ j-[a ʢxа,v4֬^#/s';eA9sj;\ 'N ?Ef<uaŊ'N#3аzj] ?8JyN^ # 6 Hg*$`z AF̟ʝMSKՑ}_>''$G|]ڵ˛5kLnzΓ^9wtxj֌JaY5s?_ӡC[(OIM)Rғ~̘z.AKŵG{rA \>:!2WzYЋŨ)1 ` SFl2HIT Q>FW-U[$P ށSY8cvk).]:B ` OB15D b5< _.4W2p>~<~>{%E@1M#V e1ȑ1H6H_O> L@>=lWnm>_3&90t(Aޏ?+_֭G1p/wT"<"|5)&.8UqS@p-HseѢ4-k!2xHNJ}' CrB ;pCS2: 2x0nK\ÙB>REp^z#9(nsm~ T{sx/aEHn Zw`Ξ=RPYYD:?@C7-Y2\xNt/u\B2qB2ۼ򗛏]* oƒՇn%>|w'Q=_u=ý] .ڕߖ$ 40E!S&r3>_~|ݱt&^A->75ihHM2mh8hS@ݻw֧6-m`6 /u+~ߞDEuKs[Glx Dvn]RSTR=~n"ox.ZeX߿ݽ[h(& hh{Xݞ KgϋUyaA,H` _ѷmm53GEvK_8ŷ}ش74K_+>77[ -R e `euWCC|gpZݠ+_?cm FU G}ϳ#w\;yۄ >4[V [YGVsQ p%7W[Mt1I=z)ڵnw3&PN"tXK q332s ]^y 7\v Qꀆz-А'+4n.zZd2$1 hGalpLc D~ǼbR$w.Fyߋ:/wp5V(*(Ywҥcfؠallk+>|^ Vs|CCϗ `][0D 4~fj Ըv؏͢.ed-mڴ,44< _.4d#, 4dHz}D5ա|ЎBC]E B114=Ќy`d>C}l? W@DTׯ_O eyF/P`i+4ԵUNvhkKi6D֋oH]Bpa~`UT<;C7}eDc.!F$mCYA4[]b2$ڷG/2]O[< ($m}zWQWm(ܾ6(ֻV6 `פZ~EϞl-hhĞP/Q)/4ᆴEXَqRdu,I^ӂ1l bxtJ'7*Ď̢͛3g)$]v`kܸwaRܰ!AC8Kbǡ JPC9Uq{͏՚ޜnmr8WAC /o=mxV|0?= Y0{ fPV[ѫ!!4dύ<zτ #Uڭo+^eD]t.&-iS&!5yؘʗ[O|:73G]dXXp|;X0 n=y9'<}aaIT Q`莤`U(1'W`('r_Y+3rWT6MM=vl79Xzt@C_|&#C`Û5rߡjL:(1?Z:]{;pJq{ Cudպuk׬%_.Ղo6l OFX /44l^16a|K(}nӦ&٣5D SqW44Y}'2?z͚5Q h# D.f3fHo͊# k[ pSrh3Yvmm?b;t(Wsk =zet\p׃TՊX;7aÄ)'èGwc3!"C 0jnE_2\h}Tv"r+Ac=g9ﺱ=&_#+%K|Z$'xEgf.oߞ9^ZE7InϊV[QCՌlkfWMۗQg{%dHφ|ya>ߜ={*P`/VZՂc]jQmejfMүW1njmhA5[ݺM44Y}'234+-JuڵJy!А] 2S ijy Y{ ~}' PW>׳JeZ>kݺ e]~{˗}~}uȑMKUh#5ǷizCA&8pgh)s@ƴ41D!+'Ogn4b;SxYZe .hU?.[6/!_-W_2Va ADXsCՌ6֧(}o'`jR+ǁpaӜq*44ЃcctmG (}6 $LSou~V^;m" eQR^4LJ͟l 0jxㄲR$3{Ǔ#ܠ!=^3J iS TrOd[6oh(z6 yyD \Ry*.lbN4tIʠf{ώ1e\1p?lA}LJwhh~2=LMRn΀>@큆,8AƆd80C ݆"Ըqᄏ@҂3ԠF|[I&6 Nd\ +-6 :tGM9QytoE~ҨQ.Ӊ^44T02d$Nm)}A*fs?Xv]y6"ZaH>@!a MJʘ5n:u<54<!b@>`h cԾV&@$EU 25[u~u{IC^w"3 QsU[r_R^ M@ۼ(5x~@Ej†"AJJG DN)ƒ2| tDJ_M'z?-UI+4-%̊H_//E/% J"E)RH @)A'RSk"җnҗm(Re0چ"UTن"Ev(K DE E)Xg_9iKI6&,+J$ ~J;v9K@2'R@C) .iQ:3z]`.M6eL 70}[VZ3ԵF% ҫ;ԯWGG(9uZ!Q~1hh/)$<7 4, bÌ@z8oPHrJ8rv+5hh#!h(Pʋ[Ǧ.ذ$(üCCPDyА7/4$?iDDpr,8 ̂砝-c;n34p2 _r\/L@Pf˲-^* 29p"9hXAp(zGM|,V&9b9y$&=ztQc:u"9Q pGF"4Sd̟5k26*G3fL$[}m۠nB?8rCtm-))I 2fPtn4(^_R_9|&=CKOH a=+WxZejk`^O5M=ur! w ǎ◇hchiӒUӧ᳁`& %1 54tL: O5&@˲0@*U[Bદk7k֘a+ 0 FY36 OsC^yCb3}JC@ECvg=X.Ɍ%&AW; U}6c\N nvM?;[A ,4, SlQhv؟fgYו5($M/@YYS268Z *Tõh~&tǡCSx޹s;w1C̟bX(֭:6+V甿|G׸@ $<]ns=;IЭ!_}u RN(ڴigPb.ZAl=+[m [2K9{1en4mY'tS su38̿tnO#0^tcXS͛7Qҥ#}@{E0@C MzwqQCCH C⌆b_YYԛ/Y2ȑ 4ÓqeZdqpucL"]X0< IxQ1>{ԺukeDc^@eAC?ٙ m@ hWAs,Y7{`ֆpf ݴMn M 4ޢac_)hj3sw/akUjDox7hHпL z׺u }?wjQ`LL|}ǎ-JJáU-7Z)Lh7t:|œw 8C0aÖK8Q۴GeUF`H7a(YO۴iW8n۶Eݩ|b!EEjC+L [i[,RfSl<=mE4d JЯln;xٺdx)5N>8Hĉ}Yl^<Ћ|=BC]-^W0|lO9|YPk'9{qOKKj,fv(U1F4 pFt1@C{! V 9 G__?9rA] Åz?k3_h(k@7d@C) `w)*xp3c&%fS\D)`0CBCkı:kn(!CT||ǥKZfVS~ ˍV` 4tFOnSDQ<|x;[worX`g8Hҽ[lАY]ğ?x"\xY;8V7Z RÍn}hh^lk F [ACH`@ҧx'4js֪ܠX0<7` FWu/Ft1ާaF*Az8%0wJ^ܲO].x(d63oC{f`M 4jА9{w3 RА Ċ4LJМ9sۨVN8UF@2CÍW08FC#ªT5h l"HY|=BG?[aѩnlya@c5?A޿̙M6ҁzMʄ` MV<lק˧b[gd,p 08ǂi c#MMXԈ.&4;#)]%oZ]ڬ،{ aR`M 4jp|!,L_UbMRF9u+64rG&,L٦qiT.c1<}z﬏]iu77U?eW8Hέz?DچLׯP[z/W\IACwd^Yk,N*D9RaD8?t7[!BvPE$ya@c5?A@C+"Ap&zLlDà#.P #na KP=nbcϦM6d=XvRpާ/ =44q\^B% #}f)CFuA9%c`-^H{,|tOWMw*~7L BC M 4RА- ν"76ǚP-Ifv ؤO IO0! H/h)M^h)aVD"} |)"})a(}P)RH"EJȗb O :җ_Cp~PB1J _eDe#H_Hm(/ z!h<s4,[3E䗱fh"*ܻ5 ).4U J Rhq*vED`ʄ XkZ>6lXNq2*0Ġᣏϓ`l&.TZ5nJ4y@eS~A" !r~Қ?/th 5l=BC̚*yAF8RFjRBZh=h` f\tJȸrB/~;M{v;̓oӟZGa " XeZMںu =WXߞ@pߗ8n9rpԤ qcc){ )n},}' i`@|OR"P7p/42/snw{;dH:' +#hl׎ +[ɒ`ڂ2#4l,Z7eLKc0I 0zԭC'$rW7TO6(m[St~no^FM%0tf@.ں6O-PJ(CCl0Xa+8h[g9fUj_z>1):҆Gr =՟NZo XV2ܾ}v7</JH V[FL;i>[ԣ/w-RR,}:{>z8 ))9oohC$4j -;>&=֯]&PlW`;"YXnK#4ըlskq OQJV>|d›OϞǗt{ m롳 ~pO7џZ(z`ٳl ~2$Q  |o};F?Л5p YAÀ^-qP 1aЧ XP w뭡{ аowPǎ,Q.]:f_hC8y ҽ[lkB{Xf+]-А7hxzv+I ^=뫈8ACs?q|Ie J܌~PgBC%b SFjRB2_Dr]\_!4QŃ_G# SWÇwYHסЕohELJdh@;D9cR4+6Gh:]9NSXg }j\\;,f:~u:dNxُCy_˷ITZ{!VhpzYID@FAed,pSD114='[O_ n'>ú/w:.?lO-PJB Fv)Ue8*y ͙3M{yA_gx 31=}zWmB$ļ ʮa6 ,=lJ|j K@_24'[_2!VKN^%R gd2zUSSN;v7_heIZI^5?Z*V\萪O\0#$.FHS`ɰ n8RF3 t\ٸiS m%ɰ*lSO Eo'/ $ Zbҷ圲: :&bmB fJ AhȄjA&2Fgs%&d(h(_*6{YE2BC)RH"E)!_5>7DJxJ_~ RDRM@:_%]Bd^6"H "}نRа[af4,+АT5$|АGd?!; N.o=𜢗M$ 42a%1"UG҇ QYW+vls] C>!jDTX ,;eujn`Y-Ahh˓yato^HN"5tߟ@CRJ Fhعulz [I 4d>x{Z9` ‰IJLF ?@CG?-ܰN^27]ܲp}Ǫ A` 0$atXmj"@cMQXhgCh(P@C)!P+u {O :]ӧf͚XʄO20Aa86y`3ԌSW۶9xR7u֛5kʙG? 3rj5k%^0l̠ͫo>jܵWY3rꬤ^Y{[??! PM~-4=+44H8HKL,l('Yх .AbhVqڲ=k{N;mV7nӓ&Y3FDRӫ&Xs*AZ1 )d!:=Q &&Kdې}XE<9rAKэ0W *W hďXYxqlb{߹s?rdd-GwqMJ_J夤Ĝ~{@C) 4 Q p9.rпKn m pBN&vWCwD5ݺ?gRuT횵xޔEqʸ7km(X!BuXż/6,E0_G6;c_>mߵ+ʅ 4d^̄Sfc"?0HM@1Hߺ M)ci'RcoսhhhSd }K@:K!IR^#&nACC}3 mCYf)ױZ+8/z/WDbrɓNgYJh(EhȜ-K&ԓJCZMf /OqOdΜ RTdO3ɘs&kL'yMm56hpdא5 78Ѩy{Yt]T hܺIsꝤ乴u .ҷ'q8ߥN\)6]v Qה4tXoH*le֨ z[!e&+iWZ!VAL2$5`sɓZl1:WZEAC\]W_}Q˗@C) 4eJ@aMPHWD 40 "غB650a! ˢe^ч)2_UYE2BC)RH"E)!_5>7DJxJ_~ RDRM lC3ن"/җMHRdrACk ᷒ y2CPѓF3$% I+i ;lҤ[Yg7IȐ3R 4Ҡ!c$O55o;}5wqJ~֪qS 4t7Q4l}t>>?.qaiӴŅͿf].Zu{0hJOCkvls]Ț57g_A'z}" : _'9ujudn­ߔ ԣt:snؐcFu<`@ޚ"hORl[ ):;u[8]5}a`I.А/vaŊ'N#%/АT]  vqy2fap}Ǫsü qAqN/80Yo&ʽ@wg²Ehz(񅆆oPn\Xz 8@ '_hh h(L,eePc 6+-4(C#\sNc$l(>MP΀ # ?j'{(6c&0fJ°1CjVV] K+9y$j=zt1\go"-(> (@ܠ)sD5 e<5i5a?!U(Aԉ0P㶒Ϳht_I3f_hɬ0tw"(s4(Sǎn.rJ t׿^ule3Cm{T֊2e0} Ұ^tǀ?}1O# RڡLn^'4nڲتq3epk }Ou?[aӐj%PƲ_#FihhZ.WsCF$%!3PMIa!X `c`~:Jvl  c3H0wv(z57hI rbʯ 2uoJZl^BBuܩSʕ 9 uF|s|޿pᰚw?;xp?eY4?OQuPƜWbc0& #&CsIA=l:y>}OklQ+VR-Böm[SVTT]`xn>wZopX校m{TJbAȷYXƴ4Ӡmh}J6-2^$P@^xk0qp #<_p@%8HK9]1pq񮾂۷c>VGn|44?2H Ws~>k)ާǀ$4ėf9BY[gt;| Ø֊b_X}Y< އ#̢WsC艺 4^ErԦMKeE~_| V"u.?W 4H'p߾.B̘11))d,BCl=Y2CױbQ% (M\)W+m%%;wqlBC"FzNIGRz-)).-h; [M0ɮx8LhMwٴCAkNp7"Rb uU<2Ӊ*};CCVhةg_ zOhxbn`I/\xWt9o 5D?*+0 S, Xdg$VCt k  CǎdL 4lEW!zoVZQ8e8h軱)cm2\v`{_vP{Op"G R:Ϡa7hXRQ z D%1K;Y`1K 4t~ՅoeeEF7n/4TEډ  4,ahȖ4⽊ PֱʫH Cw[Qo9B:C㛏,np(4DHٲ`pb<%ab%aW,چ OϙTk6'ά"?xqʸ7km(X!BuXż/6,E0_G6;c_>mߵ+ 'La /oۍT-}R1fκq ~|fx|!Xʹ!UMt셤; E_"Y!uҹ河3QiS&H!QDf@@C44?w0CH9=†!ذF:~1:RmCS6O]t@~ىׯ3f g`4xJ'7OώWvD9^ Ϧ15Q+R8Pߠ.:{Vp(ch @:wVh8g4̮X"n/N ˗oܸ,2R3kR![t1lKyMJyM*,})pF*W &cRk|'35ؠ!I^C28|pD-_SfwUR5PhE;1]@M~ ibns>#eSf)OAޡ᳤Kb!֏ߣPӰ:%44CCcg;EhLEV!{Q"Lmb8L0(yMV ZC%" ))E-N:m^j,H{)K ,[v~03@-Xɋķ7jp򷁡(m ߁oPnL1W *y K 5 -mN^K7n˘c=D&P@CPvFDY (OT(W@Qh#UTRJxAА Œ,dS S0~а,J_4~ }}|=X.1~ZV&}p0+"}^0~e)S|= RSk"җnXCHȑ԰5Iن_GXI-3mZVCU7ŕ}l#%s=*P@C) AHQֻ ;d2l 4Vrk2$J ڞ= =myߎQp}"߮%а!=NZAWuls])}[%IIlWժC~Chs944KH#40 o`ֶ嵁AC* 4fbBDkyD C_}\jc|* A;C<-ܰN^27kcK7-4;\HZ{/8k2khH:["{w, t{ֱ驳 6l%!Аü߳aUt}vyFUu ;bEQ VkbG v XQ {o1$&$_=9瞓xϏ?w=CYg7n~1cf}|7 $"h(ue#zv- %&zd^Roymw"]ٓ6,,}e;v4B ?8쁬)%$&{1C5 *>.&_5>q$1q16)iN%tAv"6!F˚u0,>hH%Zu^2!Q]iSvHHE?2-lgI._>&ž FCZ[T0{xOO̿]{:c4e\!NSԠ={6==1ӂ)QNv)hhqlh'vbkZab2gNJ_~y3s$-g8ݿ?`aQCT7gF0j=C[!bʕ;#c$"h(whM<+!@yK Ӥ̈P+8ՔűK&,…3!'gϞBH=UЫ.H]~";y6E= .`gϮ1';Jd8Kx_o2d`V] mV@cG,&ܵ!B6?Eem޼ )C_oRsNc"9>fblXTQWÙ(uED&qG3E񑿄JҊ(ghhe y󐚥Up0SNrD@>@e=yru˖4{eTk W9W=l4#4|yWCѐW}y yBayV|o!@1@ }'yL1[oVj_1{Ѱ[dGh #s4$zc6 ⯛iPƟ p !:T=D,ou]hӾH]z>Nh>gIlddk+֮]f_KC}xLACc;* U]3uFеoTfpz U"2 E}%F~bN""{$xhx |osz}Ι?OhSV܋2@`۷l5.f9,8q J UsY#Ǻ2]ݼyv3:!Mŭ7 + gM_1zg }!J(?YИ/?%,*3x6k4^o28DC W\ze tL »wOe ZQթ2)UZE}F0 mۖZ5h2XDÇ/}b'(N""kȲ5:Cû 7};G*6_찚34d_?ا0"8U$縸^;C(B1?8mڷ_ Bѐ|!%RޤBΨM޼7yvaQ} 5rY# YR 44瘝;wΡԩdo54418G?gocj3!7:ʕ h98f#>!޿[~)ˡ  ݌,I+eˬlarʺAY{ +2d{Ao^R?Gwa>=pbx#,hll ѐ׭fnPn&BכT(#ӇuAC :v <LF˚IQQYb%Sflg)q#Y-wcGnG!u7Gu $ AT{o>#YAS@yh#zucfB6¸qt*$KSqgNǯ_69eq [V PP'8տ-C {Z7LF5˞=Ӧgw+<3pyL - |aaP@X,>?~7R$+KVZ!=zIu?bW68phV-N5dvyWf˚Ej޽o>뱤t3 C9nާ{>Ծ:eF(:H4nZNKKaXQ!3S0rm[ (6ܹ E jR޲F[k Ípy0k!'!CVc o^cw5s56IF10Cb|wx1m x㌈hݪE7gKfx.MhXԚe.^w)hh>S6uwmW&98T[fbvM~ ̲ehPƟ+ڼ;Өh$\3ϝ;"h("eī$D~$l,1%s< E܆?@xh3 pWp!f&#P zKj`Jlj*3ڗڗ/"/⇵o EDDDDDDDD|^k(?bt"⟵/!_Dj_jߧޟ]dTt|}Y""+Kc99 e4v찲Mn5z/ V'%]#>!h(hXR4d3v[+)o2;y>m 6$ VZuawTͩ Y=p^@ɛ,aa= O5[Wvj" Aò e dg3BfK [2[o*h(h(ShH31IzuO`TW#ރ]о<WvJ1bOZACC[ GtҌ+bBаt:>qnN~tv{44jicു݂kߛѐh "~dPx*:3-&ƣoiîc'zjH r'B=n>Tm΃&7vа +FDv~>ձ{agƎPF1\yAc&U 9qnRac.^hQ|w?/9mNi5k֞钛?o!eѰɯ=#Lj 2uҠaD" &VL34Az}q쒳#!l48z׮c,ٜ1cD:ujV)¯EEu qwȶF jΘ1C} z1y;(7C+Yǧ+t Œ nU`(bx2UiKخ|;ɰ61a0}6ka7 /NAL1NHF ѵOE21qBhhM$%сmhE:a=Ez-DŽKT^1QUBF'NIj^5n  v)1s+/o7P.Jp9C #5DHN5 ESsKJGahjסAA2LTwcg-6:qSfUTISHWBԽ~&R^o 9??k4xH]}+nxVmo~^?b\p_3 kCe|gR-3:i@K jVYy1iЪMJـix6E9Cÿ5 ߼)ܥ&@Taa& dͫԩ̝'Ox6QSǜbi9<d=4Ě̼H7t;VcDqP^ͼ퇋}eU\v?hh3Sʞe,[g0pZ ԌGΡ24 oDN 56hYӇ ̀@{ 5oDe`͚%UCo)*U/'>(4qCP h$  jIWFXjV)&N㠽Ayn֠;po\u2qD+4|HbThWT Z'\1qe@@Os g{?17А7fq= {$S#q)!d G#:'B:4q%Iis4|.mŋqi Ko_^2k/5amZ<e4@ _o 4.[I'жHeRa^6̢>UZ\v*.y4i*s -2}y(ЊpXj#k%W92N+uk'͋sv4ZwOh0ߍir`zu1[@[ ACAC7!B=G r`s?^枷bWf)Ӭ93-~TNSϲ>$n8w}soO ^̾b  ?.>v4r;2 H-UPyl9ج]c2k]QfFuqɫ wWVА \8081g=y92.VZ%>~TSg&0kd /8F񀑑[?T>Ǩ]I4Dy߳C?Vl14/_VaL1lL|L_Uo3\&TW>ի'\Vqەeנ-q \k*]zX.;>Q_TzuA/,\W;w%+kׅ T>~~yS_ oFC4qCP;@oz/eD( };!a=b>8bl+hu؈{Hg\΂n 7n S2;|h}@o!5b@DE(=~eűJ~Έĉz715+P~cZUXumR$Qw&U\vhpg&&]qРUfRvh8|`#ךd } ;pΜ).w &il+V̟:uv4t %wAC7  ݌,IM312(k/fePĊA93|~ KSӍQ:D:o8S=?!_#1֏Ih~_4PO']/0(9+w4>j> mԨ,8i6m"uq7 )m>*n0A+AM4} zLzw*UosǢ>U O .ʷٰOkV&suraViAI4߿ڶmi 93Slz YJۛWoڴv4T匌F2N. ACAÒ!#*܃)ؕ@;u<37eTw+{X0|bGf :łe(I)q'+mXqrç24NQAV1y),~\Fcn=R('̤v!r˧IuFP ҇e(q#(7lTmTǻ[=xQԐg*{ο}ҥ saY:z@TF0I˞=470R_0s=^U>tI+6Pk9/r.[Ŏм퇋2U\vejHg_8|H\h1(S}P#/ty{8kh.Bz: ƍ3ii)0u4"nHRD q4gwH/CA m44,)>I8 I`'*+&R8d 7:ܼmlLhk0ר73kj;ܼ Q=kءkp>e:vB-km,"yoV Z7iN].p :}-ܼz0܏i[6j]QU6tK+bpn7i2#2o "ѨQի1:4P(ૄ Ix1eh""egƤ@B iYh !kQ _yE-bTqە/lyflf2t=~5q:a8dNA3C!ma6κAY"ZK&.G> r4Ο?]kLЫ ACAC\̄Cax&JS(ܞ GJ]%TԾԾk4shaJF.,j2a*ü6fI{k>TK DǗI,v|}/}%ڷELHa[ECACACAC$I$I>G{q%""Vѐ/""""">'+WG')&~+""""s e)~!""""s"h(h( RL4=44r444);hضmիWK9k׮}'7n44LJ=)Ii+R$Q'0::}9[n+OI@@@iεu]_&֚5kz E qNy'I'gR$Qpر ٳ5O>ѣG"D?b?JAY)%)(iNRPy ǏoߢESvҥor!ʕݻ5lp͚5weg޻woܸqW{qEgU߾} ?XysP%'FEEnݺUVߕ4ʍEEC;.pժUkР E>>x/%D8\4')> 6nXڵkԩ۷o?tpsAׯ?~xʔ)46hx*U䨏p'.XM}Wzz:Ц~W~~~JΜ9?rH~WHYp,h(EhMK҉q8EIA,%)(iNRPy `ܺuK!ŋ55ٳg9P t^|OVZĉVȑ#Ս̙/Cqj*gu…+nܸΝ;0(;wT?\)h(Eh+Í${KAY)%)(iNRPy Q/k"p!,{A%ghh/fr52޽{-!*@4p;vFse111ӧO7m۶a}F?k.V fbtvgeRV;X 7$(SR$QG1(u.],="jA^zM<b!3.-f 0UۜڵQǛ7okwI۝}ggg6khB?iʚujAMyJUn;r]Js2&Qgxqdd_CSWr˖-O<,Fi֬@ onn.6`4q]8 ȿDfZZa~ͷ`/FۇFoBnoR))wᗙ"ACACZ\=.~6pDB&[oܼu6Iq[}5~3OzR+=l9e]Uwޞ϶n/dҴh cK7Ҵ;W [' HCsO)I7X0WnEΎ|ufm 6Ѽٔk.z9)))&xuMPъ1+hȕ Ճp鋋Sj ;udݜ9s&r{ @Oyl V qZ-X;R[l 44,hh2[ϸϪd~}g˗z[:bkf@eR_=kfK/a)0 *n?rTgE7 v!Rv\*l|BJ?J\"lO! \%A#SO_4qrfQ}ּKۥ@RFѰ$$bdz %P|6q:?yT[~3lDai?{f籏@8}z+D‘q3L]{ T:S̴ejt٨lծˬ[쁃Nݧ/S{ߦ?fB3nS|ʍ6==KlPsٹEEC!+*fR7 ir*⪴#VzMiW'hRB+dm^"h(h(hXhh>[ϸ'LBԜ[:?^e.ЉlU.4۾K/u bhhC<007q7ǮL2G"Qi0ڳۧώ<a@R*F ܺ,ߐgn? ix&-sh.Jč桮s=CiWVJ) L#'hUr e5j`޵7   Ad6qO7&.\Nؚe_y"'aE`g*4DDŽlܫlЄɤ$34,&3ܺ='[kGWA4{ޡOޞ F~ng|ө[?u=hXBAd@i8edTZuzY:o|I3rt[U2Fa1(z =}ΜIނ&'T Q}4ߨ9Α,׾H$ ehFhhC 9еP<DŽG"j uˆ!t,^&GdC/H=|aDkX!:ftf.%~͔y36>],CW2^O+PD  n]ծZ+ԫWgĈ  Mfkd7 ʩeHkC(OaG! hI9i4\V(+9J Y\%fngp{^CbIoKoGqKfJuBaSiйeǠX('^QѰ؄i44r1,ȼJ0tZAҦc7TvgRȂ"KؓhȐw?{Ϟ#F.Z(huhh2[ϸϢ4]F!Cf_~]٧VĈz%i4D ꔕe(٨4PӰ E,r<4|+qJgbW?slbk/h``YAC\QUΦg=&lOɐe}yT~bws{{̙ڵkϷAì5jT':'gOLV\m*ر]qq}BCkvMny.g\g@Q5ōf4DъCi k4tC 7l"&5kَu$m;u.66S+0HO?bݰ)yi8ې4LRMeB lOɐ:;5r :f{+4zrWLbX6_EC4t-[5lӦE.ssw9C;%suؠQ4rôkaVVS阧4iXSаD#,󓕩^my BWfQָ}ke9y2h2L56,V^*Ǻ!t!< l%-Cj% Zv=gˍi4t6d3vB7VKMXx"z-KoK~צ?h~b:0#pǀ>\k>>5#c#hGw<ӧURyǎdAC?ϓ*(y]|$( iN   =5 ˗'O.#\|vddʕ+hdժlܘĦa:akNN/h(yr)( ƫT49It44m_Á{*!@#P5ן:w֬ *"h&PLr)( !IE÷gn0 pGæڮy7y׋wg Pf wg+[nޭ[' ,@ر I,@exODvQ6圜K'h(yr)( şGJ4'wwEi$X{ȭԬXrx&&x ag*U+l/'E]vjb֔` 5Lѣ3a)U]!װ<9(*kMAYP6l@XX(^S;CACȋ]5nZ/5=IPPel.rYJƥTrXJҜ߹y ԭm5bqLA]-5:wְqVmפɽE4 ;pލ]a{`P/4n߿WxoV9~-4Q5[>UDuk;tt߯|  zDnq.XJ@I)Is~~v4&;8N ]_>;sS]v!mB@gn5< EDv`к os-շC7eXvH`PUKgM X?|m=*h(h-h(M䟟xD4'-J bs;:'Fȯ9J+f,[񕝇T՗>~Y!|ϭP0)uo-GΘ!黺Yz Mk.3Omڣ]xڤ!;D"ĥ혘5^44"4$PH! PթXB퐚*AҺu>ӛװ*%q4m)3Oe旒Puz֣@Rswn"    x)޼7\Yhҹ Y%BCCACAC 'i+QH6JnSjMݛʄ C;83t7! ;FhkB6-Ѧi eK*X |˕УCw/pd[}ǶPhS~E 3 2ͻ#4W]Mm[>gz>o%sU4 ڮUc-\0 y-,Nvgİ쮕cYPǗꧭFcq˛wfߪK[#A6M6옠{pڏ6]ӵ٭]}YLq{7˖.Ա%A6%D۵i7}:}ۢQumɓ{q&(.7s]HĜYb>M: p->=l¦jBJINmB–wFu+-啵;<V0 _կ~ns?A2+F3WC'\5]Z&F~r)Թowaae#u.yA`㽗}FֶYD߄?0a}}+ZN # = '$ ,z`8kٷv rfS:mu/of89Bt6_+sCڛ.Jd x`).?5>fh볌I= #J3w.3B+}aX4(Q'~tF e4Z'Űd6Mfx 6!ۖ OX ne+Z;ofBN~Ǣvc33S=AC[ֶo3l֩^nFv u I8s{g}Z& jkȟkuk?qrv?2GH/PbOٽ3O٬ #s̰eMHߜ=M4,K64 ںuҧG0Kc}#6Z%6 9kZM:i}R/˩SeݿvdDߤ^eҩUٽjdfb6kW+gv;>a[wu m]:%}h <] %.i~j;{H/vm$v = JMȠ (\i ca5Vc7?\޹N0,7Q'}x8cT= u mXDҺvkؽn7 ej2u-hXXZ՚vn\7jńn}ZXc$8 կY>l0{LKZsX[\ u. {a֖M뙠]G70 0 Ì--A'}뭇70 0 Ì-9A'  0 0 Ì!A'}ܪ=+aaai>|bَcaafl{dѴa-0 0 0t {{ }c"t: N@'I$t: N"kN@'IqV6'NzU']H%I$tR4˗TRq^0󟯻o #Gr:3,% u҃>8uԦMf˖Mc_iӒV'=y?sʕtu={Tm/p *ToRP'6Γ)S$y)S2eʌ3FY$?:)itRzT}̙bŊI٣soSN.{B2g;#H+W.cƌ/rrwΙ3gd0 ")cnذ$i辒N2»:#NJSOI/ϟOԹsgɠ~)u=mauR:_?4׮][Ŋ0n8X"nԵF:Q:~-ĹN?)ItW_}QFٛ-[T\n*^̙3unw^ ǔ.]ZjZly ׵k׺Gd^?J[,nQ'OYhfoE{ PkOR{A#)Y,YK"Еv7o<{65hh;ּy9r(mիWW\۷/R_pf͚Y=V?c R~ .D៴~zEUnkUǏWߙOIz44v޽{+Ia39TRN:zr9+d„ *ܹs˖-XIJXFFpB%,XP{47nTHƍM}C-jk6m,YdرjsiGm۪ɬT@?I o t>. w|wUT0I{I }3ydkUV?pa(ҥK'M$ZG5Wn]o߾JNFKBq~rg2BpiL'u$AьgɡjtR~na6~[N;:?Ec-AN ,xo1:#}6aj_ӥl2P /qa QDN:isAGL&ҥuϘ?O;->(- J2W^q'|&OgV*-uIVFWd'/Bj[ud@';{/N8aMϔZE O$}-jRƃyۣٕWw޼y+f' Qw\z0KT%D"d5:Nz9Mɒ%%엩U/O$} IO 6X I4T'aWm"ڦv+*:rgɃXk)i6x5yU|E(EN}ou472*k9NDkR}%Iy$!ݣ'OL[褤I/:G1['iCnڴriV7oZyj4;zP fNRTonЯaVqH$}~"eI|"g1Q~t+ĚijՓd_Gz䒉R6`.E!_r9NrX}e,N2Nr1~zd@']qXXhQ @<- ڬui2ȁM)_4nޞ39mQкukf1 _f9I? u\kO}[t:)MaVj 94"Nt: N@'ƽw7wm9W$p:)+bV'8e} ]߷F}S_6mZ$}$si;ظ/3"T5W.}ҧL2cƌщ_'y҈N7L5ݸqc}ݳe˖ڔBzTIu'|2u=mau>sٿcZt2C}k󴪓_Ցw}7u x`Ν_}/,XPtY2觟~CdO[Xz/bLH(hLr-q<i?iڵRHrEyԨQ@VW/>sL]['ݻWmIҥ3gά&D=['Np$Ɂ>gPieMjRȓ'뮏;ޭh (_|E?I 3:R/TPA_~eԗiPm۶m%K(pر]^ӧOBԕUHC{JBeGK['͑#G.]{=E?I+?5dkE?X2ES~ .$սS'Ǐ+| T'ؙJo o^[p 6x?N'IӣGjsY!&LPTќ9sΝ[l͛B:I kԨѣ.\(G ӧ~zoqFh|Do{*mQ$_{iF2BB2n8}#Z۶mhUTij'PؤڷA:B{ x w'Ai/J,)-o0rCZ~]JJ,X_kl^z% :]USLi׮BԖK9Iy׮]{ݺuST&!!Un]o߾&ɽ_'s.|^[') 5~aHiҥ&MXt(*tRӯ_?CSO=C;| Q[N;:S1vߠiZ' 5V*Ԋ;:ucx"lRCk-[f] e2¡.ԷgWAoK%L*!˗wB:uwY|ٳ׬Y2=oǍgTь3t{֭[E2u G],ҌD=#=W=0ޗ`I 24mTO?z?DN'%V}(D!դWdGgF:Riׄ>LUg7hڢI*'@3RC3o޼ŊT5jx|7w1!CtAheM˗3<1C{}es%.yBCx H^:+=?ɣ@w3(; , #GgNt$z(DuvWϼwՋiuKh\OöUa uƀ1oe1ER=={Tg6w]q}UI6.{XiPyޫW/{?Ќ:Zq{d!V@PzZj5kDqÄM]Ԭ:W ƝI@u(P<&= L# $Nd L4uIytzԤI6{@H/: Z԰|r5g?I2nUVI~ kݟn${ԆiD2fE@7Zȧ'N%>uL'~W_7LPhdlx񢄯ԕe|]B'͚5KUg֭~':֠\ 럤 q]SxfigߠiIORurxJeZ|j>u<裋/v 65J:)d8DF,^D:LgtR,7L(t9quի$;ŁQtIOb޼yX)+%N%˽%_ϐTXnod|빶]a5Mb(eX(T -$u ſN~ݴi'uYm޼YթaдPqkA异F`ր$t]3 JbkUR j<=Z'eI|"k1e QwH%T:[X#JɣN['Ew\@bhѢK  V'G֓h:4Po2Zf]7 exzQh"UV6NE,a\Z>o|tK{: 5ZJGŧѮ?\Nt:)mbJ {^INB': N@'I!u9Z~BRiwZm:)t>KnԴiRcnO|2XNNJv1o6TTc:>:}GgUmOFdO|#h=otR,& ":)e$GSzk~FB_nݻܮ]ty_T`A۬Y^{q^xO>O)2tw}#*lڴw}R+pǎ 9p@nS+O8/*TȒ%˗_~3._nnu:~…96lti,"w{oCǏÈy˖-6 x3gTILxwTXʄYhIw^]rҥ\rlĉAwAu.Pcg T)? [A/F'mOcƌ2e:⋨/ѣϝ;g۶mnݺ'O۷ 7ܠg}־yS̝;J*lժ?`?T6m߸qc%]v Q{Z`ڵonFq5T:cF`Ȗ-K/x503f׿e6/]d .G!}Q:q (j<ʹÇ+Dĉ.]:i$5+VtB(¿Nڵk!}#Տ;Vaեv1aJ͙3Gqʖ-+]ȡ=L&耒>ʊ%K(RӧOwCרQ#|…zʔf~zG~-N02_OtRd~ٳgW~^mM.Ԋ;{n5 )Sw?BJP~qLKgÔO?~;gIQOQdҦ7|cB:ud3I++oI>\VC'}]'eFM~J<tҚ5kSgxNXU?UZQ,YRe^S4hSjTϛȽ 4higը&駟VYfY}< 6뮻h^u=~uԺbŊYM5jԈ(jj/{9K ( :I m۶P\8v4IQ&H鵟œ6Հ&Yӓ8gϞ ,Ti0Qȑ#xx @'E~ŋU<+QիbjT[zqIEU1ի=‡~h>-=^zׅFN0Yz7 j5Xvܩ;CK&F>={)U6Qm߾]{CC3'OT IaK'N,Rܔa;E^;ϵ8Ad=ia >:Ұ~w'SϞ=G8No̙SO;gK<N@'TMHDo%)hdvKNVfà2`z)W1P BfZ-inn:)k?I&鈣{)'.'̴N jj=W_5/7ngVUqw>y*>s}5c[oiEo՚WZ|ŁFyTӟ̌tP:)ԩۿDJ;~iꈲ_Nf[ws,bdwsF8):)|Ç+ΩS._=-?Ft z5_>ͻ=n6tRdIzz}{Ժuk.4Q@^?)c$*z 1bVБ]'Fiw?%}:IjK4\j*,-b-S'M6E._?լfEQQͮ/$K(!'V9;7hGjz}YP\SO>D_irЬ4-\.;`.ųN|e%^yflM;pZeQEuS'Ϯxb)4:._H1U ,[…:Ljqe,k_|{ܳ?sm>[bFwI&ڴ9u=ZL+7JIާO?Ni⾋6C9.#f (fKIV FR'u~nwUC o4!7ݴC)p̘3]#^U 7ܞu=3gW I[Щnqy?s|>t%lf]uk˞}ICOR?ot_*ʵ>*TF ^}哮]4s~Eq_/~2˗v~wW)Q?־?zMwٿO_<\.)U_=',YV}OY)cwsi7ۺj⳿G0t?ϩiȥ޷N7HUܝ{旟5FWкUtsg爓!߿FY?cwnG})wJquRLMt^׮GRig{].hcEx?+g֮y7t4d"MpWW~wNPz|0R`JY)Q`ӶaGY$ɁPlw+Ұa JY:FMԛ_H:tW+βr3z%^FN025.rP6ri%R6zIjct+SĞjvA`'VdOIGWw&PuOOB $xHȑh[o}qn{qM͢~Z:,d65y`Cg73quKxR͢BՐ5JMjd.SiAGv.Rz}LtE7Xy'Iu^D]Кn辰)$9n~7"[>lV[E^m/!u|Xq٭AL}v7zI4)+~2m*muю2ի^ D%`)ܟwG5u[uͣg kzn&^w8wf?K>3IC ? K$-Aw;Ucj@zވ.FRqr,zM[2>k^hs(MijGpv#^a7̝xM6ћPDVXm@ܹoy<Ĩܧd=γgޕÄ#g5O[.~NX3"J~CE]вM_z3v$ɁPlwͭ\oD:g%`SI`jV]ݎ{ {&5t()Ӯaw❙AW:pw1Rr$7̚uQ ^S4lѠ^u7>Molz$)NPﺽ^V=hnd-L=q})PfSNf,_FnRNL.z+7&SbUrb~Q'=uX'̵_X.1iAԮ_j^ 2v|ʣ64_},WSo4Gt'I9|<%%Uiޞk\#gεv䀇pws$?wJ@[TI`jr8ګS9҇+5hj;Byd)y2qsYϡ(;pXSu$Lu(Pl.NR4-n&G{,431,umΜGXCsPV?B'qttpk4Bꖏ425 ǥ1ajo_76:auL 럤9}pkЕz$i绕Bw:T,-gq_53wzOn'I\V6u땋ca}1J % J'oS1=31,5'%ٚ`$il;&z)F|vuRS;2ܽLQcXCȚf&<}cʱN f;>wcfZ| ~PySLFю_v5meC]['^eYr=`iIF8滩 : U͆塓#Z>;31,5'ix^ܒ4BեcQnRGBUCj DO)wr9iwDmș:ƺFu ՂIeFǗFt7ffKk%ؽIN a3M&MkիUJ'h*zE魓YJ&c+%dh/y'IZLkLYI״ unlPGML^NQ$(IԎ]['ٳ/Fӟ+KO'ٗxE':5^uX_cRZ#4h_Uwp=NG'4kڨW,Q- 'ukTeWgY.%N fS,jۤU_D> ä́ ZV&E clgn'I\V$?w qKj96ݷSUv^fzRIMX:I6xzKQaİi¼2eR)Ԙoæ\ 1K)%6J|(LK#A &>5[-)p!9ɺ&U?`(A KIzMI,! a'v1 ?II????S@' I$t: N@'INB': $tI$t: N@'I$@'Nt: I$t: N@'I$tINB': $t: N@'I$tINB': $t: N@'I$t: I$@'Nt: N@'I$t: $tINB': N@'I$t:t: I$@'Nt: N@'I$t: I$@'Nt: N@'I$t: $tINB': N@'I$t: Nt: I$@'N@'I$t: Nt: I$@'N@'I$t: NB': $tINB'I$t: N@'Nt: I$@'I$t: N@'INB': $tI$t: N@'INB': $tI$t: N@'I$@'Nt: I$t: N@'I$tINB': $t: N@'I$rI$@'Nt: I$t: N@'I$@'Nt: I$t: N@'I$tINB':) u' L:I6I I$4: N@'I$t: N@'I$t: N@'I$t: NHv'clѕԔe!36D|{_LTA҃;ӳgI}O6y(Zg_Ò͢k)/&*R遇N:thcI_yKfʘލ7_`fH`)U^G:iOalQcf(tD**=@'őNZX2[:io=%)ãIS^Nʈ㋚,, 7a)U: NH:`f(tD?| .|Eǯ9sOɬKLeN!cƌrXb׮]׭[w%t: Kn!QӔQ$)J/$1iҤxIGݯ yԲeRJdWR{E'dIzufxrZȺ8/&*TgϞ#GӧOǭNk=}پ3"RN 믿/c"L_:iԮ5:w]pL2eRlFM9qJ'=#ꕑ9r䈇N={v ԹsgIVZIeΜy&T 7p9a\t:H-ru;kI$=qQϿ^ E'ŭNʘVȚYz WMTk$ǯ ~E'NzbAI*kvTC<ŋ)ƛnl :)N߷zn۶m(twKiKDV޽{dRlY9l0zj)-Wڵk[:Fn:l"Ebw3\R'NI 6pjz[ʖ'O\=v:)K+wʐZZ(5|(S1NfzpCR\'5"pSȝ̽3\IAu&ڹsgPԫW/mn޼iڴ?_w߾}.*U\ix!ڵK;tȟ?"HI Ves÷oiؿy8 nʤ|%KjQ g_8@>9lޝ֩ä#fΥWwm5޼dQ׭eJ?fޣ9G_Ǣi@'JW ;n9sUs+Oƭ5]tm49KVʫwү]O9r1SUj-|殩PvQb1u/XՑuL%.^Zaw}g"ӉN2a}Ǟ)szM۪:iĔŵRfXuҾ3>N tQ 3='HU0g26oUٸ7i9Gv9Q=~J-[}k[?Rmբ WԢ,Sf͠:I*И7tM{ٳz3I:U:;S@h`5w:=JfZ5:㌻{oIh*G&=FtRNz&{ZS90ȕY]lм[8doM+ר=gjhJ˓_)Ohݥ_-wxRN7yJ9R*VJ #OؓxaES?D')o%ztO&/O3ms$XJثJAJ',s38+I.!NB'lu!Zc8sRݿz[z g響!|F J׫74ݲ_!4#aff5),y59)j|хV-ҘNC-R`ڛ^ dZ13?>kv5"ӕNi޾B4Q\Auh8~5InKOK:iC%zԴYO#kt;Ջ d`%D®l>.ZD^S\r^?άNkHJiO'Iܘtunv< qj_'[No`EŭY`k5+QPzsUS'M'i)6j+ġ ,qˢ;f|3N2K HjIOcL.:Wwt_4?aMSwiwKKIKru0s $Au-}fM}e^aOͧN/W^WOf_4O}p 49\AWK:Iivg ٨i]e_.ZhG+CHOXtLf#w^-ɣ#-Qw25XdMdzIns$I27fjڦ[]ڬ߬Nir%mox2d~I+25L%UzwK2[]X?6{̮fK!4AՌ|sghذ;Gl52eĝw.,]Ƿ.NI$ D.tCq|(mK?M8|Rf-Y?f7ovZNI$ DuRxIqOLgΜC܏6o^r /[6u0t:bB'aT'y -NJ\ cH]]Odnۺukk%CVK'9V֒N4kB]NȲe_N,]Q+tNB'"t]8RV'YLh޼֙K&L\\u&j|wݵšVV+:SöjHLWOJ-X0!δ,:隘ZV褔5nм#: tntRڨTIlܸqٳdRV-[qG$wK5ݢEڵfϞ,~CnIZ!itUz;"g-0vI%](Z?IqҋNbݹi}$tR,:I]v'I$t:I5J ˛7СC'LP|ի?IQyȬ-IN]Z{iN'i߾yvٷn ˔F}aW.Mp]ZbvӦͭeˢh-u҂'.2)_u=™n֒ҳ5w2dqVVj,[,UԱ0@bR`Y𣓂^B:I&/ʐzKIFps2U Q$w6zd)u^)fzv;AzLoʜ;9)!U\e$շ ׂLHoԫkBju<+{bnʜx }̫&P2H!LWnatv:m:l:Md=>݆Tر.P~msE/b$x<)@'őNRWn>+aS'eɕk9WЭg>a7U:=nt(F *QēwTѨˑ?U M?u\ofԫ-Qbo֮GO_fTӨIMFgsDmjƧNr_B:I;?/Tt;CK6)|[}n*w7oжWuj0+ʊH'kXSo΂h(Щ:JUr n}1:ϔ":)CTҔNKI`S'Wq+xL4#ʗzn#I&v[|WqAI}W-O͎3vTVCGnPhv'OܗNtzt$Il ^\80}݋8-YV#?J'"I)^%RzsIm=z2g̘QZ̙3Yo>hO tQSBV@W'o13W|{'&.|KIV'O}w⍁$Ď7]'IҰ悸;FwNSI*8IVYr9uIqoV|79Bi;n^zkBkՋ*YG4\9mFS8sҚVqQ~tFP urjRr($tsM;\3,SZؔ]=McI1ׂL[y,T6mf}"|7i"m:hb<]JuێtCƹ+w9'[N^RU46*WNSI*I/bm>}Z=IRwKIizn,4IAHylGY4=U@+b$3o1$kZV 4Uڶn>rx1#U_}5n:r+'Q}'y,bs[vJM?3 7$SWA`Lm:IEK:+T/Dl7{kd!O;@QcC($4i~#JYb)zcI Bl"Kl$٨i9c@O&7tRD7I*^?)\ՠ_S5EKZ|F7eNSIjz/^\nIw`yY/^wpIq-/6zܡTZ΂t9VǵjmsM~YdV@eKeuWg_:ǭ UkY:z^<3ak9-L:)*Ԋ8jh"#ʚ n>v=BEKj2Tq[$[@ƭY[e֯ZH~Fl#CV̛LE@Z +R&Iq{WY꫖w`fLƌ_zy :<*IZ[͓'|J.=q?rw +IiV'7nU`Q[:7VJ/?j?)N-I4b*ם}$tNB'mJqҎڳC6NG}K6SG(/&*=t5J$I:LZYi)t^|,LN⿘Iz]" N®NҫW>Œ͔Q$)JI$4o͔Q$)JNB'EVehX2[:I/;,LN⿘ғ񯓌XTf?tKf?)UtTbJ{D}KEI:)uԓal$k.liK1bҋJߩ Q$R)$:IŒ٢+)j䱨/)*(TzIit: N@'I$t: NB'I$t@$pI/=,iaa":yNzt:aaXJ鐭&複Y6w$1-aa:$?1jd4IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/bank/images/search.png000066400000000000000000000726761506652756400241770ustar00rootroot00000000000000PNG  IHDRiN-iCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N}ꮷ| ?L&ݿrKm~2LVv)>++d2eXj཭7d2Y ؝7^hI۷!;/M*litaׯA6nwԡCxۂ jYK&Yj{Ɋ.8w")i]epi[;5!nFlA]kYQ 'Xj/+^;T/Nf=;eJx+ u9C/yHS:C.sچ.`ΔOtSyNutGVz8KmO=$]˶?X26nd L9C%:ևr`M;Wړ y9d6=^>j_V^˻]tx0/ lX7CC{tjv͚6ͷ^fߍrf Z~yx眙֞p̑;j#ĻʊV9RWgY_Vebͽ0sw]Ț)'vj˺ujXSg̰S(o}9h M=1֧\`^;_{_xײs]aN`|̑S_=?=W晣UZ֭{p&ƛ&%m9$k8/uNpTn_YY}k2-ee3[?恁Ւ^<ʇ?n /Wr3 S;ĺ+]31]WLij쀻Mi\֠NKさ 0]fP"J\:nvNCF5 3*n^ucO?מ;r=\WVvӌ-oh2[ uzr6wās.:Owj'w8WXO6r)SĶ'ԲEӻoٶ 7LXYqOq:\S&p1K1O"Qmg3=y`Q3.:ݔ0u++Ra*j^y_lul`D-[;$sǟѝt[ցwƀIޔܾ`)]UvynSNh)1[H8Ʌڿqs8?]1,$ |+3=C`Q;7"EӆWQ~ie~eVKzQf 4'i /]wyvgȭ[qH#++R*jd#^3J/{l2xt>˽.xIgcMAVN66У#^uav 6v9IϪUs,/W:Z:&aǶoC;)Cn+?́78 WNf(;ϻ`ԩ r^3fʇ;c-]4he1++Rӫurg^eTKF?>;cTtyS:#Z.5VdN6dug/q|6Vq֩a[纋ƍC7sˍͺxPz.}n1++Ruﭾa>l`&Q-&~ύ;,: v/-[n\GMdCm/2m۶{)9sKm|9,Z^zQJ&L` O9pjkԨݶmִi̦.\PLQ>"j+/j>u1 {e(A~\~k֬cΔԭ[{NMIn,[v_=)7ݴ,jo_y4p\862Ϙ1Ô4nucJƌx"Dmo 3[g5ӦM7/l*XjL W~}S]{_fpg;1S~dӦ{&NFIve_mt)Ŷon~}7΍7h*\{"bF򚨭\mLHξ-Yr>{=]nĉ̙kyS\!mР?m-YdI wꫯ4uС"k 5Q[Pֵk7E7 5Cs>j9L[تQpҤ gAm@fVHqn}ˮ-7o֭ێޭ_Q{30l0Ei,#𚨭ͺ]?ڎ>Z^v@z;쳏Z% He/*%T8;Cǀi*j; 0qBif5Q[QfzUeR솛2 h@ smΔwq̘\\s]Z+񩍳իWՎ!/~7|G?" mYЪU+-Km͚5b\|Ί%L k׌o QMVjԶnVm ;o<7n܄58K.meQrúDÆ:v<6lyjn;ذrGs=[vNJ9\ ĵ0`򗿈,DmR)@LfOjyQMԶ3gs|DmMV|6uUv-K, 6YP^YA&2RjQ*PMEm6S*$E>b}|DmjơNV d2M&Dm2L&jd2QL&d2L&Dm6L&jd2QL&d2L&Dm6L&jd2Q[Y $1d5JmGqet& h#Fzny!0h-Z9̻֩6#S,Vz=+ѣ&puܰ.IjsJG6{Ĉ3zwyWS[ӦM9+vòۊʙMDm ѕ+W[[l5k{ZƍKmZ8tqAkxC=,;1 ۚ믟o gΜөӱ7aʻ{wmxhk.B /lƅN8Dۼ@l^ [w> 6W}'_~s3}hSe]_rx?zj۵sS^]wݍzo}u]qWڵؤ|;ݼiY~㖉ڪڠ'ScW֭[7z-sEɇ8)3F:;pj}}mcn ^Zڸ-΅8̦vxLLjh[.Y 6_-mwV33jYԖ6YAP2qd|SjBG a {oYgg9ʔydٳǖ,1\N;lkK8kx /J* ;so۶)ʤ!Q߸? aÆtzͱg8\E Yj^jCm 4w ,]۷ooJu;eٲ[h M7-DLVxaVYk824?1뤲O͝u87kԨ1f''2mզ]Xyjv!ܢ͛_}5L83S̸Z! 2%=}1Х]dto fM16Y!ymذԙ={)db\`)d&f\M~Y1S{S-2@v#GSj#m\4:2fi%jcӌ)ڵ)2%fsNv| b `Ѣo`JXCm?cɍ%ȁ;̅LϘ1˸fI~aJ =N3\Opذ܎+5b$1aHm MĉB)9 *j~܍=2Im! h~f:gclƩS9f$ѳfͩrZ ̸fFmdNEm8V2 90j=n,6ol,~駾>38AЌ3<󪫮:ts?n@~HSnoskO$oe8~;Q-wj/~QZ|?xĬ????rpgӯ7|G* >}zf=\Mkժ:9kEB b>bĈNОHjQ[!SBqPەW^I[ݖ}ݔw}1+XP믿oo`m8Cxs.]|q>˜}7dʀtĉ>j&%O?4};< 6 5O>$/WXfA<2ݫO Q?@fV{Lho?Lqo^`aK/ n);we/2DƳ>Hm#EmC)j;Sy BjNvo߾}{ի08a>ӇA7dRرcyDy[likN;?8wx2 n#^n,}X`S~O>#<<կV0{ p%%4෿-'x<ѷo_;ҥ 5v<Hmp=?OɪUKNX&0qRii s#Y4Qw-Pȱ﨣u:~z q-Zp *K3gćTY?70 o¼̤6*GْoR?pY̛,;0]ť ܹs)7T o?ۣn_%펐eז lK#]θ?.T^zꙑQ v̀7J&0C1D!Te(RoLXٰ qoi/j} f6330m4ԖCw[!޽;L+Y!jK +l`ɝΧL^s5Uᬳ]v{P(z= #O1oʕ+93<:묷w %ld6û8Yg ۄ`dj-qTQQbt:u/_rPvf&D`%[r=P„Q S[mN6ycy;s 2!Phܸqc%Jܽ,nTfH}?Ɂ$:y EHvG(;j3+,0yU[ؽJ=!&f `K׿;,=3X*u̾vZ_>׈y<,PrڙŇl8$`*|Dc9%BG$68w])c͔ovHvGȍn8FBF0+v2oU馛XgAͬή#+o'.uXVDRG7n̾`p6i-dO6sDR{7rHp?_ Sf@ G/P[{Qe/qZ4-7Wb_![vvGH kO!&AQRQ jDm6ADm6ADm 6‹ jW,/]zb  uZ3<[i("});ٗ.DV K )oM0ψ"#,}' ٗ}Bd "mѢE"j#^2MI%Y^Mj"IDmD!HDyeS<eEm}&j#;M@ȝj@mdS"I: A"em%lREm}I*") x'52Ԇh*&A^[ɾHm,& :K#@jN ٗr}IȈI~> 2_&n"j}FNpjN ٗr}I Ve^KzQm^z.ʦH'EKɾOmEl$fޗV:mӦMz.j˖-]j MNPv}Ӆ Gk׮wF̕DM3|"(ag("M/q^N H@qt.XFKm^ltReA j j j jA j ^(:LIGK[G/(BE{bD?CHaB/ꪫlj¤p6iHE/uATnR7zEV5Xr֬YD}9yj&XS&mɾHOm֭ ,QF|t9f̘_&mɾHOmk׮%< m©><{Ǐ'h)|OҔA%0[; ,7k֌?ܹ-[rȬ#F씏]vM4d=#nJw)mɾH%.gA)R̯ Pn,^ߙ 6̂ !7'\(* H͘[51d>& Lvʥ6~WȌ_0`_ׯ_QQសt&dvQqO/ٺp'B6l`/(-j8C3vmb@j#%O.9JVZ$6m4[v;e7 (+/yLS0;!mQd_r邙)ݛ$q-y)A=+鞄GR#{g")\&&֍жmfz-ޅ><'rl֑&ٗcΎ)jk3y% X6ߪU0!Wa>.cRKXN LG0{e32ۗAw5biHE/]`@v7u֌3 ؜S`[Ljs9eKJ;/"j";e*?sg|1N@i$;1OLM$ϛ$:G1:[N8R~|Pڨ0qMBp͓K.0Db-ʍ!w} I0nܸ|T{gL+W7̀>-98 Hՙ9ۻfUآE v2ꥭ#ɾK")ȑ#bㅝy.eDÁse&FCmѣt>5n QvK@tml4iɁ/"jSIӘ7WaZLi"X#ɾDt-/iذ!Π1&DO?%P@ {)ܨ {耧 "ƈKY(x6!FF#+$63fBC\'W:6+L!%9~WЇ.jDm3 \DmByQS_gAq<2AIDewבQP~ 3ȤS]̓FMV`+Yt' j j j NQWT/&F+k}|0 @1ـTn¶m&L@V2v{r={@Q j+AIȦ=g¶ayeh}?(_BIK@>΁8#6 j˖k9GNȗwe*$<}{,a2BK%Qd_/.4byyxȼVj l@ɾOP]'RBLqNX@riHj Q` jK^sT&9iȼEXիg ڲ56&!],#/ڀPޥ-W.(_BIK*U$6]veLH| d j싗TūܯvFU^h iQ[H Y }!;+{wY5+!RVJ9Ct-M/^RuNjk˜C;RNH^9OٗOm8*aA쨜FwSH2cdwjŧKmDm}ʾ=?wFD~\[/q {2{$H~}J4(-@fQ{bڵkX`3ҥK6ɾxIe_86pṠ»˾َZ|W)7E4leh Xa6J/!ڔCQMQMQ MQMQMQM$ JZd τIsʈ}%@Y OUbfwЁDF6n$x ҟ Emd_b}!Ş~rkhu/첥K¤p +2Y!9rQ%I$_bpX(j$W}M~g.\Hi0k,J^d8Ԇ"HsMMF#@@iE(@"+$6жm[_R>7 Oiq}#qRRR2bFIl7VIūyΝ; 'GHZzWb߲e ХK3fj a= DV2J ,5pEJ|@W$ӳ-jK-˾x[nMxZxs,k <]Im !M*MÇM[aÆ=A+jcIw_;@ fkeO1teotzLXdڐ:f'hT ifL A&&e_\K&Sojd6{QIIvߜ͜g?ֳ-jKmʾxZ~ @qʷj՗^˗gR3 Z&l1C ٗ}q6{챙o˾D6-Txꩧ!s̡dŊ1+$6$_vY;d2q~LW6Gl~HI d_& @48%lۈ 6(5| nl۶p7?̯vWK֯_E~g }3RNQF-YO0ճ-jKAȾ s8Ps>`ڴiS´i*AX`׷}-)AW6nܸ}VFݪffnمݦN s]հ*?^ jSADm6ADm6ADm6ADm EJm,yA_1uj:!1nNƼJym k+MJQƅܾ}b|P ^[ Ⱦw}$Blg%$M>h  -I-PeFVk^[ ȾR#S)SL۱cG*ԖM%ĴDF.[.$ʌ'Yym}Y{ϟ!M6y|քS9MLޤMDmTf$+#vҐ}֭{AR[¤u&O쥑@N['\%7i֬,uQ[deI%wٗ͛7W_}ҙ3gOr[7P_|)\%^|E$>r>uS6k+ed_Xs= )C[D^[WK 1|fn/Lq!j6ɾ BJ[yҘ-z'B1/fDzF jZ^!- K߄p |66qDW5&jcKT&\O٥@kK/~+fL  $Mșb_Q1L5qY&jc /-[t-PeF2j-d_xؠ˓ ^ĿC!Mș_B6@H SQȍy`yL7HDXj T6ɾ.4a7$lrR}&e7K]YD7@n5me6eA^ M^ A&m /E+A䵉AڄC1eDm}JQ%N ȶj*7zM2Z6ɾ"['(jQ%MF%JM26ɾKd Z|N?DmҗI%ݛ9<ĊLؾI&:᫤J7I))WR ԭ#q/Cd[PBROj^LҗItd_0JJ$2xD̙C:Ͽ0jkݺuϞ=W\t!Gn&]ˈj$M¤|L. y9Hf_~|\bV`B1–@a5Q+vbڵ|Ő W26ɾKơ6ZUbݺu )a0><bm,[SBFu[̽&Bu#Pڋ!7eDmeᵕKH εpJ$71h 6J}l9M?dlժULeDm})ٗ&6K&2$0JNCm[-,CX pH1ˈ bT/߄-|Jmag4?=~!RWn&]ˈ$R /-LJm}S{\w6 Y-b̈́+}Q[G#H%D+F b0`0{66Hʪ((h^ w/#jK)ȾD0.K[X^cAl"Om,w@Pr{r3J_FԦ Dm Dm ADm Dm Dm Dm'AI% W rf͚-(]:1kޒފ jK/\("{h!lͧSQE1ڷo_oD#U"ڤ"HE/@_֟*y~'6 1$L>&A/}IGeĉTȖk$j{X8D8ZOڤ"HE/- o 1s-\ż 0<㼪|<@jފ}&NiC<\RY"L)M`6 IoE'ٗoR]`3^WE(_u֬YXYš6$XWELY2s[nIm[$"ٗni@Hvܨ7OHhHm[$"ٗ`[6 >^N֫IoEd_v+N!by7ӥ6@!Vd/Ejފ ɾT8XtФI*pH>b}٨͇Mz+d_<ɾhqp٨4͓֩ފ Dm Dm Dm Dm AAf[JCE:56ɾԨ a |q=  H~0ٳg]@:56ɾqПI`L7t%i%<^Y"Uj^z( HPKCu%ݙ- AWEU@¡6i$R]/&Hӗ#gՕugb0ɆC [:o.4 3@&M/^/|)^e7J31[ L?UX]uU3gB+6J" iڔ@<}4ɀ'ӗC<Օug0$Pw '駟Tu!=ȼ(ՕD(dIK]LG !7x+D0l,b mq1"U]\0C ٳgv"&@&M^W/av>OՕTtg[BFd_ InY4NOAI5P"j싗 qF/ Օtg00eTuce } I©-4YDm}ҕ}ֳUWCwman`w 1U]pZ}sF HiHE&/Es2/⩮);H[70Ncc0Fvg"eD(dI%Mٗ}T0![ٖEbK);}`̯>C.7duv)Sߘ-BTWiHE&ٗ4e_c;bB@my$m[n<<Ü]i<HUH^kԨsǷ6/Tu%4YDm!xJ+DmMDm jA& jA&jA&jbMpcKSrcxpDm/UE <)˒g"X/Dv%)@Ei}e@0&. iH4D.YۇЋ!˒g"X/$r/HEK-˾Fd$EIeY6 ikX,Zŧ6i}5%iK$˒K|NWŌjaD^U`;lذa4\ɾ 9y|I M(˒K8U 3Gu %3G ^̦" A KcѠ,##rxee?x8UqUY0U H"Hd_x93y~$Sn[%ٗ>V LN߰aa'IEVk/伵sm&hzeYkGňJ}^Uf`yR4\ɾԚ Krր'92/WYtg1E#6RH~㚡6i${a3a*˒L>+9 ;C*p$RX/<`̲#J9! ƔeS%-1/ozPF2B4\ɾ M(DguRzqqǡ+œeS%-m66O(" A/^Aɾxr<ɨSɓ' ,yʾDe_[EEKyeREQE.2 j j j j jA j e)ň$╘싋͛7 1 Kk׺Çp…nIj;#jWV/WDǧ6OBvY k.Qd_}!=7&蠏I!qFÄ_Q"S6)ň$╕ Y$q͗F.6 v2qiHCrŊ^ZZǝDФ"r ~4lu+̈́,B'y ?RM/^ʾSXm_},' csϙ3tn}װ@ Iba[[H6$zʎAWF@%&Q 9xYȁH&&a|jMĎ@t"eǵbRN{SH$[¬"w۳gFI)Fd_<{)6!Om,l߾K2ΝKZd܁2H`%I]%6&%,R+|t#jV/lb ÚXeo|FF/?<& '4g@.V]Lrҥjn-H)F&|d_p[C*lXXr%<3XgAAX`C䣤2|PCa\p3-4RpbDm}Glm`cǎǍgKMm NorhAQbDm})n&,RmݺuAL~mzʂ(0dZ0v8W,(jRL Pqj}JRŇǖc/#l 6w++6c"cLI)a]TWz/Pŋ9 5,D!5X9eO <)9!Bqxm jA&jA&jA& jA&jA&j<6ɾ >mضmVU.D"7lV&$RӲ/3b|& /1K9u%To%g)Cm}>^ //fHdR~}M\tn j+\jK/9FM[2aʿKUW%B4\B;M bbsP HM4O 6Dm}JUŢsΌ.J$%D4M әOOcrR 6̑&v2q]3M/^Iʾxduƌ; F~ nmd<'' L M69M~ A&d_2G[nyu5$=wWZUJgc@/ L /ǹ jK ʾD+^ka`I`T` [쏮:j%Qd_}vR֭[gk3=rP 66&M/^ɾdr+Ue.>Y! /!$╘;kn8~^F|s7,#/!$╪VX׈=l@K]FA™BXQ*?ZT`R[%Qd_R}AÍ{(!AP24/leh)~ AԦ Dm Dm ADm Dm Dm DmiE<$ j+q"f LyTM/xq93'!,fT &->|8 .t 'Md&Ej lMV/FYd_םх90/N'yLիp7 *pBMl[ضm[c68L` Em}1Զnݺ> ?Lj?XEjD)_~o,7U u,j싡6KpLK(E/I̛(p'yd*a;Z0$vsR$mq.&#e/2XgdKZKIbЯpD6MI[ImW[q#$R/ڨcSfCy5(%ԝ1ta LB\$WHU;|ǜ 7gҥ8\ ۽J1PO*A̫en] rIⓛ iw8^6 >*hӐ/ǜ$KI~xf͚D>/_ܫ^rݙ >us S 8is+{8IH̾ORfOa|j׎@thǧ qS=0+eTq-S}]ūTH`ɲry1L e wAҰaC(>zGʼL*P`gVo`^ɹ4w\??! qSgw_;04C<%e_,(@_~tg,?vy;+Ɖ^Favf/@{wR#J4t/qXHx3)i GL A/$₍i[1ٗug}a,fQ[lQ@`-buԱcFj_=3gNQ .!|-3=t q })hH=f- ~r8 52Ok;vh:`8Ɯ&h-ǎ7Ζ#Kvu :jK,?-$Q[ȾOqt]snٗHݙpԌaYm3SLcŧ6_;Q70]u1`o7V$9o'V<8ܭ*[@jˡ>j3{D|;Hiɾx"2`vRΦ#GB1L e_"ug"1cff91cb2Ŷm8 C9n_5)Q=Mm&kٕŨLxc>pےm͛M!-ϙrha8QxyK,aɘ(.EW8/ upM!^y}ԝI1wÉ2hڴ)^]&k\$1O7n~%d3ll`Qܲk4*8kiMDm90s< M:9nq0 CQMQMQMQMQ MQM(](筨M/^6J;QI>LNǫ)/Jwƫ#3.YO\:7EZ[m3HJmZ3e_H 3eʔy5M/`}tgWA a cX AQ >۟3݈ j+Y!mx: }ԝ x*$BOmp2 ]{{}ԝ1nF9x632rPT%ВpKY\fW o9?B\`V=@2KrPvFn њt\d_M'[iN*fd_"ugx,)'aAgt64 Eh04&9s>؁!,ۄKd8~"%PI8%Ҟڲ)HEVF/<{&;Ƥp[}ԝ>7B/oE2й)>SPKm8e^F>f>ܞ={.2Q[[Dme$bҁ1bt̙Acޫٗ83<+G Y`.MHNhVBxe1__Sf6n((7C O~d4J$"j+#p,fMyaf1Fd_"ugAI7Z*dZ[Q%h/#q|",fҭf&jIsm&Q[yɾe>  |'xSY%Rw?edgHD% V%/.O\LDmP[Dm%mIjD%RwI*Vo¶mȰFr?.jDm}ɥ$eǟMx饗ZȤDNM &T\rI5}q%ӆ{+})/"LsAs#R~}ܼIsn~ZHKFIe_|0)h4N&m×_~&>!E%y6%㈉A7 5u;yt  jWt/>tܙc`vܨM6*glLΤեԕ|,7 9R[IL:H3 jWt/.1c*7jcm$-ȼPdY*06m4oL$69U%Qd_}zU`A /Pq.!$R|/>d+b5ymdMB<@js]c]uK6ɾxE'9[4Es H+dk3*̵S[*01fsy_BI+:ߤ~us p%G^UY\TDB2 A&)_BI+:;) C QYUwPd)$d!~ A&e_+my 蘖 &!GzO/(8l`E #~ A&e_Kkt3y"Bf;.kQ9h8q"22T`R[%Q2 j j jA j j j7yIH9Ad_+"-d2 .t 'Md&Ej{7H* }Kt/T Hmۖ^[|U~8Emd_$K >P߯ tMxUp%1->Dmd_$˾ĬhKFjX'| 7?L7Z#s$#n#e/2 g 6g='|DL6 jWڲ/1+la:F56eX NL>';Ikrga%dlT"5N&e_6A&Te_Tr~IpQM߾}h.]XSCmi(iAy@J{`FWxQd_}S! @*qiLA&ٗ} dgy~6yU)YO  |R#3XdUTT֩S# 3?X jW/B$/ƍgˑb%ym]r6GNj^qRƳG}vQd_2} !ЂGWڊV# 68{QMc͔ov=""}Dm})5ٗ8A/և~h  ,gj\a b@ hQ3%g2űb[d <(CId_Th$b.:~~"3N2GdJ=jڴ϶ev:u*?!8e:M?AAA AAAJJx+$Kd"+fnr@m2. ٗ}Bd<`mСߓR[`&AKɾDv!B 0Ff*RQ jKLԖsQ =ͻMœn ٗr}Irn68Q[6J ^v/S[ \FV"j6 n ٗ}ɟl6w@:M-}Iڒ6 Ź@jn ٗr}jKԀD pjn ٗr}jKԀDx=.Km2.m$Rv/S[dRM6Ay۲eKe\"He_"^!)R4ݠA&q@KCC˥@})Gٗ.Wl@s npO<#ַd)"A?ADm Dm Dm Dm ADm DmB1 ۾}nM/9ʾԺJd"^xڋO05kد qе6mE3gI / jDmE)R+}Db(%"4m۶WbP>ŧC'ᓚ0a¢6AV|/G@X V!_#\~a1Nm)Dme'R+h1qD*6I>Y3DŐG[ >s!c4`fF饗^ȗ/:welE~) C IЮ];R]i  l!ֈ#SK#B;C YͦEV H-8#Q8VGJhО)?]Q{N:qs/^ LwcW^=Ct7P03I"@ x[ؼysR!OV>H= j+)ٗZW]GȀ˽{DVRq7D ֯ n1AJ%.|ܸHgϞ|K)>L,N  M*s8nc9MfK j+2ٗZW]G1Ru&,mݛ,n!,Ky1[ qy}8MSf%S'c6g~iJ-{+6g9^<{[8{NAVR/;)U >*Q~}Vt!xsv%L)@g jѐ{6V)154^FdpҶН u)JMUWlܸ1 .ZnPo| OP[tK暦O?Gmh \t(>lL r #ζ~NAVj/ oenLTTa-R%7j;vd^?& eHI5Dme-R+/}ooƬheѷ͘sh-\%)$4_~`hl:ICl(%;-#Dm.Rݪ+}۷/;98?;'դI*pH `jcHȩbmr1cxUB[R5TcI̙cжmh0W痆m]UW"-Q8QݳY!>s!=ܓf~'|ҭ"ݒp-ٯKLYz=w\[vcǝXڔCQMQMQ MQMQMQD82ePItd_\v4+[F)R2c|`Km%;[nMyQA&ٗڗ} CH8AZ6`TӥhLj#4½6)EQd_ HRҗ P[QRiM&d_\a<ˀԼBW"B0dVL>lF.p+ȯS[!l2+1Tb'/BlrDԖDm}5R04WʁBW©-LJi6o+ehxGQd_Z}aWƧpj#"wR0HmDm}jEˑR[J Yd>r`~Rk hdGQd_}ϲ`r='l+!Ԗ/c&vJI GmA&e_7 0&WI`|XD6sLWUХ̋FvDIūyJ>l)\˯S[R! ˷~;}m6mWd/A&ٗڑ}vŜk _ B0>jc=a.WP9gjWu.Bpfa,^4#M/#˯DnM$)//AZ[v4p{G}K: jSADm 6ADm6ADm6ADm6ADm6ADmIWEIe_ʀyb@IOUjJW[uRiӆDr$G]&d_HA"Dp i׮]O媺 + 6ɾK֭} ӨR66dZjMu Ra rQd_JSeȐ!Txꩧ!,MR^ )R; ޵Ԗ0Ǿe*bn^Dm}Q*p n#WR6RS`0vXr"M[U`P;xbJlD3M/^qɾBmF0iF &ٳgvL:ubКY9\&ɞ -+TbFId_c-j׿6/Ƙ~8ֹcmp۷o; QCm%Δ4I%fQd_L:Y3 !S|v0+3]vi_bEEE*)vxF(i6^+\jSWQmڴ!eSHHSқg}I7o6 <__ҥ !oPIT Oyp-OJ89a%|Aȳ yʾG2{gfHIl?F >h*_S&tKȡC7$#2B&(/㏓ў?$E`mS%>I5(s6_C7ª/j52M+E#bA'\!OٗTHsǀtĉSx)Y‰nrA.}Yfۺu+ImM l'Q[aʾXmy1oC/)H}ԖM΅/ Y_|Q~}RW'd>PIlDO"2L 9S[mS%>"3F{P[KМ/4/ 0MڲG"2Fmš6(B+hY8H ^rٗ)*≘)R[߾}yEEK [B:$!w矧Hm ,QI6?*3{%{^BٗHmFUᵙH&2mO72[EW\Msm푈L aw TQ Buּ6L&ud2QL&d2L&d6L&d2QM&d2L&d6L&d2QM&d2L&d6L&deed%Hm+M&+YjC;6ĩ M&V>&M&&M&k&k;!PWkd|u}v?8q~PX&M&a\s{ Gn}ܳS~6LV^~ýc'˖]wkdE ;vX vf=w9?}k9zT^{q_z[nu'իoo}6LvM_[fA|jknǝqƀ͛g22;v8|{VIػwѣ+N9}d6CihKcxy55k|?zsL%dԼnρGyh"jg;[aܸTsnegRE1ǁÆ&M&զ׆'ɭE!O0L\39N6geU݂dޜ6L\[cs.GGm3f\Dȑowؚi5gԨAvd$%Kkdizm M0Lk@ڭm@IKƪԾ6LV^]喳Kkc ^{iBXf ꞇ]v޺u8,&RF>}2;ԩh}#ƒ٢naz??- ǝxbG+׽{g-opFÇcXU^L&K'f׌MgPC.tn=ܝ}M6? kF ũ8!Dʃon ÕUd25Fd2k&kS6QL&M^L&&M&k&kkdR/Em2YSFEm2YeD7J&}!jdem6L&jd2QL&d2L&d6L&jd2QL&=O~_d2YAmTo~+dEdׄ RIE`792 ^¨Ͱd2XpAJ Gm,ݳd2U[j{'I8[Zdc)RǍם0A]S1Ζ֩d2YXԡ6AJ8UIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/bank/search.html000066400000000000000000000025351506652756400230750ustar00rootroot00000000000000 Yoshimi User Manual ~ Search

    Search

    Instrument Search

    This is a very simple window giving you access to the entire bank structure in order to find all the instruments of a given type. The menu at the top gives you a list of all the ones recognised, and then you simply click on the one you want.

    At the same time as showing the actual instrument names, you see the MIDI values for the bank root, bank and program number. Therefore you not only know where it came from, but can use these values in your MIDI project to call up the same instrument.

    Bear in mind you may see duplicate names. They may be actual duplicates, but may be slightly different, or just happen to have the same name. divider Next (Parts and Channels) Back to Banks yoshimi-2.3.5.1/doc/yoshimi_user_guide/basic_example_page/000077500000000000000000000000001506652756400236125ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/basic_example_page/example.html000066400000000000000000000017371506652756400261430ustar00rootroot00000000000000 Yoshimi User Manual ~ Exanple

    Example Title

    TEXT

    TEXT

    Note
     This is the way to place indented notes.
    Something that needs to be explained ?? here!

    TEXT

    divider

    ..

    Back to middle
    Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/cc_nrpn.html000066400000000000000000000407651506652756400223460ustar00rootroot00000000000000 Yoshimi User Manual ~ MIDI CCs and NRPNs

    MIDI CCs and NRPNs

    CCs (Continuous Controllers) directly supported by Yoshimi

    Unless stated otherwise, LSB range is 0 to 127.

    CC Function Notes
    0 Bank Change MSB (bank root, interchangeable with CC 32)
    1 Mod Wheel
    2 Breath
    6 NRPN data MSB
    7 Volume
    10 Panning
    11 Expression
    32 Bank Change LSB (bank, interchangeable with CC 0)
    38 NRPN data LSB
    64 Sustain Pedal
    65 Portamento
    68 Legato Pedal
    71 Filter Q
    74 Filter Cutoff
    75 Bandwidth
    76 FM Amplitude
    77 Resonance Center Frequency
    78 Resonance Bandwidth
    96 NRPN Data Increment
    97 NRPN Data Decrement
    98 NRPN LSB
    99 NRPN MSB
    120 All Sound Off
    121 Reset All Controllers
    123  All Notes Off
    124  Omni Mode Off
    125  Omni Mode On
    Back to top

    Extended CCs

    The following channel mode messages are internally translated so that they can be MIDI learned. They will appear to have the following numbers.

    CC Function
    128 Pitch Bend
    129 Channel Pressure
    130  Key Pressure

    NRPNs (Non Registered Parameter Numbers) directly supported by Yoshimi

    Unless stated otherwise, Data LSB range is 0 to 127.

    NRPN MSB  NRPN LSB  Function
    4 0 - 3 System Effect Number
    8 0 - 7 Insertion Effect Number
    64 0 Direct Part Control
    64 1 Vector Control
    64 2 System Settings
    96 0 Load Instrument From History
    96 1 Load Patchset From History
    96 2 Load Scale From History
    96 3 Load State From History
    96 4 Load Vector From History
    96 5 Load MIDI Learn List From History

    The following don't currently use data bytes. Some sequencers allow them to be omitted.

    NRPN MSB  NRPN LSB  Function
    65 0 Solo Disabled
    65 1 Solo Row type
    65 2 Solo Column type
    65 3 Solo Loop type
    65 4 Solo Two Way type
    65 5 Solo Channel type
    66 0 - 119 Solo type's controller
    68 68 Normal shutdown, exit 0
    68 69 Fast shutdown, exit 16 (does not check or save settings)

    NRPN Data Values

    System / Insertion Effects

    If Data MSB bit 6 is set (MSB >= 64) then LSB decides the effect type:

    0 - Off
    1 - Reverb
    2 - Echo
    3 - Chorus
    4 - Phaser
    5 - AlienWah
    6 - Distortion
    7 - EQ
    8 - DynFilter
    This must be done before making a parameter change (unless already set).

    For System effects, if Data MSB bit 5 is also set (MSB >= 96) then it sends the designated system effect to system effect 2 - 4, represented by MSB 96 to 98. The actual range depends on which effect you are sending from. You can't send one to itself, or a lower numbered one. LSB then sets the amount of the effect to pass on.

    For Insertion effects, if Data MSB bit 5 is also set (MSB >= 96) then LSB decides the part that the effect will be sent to:
    0 to highest active part.
    126 - Master Output
    127 - Off
    This must be done before making a parameter change to insertion effects (unless already set).

    Otherwise Data MSB decides which parameter of the currently selected effect will be changed and Data LSB sets the actual value. This will be in the range 0 - 127 unless noted otherwise.

    The parameters for each effect type are as follows:

    Reverb
    0 - Volume or Dry/Wet
    1 - Pan
    2 - Reverb Time
    3 - Initial Delay
    4 - Initial Delay Feedback
    5 - reserved
    6 - reserved
    7 - Low Pass
    8 - High Pass
    9 - High Frequency Damping (64 - 127) 64 = no damping
    10 - Reverb Type (0 - 2) Random/Freeverb/Bandwidth
    11 - Room Size)
    16 - Preset (0 - 12)
    Echo
    0 - Volume or Dry/Wet
    1 - Pan
    2 - Delay
    3 - Delay between left and right
    4 - Left/Right Crossing
    5 - Feedback
    6 - High Frequency Damp
    16 - Preset (0 - 8)
    17 - BPM Mode for delay (0 - 1) off/on
    Chorus
    0 - Volume or Dry/Wet
    1 - Pan
    2 - LFO Frequency
    3 - LFO Randomness
    4 - LFO Type (0 - 1) Sine/Triangle
    5 - LFO Stereo Difference
    6 - LFO Depth
    7 - Delay
    8 - Feedback
    9 - Left/Right Crossing
    10 - reserved
    11 - Mode (0 - 1) Add/Subtract
    16 - Preset (0 - 9)
    17 - BPM Mode for frequency (0 - 1) off/on
    Phaser
    0 - Volume or Dry/Wet
    1 - Pan
    2 - LFO Frequency
    3 - LFO Randomness
    4 - LFO Type (0 - 1) Sine/Triangle
    5 - LFO Stereo Difference
    6 - LFO Depth
    7 - Feedback
    8 - Number of stages (0 - 11)
    9 - Let/Right Crossing
    10 - Mode (0 - 1) Add/Subtract
    11 - Phase
    12 - Hypersine (0 - 1) off/on
    13 - Distortion
    14 - Analog (0 - 1) off/on
    16 - Preset (0 - 11)
    17 - BPM Mode for frequency (0 - 1) off/on
    AlienWah
    0 - Volume or Dry/Wet
    1 - Pan
    2 - LFO Frequency
    3 - LFO Randomness
    4 - LFO Type (0 - 1) Sine/Triangle
    5 - LFO Stereo Difference
    6 - LFO Depth
    7 - Feedback
    8 - Delay (0 - 100)
    9 - Left/Right Crossing
    10 - Phase
    16 - Preset (0 - 3)
    17 - BPM Mode for frequency (0 - 1) off/on
    Distortion
    0 - Volume or Dry/Wet
    1 - Pan
    2 - Left/Right Crossing
    3 - Drive
    4 - Level
    5 - Type (0 - 13)
    Atan
    Asym 1
    Power 1
    Sine
    Quants
    Zigzag
    Limit
    LimitU
    LimitL
    Ilimit
    Clip
    Asym 2
    Power 2
    Sigm
    6 - Invert the signal (0 - 1) no/yes
    7 - Low Pass
    8 - High Pass
    9 - Mode (0 - 1) mono/stereo 10 - PreFilter (0 - 1) distortion first/filter first
    16 - Preset (0 - 5)
    DyneFilter
    0 - Volume
    1 - Pan
    2 - LFO Frequency
    3 - LFO Randomness
    4 - LFO Type (0 - 1) Sine/Triangle
    5 - LFO Stereo Difference
    6 - LFO Depth
    7 - Filter Amplitude
    8 - Filter Amplitude Rate Change
    9 - Invert the signal (0 - 1) no/yes
    16 - Preset (0 - 4)
    17 - BPM Mode for frequency (0 - 1) off/on

    EQ This effect is an exception in the way it's managed. It also has no presets.
    0 - Gain
    The others change individual EQ bands using the following formulae:
    10+N*5 - Band's filter type (0 - 9)
    Off
    Lp1
    Hp1
    Lp2
    Hp2
    Bp2
    N2
    Pk
    LSh
    HSh
    11+N*5 - Band's filter frequency
    12+N*5 - Band's filter gain
    13+N*5 - Band's filter Q (bandwidth or resonance)
    14+N*5 - reserved
    Where N represents the band being adjusted (starting from zero)
    Back to NRPN types
    Back to NRPN Data values Back to top

    Direct Part Control
    Data MSB is the control to be managed, and LSB the value to set.

    0 - Part number (this must be set first)
    1 - Program Change
    2 - Controller number (0 - 119)
    3 - Controller value
    4 - Channel number for this part
    (0 - 15) select for all messages
    (16 - 31) select for note off only
    (32 - 47) mute
    5 * - Audio destination (0 - 2) main/part/both
    8 - Send part output the System effect 1
    9 - Send part output the System effect 2
    10 - Send part output the System effect 3
    11 - Send part output the System effect 4
    64 * - Key shift (28 - 100) gives -36 to +36
    * requires the part to be enabled

    Vector Control
    Data MSB Options:
    0 - X sweep CC
    1 - Y sweep CC
    2 - Enable X features
    3 - Enable Y features

    Data LSB Features:
    1 = fixed as Volume
    2 = default is Pan
    4 = default is Filter Cutoff (Brightness)
    8 = default is Mod Wheel

    18 = Reversed Pan
    36 = Reversed Filter Cutoff
    72 = Reversed Mod Wheel

    Setting the sweep CC for X enables vector control. It also sets, but doesn't enable the default X features.
    Setting the sweep CC for Y sets, but doesn't enable the default Y features.
    If you don't enable any features not a lot will happen! The numbers are chosen so they can be combined. So, 5 would be Volume + Brightness and 19 would be Volume + Reversed Pan

    Additional Settings
    MSB LSB
    4 x1 instrument ID
    5 x2 instrument ID
    6 y1 instrument ID
    7 y2 instrument ID
    IDs are instruments from the current bank.

    MSB LSB
    8 Alternate CC for X feature 2
    9 Alternate CC for X feature 4
    10 Alternate CC for X feature 8
    11 Alternate CC for Y feature 2
    12 Alternate CC for Y feature 4
    13 Alternate CC for Y feature 8
    These additional controls for changing the actual feature actions are unique to NRPNs. They are not available to either the GUI or the CLI.

    System Settings
    Data MSB  Data LSB  Function  Notes
    2 28 - 100 Master key shift shift = LSB - 64
    7 Master volume
    64 - 79 28 - 100 Channel key shift channel = MSB - 64, shift = LSB - 64
    80 0, 32, 127 CC for Root path 127 disables
    81 32, 0, 127 CC for Bank path 127 disables
    82 Enable program change less than 64 disables
    84 Set CC control for extended program change greater than 119 disables
    85 16, 32, 64 Set the number of available parts
    86 0 Save all dynamic settings

    Loading from History Lists

    For all of these, the Data LSB is the list index number in the range 0 - 24. However, if there aren't that many entries in the list, for those that don't exist an error will be reported.

    For instruments, the Data MSB is the part number to load to. If a value greater than 63 is given, the instrument will be loaded to the last part number seen by the NRPN system. If none were seen, the command will be ignored.

    For Vectors, the Data MSB is the base channel to install it on. If a value greater than 15 is set, it will be loaded to the base channel it was originally saved from.

    For all of the others Data MSB should be set to zero.

    Back to Direct PartBack to NRPN types
    Back to VectorsBack to NRPN Data values
    Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/config/000077500000000000000000000000001506652756400212675ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/config/config.html000066400000000000000000000277051506652756400234350ustar00rootroot00000000000000 Yoshimi User Manual ~ Settings

    Settings

    Main Settings tab

    Some of these settings don't apply when running as an LV2 plugin, and mostly these are either hidden completely or shown as inactive.

    Main Settings

    Internal Buffer Size Lower values will give lower latency and more accurate resolution, but at the cost of CPU loading. We recommend you keep this as low as possible without getting Xruns. AddSynth Oscillator Size The bigger this is the better the quality. However that is at the cost of CPU loading.



    PadSynth Interpolation Relevant when transposing to notes far away from the nominal frequency of the wavetable. For those with good hearing at high pitches, setting this to 'Cubic' will give very slightly better results, but it is slower to operate.

    PadSynth Wavetable Build Mode Wavetable build and application method.
    Mute - disable part while wavetable is assembled. Unmute when ready to be applied.
    Background - continue using old wavetable until new one is ready to be applied, use cross-fade.
    Auto-Apply - automatically build new wavetable on changes. Fade to new one when ready.

    Virtual Keyboard Layout You can have various standard layouts, when using the virtual keyboard, and this lets you select the most common.

    XML Compression Level The degree of compression applied to saved data. Zero is useful for creating files readable in a text editor when checking for problems.

    Send Reports to: Various text messages are created when Yoshimi is running. These can either be sent to a GUI Console window or to the standard command line output.

    Console Text SizeThe font size used by the console is set independently of the window dimensions so that you can view varying amounts of text at whatever size is most convenient.

    Saved Instrument Format Yoshimi instrument files can be saved to the original ZynAddSubFX format, the new extended Yoshimi format, or to both of them.

    Mixer Panel Layout Depending on how you like to lay out your desktop you may want the default single row of 16 parts, or the more compact two rows of 8.

    divider Switches tab

    Switches

    Enable Bank Highlight This will highlight the last Instrument loaded from or saved to a bank. The highlight is retained through later bank changes, so you can still find the last one you handled. It will be lost though if you load an external file or patchset.

    Start With Default State If a default state has been set this will be loaded on all startups and main resets.

    Hide Non Fatal Errors Suppresses reporting of errors that aren't serious. This is especially useful for CLI users.

    Show Splash Screen Enables or disables showing the startup splash screen. If disabled, then a very small message window is shown briefly so you know Yoshini has started.

    Log Load Times Reports the time it took for an instrument to load, regardless of whether it was loaded externally, from a bank, or via MIDI. This helps you time dynamic loading in a running project.

    Log XML Headers Reports an instrument's version number on loading. Both the ZynAddsubFX and Yoshimi numbers are displayed depending on whether it is an unedited original, a modified one or generated in Yoshimi from the start.

    Include all data in XML files Originally, some data was not stored in ZynAddSubFX instruments. This meant there were sometimes subtle differences in the sound each time the instrument was loaded. This switch ensures all data is stored.

    Enable GUI
    Enable CLI These two switches determine which interfaces are active. You can deselect both, but in that case the only form of access to Yoshimi will be via MIDI.

    Enable Auto Instance If this is enabled, then when you start Yoshimi, all instances that were open when it was last saved will be re-opened.

    Enable Single Master If this is set, and you try to start a second copy of Yoshimi, then instead you will get a new instance from the running one. This is more efficient and makes better use of Yoshimi's resources.

    History Locks

    All of the recent file lists can be locked so that their respective entries will not be moved or changed when you load or save new files of that type. This is particularly useful when using MIDI NRPNs to load files numerically via a remote keyboard/controller. It also makes loading frequently used files via the CLI more convenient.

    divider Jack tab

    Jack

    Jack MIDI Source This can be set if you know the name of a source you want to connect to, but usually it is left empty and connection made from the sender.

    Set as preferred MIDI As described, sets this for MIDI input (disabling Alsa MIDI).

    Jack Server It is possible to set a specific server if there is more than one active, but this is most unusual, so it is normally left as 'default'

    Set as preferred audio Sets Jack for audio output, disabling access to Alsa audio

    Autoconnect audio Connects to the current audio server when Yoshimi is started.

    divider Alsa tab

    Alsa

    Alsa Connection Type By default sets 'Search' and will accept input from any Alsa sources it can find. Alternatively it can be set as 'Fixed, when you can use the option below. Finally it can be switched off, and connection is then made externally.

    Alsa MIDI Source Used to set a comma separated list of sources you want to connect to.

    Set as preferred MIDI Enables Alsa MIDI, disabling Jack input.

    Alsa Audio Device The Alsa audio destination you want to connect to. If you don't set this Alsa will take over and set most of these parameters to 'safe' values.

    Set as preferred audio Enables Alsa audio output, disabling connection to Jack.

    Sample Rate Specific to Alsa, only a limited range of rates are supported - all the usual ones for high quality audio.

    divider MIDI tab

    MIDI

    Bank Root Change Bank Change This pair of controls determine how Yoshimi responds to MIDI bank changes. Normally the Bank Root will be MSB (CC0) and Bank will be LSB (CC32), however some older hardware has these reversed. Also some devices send spurious changes, so not only can you swap them, you can also completely disable acting on them.

    Enable Program Change Determines whether you want to allow Program/Instrument changes via MIDI from banks.

    Enable Extended Program Change This lets you set a specific CC that will then perform program changes on the upper 32 instruments in a bank.

    Extended Program Change CC This is the actual CC to use for extended program changes. The value sent should be the slot number of the wanted Instrument minus 128.
    e.g. For loading the instrument at slot 130 you would send 2.

    Enable Omni Mode Change Enables/Disables receiving Omni Mode messages. Such a message overrides the Omni setting in the Parts section, until it is reset.

    Enable Incoming NRPNs Enables/Disables receiving NRPNs, but doesn't affect Vectors or MIDI Learn which are always available.

    Ignore Reset all CCs Some devices send this command at inconvenient times, so, you can disable acting on it.

    Log Incoming Events Reports the CC being received. Useful when you're not sure what (if anything) is being sent.

    Show learn Editor If set, then on learning a control, or loading a state file that has learned entries, the MIDI Learn editing window will be opened.

    divider Theme tab

    THEME

    Recent versions of Yoshimi support user-defined colour themes. These are stored as plain text files in "/home/{user}/.local/share/yoshimi/themes". Initially there will be just two files; "classic.clr" and "demo.clr". You select these simply by clicking on the list entry. This will immediately perform the change. If you select anything other than the current default, the Current Theme box and Make Default button become active.

    Classic is a duplicate of the internally generated normal style. This can be copied to a differently named one, then edited to your preference. Demo is a rather extreme example of what is possible. If you wish to develop your own themes you must follow the format exactly. If an error is seen Yoshimi reports the actual text line, and doesn't attempt any further lines.
    Below are the first few lines from the 'classic' file:
    Do not edit this. It may be overwritten. Instead, copy as template for other named themes. Don't add or remove lines between and including dashes. This would corrupt the colour map. ------------------ data start marker 0,255, Grey scale min-max (can be reversed) optional + R,G,B, (tint) 0,255,255, Panels (R,G,B or #rrggbb) 0,0,0, RESERVED 186,198,211, Knob shadow (#bac6d3) 231,235,239, Knob highlight (#e7ebef) 51,51,51, Knob ring 0,197,255, Knob ring lit
    You can add three R,G,B values to the greyscale line which will give a colour tint to parts that have a grey content.

    If you set the 'Monochrone' check box, the currently selected theme will be redrawn in shades of grey, as will all theme changes after that until such time as the button is unchecked. This is helpful for ensuring your theme is usable by anyone who is colour blind. The setting is never saved.

    Further details can be found in the Advanced Reference Manual

    With the 'Import' button you can also fetch themes that have been downloaded from elsewhere. These will be immediately loaded and displayed in the theme list. Alternatively with the 'Export' button you can make a copy of the current theme to a more accessible location.

    With a suitable text editor pointed to "/home/{user}/.local/share/yoshimi/themes" you can edit any theme - apart from 'classic'. If this is the currently selected one and you have the theme editor visible, your changes will show immediately.

    divider Back to top
    yoshimi-2.3.5.1/doc/yoshimi_user_guide/config/images/000077500000000000000000000000001506652756400225345ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/config/images/alsa.png000066400000000000000000000767461506652756400242060ustar00rootroot00000000000000PNG  IHDRlǵiCCPICC profile(}=H@_SKE ꐡ:EEkP :\MGbYWWAqvpRtZxp܏wwYeT22Ʉ˯WFϥ)x{zYJdO$3ݰ7g6->q%x  ?r]vsagFlf8B,XbV6Ti⨢j/\V8oqVu־'a,s(X! U#Daǟ&L 9P nԤJ@aǶ:ך'鍎=&;Г.#i "~Fߔ·@ߚ[{@Jx=ۿgGr4Vl pHYs~tIME!CitEXtCommentCreated with GIMPW{IDATx řqu}G@@EPw (.;Ⱦ쫲" LtL$L$d,IfL&dRts/^ixSO{.Wr?%rxtgN>’j9y37Zo{}# K;sXXXJ5-nh&w{5'=.ƶszϜ例ˉ]lsgڷZV*ﺣ#m_]16>cs}6=|圅/雟YRbLP+vyrƘV?p_o^hmzg %}Q76N0 >F^1>x(s2\9ƙr^S_tzyk 7Oqv6~l <%#|v-޻n®UcN.}#K ,dy9 KX3/bwk򻤚8R9K~6<[?.-ԬZb5J2^_7}i;ZJ闽ۧ=k ۮF5WQs2E/){sumuk0ޒ4mTGkd][/ʭ%xwTp]w(Aj?>$MYiUZդ:|kT{ d6.j}8Gof,6I:jS[GN옞\eΜх;,%9YXJaR6Cyzk!wb k=cmܠOfM莺5-H ^t^թ~eվp`n-e<ֳu>KӦei>nnٸ[ zʗ//jmw[(|Y7H᜻C+vWV &?oDݬ*mS2 {^l9煗}$iTKI) K^8ᾏRʿ>0fY8ӻg,d06z#[&Gfc9y?vtd{錧A2T.ѥ gӬq+<~M- Bxٹr%T/U Rʢ)zzeּnKVM- 쳳7j} dKE}b4++ {)>ޝ#.7Ox.XXXJa3>ƬJ&_M,S4̾V{ۖ 5[4v)j|awO?7ԯS^' ~gt]҂ٚٚ ;k/N믗ǷO>V6 cؚ?؅m!$: -흙~=PQ+>EZUJ8 s%WV;Wc[ԬsKܳЄ^}iQfʑ~{٭]s?S\}|4qh.l 9.g^sJx w&K`dqwRɏٚ >?=\-·,dnvX_ڎ':vI`=w_^nZۥ-N3EX Blmqz.`aa) Go'(X3dav!Dkk20f}`iӦXoJ>c)̩ Svپ}_6\niIpn-@磌r[P2o޼{OUrVbk^ʊKb3~ QYGୃbN9ըQC/e˖.AwNS9]mNt}sRdhsƜ+7ydۈ=zt.Rv.ٳm=a޽#FPRzrI{԰dEǜ.isKg:tH TciD׉rXl3T%9ukGk@Sv7(k۶I͛Əo[={v"E߆7=9\sz:v?,Y⿫Z&ڵkСڂkk=m4":f]pB?A;C5k5*01f^ڬ[h}) >}zl JVPD )WJp f+`H?:)z'|VZ*Z6m{8Pi*ykڽ{ORQ^3߶~VZkbWŘ1c'%53RtK \Suz8ۜ fW)@Ia6 WN]>}^$Jw-6nqI:uJ/˸#i+k{3fн>ܢXΝ;ָלlQ?{jhњmVCG/y82v5jnO>뻝9fѵDfrF9)%[V+RqNnusۚO9Z[{M?//mNYܐ3''7d(Mŗ뢘S~o)nwuW¹`WsXh]h}aNJ]:!*RƜL -uB-)XC`Ϗ>hjV\4Ru? ²eVƍȜS7UX26iC#1g~IniTJ HS!CSinsQNJk&/gH)ʗ4nj.Q&ȽzUC5 H 0'Q'_pY)6,nٙo~hN Qx bQMŗ뢘S~o)nNZiZzj攫9 EBXHB'[΅MPDׂ*&)RM0Fyzl~)?9uYwFmQbh:%/Uouq"kNց%I~9E-CQ|lV?X"8b7')sC4s!uSrmNSKZS_bN٬'QY*"}aNy0'4SO=~_zaUպZGfY ?C]yivDjtH?Ȝ\Pɇ7p˪FK66r~ YD8&d nNv~g!9E-CȦƃTPuuOӮ+-[/k=r4l+S:6)6X7Inn~+!qNY|JȬ9RRmVIgnMws-F#_Ts(j]fѯIԗ6Qd9rڜ.7꧳E "kQչ!ݚ5Pj1ĺfr?#EdNѿqP6Nr<،P]e>'uƩQGz-7j)iGL9E!gmNĎUb)-%Gs9dN~*UkO?ؠŬ\DsReˢ^M6+y+I^rq)\JZ bEi(d$Q8*ip"MUvĺfr?#EdNѿY*sZrisĝ Ӎ{HxpJڜߐs)0ADs`.yDabUb)-%Gs9ecNjn^ E'q4oD1.T؜Bpfk|} D#ŔrձcK;#B[C*y̚9N4DGS4UU/su~FȜI+C5ؘΪ37JNS6zbb1 qs~CœTzA(gEIl I 7}/W5X)攍9%%E]`L۷oMWt椈c`K)wCuSzkcWh&ZT{$MCgJr<@7d% k>'W?_e'Q,Pi-yaJMm?4\in:j?f.'%53RDK]*B\ju&SMߗKOlJeF1E~hT9E!2')cǎz }5싩ϡ>/W5XPk_SjM6aW&jԨz+ͪɢ6'@ଐ7FObn ]C܄i⺡kЙn9;_zWՕEf(0|nvg${Ҕ:I6^e2u)"s%ͺ %O6>]>X9s3aKgS^Ij*Ih.:g z=ըkLVy{C`}Y|J9Er7œ՜V`I}u5뇂]tuuZ)uZjq}ySE](U}Fw=ܹ~^E~vr?@=NXt_НE7nƚ& 0Ԩ4QYJ"k,J^$t=X(xOK"u}s %]۪mL^H^΋UQMѿ޸uSl W%uBVɴk5]ڂR}axzNЕ'Gk";軏>/WI6PÜ u"s\~MN.\0sRBWmAMsJdzuZMJfܺRA6'0' JԩSɎj sJ\ا`!J~bN9͜`5~x ) =Hu(Cd#0UEs͔W_W(r^kslڗeB0 ڜ{7ŜaNRU'<~aIcj4NIa~dE7'hNeNx^wLڜ^ r1'nq @8mN954煃xsœ0'&y)A`Ny͉/9aNM8/9%hsœ0aN2\TpNR >ͩ_~60 sne29`N9`N9aN9aN9`N99`N9`N`N9`N9aN9aN9`N%Ԟ@1eS{bNgN2[0'̉s\w sœ0') sœ0'0' s sœ0'0'sss s 0' 0' sœJ?k.W) N T~Vn_s|ҽ{wΝ;dV{߿ n+⦛njҤɠA^2vƍ38pǏLl(s~sN}TrWK2jժբE!C71's 8u_owXU%͜{=9_n9TVbk^ʢ\OPժUu6m 5`N:kř~ q׏ulN?4תU+ 0'fΜ{7ި|7K9k2ֳgm۶;wݻwĈjW%kN%5,Y cǎDE s 0'Ҽys[zH1Ǜ6͞=;Rnsœr1rnM/|AU,/3f0's x7mԽuݪ*G5"[oOvQUW]u뭷6mT#qiv5tf͚vmW^y(tw}B i޽;C=!SƔmCY2ʗ/o5Pڮt5k5jT8o TĘ>RGE% 7og}wRǫщ8qޝ>}z҆gIu(J ksڷo.0ڑ#G9rdjÆ *oYpwL:5Ǣ i~5o}[;㏫ZQ6lpرwÉP:lذ_u+:FeX߂>,sV,:XRGO+OTkd+Wo~jS_y]cw߽e$s b0XXuߪ67nhN9Q5 TI˙4FU*?ѝZj˟V:c;%VxxQT'kBP֭kR+WĒ[U4yd>U<.XO>I%#bӧOnUu] Qɤ2"*\ڜd zKB~K;[r@KQ=ȺtճuQ'5'?Խe˖O~ҡCFuD4UWV??ҘJƐEY^zۿ%֭[]cΜ9x dN1_tt_hNR܎=v(jʏR/|IRbe8Lp}D`jBsm )oa5e #M@uV_vm0݊K_8]t*ҥ.o0a/izTD%9-X@ouahZԸȕxyV|lLY+׈իKJ駟U)ixNv-:P}#L {Ѷm[XRs;J={C= xFiš]˿ *s)}9aN%7hGRUjK8d_2>bm6(%_۪5w؈\P%asXƣtDݓ:$rlg8)EWә3g|w4ºEC3eFEQװͤ5Fo))~.L s}g^k`UKRs2t=tɓ'-[]뿫E^H))' ֜fW_}mN9%J4NHxE6. U-Ysɒ%RRnݤ\١:2۴id<@ñ,%LWGV Y U>h:XHV,<[7IՔKxғR%cmlWrpQ$ q:9F&FzuoJaF?0#ɓZde{5>.NeNۻw!.޲f9^@e.zo]Fmœ0'̩Dમm}ݗbJ: DypҺu\lS mN?p*_3Ij谎=Zexy7'(=%Ɇc nNjCJ#m/ƆEs^ԩ;&/Ot&RqN^կ~>;s'DB̉Y sbju%Ty?+9)dJiԩc/Gv6H>9% vk]?sYyldߒQD4Vt MhR$=G ^:u@^7~'lS7@uvcu*sOl^)>ϫ>裏1krIoRSn?Mݤhٙ?mljl99![3馩(U'PIke5i!U>7* W+j#JVmPnu$կn:"MTݜ!.,Zߣ2:Xs56RB"RAi%cJgbN6WCZ4+Q1jP[! ^i)=G-S$5i/5:4^|.UtMRX>k>QcH3&9ٳfi&~(^J$Idu)xE"6@f/5jObNB=cTE^?46* EaNr}:SyT.4K77f9#!^%dQiB-WzW׉{yMUt_NjNoH:'&T{écǎi>Ko;<O)G2ǜ0' {bufvfmw iUly'x>@ieQ S/Y1%ڎbuUAN;u,zn5%SnN)6:Ҟ֧T730ZJABk#Uf: ?\SN|1sX2'fAǘƜuJZ(uiM2%z"u_rM>(Tqʩ-skLh-=F.쁃{]qƮ!0йS+,]*%SibŊ4ϭÜ0'aWF܉5s = jNy 0' sœ 6gx9aNp*xV'ǜsœ0' H Y>19aNps s 0' 0' sœs sœ0'ӟ  }sœ89ȋYbN@p\Ԟ@s(~ PV9`N`N9`N99`N9`N9`N9aN9aN9`N e>3P4+sœϜ49aN9aN9`N`N`N`N9`N99`N9aN9`N9Aie;z(EYoR}_VZpB>+׿ۿu[h9.(Qf˘4{ァ:l޼9۷'ݠ`%KXB%c?w\l6w}wǎ+WT>|۾&u8{,攣9}k׮ɓ'/~sv_n]4'qpUT.Ats.-@Z#yr[XxqRwnNo39ivm曘S$1uQ 裏.9so>}s1 ԩfN/ߺuk8T%nNj0xm#^ΜԤ$ÇPeSog޽YbN`NтW_}UJc׮]%͜!5zTEaٲeۘ97Zwر,%e,ASјlmGz99aNPn'NP[D4'5H&~AZz,̙3.6+z+P}˜v޽i&hzܹsg^IT 6daNTJ#gUP(@Kc(e+{IhԿ)~C o2Q ѻ,%S;KSmF1'u(^|EGo|#9)tIҶmTt Ч/}K)Uʶ6r(]rJ&wtL¡Zsz.C軈oN|iqNɮɤtcN9aN䄪e} (HRs/{pF~JяRKCU z+9RX(s;",Dհ2sQ\jsMgj.9d$M&C~ޒ;nـ wk;@$oN/(?;oNjmH5#cp60?ҿXJ7'AL*)D-9JΜ\?Bt#%`NPv0KP"uT+!9Y-4ł- ќ ujv]AI­PSdgN2pS4 x9sIWH\*sri[Цo~k_9v)5ڬ+F+b6/_ X)Ŝsœsĥ6ڙ BsOm-+%JE{Tk3c*rle{I*|N2 'cQ8,ŜpI;"կ>ֶkNARs?Ʌ ]{~Mff_uqɓ M&Rۡm;9X0'̉JsHM FV#9m>U GsK.)bP+Fr$9o$ʛWS-:ΜjnjGarS:TA*`Nረv .TĒÜ0'q t̹@8Kxl FᡊSMxfWUJw:qjMX~ȑ;|-;s۱l *+Dg'U" ̔m;,& s8s;x֥8KuiE4'c J)Ldۜ29@ >G1'4 H-9}_qRյ$hRܙ0-jۅXu:,isW( Ty)0AOdDV#S8'K4c)M?.i0Vi *L~WIMšӄ`N9AYBޫ|ObN64=D* 4j8ٙlng%IL`[v5[u#i O1'7.|]dd"S`ldHޣsQYOƜB䛓ϕ Shڷ$~nߢ3Ds ֫n "sҌρQ䋔-E~hTH=H0ks( П*9郲M-+Аsr(mg>'+mkt)Mzi%ќT9)Y`KQn`eڢaU$ EghN~ÏX yIؕ(+<0s㏑ 0'(?QuUQbJTI]|T+ X*6s3+2'Rq<*@w[`q5%Cܬԙe<'9l:SQ4s7)ܱC\ssqqW2Io]-URWUw|| 0'(}XCx7gk`*ZZ,^[U񇟹:XɬzVfdwq{57IMbjb:%ݸY{D*\9JaOS`u~ס;(y.%ry TJ[C(-*Mv =lΞ=fr(隂1ws2yR1`MŝMMD1' 0'D'`N9`N999aN9aN9`N`N`N`N9`N99`N9aNPJIS?>(+uƜ0' 0' s0' sœsœ0' s0' s s0' s0'0' s0'̉ s0' ^]9%dNwP8pSN*TP\\lO4hPY2?e \#GTG6h믿+Uqz3gΉ'qyyå\gΜZ[ni֬YͧNZIU:u$Mpo;ـM W_}uׯߣGsHd#bN9AذaM7dn]hѢ6kưiӦKl,YBVکSJWγ0'upKݜ$ mꪫt7o^69pI0[UΝ;(l5kV˖-/^9eȑ#Uݻw/u9kN5jT8" 9V۷oɶ1z6'\U=\q1'JB>}ʼ9 }zd1"fw5tP.fՁMo֓O>YV-UQNӦMUs?~<}l(lժ:%Et)(X=P?^3fLBK@3f#:=/Q*WcqIRǎ:(س>s=P0'LAqر(uVJVܮQ _k׮^ҵ^iE)VjGѮ];_k*UXHVzLjZm۶(4|p)fYվl/={Lxر:4Un:VZ n([Șsh nv+;S))eXYkN˗/jUظ6|aۥGG7'C s J0hذZ >Yڵkm{'7|3moٳKҖ-[,Eo&M/;̜9{sRÏS`,sM`NCF}DiFqTIњ+Wfܲ)իda&URbN6z'f[gtl]KbBRs,)mbxl>:C=t Pa~Iת:jm3 36aN9_?~:VTAr>&{O/I~\޽{ 6gΜ@CW(biiNkMq5D3&j͌3Ր((#xl!SH4R} YS[9i|l))9T46(9A4٭9 af͚jJ_h]tBQGRv ' i뮻,5j$Q2`NVA^&W;>L-kmHtB D腐ʜo!;s}6Y痊QigLt.9I+5A&u~ ?7jm,cQ'Y!ӏM\8-LIg/;wVY`%y*cuj߿jJmS?)7sO`t˭T)@*CϭtGʹڴq=&sRm-J!o-dgNNӑ#Gy[_s^w&ma޼yI 0's@isœ0' sœs0' 0' 0'0'0'ss s0' 0' sœب]vr֯__援_~:A]"_<ќ̙S3gRY7n|u׹m~'E]g?s 0'(tns-%Ȝ5kVꫯ._|{Yg}vͩW^Ç#"`NP*Q7ިU%М"f)9ZG+rƍIuX*U:șVFՒ^QըJKـh׮]tyɸ椛npw5KUB3UZːޭ[_20K$[+:?Z\Q[Ô(%s]xK֤I|Û[ӧOOsh6;qqmڴ)nf|7{]7':tHݖ-[b'UI395jsœ80'=~x_tthNÇKjE4{ 6JxV~3לn;C2y)BFsR55jrSKX0J:09i_v8~U2kښ{΅ŕكsN1(|h]t1Zt;M0aϞ=q36'Pzu_̹~4PΙɼZ" ]XMe#7@URjiI9W;3o8m_ԜdٙbuP(R9UxVi9Qc{5'7' VKnd_>f29Jk|%SX6ޜ lb޽V9r4.F"W@bsg(? ieǎl:499)4Ӧ~5in|?fV)uv$ΜsœsDI.nͻk BU^lɓΦ%K7w޽u&nE7ߦMI,9"#<9)^*0É-[hdl<3 /&z'8͡Yߨ>20'*jܸBߜVJs?09']36B}YԜ. sEcs+ϟ?_߳gO,IwP:]TN\lS7֚w*hNG}4qJ*ʮɉr5pmR; k|f&cYd&`Nuѯ[RE;I֢4&5'xaN(3f̰5ᄻTɩN裨 ղ~jDv.+C]H$KL2'XGxjhN`DaBr4'Nl7ӫu>1ݦ?މm/}9'\/}K~ͤ߰9Li.B3nJQڜ, sœsKNmGI5bFYZ;-M( hN2*[~tEe6'<֥sRpFyXmNq3II< RD1' 7ԉi~k,}ͭ+Ĝ0',hk|b5)L6{:5hΞD 3SLZ˄bn-&1礭L6!rr/Q'24c739i''1wI41i_*լNsrȭ$IoB.?(d.kh!"9?y,(h$S۷^O;ќȤzVɬ"dl+x٭ר7;e2gBE[CZ>غ H:W֙ɕ5I4F̥[Bv+xj履~:u|i+tS7)'Ԝ77i={￯;?QI"Ƴ?$"]JZ_5*6O)X;*իW' j߾IXX{~I/m$?k6=|N@}is2!cJeJ/Z߅fPǥ&Nj W]KuhֹsV>XI??S؜A|[$} ԬY.3j#:ʛߜ^f bN"QH \֬Yc74S]ki(ijU@\L\@T].0Ϳy{&5øbSNK=J_0'6Y\I)F8⚛;9]ݩ'(BCݑ4Q6c\z)B҄^%CܙrahnPX !Gmj2+09-A 'LR=nO"iPJέe1^i-M:M*=NV9̤ynZUG4ϭSߖV:9ӞweNէќ.oV")M6'o|CΑ.9SjTMwVo}K:j7'9_ 0' 0'0'0' s0' 0' sœss s s 0' 0'0' sœs0' J9^(P{bN~_d 8%@Y39aN9aN9`N9`N9`N`N9`N99`NPx1gw9]@8pSN*TPZ\lO4hPXڵrӟsȑ#4hp_y啪^z͙3ĉmsܸq9{9C5jԈK͝;EQ^ŊQc`1bĈ4ݵkСC BmV{ڴi[o=䓵jպk[oiӦ>~x/_^PVA٪U+uJj RQx/.֭[~aT:f̘ _3f#:=/Q*Wc%{wΞ=؂R뵑34I{6իwuD+>"sL2EUcǎEI֭[[*~ *2ׯ k׮^ҵLiE)V]հ]v~|VRBT)ʙԸf۶mQijcYҳgϤǎCSn=ztBꐕCS+me c ~wީڔ2F4'.9X؜Yڵkm{'Jof"޺ٳg)ȯkl٢RI&jk3g{OcNAIr [tRZpbF>l8 !Uo]-F^rxw[yZ!I/3Sלbe,lNs֨arݶf߾}/ޅ1' *'OVNS~Ϙ1C=#{QrWܹ3V.]Y^T%k#[QgP[3PƤ~jpbjXԜbm!U6Í7ZOb ' X7cs!k%]ƜsQK=|<a~l;p²eVƍs1'~v/E,ݻ[n$h#RFU!cX*s5jT"Oc/xҤIı !9Bl%Vmڴ F2 }\N?CzGs< 4dUŸdmN֭s!2-dGmVћ7oNJ5[)Ho-_nquKFegN 1#ڻur\>$C/shN2[V.X <-2V!$5X[HP#,K3dy)^(YҹsguXR:k:5߿RJڦ5~^1RzXVGZ'j)u )&CϭtGʹZ;q=&sRm-J!o-dgNNFq?:=.s>٣侺tzn]n5Ⱥxn`N3aQ ৬͉{`N9AR{c.P9 #`N9`N9`N99`N9`N`N9`N9aN9aN9`N̋PF6 H2(s߿0'2?Aق99]w99] Ŝs0' 0' 0'sœs s 0' 0'0' s0' s̉kQvrʭ_s s(Z92hР \W^ye ^z͙3ĉ95k֬_~M75mt̘1Oeƍ{g8P 4vX(&NN|ʕ۷TW_}UW~m۶]tO~򓤛7~Fx7p0aT(P|lذAN`5n]]hѢKٜp-2WdzrժUM69}Jޜ>*UK> |d׮]\sM8V޽;N9`Nɓ'U;Z[UΝ;Zf͚ղeŋ_4`ygذaV?%ܜ~_0 as뮻v }N:]SNlGoA~Qǜ0'beC%sJkNF.]^wnNSL1PY*s|)mWw5ktG[YV-%+PDרeԩ%5'%;wn-wbŊ:us1'Ӫp5-ӧ'mJ1bDyNcNcQB[+W~[:o7to)6xcN@qc-2cǎEI/ժUSD,*vlƼGն^r?}k)@](RX֥Zʞ={f4'unBׯo;ELeN&Mg-ek׮ Z,ʜ~6nؚ3g2'`] iRTC875p@'=97MK_T5lpɒ%v0gV /I[lh z+=yw;vh.HL״5z5ۂEk+ +9ilc֮]kk{=yu`ٙӃ>hm9YL޺XyNeNڝDD/ӘXn{Wګ'ļyh{롇*œʥs 1ydU.FXݻw1cNG؜p5uH3gX[P-{7O~1={R+Ν;4 C,sR5wޮ^ϺdRS<'5V*ݔ28zhÕz߾}_)5ko^ڽ% / s shz+CaI#G G!:5x`i٤#^H$քFjz0jԨ@JC1ICz]lRV(|PJ&9s؜t=X>29WiՓ ?KzKƍ#JVJx ۷/>zɤ2yb\ȹ[ޜ԰Uyj&jPmN9& 0'ҍ"Ly?|,KT+peF@l^c[ؼys" ,HeN K_qNꭳj*T7as2~_B,LP{|߶j$so)ߔxp& JTK]xmœs((56bb-UEgNٵ9=zY$%cL*s9%z;gbe'nߔocߔO? *XH_֥& 0'R 'rb tAEaN9)J/5vgT?<d,'lNq9zϦ2gNzL4x3+PܨǸ%.fo 뱘\JҴCEgNufi=6椐ykO>neEQN"+Ϲ_WleStcf=dRS1' QLJp[:AQ[jĊ+'Wm"2'WHlF( h՜~>'}}#ݫi~ɵ$IJE(L'մ#˟+\sR4id 3G>rTEsUZ (Ga~IIb6ШQ#I=(IĴ 5yUTi"jKݖ^A p3/#ksR9X(  pSes$4ɸͤ& |W_uF裕: uz s(Vڤ)F5&Q?BWjQpF+´5J:.<(ɞ[Yd;'D|n]`&mx,9uY98[zs)r%(xk ?.zbN?(cۯ.@G~<6qܸq: zP1' R2'0' 0' s sœMs sœ0'0' s 0' 0'0'ss s0' s*P}s sy1+A 0'2'ke9@m@Q"\؀9_Bم0' s s0' siU`}dAAZEqĥA$DGDM}1 F̻0v>@_ɮU7n]y"ÐYrɓ'Ar$'@r$' @r$' $' @r$'I 9HN 9HN 9IN 9HNHN 9HN 9IN$9HN 9HN 9IN 9HN$9 9HN 9IN$9HN 9HNHN 9HN$9 9HN 9HN 9IN 9HNHN 9HN$9 9HN 9HN 9IN 9HNHN 9HN 9IN$9HN 9HNSW_u_~E t)ٳx1c 0W^C5kֶm{=ɩ3ڿ=={N6KvKDr}=VA8 9u:OWg-:ӹ5hG6l֖G}k?_paɩTY,%' ɉ\"eR;o+7o^9uh5믳7;OoG^} |3u4c{UVM>}ԨQтgϞ1W_q?'NVeO>Eݻqof˖-bL˭/غu3bYQ8QDlQ>/bĿkTKwŒ/ַo߉'ƮmVr.w9AǖU2iqرcsI0(T\WX1lذ6W^KG<3Yn]~fYYEfFyV-ϖ_Q+.\sM%"9IN޽{CQyH \Hi*58x*߾}{J믗7Қ0aš5kjNN _n%~#*ϵ^[rb@SFl^ifrjxY*<[i[i fq͹ 픜_˶ݴ(LNJ%$9IN]ҥKxȑqyWxcA=Ν;WrZ\x3g̞V_IvH`\VR˿U˭en8oʔ)13?xr'cLv}IHA Gis,eg+o|0uBn)vMN&MjHrjȊ_EF9W-ϖ_Q|]gy&J?|-v…cGg''x"f3Yre=ɩm'?~|!{ף ¸#NYGM{?[eLrn!z/BԐ9shaFɮo`իWWI q|8$E5ޚN_1A:nUES×[I\F'S8ڜ29r$9uTS*J-ZTgaf_>[`'hTrE/ۢ{t~B3v*_Ir9)zxklD+ kT˧#%iFcޚS×[Iy#) #bA'ON5rکS*J#ǔLP0P0[sjrF%W-G77*jmEr$cɒ%s;/ُw}*6}!Gt >`jKNJ~ᇸBT2HQMZmRV.~f&(eߗLP0w!B:l\T_EFV_Qu$'ɩųu- Ϛq@/cP_~啾uN%Ľ8F3쏒^׸_~ɩ*O%w,ZmMN];M5JP_EFV$9IN-]?w}ӦΚLu㎆$y({̞.Hww}w:h)ko߾V?[r7ҏ?SVʤrŒǣo>sBi+xr>Gԟj*,ۢ{t~BV}oQ+Έ$9uv^ō8+IZJTهxgm/=6Փ?.10-RuJ/ ,y{K ]#cO,iKoƔ%gC⛗߈>AGU2\0wܙNljUOrj9ߦ|W^ye\ܴiScSVONDW-܇xQ8gdzG}g*BeRYlh&7x#[uY5m'+RݣZ[~ZwF$'ɩob)ZV(Ž8RVF#2Κqbٲe1 <0<ӍJN!aUz͛7lxP@VwEc(x:(=gOcO*i`رqٚN몫7Ɨ78{l}z'v Ira޼" u:wO$;Dĉ$' $[ޑĦ?iK$'NѡCGZtA=-ϜyaÆU&ׯo0aL4UٿК5KǍkذW]MVL^?u[\[ 9|qIrLN{nO3EөSFJ*'ML9<ۺo{~7zʨQ3-t::gο&jAW\1>X$ݻ]rÒm-P2|eJp5bLGLƜ8?O[)±vmSHk׶"Ir.9EC ζFj`;%W\DU6l{(9INм>ķlYtŴc5!^ٺ)yǶWYΝ4&M]71=$9INp%h<%RT޺A[WޟK/==9j?/MN_y!C̭Q2 `xɩw,iskԬ `0.d@i3~yIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/config/images/jack.png000066400000000000000000000666631506652756400241730ustar00rootroot00000000000000PNG  IHDRlǵiCCPICC profile(}=H@_SKE ꐡ:EEkP :\MGbYWWAqvpRtZxp܏wwYeT22Ʉ˯WFϥ)x{zYJdO$3ݰ7g6->q%x  ?r]vsagFlf8B,XbV6Ti⨢j/\V8oqVu־'a,s(X! U#Daǟ&L 9P nԤJ@aǶ:ך'鍎=&;Г.#i "~Fߔ·@ߚ[{@Jx=ۿgGr4Vl pHYs~tIME *7ӯtEXtCommentCreated with GIMPWkIDATxݧ"s D9HI DDQ@]絷lUrv.׺r.:ޟ{VNϙݧ{O[`ۧֆY=gaa)˅K9Ǐ{VokZ5\b+-o5]t0e鹯 MY[!a u:LY7>)agdYXX rv"gN?aaa˼)C5^>8Z5ejUoXfㆿd96nXyZs{gjH?-:vsF_:ŻLyeHٓd)UY=gaa)w8s.bwk2$8!Rm[4/őb/>\>l̐M֭Vju%^>~у[Nm;E%SkPvuMNKee/[Оj k޴O[RhM[vCpZFNT/thޝIJ^5iTOZC?OeoصM&slD{^|gVaJ5۵j121}ޙ9 |5י7s{oq/scIdNE|cRԩU|udLYSjC[fg۶ll+.w_ԄZ4mA*KprԠ*ЬI}oу{_6m\]7࢝GJTt4{[+ߝw˱gUѫR Ruj^>T|u&sxD{^U®]Ym[7uO\ߛY'ߺ%#q%Z\,FYX }Vkn֚^{x~η^a^tJEc-eﯲxZ6k 8uf]ڡ{\9T/G|j06=wy^Mҡ/^J|}oZ #^JtR5礗R%H5k\Vh͇رl^6>axoܽlY#?sesa/[ ƸybE炅%.G6\wޡg&Ka,,xj (դѽlsmMnm]>==T5ի4ҼIFZ9w䑭_\6m+&ښ:ښkǖx\:H/x^Z3I/^1v ښu _mr.]XK듔>>aċ aԊzIR%[>e K͖D}{^Y? ٕՙ=zUV.5 f'X`aaɷˡSy|qm{oJ&6nHea) 5[ןv 撍S靵^1-=w%mB;֌^sn|o{9_ogV&(%OiMXi..U>gWƭSETi/|fho֏LPeu`\_`+/^`aaɷ 7]\-Q?7Yԍe@v5ضO'xK֫Ӑ[ٚ;'0eܑcvǕ,,EyBux[e١6_[kG~}յZOxٖ7㥮mͰ~OM]3ܷekOhȖ)5ѱBNm{};k^; G7_8mӬ(Oet|o`x`vCe/.{+ڨeh}e풝 6g\坷&f/~ooy5]5YX r϶O[YVn]6֦4׏> VMue[0e}|h }ck|/}Ԯ}|fԁ6[nBc٥eܻĥپb隸j^jo >xgfCzxAɋ"f՜aL_ըS; K]vԜ7R =ӆE{Mr Q0կ[ߋ}޺vx=oئ7^?<:eJ5{|pSsj>bЧB0y@M}ѿscISֱyFuGX׾U^>0ϛׇظAڵj4nhk& oݼK&Y(lZ_hڱ\e۲WWeaaaaI9kU.c/^5s K^6/Ԝ\7%EdOQg=!GpXX ai,,,,,/7گg& (IԼI;_?aa)˺CoԎ,,,,,,,,, |jN/ KeO駟mX6/ K9@4OO/%_ř9`N9`N9`Nќ W^yr) 9aM2ɟXbo5Fp}wݚ$r)mV}KQq9Sys%cN9%1yœ1' sn+mN\/`Nā6' 0' sn@!_: sœ8p^b9qr1'Js.}ڜ9^ 0'.&yŜsœ8mN\/`N9/9qrsœ0'&9ėsœ04nXu#G T@sHT<Ϝ9yb$FYڜ7s*o)SnSǎVؤI >|XBK3z|uۺuԩS[lY\%KVZEFڴiӽ{Rsɒ%3f̸vZ9FXIʿS6'tssʸI >jݜҹ!g'O7Ct4o|Ĉ*G% _VɹxItO\r%*Vخ];%>Ìs{n؍s*$`}\IA]p!EsQ}\mQFJ*]}S˶nݺ#o)J>"MR9 slӃWݺu+4 99g@R\Slْ9}rŋ;9VZ2e쥬hڴi3sOwi[7n95h@O0!G.Aq߿vRӦMa;ҜNE|:6"~z5/׳2R\jݻ-[Vw^KhaÆ49]ۺ&S攖9ٳG']E)Ƥݸ_TRZ ^z ohZQֽ>^zmΝ;aSze2Sۜ6z{C:ټ;I*Xn(J٦ME[뗥b6}Ԧ~ow,*H%?`%^b[sI+N[X+ϟɱUhZURxۨ"0LH9%o'OONXeĜ$RemN3gTn:ݱb5cr4g--. 9sRC;FoxHs Dw05} _gbNl-[ 0l5б+Tݜ6i[SZ5x*N:_T(X{GH,t5rQC^j4L7ӫ9Gu;tP,;JqܹZo]([fKկ_j9>k۷*SE{$l W\iՌ[bZJ_aRnN|HRIȐ!vصk [餄f2rFrI~tz%ɢLwuBA}yq]N\Аg--. 95sRv؅4)S/ OL)ξ:КRo. ]'Jc~ߢ᷅9eN[^u?~^$5`%X|חDu!iP~ipuT_[tt>{l׫&50+[k;xg6gV׍Ä=Vݞ}w;sMvF^,DS8^x FiC!싣u_uZ {9s2nN)ܐS3''79wd. Qӧp9eСCsدVz к,oHœ5't2T=$djxPR.tщ#yܸqav^Wvˢ Qga^cR9޽[om6)0[0[5Prmǒc3[YB}Gb$= 8r=dNe Jr sR_39#:N/;US<ٜ%׍*WEh8K" 6`r BrÜސS3'7w6$cV_|1d!DM—뙘Sfo).ۯq Mk[veW œ5'| TWm}/Ç]ǿI`-Z;Tbb^;gHi6ڇ'zYs s6%uYwFmr~ kauƹuU"jNfPɽ6Ν;'/ծ0U/_{ctԕ{z[Y׮]CC074ۜT6\Ĝ2{KI'QY*"maN0'Ņ_ 7o޴kZ՞N\E&z! Nu;"vjWO>rɜ\PUyeU} Sj A-XvDܱ_BgD(1bޜ&fqDf?#$}HMzꎱScհ7s{&rDz-n]iA\)dzK9pRrY Ҽ$VqgnMwDsMFt_TsjMlx)ItͤFrBKigo3aZE(6-J uԨ3aZ[\.Sr9?iNķԘ1cbf>/W5H4)攊9AKޟ/ Ml7Itܩbs* ^cvݷo_bJyHos"ּ̚shvw i+Nm.5ɥ6'B&S]002[g0?56'k7ywesH37I_d 3!n׀rX`N~9EiNi޾0T)./m,d޿t2nN8V B_x7]U[ccQ9VOJRExŕ$oyn>'Ɋe׏fݢ1'w|N1򠆎ZZmc3>p`&)qzGV)I ydRozҨv|z"VOkT)S:΅Gnk^]NaZ[\Sr$sRV&b)?Nþ~9>.R\֜"UCiSmaNyjN55ۄ]UK_P~Z5d٨ଐ7FCݯ+iTmPn+71 79[iC\՞ơۊC_`Kʫ-/7Ḡ Y Zٝ0OIRt'pq $!OJk&#g$ڜK)!UlsR]۲x"œH|nN*ZYhZ b_=\oĉn 5.HO—+?Sj(}s -)Oɪ+ۨY?ZqNjsԕkᓪS_i:ƾ:tGP{8x`& ѝQ&{cuXt_НE՞npcMcYC4*MmTR7AH"="-:Ebaű=T)yw$95r/s K5`ߤ|xdd$ɫ4n}q[gGjyJ"JMvlذ!򬅿ssQ=U/KdNNPYQ/UHSrgs _ oN<)1lI!Z*Bj]燙 d&LP'M[Qċ9op]Ip|(a s*[oX O4[7q*W/e#ǧehsœ0'R0' ox * Hj:T&5ۜx_XsPH0{2sʷ'"s99LUA,9$a:'(ZcG&5+A Ghs*a!3|{"1'nq @As"x: sn✗BqN|0' sn@!Nj9aNpK6'N.psEbN9yP)mN:49&qM6'"ks*|_P0' r#n89`N99`N9`N9`N9aN9aN9`N99`N9`N`N9`N9aN9aN9`N9`N9`N`N9`N99`N9`N`N9`N9aN9aN:(P{bNydNp^J99 9aN9aN9`N`N`N`N9`N99`N9aN9`N9AJ*Ŋ;s EQiӦMŲY~}:ܟ 6m۶lٲ.]t+_<9E;|XBK3zeh.]Z׼y#Fl޼ѣGԭ[Nڲerʕ,Yjժ-Z5j޽{Sk׮<[srʶl Ds 0glN&INS= [R\mٲ%:zhŊ-7iS5*U14.СC_34'{͛`NҜ4h'LLУG 9V^|yժUXpaju}0)eӦM %;04ɛϊ+rŜ0's*4mڴ2e[c}Q֭t)׷o_+8qD uV%+Qv,FSʕ+]>S 0' sglNΝ={ROzC׬YZPhzKbzxѢEހo>]ti{`ꏝ;wzz5kVFIKmժŋӟzXիgiN:5gΜݻ++]sBp;OQ.m֒%K[NbN^g "%`NPIuVSmjLB'O KlB{TYH/?ĜT%Bi=ٳGMUg-S$d!vhzj< L߸qCrəgWv?0Msy(K9+KռuAYlŋTѪۻwo=9)5{*uR[:u4#GX iNJCc {J^>č5:|,;JrVWJF#k@r y#5ܹs-Iԯ_߫V gN(LNh]k[pK29VZYtkNs3骐j{5NKS6mR3'u%[wAlH 8'Rĭ Y=bTX{C) Ək׮ͬ9]v͎KBBA)\qN*6|uNPwKL2$7阓Bל9aNT @dsMHT߫_C1 pzaK;TDHsRM_|Dt1'oa283nN&]mTz609&9Η8)dIPP"sl|;L4'o'oNV6'5lK0d5 ?wWϜ~D}@B!|h&TU3'3qNY+#<)S|N7'M)&tqNDkQR*(9L(I-z$Qn+W, ;8qMSRJKHs ʤΖL(fL ݾK)hNj'zUR޽5}o*ͻ^szchTsnWR9ٜT߻Fr!u.׷=Ӥ00sKl>\rɜ\Ŧ5_rǔ'VQǟwFMns`s,qe=3؞%z׺աf5))so6d,\L{K9ĿmjeDsb4'Re/59㗿%R9TN4IV ͙S,GsյkWUt3Iz+l$Frɜ~/"N}>IM9+Fi̸֕BOŲW=EN:24.)eޤ+=Pi=77z֩IL@uUz jz4'6Ŷ,U*%LAs?X@Ӄi>LMm3J =zOGĜ0'akBDМ0'Zq0'sf.zzA_g |9\ի)sĜc3(U#X_ 0' s0' s sœ0'0'sss s 0'2'O jO Pዌ9(,uƜ0' 0' s0' sœsœ0' s0' s s0' s0'0'  .sipU]9׮]4hPժUU+Vlb'L:uja2 |[nlٲerJ,jEFڴiӽ{Rsɒ%3f̐7}Qݺu +Wرc.]zBfN:bY4i$nVPҌ=:YM ҥKWRy#Fؼy4n$S 0'GXRҦ5jTT[ovjٚ1?~(Ν;U{AI 9Ig!m*UAw-[`N9jaRӴi?y$ aÆ=zرsJ^<95h@S\[yUVY&b…`N غu%J|GsT!;ЛӴiʔ)[Ǐ*^.cN쎿}]iЉ'0' Y`ڥҭ[7wZj>sKvb7o^lϝ;7{l.T@k֬q`?_oԨjC}޽|ЮgϞTRQp+.z^~eTջhѢ "|1iv'NO.uP/YfeĜ=u(A>}0' Yz ĝ;w¤׏^zJVܮQ 9rdС^24^IrVJE)VjGѯ_?h?ԩc!Y͚53=CkͩS˜ܹsƦe}V۲92nŋTJ,ʗ/oDa ACZ n09i!'Yg6mRYiQiϞ=CmBw6 ז)s2lT`NJ0hժZ <YCl.ׯR۸qtIk[nm]vj)Oׯ_zsRÏ}֫/X}yHל"h72ǎ(7 yݻ׮H椿ՋWXao?^/{YsT{VL 0';slٲ歕-vGC9޽[om6sRڽuذa$()K!Do>vȪ }W\KSFF w՜j[~v6QϫE0椀6;_ œsg+56'7̙3ݻ17j9>|6PHӽh!;_!5 VM=&9 RKV_Hל"h72+)S3N`NB1jzyyTrhsbN9A@*VM#^bIhIa:C6}D[5a9Ǿ: Oad(.GqN!7ݐgm۶RF*)D=;1f.I͜-[oƾMqsdہ( s +a`Cr4'kPoZS,0mZP2Hל"吂9?qN6>|`N9A^>,`+UҪ~f߾}91zJy0a|*N 1' =gs[gwl]K"B\sC >[6P],dYsҵZC< 0' .]UO(I-s{ꪞ˾tҜ9s6mkxS YL3-͉пӫ( j1Z3ÙjHt d)_Te _s C )+:|N1"5sK94ōœs@Saa~5 6TTBZf3p:똅wBK:XznZ6[ϜT-X~}Mv&S}ș05h_9kmHtB Ȝ琚9_MbT=Ye7ghNZYhntMI7s 6q ^f,͐}uZ EؓT1K_.3KUƚ's4i$ՔS?)7sO%=SգZ{n;ҞMK#h<.Qna !䐚9E:Mn3fNzϭˬ9y^w&e˖D$@Q5b*S6']9ts #`N9`N`N99`N9`N`N9`N9aN9aN9`N9`N9`N`N9`N99`N9`N9`N9aN9aN9`N99`N9`N`N9`ND9`N9`N9`N9aN9aN9`N99`N9`N`N9`N9aN9aN9`N9`N9`N`N9`N99`N9`N9`N9aN9aN9`N9`N9`N`N9`N9@s#szsUjO _ s0' s sœ0'0'sss s 0' sœ0'0' s s QJbŊ9sHǜ6mT,קSOڰaC۶m˖-ەGc`N;*ҡC/~ghNRa͛7 0')9ݿ_-LlӦM Φ=zرs7+Ve9aN9`NhN[nK(Gňsʐ9\#Ŝsœ0'ܹsg[So:5k\ܲeKϞ= $%^h7)9۷O2K~%,X6h i6oܭ[ʕ+kU6hР]z_~eԞ(:>`oҥK6RJdN8>}zZʔ)۷ۿ[s?yΝW_}aÆ?Zjxdja*zYSN͙3{J^v)4-zZd{ILA}]s _4H+Ug6U-:_~>yz%Te_xq<~xsmB6dV^m{"-s8>իTyr]T)_BoZW|…ڵ˗3o֬Zvm7לycΝ;{]kN W;'OF2'DidrDԺuk s⦊9EsڸqⲽW ?J) bҰk.O>Ylŋ$ ݛ|t/]Y{Ν;rH8q7Y63'+%;f趠9y㙒M1'ImY 2L{aN`Nܜ4+8{|I}Xu/RF۟)SҞbJ*zW=>SX5xdpsڜ$ڜ̳-ַ˜FWih;>s~֫M1Q_!9PhIMZɄ|)UUb_9]Vn݌s'XI򤙟4)k[ 6icwɛ?zw؝мY7s4'kRڵ@Z# )hNj>[$M ӄY.s4'oÏLo}ל^Ɯty?k9WBJ0'9IP\kbh|hH O}uqWmK4&Ka:a<{}<LM 3J =zOGĜ0'.{9Pi9`N;lB4YA`N9>P<#Yz5e9`NH2( sœ0'0'ss s s 0' sœ0'0' skN 4Ԟ@qs PX9`N`N9`N99`N9`N9`N9aN9aN9;iý 0'(B\\z{`NrڵAUZUkb&O\ v{„ ۩SkܸV9r$}sW`N9!nݺe˖ʕ+Y-Z5jӦMK-%K̘1CP ѣGuU^r;v孷œ0'̩sъ+BTFJ*N-[3Ǐݹs ^z<(X{^I-yjػpBޛvs̩q}0ߴi?y$ aÆ=zرsJ^`S,sqNQ s̩huVK(Ge6gIR0vX̩kŜs*B,X@ ڥ6oܭ[7wZj(9sKvb7o^lϝ;7{lP٪QY59>_QFeʔ)UT۷o?mڴw&*Uh7ٳ:%"{܊KzjuѢE! A,ŋ/w#=tܾ}[_`ծ]{ĉ|IxA y>S+ǏrYj2Iy9iʳYfe˖ՉV}*Eɜs̩zjUܹs'L* U͛7WP~=U`C٨fJRڞ(*Hꪆm+:uXH*E9֜:u*9͝;Wml*Tg-ȑ#&^xM/\0d!`uCS+m&w#=4T׬YʳM6JՐE5H;47n4lP+)hi^>Pڄ9T޴UV gVSpg!χ5\D+U7_~=joƍkOHdeҽ{wF-7ZΠr3ЎI#Onl0|lBkNrHcǎY›l޽v=N}֘1cBWhSEaQi̙]UK `Q5qIٜ>Bd|!^߷o_D8q"nK"Ոn` g_b5~RF*)D=T\^N2%%9>nܸXюq䓤ڄ9TQFHPF\/Œjṫ$mnjr}u0-8PBL+U۶m jTq)Rv##{wc\Ga)dNQwgN`=b uql]dq z9қI#”X' )C'jپ}{ۜ^SR0ĩw[ZjsJ"O<}0'q>a= iN֐Hmz$%2X`vD4d<)% !9E!s qNOzTG**ÛcSȐp 0>,`n|*iۗcǏN~F9LbjcL5⎭ zIBkNrHocЂCc"8i]S[9Eݱc4h&0ڄ9TTXt[zHP;P`[Hԓq=gΜM6ž:),YL3-͉пU33&Br|s4iҤZj)Okkb1_=Nc{I18Z{n;ҞC#h<.Qna !䐚9E:M褧ܺ'gғ5uw,sd!s0'j@QƂR6']9ts #`N9`N9`N99`N9`N`N9`N9aN9aN9`N9@!sz. ^ʽ 0'_L0XbSNlܸV9r$}sW`N9A^0|bYl޼9#.Ydƌ׮]l ebN9aNE+W̩[nɳnݺo,4yA]p!I;9yUTPAҺ~:9`N9E& 0';t颊7h޼7o9s* W\QE- 4s}O?5vX={\vmxxL)}fʖ-[LǨ{npO<ٲeKϞ=u,Yjժ;v~޻wϷ{a2RL\rR6lojC$]U;RZZ5u]Q*L9wJ@ԨQCyVXQYƷϣۺT^]֮]{ĉ|I8:s3gTӪU+}֭%JcR6'UC)lT#Z7n?gPhӦM/?WmWvVZ>CUV ]"9L^zٻ2'Yb}pǎ*]W^˖-O 9WDf͚Z/mjӦK!9SSלM`N^Kz+QFlN9v6uYo5jH\Q*[2Dd׮]n<-[v24*]ٵZYKjk_hs*1:t|sJ97t,AE۸qѣG{I)2[)N:iev>#׸%1ќŸ9(6aN9Ajޚ#ckԋ5˗W#JnjwԩS.]X>ake)$>C'Cj;e"3zYQМ$񨲗c={֗<FȃTNS;jz5CJw)k$7H&9)6aN9A,qR7[g ;oCEIu֫)"3}[cƌygdHc })'Mƍ SĊ@Қ=zazm۶*5szΝ;M6zaÆoDyݻwp[֚ܜ"գ$ڄ9g֭#Gʮ]9AG14񣷢U^jG>C'CZp6& ah ~RQJ>b|(he;eʔS9SS('Iɵ s ru4NjgxT{y'Δ9iY\bŊb/fzRZD'غۮ&RJ*9ݼy"ՈܹsGQVZ?lR;V/nQZ9SShl]Req O$̙3@e+%GQڜ2nNIf|R5i^.z`)y|mNI䉧yb~m']UXSc),}Ij FEs۷7e֬Yi92=s2X!*IZO7;ל"܋s 9& 0'-#ÝWyY]{$',Ϝ4i }lH\ɥR0vU+ۗCTXjޕ갳^stlct錭{jr 36aN9A [3?%Jv_eɣm"7[h9੸O簇h1WKp?Eb5˽S0)V]}[|uznڴ)A%) ۶mi)۩Shw>'ͼfLq>&'bN9A.rAP~5絭 zN\ꢲI }5m;f9мcJIPG9Cf{({azI,e)A%) j^СWQnZKn9E:jmKGI)Ј#B!`N9AŚ=ڷo$a=Jao=gsZVƉwj[ueuePMu2Mi089Ē%KC܇%0)={"xo' (.;JRA$dhJrQ:A AS(R@v2x1'a).hq5=(@L@19`N99`N9`N`N9`N9aN9aN9`N9`N9`N`N9`N99`N9`N9`N9aN9aN9`N9Y޽[,\E 9aNE\o߾k.W\ɒ%+WܱcǙ3g^ps*lܸqF6gϞ˲~5 se͚5+V,{n͘SgϞ`n59ej-ĉĊ+ -ѣGogk.)I"UV\BJ5$ko߾>ѣz{js*4Ds RO>vUZܹsdgΜE%2cǎKʧt͚5sXj[jUfMEP(QB[l9iҤ?0SeoIW^&J[ɓݻ7uT$7nn߾=mڴ֭[k[*B:wyw}9e|hKY|m۶ݸq#ǔb޷;sȑ<6U2 y'78fLS~FF9th!=&VX0' s?ޞ4[E QyYޭT$wW̛9e| S@Ё)_,rϜ2^V$U*%ZCz[⚓K2eNHeg(ҡH< sœ O'I=/ޏ̙3ǽV:{3pVFfND<|PP=RDg!/)7*|IR5L:Ǐψ9y!og}2nNQ2]j҈>֮]Ppq U2IVZҏ3ƻc1w4/w\F{S WEeg(ҡ%3x e s*0,[L+hْS)qkMo7ͧtɻ޼ysРA)ˍ&BuŽ|rteOV若8}R{C UY/k娅d^U,1!]͝蕭/uD !SIl~E:W~Zῌ9aN 5duqkM/-fUi޼o"t)8WٻS&6M.TMjk׮*J* Ufof)d&*er09=w#}[*}sz motH]+0'̩wIF~ᚗ֚\re t)SDӦMC߽2eJf)vS"4Uis{WNpnq0 UYE*j 3 өSMFz[7~FF9thɯ ޵sœ ~Yנ;~l1އ٥PkbMm:iӦL4^&0' 1x;w<$yc18k# 0'ԱǢQ]m ةS'=~I\i# 0'tk(0B*daN9v5EȩjX PRS _~ms99`N`N9`N99`N9`N(`N9`N@2'"H @a6'bD&MTXD˗k޼+ ޿9`NOsə/^,RJ~kJ.e/eQ2sœ0/;I{~zر~߾ 6RMP Ŝ0'iM.7;isœ0g\Lh҉w&Nްa/nk+@J7cuR%KVRE R TעE:thqUB]/®]k0' Ys-I)ӑ#[%Cpw4c!S5jTF5eNP_˖Mj֬Vd QK{^xUŊ5'2gcN33ѣJJVZ:i\k$O{5ohe]ԫ;~mocՂSժU}Æ.>+Ĝ0'<5޽HZn9m޼ڇv\MrkyZrm͝;)jݻի>>f` sx6 #;Mٜ2zf`ʮ];譁{eɗ);vl}Dk(ױ8/ɪ9<stڜw益 7nW\֭[)S^پ}˳gJMʷXSE s_qNXL9sDIͱ)W8'CŒRB9 s(c·9yBػyIF5kȶlLon9sœ9i J*z2.s:Ҩ+[z1' :uMŴxO4N39غU&%3~:R]jOf71' ߙbmEs)Iϭuܤ|9 o'Or<~|{VMon5*UX|7~\;3q-9aNgS5 Ep'eʔ[hS"ͲC\}pvzڙ%o(6]|YK$R7bN4'[b4bD]|%=v6yn݄ L.-j >Nzzh]f er&Mm)l&IvzڕEe*+c&G}jN/m{c|,-SY+3! ϧ,}IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/config/images/midi.png000066400000000000000000001330261506652756400241710ustar00rootroot00000000000000PNG  IHDRlǵiCCPICC profile(}=H@_JU*vqPqU(BP+`r4iHR\ׂUg]\A]pRtZxp܏wwQandBV+C2$)u_<ܟc@[ qf6̦mp'OtAG+-~\tYa3'.VL8FQ5lU[J_+\9$ "PF6XH~?%r)*cUh]?*LOB q>ƀ.Ь;4O3pw0IzEm⺣){0dȦJ~B7倡[[{@Jx=ۿgr. pHYsP|tIME .2tEXtCommentCreated with GIMPWbKGDIDATx \SiIN=";EDQPJAp)7TE)ADEDEtv2===s۟}{?tmsrB DQ~S999so_ iI9߾d+=j.3HHHHHHHHHRb9WlO7I65}+L~|҃+ED,mzFjOq)gC Hw>)0w i*C;3{`3K?%xn2nn£k/"oz/طo$rqXwvnL޿m\(mx;9r$$7 ;}wcG$(}\̜PKqj_D= \27,d U.CǹMK~qnZmXަ3 Lg OndS;ٰ:D¢"?8ET&>&,ykܮ+' `D[uoʄf~مqUxhJrʛ=m)Z(&szGnxy]7L"Bَ$~{wj ͉6Q1];A^]WXl2",uD[aKN^[%spw 7+Z|||A߳fl*$&/\ʷ /6d!cJiKɄ iބkӗ7UZ&l%QJ~N%Qr D8 s,w.˓u}̱M /lo-#~f+r-'wK7 ҔMMekG}jv Noejۺnaˇ%)Iq5S7*]<0~ߟ D~gms.Wt6l!+-Y-rx{eʅˋe˾[`XG7rKN` n i)N,% dw!4ΊYDd@uΙcf%[͎Nn yZޫ [  'HHHS655nYva~}[Nl}\j^%q;[9yX߶Xr0lIaIba q*}'HHHS6՝6jNxY2H՗|g?B$FU-yzhWS|䃂\}L6֏sw6<-dM|K^f,ocs#[rtO]˕֭Zdܗ.qhڲw.W:}d]@8s tlx?o>0cq/[YoظgP!qׂd5ٵy iʦ-G=c:q(˱ U7rSeyؤ|Mz؄vxJGMZnK^zkKύ>^r0[r$/.RCv=9Qe.AİNuQawrY<|?q]|\R| x#Uh^nOx-ly?WoN_GM!!!i9)XgS9 @isNntxsH2QyL~dWfN5UezJΆCzs >^o^v i`5o/ulVRBTD,Gd`]|tX坟2^ a3ɒPsCsW/la1Q!Wpg%UvȮ -JO ҔMoЛ|AA$$$$ɧ/v6^5.ABzck\d&81{BA#s^tHޜ~O| iRִ𐙤'𠜷ןތABzөw3􋿺R V*=7ŹU !!!!!!!!J翭7>s|r$$$$$$$$qޜXsUȥ??GS9`N0' s99lذEe*_p]pyx9 4''9!CEB8q[{9`N&ps9 }cN `N0'/ s9I s9 $p#9 s9@͊E 1'ܦ`N`8_bN 5+1'Ĝ `N0 / s9nI0 ĜbN0ilN(`S,M NusrF~sg\{Z40/|717,4o)0'D"תNLoJ Tmi\;'k*]F2_`*!umޱO;3lyT<onF[̜8s"w\L;szQ{+*29Y9urZ~+bmC+VqJ|VTg}Pcm]Xtϣ)N2cN̓$ /Ns!ly[aMS tߕ*sv2yָ7KLq7/e ?OWr!bѬMjo999''q24yu-)a^瘓*,׈1YcRd04sUjNG& 5{뿔{:Q"t.E$D3\2')l9e99م,33fCYSv >ik8 ^9M~N\Ӵ6'wrorWJ ;7%ĊQfߜ.WdDvS0&%BIػtij*4͉ݑA>4_(![gzM)sz^U9e=˩aNvɾ~r8?4ч~_ӨAl2}ߋ2yNs2~\$F.s"5lr=jmC`N0 )U^Yov{s%\ciN̳^nXb[IcD2h=&}Cs4L\b㞳wr_9^r) cO>p:Zkc=6T?j8.)B!%ʨK?%l%,'OXThX ]3$$۹Lz dJq>V(YrY/cY`ƹ.Fu$z@NrLLB^͊HHZPsMP`v9fNLOݶw'ϼTsbPb<@jeq^ @Ɯ(ˌ֛Iӈq)jfpsZ6|rAD"DVCbLɡ>Y99R.!uB@LNݻJKa7X_s9v$},ώ7hJ2:+wzD[2OpU*a^lx\]'lNWP$c9 s*x-SӱZ+0/|rX7 StyETa^l+"ǣ8r8͜xCqEW,#Yޡ~1'Eѱ;$\)Io( ' s\G3+ ]w:̜@T`s0|V+F$tLŜ|K1lvSHWJ3+$x'/nNm-c7);s97n Q'/m!d$3ֺI8d7}^"Ŕ9ihEI< 0PqoiaNNp~|SN>29;4|!|M)g_:!~[;)7s<=̕IUuqpsRE['n=wEx\*,mIdgᡫ4LޜsIc6庸DaU)񿡓pVnq9uI9Ҝ }\ieR[^Yz$. 7]CƷˤ&ڏՂsr9q]y1X֟Jӵ6G5%nb[Qޞ'"rdceo4̳ üFDH ^q1!UqQ'Byu0Έ99A͵gEz]\061'mA$yE9vr\7`m1d".P7h^sҴ ''_8AG_`s9kNC!ϯw%m3_Qe+X鿰L>Gy6'(!- 1n9bqC"FhN^K&!FWtOѱuެ-@Q,z !48KSl`MMQq6')%V)7}lv iD̮pSb{;}T^w}J.BF|*͕Æ/51Ic͉ ʽ1AW+L[F4(tsϊ_>nt`^d;[_E: ]b bGSn嬔~M(؜^]8"(0!*0E>sfߴnj5jlW\ JvqkuJ89%DIW'nIeĜFb[N9922#[UZ&GF8!99ƜF,;NPY ]$+t%qE W j}Ed(4j:2+Z"] wD3OQtSònbN/2u2`'v2i2n '眘yi88w8ڜp?']&uVPScVRlm:@[mx6K1S s"7d7J8̌9kh=eiN(z̘\51"s2J](5N ^9 9{œSL)S|$;uٮ f-c$Pl5?#GF^FI2d.s̉7Tp)_ĎCSUl ;4+ <_[di/}D{-LLL* X1KI_Q@neT-dspƜClhP)JMĎݒzYf֤Np~nl]ʩوw\dcS{yNfk9 v2b:&5eH8ڧy@dg*=?s7d$s /5sT:2͉+.ۯm{Ӥ!nzs2h$S|sD# .tqFܙԎ9 L֜&{9iNV/9vW_R$J%N912J>? EѺn :+o!M̫n3nUrb9y=go!~k'h4SC~3!26ωy\-{醎F ϮNbywpL²26c9~Z id.L\D 3te4\D^A9$jojsB-,OvvBUjtHdPjudbN֙9u#7}Qv?9t;GCs=ĤiԕW.A6'!eYZ0_W[Rnع1a~J-tzqi2L&uV(uSsxC*:M\T&UU龅o0ٱΔ7,6>InwnLG^d^ܬƁ+nsEtM8\_9ʗ)>9s]HJ׾<)0[:a6ǯ'>D{Lsqr2sRMޜw0oNс 2׵T1#rc='b qZ[5Ȕ|MficM=v}+C뇺P,iA ?00'ӸK{|4 x]J 8(q[9|UeƂr"ة`V;|p)M2 EiCS?aN8Ĝɡؖz|r\@Iy)="S(CT cC}u3S~)XjZŸKFŦf>>x}s:qs)9sp3dIY/3^L]ц^׊EY3.p(Z0' s9`N9`N0' s9s9`N0' 0' s9`N0'`N0' s9s9`N0'  s9`N0'`N0' s9s9`N0'  s7Z`/ 9Q@8]]] 9}=- `Nќ~(.`N0hN s9 `Nsn̝!ri 3a`NkD"b Er+\QO}30?Re~q)_d{u3B?`Ĩ>rX,{*CS.7Lgs_/t;S{$x5銦iΟ>3{V/ rRߙyI+,8S6_yrEJD<|gYNGaNsܜ(ZG!Q CÜNӕ*-rs]/4 fmmmSza{*ȡs hO(GSW6\1/h&ҷ~dQ> 9w\7I $AIwW:)0/4(`'/9iZ$D4fMGzu\>{hu7MiaND;_]ZJ6/~;G4kN$$!LvCIT0's9;}o+H.I*y¼n'F](9i $wg:7]-W~d,,>-LȜ%唷wO?ʹ㙓t~[h?I/_ `N6p#/T!tBac\Օ]rwJklɐzl^Z\D* M9УcNLOݶwҎ|f?#*Re[ɕZ41HTP'f.oyfe<;Tb%Aj뿘f 3Kk}QuIJ)-PF-\r-d+ay7,vsؼe {*n1B͉rs)sXo_%2yܜԗ_N|zBsy?]Xh−3 `NdΓSبONݐˤN9AUxb'3>Za[ wD)J qek8JX1'``pfyڮSx~:E68.;g^ƶP"J!֬Ӧ拦̥dOzk{l FW)t5"-KU_;/~N YVŭ"]/ٯ"0\; YȚs]ZADG:C@␂|uvqjNwmyOCd1$ER/0's9H;I7L+ +:}iZ+6HūH-b>He.Z\IK6eܣߩa?iU7FD X%֛6y ?Y[8'ZZ4vij_i䙙NF;HZ8z^B25'YmN ̒ke]XtbN3t&_6%tVDǕu6_*}yo~!Ȝ:2/iY.0's`JJ`S:kxqR_BKƪeV&]S0&{,N"U=hQLoxO7gᡫ} ?l:u~T $BBb1h7J~.tM4T%Iŏ!33s+In(|d;89io"c剅-g؋uM#ĜN}w]%GiM?ث'͉zvβC—m-m3'k{ jNh3(IBQ矿J9Xtf/7zgG`N4u]z,8˶,;e,ѶZl&iN]5嫃$lbd+lÜ78d[ӠeiHRk i*7k$(_9j!9b豸Od"94I~>:?L2(!k)猭M0's`GkNc%R`,s:795]Uٳ$N))0=d H<1y<9M&kN̈́an>M 6'']#.NƳ&;\Ƴ99YS#H?-s'*?}яH/ ^Ec3:E:dF'J`N14|u;ۨDWזKɜ Է:œ؊ܚ`NZ'q l{#73Sfs#L'1xP10#;.ѦMPi{/ލmM <۩5 bNNFCtcRN[EkC~2'cժU[>F;2ϿsH% XKo ?7^-L! u9}7i\3n+9̉[<}hU0;Y3:5Wxԫ/j)IJa椓A]l"yOذ/*2 7]?P煭1 T6s͑mAKQG|Qbjo[^S,~ϭL]#zѴ|NDymF=ʹ/X7'oNDL"6}rwc3a LY Ff{i&muƏ.Qgpع1a~Do耴Gn9:yZzb-X(O.re䒍EW{r|(nZ>/T<0ؤGt`FoNl#o[VݑJ]Ż%0oܔ|?}_Ü 廻p>]o6Ӵ`N0P%  `N0XCvp' /5mEB"!]T cC}el.Js!3-Ü`NoL]A2Z70 rQV~$ s9/s" 19i:Rk0'sijN\eBMJӔ.`(9ӎ߁I`N0'  s9`N0'`N0 u9t4' <u945%v?`NsCp9s0'9MGs/`N0' `Ns0'`"ԍ3D.=-7j_0'9x`H](T`=ɜg5[V&FKbSfwif:ӟ8\9 7МtU 2"I*yLisҶ$ɑ3t [oƻZ̉9}/uK$ )o~oޕs)\3'_}0O0's9fӈF^.XB.O Vzb_Hm%M5dH=z6/-.M"&i1'n[;i{O>vߖ_%hVn}0Kq`N:_KPzHi2jO/o $[ ˻aq }+e/%2؂=Gӟ9uCFN/:ybTၞR HSkia[ wD)J qe{PQ܏1㛓^EV|08c3ؚ9Ԯw`N:_ݲTu|Bb S3Ӌ[ES_E`*:*[w5纴5 䶼'!,ӏj"XK9x̉>||oQ-f ʦNjھ֊*" 'C(TX\Z\IK6e+(wzm+\L*mW5BZyWspׂՋ2$蔩91jsIfB3Kk{Y>ֺ^T:F!I:rDP̉߁9|5׶qJ6?fmAmjNsh"diϭ 10:pY U(3 x=_1'J$Ϫ>+s0'91C%݌UUeLoC~RbRPfTDr&9gNbPs*EL2͉ʞ-e'qJyNVs 0`srrq247i(2͑[{cUZ9I/ ^Ec3:E:uF'J`NWhNW a|Y} ( m0@}kRaN,t[SQi{/ލb)(l'C܊99|7֥1N7#) bG=; 9E䍒,Xw쥎d}O?w:5/9 7`U>_fL_J%򘷷W_R$J%I'O9!oyRw`'n[==Ty(s,ik4SCZ3!2ϩB6;71R/XMdN6pp?iUҿIĦOn__b&Ls9&J0 /97}!EyDo5խnEd2gU̻ݙnZ>/Tpia0IۏV]z!h ̉mdͿ}ժ;R"}<\H4?7&[ cO>f9&EJIkp;ޫ%[R=ebWo>U O]!5PzHi2jO/o $[˻3{#{omNTKnbvr8tB~z|+--T2qe,XʭN*<|6+$*W0'`NdYKm)-(" 8$Ǖ4jP܏M%2P*F)Ō:V6&/=h,U||tnVSȜ^*J ԭO+UQA޺]B֜:؜ &S'ok׆ Tb]J?a"yeJ{Rysɚ3l= M["])Ϭ\nfÓIj ,:̷۬\9E-EI2wƊV../WȈ4Ձ;Ƶ`sEaeS*m_kFOG]QbXc[:YYŶ)u36'PLQ̒^+L KgZ?NZ"N?3̝g#ڎrg+܅rO*~l8TH6!򗔍~2hߋUh椽/'vgX%hNL/zy81ZM rIȂcYȝӫsK+E 4 ]ƆBg^dcazOu]}I6wrzK*~1'>+0'0mf%yxZ'-<,i!v)-R=j)9uCNvvVjsD jʏN(2;'ϨIܜФL|n&5%wsVؼFCKc=u6Cj';NWuɩB5g5mAmݜQxZ^5m+Qm$%6w:ڒI2HrDP9fe  βOILgAUDp 5UF[k /\7Ạ/`EZyj9i4 MnNLob˸P~Վ[$IZQ5xh6aklŐ/ky]Ei^#jXs{~N*<<6+(-W0'`Nd_86v,;eж]11'} !j9`GcN;Ɯ'sG`s"cV)uw6'G |; 9WrIţ:ئ5p-+?Uv椹F51isLPP?'+{6 uC65 8؜qvV6+(,W0'`Ndgwi3ZP`R-o폑W[II{nl]xc47HGƟG:id17P?tfIum J9l5s7M{nKAg;ն?(<e}  3'j%EKyԫ/j)IJa:k6q9%v;Slvob^u~ds2ϩ]? P煭17Tsj2/dhZ̻Nx:ޜȖ;JSĭ=V{ܺ*e{n# ?sv+0'0g%M;SK[ =a(M;7&̏LOM-7,gwL{F͙,]=⃭unXU,;9Ĝtsɸ9ĕa@nnɬ!^::w*.62:S7>=ąg̉Î=u[FS2qo~o~v+0'0gdǝka~X1u9\&`NGY"@2C5% 9ބ#9^)ٕ.u"eW~9`N0'`N0' s9`N9`N0' $4EsidN$-돺1wEE3(`S93/o $wClknN_ ӤaH]l#٬yI9 cO>Ɓ9U O]EV?j %)BwʨK?zю~~lsr]Bv+C.yoMe-7Q_҉~a@[f]\0ќ¶P&JiwzT3?(\ R/itjlvM^z MъY /ݬ4839U[Vu9ץu`*PI¶]jM9KÒ3Wίa t;86~nd\`i6s [?'[|}򶶻zm+{"J!eĬ&[Խ' ?') [;#9Yݣ`K+%r<Ã'/nNl2[vQ o3<)s~_OP@ͅ9sz ͉HeܯfxRDtBunhb}OQbXc[:YYŶU(O4'YmNd%{gV@/,8Nzx921]v̓Z v˯Oq;e\$I5gZi?Adk|iD:;DS0wO (\,,M_犈lNMC6k^ G'/˳CȨ41e՜QpHm5/t ? &N JJ5s+jƅrO*~l8.yG;'lP_B~.)7nVwD34n椽/D|䉅f5@ƙ"¾qTI0yTayVQ$dpcn {$KL.`66E h͉A[/4@i 7䒐%=dLg"6^[2T^)b}Ird06bH[юlDOu]}IcwrzK*~1'}=lVPͅ9s2<<tyZُeM J˞CkJmݐŶY=YAmvk ̓٨ܜ䶞VZUBtA9Hw _6 `Z=ą '#&Cy]evhRi?AgVؼ>t=f K_t sɚjn;= /IJԀhTR%6w:ڒI2HrDP9_O~PHͅ9sz9[L tēgv'wC~RBYPnM7kuTd6lnNUi П@fJ M0ϮuLoMv W*2 9`>PVƖ4⸘0?A#k!񩛎uY0QLCrRR/{9 uV([N<8:\%YZ堵#!ޘ ̷ s"8-Uk /\7:H/"ϤiUP+U4rȺ91%.Bw9)O:"eGf%t3-I"8uި 6;u]NFzG /u,\%5651䬯+0'`NÜcPSfzrLI37j,]Jtg$j1'!,  64s2ĜvZ9O6de ͉[:ڜqv aS ! Ӵ0'u]7-i"\Y[~NKn椹F51IV0JG_"Co99tgV-,>[0<]\O|;OUC(a.0'dCtc=^Tp /^9<;%>.,}R-{24c=%u'Um#Z˵fY*=#ַ|68zZW֧0(bf}!O?i2;13wU yʦ9](gO q4m=I몞<}иDw=ɬ)xLn% MUo 0'aOý |G叏Wz!TVcZm/`_aNsVn6_{i>w嵝zuVGʞ"ϯ$h{9LVIYYYEu}\EF3+OhIKx:V-%~1 EQV:6 jd3:v]l`S۹"ޡӦ״+V4j,݂MuogƵB]ŋì|Ju:˽o ?FzCOS:2Bk\U>׿ݿ>_Ʊʚ_0'sBU%6+3`^V503MlYLv>cUw23y0NZ%/'>Ky6nyg^A1;" s"]/ ɺO-4?euw 47N9*^Z X7'-n~A 4jޚYa媤u%9)l蛝sȜ=-NC;x9Z;5Uϕ4'C 9}U **yz3% uܴMFhqhZo2ʛ,DLS cO75IKx:sU :̇7f7c3fEfT덡'l:V|.6U4?DўUJJf1s򴸢w?~15iќj_WМs 9a.5:.cipƁu&n+kU mcfx6F+[zfU% ֱJO7L'1ބ({4S޿ޙ9lMlx\,o~8u{ٻT4mI]ϴcNnBĜHjƜ9J0;Xil9R@l)UGgn+Z>Op>fCx:G)ͨힲ>36N'f_Vpfz"< wL5d^#Z 4<'AOKzjטT7//u9i|/ _dϜ?Wߘr~cNWd브Yu7eH~]\ޭCqx<޺ZuusZ_=; sd|8ʜZ"9[֕ӷ+:}2M}]efyf}{LS64CUR5u RzN=Jj'<*3S^,Ф Mžs<.7-, vXCXC-7-xS`5\m[e\NSvU2zM&MUU&EE:8P;`|:~͉ĝ맼`o0'&i*C6(Y!qx_KÛx[GjA5='`ƾū7I{eXk+È_<{ Ӯ9-ᙡ+Κmܴ#U|C^e{]^H1l [5s2V~C^1GސB:Nztx?jVe |厏Sǯ9q On5'poZg翯0u:sUzފ?xEӒd&9eb)00'M0's zL^5lye,sΖ< /heZ_̘b~Ã99VZL `N|h>myQM'9Z:& >əzNdM0'ss'km9j͉k3'' `N^_t 90`*O 9`N0'`N0' s9s9`N0' s s9`N0'`N0' s9s9z+|ED-A|Es3چ"7qֿEN5h!s2tzcU~wUl̉=s(1zT,x(S\P`N%xx{k0t'gE{SxKEO''fREz:? ]-b˼4eL\g?0'ې9s2'q؅WZ-ٟhqůgᏝ78q4֏U׻0%  \33wN&f:4|Hoyj8Tq7 WS)g3;2J~ZgbNv iz5xy?9-M0'`N`iqZNuGtN;;p뻤@O -R3̉x[CR;|a"ue?*BlՍ8)wdbtrKBKbSTZ6jZ|;- P>U>8;9[n.=KQ~jӿi"PՙĨ˯g$E(q+"\.nEh㝓{RZ⥈Jξ46–99w 0cBr?<ʑx+oyqȜLaN'1'噼 1%@$, ;QOe PŪ"}=X{-QDŽiab͝<8B]Jm٠̠lsv 3V=$6=NC{Q9:f4g}Xxȡ;97O꧙%?he:%`wB;u#*dw p%PY0' %M0'`N`E7+cvId_rEr.K󧕨~xc)^f1X9$By&Z̮Su'7X)|e{ڝ-?A~ۗ;b\d*!o1kwGH R ^!m?:33eC5/H &cNldq7:.j@ZȆlDy4sX.Wܝ$wʜVrٺ,{fҹٖJ66'kyM0'`NEU d><Ҝ(]HHm5~h̿sDfFƱcG l k-E-Ylhnvb2Yt&SZj$4J0ksT?HyEn:U#[C 3!⟺x?doÌ9~[#3Ss|rwka;D F-J]FϬu#)1í03չ;1yDŤiV5kNzdG`N9YdsQ5_MRH(XV1?h6?ˏ-!fJSٍq^{ӏZMduPf62Ԓ3s}-n &d?Zީ0E [7|ND$0ك'1C4v"o)^h2ܻ3Ua{GjsrtZbNNuUs֦9VإiFi!tm9JVɅ#Ε4s ~D='-Ӛ6'AVHLol9.Y*p*a &0'6͉(=D[)mWƏBRzzN s`+sʻLt}/?k~- ڝux֘>Ua{a?-kQO~Rta$9q532C qRl(. 9twEAݨZ^ݙ}t2x;Ho`M>(ԏ3 ;-[C`_:[C<0'f+a;Gf`9,ړuaX;=⟖fs3w)uM ;i:ȸ#o6 N L!j(yyʄӹՌlN\쨫ZFRzny:ݑ뼤bSf{[я)t`h"<>%ifnnQA[<.%yS0'KN,`zg"D9+u]MJ7,lݥ  mdN߃#&`N&6 $K=nSfd0'̙hʿ%̀AQ]-y; ms s9`N0'`N0' s9`N9`N0' s s9`N0' 0' s9`N9`N0'^6_9Q`pp_!{M}noFnS ZFiM; |`HF~U7%qaZts0'?WS uQ(˼ögzGO eB_5k Y3%xx{ ֡KOu?S1͉=q)9N׌1bW'*Ds>Sss\,DIF9fz>֟DAYK8ɵ݁䚔8\ӍYys2 9¨ҪÇ#hءsœ8kFdj8f2=UgĉƬ9-,1œ9/ڜG;('uKD)1a˟gƻj gHSzbW`xs#:[n]RDdR3̉x[CR;|8Sc:ʮg&džx$2y`HdBNYuwhw""vN\}trKBKbST=jZ|;- P>UnG%{POnF[J{:`rek0srUa17%m2B}A=~OGƐ!kwPR!"GȹqfdGssRɻI~w%7J|N('uc|}օFbU>RLP<6'-hy*>>&ԗ]ai͝<8B]Jm٠ysSCmy)A\(_hJ esnD!g۩*?tgyۤREy3jT(wJп7DCdt6'=WpmL*Sf]>9N}s i#ԪqΜ&X&eNÌUgm(FU|¶@o y7]1ajN >69Ü(T:`w(Dd6R]4ևy%SS~IGӊbYçX ;NWglJoG ^"z8iN{ʌa?ȩ]~ɝ{`#Sfw0tRjRsܱ0bOФpд;2lf)I`t_Q;6G3¥&Q3%[qܜi~DđW̖s_}*caa ً9Y(m9s_RU90Q^IwM"-Vcږ $zpQO+Ql NSbrIgb^"O "vf}sΜTziQ4qؙh[wӬL]^OZ\;I (œ 9L̉K.Kck*gƟdn`5θ̜jbz߻y[Mϳ*k]@69{hM&E~[W Yd#i$n%q+擘!OEPyN̜t <'㙻iz**Y[Yu%~g\eNK4uyRG1QI69{Ӥd((l׾gNdoݵfSgno&{{t: 0Bԧ0}i`:Mwu-}2s"{Np{Rho~gI\ωݾ$"ڐ|ed1w* YG[ S69WT'vqLo=?-T*JxcNf+O9% ڭ4Vs$w$}/?sJ9B13V=nc=7TV>9s6D~.i1sbk$ vbr 0.3'[aFJe\)\ [n&eV]_0'U% H-ZxQC#w;=PDmUK#A9;3ĕȻ]Qq[6os$3ʇ!>Qeũ"Bel%L-ߜ2BcH q?JB 6ߣ]PW͜5T[⢂ 5ӹ۝r^ b3[ B&ڣ㷪6zЯ9siIR(OLu_,'Q{n7 kG[<Ľ>7s2eUiN |oT[lۤ&o|K:rVi43dJ_9EHGɛʄo~m޺kIQV;{>9q{{|DPL{*<6SO,+ṡ{䔃[*32sovŽҒbֱoI<|wmqaN_gm'qD0'_ __ ڮqdJ7`4,\@`N}winaB'3{f$[` v`9>WgCvA\JH)+M3+Û0'3Xڔ)#9&4KFR"ɃvZv9`N9`N0' s9s9`N0' 0'1 9WdN2W40'X ۫Q(T'998_i77q؅+ymI9qqi燺_^zfY{ČwT9S*K<})^.{7Ÿx0'`Nk@;M,#t&کk.vmԮ-sҼ+;WLS, 4|@&\,x0'`Nk@} ?jaN6[wX%6ÌQzt/8GӪ]zg9s˜gڬ" Ȫœ;7h!A9wz率9s?KٚC"RZ⭈{:`Xz`mC6 qکG9[B<$RπM?.)G./,V3֜&%&G&m㘉%?d̞)w f]z_FN v.kwPR!"ăd>r.٢wKWf {۶c0]5׳$D)|=h+0<IX ɮS y=^œ9IS]cqq7{)2 z^Fx=N-jƹiυPۺ#wΜf?V9{"3#1v"6kiN)R2L kΜӊXzLi*I".,MkzN^A ?O.Hsos\^!rrzhq3V5I!x#BcNB fNX~E՜g"Yӭmlʱjcأ vKLmx=:CLVleO?d3YQ|}rc(Asb ٰiw<'r$Ʌ#kKX1Ea$Ծ˩G@:!oqlK&l U?ZfƊREӜ(W)T;xsZ[w[r_:A4i63/0p7[wboit}z\\6]zIIiц3.0Ɔ+8p6}'Mnq/Neכ־Fm\cNs=EGZ[5-w 5]ϩ~Xk|[pMZg^ϩXxhl,M2U='>s"a $( 1$+I{Y|G'_8Æؗ; %^)=qwr-7H(;ZvuЛ ؀+czGiRT⪘{_z RISJ7 |Xr{/paNX5 kEyjs5/;iN\ LPC\TD{ӆha m#K1ᎋSE~U-DN78tb#`cT\|VF_C CLkx m<3VVԖ(YC6L<q[c$ϚJ)q9d\d?0ǃ6$uSEz>0'`N==K)Ӟ='4dS4'xWrwҶ9lNgkV[lۤNC8tҦif/9f>͆ZҗwTZRL:k"opYsM`d>j֑v_,'ޥQ{n7 kG.4'C0MOSG7D\}a}? 9ޑ9ssЬą<1C̉isW40'Vm׍8z"M`0`-0<0p †ŅfHX`9gCD%!(qΔ,<= 9ӍM2cBd4*(jױ%o'M`N0' s9s9`N0' 0' s07Wl "s 9V۫Q(Ts9_i77q؅qTm"غvP+Wo 10'`N0's̉~8tQ*%xx{m bMrQ ss0Ϝ00'`N0' sj^ 9uN4IېtکG9[B<$RπM?󞑙(-! gs+;ՌÝ2d[(,(6Juan}Wu5->םx(w*ld99#׏*q4E)L_nd~3K@b&ޖ{3;LNN06n{%9ʏ+)6Ss&*2[$$,0)ܯN-~s09R̺|$hygjGi<揋3S s0'M}6lPZĝ]ll7|l])w46rQFLgNnWuwRn/|mL3 9WtjɅ33V[".Κ ǟi0'a=rݨ,J`zf^cnԱj6.[?D gb^N! 76'MU:Ri9VIr!L=ի23k4ܑo$G-g6},Xn3ĺ+dUd/(<ŀwDH b3'6 |͘nT)ۇߘ "dBY̨^$Z2iuA?b{cNs\#Rt0'֦9M=d=@ΓHuLq`mlQrWaVx2ydTϱӏ]jYJxnU,\\Z2Yz}Kبf/ecMC6E):SJ( H DP&=vosi^!rrzh9s`3$a77Gow% {L[ jE~Zעwՙ i >ƚӖ1K[G+5v OFw93/5d*0N`JLu*D|GEoxP0'`N|EL*Ɯ̻Ɯԧ6Os"V֟|fpM=>oTS16,Zҕ]fN ]iz|C[DMϳ< ss]0dwJ9 w y3d/'7U30eidMyż%iYט%*aGMtB sZ[pty>wmh֝v_u]k2ag_N͹SڜVlTp[W Ok~#/4OҜ\RRW.;0'B=ncbT 22e4-^:S:W)`҇9ԧ6%нw;=;qNUl='Q@bNyIteͻCS?r5C  yJb'_JZn73BsZKD/>|b9gNPť駋*z1\& 9ۨ]DM0'>7U['"GtG3֜&%&G&mC|sҏ69'J-%^;Mc/sbQѱ7V96 OO7%ǜg.ʃCEe?:CǕ_uiYB =׬ua0ՙbڔ2fRa+< )xgBoN$-*c6M"Eo& Jwlebihv'SǢ}_cLn<94Ey&Z5UwrWEr!\L.Hcwh:ɐ!Q^:x 9oNoѰkNdK`NDKeTkP;x,E\ ϴW"L^{[.9E97?FcSAiӥ{2sS f"{Y9;m&ehKɼrBZ+o=q~@z(toV RU d>Aiz_=-λ˅(+aV% v~J_H㶲i泿+T':!hυ4ޛ[hc14$ÏfqLi;0bB")>H0cW/CyT2("C:1&9 1e9r[팆<' IM0'`NRg~?XجJFjͼlsvCO673V[bY)-#As?є灇dE"lcvN|~X006l73l0Es{U鮻&5uYPl`s{'0l(H ET!2i%mGv")EDXe Q<:(57g'/" wEAݨ Z:CxeYZ[!UO $f1V0'Dwh,ܿ=:4KF/ U%9볾NZFRz;mx/J\57ny,H]E M(2~[lۤH^G~iФ:3Q|aL\*Kdn֎rVۜl#I7/~;rTL*F9yy-jNVq['œ9p-Ĝ6'|Es_ pF`N0'  s9`N0'`N0' s9s9`N0' s s9`N0'`N0' s2'  bN"s9`N0' |]uk'b61=7HOVLiýoS8eFgeeq*ĺO. 3sN{Y|SFٝD9r 5[%NSJ)Sݧ;7{ EZ3Qbr쳦/;iͪ'}ͯ9)O[t}np#c=⫆C!ʉr .43pLM\~e' ={Svgi眲sN9W9}q\:&VK|˩)ʉr`!>!Y!.ˌ=[aJ\}xٺ`_rNr؃rZ5RN~;9u;۫޺9Msz9"N}}Nx٪^O`q-" :+LT;xO9iS eO>A9+('2 r(' r('+'^sfwWca#eңvej0 0)'n鷟ǻ/ܕR 0 0{L8CpIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/config/images/settings.png000066400000000000000000001454051506652756400251130ustar00rootroot00000000000000PNG  IHDRlǵiCCPICC profile(}=H@_SKE ꐡ:EEkP :\MGbYWWAqvpRtZxp܏wwYeT22Ʉ˯WFϥ)x{zYJdO$3ݰ7g6->q%x  ?r]vsagFlf8B,XbV6Ti⨢j/\V8oqVu־'a,s(X! U#Daǟ&L 9P nԤJ@aǶ:ך'鍎=&;Г.#i "~Fߔ·@ߚ[{@Jx=ۿgGr4Vl pHYs~tIME$JtEXtCommentCreated with GIMPWIDATxŹ_EŊT AQEiҔ"E4PA{'Tc7^zn&1F>2w=gio}? g-!B2okѢE-ZhXuSNoݦE-ZhѢ%yN9_ߢE-ZhѢ%rMsrz6kѢE-Zhɴܽr^iF-ZT_3q٬.G_B|ybԙm?Z[syE#>CGoټqڏ>kã-;e8#I/TɵhR՗t?|n-Z*-sիڨaYf m=z3!lW{2 "rYTgkV^1&NzAJEjX7)W-ZTeҘyz7~>} _۴qG={pO䗭~FOۮg=Mh֘ /^ֹdWsǺ_KX6ͯ>UHc;&wc|+@`ZsT 'מ ͚6c"R-"+9+lU 72W\)=\rs5 ˪yӱ51 N?6yrB-vٺzSN/#+k;,ƒI9ZTUhܰFyexxTB٩_ .mnO_jߦX 7_3O\ m?l@7gVMzҴ{/2+S wy~&eQ>Wn]$wG4=Nndn\>>Sz'v9;az67ТEKmW^W9}, /v$mLsôْT`p# rIY1g\`ʽK:6Y8mۯXvGnc?ж9c{td4C`:f)s& s7n~jc'-pCxٱR0rəNtd/9 Z=x,RqKZm8y@OUy3WW\ K/+JЖYY-Z*骋*=.~ )OM-jR'n˄2{Feۮh)N:<1*̝83H=C7.] ]fgCj(K׫ܷyspyms>75j`rpKY0KCKjv.`yᮅ5#doaⰡ_[6A*Ts>˳hƈ@lɔ(f0OWWL\WuipoY-Z*rұ{ӻ=k~o2*i%:-5a߻^r\䲍8AkӾhڢEk'Y{M!{SX7`?8s 6_ѻ۪}O M tjfϮǶ͝ lX_fg:wI 圡_.97~2dN'=*)[ {׎nGwܵ)Y-Z*f2~_xS"ң"2gNjsyw5^ -ZTe+O޸MjѢJ,}M槯]p.`j֤i=Y3[uߍSFضjb-!4;zNwjӲ1iS?:I+[. 8_Cu ??oLc>s6- XwlVGٽaE ӹUƜ,Ptl9bPkrNܩ] 'Z?1"=*Ҧp4c?za'vnyu^ -ZT˾r7sD-ZhђmUsF~7ip.ǴQhR3\9]E-Z_MU 9rhˢ?WN|{ݎkiѢEsZZh']C~HՌ-U}Y0y޶|-ZhѢE-+&\9Wݲ\-ZhѢE-~xvehѢE-ZhX>WNB!")=ʹ%%B!SJRNB!RNB!RNB!RNB!RNB!RNB!RNB!BI!BI!2* /}K[t]t:j\ϪM9Gߨ%4*y;JeF]v+q=Ks'W7 ,ԈduRNB)IٜԹduRNBI6'F\E'RNRN9lNRN:YrrIRNRNBII6'IsJ9I9I9$Ԉ ]WI5,H&FNV+$t5.:YrIdsR窓 )')jmsotAXTxVҍ7pue۷ou:,vrrMSlNei3^:k *KǾ;y>nݺ%ZUUSlN?رc;tp~k߾gdɒ'|H]݌3.O)-;w?lҥKr[Ng9C-ϰaònl׮ݐ!C{PҮ]FMpתU;ch%/rzbc S 9BP!RN-[,`ո#-<簪'Xi{M6)#4hPNWW_}uA I}ܹӥ4i҄tMRNRN~nI'Tmz !r(˷=Ч,[,{^@qFWRvm7.%SNOif?tm۶6ᮻ4i&m擿G0,YeᥜdsJs-^ {_9ST]SM>%.S]R .( /4?|Sj_>}Llٲ%{i̙ŋ2 6*gP' |ڴii}Ĉi 4e{卓٬SwyKFh42?~SI̸C=xLCPߕk怷nhѢť^^|}Hdp1 rO@ >yX-;dLcrTr;.V1)P6ƯCuqso/R9s=lr +8W-QP9ߟ?VZ~.(TX'~}Y{%)TRNmRnݛ<_ڵk-`gqḷ's>S6'Z7^^.<( 2 L$r:sf=GK{.bUANt7bɔ'Z;sc=5s~h/\sHw;vDPmT1Na0c>|xW^efCDz0quu$ߤUrj|6m7u@+hա:WJls?~iwZwZʽGXOD &2rr{M(͉zbܞ"2Ϟ=ۺ«)*?nR.o9H1Z7p@k ȮKΤhkhhԜlTL$p 'N4wQOc)]<#كM&R*'yx<\%u$:|6\Jd3teUN1Z+r⠼ ϹW{8ʉ:&ƌC6eJH?BSa[>Ҙ̐܁ڍ}Bwǒr;8jI"<1N0^9 ͤ bi C]i~ie/&^/X < Ia{oC?3;g;DfK9ꨣfUu7U>eJAܱcGZ o1jJDEF֡u$ [JD`׭2H .$U ^13J>l~2r]XāƿY01sL ۤwq/ƂF!\:B,ܻhcI9esr=mȄXIЈN4b@*b0+фLG~/e7bS31[_xN#ݟݔ>mQ ޛ]0B {ʛWN6dph8\ ^p s)xPE B }Dg0 0SCZh]9('bQx&~1E-0(y/xɨGERN7xΉyq6?Yk駛܉'b^W$V ,6'fsT&%b(*_%唯)<oZ.zDxƸIe;r壜辻q*8'H9ʧ4F1n-&b*y{2?bۑ1>,)'M"ǙBl~ 3<4S , gkhC=dڔzx(uȈ2.2:l?lx÷S֫p2 6 P9tl~N9<\$*AMJbOm؆5mXRN9ß"᪜TT!)EȾ"/rr=%n+r殿z(E )ͤLDMifāWٜ4sz*)4O .:+V+VXd/)Ö}OؤO>97b&L'SU_{SN4 a3R@DJ;.*DMJ)K)/S/I+}JhM\P*b9E@k0K;p"KM*d΀vg cɚ>:q9<  + s@JY Sn7LuHbZ67S>'ڶ&nsu44fů)-x<@ O|:84WUN5sOsk3}dfcW,ܶVm69w'k6i]^ QNh躖i dC(oşwmi O?UiS&%Og%S.)UNIXD('[_r3;:}۳?Ε(t{{Rd2"/XZ2H:^ij]H7.]}dNܷK4wp3З_~yD,f.ט}N=4_b$E}d#Sa{UNW]u08I9kQ7Lnu9%O9,3Uዞ%)䩜bI:ib։.]yB'[.HB6'QpNwbjīe0 &6JI|lNS$1$FAx \S0W?$tRNBʩ`6'F">¡ RgsbRƠl4W UԴ)J{!QNj⤜sW)(.zg@ϤWFج7L؏"¤8r%.5&fʩ^|8)'9 9i@G'hrP#뢓 )')'ٜDJ6'5IRN:_!$$P#.t]I9I9$R9 u:YS5QNoD{[oB!D'ziB!rI!KBDM!SJ6'!BH9I9 !BH9 !BH9 !BH9 !BH9 !BH9 !BH9I9 !BII!BI!BI!BI!BI!BII!RNRNBQ]FRBT崏{rrB*-Dl+RNRNB!$jrQrNrrB)'QSnwBH9 )')')'!rBII!rrB!$BH9 )')'!D͡UVeee7nbw}~zzh)^CNIH9I9 Q"8∹s߹s<;3f\tER9YGyd߾}=\&M΁vzWD~xر:t8o?D[<%K<䓕J9ٳZ8֭_/GӧOY6d}M7Tb∽Ԯ]ӦM˧ Vb'M6}M6vavRȦ ԩSǝW_gns+O?tѢEj*KǨQ2u*I9I9I9I9+V(GydРASLr_9рt{'2L< <8fzxꩧ0q6mڬ__tV(dJW\~NHU_QFu֍VN|̒rrrr5W9=1=z޽۔Ӝ9s0![lذAʩɪ ͛sdÇ^$/_n*LUbLoڪ q>iT ۡ?pϟvdҤI..]zI'V~}zmz멧O3 Y;K8)ƛ87y*'aD{X < )fJ/`}0I͛&:q* ϤϤN!|+磏>ioD)K/2'c;֦O>$ܛ~GG}… HG,mcǎ8@':thO&:6nqۿ[ޔnkr!ʩ,)')'Qӡ}^j8/C E sVNȂ@c9&<,rڵk@ر#E6T8"YaDIe8FN| 8蠃.Zb*BgZ0 kZnkObĈ8\v>^*QG$HO8s¤ʃ!!"Ǎ7lذ38..d?9+'\ǚE|z)Bg&7Bmֆ~Q 2/@'WHy)Q*'/XNwy#78h?.]X"-KrQuYednX (C:r$r2B/;(8͛3)oSl*sBb6CK_T !9Ox2Ŭ:lW~߉ V90U ,)7_!NjSlrr"eQ 15D9'=w]d" b#&* =tLOyؐ*w ϭ9r$*r*T}Ƈzg#p`C?NTiڵ~nպu\,3!?_s2JKsTo$$$D.O911c)FAY$6C9Yv뼝㠜y*Bg"3Ž1)r+|Zw7?6tKCGCij?.lrrb͢ +'?)'H ;Ż1*'LxE͍G9>S C]9Y&HYbSc~,|ZKN`IrrKgPI)RNBTfp`ln2(>;0>U>APN6G9$#Oߪ"T O!(u:bϞ=kM )&7!H~{;E%$$$$D%UN% *71d`˟u]w .Y骫2'#۷/)UN wۤ@r|:ͦݹ@S&~ZT 3sL& r 8nafF"ƘQuM@菷/|&߄?%\!.$$$D+'7h>\9%ݶ_8  ʉ^㎳*SJ p/~FN'^\RYffk֬jl!^L &ʆC[6$&6>GE=GuYk)M=lܸ1~c`J9I9I9I9 !D "B9 !$$BIH9I9 !rRNRNB!B)'!$$$RNBIII!rrB)')'L9;MBID 6rrB* DLɃjs%z?MRNBQ%GII!BI!BI!BI!BI!BI!BII!RNRNB!RNB__(BT/ Q_)'!I_+RNRNB!$jrQrNrrB)'QSnwBH9 )')')'!rBII!rrB!$BH9 )')'!*#G;+ u֥۷oרUVƍT'JpvRNBIIT18∹sYti(~:|_zڷog.Y',A͘1㢋.n&NYftPڵ5j4pkVuQ{E%mSQi֬Ye|[wu̙3uvl'NLr˹۩S;VZu9gϞoHH9I9I9(~N:iӦM4V >ꫯ.A5i҄cl{9'Oi?pyO>?wY$Q{#mʩnݚ6[ZoFu뭷JH9I9I9+V#<2hР)S… ig=PR*z Ab6m֯_/:s¢Ewrʪ8=zX<裏r<@VugMUʬ*mS=ί?4zh,wmiΜ93faÆڵ+,=zvcҤITN˗/'Q|+iԩ֍a;p9H9Ť6&o?c_|-[^}U;Ǭʩs7|?׿5#xb OEIII||e[`n԰a+ҽg{1;sڴiѼyLfq7#8>:Fz'2)1Dԁ: BxɓNiE^z_?Oddg!/+6lX<Ǐ԰Hwy-[##R{qAkٲegb>t\J/7?;K.aoEKT{5v{mۚw_ό1zrs"ik,mm!ܺ~}uׯϨ_Z6m[]jUr2N6Ė)"$$$Zv M46Kj64#\G妜lϜ5>';щG׎4`p͊iT2Qr溴5 } թ^zY"ʉΔG6\Dmp›eU)O F݆wH hi1 hLa6YwN d97>M:€r>]+ꪫIO">wC`̮Fp:Zs?tDDg7%IOi?0;uzjf]vevS9-^-LxBeUҥ 9ƅQ*έ%{衇ޓI%mEr "yy\t 7X /`.ωTc1#nC *]֤Da?F¦z:r9"3?><) `xvJ9};mu7JTѺIII*0L%$x~"$3&R@ %}:$] 6V$V.lrrFuCWK)!ڂuk֬1٠ ,:&7c󪊡ƘωxN qD]*۪H~Nf 3f=SE91) /Rv?F(_W_%Wo9+'WPYE%r"WM;*7gCxr֭ OKL_14nxΊY$ rJ ۘvHȪ˾JT5?zr堜>'~|N(Lin[>%UNIoqO i)ܞܔLlfcz ߥO>7 }"`N{pS(RNRNRN"_6L4LyY8-lmc3R̄BBh1{gbamo<ҞB"cSWNT90F!\0HGTOn.C=U\/%[]~ysYH:m߾}MSDYn9W96SL ͋dZ[lՋJT̒%K('@H'MU l{oޕ@EIII ֤8W5\m?}yz-R׌xC z;B"\)vֹ!d#T<4,v $2` yƠ>\N(' ]r'~ G5mJr 7H9I9 Q:w\֩SYf=QN?0:t8ozo3\dɓO>YJ1cE]t}C9Y (^uUN\p7(tWq?>B[9s=W?i8_o%aH9I9 Qd9?5y{SO=UlěafGD65h@K]JhҤ Ǻ馛*r(^uUNLM~;wr*1{Ty0kyw<ȃ :_E-X=PZ)Y\΂ (r|̘1QN(3^IlӦ_|Eg߽{+WJ9I9*S|ٳ+뮻Ν/Z,n-뒕*r'Z>@II+'O>f/rZ|9)jz+~)7v={ g={ނ*rZ)$$DQܹsy-;Kπx=olWs&#;v>}oμm۶ &t֍3ιIYvtrUU4>rΜ9ޑ 4VÇlt8d*Np^h'7y^zن2@U\D-}ԩS*F40z9q0t<t~b'*'VNqnm"%QN^{mg+$ i%'VZ 6$)>hD9Q9KAEɥ|+_I緿_zT9=DŽ;)')'!J1ZxblH6*[^IOq 6X /h]V$$$v$L^۽t1%<}L VS1iR2szx`_Z5z!>;r)@I aO\f:GHcJz͚5M \P0aJ),r I3gδKE&|o'4EDfes1rPNvA XWN κl /)Z6I9I9j&5t<S! 1n` Eˆ3'iM) S "Ϩiܺ|WtW+I j˖-d ݹqi'~E$N[(rJTW & RDߟ)JkqϚI9xĜM7,T9%-χ~xggB&UNepCrJl [I6I9I9꩜\p XIdm t6l7tJ2ϔF(7lP9SⱹP+:Sfq6`|U@ĿH̹uiTp$=B)'N%)- ,e>K'PIc9+oam"唴xNsԾrC sm\֖@g"$ iHVSD"Ɔ/Of)WN'{sO(H9h rяX=DY9%"N9xHWNS IZ:#s2`A>*Dw]͍PNIü{sOߗnN* yw-nTRNRNBB9!k\ŠNt6-a%)TVt]DQcK~w跶ʏGKRicx!YXu?q+r(;7 fr[(r&tʄtY*CF]c'1c'"N9m E 0?X\fF9OKACXqSr?f{!NK/I9I9 Q X#ue=0qC/ qwkp֡#35F@Xn#>dhn]*Fo§Ǿ~c#~!~Lɾ[m=`boDv9h߭Kt e:E*'.ɍīGN`+ qo&Sxj֬(D}L Qy~򓟰 }ۀ΀/ Kx .tU_J0pB)֭0K9~W(Լysgp)'X[SQOJIIʩ)'Ξt^͋._|r*<ӂ ؜8=9s?a*e OSs1j޼yUB97kwT`0'v*>#{ @+TuSOJIIʩ)scO[wq%5:|y+‹55jO<n|LboY˹{n9*v礓N piaE^z_痥cҤI ,Cj/p">Iu/'?'Ʃۆm$]v ط8/6_>NZ? Wу1Y^ W\qE8sZ呵9@U Ǿk} >tN9?E)ߟ?VZ寵G/Τ8)ݶmۃ:soҋ87w];psnƀf su׹m=#Fh֬.uNW[ʆŅ$XwUr;drr('z;~Ҧ์77=e@Oz>nY|o?ꨣڵk}P+񵣰{,kQiɌe˖i:C+0F6h [  ^Dаa@ǼaR-[d=[K}3w9^b % ^z~Lvj$Z? ɉ'bbđXfh-9qL51b(EVdNr!`!/io6ecpaMzQ"zu[ll:uT?OΔ?OtReCS.N[o[3ڴO?בY暾{RNRN"Ѻŋc-í[daO"2Amrsۣ˻#/=̋!'@ R g p]gnOӰvbV\)~9ݘ1!/)fUOWj]wݕ䯀zØOB㎨J+˔)\0WO S"J3*#G* >ʉ;<ߐyg;VNv9`۶mIL_s(gҋI9|rp o~3r1VNq0s|#*wwIO*'|_w.Fg~_9 !o;׮9I9I9Uȅ@v2+2I׏t.%)<4. v`: p391OOC !=rS3!o΍b>x%%ĩވ9uh/^{KQ!"[pbj2l a ^": b`srƏ`:ύE'O:5EU9O&lx)OyPYI0 6QÊ+Q4I17tB S? f5|L㾓Iy$*mQi|xmʂ+| e'o8LX9Ӫ|8v*Q9^7owy'l ^ˀZZbgc_eukPÖhg92@UOrv0}ͥE^E&)')s @sc4Fl̅?qFމ$ح@qpn@67Řs MgT\6a{ukM-8MTf0N?!g8F7~jT9eRJ>7W?0wSArFX.B8LɎ(ssCPΤ%r;.?7QqlNbT9ѷ80UoLIQD|ӻBEM5(v%J!*r2K`N3wpA^S{^Á"1p|l:'-IKq*`MښEqR9%*X>6DMzu~nRfWW1hݸvlNI/JX91**+[ƥKH>6'.ܽIŷ!8?d{q\0J)lrrD8q # ґ_դTMJxlz|Sh#4vZ\lο G_)#9Bo׮˴XYT? S&m|G">*)y)6OdShssJzQ饗^*gfV/>c7ޟ+'{0ps򽭝S4TߒCc&aح=**H9Udwqw~ivxzκu­<J l[J;̆WvMw3sV<ԐH")'-Q`ů3{?.iD8n[W<|\T? inus6}npX.["N~NIS"rbk9 3:.:gLTΤ%l:&Mm>^ˆz;?l/(?Y'Q&jׅWsX;ًa-sFX"-.vj9sPWNiI!O|3E (?7\*]:33_9YY_X<7i9qOb#ŌIfr,JKnUNJ l[arBָW:q1u@_JV>,>ն6o|AV~ S.?7RZkJǍ5v.Eq,r‡oGLTL=q>~L`V\/2v3>xvbXy/mt eW(7&.gFc&(r_6!N@L13E ('a;~_p zzl1?[.xϞ=!I ֳO?\y0NRNRND9ʧpĈ.&^863mMǃoCTY?}~>|]Ol4"dsS_ /ऊcݺ<93YL/@V)#'l}10-_bsT?  G zb~.~iDD:P` wI96|fKɖw?WNwjݺyQU&L}>}A!'y"V'LQ ?9Í9d*qz@%Ո+_J> +^KFn?JB{ Uwc&IIIG?J:G?~ $$$ & s |.^!$b9H9I9jyGgi !qu1IgTqB)')ÄڤRNRN@4"A#U!BH9I9D91BG $$BIT1BI)')'!RNʉil"$$RN&rMNBTyT>!ARNBQWR&)'!M#$$B!$B!$B!$B!$B!$B!$$B)')'!B)'!HԯQJ SI!( ⯔BT夯؊)')'!r5Q9(9vI9I9 !);MII!BH9 !$$BIH9I9 !rRNRNB!BV6nܨCݺu)۫Х9r$e;v)'!$$j" #<"য়~RO?;w9D&Mn* Y`u2{lٜbəhΜ9_&%y饗MPz_ۯ_?7.]UO}SMw~Ĉx e“rbl(RiIo̸ 7ܐ63<ӫW/;" W;/wʕ.7^zix½7Pi2‚cu=Vxl!/8AE}ݹUTګfNGyY:(Η b6QƬw RĝI9m޼Wfk p FywmWKdmrw\9a*(QL\ رiI9I9I9Jp?~:FZLʉ;C=dЈ1ift֭k*gtgwN?bH3ϴ`'^xDlW]u67 J~ [Pfzjd?1ylْYblïqLLs1>3PSZd&N*\:#'uOvRNi DY9=gciuYeD0e29"l°HʪUO91jO9+'S&''D| ѯ[ Τt1Aq`c՚5k'VTP_QSUNKbU)mN{nھt)3fV[5_x xO[T@DI0=F ʉt~*jr h$$$R*u njYߓ1?b}A=hUMp6:qJ;y K ~6=~(y[[B)T ز X-~$)')')'QqŸY9/pw.Dž9,46NJA1 ;[!u`X yAi G%yrgDoDTkC9awqA&ӝUk9qjܸmT(Y\l]ڸ؉**amA$kΔ h_9q:QD_1*}'gRNv? xߝsaό |…~4Œ*7xa䬥DMǺFD9gox=4_/5k֌ wݴ3PuG&9'\9=l'S^&|eSn'o(>͓YG&g`b;;_djܹ߭]:&wWTUCUn]&(UƯu3)'k75$|/@WN໊s "IQ+6Z9@:!frrr"Uscً;/ЪPSVv'YX9Q]+6rf8DhIH9I9I9 QS #&6}.}栜5טX ,PԜrRNRNB!B)'!$$BIT!I46rrB)'Q&'PII!r2{1'rBϽB4I9 !D5oB)')'!B)'!B)'!B)'!B)'!B)'!B)')'!BH9I9 !BH9 !HU| i`rrBlT| o)B)U/;o憯JsBH9I9I9I9 !rrrrB!$BTTVV&TٔS̋"$$ʩ)JORNRNB! "T9S>IIIQiժ]ƍU(7T!TiSIII6md#]6ҥK]bΝqiݺu}>3z6lʶ=)]FݡC?VZv13vػ[j)RN%^7oi֦MۯN:{%\BDgԨQ͛7G/ulrJ3nY.CaM6i}p7mq&kqܹSʩʩT]f* 0|IUWN')')'QSx駛4iBKqy3g$΃>PZ?rw2V9YM4tm۶mlҤImV QsSXaTWv[5PN9')')'Qxr-{<+LackY)6dȐ*'Srsi3<9I9UBV^T]f[~O¼;y ꡜ')')'Qxt҅={M2j*-$^|ŅUN>lz;fϞ=^`:蠃yC @u۷Xve38#vG=.֣Gz׾}+™؊1k֬&N&iӦŴc ʆ9CN*wիmHwޮ];;"9W\c5n؄aoR(mC[g*T㧩N2~K#:;HZBߧS&yҹlf_X4p@R-؉T/YPh s>fւrfڸ{C /4VN0"DӞ>CfsРA6~,ȡގ:>TNiҦ8DpG9EQWud>hS~j %$$j踩q[߉`{+'܏2]IxAXuYg@ަ^tEtd%g쁾${'w @ҙ.^[SSOE@t,ȡ0brYnĈQNҿdS39}榜ʲQtؑ{Z*8LII8mŜc®aCWv|UQ6'<3utq` ছn L0N=ndR̛7odΜ07XIg`N9֝-[,XqeAA -/r_-b KyFI$DA9Šz9}ta(}W-S֫&$$jD t 2vT@9X .^V9YȂ0o_xX '^դ_}թta&:W]uUu-Qe;+U  Ȃԛ:QKQNçNyO½Oٜp7S5P6')')'Q0:3PVf9('*vn]S"SpVf4bjA(`c @ե4GD6G̷J9Yvn]ppvZn]|0gsn]z+rʡZ̵fI<}*u]߆ 8>0jP^6K0DžBEkPHx>HS*s*'gb` {C4 =+'Dtyy`zf?ⴸ6ПN,lFTE_9OǣwbqSӹC9s9/7SHlH. 'Oy[R~Y-)/\Ҏ<&ڧSr O״y⯔Lyxq'q 28F1HtxOEbN:wj%ky*'nQ(bs΍n]d7NE|î=|6}f|]cQɓu[R~Z-PD@3s\ cs{q{M.' C7|K9I9 !*#YŐf$UNᎹͭ䬜r+RN`)7K9Uf]!$$rTN~,TiSwBIX9Zʩr*| )')'!(rJK9L9zI9I9 !rʩPKII!B)')')')'!RNBII!D%RN9)' X^RNRNB!J^^RNRNB!77^RNRNB!RNB!RNB!RNB!RNB!RNB!RNRNB!rrB!rBZQ|rBTO崏" K9I9 !rw^ȍ|>"$$r)%Ǟ;)')'!5Q9I9I9 !rrrBH9 !BI)')'!rBII!rr0rȲcǪ** _r!.Yb…RERNRNN:tp~k߾gIOJ93f\tEw_%g|[o5jT֭;߿AvW_oH9EꫯA|'e˖-Zl;sLvRNRNRNRNXlڴ>d\:u\kH'T<4i tM|1ӎ;e`_)_zCm~o~ҥ[OH9I9I9I9SOYWצM׿ hѢݻ\RI)r={vY6n*̀os821+^Zܪ?O$|l/{rrr,_&6LI)W$;u+!Nzylْ=Su̱;nܸϏg2'RN_A:.믿0~S<#5kFap`Wլz_2j<?&{wp nJ.:W+}޼y>lx,sV`cǎӧOE `oO|x`4Gy9ZuQ6Mh)'(Ŷ SP'bҴiSpС#+;N w}wֲѣ 4JJG6r4n*`IoRmۖ6nDe^zxXT 5683qd쯽&.o[wݻP% hLKކ]h׿.a)wu?v۷;LV&|[tV9%Ү]:O8g^3\s=eF؅3K9I9I9sh4oƫV):?Lt 7X / ߀\8InF kvZc9 qt֯WNOt]=ٙL&-3E'@Ds&DGe)wFo([5+[o.s t.~)?ur>ӬG}KU\|i;LwY~tKG"8;+|JPnS+)UR Q y,sӧϛ?evSĉuΙ|唴Jmzߊ鬛4`.*H9I9J f![JĈf5ӄrڵG1$ H8`NϹvZS91Vˡ(A )oB-``-;#k"T==+ 用L8pXrٳk뱥D(/GerJʡ.? V'~BdD&UNY+Dy.3.{B)i2%.nݺIaT5*Dz؜\':B|8x wh:q)2(\T"*CW0֬YPJEGsWf0K=>9r6gnv*%}wQdWRr$O\zOCŀ'UNY+  (U \=c?6Q}laӧܺh$$$xtx{> e=ťWb 6,ܺ@zeFb_fZpYfPֲE$\G؆ʜH910Cl wt!|&g}v7;rO^՜ 쎌zO xژ.D)NeCxّ (S* ^z%{2xKHh,7sJ!DE-6q( +ڜ‡ˡE9%UNqz0Varp}'+)0.0om>pZJ^{5H(|m>ZYP%C1/sŁ퍫oZɩ7X(AKTos*)NQ1Uż!y}3UeMRNRNj{\V欰ʩ~NPgf 2E%rrGpxrS{ɭEå|qs‡ˡu&̭#*9LFVmذ!;;Dg˴DeNCo-:ɷ.wFL>_&ΌL=q#M&|$m$ԪK'8w]|#b8ٹg? S 5SsL 6ܺUU}r1D[џ&8c0QȾwXff hsPN`o~<'=LrʡM~iKEANT*)SڲT y[-]LjXNY!d?d(J:{f6X,Sp* lBR0_-6׾5?ܱ 0Nq9EWi8 \e6cS__rr;_Q& ٍJ0YC9έҔH9am6mMAOS2DBgS{q`uD!l#e${b^:f$xyH̉"av)fleVfڟs Bwb$a aWwl"$$r&rMNJ*'{B>yPzrm7!D"$$B!$B!$B!$B!$B!$B!$$B)')'!B)'!qoz\#a0,RNRNB!}a_-rrB^9f-SiB)')')')'!RNRNRNRNB!Bjʤ*ryQBT9#T SIII!DS^*rGdWNe_+z뮻9sfn8W'|Κ5 )ēՇ^xʹZH7P~ڵkOTԸqjrjҤ ;馛JS۴iJ׮AuqW_g>O?;wVT+[#rz)sVN9')')'!v СCm/Z:ԓ&Mնm[)Jz),LoӦ hѢݻ\2Uj>́rJ*&0`ii3<9Uf|r3 >!^ʯ{챋/x˖-]iܹqժ')')'!>+ ={\r%: )x ֭˞Y ߢEK/E>yײeKvH#8cEvi]tI'DIbDA+}Oa`K#G'O.؄eڵ1`ʔ)dh޼ynk׮eyGr)UC|ժU1ӷ-˪r/ЖYۇ{xMxԏ!QF_rSNs11D^qCfߤ0zágի]vV =N d{1h/T]=#R9HeYf${1lT2՘r?~|xhs@)|GG}/… b3tl'wy޽~D[ߘd st5m49|e:[80/ѵ9:eFJӦMo^x;. ?J*Y=qw\8 ~sg)|'5k/7s5ÈgRN80,wӔSC=Uhٯ?ދyL#%_4.SLdXyf̲X"mLL:R{+GQ4JaGh_}rbrO ijn] p5NIIJ SMNBxJH9B05p80iP25 K{fF&:d4ᒂRظVN7K߿$=͚ SI0qY3,[,-x nX,lv(Odq&á2gݺu` 6B~E>a)ywg:\Z00Үr ߐr'c):uBI2'O?f•|„ .<[9+RNBD8m1{~BN3d{,pbxNq9眃K?cáf )4\tr~NΑ Pt-Y ^τ`._&pt!pnX*0rʹWrrrBT$cp"a^xaB|UC꒛rJ:WII!D=K9UZ#BB*'CK9UN/zB+=SɔSAB)ꯜ uBH9I9I9I9 !rrrrB!$BH9 )')'!UP9@C(7bzI9I9 !Ho`(v{EzI9I9 !JDޔzI9I9 !BH9 !BH9 !BH9 !BH9 !BH9 !BH9I9 !BII!BIR`k!Dz@IQ=>B.,$$zIy"7BI~{RNBDs'$$rBIII!$rrB)'!BI)')'!rBIIT'FYVV6vXUrBIIʩ<Ȏ:|_zڷog.Y'Nʩs|8T{2o۶wޔ$k׮uW3ΠxUV\pmĬTNTжm[Δ礸ViKTZ?N=D9}'=9õ8qRرx㍴_SƍS{T… {=|AIq &t֍s,ǭT$N /cM8 ˀ֭[lXV l;ydk$q *)sΥ GVZ::T8cH{fKygze3k׮} r0$&?C@֭?S/WTN@H9I9UR-m@ܞ/^r_$FӰVDR>;v찎ǟg . 7`)/ĉ ]?Dd[@ihʉN ;wV* ˷cѷ=CfA妜ѣ~iR}=+M ~衇rSѺ.]ةy睖{nԞu Ri1b}Ǧ t#}DnQ;rӗ2\M?s&D3 2O>tu)3WN`a_t,R"r*DIʩ(`Kn2$p,X(X*<ŰfLu]~N:H\ʮ]iU8C7o6]+| #V Ylr@Jڑqܔqbt v$?s6II=Q䬜 s=wիWg+-_ltmNn=hAS _3!v?#DǏϤMV4ا[eoDXHǪkq[at=w]HdsrrxBh w?(Xx/6lN! 5[;(!m|kk]"0/\*+r~i/y*'@f:1¥X(mq.r={v؉'tW=_=Q6*E1;7쬳ZWZ ˉI__[+NŐP_9'Lt6B _2ַo_NDyHpˉoȘ,? DѺIIʩXD2Ex@\bY] Bz0/g91cFN寜1;_e˖̪D9I+̒DOF$ L5%/9pNg`wCwZ@'#;G-?Jv7}ͥE.Y rsMRNRNEպ4lεtҊʉ?{NV9ůʠr9C9%Kfs3/We_V8YmN C8L/~cY=II͚5{&yέ$JVwkΘvhj9ip*'e;jvܼV|xf-O)T('vb]`"ĐtfcIUN=iD{)ω1Ӵ~NPNz( y:?͜9ӥfs 3Cr#0g3k' *PT)*?(֜lg}6?t1`a*}{ţB᠈1)< 2.gdqؙR 6]_OaSjOZ?瞳r4HN6T< st4r2W\qP;ˏ_6s??&IEb[rb;0M6sfGQ'!$T54̝1 ts_nD"0ƵSN&'L`Ǔӈ 榓5$axmё@X rbJXeU :ﭮxfǗ8Y##[xHCg_Cq]Ř[ړff:B}v9(\9%#!dca U+bmy '0tկ~E& Oqߢ2AO9nL @ p+Rxxʤ %;gSr?־[a $"K ^R,qRNRNBQWD4pRLUTx%ԀrrBʢ,r7Co ᐄc;8 3JS뮻Yo0*) )இcJp$[%BTrb8 lfS2+wrܷ ϕ+Ww+eIL91BW8.oBTq!RNBH9I9I9 !{ӿ˿6rrBH9 Q&'PIIQ%>6"D^H9 !' !*ݶH9 !!BT(RNRNB!RNB!RNB!RNB!RNB!RNB!RNRNB!rrB!rBjW"aJ9 !G_rBTU 9tEII!$DMTN?J=wRNRNB)'!jrrrBH9 !$$$rBH9I9 !RNRNB!$BH9 !$$DZjUVVqFU*PIT򗿔Crrrܹ [Ng9C-ϰa*w}ԩCY?js͘1㢋.+z뮻9sfn8w}'N()+fϞ͍G'†M4a_~/\{j/?OD[o5aҥ.C@9ї~;wgtQ>SRN=1gtM7WN[n-KS9Tڧ~hѢZjpԨQfk(+rrliڴi~N.DF֭[?g)')')'7n\ڵaY> ]sC ӧXr⋷lꫯ._\)I+w #ܾ}~h?s<@5PNrrSL߿?Z_K:4iSdϖ-[>~6^|o?ɵk/"C'tjd_>c4ց. &zdW'sε;KߠA pay(X2iF-Z\zO)޽c?ɓ9Bgm۶Acǎ 䱺 { >t`?ϟ 2iҤܥ)0 /0`Te׿D1bDf8eF~9}.կ{{裏v?OQ6o7rv9xaǎOod(_Ea?$f suŹѣuKβe0̳s+\*qׯݳ>+$$rZf ` ,QNt0lx禾xޫW/k'hXreXr`4:ujʩGklڴimCV9s搙b0viA*S bˆD4_x6&KOR?lԆҶiƴ#8w}wʉ4hUZ+m۶q BJ?'|rk׮nTO%"]~n{ΜK..77STwY+ e2r)/r;ହ1@=@J+Ek[-Y$g)Qe*L޽D5WNtFhxr"VwdfznjK93پ}{Lp BFn@P0Z4,fqgnś6mUlUa$#tO>iB[jUN1OH-4]"ݶNgB 8sNJr+r¬Mwu>rbȆ qx',׿xɊ+H9ʉeU8PME_Lp~Y4ln^\L)iys7㎳#V]RNRN"/w3{VYKJ|LfYA\kڵG!cǎ@yhoՂJ;.C|ћ`vX9uQs aS+St!b؟%`o~N&XzuUN(|XF1ukUp3r3rwXYo&¥d-ヒY;6"'~ϲ*tmhķ~ҹnZP~_q]5.o*gRNIK޳gOKuBs{99"ٜDwҊ7$RNc  s@CY6M9r&唴a,|ͭMRNRN"w儼\`oׯA9<ֽg<5?efЅ!d/ܲd*:r;*DlC@аa|`H\rB2-*xUFajq ›Z_`doy*rb_9?U؁\:֗uW9|QPh/M;r _L)i ;`v^EMRNRN"wDGKK]^=ǀ\)'2cΥ:`(N 8nSS+rJt:rwr x;ZJŷ99'Uʩۜ8eN|ߙ Ce nj}I9ac;;7osB\!P)UcsSr)H(|qo0"DEͭ$D)ׅ%_9 [{8~E_ߵY{8]xᅁtgBM9%:*D*!\/2E9DE6~]ads+rp9YH7{ [Ճ -qZ?dpc_t0ݭBFtbssb?m?Eɤ\:؅RNIKt +*ʉ`Hxf>& !&#Aa}/TyrrJtjTNN'E.%&Fp1RqY#0"jVd6l_9ax/g„ .=봯}j`nB2;9s¢11 _ͽg=j3츄iJTi~x${s7 '$$2*'n6P{#$I9Q!MYf(H9Q:QDbwl"$$r&rMNJ*'{B>yPzrm7!D"$$B!$B!$B!$B!$B!$B!$$B)')'!B)'!B)'!B)'!B)'!B)')'!BH9I9 !BH9 !BH9 !BH9 !BH9 !BH9 !BH9I9Ux* [rr!n>SgӧOF>ܹw)T</^|^vءx֓G#ӣQ ($g}6rWE3o޼;,ҥKD=\/_x֓G#ӣQ ($~nݺ(={駟KXfɨQʲ1k֬=sWeRNRNSŰn:իWoΜ90 կ_Du]$=\v{oڴݺuTmSkTTNBH9I9I9U|IlNh&_ծ]{Ǣ}'A:wζ}vTT|'|29ڶm4I7x;y䑔VZdСѣBaý!(?±I&>2vX+RHe 3iҤ*^|E^O=Tl͛7]<ȸq:u>:\#|ݺt +D{D12s$ckڵ'p= vxB:)lٲ%O'ÇwMIDۤX)QSsPrQG9r`V\OsK+l5w\f'I~9\a7(X"b'N o֭[NZ͚5:thʩ-rS44iM#8"S=؜"ʩG:` Z鍊n EBS'&mJvbZLOC8Snٳ &wO<;z~A$z {wtA4i L +оKH9i0`ͻzhݽ̜93 >  ot<֭[{xqĬKy{į8&%qQƚ5k^>lK OWN-Z(r*ȉ_I]ϧK׮]QH9U u:I!jje"6޽{'}mXADұfMp]wګW/m}윝 4(T)N|;"Hct6lH6m)'*ä{zE[W#~|0G]s5Xn֤ϗ}I9jժ ʩ '&mJvZG#:|.sr0FElQٴ9()SUC P <̠Yp!'638eo6lvʩ-rZ0.Kk]e޸qc ?7UW]d*g=gO1XT#~|0O9<+31bo&Z9a(rDۤXɮQScrk"$唪09*iZ_9cvXٚr*q  xY De=n pÆ ~I9E=biSouD2$L,r^R(_I]DȧSB۷o>~N CL0DYo&}wnܔS1[:Ba[3)|9E=b S1nuWȐ2Q8asrIS'&mJvZOC\-ϭW1Bxt8*2^ kp2-rUls*q)mV/ 7 /V>p9E:b Sn8usHl+'ei!*A'&mJvZ_ZIʩtws"Pn]?8 F"3~_p`wWnr.*1TTdp /C\#FWfε]#S+'LGgu_0Ν;Bp^̜SL$mJvZ_:(*]v(S9L-a!f ]ow/@PQN~y 塇:s[WFA҂X%wIx8=As/rLѕsm_'9I+sƌ.?ޓt%$XbS`-}k.#B+Hڈ%:; uQH9Uax'.wv!k #ڵ %G9=(rJz.@9zz3^|:u,]/zRfNW^v 73Q#FWfε]#~+'p<'Wr7C>pS-IʩxwxpFd(ѩEl?BʩjûNĴgkMڅ`g$壜RCiӆ^s̘1UNIpiؽ{wnj C;vTb;S]9voDu[Ce!C+m۶ -T;<-I]D}0 )*Ϟ={0,fȓɘw<1go~y%K,)rbkĢ .`<7;v0o9+TBٸqc^T۷#w`XBrݙ5"'K!&l`LsmHZ'9Tn;/3"^S~aN<;J߭DۤXɮQS~4 P'zD^лgBeɈMk!0u=Xʋۜy\RI)')';0, h3:W趔rBIIE/T͎+t[J9 !$$r'V&0)F$yI\￿W趔rBII!BI!BI!BI!BI!BII!RNRNB!RNB!RNB!RNB!RNB!RNB!RNRNB!rrB!rB!rB!rB!rB!rrB!B!DB!D $G%!BlNB!%9 !BH9I9 !BH9 !BH9 !BH9 !BH9 !BH9 !BH9 !56ΤBQ%ΝurB!H9 !RNZB)')')'!BIII!rrrB!B)'-RNB!)')'!)M-^;ĉ##`brߵD6?RNRNB!D(N89ҥ9+' ?1;sxq߿^iYΝ;mvm3XTnj)$$BTr2CN>6n:sS9G䋪_zAڠI'u3K+Vvcyх U`1DRNB!Ssb?X9~(Vܥ0׽.&qD=\Tɡ,$$BTչumN^(K^6zm۶_vxo9srB!*r"@:HsbH. C WJ4z($$B.ر#,C<:"9ܺ9s&F}ƌӬYcIKJBJ9I9 !N9m,RB[whw񜮿~ >mn]6;![>\"#NC/bŒ5RNRNB!DE~wǎu'k`? Zt ƍ4wWY+YFLٲ- ^vC9sBR.`BQ,FC%!\־Onذ8wFfBu` q=>Z׶m d?ogћpv| ^D,()')'!tʩ/RNB!)'!BIB!$$$BH9I9I9 !RNRNRNB!B!EI!r"$$BH9I9I9 !ɐ)REo )'!"ȗDIrB!H9 !BH9 !BH9 !BH9 !BH9 !BH9 !BH9I9 !BSNB!")B-ݛ-ZhѢEK%Q&:)o|Y[vE-ZhRy?WNOug- +-ZhѢEJL$By IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/config/images/switches.png000066400000000000000000001233731506652756400251040ustar00rootroot00000000000000PNG  IHDRlǵiCCPICC profile(}=H@_SKE ꐡ:EEkP :\MGbYWWAqvpRtZxp܏wwYeT22Ʉ˯WFϥ)x{zYJdO$3ݰ7g6->q%x  ?r]vsagFlf8B,XbV6Ti⨢j/\V8oqVu־'a,s(X! U#Daǟ&L 9P nԤJ@aǶ:ך'鍎=&;Г.#i "~Fߔ·@ߚ[{@Jx=ۿgGr4Vl pHYs~tIME5}ftEXtCommentCreated with GIMPWIDATxgG C9 " DQ$ H"DFp nH" `_u,.*-.Wٟ\r\0hfwvfv=g=3=k 93[׋[E66666666T -r66?N<nGK߷Lv1sVΫe|!vΘyԯײyϚ2?_o?o߼|?m #gcc+ۍSkoN돛֭ڨawwZUmDOLʟ1ae|a;7H0̝><|!ok:eN9[خ_(}q-s=iT?}|y>9§h?y[ }ӏj/KЦsܰx3뮝X}d/ X4kTBocu9[~rG9#zn'nllhOԾ5=jxp)cnѤ^Z4ZO:yo6nأK?oJyjÚ7mԢYcexw{'ãKQEǫW~1v,a4n }%)ӭSk|ޯtɟOWfMWOԕjݲdNyžOg'sT#w>^~VezJ᭳vl-XL~ʶׂ-oKG8x6H1[*唻=[hܰ!ݫ_(i;=wKV(=ƩUc+mKdqҨRmfGslӪ|oO2̜8(U |޿_eNvfԩ#wƟ>V9oat;UN;uWB4ͪziskƖo?(^GfK9C0i;ec+ۛN{${mlVʁM_𖯋ÿȰFɎUSزwǗ7GGth\쾅Ftܝι8q{ӣK+?,ߴtsTf uzϺGI7.v 0cT/I9$N2HHk۪ك7(3k\ fyaݹfT#w>Jl_*}ԕ}{Է[Oq i/ߗΤJ'[M-~ZPfjA%2o']O*Y4kI6.xv?np2;6fZʈA=,5 N#>Gǧ?ozo knTKپ .͍P iȊu&J9*?\3slJ؎9a^N]]9콮)A֦llly3rqs[7M-~ ay+KOd6fwhab轶hK-J[b)>\;̝>۝ŕ͎ ~k{a. 777m{֞HʃU+..3UUԞNY)axʴׂ-o;gPN×W774[-fS620 4R>o<9L:it7%4q^O`{wkg?wTȺR³I~mޘ%M<)_N|?}g4}p`}KUȶ7/&=*<) Dtxׂ-ocg}PNǝg?lI1mi yhۥu\meήn5ŵږyo,+1O'K7|daCz?>q}յ|IzTlg4yTT٧{vioovܢYϳ<ݟ8~u24}ܷW>S~TUI[] UvW-N{-v~՞ypJvT푍4nCtyoeY󅓸oT Yey{|-V-lK8N=o^2RVjԮ>MuzwHKN<6Lsֻyӆ,?_XY\Mǹ U/L{-v;q{=TlCWN;WMv+  fMm_W,1nmI*fέW~3=Թsx>S ߎ}/fH v|Ju'5w}{kӲuj!O.ug;1CzjX'+G[N֙N͋wjXN, H):mzת}z{.ׂ-oxwN/acccc|ȼÛ>>n]:nim6RY3r7Ɩ&dod!GS9llz۹r{ǯƖvfחtnݢ<ڵn:qx;fP3ll}۾l{gG~:4-նewxsݼ!lllllllll{aS9ZWr@9PN(' PN('|TN /re⹓˚rBuB*xrRP7a5::35\*Cb9RN*TNgΜYSVlN֖gϞ]hiveSڕS&r)Ш\`v&LzM7oΚ5KqڵTk֬ٵkWϿKVrzi@r*t$._ϠdGuƍ,V͹s$4hPV-P<&M.\U.N0o[lС*d M <أ{ڴi Ku}-3)FTETSƔ{fx/}V|8W^*UTѼy2_lٳg~WS+͛3f3[9e/^d'޽{Xvܩc>tPq*s:~~'+TjՔ'ȜߕI)rڱc0R/)^x@OR 2rڷo=[ra*Öu%6'޽{x@ e@9+ć!Cxb{iڵV®])6QN(UN˗/9r8|[+oMP]h"2͗iLoݺy趜ND!hbŊ3ST2t˞}he߶m['_e'CKGl55[Zzk~믿֔Ve[nkIj=R9^Nt99|E%;AG>:I'cTG+)O; yM?Wf/?` 6n8Նv{[d}2RNǎzq+/EuL2&maiӦr(tynTBckS=͛7ۮ$z\7Ɉ#ل}8yvr;[:=zhժU<%hs Hnjcx'|f}9rITN$C 5-4d; _{YWN1:xIu ̙l!+!j](|aȊWbufMw51t(I-)#夿euKӧ&R5D%oٯ_0Bs5 |g襧1-N޾}zEG7nWz-MœK4{ ]JIj-A+FF~}Gh%Mb('MWigoS/sbNfAoDU"&MLld Gi8jT&XCHI;Je]9)'G8&5T")L?ibwkȝCBIЦ,X*ƾPN*'ղsbCs~rR6|ԁ+MFVN]0byڴia^wϪq! u^Dy#)]kR%6t#9mqso;fsrĊ߯0 0V0&rr>!gDʴNmօi6<g{0^0̕qҔDFc!O ߎBvqPNQ;x b䎆R9Ș1QNaHÐw%VГnE}2UNBsn !}jI3gFXU*]=TjV_ԉz:X6gW99A[ޒtM@Ӕ6]C=ƞ#0nn׶ǜcL%F{&rb󻽇 M_Yt)y؜B6RWٍmn{jS'n<-ukBC]\.S9C|9JD9# CIbc_(,('4_gqCWt5iDOa=`xlX8^}ivF2T:βn*0'h D "eU}4ιx~W[xaͱ7CnT!LD9y[(~Vۜ7Rk# [r(A ԹVN7ET.O Mێ"uq9RN;ING˓~>0X'lӚmi_(,('u ٢r;PMS+S)r:uꔥ :Th9 F9'Hj+#rϓ:ZStyg*6)Lmv׸^64I [4px)Ó"xlXxqxN(R#Cvm].oSa(Ci_(,(˫=`VBrVoZfÛ!< * b99X<*D7yL޺l9QN~ϧD#SFjgx?'TY")ղ|@0W'ϻDH]\S9xN!<~2eJ"\tHctwy" C*HB9eG9 ܻcBy$B"/Knh>ZHl50>Z'OU&'im]"uDT#WÓM-$WH*epMwڼ~!Y6ڈH )U8T1'kfm8ʽN0rH]\S9r%s^yG^uzw _Lvwy" C*HB9eG9%PmyX%pÇwN9),ؒj| ؤtsMիW7 =m$Y /X *t9ɵ"aG֠_yAz.1dfeN Y*O[3去B*3hN9O F9˔O{&Qqxe2o-; 4o!SFjڈ{u_> <-NiTd~0T[xZhvrBvȑ$[իWǎpa[}]1UN S}U9I(ڄGGvTΩrRgp(À7'E=ӕE8 Q74}nzQ9 OЉ!.]؞8ԭ81v+"=x9>2,gD&([#GN1_9,'E!Lk򄏄#SFK`o5P7UOR?/b TyuIR}iaQs太hXf݋au59Q/Sw&UKbtBb=7|]>+P)PNŪؠ֨Y Z։k?'YMFt5?)PT^rkt{ѣe QϨinT_e~zo\/g ͞C'T'I/I!sK*OR&~VqG0}^kI9%ɍ&3BfҺlٜWofÀۻԠ?hzbغ{'kDmtHwܙlGj/jɪ͗*c=ZTWrgTתQJctwC+HC)˫dv~\ɮ.]2y,E'[hJ$&!L2>םxVAb;s$8_PNeY$mٲ#;RE+gpMuN\ԩS\+WܪU+e>{l!WBdX^{xϸT@ѣ\j4iR敓*U' >8Y&jNaIYyzӚ5k,Xp= kAZdk׮@SJ*ZjUTNi#fǒH,?l& _|]"r3g>,m6v yjiSN[9QlB9ʉٺDlZrҥ!܉gΜq|I^|)Ӆ&5Jer^!2qN_-HC I:t*=:H M('@9"7'Ç;~x ZO<8aÏ؋/&R,h߿Aע. K][TC}Zũ,Q׭[|V9){ v"8PN9QN߻woON%RlNCGMI[ Ja֙* ^[1onz T<_~*'H 6+ *x۲rwM*ɓ1bM('@9dwٳgÇWJ*!j)f[XZ<'*0_)E7&anݺxxa$5=|rdrib('!qE3 )I\/1+hrr N('@9 NH#0ݻw[Q";u]H-%\A.DǿN*+aݖ_BPğViLY ̹PQ)'O`S1SvcKtQdNoe֕SLʌףOR k0jd=R| " _0OR*AG&m޼9{Eћh\~}{hFo߾/^D# \o{8x)Q*0)ﭓO F7͜9SLz/+]HJWZ5+C9 RJmrSn:c+'z'@9@œdN('I[lq<E1UBr( e򬒏T--`eo('|̵MMR F UN2w r@9PN(' (' r@9PNrB9@I}; H9}wޥwdDVʕ+wٴ9g̘sΥJ%+qA9 B=4Ξ=;kիKrPN(PNcƌp(tu ('(e~N? !WM5jh̙Ϟ=K޽{gϞ}֮][ի+W?˗9R 6,r-ZԶmjժUREz'[:u+EdZhb sӵkt<ܠA@͚5֭[{ٶm[RK/$wɩ˗/:T%PVZUk/~5֭ۼyrW(C9itOsrXռysͦ4h+iիW7CWN7oެPv5X9R?JWf|6mlO _~֛6m!Y`&NE4`e^6mڡCIۋ䚣{TcǎP_HիUQXB\2_ȓ'O7nl74r[)?S!+/ .A9A>*={*k׮صk׹sܻt钄~Bօ/$wIfĈ>4SdMWQUt)ر#SPʉ R PNeG9%@9?^e.~ߺ E$M^9.qr+'>r$nݺeȑ#Zf3N5N+ݙoWi#P뗉SBsiڷoLUk/DV7kR2 %4S+I4/W>:+ѣGU.]+'!*}Tb*d'S)SxFkY/<9g͚*TùsyΙΙ3s)rq]%aOr։4e#GcoKE 6Zek.iٺ3g8nId :YZ 1/?d/^࿏r@9 ș'2xfeۈ#ysڰaп˓\$ﲢcc<%#O/0)R!9][\Desn9-(' J) sv+'?Ђ|%߿?+6\+'`ۓ.')R!yr-JY-[&4;PN('wHˢrJ|pr'Ns\ORߚ\+'3͟?ߓ._hbR9o_u˖-TRRwm޼yO>շ۶m+K-j۶mjTv1w\:uW\|СC>ҎŊ=z?e˖'}E9(2ݻ('Sɓƍ+EEGI%~ ;vlՕ2`-j%-ZзTx6mʗ/5_ig,\RH+VB޽{QN('g듩SN R9-YDvc iǎOիrv)C޽tM#FxR.)ܹsJUׯQN('-VF$=<խ[}&Mڽ{Kʞrѹ3ʌrJKrHnݚd1P9ܺu,OGtjn9%޼y+„ J1cF?'5kZc@۠A=8=KrtFeL9QNeF9ɵV24V9Dŋ~.'WSLt7ng8qהg rljlk?qd#Ν;;:tt)gTSNĘlЭb>LȐ!Vx&iӦșQeo޼i8ұckPNSۧVB GgTSNĘr2]6l0kF9sasu !Sj)}z* djlZuh;j׮-E9*j+[38Β"/HrR7ιk.%/gy.-^)ǂ-[(iqj^Lc:l?oW2ǫ ݪZptjc#*hqJسgJW.'CW ('(淯H Eܹ9RN qneؗ͛iFxi&5HZL:Փ9[-QK.Yڅ ӤUe^F5jjڴCWzX~jwiW2Ǩ˗vBXv 5rF+]AY 8Zd9U JurDQn$9RNZ@gOM:#1f̘0QNk4`Q>NK\0FGW;\|+I 燲.(E#33\NrK-o1S܃dr$> Đ+#Uo~t9gϞ[N^iF-W.Oo߾qZ*%luNVɓ'aZOaM}Wfw E2XcVU?~5N{ҥ DZ|kvfm#%6j)v&b9ٹgCd_c˦ sTRW+8W^Mɜk>gJ@9A(/R<!+Vm-ׅrۡwַ8wdxNZ5y=$x 5?!LҼgfLGZ|+n~TV؜׏?(㗭y:%2"=pQ}?ʱ i%s)ҹk/a?H2' .z r(C;A0J7(Ҩ~m⃟ ,]Y2Gg$J EDf4$G92!'j*>\)r%s)[_A_)&U z*ŋY-jN 㨅Ua)G9A"NnMWIQ#r 6Q$vzQHn^P9:#yYJ<ɏJ3;2.r:޽e֙vIzK t++3TNQ]JQ[Z+u}]ryk֬х 4Z14ͪ>ѣGk.*LN r%Ll1r*- rD^˜ ʩ:aPN?=0f@8gGC+@90fʉVr`('TWlWqSEUٽ{0@CB*8z!RrU"I*(" k oXzyRETIo[7Ji&vi&{HHoj={T,y'OPJbfM PNr#wf[̯_MI1c(Qod:r䈓i[.u22I?8y,Y<]vkݦ/DKZ PNyI!y,=n2cDH YN$Io&~GwQz8 (RϤ<2;D8yҤIC3z7nH_ mZ PNy<ӦM`6lXHsSNrU" W Ȑ!1x{fVrS)}*ڰa د_?}\tiH>͛7I]vMjL }@>sTp6G깁OB_?~ٲe;w6tZ PNIhn?o6<ݻX'73fPfh('@9udkću!Qu 1дiS}T ׯ_p߾}ٺukZ PNyϩwYwsP9(~xNo֬G<}rio_)i('@9r vd(l7oWD#`6*#W01ĝ]&شG*@"ab}Ɣ S唊A[Wٟ[k׮>}H{IԫWO{YfJ~o݃Izi;Z>|i k P 9;?r@9 Q0 ؐRz{TY^zUF 3yl~oϞ=k{QN(' PNb̙:$x4h.T/_(d@9PN(')/zNޗk*f͚ynJ. 4rB9PNP8}[--UVա~wIOa޼y=$FHM0rB9PNPLYŷ( jѯʤIַRJ m2k֬ϟGu[ T|#GÇUօ'飦ê`bݘ ~f ӧmr(')Hiʕ+_zS^"rBIыKM\JEH`I&C^JŢPN('@9%4*N @_M2>Ι3GeN dV?t+'i-&d*H9zFڟ3Yō&H̫WN^YE9睠%>[gG._c}9sm H@rSlZb%e5JrgŋIQN('rLh+͋;u9NI9kG lT,IIGhro1{؉'D9i-x^O*)"S']$o$4S On UI梜OrSٜd"gsL.WNk*'e^.##J\9؇<4wޞt9*yS$SVNH-[PN('@99Tʺ -e޽T)ʳWN2m_0f.?~"[9Es aSu3? rֽGlmFDVfCf VN]4B!rmIĉ݉0ndƿNWxۗ(' 1Tsqㆥܹs|Ss @B?Q<' F9ɇyy< S_mڴ)X9%R8(xNCJQ}(cJEQ ('@AQܽ{pS!TPN3f+WnܹҪU+rҢBSNer7z|RVӚ5k,Xp=)*xU_)r@9rjҤr^phԨQ7n@9rRVS_)r@9rJ6?'S.*\(' (' J6PN('r-ZԶmjժURE^;RO>|IիWRF͚5Gڵkʦb4hPbŚ5k[{_ǏJׯ:3g>{,o۶\2.]HTN\r姟~k׮֭?`~q`Tٿ_Ş={UTl_ݲeKUJSѼy^AS.܁bذatohbŊ| }]|yС[jZ?<{:uxs1QN('(D믿PNuvڴiS|y}P?yͺu+u1;wn߾r'&LȮr H PMvA5uA#'|ԙ۵k›7o>~/I4vի+8\Ӻu*WӎR*Tp1 jґ(݊6lpիW ԭ-*СCN'O4nKBSÌRSVʦ|SN6m21ӤZ9Biի#UrxʩZMI{('rիqrm8Jq %G9ZYfײҮ]Ν;Nt:AW2{Į]lث$Le8[J9GY˗Jyȑ#t#FЈeʣ5jwJmOROo.YD߿oEm۱c唉rH0)t Ö(;=W3n]Cu{SNj"u('@9<[n8r䈥'Gݫ)+![)!Я_?'*ΩYC9uݝM4$8o޼1cމ'I[իW=3fI-sʮrT)v<.ऄ*'=xʩZMA9ԕ(l<Lb̙z甅?)!9Ç1yd@hA*zFOi).i! I[7nhEѣK.SS/^r(@6rȓL5ӦM󴎴PZܽ*bh5r_;0O̐!CREę3g&0yʔ)9;Ϭ;`u(ThOŎan:-sFzVxbRyS&~N,G9@)] `[(re7+ʩZMA9r4"wN9osZ'-Qa=թB> "W=eʃ_,USN=rU=6c|rrU6Z`(x9:j^0rdm]@sմPZWuj" (2bs޽{{J{ 8ThR˖-3G~qSMN9b('MY9*9 ]ՠPNw*2W~NC2s=QNYs҂bSN0AxOYPNٍR6R| )?ա&ಫ"Hp('.DlNؒ_[?ӧĉ4ag ;~xoݺr+ ح1%:v쨜!5!ɼ/&SN*YJHiI&[R\r.q>|>X=pmB9)tvmzL"GpX\$aU7DD9Q!o?@9)u*_ZԄ̺r j*sG9 *Th%qUxo:~S]{s!)а4lPǣ-"(_9Y'.)*{WZ5{bqheHQmњIqBh"Ro9.S5Y)PN~eJu('{hћ-rgjrں&lfsG9`Zҕ\oXlAPZz(B((à/\i9w3pƌB(@9r+lboL|X̢yT ?;)1@* PN('"";I3` U@+@9A#y$/Tӝ,7eRk}Mc@+@90f PNr@9 r@9PNc@+@90f PNr@9PN('c@+@90f PN@zϘR;e>fHE PiժUrΞ='{/ɝr(޽[8ʩ**wԩSGʕ+l('bzQEk֬٭[UVz*׬Y`{rjʕ5fkn„ {yMƥДS(U7l]ѣsvСz+V[n'M{ϟCB9 EԮ]m۶m%7iD\p!Û={QnܸQS0*UTZ޽{39-ʩ+ZE/^(.st9=ىH65h@9CB9 ʿݠxb뉦M'{iTNZo޴iSͭnW\r*+UR})hΜ9vyҢ$daR mڴ9qĻw+Ν;! %cƌ1)[!C/ʶr2ɰ{OVҨۧWP٭. =֭['g}j @ziBn۶\2.]j]h"Zv tbذa:MhbŊ'%g˗/ke}R޾}dsG~"|׮]t.]2 }F9iZqV6Ɨyd=K Swդ]V }+~(Ν;{~޵kWN]fRNZl56enQNGMy!>k֬,ubD?LUsrB-nz۷oJigrB9) 2w̚WZ/ѣK.!;#I4=5Λ7O*mܸq21BշQN;v b{ϖr0f,'E9e)lʟ.Z?Żn…J<3ljZj˖-s[βYPN{؆EԨQz"*zOfO09IΜ9Sxe/V~?)gۜԉ8-)+-dSFa뷦qDwmS{\9~ڞU/_w`Y[SV9MrY Ο?S大85DP#vwfV:+ Zkϝ2;N:Y vkWܺuKoʝ,5o N?ÇWJ1( rRfիcXV唭HadS~*uBκw ~z<؍wڵ M#c%\ nZzrϼB9̈SDhIK",Dң bwn_ɬթS'h󾗜* I99+,\U+Jݢ B*u hwnoElԨQ F':MyI[\ܮYPN('=B#ZK/ {ѕlݣG8=kZUPg{.I+Ҍ {uBT9eH˫kDqh\Գ,<ƁenQN(lu}>}Ht k֬qǎʼڤ7{I'E-K;2:ELլ2PN(' ;Iwʊr* ]P8cF!TPNi)1@* PN('(c@+@90f PNc h('@9PN(' 1Vr`3h(' Z PN(' r`3h(' Z 1VrHS*znj(@9 %u)Wܕ+Wdnժ2={)2ݻ 2 ԯ_ѣ\j4iR8|MΝ!TXz͛75j޽{_~l-iQVҷ:TUϞ=;@3.JKE=zhܹ:tnݺ۷4iݻ?rB9JrTh׮]!(oJTPp5jpd N8rB9Eܹs5ktn*EjrnPN('@Oz=pG9=~xر˗/R ˜6lx<~QBʩC 0@_-X  D9gExB[mӦdw+Ν;[ rB9r5kVʕ5kɔӦMy'OYfɦ}ʣر#ߔ)?+Jv*C9 x0f̘UjR@L 6l)'Gij׮i-ZX¿k׮-ZHkBG%%n ?hTREo˖-Ie۳gO߾}uHWzFz>mڴH^əA9gEܫU.Ot˩NM}:[:LN\4DE*'gO \9sEiGz~>,ѝﴚgϞ[͛1Uv[ PNPvP'ߦFwN|&LfD%ЂjѺ}O!]vUB"j#ׯXE@p\ [l0hPiJ]z5P9yz?3҇QduluZ}v!ON͗Y65DE|fݖ(')$dvJ?xb$Ndy/qvNdsԬRrȭrRS^~VTy^L#SH5@<<{_YcX?>H*-PN('*'y&'>|RR)' "AxN1ʂJ+ݺuKaRD̓6nEL?9x6 |q7nmz"ƋF ֮] ZenJzrW=mV~z'Sf('@mS 4Ttzsԩv!mDRNrU ŋ2_t<Гu(Y&ʔb|WB*- ƣ#4ē7h}l֬q*oE9mEmذsrMI;dJuX!M3C{lPNK)2_QrB9߼ys=z(&MryY:tPv *ԬYk׮s_56{0*ʩL*G-Tz+֭[}&Mڽ{9׬Y`{e('(J*}vrz4SM/V\^zUTRQQNyΝ;'mdS jժ<-DhΜ9ʦ)ѧ>[#&S*'HO,F;v<|ܞq'7B2irB9AG|5j:C~0a'2J%~ӹsgO!ZtIDGٯ_?ԹuJoٲerH)1wUϾ4}?yzY/R&S~-VFSXz hݺoٳ]6Td(rN _T/^ 3˺S+zHK;vx ҧMIܫE4n8&1B9UX9K%|6iKءZ?G.]<}Y>('< M($/"=9̸Vڲe<3)dIUHPN('H)uzʕJWNYɉp)|IUHPN('(,4TԔS_cNꗝGr8acؤ1IO4Q.YyT<&S) ͝È=NB2lrB9r2+T޽⩔S<СCQ(\ko_)]SN=NB2lrB9rRJ9]Qh)}ʔ)%)lB9.=NB2lrB9r>}?W&r򯭳 xmF#R?T*Vq#PNy]EUM*ĿwJpRy <̷ֵ6{JIY$x}ɳIRڵ^^)̕^S|RM<) N޾w(V_|ycoW^vDj8 ɼQ 3*pWNw~ڝ!x&}n DiĈ>4smPN(R@eعsgO!ƼV9/V}z1w PN?jTzg_yN!)FY镢'?GeW9Y=8[nك)Eݚ\ˮG sTj MwQNeO9)&tN3 yf[B%@9H9ɺS+u+e2k,O6͓͛Çufƍh*T9bt>S)'ycvQ}եKD0N2;)zEvIh0N5R9@v7=SlT|.:ʩL[" yf[ٸq# Tfg݄䕮ӝxŃ:nd-WǎKlVXРcck@jćCIܐ)f2d ?/^?(7QG*ʤr2n9'&>#'5mBއj@^rB9utYQhf=[ќ\jNATIC,UB&=RNZllذEPT#|<5;T`:sx9+km݉t~ DPl!a@DMhQN&"y r,9@_~*Vm2应c\ߐz&=u5C _~;Nr*Ɍct2m>JG9PNe**p"(CmSNڅY Z# o_T9ɳ,&^"2e[1 ׭k `/(' .$zᬔVai!契a.\\kQ'Ǹ!YƭPuH1.:ʩ +''gC&}rB9T$L~R!P{ rֺ_8*-`d[z4.4yKEd^\`P=zctC@h1]ժU=5w]{fHE F|w-T('ԩS\+WܪU+e>{ljqdϴ,)ƥДSmjƌ9w\$ T_͛ѣG4iҤӣGEvСz+V[n'M{ϟ\֭['ի5jXɓ'֬Y`{PNyr#={6 TSJ>NFvʼr:w\͚5ljРAZxAwfFqFVN {q2T9Ik.\@96~*?G9PN"28p?~շ۶mKQtҨԼlWZr*6NڦdWFͦ&9sgϞS[=F_oQ{*ʩ PW 4g{ڞ Z6(JpȥFSz2K)]96mDy˩FiV%Kd@X'.r4hWw ,;*aڹ6 /_\xڡGv?B9ifP-Yt%z'w%a_tɜXi$&xp( G)SN>m)o߾S:;v쨇W=SN!D]UrTf$tә{E1uiUϞ=w!'մڵt cօ?Gyň#>|hOr*)moSlw3_/,OrQҤ"ROrB9q`nVksҌ:gqX)D=% ٔ_~b5pyKCի}i2Lz37o.}xN?*ZjnUtir& ӧ룦R 9!GJ8և׆eɉp0)L! 3u9Bxu9U'rB^Mgɐj.tR .ےB E~yjڮGN@rB9edmekQuߪٹCѩ:B1R  ^7zH!z$9zkZTZ@k\NԉqJhW޺DQ`˧TѣGk(mXpYN(9k"d9{BGzճ^%mjOOi&CNȫ+Ҿvu"tE}o]sD92WNBLV֥Bm'/E982xVAVAi靲 r( },r73 g( -[8^%6rH2L3ƌ(@9JN0_Tyzj4LPel1kjVթuH?)Q r@93h(' Z 1Vr`3PN@+@9 r@9PNc@+@90f PNr@9PN('c@+@90f PNPNr@9PNťKPN W¦j;@r((' r@9QrB9PN(' rbwr(޽K('(Mjժ\rgϞ N:|ʕ|>{5nݺugΓ+qA9ʩ_͛#ѣGsСC+V}&Mڽ{9׬Y` 9:+O"~gW/^P޽VWM6 #sԣGr.*W2۵k7a„={y&:T M4Qɵk־ze˖TN1nb{TXܹs5kִQ\V jժtg!… 9:H7nX׮^cǎ9+ϷW)NL2ܸq#adK9I"/BVTɩp{ͤ>l˗EImrS)CzX?pG9=~xر˗/3z(ҦM'N{αܹ[4~xe2d'oQSN ;v;l)' ۷7mԼys +W]eT*'QBs.b܁('@9r5k&} ؔa=kɓݷom=x ߾}i<ݺuSj@kRI Wy Y$F/+_NZ*S܁('@91[P;f̘UjF 6'T"!Do۶\2.]j]h"Ͷ֭[˗/:T51"|?wܱ<ڵ[|h:~M+FRiO9x1l0Y4֢E+VIhM U|շo_TX^=M25˗t~w91صWw`#L[('@94=ޜEB:UTyIpN w˸56,(yhІ!yM|^ZCCdiӂOoذIM)'N-[}u0vܸqi/Jkȷ56ӺukY)BٳD4)~C>X魨k.F5hzqcx%k4 rܹ'k׮J\99C͛7u)%׮^T;jI6nܘ/޺u@5I>}'>D>vyrW3WNO>MfGW]t \WN*$R=(HgniYpaq̙3gYYYd;10ږήؔSNTDg q`C^f$jQ!VI9*?8}so_n-l2!b9FPϞ=c+H~E`kF9Ÿ|*$R=Tht|uүlag%=)|N%M(N$唪`μ-x[$RTf/q/#I"Ni$VЄˁ)HȄnhCZ"HrS!H/$Q:׈'.׿6{FZR>|pDRNFz׭[L68)' J^57ທiQ]wVN.̙3-JI-sZ"p(BDѷW^/LEXAyݻw{SNrт&^9*?8pGRMc$T#[Ia@{UD@9JhY"e8RIS ZP 9,JdZ"p(E 5.jT4g^"#''Oj,R 䠣F*D̵[~$Nh/MU~dC?%*`8l)'\mI%4;syUHO[^6:i^**A $4AEf͚с\["3 PNPﱕT Pl@5 r@9r@9PN(' (' r@9PNrB9PN(' r+>}ZUV9`noPN?RJ~ŋ72QFիWXbڵ{p7nrǮ]|ի 0LjHH4QN(~:rr֭[k֬Y.}ў={PN9b!۷&wImiF# GթSGw+/_.ZH_=x m!3g, 6͛7?p)o UrSpqխ[wӦMer^zJ\$[!ilꫯT?s~TfSѨTN('ʩsٜJ*_'O3$׵kٮ\"j ?UNʕ۶mh,IwO>qVPA;t0k֬_~%P8q[@ݻڅ_±I&gV̝;)J)B$M۳Yti ޽ӣСCUʦyjun5Ǐϛ7SN*SWGHnz+H%"{L[jnHu1?|,򩅎3F봧pE'Qe :uժUO$úډ5 sja;jt9T:tH>ݎ[w}W7ov*$jSviX?Q S8p@@K,SKNZ͚58qblfK9pu:3߻w~[nKNEX)G: 05 j1.߅ }#Az։=z(_=Z_߽{www\Z5uIO|- 3U$唋&e4QF]6F>UH*Cw'6:-u&JԒ.2vq$Lԑ8QƱcǢ^>ٖ'?rjѢEVSVN$ډ5 yjaL:j;T2ȨkgϞI!.-% { ~QɲܹsG;R˚DnݺsA|ݳo߾]cf߬990QHNg%upްaCў{iӦ:è%rNB6L&e!|rʔqV468RNZʊrʉd^Q;bFN-mȤ ~N(Ek褙Y6wTz^Q Ν>=rZ|Մ ڤVرCS6q9wM#'Ovy;r~.xQwQc>{'n믩3jiG9e_'!3LѴi܆@+'=2?6j'Vl(ҩ1:jPN 3sQ=iW6h~|٨DY܇*)͖rJ{` 0wّ^n *ɓ#Zr*rQNY=IȆ)2ݧt[Β*'K2?6j'Vl(ҩmtsA9J z.SHÇI,^J}%~#|݄SfߝDg%!S.“:Bo-W*8{Zr*rbPN=IQYhO鞅 s 6'Y.rD2ۨX]H|gQ'=ʩ̒:WV!zt娨խo߾Uid-rUms~s)遹[ Ov%oV<9 #5^ɩA9S'CrG̨f3rT3M1dx"mNخQS QPNe<ׯ'sR xC{ͅ{cYQNN=E7ϸ+ @6p'vضm["{\"0Bd`VŰʌ]{أr(')S^s眂Bbyw'rX]H|gTZYnE jlZajIF)=7!tq n('yKOHY>|8jԨkrO*3wXIT#hݥbĻk$SyϚ;(S=WfNbQ+s͚5N~yOj ),1)[Nt7o:"C;)wwx*vbv"ZŎ:|cS)FYyo]!!#ڵ%D98%wuuXt΢a=ƁN]{kժe)ZޕYG^t7jɩ+3vm_'G娕Bs$+aa:bFN-bG1ʩtgej<5"ڵkW$eE]iFO9sdW9Eo2EM۷o;0=ZMNʏb&;|)G{ ص#RcTfrq?kO?6]Z붴erz'%j'Vl(ҩY7F@9z~wf9;lwJ_fc~ȑ*M_=*wޝ-$PF,j}7;pۊrb-ʕW$=Gս~/p[PN(' r@9r@9PN(' (' r@9PNrB9H9 1elNns@9PN(' r(8rO8('Rn8ɖ rbC9PN(' rB9PN(' r@9PNl('@)M+Wn׮5('@*~n„[7Y qvZ}'vPN(۵kǥʗ/_J*˿Ԫ\}1('ϭ_C}Ѱa| K?~|W_M y&('yM6\97icsB9N^rvRB#F CgߢEUhYFr?4q&M*OŊԩݾ\xrjռ;y\U9r(Iysf{xlt>!3\Tu?xAzES4סCO>WbhӮvT5khٲԘZ~ Pbi%uK&Q :wncvXʉxتU3k/'*E.\86V-_>̙N)[Æw\8o%9QN('bUNWSӞ=k>tfw6yiŖ2xZdVpdm ꣟O2r($Gz[9IN}tW#G M٣G~:p-<&ZPN%̐ͩ_8z`iƺEթS{Ujn}36:sy K <9?EXD9I+Q 9.I\=~sr2tީ\ 5jTG9Jں6'W(Y7k֤m[׭[.MzxN('SN PVM7R4%c( Wnir(sNPLWϏC<:Eru6- 5 YQ.u$Jٶm wI>ڶNE$|ﭫ: f>Iot0 \\w4ytɐOS(3<0t qd pp({ݽݽ{rۙp pHYs~tIME: , tEXtCommentCreated with GIMPWIDATx\׺onP.vņE=!v1ֈkb؍\1'=7\'S79973 y>K?5k5y׻Uy((ʒ ӧ311111111) '}{mfbbbbbbbb$n~z&&&&&&&&&Ipҧ ])tJ*&&֊5đpX%ZѨ^uɟ5#R9c}߄t|[֪^3пbúb~m(5ݏjڰRCp LLL9--I_yc8MRO#IYf21&gָsdL秌wuⴑN# e`){gh\Sr"dpqs4?;yhh٠vY}.3j`GkФ33umڱ7oT~pa}ڽ<5BشT-͇ݳ =eˇc7@Ts،]R|ۧBwIN564)dy-rZzŘLNbu4Io9Ml"S.Ja͂3,(_P2g@VRfߚ ixT 9D+_;YS&3bgu?׮,O)9ímBV7ǪcoְD)3g|we }Zԑ籁JoTsD+_Tm~9.kĔҼ 38׌`bbɩu N>:ɔ@`ϧ|O%Jٴa*PYVP_XC 53Y {Ű N wxmgmtjp i[ԫZ90nujTzab+غ^%8X80ծؽSbD֬eCm>sp+l]׫j,SNKǾI_YgP&&&&&Ӧ'u߽b4,lz'hڕyrrcJ%~pLLLLLv'@'n5[abʍizbd'?KS`bbbb;zWf* T5ȷs˦abʥilחIҋC38nVo&&&&&&&&&Ifpҵ7КIIDQEQEI'6JQEQp9((DQEQEN(("'QEQE((IEQEQ$((rEQEQ9((*?rGQ />ExIp 8IoyNxQx<޼qqz KYQ/ҔQr d"M1%-n~Z\E_%5rW2^,7pφKo`rW2ŋƒn{OSD{W2^,$$b͋ƒҞDҞħb͋ƒҞDўDNj`yI'(ڼ(m|rRSN 3dGSlp҅WpaJfΜtYOtww`8R>I)))9iɒ%'_N={hڴRnNrN< 3vr˖-;wb>}:y޼yI[uݑBNʟ4uT쏘X{}N)Iݻw'%%I%Pbb#R6mwyӦMJsaÆ\TJG?$lI@zT[o8pWL9f͚%l{\wI$jذ!/ ^yksRjf^֭Y֯_o߽4fᥗ^Xرcj?D{3!!!<<̟?_Ȍpnݺu/Aw 4i`R\M8 `ĈWja}ދu?ydV69{b*Tu>D%W}ў0,uAVo)S],O۶mS_}.vM4xdyft"4k La#GTK"Y0N$㏧^qҥŊo={`ra?mܖg%3uI5f9)5Z|My ~<-oz&$J!F쪆nEȄ-wvWT;|pHO1N*Άۢ=NNZx1Gz)< q=`pUE&n___8S%iMa, S,w{ĉG9L|?JxT6M+]EؽN:I>SXc4"(YV-E@r՜XFGT귔ޮ];?~a98L\%Fxduxdy˭(^5j(_@O)ud4u՜tK\ٞwƉJd?{N$;b;8 1} rhLf'VE8k? W__2""ͣ>w}ۢ=NN/ (oo'^VHϷƲj #pQRYW7K_]4ߌ0ՠ0+Wfz:T՞ 9xZWOZ5'>cxÇs8_ kN|K:&L r]ޤ gڵ6Χ߱cG (wo1vXula$㏧p>q*έIr?(F,\,Ms:'I8'Uw~I0[쓕$"J&Š\=o0i 7c/Zo b4jHa|['IFN?aL2JӇb#` o,7À`'qb)Sо5uX58 bUjz`G?2~тWy 70_ b'-;/Հ{+bqrd4{!wݺu$ ]ydi%J%G.dGSl'ɣ w7u/Ƀ fDf˛LoOB:F)OMa4pTZJ' |Is ,h@xb+"qsKo T#MA~ݍ7+00rР(2j e|Z;qx7rE0_r ܼy7g_ @ T|L={%3ظ6qUG2I-[D͛< f˛}ߞԠATK7 [G5lI))gx4bگYۢ=~N)p8o*iF_{*ݱ hz*}QI'AQs9u.| NJfna‰QlvH(ێp.'9@h,I8x), ӛIs=5[ԈF~[;0Irq 72]EL0^q DߖtvJG!:mKY^2S8xSl7')}:>Y9!~(9I=̚V8I-pmў'!QjYw)_zȅrRʭgŊWăI){S{ե 3g3mJڕ&Hx!_F-yf9@Y$#W p'<͞@d R-C%6 /!Cd㒙j\Iƛb9 Qrx7OVN$<\qd8dj['9I|h^#g>CN쀘+ f+,E)$0K6nNҟvt^faF Z4|Ӕ7nɗ޸{+bqr?v@l[*9rkq@K術(QlI%3ո7OҼ r~֭[,ʛ}r=I;j$Sۢ=QNa8e|R<}u5'XSBw,m+beyB^_|End[>Ӊo)S]m:LFwFvBcIn/8i l!W8[%\qx%XtUQ(J=v'i.ud)pɔ)D4s;7`qT]|mM=Y9Ӟ$\IE{dQs⏢02m۶]ƜIp E\Oݣ >8{Ub^!XQ"X*[*5}P=>Y^zV=t%~K=X6x?6N !Uo)7n?"N2xw-Cl̢ !͠%ۧBKF.:N2$.I9'ШQ1!O%br6S>Y9Ӟ?:Z7&ė:Ƅdj['e'5Yn]*щOދ$wZ(4TO2]m\2qcK2"P 0X04hJxj\/,+ Cd K q&͞vWb"r9LtcA188FI۸"o/8i *IEn>XNڵZ{%3ur8'TOpA݆B&l}ӡCr5!:⥨ UkjU9Q\0$^?K{E{-r n@0` `Ϫ ^ S喋[m^,$$rVD{R*If9(7Ngu}-rIEQ{wFN(("'QEQ_EN((=((DN((DN((DN((DN(("'QEQE((IEQEQ$((rEQEQ9((DQEQEN(("'(("'(("'(("'((IEQEQ$((rEQEQ9& lٲ("'QyYǎ+`X{%'QEQ$*7(g/^\h߿DQE+9("'Q$rEQEN(8 jӦM2e .0bĈs#3999$$%<==۷o\vӦM-[DbŊթSgɒ%R`׮]^^^\J&Md9ҧO@wwwԆ:[7EQ9夤$ ť)::ZSӡRjU)͛vرEAͨ PB/<.]ѣG+V|VJF(DQr Ttq9r$2{۷ w+Wg:TۧL{)ȄxԮ]; Nje_dImINڵ>ĉS("'QTV-M>&%gǎ 'UJJpǎQj֭.v!TPؤ9slٲ_lmu ?-vQEQ$r'OݕaÆ!iӦJ.\EjM)N14H'$O0LRɓEQ$r>'꫚DZAOrsI'q$βZE~+n_%ߺuk֯_o("'QsDiҤpβZY#ܹ|>KHHc[[nH=x+KѯQEQ$r'!_~LgLm+5W^>|8|̙(DQIp*BNLmK={bu<("'QTvp` 2.]jN2-f͚uxPE(*;8 ܹ32 tԾ;w2dȌ3IƷիW/"a`)իWFFF("'QT6qcZ*,UTt=R[r nK'???Tq&)I}#14С$Zf &w6"U f 'nEQ$((rEQEQ9((DQEQEN(("'(("'#Nz(%Er1'=GQ2$"'nNzJQdN_119+IEQyb;Ϗ"'''('KLLJ$rEQT⤗o&&g%rR>c˗/ik׮rxc[IIοDN"' gϾuFEI\IUTμEӦM߿kל^3EQ$&&r9)wsRI$&r9DN(r9DNCtΝ;{zz+VQF[lymN)ߚGF5s߾}^^^ AAJSm۶h"k<ܻwoooowwZj-_k(DNwpB777VZUVM`ذa=::ZV4lذTRr1m1v ..Neɓ9iӦMŋjԨQti)"'1iR CS6Iy *4|ppd8qV%޽ۉLp؅ $ѣG@4dMn߾1kThQ%sժU9x|ߍIJ _ B~aVqFc؄ FN"'}NYfB~pp8 \rESx(q ֮],%HbEcNN"' N&~͛N$ '**J߶>}ZhjNڹsɓ?frEIF[#!r9)sҩSM\護r '9!N'qZw5' X$"'I$reNzơCI1՜X'.J`5rEsB7*X2ESER qJyy*\ثR`WWUiִXnU4wccaCW vw:/%VMjih۷>Ĺ4lmŠ?_G0ұg$筠[IO;~oDNr=uANիrOQIENN4n["~9 e=x+#>=NFLͰXhɒ~uxJ]47 `G'r+XXD|0unDG0{|'rQ+.Mش3'l!KATUÊ18$9$C*~Wl9s}mjժ.$5SENR^x65ș4W`ܵNxaPi֧wxے%i%J=<KOcFh}Iځ`՜9|dڋJzҬe)%#Qr:ɦEN"' ʖ- Sfټys󻉾 цyH)Rzuܺ4=ZRLL/cs0`nQNIIl(QnF8FElh,7[w3%q~xcQ93f vӗHV!@\pJN!>5Y'ԶI$DQENzV"{R$9ȴqOmI$I9O ke?"xvX3@?%l#f,)WXCb;o8$9DN(maቜDN("'I$(r9DN"'QEN"'1I$3dr>PEN"'1I$ILL$rRaiӦak׮mDQ$r9DN(DNb"'IE\IDN_ɓtҥ\r XbXXʕ+߿o^`/RNIIAm)S+V׷e˖3gMjFv(rēGI~W@Ĥj4i$00PBl0UxUI%{VO?TrebׯߪU*U/cq yIE'!εYNZb~k]~]IJ'ݥK,YҼys)saSe,ړpĉw؁J#6/cїSEN(dg⦭Đ4RZׯ2G}{.?~-BNTTӧENڵkd*U?{lM>qF'LJmFwE("'z>}1LxP6b@EOv 7ـK7'>4%&:hpx;9#@>TNmI85jz)RR{Y'O۷/""˫p>>>|X:?ݻpɒ%[lyY)gckNII 4hu/^Nd}?5Nںu<<0{=E?~ǖ/_|/RT> : 40u5<=%qwWF`-Pr1'uŪT ,wx|ki}k#ع!հmi ^s>ZuT(lR=UlZ۱-r9*'ݼy3 ͜ Hj֬YÆ ,Xf!C9 n :ǎsڵk- ĩQHps;s |Z~VZ_#իm ᤍ7[o;"44֭ӿ nXm6)*p<@}qBJV-?^`-N&%}%5Zm ]]`Iߏ)|4Vu# 96Wx`KV4pBRmIV9m۶iXJիW"%NJHH@fj.\ 9=ZpQ߾}[I I&oya~iO{pp0o߾wEǏ'O]iڵŸ||`qc%'uM\5bÆ iѢf+W},+v})nB5qEV6آ" B8Ƣ>KOc{=% jZ!Wsi-zY**>RJG弳|cJmI9ҥKb/BIׯ_ f!EO ua֭[ݹs6$wؤ_P򱓒sEف>H]Í7N8a#F8QOE}QuiӦ!Ǘ"E-Kclq~^XcL%#*Ԩnd~%pSi0eY-= !]p;EN"'Y$^Cכ}-Zf@>}"k.M*U ٚ| !=eM۵ogϞX4rHkwQ6wΜ9j&Da)d1al I6g=)rKud8dj[$reNիnӧ;S $>Nzw5ՂB,rޱcw A(ҥK+xF4v2GqTZU_牢(r$ * 'nZirRX+IsR>Al$S"',sXqV^oJImp֏wT!o?z&e˖w ;&nC!!!6&NHn]xaÆ F(rJgOUH/1H E%&=G~.ƪoD"'I0B봴q*6z@ĴIc̑Ic dOʌE4r.DN?"8D~L|a Ydj[$rওml$I111л'cnݺeQ<(G%8:tHuHQ G$ӀS`u 2 owH @%PIpD=@?%l#f,Ao$!xYR?.׫zaƴ$=6L*,Z$Ёz3%$"',s@~۹s=█$k9IƻAkЛD۷oO.ZT1?gY(r9DNʳDQEN"'1I$I$&r9DQ9)s9DN(DNb"'IEQ$&r9DQ9 I$>> 4i-2 |A^}IxcիW,X"Exxx'O((.;wwcɒ%#?j(___lRJIIIݳFv,ˣIΝ+Y$N+bcWbŊaӧOk&'Q$I9>ӊ+e Hj޼yFCTNCZիW0RL+V`Q.]xP RD˗[ؚ5kblo޼8;7l;Շ g;fo>l̷w^{{%3IhÆ X=''Q$I9xiF\~nnn8 ѷo9@wJxE5y>Xd:t9jEÇl۶m+=~b4%L|4lpl^}UIgϞrooߎu+T_T?zD("',Np^xߣKENOGH%^ʕCᆱ.)+teYgSY,}tjN9s&n$\k׮_gt(rEQ䤜IӧOk}{w5Nڸq&?8~80bĈqqq屖ؔ)S9l0%`5dȲ!NNNFݻ[sqtG.x5o bt]rE8I1(rEQ䤜I111x #`4h5NEG_߆tKG]z,UHrn݊&Mia <"~Epop¨~oړ(rEQ\IUvZ}{7zh4Sti58Xt0ڶmlժސ*Kgx[">1eܺ׮]aҗ8Lgy'Q$Iyߞ' C~xx&_LGzNڳg2GX2_~QAߖ#5eO2cYrW\Y"!QsEN($!Yfiwi0lٲ$M: 6ĦLXEn݂ȆUI_U'O?"'QEN$1n8>\$8/[䤧1Dožl%~aiԎᤧq ?Hn ''ǭ'rEN(#'!OALj$*ϟ8&X"`>c_Z5Sm1jK$D9p 1LAN)BNΝG}[=οI9(r3Ǎ#JFE ΒF+k$ M֭3I:QQQFP HI)XQ0G_jJ~瞙*QD˘"'QEN3/e4T#~$/ɓ'×e? NX(f!BDInw'y3JP7DoO8Q}ɵub_"'Q9d,J>|uM*H..ENʟ۷Ǹ7cT붅OJ 9e^brR$( =D;. "Јͷ ErЧz?.1̙3֏`lƗ`hKvra1Xǎ+`XR9w8 H[SOU/YZ~=61B,REN n^»_< Ex`6$G{ԩl8=' abo+%,9 Ch$rR$8w!#I̿C,) խ[W1G㫅I94}awC2%2!wݜdP Iy~iӦa[ri7nNч~(jժ}vW(8I2*/`p 9"'>?n(r jtaLYp`B8aH/"zY[ 2X#xRL 0:|ߓ&MBz8!+[{IkQc$}8< 0x4nڴe˖(P/|ɒ%R`׮]'mIEQ$9 "}}ajRM o{޼yJkܩS' ]xҥt5kLB I@`5d8I[:e ;DNB%cT\3#gL]رc+Q- s/:f19I4T$I9iV0/Ir劦݄7%ʥ)).>r(*qE;'M>]z,8 NA>`b,jѢْm))3]3&8IEN(rR^$q,at%Maq:fK*<%INN(rE'ak׮շwpʱ1MSqcm94[Ih dp$"'Q9$G/^ͨ$"'QEN}Izte3j+8IlLQ$Ih#ANv3j+8I?df"'QENʭ0]'I<$NBsXT\9LjJJ7]۰9gϞdf"'QENU7imohx܈e>|hJڐƍ$GmxIsÇe+rA{q '٨IErnÇ%@%lMJJ_ rH مMQ 8x(tNRRR@f%J0>[I9@QNTriN(f6ENա(rR~$( 3/~|("'Q9)rs Jl-^EQ9"' '!8q׬Y3<<$&X@Fe%EQ$"' q?0m4tÈ3(UF$=WܬyYTS9I$qSE(DN("'Q9DN(DQ$r9(rR$}$r9(r9DN"'e 'z},s(r9)?0 FOaI$r9DQ$rS'I$rEI9DN"'Q9)ɓ'ҥXbXXʕ+߿o1z P.xxxԦ2e a(Vo˖-gΜ?*cbdI$r9I${72P'brĄ6sYxUV JzF~rԯ_UVUTW!?4^>yr9)7qO>^zgWZ%K曄|yM4 _`mРAɒ%TשS'99YbtFRJݻgqN9Xt9 N+'EN"'٭A:q4M[v~j1x5{1'apB䄆b+us۷o/cq <98'W%eʔYbqKy5gСzXkժ|^zL}@7o }5kְaC!C7픃sҾ}u޽{I$Ewy3PEFF*9,9>2}0$rRn$ w=M{.`Q6mܹ#_^zu777=k}'矃oIy?~lꃦm۶RoUF@.a/ͦrNzWR0&={/NDNrDsE;SǏ>bĈxZ0C9QQQD-԰L̏>H]ƍB6tʀƾ u>Ei;ߚ9bccѤL:NzQPHmKFfRbbba{i FΓI|(|qFMӧOG>V[/ FLJ={Ģ#G޽~X* K1?Y(rR6lhU/^l`lE{''r '6>""ΠF)Ag6l0A#Z_EM;`Ep]vE;%EN"'9Eͳ?IZYfiIOuTТ*;ON"'N2 b \dO2Acʞ䔃U>}Zu֍DIN\,m4ƍÇSPdIDu*;ON"'N2 b $'1䔃U/uBЪDIN aASN)An::E=J>}i&Nc,} A#ڍapI\I>ASƻ!rw;yM? Qvj!BB1'"3=|/NDNzptV~8RtܙDI ={:vVu]f ζmF; ~$a>jaP:X"*(D%DN?grWsХe_~eذaXe{n $L!Xw3A!xbb"Z)kqDI99)I,(DNI|Ip?BԔ("'(r9)qh˖-z4k("'(r9)p|ĉB¦eP&XEQ$rEN"'/N0F!\1#Fcr@PIEN"'QE(DN("'Q9DN(DQ$r9(rV:aDN(m)ʹ"' S8(,REN(_8 SIϞ=֭[N$5SEN(r9)pR*U"U!,S۾]Q3EQ$"'r7'9(rE(DN"'(DQ91N*_<|A^`VO<ٷo_DDA G6j(___VR{I۶m+`I-zj?I9LۻwoooowwZj-_k(DQ$rNZz5)S̊+|4lӴo]hexrE("'94MY<==$FÉ'1bDqE `GN(rEQ$gr +iO"'Q9(rR6qҜ9slYOZ8FE(DN2IAa,:wŋǻaEǻխ[+?dfIEN"'$hذaXT\G" Tw^%',,L'}7hxzar:'٨(rEIF9Çb iܸ1Irq`IC&6AzaCC>,[AK@X6mNQ3EQ$"'rhI1112q[ٲeo5`>x@]Ν;J(a|~7#dfIEN"'QE(DN"'QEN(DN(DQ9)rFe˗MCQ$Iڱ@V(|P9(r("'QEN"'QEN(DN(EIEQ$"'(IEN"'=ɟ@Q$"'֬Y3{[nI9!"'*UŏI$#6mZ]*EN(DN"'Q9(r9DQ$Iyʗ/n||ЫW/,XUd'OۇD .#VV߶mH-Zd~ 4hРdɒŋSNrr?l_=p@.]ʕ+XbXXʕ+߿o^}@I"ExxxԦ2eJpppb}}}[l9sL)cՌ ~Z \?x`p)DQ9p o߾}6޽?Zj.\=Zp!2Fo6fvaL/|AclܸǏM5Ѓ Š{8qB{]O?(h/^Ff͚(EJxhh?dٹsr*wIE'5jH%ׯ_hѢW\Ѭ2p@2c 㜤h"擏>H דy'Tr`$Cle~h /0f/tNTw}Ix'eN;)wK.i jE>}g>O?6m'U9xI^K!g^Yx$ogn'Myɓ'_EI:iwR]tQsG}4\t|RSop2 )_毼rNjt]wehc~FK,^834azGIrҨ~+!x'eM6ηUq„ _In_GM@;;̗ɥ2=v;iƍ&omNQ%;[OI:I'ֿn2͛#'{P^;)r̟T"̜4=92S-Zh6mڔ/3A=#^{m4u=ܓ:9 T6UߦX:i3>gl+bU6}+->s Y5kVx<2X*]`AkwI6ܸXn]E9[64a4W4o޼lf 3_r9I:i; <#/,/k )+3)e /\~vt9<$X3I*:i Brm:)MUF;=cz;RoɂB_!-t]vRMҤ>(S,og&}p 6 c'm0mѻЈn*q>/Z:I'mcm F;,7xcʽiE?~|wk?R@ɹ<-g]vY+OKy{sB#y(FrNI:Y(wh'ת֗:U);-ɕ<a4;a ˻+oup}v+tNI;|R4[RF%/lQ*a;)׼2y4;a ˻+Z۬tNƺ'g_}8N'͋UN 㑷( ;/@a ˻gAַ.zANI;=褭;~!=N*^V:uҰk$7Ri|YŠwRPR.I*vRGtN:|ܙpkKm4mzNIYSvUok:)#u23NwW:z-tz|e˖)yIL8Nںm֟nS i|JGT 24,b'uZ:I'2(Sf)3>s7O)e /wGtR͛gþi@I+=9抡04wWNI:i 0Q>PFgK"ִeЌ4G(5\mmctX9r{'4PP'?߭a UꯥtNtNtt$$@'$@':I': I: ININ9:I'$I: @'NI: tNItNt֭+`oI: `upI: @'NI: tNINtt:I'$@'$tNINI$I:I':I'tNtNQ3gΜ8q믿NI: I:I'$vFY~}~ϿuNI:I'tNI$vN/ŋ{zz&MϟiӦ?t[oaÆlC姺-[u벇ɓ'giӦ͛7'6v^'$$4ӟk?p+_4Jd̙);YlYS$f}"f٩l?g/۴=tNtN+WxW+sgo~3@rMetk'/ҥ6nܘe^zmOI: @'2 )_fdRf9_'5zǚ{W$tծ5۝mQJĤɥ~T23d5kVG4CI:I':I' F'u ͛70R '{H]6'$I9 T6UߦXtNtN]D3uPow>:ʬ2d~*HMTr'f*mUsHV٦NI: I:i=A{…yF[yZ駟ni<<-gt,Y4ɹNlgD̝6*7SI:I':I'a|NINI$t:I'$:I'$I: @'NI: I: tt:I'$@'$tNINI$4b|3,vI: IG'$v> I: ININtNtt$$@'$@'$I: @'NI: tNItNt$$@'$@':I': I: ININtNItNt$@'$$I:I': I: ININYk,/=KI: `lvR>Vn2e NINjp[>-RI'$@'$eXf'9b⢓tNXtNINI: I:ɢtNtN$4F;iԞ'.y]*nUeӕw4sc#ZSK,ZNI: I;1obi3nbۓ&O-̘jg{)&{5}yx!?{ӛ=OΜ?wӣIxj֒u6J'$QXn¨oKtҤS&w?طLT?5<|37 Z;Tڢ_I:I':i:i2h Z7:Zҧ~9wr1gAβ'V5>tvNx]פ9wlӯ'vu9vN_=|hΒr9n|.%~ I:I'F4gٓ/rigPK׷%ޘԙ=6(ꙊpK]d}4]6s)gvqkN&wOY/:v&YWWG[~)Fjmb;90tF}KQ=3+sm'Kr銜]*u'm;)]Ȓ?ED}ׂd :/w>^qLw] .Ϸ%ova(ˁ=s`:I'$@'x'N΃$??˷2;sNE_m\)#:k2%7>U(pݶMϾ3{eto RFoċ^*I$IOa][qۇ|YUbX_'e,T_Ln'tÛx7;wym!vR/R? ыI:I'$@'Vȟ{z甹rI,C>VCJPK.`MiOɛlb1@^;rJb_G/:@'U=$ wR ;? 9w/N|O61΍Tv1O69R嵆IK['uuR߃NI: Iv'F]lMau/I2 +|rj}/7@K'yZvj\8\I1mI:I'$@'ڝOrc|(S)I>ʻeQNYI?mvT*ZH̟~Mum;!5}zm,NI: I;u'aq8oI3j#7=N8~7Z*Y[c:a%{Ѷ<=wi2 J'$]r-Ox͒3"uRnWgϾS&ꯓj7-6R[~iᙏنcыN~7N7[ߝ4r{T_ I:I':i;Iyl֤vdXt I1=o酚RJk}h{3 є;)Y Jszoʋ~3[/39eꦲv;:I'$@'N)sK $z2@6m*݀V}f`*>¶μY&w?X\S{4O5U{u{X3PK.]Kn'_ܻ?`olS'$褝j#~f.z4EU{fGn/7|U*ewUNNLŦLOUy/ O*!_MvhT=NS2뛛kR~(V~򠷔\_yNINNNI:bI: @'Y,:I'$@'$NI: I:ɢtNtN$,:I'$@'$NI: II_O7e(KWt|ȽXE:I'N*䲑eˮI:I':iT2e ĀNINtNtt$$@'$@':I': I: @'NI: tNItNt$$@'$@':I': I: ININtNtNt$@'$:I'$I:I': I: ININtNtt&"-NIcI: `wky?nܸ+W tROWsI'}_|*|_I$ݮbҥ7I$ݮ;F+s9 t:I':ioq+ݧzj=_.[s\^1򓟜>}z`ڵ_җ8Iv[Eϳ:+?v _P{:I':itRooop4~7r֭kI6lHmd}ɇ?|ʗG}t:~-Rw1OW]uU{^x!TN;*/X`p^6۲e )3~xwqǾ+Y^{x:C>Gr]wm};|+t)-sTSNI:I':iT;)g/r"Û7o.ZdIO}*nIgqFVp W.kRTDSO=TM醴B~''iJsYfpJFoٲ%裏=\|7n,u\s5y饗x(;/OeMid;gΜW_[2O$4z?_{'6{キm'͛7ّ>c,Kڥ>5O|Y_nsl2>ʫ7G>tInw„ [nڴ)dS}/˅Y?s̲& UV5sI\I:I':iT;)ȇwӶQ59z~}~ӟ6mYN\}ՃM7ݔ/sqWyw}wƃx?Ϛ̈ݴ>_[o͗ӰMo}I:I':iT;)r(_R9{QַvR8FFhJ chn3";_~[ߪIU^6iO,Qƕ/sU._f[AKGyNI: IIٓ/r~%)zrWl2H(g/se-oY?eʔ9 uNINNrw}1:r>J!vҰߊT^ۊNINy:>ڦipG2@:UJn3SG㓆I~+vR r!:I':i'\ko5W-3 r(iK44,b'53fF:I':i'ꤶΟ*է Z~} v>R}%/(?;l?i4,b'W\QZ6ns!w\'$褝2?uy>n:Ox~ꊥR}±<7;7;iz'e2+>Sk"i'!W90Bv6wNj|~592ΪJng}yI R o' V來fK<;%o-\z]]]?NIm<01ɏtNz1_>hIc|nn7iAI: @'$tNI: I: I: @'$tNI: @'$@'$@'$@'$tNI: @'$tNI: @'$tNtNtNI: @'$tNI: I: I: I: @'$tNI: @'$@'$@'$@'$$1ot%|OI:I'$tNQam'rIktҚ5,#$I:ɢ@'YtN@'YtNt$@'$:I'$:c7n߮t.4}.N:מx)'^y3gާt증#3RH{縚}};d})_2`w줳Tg=sNge_KwNIuҍ7~DxC /v>I'nI+Wz鞋/Pq/]7?f} lJ`5…Sc9*H@]ִeNhG7NpZm^~':I'u=R!e;iܮO9)wP#ѓIwԸԛtNMrp(akxAIƴ:NI褑.Sv|n?-;|C,_f2I{tNII]nLKdNn'̜͞4җ|%Kz?`Np6+󌹬9䐃;s0噧['$Z5#׿8<*d-_f\x>~ĒDUUh7ǝie>2+9l8{dǏ? [ɦI: FʒA_~Q?3W]u٬YWy7R+K->-WpO>>By1pe o`I*S"s/$N$:I'$I:I'NI: tNItNt$@'Yt$NHʌ+OB'@+y: `I: @'$tIõ ,bXvHl\zo~S=òdoõ+bX,!s'n'=ؤ~Ѱ,pbX,evI9אG;,IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/dev_notes.txt000066400000000000000000000031461506652756400225550ustar00rootroot00000000000000Yoshimi User Guide notes 10/8/2021 WARNING! DO NOT EDIT the top lines of index.html This area is modified by adding the current version number and counts lines to find it. This is the complete user guide for Yoshimi version 2.0 and later. It is intended to be as platform and browser agnostic as possible, and uses only standard HTML, CSS and .png images. From the user viewpoint (as this is a guide) it must be light weight, easy to navigate, with multiple obvious cross references and remain as responsive as possible, so please do not add any animations, javascript or other such extensions. Contributors are also asked to maintain a writing style consistent with existing content. As far as possible, all of the sections are self-contained in their own directories, but sharing a common CSS style sheet. The background colour has been chosen to give good contrast with the text and all images without the glare of pure white. Where we want an unconditional hard division between upper and lower parts of a page we use an 'invisible' full width thin image as below. This is simple to implement and works regardless of page size and format. It is transparent. A hidden line doesn't have the same isolating effect. divider Numbering: Descriptive values that are less than ten use words. e.g. There are eight effects and we show number 3 You can have up to four rows of parts. The first row is numbered 1 to 16. There are up to 160 instruments in a bank, in four columns of 32. Finally, to help with starting new pages, there is: 'basic_example_page/example.html' yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/000077500000000000000000000000001506652756400214415ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/effects.html000066400000000000000000000345321506652756400237550ustar00rootroot00000000000000 Yoshimi User Manual ~ Effects

    Effects

    Effects can be applied to single instruments or as Master System/Insertion effects.
    Most effects have a Preset dropdown which allows you to select some 'factory' preset. For any effect, if you select a preset and then change controls the text in this dropdown will become blue to remind you the preset has changed.

    Note:
     With the exception of the EQ effect, the D/W (Dry/Wet) control becomes a Vol (Volume) control when applied as a Master System effect. These are found in the Main window. In this section we always refer to D/W.

    Reverb

    Reverb window

    • Preset selects a default preset and set controls accordingly
    • Type This selects the reverb type:
      - random will reset all the filters on selection and each time the roomsize is changed
      - freeverb (default) is the well-known freeverb reverb type
      - bandwidth applies a unison before the LPF/HPF filters
    • R.S. Room Size (%)
    • D/W Dry/Wet balance. If completely to the left only the dry signal (no reverb) will be heard
    • Pan The left/right panning (panorama) for the effect
    • Time Reverberation time
    • I.del Initial delay (also known as pre-delay)
    • I.delfb Initial delay feedback
    • BW Bandwidth - Changes the unison 'spread' for the bandwidth type
    • E/R [not yet implemented] Early reflections
    • LPF Low Pass Filter. This will cut frequencies above the selected value
    • HPF High Pass Filter. This will cut frequencies below the selected value
    • Damp Amount of damping of low frequencies

    Echo

    Echo window

    • Preset selects a default preset and set controls accordingly
    • BPM When checked locks the delay control to the incoming MIDI clock
    • D/W Dry/Wet balance. If completely to the left only the dry signal (no echo) will be heard
    • Pan The left/right panning (panorama) for the effect
    • Delay The time between echo repeats
    • Separate When checked, the Delay and LRdl controls change to separate left and right delay times, so they become quite independent
    • LRdl. Shortens/lengthens the delay of left and right in opposite directions. This can effectively be used to create a 'stereo echo/delay' effect
    • LRc. Left/Right crossover. This defines how echos cross left to right. Or how the delays are 'spread' over the stereo (left/right panorama). To hear a difference there also needs to be a non-zero value in the above LRdl. control
    • Fb. Feedback value for the echo. The higher the value the more repeats are generated
    • Damp Dampening of high frequencies

    Chorus

    Chorus window

    • Preset selects a default preset and set controls accordingly
    • Subtract Inverts the output if selected so it tends to subtract from the incoming signal rather than adding to it.
    • D/W Dry/Wet balance. If completely to the left only the dry signal (no chorus) will be heard
    • Pan The left/right panning (panorama) for the effect
    • Freq LFO frequency
    • Start Only when BPM is active, this sets position (phase) in the LFO when the note starts
    • Rnd Randomness of LFO frequency
    • BPM When checked locks the frequency control to the incoming MIDI clock
    • LFO Type Waveform of LFO (Sine / Tri[angle])
    • St.df Stereo phase difference for the left/right LFO
    • Dpth Depth of the LFO
    • Delay Delay of the chorus. Low depth and delay will give a flanger effect
    • Fb Feedback
    • L/R Left / Right effect routing. Leftmost: left to left, right to right; middle: left+right to centre; rightmost: left to right, right to left

    Phaser

    Phaser window

    • Preset selects a default preset and set controls accordingly
    • D/W Dry/Wet balance. If completely to the left only the dry signal (no phaser) will be heard
    • Pan The left/right panning (panorama) for the effect
    • Freq LFO frequency
    • Start Only when BPM is active, this sets the position (phase) in the LFO when the note starts
    • Rnd Randomness of LFO frequency
    • BPM When checked locks the frequency control to the incoming MIDI clock
    • LFO Type Waveform of LFO (Sine / Tri[angle])
    • Depth Effect depth
    • St.df Stereo phase difference for the left/right LFO
    • L/R Left / Right effect routing. Only available when Analog is not selected. Leftmost: left to left, right to right; middle: left+right to centre; rightmost: left to right, right to left
    • Fb Feedback
    • Dist Phaser distortion. Only available when Analog is selected
    • Phase Phase
    • Analog FET (Field-effect transistor) emulation (on/off)
    • Hyper Hyper sine mode (on/off). Only available when Analog is selected
    • Sub. Inverts the output (on/off)
    • Stages Phaser stages (max 12)

    AlienWah

    AlienWah window

    • Preset selects a default preset and set controls accordingly
    • Phase Phase of the AlienWah effect. This sets the vocal sound between an 'Aahh' and an 'Eehh'
    • D/W Dry/Wet balance. If completely to the left only the dry signal (no AlienWah) will be heard
    • Pan The left/right panning (panorama) for the effect
    • Freq LFO frequency
    • Start Only when BPM is active, this sets the position (phase) in the LFO when the note starts
    • Rnd Randomness of LFO frequency
    • BPM When checked locks the frequency control to the incoming MIDI clock
    • LFO Type Waveform of LFO (Sine / Tri[angle])
    • St.df Stereo phase difference for the left/right LFO
    • Dpth Depth of the LFO
    • Fb Feedback
    • Delay Delay before the feedback. Low delay will give more of a wha wha effect (0 to 100)
    • L/R Left / Right effect routing. Leftmost: left to left, right to right; middle: left+right to centre; rightmost: left to right, right to left

    Distortion

    Distortion window

    • Preset selects a default preset and set controls accordingly
    • Pan The left/right panning (panorama) for the effect
    • LRc. Left/Right mix
    • Drive Distortion (drive) level
    • Level Volume (amplification) level after distortion
    • Type Select the wave for the distortion waveshaping function
    • Neg. Negate (invert) the signal if selected
    • LPF Low Pass Filter. Blocks frequencies above the selected frequency
    • HPF High Pass Filter. Blocks frequencies below the selected frequency
    • PF Pre Filter. If selected the LPF and HPF are applied before distortion
    • St. Stereo. If selected the effect is stereo, otherwise mono

    EQ

    EQ window

    This effect provides a visual representation of the EQ curve as shown in the screenshot. The horizontal axis represent frequencies and the vertical represents amplitude. The yellow line shows how the signal will be filtered (equalised).
    • Gain Gain of the equalised signal
    • Band Band number. The EQ effect provides up to 8 'bands' each of which is an independent filter
    • Type Filter type for the selected band
    • Freq Filter frequency. Depending on the type of filter this can be the cut-off or centre frequency
    • Gain Gain for the filter, if made available by the type of filter (e.g. peak, high-shelf, low-shelf)
    • Q Q factor for the filter. Depending on the type of filter this can be the 'resonance', 'width', etc.
    • Stages Number of additional stages for the filter (up to 4). Typically, more stages result in more 'drastic' ('steep') filtering around the center/cutoff frequency

    DynFilter

    The DynFilter is actually made of two effect stages, the main effect and the filter control accessible via its own panel by clicking on the 'Filter' button.

    Effect controls

    DynFilter window

    • Preset selects a default preset and set controls accordingly
    • D/W Dry/Wet balance. If completely to the left only the dry signal (no DynFilter) will be heard
    • Pan The left/right panning (panorama) for the effect
    • Freq DynFilter LFO Frequency
    • Start Only when BPM is active, this sets the position (phase) in the LFO when the note starts
    • Rnd Randomness of the LFO Frequency
    • LFO Type Waveform of LFO (Sine / Tri[angle])
    • BPM When checked locks the frequency control to the incoming MIDI clock
    • St.df Left/right channel phase shift for the LFO
    • LfoD LFO Depth
    • A.S. Amplitude Sensing. Changes the behaviour of the filter dependent on the incoming amplitude
    • A.M. Amplitude Measurement, i.e. how the RMS value of the amplitude is calculated. The higher the value the slower the filter will react
    • Inv. Invert (negate) the absolute RMS value effectively lowering the filter frequency

    Filter controls

    DynFilter Filter Panel These controls are the same as the Filter Type ones. Here, however, the velocity sense controls are disabled. divider Back to Phaser Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/000077500000000000000000000000001506652756400227065ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/alienwah.png000066400000000000000000000424311506652756400252100ustar00rootroot00000000000000PNG  IHDR{iCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJ}:DFʡA'Jog`@nC{Ȑ~yxhفP >QNʻ]][lI(8ݾsgr]Oݰa8YqGj嫯lBCq78jW81|LfnnzrNJL w~Y.]`b9?;?99'szk ߍ0BPOKt#\ߺ}/ !Oխ[`gu5m 8PfBph ,g={gpcl,ގ?3Nˏk4?Ch-SfB2f_slpreIݻf'n6|]xl5'O;7];V'L71L Rpj*[==.^LtS8;=y:g{ 7\1 V5anӡC155vlGD+2;=qAЯEDrNE=4{PfBڙ?h"ev*:M6Gx:evzs5N11==Mop#Fs\u|{t;KBk/O1ҳ_?۰0%[ :my[E-y;onjPuE`WX1=hfߩ?P=+Wd{' wן9Ӥ T˧Xa -)`{l0>N\2&ɓƋɕ"533NG?SܳrJX͝KhьnڝMh/Mi_&C-+??u4><{YBH.W0{c.UXHDߍ-c#ܺ-?MVa:>²f؂;§`|c4Ǿ߼9V}oy&Ɉr IqO~kP&]__m_zk׮[niA֭ VlС> ׷$߄w:ܓGCXXi5?:Ὃ̎`Vm@֝> Lx9̎A8ddojY% "=xZ(.PHhp=cCT 1gboؐ'݃O~;qr8%sH2{uu5n311ڵk~`?2dHLL w۔)S ۴iCʊ89x .~'F кu>HOO/;;{ȬY&Nضm[DơVf ?s&cO\akA/='Lϟ򩊁CQfۢ]" N9Lx9̾atKP#Ss<~ }Kc.3vbD'q ''dGiE{[oٹSjB>yȔFo6+[O7⤠@*%?o޼;w1};4}E… ǎÉ1X'_q144͛:t=z4[͛7߻w/xcw[[Ge$O>r-ZЯ`&M/q>{ZTTtq=k֬A70iҤ;Qpp0n=zΌڵ8'X]獁KxOb|:ӦO{ů]S_ӦIeO<#]f!6;V'sB?9/f$'q-1]7n[ ȹԄ|O{s񷪗=}r}BǬY tjs{'6k؃D>e}}nj O{`#)׃k:tӳ^E* d,̎râ_H&uVf DVB>ye#GӧO[Ж,o ޘӧOEʛ7oƯr=Æ cfb u=߃4O-{sYL $ٙ9~efMH{e8vlhxǘO_-}UH2+ISW^>|v}C¢_t ;αK " a\3n1LRLw^IE7A|kʙF=dv >5YY>[Z *o߾-[ҥ˂ OY| 86m¹9_x=ZgΜ7߈dv(T "R'n\Ǎŏ#R " RyndJdja${=2 =QUçQqI`^A8ұaEֈfQ?;cv ç H *=t'Ιrks!d(" o§CRN+I/:s[vX<&(:P(VV< -{L7!NbҋkE(SkPs̎e൯MրߋSOs 'ҌM/(,9u2|`8!Pd.*(.,/uuZJ9xHz%euãN2;=3^J3Sl,82E5b3d7 i%甥䖟p?f߹{_j^&'#: 6 93?1=)A'v G!x'WZ+jG;xܐC(pIh2wp zPw$4i]Xfc^_2M)gٳǥĥdG&=Ϟ[ΞU9xQnx٩CCJW2ܲs`^\XĈ E839i.3 <fkUT hj-{ߍȤČksJuãN]?补Cbj :k})uE=Y%?XPÕQÛ,i rn-y+OS+@ 87<17<.AL.|Ꜻh1#Nx٩P &E൨DOVVEfMf^铣.n`W?+{h%LfƘD!l褐Dϋ>|cdBs 52;*TtQH01cΞ[Tk7:.u>ƴ$^ Wz,WDGaE5< ufe^ yQU1r%g,01rN ]0+ ̎}֛oFB=ƥ3뀰l:fDŽ$ vJ~bʿk\xꄻQ+B]6]LUŧͯrN ]g΀κtavP3S 2ň tkac6_a8F?29j@% /zzʯAeqH= h6{f^&QfB. Iw6𹻺ABČq`` Xb;נN83܏pk;T7F @fiev*T訐dm%lVyF&E'$ga}xR.y.K*=z X@<|pf\~[ s ( ة3 w8d2;*TtQH>6ٛF@ÉPY|D+XJ0#c`#^l>u"s/\:s%W6E|pm`d>>>٩QES c+F6GIƟbjHhfߩ?iQiKX[ Rd m0H,dXA lOOj`H;QvwIt>s&/;:rw|$5gmݤI;wIBm0`o A"Kf5ES٭|}QMmkG72C@|  Ab4)&_VeC")&[4þに/e4 +GYom.6&:P9'$rqbc~ֵ7Y8Ǖ]MB̾'}"{{u盵ha* .v[3wwrON}K -=jV]z%A,6HH~B>G?>VrIVEkd+Iyjy[dd;U'?JyHPUm.e4w:Co c& j}EK~#c_C;H_T`*dlݺ5w߾1COjÆzJ0cll޽WCZmer<>dn4mϧSӨw{+PWl/R=N6dzWu%oFj]x+Pvg$vzs \}{倱F f36nHn6YHڟzdO1$r8%e֭N0j}ԀqSB<#x_iqdmFwd)t4S;ta0AWh!2\InbbƯX1J}{?{&$\LAbh IE8~0-o>&pu3"UGuU)Zdv.2Hʎn+Zlq? :.1^q+n``|o". c #g._4# r&FLS0q %o{UcPJIyĚxBCO~zJ5x6z>߯:qh}%vgO(51;{"b ǣUڽD@va$/~E8.F,B͠*Zcevn.{ϐW3q6}5U/~}O6M%{AǓTǧcD'LS A_ȯ̬qeQ ]6|ovTc0(FG[ZQaneuHSA&n =%2#$o ##\Qi}A+^ZQ=NѾc|l{ծ!z TN+3mIrt|>zgz.'݇ސ} 9$]=j `v^'LGWsxiX9_9')MZpLJ͛rsSR^+Wp}R~6'b 잣C̎W̎R99ر,q2g׮ׯ%UV-_wזEcR5ӕV4Ve<3a~ֈ5ź}F{a8vlhxWRO_-}ÓIf%)WrJWV|\QˇOҜU)5uD-$RgrؐL2|ĖК9xhOb3#R 8I)/{ZY +,*{|$m=s(&F*ﲴ DIߵKgR0XE֎6|d&^88evNTo|zCҮK Z$k q$qNRH1c g1S1nܸ<.~̔]2S|)w#S\=/E$GF# +*KU<|6!🊙#H_E|xTDJUL 3A?t(i"Jt<`;GF0'䖗VV?~V>[{ab= 牀׭[wm1`>]V-#zC ~I~֮&՛o1B2UvYمYtܘZ$kHmE @<ȍ@8x66;ed敤_)hK煬' gK5XêXyuA-y^ #DUc,QL>c&SHt:T AsHV{CH1ypJhJiFFHШW1;Ƣ゛Lӿ@ʑ%%XSP'ϥUmrny[1Vw/J`OfoC @<*D"5f 9"NqWO_9SԘ0tՃmLΩŖYv  S 2o|FX5*0zZ &pæZl'ish1:%/!=7>5ҵ.}T0H !%Kb^*)#b;NNzHzMNH>}QѨ>9~Wd_tS@PUi8H1HƜ2  Q4XNr*WtVp"F>|tEk̎9fx. f7I9b t\Pؠ^O* =^Q<<,ohmxhnoK˫UĹjZXb΃QINu㍍% /vTG*c^98qucqHS!$J0 ^,z-ڽ-ժ|늒Wɭ0"!F ϊHE!ȿRFȔ$'dfN!"KUcB!O*_M=EEIQ]݋V=.`{PP8,L?m~Bu/gTGBlvL`,J"I[w6<[sj>7Ղ "\XQ]P m1mjZQXR'XX!dWϼ:{<*1#Qz(":0gԡzd@r @rR4:T,#4=4.5;:)~TbPhwnH*Za"5FhIfnJ/{L.F9sPL9(j)Ҽ?/|^.^Q(q(3 Kw`nP*D吸y2~!W7"&hg46A?0O&;+xӧ4+f6iilgF' x% f1"Ry_'fCm*DICVXB9r$CS-_Z_Wta-5BE6ydAd1bV*C2>"5ZR<+ܢ/!O^j wBE-0~L@p AB H ʁr*D" 0H:"ce5L Vak2HيU!@){\ 'T^K2 WT.Ƽ,(y'By{+؉IV}ъ4rO>W1V٧lvTTe+zgTcvh+WcIɓg͚3&,y vO!E7kP!'7~Na?;@dORVz D_XyQ ฻b>m#cJ)7n%L6jP6aK`?e\4} tJ$eMՕ8Hi9?Ll Yȋjg_B' 8:n>8%bjg _s(t.8S%!qC}n޷uT`؉ZD"kbdJ¬GX,gsMGFZ?eVM+@B}Π lBGx/}$ƼwG ^CuӅch$ +YMl ;- G0n̠1EE0{x݃Qgv?L<;YUP曱t&p dRA9V7& 2^ƕ'/PT'ܬB]6]LZ6v jͦ=ư[DLf;4McghXj TZ|bf(%ipp+>.]ިG=:.Iy_JhޡRyu5% Bs UktR!C2]Wlh79-k>f։db.̓ EvרTt被yj>='n&#(29j@% /zz$5 ᢴDJ%KA߱e# ,'YQS5}.]`4 gJ( ,P4wF돩w 6& 0Hy[*śWP"6FYg S?}HevaQ^j -"T~ZT4YޤI 0;1;YIw։O8\``|ZNTr>PeQ*9*(k1AJ N B"eѳY߸MPDl,ghhsoOFBǣdij>vByUlc[㄁)yeVxvY^|ZZZCO̞+ $z$oUUǬ];&ٛfO04obzrtBzLrV'~=6a80L:gA J }͸p<.?#A&6-"ZU&aΝeX]qlU &([^>A8k|AZ"TMU\z~[;B2f֠ L@3Jdi;d1#U0nڌ`HF0-*$7=3ׯgϞݍ=O^UUE8cǎӧ0;GJ2{Mh6 6,>;GdVĦF$4BׇbB?#AQ|1RC[XbAgx^BU/@PDVrQ5G p~/PD%d'd +sVrk[Ėup_qv1Y|%\~C`^>Z/SԼ:xyc$ 6/0M.R'`۷oO[j7߄FEEAIul`0A˪4kIM_vk{4R4_~ ?ϙ3c,l2;h\v;mGvlsjz|Bg(\5 4Q{]yh=dٮ$BHsA.ޅ3`k HC%ˡAjpﰎ0'|&M! 61I| "E+Kldq\ޱSg@pȨ(XLL Tb޽0BBB^xk5ȞJZW= E$DjVvm)ٛޘ@0;-vԦQ'[ 1|]fV,BИFS by BeCK:.:5jtݍqɖC"-c}|ўIYb5iXd(K3m?`K"8f(/_;BIgǂW670?V =C,X p6;9`SN=zHKKaeaa۷73378D2.^펬BBǶdmcvɚhZU1{^ SSӧOjy!;wfŭ{Q$nx$&֎b}"Y;N{֨B[;\k}%쬄K6X5G#CK n8fz0O ij@l:쩄}o5м:t4M=Z1 kڴ)?X&&&hҥϟǕ+Wmv]'UZHIvW9V!6g͚mEEſ$3;Ϛ}ayÆ s+Dna:ʍ{Uɳ>f@SHPxDo704}Da߼w/:pCxbȴw"xM[҈za`Rq|o`1 Y쀘}PYC_T{ꕷw˖-G)`ׯ?\6m•أYfK,i7F0;U=Y\-T hJɱq3fٳg͛7k-+X~B& o :gauu^5>av:D[ JhܓL~䤧onHEcxdIͫ'N}_%+XBZGBа'P01sT*}ڴi^^^r=11155~vavzhJD=nذa̙|ZC*++qC[MD=ePze/zL-ݵ&zf;fbAFL%TwRSWs8RYM}ϙ'x,.FrN9|Ե"ͫS^;8a`J+#))zu4h ,??ݶm"6FOOH@Ν;ú۷5~ή]Fsh;waTrqYQȀV{{<h@|>BVTO3\5RSIfKb~5рq6;gީW/rpٹ?5eֻoVm90ϣtcJ.hy`BR$EڳB}Clu@'_AM5}!![\AYڴ-= Zl!N\r>~ŊY۷ۄ˜u 0pBEwJh2'@-[FV$А0s IhRU{ I8G ͮ_ PJU=5kPP.LϕT]PV'99Y6;墔Zo%k@`Yݺg`P"*JDG!n ~~PJU=njlq-*gvFki ev8%1FntK8I7>m;vWh/ 3=IGg*nkѪ!uFmwaHZTHedv\Nv'ONȝԎ7n06G؝:1;ag͍*nlA ޢ^̂ОQ00qEՌu:41Vnz ziRK?H>B-2;A>&Q>RU0,"-:x*oTBòSu*wYT11 G>:nQp`%:åKA ftLKe(]`.Z7(owD0dAנRfQ?ETT>  ; !>ޭ *TJgUQA *TaFQ`vpj*TP(avpׯPB[ tw*TP(TP>(2IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/chorus.png000066400000000000000000000411661506652756400247270ustar00rootroot00000000000000PNG  IHDR{iCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJ@@*[[mccG}~}ĉx>8>9̾3v׮ vɬ,;*J5~`ÆSNli茚kF]2N[;s 6n{>jJL )fG yEM?#+ a&CW߿ 1%ja_z7";GZJp>5 lRߣf㘚8k׮ÇxbEE4lbb,~>}6nH] 8ihz\Go۝wwSoX>}eaI hgvk{#54qil`4:nrv'_W%&̙SSy̾b횫V +ժc@mZ9/---pʔ)?|Ko۶2mTE;}Β.g?X܉M7jbp1z>.&R3;2/73~fsv>rbTvʕW[Z+pN *G<0׽T3g.57'gA_ȑN>|@iR8ń \:8A=8coraŋٓ7n|=z?~|tt43Ν;cƌ!Cddd񑣣####}}m„ x#ʒeN6udv0Y@C3Ζif'TTտ+qǵq.q=0ᚔU;nu.7oT/ڻ_MJN};ގbqXfbxK\QS}kn b/EEaHxx~(#㉉NfwrrbQa"|;9rdرa7\mҤI>>>C?}٥K\ӓ0ܹsqsswUcvIv  U?&I_@мq~/hxȍ;{Ξ9v o1;}\΍& !̅Zى#2vW/fG<_Nf# /B3o[`oM Xp4ӦM7<ٷ;Wp_` )G-|&%"1񇰟X7ol9|vv6ޚaܜ0;9pDvH x.LggLlAa͵utb8Buq،RF2Y(őu/7zT|'#İMqe#33ʭϾ0ow6xvafESBl_() OE0~+uFs8yeB3dԄE1{ivެ *\ɓ'>|Xtc\]p"x?Ӝp 3z耀~fS"""a afjhhPTQZW fG#Y9`SG]]/|UYlCe5u Տ>MHپk4V_dR(‡` K ̓OXǣ̜m$4#iݻ /1;A1bD1mhǤ+NXr%av9rnݺe :4~΢t)> ' s?&:\.YeĜ\HeT$T$0~꺲Ҫp|蕊k~x1ן|y{ֶ(L%2;LA_bbZb>NSL ˫v:ham ;ͮeIa[8ׄ8y;v\;611?6r4~TډJ5+o@*(˸bәHMMJ v8`g|y *#;8~n$w?QqVLI2hgf'r#x5@0;I ?Ţ@YX 66>sO”KꍡҮG7el*m0 W 9J-;`/ Az#8OKk1+bӋcSNv3k ߚzR!GARSebvR*!g22;tSަj5tبA )>kx$x؉z-upzIҚeꉔ>xZR:X1ŊHQʤ |?Ã$#1{8߭##c(EN fvuN!̎3E7&+hZ ev*T`]Q~_TG~ .{_)fW;ev*T}LR Gjo ux]`<~Q%j=f٧nss*dL{Hq7&(,6nO>B~v-٩PfBؘ~bu$KW+jQ 1)?Ƭ) 7zgx[L,^rw 6&WPN \bLQ\&M 9JcR0;Ka?ghL /E$Կxj1~q=(x-mN2;*T^Ev(ijj*@VAyF^)[!{^`vABkq/z#呸W|B6rPPfBJ1K~pWSYvU낈̠VԂٟa^L"_ r!VLݘn ~EucPfBJn3? fGٳr2 P 6il$*= 8<ὉLλ}@-mNs%7SSfBJngGtvq?*s^q%Gq#<f{]p 3; vk^|? nme+}ehgq*2;*TC-Tzk!yz_#"ӣ Y;RT\`#1k8ֺ᫁Pp畠vΓ&M()|M%*٩P"QB))DcT MkwPnT2g!>]8tLQ0>60xN>CnQUSfBJ}_>b?^nY; #EQؐLvvq%{~UDrn@XU2ev*TĠDMGwHI,#,t>{{qM;.TPQX%wlӦM7\;;g3a;vi!k$[IK *J܉[CuTPQ/fQ Ŕ)SfBʅB"]ZbePU ev*T.޴ ^Z$t3i)ev*THIAFz5&E8PEQfB *٩PB ev*TPB *T(SQxNUD2{9 vvpL`oqMuǤ$ 1o*3>@>8Guv - Z3+DH-6U+cu!Zb'۵ͳ 9-a] f|};Vt]m;}9gq]X.`\s%w:ۨyڨ_No%,=߻\ŧ,xv݃jB' `ݞ45˖?saš{ YQ6MKkנ [Y9]=ad۶--m8gڅv  ;޳kAs!c`M]X_Fp}t k_) +_No_kG݂kJA{_j#$X{ I/v:iZw/~}ɟuz;7Чf8M]6HhTE{ΒGz gj*P' 2(Ndb|:d qf2fW׮ݺǓ!!x<)i ,,ڔ9NS>Vʿ8-~^8n09[߯ۚtFzNĊ_/D[{D/N.g D Nؗ-Y5Mu"?tėF1̚gy5ߛwf@sL %Ⴘ"9l&V`_6?(81%^#8UOee=uEeщ6oO7ط;O|lMgr66^nig`cvNo;JV4A3g4 #WJoM1:~8mAW@o!V< Ua- K%V $ щ=Apd iXϿ|ju?d/Ww 9ycd7nտE6> 7W9С-vYX85-!i5ԉYvЈ=.|2<0;qM:rI0aɒ?|A~ )I'ckȦM]ܡ ']/'xF.XvԯfMHn06|}?&~b Z:"ڤռH}|ԩ>)ߞV]yL2M:bRT,MqsK/zP+bGpT췶(ct"Nx8.ٝ33XEf҃s:w2q|fvJnstVeW*Қb?q ~/7V~ω׉<̎J{kB҄)ٻh8ZiFaMr^e\V;E55O^>~eEͣLE)TiLArZ xrutb8lO_.~Uc3Jd%GW_>|<4vk$~Сx o͌d;xPk:~Kt]I:Țx]8^O[dvNڂj1үnl|'w░^$ێbrKوĚxKi% NZn$pfئJщğLy&d' d9=e gŤ'ƳY<~V󨾲Q;~CK|:H$:ˏ[lꨫ[X̅0l 3rKkkW=|.›72(Tf&'3; kcft>L@ %T@6o݉m2*aŃ'5u%MM t)KFx8rR1bgeGLR.Q*,2-++z{@:8Ҁ2ݳgOzVvD|rsƼ1P?k։Jc&uNo VIC6&m%Nzǩ%E\瀅‘#dV}hÔ#Kj pWW|݋>4>x*.-*UPjx /u^2*A")ߌ3vPcZ"!8O2ZX_R[\y#6ÇUXAr03t)`NL4v;w5iU Hza f_[RSTS?{06ia6i:0.Es˘9"Nc'DN'j*~ŚpT '2SHg5YtYrIG"k`{(쨜ńLN+@h 9 lp$(.B@̢9RYPUPWjzabu!(0#\`L1q&U٥ .$OY%ٍ? 4)/M-͓H_p3Cb\]ٮ䡨NaK i̢(tH4ӯѡ Af;')ɵ{+VG$dik6RO')6l`5k[dBe*%]sˣ 20;390qIn' N tY܀SZӘ䜜҇٥P+X28CJrS޼3-oRe$bژ wt(,%| 9 50]H dU=/@r\RpiJNQJVa|ZtviJnú$/iWbf_fD84ЉpRjF1y&w-^L>$0I@(ȤKO_ֽضkMa M_~#r?H0e" Sx7rHWt%c&g %S 4Xh9@[_oZހČ\-&ٸcE"V0͢ yed%F:Ϋn괫GAE]AeZQnlf Tx3m㖭ذ谤R_&M}&\B,k~2'%$p[:A{ᮃ*~C%ٳO/ɧCb_(ILZ!;6jMaH:I/_n@O($"ɹ>u#e`vxv@|[I#F@[0)Ag}fa,C@ǠK+K͉I޺IM%722I &(:)~BcYD`HlȊB&bGLkIۦ-[V!  _dƭČ Wxb0"TᖲSo$F'h d(P'+\k[V\#xxF+u !H-"9ꩥ6;pb[H0ȑXt]Xj1P-Y,)@!HHHiw`8~{ ̎߹N7Ilz:3>W=)a{ЗT=.m(e M1ᱩ5q"I2jr`v!_THG a'7Q `ХkFƥM.|P񰡼Ma)Ť\Ɔ_d5pKryTsaSTv;J:Q_?bW]_ʤC$WS;y%!5Ar4HTh#LdxVz֍V+VbHQHw} H͎Fpcu0iALNJKJ{97, pIB0bգgAâg3JbRF%yUX,^<~EM<&f2CE5uQG@r_yy  `U|tr?1047+ @v~-eߠ&7;K!DxF'E+D}p%V71կWI&&g MH<.(5{m RčɊԉ~Hθ+d&5lJbXZ':htM6n~ B=^p ߎHp* v0̞[lgB6f'Q 5^+jk!N3wC;q>!L%#޾[T^+p'R'46{:hh,5Wp6U:tاl%VI~IKmM^#|*N}B +ِ(Z'ryci3\DC|8(#LA@%J@ ~_QiLZ1:vH$t'<*d>eژ}ob&؀gV^=xp7'i0Wq2rLtOA񳟉=Q#zEO+#?$⨽3ؿzKWa0aXN.kƏi=9l|>f[1%Je8*2%n߷qfg7oGpGJcbcIf~JC#W/PtUA1]|+46/u8&UuAl- *Hz\DfjNQBfSQ6~6ƨ#nk1F+Ss+[)+HO9+֎,RdĊMÅ݂{M:zSNd_y#6O)2lPeQɹ |]L[ b K9Y]ũ>IlW @}d 5:0̓c&jfl16c `W9Oj\j=3۟/lG\ r,Վp5h&+8!Nuc$#G]]]^~ dvN=/eկ8$)3RD C4ȼZ3z }c\BicLJ}F'ώ$@ǎ>NB;`+Wb|#Nv,Yҷo>,''?433^z;l2;!槠_RJj]}\vm}'UڹYD':z8aF'##+w' rI~#"(27S 3BRMDוnqA*:KoZw"H2Tؐ0rJ ɹai];lZvKp`y\E>m֤7JWBH ,^l$*ōwuJA"33Lq<~)B]`ƥ !Q:œboOHED.M/7GI].B^HĻ32f-^L" &ɓII f#1y{Vgs{d^| WJy]B"#x\޾I-IW{D W|}}u' 2dwƑw666#J21;Gد iTqg,$0;d޽s:wނS.Smdfx:3"ٝӟ#J2y?TydѝaBߺ7<[DĘ5 Wٳ|r߹zvu>#E-tcvwn}T*}>>>8r޽~-===;;5~vӯ(E"'6ذam C糞Ĥn>G6X\qY\\H0̸zM7\;;gWy[;r55ek]<:;On7CKiGܴw9a`J SYYj"gϞ6mZEEE3?;i~ԨQW J+DeEOa5?n4;t)7Cr;7\Ir؜#if uAȷ:Z-%% mbIf Ng:+N=]EHgvb/Nɽ!:Hd]'&M.6v}[mpX>ws^>g/\svhbnq[9s*ү(D*f힦&q,"H B,fXazNn6\WS/("9]EEjH1WD _$wX*#in>*spff=delq˰>uUЉR{q|̮ "Q)$avAt]l,5aRT/$ȉTkC)WczL*^#8OqN:B!.[R8N;ۙe xr3*+DE(ٹr]Vy5X{MM A-nrp 2Rw$*+5stDmpfY/~*F* 3;BF8X`R"Ց#8OO*.RHlORN *T(SB e?oߏOvh -[Fl'd $o1ctŤd3hЧAut ` AJ^v ,SO@%ֺڕw arsmbb#-]ꘚ$+5uj{~ÆA{8o98Ĥń N{pF<޺fH@TBH@;)(@0rc,zG7o6;t(9fѣ3ggw{}P*uVeG8`b)`8sv>qqX2,Ҩb.]###Sٶ %K.^,):Q)=]>o[i{|Y(JbC@frjD0M^c|"- AX0ΜInf m={{ܹᣵ9ߵkœ9iۡ 2a(6a mu}휭[eGmmOz99Nl@=*-Sp,j^ZH1ڐ^30M 3Vڭ&Toff ,* "x`7k I6aG''#Fn ?c\u׭Б45Z)Fo&ӡƭ?uJ!QHsW_+ZsJ ]fc{Jk ߲;HE&MgNY3 ֞8q<)a/|.454~fWWr8}ގ3ׯJzl<̶^C69CiZ/A ozޢcYU)&ޞdt5+ds >pN8՘֌zz:WT{gsԢmG vF1!V';j; &.SqqV·X92͛Gxvl"f=>EZJ"C?Ag`i {[ 3(3@P)1jZ<`ov,CBp *얖QJC0nc$O%~=m\p6 -2 ]`G.9szW/XCCYE 2opO5Zo̎C<1a|7 O avk#f'$@ڑ{#r ]3:tvwo1T2spo m>u6U77d sj2;'l9ws^P7'NN'آS; ٸr.6:-Jj%GvAr$AArFc =`Iv0f`xGkӇxE_,A 0Ea'A+8'|\䎓=30 vDe޾ w [V™]ۊcvI UBHVhiE`3;&"KgZ< < 5>BxĞ`A;( ^РNF;2׌1p-رh{̠:5`lvv aӸ@<6;_jA yK#u <8cnTfqԙXfc\ccEz v! \96Uq ~ 8 - &L_o5޶ }<17)'V{ dvQ}Ș1!F@f @mE]3:jޒx*=."TBm2[[eII G>:6.Qp`%:իeB"gi*`v*m*恁h^-B]y%fOMu/+B *@@ }jkPBJi @ *T:f~ *Tt3B *@@fB g*TPDoU :<IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/distortion.png000066400000000000000000000245651506652756400256260ustar00rootroot00000000000000PNG  IHDR}߉DiCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJI/ P}fD 3jH $@ $@ 'I<@ H $$@ H @O(JA{{x.$ N"'t'mx_@O_Xb _?#ħ$$֗_VC*UhР'O[uҼSMozٻwkA]E$^O$>H\ 'o޼qv?*ڵKk׸VxxIXkල{mz +zN,f+Wݻou-*(ŋ9BWvnݪ5j>>N5ӸqU9|y֭VʊQ-^:Ou6e)Β?;4K/2cƌzURK. ݻ^.\PϟcgΜ \alxI(.UhئͰ 'OFŋ-Q;4{wmP+e dnT v£lf}*\m)S>Y7i 8LK>U766j#ׯ`?O{޾}j*U , 'O]ccܹSQsӷoG5#1PG WWE;!xk4qkhp?WsطP7@Xˎcou耺1cbZX4j۶_w21a_Wl < mwGYćSSS6$$oMLLp=n8h1W\d\Cڷo_Zݻ MCh17o[.n5kx{V_Q iiiK|5$o-<-hū4'xАp!k rpA/r\\Y$~[U0ٲݰ9$W_myk7l}G+(ְ0uiŻ眜ۿRJPg\_xyzzUV:tE_|O>kߘ^Cׯ_;w޿Æ %^Gx񿢇NI z Rg72B$\iޱ#YF:T8!R黪"c9o^9룿={X$KT}jԮ݆o7G5x oܸi۶DF֩S"̚L\ʊ=d˖-xkGGGE$^ī<9jz'p|c`5۷^8G䨕+qcGxKV= aۤ  ·^kJw!Fp=sAH& `.u)JxG ¼yxWrrrEŐݿ/S&$^G_[WTyQ %@Yi^!( 40q֭mp5 . ~^f´ueMUGs>G eo8|xǤ#>*6Z͚JC[nooϦí,{\(=z pC9j |_)"Es6m파sssenUwxm`Hg㨘YԠU+_P!fk}!  Va$3&V///!;vZjF&N_΀8֭xȹ#۷iF $@O$xI<xI<$#xxIO 'ėP@2.xII<@ ]NO (x@(Wxy8 lx@(GAP+@ &$@OO $@IK@O x@ $@ H%zKxROI+W)xbjQˬ|{8g9v,۝jʭwA tn:[&O&5Ywt[3&?P;d*_"~MX֡C #c4YӐB՝AIkl=zj꒚*D#JŐz!0V)DI?k:feC-ҭzczLYHRAvAko*1lwr11%",zL_eM$Ϫ? ?(mm2$гex7G`->B=gϠ#7߾u1V{&%%dR,GMW"'^5]SH5 QN=iLzYR̲B,w]n=^U=:ZmW{MkvG; YnʬI+W 5gFG ]iMMMMmWڝ 8 3k171)ixdqLt7@.&AL4k`dD&vP =t3O^l}}I7 >d1@?"""p|׌ 7pģbvi΋ukyEbHj~g_Ͽ>=0ʪPѓ_ R==^v!MH. Te^W<}/?Dͻ_޻woΨQYk=lI@9hU|w~my Kf%<ؐ_^,4蛗j/uf ^fHq d ,̟fŦsGr^y7O~zu)zJ֙dk[,&eˤ@/O&& Ⱥ\P螳LT%g bVsJ(FgLY}x+bc_̙vYҽ4fYp|Fp\^C_ w<p?HJ~ţ'C#caY513 2g.fjjf`>3YkXf& y&C 4_ꢎG//T0ij[#D1caqh=e!풔d$6K(BZ#^wo1f ȳ~͍!.Dßπ-'=Xf0`cO|̜̜GO]R ?^4xɾE20ə;5z'=̇L4T2mcq]J6ӮDƛwdbؿ?~BQ= g"k++*g̞Rtf~]` gfwF&?Zl%uGxqg n̸u~LS5g2G"LfoʘT3H&Q Ca@4?&:w4)&yL-Dj&x&s]\HOp*7}R~&v1$aIAƮϝo;eȬ̾/*BZW1֊qg6.W{|Xaʧ)c=Fdo $3%"k,' &gÈ lp+<~νfc_d;7jEB&}ʍPp`:Ca&HCEI KGϤM21RJLnך2AҐ2[̬ 92açN]h 2ZrrFxvYQb1ASq v~vSceW\A D ;p;i$dPCGr`xK$g(E&dZ0A a|(矈68m2d(S͖XyORxX&)ASI<;X㜬g/?c,wU^ lk~٫̜WD$ۡDo_D7/SJcvsI˹b$gdLxHD-Q6W%xC9o-e8-}^`]m(BirsA&SM?}89=S0IHy0znʬܭ\= '8H%`.VvqKx`+TkX =yu7oo^@Ýp.o >tz1@P x]ȸ"`r6)S\CIdZcLH?lЊ=}¢͊DwIU}c;ox fvY3Mjz7Ou *^ء-'gox #$jK5@'J[tnT@n&pbY0* #1& U/~G0|yBʞo$}ASg?}j-,!iahj9.r>{3? ^q4Cg~v.8i]L>s7nr. ~++##6R,5TϞ,0A$ӥQؤf԰=-J3j40KΘh=)Od?/;5،eᒥؓIz, #,0(Jul5o~$~bzTiQ'];8i 3[nV2ɟ1m/#" ?˞d4T5ݪP,/ծxl+{V/&Qi=~ʬjuw ۷ ccޏ3P3H$T¨`}ϸ]!,K?yQ+N]ۯi^Pج^Hp\## yiWeO2]խeZSE%ϊg^˜ݛ0ےLݔYi5lf {2D%ƥ`J)*Y2)d#^4Tz)ʹ\=}~S6Ku$&ٳͪL_CfMő ư&-N eAXƪbTkN(oP)1pw;\9y㈿iFϝ+ NIN{D~'N 5@NaÆUPaĉnذ!22$MOy_ sgE!2ٵ *_.ˬ^H|SSٰ\m3dF$Ǧa`9Qb,EӠC_ nǤ>s9cg_bɓE3Yw)L~m,a~1$ZdN2jmZwU\ժU?+( I|%>o?poYnP Pf`?˱c)'>زk!1,FNЋAEg CsޫbCG =2{N_Q<8nvY-1d,#CV3;w'ZF& %$DZ<==!SNɓ'ӢE !&&e˖UT[Eihh(GݠAf͚%&&^+x=̊v׃27g[@;sv/ߌp ŹGi;< &C??0 rట. ysٳa2a)yLe\L43MR5"77JZ/ ()Dhч{EdDDxkkL4M&K+ I|^٭'?˛ 8."8p|3vcqZ(VvaՠoD$s;/Ǧp*'?w%XqF9ObVSefcr1hy3\J%˗+VdqԨ~JZ.Ȝ@ެX0YˬIklQʰW^םpMgC1X@_`}ާ/^o)OLhOy5T>}8R*Q{Qj{yy︘7o^nnq닋Ǐ3`oee%/^IߵxdQI$^=$+#_%x`JYh6+]Q"uF9|:Ӂ_3dbRB&cAIņjՊ{.hccď7-ի#&M?^%í)A…Tfu`J<ʕBЯ_kim0*:}>wXauv3 1!CAm}}\++S-mK Th𜒴Ul(g&TfnuIJS]KLL>NCUN/"%S-/@ P-2x„51b p/ڻW- rai'PV) 'N3GiBZ$&d(cdn.f<k3a 'PVԇ2+3lj?#lGu1ǧGPB:lxL(?6I<@ >r^ mҤ֗_~kf1NNS5رyލ5vm{# I4me˖S21hJ^'"*U=&F)!tY3*PFOUck/_s!@B4uv+/ k(z?"iWV!ceK֭+61l<%k"<}}l|wZ)Sw4ޞ?!EbͥKHK|}QdeY 墤L ңG2O_\\95Y&Y#^K C0.>tcwYUڴ}Fmv25>EgjɒC̝;uejĀE^^-kKgWH&a…HV2Ɠ';A؅?,޺{w4`RG"o1{([[vm>k֨+7޼>z] BGʙ_5}v&_bҦMDDB<mX?BwtY^,ėn]Hbٌ(H6ݻ+}$ģ|9{1Euڶm[n:^fnҞVVHsܪT]h[|LA♲DHgYvӰpn߮Q#GXս%4TgWH&=Dիp䏶c9$W_mE]i'IJL }l#_AqV:W-54/=(ܹZV7?͜I|Fp>[u)5GkWiDx>$G Phl -Q}lŏ_iGѣn1gN ~3f "WGK)u к[7T3h)G#\J;˂X:uPȅN;=*JU^,К[ğ"m ? JDc[GM޽W< ]oV<߸`|ja*;;vDMo{h$2/3\]!@yt#YVnȠyO3GG ?Bݽm h$ѫ߼9o޽gjVoV2J8jtC-Pģ!!7w yB`~yCU6̈O:{y1® ]bQ d{(q=V<xtѼӸH< H5c3[s,իC 52555#/$^Jݝt@ 'Nq;,K<׋ihv1fM޸Q6ӗK7ҫG邲W?I0 "1d(kp:pVLBKIij!YWmե آFE%q=V$}QFQ]hl̆[[.mSGEN[UɂZv.8tEJW5AQBP<ƀ%,X=<.> Ɨh cZQ8L8&x[FK,# hhu+.!LK<0bqvv- $@ $@OO $@ 'I<@ H @O x@ 'I<@ H  o:A rHz&B9$CO^@߽#B9$C@(S+@ m+)OI5@(C?HDD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJ~En)((((@ ܽϏ0;83̾~ zP:ީg~0;8 QPPPPfNAAAAAvq"&fJ٫VM2GO#PEQf`Ǎ]]9 6l{Uev %KF˟p/U ev MRҊ={F3Z4f cc܇*2;a:eHS, *NAAN 8uT56SPT>qO+* t읆2;q&U?SZ*ϙ;֫w폪_=}fϙ#ܿ|U!ؾ}?ev %3W4&yzzGƍ;I͇?^٫|9ӫ|k987宂h3 -+锔ancvwww 3gı]]]qOt[QfNք';[OhpzqrVqJvIJNij59$w)yiy9.֖9M9lKס29}} oNnݖl1̎(쿞9cӘ1 ]\p8q&./)"=r4v|Zz@mhw]}4lذ͛7kLGG'33 N6M[['+V*Jk4#uD01ZOb9T4=飼gRp}rV KOXNn\ZV\JfdB b[m߾#pTo g{y=ٳG^ j׮qMLo u-8qU sBMpv|Jdd}-BC3Uǎuvp~<:ӄw-WTT''C ?qЀ 8:Fu777Y8--M@ .f0'1xRF~O w?(2>}-¿*ivuUzt>T_X*fgvsxVb;wsuE?!Q>^85Og 3{q̍C^Hͫx0l-H&D|<97oժkwmwGv(8Ӻ'OUufGʎiܹsF"!8ݺu;3- mq[i7*ZWZ!saÁOK9/ A(|RMBxbvx\Øgbղ׈;\b-=xo5~ЩGHnJ%cc0I8Ri9u d׶[7 r!x !:^񯶶G (˖N?:k,#g߾}zmP---aoxqGGG{yy)VgJ*bvrQq>-{Sa'{2C륄9E/r_敼"-yS2X1ĊHI#]zŤeTN`j޾K){̻g~?o^}bv--mO8'η#g^c̎ /8T2H8P+סwog$ }h={v]T-s6;:b“c\ڴ9t nFe%=88ZXX૕A8 zMJƎJҺĥ|#-zKaw#RN,e=qxQNᓧ /e;I} vC"yQv9(5kl8/l'q׬1ڵG^0jk:hаnz3a”:ҠaæZZĥK f'C >ě"I>̭[:ٺ񣘑P*oF700_߿Oz _߽{?2Ȧc%ފ J-~N+&;8PK$kɌэL%:SI6{rz5?AHۍ[ 8Zf;>@.1;ʼnҵ1)y~60̞]W |pds_R7riS 𜳛p?7_8 ޘ!Cx ;3Myc((ofǧ@fǙqu]P c<:52?O[be9gxw|3_3 exz<8xZvlV"@|łbb#LWǎDnMZ̎s ev jKrUnh`h4.9JcP4>-gYg3LB$!x#rJ_Co jnr/2L%?H ev 3vid'vހb9ҥJI*@GڍOl :l0{np ɹ7_ v QG狚z] ev Ó&%%1ΗK|ZVTrBWٲmh}򕩙paK?;Bq+wܽMZ~QS *r'M*N[q 1ɏ6@xR6urCqeoz Ax \1܏}t;NMQ@NBr}ÖXY 65")`1) f;BbdgvyĜ+<]bd_MpK/Bp:Y^dÄL)KL \.0 cwv%Xn^A WYٌߗev Mv(:q޷6XL8t Ȝc _ N?'Tu622;E-aŞ=<Ʉ/߾ys{7W>,mt*:Jv74 lz3uB=o'sH|:bxܺ9Nwt4ؾW;Tɔ)((jVaaHӟy|$:/{g>YWOrwNAA JH::W^6X۳kxӑiNAAf]-X}NBS|+y1r%\!S[NAAq@Wg,[vϏ*2;ƍ7֖pΤL)SPP XwaO#眡+ջ(SPP(Ӥ2;]t/B] E@2;ev )(((SPfNA2;ev ٫lj..XnbULaxf68F+ΩQhT6 wYX޽e͛7_qN}UqIQSfF!laz#tB'mNsj5J1;]~ _9pᚁWX|3Z{4a >$SZRG4o'E*=[n.iT1^)}UE^ ̮gͺQb>Lo:!uq8Ϛ.%%I 6f7v2sa) #K?h'Yɸ +)VUf.Z&4z MU#] shy1Q'^JJ7cajAc!!;,UVՊ+PQGZ1{-ZvЦkV:?[ o߳kk.Uǎ҃E""SSh~w94})?j~=C:@ xGO.RSs680:&*Ku2ehfv " ӛ{j <Ϭ`A W + Sg˱@ 68Dxr289GH8JdtNEG+QQJ)B!E)ֱ{hojk~dG͚tGz c=͞Kt05_홠ܷO{R4FkO&$ ?~=\vvpw4hyݵk8ж{cQQjdZ5{&d~C x>ǝ+- SsQLu2;~7n ./&o>^}ϙ^[{GcǢa$άNdE0hHtuRaa$wTi+"<ڥMNG[nī2eI>wNQI-Rف%|즾81}:r*&= x d@B^a^=Ν' W׽UF sbp(zzQ ^]"qQxR.dI*|^z۠uuS+&37 C ~ +IsRW\ ]S*26A9cZqWQ/jRRP$$'ӛ|y̎x{>%TL63x; - paN<-pp$0ڗ5g3F̎>Z4󄾾~zfׂe>yȔrDl~dr^zniqg K*IË{2!cRLO\c%-LDr˵)j[T"*F)*TRݻs *1]xG ]T@ Yl#h%3!jus*Q'Ÿ9Ǥ ןT)IqrVqJvIJNij59$NcZŔشsN##7 2~fyu8R0vΗQ6 0 CT‰HxU [H8Ȥ,eIe *L"uO_2(JY^PT=IeFH<Ț:7(t,0^UGπ@*T+UO Q3#"vk40tHc3"$HiO>{H-EQ%gxvyrҲR2#O;<rua0dx ƞe, #^62"UѭDF#o:[WVE%>. ɥn Qt$U%yU!bR"r1ep?204‹pمֱ*#t5'sqs7,xRj aHrcQp@3=.(c IPX} vO߰y w{ k޽UUraq< B0#CTKEYO/ =~JRa^qlRܱ*y{(K*K*CsBŤ2;ּYD*V.7f̘W" $Z0)Y_(QSj aV|YXw\A&`5 UA>~M-%ne(1<1;<.aL3XzuUU\vDœupFX;!P!L%ƌ!N+0l׬{[\v9s(\TGz++FuI^EuhNTfd.'&c[qYwNdlj U_0lN 3w|{tcj aBAyKtPWH((ES"e^+ܒ9/Y D[2F'ݏLt;ᤞٓ W3Q0O K2$D=Tt6ӟ2%,6YRHRz{b½ E?\ШP1̎vsLT+7)S">CFpa~ud@ !K`.23oV)ʇ?kP]P30'`$-˵qFܧhPPB" ~\cUUfR_a͎낧%ˆK5tH[R%g͚=9_rWT[mݜ!Re/+;1U(Z8](PEWQbR}Π;*mF:/tl~TAB _?(\} 5Oj a2 V1dz e%?'n)U&'tR"/^(,Xy! +NjF$dBtD=ĝA좂㪪Th  g?[TdlPrhF)4_hĈ" >->ct5z+'̌^lŲmv&W0y%.Y=P?p&7e,6;QF#*TERlGhEτH{&6{h}U+ M f_rz_mv`qث6;Ƣ4$4 xB? Zwx~̖뷧/ߥdGw W^{/:/8snܸ(ֲnRLԞO(9̨>*3FC٣dH[DhX~Q@.]]R29Z/Qב${yM ~v" ".ƌCγvNͫ@;֌Q1~'eK_ "~\w`gGٝdǒ]自;6fL!Rbc*=3 ꌣKMbcd( W,+J֚b[BŪw6Lz!iWm<;G vbYqLw}= #]`M4<<BU`ΫwS]@5q;4=khTDQ+T ;hTxgJr' :xhM٫RT|Zβ Z/Qd,ˮ{ DȺ1W0Y¨ٹ3Ng̈NHI~1lHC WѦtT#Զx]yUɺXi^2?WaŚ#o=&1IRyxܓ+5F6W2>yR%u*~0 ZqJߎ~#޿zQ3ϾʐlÖ7gXbS#r0tܡ 2R@BA0,1w%뷶ݼ)ds'0ҭFaxR XۉO Jr}vo)E*㧕>Z%:m۶iӦ  D~~~*&t}I+tg'l>*( {*cM 1{2Y~4 %3>wQ`5+Zp͘ʻ m݋"+ O*x-5D*ޞJ Ju{*qsE^𸹹yddCDDǏ߿;U0$/kZ=c1’d1mʅa1zQ3c7v=yd#l9q޷1r'47f鸔<ʔSGV ߐh4n+>g/?rrcT7'. qQTNdS v(ۍvWXW +́l`p\}PYEUޡ{BBB@˗/ p6;9XhQu떖_kV_RfW kZ fǦo!c[:kB+*D0jfJk@ wM8 3oߋ?}7߻f03E*Ymb}#Y?>,mtx&&/H}\%QT|$n hTvv|rnᣀT`G{{%jYQ.]ڠA~c+Vuֹ#,+捩օ3`vV#8Rv,ZBfC8a> D0(k|J0U̾- _&fo}w#v>qOܹ.*pe˖ ,1;Jϙ3 9w?SSSk2*I™]Bd3;;^',/ j0Y f]2_z>s++xcѠ8^>b}n#KWu]cpNٳYZũsϞwstq庍c6fHڳ焀 1{nn.BSPP gG Mǎa<ꊍѴPjhr{%:{*ʊF SH$Ҋ%ܧ& Rt(pܭ*~ijkZfgeRn5BFNWr%\a.ǚ,Kf w([(E'fלP1θu71k\:!RhÌe)y_MFåB($"`u\%W*J]̎O!̎ӄ3愊 gv.A EKQaAu7n`-z R§Pua4\*5>qToo݊32R # _ gCb2;kP8g ة04J53;ɸ8ĺb"Üի1 >qWS;{h0.p:z쎄c VWSLNe)kuDzXnO#?j0jfv ϺVPVM2;EMgIu((2;ev @AY僶肻&2{-ZvЦKu:*KKݵk_d pf|%_NL吧k={V;yZrq hk"0ɓG.]*w:c2-M'Uvmwb`{5-XR D=z:uk/ҟrV1$ (ØYb{}|Q~&^^a/_6pvЫ]!MMSS4o~ (H@1rwoԸ d 1mairP"n]4leK`+^fD=vSdCo?q򯃆)#Y;Eo1&g?}nlDl0K7똘C65dBޖ,t4f)S MLT[!F͚uN =I~&9RzL1;w!@Z8@Gwc _ll9r-5HO9v7XQ{{dbqӖζqpk??շeWUIAE1B*ر3nMKï?,Z4nB_aLt[Z R{8+1JtBʯgϋZ>=ly2hrל {2\a<89b$6K=6;v~8hg7x֝u*캉?:ˀg>Uѥ.:vD'?Nlس;EwTKC&sڭբ\oʏfe6jeÖ!DL۸qeuttj}9AeL 1к%fftxmkfPQVxn߆5:dQQp">oW;!wqu,lm-8f7U(;j_5h ދ,)hI\jo iQ@NGN'Դm<Mi,SSх6i Oߴiۓ}"vPX͵D~Os4+jN.D1|DKE\f&PL4~"sg' ~ 'C>}d' 'ALhdRtuNw0)_p4nTETfEûav]]2SNSۄ#ɻw:8p.~JmVV0%K *(g5צ;x}6ycM Y5}|#GHtvzɘ~q\;LɉX[348a#S#GhMD[Y'̩{VlMUΝ"]='XQUIAEpˠ#@m2; 2T7k qje,9hȰ_8:wgԾa"y8fǁ. 1[U0!s`vѱ#>7}2֭i#~j0UOܹä' 줝5|8h8cg sذ{(cbQ}M3w+-`f*7_30;8?IAAAAQJ6;E}--E<<0JAAAAQZ _N቉M7p4IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/dynfilter_filter_params.png000066400000000000000000001046771506652756400303430ustar00rootroot00000000000000PNG  IHDRBzTXtRaw profile type exifxW$E .xˁ4f<U]Fr7Qx _7J6RR<_n_{}_y鸛!~8 9~Å1~c|.dso7sa7>s{~M˗SX;}KZ%dOm /ocC|oa?+w:#4ReF R_Rv/Nd|C1/o?ܹoq?Ci߲vH)ϤMySz**o ^W%u)k4ސ#pCLv<"qn jqdrc n1wh \,+'ݫ uA~b\Nc\N##~_~R^#/̍ ?u?sKtϯu.Af0!_B̡_\ @64dm3HK1Cpo>S;ղ}IDѐ R~jj1s5(JE:jZj:\-JFAzcp0ƴgyYg}enŕV^eV_cێ>evC)t)vRo߳Io#k5{҉{8ZKIVȘ@«23S| )2ntE612N|b͑od)uB~۟emGteHmHC7w'TQ#9uwY;yXNjvFN{zBo\̐zM{Z9~"ʳp칝vqso?|[Ja0ʜ5Y[rgt9t Ą|Le ƩqoNsg>{ژaKeIX;91b7HM=s'w޸-]wY;\ J5 1=h'w cw8 , J0VkiNoJ^*Z;ˠ/щ[\)sؑ]/]tJP`feVQ L1:3 /Sn؃2m2:lo" tʷS=ubʋD zgVσgTRQۛ.+15-cFcqhžk8tD@Sk' 1&;>q󯧮 ǝi(YkdrOT90Yy rMńsR8Ukj%q DgR\8! SnISJru6!ĀG?w,3+f"gl:N(D Ld武YKj,ϥZFtn>/\UAY*[pPT*Z^P=mL`@fR&';ϰ~g;hأ O x!+iua^U!2`TlqW!ےYcEGh Y/Zl0RT j %A"FQ!&'3§ Q}cw'jkpIgB+;\&'Ms135/J4-ہVvP)jڼiL~*3)`Bm^1kfF@+7/ zn-gRJso:zK'FIl #03;{dUAUEw2y" "tT$Jρ4**FõXN@-CU5!%F73UHL%u!LQ϶vT QUB.3u?.>cYH4]m94In<2r p6ALULM_}/N}5EUɘl<1f^,`:"'P#1A ]N"Π7 ,$p 4)(G㜿27⤒M⎊13P*yj Uۜ@$5Ÿhg/g^-"=ԩ: $tHn$Z?سtRl %!(>ygфؑjN@d'Tt s4>Ct474ꨥ#ad bThNRoQ7mL$"AA.sGFA#ЅF)ף])f_&H3FjLq&2 N 8 k/!KA1NaP72xl  /4}08BE&orّbW;?j>sj5hI C0)F]z*%p8U&(ҢYn=G7r=@DiΑ JCR=h׺$f@@kJ:4x-XQUyt t)ZM}6"S=ƺuU.WĬol05XA:Z)TOe#[̰̽g". D]UPbi1KoP r{e, a0TCbAĦ֑[r.ߓQ Y^keѮH d*M|7wfw`֥D"|Bb T l KԶjC)FdrUaEi=IXDdE؞Zpoj3֎7FRΘUcZkkut0)o'oK['ɓxH8P+e!=]JC# ߢ&~8iΰ `TQF yٔj.lhuzVpM shd+_6ٷmgT4sh6|m(qF'_94_) I+hTiu&RGBXⵈ:&EAZa7kzT5c>K6&:-:9YB/%i.߿*nBI@ Xܝ,T3@6 ~ R`Ua"I5>Yzq1_Z:4# ѬB7"M<xͼ}K!S{p=C#njh0 aI E"05v!M[6ol&b#߀vrx}/}>2v~'oX?7U6 #t堜k-v1j'"2Y>Pu@ڣR&]pdvirZ:\:F |T#b7Wȁ@z.fM1I;T`:=m&I')p*cc`Ђ sրEjiﰺkG`l*f 3M0el#ϴ zoEqabIȔ,vW,_6IbZ@ F"@>yB(ܓ]iW5>h5@1]M 5N [/ԍ%lmkOnt Snh>|;C"'qqz:W^F2ʻi- uǞ\G7Szt4Z4jm&7 vfΛC-T=y v"N5QK+0 _Pˁ6ˬ9]mZi 2&'"t1}Zg}qA\&/ w"़)q>9ZJŐӺ ;i݀Pެ`EHnRj'>pmFq:Bp%S⁘U;4wjpw.v`k 8f qK2t<3a;FDl[09`G,$e LMh%gT0@US'*ȷ5Ŕ3IH^EZA~tSnn4&pn֩,0Y<b2F]ڃw0(1,J'o%|˜O׏VTh"{DF݀` -[{fvGtҊK$`&Zt!ZN QȰ7ħz8bP$ZJrz|hw/H1D(hQ&C\JF0\6-7F|Gn(Fdz$i} A#(6u^-JF*=•1̰f=]d 3O=7`4-ѿsDHh9ufG-j]=,ұDPO\y֨./犜GOMܒ{i2ɇ{pFs C鹤[ôۿ?)}kj# E_(K hq3лcD{azTXtRaw profile type iptcx= P h]Ǿ7 )_m&^aBпti *%@ pHYs~tIME`tEXtCommentCreated with GIMPW^IDATx]X&v]KL5Qs%1${o j, "EP@  Jb-M9ޞ)3pfwgfߙKX23&&%N8qĉ 222~'N8qd/얀<N8qĉ[r 8qĉ'{!`䰑7'N8q^-91sĉ'N셀c΍ 8qĉ:ɖiٳ.Rbb9qTk9'N֧u-;t0ȧ>ClRKWVo|?A8q ĉ ;=a-s D_m N8s@`v` 9!!(*U )Ɉ`pZi>>8\UkD;AN3'\nrժ]MH5So+Uݰa]qy7Q9'Nȍr` E9˔l_z%Z4wjԫGԬ@M A ʀ|رK׭c Y˯.1cB_磀rNYxq@} VrXA 1㜨Bk_~͛o@7*UŤ[mtj%r\upǞ=܎,[]I jr]+{ @Aժվ{=zMC8sn3->a zq֛N& ##*_xy#R:=k96 ={U|@ΙmKexoܧ=LG͠e@gpp@Jʻ#FYW0mZ2ڃɀB=Uۤ nGΞ88q@ΉrÀoztnX{ez+:Z+Xٷy1{޿_v!.SP=d=r=}Sؠ 'ZE7;4kjN?u=䊕+P:'N9q@n*CPK ,WřSY^N% ȵ͠e@Nl~޽jkz>@3o}?l֭|p@Ήwv3Y[kZ227,@T0p[St->sݺb;c. 웡 @I۔VHݶ#5`j2bĈ퀞>p@Ή9";r$M*#nJRwA&!F ӕI6|8!<,J<ċr}3A3@q~ '#=@te42wBevH[z9'NC3-|ZocY ĺv~nڠy%d:m=9s ĉva榮4 =ZF{GFtfJѾfUGxÝLٲ ,2ЈBc.ܨdv9q )|yX)G1%, uŞ~܌h+Uړ:uJY]KJKM۶Q%u\@nh w|Z @B<8s A E}m6 c9*!-"'`خ[7=_H&Z"@aMzfoڠy\W:9rk /Wo4_WPؔ6 c`5Rғyq@ڍa.d ZÑ 5\NLT6#ضgڠs"+n g7r9rk_^1:t ,@^r}NL9q w4 nx!/9rN9s &<9'gJN{o??y/=hgQ 5wx%}UkI6rp @ΉNG׸ϿF\2g%y- G䲮r `@uCcƾ%(P4Zq9rU駟hJ8s @i_G@.wxGSn?>jB_ӏM @΁1<|Ӂƍ7om۶+Rt*UtiΜ9o6#kr]@>xTv*Vjj!F' ~iKv6{ExN%Uev>ZUu|Ρ%?Cl"H.ruwuʕ>/UHre&@:rΝo8OЭWKk]³Ct 7Q]ǁ9r9veM 8oT6n ٹiѧ]۱gO`l/|C~ րz͍r ls&k96E rr*y89,>6 jrqÇ++Rmfz,oٲ޽{fLJO~~>9m˰Cynn.{awek9h少mÖSْ֬Ł{uSZUd|َĵ8Z_h$MJJڱcpvnnte@ɓ'%K> zDf[~{VN>C@7`bQܼ@^tđ9V͚5iAAAf ?춮8rz VF *ؽFxz6@Ωly[mqwP"^䘦٪5kjZA_.\(M&$](qk/ ?p܎, ȟ>W\IMojժkWE |H%heBB{رcFHky(f[龾Xa3gr dSa?cC㾡ۋ=5VﭙnVőU!'8(õX-Ԥ"a?պ0o42}Yvaa4@7TN+ϝ;Ǟoy;rvӃ@+Vh#f5 S͛o \܍9'[ȵz_6k|hi۶:D>iiž) $_~Džx0؞QC4-(Z???M 7W}W3BtEޠAZy;]O'n6ri^YF|m9gogι"G(7lRVߏq_v@:~zrQ`:}F޷gϞm䬞q֝YÇի'SbٲEƍ9s+/8;sW{oPC 99!Dj>rk\;wdd)A]x{B$ѣmjժ,(L,N29LW[''Jf֭o88H`^AǙ+vRõTp4BcupmMRj_3ʈa [s _tIɚ@>fbḺ٪x:Q|$K]WO>qwY~9q@n@Ci$~QGNZCb[@&Y3)jb]Mr3nonPjٿgΜI.]8//z26Nm}֠Y3َP&Mڼp'nڽ8q@^ݺ3rYf7di%#(HF)%~->ڵkÞSL1kK̵T0H&Xpȑܭy;}ַL5X#Nnٲ^q-6lYnc8-#q8Vv=(f[~r뫯Bd9s@n/@f>k=͵ޢCnR a?S 9vrK%@Ήrgrb'̕TI$U3trǏQ r$ Y?jv'M( ǁ؀7r=OC'AK]\p5ȋdȐ]6iҤnݺ*U*#ġCΘ1'l!=6iٲejհmҥ1 '*qUV'/1$$-X`xiLOTNXjN.cǎ2u<<]v9ƫ~u MV իiIw0֭[;HǻVKjc/&]GZ Ϟ+r &;H{l?}}}u&ۍ^a0|ݺuۗ-[>ͨ qyTT}ٮ~ [Wh~ܸq@&0#xb5k}Wx7jԫWlJUI+WuH5jؾس쇆o5b` JO7;8YqcxU[}ȅT޴m[r2#(ݺjjC-:thڮk0M :uAfdհEƭZ_G|…h]N+6o&9o&]]qhu%=ڸeh͎;M;AΝ]ʔuiˠ.n.+c\NDg.tBl V9akS7///0^^WEDH\_x<-]`)Zhջښp'Z|~NN",PTRN7Mnam/e߫ɔzTXaKٳQ D)焄ȀiQtm/("jd& Ըqc+ZܒðWs*?%a 숓&MX,;`cKmܑu*M-:UcmYQ`W߮];\:Sav 7}]ԫAٖ 2,o9ֵha)T={jQPˎY<2 \7šwGe4O`dw? a`DD8pYlF%F!w -ET.? Xc455Ywح+j1 fa,b3@&nM %"aaarه>%Y 7;S Q\9`` '+`VKT '6S"s"0"'%@5Լg'#/ /۱Ckb~|VBM^ǐv%XZhOklr˗P o0g2 Oftұk*M|>YOlm^ +X,1sިn=x[Lc3gΤC+e6|볏u_=Ge }X}aN(z=t(:̙(Q5 ϺPZ*9YD'}G99.'[L0׺V61Qޓ:wֵ|A_bAe(T&w3fL4k˘y.ZXN-1~xkaNCrMG4!gMp4 `P/_bS=8q&|'*7-[hD;ؑel֮]k:̯Gڵk;S}a`XQ'6MV?G nV@>l |sȻ谑rW#L0o}G/Mٽz~*pZĶ(Hΰ6i ^vީe0O[ m5yGA,;Ix,Hj֙i tpս_+HnhP.~X1(nS/\ү{ӈ=e:7&6!3]lf~.cj'!^2 o$*|m*kIfaDk}=ZWG b™cǒ(v&g(RWJ6[!GJYpM4Usε&m·NYBTl0'iX" ʧA,;…8ٞARd`sKNXdiⱔ_?7w\xU(\ؘzg{.AU`& ܫ%~M)M6uTrOn!((˵-4: F-YY (v/-+|/5f!'3iM G.F{]7K dy{ đ9Bjw1ƑrwqGII^ˮ('V6j9|+V" 4Khdz+kt4&!t۸KwxNZw.1LXPrUEN~FRN_@Ecĥ͞C;NiYIZk-$M)Yaaѣz\ȇZ^0Ȅ2.[= 깺6o'퐢UE'@4c؞[( @[EJ n$,oS L8NeJ~dv#in-[dT fv ⪙Y6}_,k5\v) z=y{N$ ":iF?v.Y,;xG'ͨg>bcS|: '{N,{=Ƽ4*fIy_0ܮŧ Sk86m2+M;"&GlhHc)0ȁcO5c1X~r M2DD8H*lZm@hu(ic5s g= Z@Y Gv31+J-LTzEuկ$~I};_͇n<Dgk 4槏}~PzOT7oN;7H3M#҅@R)$,1(2'gr]\9 kS.xIfNg'1>$Yx.bv7 HHI\ӹwo[^Ue"25ålyTսǍu<~Qx37SsJcVvs@?x⫯_}ZҬxenj#-Oq*9@@߼G<,rcK乜%3I`4[w#AȺh ޻vj tO3X^Y0gY@TʚQ+|r5e 1SR͜}rbboJ3r zЌA'_>pC t#D Nm{>v2fZDZw%1Whv]D43a˾ ߾'Ͽ?{VzNJ|0cL-Y9X&;@_u?3;V:zW^1/.L,{OM};%xGnjKy@Z\l-w-\xѓzyΙ;O[PnU7ntNI$Cv(Fy>k1ꕳDnNK h'tya"RL?|DZ›@YHF;_y7_qcw*UڼA΢K҃"L}t7::`!kK.Ur cz /{?v2,@練ȁԅ۸)S/_ۭW-as w ǤZj*Pi$+X=93D408rЫw֊QLk`A>BzPܼJm^6GR怮+=T5 u# 2Qe%lu"o]{U>zĺSNUmʕ+.`$|Ƴ8[w nڱ{#E!?@6 Oȡ]]`\P,vه}W/ɍAC^Ksρ<<<\ӒX {Ȳ #zPN9S8Tp޷TW{y,]!|MNdF/\'sZ΅Yy7hGLw*W^VUx_wxg`fx;~"}2Xw(}6&Qx I\{vyb3]Rwle!**ʠ9upZصkW?|p{kETD&sUd& _1U" +R-f&MR2E% Cur)S!gISr2Lxt$י^Գ&%K2qM+ ܡa[»߻??v74͙,cǾ}_$C!O^N1!ρOm$M͉#GPMNU*&!b{R4u,C#.|xI],"` M4N چ͍gpQ(g!Cѧ]hiޕxjLRR,nk/ #[ KՐ_sHA ㉽!O^a3ρ)/TTA\]uAճj>L <|޽{=|#Е˷DUAE둨nROQ_!UqAO@飺Mg;FN;!ii᩠wCsz1C<Sx7{O:II` S @Hc7R%K8{%Cz9!@>d, +m+=Wj$hT0A/STOd?qҲ XN[5W$= :E9N=wL&M]uСCі-[.<&o&N`V}ċ K6;6R d< z0Wn?6{@2dÚQX .,X(3;Pb*,$WP @@ޥK,X#Mp 41L*[blD&b-NEyħyݯ)]%$7nFOn"SbBԳD1QH9}7xDxS_ߧ!M᝺+d l.U楛޾B֦Lmd@H+wcqN$Z<ݜ}n˷Jb8T̝g=z{FDTx؊ɩ$ӢRqX$t 8WMM)j-g @O?w,={U I޻d;Ę;Y8(zFx?>Gvk=3}-{*Kjj(;x3L8>rڵk8%~?*C@?|̓'/ pk8b1B)º`>~n~TEHn2Q$Z&d*щDӲRf[K0þ NHhޯ쐾xᡙ ero$?i.HO"- )/JL"͋b(;3 w&9;8K JwJbݱ(r;课~qHPiNN%A!Wn=7a"zLE⧍ 7l\.x\ &b4XNTt!CS !$[Aﰒ up8|"ЇLNxTY0#ɶûZgl"XJx?~ƂYJjE I.^.˫j:;֝I3o ŋʯ]@.9ĺoF"7=qQIDtA$|rG!_W'oUnVu &WE&"'N=OXשS0g7DR޻qީ\($>lF]20;a Aaek4Gvvs$ vvs&>r^9tr$}kw^ZX!j+"S)U'> ?[H݈Wȓ@,"O=z/l3Ae^Oe 5F>PӉ_^;9k ?s"9"gXf*پLu{9jNX.ݖJI8R<Kѳ"7$^G/z*8`«닂gZɧ@=r2>ߺKufXB6/wf eƭ"50켟P2L4e_ng2l7:!#p#WIVI$q&9;8#J>/KڼEK"_޼ƽBŨJq^SE-)i߃[Dׄy%Qb}22){oШiJ[j[N94E+Zdd,Yc'm`f0s㿓D.Ƨhu$ NLb%E3ρa\ߦ)-2#(Зݹxق$aBɇU4b Marj(?yÓo$Dq8EtMDJ1)= ö7k,7MIx?H;pT]j 2jAG9Lz⿍4ő7i'{}8:șmLKz!IvsauD/\]孜7b} Q~S"ӂ?Gd3OD9Dkч cR| 9vHۘqxޱ奴gBK=Oؓ`BxO̒;e(=`S,jKBEe#1uMžmL}ؑҫ&Ib*to]Bkjs ƐD$NN\dZevgɆ S'b>{[k4Xu"b%u[O]2 vۧ46Cn;N,ܞ)0 5-3,/][&lG%P=9Y<&&^cjՃ%q&'~ΝNȾaÆAAA67nؼy#ڶmP<#URSN]ov Gy7UXoDE2νxi_5F#Ur bM>D[09g?2M%)*._) \Q˄Tc&Eŕ)[֔}(UVU]aLy{xnC)0ħxuAf2UL+/I37aߑݻzMp 0a\)5-t΅ +R*Rkǭ_#XCdMzZtf}MBmELharJ::hTܑyq&MRfT]Vx/.Z8<*')9)0fY{-ʻfE̩grA#*[wylSF1߸qrKg{Wl;/߇,r"٘HTIaF@$+rfevJB2X]"#oDDn~FɷsAarw=H*訸ȝk֮AuV%Cےt1-](abB bUjQem1zx߶lOt/<^3M khN@swޭՏ99Ş即@ޱcǰ{}%hQ`MPd:ʂyD]:{)3b+pv\ntAYZD1 +}Lf0-[Q©sT>g㧸{ ZԲ(';K.UGaHStsGθ w8YylwѮ.Yޠ줺}GC_$7$Z3;%LÆ kԨQ_~-Z3&##=~ak׮I96mСCynف~3۴i@.-r$n T݄7 !t5&PI涂]L{Of]ݟD=2 מ={ A%+9'Д: wycK[(H "c.*Cle|c<6Tlź0XF_sܮWn:IzI NžU7fRlQo=xf͓=zTi%bI?QF~6 9*Vv9rWbyH@:{23Df8KK%*jgNHc1CS1u٫*'t6d:<W[7nAJ6ʻ$u/WvI~(oذYnfSn"$%,B"ҙMg&Gg갭ͩؗoaLbOGoU ߲e =0̈́Kp$Z쌤I&0299(t?˗/,@N+%m%/lj֪} @g䤜><ܱNә1a;،6qz=x=~ 3S@ ~UL0u{!Mxd3<};64;O x֜S%{]D5l߼7Ŵr?/ME8dʕ 9a㓥}y^toK?[oǏ:_x]`PfMzתZ/9رcl͐:-QݶkGOd:=;9-;)5+TVʙB6g:qIa(GdB/٘9f_PN-k 1bn%Sਬ"as.ʱ ڕdciY=t{ܜyBf]*piꕴqqrb_(w&גFWOLduqIIIa3qXF_2*KMB†6g$h:YclO `N ]cm6JѪŕ9ի0db)O;[=$qC&=ud,D}*G J8$@; ͒LAA;_zF)О ṟy]tuMńb+VIH9m-Hí?4h }־vf͚ٝ &"ԩS bVǏg`O8^{A9O1q4.X[+xBq@N%{pYDǪ4N;a@RT{cغG$ (0i }Vq朔_Pd%A8)E,V},Ç"_>x#'-;BnJYJ'0λfLpszvebɇ_q/192$zi#G_F+u"qB8G]~mᬗL)Zum%"M+,Kdza uQj2fwE?E{sG% E_ 9='jww?}FxGt\1Μ9UKcMp4 )B=<툷#{-+"mFNz}R;%r&b_pP P$i+4ֱF5(Y9뵮noFV?Oz?Lm(p|8x`Fq6 'AL;]&/)0>6|æEIj1@U&b9Z-=lwtj*IcGH\ꪀi(wyyߴmd jt֠❲͜O20@-{}38r>$J8rRY'OC^x%ũJ_|!=%%Qs]-=qzժՕt4oz Su2#(,;D2] :i^)d{1g߼HFyoݺGdߪ@N2!Laf7Rezhʔ)!l\dϝ;W$uM:+b>#aџMCǰ~2좸XwCZwmxxY`lվg{(^ʣl}SN:N(}k9ɵ8: "Gr͛#ӧbi윅ڱc{T~ԔcX[=Ϟ%F@ùc´ot}L.cҔ޽{R; :fia_fHBv#b)\>C-]>Y+)x7˭>|u-|g$u:$fr^ȩd#¸lYd ٭C>3qTy#YsHSccceX()MZ i2},A ȫg]:سH{f9"~+C*,{ƹ ]14xG2T+q;3}6ʒ%Klշof bOgs/mP %9l${ZZ@dkҔwӢ -@${XXjf&ہ8}b?i%cSbO*իWk9\YoT9l[H,'ȐfyGNGcP`AuhN_ ͢q!YCBB, C@l#jrpnbϲOv7b` _+ ^@.nfϞ]ĵjh ]xQ3 1[vkY`h Rs βdfs<lc*SfM*l\eC|Ͼa@2̋  7qo'Έ3" %Xs͎g[E0BKp!clGEE!G2^ơ.\beZDDfW[F gp7?}\]]s7 拥M !7+W.#8pPZCb0 J ӻ۪U+ T8闢;OTNi]5xX|!~pNöve#$ަBPsC`-GvaeÚ~JCymێ5/#G_rN8qĉrN8qĉAPƔ|Pf͗D&Nτ'N?l:z:ENxy|PǏw}ժ*]Rժ-;u9ɓ[tPFeTT+f֯ߖgG@l|yr*V,͛M;rD%|N>-YY򾩣!CAN9 D]0p8@R\jkPAt!So38gm$27י翘м3l<(P:Ζlu&<5U@ի?Dzi*"=}/AP֭?Q6?nIttQ#{&@VJiJe!/3鏪׭02Ҹ5?bQFg<Sk>D:}pZگ^}zIX7nZ #<=0̙Q PM>&MO!m5aAc(_P 4O\/|b|Ù-֣X ߒbvĮ]L,5pbnj !Q9r{1q;O=3Hߑ#?7`V[sdť>Աc9?" `<]AKr۰A9)ȝ'^՞!߾G,aM$"fF.WETr~`B pG!چ4Y]vbc;vUa bƕ-paYUp^^U}7ӕO`SشՠA1c`%7j3µaVROOPҠYEVR |J̆{\A4]?96Qiܧaoi۶d~h~4ͨ q<.ey{qKڑE/!BQϞ *LJ:w*k1 Px thτ,c ?s]p&½5Fρ⛐YFLK{ڂplȻ[ᅬuf=<SE Ē/! έ DP_Hz,,T6(\X!Zyى =ӿ%fL ZУ Gr!U lKU,3UϣMrbس-qX0Qѫ, d5E}m4xb P;ąEw¢z(kO~n[O8 G""4+Qa@pqF R>vi&t,<.\ aXkUX(@|5/ XHC@'v͚J|A>)ZF%R ٨jΧ&JKj ˴Y”9fdDֶM^ 5Бj}а:k6 )A .\(pOt}wljE^쓄ʩX2z9-;i4ךJF40`' 'DjԘe`Ě_o'#&/!چ.5?$skKKU,3#gB^lZgFv+tq5 k>[OC֦lpZy28xZ40S.m`fטfQm64޶dR#q޲NvzB= 9=C;sa%cY׺FLz~rCÚlz\ O ouLѥ|En6n+"zs#^VrT.ߢ-|Lqf ~i18ТzrtiX53hSu2wgbYuo5,5>.ށ_*ƍC"qpMGq@GL :aM WF'Iz$bm,0 iLm\45Xڸs'j1PnwBķWƫr.3av J+7j 5nk@L-dT, ?pjj%NuXuN.^bcc f(+$Oڔ:hܹ$+ q'bf0YڅL#EV٘ؕQ-4 Nl"6MI`r*U}F@5 (jr+t} k8 ΐ5j@E$}%YK"zD@!$\斩 +d'OkZB͵Ʀ3 zE3ԺJљ ǗXԠ?  3]׮,KrUwnQH.oj!!M!8ԚŬXׂh(ERΕFdA<5w ?tX\DR g$$ۀdj@n/CMAPO-PM'G <,Ќ@Neb56:"#kMʹ! gy IO$~ q4ȕ?pI(5n sdh8zRf7 'B3g(:Ded-)Jc/)5SZ*7Q'ɲ"ڬ [ݻ!ZY& L ш8 p jH$raP,[lp'#EcTZ?zOO6e@YP8'bKR€ ??r" ƇE({D0'~ MZs+j䗐Lp=% zXݾ;|8pfsfTz];Fo!C@>$E0+-ÑT\hMhglRqO)L}A gw@NBQ(5>^ӦHgLmG BG\LrRB_]g= wl":mIf\@ \'NKeQ@.7BOq !G+V6'NKŁ܂4KG:r a^g8qĿTa(JL8s ĉ'v@%.tʚ5s@Ή'@Ή'N8q@Ή'N8q ĉ'N8q ĉ'N8q ĉ'N8iyxN[8qĉ'NBn  pĉ'N셀S?ĉ'N8 % g'N8q^-9=8qĉ'NBn"ĉ'NE_q'N8qd/4Orĉ'N8U@ / /c@ / /v\f.ل8vIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/echo.png000066400000000000000000000311501506652756400243320ustar00rootroot00000000000000PNG  IHDR|iCCPICC profile(}=H@_SRvqP.*XP Vh/hҐ8 ?.κ: "ƃ~{ SͮjNlnU B@øL}.Js|׻(>U&|"qEA!9P(gM9`qd pp){={?rÛ pHYs~tIME +Z3bVtEXtCommentCreated with GIMPW0RIDATx}X~b7Xhxc7ł R{b/((j슢X("(J/UXz7ẃq؅uw}ٝݝwosws'aaaN"`'߾%G6%'`a}+/\ ;xG w';j"C$rP?CN @ }';@ H @N @ }';AslMGNG }'TJ[`` ;cw#+Ojժřn:_>l]@NNOn8;uwwݳm>}wW՛li1}֛7O4=Z@O*ְa5&MRm~f۵S(PTӧNz5jjֶ󷥧K|ŋϝr%.QT}f͚n*1A_2KNfG7nģ"|Wb}gu֪[wcL ;nbjf&K8`ܸ&-Z6zޮwoٞihQVX!4iZqԪsg]u4{*WthH{p['_xظ^zOI y^9IeQ! #n͛Y,;7}D}7)~/@`}TT Mw\ 5jA'1{B]vZu4??H[GAj5^7*W/W9;;Kk׮ٳ^'lM N"CHBը(USb'DO>AQY}Z5Vaw b'7g8>svf/:qQToXpXFz.NےRNqXͭSx2, WqgU;99);o٩S:u1cX}}}GCڵ g޾}pB[nǎ鐐}HYPwP{##(nE!_oԬBiNzzM7o.#}WOa{yUR 2N&.n;amd${(WXn`-g(+,juh>C{?ݻwǡ L:޾b}^yQFǿ.]c6mhѢ[뻲S|P).n'֊`!_쇎C`f؁ >*wuBˡ;VK4/b4Z'8Yt$j)45wl2G}bgB>}t/**bݹsrm/..!|}LJJ2l}K< ڢQȻ(6=zC]LMG̙kH黸&lGQx:.CQ_i߾=Br7{H ;2UW}GA|Ih@񪎾4wgL B1VS٠t̲gi?Kyhm8MUu.ӷm{oWbѦ .#DAhc3*}##@N w@ @ H @N waSl=֘g8 +w]@NPaMp13_^V$}'H Y ׭+(6^ ɢj']C4c 0Ybӥn/]d_uLLXka|0[ +`>C C( =z,]T6h0mVAU XK,Y9y{c)a,uz ڢcGA-,Qygʫ8YbwrovG? 1cl?kN' ;/(5h+ڠ} D?:뇵 /Υg(Eue H ".w R8Y/@ }Ax?O<I@4TMPZvq92}GqlmE 3cr׹U}XU_ @N~B7) ђkc텏#f"xu/?{+w'w37/@ }A('UΈ#9 7iɒ.M77DǺ{o|Ե? i3+CCۉwǴ .[ޱAiQ> ^j1:z[F!Hv2 XR: "PUxNd5kkwԦǎ㻈l+{(|fmLUnE…HC T@ H ;@ ;@ Hߕ4vYM2hȐӧ7G! dS 6\9d̘&&}znx=؏8GHoΟm21dm8p~km@m8:ؘ>'eqcʪU&C/{4Q p>\UzBOH*MEDXXYji9?o@v][')^(5gNy҉6@Q9ͼꟺU-Xf߿=Qo8YtJeKX | ꆣ囘ham.'?I_}Eݑ5/?ɭ|+cA?} ~4Gj]yR)׼׎ػ26S遜V׺FT 3T.duUZYmKKXۆGRJd"QVL:4ܴw+GG͒5ƌU;W;L^B#^fϖE}̘ޕOV˨o;c {y=;j>]СV^sג29y:p5CʆG~?[-;vںգb~pl n{P ^{lpEQ6nIXUfffJ^op"EYuT# ?L߾]v3*U_b䍕ŌU?NG{7 kRkPfϙꗿrC ɳf-Y˨k3qGˑ`Л:loZ)G.=\a-^ƪt}4]6RAᤰMqwוP.>u[<7֯Xf,k R U˟^;~Dbc; ˴Xu{[T?eg/x}%"O޽r XU^"Vv5K}v"՛_Uz˕:3Ɓd`fC].Bwt&(_%KX>OS}?&Ԝ/>}K=`9uuln'zmg)DsH㑚=9OA_a#X/ekoaz_tZN@R=P'@J7r/T)*4F*q y܍`gj~z/>}UGnV~GBI6,sE֝ƪD}0`y58e/^&ufnD|FᏤ4RҴj(F(q$@~sh|ƒ\jʭE _1`ϋϼ$Y+3w8ܹgw?5gbmwI㞼j0h7 b4k%$":N711Y쾢+<(/|t)LO1V%;o퀥P%>x{IΞQ YKJLy7KX̽Jc<~vȐG.\.H5wt*ǛЉψ=GSQI.LUBOEiez΃r>L?vl*]O}~-\-H%f}pw}}{nذaK+c'/Zr-.'{>_"`pDt%ߎOe6L3_  jqq})d$77UꐂOwD_-kFs#xn \4Z {gu<;gPNHɅ^ٱG %?Q1ll7ksO_ F; %0#:/f0-u FAvu"T3 >]O^/a򢞿+^RF| 垮[WnQ`U|$ΟaAAֻebR@JCJ6PxRKUդ0dI{uBJH,, n/2_\śH |D]> 2nJ9u,T} x=W hG#)6-̥'χ 0’jtIrKaoq4$T2~}'x5.J@y |1@MJȳ㧴CNAIip<7ȹal΄<\kHfs!҄ E% nՉoE cB-Cez0gݏX0kGrfN\Z) !_t- XQDV?ntx30͐uKBJ `R$|a*@.;x4~Vrj@Fl^Tlꝉyqw@#L4_ S պ򚍊D3#kQ|%r 4O ĕ]zsC s c\ Ά9b;N23S98; ı8Snclwtj.+Q*U ?+)F 8FO7l!q ؞~ca28db lHU<+{TH%hS&sa;n蜔6;[a΄lD+D.\5$ Q(ĞP@U` :|:x=SWf"S4% aFLN̈I̓Ypcd^^ 6!|H(t\K.^LǙ3Ґ,fZc,/jRMB4v$:$%y &&s>eH7R17sw?/RK\.S ÀJ\M Yؖ|}&(K#t7ǁp-bb$[ep77bc1zʝwՍ0 ^τ{y +/tl / 6DxT4te.iܬѽ#5ڋYn"E( O^8p^kbjv\nDY"pKXV~30B#|D<*Mx񠱱⤬t'ae!c녛Y"<[UDJXOUүd2RM]_Onq 3yGhYW!".GdCuZl;!&qi[)GCǂQRl|x jh gёu=W`z@GK IH450V}X'H7Iq^ZUE(q%ܟX_[=$\lhW|E:1e̠(?|-)2> adJ9Wb3]9*bt&,J숀_jP[[a/@{ [wy Ɖlbt?$bg_bTvle3rXbk._$ R1jWEf4]y *-%֤x #ɐ6EiؤpDႰd ^gh%V\{۰#I_}\qC4u(F /e FՑK<(6&~YW&-Ybxb^E*t0TJVG⁌&7RZAx;{]_}Gϭݼc̸~}̙۫~UX^ vc{kx8*J~{ٹkD CH!#OU3>*Hq1gg =]v IR߹ T|qωi˼֮ڰe}pGu>r2CatV[oԡ# x ÚU[3;)lfUֵx6 OJ{}gx|Ȇ&nk xe˔s]0I̽@6$cZ+q^W #?9w'OAif_&^4u-Y٭pAp꣱>tءfҤvĩʖT%;!66F7*YҧBjӧ1o:pΔl$$ib`XqYKT*-YVʓT;æh56LV8 'K9B%) >bjNN2?K.+c(:i,-RP@[Xz9DJ]`NKL'H3q#4!ChBd0G!UN 9@ H  6^#G+]cзl:?v}7ߪU^q}_b[ziƍ3utġZuxSvڽKF O9xPyi"jM[>]:֮W/Ք7o>nsB{G_?K}=/^8~ޡCnnuo۳X /{ͬ;|AӦkP:sU5jՒ Ԗ;7qJ\({kwFi~~ ڐ]}vwV}40P/{&}K}Wpe(٬.|g "B?blr֬ޣF}۽-[؞t7jjh4io[:.._7-Mp& M 1cN;k\EM[BլmIkזQ`ꗖ&|aúIBͧN&gk[5j4d^#F蝾`kY֭Qg~*R'LA7B>cyTɓM6h48%_}enL?PMd}71iݥ2jLKG^@֬Q0a{@/OCpyx=cǎ!!kC[t(zXBP-jX1*Yr{ qwٵ ^KMۺUY* 8N/ .wA!vh/6o۶_+m>Kz=r sv9V;S}]P_ ׂ,Y"?S̄JO?Ӏ#GVQc+™(37nnԬ7AN t&tۻo!4yb-{#֒U$XWft2ْpN}*;h|7h{?ՐmԶTGqV㽼Jׯ/,k;b5CԲcGQd B :o.p&̪M|}GkZeʷtTʰ09?Į'1%(x**jg * P1G D\Sr)S_^t37/ Yz'Jzܢu׮=ˡ3g!B'jSh '6$K[r4yr#u^va ᴹ|߫xIBCD:t9H䍨j}*_!vew hQwsCd@ڠi3Nr).#Ce)Aݾp9)Z߄ˏ<|l!4 6l@>;ۃ=)n2md(6lhlND_17rwWCct!Df[*w)#0ӦM:̮cMea؊V;ofC, $c>׿f ,pPʄ '")A&⋛U8MժbbL _Y|;aց1FqڬMjխ+g}Wa :PgGPYTPf@ n-e "k58!^eU66x ш?n|Rj/uNGH4!p*th "}^Mg' A4@Ȓ$ UwZ 4BF(zn Ɍt+w@ d@`}ߔ@ ;P`aJK@  윾C߾%;>$Nw@0{XXK!bFNߙ@  aaa0|>/IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/eq.png000066400000000000000000000265531506652756400240340ustar00rootroot00000000000000PNG  IHDRiCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJeyyEZe{nn۶mޢ[АNd'QQ I.2[]589=mlŐi>0`}l2={4hښ5B7Y;wf 51W˽ǎ2~~Dv";Ȯdo۵k=ֲWS_#dz3<}Ν9,^w$&rEXX xa .qvOKCfOJSzzO?ظ9X";Nd }oNN1cL--y'޵_c -y#?@P1#ff'p}gݻىDv"nퟍ!!wgA_l^A/'Of[D";33Y0P=}>z4lGLO8EYu,3ܫNd'71iúONAv)pjCAB[6mŠm\L{.^DT חq ;(`bsneXJ'uىDv}%: AAFFc,,sҥ2Ȏ͘aln[dǣ%Oϕ_`AtԫB1CKŎO{WWzFd'٩RI4I2$ɬGFv't70zo^0c\X2ܜNd'CɈX{,Q.,cݻuAx q ىDv";I1. >;rZDv"WK]4*oߣ.Z:m!;Qn ۧXX52Nd'oJYFYe=*V.ƏC951}`#ˍQo(Nd'74S%-dQ{T'lU.)>&䳳F+Wz5iE">b HYE]R䳓Ϯ>;3m g.SXtІ@T,uu%ىHv%dw";!ىJ]Bv++={ yyy]j'{II sNUiiСC[nݮ]7Dv";Ȟѣ>} [?#vNHHPͤ,Dv";Ȯ sGh^iPgdd`iǎgffUdd$ Qg'ىD!D4Y|`l/|׿u";Nd']Cd ez-֟{uuu^0|dž=*u";NdץGuAمɉ}ҥ]veq:Pn Ndor,,,>c1:tУGݪTbd|v";NdדDv";Nd1RɎOEȎ݈Dv";ȮdǢxgvv";NdW)Ȏ PDߣ"5cم";Ȏ36c"7LClpM- =(\[ƙ-ONi]3QI;fEg'3ʓNDv&(Nd'ىDv {:D"uC"mFd'ىDv#L";Dd'*٥%8IDv";]7.#o}6-, Nv˗7/ںdq#nj:`;>Dv"{m]$WZhN[XC_/F8c~Ƴ(l>+WZ*lDvmui";Ȯ<ZZ6 t.J鿽ػN?xaO^{, gYYQHYMf$"GdL5m'[<&O\|DǯWCZ3~͛= A"{Kt vz#U0{U|~bsLB786dRd-ZxY/KI!oa5G*Ag8#R843gf#lv|[XZg~ܛY) %ɒ%Kv"nޓ}ov6&Ex[X`gw-ٹP̍;pIGȅa(?pdg<w=B7Es\I8):1NVЩ.}>:a=ňO;_#xr⼘Q{{ vTl3iyThEc2-nI_ذa(PeƲ>dN}nvKōMv$|2`ۛH#?$= ¬;|}ӿBuϞ_|PGdǠ("츎px^vp@[UU_@w=Џ= /:t2V|vx+ޯF' ,sUQP'BARvֽGwE̜< m8@$,"e^,:'MLɲ xҳE=wSv*$3~/f|V33`% G͝kaNv!"Jvm|g냧N4gG;>v]Hc#ͻ :s靇As<{O^ k%N1gRN?CqvDv3\Ȏmd1wiK0݊WdGE*q|"_Շg?߆7v;zCSsyWa0~AFIbnڴiAi'=zz4>'.]is1CMQpX09^*,Mw+oaç?="3UpdZu52Bx{\u%7FJ1r(Q}>EC, |6Qԇ(Ywx fI 1D߃RN/bȔ%44*d?p8@IQj"&\EC*;ut?2իJZlYlB+%(@dedx)vx@9J_ܐ+lzō}TRh̹E/|v"~]n}Rqɒa|UtWߔ"#6ԇ])Cq8,zWvNJr>Ȅqғ qғnKrֳ5ƖX$8أ!рR] j@?/W1~8%a~/AҰSgF52jz`%'rͳKl?ܕ+_a㲓Ab LD<-6YmK\3:jMD×;:Jh7ob$5?izvzT_Ei8ﳟ-]?鑠Pk6l\V|coVl,]xi+XF׋(Rm%{7J󸔠6ܜJ1_` sdJE6_.︚փ"t1< s*Kdo>ε\Oid\- wcb~ت1ɼ-[mR.",aH\z>Jˮ9ّ#( EIGJ+lƼSxc[UOm~<ƳX[ <*Ǎ/dlzh$G/#Asઃ野Gz34dIkJ  gŽv(!a(ùZV[|8 '($ +~/$Kv_E "Fٱg w:"%O%-}_I}Sg⡐G(WXQ"-!ȎjBKK n6yƎ ԑ(ljBJ̫Bt2)8L:U~X.GѵeȮHT @{|蹓IoCIX./LK | )~K60{\jM~z6Mbq}W8ƌތ_5GvN3e@vRk\dVsӑs.46I L=zVrzٛ ֣iّEvV^-Ewe6:L #WEp1_kqTv ܒx^^7"˖I̍fƄ$yxy;v;͍፵ 1cٛ^䒽rʔ)N 5GvE4*L<uQgt.#l=a$_1qdgo8+U'7åz|={X7:َ4ZY˅\ :k<ʕ$8w!@s6(<~Ԩ7&+$泯۰G 7nU<鱈ĵֽgR;i*'iX 8rpp?NJ?sF"ܱ=Ͻm<x>7uv )Gź=߫Q.Y#]#_;ɎYLL :?i|_pcD{| r 7YnY _ n;&وW)R(ƊW.Y/_z'p|͑y,,(7e7!%615ܞj2&,-*d|Rr5bø"#1xW lpz7+7}4ilڋla˗?,ʪN΢R ~CJ^/Ndo~kUG@;G6b)PNE$c\N*q!lGBbW,z18YF]bc|}R;gZCBzDcKjUggd_lUVAv! >u˘Nd Ͷs-3ѤKC䁋AT '`$'.sODosuڐ"?n6):ϜI՟Jطh*ggјɓ'cٳgFc!..'瘙ߋ\c)Td=4.]nK8mSiK`0&qn8}P~\g˩B7ћ/&r8`]G%zn }cb#75odIݼY֜JNBkX1ڿ6:k,oooYrfBF4d EGulv|}T97/DvEZ~j<Szmg\s0K 繼d>/G\<8xZ[1 `ݓmNh%7,u6-];T;u ^s/(@ ż ~׋8TYiئBv ㏺tԫאme-ݕ|+C>;ϩ$1=>#H旗;d*w@2J1+2dڸƲ.XQ´o66Ƭ))3`f **ٕ́!ٕ-O|4^ <^^I&&HVDF*`eU׼u&Bbձ8Fɾ=.>)߻ߥo_aa1dڴO Xo_C]6։Dv.*dS]jYZc Ted~Ac/tm\OpOc KkX!E5M:-[ׇ5Yprq3<}ΝNvL'E:ٴ$=SÐյk[w`2ֶ گ_c.|jǺA%r{= p'tјY6}=s&V6tޝaVx{>\o|]ŇUى#ȠC_tȴa-"칹N..{Jiꕗg/sXN-+053S]Gwu nsmC_MTُ0֮#f،j9얓'ἲĞ]g",#:cd Wh۵+xpaDԆoYXtȮwDv"{]pW;.\س?5 dC ǟ}6Ą݃ء؂ݻOR '{` ÇT#gKhhn݄> Wf>>J4ow! vʊ߈`=2hֹ#dΚMU)D'_jZ15;4֢E A62ZͶXTee!!->OZ2ȉ%n{{Ou>~-1Q]Xy E#+'p\{ٝX4v]._۹O\XlqmůB K&Mvى x!@je v[+U';p[ٿO?aʵ4QÑ!ZL+1݂TuN(*tr@٧Y/{-k][33\[52X;ј%{ՉD&dGZMD;Qs~׉7'uOJre=/"klՅT:pV(QgPQchYן9x@gƍMrDF'poP#A;";D1f5+}ob3z٣Cfu\xj9,sg#9OIi{ Mtx4KJbQȮ։D%Zޠdg&(EAk>k@dgYvp~{4 ctG~lEdj 1F&EA8]G̙'ŋAp =n8-I.~t@ Cv";qɮ:R &v yb36Qi^]3\ى JvNd'-zu=]T"5OvUFSD"IDvN"H$";N"FDOZhAd'tSaRl";D"鳈$Dd'H$D"HDvD"LvCee$D*D"遀t`|Xu5D"@@:Gv0>+D"遀t`|ҿM"H$=N>;D"ϞcH$0KgRIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/phaser.png000066400000000000000000000401171506652756400247010ustar00rootroot00000000000000PNG  IHDR}bv>iCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJ8IDATx}XUֶĘĞb7c%lذvEz/TA@zotikL?yr3s8Ά<9>y̞w֬YUQZKA*TPi… W^B *m]h=:# *Tuiׯ B *m]hu0;*TPi@ļN *Tں4:vjB c[S *TPiW,\ѣg>'lmx:tz|ș3ϟ s4׀`H/sƍ`U(cVVffqlS33LxbsK~>m֩aZ'47;wfBu)7w#o бcGۊ>jܳ:vdvh1)9Ϸ ?faA:޼-ǎQZN=:݉. ~_|y 9;vÇ󯵵E5f 6e;/}__KLX9[[`ћ3󧟐+?;>3S_S+[D5}5D"W': s''sggKooFU?ݹ/BiJmt!| /^շ/Ҳ \k׬MpՕes5}y\CѸZo|561Fxqm]ַM\wVۻϐ!u(Όк!΍`NiJ~ث_?p%>zmǜ067Cƌ;|Z?𣽽]z:!z}*R! GDMLr۴4rip85e Fǎ+L/si)-ikXݜ:u*;x&r,iZv'n lA4QԊA@M@ɻYe9:KslI].-21?ü3P:8װj@,ZXL p=O _WcqW*QEEM=["hkk8URQU>qO-.< TO~3њ"17!{wDUYnv {y'&U=|8F'v:{h g*}0h\ˡyFC/#iӵxhi]~m*& kum16] 0݅ u:%xW> 4DܴB.?~ӗ6'8`B *ݓEѻ{&-gM&?P0!5U":|8.!+)p6fҡC|<ӡ\29tIٗC72us@Əg9 2jݻa##U\ۺG]]ZXF.CFsTl[zt||Xy6'N[.U^"w_d(sr'~A(rCtLxcǎW)0 ߾}5 kYsy<3g)au;w$%3)<9A +=JN|<#11Aă٩`}{f5T cVT+*+>}}3R9&QM+Qhy6V `lM= -?%"rQ*R+RFkiU]YU]i彐<ܕ+t{@ȞB=R2@(r OYcid[mJ^Re$:C^>'X@G 'Vp7 k-:`e5wknV:8lZJ EpT1J_K.,7 a*Ap"V"W *)ZJRh+yd/Ej9(׬;Uw$N523Dte%E:sqtVj v]1V9~"Yr!fa?̑**V ()SZW |իײe˞>}ZQQzzz M6}-[9ZKK- 'caYP@uNQunqMnIm^kNqMp斥f?k_TVM!\$ÿLF,7kj*a'oU|`(/n;Һh}NNN-bVB^VZ?_0_QZGASsX [Dh *$ԐST#₻~iz~Qz̂SpB_B<}xxeD(rCEޚ#⟮*TYv=B u:{Lh}ҥs޽;!_~eԨQ]v}ܹ̟YGG=Q;v,EÇwO2qkIIh$XH;xAc,, @/,u9F.IE`-۹?A v6;DDMe0seD(rCL].bQY941xxP^.Z9rp &,[oq5..ʕ+{AvOOO~#G@"̕+W^vmҤI0䁝:u:v옯0i][]˳$(+ј̊!y (y6)!ry I*NHϋO͵wqĂn͛펚9_MGΚ!EF,7}33FNi2qٝ u։y=%%q(Mhh(mÆ  #g8;brpp+++H!'''.\P" ֹ.=9= ~u/2vX0,PKXPRQYc"5J<[a\J,ܟ#Wu(9VX=m,YnhyE*Gu1.˔E~iDDvfBlD r9~m2 C0B%҄/X/(Z'.mæ¢r-_5b ŧG'D^:{)K'URy^}ŽZ) JAŃM褬7/\~Q#}r8B8a` xJDRŕ@xRh\RZYvx_ATHYJ/fQ:᯾r۾ksK*jdAUXVzZQy,B"np{*j gkkk)ض&NmzllsLL1Qbȟ8quPZЁUԩSmhʔ]Q]WIi55q:0bڴiSO~V=t.S@ #wnfFƦ^\Ս/YQCb EP?axB]dGͭr䘅qG!5` x3ܼTh/+`h}TUafb.LuOoVy0Z~Ì3y^N!l֗+5kauʍ*.t|VݗՅk֏YY96fDֵqLLK\Gi.GF$-2|#q'D%dAq 찴9TH^{\S` k}c!(4v{,J O&曶袣I!|)c[:CۺtTwYN/.Q_l)RPVN.ɳAE1k)SZ4EZo.& x+9m셧Nu2%)<48q cֿx%?z3>q #w +oG^=ba'dQ3tԇp섉dS!6d2WZچQZ Im~&{! +Xk,ibJ 09|p *Wȩ} "Nqc.E~rA[oUF~ɪFN/*Q7*ߺDT9[4^˅ &8AAfvvDL;gg3T.%gYd>+s̶tJOGh8Jj4_0W\Ne 2pi9mt,Ͻ]}T.۠Z"҅APӡsbӟ# $=)RsQii)Tpa/f5 $^[H$Jιjp:’* 2ݳwo2R3 KwɅt;w jisF+FS;5n &\~ݝh'f . I\lQ3k?Ls?2s8|!IZS;^`3n M?|tPKĄZg1Fcˆھk/8}yw*4J<&̥b;y[r7Qbz"ѠB@HPq"TeV޳7$¨\}d2uȀ>9oT]u*5 O+dSNsIB,E Vm.I+JY >rQ)7!#P%aO&!2rs3=B@=ktwM:cvKWC}q0i` x.|X1ՕSz.7Ɏ*@xس1&:BUǕF7=<.WPd̬xoظ9?*֩y&oMjp;E`7'ݍMyk^e``Gɇ:[Kxt#&*qkb qh\I:gg_khs+^)oOo[ vp#ww]1IO_=:iiU&bq: ^4Wq})S"ŋKn?p TliC(LTXjhgX.-+;vJ!#NZ>=v͛4q'|5a@\fAA>ζz /JTPB:*TP){撋~֩PBEeںСثoq H#ݝM??T^nY&MxNc g4R@11Gl}ss{톼?rMGT (MCrtMK{{ֱ͛FOG,A|=xʽVPcXĖ2.ĕVu]4K&KO. .l6XL8625~nF;f08kzJӺqH"pثǩ7] U7p"]JVT'y[VʘpU7V)=7 {7qb6'lǍps#_W9XfdWhAWa{A  ~W_}`N./ڷQԳSp8}J_3MdvŖak{H.PJ@|*G 'HlvPz!!8p뭬x{N)XZ"2~fWi6\42.nL:oiwLR귗W#g/#%-pT*:T#| ݺZ5Zƭ;|;ݻ?O2Acg4+W>9:mBߤ& :omƝ5)њmx`pXxJzVIEUg1r?}v&*Ԋlv#i3&z>}/o¢ʚO^A}4MjiwC%={8oܥ qC&l`:k:m.4&l,;Gzמ'R1B.?~ӗ6'8`B(LTԺ\Zښq I_I7:)Pzֱed>wCafbN{ƕ&&  /:i6XJ2쉾d _R[o_GO_rɋ_>|:_gĉܩ]QIH~ǎ\5*)Fo߾] A4I<{1h(4cttKi嫙ɍq!CҞ1#.!G^W=̼]]HHKST/?~~ӫѱӵ)2&vbE|T__?+@xIi6F۱b"SKߎ99#g̘zuVi޲&FJ ay̜9N ۅ޹ 1,1 I9~'&'r Jk?(9=ɛԖ]IȨϐ*9AԊcVT+ /+>}}3LP*w1szΊN,i}(ngrQ<0huTHZQeh])'χN:U1S+RVZҪ{!Wy((2*1KQm5z:l/0$5[V*ZrM mZ\b.*㍴1s T DZ[w +NG}?QXiV .S^s72yQ [ފy1v„QepDM^V]S#U/Eޓظ7 :R`)@XX,q7&F_&zW7jX֝* fUgݩFfVPg޸2"3Xg1ݺVj ԇ:rP+yU@I[tsc-B6*fF[sk;T[qC gJkQsUkέ׷]Ш*GY%eQ*VxY M.x48E|vZ`TOk+Bl;\:䎞>QXY訫P?ITF- 4.ި{粚ǥ5Jj0:[L# t\J,&ZY']jT&bQ򿥠J-6216m,["8< x+hyEZi#] kiq,‹ cOk+B+ݓm4d%AulM2bJTFZVaQ9xUݯ/t: ^5TnGwWܫ/ej].)(z+ljIYo_ʭb \T ~*DnUDLuMFJ5be]\- jB\+*^H O`O%ᑭp$c:ᯁk+B ,"eiբl<꺚OJ3t*F H2P~WOVLT * 1Z)Wyn-VC@UR9s_MXW>l ˪-, ,,.G%~Evx%KU^N3V6X*hĥ?qi] h_}tožBIa.x1kD %QYNYX,P93 Np%PM-<265<:1e:aRBQ.Z5jN[U\.,/ TXz,YNuj#$=" m k!ZgSIBaE%5dGq N0xQzPVWR$/=~*)TzctXSXTBȵ>Xjր(TSҳ+,"nie]^U'#gTe[^zwYN/.Qaif86X6 quBuiLawJžs9?SʚL^#EwTFO^bMg?Ǩk1b꣰Fzapd\#M f"j&<29xŕ9Nvx.~Rz9e׬mՖ07&[•&iUih( y̮Z'_m;CP0F1L_Xt,4 ܘ8Wȩ}  sqc.EbnDd:㜫wT [wru/]s T*9f*J/#dU#רZ֋[J`N*4ޡ1)LƟ| y˗/u.<2hlb} 4(???_{ꥧ+@$%h6Xy_Q[XLdމ؎dHP aPbg{.(z: ZEEI$-kxVf \X[x,@Q)eBN]I vǽ] CJA|.D^]Esc gնJﷶhӠ ZB *֩PB zkC?p`}-X@29QZB-Sn;rG9L7̙Cr&-_nڅ4+ww%G4;'AEIA}\a^$֚^=y#g?=R{ٛ7kXAr?p04|>e*E l>dm4tݛ4o,K`ihfoofkkud7zezsTK'۱9?g'-[ҥhoM[Y F 7F붑gt{}Ln̟~c~:v,N?>kmm$rF;;PJ ӧq/D__C- z֧!!]_yAAԨ3w2ˍHUJв#,њhZ1KK'??!>;&+M.zCNnp\ɒmZ;ݺY4DZeRCCrCu3&:],jv+w*u"Z',ZD:xщ W/(Qf K3o;ݻao={Λx\\4.عA9#:š|3oveI*ӛ7ͬy+lΟf@nn8egbdܸZچ@X ZhHɢkӫ_?4䬵 o5+@q#A kf-X^Zeb";.h\6ٶm=Q=%^S׮ކƢ 0h[Q;RK B \Z_al RI1!ˍ#"FEuQ1Ca nn/f{x`IM3t(: B}/\7cG.]Hw!\VS}x!+] %uڵwobEq֡bY[AЯY};76AA6d }&u=oo4ovax ٓAטCv3|1qKx?1%IӀo33s@ VJse׼bH4 񑐆壏?esKJƇRf3xn /LpU0MLüHon 1`^GoD7x4ם7%t99S@ʓ؁3]}:9Y]N|J]x'ٹ4m{2;;[zyU5CSjhqx FLvu4i26X]mmYVQlz0)^Wr tZGNd4orUu1Zo,i-MNnPUmœE2j$ʢAqZkfq=';籘bv>AD!p1L }?/4QN޽AZ )lwԳFPbY1spci1!_`i{&uL`ț5#*0!Y L~6~<`vt*QCU)/dDhQ8nLh ?xL8c#u蛼wObeicA0?|̓$&ڦq >Q,_ɨQ=ѣ1Gy`Ɛ3xP0x3S=Hf s\8?*&{3$vuf02uh{)Oʊ^bb,:9ZgL1@mͷo_P!u;#6Hc`^ C#<* e|=^4ohDwà_O&nF\"71¨:L6:'ɋ2am^0R~3IN@;pb.bZOM%88ѮqHLBI(q >ϝk__)S4oD!$ 6@@G^j-&V71NHJ,Vuh6hڊS ?ɴ~URQQ(&F0L_;KVZW `]VFEOmZTPiQhP[K *Tں4:R}=*TPi@ +^QB . PBJ[SBJYg*TP֥֑fZZRB .i&hv?QLDmlIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/effects/images/reverb.png000066400000000000000000000314751506652756400247130ustar00rootroot00000000000000PNG  IHDRzgFiCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJ1$)QS5؍]KPŊ"R["RK.M`wn?gu]w]`{~p윳ϙ;3Gg_BBӧ@h gdIyږ @ u@!:N?@ u@!:k!B[dRr!:@x E:@ H /̭ML.\8j„aÇGz$B۷A?b馏Ot;DbG4rԈQ&&d@ x F7gIC_hO$fػ'IzzM'sP-vכѲ.W n?L7&:d@ '~Ls2x[|&$\{\C^IREp:.BN 1wͮWRLsxbg׃>xT+'Az;-d~H8@&7oFMBd=/lx%_//6()b}ɯuwV)`rw?+,]^ӿ^.d%Wh̆x"dʅ1ҁ'3}`sҚɂʄ$!S,^Y_wAm}Cu ;yc8v"FPI_~SxCbd,?eʋWqNDw=QpP{w^XOT>dy ߾Tt;| TmzvtttZo"YM$% lH2d@7zKE2Gi:Po(2NZԼ$aڢ~s㲭$?@GҮ]nO?.d% l$T^)#S/.nv:4g].P `G8qϿ?21~(Ua_~9|ko'kp "'d]wy~=z&J\|Æ $Z,'O\\etyn|fFm[Nn~ 0Z [dDHy-d[({RnE,3$69k ?_M;bu֓솱~Ϟ+AӦuz:ufhWqpYH3Ą6g>DYE">̬KkёE:sȾӹ~|r_چ nbԨQ\Ο}oooV L<#@]ѣe&MҨBYYYIoMg)~M:S ={ʕߚ?}sHKqq]b4:[XKs 59=f`*닄@d}W@v}}q g/PQ+߽{7rҥKcvv6>ܹ؏f3&Lбcǵk׊Z 6<-|o=xԗ@udojM/^Dmk}Ȑ![\1cz%a?~-Haa۹sgԊ?mD  Mo׹8/ X p+sKu} o qh:R~;%wXpAEBFA|Z{n .;M_U}l|PmYꊏ_ EdLKXط_wvӑ^$b=ÇwsYІm?w; <&33}?o'k2_|WߎNoLw*\ tS\qis̙c?//O|a뇇9K.K`[G/Z8o%.cFS֭2s&cW  ƻz044'zyy"{ׯv䔾'GO}??6Q^"Yw pt|o h}M2!Ə*%"c^Tq N;gJ aG'e$_r-(<t:vҷnULMj=Y3hg`ͷfʥgjxm}fAAf `$5g6;S}%aCᄹz rWdäU{q~7>1}T}AE=>pڄ'd;z:a vV ar# `{](B ^/ڷE mpR+EZM14h7L6T^p xS'aXEdeN{T:۷G"aT2 ],0<$6^eYZ|T/,}qܹ)}j:V]lW` :LPnoXk.W `CG=+ňXHou TMoxiJw>@!p@ |j̮EJC:P_1^ S{>7msn?G_~)Ȕ6~2;;]BT;iHgDf5 J0A밾[G d:,tyã_?+{G8Y !sA.Z"V p$,S )Sq9Ynj!^ S RrKقt/BiThU^`8 J=0bokH.LWKGYGG#Nasu>R/8*=:&%`^Xy a0p6ouNv၉I/~յ4 MEsvhM*.o{ݠ9W#38S6EayǺHӱzU}8ߓrJ";=bgV[CY_k7FzF/Um=-}kqiXYvLJyp`ȴʛ (vlSL!/KilR+,,m|sW%Ť =D%t6\A"\l(|"A?ynzb/l @ x'y~j/\d`baO6.Ʀ{u>|DbOlu@2lbbB҆mYI G[|޽FP\Бc*I 5x)E F::@ T.] `%&&ۼսj!:@ T Y'u@ d@ $@NA $@ Y':@ #뎩 ks̥KN4rhnѣ#8onPFi.wo߿d-}}(uQp3&j]zk(b]y ebs&ߏԹgoA?"y˿[:`”VcL[LmhÆM _! RڅL:d< `…*,՘LL}-ZPG=3ZI ?pՄ$K{3@!&mȴDAGFn0T~Y8dBՉoLZ$Xx鐡C dǎ/1,e;{d!.o{+_ۥxPWlC2_$NA}7CW|".ᖛkva6\yiwSfSu e66vܹCԱὮvC)p//Y䙽7Xt9'~3櫑 ,t4RGW辫w 8UgBə|"2i+Eu& )%xCul))/g}N3_MߏNp ~ >k3x83h2A{Mȿ]?>h&mȴD!=JUm۶?WX\U[c>mۤedjꨒ-&Ϟ PQozO&:g͞}) ßY(4jz0ҵˤ~_?8̤񁷂Q|zϽgKʣ;' ܴiSpHă*0L+7nlQܻ&Ϟ;k}jğu&*:70dH6(WSwĉ "w>-YT]!G2)]Ƿ=yAXd ;b&k\LXp3pwj^-*vpvtɝmŘ|P7*0 K_ni 0Cȡ'ixQRF$٠+j!sĕV_,7>PF!::1vX]暮N|`cn+.lAFxh@_"rNsЅ(zuFd] m&Wy~iU^qef^io`޺u/d0hGs&G2Q*\'<+;'0'<96g10CO|P^zj,2>Ty&ldY]PcNptlL \! 3wY),.}pğ&ȺcZV-w6N8KWXy-Uk֧ skrKjsKMǜlmTqXnyZ^yNaYV~+$0 c3#ĚLls3'c`xS瀋L Xd|,*\]YUYȢh 9B4?Bv(\~uJ 65WCՉ?[E&*:V QbB&fFF Q;h8Q B \&ÍzSX݉l¸0Lfԭo`]r0 d1aLDw z6y" $&9k̙ e)0CO)KOEƇʣ aڳ9ѣ $(DWcSrG._SvQUw1mT17yWAiz'GAlܼY\J+k 'd]MˋNΎLHy10rphqE"FdYu60$\L3(XS 1aH-RouSeI^'ObczLRw2a۸q-pp>^&*:,ʚjn3)A?,sʙ~:]sAu[q5Rp"M1)aqqCGQ`beku}52Q6ODL.[^RY.&o|/^E+{S{(h;"A nAW! +2u56vjg=w¶YJhK:ɪز+/Y79aRP~-#RkjN~1&bN79Jx+ѪEe5|_uww6)aИT>m!g.zSZOo3Q!OVLdvk&{<Du,[jͺ2caaer|(MTŭ-[M|*2WPR!"f'CXS^ΞjyM"UřH:oY-52+D {-0A7phyp߾h>Aף= /^ qP|'\$̤Zg‡ő;qt70l}56(H.6&+3Aͨ\aFYSF)Y7us=tDR!n]m}/05D:YKIbWIӋ+j5Ǥo.Cß,SooDnG"Ǎ魹Eeµn .'O ^*lph}3+$@spr.\>s1Q%dqk:>䉼2uRm>ǣu'@[1F¾60T*2k[%7nj +ďIuz旐$9:r^XZQ&,OOVrMa4cG=jAF^qrN1Eq.Fr18PYx@NOq"!H\I{)Vu~d-2Cȡ!o,HԚ0n σ{}f Hqׄi;4}maY4|rswH,| |h$N]&|ydne뭛{\l aj!k [ַoV'MLX J֠CVHS.$;@L>;Ͽ2J0&q25uTN|f֩yH iEL(4鍖rJJsjL:[X;/]b_ r{fG&,_oq: DBlA5B]?Y_| M`Aiuq?e j|e˺ n2P _&OVU..b 7niT2juez(3S q:Lnn-99rH6K-3n+d=XQ  - ܾ 9.0j]5DF :S֭2sfUuTxȑs粃xV:9HMO})ٶmY*GѾ=G>sIW2Exx[M֙ [o;fbz|~e Vp4w}u1mEFO9a*R=SS Yqtvvk}mq gZUCe;oo 2dW֡kzH;BQ+˺ÈKC4ACt}5JB5DF 9:,NOLDˤlրgB3z"#,ǯG{VV*Tp@.473h?*8\KNN:->>hХKVx`/7qzKRVYd+hZ gotSΟn't+9zHHkZvO`zQֺFȒAY#GXQQV_ap%$G:kkּzgO8#w>O bEE±}1ހPZ߷m(Geb*e]揬slgwucy\9{adfhQPqkz$[ J+8a4AF P|K ֦Eō\ w'G[GG3)L0P MgYG 4B4*,p+;m Ȅi,2j<'Ws|NL[&I[F&XL40Z\(IMf*ɺT|ȑuc/Z=nw_D?W\x27-t;CHh݂+]೬18yF=bE1? ?[6'YoOK: W2mh;8؞<&؞ ѷڿ_sts|wⲎh 0W2B/뽾NZHxnyB+n$AP - ۥY@N Z@ $@ Y'u@ Y':@ H @N $@ Y'd=Lo%Iױ8Q^N h:$[*̧@ m@ :$])@ : t|?A :$u@x9%B[d]a(ņ4IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/envelope/000077500000000000000000000000001506652756400216375ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/envelope/envelope.html000066400000000000000000000054031506652756400243440ustar00rootroot00000000000000 Yoshimi User Manual ~ Envelopes

    Envelopes

    Amplitude envelope Filter envelope Frequency envelope

    There are actually four envelope types. The bandwidth one in SubSynth has identical controls to the frequency envelope.

    • A.val Attack start value (not amplitude).
    • A.dt Attack time.
    • D.val Decay target value (filter only).
    • D.dt Decay time (not frequency or bandwidth).
    • R.dt Release time.
    • R.val Release target value (not amplitude).
    • Stretch Anticlockwise envelope is shorter on lower pitch notes and vice-versa.
    • L Linear (amplitude only).
    • frcR Forced release (goes to release phase as soon as key is lifted).
    The 'E' button opens the graphical window showing the overall envelope shape, where it is then possible to set freemode.

    divider freemode window

    Freemode

    This window shows a freemode enabled envelope. This is where all the normal controls have been assigned to fully editable target points. Not only that, but you can add points up to a maximum of 40. This allows you to develop extremely detailed and expressive envelopes.
    The yellow vertical is the sustain/release point, and you can have new points both sides of it.

    • Freemode Enables or disable freemode behaviour.
    • Add point Creates a new point before the highlighted one (there must be one highlighted).
    • Delete point Removes the highlighted point. There is a minimum of 3.
    • Sust (sustain) The point that is to be regarded as the sustain point. Zero gives no sustain.
    • Str (stretch)
    • L (linear)
    • fcR (forced release)

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/envelope/images/000077500000000000000000000000001506652756400231045ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/envelope/images/ampenv.png000066400000000000000000000636751506652756400251210ustar00rootroot00000000000000PNG  IHDRMUzTXtRaw profile type exifxڭgv9csz.RI*5MJ`Dx]?|Y.eR<_5^W>~t(r(~lspKC__ap~bQl>ǿ sc7>7J3ry~-˗KX/ wzɩb%kܢϕmMY/?oFO 4ä! {-R}|}͔lEoS~K>) x5˚߻۽ku#\>*|Wo ;ߍXѦ&+vWXL1+1.q%%7;XSO$Ǵ(}. p+4ޡ9'p%owNW {b^Q,FF^}&2h/̍?u?-V\%:q 30&%$ %!FS)IZYL2DH06N$Rq4a#Cd fč,Yjͺ:ZRkmZjY+z=Z{뽏;0ƌ3SYNA\uϝ)!<''=PR~LJUNݴ#6C7R ,^--Å|$09,*f8+e hBTMՄ@e$Z]|T֞TH*=M=s_6o>ն.yRv[ e'[9F\1*(^\ n;x ;!>d,^{*Q+IE[AahOpܑ0lʤPۚUlp&-wԾjعȪt9jC9lmCCT; ;QY@:=t\w3ᬖù@g)o]k!2lR @9*oFO=Yd޹4bJDF:.GTZ7Ph}^i]k[D7);.fRi7.vWqAS4۠3ǥ ιk=rR]l?Y+Ⱦ4`OeV|5;=; ࢞ Чhl"&v2AȞgoI6 2\W% ƫ0h^T߂:6!MB)⎪5HAuAr s;} YTj(X|7F*P2١`ꧻovָa:GJf1l#\ بD}b(`QDOn L. 5\8ORMϹC`1jNv, EG"| Fwl,:^88( nOv68m7ԤVP0А~#Ln"*p7TKB9 sc`iD@ِe+5$DMP];c(hH?C!96PEJp Ѫ[ݗ6sWkhV-J+7R/p # Wb1w[pҥ_Zk}@^?:˃mt*忳WOq背|)q@W+FO60=P)tWe%J_` A u5HdKaPt6$ ƴZ#M8!U|VeNf5*ܻ WygH'`sCf,j+:4lTQG%X9v`U jѡp jBq4uIZo]c|\mF).s7\ S. f>QslanF AZlJJ( 9EJpAaGp1K84pYC+K> 4JŗWrz!hD7Jny 0ޜJPք:tꉅ3<|,^+m(N@Bz6$P`bab*;HT8`^rxʤGޠ㍓0 nQ5*I 4m`XOGv`7Seđ hLI*ЈF2PO1ȍA谤Lped!Pgp d^V+8%VN7, "ScLU) UhȈ =hDV,)#VxDfbኝ7TlEM:fZA)ډ=R<@!DٕFD(hH`}0$ᎂ.@6~]\{h]1I+`*J"ˡ _ah1uqqhrXq1̈́%OJy$ iR)BT[[\D*-FөFSbـ D\ ˝,L1?QroLJo85Ћ*0?O):.6tC/,DkhinN_eW\q8tY6t=̕ts2:t9(^F Db t%!fpVd7F1@@P2#׿=;2\x < rTF!;p@me< 1/-qPquզS6alPwY=:8 H',Rk:BW"JEfW獯- GS XT!yjKmQIfP5 p^4 {®egCcѤ0s>z(#lݺr$,"ׄVCD ?\bV^ ^" C$1(7%S }Qť[p@z2@esOԬEQQ% D#ΰ"x/RvGܪ`!B˜\Qm^eYt CZ`n:!ԭQY $?j& U7$ LBxeKe7H7 "'`>%b&S'O!XX*dJ OEe!eFJ (RJ&32( '70>*5=d%e'jrsiLf} SNYYY=Z+..K@ eie:iz56@ a0'괂B^&%&v#D+hݻ٠͛ @;i4҄&(@ 0"MFd]@ 0"MFޤ8@ aDh{V 9ZDAm`t\ن ay?O>~5ɗOևKseVf =4"Dx-`s,iP3S!D@&qVlYK'XT)6#-HlEg:u゙3ciEǗ;O}v D$HbZr2&/IhT|&d!b@l4 E0 q"DH!׮)ZY~o.dì"KGUc*E/ ,? ?xEz=*҈*V$믳v h/{Uq|N*_zmù@=zL5i: ʪ֩ -r*\=쭑#ٴ&_:ˢ2=&`"vN.>~ۤIW tHS`I6u>u;9%NDhi" "p.YRtxڵYʕ- F}ٻƱ,R=pʟ,XeS:CBYIA<ϫ]z$MVbEy>3XsI*V}]O_aCKxψ4eiJC$ H-"M&O7C|G$q(~ f bkrp%?(./U;4!҆qgj5n,^(drBH6y>(hE@0YR?K/"ZMS*9 rVP>dobb #{D944$K`$DH!P^=|xu+(7in^QC$cyJ}OuzV%Ol.RN%f;D^>җHߑ4!nS]V8X-ΣGRg϶q{HRMS&4iEap(_>7͉;҄)9CA 1}x(#$o lLB4B w}\4Tӏg/34*P i`#_ō{4{%D24ɺ`$DH!`.nѫM-{vK(;͛۶.R1k"+(|"Mj""nM|Z裸&ԟBi+4r:qMfDqgq9vB9z* #MH $DH!`$)/ s= ꉐzs=Q5+HSuÆ45hԹin"]%M%M`vϙ?ikxXp\t i`9ZD!QQ>9Z T٭ \͚^&L0w8}z\9czד;ܥԮ9D;Z IPCI"q}/IybB2&;rOKNur(SIneW[{uvzPI/PqB&BX!M/o%)1@yBp7R? Y0 cv}e )2oR5. ijԹ4ew( bE [҄-8lL53HSa{v-Hy-HH-"M 9Z5=b^ЃMD:' 9@cʩB.[<[m֌WRBe9bY̤鳍]c9`%`EI"|3|RV&s*>{w_"~&M0➭`@foՒ/*i~ۿ_L!װW4ѢE|8eOv;o_#lB 7A|8LFxn{$Ll4"}Ì4zp%м6K Ҵ.DdI}Vkb#YOc/4=M^կXͿ޿y6eiodW}&ZDaM-l҄ϢC ):i:mۊMaT (3HL#Ur DDϛvFA_H 1S mTбc}+ c> ۬I%R\i\Ә~,#M@i.ظĠS!8-"MBlK doe^k`vy"M8BzH-ZDD#MG@>H̫W!SOiE@ Df bȒ|i޿T!8&ZD"MlHϐ'Mǫ/iEH@ Pznf,n7r~"M4Bv/MNy*.w3Rt"8"D 94յ9v#ʏ9Y&ZD!&?+SYi5$t,nJp|"M4B6#MQ߬aO`o D&@nIFuJ(nKH-"M2I:OMwSt?_v鿰c"D&@٤)Pi J "M4&"MDhi""Mّ4-)))94"D DŠ4W8'&ZDHSX&D~.\TDhi""MaE~zPsiE@ 4iBAI&@ D&/"MF"DH'[kdHV$')WdI 1w&"MriPTH9HN9]]JX'`%&Zٞ4ڵkɓY^X֭ٳ>ʖ-ˊ+|A1zg9|~ʔ)Y9 C CװaCcҥK ܹs x 3aw+1 ""LimIjTWX ֭+ rYPB^zx+W {mv@&Mbm۶e*T`}zozX׮]Yr2ENs\,+:UuYīo}YCMh#ʱ:E DV&m:u2T0"8o8oy}K,a;vpרo͖.]6rrSYĐ,bI8gqpQҩS"Mhe9irŬYfA#KVy:Bx58}a?p g EYYT\,,bRw$ƏEЄE(">:E DV&i lq=d̚5U^=$ZfϞr)׻uC<8T)&Z4Ij*֢E1*Zj%/Jd7W( N=2Xz3IE㑨~Xk~"mt~ӱp>t*luԩS $DH-UT I$[hQo:iӦMH h׮Z*SoV'71XK'oq5' :HJ)[N4"s7oy#ƒ3^\2e>l'sEGGFe8}QllXl-VD9AC@9l9YTgX3dfBQ^N8gwXDէID+JW,dڃwK4"sCB%|6OfqG1޹sIVvmM͚ ߲#I> ;~Q_5TXD쟬od%*SAKYj.TT0&i"DHWi _I0Oc3Ǚ={VZ5[2/s_6mٮ"'`}e>w4ڃVԩw+ժyb}]>% aʊe4iEŸDp"IS$qwvlr~pa / y3cğ{^)'UV;gO?OԾ}Lu :աu NZ7zNN v]UHbU;.;{?uo6w~ow7yJ_Zl)Ns^_K|ٸaw=yC."w[Ǧcr'Þc)+N~Ϛ09ku 7_S_ :ҩ)_رc+Q).1n8EHHfo IO>u ӟؙ˷Y,& ۟1gY4M~Lձ!*}}vm֣Yjem^!;5^{t +8W١c R|\HSV? [v2^Xz!6gΜEy7j-YS\z}Ex!:E`N)_Y|G֍%ryVۮ,0mLňY,AK 3u$&"M€4a7Ocq@lk@Y͙%H6\Wtv}v|$\F~>ګZ<-'eӫa \wvgleu,8ee|_ "TY&$ǫTԨQ#(.:`!;M%$qMCKЮKN+K<TfbzYbJ,bqg6YCxb̘NH&MXxc,meOpC^i cSαXགྷÓ5&Tz"d&i"D+DI#< ^u+~VYX; .@ {.F9sWuv5vUvEu<^{z2dw˻~Qs]17ycX:[)+et!#UNñO\ۙuY\빐SNS(6V|B[4ЙS6:.iP_8bVoW ps*P@Dgw! H"MDh0iBK(OtnS) :>"?~%ޏwsS|"sW؉ϗخq`BMrpQQQ%YB5ׂ{,hܐH#&FYKEr:GRұIYsY >ң/e| ʠSV.><,tm8)7:e%5nyD$iLg^mڌ;ߴUDBab:R,}!N[fMH&Z!H߫`fUFU:7a_ҁZ 3{ Cn0J;}I848vK=ynMM6iW~k׮Ji+sϿ`Q;YeYI:v^wl\J9q= Y:;)HN +:eS^ mֵ{.pSU/x.^!['6H&Z!JVXœBA.ssN/Nx/ Y?ft=>%ªIH<ͺx 6;cS I^. @ur(J Iryqv5|GYSS\ReTI8Ԅ.:eO:&]2)3a q*a–8|Gan8 ?{CAA@0C[^' +8i"D+HCF1ȂxRW OPk3w^'^ANN>)1ͱ!"rMcJv_^OFL~m۶0ߥxj߯$1/G#IG, Kd 9AC-~O<"c,^Y:Ukz)tc^.8'#LYrX=YI 5'YDɲbe+lU> ZT˰OputKV͞cqR+JO?mq{iE+X 9wOE(>fxuun'[ӿԎՐvus:K`iOIPqzZiZЋM馇򽪞2PlO۽Bzqy FB#zJ'!.w?RJ>N%q#uj-m_2S6FdJ.[YNuKÄƨd%{_}hn,au`TӼ*DO_ܪu<>v7I m#DVHB(cuٚAF O&-laFq7L^g3og=4b cQQ FpBg;sv4dGD@%vd;BZjVoکUy)r:(NN%1I&eէ@4틬 :e.hLxT߯ N[2$YT!00&:;Vy,Ae°QzUv+#re *N x8 80hiE+HS^C>י7>^0 Oo(P}O-]B.\嘊F-_]af,#*r]de̪șss%XtttH ±4ѤI>n:F]dēbSL lHd'/j8u;uIY'Àj1 ӿqr@﻽޽{-$(0ivnȿ3Vwlź1ʓ4چ\`H4ҩt[83 3^'NN}Mp d4%ݱGY?q?|rp 6tn? rY!EQtn#g}fɧa吙dBzGZŊ ?rBwl{؞D֨+"+]PjӅS~r)lϐN\qzSyNAVN*2tJe*S1| Pt@'LZP+7wsd9bBɋ,^yݶ2cbD2DhxTlYmUX#7yvxEZ;э6MÙ P;\oI =a{cu(s}9nl_\*Uia;6)+L"F5oBy=Q|SfIN'.hcY8=;!#{ t#UVN-7׫ofL@ uStjoB:BG7]x!l7ټQl,.鄫8tR:%5vX%ʴY@{0kd1S]tYFV Plœr;ƑG0`\ńIq$rn D+$I^#`ٞ{O3zâ4sskg3.`{&'BsWӝ?)xO]q.jO0Kmǁ}<1GUxq\InfÜI>c\ݱAVnz3ر.w!Nmx[(2RtZur&v$y [Y*U'Y:#A.5WۮөMM;<Դ?Xuh޼{#طSVQI>]<‚Ťo#\d$L݅q e6J`9H0zA_O9*U~ޛ5ke)/"Mhe4y1r͖쫼׫FLB`latUü|ք<@qGE^ hNN{unHMm۾lClޢgb }^0ѓ-rWh)oZ?:6N!-ȉ$ک}S؟M"${ĠS+l<2o؇ojxzԩY zEۅN!D|ڴ3-r.u_T,t.ACG곾R،_HsvS\/>*! MF~v`4Ѣ SKB1خ8?{U/Ռ=9}@dJjIƀ8 ܸ.ЌfNB7|x5m˞8yw,=ݛ/.Oة ,6V<)I{5YAA(A[n.DV9`\q`ñX9 Sfy'1*)TYy}ˎ±?sQ+9u `pRNxգ',PeX:u$'8B5ciײGc&}75HNK4g$M2z"ڸe.SC?B&F[vdr!M#f;Ӯ MW݅:iԡS s$LЃtXz^o&I;mlΛ@6u^y#DVv"MV`A58|)tDpjK'j}Kl,}[n4hs ν@آngKlcڽsǗr… . IU>w&D´`LF\RP;tpZIս_2!:G\VIVMʫ{9~bde)|֩T F~J >gR@):e>s{)N&P^vuHU΢X$L\: V'; S*<$⑮&Zٌ4/[#WoyiΈ'  IFd{nH9 ;>/H67v0T"mjݱ-Yb@ |2X+Vt>Wwu|#jOTWYBN1N@MDx SF夃1Ӥ@q-uǶk)WʪRJ~J)FGUz^딨G9#e9uԀ6쥕I4L NjD؎[}'`Ox){NniQ^QV F )+iPk[v?TG SN9!:q> u ׭Ǥ5թUiS.#vtLsXDRPI^w)5{M(;xnkJ}lKriƧ fVomeSOe:i{N"M49 ӊ+ڐY¬t^,L.5M:iR"pmjnӛRD7}i] ݳl$MZDhiE ;6vx0ޘU2ile[C '{ ?  !E۩;6O~n7;˗׎UQW'ʟQpYplc9r\<ȖzYF\#(Z*QT3"c˚ G.Qc':ilPB ʠShQId'])c:m~6||6|N4.yS6O ^뒣uʰ r;S6Td 5dIva&9 uqZ?knRAJpAVr33z왩LDh$$ 6dPܻn.}o%])'gkŻtnSs0x Dvۂط3gy7H4]vuhbN'kPOC]S*`ԡz~ǻ =d8^#qwA^y| fn~v)l5*bTCX3 \M~/stLAϊ9P9U\6U+ש|;-h*;ƻ SNh]1-ySzM0^LL=un;gZ˂ {AiEx׭[ףӾCIcpcq"F<990x6;lLʏwꨎlOxv'g$$EEE9;*1:}~NҶWˍA9"SO^&2f|A: WN{{/_!Yt  W7jE !Snk3Lѩ]M1 9Qd7&ҹ }:0C@F.}LYF<nLyECGvdiZ냞}mPH:-4k%DH4yd&cwudž ;IS6XN7Xzktb9F0+5i&kY-=^3 2bsԩ#v=<|˜KtǦops~! р 86kؗXܹ=˗^Գ ]#6߮ m2e#:5hKJN)TZ[qGRO#+7ε!jMHykHW2|yNP#eD XIV"M4ytذew:M/]X'ٱ[]PK,a v֡*.dl庭ck$}M ǟ."Ky!5j>K"m|:_£$lٲEFu%u Mj+ÀLש:V͑:;y<AdCǝM.&gқț$MaKl]^3}>|Dhi`0tN{^KvݰCUTEoaAn퐩u<OH+E91ZlڵהY YGzE0'a?bUH MBKxtQHpt]ϏI9Pd83/R s0P?!MdRPj]-6٥uCF9M{ ~\vN!Ss&%DH۰{m>p7Z/ jx(tm_VΜ:9+[{u}pÇh8\ի+WB%d "#i7 bcd@ݝ8~82I";|&LʸIQF@N}"b~5*rshjD*:|)E~c]:1;tlh&^%tA/ GMRM;`mB:4A@@⸌N9Ȓ˯p+>}e4y"P&ZD0P-[8ը4ac3/´e+nOkK;=ڱ"E|n\b!ǖ\#ŸS06̣*WkFq*T d3{l= n9 , 3:YR7p\<Gd@NQF>_k#*{`1l1πkOXd_xϾ)s5nܘ溒""ʨ >DLԡjҎ,!b z[/#!LDhiHUV!p]r`(sZP@7JJtt*TRgDLYڋyQפI,s7WDff0!#FRf'B5HH˚5k+b;Z|ÎteC?&)JI%1'k-l&\[VO 6%DHS 8}hѢ|TPpnVO>d87 3sBQ^SSFڷo{AAnoSrY%DV&Հذ;)xC.t 'D+ۑ&?Ε+Wɷp ߠA^㆓cOTT֭PB+s,_<[ȌttH&3 W`kuwQ&ZD2 ablٶm[1sGeŋף?uwyJ8:6OA G*UP* ߭\8䝝eF:E:L0wެL2'K1ַo_}UQ(HlO2+4݌=bBsyT"=R/yb>>0G(ɍttʓ<@Ǐ/RHWfıH&ZD$uSS>}:ѣĞpSP%H5SԽe(%&ZB42S%SDhi""D4"D &Z4H-ZD@-"M@ iE@ "M4@&o]Z+SBŊL9όc9(m=.ͪիǚz#֬Ѳ۸wJ/PoyRY>bfxӤ9zΛӼSCSAʕ+xLسϲ :3jQ"Mi3oᏣ'l"{ӒC4V=IUox7R^5_~}ջcDz\sk,䓂LZU1HgP{>YǙq M#9!ͧO5i^zmiHSmA$HpÚߛ:}3%˗gp~#?T0Wp#Zf7iIZ{Y!s3|f5u3x%J}aŋY+XHc)U=klتUaED>" r^|72OɺL߶~syq֪OnaEo0]\9_}yii]ᚪׯ/_pvר>"#o#:JV!MW SKU}08F'`u۶ 5@}pé8щ4/Y|%MpHύVN0q ]lcōg֢5k^GN54 _QeeuP&M%xןHSV?zy%!@P<51Q|櫝;E!755br^ G{BqA!tZHS޽Ec/7@ãӧ wkqר֝z##_#:JV Mx*D?Ȕݡ ]$## 3nvJIK B^^?"/n- 0CSF>3oUm$A<Ͳ Uƍ}i*}ʈxs^Y;q%|aN*-{u8=R`LY@SDtH/2FW'sQ"MijԥzwؾO2fe$|H&d9FV02:O׽㻈|kyvEjߋ)i/R$xFߞz iBt}@\$"HYo/l&!sSYqc/}9vm|-;nn1J蝩*NFGuH'Mj0cV}5)dW&+Cٖ `0Vԍ%#V9Yb8P$g]bv;NI|!Mv]l/Z"ueIo}ޒ@(&ZaOP(yvm'EW̮I-9RVVSe t}N X=8]0w83L)D7Z/nyi.Sv(4 ɂf[M遷] oD bn+tSf&wכYɭ2@Dh5iBXh >QTFɎ0rVMVh8Wv~vt55 "Iܲ;p!M2:#h7~';=iBz˴9Jnɟi֤u~BmvJަd12ޗp$XFHH^עC'ʛ EVVIFLz TV>LhG+|8&emU=漞A׉)Ӓ|vOG2Dhe+҄?(:BӞ P'8grԱUr/*{ܡ{nڞ"\0dLa/-^n؛]eƱσ!yO6h u)߳s̝L-L$ a  c34/[$j=lK")3bM9dş#h >)[nJɟȈiH6$ðAONŹhEjNB,(2?"DQQ 猉H[X֫V&+[c"AlC zo2%#f3a? *Ƨ/Ա Tr+p#M(1:s}U}ʈxs^orCj6t ?D(Q 7h2@@Dbs,TI%D+[oB BfH-"M@ iE@ "M4@&@ 4"D &Z4H-ZD@-"M@ iE@ "M4@&@ 4"D &Z4H-ZD@-"M@ iE@ "MB4MJLd .\ !FVH @;i4}@ aDh4o@ aDh4? @;iE&@ 44H'Mz@ &2괂B$qN~z~82IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/envelope/images/bandenv.png000066400000000000000000000427721506652756400252430ustar00rootroot00000000000000PNG  IHDRV pHYs~tIME0 j&`tEXtCommentCreated with GIMPWEtIDATx}xI¼ar`Ü ma03ma&A$ff;v؎øYwサzzj"+OFS_WWUW&9/>^ A6 ܻW5!H AYuμ~-<\ A6Tfc=< $H/"?Yy`I Aspa.H Az q<-S\zա OD+ d0UB< Dz*Q<Ϛc{Nݳ ˯]usAٙH6 oփѬ@9s_ƙQZGȑ#GKUب[9zB8++Ԯ_ `eTް;)$.K͚Vjge"DilFN6߶F"Aᆖ@!K2kgO! H#:9g\!oޯqseT҈.cףR9}:}p`g,(RQl/Zq&~QXiC+9vꌀ+@VDV)Qș gn@q<-=W.d5ijT2 ,ȣQB$FJV ~Ҳ(3dk@@n$cJaEƟ]'MfyC4BA1˸!+"OLykQ}5)_d&g/XbS@W-: A "< =kȳ3lV@@ Av?@=E  $ A!~YM㛜 $H@ׄ_W4ׯoڴ)rMe%T?^Pq㗨SU؛7ٰa#p_L8Z0)]LdŲv}UtN{-9:1+ٳgG)t ePLe*}] mYgp81ɧ2f`@2ZbАGЏpyU}ǫNBn.(: K~ Ǡu TUy4bȢڶmk70 |~UKW8j7Q-=`L(Δ=$!V*+@jV ՠl[Z5|WF+5PjK?/b…HKLIL6&ڨ,=Fz$yv G<=:}'czvRjNU BhFբ=dJeDA$Zu^t[n2GW< Wkj6դdymoUqUSeEaJ/PĄtO0k?JVSᢪ{U1_fE*e(Wd9:QF=)ZsR4S7|So/^sTM^IYӈ#lyhZ~}yZtUJ'$Ay&GCժ5nҡc'^_r8 bJ#|4y:gPL&vq1y]ղ*w G< 4PMpltŊ?`vݞ}R_<v5E#7P|~V:<†ZnDG[׹w˟?>}ls }#N^͛s¬`CsR Kz<{l 6,W֍}Ggccp!u!W^;b+{Sg/8UH"P.ו-SX&]N֟"wu2fy%|)ISb5>ۈ o8]zubȱcdthQ7."7UN*F0~c7)#ɨLŦ&Wr#r WTPu>J O |1 *7+tb2wX2ov$-8Q9ptL8ydvF=!j(ܗNԣ8b]G=Wk[S? =y_a}܋7aH_Oy~Ez|=K-MH1՝ZẙQDu8zE_{+BSϒVT;ͩ]vqK0$k7-Z1 ok%Ga 6l=o+&C<Ν;*j*<)(:Y;jE/=K{%'bcDWfʪ=K(^H+'RPᏟXQހ# )bH_O Դ֯bX1 ,t d`zkm+6])IoZFSV| =3PӶiQ[g3@ 4C-Y !w!@0Adן$u)PJG[Tп/%~*ً:kiEZ^LX7.'K`RpU? #ˑK,ISgWݓ-J#R_3_?|Pnݺr$ ?ȅh!st ,aP. i¤tLetĮH<4-Z;~ђekm1o<_+ 5j/ng9wțWUj7AO  )R8¿XPS+#0F%>:Cz4?8L$Йduo޼{lݺu:} yYې~ I9p"Q`.]2(Xn)dBKQӴ Eoܸt4bBГǻzߛ%K7< G\LńD3/-Ske/1)Z 6Z .GPsJH'={s!0X$?ixKA_i\ː: :(A )9b,=~~CW3) i\'1)ᱥ DfLH\<~uàEnݭ1!;{Z&q&3nzLKL ёT3api_VJI{mz FK.'" HݜxߡJp$ 8-ƨ9!R`E892YvT%hAZubTbsQLѐW#puOF%tH\/d3,+VȿhOct.! ^(ErD$T0BY8sLV4<6yw<LLֽ;{>L? EĊbC/_mYt\KLi*u,,ygݬ<1!M bFL#Fi ƗijP~'!GqeE:;s\]a45C_?^%E6GO V\'.GT^s0bU 詒p_$u%Iʣ'Q+ |q y*>h.u64͝/[C_BV$0RDBQđ{>̜R3i$IĊ"F}G_z:k u #8i/;vVLv 2CL*;Ӏ_ѱO_MLz'ԣ; n<ޥ1)m|ŸaCϺVW_/!'Bݻ!A|7kԎfyC:%}:RDkG- 2H> +\9TmG:kܖ<ۅOaᣞ+oHcHyٹ03b1i$tx"( :tF=d 4XljHtdþ2a'UΜ[d7OŬ985Gb\fNfJmN$`/,Ώp<_1c91ZTb:x6kŤ0UL19rX#&aZ|e_X?KFG?ThfuKm\/\?}3- 5$!ޡ X7;zA9U3y(Pp͚OT;01$:&JHKT|̢^Akoz9tbׁcXD!"GU&yJ1gH|R&.e*E5x*uxCސ8xѣgOfNJzZ2'0bAb1q"G]%0Α, 5aK9,_(eFDQO )Ťs*&)dLuubB& 2_".|s2S7.Bo%Hθ=wѡq{ ,ў+6K?C\ţÞ8qk>A#N6$H֥?I{E!B|Ǧ-.$FGBE = x4ԫy؄Ը-ş15w2eo>ip}#%]8J8 bOۻO_$,JmN$`DMhޡ^a(`U.h#YL|5V):1KNH}Ë>B" l-&oʲVGͰSh$`I%._IRj#xlS*EKie]d^X32^ȳ`ÊD>#E%J0nKG]5iڌDCƀLqv`9s/dO{W%z&Y#9QH B540 Q6QV])b#YLXd;1MYu#5;Gϕw{=J1uܙ1nbLa")/a zͱNxxTi.gc5l#/ZR'ݬxxÐh9{ޫg>z<-r#/ķ %!x+1KRs%So~?̙OcyCS+0%KQи-arD4vަm;Q&B$Mg@C!fIG<n?E jN4GDZ6j8Gh*+Ŵx ƑًS$z@,bZ-1J1ML)k,̑cY1T8yG]\AN7hM\5s;}fgggyZj'0< FiA1Ϥ?pxRȈ1C(0iM[\<:mZWMOr ̃6Zi7JcD#D!Ԏ7l+jZ,@A</R|&0AI((ĈO%jE7Yyu< nб | (1xVYLx';Isj']Tbio>La Uk7c)L,L.uHΣy ܻwommKʗBxzF=j|y c^>O1sJdIXAp<"{%,rV7~ƄMNZl aryF8#5{`w^BdT%s$I;(%D5;TYۂ,&~GQr 4 '&F8[)=v ~ńypn޼[eD#^ޚ?l:"ٰ(d hFtnM 9oѨݼ B˶,H3ҾFZj |{Z>Ț'EqOjK^LM QҥuR]!'Ζ9R_#?2a( 1cGeʖ }!i&NL;oP 2:brg2ʖ&ͻ Ƃ_~5&R-w9%tVG!wXK%uGx$yLJE?*.u KG'nr5AvDD5i^2y:~L\/^,He+$NCgKHD0ve{ C!I~<-T`v=lܶe<밽cj]yNj :c(ے#Ž{klEzD-zBqu!Juy5"b b7SXoױFr /&FZ'ਗ਼0G(muٝʅVǍ+Yhmi[&Nxf<<}eUj-r? iL #:R4G=2تm CrcjνWo\,8̹rz7*!E["aw\!×Ht 0jԖp i"s7ec'رcMZ}-!+ r˼b!#AފUki9äJ'k0t~rFN@4DCa${rozyrYyZ7sڥrM [K;E}r2@ oKl# N P̓vbȥZ2^y2p~]^s~zwҍE:Q>$fF#і2S -Qt윿v{f)4R &75L5iŤ5eU;gBM*FB O ;؝Ffc nWw/%^c^N;:rئy{ѳAY|S42. &C*j%ElAR; " waoiԖ$!N)cZo>Sx_smCX $)' [;(8b`!ےr% /^h#XIyYDL|5L)&2/- >u=rBiV+ei3uW_)H _#y=gqՎ]z5gגpeAfL`-ё6QG}Ė^~x.B\< Mxݓ;?_אyԩlm$9rXEWHZ ai4bD" +C7[w@A;/7e^իg G~y3}%ޠ\3TX넥6K~qW\hDJ~y#W@$3v,KJ u!O 竒X$ B 2@^<3D;,`wAB.YQ̙#:(JiӶ="mf*20}0lK42I0]-ßą42uyj5ij=e-pz'YKQߍrh&b`H/+^M5bfovJe1U1Ӊ 9rD7kr!S` 5rC3}pA@$ )m;tm6_Vah͛H Q~B &C-ԑ?AS!03w3.6; 4-W֯_'#6r k+-։9X AQ̡c/ xQi;cu=^{h,"&k?S/DYvrrچ|.wi't=GKqj6 *WC_G'.bŊ< ͅ<|! Hit-ؔ/kY6'F`fdfA qɢŊU;<{jmUVkvLܾ[^(u{91!Bu+s/?ΑWg]BZiRL|wmj4PĤ"I{MEx +)jӡ¬GU? /5 _:+?yfAu ECcƒpz7Zҥ|^I\tn\taEQ.|٫O50W +׭['/XzE+G!^1QC`m^4GC7>sez{>&xzĔ7RLyg1}Ae.1іy2tbl 7qK}jGn$׽x+;?aO9{iH` nc0KRXHgΎSZ ?:7QnY7hQr%K>t(Vz 8N0kͺHaE?2 -1-Af15%&22p1B]?|e.?_Μ?]H[Յ& yK6}AJuI:pt]Ў'Έ,XY,<^J?$?-xvE|-ԵGvP &աZbBmdb:fN1#NU|W׼ٴv=fIl75a`'Ab6dx(\5m ǂ Kl^S{/Qr jG]Q;;/2cZnC֠Ay.C*Yy20btu8͹hƷcad' `_SLZ*Cަs No$,vwbNvɈHBusw\eӇRVRN @T_mWDd }KVo, ݾclնS| _>xgKc7b (n<|`Sp=/]ԫW/|{3#!&nuy8_~;jjӡsC;hX8tuR))*㋲ҁۃ\|e|4Ҷ,Y>19 WeXDv;CSרQo-<(m׮]'>19|˕+j^Ǥ1E6/)SШ}ǖ:֍ۖtХ 3̎Ê~PlnXԩS2 -r3If_rL7lдiS]>jv;!"&uX ֺuk]v}-5 zmV Vŋ}}E59 <#p!&jE)3J*!e )&0ׄ2#9; m'tI ֮]K+!&$h\ ',_[7`go p޽ش[5cQBX /^ ]\C7sd]pp^f׼Lf+F nyfiP 'H A $H@ƻS-Q|ӧ,Tӽti;8jѿn76ܹeT#~]<@^_ggZ#KTÚ;wJ=파ԪV͙7hlƍ{2 Suowt4jF Ε;7%KVWs\]36L~,YXQQY lȠ@"Z{^&V8ScG Tzu_>5%w)U"yÇ|Oq| :IoEEa{bbte{p0M>>}U3!bẓg$&ya`Cҫ!pnH2e4L:9!g1rAEa/u)}p~ŋ|i^ XV! {N7OLUoP#x1nƍqşDng &p(B ف)kG$,l2 m$;7tOcy_LY,q@rdpA-d| u!Е;eϜezF#]$ݻA5 :8')bxt34ꐇ -@8e.{VU/]BA>4L Ob6tf墆eEM*2_}6$!Gʫ Zw> ̴Y꧔Թ"W\YR\ҾYp`MNN3ӧXg=t 6J(e\:DqA :G)+QُZ-Z`Z`-] qׯVȪf<©t^Xl !/g3Ky#l' AOdNMvaZV g 0]B 3(V]"/;t@Z}A a98SVra÷XuX"tX] ۶)»C+)@XJaΈЕMg̒'Hx/O@ A $H۞Ʌ .\I!΅ .\@uJx}b".\pFSW … .\]h*<9| .\h%ϑ%:.\psq..\pr… xKs\l+ =+Г-?yw"?).pfӦ8qy 9s\Ng9Y:bח`#lKO'WnȠ'7%')y!̈ÞŒ\GsW :_ͺt12ښF!.nܹ {x2 .VTm,\))7''Z@&UkJ\,|]d?0auh|k*֪,%˗oׯߊ˗ߐ'޽{CBBmS9.sN(S5Uc;b)M?/x^6|%ʖt?+ug/ʰŋGPA&>ŋǰ\&u[ڰbK+!9̫v8p[s\\}}eD)Z/k?k0I\۳̄hKjlWg0!5 9ym9qX3e}/^@8b ^|vmmDsm{"+×-'7nLc>['=h%X'2u}b"Nbr^߾f"e,89U -^|-zAJq=kI7<Ɍ,%j.|TfaY~ g{k6l:)CS:+yn&縼}O>B @AqNzyy,Y?ˆ#K}3f̨\!t#.R tSށΝΨSNu֭T x'.7o.v/H\5cǎi׮McQDǏw5sd[H=@l"E 7>۶mYf lٲ}\Y}v!6w5~}Bfa +7ovsRti-ի9ȑ#._~їyQXoƥaPoK4}Wuך!5jtiZS7jԨ?8 }, vow7Nc}->ϱ{OgUͼm1# 0)ĝh么gEǭaGݕ`^#oĉ*cڍ4_l8PN!!UU){n۹sСC 5i25tvILL5)5ysyҧaA頃R"dZjfor d2(-Lь8~ Aw;i _-UR樺g Д,c+2sW_%B5N:O(Dϟx>8iW=zT瑟 \{dfjhcz07S<_\~m5ckZvs $q>}ȏ6Ds @L:YMrq#ޑ&EVKӴW{4dgV?rzXd|rZRZ&8Ԭ50/` ;w :Ǐ azj;1@{K:Ddڠb{Laҭ1q9wtaXb 791]daB[ЊC']Vb_)M4Jî]lW3=4k|՚RMA|Wiڴ7oݺm(?yHbժU6WU9"/>8Ʈ+UmjKU;}Gȋepgh*;@[U{|fwP>8gã4jcg~1dڱko E q`ʶgJ)ݧa\rWOMyP.]lB}fΜ)C ApsPU"Sqʁ֌ZT9ƉJêpѷ*qn1hHA㕽$< E*]zuD^zJ*e>$,&F^Yt-ew |_61h&5ԇöRD\ix>W\2A[q@?y&EE n *1zhQd%I|4f\%ݏO)GWFKѼߡcƭO^r?G/r<ǿgp5_˟2۽q[ի&_= EW^~oc?}˫碊MʋZjCxb*ɢo;K}kj @e)H=bng!x_YߟB,X(CG \%z:`v8Ř@Ӣ濠mKWSnڴK\ԇ,JHC^(Ц }e udYN/٫n?~;w7N|WN"EЯ4Rlbtrʡ:^rXC|@ +V*L{-ba#r'2Ζ >v”/NFh;Mba}çw<35çjW̟|iʛeS0ifYDDh:𕄛s@Ƨdo`,vbrGCMdC5N򭷬Q_ha WZ2 E1,taY[wmضjtKɓ"VPas^dE`u4Rif͚U]9Q])=B3Vش{dE쏴Ի aEx/F}" V'9쏥Y (\Y/YAW\8ᆑEe*h>׉Z+QiJruTksϚJszw͓V*Dt~eӟ`OĘ${1iE{|͘td rw;Iu3r۴5:tK..ڥCz#\2j2?<tމU=(b.o4hXrCQҚ'E/)`It鹱G/PC5f|\F.cEbK+#L֝7s2_ *^!-[jiHUMLbԁb! U,(acDĥ#m̾?{BmDJ=ƕ~eW-X`:Tӭl&PY>ا.۾]6Nxr7 ƉUiF2f,y%'_g.wwթ1!E2Dx+Dcگ`1Ks*[6D 4$Z)]?.Z!5AFyrij&OlZsLNϺ.2=+7[wg^֭c.r, Tuy!rf%<8C qif>FI͑٩brNr۵j1;Ҵ EHGŪifb2~w d F M--1.`;d(:f͚w%ꎛ%+_Y'S0#czIc Ba@է(Տr]"ZvӍ38co5zh 3(䪳+wTQa㩁r*~kw`9kuL_k^Ѡ. yz$P2AQ%z()`S\CKbѢ9墘ltI9 iYK}YLliة\;N'V(,"kNZ_,&n<bLf$IBd@8IIh ')#;1=Snk2>yj]k#ꣽ$0]R}6m0g[`I_6Eca/E4s'TZʠXAa,,OKC㏗Er^=5zCBuf]P=ug;ASD+݋;%yv9N=܅CRďRa2 0OHRnE%WXIU:t(P*_AC%E$!MG]c̸ 7$[;Y~ذ_/29Q#Pz[KlD}$PIS)>i)Z2Dn).RD#tc+N(g(Y~gn#Wr؜w7.>{0SՎ =I9uJ\Bg]~DG[8H>~=oaz㴜G|DzLX/N aWDR1Iщ#P9]:%e7oHG|&hRL~D"@{Đ4?KMh2S]])]CJV}Qw&h*GՈGOgR.LϹƉ>@W>B湋7bB ɕ)[S&bhJ~M& O=5T9 oB%<'b(v`aـHԷinfqn'g*`YnА$5މ9w\}=z}2M[ Ħߝ`Icuxy pX A' -VI 3E+TPPZ}PWcT AKէ"ڞ2mTlʣOs88(v@[9R~},ɡƴj)";"}x΃̜_|'z6m3!e/! 1DyB2 ??+V>93r}%vsa841tףF&0UUĤ&MP,ͻ* rvFDH3۰er?Y:}lXy&ۢHLpOp.$mzTҵ~d(-T&Pi1Y)T, !I/FT#G#YX~۶/]Aq{Љ٩S';wOel]+s Ă\Dr-:U%c`&nvDLr$b3Tk٫t\ժU!!~GO-P>Tpa*Mv$CĢDןlνW"$)$+\XNGy%"rxҕQW7l !}|vbi NKt,y=zT7/j3At7Ɩ&46]&H!JD_RX~}SzZ/~.O +a1rFYyO>AX2,m޶KN[ΉƉk0#1JZ}$w'Ǯɑ6YLц*2q$d&Fj+ܺv^ͻY~ `:s:(9ٕpl t'aRG) j &kCڲC^nfh wBR+°KEr1WRըt.nݵv6ʼn;vL6,0 \@{zJ M.66U&H&mrx0^*@ гL}x[ }=ĉVvdt;Z` m9N4 %AoM\zvJe*$Ć2ff Εdޑb rv67yN$\s&P9 |nWx,u 3!64lt)jv;.xn¥/xӮNmqZKJ[f<$Q ?Akmߵ;x*7_huEJ}%X[y(/G&DO{0=՛H4p# Y8hph $tF4U2@hWoتToF} |`Dlէӯtն]ʭqqefM6@gD{(JIy$,EJKtёDݨ$a&GRT/\,R[M6oyNo>VY-l|#2nQ.vҐDS5DaQX!V0Ш2¿QqO$OQ-b7ԉ;bx"ȳW"\رﰵ= 8y}?mim#I>=|qvr+aaPI'qږv140b3-kyd"O ]4N 6\N8f{NUՃű&MR"9R.['K5I#k8p p%f<'cA(CmtaQI| ^?䀘#]n&sI=toġ<})Ű[vYö41x#42+15XҨۄ 'ub+9!M`'zL@g<ږvzHhjk>lS! \x9ѝ>w388%%U9.9K}=zӡu)(v `wTxT'K;7i؉*!={%:+-p1`oϏ&Hm(Em*`[çB('}fI?K}e+\5r' AR+Q"/<cuTQaætPLwi@ U W`asii~J8e|kP<\}}%pŊr-tO_>|t2HT /ku(`̻ēN< d@ni-q8)73x'xg":dPoe 3|'㶰 㧯)[CrcD;aeۚuw)~ݒѵI>>| IQ6CHsq\#G8?pK%l8eh/5z-(oAmXsj,L$2L'Z spEI%p gX=#`U67W[.1!!SBy_V}=@}:{C=8}y|EqkF!q8RT]KLHuUp8"$ (υ\&5ߒc[dq{8LH;rٖߵxmCn>!hdXס谩Og68CHgZ.aGPXa/H_3.6M#9HE.'LX%Ď8`@@i5~y&s:$ԖI Kʢ{I20'V zi a]14'%pHeE3Ce Mƭ3'?Em(FE'ep|{E3sb"@i X0?wO{ԬY, r#UV"x,)OrwnX^Ag5(n PݯN?%q8I*Xd&̗47)Kp947C/!ԥZرcmR 9CJrsDg()i}fвT]!ԤMcRh_c%3WDgrj,mcppZu 1QL᲏>ñ`'G)ӡIgݍ\6rH` YܹDT?\XoObLpb,[84K/Ři!pɵ pG/>tB?ӆu)ӘqsEѮ];1[s"]g[K"/`{hvQiR#bl/=O8z "9P` Y!f̚5khj \m iH _͈P8X qE,A% :.Ʒ0FmcϾ2RG5 L.>e-UM:U.,qAA6rMtVzq9rDFaM^˳d*?\tm2C%HScJp94Rq!N0Bc'}m/>ϱdf\6l tҩ_f/HI6F6N]Zy\@ZȢNi~%ZXԡqn]2҉ ,^UZSg\W";6Fwfʸ+,`tǒưm -]#GǘC]X}^ҳfY>f2C'Uj3k_YAjVgrw$ːnU_&n >XOE (Cb}Jq7 5|^N# p8QTn}VUy79 ܋v鸿z u FOB7“YYL /f;ҥT>rL"w8 #'|bp… CrOdt)Vb]rDR(YW.e=aI=ٟIdh0a#'Bn(h-{ʔ-o b*#FH([Q(qIѡ +㰽{Krb%t @JΟ-T\}$z>tև|}}Ut J~I ]E'F榄0=E!00! 7e ZV;( .]E6FJ3qTD1Z6 t1G8튫RdtX {Zܡ .R%48L6@nv'sµj 8sItElQm V8V˵ .Bă7pRFeڴi Tp Bݻ-V=>Ӂrah\G&MT/ 5 8WL>DKH\UTQ]\ZD]w KRO'187}At t "D@CD;~:aqT 7W[Nrs:zZ}w lӗHI@]ԓBQ8rT*L"1$ٲ/';p~`G=>5b%ϟod\tl66q5k8KUgF_J  FwaG`iě Mqͦ]՜ hڴJ~ΙQy{u 󶹂+dD'۸qcu1L N#EGvDr8ܰyb^ "֟aB"ROd8=U=i$ìq3gΔm:#qܹs'@6f~2d,mUw,_^^t l".K_$.ԑ+ fM?v~Ğ6^U5s]kPm!"qRLbߌQE†(no |dѢ>{ISVT]Z @a/Qc'рTr4{eZ#V *l$ucLj*5ԇL'Tugzڶm+Xȅ'Qas̑nZ>vmׁ+̢qcRZة@X,.e]L b N^諿Aeos )~gQz39yނ.rǁNTjO}l9e%0lq^kAu،U@rMMÙ:c [Yԇ_{۶m6T|kQ_Fl2FQv#D{qߟQlwH\ؼ4fty]M9F gyXP s8X_sdZ N4z-[6l7u(hʍ=z/])7;ٳdž#V#({}m[E<!X6\7VFr;U}p]ֶДG;L}X,ghǃw== ctJxK| ˨KyRЄk$== tR0J٥< ϰmIE9W":jժR˴y'Zdƕw޴wE+O6ރwdҦ߰z$B϶J'|u[vƖ݂jkx6m֟N7~x9Շ2 zCQbwGV=[n147ة2Қ& z Xg#MXۺH=<!6ok,@-ybP^s-9Paځ:~:`3@.` Fګ_tYnbn?\xI~[T̢:;ѭǏ9@Bur''إs9\S*Θ2~}pC!X}4Q׻wox")iomlEu z o߾}z{ @&YR+:v:4h`+w*:ܼ~lVMtVQsi{Law1r}?ѵkW*<ȫS-f Rj#O[^zCgnR+9~^~gLYdrGRKHF'rQu#."Ej=tȹWn,aIV^^E gs"KFku3O*8LmYa $SQU{R%ڞ?OFxw7N&qsdVX0[oQ39Z|la}.zi|ͮm PXإS0@p~NT {V^d`"CQ׮;g'yK50 ut<.juK Vn~ry:v._AwTՈl4 ']D}ӧO{<|%JxqG< y Yyl>7%͐~Kwcǎ%j.0&Hu;jժmI蹫D qYF .ôxz7q5`Au`]P'5-:77yh/9.\p49.\py.\p<Dž .\p… .\8q… .p… meTAN~e: Uq|x>Ŷ` Ly{;T[hb+Ujؾ}1cy Y4G"ETN~} =s|4B͚Ezam{?ߍXPΚ;Lؾ;_ts<7inc7ol-Xծ[ܧcSr; 6jX[ͺtYae`^\b6|2 e` ĤXR>>Pt%a#_氮(1Uׯ{4 =8{f$ƱQz:-[%.XN^iSG^^ޓ&'7?sf-|JMWw9XkܡG? f1[\ƍ֬ߣW]۔/ymۦ8?qaԬ=~)xA-h xb){zcd%Jк`4-8G_@k=@6j4`5L 4+A988vɒ/^42t ??-OLG+._r2@լs KV d]XAܐ.qj*xĉWU[;#8gawJMc@3孬1ƀ[/N{KJ  .ذŋ0"R`h7;I7Y24o=9m~2v)%Xh&`]M\| ~aS\cpw? ={ ݍi>gt 'הc^^~}}]t MG3 cvSU!h&5f`3Öx g>1g8+ 1H+,ҡ!A/bo˗+F\a`РM Nb`>t"3Nrq%sGz๘ Mܹ\4Hq;ŋrV֘mxWL=&"Mz3j+J%¾gCq%HH>Syq=q >jW,ո֊swMk%s-{m4h$Ljx%LkBӸӦaCšȁY<9%y Ղ!>ùLKaի3ˁ>43 BXu i%aVV"##8KZm9wUW 0tMg+]4hAC9F$ ]aEL]Y ʉƉqӦ5FK޿{pۈc8m1Vrn \YȜw V*UVf~})R_z<ƈ&H;+Y t%we#4hAY(\^JP5NY<OT ( -QBfUyN9uhef`V0t2"ȑbLNQ + OW:{pYkԂkh@,99ބ@נM ΝTrժ. JPN7NNkx&[fŹ!;7u31ܧS1l~PS^/Bθ?%\dEZ$'{cmT@,xz$Ɋ)<;AH׏T{i XWӠ)]--/Ь4M>@f3D#׭#K k%719L|+kZԞ/Lj=A Eba1 kb~9D-2r@/i2EJL3"k@)(=zG XWӠ)}kRf%(g30CX&`H22Vĉ nK?E> <#"GaIwyķ2 lsx!e uIX ˰?tjEX39ؼ"Hm!n$s ';K , @Rx]Rq۷RqBI 3EXdCAN֖6nZ5Z}5h+.A'`U]YG|?&;b䤢H-#k\p%y .\p… .\8q… .p… s\p… 9.\p….\p<Dž .\p… .\8q… .p… s\p… 9.\py.\p<Dž .\p… .\܁'&w .\pqwc.\ps Wp… w0 ρC~ .\pqw΅ .\| .\x|:wi=mRu~ɧ׍LoHgzF:>A+<{lY3gL>mTXl܀JoaIM@g0hRYsܮya;ԪfE\DŖl5yݣ "qd8筹oι4=wzvHDj?gh9m *ƄSgΔ!q%tIdM@g0hX9Oo .^Iy ")c㼾~x ykΛ+}:7mWY9פm(mgէ֨vYm[slX/5'_Cg61gRU7= #yakǾ5#. 2͎7:H$v*Sg0ctU0gsX{nlǺs؉z51xxq$*Oٲfz~ҥUMȎ%ĒHSSyzf/}V#Kl[ԯplxPWݲ)4^p[Tڜ E{߹'N15?zI7S.W,jʙ#߾x˂~mTɖ%Gzt8a.t3fH.]yr(MbYa>Mϔ1}kY"s)r» {+бgɜ}9 VPLڧ>A/hRkW@.̕._K5UdxnHAHVINP^;meײe7)yemlT+S4yH[L3۰&ʽanОtjY]'Z1{u+(<@ t+yIGQ^fr܀Ϯ6=X,s2v'g'W7׀'P w9@diվi49[CnRW"X:WM~9α~w(O-6:GLf́ Õlڰ6&O5(:ؤl[Էe v^TuAOc5Ym)e ٫gtw;sy:~6]FڜfuiUĮXơB{~d;a6_`1&]7H2_3wOҤ,<@ t+-mfRzl|/ţH-hӣ[G-"a!^#{{5N8G܎RW"X4WM[G U< }Y]"zbvԗ)oÜ]뙔Z<1{ƭtx^٣9ytMz V?kf]\}A7_nj}RnӤ4hTN4vn^p~g t6ϏTٌYaz+cy=~ȶfu7t,&j*Z'U{cqR3[zIg0̮D1n `%=fp:x;URebt4RY6SSTA;]:3aM#z;|Phޭ bfR7ʞo{w#gnm=v,Y$YmcvV&>` iXפ_jLrE^cOb>KB^ 2\m {+=] [AsFW;Ld(\6AHDy^HlUͫY m9k=AY۬B ٮmL0OcӠ1ѧVfuڳU<)̈2i9M Ocz+N$Ic6Y4tP_] 4w'ӷ O_H-fFW}<{64Q?fP}o+)WL7e̘aص86ƨ؆w=6[E&on2)s>;2X}ZPBA:}#ufkW.= 6(BB958{Nܾ2 Z.m510eps{xjgh>׬X$P)KxjE<ޱBFK+/ iQ.۳7AD*l83}޹e:k\y̒)}4UrΥi۱Y2jY3e zl~>.3*~K'>(eXqAbrǖ=/GЇ Jڪig6릯YBag9ghUF =$J! ƴ-W"^ýV%h#rfkU*֎ 2m!m_3ϠbPLyKF^ U 40KIyRG%o2dX8]rfϬSեgRr^Nm_N=Fw.D]F!Dx1y`SrnE="1zwAi$];x\[J'RlLȣ&8d뼮|ch/iҸ֐yìΔI򊚕=j7mՉ oĶfƿ.gfHؕΜN~e6a=;}>Snurt [oY|rq^p}Δ]׳zkL"KO[w?CY;wZַZ'Z7Qm0iO|yBV5[9ǩSO?Y&j1tl'e^פZjsmt=~z}W*:W/?{;gCdjPRAM@M yR5ʔqؽۓGM4U+qZԩ]+I՝ħiSOfa߾}Md9b넋`*&,Q믮ϪIPNT{5U,ZU5)WΓe+eժ&)Q&5n(_~G7،}ӻeg1O?uetI ՉO<T-˕+D @FM45T5O񏁻f?io9w/ 1'ι"vcO=婡QSޠPj + \5ZAMP5AM5NYM6 ;Q&\P}&NPhIyjj@ j$3;AMPqjR j@Iԩ P5@MSjDQI ^ ' j,OP $q/5H' jEv&QԸjj@ j$c;AMP(jI,5K55@M& @5& @U$%$*U,e}#2>˚gY,_Oz߲Z큷ֲXeeղNZVĬ>AMPH~ ,|6w,:3<|o:cY-Gj' jɏʏG𹟹w?fY߻'Wj܋śr{͆sZ4e}gYC_}}jYjlYY->췬I&x &IC >w;WIee-8pe}`Y=^ۿ;S:k;sfrK{eDMP@Mvs\beo Tq׵jOdv"]uםd6X/W%* jw:Ge[C>JWܓ\&ewf3%Ŭk:bY&$&&$TMwW(7e{}kHm9MYkdwrgv`t\2ۭDxwO &ѩ& }Zϸ'fxl1\uh=y=y&!j25W/_%Ե+ jɛf1x=t 0蝻=wD[rݽIA"E6nW@5[Nv\ -{XJVsw%9aY-:Izڣs,}-+W^n]h]P@MR(''D(ϛX̛7O"%+T:z\N]ねoGv5 >j3g1cp"OQviӦI O#)yP)a'QE߾}y7FGn?Kڅ_ӀB۔@Ŋ-Z$w5ٲeAj>g-q+BR(OS3PAXlٲTٲf=a=1{k7lzͷ__~qZ)=z{49k,5AM j2cA"QM( *Ħ_~4ˎJJn;l' Si'v j&QFԄTy܆v=2g&[M$` W}ɩwT /]̇_Sg/}7_|_ٗ߭\^}Sl;TRxNDDu@M"6~, '={~`… jBy&3=Gf#ac4.uiy}졣nj\ܑL>wρY)/>ޅ+>§_ٷ {Ŧ(5#IdWDFMB7lҤI'tEڛ7nϬjժ!5!YMݔ?8{̙3u]{oW믿Yĩ&޿*:$7mqU3?o\jժ~GJ9޹pg%+-;a(FM_MT`{;Ȝ9CƵV5+˗WWMW#UMt*_3}wAM|btPs6 1=3oGj4ǘDj㣧~Q&ЛK%۷/<o_x̅+KMfM6EW>sL7[MZn@w{:r퇽=z5Il5].RѮ.-ZKO*DMw?fI',}zDL:v sԚ:uڋ"WoHԟϽf֭fӪPɛ7O3뵠V&MO>GMMW_N>?;ћ&DTImziѶ lo5|VPuBdzHGYd_~WyGDM ~kMK93cƌAne>js&˗//Z=s.\.]UV^͚5{YyI#?h*#qyTA" 'KWm0O7Dd'^yݗ_?vʼn`Ҹh.9soy+w~1l5/sPhI&y>%K͛&zWf5ZeR3f /R$ޓ:x3v^dz=Wʢ j\rΝ۩&$ԤqG\`>s"*s3gw ҝ/P#y͑iMuT~쁇<47pǶۼse2gϕ%{SW*F6wJC˘d7_MqTOi/}Rn=&qI>lO5mSohUQR Rcǎի1 ߸q^q53 5ukhj ^kc'ADSw}iQΥKWm"+m%RQEKovH>|F,\Jj2yڬw>>wMGQz+ΘkI.]RĀ[E~]?_|oPM~s/~_N25(z_z ]pQ=+ڣi:5ifKP|Ct5w-:{i׬>UR5 j^T&M87׮];}ڰasm56m>.WYK̑#G|ԤA3 9,lذސPN5 'Ѡ&T-ZyPUNSx*uT1> (y9]{5`{WDUo::w!= y)kNl~Zkdĥ*vsrդ=t牺;e˙_R>(1%E 5ٻwh͚5glg5}.;Q6U{/i?^VrWG\}w]/jKΦr&2}~dkLɂtu,5ɚ5SY PMz._>U+0a`ųgRp>{rذѨV]̂*E&9xꩧjl2Qs׈)uj}ڵig胏WuPisnLLSMMWkUIܺ`Յ,>OYG;6p ?/@xQS=W3j Ѥ`?/[ 2m:bo.dOXXW=mҗ=r;qclQR 5џX"E&N:몉~WN^~׭5qgZkr}{5}9&> TkU9sTkSo,^D߅Tt~W%xpR1C?8I)Q#Ή>T^R|p鋅VJMf]pӯ>K(]u'<ϧ9+9&M־gNn F&:bfEfjұc몉WS :S]ߢ^f4i+W>}:.[6ΰb뻽*K씍quv5%5q HJh>ש&ˊ#RLSMt_g,6}'3yι&L{rդQ۞W iag+ M](HˎؓߠUW-+ 8g0љgɥDm"+Ș%*:1H1%Eо&zwIn!P˯رCԯKBi kF9&$5;w=:k֬ڄ%Hy!~VjRM||jA$(2yvD'_-]VjxʋWN$(JW*N1RϿ!)PMzH'?-`}M /\4%)t 4̛jW=kJѨc}={TE+.sM>\s6)w:PJN-I/ OMCiC)R<Zs>j^}.QD ̷UU67>k 5\5QS Ҙ,W"vɂ-69GX5y{2cG3'諼RDTk &@`qclQRa߅FjЙ:ujɒ%nu;f&RY4%&N42@j.ot;|{TDΡ.&jQs7{OϿSʻ>W͊3u3Ԛ$Rx-o|g( lZ;eÆkjr)H Ɣ(Kn\M̟qwT;={/({rsդv5D\aݭ 24%(_V@>K֬&GM}I&F.>rE;3w5k_\}Mv!LD&ٲ]פQZ լ[kp/lblp /iFZ0W8psj"4W=UWMTeI[m4n$pOQ8 6\5D>5V=ϲʯ{$Pa=)g~ƥ+izV^0zrJ@a4$Jk/V`V}?KVe̢/ )_9@٢&ѫ?Ѩp̟Iڵ5jv_s3dOu^\KP_>FB:"ByQaÆIqF[%κ*xí&jן|to껿)hjMd;6zB#tϒ7t~#3B檉ʵ% kЯh7*4BGYG߸5._}JF#QW{#bMv2`@}ڵub,tK 6AjFjuQu>}d ov&>lq=ʠv3x8Ȟܪ/w>xQZ RxƍUA7i,*?n7U'fDKߚR48_Tj%+UTxoRZU>6mB5+O}egm׬e jU+dBxQATݢ4ս&I\~F!*<7r_4˨)/%A6ukI˦͜9їO#'%%?tty8[Ԁ=UIK݉|^+!KzCA:XU댚&d R^DML跦~ $@oFe}pI乸S^{OM6:?h8>{JJVn3v)Gtg VYukMꃢM[)/QuSIZP|ܡ7"J)D5<*3 -(?%4ǮײI)2M,58}xM=pLC5ftgx'=uHM{HoW&k#,) KŪ2y'#XzDR5AMQCԲ43"27Uu*[6w1iS!f:>%LYv9C7&AZ9)JⷯjMT7Ujߟa d+DMPdo'/\7B3֜yփGxҵ$% Vn+Ez5E j @$ JpիG*"6  <"߻f&xrFDBkԪ ɔ59mr5"Z[VEADGd5lS,>"zRIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/envelope/images/freqenv.png000066400000000000000000000606561506652756400252750ustar00rootroot00000000000000PNG  IHDRM\w&#zTXtRaw profile type exifxڭivܸcYf<,9AJl;'Te7;u⫤].j{qk= /=P ?n~}=P;kYvk_0#ke~[}nmkg{ſ}S<)$O Cg圐9%LVt}?;?/{ЏS/=ʏkJ}sO#Ӛ?{{^^O7ʫ])zu^FK,hSd =D}C;pyWXL11.d 7NF,!q4~%s{8#- wz-[)!m+y]@='zͣD%w_*5m؛q:⚧Y͖!cu;2ʆ& 6Jc%V:#JZYŲX}߈d%Ez,3le׷ {4lϒXZݰ{p}Z{pprܞ]J'##6:bӪsZ\,ͯԹ@,t{CTkXPjT6i #Q j`LG:&eMR!yaS?/H~X+SN~]hsm. (r֐\7'sh0ͩvKs\Xp Cg~q{%Q,گQi Zݘ=WՀN b*J kTŖj"۟с 3{CF!ix!Iڤ[-Zsʋ䯫: 47&(ҋHcA$I Ui1j",ҕ7n`@4uk,Vdb\3! x0z"l}}X!|dKES745n)E t7ǻW7 -Mr Uz- 7Py-q|ӆ (MnuҢ`T߱fxwr\qdX)@3uW]yuVTސ3 Y@n']/!Ѫ`,BeHyJ 3ftEӂ-kk-+q'lH4ЅLZk3 v"^܉㹧"\hef:5x`Fp L6Sp7nu,9wpz=T T,~qd='«%Yϴ\p=fY)B")B2 0;w̶!z7DUe1A4D6iS 6ZP|QJi@(GY(hʭ5  h44(Ѷ q TViuĉI-@YP82G$QqP4g89G_wE1" 1=`' #bBѩFQbh\dN. XH A2H̨ymח~Q`F]:TFHv݊(r"Jp;@VA,&qv6"DP2gm ֐#TxfY> :!a:h DtzwLLlfnevYAڌřFDP(4"5y62e=N1 tAe)[ki,&NAMjˮ41# .8Ԑ t>9R|r),Yg[7*IPA cf2KӤU =aC|.;#hHL @Wv2gL]%϶5&{A๊DFi!;rj eF9}ZYrb@EXl7E|K@-rܝuq`9ykoWa1tm  B721E+mQBاHG堫p{]g(;)%&2z,-pNjx!|LذwNށc+ |ؔl3 "aTn MjA4D2 7 p15T.p e$ iPݢ*ɀhʟ-CM7}JD %%QG&h/Csot?0@6̅{_.hnsWUȠ >p)tDFwc6.zD I~Dzћ,Xh JwA;X,QLŏ@raa.!!)u&l2b!ȾJ$ !_eB&%䛚|F#Y~60jT}|H 4K#q`^%$COgAڙGqX:ooBOzbHB~8nJ$cQK=u,Z_H !2=^t;LvmUea#Z2Z,P%*9슇C{C6XDFM|@n==$$.RJ6{ZPQNzEԈX uqeJ 1y z0&<91tH,I%-h$J(і+Hi tkfq=1c#>!:ĂOȢƒX!\fP1mhEG{h+ cg2 $P!%˦JK7ʗvh7݁ p3~Wu#ep:dA7/!vE+8T%jVhz1| `$tAR ң=L^9(}l /c0CC5hh `kCٛ"i݊WsLRX*AO؇|h*Я-^ )Zd e}:ѐ鱾lzӒvbbVU 5ȍz%XNےh4J8"50=C!+2'BZ-2l&9 zEbԵg| eWby&:n<]ifHՎ5u#$ Z _۵.LJƐn|>I 93mGZAŤJ.9]eE!G ( I\;\Ԧ=p#!&K33ѿֹw76 8N1VE!TӃJZ' ?ŝ Ŗ%-@*ToL"> 5O!. D5=^ ﰔ6s=鞵%J 'I s$,ϖ*bb #E|x%)2 qڴZ(9pX#R9?NuBOAWrYO=)٩h dX sp|eAЫ @ĺϭp MQQUU\D|(EMz>0MnF1r [ОGv6#d0 @n܄Y&~Ȯ8 $m;P]R˺:hӊE_(]_ l;:8ߟT8B@!ȃ֢p F8]s/ 1\N&^;=,6s.G=<: j-)">^é8(`D#|^ t.x]ː3S w6}H_ycuog9qg/3y⟷q{nM?hi0FH8iÒgϗzfV|Q $Lɺ f pHYs~tIME 4ftEXtCommentCreated with GIMPWbKGDJIDATx}(YrA AIQ1!A%s$+a9gYX%. KX’AD~7xwWS===qgfgvO=vtx뜷O:eQsbccGQQ@ Dޚ3G0B&=w@ ytj!M=6l`ce;@ |ytj!MQw@ DȣS hvc@ 0B&ӄ@ H|ytj!M2@ H|ytj!MoҸ8@ "aѩtM[%B$fQ#D }Q0xF⌞zV$hG!&jH4Y!hFD!pplɓs,qFJ|VtoℹsCcǒhFގp8kUtVY!C̄oXuYܹY\SժwǏfϮ_G… p:_&fuɊ-ϵE^xٲsj4iFq쎣F*/)"˔auZf}V{[7~ӱ&>l+֩nϊ7<3w?:ɦ<OTh>rMr-f. x+H4Q#D(nSEuXw;xrl̾}N`xG,b6>M^r5k'T~لhsټyIⳓ1pQv w?1#ϊ/<sN;V #`Ѵxbwr%p"DD!T֨Z)QU"GjOIIymʲdjL>.* 5ӣh29O)-nH&ѢNtb87DP^=*#)DKKm0 'VuB gWRőh h:=o8'&j$N4p).z-]*>ZΆϵ<;ckg,Ca"^}DSZ݊64ù+U2{"~YwsvU] kCy\d(UeKsH4Myr_$9I4Q#DȐ6YPH'fn_}#r^w ,i7'߾& _DSZQ3DAQ}I` A¸e&*T*NLdSc'obٟ?؆?wW]a9 hj٭_%;s.9@稑h"d:Jǎ"J`9Bb5k\&c֘љW7D:1}޽ZbΝN,ri J4Dxa۶y^R #|&j$єYbŊ!.w4;;~/l٩I!nMC9!::D5MESm#/9PjtKsND&@'ueV-_%݊[hFD@ hrb5BJ&w-eH4Q#D P4HN {U4C߾}I4Q#D U4ITCrS~ۿٿ/?ؖs?W_a9#D&@ܢ)PW4ZH4QF@ H4A4$h"M'R$h"M%/8'&j$DSD&D~RSSC D5M@)D"?w )pNMH4M<|09I4Q#D $(EiС$hr͛7{h}8"y*p-t7DL%|up͸8"~(Kz!J8AȄ ~$ehd6›6mbӦMc]veo&{X%XY\DX9|~Ͱ'** :=o8o8uUC K,s. a\y26Hp&M0#G 8?q'ymq2i5X zbɷf~b3Za.^ ,??k|o,1{yKUCъs/gJZ|$XH4Q#1i!oNn=|Ww7ol~;$3_|ki6a4wLEEtco<ٍ{?K7sWﲳW؆}Y /#*M88Cs3:sUDYpܹsYnիW[rB@U} >Μ$D&Sz{~[?.ݸ`G/x!>x_Rcݝd?dogw*fq$s|6a,U;4~N$_co'^yw?1sE ĞLdO/Uqɓ'AXrZ+g0;J9##gK6mbC5q8a9H,M^S9O.u՟^{;QQ? lаm4i 'M2hAQȒUʬr,>Pr(!7q1jؖj0z~! !bpEG)uGwb*Kp"aÆ>;i1{@$]FtkPTPxGEE9 giFPco߹gSaFY'FgȀ:9/bI(A. Hwxqv!p+WI48Ć߇̑(Jx^J \9~_~\f<^EY=⹊6WW} xCGUЧ+[a ˙+[T$Q #ԵR\3vCQNq9Ð;x}aKVQcE@3 ;9;r"EsWPa tz2pͱSN\,orīiΰX*wuҔpliؼcp:O9rHEO ~7h䖟Ν;{sTp>Cvijݖa3S*}cHnNڝ\ZS\XB,>b)QD$Ehae0r\::p grD^qӈ1}gp|Ҩ UgwX{z;͛7~\^F퓧ЅPy:=1~ta{sN pQΓH08< M(|>-?"E4=]͹P9аc \_4,9~8D9LftSU$GOpr u.Ē^׫s&!D-5jhj-1_l9znı:e |q^ x$7u° ûjYHQ]<;p{VfMhFV7mۡS!C*E H~Xfoؾb:!IG!- |ibv4Q׆:K|~0[F֘,YkWH{{ju/  jɻpvJtJ `aT6mڲ z f&MOۑQo!ܟ}O‡[ShQDQO [pp+m6ԫoYIDr \d,ǐ?O@/Ԫ*^Uv|+T}'DZM :{|b}?/(Gnh#J.~6# c={B1<}(pH'[wˆnOq *#0 t~m$> !0:;9,;:/f&5hW T8x2rqelyR-A78<9t`+;]c 8][5kVr=Ɖ~~n#lVpl7;;3?iV[w "TDn '!:Knve;ugsy-e9:+T5Ñ#g|z \`tr n{őK%T BJDI^D k(DS "ƵhF ѤwNIb3ˆ)ɗoɩNK ||8;{'`qc:oVmP$̂@] 9E9l P"v툠h') ?pdȝhkH~ZenQI8prhNelGٶ}1MI!_- aQ?ycTRũZ=2bצ%+ ܖpASTB\^lF&_#Mpn1Jl?tݾ -㰊)B`|vvѱ¥07:X]B8=u G `wxҘ9owv1[2`&}aF0\Ƿ|M'w<Jho00ىϽӺjm~o-m~vO:\q9HN {՛vgx٣qh}a3#M(O8C0&a$2 ^=3t1fݻh"D-C4hG~-oH::,I|lʳ0Dofgc}8$[ ~`rzx#N3G pav:;-{,IOr~ؓ:?yMċڰ=B`rvf~nX JM8]\fl,]D}ؒ9~}?ku; +IjATuRFds3Cم\">|{>{Q4[z6m!:MԨ9^`jV"^E-vOTM 7GK58;p gjpO J7cugi!6pؘ͞ӧӛWSle .kI,?~S_dH:<%f\vӹٸ[6ì'Kܽ#gjժ,fyp7Ɛu9iV}faZTz K~ 4oc,:uyM$e:MOU0)bC]J*/vf) )`wÓQ՘k68yi 7jheExWoshpx()~ϱnn{%8˨d ᱿9*R"rD﹃&Ԯa!]Dd>oڵH|6k6Cj!L3eI潩e)vϤ)'D&jܺd1՝+n"o'^q-%4nm̵!v GE 4cc犰9agz^z&{ ."މ31ID PO?vn!!x95}!88pvv~a'͚-تM{Q{N59~ L6j"m~ʋU,0\YzP.D22P](KG)K|4D&j& e4}}wuTĽy9C+Mn<1&}Hox{o0f8$ &c=|%b6!iؾtZ"xGt!㉩@ p)vA ;:J.U|M>mhL6K1`v!"?N-yIq!573o()H%#rpTR !f:$H4QL rΝ[/i4o~Mwt*piC+z>=4. 4c _85Cn=Js~<2uX3Gt jn֬U[SŽ]\>}9p]Xv\hb]pdpxQpv?jQWr( gǷ'u!nVl^( I.92vb*rDDz&Ԫ]G[E|kN$ȅmL#:K,BY2&#(K\: ϑhDs.nѠWÊSgRK\?qxyz ehank!߀吁&00isQĐ7H]nY(Xȭ1Wϋv'rԢGs0xIE1<+%J (RG:< QWpc9IeN^d,_YeϞ-?OG4a].$#gމ&Wफ़|0*0lNHo.̂ #]ܳey,KD{p#O/R%hYD4X{vti,Vƌ"8 {e^w%C+0uc#Q13& #$ιXnٺ<'cΛ7ϱHgF}(‡|*9㕃c+>)sdwx0^ Wc߸k{ϟﳱwT#G1ʬQ?,WKٗj &ɰ΂IF)3-y&0ia/~ dw\JhEӚ5kOqaOeʲc\FGu\䃨sЊ|dy|!@nͬOxPn:PR%8OuEנ-cl۞oP+G$Ϟ$?8cq褁DY1RreGJYt9j>rDo<*&Kgir$1څ`U7x5 bT ѧR 3GNN-I4Qˌ 2 z_h*PGlnĥ;r 7`). 0ojLhy(ppѧ}g5Gx|mԨ_)R0i-[ nyD. .7Ua J\G T :bDsZ89[ْU[sO߾}$ ڵrʔQ?;eT>0/Ǡ?+6R+70d(cӨJtҘ/!0 @ .k"y]Kk0sp^Vw\^o=hM2hk֬YPs돍ߙ홺"uN_R@5WmwCx냓Ԇ TD#Vo=`0KÛb#gN*g˘;8U{Py‚>jc z<=Zj7&Q`Ox68=g%p1' +?̣C7m8*SYKW9br >]66"$,u iLGPOwi`)f0nyHUݬ\^/I4hEP-;[v^KѠIbXgk'pv{ 6Q !ož +e6X Woo0Wmao`Wo\~o1u%zsžZ 1A>axf;rz8r/qngɩB`Qf6bLCN!Kp뙒#g)\Xɞ$sD M6&4= ȟ~ \ DţLR,!ki^D&j*њ6m-7_ՠ]!Y7ǝ^TC,ƙ>7XTw[YA iȭP"[0j߰GCB2|Q2ehWyPUfN]n{Q<ˡ;O)ʳ}kj)ʔp9n!'!p&6y">˩G~P. -Q&a+F~$r2#G܋VZ<  t"IKG^mjӶ.0D{3.Ahr7q@=]׆-f/3,D/qy[&DZfM@ƍ`&ž}=yer$`eVxƫֈcؼ/}T{Cg@iZ ɓNN#g4Vn*dir6($:Ye:i,yS^ږ}Ǵ\&\(镣:uj@ Krif˓/qD=7R \]rH^GN&kxq+Yؘ SĽProù\;u~r͇֜¹$H4Q`$Ea6=bITQOnbD7i'g^C'/i |nK#w/|Ձ0d!4kq>Ӝ9ꦭh ja$&iӦ&/VD٭҈_MA. 0lY|4 Mddq, #G֫'n̋xݠ<2;Nj[zB1l6 .]?*?(W[~}3G98G6̌Q?s sw.}cSb!ݴ'+yo.p~s~t_kĈAL(P7DZ؋&#Έn |U|V EjϰWntU,kܴ0kˢxasوk) Y٧+xe.h 2C\|8N u:A+lᲵ.1/a!Igk\, DQ?,/bnB,q틉7 UMW|ńeJOZùRgۈ[ŊC&@ H4Q#є(ҍBAn]\ە[y0xmש HڐEQޘ1cDD3G.ׄYc8jC߰7uDFv&LT#OQ? @[69ٌ9 Xڣ ]\/ms]h|R<ٕ'ز b 4kŐYFl"$Ehkٲex%Jb={{W@EbKtn\0tC qk]4fxR)xU,X2}u4PG}frw\Ԏed:lm&$ 2Q K  q}Vl$lٲ-Z0&jB   ymis}6pvMgb ܸET Óau<֋/| æsօQbW#Yk+\ٳg`",'M.۝Ju!]5 aWHz;e81tW<7éQ70yJ5+MDMA_p/j\vg=ayaq 3糱S粡cn_ Ӛ_1o~dɒzC7NTsڃ \[#g䫯y)+O5 r'jQJt+ 5=YW3H D-Dj7^!p}ʝX &D3ӸGy:ժS6o4hD7%pM6L$h4^jp]rUcxcx \%!Ç{%/.\xtmJ,]eojUSU0H0hFɫ2zat+㥾!{&P_(PsCǤIxZD1 >]L rK7&j$|2`+V`M4IH΋ * VYϞ=Ӕ+p.,,z7l؉#g8fanMԨEh2WX=TF*r}p7^0ӧX""\UTa}NQ?uڄRHfɒEanMԨEh2gf 4pT0p܆ DXrftQ$ZlqN:fDQ'd(Q"Dk׊7u9߯Wׯ8n w`ժUbΝ;^{/_/^\nd͚U6_,FP" $d[_j7 &MH4!_K tMkԨx VP!MolY>a5$̰&qD,\̚5jՊ)RoThQֺukq,K$hHqBQ? H޽Xg˽# }L=D0g$h8NƂ@~"%MH4HI$Q#D MԨh"&jH4@&@ H4Q#D &j$@ DD@ $h"D MԨ^49{C< IIar/wɓrPq3Yg#XLd vkԈ}י#l(/YMV'Y9 ~yOYߨLѣ>cv;}9#wneKzVI4QHcBCG/fI)<8s'%LL ;PBVN'Tѯhݯ_(=U?¥!@x˅/*Bޟ4|2G;O`-zbx~8˕cz=3f>V~\'rp SQa?eVMJ45]D-˪>Y=rkRq-^5S&{V%D-È&PdG}n(1䛜Oa0v N`Ta͡M o2*f@þ/Fga۶׼H(|C?pM{73ȅCZdtξEYUD~ېSlTŵG8"cʱcyzM" %vD>TocHt7<!*&jJ4ҩ$yGl|:ƛdӵ©!yT}Z­!/D$%_"{MhshVo&k`hחiJoCqXG*)*?CUM2ho" pZ,~Q)ӬFj0l \F9ES08+ nS&kF%b4ɺ=xK'<ٕψpg(x)(hr%C//_W׋+W$99Kh{ֳJZMH p-[#slxb|p|i -obkG11h gR|jr,.V&"!jH%#r >"9Gz#M"jj2 hrwMnIh JZċ&a@}SB׻thNh˧ [Zp)X!V = rQFIs?(|DJ?fhфow9=iIDC[[$&!*&j-3𛧜i߃@|#Vk͚}]&Ov7)&FLi,m$ZJ`NzVEgvGɼ]/9 ϼ<j҄7'Qēxt~&7 7=Y%D-bEކ3nHNj}LEҩbIjj`?y4,M"#7)4Y>VIy1B@j%d^ -aV/#r >¡[D03KU"7'Qs ʪXݻJTxs~1]gpoNh^6D?gD +Q#DIpm"󫯜f3sKkHntX 5M0Ÿޢ)؜a_EFDF7#ě3"\04/g複HP*T5#r,>һ5_ӄ9/A*Y=oͲ$(n"<=E;!V9?xs a  e&!-*&jV4\E܅dBzs T3fXp|yݗڷ^.+)!QS1LPE ݭ! IS [/"ʤ32G#=Q . FAnT×۵04#J&@%"nrjA$@ -IM%!FZDzԝ;@ DȣS hR!@ 0B&w@ 0B&@ DȣSH@ i.IAG Bԩ$N4I@ H|ytj!M@ D*ȣͧkIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/files/000077500000000000000000000000001506652756400211245ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/files/style.css000066400000000000000000000023741506652756400230040ustar00rootroot00000000000000body { background-color: #fff3df; min-width: 476px; width: 95%; margin: auto; #margin-top: 0.5em; font-family: Arial, Helvetica; font-size: 1.2em; } a:link { font-weight: bold; } .wideline { width: 100%; } .navbar { position: sticky; #margin-top: 0.5em; background-color: #fff3df; top: 0; } .tab { margin-left: 2em; } .up { float: right; } .warn { color: #ff0000; font-weight: bold; } .image { float: right; width: 40%; padding-left: 15px; } .code { margin-left: 2em; font-family: courier; font-size: 0.9em; white-space:pre-wrap; } .right-half { float: right; width: 49.5%; padding-left: 15px; } .double { width: 49.5%; } .triple { width: 32%; } .small { float: right; width: 20%; padding-left: 15px; } .tiny { float: right; width: 12%; padding-left: 15px; } @media (max-width: 644px) { .image { float: left; width: 98%; padding-left: 5px; } .right-half { width: 98%; padding-right: 5px; } .double { width: 98%; padding-left: 5px; padding-right: 5px; } .triple { width: 98%; } .small { width: 50%; padding-top: 10px; } .tiny { width: 20%; } } yoshimi-2.3.5.1/doc/yoshimi_user_guide/files/yoshimi_user_guide_version000066400000000000000000000000071506652756400265050ustar00rootroot000000000000002.3.5.1yoshimi-2.3.5.1/doc/yoshimi_user_guide/filter/000077500000000000000000000000001506652756400213075ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/filter/filter.html000066400000000000000000000145771506652756400235000ustar00rootroot00000000000000 Yoshimi User Manual ~ Filters

    Filter Types

    Filter Window

    These controls are identical across all engines and also available in the DynFilter effect.

    • Category Filter category: Analog, Formant or State Variable (StateVar)
    • St. Filter stages (1 to 5)
    • Filter Type or Edit This depends on the selected filter category. For Analog and StateVar various filters can be selected. For Formant a window enabling you to graphically edit the formants is opened
    • C.freq/BS.pos Centre Frequency for Analog and StateVar. Base position of the vowel sequence for Formant
    • Q Q factor for the filter
    • V.Sns. Velocity sensing. How much the filter is influenced by (MIDI) velocity of the note
    • VF.Sns. Velocity sensing function i.e the curve it follows.
    • Gain Filter output gain
    • Freq.tr. Amount of frequency tracking for the filter. If this is positive (rightmost) higher note frequencies will shift the filter cutoff frequency higher. Default range is -100% to 98.4% unless the checkbox above ('- / +') is selected: in this case the range is 0% to 198.4%

    divider

    The Formant Filter

    Formant Window

    When the formant window is selected, the FilterType list is replaced by an Edit button, and clicking on this opens the window shown. These controls are additional to the others and adjust individual formants and the vowels they are contained in. Also, remember that the formant filter interacts with the filter envelope.

    There are six vowels each with 12 formants, although you can chose to use only 2 or 3 of these.

    For a deep understanding of formant filtering there is a highly detailed Wikipedia article Here.

    • Formants The number of active formants.
    • Fr.Sl (formant slowness) The rate at which one vowel morphs to the next.
    • Vw.Cl (vowel clearness) The amount of overlap when vowels transition.
    • Vowel no. The vowel being edited. If you are editing one that isn't in the current sequence it will have a redish background.
    • Formant The formant being edited.
    • Freq The frequency of the current formant. Uniquely this has no default value. From Yoshimi V2.3.0 there is a pseudo default.
    • Q The current formant's Q factor.
    • Amp The amplitude of the current formant.
    • Seq.Size (sequence size) The number of active vowels.
    • S.Pos. (sequence position) The order of the vowels.
    • Vowel The vowel number at the sequence position shown.
    • Stretch Changes the time and width of lower frequency formants relative to higher ones.
    • Neg.Input Inverts the input from the Envelope and/or LFO.
    • C.f. (centre frequency) The centre point of the complete filter.
    • Oct. (octaves) The pitch range of the complete filter.
    Note
    Although the sequence size sets the number of active vowels it doesn't determine which ones can be selected for any sequence position. If you have three vowels active (the default) you could have vowels 6, 3, 4 at positions 1, 2, 3 respectively.

    The Formant Graph

    You can control some of the parameters by placing the mouse pointer over the yellow lines representing each formant. While making changes, the respective controls will move accordingly.

    Holding down either left or right mouse buttons and moving the mouse sideways will change the formant's center frequency.

    Moving vertically while holding down the left button will change the amplitude. Alternatively holding down the right button changes the formant's Q factor.

    Anywhere on the graph, the scroll-wheel changes the octave range, and holding Shift at the same time changes the center frequency.

    If your mouse has extra buttons on the sides (many haven't) these can be used to switch between the formants instead of moving the mouse across to the next one.

    This is especially useful for controlling most of the formant features one-handed, quickly, while also playing on a keyboard.

    The Formant Pseudo Default

    When a formant filter is first created the frequency control for each of the individual formants will be set randomly. However, with Yoshimi versions V2.3.0 and later, this setting becomes a pseudo default and the knob pointer colour will behave accordingly.
    An extra wrinkle is that if this has been changed and the instrument is then saved, the saved copy will have the current value marked as the default, without affecting the running version.
    Also, keep in mind that a reset, or switching to a different filter type always clears all filter settings and the formant frequency controls will gain new random values.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/filter/images/000077500000000000000000000000001506652756400225545ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/filter/images/filter.png000066400000000000000000000612411506652756400245530ustar00rootroot00000000000000PNG  IHDRF iCCPICC profile(}=H@_SůEE2T' "iP! :\MGbYWWAqssRtZxp܏wwR`2hmƣ1Z^х>t329Is|׻0>V|",3Lxxj68YNVωGM #וqκ,̠l+MrF]ZvcǩgJo`rC =uCS`ɐMٕ4Lx?oJ@Z>Nu,e{frI pHYs~tIME  ntEXtCommentCreated with GIMPW`IDATx]G=M "-@p,*k "w_r\z͓}o7]տjMppp7?!-hڵo P|k~- עDDDDDDDnAnŗ;u-8""""""" lk-8@DDDDD.VPN^DDDDDDBz>DDDDDDDDDDDDDDDDDDDDDDnG6+dS@u* M߹MĨ_R9Œ5[~3fP[%7oŊQ2bRj.Bq"BqBq""Ef<$*'>ZPPEQ\%VU+֋! Z˛kO\hnʚ=; W4͚ɞ!""'"R5M e׫5lhO7o6Kd 96VDqAT|u@U^yS"0[▿W||͚$DDD^5ڷűfȐA|2[ΜkM*1Dq _+8YlxmOzk_U(nk-lW2f̈PPQZ_aUŞqt?v#CCٕX0cS mū7_ekEG)R9sKP}KP/TjVdkַ~Kgrʼn"-_Ȳd-S~ kbkEoׯb?wԮ5k[u%j4nl9Tkիy _Gq͸t (:Y8ScVBhhfsD'jئM=@V|L85H3~um_noaj'WW/-P\|mŞq}Ϟ}ӄDDnDLh%(C3ܞZ37Bq@N(N(^f^$֢ `E~Os/;Ӧoo晡ojԊNCVZ,.ٳgnE~WXY8PU+~ᓐC{0[=ծ]6 \K!pai٩S?D^kQ7,o)9&XU7B xΰ.XM3d s~)pj(p~HXлwo'TAqLۀgTx f,DNDmkw >DelC7d̔ 'l wi;v/0'O(Ps5(xÇcT>zh~HDL2[ !Cw9sL*U:;w$11Q?۷ٳ?oZ6/c~'[4Ng.ifsŇkŚ(nL8غ6QQQB}:v!ŧN*V 22z:'ׯ_?4{'OdŧlYh`M(NRY_ZY_+q[kBlYE}Vzv.W~./n ŭBqa7lh?`@w[gɓDuOs.<{ PN72ɤr2Έ7ݻnS%f*EEoZp5u~"V"ͼ ;^sBq"BqFUG#z/o?=_~VBq׬BֲUZbC>G XM6i*Ur ;C{qʻM \лͭs3yv{N/֓#[IxCtA4d%՛11TQBš oY^BV\Ǐ"U{c?diw޻w" lK";ww!b CP?OPO )Ϝov{f/6YkgQj h5Y}"ma'#>[5On\ТE2dSOuZwɤH `{s2͛9xj&O,0G[SRרh4X%)-XpsfN߹PPxrRݻAVid`6l*+h  = ŁDRJU< CϏ#A#'"l_qS/naZ.jB.U8BΛ7ρ(I^p@tF8 %..OCy-4M"ϏPPCHϜcI/=W 3fˑe ۴|Qu]p>%nB(ND((k$)kY>ﺹۼNS׻4?txbmqjnvP7ZE`jM;ۈS6o)Y˭[\5< ƭYqǎXKm_J(asΩSӧEUVnϑ# o\u۷/nb͏=bŊ#GvҥAJ*Rε$"n<x'w-Tʓ]XgFYubz=>y+ ٳk֬i\ׯL4( ߿]}xGoVT3_fOX9ĻṋHRы5wj֜}g`Q wcwűjK6}޿sh([a@82s-Ӷog{3XmZ1 Ep㙅oԨm7nȞ' lݬBqԓq@(\dӎM8@nG<o>d+3T tOQ>{ѢE*T04ij~H&g͍,4;4#kޯm(+V\d(67$0 wܚ4.ѥy/VFxiv{:}y7XX]__U컓ʻO[ƌau; ۖ\Ł0D.Pr`̮sȻW=7r$BD S!ܩBq ZR%CLWɘɞw}:Yǯ]^F xpjUvQ\[Aq[@l n?4Z~Bq|53>z {4k]4Ǖ^c*ʕ+]̚^4W?Jj .cb6Ю L~8H6Hq"_^r9ou3(`.9WZ/_>E>lR-i3_ /?bO`>|Is+nӎ"իNٛGaUTh;uۺc{SpN]"!-1EҕwԋҘ;/IUhhu;zGӠve *A]oK֗ƾVe}>v,/ol͖*'a<7|^f)2ݶ՘wvۊȮ Lhڎ6lȓGL;IJӱ?烈4wHme rÍxuP70-sĉCx2e.6RJ[X1ﰔ"UEûZa+6WZ%]U޳_y<,Vlɓ3T_e`⫯X~|\D&;´)Đθ@v#䉪ᧇ.ZĞU(ps~R˔q8ϝ;BCOblyKoREY2P=Tұ#1fJPwAĻ'nD$SMiC=m< eҦM P>lmȑ."mR1GS9!cfuyDGR3ijVMnL˕}xWNp8g\пkzgq%8e~zݏ;+Qn_jZFW*Ub 랚3gT G3WgFʔ)%/,4{BTl}ђ2AWqfw\S8IkĮdҹ|SlY3&llIYvm`޼ (8rAaCֽ_V1]` 6bU|aν9V2֪I?ۚ(),ֹ~mL>RJ>k*mu٣Jjʫ>{sǯ/Ny=o|oO|_Wmڜ:W(1@(޹2Y{y_1ۻ/?KJ?_\-c g:vǧ%ԼcS36GJ>{x0*oZ7Oo7[P=mGqI 0 Da$U@cث 3_~3N Q/ҞsUuo^3fϕ pF*Lu*a RF9`0_3-þрٳ͜jCrHvM[r(`y<2{lӐf{JO^Azju;L *4Yɻ7 S#;AƑ{nۅK`]&reZ Z۝jB 82-SUF1|5Q5ޒ yփg)߉^?zzUwJeH2H|D ~ySv[iK{O^̠r'q\w>Oy(c{ʫhi#b䱌x$ލ|T _3Ulf7ǫv8VKwC;Do֬n#^(־U ^lD%1I4G']=bdb "+\I"*srʫO_>xбSYE+<3TVq0|5]#jZTfw }!>!7%>zIVkuٲe 9.DO?b16u^$]w=Iݰ*xTtq{t{>B<{Oэ9ߟMW''"eZ[Z*M=a(^0@9na|@1V$/@ޣImٱ; 3OQH6ghWV$zN1L:M2nQbo߫Uy4hm#ẘ} dͼoܱ\|;uOFT')_V>ݹ]*ozI0|g# U64zC##.ͭU$MM.ĕq`ѵqrA"C}~Z@ 3V=I_*l+sRrJçwäfReip+N0}bCp AMQ$ses{o{Ԯ`Q=;xY< Y~tN4+/_zE:{A9P]Ve-yZޓ?XXX;y\^ y:b v8NFT'{TK^ګT KŽԬYSP]/G$K10I|g|\% Mjғ-MQ%+sBң8{HO1TgԪUˆy>HgrcNɱ`IHH`_tZ)sBb2xoAfT@ֆyC~FзĻe(U9 vʛ(Py/zBqG+V(O.., r%jO_ ͤCW-=R wCY Sft|v6E+R1Jixu\Z7n-*.2DTy^sQ#>rX~$FgZSf~&L`;rh>QxG.Go`>:yxwT^\8"G8*oإ➿W"&!?o19볠̲@smtƗa$h5>sSfṱ{ I ?HGm5,}U:ut$8I+f7oS|[>o}pN\0{(ˤ>6C:=2f_lFLhw+ciw]Qy8ߜ8y0xcTXȫKs2K&#n2h-=#Q@ nt[;KNQuZ-O2G'F%?8by ;JY9sgncgLaV$ަ]0EEΊ[TKȭu]0¾4qƇ"⒘2GJ S$f[xG}Ty Ӯpvt 멼_Nrއ07VRyzBqGhxtPK7i" y٫7oCwVyرUoT~oEwӮ'psz6mt")HR`Ht]TiIfPZƭXPLeRtREO`:e͈5 Fċ'(c,[dG&p&;zpu[]f<[3lڥIhVxht…,YaÆ~0ލez.1se8;w%xwo=T^DǺ{t{8,;JhlUxU#ۢViThl=JJflW9 >$OeÔ94*!$2>0$ҥK[GUbFWVeO(ar>a`mڈ@E4`<^ TZ|эhw2D%GE5mL)ulm 0Ö:{~އPȅ 8q* }iUJ% gKtSyzBqOFq(ɛ*2s)c LK:lZjϘq3eV3P$ TbADrؼ.L#$~#C'?3IvmJ+^Qa qݪ33ۋ]@޶]#.rLa[\ AQ2k7g]df]_[;RoI~JwXffK;w=޲U~CISRy*"\V彩 =q4$E I1;IRpIֽ~Ƴ" \^ԌXO>9rZz!r{?Y_|{ gɣk7 ^(͛7߼s -&bli"t#Z-0#^0ѣ 㧒/G  F%멼x*Q*s_N7TyhaIdilN۷Vj4Rd:olzq㒞J~eZ_9)0zI|noǎM 8/5SИ+!`G]o_6vK.FNVNTIuAZLc+p*-Z$Ɠ HnEEMG4s.S+!QJ,mw0e*oh];q΢w󮨼)~cU~YDy@➌-Z B^#ʕ+beZ;'Ձ,`%'x,^u6m SN^'w2_d:RP-[Z8JM'Ev{L\NU->c'ܼ ~6,LF4ynetĻ`{%!|YҹsgeՐ[?y6cnZT%ÙΪ&p~lJSqd8ʹ?gK݈&KuRh,gy$Μo&:EGk;wy~ oGωwS*sʯٰtŪ|*$4'dϑ#hipy 3F'ܺolfjLCp/_onl׵!!̏yuԭd%*diE')/[Fy(붬ZFݒ&҈%n@H,S3BNY`:ޑѼ~ǰ%OʋɁ*vWf\?3g7u='"JyFK3e@?z:.N3S=A4.)ooަol?tWlX:Nk4*BP4Sfc&;ȔQʫWLcD*ʇ31yX[ :vw:zNa[ +[eɔ{diyԹ3{:`Q_n#Z"ya휘7Uk k)3xEJkME Τ"#'̝;w9y“}ɢVciE#g@us;x k&|] 4_\ŕ+gkGfNR (?~v8Ky?vg|#MI9V&=wLпk&_!RyozBqOFqÆw)2ݾ.tы t7oDO=]]*\̔m/oC~QvrCU`©̾$c皶hmaG͕+TV=F§m1x̭{ #J}lkpĻⱏhmg#.UZ;ݑ_[D=WGfbNռ.=̻ UxoTkPܓQTRZq:GE'O޼qw22ɩhb7qbTZ;3g[ϢLZjkxTٗ06 LN̙˔X.]:Uۚo^cٲGds(lDc.L٢D+Jr_T3h(?~"O̵Gx?~!3݇2gbq1qޏ&=wEQ{{M{8mF7XmbDy 71\]3SC}W黲/u%6gNʌ}}?+Q^+rcYL1EEvt3DIUipfwn* y/2>}СSZw^+*_CVyzBqEq&3ff)͙NJXwk6b, t𛷃)dz&&Y&V3SS2-;Pi #AIH yfezUYfϜ;vdʔI͗M+^"<S8`48877d_oDө*i1+N:|:+C?Q`!SKm]Ļ|ƌO}^Λ7V(7e|}22p55c[TdJǠbnI.5CDeuW|9rrFSPؿ|Rny2F'D%G_ UU}T#Z* ,2m|+3ͷ6|`Ɋ8b巚ywO]OŰN彣⾾] ?~ʔ)M4A&ٳgɒ>y|#Q(m)Z>="^2ɮz{ES 'cӼJ`2H3Ӥ &02Cw8YFm3bݡCG4ƍ8[͹!B9aKAL"߈~30Ȧ e[e661asik#/|3~n\N\ԧ؅P&LD_ub0$}++257<3.!=zL?f>3[DRZs;) U3ٸMWB.G] 6 \Acd,N0hL=v^TO>7<2U `/9sk?Sx@{0z*/\3/Ry/zCu.\h}UD-ZTa(zػ9:a)med:RP䥐X;ZW>'*鳨̐-{k V3gʑ8 `P+Xp=߸r6lRN 9hg[J7?@E`M=ϊ Ɨߑ7o~3#fUSyS񞷠WuPٳglԨ8. <5*>>^|_6CCC]v ,=z$zv"""TJgCqJ*vKe5Zy&NY+W/EEρSggcS],) dLq&r(RG{f^+Wl\dРAkznnrJ\ 2~-sag`\6|IQĜ#6|[N^ @&*3_m;.=Ư1~yjl2YtUN-P]oPN;.ظ+! C\ 9"n^F~ѱp*ewUy}.[>^n2]x7.w/^8޽{-Zįc=ͯ/__Ct>(I0g-Vu,ZGQC3ERHe˾jV.g. >3#D@!͘Fojg*3hEYⲀYmr}lAo.J56>~ Wf0'/\)gȉԝ1 oHCBD LkԮkqTv0bN+ Ļ< NޥJH_Ν;gΜQNƕ˹sOnܸ/ɓ?EUGEEq:xTE~7sLw3⨏FyoV2bbޒ2s:0[5ʫ=IrsCq2-wo5Tf_eM[D,je>C;rZd)a'.u%6k6ep&ƴ}/N-_#Utdǎe&yQ+3xSy+D̴?]wv}zr\"##w!K dױ9%Z0WI?`2bJΠ߹tT!rgG)&_K7kƍb1! M~==c)b2EU0)[UFU 6mڔʃqĻ7}')Y*](UuwFͰ{+5j`ifϟ1brҤIq%IFSZ/^r63n93DGq^e94JE̘gTU2JdFAL6$ sU+s61Q8~~eްPA#̇ꡒˈw/T޳>Qdɒ6x\\~Mmի'VUV5YW-[p_\?) n߉Hk_ZTZM ڿ7fJ13"+E2rޣ)M{>3@~C`ĻN*]JF=j6qD]|wa|n2UgbWƝ=/ްa\5kN:{omP;6fJ,ň[f˵kшqSlD6pufΜJX1N{'݆pX[8˄qIB.'cx?l43/ӫWf\kڢ_ݺ7UeO7m#g.Zni7DyH{޽{f1& É?ǖ.% lkc͛7߇v6CSuZй= 4=S^?mC *bkQ*GsHh(q 0y0a+Y|gV]X^TQ'cƌ +Νx /nt'V'@F0wL~>y2N>!;| L2PàAF"n vzƲ㘻49d-\䒓'M=6|}]| (nɾ6ew ؂̉dҥ[`$ְ!S-[f͜ISma=,Xl5AT3V]{M0 ؁u32e3aZa8a3펋3,btTU+*N/YRvm~ܪbS?α*`lئWw[8[˻aȥF'Krs~x.+\sZ&d$)̒QN2~:>äV&bMٲŪ8Q3/oEmR>@m HF2|uLFBBغΙ5,tGJXxqRms9>4҅ $kt܎'*cmfmiG]1ѻpSKXGXèlԶ--k1VzzH3Ulb*XݨqWZwW,iWf.9wN*(n; 2`~PК.U}/I0vBL`pVڪUlJQb 98gs*mIn5aSv4L6mQ7Vqg4VNCn7ݸuh|d֜`h-,yR] 5kZ$a<ݍ0x% ۱9X)v58jI& m3 GBl930CULgc![{ZKNrK+g:Ѭ0\ߨQ'ư6vPj8[}v6ppAƿrD%k}1fl#YΖ(nͭ~sY$t0(VZbNEAq@cɫ`fk~ "̸PpIPM13^ ohSX|sQI)0V¹Bw N%6(BDR=e V5R-Jű'!Hl`N>}Næ]|Ѭ}X,n-SeU*ms83@Փvfs"c9ba{[= S]9rɄ Ъ "9HP,0Gj $tʆײ;+NOU>-XݨqD5 -TV0BZ(R%(n 9 {3G08[P²!n!p*SԲ2pdMpLUnJd%H ]lev";d|ۘJkqms8e~aB$.]SM02\Jy**0H0#CYfoeaQqwՙIB>3| p'+ԲѲժf>,[>y@؏veVGm!CþU;\pt-0v%yZ5*H3TНxbk=]/)ms8o'{0}XSmS'͇)G8v= ޼bQtE6juTy!w&F|0]ڶ =XNP%WnuԓQraU_a-%;|_ܥF'KPsgm 8Fa]l4m0CQ-k&#Gqkr 6mna֘Cvw?hBj ao<B< -[Ab?- c̞Xk6hݚYG6Xb9M]q,nÚ[e1uQxˆqfV(ca!3'< MQYgx=y"K1ԪGqQd26kآά/Uw!1Lc2ù)8/ ۢ^M_&B;Xb˦)i8JkL[6ݭQYscY:i]ئ2LEIn2v KK+9)j)c>yLe`[ QQFmOfxZN ޥ atgXM=uvfbBG}!R2 ;%/>})[n9ˀY#(ښ@^m3SvGi0D >ȁyGq#PJg[) 8d+TќR^y:\gVDTrQ;&n$P҄~s=lWCz>圳?6h- &C` kF,JdсԔLò'54 ,g(uɧ1_a  Qs8[)F= v4Yi yԵm1d '^ f$ho k Gd`:,?b*e;QM߂I&HR&~Zw1 O/dk㝻8h#pܙUwMz=6q֖(i$kqJ|!E_`N!i\k):+<3LbyK* Yݴq6֝Q\rOL B $4𳃩CxڍNf ޥ{!k3Z"|s\ 'IO`ìͩBDDDzLĒ;bRl&78:aaY6N.AdS'rS"5;)S(!2##ΜQGTD(2(ԀD(NDDDDDD(NDDDDDD(NDDDDDDD(NDDDDDDD(NDDDDDD(NDDDDDDD(NDDDDDD&(52ȃDDDDDDDnAnŁRR܂ ޾%""""""r p+(T""""""" @-Mkq""""""w]ZLBZg@KDDDDDDDO %)DDDDDDDO]֮e@pqRKIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/filter/images/formant.png000066400000000000000000000706101506652756400247340ustar00rootroot00000000000000PNG  IHDR"4iCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|NG?3w;33˹眫BP( zT*JRT5xdG?BRT*JZS6MxT*JRTk%}:*JRT*՚{G=YCRjڤA i|w>ʟ?_EԬد{MvzL ?Y^ޣsqb;g3׮RhWPyZ3|zܸ>3}ɥZ;RuT*DݱG;w#WPT\O!䟎QWs=.G^ڱ(?}ZH!WҖ;ŸZ;RuT*DݶK7/RTE.ʖqlD{3ֽ}R)#]p_O#7ܥC#QeMa¨@|/ך]~kو31{ Şl$*m^ Z_]|x!.**%^zdW.[zRzZ2x *ҾxxJzk' R΢ƳȖI]4([1 ^ZNG{-I`ݒ[48T87A&^`Rp5>ҁR+G;7-Q0 gªYur% *X@JKS5[z4N~_rUHVCӵS;4:?QY 9]:+ZFr|T~ ImD! s+-!Wjʈ] |2l> 4.o^nMAƈ {nv n'/*5s?jjulH-;H:i[={Z}3]٠٨0WkqHŁR}3hJWNJc֎zn5ZFc7o޼oйG% JJa$_ٚZMJ i ΍ v΀S'y:cWxԯ]Y|ڹu=ҩ}DWu؝U~ҁs%t8PMwȝ왦v!GZ޵Dzդ6cpibFb`P͝և)Qęq^5Ď+gTtUKMM﫵#]ZeK ?ry;hOJճ%菡Q;'kUkKWG~j)JEO%z_T X=(iդ3gm#'MD)P2ͫkiDv)Ul2Zʡ/hL,>KQ"T}pfvt%ôGWxp9˕<2&'5>Mv߲xk%͜GJfKnM5{<=kFʏUwzDG *7ټh,*+No÷MTj4jNTڡE]OPgkޭT0dhQ7f>u֮Ԫtd(Fu{@4ZKc' uM )/QvM46TqR;s=h{cR _֬s &Jz;71w֪;}i$[uTjץSܓxޣc$v Q)l!J*P%C~.M.:fp{Jٷ53O%CD{VRݡވJo8;y %sF'N"unxoj}'HqzӽWl=&cʈ.׎,;vy:5 c#<:tG6T߽K#@a-VPȐ[ a_qp٩yϟJ:.#G_l ļk\T*USMo yB+CvtmHr71H^eJ͟٧ݛJǮK* k-ٺhP[iȁZug'] \LZۙ34/ JfywU/1QLȽ ?]x[6kPVR}NN!*}_Cz~ZGyc] 0,^XllTüORUsI=;JRNugtX;\TӷWFr+V`J;trOk<];4:ZUˎ M[Xz6M}+}gU2ah*JIHk0Ԫ WX2T^bڕhy],>ҋ6oX]~'Т6 7dQa4+xB1qXb̓ULk U{mVLɢ |.z{T*Qu讉< {WRTz#ݠR4;'菷\>JRㇶC;LPTj#;$Wo[ܟJRuk_<oJ52m"Ao*JRT*՚:qhD}uj9nT*JRT5uܠL8-:uٳG|ԥK[nE9srҥ'L`9QƏKt*{(MΣsE͂ ıݩS'N,<<ȑ#jf*TF3)\g~9\EB#lcJ}R*lp}:*ǏcwR YvW.`E3f@Q*hUp 0b&\NEX4U`>}HIhZSLA!W3^~TJydRUTQ+߱c璆%ɒEqҗT`B(ޞI_B)T7ou(0~]_Q˄9(yBk^G1WF`0J`D iD%_([Cݶm<,[l(ٳ'v\qZ[_2ݚGMQBÍAX7l#Kڼys QY[BQHo\Yɰ ѽ{w@p@GRMLG¶ȐA (L5+ ݊˗h)D(LGo+xth$ KTIy{9ȑGɣ(_;£GQl`*÷hsهQP1ě'+P=?߈<*Pxܷo_ f¦+c˖-+%vũ{Ŷ£0Ù>R9z4Un -P\P_ uʣHH~*|P9ȑGɣ(_;_?rQy ΐfQ(,pbZ҆N)VQXa|U#Tx3vRWg[WWWW|0,*LtYW!H j@@Բ̣0b2QZ:O ԩJ`QU/p9pYuQ`)U}¡`[p< C&p HZr%Y`|J(~'r A΅nj9I^^^5L:a;YT2#PLNEyLDp>"ux'JZmK)e AhKJ/ϟqhY6$ϟ+Tt(<`gEPXm9ȑGɣ(_;v"^zGݻw#I5Ub "T" ;-jӦo/ΈꫯE!>a7Tvp'RUIDQ!%&}+GHMJKTm{zQ(y*y,潸=)iGM\K4aO)QT~fM((y*y IA-_Z̏$)( /yz3.ȳW%x,xݸM9WeQyԩ?zjQ}GfWl*oP!>>q5ޟ.4}چ? b}I)jo]zA֭[k.dA4v-ģ.Db_:5pg`myJEG^D_Cw=xS髏]{p3ĂhfOQ񨚌7|b:b?oP`oGy0ה~U{W7Uvo=Bx͇?x{9}Ts\` ŢyQyN 1]Gq%bIS¨p-ǺQ Q(U˗gȐ_jjyť_ >ByL?!8ebGP v\ǯ^7^23G1oF` ]]]m44'K.Zֶ(nkwz-,Y=z(ŋG90Gɣ|TɣQ&rQdnWy)5Hy+L|* L̆$ aβO^=|w xS̪G]y˓ihQ3R=<~!ϕ,%j"=c'o$OdA5)z2@aCŏ?jLg WD{*U3>GE^?P|yy xЌK?,}Y?1xOy$,zߟp+3տ=J(A51=!pmD'럆q|gggӟEWn>8{Ցyy *T(6 $7QPĹAa~Ap֔@i@O)/Ϛj$YdI:urʅHڵk{LL>j|XK+jX*6s΅wRT}&aqD*%D af2ƒ>%p;@Xa#}[/a\w[|Gs#^YG~'9r(OoK%GɣQ>Q(yxҥKA(*xwu۞CHyh' 9qKQc$pe[&IРq,]$OL})𧅽_?/Y{mٗɣQ(yJ1 # *̢< M>S,z:GɣQ(<y.+a%O޽;|:zTdk,*ZOjGɣQ(<yb[>pQFժUCBBȣQ(yQ(y488L28qB~&1ުUʕ NQaÆgɒI&]tA ݺuKi|~cǎ;y<ʁ,XرcǏ;k֬ 9Q=yt֭*}_ tN%r` GGɣã Qh: Ⱦ}wK.-\(UDΛ7dQI ;i$Q:pY~}]ݻw/b (yb]3+^ΣxN mz'G90Gɣ|TɣQGQݰ&}?j3YJ%GɣQ(_;£V[CDpBΝ+VGɣQ(y₄>0a 0[=1 ' (X@Xl=`i£w(yݻwkO$ |QSw0lٲb{/s((yk߆)7۷oڴ)Lh3k֬/_4#&@ ǁyV |5Y5(yxTyGɣQ.hdqH$)5L65YƚrK%GɣȣQsfNh*Zƚ~,|E%Ҹ%)QrQO8#wU2hTsc͕J"G3`'%Г,&R(9(y4̙TFTD,okh?q<"1CstuM%GɣQQKCZ"Sx4xЍM0ʊiJQ_OE孤PEV% #G7eK0(yB(.>j[JcGiLZߞm`BV&S&i5Ga55pK(y?^m\!.^8Aر#'8qBL>|8C (44TjPLʃ;S4_nGyf&L_ȣQ(y`ldS?j"J GwQi&(y Pamݺ}DqY`sQѩS*TQS`5xF<*8pG.XLr1bСCm܏?3gׁ$kFFm۶`^z ͛7/ȣQ(yI-xţfE=`n[^; )5/hѢ(YVєIYf!I>Gᢊ]P)͞ 3/_:{N'ԅj8Y]ٸ  X|Σ0KH_kϞ=i%GɣfQ'Q(5g`͋>&ۂmv4V5{|=&A # FMyQJy0f˖ @Y£ҥK K,L?sF_nV.s͚5[eͻw%mVjb؍5x8BuN u.] ؒq 4B^-M5S%|؀Ilx!]YH@Յ]y^K" 0͜9[rea4;,>d!Hۮ];(y5MQ(4ʣnbS$J%ڠ+?YRwm:9r_.fźY,*T OczxTWp'Z@;GaUEooof%C8I$Gaw4=ʱ,|IaO fA8=M;lذJ(6gMi LGi}Q%xT 5:5)$'!£vqQ(yVxdQ(yJ%GɣΓGG rQ(FGQ(y4ŭ鷆GGɣQ(Q>QXjըQ\\\*vQPp:;;hѢ~M4i߾POmG(yVs'NāFAPPP>}4l\|o^rYWlz%&zkSAM{$GɣQQ37GGɣfQPZ.]h$. +Pix-5ςC~)U@enn5k֬L$3_uUTVW:zj{2Z=_^a}* ]r ?Q5QɣQ(ynx, Dɣ|Tɣ|혋Gwټyn2F~/ Zb\y;vNޅ53E~_m(G#)‚%Ksr*xA2tW݌{@0=W_xq{lبТ̳|RsQ^nt m ɣQ(yxԌ$JJk,< &o`{lŪނϴ*>Z|]z\ÁC#[I7o ͷ.Ry?JL#R #H#í='\|Cz>ҫ` F {$GɣQQ=+*Řcz(U(yh=q+f!n{Dهo7}w{ph'%oew4e/)iӦJ襄 1?U3|O??ǿfpZqƆxv{D|~RcA2Ǣ=2͛7 pctN5eANVuzFܽ'ſmPQXFM8^Xp=XH1qKSģׯYflrYzuZ@M6 9b%J\X`qWo?>sG^R4k&xxg"ɫ = :c{u +&Ln>0HqÇ'c!ѫIӔ\ZW)¨E.] c'8 *V߻wo%`XU;u*UHGYFjvXСC3fGɣQ;LdP(<׎-(,Hz_Kj=QEa&ήqKO>:w\Mt6zbXSXd᱊J"PDx MixY>x۽L˴صORzzDGЛ_ѽLXX2@k)PŋgȐ~ţ`V͓'O]X:A&9rD5vz %Gɣvٝ0sf 8\tf-ƽ4hNɮF˪us,X/:Ḓ+].>}$>J*cލ1UkczJt֭[ 2eT2I)jN2e2ȣQtgv%Rȣ|hLHzYl9}Sb%GOYfFx3WHt D~Rcaynyr%+`E8`1N `x;l-p/yIjX@l}=xV-EkVj|Ogφ.XJ 'v1#vaLE%r!AX`z(y<׎yE&D ~ Ŝqw,Iwx*~ԅ'N_^yDh\]2X+!'g?ETh(\n#_le^C ǰ O^~RM4c`=^x_Xc*Z˳ ={Š&xbi:u ޟ3gʑ ѪU;v ۶m۰a!o(y( :<upiy'{ܰYڻOߛ5GyPpDD|ƌam۶-ŒG̓IIV3O[nBT PC'_O%Gmw`Hь( =ṕ*{\yD%$}&!gZ{,1ytaRȣ440ǠQ(_;Qg*кMw^\̣.$pfB(y~ATt?qf_hg0`v#Zy܎|UE0o>Ƿ{w.Z ?'$bY+{=0Ǹg''= V1B%D%G!:"%S>ʕB? IdG< pƽlPp!2w" t'J} rr+xlT@ӟO߁݉CydD}AoXKIͧOC䥻nGPX= ?\)ɋIHz#yή=ӟMG6@%. (Qr50$X&UyH%:T>3(wv={ƕ^'anbR< oiJa""3*իctT~#oT%MĊG3,N1{.P ,,îy ,f#Kn6t}$VRAN#fXI  a6lXW`,TbKK(9;BɣQ>Ѵƣ0) Ue-,x9Af{oR= ՠ@XCx GRb>a{C띴|o zM䙏88ea?}-,#/-CL)㗈?ucYޙkzMAPDZ`A'jG9YdQ(_;QQ1e_ե.{hxף_ÒK0 7)&CLj#LO :P[>ɩaBlRQ>O]`r?q2FD<t3{T9{\;ntqq=~<2G}.u0"H}o1󨋷?yg{۶(,۷T_ s)=opce{B"[*C,({4ޔq8gGx7oFT탥b\y;vUhI gIJd?}%܍ \?yaס 7n7І q{,>m9#PI~4mlŪ}$䊏._FhVR(9.`yB%ĕzHw[~.]9|F!Sб珜u1ᰉDj|-b@_F>dXyڣסqm(cU⺻Gs֞yE@bp$x3WH< 83Gv<:gΜm<]Z5777w%Jٓ'O+G m%KCxiӦ*Rʌ3r9-XZ>ʟI^ P(xFB`XkKޖ-[IG߼wX+ sw o?ESԅXUk[)Q?>uݻe˶~Gawj>>>nnذPToW*2m-]VRQ*lZRJ(Gi}<*Rk3/x{0YeZyz$"S@ҁё]}ݕ;OUG1/S/]o!<}QbfTSO]Kx!" ~` yTO(yB%:|Z L0"(ES .syUq@nyTLW^-4}zr2f̈ ?~R4OI $yTkp< Aހ/Z2~EH~C<|a11wJa X~=䟹@)]6^W&'" G͜ɦ̚xՒ5~Wm9 0AߠZe8`"&yԪ8ȑGɣ(_;ͣy4Ff%8Gm4GɣQ(y<ʁQvRʣUqH&M&M4ggBZjY5ǎqѵk:99͛Ws?~ʕ3gΜ={ Hy{{שS V.P@ک}TW͟*>Q Q(Uhٳg#Ӭ}z777C*xyyDFF&?j5ENjJD5+/[LT1cQ(9 Q(_;QQ`%*5ӦM_o.\PY`(qqq%kׯŋQLi}ԦDTeb*+O%Gɣ(_;VQ "~j<ڭ[7MEڵQXh]v$lJ 'ˣ;vG%r#G)QvRy>C [G ߶mjZ*L dTg}HQ(y3P;}tQMiǎS}$3ަȣQ(yƍO0 5 8۴i!G>(jjf۵(dܹ*UhDa:Q(yQuuԲx"YdΜ9SE[j͝`D!fFPDïKV NL2.DnJ G%Rȣ|G)i(fyTTxtܱ(E];g@kU`:`@w:uc_MWE G%Rȣ|G)iGvm$&5_/We˖DT>v(|F{bŊÇhȑ#(̜06ol%̘16mǏn ȣQ(9 Q(_;Q;Qp$> SjO|=6b0SGŋE }pH<`[+rP(yWz_mZ.ۚ\COdJ }SzּZ8}2U88Ɗ=r/ pHYs~tIME+>BtEXtCommentCreated with GIMPW IDATx|ECKBGj%"{4JW"(bC(`P"׏AWx_d8]vg6{s3ߝL؝EQyP!h/t5V(rڵkwPs1OL_tiӧOG#Xbł ɓXbŋۻtRT&M,Y :aPRwiCt2en0hkWwߩ^:h 5j99ot@r`IT9,z)q̙΀[ne˖DFFc`ذa;vdhӦb̝;7UV$:DEEOA|IIIxP099Y?m4y(""~袐)ջr !E;PR8ُv0BhϬ^zɣ3ԪU9Z4hWZ{EUAAd@@|Сn(Ktx7RG]|q ?? RΝ;w}_C~-xH$*T"HpB-d+VR̡tB)%:DC׮]-i3 2tgƍhђ_^f1vxROߨQ#H~3ghA{ChϞ="!ǎ+#ZB~D843,4>0c $ xQrD'Ew*RѣGEb֭e⫯LGJEh:{yYHOπ7A !.]:&&vY\9$A GF+lm۶-PF"IHH@hHǿe;C~' с":hCIbրgs TœF!"!j͛د_?$Ν;ٍ%!PFCP…e|~ $!~o ݂|Rсa 6hѢEsnGE$z(c- B :߈x tK|nt@ڵ`GQay~C^@4+W̙3gݺu.%+׌M uJ,@4,Y YPxڵk5jT*(WذakS!z>aaEtFrÿn,:@bǘÙ}^5x:tn6w3z-N$:PD&:dvm@6 O>$˔)cP4耗}N0Af-:`ͨ 矻k5KB> BX t0|_D"V2TŊ$;tPO_|M&JZqd6 nS^~3wM0IŽRRӺLǫG=:܌fhBkXG=zM{ .1/6`Dn ~Cw,,AS+?DDbnFІnYLYȣPcE0V];l1`!1+tRWWŅiNepԣ[СL$f5l 65_Byp%8t(GF~˓tAu;M8g\BKyO w~6^ h  )a˲wƐkA "C. ^r@t :<ٳU#8e7bŒ2^p"ޤ庡X_m4t"4324|p5}"0N˓2]jMT/8p{t!9)JL :!_֞cVD7^\9}lo*[)r]mOsś1FH& f@`Hх2{AUWo,5tnIt0}m ta/NLv=zoظ^Cƍ&Of+:Ct0S~PZIbh{!jM&"G MKBdmd f0b?zu:N=:xAXCr\؄\iQ,D:hVƬ MyӦMhM#F4Sm֐O1g},/JM48[֭1R\*+![F(HC~ &pj,,ˡ+LUP~J/dtN9\ .&3`Du=UF?%̸= cn,QQ/D`J2D?: R F:iH2âEY\OQ-CnS9hW3鍵pN4XzQ.5k3`E IIӈ5@pba ͫ=TBbbtgzpLIJExe =)NDY+[`&@(z\{L4=*D`JFP^vڊo [tScKnwRCO<fubz1?W,WaƻNDTZ5ETtYXk'{0vZIXu@<4`0S7qxx͛7GN٣o@61с":Fwf쏇M"G4с@4:?͕d֑":DEtzyU7сulqwͼM":DEt(Mt :PD":4сT ~(M!:(KS؈сBy/(":PDBt(@h@QD@D":Pс&:Pс4с-i'@;mk]̈́_2Phmg? j OӴMtvZ&tH=yr4Dh 60B۶HOiibiiZ5X2:._iia:_:4M4MK ЁQf4M4M/\Ftii@4M4сigvhi6rOMtiiсiDi&:hi&:4M4mt(Dž+h|&:䠨 'ą:L [r?.^_TtBSA!olZY8g|k׮?dhFs꿉Drс ):<ηa!aaaDA_;[fSt89y%GtEtс3kgEt.ތ<}'g":eс3kgEt0It=tс3kgEt09`^DάLc;": :e%kgDJ̫׮Mt"Ϙə^rN .t3'C~q7nѣ@DNDEɬٳg~yի̙3d]tʕ+N%Kʔ˗k֬e˖}h+EAzϞ-3.YEwhYZ""=xtX .]W_}=XtաM)E/СCG}}[.%%EjٲeJ6,ƶ:N]YF 8PUHDWe+WKJ9))H""g5D zO>-w!?C<6oѡD 7/ٻw!>+?uG޾u[n/2-`ǎeiEtHoއIU8 6":qDD7 \vL]vh2[3.]Z#Hp`a8.>D{ʣڶU(VL#2;fX8ĀUV :&悺{ݨ*} 5iWݲey_n=ﴬE5i„O&~~s֧ƩgTYz ڼg7VNmŠ޼OS!_`Z]y͐…?Odf?*sϛ4YCU+L?I>HW߼'Ddlˮ:mY֢w7Y|\Ǐ_z(d_\pCH%Ѧ͆'Oy.]zſ?cc/ha=Dݺaw1ڵW-,'OĆ0ݻ/Ʈ:#ZvTr TO>ԫO36E_rL9zDΑgEB~d=:91n̘xf3eW M^&u`|ގtٌ/.^|"բQo?r@nn, />iә+Wr`ڵؖnCcj ҥ̘q}- 33e d9S *,fvaAHrԩ[8R=oYbl3_^ǎs,.>[-}"VXR*Uɓ}U3H  )XO)h &8p[hS@e.\Xk Z N hlx^dI^:mt'vfɚP;0;RBiӦyJ*{WbE-7nJQo٥#Z?İaÆڵk3gի$JyԄBU֬Y3ﭲe*/MJ?wa=Lhݺ5x BMWe`K~'yR=Z,܄LQؖ%hZ"%"hZ˖-QHzzB8A'b# Zׯ'SMN*[@ݻu!m1!m_pڳdɢDϏ#ɼt¨̐!Chr&65CBB8\d0]=M>j("hM@vd0>_Ϙ1沧ɣ3gΌ֭sٓ{H}L !/nܸ˞&G-2o;{-F4>p6m0-irdҤI3d]%/L2$$"Lؖ%"hZ%"hytX(O<]:#qw^;/pB f/8dKh%b@@K\/c;X-B*kIKݝȷkyc@Y,#^iwwءѣ\]9!سgO8ؚ5knذ!\vej"=ѪU+ N&-UxKC۲|u^p=*Hf*д -]v=>]Y >|xeNz7KnLN^E[:u1!>mpGH89 vC'_m10X%i KL6@[rNeo;ZMhY[9RGu%_w^ˆb-OxcD~"Rca{&TyWelbenK][|LJ2+#P(ͩLԎ2hBØ1c\//h%_LOAΚ9Vm4cWo+ A"ST -LWX< (JJ,ۙːȓ0"b[%"h Z"HJ'g"ZDMpJH ҥKdAO"ZK pϞ=*^3˞V4H֢h%my\IJxŋi<lo&]huaɑ}}\IJn۲#-˛Xv[&b8oYvMLׄ:۷&d5o\Zvv, oD-aEĶ-AKDD-T9R~_M[' xx񌾈ޟhܿzVZuJGEDgM@X~`_$_O4oyED%h&-;?ޟhܿZy2Z@lK$Qh.R-HI)oLS1IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/main.png000066400000000000000000002524161506652756400227330ustar00rootroot00000000000000PNG  IHDRۤiCCPICC profile(}=H@_JU*vqPqU(BP+`r4iHR\ׂUg]\A]pRtZxp܏wwQandBV+C2$)u_<ܟc@[ qf6̦mp'OtAG+-~\tYa3'.VL8FQ5lU[J_+\9$ "PF6XH~?%r)*cUh]?*LOB q>ƀ.Ь;4O3pw0IzEm⺣){0dȦJ~B7倡[[{@Jx=ۿgr. pHYsP|tIME !2?L{tEXtCommentCreated with GIMPWbKGDRIDATx}Xi.DJ $(AAAD010EBCi83N?w{{nR6Euuթ@ D/(D"H$)d홭EO!H$DRy*?x D"H$㙔EݽcH$D"m,Wo"Hea93h/;ϵA-/ܲb$?AmҎ0@"cQKN);oц`>Z1]7'/dS}!x+'H)$9.6ؐckUzQOWT7h>s[\̓{?;HhɔExiKeQ5EQYaGQ+\-K p6HWW|8+Gӄ_o:{ˈEn3. rvpj\TCX{u u#lx`ʒ@WmXYoZڗ;{4X1ڱBoR+DzF"G-O[KY{P( gdH䉽kp>{7 OeE v)Hk3ÜZ8X7R]ȗ-[1d3r }Pyws ;C=I<7 zZZ/\m?DB^xikkw1ʌjݛB[gݹ+yRi.Y&(v'2mmm:}4D}<.TW˼/6E'--',/JYm'u>W"〷eROt;Gk%65=]liڪGDoY\Vq)O0+PI-u\?J_q\㾜ht.0Ч6i)$7eOP[ͮ8sD#Gv,?5v\'2:Kڐ~Osd ~p ~bxk4|߸@пqjt:j`W_K-Y,Xrz oG-Y¤|zOP[@"cbxozZ\m?DηnݙԒcE яsg WswSKOo.6xi< ?->} rl:A}tmE}=/%Z*# :ZR_YB-ٔO _ 29jYɳ?T՟$Fxt߈"9jC;S/VP(WBETC]؇X_?+%bz? ?ւzEԒ8~BP+ųDZNZ|wf$9om /?;p&FSlK.thE.-a+̹do=-eߍ2w= }.>u|`3zFR ߅b<E29jYDH$D"w݈ E٥IH$D"݈ {rGH$D"sדQ}g H$DR^GZNF!H$DRܲʇڷ/@"H$Z@ @Z(3@  %_""t!@@ -@ @ " @@ -@ @ " @@ bX,W PJ8ܛ۽ eUv[z;Ľ6^sZvx*)0ƞƯJwkSM&_o :_SIUhkhr#~(=rzlc`6oٚU\ )Cçi|O,B gu`Z}]-c,eD;t[]g= cflȃ2F^}Io D[ CUrd52cJ|TXN?z RJ"ȱb*Aخ5nޠ i-\J>HۼxT~^[C0,/_0 n3Tv29c[oVpvtք!x -iZ^hZL*e[j 5rMˉkc"ϲ3X Yt"tZiT tCJZ1"HzƩEUA劜u6SN޴p&^ t֟Yek]KN,v pNfGyk*2KPޫnkGk5Uꓧ{Tt{xRa }5E{Chi^Ɓu'YJ 厒Iyqnc)C9gUEqֆLB#8ˍ J^',Ź[j#-u7l^im̿2,CR^ko:o8CuYVJe׸UZh))A;'U|97˶DyMUg[9m=!$N8a2$e<\NV)i0R+z/$@ya\hh?z 4\*2c IJ;&fpr7`'ى=-屖!~γ-UEӃct;ϚBw jY#XnfеELrɼtu[m\+]r/Uמ&0!:n̵C);"ܾU`8jYgϙ=mjȾ![j3Us"TfY01~xj+7cr8۔S 5^nZ'm:Ƒֵrtta4[r3뤳j,dbK$9Mכ$w\_p|0=J&j1Pg]Ľ5 Y u#jpC""_u}w?;{CoOR;԰\U9E/Y[!h}:3(8xjGde\$$CAo"_iHF"=b$E #Rq~,p^;y}N~#" 2fheIeΊU9~hmp,g%au3j, ,I|*0 7f[͎l([ ;(ZέvU%;+yZWYvd^3'6ۅM6Us>G+g}{5[yY*!9H0gzFQ JJpɯ7 Ͼ_BPzȏ Uy #֏yq5 T$0Fl?Aڶɮ ;]m9HSos "_lj~Dvs8\An5aC t7tBrCÊm6(c.뼔l"\6ppXAψ,ϥAVgo^uWq3 wMˉ<7CRu{ro ~|%G/򰟦Ȫ,yj0eq4 g_·/}!a(z=GMƑEh/feuV&Y>i+6?=]m=w-,ɖs6l⊗[n4w*=HhE3֜ENl;ϯR,[$i=L\gW'jDťTTZ&mJ~rp30Izkqg pdJ2.>`{:FrIz|B!?:0-aG mҌ[-pi$:)#IjĿHɘ\" zȃn[ C-ua0tBRV9=0hFMx`D!Fk ˫n6rxG9{%XIz8܈wɁRp˸ );{ FxIx|EAAѰ t4,=g(t~%x܌\CxZ[0{-mEĭ+T/j.*nޠ1bLq:EG6撉Aق WJ8se\|[z%/$ C~4aZab&H)B \a(-ОVb_"pٳz8d9SA*{Wp[PϕEX'XF[Niϩ_P5`1!;4 `ە<Ӏ"Hv_o}9U( L(ŭ=*j{ G-[i_) D՘E%GDFqynM 4\8p =_׋YArE`"KB{#"ɜ3Ҷ ^&yݨ dGxaS]t"ϩp5ezvNǯs"vvAVwGR#d rNqp9[IOS??×%/$Eoɐs&Eß3Pbќ7mb`vSSa^F=9}g9bO[^ZY7> !wŋn<<\۽xw|zlE,)Y=Z=;Xh%mC|d}r0j٢cE^b?l&XS2k\kS-S' fEð= 8[ t=UIr^kn$>M}ȯ7ξBP9u<0,o9 T`^uisK+ֹ L:?a̅NE'0xMz*W+>lߏ ;ݭaReM#[խM<O;ZLP&_kdn]Rjc67MG`9o:ZJ3+hۯ[i '[:/J;Y?u޺tx[rt$el 5IoR"?DJΡZ(9Ę99WҐR'v!N)9j0b\ c"@-Rj">h" "PH1-ın@E@Es@ 8@Qƈ|""s%"E@""à-al[L}#.-h>(sOE0Wɝ PE@@YPL5"i8deG ‘@~Pݕ`5֜"t]\c"n W쯜T;d([A(Ͱ s-/ImW YŁjWE*- d TE@ ƛE(ݶNI(k"*d1&'ZEU=E0c[/';F<>|%L*8hd}e,p+݇р31V>Zg&ʓg/`;lEuib ?CFcMt W9#](QW eEqِRːg[aD\GZ1M(\)m'Pa4.CŗW- ebdi[MwZ2ǎ4/HyIe{r |lgh)Yƶ+s" .,PMnPTO nr*t4pU'XsK{yјEh8]i/$vTRװprt0֩$H`V^kkk`ZM".GƴK 9WG:Yi+l=3EkdG?w1<~ԐUDeoݞIqS|UQl'PNӴIl&[]dՒڶukbO%p|tVn\lnVdiOq ({G˩>)'j6׆Mhh>E8NYJYmPppιz޽`v^Ae2ClKKsE"xC9f@;3!^߯EWo$<}4 ^WR&XVnsǸ."XmyϟVu03,;[b@67!FTIz"VF:xRW$}k9bᡧmyy謙 D-%Iv{b+U%M@p]U~ ^U06f 6A0Dń{s(m^sgOBl- *j#4Ł2홛{g]$ ӶhC`hHRg:T6={kb94ўPad:w dGCGMj=gRς?+"! Υ5T8Nݞ#/fY.8s^'NOIy,YKٝŊ"-BG^ediL vQhn{4t(YYjPoAN3]"RV1M^q]85tUGDu$ ןgT&ͷ\|'M3nίLj=4qp;1N;ȯ膈}%,O<;Բ*~ a:;$.=|&AS'/Y8NW`NݘW:E`O",^w@^C~AgEAZ =[(ΌjȞBm;8uE:kbLNg1ϒm5,Bwݲ]+<&,CĔ3fH}ahmn9DE(sZV+8z) +g9j3-nO੓#ty0b[+b_ի2DR}]NkPM#M$smZZQ1M%"(JE(,P5A;Ew87a15tIyy ,g@M(sfgzvG ohfkB ⼨sEh'9!PF_ݰ_`;Ҧʐ$"" p9qkX0 j['Ep8vJMM]bE``  WXք'Ď9Pz1cA"ZKn-~\qrgOLHf-Z\m}NDD&0rRb#.jEԋ&`!v<^)&=O7 d3i]T!,7XEke]I1C<.΀j "Y(Ep2-kʚZPwEEH\a5\Ndos2,B]]]AAAttP÷=p!Kfyζg (}ށkxښf.C`D#gz=gWo J 8qݴeJ5X+<{Mrl~H00 |îHn|`vig9)*m}/ *,&;d$5 s4֊Ek )I#c#oP#ѕKl5A-cl`{DC˩ʪ2MK 4J[YZZ bܧ9/]:<8w޼Dہ6Ǻ3<,nì"c2uh˘}V+1VIڻohikAon%QOy9/45yTòq^!XM,B{J& ^gj?|[og,eDep*SǸ.f%ҮEH/~q8+suEf̡ZIv{)Z#*Qǚsw`"D[Q"]>?6o&̋[<}:uzkVy/${.yP"5EWP`5/Ա{Cvz@K|Gt4ShVZ={IEfi{u4^ø>o!<%i@6 `o,?Pz+V?"$U_r|.XTe "}eʍ^̌LX cp{n"gXNUgiE ľK Bf»LeU-K+]qK+-򱝮bZǬډ+"^L1)L45rh0|;@t-Me&A3뚶'Q!5@fA/fb4Mmf "HMWdB1mSߧcRk]Q"xb8czxJŏoHi헕-GXB )׿ ,Q;Jې|@4XeH|1^` 555<<5[կ|!9 +WWX34.>3tSZaADaVPVmQv`cWn:iX_LKa!;K'Ŷc௨zFL‚-„')JͷQd~)j҄dyAbQĠ}͛72F\uNzav_eة2F(ZJlr9ؾ Zg aZ ҺN%rBYb:f `t )2dmQnHM0T>FXgX@PgHaqXkLg7Yu8,h"H-1U`¾y(K>ܼl2J`` U-Z:m0~Zf۶z͋Wo?G+ ֗% aѬxh$va_*6wq ZH$"Eo(GDDP:4g՗bB\8ju[$7a[-'K`KëwY՗B$̊Lb7$+.<_0aEI EDBF:( RG|L3R}7>|tH؛?y!E{%ǺѰּ)ϼo&[$,pؾox"@{Hυ,F.(7H%Cnn ~kl^x$Ջ=a 2 l_lB*J8'"C磌R'-- YX'*xZ+MyGAw?:o?}oKo]?߼>5m.P..nUOa^R ,sE{|`Ou 2 -wkh@JXHx.n`" @÷L8ԙs}Kww>~ % . U_/?@81>=Ѱ@:q &T:EڻokCJءZ-HE\H"' A[7jzo×|W|uoH>O_ݧox#HPo~xe!-0,ӒK HHYc2oHOF$Rr"`{.btɇIVl j&u{SAJCOIx#a՚-9-w;'@(w? U|TYuy\Byybi]>}$ /,bjX>YY9$@=j!s#&s1r/"ҬH ^ <ݻ BKgom-!#;Z"M5||w?<2۞>HzXܧ_6 > ̻c`taya9,"C@3t9 O$Rr6-ݻ/OB<1!/; T3R?~WZjȅIR(PDh:?~ _˷_~C+emaQ$,[J2bVX`VGxYE@ ]%K|%Qd R1wt π:"BW=٩vo^}O7~曇O_g`e:M-,J# (GsX" ĄX&e6Yo%ADoZĤ"_?{ףv3)O|T_٫wϿsE~#}Փ/'&粋0,jaX d(aA@ "Qcl#ER~LP߹lU/"=;)]5?;ǯ}~g50,6a1P`IX> 9,hbZBJW v_HH,Т RMd R t{tQΐ7_^S*O}ظ_! <yXCT׷ SrTaA@ "[|#)AD@d.WCJ %x^?[U-Y[!H{X_n&] @n?O_Q,,7#-_  ZRho%mexVBHL)c2`^a|]| fKb~H$<%Ew}vO_R~}tB^$ ю3R /?QvHAxIJ Z!--&X%/^OVrT"]D*wm/ }^(].HxG"T{^ݟQH7|E KTPpwqݟ|"[ZT.WfiYH9k M9ö¢h젥B-d7ʛ=p#?~y==t n'\:B!䵏A;)~ůFy1n^?s΃ ~ feJ"DH+,`nwNH*"C E(~xCxfEpww',@?`- ~ɗ<^;/NVST.h !߃v)}t~~#( -.Wq}OS*x-ν}jt-_>TZa,=/aEaߙeH;TCxfEzIk R*ݏ}o_|iO0Nu/%yBR:?H 9-7?PIuj!M&I4O&"g rۜQZ螄)uh-Rov#"еPwXy BA淕\:H'0{nPA{w??Vˡ V8lJ@ =TN}kw"PAa}Z)uB`" GE]7Hk"z _w?}rJ EyTEl(B4''NWt?x/G" d^z.<-lRܨ+?h-¢*Ni Ӊ?aE,v%ʂXQef> bZs ~oᙠ]RZBl+rB!?&’{䐬K-Zr3Jk7ou. ߈ 0,рcdah@C".ߛ}aŊy6/B)|W_oyQBAEtme'o?R뼼:Tk[vRM۩&|yaau0,v0,h" h&EN#VJV2a݇O@|W߽x#f.Od:vTC'#XMgo AD!!*B!/*ȹ~|]Q'ZX"E@""LP | Fw4@o7潉ZVB!/0+;|_ :att}F`u}պiݻdZw4LE@0L枊a2':+?% @qkI 2M7Ğ%ϕIgjA X"M |Yڞq5,J?{_?+Ai9G Ӈv-UF?ʿI !oք-|=,!{_zR+k[WMv 1f&h >pOysgx;0 <阴~BۮBů`[`ȓEȻƐtHH+%PA0V,©~ LhBn'{aHp8TO6z rp!yOx*ۧ/SIuߝF@\ KuQ eP>? 5Hb|-:eqeu};jnnpwSa;::k˃'ZXƺEf-ˆ%A;}vl@h[Iǎќ?,JDTE>Y"t^YPҋaIEJ?^z!TJ`b%Lj|-  Ni!ld ^R7nڱ{me*0, 'ZXƬE X:|̙$p GC#h8lPPu %Va1U*߈I05׶cGZ](B'$>aٗzl1?{/{j HCy}KBx)} !rB Ja )H/@)pkMK""BYXaX w4bBeZUmwuaI4=طcLj4glJʈJ[tn̍ho\pGk'NٴOI"((0T Y&U$g^bEd2%boZWCaZLe= V,C Uپ!ŚIL.ts6MuapN<3a*Ӳ| 'Kv%m S~*~.o 5'ϘpGjG"X =]|-ohW%'GijCkiaJ#^S޾:>gTcaPZZJIeRHyI,,g{R q?_bB-Urq@yr,Xuo>|;'-iJ&=.PUvktPtLA2Гy&FzW3&CT"PWCjJWu} UꚌn>ژЌz5t8WΡYTY1O9%Ng s[#du^<,a:|"{ufZI )^L0OJ|}o ŋlB?&hGôg %^AÅ@C`e~};OEu Nd8;!aڹb{gJHf5Ik TSνw}z=rHo4zf2D6)!|I a˽gE鋵.,o߾.C1a1ztev4( ]:lDmzua댙JZp:<|vP~jBy~趔x;"i oFBTZΖKYr&fI\GPuߡoV$S#c",T,BS?-WlW P gmh0b0nPcx0L؈g2zK*ώ#޾pBJc4},R OZ?izx:ߓ  _Iz01VhfhP$P@?n|p-ν]:$_~Ddb^H?@Aa z p3+i@v}% 3)M &2|$2` @fh.ky?q(X'"ɍ5+mt;+.n5>{ ;@^#b RdyBgp,±eZ ֔5gs*iWh /j|E`2LW$ Zw/[Au*C2㬰aUEŤ}m%|Mi.Kl ZgH-B (iT"Hv}ZP;~k**`l]h渗Y%Zjx0g,)EAX/{;pDM6ީoL*yIzC@(O^}MdH7n߁ 3 ͛7u}@b._$,կ}XƃE1s/PIɂ#}*i* 觬' Nҟ@5 F ڞ$|uSQ$,F4d|!!G(#'*GE. tW2Â-rN.Ƭ@7x`'U!ొk[w ]L_+&`X"E@>,5+l`  j ?)@ͷ"H .u7\{TAܼlBpwXzGN]@Kغ3zeok`-Z;VY@MS"N-gb\噟a==I~B<9`XdhN|X)uB`" GE]7,G '`_F `GJXQef.kYrBq(>{":R'Z@U^&_+IU5'ٺ-NZvCwpO&%o}qoN3o>4{%B+`O3Z1A,kdkc9T-Ê%^Ow`fok&4'Z`:/%۰V"E@ bliJOqa*8"t/!X.MY)۱-@LT@\C6A,*ݳd27l[`wˤZrE3/&tBE0}_sJvp/oa)::n[QY=~NGe0}k =800>.N6VdOۧE4߼ha4',{TfMe%U}EYZ>@p" Z,@t9?ncVNfrAo7R%47`cIa kYrq5Kq@ " E u_Aэ"4oPR L b#2qb S ?*[tV+Nl#S-!z9]~#^C!e(7&`ɎŲOW!dYG!)]]4 E-JB`Q8{{[oEGe z!%smGoQHoSu , ,œYGs9TOH94 ވSiPϨF^قE8kd{nM_͑%EGegeځ{ ThAu4|PwG0B1Eepd2C] vH.,񧏐H9 >9 e;/ɍylWRVed-G.nK]ژg:DfEz*a!EGejr\q(1(rE UU)WF( -* B`jE"%P- 2bMԩw]q T%99[RL՜s_b'fرsϩZ.O | }ڴ)+f[ZOc"  =ɩ M.Sڶ3r2/u'=ns0B1EapdhiQV:!Cw:H9$)C e?Ն|GCyw4pomkR7zY c)~0x I,'**YwzDB0ȏ&0T>ziW,8h{t~E?S' #[G fHsEh2oc0Sj[ N,Z䨲2o-bY B`" GE|Shc"@{dah@C"`P)CHQj0e(ߔ!ZZ$Zр7ov grOE0WwΖ%ՎEfϕE霑ލV-Zb[oEߋe\x5뿨K>Yi,D_*g&^.Y}9_b0W"Eώe,`yy" c"4H_o j/6~οKó𳞕ksUO/tZYS3w`Q\_gfgwAzAł,bATػ{"`XR̗ӓb^ >3s~sMmSx:sEnWC)af,f[ يʺ6v}D"@2G}请l͔9T_ \.1͠9;~:!xCs^w{L)/X$;`kׁHJg~8//jg4^Yy/f]:*"P=g Fj:=̀T[=t)JA#yϴyMp1'6etNJGYżԵD[F DRCKMqڦ ?.:HLퟶn:3E]AՂl\D92V-=jׅR X0HiU k&H] N\e~]CmΙ|Y޳walm4z̙zP7"P. ^/LmHʑZv"@P"őDY[S~wx)bo&׆IN{/ V"U ~oZ=iY:D_t_AT{8m?2>X(6!Xih>;D@م+Y9skCd_ThZ ʰ~6]ب0;}:K rL#-)RyuɅSӲΊwl ӡ#1!a8r03]$Ftב׶sf"Bvo}A*v2o" c@Z:=|8nVo*@̻jw6"O%7c]Ϛ=$4jH?To{<+>S B%"\H3ZL;8,sFjEF$a04HdƬE(aLI_̔X6XMm?$H$ `Dхlǀ264N7tⶥk26 06*Ma@e]ʹ2iXbrLM6J$1Qҁ@И]G\Ѐ*,]US #7+r9& U;͉bz:7DXAǗ!B|k"BjWufs2׬6T"Fndif9EU%JB*y M&,W4/ho@;cUcq_mC!"\f]GN; "7i-3>t/:%k<,$bH7ñFDhƆ;pU+X37vߨgTu梊fV_uyl { rx*H-z{v B"šRzcb_W?z'U,Ҁ`qs#|%D[}cB?6(#'NSO1N| i].P{33Pa\qD3iҡ+VOG:z4,n ֆ?pLgv,8TⱠl9. {jU @Eȹ[$Tff L\AYd Bk@Oz#jj1luC5~?6XH/rxO?LYfU+r$l#o vXyn]"Q9.[H~]-1.eo( c"D'9N}B=Gx lI91A%VkR~XTK3ei S44@ |hC ]S^[-B6,Mb е*E-E}ybiJ[*(ӱcsvZCG溥tJ(yFِK?gZ;Q~mGm**Jx{ސv֎Lo>=V٣Aua*Hؾy2z4@@Li`64ԏ$rbI m YM{/H0.7$(5A]uو7=.ߐ= q(#@6aOYA)Lz^vڪ yhu2q 7q]ʱ[+N 5RX ^}%yvN`{SkmXB@FuqN<= D0o'=׳\M:"Dp".aBf@Zuu Hc72@Sj[ӳz."PyDؽ~aY(m@ B"vt1^ȿ+xؒ" 2N,L0Z"ME@FmD 9$"wF7}a0j2"D:J~={OM_X ܪ)ÖMA~߽x/,nUa˦ @Pd!{p" 0,eE [6eD"TA"t,I)2!l޲"~-2"DAfDPnOa-+" eز)ÎŇ&Sl5m9ǍM,] T8$A(,;/"po[U.Eɫ9E.8pAiCZܸ~ðBS̓q OYᢢC͸հ5gwmg*ZN~-{pa(s2򎙳pQҒ-';6aKNqPǫtYDXKMnEkB9Z [6e2Pt"e@XOld>()eIO j34jQa~]MTN?^,"Л?_XĬ/>>݉'.LQ] g2f"lt8C ӊc\ AHΔa …K;q %Yōތ9SPpPtٓO+U'Ɗbɔ^@PYʴG\ k)" J\;M-g!gGmzZ*s}[C)yX-qaG)e>zjbek{E:Q$puh+7̈k3 YS( ޘcO!ZOC}S," :<"߻8ȘC8Xr҆sYj}Nfe'U]R[,򑳫XիOĻp.1;kC^aņ{rT@oJKgĢl[~ˁ$X-Ћ692!"cgeL\.2ř4>eS A/ADhDD uلM"{(E'PLFl_o 3HRXA+$Q@q֪tT;xAqUD#2FY($+ hhxS2ِn &ef]K#B=&lɠ!v!X VY}ap#3Dtfn.e{uua!O30lMyQLDEB L&mbE0MQMoLDxT&j- Og. &iiD,@ B54x ݏcrHtuž=X[*"yѾiZEP.>2Z\}xtVAGKC%"P.q'cג&Car#BZ@ Br QEJü^B7n㖪u,׏LsPve~A~. GNↆzY Bwz,<8חLH.z#SP)Ld;N=RPf+Pcv`˘=E25!eqD ^A\VWxWGAN:g&I:OΫ8<)ܘ2Bl3gq9k2eKQ0`C#ޒ*%^ɹ%%ىY CNQD "H3sΪ\e bpK5x9 3'߽Z[aǠNT 8wtCQ R3s 5a"9ӥJw+i$D{=kEI)OK:B{f$U5-?dp: AD~mDtVT^P9瀘]#ϮC  j be(L.+y'Y&͓+uq褊h N^^4`ښ`r A!,e?lsISM]䣕q2 D(iwCjv87%PUu$Vɠ3FObqU |GV8t픀HAM&GySmK"bIEP@PKY}D_ jfS 劵"@P# ]}l 5"@P B~_@3wӯo.L#k\#?6^@wQ'+ i ~wt`D EbFHg=nOAfD|* Bv|]`%ى%7_n[lqwuTk]7O/W[=RMNt [@oZ~`QMꌀ( !r^|oBw_Pzo~`um7;"0qN~5oUù=T81,mp@KND0{k AJ ФZxz_53:T_C9K?j]9ksg9~JiI8Y)1}Ip,ѻ.4ğ叮$vWb(vH+?]8*[g]5WYSQ~O6=~v$y>֦ڪ RP3r, ==2H^B EW+~w5%IXf3Uir?*o|DsO?(B^N,YSQ^Y;jy޽Pߗ`Ŝ BGAs}Rwz^-O\uc.=|=L$&h7zKA5D ɒױrQMvS FiD cS~.YY#9U BaFBZϮL;(Ir&@piy݈Pۖ^Le bDAw gӔy7PvVs`N:* BAA6?xuW} )m+l!W?U'D_E02XPubc-)Y'Boq IBQ^7c nT~sw2?Y8o@{~`u{X;b <ו,|BUhX௦=i漅/LhR{ɇAiDiIʰA> N}4$vץ͉5yҤq#C{Z8 Jw"3C^="]gwR}T 9 8t%޼|.^:ś|F" B{A乢lZ%޼<1~ʄ1+hM7"hHbw6F/5"y%yɽr B:]'N&j̑^F!"D~p.Tg2rՁ˟~6} ETn f @WuQ8oy]˺hy/&x>*z ߖ_a ]+"@@6YX%2 % MO-L/ $hhD0*rNY +e1z7*oR.]` ]!B=ՙ,aS D0wp Jeǽi𢽹%\vJ(& +?#JD7]%+%rUicָ _;[]πʻ>%;R=mQc+@܊*JbqD0*e;[PK퍱X!I[P7"X̼ܭvV:57tR#CŇbߞ<+AKW&,߶*a,AD]"{&`f.W|{sE{KW_p*ցa9gLq_ӼOK}O>Q_Ktk 3dHntFDEནSfa벋)t/9ft,)0WeK[P)Á;Tl;R [ؔyK'Ə_|YP1h!]EGZ"B#} yΖjl2:L:P0v78,,,|>^&GKIߦGc+H~~,E8xwї`owsuxńφJ7&"3" B#{|aԮlMK.fj(pw" vd1R!ƪNYg,G|`JWPi8>3{ݯYS]Tɚ>#?X@Ox:%_4!̂>;=ŷ%uz }?'WuHP0\ )F\b5*G wf^Ol)hTDhgD"@@F8gn5(R4u ٴZ5<4-0ÐG Y_(\ʩ ) A٠U,=tOɏ5L F(s5\zW޽_׸|vyK>_ ".Y%#JpLB~R|>^˪m2p/ Ј25*FD6gKYs=R$8#̈́hS1Hs8bygDbq悞J"DWWW$BeգܮwފQ,f' jI:8=!̈$ 7ִMёxWEJv^Ur(:O%x((vqS J>O~x`n0"h΋?>7hK6 , o i*r=|S D R~`=E R#"DG_ekU%x+s]f3BxwBbJ] D({UgR N2m oo̱H짂ʇC)_ li{ tHY>6}ߑJܳikƈs들ΠB",?2p%#Q_rzEPc"Dʏ o4c/Ɵ_8Ƈʛ dZ[ 22`YOj劄fȚ} UlV*#ߞ:%Ka@utc vlΧ69"<97|oJ&3RvJ{('##1eLM?ݾ ÍbPD& $uǙb?k?|J-Y8sL_5UDzNqMAJ~ӷ"BU=EE{ZPZϖ45"~z9TuV1:3O`RfAzGڬ0ᤒG`QLNU(a9̙Z~87Ij Íbv BZZR5蛰QBCrq\VD()Q1dĶRA{j?FV/W RxwY˔+ޕE-ӣF~pXhF?  㻷lu4Xچ=j! KdEcG0 O'1CPF!<~(1 D^9 7IٳZTMDՅ#MY~B)FWND@X1v⡢FFgod/O$lR3-k*[.b7I1tRUDhA$t-jQ¢V® i0z遳P^r`HMK7žQG'KqJaB? 6RNВ@XѐV#ԢoŽ%m{w7PL1wA8=)K(J8lfz"͉tmPˊ @ɠ3FObqU |G vJh t@áԲ=8"sIE0@)+` D"ZD)h"@D"8"(uuz"@D"Dhu"` D"@;"gCY"@#XGdRL-="4(""QT6w34 .y©5(_`ũe R}?\nrwW uU.$x;Q* ڭu<REC `c㽾<߬n I7."JI V#/#jYՖ.f=4f*V90l]nIkBuטrW zI%ޓ:W\N:)gaN]@թe!x`2 )Arj &DQ9Hm!guU@VHi 2@AEIUٔj D֎+Vg"GϿ‹[7WeH_8|n Bţd䴫7On77yr#},ZVMz3l٥Șbd׺ DL+üv,fٵ~?ƌl8 {dXUL9ww#CM.E䄮m.BϬ7UU:9rK֞1.PYKI([YOy$M W?sIRUrM:OMڅ݃i*R\ ;ՙeBN$G&iKnִwN索CQ:*sHehsj\̺ 4Q 7+7Pfv^BK:x͙lq `D5U@ D BRB7:?(9܇5'1'XLJX|B\\zk\p3ycT'UJnᕷ#eHA0tnl-Ҟ ҭc%lIw6bq]Soʻx־cz;+p8 m:%KolGoA [AEѳϐ]UB =u%Eo9 2a3Y{GTL G*V5z֚E>zZ_κjZľǀɻN8zSWnjf 7{x`M<Npy;!!Eq4BF'9ZŔ"@@hhH;6>1dbo4<0!uje[GQmJ !㊒{P7^8]G7/<`ɓ{wub9neץOzfL%df;(0se&AbzUDRP12T2 WPSS`N4?"{N$,ugP06<ޓ#jZ5uuYN,s%B=&ܽ,4T>bJ "t rP(uҮ'ެ׺ RY}x!%| YB94fWpڕ)809]U2504*Sq̕kg^bJ47"%me!j]pR>$V_Em1vBR4v;4bXG'%tOT땝@ُjn<3D2ʚh&4wb왠 CV2xjX"6ьuZ`OSAy?UWgrwL" EPʆ6ݝLu(FSkR@jqn]4ڮe9 ڝg{'WzұC woftnc Y6v%nPawcG7sz:])|+xm,帇՛ ̟4 8I!'(%]rKrE鿑fG+!"uX&7VN5 b ѨstջԢ^0ƱĄ3ky+Z&8FW=}UrY N.[%ǘ--~]&Un+É7x`O ^jjX%e<&V],ͱ 7fU 7 D1G){. k+q%{筥K|\/+~d5`yE ?t)]^кn\x)~'LY̆J ❘~>n@nݮ7"H[g/Y R#͍k~|(o\Jc1g-\nLН<*i%Ƹc4`8!a=rR b%-oLmNEA(%sf`¤,BPWfCe0(^`M'OTSQP8{nD M5q ɡ#e=)35+>A-Y.CfEfW~ٞDvqNtyƓV.:/#ZeD#?M9N>{/egEn͓գACC=A(em?kR}@jIDX{0a]R32CdhgOko{\yDo\J:Rڒ Qͨ1-1^md8Aknh0{\: wrH;i]OfVat)b.{_AoX?z ԗQR}@jIDX܏ [`q֚suDGz~XB;hܺ9-uO]\bǯm 8ǜצc?$p "u7/'n;sfCS._]yU̫>8ҟh"4`o})7ˆ^K,9ԤY1}U 2x`wz(QM_e" WE3c=fC.XCw≚oA-"}XJ ,*o*Y[7E*]BܭpOA*i9v;vRPL53Mf˒>gW>"NW!IP\6 ?16pLGo7FZAr˯y ,R=R7г"YVSo!BeIfb5e:hx?+e񫲥Ax؆:O+*;nl#UTQfvnA劔laya]K7gy1fԒ71ckUóyl&=Jnn6le )€r )-H(6ҟ }K6GKdIN\LVtw76A*z 5<\!2ZHuϐa## L{FD(8>˝Hpٳẘ>5tz%7LXwps0T rl#{r"LqxNn: dEǂ:.,Z\e'͸=4IK^UͼkcO]D}3k#B:?jh9v5VRdW ahڷWU6ue;k}."B%lmc\Ql N:'6"H{Ӽā&*_G^CO3vM:/,HCP:q0H qR:͓ ?SNRgsYAI^Sf69AXq,ˆڨ0t҉:. ,ZU:}c?oe2=vuM7[!wߪa}{8Zi(Puv:uՁjQ$ڸj[r5L,]{ |ljݭ $VT17r:/l,"zDy~jҬ3&t7 GW* ?{A/ ԡA}ۀ̓k>D`/5jZ"bs;D{Ճ&RE@A@@A@"@"@"@0DD  D ` "@PD @)ww0 lKZ Dp`[)AZDaA֣GpS aߢ A~6n D]0 p BO0 0L!]@avfE2 }avf:7DZk`a B(0 p0 0a[ZBCC0 0An5a@a"`a!Zꗳ.sW_++{՗?ߜUW0 0!!F+{/QV70  r— JiDNNmk_ *ocĕ_Bc=ZGHWͷ|@:Dѱcx!,c@ ჻_܃"]?PrǶk3o#Ej+vzDhDv.p "lc>!xh@ԑVweK"4 w B9o}N:2!PEF_ЈPP1pm $ tL2m#XChh@ԑj"{D\qV+"Hr |ĭ j*'9*&/l7t+o֊t-$V:=DAN ZF/L aa=p|6\Vr B#8[{99I&Ux9{AoQ8^q:ENO}͓Iu>zLT)])kYC9վͥF$LI~@~gʪ\vYei/ߪ&n=L+6!5-or,"}본jSD |z(_G 6QP3qp02akqxi"TT$|40sEwQUdzvD#؎niqDaɐ˗/j\DhZD4aS%RYgL+F *}-ձ!,B}WDhi4V}9+z-iTl{H"O(krD XbRy ^@~ ˁMͧA;H`žLE6`?47r@rfU弻il()So=,]!G'jZ9z{v0RȀZ0t Fw^= j"2#B/O/߯PU;w7b΁cy@ ֎>g?" *^se-HF7iP=\;|앪&KfNZPzA8 DU[‚D߬Y#yacįyiQ'$:: µ ^5a_nMY%Tm9_ \lo9aZ̾([e RÞpD9= G¡u=m""2]L]"=mĪlpdDx= Hy)W, U SҭkhI,(*(Uc\g,Ui;ul>>"%b̼ˆZ(4zX m%H*3wųƅvӈz쳓.lϲjM_Sg,mYGO'8OHrBA+`gٷ ?Op9'ޚvp( R'd+Wn-̯卝Mg>Q&ˈ mEb1l7&`ílb.!C#u(A\?OP2`ڸq3ƍ43cp&z16?v#BGDhP;"x}FqBcW$ ›fGzz}ϿWNV$?+ ?#>˜ŋ~angY*fζ9a=ZP'4>&TPIeǼ\ᡂHbʆ;3c^  A#g#}{qM{*W: W]U C&$x4o=U|A祂7u-uh?s LWұ {VSݺ9 l?lY'*wxd %f"o܍j"ЇFpf 52 |u͟Eh"ZzL}{+=qIUݧc <"ȌC9>*w \}tv֣>h"f"Rk%n"%JF_\񷾆Fυu}SWPP:tRͩS#C5=(;+iqWMRlqDPIBd/l+!?c-&W$}!+џ0D*{p9kCk1n@KӌTW!k"( hH>$~z~ໟ_MY,owk!B"}Jp/J$[Q-H/Z[z|Zm!@d3wY™TzeIJϬS{fWY{4!9X "dDV6njZО%"'#tdE U-B!fvg0< eO>v"s>x,>U>\q E,(j=67RJ㮝BŇoPʂU'hO"|%{M"?ͯpn{=.Vx5sW˗j\"EZCz"GC[s*4s/8 vvŢ+Z="T[X.KrEɩf'dѠiѭ܂V~i^WRiĒݧg%mbߣOУAs@LUɳ-Gfv2wGڞW=6d"­/{ [ߥ~YWW0,LP"aqVߒn+D4 9jzxxX+ͧ|ql;a3ƍDǞ̓  6L〡hZwJKhf "GOٹe{4`)uocN3 mΎ7aI@q"-%t]q$L.~SD3Sa[h$'"0rfxDN~Бyt-4HԜLmȬ?<1PI8a  ֪}/RiL P>"XTc@P>sosKu{"NPwp)hA/ x&\*g,q\DhkC6-!XɔqA:k+s(S@Cd]q␞}>uPuE6[QȢ{G/X^X1n"-kֵw clt.k^ "_&p"ʕ5D}!UU?r C1Z+bke&IJAMyUq!ƚ*\ڻ}"Xp|K'2c>. ? BšoM f@̺UH^ۣ6ɠ54H9D&:4N72? N|@(2?u힋k="W9 t`?xAw(D{Ukuɠ!syhcZE$YR~$0v/`X'#.:?=*"gΓ26<[L D^D^mE "`sn/O oD"H @М>`5'"̸u%)W@gdۡ:=B@D="E," ֶ]D菴,B2"mZPD"ڰRF똈} n[gĮ@:76!Py XAA-(jڽO_V5.oCq"49֦$H Ȥ1tAmT DC +bt6RUԜ{,M !cp7 0 0aa a@an1Dd0 0 D"0 00 ð[KY 7/tR]j99Ҩ+u,os֤ K)[ys8 VC\iH2~G#c:ir\ym&D/"@njD (_:.b-O###hHa+AG8(J뤺)+ 46j3ukwm,Qnit#qracʲO;w8AD"\X}bFަH{4}2r/C:Gʴt 3Fuh%Y#8-^C`'#y^yJSՖ][^L,IU $By=o \c!D/#.ʘ(f4P8"P~#ҩiQb/b/D$:-W,E#̤ʨ1qi c:MʚQePm3J |bM/ bK*\W*+Kύ,2(O4/.#Z9P j8~1U+rO=0]Ĭ\",΍ڪQ01EGP+3HANN͝;HSʖ{:_ڢGC7yI +bJ]Xh豜= Xu¶Dju1.JJ:Cy['ϊJK%rG+dG(&XWO7SH1eNh*F ӰED"YKW40غ&&<%&&:V_N4"3>կLo]jRY )W%N*wQ|-{!@H ^њQD0oQZffC[݀JQC꫑6IaOfȢʔKģʖbgޢҭta^.jDGke2BƜ)y͛ƒMٴcR0%6`.w8s)ǜ(W!@Z%3ܹTAT}_wc[sI--zOY6: :g^2Pͭɘd6vuRB䡼'Z|6~ɼEޑ% :2b3f6gR~ݛ9HeWV.];F%NQ[q!{pW}8 RLeB{2emڹ15themT-],.88dT&M9l&Ⱥq|lB" ^mknggDADAHAHDADAHH!@A! @AAAHA!@ADAAAAHA!@ADAAAAHA!@ADDAAHHADDAAAAHA!@ADAAAAHA!@ADAAAAHA! @AA! @AAAHA!@ADAAAAHA!@ADAAAAHA!@ADDAAHHADDAAAAHA!@ADAAAAHA!@ADAAAAHA!`DADDAAHHADDAAAAHA!@ADAAAAHA!@ADAAK-zAG+.sAG*"N>MT0  X''h@. `#+@"$_\"N7.*%uQ  DH  q۷ E@"@ }ABE_HPtkAB^oKkzEQ,VIς ~DX# ~D}x%?ہ*i1H! jeӑ Y AHHt%, $$B- x:PS΃8HHZtJ$B[4Y|&j9! jeQ H$$P;r 82-.t؞3O  @HH-{ǶdI7E1غ&=WΫ|h`]^"|3 u3fS:񀧣1T"gɠ 3vlԂ?_33kϐcORA"Ƈ)+vukhcغ& ص=r䬗Ӟ-dàmsEMHmg`w\ƄQ~&GޱMA.+8Wi0̿:xJ)l5~a4`,uWO*~)vs6 0N_$a;B0V0PPMs:Sߪ5rH(C3MJɯ xwH6E,2tp{3h T`GUXKWw/FxP`(%zbQݒliiR=?<ׂð_]Yo}ߟ:cˬ2Дb9O8 ~<-swѿ~>A"L]hБe<6GArF`pMM9R#@"@"@"TD qj +Da!ۘrY\n}.? )rzc{60XNcjRF8> "u?zB@\6¡c %+(U Zw{(k?j Jδ3u\|PZx@i}<%K%« #{|̫"mt}r+9Sw F"P6"r̞).D]3#q+/  %!AH+ϨI dΦ~ Ji'\C}wca36~sP^K- iH Cz1a iS S͙9>l#Zh9 *(>coZ?}sjE 8yl1H bl=7H*ϏJ'ٙwrҀgf1hr@ġ7 NxRzxf`W{src^k$_۳:&p6je E/ˊqNb#;] 8L ;]>LnжroJvbǗ6ܡWϲȕV /nfc7¥ː5%(P{rѩ C[9YM#ʜIx@Ғ 㐵DáE yGs7e1m7$_t4 '*b+Sq){%QegId+4h(b҄h2'9S:K9zZ D8օ- c=ge⿬D`ZO~Fbߑt@cQE&+QP)ۥS Kׯf(YM@,|ZD:-,_N'E&NA"u#Z4ԺU&$%y$=Ɯ'!X L˾$ wkvϼ,=>{pLsF`6>f+3S%a5#Z\\ mxD뿣b5p.ёxb5u  %+C:i3u(eӷ>s(WLSQpjEų8`tIK-_t-S>ډWI^PE~jFRj`XlWD(p(O }:,;k JQ YSTHmr2 X.xP2=^AGG4I~bf0Գ?1J~ OK6K#޽akgH$_Q[d\a~͍TУE=4D^dXl?UR@Mq|WD'ό\??O20 wEl[ gh0 U. 3c@"hD(XLLW 7 IAL/1@~~J0NIA+;ÌKkbj)yI'nkΕS<'_jVvf8-bt3qc?B$Ցe\-9 nv,ZG^sٍ*%rjŴ:uUXr;VMŚ'gk I}C^l_^d[oɘ*ȋ%Z63Kp*oE^]Cܧ_}]Q-+sfсt\siLdѝ?aBk,zT+h$[ƾmH]&!,c5UK%BU.z敘o k̤ @-7:(=?uAp{ =fH?(fL &5DIgg)C")D1W`yjʋ2#BDxN"V4\;5I+$e7N"x@"h}Dh P,±l;jT&e4G;#AsZ9 ЊzNzo0)}ͯ>/B-m[O.(yiR+Itl\]AiagdcDCP ?}U{-\ǟ]6&B>- W SOTq|V yI 5]$D&^"O4Uhk2j|(e2lxxP'{CnoO;& CHv]Qc xnm0j$>H>EŸFKPppb6 iGek| %FﭕL]O׿] z?PkxZg.Ǣ}%sR/M(y+yns)jei\$o3ibnRlG/=i:C1hx~F $as8 F,:wX$\>ghj s|gѫ0oSn#&8Pncv,?nwب)Cxٹ}>T/䍠odf`CrƷ-mکoFELMwEjd (B9d$Yx,^ncVn\,zԪ: Q E _h̹I[{} ;qaKwn]ZfЅuu3h95vUt}$BI>GjOҝ]my)u N~I.mc(Fʐ{3q r ^2I_e$l#陗s7ADx)%ZL9 Lv@"hD]1lx+3¹CӝS)o4h!.<51lT-r!UGvtu67qlkheܻok\I £k' u9\FݣYgWvص>[4jƵ{3Wo)sMB[֫sS f KȺk Ηlz{2%'xF =xΎJm_e$ L!xN@eHQ悍]xl]F}F&Gf-ciٲ!bZZw ޝ1\AeМ\)pA"ԇWZ̃DrA"| j %Bm#$Bm x%cޗ ~[ DDD}O>U|3hX ! ^\_X E"'8ޛȶ-H X R0̆#͂Dr@€G>{G T@=& pX[! ,Vy+2!Dr=KUX%- $$" $$@" 3A UJzu?=$ JPc ~!@AxYH DH DʠBI6@APi+$@"c)Psc jc 3P!Tx0$B "''g3gΌ ޽{Ν;t@%'GYfmٲ aHHnAlٲPI'"p$[DD! iii111^^^Ϲwpqsnl 9j%yɓu`~ݰ@{BF͵^tg7,0_{zvrupxw@Z;o P3SLwl>"ts+:>˓Y&#*r5d7N6g d$V2۔ll|{Nl(*  b>>>ksr~Ҽ!;^d-2,ۯ]pmp72J`ӳ,-!膙=[٘s Тs1C"T>}'WGF?! 8|ĉ%&o+{3u +6Cy0i$.nVXќ-3U?l;o]2Zp5$ lJkp6"WN֩s5X@ $ s[.èez)<3цh3jج} #$Bga^ XQnUå/0((,lA y/Xh:ZܟHJ@XjE_=/m)c] ҳ6"~crrN޾|Z%bZtu $4ֺD<7my9o)I_d4I8XQ"ӐEQ^a}=l(ݨc2Z?یA[<|Dx_7k]37wDMP,N}CFuR sqJ:K#ƿx^-xx$|ȑsxٛi== Q H-`SfG,. -P~(Pud cXTD qTHlݨI*A>Z:("l"YkO(;1ӏdžXүfXZOfDXc6~Qx;BcEr!3w@+~g13 Ӵϒ%A>ǘ;N+9;\ (ʬ\ #ðK8Z kB셥922|l"Np:99 `y62u/&9 nNN|B).}T rEW]}pFD~rsGw^O_MRrlX_  i XL#G4ZX~#-VjP"%}vCS8fQ~&"]-B~rQ5R)z}U+؍m$ /zsc}Hj>W&`MRS MT?|CB(à?|eꃊIBp[&}:I2u3dZ)TNUAdO$^縃8}Lrzm[ Nڽ {wzK,w)<;? ĞQ ^{HHL6l%e\_ߥ!9Jr;O|Gۇy|Q*$n&--mR1P. HJ -@ox%d{ҷ -P%}ZI!ixV]KZ/k]RI ?Jpfѿ6--Y4l:_hbь|H!0LCVhP** vt`q\&?>.fp2 12WNe&#ī&96 uH2_w|kDSX"v_[]沤9 "w?|czt*'tPz.J*N{啛w-!H=׉'`~X5[@/RWX. ySD5t,B DƠ .K%jz>ЎrEee gS )=E{ Gf/zT*, E9X-G/v0# 4E"b}}ESk |9,QRV>CV_W8}U%f F ER1#]eL|qֻ&.9=#o>pɅ[OF #So оR(|H*yᝇ/JH#q|ɤ,a萡t=AyI:*rozޓw_(.~-szn<R ?!Kkr">S {v[M#5豹6ElEq%=VF"W ՀYDPXѠg₥hm`E zj.]D$Pp<Γ {b3g )M* p50wݥm)^q-oJ"YP$hcIot7u6ouJ^oSÒDP#J&(E88ǂE1 z #u/ž3: "9DDwhmt14_w3e\[4UZ,ɖ3[X?ͅpfi7I*frq 6NY[" m}FYxf?+u~W_NJue32{~HP._| P)@wW\nNuwEz,Ծc|U shec>8 딶L>lٲEKCϯӀ"Ð>0$Jꭄ"HҧWD&o<͇[_"G)Ng*v7ʝW9wK7CBG ,If!R.|zI~qX@6>Әz3hʰEܽB%vn]MoΟJFK5~ hYfO?@qViX(z#'g|G 9:Br7  Wk A<,=*E^6g~bIH>,ۯ -e,eэK)@NKATB5X@ $=P:nFDowG̽r m[{rBUHǷsdLs7| hQk"hhlb+m,O{szD_L4xzIq"Γ7{#;>}{[r KIK#((Zpʶ=JѣG걀d [ܲƥ|G[v12"Ϯ hD(SoeByyݔc3|Yw AA=uo&ɖt3/ IOœUarKs|Z4B\w9ĥגYDN.H];uz pdɂO=e!{2G0cl0PAV'WD 8\i|9R5x"U҆9~]g<{G8*? JΑE]޽i'x/?|-9(rAG ]-Sx1KpK׮JW.6[[a zѴSO^q @"֥: @KW-45Ww+ݯփ,?>vM5=~"U9WHw?W"K%9LQ7BRʿ@Yxh X-M[b:cH*HEzG32f~dsFT%,=[H{Ʒߓb?g7LI(9$ZeKg6?$~L>y=h ˎeϸ?-;xVP%cJJ ,ۯ PأnXªŒM\7'՞r_h%KI\X9HEI(d"sd6 3;a۾αwzW QCuT1dޣ _S$EщV\Wd=eYiHOJΑ&%C(r&'XIS39rzSc'Ĕaaanf,̶ @"PY,[Lh+8̞W[2+?Hj?!fady-)%3:tr^:˗/pjN_!&$ @"PYdeeyyyhn &S⥛ٓj_%C%Eݤu EщVRE%wTtUadD ,q3<@q%#<ٰn-`(UHD 0yd\`vvSW GE^/r1߿(eEO$ K`ɨ /s4HZLSLpo> @"PHKK+ll#׷wd3{z3_ . \ fd%)QŖdD<&sO/~<ўq뾴 tSYu X_#h$q϶=j Q =!KAH^+c萡ق j3 .䝿Az+Nʪɀ鹨??ɬI 3w̠=cv?*L:ה:u!劒FRɄK$U5K7o:vfɹGF%;[ґ[q&5\߈6%`+}i9Rϸe1PgIhX# W#E",bTlOzB*_vRgw# ¿:v/ݒuD̢`dDE&hI*KREf+xF[2x"ذa,ۯq 4Mjc-@=Vl3H};HbҤI\,{ӎT3Jӽcf9-8Ut,ӅRH|W111n_+,N2(V K"|>K[GGG Z>?p@-YH=׸蘽GNJ==tT[3ۚ:lX"L%wpb^doZmH:@" JG'onuPCϸbÎQ&zyuRsMd&u_"(]HOOP2yCJq]Jj’5& Wu{wp$Bݗ:Ժ\ A:h o}{ӗKX0$$,ۇ D)@a-K S$HK;m~pu.7id:ؑ_)ga^hVbXjAY`~@uKc[юtv/88хC i%I?^޷|AvlJ`tޟ t4@%BŖe"k)KVg$!j=,ۯ?@1YLfM=cYIQ2 :59yB%ʗ(HMcoњGiD2}ё#`fk̪?(ѻZnGĞ$E *Zi춞)lgrzI ,޷1L"7 ʖ(mfu֟DWd=:ݎdC SiȐ!Uk kjF"pc{3n҈iڌ^ډ -8,]a {άp-$q?s(:yWSv篍>QQ_TA4=K;~e};:v;%e˖`__Ν;oH%'Gq[r9Nοs ~ ԐD<7my9od2Ȃip|ZP?یA[<|Dx_7k]37w$JJɪW$wd3^룾}^L9/b/oLW܊ irm>JT|j8&l{v4Kۨon=_&:M^}gT_mE^8nko17O(% o<_>oMK{oc\ߦ?YtQ*(2Ahf+)2s bw.riIL}d-Q# >/hdaM=ҩ\~Y$] 8Н-y&1/ȝ(J9.R, |g|3t6g#([TePfY9LU3/87{} m,nu?WҐ,H9ݟLKK~~տ[H>LѩyVS"d72yI c^7CEBuAp2ޛGZO󁂌9]Z.*CTJ"m$M7% ΦD'}y0 2o5(u22⽳D@_h",u:|.]ߌ,I}m~4p£5G8?.~o"'>O$^mbl"q꓅ۻ/H>bϭ#~=%)k?Pz9&kqm[:~Ubk|)kKMm`R mqOhkmaPߢ|U)?}6+T"N]£EK34bbjDhh%ܖ/J|@>EJ_.љĚgdVv_'u3ӎJƐ&2+' dcfq ͭ pw1Hf^ݯSKkc=6gd#`ToތŲ9c 7TH"oWQgj1wj|D(,b<څô*tj%ŠS0jWA +VHy?R.g`[KGdkRXI0>vVTƚ!}*Vo7/5ܮA^1D'QW 3~Ml! #mHc񧵏*|rn6Tm$_ם3m27p]Q*Ӊ=)k!e/XEdy:>6}Ks@;`\vܞsJS*Dq@]r|Xp>ΓN2u;Gxr |ߢnah:X&PIސ p~K/v4U {j0',倵y gyR.{s8_8v3(m732( ;=f d;#_@"pΗu'#|XS_AޒOVi8,EWJ(ow_ɎQ_;| y]ުoiyֿ A=b74坣CyV k)RMtE%:v_[%Y`JVU /d26ar[jЀK& Z Kڟ$P05OUqjl'+C.g{r-S75g3„x+ŲpW㐖"_5aR^3sق~,#UcJa(#˰C%hâtEU#+־.gn> &Y*V>Ahe?[qq4tE#7up'k#.kаw]ŧt/ !<^Lˁ7;e)΍ \FL tmlY#[ÿ b꺤EIw)A uP"R埌V3,6_<O}i,~U[YVByE-Z,K]sy>L߯)^r#]YCcLwKsEkw7gdnDn2˸mUE N˚A\tQdbPt[Vne;7-*Ú˴/pGc89r[YŅafec%2aG1t]&J]z]N5=:2G;ȔjQ~*l"Ќb6ro8&UXҚkmwhґP%!w+âQ=]ǀc&M:.ī1].ȩ48ADPw>IǺQlK 3fNкAfvKC] c'QSfLbNTILGGK.aQcFq$f@xCD8#!s4 ~b@YF_}̜B""Y;x4/DÇ['I0O+9\Өq)?sUIΒ/{ sn3LOQ?8Jl].^ч^!;Gd݁{sR=i%>HF;^G_uBŃ)Kj7d2Xs SYsd}o&,_KZr'a?9}d4x'EނqN[D^.(v4Ui-Bg7TOj)"Nю2aOl*<6|3 cy-XFvnE/M9-Ŗqq$#g/8ʖr֪U899SDxǟhP8l= MYg˥VD~=';G>{"׌i"W6/\W *$|C~2+{2@"hdh`7" Qmu)n_N$*`Ih O=eUߥ#'U6 @w _fDn؉?6N#SdMӖkU1g~nosG8EK3S,80q]Xnӟ]~RF]/PFpi|q&BŨX 8KB+^1kə2oGC[Uwp`2 ?\jlz]fȕÉttӠ"ok|D[ob7,we]\1 Y2 ,y =GKʸTG>=MէɜM~+ -ء+ĮSŤd#:qH[ rj2 NP!=kX0x޳O XU"|4d';eSXT,Lʇю,2Ivd8'TϹo]Uf.878t 9W~ڙ {7?(ޏJ'c@4z%Q65WNeЉMg ]L3&o~8M|>q jo׮"ّvF痭q,,v4UV+峗58.1̹9*V'~K,Kb:ZQ8QFYfh.0Qc^aщ5Z`݅YʙEPcJhhhQR⥫w-ΔǤB 6fK>Ae-B矎CKǨP0BZv!A$m\9mY,I䖳Lnb9G9$vI5*jȿ|l]!8f4\#\Ә;Aʴ۔ p59uƒn9G6-<Ӌ˰X.n#DsA^%TG̘@TMhsQf^kšR ׀fM0*oG;c;r-gXlK{ =q!d2o3fk&WȌ}cC"'N5%i+T{e-03V;/V0aWI^eҁiAX"N&$ 2\G͞`f`˪) ){Ht\1m,D_Ci& 26nڸ,'\H~N5/xL̔ _9Z885VJ"T9D^%"@pzYD,V$O;ԧhm+O ʊ9=s\&ui̭׈ j.^Fx֣>,2i3,q_&WHFWLt2汄rp;vqjN(eeʲC"9k3zTJlK#C[׬igAO}MF~u&F2ͽf,ux&rjHгh}CI*Z'K"T9DDG91aq P t]J{G'PE*RS.@!״oظt4b0&GB P R jiM9Hq݇-JͅY DH DH jo߂7Z2k⻮K@"@"hDtkV6Ԫo  ]",xD HHm䃵V}#B"D7$$oHH9 Xd LM[ut6ms0~HeL)ʸ':Ĝ)۽oˋגj2P|L]?𥰴BZ_"njaEϺu[g Ӝ_"@a4@"TDСx>s)3l5jz)DHJ!LÈ$UN>|f%]Qv64"d_Zhg`>t,H.XvV͸WT26S A'lڤ6L)*D{)D,Gx:62粹f6:Kڗ%"LuY,.aS1*da8;6mccq輨Сlvb!Nr5sP6i຿prL#5zzI) R| ) x9v>ܮ]G.x]{K\P]}[:EjyVfN6|j[q> WGAR[Ձ؎SH蕆q)M?N^PWj!B~ pmV&aB(n25&.iv~QWLE~YmP\g~o, cuCm)QcK/^> ̨5LDh<d zTt@ V9@g"$/}lCzY9NA!!Av"QNZ?ҘЅwb!BKHp,JuBkW;B[? C&+^X! *e*5|r~l_ ]|Z@Zˮլj ?v c%ƨ7%N`i$ՕQA> B$nl]BoBD;GQEemI?Ɣ2"t~.(TDAaZ"YC-DuChvk" 3W[ $AdlE~&O.A;E hDqe<}u k1\%V ps!s 4P쫫C 8"|N.^kEm[n+áY '-8YGPmL#0!SDqu7$ {d5^RQa "t "P}YMDfnh@r==Vj"s&,p. B# ҈@Ӥ%7n@4OQpFl !}SDToq4@:EmѰ#x'ZGn G0;Aꛙ6ac:>9$98u1)%]w;EGN-KkZ@2hψp9"k/JJsXR9?ž" 4~6I]ICOٱMn@wկ iO'k_q~@A t7MdÂ:T'Nm`Dh:sB: `aQm 4t|.(T_NW\_$Th) 6S%آzQlAٲق-禍R9"ԧ8/]JMDP+nuBNՋR`X&`2"4'fl7hSDW֭s"!]qqV{u=]k/^OsAD@""E]􈈠F p]Ҷ#U?mmۗM.9rM+j]9Fejw]E;G0xĝ\W+Y&=fo#ۭ,9Q{b矾YHxi|r DӦ$A0:u&=|ㄬ6]t0ZI]|pr " 'NJn"Z:s+RK's3[: k8\h޾Ah8ͱk`X_35ep#Jr(ߜN}<"R:~.c=bwqWj.p:DkQS'ٍă#5 0{Cp=m.>JF"hÃ{x&c\|U6Nxj炈BMD}gfJg2iƜsOt6Օ,]zfD.x 74$E닷 OXQVa愉~.Qp9QK.թЕ?>k.%N@_E НT@r筜agoKSGV?jn̰ DM)99JCzƦ-\͠};곈 %E͙0ˆ˦V#'[yNvK(/(@Af "Y#"P_]v+n " 8VZml(*\wQiR9z =/D ?jLXX޾1z@=/D #zFʓKvKiYx6߂JW/>4n(DD XD>"o؋O[CaZ㝭x,t`ne~3cMtZI[4gf?v̋L®ޣ,y0*lbhe|wa͡`+JV.MWK}D߰H7aO֣F&>wǟ`;gYtNJ6 d f-ڪL`ϺO?BkAng.^kJ D|Mؙ;1jNdZ>؄{ғc{H.j_PwtPX;a( Fj5VsފaAPb\YbF/>}j$lC;F ZͺWrI B԰g$bXi[T]ki,e70׏-&[+P( !jTcBwXVG:OrtCډ#[. kBP}a Āu?QdFqtt`jF"B},1  jBP}J1UFOhT_>WX!pAk !hsaظ" "P("B_@[&фCnqJ؇'Zt]cZًI勛&n" B!"twx!P`PXW'K]cJP( , ڵu]/: e^H&AW=D} !"cܳwώZWR"f71*7H)F 4˼125@ B DhVa$te0΃4eL%pSv50^U/^.SF0BzdX$'~.6f 84)ڢfϼ酵¾1aj?F". UZZ*q"ME!"PE2U҈՛*+z( "Иƈ. RB\  sDhOOtbˍ?3@ks/4n(DDDNL\Po0@="t']Ϟ=;A,˜9s 1Ac}жv*UDw~L+P+D݉~iѸN2edH/>b0"nZ勂t  1 &-oDfK+ҥK+Vuyyy/bT"+g.ђжL#$"ܻ'i8C=pYZ:OI~EKO8qsP[ "B_4n޲euCqȋ c`"4& |Sew֤MVbn"HH!;[#m7Or6噏_uo0:IMD~{W $}֪a=G rb=HKw_:\ ҴoԶԝs*BeL PK3vyooo6=$də>o?Sayc8aqHeZ^X\>D_Ra#1MLJZMᦼ#kgX8,]c{|WbM"TE{], 9,:OZz#㹇[QCXu*a$G3:óp_YܤԶqIZD^?wGo᥿5+ǰ 1TgF&-M؜d)<њbGR3o~y">p ͪ19ae0y~ؚukBtl*8a&wX3-Ɯu***oєΙSYsHojUM`G -HX^>{c\%aIpZ};C7*ؙ܌U^Ƥ{\w=?햟lRɾ$im`w0{<ύP{#M _ˠ윋O ks(#a1 !-9]VZʶ~ S[ޒ$ͣ*"t jjO_b&}ִe wvwv Ɔ>p$π6]& 4 BsYF-\j?g7isA&eREc +Aa5~[e0 d)lޞWI[o~=z;~0|ݏ}քDJU c"k r^{ܻZ֠Y{w=bٶ_HXi vZs^iS<$q A,ǰSm=Bh7=SdBZO4}Ieކ|E_W6v~^C W|C?9!(>CrD\ t'ezt{)Nf9DV0 Km؄l+eq=3Au'7М$wA4FQg;Epz|ϡFk(Hz_l~2g|?qRn/~p=o~}'_|{豎ܺuVX0V!BK c1P (tjhQhs_}l9śj៍AS6^hFjvq ňМjMq}S5Jvo=*HѶcl3΂=Auwrb"́5}lʔg)fe@E\&CAC(i;f˷x kԙvinvS\҉VlB*&ݎr)94"cٹˊʘ W,kq2ۉ=^^y>+፷Dw|O?ɳ>Y:N{+))i=Xap_CƬf]ܰaق@Yg|rP35SD.]r,"ԥIӅ/Kn k8E^*DJea/A:]FrL6AI9 L6i蓜|BL^x1Qr๭UǙXBiR3ާU!LAІIޟWV/Gba~~<& 40"Cѯ.@0|P Dࣛۢ?_8/xp~/}Ïm,  EDhi:bI[[VKrD.ZCDWN,jҜ:D BvGDpߨ #`/.Tl[`[7РMu5FS~I!6mjTLzۈ@9lZ"?6Y F(W|$z?2 jP':6ƈ:(?}NH6O=g7!ۣkZBfz(qbdfp1!&' (~O߀pcs^:+7nX>-K{#"$1^=p.lKWd;絧+^q綥+T'ObSvags(9d& ].TUT׽gZPӀX]`8 FO[|ul /sgNa(|&ОKGDiw >aٜh2 z˻VbsiZ5M:4<$,Φ]]8԰yj{sW6:mZh`XE4nL.*Lvovgp6O'w~O=z&)oAy?x8uqշ}?u9Ar[477hf ]DFH";Da#5xtPԖu x*nEͷŝE)3x|PzW|ޓ/s8\tS{7xr˫VE cp<]fZZ й?f'Չ34YBob %I31 pxfi\Z@e2z(q )$=+0P_AeIgVO蓯?h+OE\#aYpAkw^vLܹs5xQXaDDT󁚈]OeZZ1nǦET/aӣ~ X+{$!["ē!b Ep`%>BI}oǟ~^\ +5BA7[HL% cU}=x}&^amf1%3ƽRӸM0AF>{NV[?dM1a\'_HONٹ{X/w&Gp2kGifm ZLJ #"m2>PJ&500e'vHVj׸_!B^~,kyCʢ!g'Gbg.^a9Xg߀π2,k^j|eG^;0@0"V})5M%30j!c.Ab5fBKYْz?&^_Lr;ҟ}g?WIqO>q\\qZ[lKz+<+(|bKtmۓ% {_4 ~eJj3a=(_|W?@bйHAMZAyMsD:'arж""."t3 `XHGc8,2&:/ݿo^\aGrqE1`lO  #"0ζŸE[mBD8K' ^a!WCn$,i."8(7^\³Dyl\;}ю;ZVxVq*eڭv7E!"WDaXH`& vgcg_~nmu84xX4+(rbE]3Ecl_zbS]Fƭ0E1nqܞ=XћD Z0r\V `ϿL40_P c0fAH ΗTN -~~~m2 #"%p RB PK͠O9B~ܭq7`,pI;`=c2v$ 7 B__mjlTRm0 U|*OL>|ݥK4~Xa0"A2p$рR߸XBK6:vّ,[hXSܕ%c 4LUt`yWR%>^+w #"t F*0|LM}|K9ۢe%j"yu4߫V\kJÃo`DJ_Yrr'8~R`(7>8H+w #",] gAMH踝5EZ!" xшOMI, YF2IR% lsBʔ) bxPLѠټ3 A;O3}A6j 'Gр."Ο?=Nfں=5Ee`ig*8\.{  #" "p'->xƤX( ŋ ;ҎaED$mJH.vrt,e{6ˆ %viBD@1 Ze!% cPlY<#>H})4-T538KE= #")"ȋ &wcfDT!D0[=,,Ln=up._o+<*ꟈ@PfntkDTO#BK*:~>Y+FD@ -3̐l=?" "Ҷ`AAAJJʪUΝ;A,pO8cW{BX~_aDTKWR؅zLoBYE@ D@K3N$GIS(D  *5cDBD@P}`͏5(EG^jC}wۏ?iIuhE.BD@!" GD@&"@g+[R$ڲU ~šV(DD7ijBD@g~HCjD.?3@P(|UZZ*q"MF~+ 7A_JzS}4x}& /4n(DDDu5CI L+#C/4n(DDD}sAB UqEq 4L㛬-]OrINӤ""J! _>z!MX}:)zXڻ/\~WAXw*)221Fȼ;Jݺt('4ӴoԶԝs˅ 0жv*܉_zƭ>'Q &[nMXHMe^A4S"din"e752"nZBD׸Gzܸ +&z1dvCťƖ>=xG)@Q#hmBG!"t&D|wǍ[aeV(N%,hfmaQ4sSޑ3\,xʃ`6F6wϊ=2!D5){sX'Ґ M-jrG{f26М$|^Ç(l|/DUխ'\n\Y N.o3H5p^3D 2 GYW]I%.q<W2.5؃&yVG= UpE~ڊ~||'u:s])5YK9̰tڮ a $-|ҎXeLA${Iz.\m֨@gc6zBD^HS<2(;$ /'K`dܶk݇s9wph O PvE^I5$vS^MLNJZ:c|T^uPNNvћ7Ev^fv۴)*kP2X^ U\R κhMΡP܋)$EvcpuܶC7*偃Ms T;&l6E$"J}oAmkm)ҷdK(@51h`[s%UjDNƐppɅnsQrx]$xW`8"h1!Ra`6sڂ1 r[|smH,?ou=b6o-,4E;9/yLH]u޼.;Ć". 4/r ;FNNx(dn2qt.eTuS!-vmAY7^K'g񻒮(°c#+٘bCҽeP8Ŀ)㸺^ <$N㎛2ޠ'Aq(M&"û7n>?W7P 'ũ%wG8/؂$Xbl5f?tl8b|pG,9|MbEBeүַ7Or6噏_uo=ڍ~ Uf@,Q{!iu͹7ZmУH;D>c)b^hFz'K9#.!",-Rjvq ̆.ߑx,ŽxKջyipR LIkXVyZuSl^kGN4iu.4k+B华v I-gsDP]I~KvT*\ߝk˶xr |x҈ ,;~ misW8iڽ{Sj]tfUML7"y)moDP2ِ2DPsK惡g˟ɤtVhwۂy">p ͪ)!/T5+MR:.qy(:Z9n݂1m}' W_:oK z''ԥNVgi’X7vxYV']DP]ɺw|LWT^=v$ɒ7f BӾ@s A/٘u]Ȥ֟!/‰C?pE^{]Ϗpi'"7͆Ĵ|דEνDxП͟ڮ>Naߙǯ2@eAsY~J ZW!z_o%8ф=9CH*!"ȩh+D%~_䞉~qs_z]%PD BvGDޑotg.. ^j؊<鑅~< <7—.>DAe%T!¾&r^{A [״_ZGiM35 ֌iWr۳hy2m $$!7 Ĵ~;m L 5I Z|ihj5Xu!1ӊV[@5-) /uݭ@WN$C_k,H"Jw![x!"ȉx1D= GtU 4)hצ+hPyG# hUE"Vp*( ϏrFխOo J4(-E<`1iHzHС 8 X͆ zw.ilE6 jo l mGN4"?7=-Sr?3jNjD#tV{$MbbG KKg!϶}I'nqrkZi RΥ&xÏn"B TJ "~b K)$i-M{ p5w&ePM]+&ƜC)j>akׅ#BKAQm@p[ZybKu$6evY>]eURsz, 0zs\W#p p0ɝѠn]}z:d[ oy!BKc|3.dn0lQp1u)=^OJnGe][1}0i01\(i0$ D9$e>V?7$(jnj'~{W $}֪a=G r;d(2Z1uk<ٔ[sQh9絥X§ W;Ksd7 ĺ~lEC<>痧ӽޘv7Օ:X#\=K]wGxޅڣWՙx/kM{,;{OIڛ@9lSKfg%Uݍ"t)[; ׏9:,G2l,8<Г?Z~ }]p(ơ="ɬK$=hF6ΓEʯQ' o u_RtR7;a:,$ځHj(#,}SGДK'wGDc,iWQ+3.6tR>!BǾ;-ImDPYII;eSmX:mZXf@-,DhK- ?:߄2 Ȕ6-qpb=IHύC㒃; 4({`H{[)wGE'DmfcZTW-D* ]tF J#ؚ蛏Z}c=w^ "'Ǥ<MPf v^R=DZ"6Aa 0"bQ^dALIoт;=vՂK{#"$1Ork\XuCh9" ]oJPX1㫅ֺ)sCB.]Q[ׇĺ>:5'gO!IsɎǞɬ/+lcJOϲ%FMZ9u|S65xʁ5s/(ig߾_$"n.M ]RKdww']+n#@ 4pa!BDI k3)\]"2W-2 ΘiLP S6Ms0s$ & MB^[W{5{g&=*{nu6;߷SA`&7%ӔiV.>R! N =u}pH5lѻ=E`Ʃ5BKjfw`DPJ5VjKW,Pڍ~!"|w$XAD&"M]- h9>R6UWEHӀwᵌSyQ@hIv$Uco]Sh['Ch;bf_KfNL'!=G.:粱kZkEucYWW*"\yc- ٭qD\ t'ezt{)Nf9DV0DѤIc]uuKʲ{TR#BgIQHaz[PNzh t ed!DRڕ`BIFr5%:gzTe&;^]e3e{}NN~Q\L9ј8XSɠgÐ '6^Rݭvr]g*Re^cu]ފA{na$i^3.B!"f1ˈVΞ&1)G!P& }\H) o0 DWWD?3":%&W&%U]6"Hz thf- =LD 0/+أBD@DNoL5("VLR0p.Gm;Tb0[5V?onp4:l7BD@iDhs{fF uwa5=+ mIj]ic[(yꃈDz_hPj*!Bu4e0zڊcgxD\٭S . l/mzC`9GEXp6'چL&DG{}dv7A+/4n(DDDuӾ򁚈_n~}<@\ѢlfNgn+W"uZIUNƺ,rȣ+?/NFt!K4vn2{}cUo#B7"""‹X앯?cZZ1%_cEи^"@޷L+P+D݉~qC!" "h 2n=. toQ( B_u  BPQ5D)5TO+߫ Jھ_-?^.<޺l 0F0~Sa!"DD@ ""Z@D@ " "DD@ ""Z@D@ " "DD@ ""Z@D@`AD@ "6l hb 0""6l @DD@ ">`h "`AD@D@ "6DDh "`AD@D@ "6DDh "`AD@D@ "6DDh "`AD@D@ "6DDh "`AD@D@ "6l hbAD 0"Z@l @ "F "6D|hbAD_ R@{{xAI{{[7ҿo-[O- "Z@l @""  "P+"P+6EhbAD- 6Dl hbAD- 6Dl hbAD- 6Dl hbAD- 6Dl @"" "Z@D@ "`AD6Dl ""` 0Z@D@ " "DD@ ""Z@D@ " "DD@ ""Z@D@ " "DD@ ""Z@D@ " "DD@ ""Z@D@ " "DD@ 6Dh "`- 6l @'"߿LEP( .^sDP( E_P( Bku( BPr!v ,X`y.p+Rjں,X`W\5P_bT. ,X`-( B"Sr|IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/notes.txt000066400000000000000000000005001506652756400231530ustar00rootroot00000000000000 boundry.png is used to produce a full width very thin line forcing a separation between text and images above this from those below. patch.png, path.png, scale.png, state.png, yoshimi.png are all padded on either side with a transparency, so that they remain at the same scale as instrument.png (which is the widest). yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/patch.png000066400000000000000000000306461506652756400231050ustar00rootroot00000000000000PNG  IHDRPMW%zTXtRaw profile type exifxڭWv9DYY9Y@=J$Eզ HȒ쪉r[lCl~=>>nqy(=ސ_o޿<}P{]O \>r|~϶ln|f_1Sv%wz v[Z虾}i>5\] ?.tvBgxm/p鏟>}is C/wK]9O>ao^ӟsV=g?1OnZ]ŸdW%%&qtyx\tuwܾߧ,1 ߽8w8)w/w| -,\$kq^nʅIK8>eE(-c+iBsX;/k෯ɯkv; $3ut]YD .$-ޛ8tť1s{/%BB6_CgŘ+1SH1SI5sʰKJ,RJ-tSC5\K| njc޹h;GqGuѧ738̳:˯WYuշۄҎ;ˮ~N96OV$"<v>w?=L \o_ym[PFalvmul:<:_g3¨kӖi% %VIe$eؖmbɇ ׎/fG2xYX9>ْah]g}ºك>؅)Sb##glڊmKSO[߷F/HSyo̧:.63GY^61'O-&9Ulf㰽иd-{kǁY{d4N&Kw}N!]>=?f { 33Ec])nxN좳]a~v:^g#3̱OC'kVU>eN9i'+#{Ox/3Y @؄m=~1>Jf|5_>=Ss8zKA>aZK{%Go@a,'Be3Z󞝈/ix㮗 ƞ,.hՒt q GsվSd{u.S'A;kR67dOn1|j$7Xv.*E÷`P"2$r*]U]|ҔTN^Fcc {50f Z&7vSȱ㰶]/KCܨO; iX%["ž== \N{w[NU2[suxr v.+Һ'𤷻E2]2I $D??BZT(5&jBAss]@G7+2D|u15s'>sp*+v3HdR11 ]#4/L<@F YAn䖀&>w i^*Yqmkb)-eԇD6J_.ϐ{zƋijdCTc).0'ŝ-LZ0N4r5l@dܴA *6cEH; 3U,ΠT;5bBnڼ m+V%NÀ˔VL,  SO#qm@La͖Y!x3!k f,TY^VT0U\uľ҉fUr p0B\cգ̀G|Eީ{`Nx(0R% ;YЦuVfKX,\mU4dXSlxE(k+^U+ǽE#!7p,\@ &Aʎ]*U?So*1Z :@rbyXSYhhDN xי\=$a\m2|J` 9t#څ+z$2A# [u3ݰa9kܦg  ?Ȥ/H|%J:Ihi^1et}(ȣm\ eT] ∺rk UłN eڨORk`+)"uJ˳D:PnTJ LHA',5^8 Tkؑ+J0 `xi=6]aui"L!h1OOP֭b^ܢ7jh 9yBg(($H" ab7!5?÷kjE'J _P΄XQp2Hn`XjtwG <'l:lJ5D%"pEH"+yjYX->lr?EFy*c7\.rmHƩHT0gևH+ >Yb/i QG@FjP $m -mBvU 3CT=I`p^#Ȗ JMse=bwð@,E8Dh0'`"D%. MH4k(U-rVqQejۚ;E kIid kS!+9 Αn {?B6)^8( vj`/q~^ngBY 10S5Q::)~Y0tĊ _$^0*T啋N'C=Q^NG]^T]Ie~j*UUjYМ@ ޑ[hۛQ /(j Y]w;i D?F&35rO*LBI;(RyQ㛶]\( ҴR[IHQpͯv/XHgI'dԈ-L:X)tUc x]6afQSh@(zB.RX%ũ߭.&Th2q&NtKja ey,2Zaep'@aR.c[M rcSv́ި.~PL}[ϐ%[U;r7BHݳ,w?=b>$|uǂXfT!c )3Vn]ӡ2Q\SjAh"zdnmGniT`|'$?AMX7?)0Dž#7E'5u1~P Pg'pJܧ8&Bz!tw}gdQԩzіP*Uo|NӁ%F~]sy |[ؾߵQi$љ>qijOWF(MTlaK0] :~Z3!HH(+$y[Q`EHΗG'{DB?M`ǭ#ra.r eRl:dGGV#ȰYr833R[ C6Ba\pxӜއ:A|ͣ<<)p^ҔSc"@Z*tCHQeU _sX:=ȭ=N 6,BDEK|A^!ˈ_uF7Hn0`7Ғ_gN5{aSPGHGOvFz!{D>^5<;@vWN*@O5 @ٚPj X13(R09'4BI HI9jIb5 1AW*$ GH2z}k4<4"4<\~-@Vvqd x7ZYatDtO ،< X+CD]B]8 LLfHNqEUg +tխ%C Fڪ{>lli5!k+q3XRj_hSLh/a(2Bt`q$_{iGPK@{F^gEoG_b:j\Ł/>-ԉ@@3$CeQ- K-q6X!x9t ŀ?a z"TۯAꉎN˽H=A~u'OKK]4]WOy:=P>};!oCG'?ku՜%IE"aIyCR*_9zM%\tohEFzhOGJ+t`2bRV x$ X0TG෢~-4u=ԼE4qhbi͍] |'90*r݃;ɛISM$EuT3,BMA`vN 0 >mr@`6I1!*Wϼd 9f$Gkj} a,*͓J)TEpE2ե9}("juz+P52$ kj>tz=q]X!1*DkzPFG7jQ'QtUFLqWC!~ƼkbP#$0~:ҔC! `l ~=jB?7#jݹS窨Ҁ"H5;#(:mܻTF(]Xo@t7̡N& eRHE5Rh]lQ6%+Lmﰢk@ׁ Darpji,'xQ\E3TJ я:j h^iW5A- B !! Xi:D=u5T0`@.9$TTg^ei*EtQx- lmL"J|Julq: ƾ0r{P 3u"tqh_>OHzv|j3ˆ:Ll>(7kJ~ek^O-+UI=~Q![G啭'R7S!Aۂ;Sa4 l"9|͝PD4 bAmm$pԩFtLz-y6#QE1sl%ߖ eHvgbJ `:H,Xy;:&2@E'ͽ84!*aqR7SB$=5p(ʲ>яOÜt}HǏ󥏬h?'hxQ}#/!Zuv@Tc5t=TXe$YI wܓ(*88@1 pT=ԅ]u9#TP咘uC'(=uaSI4AA"/j2Rw =դ6!ԗ2:tޑ^RANĆIjw&5+rW7PS6-eV$tUPL(g K}!dW4 {*[NwDc1WJi1#4W)[u lQ{W3jNj~q#Dߢ"j2KZ=9YCllt,.DPi9hPAC(UVc#÷@O@g$.B0gVj{9eSt¡๮f;$HzN md"̧WHl6LDNuoCQ3nԡ;rQsk P^px6͒(v)b.h&?4NȬLQ裆A ٻ"b=!`Ao oc){w6Ns(L:{q5Аڀ[/i_ 3 "MYt&`Vb"1;#*)m2Eٸ';ר菠a/&B#ug&R^ mU:2 Y 1乂<y<*M:KhRrD @5TE)ON )~;5P`EO- E¨c=cj _¤tǯ1;C)K<3ը![;1|^l0rЍ I {.H {0HAZ ( ) Zյjljk{M eн ZGe_ٹggS1tr"j *,EzY3VN<@I8Th刼A6ɻ&>$ :(?*|{& Üt63Gi$ȓ#BAr)i_9DJA*D>Vltb:u'Ge8hy^X $hCU tpzh0Pte da|ORq)?_mm7t-#zVq"*P`I-bOcG>1.*3HOF qj5w; gD8XL0u+.Q6nڹnH*jgMQ@H!bѽalk-6&Y:_3x!ŕH =(1Ž ? ?c{ݔ y-;Mot?9*|̈́YF8 :zY @s xUWRjuyA 5x=fy'5 pHYs.#.#x?vtIME%R:tEXtCommentCreated with GIMPWbKGD IDATx\lW%{ z .jBU!$ @16cǘbl16bE[`,-^ٻs.z?g曀ґ̛y{wfQ6[p"%%#1MĉcΜ9g׮]Z qBA&"RzS^W]24oH={~{/Q۶!iڹǏ$u+ÏQwCzlJIyV~@#N<3owRBX[uԪUPgȐ͔3/UF˗JQ*Zt6Gg=Ԫgdՠ#b駟nуiq*ZEV㏣gESlig'_~y@q ڤO@]l![G gWх yqlyyn8n]6]IO{* 8p 9s煲il%Okg]LOr`q<̈tz˟JKNݦ7rZɓ|oԺu0wڻR* ٳGes^C4*P`&%''lҥr_|ÄțwA^aR,8r~^G'msR tOR\/ӡn/P>\yq*V.=?mP]̚wodݽY갞YӨr0`XOmrF11-Cُ?c+7ZtjÆL#Ɠ56?X-<^o2Z ?=.e!}ҤDt[7oPǎ<9 f=>,Ó2%zEбc7\@zD1ox~Q^X6|o9@FmYpA" %טgi\aldb*R[ͮ,B-^r OIW>ZIYkX {uB:eK( P3dΝdz1[,2Q@_ q'NiZ~s8nLS_"@@71EGrԹ,OOf vOHQc1<qkpāG? gС<7x`#&1q%ZUGGq@wbW7'A:[u;Djb~y uawF6`V?j(=Ejr :xVZڦh9mG *q;+r%$$ТEV\SNucǎΏ@ܹs5ET@۷k&l\Sup 5kd%rI3 ӧ-q0QQQ:nr̙3V1 +PLMZ'Ipp qigϞ=cOmxiq81g޼ylq0Ƽoe|*UeJAN;X5lESbС|dʗ/:!;>O<^[nL>ѣQM6%ƩS&!C}Щ!U[݉3n8q'3]V7&Aq b5mڔI:WJH[8UV](, N:1!pk%][A>x`>cyr,-ǒ8X̚iҹB8!@#8!G h"N@@5hЀe x;HG3Aݻ7ϴ9rh_j}x#$!5YD)L&nj(|Sp9.ljl2::Z<Иk֬q$h'NDDKC$#{TPjʑlW7E: ütܙA'I`ҤI\#Gm%<9Ȗ@#QXG qB!@#2gNc… 6ǸxUrдf:@66=cܧq} JǸYI Ny⫮]:JIcSV}G~{*SxAl5@бcG[& n€l۶M2ST2@HCPwr'_ nڴV ҌoVRM; XHەk&35GlE}J4kV)'M+Xdl@ho`55,!N*b׷aZYoqZa˖-ԢE ~5Ǯ\|qRA@bl+q c87݉.uKQ.!ٕ랯|2 4|Ɔ 0B^i6؉tԎ8frP#@h\<{‹0r'#@ɱ@#@#G H pD2@%HZ3mcFIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/path.png000066400000000000000000000154271506652756400227420ustar00rootroot00000000000000PNG  IHDR+rd zTXtRaw profile type exifxڭivs$8,CVɖ,KUb@ T87Tk E[ȿ2ML1=ao>q^7sy>_ˊuy }}w%7ZS+,[]bimDw(=|\*INN9 lf~97~jN- ~|~71wʿIwߥ3~\PISӝk}oۯ w{kuV*KE},yuӣ|=5^MVIHM%d󼮴b#WErW`'CVJWZyj 8dʗJI ȿ rѽ^P)=UpX1/JcBL\F}U|}ɠ>a,H\ItB{& ɤLbMYSM$Ș"$ULRJΕPܛϴ\**!\ɐRi֢p6:j^aj-ҴZoY蹗{݆ GcqScdfSfeꬳ>Ǵ%aUk,۲wm=t)GO=3]v-Wo;µ/Y{Κ< ۗq!ӉzȘD›g 9="9YBU0I#$ћk4[ \A~ϲitɐ5f{I{Y·czz2\8(5 bܱwulifX{ǚ{ *1qn[˭0bMB_bSۘ~@瑵Jw5YGsܲf6GVnYFߦphvf=KoӜ7ۭX6RklK'q{|=[gnߧ~֣J7@; ; ִ+fl",gȹ\K\[ks0Ǡ`]k_ïwv˸1LV4zs[wީ7׺@ru./q+nT\-{|28s^SR4aZw!Usv|*Q= qrEr*3 MsdvjaR'9Bf<A9}`8=_/Oσ$<K7'6uG3@l _F,X5x$0(49tV(K!j>8QX-`t P"=Z7AmS>!àpS] CL8XNN|n1[@WŅ_Eh YJb[x3#|\'3I:7;ͥ#)_-F#Cte* p,b֔Bk ߾-Evߕ*8sǨS:S/\jZ4F<4I BI d;oo' ] yCmzZ~ꕽA=,E4~?ʰR Xu{QFetl7>Dg^Y# 4ӆKB&#dY/,"8~y;FVhna()w iM>M P[/d:Karjba\D VPn'\`p%DБ JB&?l3,"^w9NǏk>yP=UH, .'ѐlW i܈x U5 +DY0<3@*H\G9 [ Z}iI@uTdwf(xyNu"+2N"౪IAFliꉸOoNjI(*0 )^')J tSuicNK1.q:V@-`9fP/b#e9wb h$/j~&ȧ KB'| yL2ayl8\4ᎸQm̓ج_^PQlpb?N]rǽ m`}&p1w[qߦ͌tB% ޝ1iN鵱(=MxOe)Y 㗅13.~)Ц 鬊j,M` RIlJk۠T`'hSJ8Q*AVô"A8$ܵ/wͺ]H+ާwѸ(J#ܱ"VoK"DѐX8i %J2z6Pu 9Tߋ;߀Nu䶷Eۡ-N3vdK]ӵB7Z;YB$@X&W* ڧDx;@F;Z9AnJٝ4hf|A 俇PV$J!=!ݾfd;Mû pI]2/^_C_`a̙B5 0'b[TTN.eMZNrs;XNuZW 2@)30h`O#0ϷPX7dLmy( (8|/㑧mJ; *u<J)95R^Ϝ^rMIV ^sʡ|1 9 &TQrM1+ Q•0XKE\t*꺨1Tn"su!'m  neoBgPʊ]gJ`%X:.F8k+5Ƥ0 )=nܘ.D[~\qhKw4Q:զ BWB?x>!HgIe3A:*O :}7_0|n_edx8]f]^;F@~9Hэ͉>y q%g9W>-GR{[?"BC:w2M_FÝkV: 4R epA(*g?<0.kEnκGY( zt_!G_DR[r_ —;wT|*>'c`2?D~)Wσi [1;NRo唱lD HB-{ؚ1j('aqGB'|`Qџ?ck:ʅɯg1uM3ce?)e+x(pDJ2EHF-NkCw|}B_ʾ1hC/l]}m, e: qEAm#p\{7X.Cl4sO{haFM [|B((O >Xe)Zpq]Smhlh 52Rp&)[![I\ g e6+O5u\K'%Ґܭ,C# a:R]#6kS++--Dt%-ȯ.(X)ѠXjP|DmN$!bFhXČgV.hr]t} |ʸ7d }70(8:Bv+zYIlr!x};3uGau)ˉ94pO\ʼ>_ #̐`/Fw){#dwFݛѮQ֬{OMyK18Ⱀ@m=To`$h.u13z?Dnl'^9nXO޿ope2qr\P!眩YDQYF瞀 6gridqU;zbP=" ˷{~nH_ST_3"|b:f<ퟐ{ DG|7]g:vȿc mߘIwUbJ?s y;cP3GS[h۲/ՠ8?j B壾Ӹ[H/3(4`27N,l`ɾbNF5A$=\)z\pD+%70):cUU7c@"f!>pi_׫u}2"Ł]VӜ.thgOK@~EK]QσFaj&ȁ @ūy<bu>#tx?"! oEaF h;XYftO h:X`OK`Wb-h4}:W;+?*ǻtH%{;"}ٜjfgc^ pHYs.#.#x?vtIME%4tEXtCommentCreated with GIMPWPLTE  !!$$$$$%%%%%&&&&&'''((()))***+++++,,--/////0000011223344555556677888999::;;=====?????@@@BBBBBCCCCCDDEEEFFFFFHHHHHMMMMMOOOOORRSSSSSTTVVWWWWWXXXXXYYZZ\\]]]^^`````bbddeefffjjjkkklllmmmnnnnnoooooqqrrsstttuuuvvvwwyyyyyzz{{{||~~~…‡Èƍȓɔ˗̙ΝФҥҧөիլ֯ٵڷ۸ܺݽ޾[tRNS@fbKGDJamIDATXc`=]#!\#D5Gu \Ăd+8RK߾}8f5@WK+xdS,\.6^dk5Yw)sM'&]Q2vk\A?ĤD5;Ypi&/ΠzR*S]wдLLi lOyl<rMO&uj'V2]~gU`fq#ˤF~ç 5M)E& [8Jh5д~EILqǿVe:sΧ pzi&'OM};@vj(6`׀C7+d)H7LS_ pMF$*=~qwL#?O $vx 57 bJ1ME)Մ`1`Z=)/ IJ701M{Ed0ݪ@x(Ҙ`TWdt;5> ƴ G)]v F5u͠r\ڹFQ8pnc`vk12:ra ]p`^$ukmk)09"Zyd|ё#고hVI#0GX5D]&۾Ç͒Q8O~ˑUJ!5@ev (#YLDs]c v H5X]Sd#G8Օlqæj2k92_0TV8G5 X]v9lYKg1hE䩍J~G`(;R;S5G6 L'9%#X-o]UyGkڹf< 4' # p #}`;eĵ*ُIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/scale.png000066400000000000000000000241041506652756400230650ustar00rootroot00000000000000PNG  IHDRPMWzTXtRaw profile type exifxڭiv9cXsznrɶ*)-2)2xȝ/\^+I >??v޿ ?uy)G߯uO;/Bo~F)nv}wίiڛ}zN?rXK 7-lmkwŮϕ/>S<)$Ϧ& iOgL5R7~))?EЏ_2T<~z(z}N铷Ow,za4珬߽{^2go*Zϧ*ƿ⛂w%u) =DxC;pyWX 1]q%%7;hMcZCc,mnB;4G.Tɷ;oW AX1rd\FF}<KyMdcyk,2@H"J.i cQCK)XiQSU Òe+VͬYZjVz=N?{< c8̳:mXѭ*.[m5viǻnm=N8ɧzϸM7rnww;}Y 'Sz}\"NrFb$ܔ\ʙo!)gGDY12OWK7G"#sN=o_emғ!w=m1gxD`;.u+ÍR;2+퇒3?b.t\Tօ%vkIPa.aZ05O0kV/ZY;UҸ3ç?אlv͵ d䥢H&q̺{j}m7J=gKn>͐Έ3[)D~#S;m4h+yyNNuҦ#+ SOӈMDùkU v{lRl d,;kbWĉ֫PT'*Q^TGyMKrObV@PJcsU/c:MA98hNp<BW}"cLP`$b^~X(?1<c'Vp)OYBܹ]+Sh2I^R@N 2DʓdCfp3[ln](wQ;u: c gowOr}R&f7%4eLKY6ql,f`+gB]v nBmWk;A ùתglT5/l4 ,cҜA©Po)85a mWJrԴw C qoUwb !xc9JZ`Z7TPAplRF(AS*ۀ'n|E\9?%ZH{b2t5rջXg53'&EOzX\&%)ct9.$|wHe71`LOo=}CS=u^[pq@`(ì3p*z8ƀǪ8-D=s=fBDДߑZӞ Ʋ14;`  ʹ,Q. nDv$Ƈp.*%y,O--п)NҽhD"}h%iXHd'ƘQM@uS"(V> (}v)z7` =B(X9|TqNw5꧟Qb˥FJODnN 4XP#%''-ak`mb7bq O+ eRDq ͆AWtBH&}FMlV9} {nĩx4bj1R(Ɋ!DJ"=K9%&1%4᎛wk+ހ%5Lt#.4-)Z' ]vIB+cIrڪH~%<G#f%xУ/,B$h80ꙔS IR6ʰtj?8VŜ@. /: e"ILRA"j2'|ނ?&v~0H7ʽJhz 5м1* N )sY}̐DD (Giq,NˆhZ$Kbg/\/s$zuJnSÔ@tGS)9p~ )cJ-cGOꏄ(` `!{\2;A!-N0d<ʑNYZ=$: oä;ZSuCcnUdi+q^ʹrRO"1?6)s禐%aNG>Z &EA{@[†4 niTUd7^a&:z@=ˏtk "I}1uPGzw>.J PqC2bz$/Ei1(v D@T55L`֡)kᑉΘMsrY%lWY5 @j*J,Z "O:CyG* H?1 w{7c%hFm_D,-䳸B\´ؔ>EM.ϴ2aF%hō L 2Q$F*Y_v@uo*#3@`k?Wz!ꗄP 6H/1V]3:"`K(zj1IDk1^PpRhѡɛ QM%ӟdmaz/ޓ* P&_)ʘ0beţiW, kEirQQm: &dJNv9hphl`FѪ(ӊ {`\EFe" K"Sar]\CH˒M ȏi(*h+IX50!jkȥGEOvH=t [z}ZHVV}ddC}!fvuf6" {c")3Cnu.2M^cB$ԗSl*6TMdz3M\_&]j<ċP݅kQܞfG-+}DW|wt̲<t")f$ȲX!!xbQ#=ҏH^.Skq90L'?q?O%h'L-s4+SYYDCcZ惣>mBTJJ CaXi $\Mt_Ç|Nh~@gi^Gu ݩ^#TF]}~,S0lm0iqOU꿥F$v.֝PoE+Z=T MU+gCE"(6JY$a6Әa*&E埄Oy[FwtX.-AlX6OdMWjAˈcj3o2; rn,qg.4T&}/a~tȈZZ!٠l:?兯a9Q{;R +>qݗ&d='F6iy -hTP~X qGYbO RzG3rS i/蠚2D{#u7{E`~aUht4AYNzolh4C1d*넋˲7~QA  gO hR3 W-k1!R)~Z !b4혅6qI iFy z⣺'Cx%уPPZ:=V0ɩzJ}XCq|6)Ӵ4G5Udn$ݯ/0Y=AEgu}2 zCH쿍q8H.3<ڸ]I Yl,ĸC!A=0Gw vLF֖2xu)M-"#jurLgcG 2ݗ{M h"SC֒` Nie wg(Ax H qX6a}Sna/ 4*a\Nt|u61g"fSt&fē" Ꭲ (YsD)hMh> q>+ Bأ2NZ/5!R]:2PU%SI@Q+xpB!:br$*vi4=́qQwboiDIBh'(ݖau녬\W{E,|G;]Uy+D19y&B=.JH=t ؽ=B ;=x~ﮍ~b)5GdW6r^ೌBc:bӂN/]dW8,k"5E2G)HS)Msۀ`&qH  n'>W,{U!0BuE0vCm`"&У?@BɆ$lFſFYi R/Ua @SԆNV©gxiv:B$6+xщ,xXrbdp&f%TY3M+iw(]O鍌1i9o+˪: ТZGh |R RQS\ 3GDQY>ҵϛ-σH!;to-tVoWgM/>wVl(AǸã@ }G?6IkcH"EdD֤EXGX]GqnA:w2 [̂e oxExN?$3(zg"t.0ȌͫՑ )U e?@TP(ӿZڶAnY.cT %ifUGG6P}A̮AnGOF YA }{e<:xVԶh;b:ZJ C*)&:X<ʎ{풒u% ý UK( &DYDvZ!JbXI5}f*e"~0D yh<6CG_#E[DW{fL]:wHWh欣o}iGXsRH)x`# FGsdnǻ-MGTD^t|Mzv<*5ZCbj  e=>: γ0^>/|``#0  dPIN7N9S[@Uh l6.~hurHccQ-r3ȁA=ڃxӦS/sk 7UAW+i yeaCH}R/ɯ!q_ĤV N. -1Y:uI3eT8X(XKy = #ןk@3E,HKg /(L#udQ|37ƣUG hY')_T:<%?p򯣐J]G]L/k`;/_Fes!0A,22kOKR)ZͥtOG&相_R_URhzHڦ0Q"+ %}#bpbO1 i>:' Ά=C={I 7}G龫\ X[΅gN΀҆뙐 .AaI4lC O|uF *+  #NQ\Q ;R7Z1[MGyin* ;eO9b(SgzmF5賸6v{j][=:-d/ϊ8r360a'+QK pHYs.#.#x?vtIME&E>tEXtCommentCreated with GIMPWbKGD IDATxyPWƍ+bR5рJQ+LLUV,DEGqCd *.Aی3=.љ3zn x?Nݷro_sU*XJ0tJ%N^^X9NnnR[X5LpoSH_O#,8={/ѣG޽Էolc&=za! l N 8/N Ν'{nE԰w4xp1ӦGBU1in%ƃ&NLӧoӃO).<_+oz9eg=>'~V;ysz뭨BL4 nW|<2(x_~Wu`Bȑktܿ ]Zg<88nxD?g8x7n V}p>,|}z 8}a7ٳT`3p``#l|Vk9O6 !mC}U-1bV8gYp< <BnΧ<-֭իW+ Z#TpBCCQU+c&L̙3m۶L1CLK.U% M6V >\3JQ%r޳~z͍,YŪ. ݻwkg5HǏ+W5k*_+İ:.\ȝ8Yf'3 U^ ӧ1/Qp@K岄E?܍ߎ"!|X^^^ AYll1;),qƙpdALतې-C #GpGLpGpNdd$u҅64(KL)&)jΝ* iʺ/yBSO N||<7Ne$ 9RYfoC9Eɓ' q 8 B'ݴiUV=*5mذ!})+Uutux3Ar ?khz(ko!U"mCPb;""BY)oR K)S4Umٲ00=(ʦNzl UC)2A!-P8xpp0UgO"TeĪ<a>/!'99H;*(zzQx|{Y=`=zP.Y zd:8xFABh4h'f$Yfq'MdU78p {x-|\c1GL騀#Gp1GLpGpʗNQVWks0Q7 cF$Nt (asJC-Jɫ+ra0d= (;L p>~OvX@VuaÆ)w/uPW魘j ^*v:_!T $( Ljt N>}x/@ *ѓMOk ^ 7y#򔒞)w+ramf(X euIG1POرcV35I^f$U /1; DT]XO2\kFQ,W3̫̀'ykVǨ3f:tG9xΝ %zOtWW"'WaUp_wAzO*48L ԓy0FYGO:j͝;M5Hk~  =FڒŖu!ڵ!I.@ <ؔt,u0됼lɫ^ߪlm o_0QMKJ+9)1Gx#RLR,V~ cVGbJi+:@ZIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/state.png000066400000000000000000000212641506652756400231220ustar00rootroot00000000000000PNG  IHDRQ3KnzTXtRaw profile type exifxڭu9{# } 9HjdM5 1O>J-g˟b}x?u~>oy+^ȯ7{>ӻn|Eo nlFFϿdz,[-0_ןok-sʮDGoKɍ>Fm.{ y |w;?=:͔lyc ?秙R!~ϴ}$|P.yқw#|.?-k{Ϊgu=f_z[놢u?*M*j|UZbRG"|Mל'EqN7b^$wެ$ܨ/w| -,ä_sqwv2rP=9>2sP)X1/"`ʜs:.##n߾>Q^L7̕v;t?$y+D.L> z݀1d\ 6\vd39YIPg>D?HK/&cg䟷BB6:Ɋ1Q?%VjbJ)jja9,D%XRɥZZ馆kZk@V[k3hΝOw.}FiQFm 34,6+,xUV]m6N;nJO:SO3+}E+kfJ_YRn'I9#c>:^ʙ.F)gT]=3Rcű:#gF-ch1g{uFV cXvR]kuLsm1v-y6g\A.wn"Dv⊨wOvr,Bҙn8Ʌ}]0ɝ `ϰ}ʧcNX:~&`=SZޭz{Q},!i(N {W> ,A >LIFM'jԾ_-AfbPwS(yO{jjnv7WHlkX0S.R>GTЊlRhMh'ec7duIMŻrOtjәIjteVnv4i$o>o6GYWRrD-aZȨ$2pT9]0 a 9pz!Xc0ZYÚ֟WYloeOs[𛮦se$Srܡ{기6 6:&I`*bI8r7pw4ӝxFN}bVy2l b~D$UpB6dR1 #W~B"Y׭'x1{!]w)<kTl}~qHh8A& } ǃD^ j;vKt*#<_*_4/nV䚢VE}6p3 YqY1MEc|OK+J&L wh7uuI<2d:PpbDvwĶ<3U`4E A;Kg1QҡR&NE"7+vg:޴ .:&t/ V4Fͫ /%Gm8JQ/:+r\,kkOOPsMcϔ uǠHn"\T5ۍAqy֠R~}&~N݅<#@tj&%C@ !Q_Z".7 j/uMHG"(+}fd~^1BwrD\|oX< >;8 _̱]aUMڑ%"7N SP.gGB+cPe\a`ul^#00uOq7T)BQzV8;)#:T0 TwznZ0f,B0^.(x2J.{G 22hvXot/#+TO=Zt~ٝQx;DDQ.4dGm]TNLS^ߢys4FECz\@]눧KJ~F1 J hӨ/rг 1Ո&[˃_-ThnH2pp/4A؈3x27"Qnm&w00M|k0V0Q9Y=8b)ք?jdGqHͲ@+{2#  3 QAω<}ȉƽ"Ury>!XY&,?RH6>@q-QR=@zX}ƤX@e~wT>}8arjTI>*cGs9(pP0Hh)#@#/i^|f}):ߖWdg_/| ]o3j^)}?5j׉E 6l ) nMϘ@(|n@|^3;4.3./=?i_Ԝ?)79 1<ȵ|L_d'dbf Nl,)2B\g?57 UDB$+,ހ4LaX2to@5 $hɒHI@J ;qxd}ed%O8j6‰@mFmT1GNzt.[GS"7&vPc4Z9-3"EoT)DRdNfA٣Nx At\uEZns5ZuP6W c WBS$x@$23g$[!'JFG59&dw."UnQudBٸS'&t(q12YЬ G+T|ډ茤K038)h#`'@E@Af[@Uhܢmj߿~@kQO^!ײ]{?`RMϹzLh[РL&ٺ G<|JOkB]?p9g ]rgFv*<IL^$@Unaƚ_拿AvEtIGõNk3IgαOzynlY6Q,5sm7dt5va6m4I :Gi ۹§eP~卽RZ8T3/h)Ixd<_-[{2sd Ѽv r;$&i@R}ֹQ 'Ou|€Lsl-6`<|ڞ[#8BRKyJR'Pq bCENNA/'@gC]. y$CTc †&f&U}i=ɧ#j ՍJ-<i@sKmF njG?`" І3bͺf~"H_x@a*>n++/ :H#*'N# #x' Y ǝP;L g 6GuPҁ^3A$s-ӷrGII(٤E_!Nm@T%;m1kgBH-h(t.ıq̌8`ėIT)ԚijIQۼ^y5/x' ?D!27"@"[1ŷL" Lj̙kĢYrYW)&x 4$vQҨ 9G@i{Պ딑?F %> o9 ڌhf5%.mP~ ڒtq, -D R֠3Ehv8AYt d?in%Jgp$wfLUUV8Ҩձ Qc5\S!: Zvtt:uԄp p פ]TMǹY C".z%؏'X@F4;R%M):'G#(Rh慤)R确5#:ݝ"XkU"}^K| 6;A/zL:*@yhe\Qg=nJtgMS}iℴa0::q5I7?6-y8X_@* q jJd~e9l΋CQ'pC1Qe 3>\/m"áSJx7  2s V4 iRe!9 #5*N'(*y87^a@:ØNe >0{s.kuU$N;FOEj$>:)38 s4܋"’u2 ,n<2U ur*@eFEy[&S :gÈŎZ1~; {s{  )zD&c> q=6HB!W@QH׍oBz?h̟!憠җ\1q=T&0hwv{QAg`{byKH(&|EKBQtr \6b52a9 eq{uB*j%,I036٧i}cK& YՖC&82=nʉh:D`tƒt>?XB0k*#DiNLVON:rwܱTq @k0Fb@+1[AO&.`[9 KTh̝9nhhAZW]1LKo R YOPU(>]F;efi_ܩ\EV~>C雔 u *:UyS0ejY}v{+!v ,Ǒl3VHb[ JM愼ukjD-<H@p X$xXiI:2KIZ o@Gf޴2#E@Boo"B#\>6YEQ slR(R3'D'9Ql:M23T*D1rhPh"4ahAdRWʸsg3uXr8lvEN@">j0f"ƍ m' @II|#'҈NB+e.']o'KZ*ql?1>W| % ۂA_f D!v~И;6ն\C KAI2rB6?J9u@cԮu$TNqA= 0ZHs~B%ônn@?Aotf,6=C'$C('ƨ'"Fo>E /Uo/yÝY`׎z9w2]Gɚ;q Uh0Q:z$&Kk80~[upVLSuǹ=eξT>4BMRgfG5PV^ ;vЃE9$iV> ' i;NinOaª`ҧoz6X}PaQ.WtGd~Q6E9k4)fm#{oriKӆ;Dz=:*Kf1xI48@i61jyܬ&uj@%TurZ8% GLuT>B3v-$qQcj  6B)v$`AQthHE0夒V aΐSX9zxcTnHY;"ڄ56+e([̔4X\"(_U~2#HgM)T6.^ AhO(Hg i[-1Qd,mB fVF>>?????@@@AAABBBCCDDDDDEEEFFFFFGGGHHHHHIIIJJJKKKMMNNNOOOOOPPPPPQQQRRRRRSSSTTTUUUVVVVVWWWXXXYYZZZ\\\\\]]]^^^^^```aaaaacccddeefffhhhkkknnnooopppssstttuuuvvvxxyyyzzz{{{|||||}}}~~~…ÈĊƍɔΝСӨիլڵڶ۸ܹݼ޾h|tRNS@fbKGDJauIDATh{TU [X5⤸Y.E%= #*7#ʴLܢFS2H$1-b)%iiEz[iݹ3.6vwN;gf|s9s盽>[RbݟձJvp=pV>ig7rq|ogu-vק!tG@hvE1:Rז+83S"c5AnmpMJZ g3>l4V ,Iŕ:~t:~S .+G§Y6IѪӯnIYhg&cŧ6 jP⌮O*=5&m,q^ y$CD/8 ȿR]#a]naU7LtNSqf=)8?3^Ft L=3fBpZ3ba*<jvd]Iމٮ.`IUVMF5w5͈}[O3lP% HV58zGpi6@wJMnpzTeY2 ;Չi.OASZp댿QYЌTfN 4աIqFV$ATGmV3xpޱL3bU;)5M$ATkQiMX.cIqi2% HX-E o\N]"V% FAH//^\IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/syseffsend.png000066400000000000000000000540371506652756400241570ustar00rootroot00000000000000PNG  IHDR6siCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N"ʕ+>モ-[vyK >}6[>N0jlժeJ]\Y@\M]rC:׶MMaVd? -t Vc~[ڢq%twf,yxEe5[gxy2d@/?^vqK%{zf+0靭A8Rת))_!NUϣn}mr5Cq~ _p'[ҁlלϯ>ءuhJmUVֱq̚M+;vhNu$|ۯw7,$w?Oc_Z?"Α#W|ē;k|rm֙2f(hb yn" mWhj {wkRUvC:) 3;Ne -b·77ݽp˪)3&b )c|īFW:'WU_rgi&|%o]+ur9s g7)Z)mk~ [Vs|K.3c\"vWszlǍ k;}tp|D#RFmf[ HIͭc˫/>3kQIZ5r|Q*4/oQw SqG魴Y#o>-AߵK֊LڅcrCg It؎=Ʋ[awlɵCKT.ټbѭַ-VM)Gw/kyg Wݾ>_w]>j5m/gdζܿOwW˟}rG<{~];wnAgNtbǗ/Td W7,0jl4_rW5 X-MQ˾__YAECD}jgo:؝XJuR%T4 F}6*^k&ѯ'I>DH>DH>DH>DH>DH>DF|IvԠUVuoņ ~@@*omѢEӦM[jճgYf]p\=zt: ~&oYlիo޼ix Su@߿O>0>2dȔ)S ֥K,GBߤcFD|gnS£G&u/qE|3f ,ٹs6rʈ#0gƍgoo/|{mjĉ?;v,PFHc#fm֬Y6m̙%{m꣏>λv>n\·ǎ9 P &մk. w޵q3۷s{Qt0mܹJ±ĉ ~&sڵX~ l;vSҒ\?X c|}|₯@/qҢgrܺukF>Skk 5 }W^ֿXޣGiӦYYYKa/w?`M_t޼y:tkD+cCE#Ӧo[n w)(?/^\+5Ecs T&U~ÆnԩK,pvԉ}_&&gϞeDָFiI*`3f-X`]q8DX ӧuSE;ؽ{bM___a;w7oޭ[7a#a Q5JX#}||󫯾bSuڷo/XO?i`~9a[`;~-:E7 j x:⅂;߱cG3Xك:jE˅uмdϞ=[a!n2fxg /&Mtx3g+|ܫ mb,wrr k۶-~6@> ,wjb' !(}T48g=0rvΨ(4nnn* ?wPP[5>ZZAQ_Y8:teqppBDq*8i=#G{cn -ԋјa0UiPGԪj56d(V֭ݯ>J˷m&}mL}pV‘#GmM6iuFiO"^bAx_?҂޳g`ű=Uz외C6 |7iҤqjFbF7zAaE*ژ%ݻ{;ó _5~k0jK=3JgBIGZFx"E 5l%z}8!RTzfM^G ͧN /Di;p@`Ý>}GS^=3JgBLӧl4ʺs6T"w&V:&Ls5,CntxL-#*.]jUiҙqC A&TBJY-4\)yk-GzGk!TK Y<ZZ %K OiZG.N37pq2M;d Bjҙ ngȰO> }v؆h#e0Gy}DC-0l_#KYZs3:t( C ZYXxӜׇo^l6 v;+l(Ο@+V`-[juFFGU灖d;EpX (@Ph k>{$mz.Nd$'G6@)[?=J PVXsOsq5{\ JG4m߼y3R(&8sZO5OO͔>5J5 0r]&>d xy3hXd|Xv…͘sFVkdUGKhض9|d)}H p ^@ e ~:)25=ū/fo`VU-]D7:lU>g%5CE{l͙P)rҌ~i?}x$M£>E{J4$ZNyVѯqV"AeLS'>E{}-'afxkj?}2k3}kkD.$E{ٛ-(%Ϥ5*}mF4OS#uH'k^SG_˽>3Jj?}MuVnd:MaJmfy#YGOs5OR+jL{B>Ak궭qݦ'I>DH>IF$YtDYe!g՗IH~T_&R7Ee!3کM:y>_;գI4χC"kz4P3Z~M:yF_ I4̨C"Ut:$B_[գIQDBe!-g!Z'rFO" }O}'}'}'}'}'}'}'}'}'}'}O}BDH>DH>DH>DH>DH>DHCfΜ╚;w[>}lݺ588X#Һ˗4m۶O{POOObHKtQ ^/Oㅯ8iPةS'l8޶jdذaoHpHvUjQ,iݺR2͛?:X;vUvU:?x 3aݻw9,,#cHp%ƍR#hHK›q/Y/H*k׮̞3g΍7t>իq\p\R2e݅ p\ԥ!-śqǏyBÆ gY}Ŋ=.|֬Y^CgϞmf#+kkk!m@3ݻw6wЁxT%B@-Μ9cj@l@M ;bnݺiYRphҴiӆ }q'Fwa$@#Lc9&4v]]] 4k׮ŷO'0 }\3Çs|N0aBFkb=zxyy n]\\ea͛7-m֬ٴiӔrw~``EU]tI~_2z,rJ[+ %gdggb/Kq aо}{<1sb-D߾}mlla޽{:%c+\%ɓ'7FvRt=za B딄XqAa,ן\M,WΝ;}W"Ql@ XMΘzzh!7ZHS_`^p͚5XiG K.w |́3~ctB/KZ}!Xj|:t@= 2X?v}uk]3gRFkjB*;qt4ɓ.p,5JI& GGsL>}:R#! (ΐ(`~M6e`8 4pPI]J{3Ԡc @# 8p3i8({p裻F?f6ۻ啯JIy>b;{մ'N@:0 oȐ!Ʋ<,5Zrv^/VG V yk^/ W\&U%u8ܛ@cyjgg_+*Ӧg/n43Us XPE} M6[2s t,g_afCzw2u8ZgטDŽpz⢮.*UMVܲRXĕQ5HN/=YXL3{,9Y['V)T%:@%c%/ǨwBezSuqyeXTI4!m! _R џgΚUʂ?WJH\6WCE%lV;)5ebSO!ݳ^.aTug}y}}?NrX~q89,TM|_2Ln9O(Q;f_Yə1I!QCZ5۵kʝu:4-?M6nF<P5Yt,3BN]?~jVKE|vS1M\V_C:XM䖥V+)|ݡ8 3uFvhl:*+,&94:I0r(uc ڵk*7Wg z)`xpڵzFw'l*{d>XXצmU1n>\}C𕅪ICy_` WqW\Z{02PY!Q?KhR*;BR k~CT3vʏ(Xq:B}%Ƥ**+%SQnjrVwZC%8 R*Um ,AA(pHl9`$w9-Y,I 9mB5a&ݾ_S\W(EPw8T+*xap" E9< ƍSZ䱯T0$NK=X_B臝Y*S%abV6mo:üJtDW_ke[+01 " TTn[uY‡6CөSxHaNcCT";%ÎK/@:L^e]2.PpQ}_u3](e.~_k(F+ÓPYß< "X[V nF&]߱!X* )/|&T< WanivB }jcWwZ+zMaa"/@\t(wKqQɫwRJ^qg{Lબl/Y,*[l"E3WS"5'KIn.QJn=F$e2.G?=oK^i»J? Zåg"2.FDf3 ,SYfܶ9|eIʫ7 WʟX ؜UGؿ_x2,'w?G7IёA{]TxAۻw:2Ru_I35%J%DOGUǽ|z'f,B)V+Vk/{UY~9?{G@GKH].-Y9u0uׯ_W5sT<}嫁XՓ 3È~ &`.3W壾]$ *Cv#8&su٩+o=xD#XceT*/F03ѽ7Lb|@jfS9V(7x]30U{-ZS݇ܢ:;e/0֡hJ8@i_l8qeX6 #n0p/C=bL.5sgUnjT%nhaC8ы0(:に/^Pݬ[Au ᑛy[*vG?t/b{aMhl"Ea?yPh PePerq.f~OBXe9y:zZAad=Y?Y'ѰtTH(jY? 3c#np(񳘧QN7S Nk *Cs4᭮kc0hjHpuRij}G@I!_j ,aMpt:d,7ˇ=.W8 $TVB "*M@}ʺv 8Յ Ԭéw4oK%Ap6|?Rn3G`APtd$sʼnko K8^_pBeݼjc~g30tg5oK%nq'}\=lZO<7lA@DgT|*YFߏ*G(8 nػ;{m ХQi UԘuNYfl䓌f7 AcǎscwHLpL+`G>Wߡ-_ $Pel(\9jDcnj_Tj|8ɸZjWKXAǤT1z'7otIEsf.e&OU K|LVPff=PoѰ#Zgcc#ӫRiڄ7mN "6qcgb]RJ(^!nQA1HuG< }ot[4ą9L|F_#gJPS[ǔl -qeJ:}άk~WҥKe|!8;;dyyhԠF^]qnuڽ_&ܹS㋔ cNN&RCixVqKW>v jJʺv#g,^>xmӐ ^û cN!Xdמ~V#-\iϝ~Kn_63o#ߧD3]tiȐ!Ʋ^' 3Rá3f1%x2WR/nLHSԜ ֙Fza* ; 0$8kR#W:'aooo,,TRh\R/8.Eui`խ#UiX3KLѭlEW@mݿ0S#100M굥G_&٨CᾁH<Ѯ8ZuRB_&z?=XJ`^9aڵkQM.F6+0N'`́Qfc]='}'}'}'}'}'>'I>DH>DH>DH>DH>DH>DH>DH>Dۇׄu>裏uV\˗/Ǽm۶>ݻcjnf*ѣ/^L蛄֯_ߣiӦ|ͨQפI, `;oժ4rH\~)nɜ,ݽe˖͛7'MH+={&,{.W>ͯ^ G.+LKlnʔ)dXx7:%KիWG:ujkk?*#r wp}YZ}vC蛴# 5a,E b n̙/1?KѨ".Bt0~3gȴ~!~:029@Aa_FgǎIn4_-ѢhӦ }S-N$E@ &F$޽RU-Bc,-ޣ(ng&*0<=z{UC &^ljM5j{?~:!7o͚56mR7E[MϞ=쁁Uu% ~:Wdʕ+5ΎLa?G!0o@iɤ,ݿWp9I% JXԪDzСC%Qz h(i3"V:/# }^7∄Yqoee5iS]/8ZX&ѫf]׿K\yd ݴ}߭arM+\ Kqto*65vSwJ+XkuZtlZo~^KT\T/1 klG80%!zg~:P_ozϗ_PӃRL#5$tф4}t?/n((~[R[QZ7`9P^wefxbOB_s+?̱*Uͷ]**%?86 EW_ârpP(}uW|hv%.{B_PoYE/ryBCCߗpc9ed&d2*@CA˼'N3XЯyq-Źf {8yZ#yP~0PH*HOȳwkp&en[bOs^v?1i((銒VÕdDrL1y@'Ƨ,[RTĎ ZCЯ43?Ŭ_Qyb d(9H/K/B%^T%EpLrA,B\Jvlr:[a ZτqZ;¬—BАG d'%A!`!0|8H 1IщQ 鋗,{c*pZqÏ~Ĭ$l x0gBb iqWn }Зj>r(q/E<!SEC"ArvirNi +|B|œa9EDr>vťؔ1ckN3`zgimzxWY&~~$C{>~c?9 eʒWƕ#+ p@!,:)$*Il*=f?,--띥χ7tc{]"`Q/38yχ_R(G  h5/;QBpDBPxcM^䄾+=d>*04pOAA9:oeR ~QC> ޶w# RB_@:&es>8DF1Gz4p.fq,E~ -Eh7 oNu/LzmLj><9Bz/(G! 4ҵ[QJN1 G`&oDHE_YOpwP0I`iDtZTHloh,YW={Wn]{lS1{4/SЯ+'M2Le@1+b_!WcƯmј?A0J&` @$CF1ß<=f諶4*5jŷYt/[J~*ee*bc<FY)t P^W ÂyD\0;#@0<{0QRUZ*;~Vܳg-% 'NH a-?.Gv޻|ĵE/^=-*J!s  N wP7cɽmVirltK }=D\>"pg.u?v(yoaL`,3 Ó 2`ux-mwEXeՖg_3ٿso}Wf9J,㺼 @y/fhi{];-><2 YxDn)Z[ ,DG.pup|A<Ļ &-)d@*4bf3uTs.Ojc)Zbq|/7BsxFC-Qri#gfҽ1WKj)-݄$'I>O"I$BD"I$BD"I$BD"I$BD"I$BD"I$BD"I$BD"I$BD"I$BD"I$BD"I>O" }O"$ s /_k۶|w}ٲe8:1akń>ɠ« A^V7rH\~)nIClٲy> VB< `ܸqqʔ)5n~UǼ0)9O2]p8~w5ٮ];;gΜ7n۷o!ڢ$S̙3ٳk\sÆ hxs+Vpppq+GGǏ>$# O:oFر#X֭bq-wС\6GvE6mث}Z(Ʈ;A;I&M&ݻwYv-=}4HLɋ8۷Ex|FU=|P1azԩ &4jX?^ֶYfӦM$y@t钆ͯ_/ңXiӦ+W.!4 ڷoMLT V#Sɚ }ŋ{~ ) /`$IƔWƍ"qe<Xzڵ+>>zHe@5&Vܹ'Hh޾}[#05nw貀yݹs'@8yK郞DH>D蓌$jVjX'o͟?F5\ , IIx$ ;$Inƛ&O2!a@>IfRP8O20d$c 6I84O2Z0}xlfd痖W_(%wV~8BdcT=C+X\ZP]{bCO蓴UP1yEe_>{#j<N' 3T8nْSWŻ^3%3gæRz }yL8{'.꘮xW7YE/Ss˒KQ>b!CQ5$ IIՉ;:@%c%/Ǩwޔ|]\^;q$G'IR S57s֬A_͕PQ a%.] ;)5EEaYEA高gH'4'Yg*s[R%TbBrJ%/s^D'O0Qiχ'i/[&((KE3'梄$)wk .Ǧqgefi{$ }> e[kbRԘB.t=x^D2W"(Iy`\9XAW[St햝ǯCgBVBznVڞtm}LZ{}D#>?*/h -L_C]Uj: };}gZD[@-uB|9 gC@ǵB-2ràOKL PF}z}ja C'aəsTGLMJ\zQ\X]TrSRv=ڎl$I n/nwYZ/.1|N\Huy-v z K%>[@D'>693&)# $jPK4v }h_Q ܳw#ϲ&XX4k|uTt{yPJPPDŽ,PG>\A~&<>I9"vN<'?峔|{ǽ}qp<<%\/%TqpGž)ԡ_M} ɏ\ ~Y/PH6o.%pX7o`͈OA-KVRkw?Vvhl:INE&9J%8mB@0+qnVcllNS:uPߧIЅKӁxZʋ*KP = JZ]p' TIzY=:I!~.N-((GT1#]"%8~I-__@7ð?8TZ[E;l&KpOH"O$gН})|_J3Ǐ ,?4ꭻ>IB;m /f ]όir֬]sn@@FsdƧWJv+\pgc"~$@+rtyF$D{ホ%%/E@_]>xEnkfDlmr'vJ+QE~c[1D$zHW B$!mNw?}\zҚrhL9¦LS?](ek =/FypoOß<#Iz}vKăHbYS/w1pmR0:5 6aa{ _x"/7'I;l%y 8e@ h"G0^&8ж]}oY)*/ŋa z7G7B$i3.FNaI|F"֗|.qwq^]_R,I/zWoW O2n~ L,q{-JT>r.?=oK^лJ? q^F}.G3 ;? z4k>IGZ3K.^.J. \3W~~bx 9ЗC(/*BF s1O~>.,p{<߾k?OIؑrRGnH K?Br5sˣJ3C'bGc\ydb!B +$y9C\/bsܿ3O+se9˱Fp?AL{+us}$Y_~(| 7B䑫'.Sq)! ",܏\'L}E ~B@G>!.L'@sꢝSN$= UYl|$m 1r HBD14哛|@lASa}7xF3x{lѲh r>Dz9A$Ćy@Wy2 e^nq\ņr@oР ^pȐ!4@$3İt@ry= 1r*46 ?Ď<@yE˸pE= a9y:zZ6aCpA6r*=1}/v,TS (B:`[9SϠh;]Si2L)nǬ <$3+,$[l\uܵ{+VQF+IСCj!\KW>v kw=rff8B$iy lڶs߽bĠt!=Oyy >=OE#Gh$=!IiRul$޽{$^J'B3'Iz)rӯ/M9>IfȎnB zB$hd7lh"ݬ}D _eZ!I$BD"I$BD"I$BD"I>O" }O"$O"$O"$O"$O"$O"$O"$O"$O"$O"$O" }o7ah鄾2B_*f_}^קB^>'O>y}*S!O^8eڅNIׯ^OcXvޤI-w~Ԩ![w O^ o -ԫMV6,#뛕_|N&-[~:zefҟ~7}/ܨQ#)Bx[W17n<T;9ztk~}o<eW^` c?w ߑ#7Ãf'-ۢE3 q|ivԼر}]zH&nFl־}?okֶmk+Ao!O^nNG1 V\n]X{nZؠ_iwό7Lhh'\r׷;(W/9p`ӦM+-?>zhӭZ}͚5mۚ#Gyoܸbʔ1}Va]uرn+Wsy}j c$=?{$j0TuyUpݺE*6A"^KHCU0>o⫋>y*3&O/A*:swq.cnڴGBs>m0p`^tBO3fΜ/ݦrZt6[!=ƃ`+#R72>y}y}a7.Wx"!JAr-3&ܹ*7e wߐ'oXɒYl!6꒘l؃R7 C{%d({-ݻy}W st!ʄ ӻ?=%o(Yr+P x$go٭[+l!\&4WhmkL%tR_}Ec#C>=6hP?f϶ގk@4`ݤ!Ct¸rW8%y}mn޼}q@oJoݺuRo;-:-#O2;l۶׾k-щ jv0q0 ph.t]F3_cӦ!A^>4'O>y}*S!O^ y}T'O'O'OS!>\'UbC(eџNj0"I$BD"I$BD"I$BD"I$BD}C?y߽Q"ZvDŽK+*T$BҡUr}.5Z/{׮P-I Wݜ+IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/system.png000066400000000000000000000774411506652756400233360ustar00rootroot00000000000000PNG  IHDR-=liCCPICC profile(}=H@_ӊ";:dNvQZ"TB&~A$Qp-8XupqU?@\]]%1ݽ;@hTf…f:U! 29IJw|#׻?S"qMAv |f?Iп \\5e ٔ])HS(30x yqd pp){={Gr < pHYs~tIME%9#tEXtCommentCreated with GIMPW} IDATx]XI6g>O=O1sD1`,AP,f0ŀ ]ۻ0fMT=>lOluw"!!!!DDD(P:+ #!!!!t~z N"@BBBB쁄 Fe>)5kVb$$$$$eLw^/={P̈e bmD X,iC,Yl0/~@2@{ `{ȢQv?wȇ'"$$ӧ{ `!،=lIM]O XxB$ MECffYtm؃׉$ t<BBBvĦNhCeY 0VwˇHHl*0u޽TR|֭4o>}˫q+V̫>lԨQw:s?[nmѢEs]BaÆlEX=0@͛7!!{ {t9}jeǏ5ȑcÆ K֭53gϞ}ӦMc3=LkOĦ" Ɍ+VhD,X`rYt6mlٲEW_-Yd x~(G!m$X=!JMBbSA' }v_Wѣ1`rEعs<裏\e\?~8 ?nܸJ1}ZDsQX0>|gpsss bƲ͚F={ls#/{˜Txqse430*fzV./^,^DGٹsC{P8.|!W̟Ԫr,^\t=={2{WmȑpJK={0߃A qaMl"#GҔ;o_ Gr/E%>^ee,CFt vM 7=}mrժɟ)RT-TCA۴iqcXP.̸EE5޽@bwd{(SFW6JR\.|H/ קkWP9E*}e;ww)iE=68qeزTC"##yf=EsbfCdO ԩɓ:'ǔl=rRrXg lٳkx)ޘU( ke[q`ufeMڜ=H, 0~EjK V-{oݺ)-ڟ|ɤID7A;G8F}gxcFQN8̗/rb~UVlVREWbc~N ٳgJpZSOdBUv!>؎"5j9Ʈ^]}]qb Ng?$~E^s@g>9Sץ% M1Bgk0B0`2Lh+Qm7g>u/Rsүy+U fzaL{H/"n0bXX Az{ A;6ny)sptxEݒ[̛'-,_NR}=`fp[H542]FDk ,C]Yٳg jEt]I`zӦ=d?v=)E=p}x6 }}=o7яPJ9a_Yp!{; '~ڌ6cC 9az*Sz {`s BTUw9> BJK*2ŋyY"YJkun:vY&xMb'0Oܪ`l3TVMh/.KҫQux '{ز={X0?A׮6p _'mx6-Arθz&EY$Q!{h;f nvIgdEhRAz9Ls!E=~.=`իԩSqh#GD_+n? }D}w}cC>kB>M36aҫs#XX^[؃|<e_jÅ0er߽6GjXј_ 0{2NܼYsE;g,t<ĉ^&LU3yǦЯ_?>Y@Ox999Rj2cS J<؂BLfҫQrʦҲd-{3pdwY=@'KկDt/KD$!/Y!%\crdF0`EdOۧI>u!e xb!<<\ʴ:^3?-b^^^z؃gpAz5 fc`{)%k~ 8# ^L% ܹ¯mdO`j?>+V-/&MXW Xʉt* v6 /)X{(][DzP5m[l,^z*Szȅ=u'Λ7M6<fh2mD&\A`]гraj\PD]TĖ%@Bb{ ',-__0Cc!᡹ahǘXd!#"+y)']a^1ȶmX /"* yl8 Qh,o|Wx܆4e=Ȇ=;V HH)H=#{{UvNbH=f8 k+H'b$={ ={ @B@ @B bb$$HHN@쁄"oHH=dH&HH=XM=={ !!@ @BB쁄 bb$$m{ ؖ=~H ۂcFpb۲@ht1#>e.(kg[RSe70Nx @ d"@``A n`=@A <@ 8 $+@ @ { !}H׮]= eE@ =@@ b@ =P`جxO>Տ?o~ݚ&{هddM֬Y3㴈Dc|`.؜= NBYm-{e<Ϝ!+ ,T0qlI }^Aʸ1 gSsFJ&g8dF!]`CP5_ovdj)jqrb$g&ވ==DG 6dakɹW5yC,Y={px`u&`FpD"\!{HpC&eYB`.Ja/%?'̤!Kz!@؃c;t%xở=dJE{ @1؃Y b4V.23{Ȣ[={ @)^A/=d"Ő{ @a&+G|goV۰w3'@ {&رϿ84ɇL;6=d&==z7{=X=ee7K"k\~r {/dҬ~Zh0ad#~KѢ,5 EFFN8qjBB{CBg}6pXbb̪y 7a+ v||B]\/Q9ɋkus^vTڛZP5=Ȕ=ĦM={a'XR2U~m5]wWFo"1bSQgеk_]Zlو={ώ~&_w^{6eǸEq{IArʽzԩSrxboAGbVfO[0=ǿ MJ˰$'d5 oy[)wՆ?"Oكls++W56hϪ.\؃]:z/6ŊK`eE8t"yggWQk-Z,\Dkz{ `w쁍&9Gi X ,YX1 y߾}<3`[nQKRrnݚ%_߿?Ktuu5B~Jٸq<== yI&ӧO졫;]0M=dp,HII9 1{l6ĵk"eΝcBRQ7-[sq ~1~ &QC"+׾d!n,}t.ݦ~KlJ"{`A u9{8~&@0$^TM&DQ"99Ǯ gwnOS2Ϟ ]!+|:|f'3tX;'lL\ Ө}ƚRss"EEx h,_!{c{@*G=dB+2מ a0qv,O?E _@#I?Ka72߃wlENZX|f=!tltS_K) @lغuŋ"#Dx ]\ >O a{=sЫ` O\`ڽ{t-Y"{{d{f͚oVx͛70a7 M6H5 G!3pM8Q7ZJnju\x\Tqk,u-{3f Ĉ 6NH1AA/)'b;S^lo<H˗ْPƌob3hJg , %V 5i.肔ñ;/50$虱A/~&}T:u-{1"^$<%!PP|=ړmbٲp#@NK_Ɨ`xƲ8Dm0?`5. #UP/aY63bYBa耨6Xn{ !`J/% V-B\4f(ݿqQ:ɣ,{n;baF!@BdLܒ_/̓}0(WMd)\&={4{|U36wg{ ! ޻T4a bCItBs={C̫dz7osU]{pp %`b2{ =xه=8>{x=8AC<۟={ @"{ b@+LKl=悽=$$sOB%Ɔ{8gdZqu;o=N{s~sQ8{@!9(mauv>,9@ {ؒJ n`=by@ {8@ q_ @  @ 8ۃN]@ 0@ hR쁄D{ !!!!!!!@BBBBBBb5A6@ 0`&>Lt@ ! I[ @ 1?1ZEV@ BUك׉$@=@ wR'{`@ C A}@ b@ =@ @ @ b@ =@|"#CBzOЮOז-]\]ׯ7Rȃ@?{vOvMkya4o-b@ d::14iDˏ92JmC4wqb@ d ,IHܰ!x@>#<-wN& \\`IL$@ #K5v-&ir{=X#KFb@ 3vfOP5h֣g~m@3@  7bnEWM vz~mڶ XO~B 3 !NO qb@ 8fލ ޑ%s#{ ݧoco " @CG{@̴@ 6upiҤn#nqP2@6mwyW|6lnܸ%&M,A`wXD9䧟~J9{D($e֭wқOyUԸ)KLq7!%{W_} tDi]8g%qtٻwðjM]31W V.Gd7í/'&K_M>{۾cgoo~=95W7II !SH^~2U=Pg޵ԘPpGѡG1ꀐP >P >iӦ?&"ڃ J<>uJO^&^ӱc'8 Μ!@ @b]ㅵ/Lۻzyx`:/vN-3Qͅ w< J{)͚5{n#H8{}z*bFb>&Ɇ=#WB%JTmذϼy!Wey3/Bihᘄb$wGE!u.C>6nޖ:$!-9KG\l֕[)<ƽG+4CYeRn+W=h8+If](FfK3 :0꠰7HEWrxC' dU!@ n=~7 7jzP{Ț-[b)3f{0/@Ȅ5_pgA ډsb_mkWq@@~Yxtm& d|_xb 2f*bXwiy ^^c̊k)P {z{H˔3q`f?{u:p7I8WSo=EWHݧ=\wX8D܍G ,籄q39+^IZt ?PLS͍Woڔ؃%C9 4ڵrzLfʗ=￑}O[pZj3&..N[_W2 {XdI^*T;e;w"W޼Ӧ0k~;aEq6lHN؃p~}Zڷѵҗ_"ghP?VMY]T=䓴:o{ 9cʕ«lٳ~~$+,vYC !,1%)5 ^>6l(lŰ XiѯhM C0#<˔)'j40p ;g(믿⏛7ob/+#G5j`XNWWWon ԩS *W_}%b3!!! 1 ̕+W*Uc[avܙݡGAWN)e1a.U؃~0I;% #0>fԨݺadG hAU 2?QK`󠫰 駟t<5KKׯ_ :p@,mF}5?޴ۮO.5z =~ +J[DW={wRBA >S܎z6&h{hohu 5ky _ B]A j3.Xٲ,B,ԏdz1ʑ_{2vt2V@8!OܲEVӱf+^l eVAaE3mtZtBz76 {lz)`~o%$$Dx?KRA)wT҇wY<7:2|.Fu&nn5:a8NlLc( O@Dל=[YYbٲewFHOI؟ãvVܚrP_-d}SW:=\R.[$* 0<(,gbh?y1❂CUGon Lcgbة8,`ƊO0J9kO5Dʼn4B~ ]m?nbv C:u kjs#X KTo$k)w[9h6mHgx x"!>޹sG_̍6L3W{hҤ eO ⭿] 7BvC` |*Yϯ`D:xz )SLȥK7&%#llȨӼm[鿥K:t. +v8#f]aAC~c{{ | ! ʭ0! uxBP2 Cx=hģ_=H} OP | v ܕ{ O^8t\m{Ow3mA،HJah6( J"#:nB {deVU yj{bcs+ [M,mfU$"hTsp-M> Ic7'UelՎMD{Xbdn=ߠAAQK`R򰻍=e۾};_`V4GU[.#$*% bDx6 S=tC-ٹV8"&遊=V pn ţ|7ρ o@[ o>ڤI:%?>ܛ)fv]9"LXA i[~OA5IuV5A $a vEKsvv>;* fxEQoxշ/ջt%`~Հ|ހӼ9,=B 2?pW>q<=&V#F=kK{ѦJVt~O~L =8pE=Y0t*Y$ )w`(|Xsԩ<y8<>x3.ny6l%#t\YWڵA\@ k _~%ӭ[7{Mee`>"Ec)xox, Pϵ|{.tcKLJݎ[R؃b=}{ɓHPȃ;9sxHȧ GXxNc{ݽ; SWH0<|E XoxbZQ@)`}Bn?çc9)eAp |%VFvRy·h! D,Hwj̙jHt{.cy()MPp(ByKW2 DKr^UleƎ+ k&+?dVlhBW8! m( jp,ǏTE$E"{(Wz;}Cƚg+`s|0+ X=H`R0AP5U)>RVD!MualYE8Dl}[ 5h1r.E>}QkѾgw`Kk?9{֧O LeXbLiĈ111 kc C4 ˕p"HP[.&Ʋf بQ# ctx&ckINNf XGѢ4c, ]ɆxX :Lhu3؍-$v0)y =ė'DŽߒpʕ+ 0f Ś0Kx6"tPR+Y":"GKwE"7'2Rq΅|rڭU+hu\+O {'n*rf' kǢ.7l?eѦ͚ -PgnΛR,gli:? [p&εt9-^`&!"=  `X@c&m#=6{\$h8J3p9.;0E5]vMεغy0?`\`Wg$_kcXqV /?x=G8غm;{K@;7v|W,4#"c=B~`bԻl ('gg{`!8kwbBqR;_(V.~=ґ9n>:t*av0u:87h#F0"_΢•u@@zv^CG ]9εgb!oz 7qpQhXÆ.mA`i5&+.ԩ..tvF 8ٶ]CǣعV8x0 4GaI> ̃TRąw9xmKötk-z#@p%Bݕ$.Pk)_إkN)xB BMlM0Ckpy<{ )~"4Bݕ$sݻwr*,>q>v>3?"篞u>Z_Hw&fDt B, Ӵ:@_$@ {K&sS\\fw Lx,7}/RVo9AÆ>@ ݻ6Xso۾O@΃ 5[OתMǯXByb@ 7:k3lm+ xȈM6u@fm[!SN={,6@ lSDi>iӳ%|=`_0FQ2pl4 b@ ) IRހo E@ yY!o/7Lx@  Dž¢ЮO&Z*!]]w}c݈=@ @ @ b@ =@ @@ @ @ { @@ @ =@ @ CP|ۇz{;un-[7R>yR;Fh ϟ׾_[7pqqrro C#,@N/]aԩcrqwG =}}n܈vHB#s֭4i)SM?F _(rg:C5רQ6mzOg*m/]|y%ebE r1E?{K&=q"+W&Z3BC]ۓ+W|v>nD-|;"GBKjc]z3dL&^z_tXqO-ŗF ;_tM4P|YdV:saFl5JjٶK1sŗ(⤞PCϊ][r񾢫mĞ`Tьmv1iխd81iaɓySxqʕ 32cʕA@64nL4/Uү82/?x_":uaoò|orqVUץq% /#0U;^Fs 1ÚQ ,&*5"T5"|٤}Ab2(/{'0oڿ6XǚOp7k!`3jtcASfe;l=+Yd?sDY3,6`7hJXeR wc5;RjhnE \fJq.%1KllmI8FvX)E3Xhf\]6P;-ufM:s;l fWu`L(Uʻaul:,VeKM"fC]dO&` `EdE{ҟKnMf?mߥqY4QWh!G*L  7-.Y|V? O]FvU)EXhxKp٢ubo~*x8kXKʤY,z-++\-pQӦ|X+)[oAw15`g,NjG]4=] ,_[= j\' {[_^F^-[uܹo~E˖be? \ߦ;/z 1A"T;&Wpk8:`/aaM[>PJmi+-{ipa܄ )SΚ=O2g [/_%`ޑ#T1ݬջ7>u5ܑo0[mX/kΝSW99&k?N ӪaWY{>&A }0Qv>Sv6;Vf/4륿y3qG4P> YN{85*.v^)Ecۢ;|عaC/ڜ:,:}}xC+:r篿)H?p0Zo-2+m 5h51`sW'7ܑo?>aM1,Ou= V~łò<|o E=SyUg(P=͚5 Zz7jtNrJВ99U o`{wL[VɄbzͧ V” `h΋{~jK_sSɓ'ڳ/s~ٮ={'M@)ƒx{C,?~qٿ7.~Lސawc+gaY{rK޽ټUxcO_oN .֤T7?~wAޯ_IA@}[u'诫͢gŋP``Ѵϑv_4x!4l&wmrqm۾SM]JS_ݼu8ML<M!؂". ;nvkoww.p%e>rJ?qr*Iߥk׸+W«w=y᳷O^Aowڗ_}s>6S'ƟӧKltY#E/'/B8RE&(w&an9soܾR'$ݜ5k' 7F_x$ErAk7 T/Q?,`+-;'QQBʘ ڢI}F'?ǐ)1I'?{o~W=|:bh]55%UgL^蟮 M{)",ȢhBis[}bsY;u찰lδ~espLha urvQnTTi(j:W/z&_H W'FçQAO_~$?~1q c')Zlivt\=/,":^("ت M˃!ޅM?tY6ߤ+êkdR?x"t ]ތy bCW\k8& $j[1|XV reM`W0t,{@,e\WXzouRUF.^{R$=`e}!ǏzO rt7;(`KVKܵiEpisCҋ}GP4i%]IZ_DޚhxkN*݇ Did*;,$PI5,OV"ejAF[=(^^9Wm#̼~]܍F.\e0n(*SUH~R%޸۾C-[e|jlCj=OYYaEU?U:b@J4 eѻp%Oc8BoR'N1S{ΰ&CnX郯9-"4J|s.V.IF|+imxP|XJ=8rUӢ[{Tɞe5vva=r%X EhaꂺP~bp6R6<:2߼G$y5k qlU3տOL#.0E{+r 05mTGAxX&. Z 6_>FKM ^f_~ iCQzrߛeXEر?bYs w-:,Ovǁ+a8\ֈW6YOaSWux&sIPA; $yxW;O⮃4ll|TlR2*Wo%PiTK9~`W=31_lrؖ? Ӛ1-(kkAđU2ܻV^Dg]TĞv+:6Ƅ5*k}v/1q!BV*ܼ0\_haYjZlܔu̥soqUif ]Iq^ zjݧW^)cM`Y_k  7_~rYs5AFV6M^0OD+,k+6UMUn ÃE8GAT`"/H2ػYFڂH0OsC4FzUzMO$k&pVFV *2/B5:@.ܰ,_Y=-81yqjf_߶=?gCxXCaɫG fIkcUF@8Vmd]}tϡ㊚VS DE_scin,?svڭ;9:. E@ 銰4BU-&!Ra`",ha{ՊZMEK&$hnlR:wI⅄}kv?|'C%8u54N0fc0W ]T-C<e>8i"9a1Ov=(N^Q^N} !}00Clc^ q]YA7< <^x DDPMi[1 7/^ѫO?akr3M_qSY$*ۂ53Vp.:ghk@뤗 .kmĂ=2Gj|8ʥ;GSسMJ0 k|Ləfx,a1ג-8,crڴر.=өs^t|a>>K]q՚u>\ܵ96lߝh2Yldj$FAP[iEpr21 (RAD%5֡YoLXrWmrnRY6hb0ߘInoXtX#q~nvu۶]m{ۃo~c(3UGBUjq(͊"(ʙx牒>CQ zy˻^}jpA5[ : Y PAїF&ߺKzK'V3 mlm۶c_8HiE9VU}m;V,$#+ V)ZVd iS[Իõv}_bL̓Da|H> Ym¤)7<°,G4-(Q'ɫzɃo~ P}2ѿeK7~G(>b 㒨Q#8F'ƸO~Hd}Y k!ۙ_>y.xt\ &ZIg Q&ߦm[O} "CAZeZn{oӦR@ =[DE?p0Х{;bi3f/^kg.'ݽ\V*גɽ+9Ieo2&ֲQ‹=ݤ4kbF%&w>J-Z.Yj͢iӚ_֪U`2;i=7a8Nٚ>qoau\lepҀE}|qnt/SؽϴR "ws/6m1}{Kq'Jg|m<&,O<}ma9HgV<8}UZՆ ,+ڍۄm=0֮5ԳG^ɩ,%nQ3,ܨ8Uqx9*U֬ng͙Ñg78p?:JUֶ-g{SWNف8KTMplA!=%=d} uWLBMΣWYXBu) X>t|mL'j5|A`hW(E|=ζش}O~=: IZ.fѴDk1i0NL~,2eܙfJ}> Rl7ԞSVu.so1!8d^t'/YyX6 u?gɴƒ=T5ô|E{ТEK~`TFUMOO`X/ÂQj믟bQY \ȃ<떢)8T#]41!jpZt`wQI U4M "}4AEa7D^.Z9Eg/mغk;w8艳^8{!>Iwyx7ç2j&AzZMH6njrio߃Jvc߃t#\a!:u?i߃@|IBŞCo?WS^̌a#VAoT>>{Պ/ƒj rT͈s,< vKmE)"]j参U4{.$}f~e{XodVi=>6nR[M(s!aԀK=IӼp줭."~0vbc8oUuHi4 tVw)z:b|#˯C"j ҤUok8čJ>EҦ|`uzXy ˕_?^A%x1/accԅ8+ͻAhuQV{hHrzpG0Hp Ϊ՟A*ɖ5>. aKIɨ)$si[ToBv޼k^zXo _[\5\*hS8uFFUGuI!Rq,*u>y.& ;,u:[5qVnEkҠh0uؠ:]bMX,!+Zl) fuVN^ߺ\9 ~xdTPnMѬ&%^jKx9j ՇG/ޱjRxz v *h;w=L!#Gu8!L wIȨhZϹЯ?!fΙF6s"pTˌ@xNoV>CML;Bh56QM[3jZ?v̸s.^8,KypO"TaKʳ V9cSyYR4C/sR񤁧cGPMa#^S># ]6-*nl~2>w+ߕŋ'NBp+ںƏМ}gHtmw8X0KZIov}sSE<1]vònҘ/,FYa.i8bJm~x 5k?hF_ r l.Ŭ4Fb K8tu ڴȆ]r 3Vs2aJ.(OxՐQ UHFE?{6Ѫ̵AKWZF3o}+W7E1ry|D8j+<11/&=غ;|sVKmS$ǞGn-^^Pv˶b~Aw;WzUQSI 5eD1`x[G Z*̀<3ff"#zWlcѴn^wуY+W*vHN\w4Q6*`)VEh M#%o%(y¯Md{} 8 ;{/R=UFY7ԫJo#g7>*h՛vS2a{Q^3S9Z^͈bMQZ6,ݰt_{P6ndr9s4EJD<y>!Z05.>|&~{x EL Ơg,W#E(7{uZ^|:e^p[ In=<-Y?~4OOG7%4,gv}ԗ,h٪Mn뮦7܏EpԢ-8}wqu]`I4Cv[(=&L9eksbD._>>K,sټ#Gt[iX&=kԷ ~r1EEѭkWVXK2b7 ulj,fura[qc77Wigr1E4{c{;׮xC(Lk֌*hgds+@dDp nΔ#FXbޢaف{`Yfd'f\pͲ1?cQ@Rmw7ҦGh*7Isq{@7hеkzXh6pk`|PKmF¥V#Gڧ%YkO<8,Hݶ4f hg{=XA2Ud˖Mbo ]zRR IZ8! ' vDF_ڢ biM-{?e[=X n8j..Tl 졋'q^kؚ0E2w|X-駰 "ٜ=WAAcyFf[~I4p{<ȉ^AnsղeBP7n<[iJ=s ++թ3u. 'mZͭ`b !aOc6mZɊ9^5_un_˱ ib`izfxxfй\= ^D,>xP'_h^ E_b[FЄA}v-]IVy!1==KD ab(nÆDӇCyy۰0ɟ?0}Q˗lU6&:ƽ{2TJizKK{`XB`B͚0 -{`6eV T/BQ|fkMJ,,aʕ\{كcT bgGB-Y]``@PuX,V{`U-rBw† ",[ J+dp傍{Lb _9`ޭ\X g`1j0v6#o3*i™3ٲgǻKs.$(ZN&VI4ᢘ(:3R.ZhBPGC {@3-[XNZsCbݶm&}ㄍ #}Α27ȃu",bP{mcquKKܳCCsRLY ri[H&lWi1*\lQM{*ZsV5i^f Jcx0~6#o3)^<4HgZ'B}tf| 4>Pqy:(|*kEM1ģg{٢h/ 3yiOd?]2Y?Vu$k!,bP{@i[Il]~TVF$b |i|Cuh#7\0/ 2;߱9h1xC6y!ڼ-E74 p@,hyֲ1wANTXf FG=hXn Һc#Z\m{߱óF-̘doAW"d A WMe fWLaa"JLϪ 6g _Hh~.T;Q=80{ZvmE#28}Hg{`zl5j`g*3B2; ᯎ`Q:͞ w<`b Wf8;INazC *}Ćf ++\ D(v(.L ̳AZ؂TX^)e |+VmC5m=8{@x- Oa!=~d,h̓,\NjR j{ܱ4SNmF >is,COfe{L]Vn+#:)dl0xJaZ|t; `i#MJի:%̴C:{0#'tas+06 no@ b@ =@$ @ @ b@ =@ @ @ @ { @@ @ @ { @ @ a@ ŖT@ }b۷@ ő@ 8@SJ z@@ @ CHΝ;Q IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/images/vu.png000066400000000000000000000204061506652756400224310ustar00rootroot00000000000000PNG  IHDR01mm tzTXtRaw profile type exifxڭkvc9s,>\Nە]%A P87?Ek UiW^{i3~_}O\/4}>^|Y?^X(^G{^{:Vyoھ>%SR}^ɥ#!SUYw?R^O{eׯ8=ӍT߇8NR^۔+yz%7yS,7մH7uE5l(_krϫlt^viTkQKzv+56މOb;r Mɓ^J\ٛ0ŗ(H8'?^BIs#S[Ak{RB0PH-gK<63X4yR$7QZR}o|6K~](ԪBljCCTQ1ie(ԧN~ÊUS3kmjZ s/t[} 6<{1fe)S6 dkˆ'nm=N:@#Gvr땫nϪ*_jj>ƭfK$Q\7^R9xfgB2Qg''ev*nnrKߨ\ro]mV,ᩐ'5orw.C. +ee+~b!9.:k1[lkXG={u,--{{z=;^W8} INV5sZU!&z>f1jtg{R4 kJy‘rΣv[քDNRL}fʵ/z]wa'7BH]/Yϋ?{d,ѯGi6O=:^`s}MR 4[ ۳yYԓDBэTᤆ=>jS$ߥp_ԹD;db)U$Ej. KW9܈'<)SeRv6Vy&ݹV׉r" VӎT{ x{`{iA^k."\$:Nza6+5$/*q_ ;J} ;Xt;Q*uh+o\4SwgKC֡Zr˕7[rXД{ 6k(Dp~ G)F,4zm֍#57^R ^14p^4.U*k-P8ʆ4X b$QUh` xT/POvNnPxF$)wm5!@g¥KW5 TԹ&6FPHu>\O5q]7,!`&isd&lrKl=-Vi)I{Gwxힼ͂m'eEKKT g;p }*2t-~U(b!k9j߅!if撑]S|f%b÷M JDZ9&:28j`Q(mSK=u"r_dmsJ2nk|zrkn47?#.V2F9dAWp3 As*uUe 9`1 _Gvjd 7綾Y,] '=~UH71.PJAlCh" BPE)u/AМTJ 1<8`+Όڴy1PȻJۭϺrYXЈDGډm !@J2PlS.NH4]~!H[M3j/$~LSET?>Hv _ NI }Aj#1#7!.P27MVyyZtcj~]J7;kv_uj(wO,x[KYF5 ׊ZrѶ V†-j֙p+ez&!8‹xJD+Ћg[bB3DP{EYq36!9Mk#{;c qu\Z.#)$7? 6LN oz)sDIrŵ%t2h)  ͙i;Ht"-v*Y~/W6X.?}{ߐ8]=ۧG7Z֏+%. 'ƅlH1 0_&ȸFJ:/h{P "h U8@9w#-qPgI<Mա>1 5W}ca"Mΐ|$.J-c-[,8_"h }`g/7!OEw:.Ѓ$00c8jeH˞g+\16 pnA_/N:/9F2`\Lp,gg'dwY "YLFu?;@d\}KqopXݗ\MƉ,Rsh埠=wdRR:?gsU~Π^5_\Iui muВ?}&_īLĈY21|@$TzRA+>̹{0xI?c\aϯou>=W_@v+`rp *wxZ_d7(i*Lb|Kmp?rO" /$F2;S!sH,Xΐ~j<0J4fm#N7 #%ZV9)q֘X"Ǚ e%7nN>Clr,PXN̸UZlg@Ğg!ۗCaȑ177FſL@G@:ߜ4f -S{z*LbÚR&|/wŠnbT3Z<T !-)@bJbgy `tBfQ¿1Rx-K"mp\ JnPfR|[.tx,]=̱$fiN1@H9;$AnB3]uaTۿU$ec Ch(џp#0oEiCCPICC profilex}=H@ߦT ␡:Y)NZ"TB&A$Qp-8XupqU@ܜ]B8}eY]〦f*3U1h &3˘$<=||,?Ggaӛy8̊J|N 4R pHYs  tIMEOsPLTE"-2UUU    $CI;77=Q`f$%%q(p79s9;oEwWa    %$&<-f/@4D8;8a@D@vC8DDMk]`qqv .1 24 55-;oZISV#[d/f+rvWwGx/y0{HJ:FGKUVYcZkœÙVb`hzΒYbKGD'WIDATxyS@ Qȡ\(( [AD"Mt3ḯnnIvvLM~ pHPN$9LY'B;DcAF `㔰aM6l4wUm,|:4vH8o-iUol!%#y?u=*.ڙxq}m&8hp$WO>^^>|p\^&8Vm?BsϽ/&#kμo]>{0girv=XnjC?M[p\9"uJkcKe~w +wr;Bh#ڰEZޖAۡCȰ!E;#& 0aCèDh;94rp}NU[h[Tݥ֩ږCy|ZhoĢom[YhS`5p[;twYhS`5p+[Ͼ>aj玅N5z6wA. "}uyݼۻ'|&>-jUُr~Nm'ZV-6VJbG$9Ont!F}NË`4? _w| -P $_cq>nʃEK8nxQA9\Uc\^(9u\FDy.j 5t2n@Gr$W\(`W,#H "` eg8BVRAB&8T=K}BB6:1?%VrbJ)jjUa9,D%XRɥZZ馆kZk@ԨV[kΝ;\#8ȣ:ӛfiYfmWXʫmRiǝvev? 't)fNgXg.,ƫ NbF|t(.3[]^SlTE 2)8$!#q;"L3 oDkܾPjwٵŔcrV-l=:ʌ2_5k?=-,-Ӟ~۲>DDo";5d g;+e*ҌgtH^^Z.i֙(vInCJTH`{3D-,H]y)KNe 2,;Js+慻.1p5"Dn}ھͨUGbf.X!YbM>GOm 5<#dN[pJfMM*ur/F? #oU-RHY#lSX&*y,Y%{N&d8kyzq{`Y"+zz~>.á̝79Rk0K- @[/0`(Ż`ڕ3]{ ľ=J3sbX wXަ׻T6}ך$}wU@ƏJ[e:מ& _ [v$h+L4r! Iq UAsz?-yݾh2J5}oA(6x̨'o5zFHgFX n{s!+[I5  mDž_QEٔy"^'A;Ώ vrc3G]: wh&OW-aLy2+Rk@+ܼ-4$YJcF' ;kX:oba3tʑۄW*f-Qn-EknLn Wj W>QD]{Q 5h)"BYY(h fUS1 d7hGUwPB77eҜ`:;)f\-K FۡputMfWJ5B%s\9 `G7(bL*/j,&;%=l5izT\04+K Rft")3 CflC㢼 >v,)5I(joD(y0U:d-RM*P+ѷ% NN1G&E590%$mQdXEtѬrQz@pA*#N7&4 FM#bԑsI9kGri @ág;bIIf}FH 5T;Z:"l ESj~I13d vct>Y@^VD&\HC1ZOvn"V_($"㼸 HB*ysl%"oO~[T XC:37O̬Ei3AQ9Ԭ{%?!7 AU-4r @PDf{]&lӦUۊr7$S7H`!(6Ђpz#/Gv@f!DdhF8C0mp2B2S=a\)C~%vy(*$+8͵ t5d4R l~֝%_>K':̦8RiEW cj7<3ۚmG(p]\v#7łE³>9k_@cF0kV/U FfO(%bip5]HD?,?̍+ Rs/cd)a&|z}Xf26v(+$ujt2rgUuߛc0h+5-jy9=1$TׄrEν26(ad)[Fveu5G ,qND#T15֕>K[RCAJh(yty23D(RyPLm Qs6Z!=少,55X(t=a;n :ׂV ;RAy"sFeh { VE1.m<-jdq 1Ȉ8] ;0-޻@}SgtBn?a( ـNcT "npd5dc=3%y1H;XژZIh3 ufˇ%=фH:*1b\ŬS)Y]O]$G P $X:NNLan!60Extk/7rd6i7Gd&TG3;dQT6PlebߕV.BD'Y؈CcĬP3 k䛚C&m:tr1XiHep͹\TgȤ'b|%訁c0)z$? .Ər#DJf:^X|MrˀJOt#?Z]_;]Ol{'/(y&yI\a^\²#%DSG`f R5{puy +_8u=G`Px U_5xl!濲.b+O!r3܀l׉h^x:nw'°qjiH0(v6^ͪw?_ IE@azPKԗ1_7/rC}Y\_3|12?=UF}pFie4Q#@#%g) H=^q$ @)@aMh}11 o:|wawH(IC(SfƅtiVq?Пh2CXb5Q"c&tr PGIHH4gc֦1P'o 3(N(,Nce &ĀZ|A2= $*,ߴSҪ3J TKlZτy}BK}ֳ$*H먡8&9z7Tq;d./턪QiIFݳUR YJx5 K;U @ l9«kgN$xO^`%6~dې_s/"kJ|M`?bi 8ŠA :%wH*Xqx|F-upvu(\TODa)^xEO+Q1Hy<2 +CLF*ρ _<2e~l٫tcT4ߵH׻}N@z]A2S Ct{ :\JXEPZ.|w]>tnoU&Uf̞$}o=r񄻱&07{>׼ Ar2]#-5Nju@)p)rtD$J;nçaa!`BVwE")W^bidQPoC2Z9Zf2X$IxYc'Wb &|[و,C6\-ӵR::[qz:h锊:Ut +K|40dJS48 G5*Dj$͢2CZwtd7 fl=) S42%c 7ɣIT$n_vp?g3g]ű  r(gcBWQLyY@UBssIڤrˬZQ!c<p0lգyIXg!3TUk XFiG5FFyFL}3E.Q+k?oLQ]9s`]jFf 7lڳl͹27;ۢTH8]wJK h75x@zГcAdX~juH X lw| GgwT:~#c Y`(UܐSC].T:\:QG*{)7խa;no^sWPN̽b ` S::PZk8ꚰ]}3ϓz]#RU'cJLadM< AƏNtAZte Wz`1Cfݜf\Umb_i+rCRSFȊY ;BAp\eA:䢎|X^ꨡa lT㏶ NDt(c9|[QXYz~GI=G:WUxE KOQ?7"(\; qy )cws'MNWzxl%nM:44u\߆.O!Qk8LCN$yQ닂Kp[v7kάU qY'l ~vFq:=WGms"5%M萄G'm 5Ĕu` +Ѣ>{k*u Itk Ξlw<PlU6 k ^ lٻpܬ2蒾hdx1MKLZ6)y ^a/" A&0OciF"(iuF\vIۓHǘZ:rpC;o bJ ~ @8,rԭ쏃Ĭ!/e,Eg3c)\rf1lG)܍# Oj '1"4@F4A}#%NtuH">Ye]ڰ=!0uU4r"i撯s:/Һ)m.}´f\0Q^g0Ḫ‚$)C. :X4}:~'J,ύX|HO#6yP0Khka$(9lR GE"`1t+>P[o)}j)cڳq>qp$ɠD'f`Ec;:JrNܖ Aaxq ,*Km4q_zGɢ\0N(:vvoBC|Vvy @{<ƔIOJFN*R:;h0PCOR7$RBINI`%!'1^&EfS25dk*MO|TzSlԆ/L~FN\jSXN]NguC٣$.L*!;$0|d+P# (bz>pulE CYi uhPp~آc!EnXuJk0vv>HfA% CVV1P( TnD6#):Cˁ}G}~RXjt\q0Ru$R{ X "DB˛[xbL`DoMԟ[6Qn^ K[].I=jeZHlKpOx=N{`չE4dT'$1JR eA/DvڍTy)?jPӼ&0fWwa|ia( MfsDnYlROfߏbr,=r`%E""i:WՐrtZo*!#Q:$/ҝ:a:~T$KiVcZ H^S{ؾ=Zp~7}|~:q?qz?qz'@qvM`q_XHp1|sDEh>vqX[RWwJ]tB*w GCq2= {\=g8~]Sh\Avh0b>؈ϩ% pHYs.#.#x?vtIMEPltEXtCommentCreated with GIMPWbKGD 4Gxn|(*<ロ_!]WZ xXet-N*A<9ʙ3ZBDS?Ǝ=W<˗ >{Gk8O|݄D7̘ opv<[{#9q[x$=!Ö#sLjѢrrɒ% fO-ZڵkSyW#z\?rH#_O*T 6zޔ-[6#_k֬YÇr޼y luZf$$$P{uA … K.F ;wիG 'O޽{.]JwwA (PyM6ti:u²9.66}!^zsrG={M>qqpjb(;fhOڵk]!AgJݷo<[la@jI& :у;vWjٲa {CrGsվj*[p;ΦMZ߳gO޽iٳgf͚(̋c' Zje$Gx2x-KӦMټH/+9ПR`8ĹDFFrxȩS1`R[p +uRz5䐐שjhuY0܆sioGx*xGxGx'%R%R fMڙ.Q)< 1 `-+d}]K̸*Ȅ[vL GtqF0 Ga-2 ҿR < ԁxqd*lKgT<ys[xbB6 )Ocd*f1GxD*xL"ޙt\,-=^C`&IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/index.html000066400000000000000000000066531506652756400220310ustar00rootroot00000000000000 Yoshimi User Manual This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

    The Yoshimi User Guide V2.3.5.1

    Contents Window

    This image is the first, and main Yoshimi window. You may want to keep this view visible while reading the guide.

    Contents

    Introduction
    Installation
    Getting Started

    Navigation, Controls and Defaults
    The Main Window
    Settings

    Instrument Banks
    Parts and Channels
    AddSynth Engine SubSynth Engine
    PadSynth Engine

    Waveform Editor
    Resonance

    Effects

    Volume and Panning
    Filter Type and Style
    Envelope
    LFO

    Microtonal Scales
    Vectors
    MIDI Learn
    Copy/Paste Presets

    Command Line Interface
    MIDI CCs and NRPNs

    Miscellany

    Appendix

    Writing this user guide was a collaborative effort by the following:
    Kristian Amlie, Will Godfrey, Art Horan, John Murphy, Lorenzo Sutton, Hermann Voßeler.
    With thanks for comments/suggestions from others.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/install/000077500000000000000000000000001506652756400214705ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/install/install.html000066400000000000000000000035541506652756400240330ustar00rootroot00000000000000 Yoshimi User Manual ~ Installation

    Installation

    Most Linux distributions carry an installable image of Yoshimi, but if yours doesn't, or you want the very latest version, then you can fetch the source code from either github or sourceforge, and compile it yourself. Sourceforge is slightly easier to navigate when trying to find the latest released version. We don't advise new people to use the 'master' version. Although we try to keep this as stable as possible, it is a development branch.

    First you will need to ensure that you have installed all the packages required beforehand. You can find a list of these packages in the file titled "Dependencies" in the source code. You need the development versions of these packages. You can install these from the terminal using the commands for package installation from your distro, or from a graphical package manager such as the Synaptic Package Manager.

    Once you have met all the dependencies, follow the instructions in the file titled "INSTALL" in the source code. There is also a file titled "INSTALL_CUSTOM" with information on how to customise your build.

    The source files can be found at:
    https://sourceforge.net/projects/yoshimi

    and:
    https://github.com/Yoshimi/yoshimi

    Next (Getting Started)

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/introduction/000077500000000000000000000000001506652756400225435ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/introduction/introduction.html000066400000000000000000000057561506652756400261670ustar00rootroot00000000000000 Yoshimi User Manual ~ Introduction

    Overview

    This guide is intended for general day-to-day use, giving the most important information so that you can get the most out of Yoshimi. There is also a highly detailed Advanced Reference Manual in Portable Document format, complete with external links to references for those wanting an in-depth understanding. This can be found on-line Here. You might also like to take a look at Yoshimi's own Website.

    Yoshimi is a fully polyphonic, multi-timbral, multi-channel software synthesiser.

    Sound is built up from combinations of three quite different synthesis Engines which, apart from using different methods to create a basic waveform, independently have control of amplitude, panning, filters, and frequency adjustments.

    You can have a Kit of up to 16 of these triple engine synthesisers with various overlapping key ranges. These enable you to create complex multi-layered sounds or small drum kits.

    This complete Instrument patch is then optionally passed through up to three effects such as Reverb, Phaser and Equalisation. From here output of this Part is given a number and assigned to an individual MIDI input channel, overall key range, Continuous Controller (CC) sensitivities and degree of polyphony.

    Parts, can have further Insertion effects applied to them before being directed to either the main audio output, an individual output (if such is available), or both! The main output can have System effects combined from all active parts.

    Yoshimi is a highly complex synth with very extensive control options. Therefore, it is split up into a number of context sensitive windows to make this manageable. All of these windows are resizable, and the size and position are stored. With the exception of the Console window, they also maintain their geometry and the contents are scaled accordingly. Some of the more important windows also remember whether they were open when Yoshimi was last closed, and will re-open on the next startup.

    You will probably only use a fraction of the options available, but the more obscure ones are there for the occasions when you do need them.

    If in doubt, experiment ... but if you produce something special, save it immediately!

    Next (Installation)

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/lfo/000077500000000000000000000000001506652756400206025ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/lfo/images/000077500000000000000000000000001506652756400220475ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/lfo/images/lfo.png000066400000000000000000000512651506652756400233460ustar00rootroot00000000000000PNG  IHDRF[iCCPICC profile(}=H@_S#8dNDE EjVGIC(X:8* nnN.RBJfnxLHgV+0^˘|=l,sn5k)@@ U & ޴ ļRTs1.Ht7y9ɛ<1O,[Xna`jSU)K{2b*JᬾtÈcK!@FE`#JN$|C_$L"r, Z /)_c|;N>Wz_3WZ.\OdJr}S:׼8}RU88F=P_rZZ! pHYs~tIME tEXtCommentCreated with GIMPWPIDATx]xɶECNp[w_݂;ˢA$@ Ĉ ]V}w}ﮞJd2ԙ>QUhhh||$'sĉ'NJ7oV;ĉ'Ndx|ut4'N8q mnPԀN8qA @&Ali'N8qrPIFi8qĉL4ٸ'N89.4'N89.i<9q-H9kV\ <[U5M֭5V4J׬I;zxxt2C4i*5jDtC{g3>̷6eWdϙvBKҨ`]&fCXHk9`@֬wo*εt[XHc-R=g͢&+ (A-XnI8qH4(* ,IqHBma`NHqZoJ6〢ʧOkC=|3m} !S64O_CHg9ҨHtغP Hg HÁXi  iCrH3֙0li8K3HQhG&L1:!=A}kGB'c6փ i g 6 i0Fj[ݴii106V<23JX Wv,CO?~?v4ے͇3iCC|JVy] W&\g;2V U!riڡCFo%Hs)PRQ.8!AiQ9qĉb_?_ d\LnD6ɐM8qܴȃeiG zBC'N8) Uӿ~';i=a_&K/xKƉ'Nɼr m /ʉ'NikasHĉ'i4-M:4N8qHsTH!'N8)ƉC'N8qHƉ'N8qHĉ'i2 el?玓BJ0cdHn;'Q_k6;~'{B+֯_?zΝ;׭[xˑ#у.]xxxJ\p ¹ql鋀49rdԩ5ʕ+*=-w܍76m4Y͉ys˷1>Qvb@P YNi!߸q_MvZܪꮪߨW !Q1Ur lڴI 1mم9f2g8uHViJ.Slƅ,'4`YՕT/ZUUo"QU/wU v -Hok׮p4ĝMrQuܬ |9:w J[eKǂ43s`FfooviDFVTN"#5~yN}۷o~KFY)LUMګW]9(w U(䁛Lٿ?ؖ]!'@yg̘3ZCMc}SL墨+Smd5˔Iisp)rz͞Wruj͛u)StxŅbҥ%U+F|2$'Nd͖-OBm II,@uǬٳ;Sm9f̅FG>dʲjeϙ=[>i8B?_|NcǢS>3ٺ x/Yŋ7%$^\sѣ:t<ͻN+Qju+TwfmU UM4$=n uر#תQ7w6ivaՁ(Cp0S Uy,v0:w|px=B,UL}6rW2TJ&$R>q6UA@?ޢE*V-'gHx-Rd]t4Z|Lq=OzirŊ87sg+&Z B:O[[j۷B EKU_ Ƀ9TZ&T{>n%ɨ;6[s>zOS)xp~ΜD㰕S*(!Ay[^ׯAPRE? sN}[PTTiw;_d` ڲ} |E:y,%SqY;ͺ O¯1S [@N%KdvN:5j{4H+TG .ָ2wPF }ȕ0Q7+4KA_>88[7dI\`%^qV- X+yp6z\]Y& B>O/~\|enK!6yeb* v 2<|l\<ؿ!;Xr)(eNAmHLHHl(#TuڵNR'Vn[pHA eˎ;VփgΚUF(E5 L 5JRT 5-% XH߲…đD9i9doo#Gf{C-[ܹC7׮E<"p `k1Ai ! WSB%Vh sRǤ"B(!GxW&%Γ/'/=~7s/2#4Y,jӓ!"p+#|C1w!h:[,XpZdHL'o!!ԋ{[(]LT#[&;믉̇* sH#],Yȯ$Ҡ7eʜ"^y8f  8Vk֌|?3gRD=eQ4DV!{j%Z @ݻE輦"|)~'/Ϝc`;Z6rtݢ}$۸}o> >w&p7qntbߪE>~xY 4֍C8WJ'4H5"@BkǹMۍq BTB5Bu9?~iw$wdFE_J[(Oُ 2&vY`xOܬ>YT2@T ȤƋ#/D@'JIHQ܄߻%HygC'8t]ˮn;ݺub2}6;#f$W&XZ' B68 d+BZGׯ`##|krs/C:+ 8ҰőDb *)u4!~a)X<H9KM|O^}/ȈD()(A@jcgpS"2Hzԅ6mD1c=Iw@dܺf㤻.\SOFst墵 wGsti6lhpC4*a9ň~$-qHJz;64HbؔRXFՁMH Vd@"yq#=qw{Cu[B!;ّxDF❇ ߺ?u,}a777#é,(2YMCx=ky9IcDEpC4e^^o,\rÇKUQјDT*P9XhDK qKDF /Gn &%+lժo@q-n(2nދMw#vU62z7wrLX;]I>&=[~qs.i2w4fDEpC4A0Ɖ_n#ڊGBԩS'rI Y؍pZR[`iKœOb =AmdS 3(;px]ĻQ w/^o;(%#Ţ;fA@ǻG[sfV1,MRwnL.ޭ]*|x?cZ8HZ0jMCMB2hC4g1 42gH*6Ԏac+BWv#(ك+#"2Da4N$xB}F(*~cS` q]KF 2u-2`B:GӦM\pӕR܉Xp!w.R]:pkQ:SSg̶?wn,v eo[ҼBCI:GT ^@B,ď<2%2'~#!ēV4???)CL zd1g7b]EZj[`qK.%<'pijjH 6yA*܁Ȉ4`p}ybQÝV w CD$6C?ܝa&w{h mls.]%K%Jș3gfE'0-K+vxƃǎ m*UKi۶qi]@L\-b\D ҃c G5)M3Y}1J 6MEZU2~z!bE㐰H6Ŏ`ug H<WcTJ[ C)eh JlDt=*q4<6lHS,jjNMB"ܡX W<e mpsgEbsq5\־}{AkK^WTDbt}`vIZMk7B"㯆#MN,Ec *Grdž5pps׭[ׄrW>nՒ1ٳZM,#Uov?>6? M4|K,Jf"$d;9{x;DJj@dCn?|xr<#X)dQ&GS:Rn*UQǨ鸛UQW iHYz6";އBM~U *$2!J#^HQ|*;vlQsrX,DkQBn,XJ璂9M(qJ$zwH*MnEۼ}'^k];}Z@gժ3o5Ax1pАbl%V^mbu1?p@ժUI.NՈ9R%B rp^7{~;G1|VQOE i18XAWѪQw ہaIH _I"雥+V*dz{SI|H |7<4<1)Aq#Fln?4b>=t-bw._D%IBv0i>wvpsY///'''=rb6OUUq77Xbg ".I)P n޷ӗ:ɋ]{qM&=\qgܟC M2Ԉ9ߡzDusIZ0W-QWoaoR!($U9.] Q@P#&hq14"ܕv;TXԗ{L|lݦ ߫Q`͞-sytVhg2ism61U~+Y C ~q%J< +L6)vxƌȑ#`R3r%* 嶻߈5fЈ;5k+e 4U "ch Ĕ/+Ժ;OFhuRC [wbw>wxć/d6v)ܦ᫆p="̥Ѐ{wOS,9 2ImǮ`͎ܡ" +͟;`(wl3wndB4Pɋ7s#<80^ջO)v[ bW3ۋY3> mAO^|=[ڻ%-\S*둴"^4W! V "5Ŷ^$/?C"a qg"8·DCdxԅkvNdxmgع[~sEjh$;r'c]&ks/d-})OBks1BO߼xO_ H?s~ 1!g[ OxWx3f}%Ho>=687$=.C4<)c^8&P sW^d9;fw2EpVNs k$Wlo :*Bw Kt.yeS|=X*FnKAITך?' 9='l1a<~q-/ݛVU#/Ϛ%9D#C v6;' LD +D@svT#>8~KxlSz;{B[&*ҕ4sϝR@aj尅` =K٢ w>IVFTP<|띝Ūz>T!agX'4/(?)Eca,I`17p>S;ʆ`L+~OgE TP-2~lVmd p@lhqzxh'Ң>X4W j+qOD_Gx /.l#)&/q.yZtmSg=ya;-|9w,YrX䋊'ٶnh[(.'Eu㧲߅N;$ʍ[D~:>j7Hѱ#YPXҁTd|Vm; )sRqe4gts4t_۟$?% ٣A)޼G'4GbUN0Uf(gx鰥Nli]ܻ܌ɀ#@:kuB8!:))ea:.ɒp[R hiE7c6:c̚5̵NO n YVϝrәqjƬyȇBBc@ Oj[h S~!?d<&$RRA7i Bhqp8.AxIա q'/7S6 &pwN_7 /E%Ŕl~߄"7 ^1@DZb9qW`pЈ1,.#?9$} I4}2GwG>ib:y;юJV՛m]ttnX&zuЁ휓O&BY+Zhb%J8&{v, lH0 Vpq "E^'H&+  $bYjJ*8$ ݖ]>D-[/lUITXmHa2H́T=?he UkJ|D!KVp]Ʈ ji7_\f f:MKָu/뫬a ;w*qn:!/I~$:mJqWjB#8gq-SD6=iРA2;)M8s hrWݺu3!ub}||/9vDy=Hr3"չWn(䫤I,G:/ Xf˞Bo|f mвeرlg=1-҄3ȑǎ3o^HϼӧSY11ٝWxF4鲥ȀJH[";Νݹ#\)SFZ} 7r'/\qr$^ hwlи.a Aqi|T9s+^bc$xQ b<I ^X w4*3l6m<bAH8 m›Iʐ1 D -Gko`?c`\rac,j#TX|A,*@Ŗsǹ#wn۶mCN[qS8OI @<,X怡ɧ3|&nQ *GVZ54-itq߿3g \, \;Ν#rrrWYanݭ-`DΣnƢ9#GT^].Fqmn.5W‚قj֮5k" msxhAC , ךHQA[߼O+ N[LصKDD80ѕn:$aݐwbsǹ#wΫWyҀGZ~C7xdמhc87m-9xx!ԝ])3;o?b[We˖NU4[twe`5Vd`Ƒ#o@](2svv6Sd$UsǹwTi)<ƭpCK+yxi'l鬦RdM[uХ;J.kؤxRwH5@uG77mX2Җ֬O 5fF4ئMט%>I-Ɋƹم;?mt5|7‡g%t6c!ߐEʟ.%Uk'`? A M&>6l_g"j%H!>vފw ׳W`:sgb$ JT|(n g"ɳߌ({Ǿ?!'L pNHƍ,anȶÇ#4*d@H)A" sga#GY`$Ab=hTT>}H}Ie\=gNvQ;{43 4F/vuw[("g`I{fdHKq$c;Ν˖-C383.e{P$qb:|Rvc#q=>(Xu_ i_JGN89A/F%åըeJih3U!'Nm|xK+u4 DV=3i8qEs:p(4N8qĉC'N8qBjLj+4N8qRxKgC'N8)k8qĉ4AZJ8qĉ4AZh:u!L(pkePb^+5j|dUI9. p?2,U In@(zT~GO=pUg0gHҥK9o޼4*UjӦ j/B>U/wޝC! !+WU % հ62yPzx؊/iXtjujnٜxe`FA!nNJ`A*UwΓ[9L&t&iUKb0%\KQg}OzVw _搦x{4Ӂz(Pz:&1k5ڐ& eƸ8a`-TG,3h kYaX i !ΐ=^##35)X;Џ-ZkA*4;+$naj@Aj9xJiɏТŕ q :m#@@Bi&D(I1c +WY3&"2YlIzE.KsHbHZ_ʔ<dysk`oԆ4cxOZ\6^^ܸJ>kY6x`-Kz" ;#!?,_< `ٲesqqa˨rH3'=85Kxgѹ @gOO9qB ,7~0!E,& 11F*b..v6Mb(]BE~RtGYF['z5^Ԇ4cxc>UfMHຂQ6P#Զk\y`-Kz" ,u#!-$$B#{\\ի֭{Mz?ou5,_M9FFq&O;$K*EЍ๣ jewh5`-! иIϞ?ک)]Eĺ.>ͧS3'G N$co7r@~(HX64sfH[wL 9x2fS*}J<mZ,DXFB޽{u`,S?eϞ@(c;_ڸq#v|†p-[ܺuo:˼o!Ym;h oAwAI~+lƑ#޴WEA7, C{)H[]4 }Dl]=D񨃝,B Q”Co ̙Af dظ{wӬwoge\ixX?i@>uTWsxG؇ܔ֬!WV'Cya6VƏs0!ؐe6OW(L_eGb|nַl i̠Nţ1C 'ٳ3 2WcB\ "8h \јh6}" ,u#!͛7YppTj׮ݼy󂂂 MRf^xqӓ^xc}R:v8{nݺў5jg H3*QFdi׎Xe4[ H,)Cu.a?O3f 5/E Y8>s.8{6p"XƧ@ AS[3 Em$#0pauϣNHkJaBN 6n޼9GKݻi'r)S~L]HRJi0tVc̚}d'+W;~ isOc lbAHoi n.~$ ];B3(4y'X,A>lrL篁cI3e+6'Rv%h I  r?)u .L/#}O̙O:n;wG1M8qb̙g ӍM#.f:O_j׮mU[a 18 aSvFk5!Au4: i9$Bi??3ObaVR%!!  _jaϬzεc>\hds@`x @c`HȝhQC>:e<fPH)5oAfT⡎lG+eROFLJ#lϞ=E;fɂ2B5͟?_@߿NىK+uɱBrߪI9m%@ilXYL:H߿zCӄׯ_իWoԩ/7n\F06i8qJeNiՊ CZppaV:u>}dqHC))!C/> C aIJ;} 'i!m۶ d0 jF%ݩS'e4 ߏo\Pr寿zΜ9aaa74iҾ\Bz_D p%@9qĉ4i8qĉC4N8q!C'N8q!'N8}4|C'N8qHS\[gR9qĉB!m:[Tf4b8qI[។C'N8ف~!'N8e|Ɖ'N8qĉ'Nʄѻ<ĉ'Nd<Ή'N89($H'N8qrPI| gN8qA @&A-9qĉ'%?qĉ rJI'ybIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/lfo/lfo.html000066400000000000000000000040121506652756400222450ustar00rootroot00000000000000 Yoshimi User Manual ~ LFOs

    LFOs

    LFO window

    We only show the amplitude LFO as all of these have identical controls.

    • Freq. The frequency of the oscillator
    • Depth The amplitude variation applied
    • Start (phase) The LFO position when the note starts. This is locked to the incoming MIDI clock if both BPM mode and Continuous is set
    • Delay Time delay before the LFO comes in to effect
    • Rand Amp. (random amplitude) Degree of 'humanising' variation of LFO amplitude
    • Rand Freq. (random frequency) Degree of 'humanising' variation of LFO frequency. Disabled if BPM mode set.
    • Str. (stretch) Anticlockwise LFO is faster on lower pitch notes and vice-versa. If BPM is set the control does nothing
    • BPM When checked locks the delay control to the incoming MIDI clock
    • Cont (continuous) Normally the LFO starts and stops with the notes, but when checked the LFO is free running independent of whether any notes are sounding, unless BPM mode is set
    • Type The shape of the LFO waveform

    Where LFOs are used in the frequency panels, it's advisable to be cautious with the depth control, especially when using the more extreme LFO shapes e.g. square wave (Squr). These can become unstable at high depth settings.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/main.html000066400000000000000000000327161506652756400216450ustar00rootroot00000000000000 Yoshimi User Manual ~ Main Window

    The Main Window

    This is the starting point for all work with Yoshimi. Referring to the image on the index page, we describe the controls and navigation routes.

    Along the top is a fairly standard menu bar. Either clicking on one of the names, or holding down 'Alt' and pressing the key for the underscored letter will get you directly to that menu which will then open, closing any others that might already be open. This again is standard behaviour.
    All of these are shown below as they would appear when selected.

    Yoshimi Menu

    Yoshimi

    About This opens a small window with details about Yoshimi and the current version. It also has a button that will then show a list of the main contributors over the years.

    New Instance You can run multiple independent instances of Yoshimi, and this creates an overlay (covering four of the top buttons) to enable you to do so. There is a button to just start the next one available, or you can start a specific numbered one.

    Settings This opens the Settings window which is tabbed with all the main configuration controls.

    Reports opens a window showing all the latest commands and/or error messages. This is only available if the messages are directed here within settings and not to the terminal output. Fatal error messages will always go to the terminal.

    View Manual Opens this manual in your default browser. If for some reason the manual is missing, it will try to find an older one, which (pre V 2.0.0) will then probably be opened in a PDF viewer. However, if you don't have a browser/PDF viewer at all (or they don't identify themselves to the computer) Yoshimi will just pop up a window reporting the fact.

    divider

    Instrument Menu

    Instrument

    Show Stored This will open a window with the currently selected Bank of instruments. A selection from this can be loaded to the current part.

    Load External You can use this to load an instrument from outside Yoshimi, using the filer (which will be opened for loading). Again this will go to the current part.

    Save External Instead of loading from an external source, this will save to one, again opening a filer window to do it.

    Recent Instruments Yoshimi keeps a list of up to 25 recently seen external instruments, and this opens a window you can select them from. The one you selected will then be placed at the top of the list.

    Clear This returns the current part to the basic 'Simple Sound', clearing any effects directly associated with this part.
    Normally it doesn't clear any of the part level settings such as MIDI channel, key range etc. However, if you hold down the Ctrl key when making the selection you can clear the entire part. In either case there is a confirmation message before the action is performed.

    Search Opens the instrument Search window for loading an instrument by its type classification from any bank at all.

    divider

    Patch Set Menu

    PatchSet

    Show Patch Banks This opens a window with the currently selected Bank Root. Clicking on one of the entries will open that instrument bank.

    Load External This will open a filer window for loading a complete set of instrument patches.

    Save External The current patch set can be saved anywhere on the file system via the filer window that will open.

    Recent Sets Returns the list of up to 25 patch sets most recently seen.

    divider

    Path Menu

    Path

    Bank Root Dirs You can manage the order and MIDI IDs of individual bank roots in the Root Path window this opens. You can also create new empty ones.

    Preset Dirs This opens a window that allows you to manage the directories used for storing Copy/Paste Presets. You can create new ones, set the current one or remove them.

    divider

    State Menu

    State

    Load Opens a filer window to install a previously saved entire Yoshimi machine state.

    Save Opens a filer window to save the current Yoshimi state.

    Save As Default This will make the current Yoshimi state the one that is loaded when starting up, provided Start With Default State has been set in 'Switches' before saving it.

    Recent States Shows a list of up to 25 stored state files, but doesn't include the default one.

    divider

    Scale Menu

    Scale

    Show settings This opens a window for editing Microtonal Scales

    Load Opens a window for loading combined scale and keymap files.

    Save Saves the currently defined complete microtonal scale file.

    Recent Scales Lists up to 25 recently seen scales.

    divider

    As you can see, the majority of the menu entries are links that open other windows to perform the associated function.
    Back to top

    Below these are the top level buttons and controls. Referring to the main window...

    Stop is the usual panic button. It cancels all sounding notes. However, while it does so extremely fast, it is actually a rapid fade down. This is so there isn't a sharp 'edge' that would be quite unpleasant if you are monitoring on headphones and might be damaging to some audio systems.

    Reset Stops all sound (as above) and also clears almost all settings, taking you back to the startup condition. The one exception is Midi Learn. If you want to clear this as well, you have to hold down the Ctrl key at the same time.

    Stereo This button switches between stereo and mono (when the color changes to red and the word becomes 'Mono'). It only affects the output pair, and is never saved. It switches virtually silently and is very useful for checking how the music would sound on a mono system.

    Mixer Panel simply opens the mixer window, described later in Part.

    Virtual keyboard opens the window displaying this in the same way as a first time startup.

    Midi Learn opens the window for loading, saving and editing learned controls.

    Vectors also opens another window, this time for combined control of up to four parts.

    Undo reverts the last control that was changed.

    Redo re-applies the most recent 'Undo' action.

    The initial Undo learning process tries to avoid unnecessary storage in two ways.

    The first is by only storing the last change of a control until either a note has been played, or a different control has been changed.

    The second is by storing some settings as groups. An example is the resonance window. If you select a random graph, try it, then set another one to try, after that an undo will restore the entire previous graph. However if you manually drag elements of the graph, the graph points will be stored individually.

    There are some limitations to 'Undo' and 'Redo'. Loading a new part, performing a master reset, etc. will clear the lists. It would not be sensible to try to modify elements that might no longer exist. Also some of the waveform controls make such extreme changes that attempting to store, then re-apply them would be prohibitively disruptive.

    The Pan Law menu selects one of three common panning behaviours. The default is close to a constant power output. The first number refers to the apparent level of the side it is panned to, and the other number is the equivalent output when switched to MONO.

    Detune provides a very fine detune of the entire synth so you can match the pitch to any other synth or sound source you might be using.

    Volume is the master volume control for the main audio output pair. It doesn't affect any individual part outputs you might have set (if using Jack audio, or LV2).

    Key Shift allows you to step the overall key up or down in semitone steps by as much as three octaves.

    F. BPM This provides a reference MIDI clock within Yoshimi that will be used if there is none being sent from your external keyboard/controller.

    The System Effects Insert

    Next there is a short tabbed insert. By default this shows the System effects. These are applied to the whole of the main Left/Right audio outputs and immediately below it is the currently selected one. These are described in Effects.

    The spinbox selects the effect being managed. You can have up to four of these, and the menu selects which actual effect will be used.

    The On checkbox allows you to temporarily disable the effect (this setting is not saved). This is necessary, as if you set it back to 'No Effect' all settings you may have changed will be lost.

    divider

    The System Effects Send window After this there is the Send To button. This opens a small window so that you can cascade varying amounts of the effects if you want to.

    This provides the ability to form very complex effect chains. With all controls at zero, each effect passes its output direct to the main L/R pair, but if (for example) you set the control marked 1->3; about halfway, that effect will be combined with the normal input to effect 3 as well as being sent out directly.

    Similarly, this combined effect can then be passed on to effect 4 with the 3->4; control, and effect 4 could also be getting some from effect 2 via 2->4;.

    The sources for system effects are shown at the bottom of the main window, and are from the output of the currently displayed Part.

    divider

    Insertion Effects This next view shows just the Insertion effects tab. The actual effects are, of course, from the same set.

    Here, you can have up to eight effects, and they can be sent to any individual part or the main outputs. Again, you have a menu to select the wanted effect.

    There is no need of an On checkbox for insertion effects because you can temporarily disable an effect simply by setting its destination to 'off'.

    Most of the lower half of this window is associated with the Part context, and is described in detail there.

    At the very bottom is the Left/Right VU display for the main audio output. VU meter overloading The VU display will indicate if there is overload (aka clipping) by highlighting the number in red. In case of overload you might need to reduce the master volume or the volume of a Part which is too loud. You can reset the overload indicator by simply clicking on it.
    The blue horizontal bars are the peak levels, rising immediately but falling back slowly to give you time to see them clearly. The yellow lines are relatively slow RMS levels. The fine vertical divisions are 1dB steps, and the thickest ones 10dB.

    Next (Instrument Banks) Back to buttons
    Parts and Channels Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/miscellany.html000066400000000000000000000123441506652756400230540ustar00rootroot00000000000000 Yoshimi User Manual ~ Miscellany

    Default Banks Updates

    Instruments added/changed since Yoshimi V1.7.1

    New users will have all the default ones that were available at the time they first run Yoshimi. These will all be copied to .local/share/found.

    For existing users, these are Not automatically transferred to .local/share/found This is to avoid overwriting changes you may have made yourself. However, you may wish to copy them manually. If so, check you don't inadvertently create duplicates.

    V 1.7.4
    Will Godfrey Companion
    Cracked Chimes

    V 2.0
    At this time a major revision was done to ensure all default instruments had internal names that matched the filenames. This had been causing a lot of confusion. Also, where possible the instrument 'type' field was corrected on many of these, or added if it was missing. There are still some undefined as it was impossible to guess the intention of the designer.

    V 2.0.2
    Will Godfrey Companion
    Pad Chimes

    V 2.1.0
    Will Godfrey Companion
    Scaffold Pole
    Sharp Sweep Synth
    Sharp Sweep Multi
    Surf
    Drums
    Stick Hit

    V 2.1.2
    Drums
    Hugh's Kit
    Tom Toms
    Guitar
    Dist Guitar 6
    Twang
    Twang 2
    Misc
    Tubular Bells
    Strings
    Antique Strings
    Smooth Strings
    Synth
    Dungeon Lead
    Shepard Synth

    V 2.2.0
    Will Godfrey Companion
    Theatre Organ

    V 2.2.1
    Drums
    Ride
    Synth
    Nostalgia

    V 2.2.2
    Will Godfrey Companion
    Cello
    Drums
    Wood Block
    Finger Snap

    V 2.3.0
    Bass
    electric bass
    upright bass
    Drums
    Ride Crash
    Ride Crash Mod 1
    Crash Full 2
    Soft Shaker
    Guitar
    acoustic guitar
    electric guitar
    electric 2
    folk guitar
    resonator
    resonator 2
    Strings
    stringish

    V 2.3.2
    Choir and Voice
    Dooo
    Reed and Wind
    Dooo Flute
    Drums
    Gritty Shaker
    Tuned Bass Drum
    Noises
    Frogs

    V 2.3.3
    Drums
    Soft Kick
    synTaiko
    rimshot low
    rimshot
    rimshot lite
    Soft Bass Drum
    Noises
    Slow Wind
    Explosion
    Explosion Canyon
    Organ
    True Drawbars
    Will Godfrey Companion
    Rich Decay Bass
    SuperFat

    V 2.3.3.3
    Drums
    Big Drum
    Tambourine-01
    tambourine tap
    tambourine shake
    tambourine shakes
    pipe hit
    Pads
    fm sweep 01
    Strings
    Vintage Strings 01
    Vintage Strings low 01
    Vintage Strings 02
    Vintage Strings 03
    Vintage Strings 04
    SynthPiano
    Grand Piano 2
    Grand Piano 3

    V 2.3.4
    Strings
    Fiddle Kit
    Will Godfrey Companion
    Hollow Pulse

    V2.3.5
    Drums
    Slow Cymbal
    Rock Drums
    Choir and Voice
    Vocalise

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/mlearn/000077500000000000000000000000001506652756400213005ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/mlearn/images/000077500000000000000000000000001506652756400225455ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/mlearn/images/cantlearn.png000066400000000000000000000111571506652756400252270ustar00rootroot00000000000000PNG  IHDR)iCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|Nskp>Yk-:p`BSŚn!Jɝ:I!߮IB* 5 ϏCgnoM੪b[J_.@sžU%|fM' ѧvWWpJ*,KPZ7+wTW-]_8xZ4 w$ĐwDߞ-Ε-\?C Lܺ]%Tr,C}xuGtvj] VEI$b~zmOT%MgeޜU W*2Tei۳EVeYժS 5%èfުCOVwƪ-YK!,IW~|_f}f!y VQJn5o`uOdSҼX9Y;:Y!-L:Ur&5+?k*Ynک,%%fo(P3TUI~;]]}j;$' Q?=Kvyknz/ +ĩHs&U"w}{u#oLPͣ:v*lACTTInzdW DMW-m6U1I,/F_~$)bq>/yWSWn\lNt?yPSsWG^k4]tXyadt&[F<%ѧr W !ġ $BZBq.3I_׵A! $/OO%JHDE!8Te-6I𫟔mXD!e#@$ "A@H @H  A$ @H  A$ @H ؕW<~wl&v[  A$ x$dŋHCIIf$_!Ap w!A",,,..EIHHHjj >H;"A 8jm͛7333ŀ5558G,SQQѝ1翨Ht _QY e2Ҳ{nSk Rmذիϟߵk0t++ʜZFԴy#W!.- _nH0(: yeT;ݻ7p@jyigEO=ZiTYrAԚ5kdw  *-+<^%kc ث7m2I믑 A$H HP6_h D%p~~YK=$(;!O"G2o~1$cFHCӦA$!*_}oC׿2ݻl='(\s@$<,  A$K l&/s` @H  A$ π ^gjjj UNNN? XAb; {ooipas3Ax~3ڤ ʐ!ܗ.}a %LLJԁ "'' 3@eRrXeffBq<{.99srذS򵮶m[7Avvss*ܹii++ggg9+WLl?߉eɾݹ'(/1G0y1pMrJfҕhSz-Ss|РATǢ gv*G=SRassL4] e(bUmErСRټ 5T0f``$*WT"2uQ9qĈTQFM[v,VdLl<rXYeuȑZRlYV٪m|f& \#2a7F7FdD}|}`fd|?[hj%f1cNIa&/yr__yXZv6Dp2kh(lJ倀)yW͙3cX7yZ"uߕyj%~<"#D4.b&af`EF?ӿN!AO ;^z̀$ $ jpX`{߭F!'Okg׫Z]BHJ*$/VNXlHoB[2Gܦ']JIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/mlearn/images/learning.png000066400000000000000000000126101506652756400250520ustar00rootroot00000000000000PNG  IHDR*rk ViCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N2!IH8_w;.sj!'XO?ŜJ_YXX&z+b6L~" NWaQ^i]_*s7MɱAλ[_LaY(߽og1V._^=EVF~Rt %FF@[߿,#iƆ!v~">-eQ*EGzC~ydY>I~PëǘV]zܸaJ*gWCNtE wvwvr]޹P(_|˞0MJ(H|ӊePxkӾr#&YX{< Z*<68#&bQY ҒBJ\Dn\A~I&+Bor4\n>D\f.xT[]0vgѳnVQt7>BC)2G 󥠋 ~\4z_+#5^kU*K> ur8wctv&b17ڎH(Yz0 JF˲X&'k'ouEEjՌt$$`#TY2\lԬ@xojݐA1/O$Dk nE:)Ȃ;6I/Ppz&o7eGB&0ҁ|_j a)r:UK?{uX&9ACDQFN@ P"LuدX܃D0x{ !GB9Hw;% @1:]iV÷{IO{ (݅<K13wB&]0hK֊d-8L襫ǘV|]&[ܨu"(@ 2߉8iꔐ` gҭ&Eopb9@.ͳ44Y04CqXC?7gz$'B!I[M )DĭlBi,|3lRW~u-lr"/JCm I][b68Ӑb6)ީߏߝ(bNЏ` /$b0c A7c0~j c0L?`0~ ӏ`0 _ZYY=x`4D8a4Hh"Zsٳg&I@X`A@@[(---]f5t?|⅋ }m޼J{{{][n3fXt)>|8,A$Ϭ{9MU@wG_zo߾5꬈ 3D?]vP1-[jժ/իd!BCC͛e| )~ǎ6m>[ny⃍/CΞ==IR*j}}}k׮9sfPPP\\ԫp=݆ÇA~Hewd6#_(L>]o˗/)7o $--aΜ9T<F`AAJ)VWX!kb0xS߹s'Z׸ SpA(9E+n߾1H?%%G?]5/[[[<,>~D uK?BFo{{量/6#*ܹsMao;;;um5Cѣ.]B閠eH?xz߾} ={ׯA"J)VQ#|)> 8uVVV}#fϟ?|-d} ~jNU gDd~X-&YS勿M=ACA&}|M(p{wאFvÆ A2! QJFjPүX6.c'!zyy+J41+#EiL޸TQf}4xZ`@_|~D$uuuƎ~b"Q3"]~H>*]VeYf 4;?Hx IR2qk& 0Bw) Å"}xb엚:lHIaːխ ϠE39 h3>|#1^ ꫱ۋ|­{N?JV\IgΜQ{2W\` T2!Lj EP֭\APe0GJ⥑xS)@үf>>iF=A 0qu+HzJRfüGV]dLf O&;;s*8Ѽ%lt%q,0ۘZS/X4g L >`0 Ƥem7;b`Rߊ c-V/LLOZ~: Xߣ{lDja%bՍ7ƈ~3b1FH{S(3v В=*<f[cM?ÏQW~KlQtq:`$2޿( d=]]]=0,VGf>/,StWCPQ<kAE:raAL|Q?$o ;i c2l:}U~/?X:8y2B^b CN'S? Me&Nh"}] ?5H(̡CHtxGt!IIOZcLMgR~`G/B-,Ӈۗ]Qfe$̟pާOGEA1`fq 2^ Q$r8 FpHO c9Fءa.t_%Azf6 x:A0**SF}CcH-~A*'? gԁ  K} G?^ ~l8M%@z\p96M2Pi (t0jX';r8 K۶mY?݃`'!:cH8'ܸqO~b/ʃc8Jf-ϐ7 Bd6~x]qP@Q1}q!#=i w|~` ăC21tf>1ߠ81Y/eX[{xG~pTfQ0+T<]wL!L f0~ `1L?c0~ ӏ`0 `1L?c0~ `0 ӏ`1 c0L?`0~ ӏ`1\3DO:a1,~Mԛ7[_"釾; ǰ`7=,,H]~Ik.]:c;'S66 6n\_\|pBяcrZ BL//ڻ7fyml~>> [oo㢨(eY_͝;{&BmmDy"Pzx{EӦY/\8?:z߷/fvi/+S1r(}=رpDϝmn.rtt"(ܸZ fѭpaN`]]QFOHP={VAA[?~EE9gT ^6ctA9㈯<*b#<<ֱcLQN?5p %=幂~«<~˗Olx7:,ԝhdHgg;;̔44|ZxHI,<͙3vu]?, waСԶ%IbgJJOOdǘһ^.^lvNZSGa1s CG H*j"BFA G1x'd0ă_R釿"L?ualaAbҁ` O-1 c0~L?cЏ` >履b*1mj,,JLؽ\/DbahbՔߛۍ4 5S%2Ĵݛ~ xYwIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/mlearn/images/mlearn.png000066400000000000000000000671701506652756400245440ustar00rootroot00000000000000PNG  IHDR<< #zTXtRaw profile type exifxڭirvc^f\,cw;YExnV1g@ɝzt4VW >??|z_Wp{O>M+?0|ׁ+H5^Q~+O[=s~_b-5}kޢύxn-cB}[#k'R~21]*ϥޓJcު56?b􇯿ٖg{t}R7~w|fsZ}|z(}!}l? |Gm4w7wQ}w6yC$77us<r1=$!;RO;%^5Z3m[v~nTOBP,+j+*үn##ᾃZ|&2X0~$Gq'щ m DLM `yʊZ-i$hrd 79Jr[cˠjʎVʹP?-54J*RK+Vz5Uu^ GK-jk\mXlŪ536z .>{I#0ƌ3<ˬMͱ(WYueNumq¡N>ӎ~ƥn[osn3kYOtcW["NrFb$52Fa+gBQS#DY12Oܽ3K\'o9e~wYbdՆ OtnNy׊59O|]8<,6zm.U I&ST!ȧQ:<3ZXwsIG+HK$ŏ3tn֧O1E㝡#3N͆î#$+bb Y:܅I; ZͲ[fT:k>(a;ȷPV Q)ľ$ZmEԤ 73}C.ofjc Tl":YhFnSN3g\ȹSƗW~C,A o8)L n"֍HĨNTlJIb4SI3(R?7DIճI!n  g_ꢅn-F =YrqO?H;_;@ffsgĿ* ^<y]C0Ai{C]9cAxح<S_XkTdFTn^h p^\AhNusҪ@HUX2B Mg*㩒3+4J?l-$C1P5VrCRllܾKϽP6ۅd&7Pju40Vwr@=θT|T !>$lYօxR$M6y1i +W9nڌȨ˙~vcjTa$ :`-70Vbv Bz~iD(32¬jg+UTsw؅M1!_r.QIRѐXXyH{uD(ȋN-xP] BZ)he^S yUf"M^,71~9v(V yB(N_:(ܛ:ZJ$J!,k8󛳪ЕN$!ÅHh_@-&KB2bG,= *~ʡ>,,yDn)É~'E7>VF[" 0C"EA\ ] ^'O=ǒ |5^ؐQpH%vvG!xEFoU$A-hN(֦\@V9eHʩD{K@P" ʓwUkA"oZm:!tH~@e:6Oi9lꗆ}ꠦ =3 $@KK"BYh:ӷ:QvYFԺN~.:aOVޕ=>w>9EO&e 霌 mj`3Wzj:6X\2~/ +tm0H"fUNNCX^ Rx .Ҏ6.t:@.)2[(! &Ŗ;;X ʵ'ԁd9=9pDՉ?:mۍ Zυ<;}KNwrL [$=w}`̝03)~mPB _6~iX`Ia 9(~tAc_- mႉ}eI3b)b ?v.c2劥]*Bi6RױĄDUʹE2P24[ r;\Ǯ! sLsuCգZ'5AJ=&zaܖHZK_ ^{Nht9M,:}叅y]D~i̙n>,/v:ӧ18oix\++ⅶ X52O-LiuZǵK3]n-h"e}&\@Zz#) H1 KRC"s"~z_PM`b iCCPICC profilex}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N V3 pHYs~tIME ,tEXtCommentCreated with GIMPWJ`IDATxx׽mzM4^Bt!0*"Ӌ`L1 `1Ƙf;!nN|'焛58GݻeZv>xfϞ9sfv9gf)!#"  B3^9ǒ~]AAD-ivAA!Gδ  8y%m&  "÷#"qMҞbuM5鋦'fs-{5z}2e-^F^POUW t?{R%-[ZJMyb@cf]5MalAl~%m?3A(m}LUXCi&qNJ 7\ŀm^3׷ ~Y1ydKjDV5&ǧWU\JU~KpbbRwY3&ADg&YÒ!3!1|lvQr]~~HAݨ%.|KI=8.Af'MJ-LJjfTKG<-5T$gP6^K45&O|;}\oSv|IzsSaٴtTLߖ.]Z&]~qe36 c;b׌bZO^xxSEV0 F9kojvk[təIRrE]+3A]A<ߺ"Lrڄ5WfwٷDĀqOIWƙKGʍLCν8gDc3jڹtdۧ{[7=tI.92]rEڡEѽSFsԁ-3Aiso^)&ߗ6e PWwʹ6wN6-ZZE+iZ5Ԓ4wSzm\<̽4xLJB|ݜA6f2xp=^9+QO0Aby`b-5.Zp~\9ŘfU;̴ܘ nM`M)ʈnRLWAln /jݔlwyG طKKg ,c*m nRNs˜}s-LBG-təIGIټt> siI7e-y}(AT$kkXg%0WFѱMS;|06H}}m<r_eN=cb{֎3oL1nm7);fUcܦfҾcw}6e2̞1mȮXsOyxxhä<.-׫Mvʟ<4)cWj Q4MaU[a/Nd3U^q^;/)NRUKbLwMWޱjL{AكH=5O>%pK"8k'Enhj?%O7uD)&K[2ʕ@">kofn2 lnS\3HSU:m2qgJcϥ {Df ,ymkm;8!C4&xZkCM!mjэ 9{Tj B*O!m_Aj5Ҷn`j B*N!m?xnQA m2\>3g A!'vϐ?xUIAADƜvڊˇAA!3vΐ]\m`  "cSG'  B32 Bti;k2X m m"O<M1ORP!M:ti-mLO&H#zj?ncQz~ϩJ*.rGtzL:5]re?za .\l~e޽[V~s` 6sT+V,_|*T"LfQ_́PMok ߯+E)CΝA4?Z~SNijժVQU={ƪ=LmΝsKj19S;wt\~} V>}={֤oٲI&U}ջwoMHMMմJ# tdlJԌ6gH es^r=t'̳1 mn.rSG5It:$1 p%K 5B7m^:&&/cЏ_CUrr5kt"h߾җ-[feC@ROGٗR+MKLO\KbثW/Mkh.tHٳ):Tަi[9fv%*i޽SI WiT:5lPs4UVmr/ۊzCD]?D65J7oެڵk+},.lsʕjJԾnFÆ ӴG{W&LߡCҜsy:lGɦߝQyH'k׮L͵Tn]E l H&knЁk]^z%M׭[״78J[2ejjԋڰO9^039#XMIw-iy8itTJ!c_T:u+hӂVrk n}ѣ.7fon56ӆT玿DajC3+Э 8Uԟ[Hg p'+Ot2tT*MQ}j@ڂ$mVM8Q79^tYRKZ,4G]xҦ˕>7e=V 5YvʑQ.J%ѥTQĴ{JقٟYtp6GҦCȴl$hnTVrbȊ1j(R-Ӑ괴H/ѷjiߵRV=!ӂTOFx$lڴI_D%ۓ xd:eriJ+R=tmV$i0q :^t|;J4I$>ftg:u,X#NjԨ͚537{JقykޮS+QᛴvΈ.EA+ۊ4i&t2یNNs4T.;KЃQ&[u; [5HdfO7"<0R_ck Ζn3jc,-Sit)k_Ԭn5 m<\i ࡖg o3G 6"r i i{إ-~Q^&L/Gi5 Ή.<-hҠEY::sd|Ζ?h Kە "㡐؏J0.m*طK#,s {iwNGi˩t]HAH[m̙z^U<>-msӧU}Ӌ}V.m{}СERʎ;ܖʛC/_͗zɫV 1FFA"wvYi8x`͚5SSS}ki \{Zjݽ{hѢ׮]3kOSɓݣNǀeciiC6iۼ_4]125cb +Vh=P{lܮ(&Y/Vڎ߼4_(THfZthdӬkJwQJ .}b=ͫvTxqSݺiʩHҖLΝ/_fȦ9N>SMܹsǬ}֭qqqNE&OHIec6aY/iYڹ;wlذ…N/SFfiPyG-Y2cǎo .{eצ2OҦn&O<ǎ)X(Ӑ!ϜiڳFD(Hq{yuy%gWsw[ٶM3OiCڐl]f~kHNnܸ~jˌv*7yBJ</!m63mիj:bDj&*Z%mR%k^Oݣ6u&}?V⸕+*Wv/G.ZTeKmۏ~d3oD͒q8!DTt 䥗.҆~YbF KvFKFK[ZV>-]S5McW8U_JߤM%R{AiF4M3*t>5曋}g']kft^=M{as;X)j#@ڐ6/3k޿-7"Qڂ0MIj50Lԍƴ-_6sLFnO=6OVTrUv#}8W^|2_uݲ4ƴooBb8U 5ܹS_/SƴYL fvåKkI۳o;!Ա^͟?G5jhzٲeg|\ m>oqzn)MIIѕURYLbwJJvzmD͒w>}䇧cS!miiV'iz(QCg7:eEjT'X*ͨ[4jMw^{u?}{]ުkIFiiH\A4Bi 9i3mlmo;aՀ=׺::fLZZc͛"ݣӦM#4|򑑑YOؔ<;iKLLTRDDcɺwϓݣOQl_DAXFoD !m^f[L_7dSrWi˩ tlÙ.B@{yaTToJU>sczMAټ mٽd0*KmN wDG !mH[hlsڂ_s{yẁ^p =4q}}?:\f|Ζ?h_cup] xnH[p'oK)O ĻG_c#ʻG6 K˗{]zB حZڻwoVAO>sEYǭUU ԫ{࿶<@̊ѡCUz_z'G^iӦ|M4ɛgcG Kn?`+_}弣.okzϱcK+JNy;^^vm}ˎo7i[Tҋހ-VnܨV>mXUG}?|\p2HKs[/t>,i|yٮuy`xi6[Nja9N܆۽[ZLHJTlYM)S… !%mݫW^nRX?Ьwo߾}+Y}gf͊R 更٬6~[n>UߵT f[?y3gSt}-|ժr}50ths}ޕI]=>y_kɛ\GOߺ5|<3vG;GEG/>vrZ>Nybڷϓ'b6yzH~qb mڶfBi3/l7;%Җq冖͛7C]BJ>#?DG}ݛ7o֪U+ݻj¼vY{}MUy*_6Mڌibd۷eT+Tht|_ºpٳqvʣXgrZ싿E6l+iG[_DiSP3p:v6l55ǭ\Yl:͚7κlM4qM,CMZQWt"EjƮ{-'OlX+T?#=ѣ (V5W8m~8J7| EJgO҂ߠuVh :)^5Mf+<C޵8yuM =[˗>j=hИ6uj-fzWCJԮ#%m]t־`+Cݺun!5-8p0p駟jΝ;f[ns*7yBJ</=lҦK? sgʆ .\XqT2edU\mc,c70]b]m"Iː'ONKiZ+N?V(}bboVR%sv(IV[5[u)q+^sQC|U]7nf"j֔$Z?Ӑ!Ϝig':KU TK6oy |EKV&$ZJ ivie4/N/YkիD9'F(mnwti i;}i-SL 1mj}wF;?Rֱcf]6Go ݸqC?YM6O"m6stZQZ55 %q{[OK/:hE#.VbUso]ebJILKݤ ӒdhzhlMtUo8x +IGfK^zɱϸ¸+WעU/=qB&\TK YBFڼ/UrMkbzҍG>LjmيNV7 fi^nb_B.IIo~n#Gx6;:c4""B{(%%Ň3~nDPFitM}UPWZˤx[@Gii i6LR%LKءO?Zp;2giS_5ѼK}獴KKsUVKS}>MsٶD)ѩSOKpM46NUPk֕: sO~i7Լ/P3&mֺ襴lb_B^t>(]FTvgVsiG{_-[/Zȷ3~!{[~kK)DnDaL/5vWyrFOc/ˍ6'"<}ZtOwG c_oo!Eup]χ#7"|L/3 -j)TsWL u!m!m 㽼d0*7%ϪO9±^o&\ŀ Џl^w^fCտ%6 _;}G£i@i@ڐ6-y69mA/9A½>pAA.k>gƿ x.A<\7T-8շ%˔QTݣAƿʑ_ݣHAH[m*Uk/aÆ m6m͗/ߤI~w5k,\JkY_}';w.Z=~xN0gifE~޽{[ ^dI8qꝪ_oH+DTf iC|xAo?`+_}弣.okzϱcK+JNyɽޡ^vm:}ˎo@aogwzU7`11a'_*ThݫWVkұ޼ɾGEN{Vɛפ?3F5-դɲ_tHhה\Ye?駁 "H[&MuVre`ofIɓ'Ϝ9(mN:ӟsN7ݻW^=8ܔXb~W|;k֬(%^~7iYQ m׮]-nݺ;J6_:ӧOv͛2]t}-H[US֭WӺHg:]5[I'KٿfLL[ϛg}Xɣ cWȪ⋼U_?yժ!3fh(5Xlo4ž#,XoJ/iRkzåKҌmrr/ "u=z\M5jfP9QNӨGä4-K;wΔ ]ԩeҬ˳f3cǎoaKk{?0Kfplaͷ*nڤV򊑌m?QL߶LJ&նiYE\k^=i.]R?TV~˖VQRhz;ZX+2y2-ٺ )E+)De {իDNLGWӶlqK6fKuH Y}Lø8DͥnK rB1ޢxq*GSNj>-D5pp6Go ;w?kIz]{oܸ?xБs.[LM}. iyLnz:b4EmNŒ]veIL`-"4nFd? RR:5qM\D235*QDuh'J(4ե'NTے|VҚ8x5Pӻn8gPYf$}{7t#36Y>H6}H+LSTDn}뭷t˛7V{06)Z~tDF2eHᕘf-ݣPfViiCBV*ת%qTf.^N Hw;2gi8Qͻtwٗ7olYfu:JSo1%QL\VILTC;L1Q\yKk̥/P &minGѨQߔh=?5tR 5ES "H9/j VkvH98p3I<O~ ߈Gi ˜6GxbW3VY3Ϳ7"O}t(P 222]܈es2RϞU'i+VT*UtӥZgW˕YwV ƣ+iҴ}XbBB(0]{R~ZzݣN_F)ilYTt5<_=e5(c5Si kݻkZ/YFTqވE 9Lљ;wjXJ= r m۶m=W>ڠHݪz*&9SSJJJ.G%iMk oGMbŊyʑG~,mV]1_iS9r/FVIOSS}<5Hk׮o(Q";wO\G2gshiCڲ/mz-i1xW+5qv#=/^t:lɜQ:.܇oJmW>ALjZUo5&JIVVQ#oV>{is,x*7Ҧ="R*]oDpd6ufex,{Vh/hԝT*k=ҦշhB#ԙ({ӳ3aSrߤ믿n߾zӦMO:eC]?xzGẎݣ6evQl_DAXFGRMSjv:Os*B<i2zA -LvclJ*m9U-jʔpYF:af5=BڐD zS#ke]\ uie&;QQ[os.U# p <:6 6 i@B!!<t$O N]g]ChvYP{>Hy#U2{S~ވS4PWY%놊|ש| ~66^zu^ygK%mze X{i#i1i{駍Y=GڦnT;66o|No2cƐ3]݂EuN/E}ifE~6S]R=ӛ<9xNzyI)p76I^QKXarλ̋_XNҖӧK.-?yr3]~ {k7MH8}w)\͚5+**Jׯ_MlVwi?~|BB­[ybŊRy'K/WJNV?抔(׻$m͛7kժvݢE^vͬ=>NE&Ov:JecúqA"jϾ<Q3o׌џ: G/L3S"ŋ[gfoԢb:t_]P뛯9iue[o9./^g+qš5~KM8PK Ξ=I H Z>?/ :͚Y i ui={vk׮JQQ9Q[ S~Cf-Pݣ3w԰6 ({i wO}i{=46fn>0 U˹FG1ZvbZ$v)mV]1[=*)ڵ۷U%JX7K޽yrOI]iB 9mHfIIԳ tgz|۶i;'VnDtY.8=:jbLMZh[وeПY-H) rHhɖ'is4lBZsK Q۶렟nmڴizėR|Ȭj'l.yN[bb"""Kxh=0͛g_oo!o" u!mA m!FofvWi Җ16\\]-8e~-U{8Se]HAH[ؿ0>RֿWD?◪>sBBzMAټri Х%hlýúW!~=#ma!mH mH m m mHH҆ m m!mH mH m m mHH҆ m m!mH mH m m mHH҆ m m!mH mH m m mHH҆ m m!mH mH m m mHH҆ m m!mH mH m m mHH҆ m m!mH mH m m mHH҆ m m!mH mH m m mHH҆ m m!mH mH m=ir̥ yo ȼ B BsrÖ~6iۿ}8FKOp3DSꊺ Kw{<1YdH@iԯ?5cZuE]A. iC+m[\ꊺ;Zm ,Eٲ.y{q]ޕI®}^BE$t*A]H]IV|=ySGժU@ŋih4-/˕`]0׷FD-Y~>/!"[&W'M%(PR:mۤ8z Ӻ2xG)imT;xP+#m~lʓ'nSoiC6O1fB o߾25uTBB i 9i+[TDDTf"%)cwmG!TvM߱}X|fEȟ@j]%m9z i])RX昸o:Gi{u-"”)#M,YpB*_Ilٲe&ŋӌÇCڲ%mS^: N -Z-ϙ۫WTmZO<פٱb .>o'mj=F͟΅Mf~ڦZuY:Oh4MR&ܯ ;'hBŋjJmx.miLժ"kܽk TR;d~%Q}T& Gi=u񣏦o`Re4lZbeM?wmѫHE.LyiǎUƴⳕ+Wׯ=(/lSveʶn j׎ѣk{.M&7cF2棴>TWmV5)IGƿK_ۧWq5U j*q>H jŵR7Y6UUe ɨ7ϻj~#3ES_>6ͳ}%-n1h/7ܫ.m&{j^GTi,]Wi`e6ubMki8Huf+SfQmp-jئWLS˶rOhۥdrEnfLq J̛/\d1Ǯ!cg)_l "mO>9`67"(-w&CV2+gEmΜI29#kiQ,_Ē+/(%}l>qMv&)W_Γ7ҟzK56з&˕ݣCY:vFVZVjDN9r`+)[F'5[^sg6Cdl'OLsȷ,OUԉ6*9Ӵݣ>c*mՎ6c6nSvz QzLk\Dm3tBF-JdmyۺSv]6NKjJV=ZDrrb$jm4Sc˧6˗i޼棴+Je>v7ƴg*H|Nj{=j&sH޳)"*iu}8jWmv.t[4_M qÇUkHmf(Pݝ6ӤG6u\Mi|ێJt^=r%M/f=ތ]= cqc2̞s毅ga;|\ƴǴ;Ә6-mVέ[6ڵLK(nfF?UhZڢt6-m}1#niNؿǴ̮ޱ'm$mTEvQ}T-J7 լURaZ\04Fԫkh)Zz3Z.aS'>SߨnGiS׳>Z,w 5h!W}`篅ZZHѣL޶i=8=O}&-mӶzE=7itVȞ=;ܹZ<swW#*7oB1Kc""LINc˧+h93Z/4Ӗ~M#*ˤ3h$^MbT!M%C,5)1=Uo*tV̦ ro=m5Mۻnsј6:zڙQ0*<ƴ*>PR66s1mRi6YpPFTKF™7M HfzG͚ik9mkkРQ4%%I)?Yze l+ݣ*U{Էٳ'"m: I!D-jQQƍؘ~T;Z]P!N40_}I+oDh;2IVD =B!yjQcac(퓚KݬFJ]ڬ6fQk%QOmM" kWݣ#wJ.[7Ywn8vJ:}e+DL_5)eAV*W7}y|-mH*m<6闆P7 i 紭vR*S^ytChݕƹ,TX)O*PH[xHn`5h#B!m5h@Hۑ ٗ !H҆Pڦ|4DE!mҝ\ڐVp=xSiy{CBڄ.H&}RWU-wtbl ™6qm2p#V6\*m8K8WwiAAa~wαWNKhiZAADhӲ i{'tKhiZAAD1msE>դIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/mlearn/mlearn.html000066400000000000000000000104271506652756400234500ustar00rootroot00000000000000 Yoshimi User Manual ~ Midi Learn

    MIDI Learn

    MIDI learn provides the ability for almost any CC or NRPN to directly modify any of Yoshimi's available controls. In fact you can also learn some channel mode messages that are given pseudo-CCs. These are Pitch Bend (128), Channel pressure (129), Key pressure (130).

    To use this, you hold down the Ctrl key, then right-click on the knob/slider you want to link to. This will pop up either of the two windows below depending whether or not the control is learnable.
    To be more precise it is the change in control value that triggers a learn action, so if you just click on (say) a slider it might fail to register. Therefore always give a slight movement too.

    MIDI Learning window MIDI Can't Learn window divider If the control is learnable, this action will pop up the MIDI learned window (if it's not already visible), with all the details. The MIDI Learn window

    In the example shown, you can see that learned controls are displayed as lines of settings, followed by a description of what is actually being managed. All controls are then editable, with the exception of NRPN numbers.

    (controls)

    • Mute This completely disables this line only. Bear in mind that if it had been blocking later lines, that will no longer be the case.
    • CC The incoming CC to respond to. In the case of NRPNs this is presented as two hexadecimal 7bit values. As well as these, there are three channel mode messages that are learnable and reported as pseudo CCs:
      128 - Pitch bend
      129 - Channel Aftertouch
      130 - Key Aftertouch
    • Chan A drop-down menu to select the incoming channel to recognise. The last entry allows all channels to be effective for this line.
    • Min The minimum control value to accept as a percentage of the input.
    • Max The maximum control value to accept as a percentage of the input. If Max is less than Min, the control action is reversed.
    • Limit Normally Min and Max compress the incoming value to the range set, however if Limit is set then the range is unchanged, but values outside will be set to these limits. If min is equal to max this becomes a switch point and values either side will be treated as 0% or 100%.
    • Block This will block any further lines from receiving this exact CC/channel pair. This includes all other Yoshimi controls except Vectors.
    To clear an individual line hold down the Ctrl key and click on the description field of the one you want to remove.

    Note:
     You can have up to 400 learned lines, and multiple lines can respond to the same CC/Channel pair but performing completely different actions.
     Also, you can change the Channel number and CC of any line at a later date to suit different control sources. Doing this may change the display order of the lines.

    (buttons)

    • Load Opens a window for loading a complete list of learned lines.
    • Save Opens a window for saving the current list of learned lines.
    • Recent Opens a small window for selecting recently seen lists.
    • Clear Deletes the entire current list.

    For any given CC, MIDI learn takes priority over the Solo feature, but is itself over-ridden by Vectors

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/navigation/000077500000000000000000000000001506652756400221615ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/navigation/images/000077500000000000000000000000001506652756400234265ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/navigation/images/bank_export.png000066400000000000000000000201711506652756400264510ustar00rootroot00000000000000PNG  IHDRLs$;iCCPICC profile(}=H@_JV !Cu8*BZu0 $).kŪ "%/)=B43422˯WBef$) u_<ܟcP- V7, My8ʲJ|N~)$<wg2@%wD@$ZcĈСC>z/RPpa< ̚5VLVZ%''tMcȑ9h3:ټ\WUVa]SRlY[3P޺aÆo}%oŊi‡<'ׯ7u۷r7>}uw :թS'X]@,}6<<|.P#jժy٘|ȔJm͠Cἵbҵ<鑔P^2G ܧzjݺuFFF޽;h#9beg<@)C8-\t 7n8uT5jdeU0%w;XjElnĉ~_mc 1U?Cp%O[ر#űV:\GVL{!Iҝ! :7Qc;.>k sBkݛgRy[yNP#y䡅.'\ڴi2y 2uWm U‹ƍOR_.B_%#C]\e;v];ή4DEE䅴G狦ٸȂ䥤傫Wn6~[ΝMM6K%VwRu;5e3{W yW_r],JC5Қy6k„λ`4%K۷/:wGT @<$@<$/=QkJ={qsp1h\T(<֣9r<Eɛs)ȑKׯ!ypӓz ypu$x[H yHHHǁǑ%I&oίǑ?$o]tinivނ}gNLL(Zh 4h0|}ߴ@`ծ3Map$ϏժUKrW^yŜUdԩS-Z׿iA_$ A~m M˖-Ss:]#jŋ5###ǏbŊYf 4|WRWCBkh.]jK}nMիW{W^{׭[L2EtMӦM/M֭[^NϬy}5Yrگa-ReuT l1cƘKImaBB)<~)IJJ2%j?߶m[ 6֭SaLLLxxx||zY{qٲe͚5+UQf)S| eYn͝=zBbb#JjڦC(@'_(0˩eVR%ܹӯIbQ *yAOϬyڷo/SkeQ2H+VѣKM0m8fl޼]n4~׍5t˾E.#q~ǖ_d__-뮻(-[vÆ ZдiS;4V^}խ[J$+~;u>V[o D/d`AOϬywՁcmڴ1cqGMrm޼رc]vM+M8ы䉪UjL:zj=5bS.:u'߯>ܡC K9Ҕt1@7KvאE1lSҡB/_Λ7<| V޽~'ʨ;u eIjԨ!)4uaN^}gXf21UjFBe 5 K6[lqJ^$OVg~P\<SASR3һR^S( M$/[.~LMatL!y7|zyݎ?O[MJ͙3P&(fT<˿N4IXpa{ÇoiKU;t:+y y< mP]>g3boY7L$Ku,"y|)qi2ɦs΁%G}G7xËs=Z;W!Fù&VQR(Ȓ7vr-p;Won '[W$oƍ/t&aaaZji4s<</zÜ+oKM^8p 5#yPT2sLO>ιs|lյΛ:ӵf93]+{vYy@~F5wr\Be}k?]k"hA; /4w͐SR{+߲EX~gr{iMRldBKCֽ{wlԢ5ٞڠ%OhN'K;ytܸqvM-8}tYk/ dر 6 M$uԨS?・H=o=Zzcg]xt䤻U>7}ŭ LXk/ ˢ af >165NE+X'S?BqqqqgMË䩑vA[&w~[}tssV)SQˎvSn5˔[5.y;vplю={LC[fENu(#kr_hJrͩUmܸfJ*W+א ,]~8 ϵ۔UM[wYȵ̙3ymǛG7˳S ך-YD_/ͷ]o$_kH!yq y!yH yHHH*&yO_8%\:49,y5H KDthx{Yc'yI;^%?z\#7<<ȳ yH yH<ɻ9 yl gz$[G  og<$,1n&.ҒT~d'[ȑ#3Eɻ { ,ySw.4e9r`ܕT(`x"yDr@C<@<$<$III߿?!1Hcy2j=}G}!y*T(_|6ݻywyO?|g[_tin5ŋRJ߾}Ϝ9 yHxi[bőjѣ~'ylɒ%sSk׮<.y7ۇ y9o>wą"yo7jjѻ;R-\pF͛77/[ ~U<{.\8Iɝ}ر/۶m3%͚5C) solزpX?|[om +gËj){9Zzk<)i|sq((Yiʱv1'+^"Hxrq-;bԤyjiKURSy`1'O&n)g={ӧY\lTREY)S⋐CWÒ%KS&M%J;%oboUXєK*̙S^=e->L϶n:N9o۶nԠA̴FhѢ&MÇpႭ0fs:h LMI~y3u{nL-Uy$vwJƘ:TkںKz,)L_R~Y%Jt^*\|QS8ey+8ysL5"yBq5k 6̖СCmO!4XGiJ Iz)C֮]k~~7]':wlJ< @hfxWwqwo֭v _[t9>UVݰazj7p@+7oVk׮ꫯ7q$/h<'O7x񢭩j|ϓ*,wN:k*ׯNQ;9a2m ߿?v-~\N!2KwTt糭Ἆ53iJLatLY:+{ZAS8h 祔̵"Tɓc4ejLRR<~ԑHL]Є4rcBwȑtS D᯿jfJ&駟R);>Y$O>k6zuJ.m lR7ᨅK4NQ(yR`);>mڴ yAl:8J^ڠ(y?{noԴ̺VFq  J]$=Iψfm) zJ^`A3Ljuڃ~%O][e#yK IT$Ϲz@5S(sK?y<*1%HJJPwL 57`03,^ػl蔸"ysoV咼 u\K+L o%J@vrrKCҖ\WVj\;'OI?mvNrZ:v 5'2/p\ٚYDd$w{FatLiM|EP]ZߩvN^j6%?}'|e q5v؆ fA>cEv<'  e9w]tQIk9ō,X Nׯ?{{cK^c)Y)c޽]xa%RSVdҥmWHib_nl3<ؖ(j1vEE%O._l3zygfsVnvھ>y.4u5%N,,Y풼qrq~Be˓޷P<vmU$yWKY,H/I_WlllVٖ:fЉީ$O![(f%[V+ /:m7hj0S&; ck!|5`u,HƦZ:?2g)g>鋷%k*+G\ͳVeoJZfȾ VME FKR VPۭi2-<3m't#uN6ޓidK׶vD1St*$KM%"VuGr`mIDvdU4QAM߅^]{i9jɓEuv䥦mWzuekslfW߱!!wC7Z iUDڵ;Y8<$?s|Mah!y~0?d6o<hǁ!y7$o '^đ#JKPА<ɹ9r`I`HrQ/';b$HrF̿G ra gWDޫpIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/navigation/images/bank_import.png000066400000000000000000000133061506652756400264440ustar00rootroot00000000000000PNG  IHDRK|7iCCPICC profile(}=H@_JV !Cu8*BZu0 $).kŪ "%/)=B43422˯WBef$) u_<ܟcP- V7, My8ʲJ|N|@Qx@-^8BBBի׫Wkז;r'O{?sL pAUJ%K۶myT5. P /333++k޼y111f$))+'N:ErH:u۷oW%&&FDDTVMѤIѣG{^m۷ ٳѣG}޺u봧9q8sLl۶wy )Sjժf͚իWDAvg߻&@mڴ颋.Ҵu|||zz{.]%!uzGڭ_~ZuCu}z͛!{(Ŕ5fD5c曽E N8JT9wKII)1E}Yj՛nqcǎ)==bŊPm|cǪ؜#*W79TTlM6PxJ{^Fcə;w8p@:=oWH޽9sܱ!,7TYtiQǹsNyNhm,d.u|+**JN:AtiD'f͚e{W"##N#|jA}D:Xn]32b?|*աaٲe:C @ײeKesgM>j>u֊Ql̹*G߲ͤ\3ho)k,N^S]%N<nR%(<=Yj<>mFcd `lljJ;YiP[|ʕ+-ZdOiRf &Ղ: 媜Ν;yLfddx2tj*+-vay[vQJPxfDnC:zS]v/eXjJkiPxB-fPߎhL ^wufDEc3mt NwsX Ͼ\}-[nl\b,=9Jf̘(5ѣG) O+î*p%hqrzN}AҖfz׵Cq7>Cg5kV5.(qi7ŐU6iiQ+1x6lh/8Mjپ]缟_PxұcG#2Ç> LJWZ}ۢE^^pfsˢV+<y~߂/+ƍ۰sж2R(<EiPtٳgKVGw@$% Wp3ئMfz=ZŖNF_ժ@M3Mix\ͭdt$jIÇqC]x>> *6(<Px@Px 6B[x OVTQx on[mxFʰVn?VCq6 Px(< Px(<6 Pxl:ud~w]wPxlϟz;[x}ѲzoYdIrrrXXXHHHzڵkw>|BgVlM<І'6Ճ)K/4?г)j~ZfMΝ#""t-Z3gm@ᕸE%%cmP O74_.gBF o߾}^Nb ؇ux6zL߽*zqS͜9ӟӱ̟u`~\rDyW_}աCy>&^ /vOpl݄ջT{nSRRȰaGPNm۶iBjj\l=3j,OavxYcf/>tbG ,0h7cǎ'N 0_vd_~,YfSxҤI}&sϦMI&qܹsO>}=ƍc'Nhv9'xBgC'OlFm@ᕾd ybNfNtzfϐ+]Vouў:p5yٳg5禎X͛>G:byx͛5ybLi_8?k߅ ]ܹs4mOiy~A-]Z== guջfPam@ᕲb~ : FEש׭[7Uo3_{ntҥKe?<<ᄏ322UV=v옾 />}8NSx:Y<}wy?axe_ g+[x(si!ܩw UOG|  믿g4_i&^e]|y>#ޟ»=gi5< 8Eu;DyczϷ \xfq̎yγڤ\b3oP /''GoR7ڵ~7ejմUDv:<ϓ<<ѩ'|:dXE[~}G/3rW3+4pBȑ#>? 6ZZ:gi] {,u̚6𜛪=f\3M%M,HsWFEVYZ@+W]usc\i%vDWiRkUl̖MA1ýZ/-Y{P;'J -֒ڠAJ sOlCS71hg OtDOvhzz],fv*x@Z1}xPxyw{#iڪ/")9uai5{nJBS:ՠA Gx "Щ/͕Pcǎu]Ufo b-qY۹ cc|xQg/?>+n): ަ]O -E)z? ږn8_+*߰3&.~U\x{um㱦 gϞt/CĕgK_mO?ݽ{NѵmVwB.hz ]Ƨ)?.e՛رTE%&&^s5:>GիW5T:gԥXduc|Ҷk׮:N>L][smY;N *Absu[j#Ztԙw;ڥ \_3,<{9U;=Cgo@Yxo-[j~S֯Z>6Wk(< Px(<6 Px(< Px(<6 T;+6},J*[(KVx !5઴HH.}<,v^ڹq3fzfJ<2-p>p]KF+yIČ,\*ߨ5W%wn_bm;cw _:/kyQ3oXSi(<^ OȢ{n :9̦6C9bџص@j {aܕQѱfBjg-5uu(< /*-~6ؕfG<*̝}Px(-M4꼛xg/yxz^ +gJj;#ʜ\wTrq]DZױky˂svI7{de9|agP$<7gPl(vA@ $<8?~|X=zPaÆ7|3/=p,X :v옞[jˇ*g[T g)Sf!΂;Z  o>}1cԇgJJ.gϞ-[bŊ9s6jԨh&s_1ԔtҥX$'/=zTӈKzC&ML=3hR/]s'((/.}]~_>}4Esvޭ>{SK*ƙ֭)}u. (9rD];0##C?{lukݻWH-[:a:fyf~xWG*U5k\[nmJ"ᄐNnU=c Zezu]IlԳr=:\Ey|inVL$Rz^"9[ۭsz<ہ1ŋO6̙3Թֲy԰O J?L-UKNNVKnY#u&B}A'{*v{'LBL^۠AUҏl7"σ0s^zx)<6yxN7T4Ptg{χzȌ\/P!`e>B'6mOi v5ׄm6͛77Æ Z%K,_\viرcޫlնmrZ-K<5 g5=ᩡ|n;`gM5~A* 3M4,UfYs~7lanЖ׵f 5NׄЂ'<)[A#eOSd1_h ry@@c7vٰa\q³]:SEC-ϟ*PЕ>l>P@)w4k Uat;*ٹ^Fi&}5k,X0zjժ ~ Hx^mݦvȰ%bbb os=7bĈƍŕ)SF.3gΗ_~iNܹߞ=ްa}֮]<|Bwܡ'WE4[Nɓ'[))F'Ne˖=>ڵkWk\_ݴi ccc#""cϫVj۶mtt~f/W^7:vz-W>bt.}nzŒVoV_(u93&ժU'eee pJ0H ^Xֽ{w~߲P+Wرc>1cgS3_k`vΌvڹ:͵_u˖-'={WS9N\ZBƎ%?;mJJ-ygzu׭ /N0%*Tx<3ꠎ.]̛7GkԨQm۶?~O>^옘ʙRSS$'|R&L0%={ PMHxOxrke[bV7%=_SիU%Ko'Mw^SGi =̙3T'RQRR9gxƆ 4S>?>kke +W6۷ow&< zIxcuv4?tlst9AϏ*BWW%>aMIsMaت%?uIUU7ް4@-Z Mx^.w?>|8--MtڣG/-q.Mѣ3ل7/ OgSlU9&-#eˑ΍-NxZwsnfvْ>S#l / oz4馤wށݏ|}F/7e(NxE3}B%LXM.7uj쮣qvʝ;5Nig ӖlXޖ-[TImk_if "VsVD4M'OuSOAoUh8tP1S-w5ojy'lε_Yk8Gi}Yõ y(g][m /2*ƆA +V)ᣴfV8_쫮ʹB+-DԖhV(͇]b#zi]/xfhU=^Zh?AdB Cqo߾vٓE'۠M :{#SN>:m4Xd̘1xB>NڢEs$%.ӱ+næ hԬęas+-*UGW͚5}6y7C]_'B9gVFlǴsTxyng'Ϲi/bNσN5j8j^wEIe;OTϱhݾJ~?U[viWT8^K̸+3O䄷{n~-m <`ڿWߺw<̙32rۿ: W^W^}gvR]ӦM5M-4OC^ʪʶjJj׮}yh[n˗WUۇ~xcw[)Sj*6S,oQd+1rccرӜDGy$ XxԬV:<<*RrJ۱9ώsWίզ˷Ww<6=E=WjHxEp&_-[r~hQM W2@# G$< HxG$< 8Hx'z꩏9 P2鿼"Aě?qҡz$<l@ y73!hS(#6g, $<@ Hx @-Qctj%$<E%e{#$! 7;=k#$'[Or  ( P$<$<$<HxHx$<$<^>TR-,,btkxd|꒰\$oB@# oŶ |V9.^$<5ye+T8ѕbb{Ш>W\vYV[h&6\JnzA9% <&u{{"9UiK6w-Wf6m+_!LD\|=/\qa峖n۰iDD*KO~Vtmd]fHxHx.aߣJHO] ^(X!cK*_2Kj'G陧jLt𖉈|sOәvS,iѾ  }x:zM> O'8YM\Ηʣ&͝ xf?Iз \\5ytɐ)@_(gM9`Ys:^nC`Hۿ5r4d pHYs~tIME9(tEXtCommentCreated with GIMPW(IDATx\W{^""{WԨFQآ{ED:" b1o'{uuewvfzg3g=;6Qb*TT[`*EۭrzVZ۷JMb?z^+-[MLL`(qƳgϘRϟgdd˖.R"<:.\تU2e)Rip 6U*_~e-BomviV^iDDëU,X`%>8q0 Fc۾{+V,T40)5^._|}m)]4>O0ԩS"Xr!!!. |AժU (ٳ˖`m`l/_8p`y 8R5<<|ذaݻwR#FA͚5@EC)ʎ;qРAG8q[n]ey]$'w^^^kR,NpJ%-[[СCBjA՛6m˧ŋbcc=zg|Zȑ#e'XSLMyW*yܹs-^ԨQ#gggY V^iLLÇ?C|P-`%XOTk"$U::=zXh|[Di||<9G.\ O?LXR`cJoZZ"0NNN F RE=#3g(Gp^R|J1cA 4YZv4K)ǿf\ %,XlX5F*R_x:>6 .]T K)+W\A—pttT"aXlR #U~%K:l@p$::\dIDZh|<99Ν1`;wN(M3Fa_~eȐ!۷5SFiff&etX[nb4ɪFe?yyFB#sAcԸq.[Xͨ2bӧOG-!Ν;;.mذjF,71[n׮]1f!pk# 6aXrQVC0,SӦMsG4iGSW^X1 9b4#pw%mZ,<|Tʰɓ W̘1>?rl)O< qA( DL,nRpWR1UH8j$XJ),eQLD0LDWy;& IU*5D8nΦΗ`s.d|9_^\6_3O,Np^J`"&`"&`"&`"&`"&`"&`\2Gί#`F&@PƍIkUPaD0|󍯯ɓ'NKD05se7nDn4/[,Dt5'i\rSsfJ49n86$r44 FSj׫VD~]ҎKl+`%`[ ߿I&mڴ9mAf:QX/dcYf!KKj[ Q?תu_K߈E߃}0]\}WDY~0 rww^r%$X?V{]+vp;eȉlm˧`m:Akanh,B|&5^*Ut'`c< Sg 4_ڢuCaD0,\9<|"?zzzbQr`ZK6C%KKE>UE)_C}`P׸rX0  v;]xΝS'`-Q8!`em0>Q-xJ" R,[H0kC]pp5Y/<'`\M|pj֬9gf?B3hf.2vp*L8

    >>x|| p}dЁ[wV 0G1@ޥʖ[hTp8nQؙ9Q$ù\hcx,eRִ6mڄp0ۻwo4H"io uff x߰1>ç}i8vm58{ltm7jcbxRKma1S|9KƍCO`oO>alws_`yƵwؼ^{+gQ(`m۶06X/Tny`Qgl 蟁-goca1Etٟ9 |"6#g`^x@eG׭y`{%\-.M+Z*U`tQ1ngM9l*܉:5ߨIz^$-^Tz Nȋ` 8Q'oVdAΆQa}m8vݻwhDN2\=B!h<EXTM0*9xFn06jƠM q6&-I?sL^)#{MG8NI# HFt_bTYSDeӧ<Ґt] zu'BD#,[V[ PVkD0)#ǎ.D x07T<D0*D0LD0LD0LD0LD0LD0LDUMn FQ50(&8WyRH@[RC6j|mՔ|m)%`"&`"&`"X)6ؤy#^Rj_bF!X[W2`+PjyEuJ ^E9v]BW[[; VRfCI02Nd]/+F*խ9*@*Z`vjD0L6&L6&Ld`d`d`D0L6&L6&Ld`"8 ̵ T)+l0` & &D0`"l0`"l0L &`D0`D0`"axU<`9IJ\s=<+bsa`"l0L6l0L6X4"4'sd9M=B6VD68z5`5D5`7V"l0"`D7b[sKp 6^߰2P$4#V`W`mjUlj% ꍺ &ߦXVD0@0`禉o%j!؜~+`LD0Ń`"l0l=YF[$~ v"m0:emN &L9d`"l0L6l0L6l0L6&dd`"l0L &p=jWJ6l0``dd`"l0L6l0L6&D0`"l0`"l0L &7m+ѪS`d&&L &`D0L6&L6&Ld`"l0L6l0L6&ͶPĵ Ul)d&?&Ld`d`d`D0L6&L6&Ld`"l0LkК=f`d&`D0`D0`"&L &L &L &`D0`D0`D0`"6˰B:EN &L6`"`D0`"&Ld` FaoX 6^ VRf@P m >"LU&R"~K[jx,R^oiK^m*V4,R" ֊QjWj1,KŲ[D)LD0LD0Lr<+W<ڶjvx 'X{ǎۯ_N:OK8:A/ }РO[Om㘺v}?--[vwraE>}zŊ-_+m觹~ WڮC~C֌u&ͫ7vE6(;vtJv^}Ml?% ҷ̝;E[Ϟ=qMn*zrwwWҦj~gM?B [?J>ǭY.*f#Stv kN5ſ/ 'NL<[qa&Zh:?~I BT{u9q֐.s;Wz[{g X Ǘ#RYn@\q)ɔ;:sg`̫j&x+ >tPqcJK7nv+)ފg/)umȵNuԎK6ap(R sZn[~iԎF}; q֘?ۢz2bFM~ڢU+O{qoe~D+۔VidN[jg/XnɕJL0;GGTjME={ڻ݇Osݲ?޽@Ϟ-:`42[XԞLxC-o( duZeJr'R f/kh&ݼ-HʼQW3.%cx;z8u97GXhI:;;F+;*ZP(N)Br(`D4fP̛Vt޸ ,>r#Ǟ `hgMIr^պ3??}Xt y) +C0SZkRM/KCCy Mxr%&q-Sis{qpL*6#"tfJt:e2V*S֯5UO+hLgp̵kh8`CbA6Ncg]Wԍy ypJ924:٫P!w wx+W`=o^r+`<}=phRTN O^CǑ0f|x-Ju<1Ȅ 7"W +=_MI++8p kv^ 7D˷N#]I^2(Riwj|`PX/5G^Iˉ7"okmopT l{]Sc#bB#z;3%#տvg|!xNttWǜ*5NmP2)t茬J!xʕ= 7PpF4z-:)#&&nI 8$*nFikR&~@ԕ/^d'ZeY1[:WiaLRpB̔9:M΄Llw*P0dVJC0&5o#PIt\""i)ik4:S2S0l#SeODjqfH5MR\@xcgt:8;[`Lj޾fC_wWiW߀q2Iq,KF)4?V S װ݊}ܻjKP* 8d3`\=zX $ikL*R4:o!|J~56‡8ǪJ:Gѥk7Ag%o߾Bi3wQuнlbײk=4Nny].YC&OSF4ԩy:|HǎI&:ҳJ׳R2$߸s5-u`m`< 7) ppb>e ر#nPY,(=qנ!d_e RL[YW¢}Tޠ5-V 굴 kN~1}ffı. zЀ So-׳]ϼw].N@FM/,_i j[icY1PZ1JbP%KM6%JRY4pwvK1^Lb`ajXqM NOAlv!XsJD7|sGˡcF*تu@*`6lҋ[%)T:/B{oχ gc0aZp._V~ n+add?x:nf?k]Bjcy9s_^Ĺ_U)G^0J֓x({+y+Z'f}t`;p߅3{5m̅KN8ӹszr JMU)=uJMkUyฤͰw$hhwA$w>Æq|7?|qow"*)FbøB3>!qǼs#v:r~Ѯ]eM[ĖV)YFK^gqTLOdjGbO%?wԋű <| ߰>!Cb\|+pL禟ݼ[ vq-:JwKtʔ)ez2yAiTl@mu6rx ̯o$D3u=mg5eKoh62f۷jͧRV<ɹGfΚӦ9u._yn3x"RWC裏RRRTj?w\v%$XW^J_xQ^=\o߾-Ri L8tSjWL...:t9ؑO^:eq l2Ŕɕ-[}!qOIɉV)W?7lsONR|͛aqRhZQC?Ɵ>VFh7oDP uΣi"֪U_~~XX!9%۪ \.T!\߶m3)~׭[8UTA ]tiK2R-~VT 6I#"C jժ[%fTŘL8Mʦ*U免$J%-+yLTso(ťCu(5vUsfK93ܭCQTaG#j*edM,# xPJD0LD0LD0eS=eS=eS=eS=eS=eE1GͷŠnq$bfVX/4p_|19+͂+UTիT a=uK 9EnH*JHE0raP#XX)!!AO-cu '~c ^o!W3-m :O-R[AW-n7؟6mK\b=9ΕJNK0;+2GONNNj'[.G4J[H(?d~ `B4qXbncyZͶWR G4Ԩ)۞)۞)۞)۞)۞)ˈ(O&`"&`"&Ֆ.$eA2QHWkQx1bsGT`^sa Ģ M|WHcbbxppr̕RY VRAeM0WJe%XJE i/9sTVUT$mʵb -PKʕ1T48 'f|U}Ԕː`JJ$9-hggg5k`v_t){e Upr̕RY VRŋ3‘;vlݺU4 ^wcΝhŊ/%'&鿻5pscV^CV]y:;{wW\]:u(uGuA;r+wZ>VxJV˸WmϭbrW̃[.1V?\rl,|ˢu%z؍ %s_v5祛|~rĞ'sr_%\2n^\aʘ}v,}aկvZS[u;2^?}e!=(c~cFNbomfq̃_eӇmNdͻ5rA'=vc>jjwNgt㞼y<׷!i.n1 _ve /ܳnre^|iEgt+yt-ˏ?ɛ{UTsSV߶j3j6KK\tDݔܫnNvpˋw[npd+\?씴>3ݵCNNK+O-kM?ry0ҳ`.yt-K?+tWްj3\im6H&{{\e6]'릅c͹/9i9zӷe=wܸz/7YtoZr{-ЋߛsKWZo;S7hmvq(^sJK8q8/x1^L(wԣvnȉiFldAW\R;lT g/7^sy=@1Cft_x3KϯKV}7#s>.?[^Ũ%i;ǜQ|gv.{v[qIɗmA|z'wMK8fpށu]?oOk-[uKW\>vfV wzMߺciwr;Džq ]팣wstmw߾1]]m#N]VK7qžuu]{9<~ȓh=.?kߺ.ٛoZKZ?~8S4hҀ#h=.8i׺.gNsy\~sV H.䳓gDDDDdnO~. 肞]PDDDDtAi]iḻi.h(UDDDdK}ENuA]PuAٗ믿;vgCDDtAoWӧO=zǮ"7pCSu*}ꩧlmiwPDtA]Ptd~Vk.X>[`lmiwPDtA]PZu馛nq.(" .}ݗvm7dȐGA*0tɓ'?&W]uUőŸaI|c/cڱm~KW^w[5x &%od؋ޒ'*ײ<6g6䈈"sXa|WqP|ڛP^œc}}FP<"-V{U]pԨQU6/aڟےola I_3Pe|rDDtAc1J \g 履ng c˽-;g kPvc]|Y;:OCT9""sHIrF3a.l.X}6qpћ qެ=)^{mɷq7 3Ln@lE.ӊ<(X삱]$ퟩg+K|]0$q̾@`-O.(2vj#t q< XN|>lOrl^\?ELc+)=\lIlXI3 uvi"""`r݃ߥWuA^V׾: H47]PDDDZt4t|tAuA]PDDDtA]P]PEDDDuAuGrwr~M+3]ܰ׷y&MJ-~_~Eq-;!CiILp%>lWMǬt[ou}ؑ4a=a„{.o=5mF zoFg x{Z8tq>6hب>}7`IyY,QkzWҗQk-M.Wzub.ۼ\ƎblE,hcO<Ĭuضy8ZqQ%:hmT۴%W_"""``J~4d_v&%ӓqC]0㮢Eyqƥui_Lz uD~H]mm^W^tN2Ƭqދx ӒL r-t:4{,md 4}qxn.\wuX^x!vnHKb즈..8[& S?7_vi'%&(͘C_<ȴ4nO=Th9џb,ZWKxo^y)1'wX>%lڌX-0-'>ydº|3O18- Xe7EDDtFv G_w]0NV(68R0?ޓNq-vRLz#p vZn^yŚs1U2?H)7]0 Q[bCԷ"""`2+]B;4,WNЪ`LF7pH-]0 ,CӴo>7~kyULlg޼4ŵtn|8+Yܑ^+ \kMh:qKyUWߖ x.Xзx:i=i_=а ƬhW7/Áq][9zNzW29XG/?_>hW_9(%ߍ*)"" EMC<|ly`}Jtju54xH{{1CCKrѲ0*NIU+n^؍Q8 #ZZ& .NasG$(vqsGb\I" r]pW2G@F#y3⼐~:Zul5_n%  6ګ5.qDG{C#'u玌s]0&j\q%oI>"%rIe+Qo)3dKFHU7oA~Hl21W,8SXj邱Ţ\2+nm\Vn%~U:⚹ \[23`_z9qAtH ŗך 8. MTq1|a]0n^y}%/!ۢcEo!h~E)ڨqU5=Y80c>cܮ˟hqZIlFt\zZa*9f쐼BlR{Zʫ "" p+Oox1<` )_k;uTךye;[M[b7qx\\.7n. %NDDDtA]P]PEDDDB]PEDDDuAuA]PDDDtA]P Ny~I<_OW.DDD.}ߣ5tAcYU,):Psn\PDDDFuA]PuA]PuA]r97M0.(""""sh#EDDDtA]PDDDDEDDDtA]PDDDDEDDDtA]PDDDDEDDDtA]PDDDD]PDDDDtAEDDDD]PDDDDtA^:Ǖuu]hy1ZW.www~.Zf?1ߣt zMόefAf]צMxw4|ǽ Ѻࠉ0|xyywv/?Oc.ߔƧOcuiڥg̻g>k?$ ok:.\肺.OuA|낺.O~Glnu]{t曯ml;<~..Iǧͺ =]pOt=V< ׶]ŗZq5yz<}=)i~+q{k3#3Ov.Zrnnf@V|GE.qk\>}ǵ?!6 66_M_Q#uZ㊫U2Swuѐ Sꂭj7wI6v7?= ]pݻf۵.$?|]OpU7=5g 6 )ޗꂺ`uFzQXprqguoGV4.8 w];rmv]x.o5Η.h\puxA~cgy[xl!η .xOYjɴdul.E==k.1rnu﮾MruV5.003\Cw`]`5[?<{._t] ^sʸ`=L]lK`#߁cE 9^p:~ y&Mž1:[Ϟz ǯu6uFZgî{֝Զ햇rؐl} .x/PZ9V3G<G|؉ĒħI)ҫnI B|XMuq>Ĵ<~^*w`77.2`|Ӈ7(4YtA ^*w`7k]S.,^s } lEIɉ&y4OA}]]p7]u9tn]ꦛMoӾi;7Ϫm+|ļT91ܑZo;\qNѬ lHKU,kqc mEy-\8Xq,|ݩ'HӚ=-Y{KO 0>ni򟂊]8GOj[ù#1—*.8нygwcΧ\7$<︵zgQ\;o.ÁdzlS7Mǁ%3GN)Y96:@]и`3(k|/U#w`7k]0yiI> !ιe:mc}]pvt(^|4OA.Xnyqy7Ӓ N,,M1Eu=8WgHv.X#ӿ@3n;n'ԝ}i8aE#|Np*Xur.9`8f=i89/B ƴTjjE5X͍ .8,邱seK:jM1뽾`ƱG6}\{=93w963< f;2_۶[yCM[sG.|N믗qݺ}M nci >7}m]']uA>} i>Egssʓ?~i̻.ʍO`'1ZWWôx>}::.\.x# N Gwww~.Zf<{4F3~Y>n뼻s2UhW%vA=EDDDtA]PDDDDEDDDtA]PDDDDEDDDtA]PDDDDEDDDtA]PDDDDEDDDtA]PDDDD]PDDDDtAii._DDDDT,3S94킑O;,U;]@t7m/\}<sUq៣]5Ӧ?{Ë{9<%u韻wَY0e .,]gEuk.w>NZx6(nkt%6sMGQM>G$]dSEige]xɟ;o,ky]%}C>K^G]Gww_:Zrm;__AZam?8zr6W{mG%u?ŖǎTJ+;_x_]E \n\֯}?󘛎Yݏc>K,v٣??~\X:/_@]0jM7V75‼; N^tm 6x6/v< ?SQh >)Ϫ ƶEKG+#7鶿 7BuOi{- 6xK,}ۢQ>y%bO]0&mk1[{c1}+[xLa$9hiaT* fh\/GZ/{OLt.sI#p vZn^yow~ܿDw/o{ӛ߷q^R<-w>/cH.mʏ2vQQ~v HE+5RK|Ha̖i~:N6kyU_~Wc)ݚIU#JweI+9|o\kM@l.8ryIsqp^r'2[7/ps|\#{]w,`Ի4;>3qoZGƒY76ԋ/+G\|qI錖qm* qNCq>ܑ8ޮܑ8=6/b4.I.)s1ZW?WZIU+n^؍Q8 #I\5&opq ;;'AI*QvsGҕkb\I" r]0P(sSCTS5rQu+y!=hqHr`VM@l.1x .,~Q>"ᴸl^I:/\dm^>ȯ\_GL u\+{Oa F+/VLh6wXe7]yXr,.ȼ>ӯ5ecEk]c0 G;|o ޼o??ưߺ+q]A_=77qbN+S\'foɯ>~*gSr.^k:2rc; d> 6cL|߷̧o.?=[S7nsߠ@@@@@5t7ݰQ-EiS>[}Kt/̨JWi}.n7ۮi3#Ws_lt&Xmyִ]ߍӚ{[yۿy+IY#tw?Y)i4oeiILV5޼|fO,L־<+,!qIɔq}; Ќ]pHyIsqG2f9?ojqqI=ǭ.̲K2G\rk~X`t(a'|wc~&a*;r?K4eP %(˫xcxW1v^ .>sG∽sG>zqkGR\k4Z4Wŵ|{%+_ /x9ԣgZYÒ5޼+vĸ].3ip.g;kV)sl].Ck\]pcGW^ךq]|Y~8l)ѮxQ*]շy~J`7ocS/>NU[|C80k$l-$?鲅u~jjy&Wwh]0NsZr'-s[͔8O~hϤYpw~ug9ouRz]z[WƟ?+bha]ZӟkUִwR[cVk̑]Džg?ܴ]g͆.n7wG>ӯ.vvبmnu_+oouϿz`6UVlڧo% p~w}5 v^cy'[v|]Y1;_ܼO}v3ω]0싯?նm۴ѧ }]3/?2N`NG$]dM[<qc^yUӖ?б{?v^pfK:\|y*5?? |SOqeӒM7߸wZ~`ugiki|EiXSc*~)K-Wb*v#7/t-7o9G«OpK,aGT)سmV -vqkiguy?~+,Jv6_7S!.R[/Z{G3xUGT?}z:Uڵ[2oɧo*Wz~}vOon[߳TNGOl&i#k|w3vP=p%=Ғϼ̾pU|yX3 F3'8:`^I_/b{_i+vZ Ni\ŪzUn 6x61]puJsVYu_}byb5nm}7b{e:|׺x|_ zu߫k)NSK5R# 6l[-ڋ2n҈w/^oq:C+gcCZHҴi7o#-w];hXSNp~r/5_bpī>oӀh :1JW<1dŊƴ0M›`7|ǭw_WZTSlC.& Uqvڝ'ʫ _OL3z1|G/_?z獼Z̩t8.1(`.G]jy2yWz-gak6$W`vw8*~1G+5RK|˜MӾyX(`7/߼om}7Oy1[2[ZΖyZ೘Ĭ fLpy0%PSiC&͙F? > 5nC@e֫gᅫq5tb.8Jmq|0`_Tqۼ98#^cqqo8^*/X|o^y,t-s%#^5nm~cJ1J&^c8Xqgk1_<'NN |e|zr#`ḷ*׾nIh.x|x c2%W0`:àzWܑ8ܑ_Ӽ$B@F>>j'X5޼{@-/kkܑ,=w쓫q!űJE-]xH1gsGSvm_ A1ui^%W㛵.X' Z'2oG0Kfb)J<JxY_\gKx6y1S \ʉ|*em U`6Zck3_I>`coUI.Xi,'Wfk]$qtŗךY3{gDů8F 4b$L`7ocS/>-X w-WΫegkiL-嵨 -,]28w}㵈'*}cydz Vy K'ger sV*0t8y"N+}n7Są4sXsg,@>lY~zU`t4|m^IhO肭 1mq_92I]]]]]]]]@tA]@tA]@tA]@tA]@tAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtA]PuA]PuA]PuA]PuA]P= . 肺 . 肺 . 肺 . 肺 . . . . . .                       肺 . 肺 . 肺 . 肺 . 肺 ....................... . . . . g@@@@@@@@@@@@@@@@@@@@@@@uA]PuA]PuA]PuA]PuA]]]]]]]]]]]]]]]]]]]]]]]@tA]@tA]@tA]@tA]@tAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtA]PuA]PuA]PuA]PEDDDd.(""" """".(""" """""""" .("""""""" .("""""""" HkΟ3<"""B4i k/V낺U]wI[nQK?ZSwiK/=KEDDdnc[w5ԓ """2wvk*+j+xGխkםbhPEDDdnG_.Ww{:m!uI8}V]ӂ .ж|1[\qEBܶ[=:uZ.ok߹ʻ1}e4!:h:n\]PDDDtf+\sGB9mqbZg78ܷo„ 9K-Ĉ""" 6cUw$-i~O<,N=YoҒ8d„_?,V|QFӿN;j-6:lf^YZx~S?mDu*&GAwAP(X.b^LP(U&MjFe̐SM币-]U,S"FMW6OXBPlZ4rw|BZӱq&u-2VOMfQEJCǺmőfQy"=P(JԕY.;8\ֲ7QG  a~ ֣nR MmV|ӦM3{f)CӴWdPp +J(ͫ5hz۶tp5eɘ=k&5xedGkF驺2O7-м~E+6aP+4gLǢsJ"^f B fNo_} GTӨ(a`B~yqv/S)C:@ꞩz tbMfnfs\9Xo]:мڼ#˗;ɥi:e<7[4w,wOqB]+Z\m 6u %_ԩU_wOu#۞2nS_5yf30z֎4O-˟' 3{qna~oSqE} 5J8 ' ~{6r@P(UO;ikqU:*n趙;P(1ԪTԼ0eJU.[TZ3lĎ#{7~~93^RÚs;5?=nyZh^L BNY0c~u8O)m}jn%Bmxӆ45 UⰙ/80= (\=Do4w,ob45 jugϞn_.ȟɓ'{1~F?AqA@}WW6[%N_.tAmOpA\b 8pȐ!;wV\čwǎ`qA\ P\r+WZcƌQڵkqٳgO"9sl׮&EuY\n7nXB$I$MZj{ A&ܷoUHj&LdGބ 2 {ŋG2rSW$H0k֬F[W x8p/..< {Zf)h%X.ipVaÆ-_\ tA}Z#9Okԏ.XtiE/ѣG+'#bW0vXK5/.(ԩcjrέI/_63x<`VjrM+qhr[#5e<vvʝ}/[h-m-bDŲ@G__ߠNЛ  juZN`BW(>aiJ7͗/i$4}Z"&qAE촞ItMH kwZ5Pc )yi\\Z4 %TbT* zsqpA\pA@ Gx]v낃oDE4|Qt`zuA)#DQ KqA~`^sEE׭.8gqJ\E]qAqA\pA\\˔)'-[)1Ǎ'[j]￟vOnܸ1eʔbŊ%M4a„2d(QD=^~B.Z9|F,Wmϑ2~`]0_|}]Ud"IޯZ`8PBP!}pA\. VX1c~qA͟?t~Ϳz.]p̙-j>ӦMJRLٲe_.o߾PBiҤ?lH"cƌM*U}lil2{_|١kӑD4#G#_tjпӕҪ,PM\0.ش}_SYr.P,aI([ܵqA Jkt Tgv{ӄlٲ9\pnUOap]0:9s5ٿ+RϞ=Mq'Nسg}Ͷݺu3 |aիU#~.5{Mg3s%K̘1z p#J=`P=?a.8hUF{XS]]PV/N\f.8>^kry/^<%f8vȜ&Zʍ76JBBػwo[J Tĉ֭[6okΞGlߩ}ؑl2ZcĒl1ki"F=T| (Z&Oii_ǕRe t 4?==wD\sGkhFHcɜeV3NC+}y3) CUca[#JVĮAVYF-%":5;ZS %s'ODA,Yi`Wդapw4mHbe{ݢ "?iDH jV,Y8e?aXNӲyСcx%s!wpMa5޹s4rJk(1cF:M+AZ+/]SF) t{Zi2uRZb-+Gʂie\._z%2ZI&Czִ@GudWZo '|Rn]+rp7~駭[*WhQkMSj;4^lҥ5[Q={ݻxm4]zĉwo=5zdh/ˆ jIZ2T4ԄW_} :G=9K<2%O`rOcq7iX$M^J9k#4 Og ` r0]p…ٽ{i. Ɛ{. ₸ RpAqA\pA\\qAVy҉EE7z\P)g[(*z.(vr#AFr(wW,(a]( @  .  .  . ޹`s< :@i WpA\7P"_: _.8b+F$1F >]vyv /z=)~)nu0 \0b޸)~,  WqAqA\p@.sJpAߘ={v۷pAϥq|_q<8zhvrȑ$ITR+Vo߾.\pA\0&O?TV8apu\WX>  ޾}t/Wӗ-[6j(qA\/eKz ^dŸ &-y)2.ޚw/oK8I ҤXf)KwX &,\rYr&MR{L(ql4p {?S,Z:I$Yg7ֹE=k,'ٳnݲqŒ)R$L0o޼ūWꂿۼyʔ)xȷcǎy~{5kJM@[ .]ux6i5by?ࢭͧFu;2bV qY_PKL2E ͌9Ҿ`ΝMŋK;(cРA%K@H 6nܨ X#?3Rִe6}&t85e6wM R;^͚3?qbPp1U괱#(mX6޻+WXS ߃nԬ55}rA3(ܬClkVzS?BFnYԊ6Z,P%G^d.Z*Z[Ocbm۶%NXIzꫯZmA\tiJ4APC3fTQ36ޯ5P02Yd'{ݻwO~p?VqAqA\pA . \ @Lwg.)~)@lC `-_.f.  c*nE0]F%1ȗp pA\ VT] 7"$Y x\LpA\pA\ɓ'yLŊ/ϟ>  @ wA R,R. @,uA1k֬\pڵ5k̞={)ŋ8q9skVݺu3[+ .0aŒ3(Q"Sc,T8 v%N)Se˖55֭Y3 5mjOׯ9sf..(J e͚VQ""yӧ`kQR:k N61c ,Ġ#&g\ ō$Uc[lqyx.(tWTU3dMS3<u15s֬ė_~Y#g/g_VZ L]PS en' fȐw pAl+]P#[ւ $PN*_.x.th MԐq4i妗-[; . ͿtD\$)uAI . . .AL3uu!{_ ;:3g`0qA\~'={v֭kտF.(7R+W.SL+}];zF`fͪo rM (PBxjpĉiӦȑ#a„ۺu~")RhРK.Û3gN2F5m|„ Y<z'Oׯ䂹rj۶NYfxir)>|u4H>}z},6l9 6q/]N]t}5k$=%Id̙}vԩGǎ1b}|^CV͈#􁶆5_0yj`~>̾I&UVY5z1c䂵jղ^y:t0O%j{nɓUc>[ {ʣ۷5LܱcGLr}W4@A9\0:]P SM?Y*suQ$3OܹE}~CU \WZ?7jdVG &̐!B>͛CTOP\О,Ӎ7@>57o^Dw |rP3\0ez|-[4piٲzw^t/rQ7lee5ŋgKt,RSNy,kذchӧyͽz:phieӦMQ/1b.FFgϮi%h:є-m5Lg޸Zj`9zI훬\R={^S ޽.C)&N,U={dJ9|0FJZ-Zػծ];cƌjCŀ4Li'JIBp]]ԩSj(-CW@cʞҢE m>,^ ,puAE .(surA}'ƞG9@h_*DqF~'sA ٙJ/]LHɓ'62EUnٲűK/6ON?fsVNu 򿈹`޼yn`kҤ C‰bO3~xMߩWy*UR'rJ]OkG^Ph/2](sBfk׮ߗu-ךҲ4DukKcĊLjׯ_I.c6mc}Ҟ e\'55S) 4!jZ ξm&{S.jԡ5O3ʌ)ToXE#sG,B/i6ֲCɟuY4ި6>S͂qAEŦOK]_P+H/L{d!sGl5c{ȫ&j޻&>֫+wDh,4,W,YNJ'{E@vAWCڿhy5Fc2)>LZp~̑!S!.(\s޻zSY#5TVG7e~]qFX4/ӝKFZjʾbo}W ZHVx+⨵ Ԭ>}>wAuзBJVQe)jD[K1&mhʂf(Ej˖- wГ8F{QFnyfU<誺ZbU?ЪL;Tk۝B5#5eLS =`  / b/Qo;V_*MM?F`5-TWzu+dމVф?>jv믿nӦfHHkMkHZAc6mZM5jF֑KRC,) wXA2)kPʹ**)B2 6fꗲ*.[Ԝ<.<ȸ9$ewscSP{hiAsA8F1;}1kpBMJ ի:TpA?k&Səve Ycf޿d4w԰ꥹ>]4±"  |4K08.h3.(3",zqU&wDs#feiI<@ĔBnP\)PI$z? L#fM_ZfvZĠ 4^*3W FeZS3#5e,hEu%MЬ)ڗKM:徎$bepA.AnX^L阮.(7nlMW%t5偵YDSkM[eq$s]ؤFunVNiҤKڋi:6#ՕVmr֭sZ$]$C\ +CrZC?А!C# `a41l`^29kj)K/lJ.#Yu:/]Pi+(u܃NS+V2vVbZED d%\$ڳF1.@Pǂ4.htP`rA\pA5.hp @!x.([s~, @ #шo?]PSR2!8\Pw{pABzL! cǎ醆 Db F .;R۷oR~:0 t\uvҥ邃 -}ո^zQϪ)_|B|rRF1֭[DRHѸq>H"eʔ q7}v==qĴirȑ0a|mݺ-v&L{.? |qAk#Fp5kƋ{Wnܹ$IWjUΝ;I&7nӦMMͯm0m(>zhSN7xy ?s֬Ye`#G\ne̘Qv ͏ȯ*.h{߂ qA`?vb??7NU־}{ejwΜ9)QDR|O5"ܠA/A ըQ#GϲIvY{:u̙vw4.8y .٠lpĉ/^-whvi!]#ATӢE j3<lkJZmܸT\z߂ wA1|p.XX1eZ(/kC(ʕ+e?Vvm\P13/9\D`i`G+W\'qqÅ .^cg g>gnj-)}ʢ_uUj0f]@f̘ntpvիWqhsA1sL3ϾLUSF ]vĉVn]kk׮)6=z*fj*Uaš(gϞVG8Ҋ5jufym#4+]S\п.XWGktԪ8\pե7v~)\PWAs5aVXVPͫ9$ꫭ^z%Ff>ݏXsҦM =/RȊk&O\I'ZE\qAGm6m޻c+w.wŋ?Y.ְsS' >7eGc~q!vUEFA~.ܺuKŠ8B(S\{yP.PuKoZ٤^cJaĉFq Cw3x[P=g.(520I2-دrJ F B*Ut#;M[f8BSƾD.XF5#@u׏nl^bycI T:dnOѧg@#Ω2ps]uY!_^S3&[u/2qxUvN+KvK5o:tz5k"n=ׯ'AK[-ZT*nRܸq#%51ғDVM=b<3G¤OܻAZ͆ڛ6GvW A93`Ymƞ9ÇnmO@\.yuve-VbvJ(Vob Y561 ׮ej%U#̝LiS #&W݂9eI#+> U֬n62_.(}┒?XJZFu9#7m4f$~D_0g0I(cQ @#%twV ]JQ=LpMe^Llڌ:q8q䦲g(mV^Od{xWs&&K4ze54ֱݺq1j=؏E֞5/'@^_p-O)׺eLr4Z,]Wm8rڸP7YMeʥ͇н%jӬ\ǥ UY^F= VhF.VԹYT;;?dέ CV4T i0pvO2+۪ Ċ5e\$Y ^mהq (Jj2c?h"N2[,i2~yZ)F č/Qd QmL䂏֚#cu'K>V1؋f,hmdIXVҴ$IJy0V):N`r @lxY%pKvΏ)JrnQ .H ԝ^pA\4.h8 ₱sWyWb;vL:tFLz[pAJLp?qP'<&o2dHB&MkXp=z={6V W;QDr֭ۥK 9s.8qK S8x6Zh3-Z+&*\˩RJ AvΝ;k֬]Ks΁߿}jUPϟ+˒,Y/"]P %K.8!K>%lذAr`5FݻwGm\d*͛D ;js~Eo \ jvٲeyI0a|njo(q^r*פIþ*V;*Te#FvZX={X ~Ǘ)S&M4i̙#tpȑ1cdϞ=^xׯw F/<mO81mڴ9r_}U֭SL"EƍgEAWÉի͚5∊ 0ʕ+~<7|)L̈́ nzx鸠P[^ga`ʕ[3gΔ1͛W5/^ y<\fM9JW^ܹs'Iw k_]tQ۶m삲@E?Ï>HF:ϔ)СCW\b ^իlٲ5lѣ'|b &,ꩆ½/h|m5k~~gqȑ֭g̘Q Pաϟ?uԚODnܸ!O[׼O>z,S~*/AxNq. *֭[F"Сyx(em"i\H'OJTJ;UuZY zPlٴij_{PHwƍPҥK,R So޼9Ļn޼uƎL:U5Ạ]j{4i*WZej;Ka#5طo? . >adɒHS-$^3ݗ_~"UZ?Ti،k;wGnoW xGluSrP`A_Uz lX(H]5R8NDT q K!4aQ> ₸`SN+ԩ3gNXa-I?_Ч|H5 Ka4iӦ .&T K/;+d9}S{Z.Yz%i^Ӿ֬Yc?~m*5NJTvmGB7.:uA|uA>2~ݪ"|]4/ܸq# . @էlS-JLю*c7QK+2kU^*ݫ!lctAeZDlMT3nϗBC:rGb2 .Ɓ/^ƍslaXJhhTR7ްvLk׮}zi61M+aEZZOQEڵ+Ė;DtMI M*!C+(C˲jժy) ýAp.#8HO?}Bt.pA[?D Qq㻧7Y;J)Q .4\` ゑem<<^%0јr QFqXMxwu r~`]ᄀ ړHpu9sh^ ju@݋E7&6Y) F%.?pp\Wߛ@tAPǢqAs/ b?uX{(zp.h% %h\_%.H &\0]0c|ZMƍ|3\p豺.+ogz\%7`vmp(q .2DI]0Yϝ;ǂ/&7pٳmv4ucJ&I"q_ʀ[Jb *qxʹ]JF`$K26zqmؚ8E'bSL!y^6.;`dʠw<3 ;wm%H0YM}TI ䷄ϒyw.y^6۷oקW^ cСCnFQH2e1dަ<ÇL ~6YA/oM%]l]0&._\ݻ{ 䂃 ʜ9M\#}l0 Hp8.x۷oqA)`,Y"..Xic.Xc;ƈ.Ǟvt~pu1%JZ\aV)\3S\w5}:Y N:k  *W(Z:ܼZyPϖ 5"*˗SH{  hU͛u@<+mBʖ-6mZ5Nej~W٧Ճg̖-޿Lj2uSt:x `&:u'Nt\ɓ'/_V;}5ccp#ₛ7o)W%C`ժUfp{={E<`ѢE5xxdX.W,Y:ҥKK:o?I~Ǐc5G*.hqFܸq.8oMS2 K.~տNG?Do C`HA.#V8A\0\pȾ]@qA;F F +|QBBoq{7"QG= 2qA\0R.hX!. BpI(cQg BPǂ4.htPf_F8\&(.;oX"2  J : Bpߥd!: Bp 4.h8 B,u 8}8q+a58v:t(bGrs\eS\SLW曪L0n_3jժe?ҥK۳@ JruI[dzrJ{'vjWL pA.8m4ӧMOL}6m*VhMq/-IcN:9st+sŊGJ׫W({pp09~;ʕkڴ)\ BlwAғ0)9 )ș"w kM +X;wӧ%I'N~oΝ;کF5pƍr.5*٪Pߍi,*$xvA;5ѫ6mc ~ >(Js s~BI */v!ӦM[zu)p#G9H%KX)zm6.xbcfxީNS >d֬Yf׷h;PQ *2'|ĬYjbѫ )sEyZpo5e4N5j,\pڵJjQnݺajer\W]zc/\`W_/_\f`]PǏZwFkAwEKXڵK A%kM+eŊSN3ܹDxةP.(L wA+؏rAo :F7hٲA/ъZ$滠A _K\1bLJ,nPlM69\P׫W/ZB S3A7(Xϟ`&L/ZvҧO7nQF>}ZE2'JHGК1 6jh ]3fZj5rH3wY.(e1)S&iի#SNK̹ut閳\mܸQDM:ԩ ulܹqAݧk;v쨧'Ov\PtVdQ֭[\0_|Rʕ+1b#*Ugثv:rp 4i$^x;ݫ * ☼!C@a /)ulP+(`ln\pܹM,XUiT/%mذ3S\PoXA\0.X|y&> &TB_F\hc+JO4qƚ bߥd!: ʕKaiO/^\/) Qڌ3&]Pw{pA\Cz^A.]#Se`4St0quA飂~.]6 .h8 F :tH+iM֭[kL4ikhzq}1B-]Q~t֭N:R2eYǏ2˘$I;v ǎ;ۧ(RH2e?SfDZ?`|V ֚޵kWյZgΜTDiDq}h^~pA.߸SK"{QL 꿬 .XVWyQcmႀ q /]p'IIݚ8qb3o_jժ=Tn_~E:e*pUIcZHkҚ u/A=x@wV?A~ {񇎡Xbv[^zUcCYf2N 0ʕ++~e+_+kuu9zS AҲ`X X,|zQvwA޽{W5.\XG Zڝsaxz0b.R3QsB_!o>~C=>kU轹>B萐'\p 3 k2rhҌHz믂mٲeڨH}] :TOXB BU8ve .4kL5/^Ȼ`Ν;ժUS{xAVzl^qㆴIg{;y+Jsui^69zO>ѫ 5ҍ׭[׵kWML##| ,58ɷ/Bz:o<租~A6\ 64Ǎ}wA1VJϿ}xfLk_(χၰ0#T?:5{m'N<2.>XX0V]pu:uœpA  ԏc%x&nܸ&!bŊ^;O]?oVZV7o* /{ F RSL yryUجi?6%g믈*wY.V1F[ojͽȜ+߿jl|=*u|3# ݅LiF`Iq2|hߩ(n'!.E{W!usƧk1Ǧc+o? F ןv+҈G}$?_ѕ+yIV+0ob\/T a]T'ʺ?b#ゑy=|^È}[ý>BH p뫇9.@.x){YU^&Uz&9d),-Sdߩ B x!.E{0\JzUjƘF3ga2[h#|n]0o_X[-a:QX|yzºϺ] 0|up;LH˖-5IfP z! Fs{ #m qjڴ)ڄ ₸``{tܹs]+aϞ=[ofhJ&^(/WQwl0\Pz:8M.بQ#Vn`d#AjsΝӤ+?0]PBoC_pW ȸLWM2h {!E{}!7M . drʢoDd"< u4^޻`d?p k\OQ'E&\Gqd#i_V_Տ9=s*# ȸVfs;!ȼ>`naľ^)Ҟ 15ܣQ]I&G{;=dem6"K&ᘍ86sB8ܞ;vuȿ}fm۶9=tz+=ӠtN\|wŋRJC\\ 0B[qv&9)\x @z00bpOڵ\ęps/`uA= ,hneLۃ}4}[;4Aʠ#wE͊!]t/5ɬ^JZhF` 3\vñU^ȑ#Sэ5,`>`>5A@T4yoόq=9 =BF#Ző1' (> 1I$g=Bdž})1)Cȑ z^qA\|ȭ[ 8_ϧ~Ŷ:`tAPǢ/ &؏E֞5/'.  Z ~, .  q`rAqA\pA\0ָ` UHq`rA ҿcApAOCj zJrnӇ!: ]>r.FgA^pA}ACA>.h8.w0.p8}vW^ cСC|.}*F >5qҥKӧOσ 9s (|r߾}[>寙0K,pA.߸`Թ`t;Μ9/3]~O?rʕ+(P`̙ ,ț7j.^sնm[څ 5kfo?g͚U8ru83f̨i5;wEڏ?V'NWx:u FqBnݺej[\<`Zn޼~رjpԩSUc\P[1Bߓ/ª|\p(wUV+K,i[ܼysȓ#V *g_7?~~;w<5kִoeDMpAO:eSNΜ9=^רQ#Ǯ5jlhٲfzw^uc\6mڔpAE.hO".8geh"snLl 2Vhm;wk 1| .x饗4qFg^n]80ֹI(cQg ]pÆ 2qyn N6M}'NTuu%K E9{(Uq+VVKɓ'=+lqA+؏5k=hmZCkiẠVW:uJΞ=(4:(Wk ]PATR+WQըQ#YdI&usDt4gY;sX;׷6Ԫ ڣ`[4(Xϟvx„ zYڵK>}ܸqu?ӧO+QfEwвA 7ʟvj<|n+kժV0CiӦ\ȑ#YdA6jh7c+1F`}xa`sGtj3f̘`rA).(W[r2QWC$LJ+j$#_v5[#f n̚2ZSSt0bR-Ԭ62BzLD 3-BC:L֭YS&M4khUؤI6v͕5+%5Ǐri9_PEgg)RL2zInu@޵ʥwUy:z]~PQ/.͛7|(~iX.+W.}M&UŋM9k֬rDZE%ZH jWw֒]aĉJ-$v~M\0:Ljݺ`Z7oTO;رc@ GVs'lBz=`Ĉ|V˗Fï  *C;^K ,ȟ_U㏚L5;w(G]7QlRį  j {- c9\F=krAѲeK&x޽P@:RkS Z#ZNR'&AnZzoշBwpA j Ȼr><YZoK׽kTy~J\鹠YEBFnjOIOܹ/ծ][wwpdj %H@ _~ov\իZAF#źAѣYSF7o랆x5e,[W]zcް… ku@kM{pХ f'OZ ƌ;ռysuzj{T..}sA[?D FnRPzV$I7n+[hQD ~Dc 1baO gvwi+RH2e> HtT4iG /Ǐ׮ӤI}(P`Μ9t92f̘ٳNjoR0bĈ̙3+gkw犯B %MT2dHX?zH8N\rk׮Õ\/ ,Y~M{9}x۶m#5kL5/^4 ~YʟFnݺݻg̘QFeDf͚.zjyRܹ$I䂽{ T2e:tF攘A^-[ =z_OLs~G}CUVÆ Vaq/ܹSZ5ը%K0n{e\0j]PsRN-1O<(Y9sCjժeܼyS:cǎUX N-[^.:{P'nܸ|tJ.9*gUAٲeӦMTؼy/},XSL yrN^Zܹstzg۵k͛7۷Ҹz T4꯿*HV$?FHwA#aBtڑ\k?B\efUVٳz\hQ+^ *^(6np |/tF]ӀF~dȢN:9s45ѭQFn5jl= ~?wi&?~>ln_i֭[`HÖ-[jR ._W̞@h?E 7o^g 5:yd&Fg͚e%&VT*qx׮]!M+T0^RK.:ǰ^&/_^VcWpA wi܃ο ~&Xn\0OgϞmnj . ^L6^ͣ5JۿjͫWi& ₸W.x ~)s;L Vc֍D_`\pAfJ1~)0_ |饗t_S⡍n$EڋEŕ9sۧCBp~)|pACժUB傺Bnݴ暣^=hI5fnouf\Пh=5sG|rA->%jzuuAM*$,%'O\0R ZVK>+SyI+;wu,kCݔA{0#-!zI(QUǯ~]֫OVQԬE RԽXR]vW>|XjJ~ԫWO&jY.xȑ,YtÇ7nXu_YmWwءɂwKCٲeչTL/i]P=o/{R%JčWӧOL}W6 t3sغ#NM+cZVMXSNKʎ;R7kjLrN:aìzvy#V/M2ŧܑŋ{ӧ۽V[dITpW#9B*1.h!mBU\>@rA583gz:uju !CxvJ*Ml2o\0_|:OҤIVcfc tۋqA>7?tת<05c{cG[o}F{|znUҧm7>7}|j"I߯XS|W1켿O15H鮰JʹsA &TBw5,X Fl޽{ޓ'ORƆ jIųg[\_Mಂ3X4# /_R "~qA/Lj#:0[M%F'M9Jm (@ >B\=@vAeuH6tocĊLj5c/,2w$b.;*wҾpQr63fLPqA\ jy.Nk:t CRZU#Ytc1pSXS_~z`VfX;5qVZO"QP!ʹcCO^kʴnZk5eҤI㺦FZeJ0khCk\\RRSH52Zwܷo#F('ZK֫# r͚5jBMh _QÛ.ϙ}P> ji{ڵzZYZR:M"Tmiڴ=hNe'L="ִ֡& EZN%/l6Wk\ F *FD6ӽvJ#^ ZjyJ8UVYOpA .L8m{'Ѫ(p]P9Z?:cWA~; ƸL eqA uC~!\qVZg54~>  Û5^Z#G,q ~tA/ J[sN\P ]cxG0*?91gӾ:?~|oMHS;=.h :sbŊ)wh_k(1F|=ƈ }".m\ 1KO[>⨳[Z/ j2_ܸqu Kϟ\x 2wd͚5ֆzLA\I\oqA)`Zj ֭KS{ߑRJv>k;bɟ֔ UI~ڵk'NX\95ed֔Q҉+(x5~; |i[\1U駷զ"6 ]JMK:nDw^d>eʔIJ޼y;w[A{ִV8pVVZ??  z)p 1`,1`@d)bm `o~0/q j\-."K A4:ȿ˿˿˿1_\1qAqA\pA\0V`tSt9B*1.  ~/>MoSc\0B.ŦDpYA|!pA?Gh1]Ʌ>{\O7B .C₀ .OϯMpA#.\qt *ԥKG޿/6.1yظ`Z2{nݺO^ժUr m\b =^ 6 m\b ,KNj^:hРY&H K, p#\it{KC 1Ooܸ/_>݂wޫWӧɓj .(.뛧&MUVY X5cƌW\p@qQ/UX*5z?[-͊0O]߾}"L~X!k׮.WLi{U1{)HƹSLY`As?b9|ZzZ#:~3g߿O? O/pAhu?>lCX  `_ . BVKpA6 m!\pA\pAXZVM\#9B*1.A_KpABbS"ms  cC }s .  _QÛu.xر8q:to8@t!ygb ^p!; ~7C )TPҤI..\GgϞb s >1bUT$^۷o}._*U kN߬Yv.]Ν;c1n]B =zt`~ݻ\_|\?.#޾}8qbڴi9rH0a|nj䫯jݺuʔ)SHѸq>H"eʔM(b{M4yW.92f̘ٳNjoVbEgw =_~e:4iH (0g٤#2gά+g~c|޽{w}sնm[m֬j.^hYf69rݺuݻwϘ1DrA[͚5exziϝ;w$I}].eְaãG|awEͶm=)SC\rŊVګW/G:x ?Ï>HǬ{ .sGjԨkժem~M:t`;V 8`5:uj,\l߿}|t<8_0yj6lؠ z8T̓GE>}ƍ{ZGe˖M6'pA\0渠bfl\pʕ+g^糿믿J}ڛCTE5В4Jytk֬Q'HS]f*7ճqqON ٴĿG>8w4T61bMSѾs>"3gԶ7nPA_Հ * f޼y@t ȑ2\hQc PhNiCj RӖOj#8얮C4B0ef̘aYx7α#3@ jPX  *UJ۾^jNr]fjnܸen7DUWǎ~\pݺym4Ι3kĉǏU͛7jm75kF;k9-='Oڵ+X1.:9$Cg+WKpU{=6.n\h.xU%kxԨQ™5e~xMT juĉWn]\P7Jѭ4GPK50C~MҌ:e ]]P~vɒ%ߝj) ̒%)wD9s1e%Ӵ)[qӇVͶG%-Ҥҥc ݃}G[c jSJs JѴz|iРѫժU D)R4yj?kK|~$2}N 21Ʃ'Olָbg.,abwfEݵk?v\p]bRF{lԓ"EZ5kӦ2-=UPfٯ_rJ̝;tRJYDNxjʛMa$w$  * E_xaݻ5:?fРڵs&}rPc 4&gShPش3 VbI`иc.ٳ= }'٣ ,TjΟ֬Y>RM.9i(+\O&|/낚׿MԈmic\y|ٳGy uBVжmc jXٵ =V&D Ι3G4_0AňnL`J=>X]1d7Fj:43ɓ1FdG{ydl/bRj ..X_Pc͛ו 6hPVNŊ|/8Km׶m))dٲ)rMG RҦ&[L˧Src R65}G wMɓS2ݶQqlqA.K Kڋ ,AZYWZ zy[nbD 5d6_V-kcK(>աGRHVp>+ Lj8o&TR(6֮qA``, y8,qA\ Vt+ . FhYA7#wUqA\0_ S^뗂  t-6% 6 R1]Ʌ>{?7fآ)dxsKk!J3>3<O . . . . .;y!!WUBP( %\kڱ y~毮( BP(QZ4S˚~)_]Q( BPԵ/1fIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/navigation/images/gui_big.jpg000066400000000000000000004236651506652756400255550ustar00rootroot00000000000000JFIF((C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("_  !1"AQa2q#BRSTUr$35bs4Ct%d7EcDu&'V:!1A"Q2aq𑡱3R#B4Sb ?&]ط3 әNpm{\c4,!A#8K` l% ]ɴ+!<^cgaל̊ٓ*2cVy_6KilI\0Q .GD~ͣ6 ę90@zH.+ VN1>4t7D~ͯ>I{9I=ߥ9zBϫG-nTS7<+ƯahF!V'$_sLjwXm עso[OsbLùqEc:iǮG?*-O4t/[Gɒ?#m<>A͉`zgL`>ꌞ̿m{\ƈHOsbO3\0Tɒ?#m%hԏ6$G?(zg@|#?R?\ƈHOsbO3\0Tɒ?#mycʨ\z9' lnjF$j9cݚL&ꌨf6µ\mO '~4Myoqu,#:,BJBN"HS(=Un_#~ۗ߫+lITH͍JT9j 랽#X67:>M~0 ij3\0Ucۗ߫+67:x| =r?ޙUn_#~ۗ߫+lK?G?(zgV>M~0n_#~㧇9,L`#X67:>M~0 ij3;tKr ,fҔ'tv:T?ɷ/VW&p$^gUx|m4g1Eٸ.4hP!'8Np{ttg$ {#~.WE?㧇9%\oA>e*Q8t6ЏWa-i_p$ ۾Ūx?^](:('Oc =r?ޙUn_#~ۗ߫+lK?G?(zgV>M~0n_#~㧇9,L`#X67:>M~0 ij3\0Ucۗ߫+67:x| =r?ޙUn_#~ۗ߫+lK?G?(zgV>M~0n_#~㧇9,L`ņWmu,tIʻ?Fj7ۗ߫+X9pˊra%/mWs)Ⱥ,~Ha-rH9~zY" i,tdϾB\sL(WOOx`S،Ǟ u,SlGx"S Hl:NJ|6ijۗeksy9S؈Ƽ2n+Y 898:\"4҈S=9ulg}2B)S؍ ZэFo6 N@v8g'տ) #&3+vU!j#c9? x|FZn3r19qAJm#ꩻ2W7'm"n8qlG6% ΅g#@ڙ9v庴#BtQp{ I]Z̜W,}՞y6tJIN:\\DgOG6vDLHB}J$0Gt8s{DzOJ8V溼n8Ғ9.@=Y{w9+Ғ{h- B'9m-3Y~z6CgAbsV\a.WB􃿗(+}"B[q:; H]TmdEz^ɸ䖊6=H>^pbr3"VntB)Zh!-%+mcPOziE[0 T:*pJ"lZ_1ĐdQ^eI0B JrBsTE;HCrBRO!-ؖ:cǭi5&gܴ޶_He!-j:VFq⹽pqbxޞ$gxUؖjlHu;\a-Jq Ĩ5N;t' E A$ ScGid>QhR!88ªqCR,c0/=|ǕOI6VS'W~GUqNdžZ"3KCMpFBFmvۄ*y-A8)=RsЎժLI:өԖ0<ʼ=r3y qڳ? ъm Mb2U$)(Ȏr,={UVt>w4Xeeµ[=1U"$Crݷ V±ˍcW7,Ɉ^ąc` dVXAzIZn pl 稯Y\x%l5Y:)FJ7qm:7^:d{mRJx~֠; F4/m3plUe6TK!ݱSf.>p S?Zt:vt)X鎽Ֆd♒]"%@C)J:gTÇ'-H{me1>[NRus;x*x\"#.'zuu!><|G$]uQTe0:\tqPtߺ&(9n5>ᙏC-itTFGJHM+[IHX՟d4r2y-SYԬ1E;p M:o>p6>5iA/,e Sir&u}'%FqMYbc ')RaY,AJN6ux.vfHbéԐk~HU-~iŭ}D0[^|vQ14K 2vmg*J 1!L9NHz_ _lCեc8TF~~tgST42N)= TEij tR * Eoˈye*l3j]zOf4'ZTVУƨGm_^r@$goXO!B"rD('c#>h[#x#}+JS,AyD$?I]AJ 'lOԻbRT( $6wTRVVSdAM }F?'8q\IQJ':Kdo·T=šju&ԋCa,PIA;SC#80) I:woL؀pB֭ }CHsԒkJJ doͷC#!Wn$tsO<:w^*$tƯ%R!iƀOAIZq Nt~ -O}G~ f\ Im+CE-·#~KZM$dPSuNgp[ +x.㔝 Js3Cߎc8S]VOcF!ZUB=H8 &\vʛSV$ v=zS96il=iE@u]zh|`7>UR"<˭nddWֈ 8L%\y#J'~$HfTt?ecR\mAIPU[x7}] ˤ(:6)#;)KSZTҢ|Iz6)ERŶhŻCH>B jңYڍ9Tp%9Hv@=(( æETWќ?d_hu/g9yqG\}_UpT J;\LMzU]-#]?ǵfMsBeZi:RvF%#gH\+[N>NR\l(%Qp|Eeۻ;+B:'vU )$$%­)Fͨۡ8%^3y_8ImURcٮ,ϙJML8}R=188e%;k>R3NO=-`c =tdOB=#FB\ ssgW\u0Ai2IiNpsFGqY }A$!RO(W[ScU GDE$, U$ºmy\H8#[NI=n#?kzE9m9OʒN䁿}W8 뷽Zːx%,(8@Hq38^[W_~oa5?nEju\^R7Bn6~[{9)#ljjg!MdžӰİH2kYS ];J i[ ^ߚK83|fDorM-/u}J7;:$!,\BB +9M8%=j][+؎mfZ:WOk1Ȃ-02bTNjOw=;"dXvJ~in6Ns($Og=.6tb;'!9g ء72ۥZ:) |vΫ*PF^Ed)n-xXU~ uկ׷Z܉f뷭zkr2?' uQ'98`EDOs**'tq~ŽmusPns(sj9ҨK<ӕ`TzC̸::\F[R8n0IbRފ]. HtFF(s)ܞ%z@\ $ 5 Rs a18# ضGDrm9 8}IRYN&-hwN GeֆD7\kB+5a% Լ)$`Vel%ĕPsW\(y^/Z!WKKvįYa_N:-n {!sÅ#)$X$ ҢJy---#6. zZb՟hl*u~)$)IBIu#A4H-ԬBp0'ofPi wA'5KDs* =~O~:W4\U Iy\2یclY\#<ɆVjR^A~D5,&CrTJ Q U* M&Z -F Vr;[pvдz5ym(k<H&[$8Nt9ڴ"ط`KM sRz`xJ,f-֗Z; d24ulrbBҵ6w".kT/51O1'(JN8h7 1JRhPHVm!!1|%0uq`%?lߔqYGȮ(Fos:ɐ$CZJp4cWLgߋ,{d *s=wIJ6`4왋UQ<HάR;XNe(ZV.''ƫɧq[^[H!p09ѣPAuWC%KJRrέe\d6k^`{j%~y]>Ӵ@2E-.*Xq2k}-n 4)RBN6jq&=r Rd6Pp '=s8 -6%NS% I[$|{"K)VBcj2jV>qKw{C-(ܢ{sJ!1SVYEy ul?.~NSӾȼZ̉ % y+4IӨC[4EZp4sm/K60SuЧ^H@%D=_=Ӻt??ڟOV}]X޷mḇC$d't_TSFj[D(k'i"2SŠJJA"+֥J[D]TժֆJ !J R|zAq!$mқr6#U]ڍLIFev8Om)2aJT1<'rC6}%/PRH[K|1:C Z')1zY8U nLGJunH50U(L^"O7p qI'`glSI\6 [9cQY#*g,NznBԉn+HJaDɫJ⢤[dQVPD)!!<!M$ d=)KW ̉>3ϴZ$ HA9MrˇBAƜt<\9iIR%;}M=FoemjՕ0m" S H[T `ĒVq7.,K:$%gwsUh%VSֻN-?o6$!(%D njTc:ÎI UB>55=յ9heE\}wbEzL2 Vp2N<*xw I=neu ;rn*Y@lQʉJPQNl)x1O>dZVIc$اqw mG<+bRr$/6)O Uԏʍ9# HV-K *;MU&PI:U}g2VHNFu_mKdW5dZJNWQ_! RP%G$o6ۦbG^00qT@>>|kߣ)dd(֞cK BłgY)]pIυ&孅 J;!nuۦs5:;e vQ \A-)5'lžaX}YLt),H8N6ԧ4GUpO\AF JqJI'ï<-ieKRVW0;cbTe+RPRH9mTϭ)qe<Q)6H4%}ʿH8WGfL0!].!I 1CV͎)(lrǥoꋌ E R$!B Hϸq,ɶ\jz@z{p23ldv̍8 d{GAjƜMx;\5s#_q# 9muSDd񢐉]5R4R?~BƪW^;+s0(bGDIϠI;N)/Ø$i )${†^8z69WI~< ^h#: Nzo Wۧq4V%J2H ڞJZ*. -9Պys2 hE iCB H+o.q][< mթO6 8V7\'%Ȍۯ q!ZSAL*~mf&UyiGpk b[Dy$Q^SN<[/HSHʖ;=: 'IoBRc+ OT [5 qG). u8m\e%ƜIJzUhfel$aaa;)k#'w"#8l^qKH95ٯŮ?m/Lqiւ r)N:>\u:OxÕ-.q+NvSw;UBI_C\8G2\lǭz^?sKxː^Bt|jH; ᇆT ~Z$nYs?q]]AwHcUH(͓?=WήV>8^̹`9k5}h?$ P>ǟg NCخd\ڔy$bF \eKME_3}] _-ߐ@'9lSʥ:qBrF0c#**Frȗlcq542hB ҜX=:}AƼM2uDoj"*5-cZ:Q~'=*q.ތN9;Ƶ-[5!Vɦ8$y-gOU!s!tPqH'Ip$C K t J_JBR0\<ˏ$%ADfJ ;m Wz뮥(@;@ qס>d.2,Ӝ1w %JWuXs]#aFKOJMs׮t;mH-b]-ԮIg#;i+Im\!+ -*)@GݤGKˉ:Aj'Ď \< ^b1NmrcKX_kOFF%UU[rP)8߭IF#LK+ c?5y ;ҎRbsKbV<۹a*SCn9!x8ܞ~+WunjXq4 iJlOYj| 09yÚ5+c`(VK#=⻓ /XuT#rѥ R@y8 %-eH u0ZGkN@V17",RTPuoߞZ={yG(9 cRW̳, Ύei8Ͻ.spyɫ J#ٕ>HC  x8(tۭ_"InP0ZPwWOڞ[VӎN[ctL,c)_<&4,6pZu$>ws:̹Ƭ&$k-Dp!ǰU4HzڔﯶRGBB=*2e5C7#Cc0s Tڶg"4-91\ )u-XD8錃YL)%2S _v?|T/}}R .(Dvr~z֤@S\>gO2Bq@Ilx27h{ H-Pm-ToJǘSn rhKWYH_5`8KDs~Yʋod![a8)YǙ=N uَoK#|c6vA-%b%I3!Idug#k+b,&[\itCR QkZ'=翾{%; CR-sp6Kú?dj;ݡғR@$ ⥢##iA-9˼sξx=4ե-pnKcJ$d=quݸV˱!N [@d-#>;U8-B^f:cumUԢq%I琠)*))NH6۾Sa۠y!א9N$=W-pBCeIm [a.HҜn22E"߫µ-Xҝq\876ÎDf<z-VB[9߮=*ų & vPP[Op9|7 !l DVvf"ٹRF =o,%5:_i,)FP`xg;g ܆ i{ @8wp^[㒠[jJ8F)Ĝ* w˒ HGuZq/NC ֵSԤ|qOnVy,H!MႬN6?An8P'~ƗF|5U6s"xeVү\~h֝SUAÈ64+#'OTZC[̀Z 6s{nTѵjJڊSo.<)q^" Ų kNP5$x⥦$~QE z-Q!Vc)AY;}mFsýup)_#PB\i$`/Fz֭sPg@=~*-#i[ܵd$jIJU zEg r#l⿳f:Y#7$[i˫ :Qђ.!MiPRdj!mCIZ )r}&mcG*t)?dN]~"[rF; ~TS\rcJUE 2|N?$U<ǞQ:t9R& mMSXR- mkJF@ z0k3HR+ }<<<CY*BT9rH$]vҩ<0g|[AN C,`yF_僾Ȭ8a-s[d*\'X@ QB9JA聛ͮV+N?5(F2FWí,%]8e~0^cpT'!|Zs֟Mz?~W2IS(V#MGB\Ty,P>tʏ-q_i:p屏H?$FÛBea!%*HZF~~oJjH-Eיe!RZF"Ss:"eSApju1"—d8PI }mkN&:\O:Rrի'=h _5nor2'O\ A8 =^+r,6nw AhJJѯsDm:$ܽu%8dӝN8h_\ҟ}#Ѥ4@]:ܹ͎%!տP 8ΜƐ̦mE~qY0HqZ!ηA؄ܖBJPV m5Ējkرsr$PFu-ɔN/KFſ깥ОXBAߜz6گ\( 5q+vK[+V4 ]qEe|GZ,lƒRƐr7Z@[jJz]$ID8b#-i J}t0A gcTYCJyE C\iFq ȔN/J *TOFVKRMlb%-9N#'حEdtbul -M ϲQTE/ ]uo"$YujT)N gʮEP;v*%+u%*#>ˮ,!)xeDauL>-ڐdn3Ȧs>Ɗn/~_U W1`ԽHVtԇYt< Du|cKuv*-X'o]|ƿDItԶFB),O˚Iv6#2$jOUJHOp>n)\AO-:1kbt+=68s_}-1+:jc-W'A!j_9ZU.ۻBl%ReCQ2w ^ +T6mizewkYθ-FP vE[xf ZF2JM$o0Nkj޹k~Y@BFRԽE39OZRrtV$uyAM&>nt^D6ӎXНگ0ViI#AȻ`Ii:#;bq7)6 \ʎixJ Az#>"x|AdTVҌh!䃿6.O4[sVҕ+{ƀ_cX'w}ћ-zoBY?y^gEQ|Wwu2 1.;M8JiAI*'$V;u-oJmKҙ-p^Wҿld{J"Ɉ-,ssbJt!]×X\D'S*;xWG cÓ\Ғ)8JJœ1vx8S.(aX3q\e5$ܧcP%5=╟!8;}NzSyoNAٵ4ֹ-9^`9窱JoB\Pn#-[j}9 4NR XӰ'!YBUr :<'VE('H) Fz✦) L@VM&RS0IYqmTZCmrR[q5 IiNAX>RPu6Cj帿5%~7J5 WOFM2Z{(gݬSֶK8)|` $6 pBcHYq)}ښ~*ւY xyT!V(-%ÍMCN;X9~d(. {XP++ȤQKnrLs&$ Kaz:dm^QT̆'Oxvc19t~jik۟Dm)d^IсEM-0qktL$Q! pt,?ex!IWD{bhM - `21=Rꌅ$)թc't`wsQw,{^.iq <"IHrb16S6" &[VYCRR&?&L8K1TV (z)¦OXUu@7w)qR[[|L!2ZBn$)n)խpu+o:bmQU!VPꒅjwݓ7 yb%Р6Ï#YD$grI#)L\43dIԢqk͛t5'u8p()k>8ћMAbCI#$>5ēKe' ƒji@#:qHٵ7"N/]^7Lje'bHX钢-w9 [Ω/֝@+ DYzhӡK*;RN5q tRPd23֜E <)#\ŧ>nJsnv vcùaV\gR2w.+͖ ^r\n-*VN<*Gd>ja-ѦeͲIu(gxW>fUZfqfDrrO_9Ü[ġvJRB|$w{i[[ iKlh Oj\l\CLq ʚv2P$n|L`+"qgf/*^^Xè2j6Ȼ L֖PVRrsxW&wb-.yK> $`g?k,܄!Ayj)J )I RcQon*Zbcۦ! rcIJmZT u5bh" +PRY[Sیq&D__-w8ύ_8#ͣ+V(-VZmYՒp}>9QrnQPp{CH*nKAjVqVT1i(lZn.'TNA?%yi!ANAbXq)%;x:k ֑@|EA,=Cd$'cH]\lt&9R~'O KןiFV0ĀĨ+}^ʺ}mxi9㚴AGI xdTW~lMrji`h=Rlw'Mβ7={O%Iu]pvիiSq(J5@µcr1ʳ]?,55AI D8 ;uϙ~7c~ [..p[PJ $Si[UwHBRi =| W|Bn,u#Q$ K9roh,tZ/QhiV 8o#\ϹC%%Jq)0PҞ祈IGʍ%L-P߻գD=Zg|}^ծQ Ciʖ23ԑNWwRc lnpcAA?d+mҨ\Sm/9V[SFvi*:DOLǐS]cJjD אuN@ߥM-7Yg6P+C(2Tܐ02h>XQ7XJ˷I4OS*X9e@Viuq\!Pۏ sY / I̕Ia+`,m)G {Vե-)Sy[tO蟐4mn?!_Ua/ꯑQ[ʖzzgޙ+) -(IB1A#/u]9 f>:*q+xNb.Mrl6* PBrBR; y7<5" 8km!.SZRzjt-%ZB z>c}%=ĭCHqSҚ/IʂT8e]u[hijYD$I*JЃqKߓ:l"L-i l<+91g\[D' e =c8MOiN5)#'' h1w ~N"2Jr T/&Cw\qZJ(؟+( IXw2UuqN0 #I yf"jT7QBr4h* 'r^,n[DHvJ@ۯZ֝z5'^3;TQ\2d.vZؐ⸞YQR,S ź5oHĘǔ˺]NSs#zZҁ)$ⓙ%!%mN+fÆ ~E8e[5Kj;EԌjJ'o֥NMt$Lziz~ PfJH$gk+T[;csV\GRU ShRRꔔD:q@4"Y@4tzTo^f]Jb+E%2<;mxdP Q\!,Du+d5Ύze5QH ƣlXFDY (@t"'д:NY/jsk|17[ǚZKN[S:TTL(՛ҭ֘ .2 !$fc @ֵ7Q;碢2dTX GpnZ"pBNu냚SemUrTc*$ k6$Af!-MIncEldcONc[]kB[S:G_:%{:e%xqImj:ojcYkrdm9 :}<~.)$a!G:S tNJ'}(K mM_ |,mts"",Vև ޫk6c9!Al)#lS$i 7+ێ03pኈb! Z#){GE7')aTrR@6~rɍ:֧ QhmKPmiW SȐ9RrNFsyie4nRJ'쾊2YC#R֜^=_PC0T9a(y!AY鞕_;{&$t:HJF䀓^HRS֢p;޶:2}laNqelii mA1uzTӎ<] W="#<*]EKm-3jeuB܄`Ddw"}F h9FSCu=۔s$[$c:9 *ICim:F(y}qx y$0@jc][-{ȷG-M\!;{dniKqG5(ꃄ'zq!_"ǑvJW;BծTwJJh/;pwVmUv6 O.6PJVf]}=AO*9"Uܶ[ṃuLBKrZj*QEdW ԧG_ӌ.0%Z*-+Kp$>GP *xSiᅲӓҵiJҮ<}U (欳!:2iq_RْP^&S.zq٧6EŅ% |EB\VM!cF<|ŭ3PЉYBqH#q(ԺO- cHd%\殺aeDc׷~]?K%EB1{괷'&rjN ޭpEMVPAPӏ$%Fn5R! u-'mCPڣ!{i)@%C n܏U~:Դ{\9vqTB1¨;ijҳŒnrF?BLJRTC' Ѩ}ѤDxE@9JL[yy;|կ/WL59Ogµ\ W.(inկS{+] JI* JORGNCZg8}dEIJr1 d /ۑ6!)ר񫍶,rJP \o)P_?EeoV=A~n2_1( RA8'l#rC& +~5'FJF]RH4Il)k+%65SAXԵ+Vz9JU{zsn=L-.P2Vs 5kݧ+;JT+[Ppc9sNcKe MN8YB0v )'CVI ZJ:wɮHަ+.R\ M@R%z^uуP-o>:HIcqV7jj|ָOeCE*=~AkwmSm*PQJ+9ZrkطI̭)%MJ HQN21*PR %K($9>ni–RYSc9F / UeȐ q` Ho9qod*]DqR p]~~rFƯ)()Ld;}|dtjӞ Sfl6Vc!-!4Jե ӔvSMqtYK8xMOe+%HyK)#O) Ӿ1y(歴X#zFJ]l0Xlm[4Smu+8V60_QRN>j[B>? ,9 $mWs6y A9:OyqdJHS^C.'|rRl鑡.vu8\9in+FN3O\녲 m\or$m-6TeAAhN1P9#`힦<%IVdkХN0|\oQp4)K%*F@oV~!O$Ȑ8q)!'!Z1uʙnQXr%B@ZMza\tCWxfH[`)?ӧ F:Ҕ)omFNhI}$/zl>'ݵi8 JҜGu`a'D.'aBy.ZT8sH%$Md218fbFvab4u'ҁJ3ԇ4TTWc> Oz0+C)e Vp01|HTqmV(*؎rA5yns?~{93Lj鼉HKٰQ#98I8 "HB1VyN1ӯZhq>5Ny}ӳIkj,iD-!+ZT[_d$dJtal7Kѫ *F%"m ={~ fuEZe'&ԉ&bzU;b,fH aթ]qN|ׇHN7fޕ}?#B:ϯ+lvHO蟐)-ô ]9s:;TO蟐񪼼P42.)zEcC5m3/1&jٶ\.!i WPO]FxE\8u%]Yկ=վ|h פ%ݦ+P1oN͚z`mS7FgJk%ǂJ$ =j~_ ;>&tMmAT ҐHjS_-}ն>Hr߻"k]= 7g~"nJ1y ũe::o%ln⇕oG[ |(aHJTt9aSCmfŸF"t1JT)*)=4>rJ@mMӸ9 HR|h εqeMI`Ɨg=j*]|{s܉2,<5ejmT8{ReDmݓOgTO0܇c-Ĕƴ@f&,vyo.CmWy$fu<;[1̔hacF&W K_/1#<AKIJFUuCzTL>#0f"]RQ- v<ũ]($cP9[7 'KKe)E% IvR3Ul[خVZBNRI:]j.ۮ|)@ BPӱ񩰜cwcqҡZI2./H=K-+HʈuÜ5fcrjFt7GL )'.|=")^Ii jX銹Ku*"nL)(P;dn<,]ߺYnmSd"G-qR@m;8H;+kGԢH\Zb#:B@NHV3Hic5/GTsˑLpbR;;[|n[hhVPPyC5>3nݍu}hR-rIX4)p2DR{Hn*זKRޤ}_ V4!Hi2V*'8浌^VejosSoSs1ZR@#oV$[4+K@+*KIgRT:vvOm%n'vwC&zihNv^fU6*,TI{4mQͲz[KSِۺG/LKzNGƊZu?dts턁jR%LvuJHP@V73a> C*P7kYWbc\;ijm㤸>jo +XRixaT: AVӞj$C&9 (WڥdAݱ  '2{vyΌRCS`iV>z٥ZPi:Tt{En2aٙ d09Q;e[o.l楤H[!C@}բ{%[48Vdp5xmb./}[KSLH99y;=:U$VJ;>v[&%dlak?fj5mE3mKL J~ɠH*jJN5gS>[ہ-ׂ; qյJr\{ Nsmw#o`8RR!%*G2JCJ7Tg]'0>W*vCn}ҖWUsܧɖx oIXIGSܙ('$j,l >>T"O=+)[gئ8Mƽ/_Z]OC -][@nSG8Jʕ$%z_GI)P5/p-O\PԲOxPQӭDSn;rˊ嶕-l(glxwV1J>^sjsQ!I yήwj2Mπx, 76 JB\R otD%ᓌ<'O@Ƥ7} uc%KV~1-w&;qxǖFsx6KdJOiV= W|7:Ze%ee (APэIɐ2>k0eniZΠi PVUN/L ~i6ͲJe, @]/~mmc4- ,)IV @czg|8"PE,Q%:;2 iBe ]ǁL?3m e($2NV8ڧ㢛[ e֑j/MlÐϬC-Js㺫**'u5@>Q-[+mahnDEv{ek% Q;߾0:LJS"6gK8FG x74NiiOcBPs ={颭 P;"9ѧQ ?v.]\~a>'QqVsr8QĶ[O |3MѧQ ?mߒ+[ a)ll3ĊZ7a@a i ozFG x74QT#3\dܶ!d8P,U; [푸mm9~Y *ֳF)RsnrO<uua*)-9eJ{MZhuAIQTjF'tOWMsp;S?!_Uy$0] Wx;4Es9/(x|2J'?11*4Kp=v jf$ I|o$|E *H0/Ɣc8e8p9;=§]O&k2kXlF& H .4[N1dNx涶xGSjLEJ+4ˆx:o%r$sEnSr l`AwbF\ktVK+ul%( #>=kq"#Hu:ʇ8i0^%[ie #jTv-*; .\e BZA@9=u<lĩ }a}{v+kEǏ#ew>xh#[e9IB 7YH0ln8d<I`<Džjz#>s](Pb>TN5.)yqd-ۨwC  L4p"/~z$),GRIC(3 A)x\ +vZm[;qcSrJu/'"R~ZHђҟ vE[lXg|okÊ%%JN|+pwYNH\7y9Q}G<SB%8D1rJK>xmI - T^a2Yblfq!N@W_{/*v 1%}ƚ7賁RcSNZUf=}^"仓O%ń}L.Ӓ fKcB(BNG&!'Htn`Υ%' b;2`GG-O+)Ns'窭]ʨnwoCs5ܒ_R[R!͊A|їYB丠T.: j[ (mEdzSU&iʓϘ%Yy"rm8j^RGwՠ޹3ҨpI;VSV2>Nc%3eR\QbNՖZʷeٛ$źzLjr>V u+>T#ʱJ65.q?d'OQnV~3&KnC Rlw Sf]Pu%.Zdw? &ngntdI @${T{OKbDiqe-tk}+Z臄DȓoH} %#ǕH<50,"uѩKV\oo,oC\<%3:9-jI% 1.(s;n}dER ~bun ?"4o^)v?+ ZYIJ@B7=Օȷ|rA dge} Z:To::C̈́9u\7X2th8V&.<[ddj+ ֕nܣ\ "Cn#ZIܸ1|AU,4ڛyJT9?unZYmAKM2m@TNĠ*$C~c NimWt0젩236}}sD, RT{]|F ::J՜ԶvŽL]4IҦ﫹oQ/׺dZ%q Բ-#Hǟ~jHGH3Qu: '_kuP?7bՁmHqyAƕ vw&nɦR՟HzSV3g}POџCim,!A+Bոe"|)E6R$F9oCsNn$EI-\<ݙJB]WiOvp.P9c*Jt9;$GN8>sˉ9+X:H9}w:fcP-`熬rj4z}mx8N [E-p1_b.* X:mZ35ev!ۣ t͂ݵEG>Yi$G\? CVv\ E :,w>~߉Sb:J!T7V:gjZ,7kh'Nc߭-tYoaRcJmMoUy8V|#$Wek.G3eyqIBWy)%ۭZsd1Z=p/$:YF~H?/;-$Z/EM79-iéJBypTXsSΉIm\?l5F;֥ ܕrS\&#Š)m]Y^9>^^V[,:'|p;/oR:$gch,+}3nө|& ])riJQlI+\4Qpѓ91LG4_)P5ݞg:N,ݞإO3*5YOoU@BW `Ac'v>}!pQnJL.Hg H)Nwj)uZSI*h'N3ժ?~b3L%ےk܉}$mm+UYʄfrڕq!rl^*,W)Kڛ)ZH‰N v8E]65LpܮE7?{U^/Q|N T$jx\siYV0I' {D7?sa\T'l`{7c!q0'Wi9ձlE2qX&f:I?N$;uҏxQEnrQ@QEQEA9̠(+Jq`$`wT} *:e Kks--mYR?𤩅)n% ( uuZPT$"EG 尥zc!*퍉% y6gnP Ԓ2:xlv#r)Tm$H82@$W+ZЧ)X*BX **GRK.6C)qMFI9~zUwZc)96)VrH$ ,i~-4BRK  (dgzqB( (Hp?Q?~Bƪo4'tOW\GKEc((( (((( (((( (((]ͩ\퐄 +āNke #+?^ dwq5>Ξ]Pr;mmwjrc]it0d6p6S@?U<46D?]-Y&[QpK u[ˊXǼ;8fHv<:Bc_=S@sdqŲ=n?e~{_SkH kJۭw  i />H!T]-q[+:jLu㤩A ::uI>+-֩ 6:{'}HȧaŲ=n?e~{_RsJ|_%+V8EJJ\ 7̸""PGgI'i9+q[+:=vWt},$%Ht!'XZ =1O!Ը JT=&"+n?e~{_GE>( %JJGrUlR EHI} %jqȀۏ_רsqa J*Q#_CF@q0SoJQNF0z9Z. ]mkQԝJR AMFqɔ]##t1K,[m9DW6(f]!;^|ժțlFXb;H$ 4o, >CeqҋVF227ϏNo o~qUGo~qUZ.- JTPr2^ŗy2r#‴ 34Y wxXl巿巿޹Rl7'I'xmYRq-')`91ߖ y,zc0Ӂ JwSU\ܣ̰ZKh#}'m##m?m?WRnC*A$9צM< ͔/rֵXkr`u[{+~j/VaƭAX±VlTszF7Ta_,0R2F;$'|Ksdbi)/s=NZ8#|҅$Bࠣ}HrnJiLO(,PuiN|Jwg;+G-R IVN6~jxXl}5rsǗEzl8h()'!V*(]l]7nRt<0X^DV*sZ◖ %}yJ*GZ)CS KSaTSФ+IJRz⻕6LiuVNVx)Hkt}aSZSK\d rB *Sd)仿ҧHtTR*r] PRZpRTJ'QKpҔ~zJ?Z#GC1[IBP%8Jy-CQJC\D`j (caNHJFKQE QR@QE|>N"WDTiO蟐3Y|sЗ;*HY'@2e$ƀĺ_lYleEƹDY䭵j!IWjŪdN!G*r-Çm>+V=*@QEFR[B)[nR=MuIܦhQ;It{_\;o-U nk=kУOgYYBpq<ԝ\Jfݡ0w ݲ)-[OOha[Js`P/u]Y3U 1[jY8R~z 7»rI ɑn0vUY&c!pbIS''Ipem mҜvN;TErYSoEM1ِ]!GV6*O}](#`ĨiTaE= ܚ{w]b]yr;7'ժ^k;'ZP5=VS8RF$쯚y\Knm|Zh;=q36Ul6JDq8- c}1f6NTN,% bv"ܞ%aNś'OxK[䯚w_|7~Crh:2AR=Q4GWoɌPeBc[JI;}fލ.$qG6\t=?-PeBI8l֓@<:Ya?ޏ.~f[ͭ(SdIX w9sZu-#Si}'yT eXˋvwKMLG!dk[B[?ep )V`wohĶ %,% ga㹦͡QUY;¤\DOС nq2ShxHQ!'C^yN)n85`99ȦkJ vԤSQ\2wv|BIEƎbKE2 ($+VATR;H#-J-Jg'o yЬwc\^ۍi3T(g^ZQ[E-TF T3FPεKXºʐJ<1&JͶBtKRTNt㼦]K(e%@|z͌ExLԔurJ+{͓5IS%JH8'8 A%c2Ռn5c08(e` =Q]-+OBP1~q"q)c w3o)i*N68~M3۔d"Q/JTdxd⑷YaGz1L#BJ:NI۩޽屨 9O-)In($[ͭ(SdIX w9sZu-#Si}'yT eXˋvwzZlE9!n<[a[}vA%CyӸ[le>4ٴ2 >ʵ+#~6T8-؎&C*mi $|+o?)- ' 9iAZv+NOh^I!kWmI`S+`I[I#9N*}-#"[JZNT~UǪ$5⸇+۞p'88jқTY : ]x9dO=ܮjb79oq7KwէPD\m.(+''r:|U0Oy^o1/J|9#YZFS{yɟprSS%dn'28|XRaRRۺp^nJpxn3ҟ")L@Ĕ+JQ{jPIwYqLH(AC @1ARwd.J m7-TՐ x|~eEGKE xR 2=[eCCZ8d("Su3)tqg4~ )jj[V55HNWJ"ιLHXPRPA=A$Km x>=I[oYJ"*O!He`=Y]-h\Z=. %-mU);` FEL_YI]R*p:R{ԫT`޴6TWH|*zT<˪JՔ-;vI 7+w܎q KJ:ґR0:cߏrG^#N7lHr3Ё-II$9r2; ;c\\-R)wn}x3KZYB.4St~) (m2BBI$oo*E[ !,7 Uu'Ů5M3"2 AJpo';7$iJEo]2ikaI%E_cչtk]raNˈY#:RzcʈsF)'mҶ!U }wB*_5qH7돜;2kcw#I IqE^.Hz |:rBP F8.R$͎\ CQJFp(IQ-$mYv{遺\ِ $IunGv'}RyJ #6T Vwߦ: u|̅@ )>#Jq[z1 R<t6T’Tpe-'HJ[/7#CMXglafN ¦-ЍV= C2N_6KhaNB7 q Ͻt+ < P/MSd3 , RԤF@>jzg1]iO(%jTHLJvk͜0t}ҒdW>9u8c)=v?s^rLӏSD| 8Y2IrДKWVC*S8PM{w~"]^j0O9(9)uJ%vNCMHYqZCO49HX Jp{sPO9(9)D#WǂUq9["j+:*PH.4 u=9 N} 9N} Q> <ü!d/ 7y ~0I!)ϽG)ϽNy,~09,~0s>|*69(9)%YG%YNgxUmskQskSK$?K$?π۔¯CnS{_ŽS{_œXa'5e-I }cakNg§hoskQskSC?$gZg mi@*J 4O蟐񪻷qm(~CۺIUO蟐񪸲Ve=n+ W{EʊwөP[X⪨o{jÇ֞U7̷!ڒsZG4BFIQrnFrg[!)PzwkӅW:J#jN--[T=u 騗s?%Lm|E/1Ds+RtRG|*kb9sSgYk%δo%uM&kPnCD(uX B[>8ʶ[g~ښ (Svtь>:~+/b$I$!Iv5Z2+*2%YˊWQV[O}Tӌ> a8P#ӂl)K}K2\l9;A*_;ę6'\WE}'BZWSy7JBpPGh Zkgvƌ03|ϝ<>Ԗz;u!CR(p cRnF 58v9-̄,(>H*>l2^Z[iKQHI>k'? ZyFChZEԗ\ƵXdzt9ɒU8h\G@}1|9SӁC4Qqv8qŐ(ROW^u D Y*GDǢ2vcՒug~ҞS-{V>t;> UԏWIW?ºNUQ6 I-~o)5\ G1_Y!!I+qJ alnE*O$%A_d#jz<㚬g>ERD6I'$M;C(!+ZHʚoSu=ۈr46w$gAӟo„dOaƆ|_|&)ZFQI$=?)-sTi!:;,4U['t\riƦ1WXs"֮a ːs)pB[C+Ji&IB-=ЃL/8r $UB ԰C$gBm^қVN:#i?@W O!O!n\X5HV^\)L\d4*DX($`'$NFNhnml:ht$$VxK<,~qyOCdN6K(.XuEN R ҢI鄏Sd,#-reĮBt4viz{܌x|ž]pC6:A@v9q[0e+|Ӛ 8w%E uhqI!a j \fGie 9 9Q";q\oT` ^">Y,J !'9=knvzv!,!B% 5i#R+;JImE(D$([&Z%6ژxWt'a{}VrPq-)WezFF_,unfYaMr^S]tz.JrЬ)بbJ|DMG8z~3WvᔈjR`վԹ-uVQΒҕi碆Ǟio GMLpwʰU}t&l`뮥' B|m.ʗ6;A/G/%i{Q$+ m2%Đ/JPOy咽ù3Zcm+c |c5o_@1ֆi+KJNo݁@̅%LYV<:iSjj#PU(auwx u3O[oGXJBco#fJ-\u 0Gd?Rnsb] 8{uq#խNui[?8s/-ǰrw@BNthQP$` v Ѻ=! k[ !>G#'| 6ZkiJ%z%I cEPQ@QEQEz^GU}'zNty!ƙeX;wM(J%MBI8=`Pդ4 JѠ| cW9:7> h)Ք/ !jP cm89FU9/b0#/[j?1\P;{l)ȩR褙b.@ZwN>&LKVJ=R"29OjI|G0*7ܯ|WUloj_KCjBF4joe1rB559@g=9qU}JI XFzj}CJ)dϖ_ x3߉B T)-Nu]{JT=CЭJHBUx)NqQOPF=Ů*) !rүyk^_EYd`ZFFF1 lfo&i* H:ک42^_EO SYGʷp֝'OLgi FTЇGK& em$UVN<,ɖ:]/E}<@B][Kt=Μ|@;4{3zPޗ*599o~7\ܶm:%)SZq:TZGUMR?~Bƪq4 N䟷o1?~Bƪ䛼ɞaQW.[8BQ>VH7(u znӗ]>} um<5gX?!}|YgfjS6;i)W+p8~B=)}uC$l=$Nmsȿ.^㤭X_n˅=GmB:%&K Y?=ͱYkĻfLiP8mV[+7Ge 8kˌ <Ggp5!iqmgtW\=v|GD?cu9)=Rq{Ȉ Drә|%2MiqGy |F>Tj6:ť)kPJ2IuTLu[xQl2;5|OU}|}"qcIuRYZmaD0|>z(L2\j;v[={j蟅XOa |О>zi)BBHH"Vokd5 ;JϽ]Iӡy9>ߕJmWJJ)lBf*.\Y RtX޾uO=QVGiܕ5jڛeD wUq%HGpEs+*T=k(9bͷ8I,9'E} A>t;gb+ȼ3>rH6~@exse!VROGSxZRʰdy*`Hߡ%R&<}&É/ XZh 4'||ަ*nVe-Z4 tUQTNvcoFw& mҶQHإcWs { YvEn@eJhxu8PABTᛲ]J ׈+7&;oHZ:wè)tEFR9:''VZ6'U+ҜЭӑY wߣ++H]S'OKC@/pU BݥNUM`##UDQ A߿JROAR7V}OAR7P% )J*u(90=ZAqݶljL&@ dl;"qWIڂe%8J\7N/M-(BxmD ڳh4ThRx)J=G'@hG_]&Jk'j֐79RG_]3BRd$(^ル?]84 (ӐKwr?Ě -G>zn1BPi@gX+Uy#B5wSgj-ʟ?U\oo&Q(IJTPP#EAV1'l @>2FcSw+PR1ku YƴDN| G.9)NvIj؇ZPJֽ*Jdzalzkn:M}ʛJBz]!dz[1ʘJR17c"é4).>rJWg8ODZOIe.8Z9Z9t]kRo`zЄ3iH*Zx*5*O)Ӑ$U"MVu*RH +AN;Ӭr%rm%%씢9RH*|B_Mڕ!K+ doI|ʛ&DpBzdc~ wR^&aj,rtgDG>*K@9NGj=aRҁ|Ҡ'=Im)l@m&J JIoNE""L.;iq.>UDzINGpZpIz VDޤ=uGAf B@ d߿abĈtƒ~2i?`59bl(2 f7 +ϸԦYTij'ʱm@IۤRʐiEA=HAɒn/,F+ ed_?z^i ̖ԗn7Z{tB%y 2ViI>$τf?%66dy( 黗 )qmqC$ƢHK[$Z% ڐZ?`Ri06):sHKSL4)eX :rGH9r"\|^A 8J{tgƝÔÓYR zM0d!XY;eXӨە.;"֖ +Ջa* c$tu"*rv#>;l|7O`-ㄔԠS߾vIP͌DFLZI[F0IFb3HWH n3ӽW[c0~\VcVT0p:KHL$9S+lD֘ENSx F.2YlJ'[ĀеekR`Z1)69sC7ถq(G ֯CKNp>b쟼.>`dsaZ:vxֆ. ?F9ׯt,qǒm J`I+-8ՇqqW*Ea,mDm ZH֧Y?mBw;g94܅OɚݪR6rށj3eNS 1m,?N-v* O).-n- n@{2(ɓumi ӫ$H)i$mFEfYGDY=`{‡vjgќ9kZT{;j&?C}kB'RV FI$5c9W)7fvob-FCJQYBR\VE[L̷H!k@TKWh䎛t%ZMM)c0I] hF>-t-ּ3D8;\jۦM;rmmJNp8@OOC)y,I 1mЅiVi>Œ+T B3% H.6vb*RCpJp=_ $SP8o »Y&-?86t>9S -J~}FA!Ő![Vԍ@5 Md ʫD7.+˔7 [z-kPƢ;k$Fu=PqY#XGrȻ:.@YKJTp=0煮ۛ"^mWUeeHmÝ+FwE:YRZ&Iadl07IJ~ƼI2 Dmo9wֶ5&EZ%Ն[R P?w&\C+QЄ$50HPT0GW!q4xCj2 GdG0p7b^⚸_߈-Mp]>̅F*B#˄To`= [j>mǏ/pv JZ}\gd7]7#x~?ʷ4ÅEyb/[챍җӈC W-Ԩ)*cftWv*e9iQ#q7˕ ёm~HF羺gEg.45?]Xh"WDT& O蟐U|E{837B+>EMWTlenFp$x't. C rߕ,xAgq֑5jQÖ;@yWfi.TAlGx[ԃQX$zc7%} qRdzXĆ&Dq+uҔ(5z]ޮԗGk'&{ӊ;y8y?=F^m%h bw ! kM;DI.RkÅ N֠hyI VgkXt3mPV~1]Mݔ ~Ƭߌ 8e8[u:맖_ܑު}p,>a:^>F:e> M,$NƢ '¬2MVVVL`ZH'2b>Q'Yޔz]|TAȎ[>Jhg_yC*)ך4] M-RhJңZP4FS\GF$!mݺF7gW#=wQ?e!"QjyPWWM-GTŐьzymڭ#oQP~Rogޕ1^. [@< ~xW;(e-gԼz-wߣ++H]e~ O^DW}j"WqW*gT,~CUgT,~CUke16}z|Lx xo?WI>ӿ?*oU]$N@_z?š__p5D[Bmmw?)Riy?tCI/ҽ*OWi^uE'@hG_]5o! u+D{V++w;w?M!~~_s$xUO?+JW֪'xO7T*Wq%Hcl_5G>=_*}B|?={#Ro $^9ڀuoZVD8",zIyR[ekRhN(oy'=})PWiZNCPYJRSo>m?̑nQ:#'=ws| r<*RžK[,ݧԵ1IUF O՚A2LX}o8+}JoN5`ec+v"Ce` A=ƀAw+sQ i2$Cs/R徲-j S|v!Jj<(ڳ}Anq֙}e p΅$#:΀;TD$:RRԌbl-1W0s; }Խp\Ap,x%dnsvKh1{XVqկ~9Z4b$HPPPN~4ؤ\%HLHo !9}q:VͤIiNo9DjOH\`Rnȵ<( u덨Q29:q /$/UgT -jX*mE+,?56!y%eu*wU03kƜ@]ˎC[^xw9W-=} $F;$qm:hEl /IW_+,cIu`%ǵ(=֧}5<ʯZlBʔzKLW8~ ДXz69I)}C|-AQ}kg$B}ɷ}]QK%=Cjѐ8k )6g~ C$?$Ģtz)$|u"b2i}Wk'ow,RcTuۿjgpvs Yž) 'sG e5ଂI Vv;^ɥ9_%Le$%v>o/:(j${8bkd6]q!cd(&z{O=4vw hINǨ9#ZIo5e*mMP;SiYZSr!d%>N\r-!QB @Sӽ F=1t{#*ҤŠ9AaE%dx ,:a:7'= R)( o$0F~xAngT!m8ۤiJU-Bco[Kue@i0;Y%*'-VJRGN0灌Fe[R̵jҲ3jQ,K8T iZ܎$)-RBr8ur4 ҚG[_Y;Ӈ\ND'4p[( vgaPj+)t$iۿPO]T$",|hqM@BFaq^fX,ޢ9q%M g)N1@{dmƤ\S9RO'tOW\!'HFlwWQ?~Bƪ__#E3#M.|?)?$?=uH~W~Gӆ;#P#{6/c1ryW5q-ٔKJ̄v!]ρb' ޏOÁ˃l5ȼѮ|RBq*n,cr+.6)a|{jGn[aLgI=:hJi*W(-V1Uچ̹ڳ^)Iw*GT^zQP^_c䭕vRNO¾u~:WSe$C#yY^rqy%ewFv0D`YoqK0";1rWTޒ +TP>sf7| OoМew`>J=+"boF%G+Ěz)۴.锡T7l>gûӫ#@7swkD{(ρ=piʯ*v[jS";}v",clJB(2_=ES}+pRSNi=]H*Hva 0S/'zT*tCV}+\#f a>HPhtևB w"|R! $ Gz ~'rlyf鬴҉XsYe\p7K=IzF*tD6>'j8ߜ5'(ea|M-D$߉_/^Be@?o["*9:d<2;#ᏜϽpC9M]n!M!Ce쏦 +H]q]G :}WZD)_Zȿwĥ)$J4I,rXoӿ?)|K!) 6 Nq!Du~PI?E_j~C85JR g IV2 M:-ts&ckc7@ A+')QO⠑{4x4}jN_\vl9%+KfJ9I[ *y!L+K)):|#=ƥM1WM[HGB=d}bvS!)AZ$GTu$״pwr?Ěao=;6 )ǎ x{:kAB!IH-Q ؚ?+UyR$]=rDŲS#.:ϥ3??iyn&iptA@ C)84g,{i1j +ke16}z0^% oM n4wVp2c)6E?^X5H1jldr(I#b?_U%|D9l,t( $wթEj@uԃ )$V$WÌ\-)jӁg:թeE!ӍаTS#H}['ĝX,/S:qHNOB3=¶eya,JJ<SI<5o/-ZHkԱӹCJ‰e~"SqTu)kRFLjP:Ԡ?#JC+X)) }` ~ׯwl'c.TIQ*(;dpwخzA8C+% (1[ XĦ|8\.vJw2րqI_HD!xZo6Ɠ'De66 ;-#ZmGՀYd1\LDŽS#\ھgrH c(A +ִ}hӎ)md+t RއsVM,%n?#P) e#4bjȌˎoBԵ g8,#"3Ш΀kb@( ڟywKnK̄H;yPCC"^Ҵ/mJF6޽68%.so>Pp' '$uw0eJTBǕ!{6Thp5У KRq8ά{%HQ|$զ:"}RV[0S?z,mKJ"iZVּ00IQ5>"Ζ.-~JS-~yf$:V9P Z#Ď Ũ$!$Fqw5#P9oSʵXq+Hܓ9$vڦ( (((5jﯤC_6>/ICi#9n' <6|Z8%DozDݻ02XʸkL(}vz ׏$+]\$hm- *b8#?U3}>o?G 6͸TQP;Z:q?"y"ف ($ g׿'D]?}3cnHdè[@$)=n>fKt<q ߝKf|ae͈̘N0j5$zRᙁI$0 )վJ2q ǸUL;\H5bJB xdovD>49q2W{.ĶϏ--8[q a$ Y#gzT,'V'QVq9َbZZkmI4R9=]{2օi [35(]ȒGHμw_zxa 1C !uOw¤c㶎;ydJ/a-:( 9-&jkA(NP7H#dYnYg$J$1Ilw\ ' QRRT>r)ר\ME@'V)7+s VdyOKJH;`v@r В*(sn}Z|Gvs4Sn$((56N5Fj\8xSH$i:RVERBTNR:%3KJ9H WiG vڜ|q15MgqVd]DK`:SG~*FsTɍ&:ϊR’'ҁ1pIP"D%n$)ZG8t勏~q|/L-?;.H~JBIΔhJOLUAĸzҤhWzNfwIrf:i QǸ OZpC =*pvUٖ\$Hi%)Ң3l38OtL]02ZPmjB2BRTnʗ=i:u1[T$: .TmIP%?}re<!]mEX 6ޜ'8JψsXl-B}5!XЂdջ!)K|P>zF'tOWJҡID  U|袊*^q. #y-?x59E_=-J8{t/vjq +)]q#*j< ē-O6=놽! !'ޮjPÊ8Lja Z((k=F6&ԱR( J>Q@|sypJP^~nEE%߉n?WP=}qlTCl[5eh8p@QEQET/ _rsW,i=\h>}z4+{gUNO+Tdu%J~:f}*[%R1נ7I<=0(F{H.Gqsx+eSԸjRBPPˋO0'ozQq!L:Uj2tm[Q]"w "eI53]J2IB v kRž ) 8NQN3U,%ו1)\nmMu)m2uc%ZRԧtjo}vU'˘OijeThތX1T԰-,T2q9t0W5¡YR S;:T'DcKny6ҹ7 4I0=ԥ2ۡpm)V|P4()ŧm9=gᨳ=eĸDM2/@wl;lUyT\jdؚg^Ռ{-gls9jczfmv2&;\gXK!EHQD}xxvLV[d)6nc:Y yQ\whkXjK jl$$ G>)n5,iy H(iP6S*$5!K+^r78?I? [l\oK{(A=rsICr]0'?E9mCE-JF0샎$k*eKemR\VCjՐ78;l],BӦJT4塲xg8'zCI-ʤ@'dsd@ u%@S:T8)R}0F;uru $!9ckQySe K^GO0i @.< XVt結A*$whۚf&r^YyV B6L}KnQ?D`=@5ǵ%䫐}ŮCil03xLWzbho2Cj|J;OEǘpLnJ$)|̠K* DiNpI8TP~"VhPust-: $,Ii9'p33)_iip#hp;>E2L:rp$w0uJ(( ((= |گh#ͪfqAAA6ښHH5Cۢ4ź;2eN0'~ /[ԎRVtgR)QIo!Iҟ=Ǧ)GFfԛ5Nb>쪄*Ε5GupB!zԒuRtEKKiJFIRȧ^qY7um:ت1Ԭ^ Qៅ_-%QrkxBkҟkdl@S.b\{|nfJ-xQ!iZq:q6}&BˇSji'WB1JJB JRrA@WAYjdCj XJdNPBǿt'˫ ]o;⣹,6t:+RTuݒꉪ[J:P!gzwZnHRH%C?EMDQj.mnS* t!w*|n;)SVR xBGԣ?{=ѯЅ6 :IaBQnr]~$*Z%W1 ܷ{*OwM#_YJ伦֕R^$W*8e-CH)Q9d J8Ԭ}pV8HV9I)i󍕷`NF>z 嵩}H9ǡƕA;gcat4}]3yPlQR:w3^> QJqp˅ƚp3W:%?P8rY~KN\:@€4)d =:nq]1⛐TpQ_YJ伦֕R^$@8e-CH)Q9d@PJ8ʱb—aZ!![wʝg1=OhS+oY<=#$|kS:@ sC*5`v4iZ gJ!Kҥt22:fb#ї 4 pgsNX5HV^&=P낡1RQcd> ՝]JsTuPPI*Qv*QW2=ņmQcmc~hn%e`HJCNJd:"=!#'f%!aMrsyi,S-YK g1g&2ڃ=-䅅(שA <&p6?%.RDpN=Ƶ(Xi` Q避k<֦s\sjy@i$xH8 Źd/*N#+ذ.Ir78\R0=NpqܨuVvZFO\Ǧv6\-jI)Ꮳҕv5|5T@?e"kvJIejKˆN ձ eY8F<9pO/H8]t=)gKk\%8zC-JA=v%"uRR G24/ikEŮSDW*AsK+BQ!#‡,=maJIK%%:@HӑwW*8TJS!a%cq8Ͼ62LiHi9G#wN P3*ԗ.57TŪ\5d K\Gbg5Eiu qJ8==1H[Hn"# qj{Bꕥ*Z{G >j;]\YM-EL_1JF0v ^: Y ]X*vVppWvW(2IJ^R1p9ڑ])2۲%!Y$u)!m\PKrmSc͏!ŕ),V ^kL͞é6Ie+u*RTT9?p jlyG-8XZVdsmq C%Ӥsrzu5lRے#B\II jqeNmἔhy%Ĵ %J钡y hk!k%$ 2N{K c:3:VTڕ[䏙Kx}Kp*+qz±o0E7Xui!KqCF=#*:O rIItdl@)f.TOCyS`%$xk t'k O3@QEQEEPQ@Ճ\,BjKK5IgʷR oĎ2P ,K$|rCi\93:MZ=$~_6[Jt{THg>oRW dv1'M` m e(61Y ګ?Zs,]0H)<5k= ,h٭ӾƳ+ .D-ɫ@)h(og^1g%9S$M1郊ur#ixz3Wz銭GU*CoߡGSQ9קX"${v]xҧZWZJo[ FsƘL*`C>1,',d}; KQUeI[\/eo3 mSZr4{Dvj8{}KW!W09ѻwGaa!FAOkz&]X`}Q.4}Y?#7yg o|j6 ;R5Z8N~GW,ޯ[N&KSv@zG͊s'v!7 }{JўQ5|i3,IwJ ƎEE XvӟN~YqSW9_^e郊bZLrt+Sޕx̨z7)"', :*p[4z=[!M+SdwARW+Il"Zg$_hVy->o?JO[>1L+ d;{'ү6Ņiz6fvK`{iScvTm %)G@Oho&xhlq{S}`Ե6|F}OWvf9GcO^p/u"ZDZ8V;*'*7]fUdtO-AKcb WRVJ\K;y* `%Y"%TQG}MKpx;BmlZ Υ[u5}YJOIx!ODeDzcsI郊uyr#A^>nȪ[JmOȶ\ =S cz>5BkzˊHPsAv ( v.R^ҁiJ=&-|Q57n" tHRӺ"33%:i%kZ@Ie#q$ŪcK[{)@GC-նi ;;9+Vwu2:].Φ))ǯ pӴϸ怴帖W@ZwFau$a.˕I;sOOq<;EXGBf=V!y:샰#Q^ϝ5P&n-\9۫ RHP$cm65f878ϭNKdVH 6v85PzIJGe {+zqºNUQ-N(NI?Ы*S֥}WhT֥}Wkĭ|V7<| {)'!GW~+RW?PSv~rq[˥AV {Ui26eⵣP9tp?ULtce`!$l:>=z/Ywo=ha?Jׄ[SxHRhEY.pdA'—S:)eHlZNs5>>]mH_Bע h[>9nS죍J/ѯ-R{1ZS Z=(5gb2u`NN^ȵbn@dw'G} V_/GɏirqGիSC+wBH)1HUfĭ ]ִu8Zq8H`&m±F7QH*|sk{ E 軃l|*tw08(*=HKH_A+֭(ðFH#،l^ҷN:G~~)z/)&SK. G?@跂Д%6ǀCji#֎Vr>|J>:oZ[6(N{ V.XLz/X_ [ImVϫGfj5ZjҜ`>d6sr v@1ѕnF^omm}FH":U[I\,}Ы;Ã]mܶ>uG38P-/j=m]qۼ?/(j;I+8s-)|eRAocμۋS} mP\l lcbWظmݒ܂A)a# b6VmB[e  HZ)/3"dbХQ]EPQ@QEQEEP^)0.B:C(e(Rr)$jjBgn/HRt!R*ejJA)H$YzT kai2NFꯠ{ 6m/f9@huek$d6ƼAqZIIFUHߖYM:}=V|?v9q"%dC,%GZeIԅ wW-. ЖۏQANIPFӬxXT;$#n9򃜩 aIC,Ix⮑zIդ >Í8O@uo-HqxXT! )e8iKΤc}C t:AlGs ʘTw DgiS/#4J}MCXF>"&4$ (Ki9#8[ʢ>ݖ 9R\K3]8ғZG~XF>"z(E̗!Ҟ.>]t,%\$J{5'(5k#+$ یi.BtI`(C>L["nc%@)y(x+"ܳTrkQ#,j*ĕI l,85m- ۠آ=&8qnr)GIHqoH<)2cJraW^ʞ1('ל2:r{kBCPA`Ϭi/0"LE`)dښ IdmIϑru)OAZGH^7Th '!<`]իDM^:u.c b\{bl},$<)5/mgk}&:42yiҒUmVzN̋L4F%ǎ-u^u ǸzfNtiwIœ%!hF1d{v?$[EcJSR22;6ް\r%Oԫ\fW_g=fW_gǸIw'W%ј-dwl`*{IJm3jmȪX}/JYN4³F=fW_g=fW_gu$W'DƑ$*S^3t7.V' q=ɣ/YW2YW2XTrtv8JIߞ'q%isp Nd;+\3e+\3ea'JFdޒ;k(@%G7kQfprQZpe9';3Zuԍe~+F̣e~+F̬^+6>AH[9'>RJYuT97Nk]e~+F̣e~+F̬q쩖gIږ3%ϟZ3Fp+m^G9|C97YW2YW2hk{Yz'ޔ掽zW7r\K#\ (v|MuE#x_~(_~+\xOcTjE۬m|9v.'֖>UNtn+\3e+\3ePWm^=r\rSRZ=boq16R G,9|rQ#RYfW_g=fW_gʪYs;-@YQSP3$b\2,%RC̜`u}&k_~(_~*slOj=w$A\yjZ~uoM[tȘJZrŽTpT oW^І8W+GW+TSaGSøKhw KKgHRuIpg޴\^qCȓ2#?Q2#?UNILJrE1t {樶fϑ--D+FR=k³HY"Ke~+F̣e~+F̪]."\5 P.64 ƛ"xLP ïJ(vRSQҟh ^ V#.ƊB2#?S{I%[$Ґ qd>o2j4^cnI-VNǶ]nFǺ0dTX*< e'E荇r^&7pva-CiV5<*^1Yp\{[RBtJs4 k0SS:ČoTNjrHܸDta@վ:mUNS aJi PH쁂U9qYZW)l>$&ER'#;䜓 Nr=bZJF5<W1ȉB_n۠v4v[ƽ)dQl6Sn$-/;,u*탶I F`Gdi o%&<21z "4$Rn vuMmI=6٘xz̑_T;Ni@u g9cՂx|~"! D4Nǐ{^XW¬4Ss$@a4?ᏸThdUx|~"ȷg @m!^QE]?qjE<<=2Ewn~;¼I]"% /`HJ%QazB+HxqV)du UO Wmwm( $tBhH~"~)9!KJy0Q Ԝ8=9 Vp|+#~KJ9UE"Q-m؅Q]&AEPQ@QEQEET{U$8ɐy wOJvlpJP?$}5Ӎ$Ò֜$}#8q*VIJ]V\hG̊-F#ZM%@J>VccП իyeXOGp{rv#5 ]S{WS͂;6PYQQCsE6a ƥwP葉4\=VKS9u'tVs)t먅ikV7u솓:iw9ztzށAﯚUm;?*m!~ )VɩU"[춫ZҴ?WdޞTZw+W\5(w$yUē B#Q[AIdcA@d<RyÃ(J+Ru, RFNzVVۜ] !ZTu* 9&LcFq:3F%@~wu\ 3aGu Jqj*YYK^0HOS;2QۺݥhgC"#*ٽ Ҭ;o>#̋j!smF3)c5Aũm֢N FFO+4N%lK4Iֱ cQ.F!cF]nPN-5mQ N%5aJX9؃Ɛ3U<!=gv'U¶k 7H\BuԤ+^{vφ+JvjKbj>ӦH21A0񺡠'*#9u4\efpTTps8*Y|M%+>ԉyV" 17v`Щw[O(4I wusۇ&#AIDRI= Ξ9%faɽ!H%c)U!Y87lJ7K{Z]i8Op$ ڪ%D$ZSqGRyjg b÷YE(Co+;I;8^p 76X<ȍcӂwﮨp򄞵FEzOGz m2BCΥD﫲@qĖ'%[7)td%Ni8 3Z β%[13⺼RNۃoTܗ+ lAɯx*[SRF/mܕa);O6O He%N ;w.v= , xW K_5*ii($ f9ȓO$s%;*EF06myvD}{H1A|4z*?i<-H s/ |3Sw(>3洤F%GtH*J `$l5h1wpsOIޔ J$ dw]ez N M4FH+=NpsXҳx͂ۉ)K@ډ$*&*ha~,fB{#n2%~Mߴ%˚bNJSӺwΜ|i&uC Mip6JLSM!A$3ށݎntPS! -ƾjeOyIRJ=MߚzC=%;n /Ҵj &۳8C\/u=UnMTDn+-h!x8:{RCB}]t{Z`eG&~59nc IH8Z R}r$}S"1 [@B)>b=Hzzom~-NAH Ӓp|j]Wd,.Sh.OeRebڍ ə n<Ɍ]sp4DC]@IbHN>zF)Q%q~Id% m9ۖ3].H"@t^6/?y\/#+啭 i%IlI8s~l gi+ yORiJ~Cw l>Wj3<꽢E\BoK^[4:N:U=kF[7ԕ7dy GS vf~gH#-oQ}oQ/޿L|zY3CR$?7*~[v'MWWX$JJiu 9=;n~g3zKAn+Qy➶u{GĔkنfթId,z?L9BݲhBvMZEKHJNp>ޢZQpt=É5ټBGVj;:w 9vii͟!t+p,Y >–X^qANHH&3*RšS$'G~v9ve܃zo|xř%l!IFCGd Z1w䄺H+Nr0{9P7ZWHmK[H jvz$|_@Ҝ6{#~„ l4дdZY!¢!o)X9pb[md!D='pKKs vTHP$|i6 j+9!IWI-LjR5 n\@`Z\™m-jRӓLT|2R55m i30a-! l Wi+zힴHIf*PҐF?]tӧ#_~FCŽO!K@]N*lgKjV2C=s"{t֮1$OC(uѭ_ >ȧNUe/GiqQEQEEPQ@QEVEBpZcW`)4 wۊ |* k\ueN謃 s˰j:~Z[8ZCX[޹;ojc u-xIS=M{?MXR;zgrA==ptqGI5>xI+'VL>y zd 1ҵc@@Ut;YQfI  yWii4LtI'\2pT0%y)_SUBЄcICjaJ*TM-mHKrJo FS?5}tp4|j!Hp#}+Z)әJ>;֘LUIpŝ5.GL`)~U:H|%lԭ/\`WEVpUwOjT(;l|Gp¥5%ژHF` Փ!D!2O##?$sˌ%V?ޛVtlǐ0_.R>JZ]KǡTgTPԧ@oG|*Nj3 m8}Pﲡ}rqIG2ٶuf*yL +%=yw Q`յ{qhV8* 5,`{1U녱}miX,^ţ#\EТ-~qplaoZHZ;'ns)F|)Rl!(QN|deP6JJG3ӳ#ʻ9>%ESxi(qzc'qǪr}{6۵O\K:UݐzS6K8)z:PބOpx|!Hꚍqmc”ǰR6L'lҒU"IIh)DpvQn|G$(VGz.2qbBH%m -~4ˌƟM3VhI8Vvsɵ7ZBn-uaDfYĨ]qCk@|$#m2~nMGJ%+VgT6e:+HHNwIej%,(!I81;;ee/KSb+ђZQ܅#=3D!:-Ai {Z2QN%S.mŔO[ BxRH8# }R-1\OS($rxVĖHmnLq"B{D#ߧD]yaM-e$}6#ʣWR;͞Y:"RRo!M>u!CԐZDH/Hm(sTV:GXڤƃ+rO-JsVZ Pk-2EhWiNη$obO8"Ee8%]B]Su#FjuL<()j'V:F9? FTDsʚJd)iEW%dN?3)v H== QQ%ϒdJlr0IQ%k'0:kGq3tG1C9RRܢ7_fa]y#U l)U3a:PեH/+un~aq0c-)ԧYg<]r7BQo)"nV!4i+#=!w*\%A-I_kb "Hz.FTa̍R>*u*~AAsNۍ#i| )w4x7~2!?-ȌC#P'd'M7X߫* ZpZ 鿕P 2Վ(H쀔{%Yɭ2%g D/Cqdad崄HH8H﹧2*E-v29NB%<;zt79ϝZ\ -.P//,'o>z+u%r @m0:֫)<n:*MCq˥GF㌚<"Ʌj~7F˥1xmbl'2aO2$wn|>ucoonEyӟq@w;)]<*:WJ"+Wu6 r{`=ˋDmSn$`1_?}w&l-x^8~gM$NPCZOL kƋNmXZ9IWa9rmW,t{gɩ[3,paЦ,l~4jKƟihmA)d@P$gμ*"I·ߊrG%d0kcv!%ԥI]IkW]^5v'G< du3:dm=]pE=um([Δil )i\G%6ByRQD)4h$9FCЁW{MO[x!+R]'Q3ǎ*@I z=}T.qJv~:I/E~f=LJN1<7@jyۦsViXLqiB~3V1fQYRS+iu2iƕ|Ǩ=sĄ3zZr0HP<ouЎ0Q'9C]#3S+u$ZJp2~Ԭ8\x]wB2[#}V{ !+[d8 NstZОV+c]M^VmQΔEn}e2m)oƬHJR"䥧a䎘 MWqDU[̺V`%A$Ug>V7i,ŀˁiGmGAMt-CR yo)Ï\sy`ex w rBsR[I;aO{6m컘3g^bɉ ZR1uޢMŵKA-;gm`5B=T&J( xUo |bmZ:i2s{VQJWNh˄D:% +Q*|j9o (܏ 0[eBRNP'd;J!8ue=58IZ2zk)NTЀSΥmI/SBQKB:5niJФIJҷT'#j&ʞ}>h;cߏ*QWHxs*Tp V_$NOyQRP((( (((( ((( VKMV{CqonԷ4nW?)6((QEQEEPQ@KgUׄq? \ޑ櫥xb}g!<3ѧ+>~=~22@H}y津ح! rfYa1D>%㘑^(hQw8M 0r|MEdes{n]}̄IpKus|ՙz$ʔLVP_u]mTOZZ6gFv@j($ٯ JhDx+ Iߣ_-QNH=>`?{ć/Ç2P+ǿT ټ1-Jc?eaGeyVVnG2 ;$ ;ڵIN+=\bZxa@ߚW iI)o}l䊢q%ټ-,֬WhvgNiWhk 5vĀ3}=ʢI:|}q1~s+X7gU OY{n.I_s3 %Hmcĥ\8Y!8&jTُ4e8te;3g5ū$ZEmC,֙Nv ^^ 7AeyO; t 㺫EVr%n6c+0' >欷S#1*K-#2SHeX])4/HϤ{݀aaIu@I$?JLT3[R{X^^x\me^_9 4:`cm\"R\[n8VIϝtN/6x^*ɞlReBΤ,9${J-Ϛݱ|6^SRJ$d7P~[ 6݄0HK!K:F5'ujW6%ⶠsJ @VBaj3dXRK͹<Y!D[Dw NDÉoq`%LE[BAFvmxE$iz#떷SZQ}YI#ߧO =+TI""$kj*HeIo\O7;azthJv?=i;֡ɐS;}M`F*9dm$z(倲%xGMI9p[*׆Rn%r Ims4c6;mɟQ)2:TԴ:6H%V^prR9avdžj 백q R&0nF YRcbm&CqbQm*9+2Ј[i|'tK諸3npm nwp)j% `65Ӎ(zJ"K *u3ңZcC`բ(Y-4t4{n/,8 JJRp?5FvRBZD2Z-D:^8Pag=k<)m I  _.B|Ķ0B1Jq rt[i(lVӊ(.ҸVR]$>٫u\nT%Yj,LtmAZ46嫆a]i>)ӶFflo[Sj*/$HsI)5vRu;UKvp߻Τ="qk},d@աŨVAr{?xHڔ7 ~H# 4ۯ]2I^N6OF8?#qw hZU'+Ife_'SuF}ȒkN7cVjW,0Oz=AR< :Yh7].|֜ :II=18#¶y`گwf9wa 4ÎNUY߲6)ۨVK~cUX@)?c=jTEa^~5w^[n(n0N 9<3k8 qN*jH͚Uݛ$Ӵgw1r7צ"D9^C)RUzn}ad{βǍnJVBPCR? .Ӣ,qpJ G9E dFp℧" * Ӝl vDk8 !H8ʲ I~_H[\ӡy$dk)\/ B.RS9*R"=ėS.+iteqY+ ?JI^o*-=k$j¹~[8=rrEK[[!nLAF9=s %6u:JDP>ӟIj~g7.nҤr]RUKJzjd 'e(ua9,E1(KBym:P gb69EIy%AmrN'#pN﬩\K}DA:В{v뚐'+@_c164ޜ<$LuGVD]/))| Ib-.,![q},gvMf% Wt#ď## x &ʵޙiS~j8n%#M SkC b0N.m:dGe[mN'R>9]ܣۭF!!>gʟeJa !x%?1%\JSV{e&JMlfm٭S.;lrHR48lk,hF=%\‚FwޠxS[%8hIVTTllf6""l8!(,6sk௢"Rr{l*<_^JPuP6=3j:;<66JRϬG8(ILx|h[ NSY]w`wb-!mg0኿dx["bYJB榪&cr'lݐE^'EfL2[yhaeJOOw*(e7ƥ#)> Ƙ%R)ua>F 2)EъP&\ +=͠挽Cq!OD&Ci$`WTklMDPy>t(72ǭGn'RU;UHJ8*j J;Fé`cU(%H}%^{[s$4@IF$}J4_)P6˩w(*N O]DžuwU6,HKjS!;$AqKj,J$Ȍ{To8ӝY'>5 geTGQ$⠃[![R?ήˀmYĮb4vsWSQ,hfM۸=!DmPI$eJP ਑"`y$KlזA-2*iLc8קAvi|_UJ倍 Vj*z3 ܋D~q!=TPV1v2][}-I|+z} ]n99c8*ʨwI.I[Q>$cNP=u`n#J] 6$DԺ>Kh,%%d<7+k9 (*Hy;=v͸̎l+;m33Qj"+mJe!D8Q?˒.,k'xJSZC))S#z; :,V2k' $VQȯ-#SHBdғjZjiih;%G.JH,#?k7,j=LT毱!6`i6P.:2^D@:j%_sqG9`@:S݌T6҂-Faa!Oc}_tPդ,lj}5itӄa$O~wl%m uU1KQĮ. 3-}L*NG5/* <h z~7H\f: }ůPdqS6'̲oPIխ'b~*rE(Αdq؄2`Iwm=w:C͝{vrΐ3dVyI +y 5,x[~I(!O)_dsP:7%I~<[-F0qZ'>8~(8xnK6J5A= d˫@}׬9 ;]8-=̨[ob[)%.e%5K]YCjYJ#Rƶ1[( m\QևBAP^北] (=T3{Z؄kSyZeĥ) !IN#Lp}'U5/)P.wYqV^^WqV=E䶂PԖqԕ`d⾈G*g[b*"cn*.6ՂEb~ B[A!ޒ[BI5Ϗ,qƝ4RSN !+&S%R}F5zfÑ ,KOG[n2ڕj;"۽r47:B8KEJPMm3~i+s1W6XSǕ܌­.*UpD&!aYeZRv5LDg8ZVDSho-dHuѵ/Ijc,*[Iuޗ CIFÛRUЭFݗɕ2U93RV_ladv>-؏r q .Fw<)nmٽy.DePۡa*9=4-8쉑pg%ВF3Ԏs^ZOw&1J|qB3% (r6UI7]u6t 9,PR2{;ʭѡȔ# ::[ s;zNY۬ [-8*e^UTrb49F-bN^f6=vW^/x.2'p!ljb3.4NaĶiP #8ёE-ǩ*[J2t9k'MLq mhnܝ.HuW1Dd£.f#gRw%Kpګhfˋ%zuz]n:BIEi+ Ìb;:ҕ*AUz㼆dV ?:G㸁#)hT '9O~*&$!8pRs)ݿuSS{Eؚe#2C/*ԒBэ&^7[]OeAYYjfGG׎R |ȩYe)JTBO3{*aw/x(bZl2J(|W-.K TRBC9œqYon)(”}Lı˔rZΜT)YiKhh+|&qe#Rzin=Tc6iYn+>ʔ91e0|B*eR=]mV6*:팅4e!RCc2)Q֜mo+L!PI;߃P;"K-H vڱX%lR;-a ͝ uVt:]m7xM<%B\r(ui[BqeQ %TWʴxvy6~ vƌ]bu+eO8}L6!csӺG Υl>9:AO>|4tRICAIiNwgüOvuEC%Nn!IGm全RH \xzºC Ô0v7-XТA=p;[W-Ckf@pZݎ-5*Ȟl~JpNX==ǚiR(M Yd#F5TJ; S7 oʑ)mT0=}5[(! RF@uӸㅤ![Hbn4۲6{1>e섡dycH"4-eIJrT1V(Ca6[ђB R)A9/VCH`2ʒUZy9ﭹMmؗK+riRDwJWPTR縌T>$оYJڎQ8jeҧS! SGXL\ve9%FfCcVwѷrc2dDG--pARf#>N2q0 ["5[d7w%eճySOWC(,6.ŵd(YO׽Pul|6G?V®f<gu)PƕqUbx 1H܁ w扞.Wu9D6ۖA6mMLڟP؟:8cN!!.Ġ%%Gg`=WR1*Km0jVF|jNˁtkSL7Pp)# V~ۙB>)V[[i߱yMa͘Ze̒CĜlG_bIEjKiHAoJJ{9{TemRVsPNP2HHq$ۈԕ^TT uַ$HEѠ[aeJJ!!n1VB*Nw5 {AutHZim} ·c|M5uq *eDuj7bƁKoՆTp^ tXߩ56#c͔q0PwO" `+mJ‚)գu3X.慻.>ǁ n2Av[U˟ʎ,6۩9=túgת/c&k5"[a|2@8dWw5RR0ςVB,'ǭ}!v"i;anJhe?c@YTu4k%MAmAj}b1;8/NUڅy43>)w~'1K2jK5 ۖ!IB֭ FVXΔH8pj5٨<6ݤjxdu]a/}*ކ>-,aAՍw*$g&YCﯔ`!gCzYvm֋TODRpi\pP3Dm`jɺҙx+mD{tҘ 1X2i:}Uԋ8݆vƛRcp~ frK9VN@v:b,(8AƝqiTh?.p|tp+ZKn%@u! #YJrr;ƫ;pԻyœW8vݚXiRmme q9!)=I=ef"; ߊW2@@Iw N4ql."e,H2#rzm{xuvPb~sc«P*}6*@C21DlV`5H-$GH{ǍB;*[(tSsB- VrzՊliwZtJ5t$w}5DLyN%I#hI횮?5 K{)|X#)qHa_/I-h@f/9tҴ' `ҜmOڞK.4rHt95Iw'vدԛ%^m ABclzEN!騄XҾUmKIq֖Ru3o]^fezmQ'&{#J5ri3 ^fKoPN,qH5mO-I\RԠ8$:`]G.OS-1e(Jc}4Hs݁Hq_Q^i=:=g?ioC6ҥ_Z?_ßֿ!WW0*JQ@QEQEEPQ@QEQEEPQ@QE^joiܯh~SVN-ƚ9T^~Q]%( (((( (((( (]٢&D丕,6GeN}{e m-&BʜHS劭YqE*:52Nmi,¬鎴[r>{J Ӻ~bsm}ُ:YBcvNGHZsd)sR ҔHp X큨g|T䖢6b J l*cd-ϰ87ђSݜ沄&4JzY:d(RDp@PRbH=ǭeZĺ pYlR|N>5ݒ6ӨòIFS5G$E2tpg7<  "dp`BfKWiCa2>eMHԔTGSV)#*{ ZT]?t1@e=ǷQ]s0{nFBlJr? 9Dȍ)aJB ߻t*5ۤQQ;)%XebZ'Y`v+ts_ q,7=ciΤ(uIC-)Ip-g^R 0rXzc >H(yTw*;|MD6 G3 >FG KȒ\ȥ:ƕ j_FCtΝ7EӹpkZlXrd"/Rᒬ)(d rG6i 2uS uz?GpF>yB wZÌ񽑳!"1fK\`%*:HOTb)nD!hܦZcPu GE (wT$,PcfA idgӮ<8KS\ȡ䄜N"mCe<4o'ӝGO[#BMVض-KAPkm7*ԹhumV\R@$~NNkKjS^2`d<}Qnk1#6댵#%%}>5cm-lvdA3)q#T:>i`fN!ā>#UTM:䦮.93m[*\8]a吕ǁE&I[d-R4eV*w[*(%9VsRy/ܘ:Kd C01Y( _1N[I*p Uf~|̥c'INI'ߑv2ub&y3 .-T6SgD@)\$T`8[+NTeG;;לg<) |H9RO,Xεë y;Hʞ.#mM<Ӆ ԒjA8SgF""%Qq9OD%JwUW͹3nYeaZTjj~X\]5%lR.&q~p֣-E#Q =j?JR>~p֣-E#Q =j?JR>~p֣-E#Q =j?JR>~p֣-E#Q =j?JR>~p֣BqonԷ4nW?)ۦZW-IۦҽNUJ6((QEQEEPQ@QEQEEPQ@QEQE]JJȉeA+N:85_j}߭%\m/1Sn-j`  |Ml?U{ 658p>Y8p00XsMUm/KͦG&#Mg7Ȉ?r#Fk<0LC@Yf9617@N}׆li^sB#HO1悕d1 ȏo:mg}`8ݤ$잇rpR-\7JMKx?!p=R$kYFZn V'PUw3Fγ"^gg툫Dq(pXQK|@mߊ7~uV)m@v;T*3-iNq; e97vԵ>ղ3t'Jmw-$L4~cLvVWi}~Iom86uwL5IpJu'=NQ^Cql~ڲۓhº3X=+xtʤM\VCYBy(Jp3=2hΑFRm+;ӆmK %*JI@0M)!l']_ݝ}h"#O:ub}IpnP,Zm BCԔA$`y}u,׋vQDXF;yF®&ZVr[a`:|>8r^S0Ip4'=FI>xʞ9*I2:̴Kjvի!Cj'C@Z·? q@f}Q\V >@RԼ4).![$v㒌w9ЯzzN@*b~)<%kO@| érqrʜ'VH.m8Nc +mPT-)$zTdʔn%cXeG]T'KR}Q憎~q.iKdsUg[pCˑ%yJV04TfjT4ڤ˪d{X85MoSM<K pV+Z @TߖZ^ Ze6rq JہJ gJTCߵh/&!Ȑ'3KRT7 BTү Fuhљ;4^_MHJ!{#w+%xANmftÃ9ۊȲh: V@P꜁56n*eeš 9PjIpTAUZ4Od|í)hiGku$[i;:u{$wEz:ɼ8䈰I:9'}[@\XJ$CJ{B~Dw櫟.SXZYiNM)øw;EZԥF+9bJi (l3l8!H>S8EdE )q#FwPMlSi5)QZ?iONI:Mn^1Ֆkd8KneCi;j*GɳfFmRT*:=$管ɝkbdCBWrO*rT-+ I_mԾFJwUS4_$h.[1RdaDdt۸k;n BDZ2‹'#SZcMh8O9íe]6zTV$u5pTH֥!lԜ W8~ӄ:5L$¶Q^DK-Y͛߂=}R{@Ȋb㨸Ff7L˛,4SOZ}2[͐UzUINVɾ#AF8vRV NzT/٤@sIWTqmL% R@Ԅ4fEPr,pv ⵎxɻhbm} -&vMJi]H W&ALH)lj2+.F/R P46GOnJ/;zUnyzAHq'!c˻ƯV澴K(H VY|x\-7WkmTTmHpk6$.C딧ΥbFVғRF)8Z؜Ĝ6=nt^KPeGO/nvȹ.{i2sm-ۄݮdyvvk#$3c$( ~i3Y{KO 2Ju!# PiWx9Q]&\HFqOQrD( [ SZ1띎*z9O<1;(ҭ#=gp1_ltR|vj:e) A]Grj: u+!* B{vr Aq .$Q{85[݌WSuKlbJg9QF~_ָsv߇jMN!!bnKð2RTJN5|^Iyghq"c@r5zs-'+y,M{Ju )((2 uk}cU!nUSm4H@Es0'Do/?F~_֛nǰ;V3&-JGRpgROd:V~_֍g^#$.(+DRT~Q8dRDt(/C\Ĵ{ k =h Do/?F~_ֳ^+yЙRjZ)Li }%'l֬*B!s8KgOayxrK,(.?]z?}W2G#BK.TVseʖ1Jaaj.#xvf~G3~h*e߯isYebpbC`JZZ 4lN <$>+VDS!—Z#=7oVЌl?}Wՙ4d[37P-=u+g{͔' [RVRRt$F74%J+I֑oW2NUBC?M9UˑVdGíQE`(( (((( ((() Қ RP\Yd8uYj[2Pj}ؘR䄽u j5d}Gu#h}n\ɖO)rgB}m< ÍխWRZAy}tX-zϚ{_ 6]d>Kiuszs0F}V :wHÏMZԫS2$=)DܑRa|M 4ȯOf68~%u K"CG;(|Meqp;Gu/mZÈyrTm H'*{-и[k$HqTeJtV>&X]Qz.u=ҵB~jk%|y/RzCfsK['rIJKa#2w'jDѮ,=w{m--ΰĩm#*^YYθKAR@Ғ䂢106|W6L *ы>LYG ܋" ! RFvU/|r\bP|"4ea)9☿l}2 ZS:'Xt1%u rrMV -74=)Lt(g;ׯQ086r7W5vd6Se 'WӞۺa80jqe;:JْdIf)v5h$c#'mKv*)ޢi Clߊv}dۅn(YQ$zi6El]Q'J)ppVmRe:t t5*Y Q* Tw1 Du!'R@I# T7} 9rM,ۏ" q ch%$]p%iN!i77#aN<>'Pqe] L;%%xJ@( Vě{N$' 8{> ;TLdW1ӫEϋ1S%)IH=>g,9x5LFTOM [@w 2CVe3T%eđOxnMΖTC%,NDwjm)rn-Ɔa}!tφ:T%ƎclsO,w̲7iC̼jCmt)Z_FW->svM%I+ԴPN)L 6*uBŸAi)l~no ajZqJP![?a PBJ. f3J=[ ;Q%tmqik_e>~Q9#[RR פB:T +qYJ@JBQ]:}|e RԖ\KpJQ 9'W *O"Hx7>)mGN}~jn nR<%$Oqm/Jµgn#*3mK$PVj_CD^h)eBjض 5/sÖtI [⠴T6A6%J0NWI5E՗!ix )gu;mQFǧI=K%R:6ytETŝ8yk8SFOqTk R < 2D某椭jgeïy]RU&]\MPSYdo>'?w:PJJ wR T(@R %@nuϝtK J-K GYCE&2K u1ئuRq*'Vڤn.=* %q $j6#,Ź['Se'`OR/:HÇ!K :] *q:HN}p*@t:%!:c%'(8RPT 8=aۋh #驞c*octRB㸢Rw ͱNsݜ.JRmH|ګqs-! yN:A=~=M?sKtAeh|CJzclVq4i=Ēl"a\y.ǧ9&-a0 ?67| DDG- iE]G[k%Ci֞Im琜m $ 4R,=JSf\x.6)I;q %:e[nGP02ָ<Խa1˄g>r ]iT=J3æLR0 B.hn#@@|`c=̙MA.5@+^I=>z.6s6)Vsk#Iʱ;$cy֬`&=;M+[{uű!t0);}/4N쑊}u,U[ (VgjRrXV$sCyP XHF}v/Hf$JTU8dC*e_O֊oi6%.(%#QegICn>[+W3:%#% 5\phN@ʚdYm˔)֎Bp;=/,RIp:P RF~s^0pnNv{J&楩i@Ԥ(Rqׁɺ6ҍ|8=Vʠ%HH aJs9 ؖmĈjFNT*07 [WJ@BZ}JmݥN؟'f[m%OjJQ͊2T47cr;G:4ATd8eiRPҒN A~,|/?IGFE㻄)ou >4|`r1aJ2ZSO(pI TRNW~,QyTJggTh~SPM9UǗ{\O(((( (((( ((wJcd4!rCg$|Q/8n#YӊvY67+8vR h-=4?9I?5k7wKc@MfXnRo3+~uKYzIzU~NolPmQ8RD)aƬ1ӑU.}v O!*(C9+}/2סDY78ÉrC+LJp?j$T׫ uE Q5qqҋqd̼l%.=>Bl :Ϗz(K*:T<) )UDjTI*Kj4S6کZ72PynLJ}]$}_wM!>ww.H;He!dQuI9؞|R()s wJa;@N>tԤ`$l4\ayT@։g)+g( :T@ mfSEn3*$ٓI;fNDT@@)4r$+DG :Cn2NEqsq e9?5r(oGl2Jjy!I!HW집НeG`~ʥaJ)tk!X%>&fmQ8uėM HZs5lGNökuۨMq]@ P Sr^m[Tdu{A59#.߇*BR>ޓ|22*T7"1u>nB JzxW  lImp6T NF#jIcSLE)Y`))h㜃ݎ/ihR%,JՕ!e$gύKʢfOp27KJ"BI 9)[U3 !R)Km#8#{m6[T2Ԝ,Bz-^riLx%*ZГ*Q TR\<ؒK1ݏR)VLL(u1⺐;MlzL 1TmE.]]A;ݗq'm؟KRBBW{uQe6LXX 8yW?ۦI-&h Cda Q;jϦO77!De1IJI؁j!/:Q݋MіB–CUk2C ku˩tu*zOKTl:9a<Ȯo-ȌÍhGҝ"4‚Q+9}3MB(m!l )]pe"jYq˜ihm>~u1 C [1]BԉKť$`U V:Oy}4qNMMFe=v,ϠBv=>q\A~!9PI%H%zhk+ʘUO).7:Iܦ̹vsP *lLζ9 Ju"XZR}sҜ!wˇSs\487-<%o6BCt[S卪"ts%`d)[@*,sXTu3 ((+Zq&[IYDI=7\]0H z6:`['$!!ߤg\ZU؏5+[kTI\d2eI$dṪHxՁwq/M.cdDG)LSw+nsĭ9$ )zT0u79 %N{d4F  ^;ρvԌyqޑ%) ;)qHDw%KK>he GZfvϰXhO\C%!;ƞ)PTYwq:|)-i~w.%E%(>b@$$HKH_KjqHJS%8ίZ $KbN)&3iJ2RSZTSI<+KrL<PDvswⷯG+&XHǟ2#?pBRpAS)HpCc¢mКdZ{JT ;q!IwwW;LOQ\ssRemQЕ%YǸW+KzVomqDz͵+[q &iGB ZH$QO/I›Fe,!HJIQPdAjG9~_ jG5+hm4X sh:PAPq RR!R[}6ux>-aAn@$m&#S!+B{8nGw6cJHmJ]();-֔)ZJ>ʯ1LJlN:mk';5wʎjfLE%qqʜ‘)IV鍭?'sE*O4%I6?W~$;IxqQH+' ϴ94@Q X[i5)GV mN[ŗOGQTch*F_ 6@p&3@(YRBrJ k^T^ `FTI:c) LWE՜2S`g4//Śd6 *s"%IjNBR4wV^?*2Y|ci* (4 (((( (((( (*fhuMli=􊜢m77]Z\{qhUiq?:I+dpbtv%p8 Bx559&q^]هOJKmsZN)=qzNHgx×ϓq|쯬, k:yQ'ے+vӺWZNt&GpJZA7^+qm( ֳұ6ĩĴ]uyIa>'ΞRz>oI߹,SlЫ>jz*-UR F~9𬳄~O^u<6m_J[3"!PY7fP⩾PWԼUH7 oR$:s7R摁oZy(Fٿ y%K2`*L0jJNJs뗆:[jRN! n H`ڈ)=o*Ff=+¸Tc%tzrn+K3]z#'8IAK\Ym zJSi*q$TR]R1ԥ4+c.eYpoyѥ#3J[n ǔ+[+mZV|6R8 ((q|:ad W-lR\UՑ鐳Qn$NTOdyjvv]oB)oQ،sP6[D.uр֭Nq;*Vn$͌.:ݒSj+G4%-03{IL+{ -jqzA6ȮHKK:FJs)w¬^Zu]V6H2vKnZ҄`dU/TR5Ij7g{Q[.$Šn@Nq7%R2@\u^a|CJbl-9}⁂`O*rcg֢4ǪKhqXgSqHK&E]?"Ͳ#WW܆Z[BNāϝ.ejPNwg4\KҦ) !IPJ NM8UP:Gt"ﮭ7ץXUT\G=#N|:mRBy,Bd6Bm)[L1ཀ9"L4ա띺krmѤǮ@Y=qZ}ҧu:͹ ץߝP燮Xt%N%+ ?]e -[nsaNڐ-*qH{NR;RQZE[[xV:Iu]ҲtN+DCLP˻or{dn}Nt |>岀OQTH odoKHⷦ.+q`9l:߿Y2^β VF j*v;6sZbDe2r68v@\jR:B 񃝩{ȏU RI8JJ5mE uiHtn7۾!5Iے%"ZĦFܤݚJ\_:$gRJT GmsN/)S-ŌjJ^;v*t6OTUuBblQa3 O%/Yp!o  gT6OzV(q)*b m@J$eGTQ_q2-ĘG9zJ8+5flExr!InK䏹m=j;UF1Z,6Tq: a8}ZrQ+)Ƣ6 9Y/vFOK r>J7X8JH8福 +):S^6MmlN j.6RHַեR4cSB-gQR}:ʟqVɍ01N#݉j@SB6>u@ ZKNƢmG\wy岝 olFaIH o}:^PvSiq(>$oR<Xr]7mFBB@W,koDWSRWj\8n-# H>gaWn9g|#~U[MMJt{!";gNbrިӠJ` 1CP (=ՔqTDwֆ,*VfKNB2IMn5zrY)S' 'JQVu~$Tؑs t'ȯ,y%ߎ8R8 855]E˥ҥ4wN;|ÙRX $yn+Evd(q F. ନ@ %[Ym DS5_lqy[0ȥ!5"gJdM\ <*}mwC/(yՃuDdǂ$gZv*k>zAO[1P))!*>CLT*Q*I% Ԙ^j1{_"NNC9 ~,O7OWSD}C ?=^tjBҒgrTTNS5k#^(j"ʒ%2v ^FFFgzGGa [Ε)$))8R jqb׫__[,D$d %8 㟜S6Gq*ql*ZI,)_+0G0$gw\5k#A[Zxal%Z/RВIlԣ!̀T*ɑV]%'tƠxkNwOv?}ƯM~{ΌБM~5k#2|hE!M~*P9~{Mn R-| QG)8AIGm^u과F?~GC5U#!] ;*V{)Q>p,l˄egy?Gxs"9;eqXG+bEPQ@QEQEEPQ@QEQEEPQ@#6+b[IuhP"n2c2IKדw(~mB.ȊvVPjUz_RSyq`|5Tأup?e,ҧWʢB;N2?:η+w m lEP1P<;n-;⽧5/EUI>O\U-P'9VZ>wt[Q9}hWNwxǣLN3Q  Aja%dܷdq(2 ۸G乃B)m tmrum JBAbƗ ,^(JAK5u25ۄJ9V>j.y:(J@fH+LStd&@FꆉRj?{cg;2B %O,$78vnsk'e$V،\n*L烎>HCc {FGZs?ǶLTuE.A+\ ^mv!]N lVqYU3kM5$JRP4-pUV1vdy\i1Laq q=*啕؍Fy^!+ddtrّfi_*IK11+KJ+[xdZZ:lQخ [ZiזԦ1UޖZ:y*RHrLX!ŬjΔn\F 2Fkg^VٍZmj[DY;ۚSzVJy}1[n* 9Tv 4C+$qʭ6}R4ay! !IYiQ+`jnIY 3}>U‹=W1] nB79=vPRwY>'νalKmRKdmAikCfHuPB0,Vnb$!1:HBہW,C(ːPs; r$:-(HSx٭~OfK*)ʜRGpapwHmJ,FҧWy8Z<% d@fIx+@zg|qM- ;.BjV(|=owmfףCJR֕>TN#6jgŊL%PBXP+.ix`5s9[Hł9KbCm)h<=x#5%=acmj^}j95oBRF{y)7>T!$#%8ݗqv{tRB FhJW]G ks Kr t$:ӰY#cM3;l!ąL$ukh!mlmNF0vwTjٸN&$6]oH,wxfje1,9+T7Ta]YxXtX$vRVvSCs@ԓơƬ{m)%p4 ^>F5n$%ds,5{}3zDB30@ʜަx#K/W9C,'fNF z^XdKim;RT5:y8JqjMYns6S VW+J6,X 6է a ԝc{]fY1=9+m=J>>5'i~[{xeC4=}ꊋhl#qmK\vTbd/QZH+mzwΘ qTN8wZFswɦI=Prʀ*V +=֚Q̲ɮI|<{܆kS0uem d2RlGBSdO]"k-:P\e ԝKIq_]K5Wp}ג.84+j>ox{oJXt >n~5x~ڐMV ;UE4Dur-4SMeAIVUu܏$qKfFC(u(2G:׹';v#O]GebסHN}P~P{ԫEכ.k6+HjB|^Bv!eN{Cee%PI%$pNUZ_ԏɘplB(̂( (((( (((( (((( (*s#smT- ~ީ~NvhC@ '~!F)85i9rJ҈?֕FdW$q"H-IJRǀT:mUJX . Q jԂ AEKƣ?M/2(BnA*Q)%%ˠrxN)!NcY'aRK^zWhg)ZVpWԋS8J#ci9KRX!Q|Ik Gk9'=Er%=TGc.1!)%J TVz8~&3_VE +ius{$㧕X|:ۍ>\_l%J81#uȈ[]nzi@jm^e0[ҔI9]G:RjL KJu6VY2>eˈL6CN!({iJPJF R3Q+i<s *p<]m[tVS )JO%e@tj`f{/PVBԤ:#mĉ}m'c7Uioo8{RWEzޣkveoNYe<з!0چGh3 R%)--iJԋCGJu$a*#>u%2,H!N48jt["ۡ d+ktI=&~s ӝ)9ǞIo:ԙo4('I(I?UFLWԥN}̧I"dQlfCJ*CsLIf `(So+pHOq =imUHzXڙ[kՒ8JՂoֶF[~%(S YHp*Lmeqrn\(huٍ`HIώ.@=̆EGONd˂z+ޟ<ƘIԖ~|zfK߅d[!ĥ8ЖRw -%KPufk{zIZ\ IYo.Bͺ&ˎimE@rSEiw^Vo4*i e8#Vu$gtt"jm5.fHTp*IaP\@JqiEiJbNsv+<*.3͝6JyyRQoۯo}0G-\ث.Mۋmi~;es[iV ҴOC/[̺0 2Uo:\ڄ_-{ 8HQQm)T?'ߟm,ɚ'B yIǁ#5ج+T(˂Z@QKI'=H{ڮ|֗%VI \^8vF9gS&M,2>Z0ťʂBVTs7OYecI*l Fd,gpr|+EIH9 U"袂|`R0@-+$ 'uj%ԃ9r0ʎ'zXofۮ])-§PN hjJ5&\w5t:J%YB׻j%!( tJ'Wܣt$6gVҡ:9Ni=2|j/G'~=FqF0${W q_5[%VBU3pĭܮ5mEΕr:OzE ZqʍOMkv2^QJ$$;x}m&uinJuxW z.+eУM:263v#=* ĘQt@'%XRΣ[QKlۅ)iChlHm~UAm&LB )ՑžҤ!G@lp(tQ!MF ^^_JKL,}X#U,LCJq%*/%6ű mH[%DH\O4vSjo>Yc?Xu[*(&:Hӝo\zj45d3ߞ̽>kXgXt|_Tl/C[ChPP( >R|_qB_TkRZFRq:c8$XF:>Yc?XuWvEy}1mn(-vv#?akZ lReX}I ۯi^Ud$>^.Id9ʎ>}kwٚcf#<[Qs=il'H.6 8; |{SQ4_?̯~PD_2ȡSq\B`=H6>cMyHamY>Ý忁e}^]EקN}mUۑ ( 13JÈ>#9i8W %M-%wPK+u?ДVo<~1vͯ9m2vͬރ*)h.4t(v@BEApJK*`橊\ؾtnN׫ktEV(L( (*ЇR P5cJ=ET_+W3WhY_T|{̈Re1Qc2"J*/ G+Ȋ%(W3,f?*s"(Y_T|{̈Re1Qc2"J*/ G+Ȋ%(W3,f?*s"(Y_T|{̈RF~*8)jЀ(,e4lsrZ0Ԅ-:TNtI=횦NURp}ˎ-:P9 N996jJc0!2T`td`g:zdҐgiz,(u>G!&IkPp!e(q߇a̳՚m$k S4m渗-ev6Oú=W Qugq@=V Ǻ t DtjRy+!v9`¢2NjH[j|fCmJ@֡ C}!L)vtyW־"L]Ű/J%Ct (bRҦQ)NPkܠ~wVQy{/̣+~?)m[gթiQi_&:ӷy'X8z4-I=/' (e٨u2}V B4tn-,xjhB$_ӠR[rU*vSRCKh3RaNF)Py .ݟzp]iY (일HD ZJT=^užJJ=]A[VDةEj}ЧД*=RnnOL[eL:Fz⺏^= lI5 =:V6vUv&6φ"Rv1or`L/' Y:r3NGj=r_JPߵyf{lqIV H**Ny}srK੽}Qf#^ߜ$Kf*vXRgN%E\(7'KJ2e@+sTR,` 9.JdHa?Lǫ4v6P![ENGR\F5gPm9.=b3(er1)7簦Rumq#,MF)$@m#D--ƁBrAܚI/M(Zr3x}ԗƱ|múvPQ;I| r؛Kr0pHmzw~Xl%.6ۊR)HmHԯQ{﫡HF=PZiSUN#\p|lsb=r%յ@j+{ƴDg B- ΓπƲG-ڭ.Bxit%.i#Ư\ԲT!3~5XIۓ3pNmU_@CܖRm/=dcظ 94t X"L.b9Рtj: ?˳`%kSLj%J'QXYq=Q%iBSe}uAmJ[) ړvMv]Cp !2}ҞTuM:3a3G+`:7H8w6tgxٶH&DsjKa$:⊁>J;r /ɨJQ.S$T{mKnB#P 99VR]g TƾBVߌdd4 YN0snx%[ڔ!͖q+q"!NIJJs{q-LOWƖtm3_udNf#Yb#u |j{}Յ!jP0RJcpr!:b')ROuA!6X,TG y>LRV0^ ;Ñ>G62Zuu-(wJQ NiuEQ&-7󖠠)eDՏ>$0J NiƓYtÌGZǯoRZ>+v3H[1\ $yRQ?EwRxy3lZ+{RT=}FK9ZsRիQrY>u\ZZR@$L7ؼ&Nulmqbf#4V^Pha>rڦ Pu8{=}.eacI'9#֕8G _=Ebl[^l5DԔs_(Nwt~j7!ITU-;:p'NHH8FtiUqQ&NZo'H#vUaŌ8^7m,S}aY#=澠r60> LvTM6T%! G'nns\<|`~tߕQE\(tՙy/&5^+2B( )l>jGgDӴO1.l>󫂅87뚂wh:󚐭yRVPQ([Ayj[Q--BNj#p p.eԐ WTp3@gajUBLND3ҏXFIF=Mq(!6F0Ca8Beg`}]C蔝*PKʒ57질i>g./B V:%_,ԿO} O&IkRRO|;2Pyn6B N'|Jt-,s. C 5:Ki#kVt6#pa[Hi̢D mQGd%oʣܷWY} gޤ-Z|_7#aNܓ`n7[wo` Ї6_PJzDo V%*P)P(!')4cAiy1_-ўHG6c\@Cqq(sHZ8z{)vۥ$dFNZNpFsޟv+ɒn anKiRAQO)a\NrBд$%g#'ۄguYѦ cc !N!/5n`?jޗakn3qPkQ`$ *“by۔"dv!;⼗%M҄LE\M9->%Vt;o]B5q^YV>4Tj! qA wrBV+e'J\Vwu?%'-r63)%=r$9^}}{+ho䵥@:Vӡ*Z1Isѻ3Rii9h?>Ѯyu(o:)+φW՞onOªPcKJԭO$@RJY[B6ޤUnÃRh i'$v)xM@u,RCf" M9VOe#;W\b>/!OҟJ^p^u9+vqM9K-)Nۿzw-WBM֝r Ć`)NijZk iֵ`SV{Z[Vm;$d`E%fjqHJjWrѕx 8Y5՞FCt:VRi_TN#Yw:œe05E MK PG}fkkiMSDx^wQ\LImiV1fY1*-_/\!d+X}nv:}o`pBf oeZI NzF*bȔf 7& jRPiFjRsUɶM.lC)뤂^qҤp2F<[g I'k.;a(u"DfY?ƭߨQftfoK89Cn5:jqyqwR՝9V}[iR7uߺ䶏ICm $8#qc$VvݢN3`7>֕''bq<ܭҹ gJ)cV2~b)#Cz\XbGGA$xg5Ak<'FUFST`ڎk_Q\^Tp@JJzZiL#)\Y4(7xZ5S%-˜[{*{GĞ]ܡuc )Xs8r1O8>Tv1JZq-4ⲭJ O”Aݵ t:@+{dJMv:Ɣw/췮0dKt,6ڵ6J>XJh<}i3MD89#W)G:| 3Or;J=WLi ;܎l~TņP k!)2NN-듎K9ׇhoݚ{1s$2hIOd+=3O"ܤn(7ȗ::(3ˠK$m+Y9$6&\/PSRl{ kb%JR`?V*$RRڦ)t9ҞW9B2cǥy%oJO=<ʓ9XH=s>j!ǎsYMw±drjPBBu,[TNyt1DsFZ #⒕-;L*jpX(8Y˝HLt2@-pqZMw&Kh+za.5sHsvqZDIjAIiP;s>mh4aS; {]jt2KJ2A"T7a=R46v+sAH퉦Ld<$aA ږsr qiuI:Tʽ!c6 zBZz}iq[ǦOL8bZ e㼒̿`ΑmRR N}mVImrbTWpRVGߚ4P`A O/KVQտd ŏ"B h l' Q\ۈ Ie.)kcw]BBAP8[ē:n+t8GG:JWJRҗǘA9ڑh.m$MFĬ58`{-N.`i]MN\丙6T۾*)!QX7J[v5%Ԭ<L=} ǖ$IS!@m'.ĕ˭=T<J'R~X*[S)cCD3ܑk*)ԓOƈF:f!鍩nZ ;l>4 Ym#udꭕuGMrZ$Tv|\篕 kRH=Iھ q5I{ȯY-EUŠ(9wGK YGjXeJ ($(>7\s~*lm [ m-%)ژm!Ǖ>CtMի`La "cMy#`r;*U i5A_ -|h4k%sTLumw'8q&]o9NZg|:LDqnyvfi1ԡK$>xu@ %24pR@]̎WE~EQ%l L8Y|Sw_-\7K%ʐГ =*W@ҙ9ҧǑ#PrkmzoO, pLuٚ+Ku%'#mMFjlIdcju!unR\F-%@vT[IUpK\O[z j65lS1&-+uiƬlĶʘSoGJČG)!)fdBYs>3ts~ɲd.7*I)'jMmrL|y&; :0gN(('_Ց?GN'HuEPU=,%KyqJcoUI\,X 4dU7'R9RF,lMԩ pݵIّ-/dl1҉s؎eH߿v#w"9\sJPB ԣ F.Kѹi$uB ޔ a]5xtƒ LwVK $I'UV* \DKoJ9N,ACMP}翻'5%ztH}'Q} *˺,2m UXh8O1g~C-/r>ԙ)A=}˞ UGO6R}NL1Q65yөREHBfH'`rz]-ӌ)fJR տqyW2;%҆|]R \㿥5ZG-tϳwR'պs!98CLb< (tʻdYXKS@- ^!(h#4mf yS gB|5Km8pcu.+-jt _B0u[Ny1c+dE[Xf1ƥ~;[η 'e)$84^1_B)i!}:t?EtPہB` Rm:|hR@ m[#ݵM=s  A߰4ܷK'ć5++dd3)%%ܔ+sX_]_Bs1[Zjw;OK7 F>?5uprcn+ ya)g칍b ZABT$EΩC{CK -6 Tyk#uVt ΎVKQ-t}ztM睈̫lGYKΥ=zr6<}[b;-Pm L I3eBFR}4!%NA Kd皀68ɶ$Zy%9C˜ܣL{tD3]uИ>^=g`*aX),D`ung^H$HnC,ݟ WzEL JVi9IY}F2|S*LehdE5[$BL.Chp ΚnR,햧irUj !-N#YHm2R.H=횜SQI)I:DO6A SGφ<Em,ɶiCt+Nf*J%Amy'?=WH*w*[[u|*3aWwك&8ƚܙ#M+lł DaI?Vf^[Jl=;GMV-,*5sBL6^%$d1tT5sY* Dcx}]G4cr.#Yl?)ݼͼF9ܪ'v얕2n)`)'PhmTɉsVjZ'T 5ʒRq\Tï4X!g֋eܤ']B[BR]b0LZӄd>Bv~ LC:҄'Pst[)|TyhAӺNrn>l=Ɉ;ˈރP|erD=MTL)br'[%ujN7qjvzLjrR]N]N]֬͡Rxy-iIPy(.ewo !lMDUҋ@;s<nWsxeGJyV3G.r景>Zf20RjI:ƅ0A3Z$Բo*%ԕ2fǒG/Z]>XfGnV ^)³Zj'cV}S]JK{]K洆Rs;M#YW,5E|IB; .o|BԶ@{9qˊ8aR9-˩;^uh-e{! A+gPq%%;˜}O3/CK*BA;Y4Ӈ~L[VT=H]QsF7:LjCoժ+_*KHvT|{zgj)Q9FH9LAm =OMjfNO{g7۲ `vFRSQV,Q;M!ł*Jz29VdI~EcSڅ8e2ZsԓҒh.LlCneI†"ll᥺*t!jN z+ړ^ j)pwud[.9&jwViLp_n) x{9 + 9؎>5*QXݝ&JZL2 {R^֖D\ iasH# Fc!K!wF ) H`tUs9}){v,9g-C@:#MK,Cc7𼆒ҶCQ GBŹhJ!2]zxk?bp+xk)ȜԡSe#WP~jZAvd)ֱ$:101_ڀ]1 V4'8YKi颩+D>M%.5k ˿U>x}(ۛrdt;!1y5yᩎHLs-Hߌ'ʪC{2l螋qW>@19]މҽ8nuy8t%!HP~ ^T!;Nޯ7o :Ͷ*ZaQ9^ٽ^e̶ȅ1JYe!IRORяmJ:==˃ ,Yw%z0I \W5[u, <=2i)*;#_~H& G<,mRNz4mq`diP\tVP;O #!X  ӞxQšK) &KUK[LlոcBzk=AR(;G'M anXqM\RHSV#{bHA6ŕk #xoEcR>89D;/YډsW|/nrաz|ZߡBqdiN:S * 𦒽pL8TyMݞԬx $7#aZ0{6ߥI5x. @(=P-P3hތ8*G0*yKC|ofb1oDrGBi'JR2w)5*'DQzHeAm#OE.vb4QEjP(tՒBY qIJyjQj ^J)?Xgp+2E(aXgp~ =a€RO(~ J)?Xgp((aXgp38Q R~[G38P QI?}o[@)E' z?}obVDU:dL?U:T(%Za^uў|7O1E: vuOwRW'9h-håZςR}['aXs.} GT:U+p;X*O<*[x%C0H)\8Kh*߂6 )2^'Agz4c:ZRi+Z):۫ͅCx!-Z;-i`w9<*鏈cD̮۲.,A)#եC4_}qm K}W+G% *88;>q"4+OÞ6NݰHRNٹRX^ :ANS^&OO/2 %NOǏ<N/_Kycgb-~A U/ 'BXmv4Dk 9"B)Y*@PT;~BQLiժe_Sj' AXlgQB}] gٮrǑ;mQrɺ2m|3)KuXGOh춶Q?In;ns&.DO(u H2zƤ+mQ夻R^w'Gp#RL[Qhy+Z`WG:?ue ʒ{O-`E D1]H_-2wq 𭁖\M .5.Soy֕k>U)ϔ)WsO?y+r8GbʋU[[RN23_Lp|yaC{uԼrM0]W~ꑵ1!턐Uc^o=UVtqB7l3kQSJѿ Jm%]@Tڞ]n_dꕏG BWw:ҳY{kݞTZOxd7`HtU p<[ܸYs ӎ:+1 u|R%sޞ;u(A̕U',GRҤվULo誶$9'O.,qO꒕(e'^qt;[F׭Ej7Q = 5ԝ ƭJ/t>GB&#BR5 K+r+0 n2@'Țg苌b!,HXNSѓޓ{7(j/s. e+q{%p]Rqg(K[ TGpY6B!ܜw{U`ɾkZ4I^[u)OqH'NqxR=}5P,ڻGvkzC>z9'dǍB *W_*I6(eqw ~"Vy/% ܡnkWɷW-/%JuVP03O\wT]ȑs*D15)jQw$}`\Ȳ=j=9Ohڎɩ]]ڭW mȕ y@wwGO} vq:r#R[t9W ߸9/v9;V}ZKjr,e:2;uw# ?jLvU?rL;q⸟+"tDO?%A6I B:ϝðm'ƶͽVl$nk?>_ :S$!Ɏ@jӫan Dj#D|XM[.s"/&" n(ZMTz40-d0Ux Pi Gwi7->‚u!h$|cP<74_qTYiIlH%q#t59ZO c.S*y* ( wN5 .8I :+E0YW`%8IAuW܆ ɹQ挥-ҋR$z0b ԕzGntW>K+rK rNz_>^9QJTꈎq#z) 0F78#`գUuԎV˄2[O9$9$·W>ڧNI\zn;Ier^BSpOv#89&.~2le4U%*)^jd?ƃ0B2f:9iP#'#5| Ѣ-#.zہ$wvՎUȑ%mdE@u3hGYm wGejRzN*@Hy1  `ƽ#M\ui9k3 >5k%ZJ%gu h~8I{!89Al軃ՠg"KNG BŵAH$˻ahB wyC N{j=@Y郓WE\Shp !YCfCqoH˄%oZ2]J98P1Uɑ BU*#|WŮ%.޿?&Y/}lpVppd;m-YG)eߒ֦3,$;CQl631[XpeJT:(:I$gwg䭻3b:qi)Q'&:(J*ml̽0IrԖ&qqSjhҭԓo[U]Zevdo+i)K.3軅uJj]p^ZZٓ!ҥ.RwXZqT94N{+$xRؚR-pcWRjNj3Lchx!$eC #먩g]DKIqu48Vx>nBqaF@VT,$%bNr+Y-1C(А`]y)њ^-)ZJVF;+ln|g4ٸnUeɛ|wҞgcR֜JwؓR^g,c9Am(To<a}sD#>ToBBm$8ҊCL}}VRԨqˊ&.%\+ F U8 H-G$_ZqץikBV)$`2 D6v){9H9U^6D[9^Wr#]SL(,c+'5zzKkҗ\OZJDz+(nt!C#޻8㡴EG-Jya#'sHηq4kjpZNs}Vl !!`$ <([ 8Bz _F>9fn:Tt߭ ,qV0.[%6mIJ#jIQQC"7R;-BCӚB\Gl\:֞-i-0m# B+>{O}3e4$) [iCJFFn'Y糑pSXeխ쬿zٷ,/<]nk}Jv䠵d.ERt'֬ C{oUSq L@ZJPt%/ߋ$,kFk>UH['Z#m.' oI'X* 6(JF|*FAqq<8oEiTd%)"s L7tq:P'WB6=*neN)ՁWy?=Q $ ];*|6egTA^jRfɸ!%(y=;TQï]]d<_5Yc5{ܸ/chPBT֬\v:lq3TykJ6/)۪NOյY.wBT0qE;O_`8JOڜc"B҉)j Ht5WwnVˊIHq)ҡ^}uu{YdƲGL;[!XxM\7[_)#QekT7 NeCqT}8gs,NJ/q,g`'L~4,ojcΫ\Wx o}VWqR8;Ïpd[(vѶjW,6$& !+ZA[jpܼ,Ud} Q7VJyz$hKm J@yW|IפI,#qOGY)*$._OTWX-C ծéIԅ _If (*؊]98% +DskwS)8 lXiJHOs?QV7'7v("eDS`,ԟj9l]f9-Af8AҝV[,nP7ƛDƀETR:/?tTz ?۝" J[!:Jn ^ۖ\ZWDچ*Nڟ,g׌[-) )H#jSbE;"*Ǒpfډ q8RH#JA߿>3 s`zFȱz{ņ=U4xjCZVmcQ铫V!*#D:IRwV [wO1 VDFk?^l-+YqkqG*W~T+{Wz(pc)]I>wY[4n%>zOѕ~͙:)Dd N\RL!)S)I AS1j3)j;hm+<\>B3M%C(Ì2RG'TfbXD`j=ۧ GHB4ɐڜQӖԣQSП3^ g,Hr.b;[_e*OB:)M@ L^GdE2׫TG } /SV@*}9^^C?TU5Wxnp]r%[ZDEj#I=iA-I HΤ#RR2`pL>^qIY=;Opʴ%8ʔ紳I琢+\DTXN%ˏ5<{ S`tw 9=6ݸ~t%E)m%g*VOwEc,WU&%I{[tsJr-9$i!,65dd{v8f;E >|0C 8?QJ++ \cЈAAR?yoshimi-2.3.5.1/doc/yoshimi_user_guide/navigation/images/gui_normal.jpg000066400000000000000000004752251506652756400263030ustar00rootroot00000000000000JFIF((C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("^   !1A"Qa2q#BRSU$3Tb45rsCt%d&Dc'67V9!1AQ"2aqѱ#3BRS$b ?+3x2ii"`e=ٳhy E챂O`'͵LF_H&qk/eǜ̊ن[33:}º{ǔys#iUd8;Y9隡e\r<9E6%) /l?0溏Ɖ 溏Ɖ؇P@C>khpkhpz|͈) /l?0溏Ɖ 溏Ɖ؆jH KAF!ǝ(=, }:[k :?B?Ϛfro|y4js Ԗ+oycȳ薣mV[5} .U-9VmEǣ)tlC4yxB~${e?ʧ34 /͕S#.O9,O( a{e?'O_{]GDlCO( a{e?6T~5OЏ_5~4OЏ=>@?S ]GD]GDlCO( a{e?6T~5OЏoRm_ sb5 fpe3_Aj7[|sSS#.jcaz#. eYejD!@4_T׶ kg0ztPçmǔ5E:ʴzb%alҪ($L )z|͉`RW6,Ö߯[%b."F*iMVڴfGK6;5o:)ꃘmB[7ߧO9-O( a{e?,3Z+ Ð| ?Ia13pTL{=>@ĵ{E aW5K@tGa؋|1ÕfRJ0@ST&He6 c:o/ c^y$9PUS|uAZp/|Xxr\s Š*dc}CM&\c4z`LE I`@,{:{Z:\(d0Dί n-ZZ=v"dH)@)@+~19Ji4z*d[o6;22j)q"ceQĘ8;˲Z EjTȭmoO Q2?Ӡ8vȆ[%DueFי 05E٨SbD\oR1y.:,lHs $0uH=׫gȐZgۂm،W qukxyjj͈˞Ɔ]$\H u7Z3RRPQK\ήHy_ (9uoN%2L)XÓuüeUHsY$M 2[JQ[e1nW[T墇;T2K{v|x-.VOt ?Iq}x3vEĹ.}p(Ҷ7`z{⚴ن_{J$yuO/]ln1i*{n9kI&P~Q&YdKDI5d^͘A:YlZtF&4]%FYJiR+S1'n̆2^-yrVHXsd_ ~Zmi-T9MtչP:* +ɨ;2ӧ0ʳ.3UyVLO׌ڎj[1z #l:fr$bbE1 A1QՀyT%fMT!ĺz_GM]e:T ;Pwmr0MSEjjzfEo ۜr\=%;6v{θ`:AYI[о=>@Ķo"<  հ\J1`CWb. :<B6%3iK @Uk\M;:pH  ocaϼ4E_Oxlf,@ Om6% )RӫoUoi󅨆r;_g(sr~/˪,G@O={l^eFL sbG4F2sBjT#~C #&:D_w?=>@w) /l?0'2lD_w?=>@īE )>Qf$NѺI f(Kf!5(IésG gF[\ۮ :9-%B jp䢰RPQS I ܠ{tL9`,Qِ=:hcY-1w=ڂM5Rērzy8ka=uQ8*/7ŦH #!AG (X(cq63"{Mus:fǜ/ ._$ZuH$59H*n5zo9U!~UŁ6.(&"$^x}HuȏHT&ĥw7fAR!o#<$$uV ,I؞y )%&5-N34޶_$X+F@$E%VfO7%]<ק^\Rq݃u9AKN&H$Y}q*(᨝IC1H[\o労\@KTgqo#߯ꚯi}<C0'r_k1ᘪj3 Jh"L*[RpzIW-22MMoЎū$ixN)W,.ݖ1k)8's I2Gkk0ckَޤܶgi(S/y)%-ʜ׿LUky)BU:7x%9ZP{:WGJPy <[[LA)P5o(OKNQQ REդUJiR:YexBATI!"W{$ cō8&*F<=}BTi+d`{㺬GEc3qI4}I4}h*?V7Zx Ϋ*J"-`{b {so\4\ϩ߸4jeZU]zn.6؇tK,9} X_r}7,3hpL8gEfju34$~ڰO#n$5(4^ϽVS!]$1Z6[UmE0~Îb%%:BT.N{nb7df/n"%M$H4 Ĩa1=EٽkM;y!]\jf{K5`;`6aF*j86w-,1deJl%Waբez䚷P]z[>C:;J̹ *|kc˨zaH>>Q۠pjzc1픂~Qq/)s Fi}PčN*##E9S/9(ro)?ԟ7mAGL:i|`:/\6rr$Ϣ'm*.Mu/VSS*yf@llzt&;ǑFy4Eta`69MN[Ήu%|+qC@8NUK4,Zk_&7yCE,H舙\B`1EUW 7[kZ݁ĵ̢h%Z\tocl{M[8kxH6`$gobF#$}TQ@fEFSطb)qTGĆ6#[}[7{kݥL"H:* lMߧ׀ '?ی­P|05r]>KSm } I|v*&eZUFlqUǙǥ}nTJd傑WXy $-4R PH#MnZ Y];z{w$ePGRS֍/bkly*1ǽDuEAEŏqM[,rLM|56:v`:'vku?(H$EX=5 ڊnkkk[o;݊ zwg](9 n&߼cn-⚒(RGfm=/kmSʉufg7SS^bxc/ND*Xlw巈uSK@L:7.ݔbeL䢄],KcZ>"g>d-^{OՋ6M4aRڢMͧa}W#{1џ>7֨dnuOUCKkRNc#{ihs̡+^:s,O)E[dnrHZ47;ۏ36Il;O%(Qi vH,T(4-cm{bk@'#h^:E-Resդ8Jp{6qGIL O0IRX$.)gs|UJL2y^;! 5[7[LY7i@Y}ǣ%E*4sK"2v>=ՋJI @}E*!U!`_,1=k o̶y7[\GK>ɿ2Efa;w+>R/WɒX3!Ou]_|k59tC *vMGYTXk UgkI2Fcc1,X.XjD@Z)T[cp rmsp0G(vN;quKOf9R83 HbV'x_jc4^z,TUp-g=t\OMQBL4@x kja ҆%(':LM!&$\z @aG2T$R"A yn%rj!=2!c!:X}t:rh)zԨHSǨ$t,pW6cLYtTk1e~qQFbw榫|&V fpgp^n]dy?Öj*-_nSـCjGdQŒJܐy/cH"2W K﵀;4|hZ5 @`zXd45*vSэ/,H W|{_834fxOqq~?m-/㯇ԯCAPa0I .oqsb/.DU.J[P+E7 z9[fWOxreUqPeAUXu'ԛOwmzvCG2ȱkz++/夝!ġ =z{o ɘbb[nWNb&LejIS{|}ǜK  (`.yM&w[+De.X륤#(~>E_ݬy,zǡ\NPm}O[qKk}߰SSJe2 PT\if${ KZ'RY9PdUk6$m<#NU16֨~v-&An7za~_7ƊS>U_jgtNCc˲&J9&zC]'儘86RJlfYfh)t)ʈW[aF<^-9D8U^?'fLyy`cNŷ{`R{I$XI;o@Ω*L]&'Qiuyam9S4J_ĎaXW%gU!gHQIu'ǹojJJzg\.Qr};  ڞ!V=&( 0&=NǛT˚'22_g{t4\UҢ)"Hd{[koY4Leյ2̄yzcsEj:% .-)YA[SSV10%p<ط wn |c&Vbkp>`ʵ)]%'r:;F82- 2ڑ,<[cx˖'vehTeVԣ.ѝƥ<-ʪjf'M\j&w׵pv_G9DVO U4au!QqƱG;WcmJVa)X_kܑ뱶%2w!qB3{c/-DD3IS$gR6@kK_k->Y_QSFJi:{w|KT!rE-Mc[=t=)ii<ʺkZGWv:d#>x^M;N4V9lx]䠏0CMDe$$,J &owQQq;um&US`R -i4^dFQVpFRVjVN˸<(sUQ!#b{ۥ&ZyZq9]Ep/.e!i%lw KaRl5,/RezYv\0ģF|O\GY[Fe bA:dU>e_j|9'C2VX&DIp=Il\5-*7xi9q*T7b͙VWP#Hذ\)feYZ#0[R sc$3a\Y iD -+BNzw,fM'A]Qpѭ&kZ|d+;Gs+\ܐqU( Z|+8jgХmfĹrٵyyjդ ; O"l.}#i 1$8%EU4FSLJR}%{x;1 L1)eb;1Iكr]#"[67PxYC92 ۠xrM" $ĺ`~篈6aSQ*X+wd|=SMX#"vP Y,K$(.\ç eyfy -v$&1oK&3GL"f*azJi`J!C[R>⤧1 !p020j (dv `X䂒}Cr[Y]21g(#.;t5SNjk]Ep=4@.NOlOH*@uI2lJ("c3#!UW[O|W?&GnEͤY\H*X"MPRt8#<x qpOog?.#R ,Ǜu*m w+:@ j+#nyA6ʼn8e%pn:\M"ዐ-*XWF@-- 4Ӵ [1foLlI+G\#mνV;t'dϩ1 dbG> jbB$p>M,쮠e öVF*Z̑0e Pm>KU0E/GMDo/JɆ7{ (YL bܩ $ b:[ ,7&#?_||Ւ4_PHxMU1X!mN޾._"~X+G 8-≶Ճy`"5ԥI͈D?h&Ҵʯ ^%a97Aᘒ3jOCR:ka[1ߓ[|Np_ls RZ5-X[gllrǥouR*(zZfĄ"ܨ8K59fgU" RW "ō6:]9d& '3 bxӉJM%4O6?(?GR8 bIcrXik=l}wBX̦ do Wk+KRvgTQ{opu-Et+i+ Uߪߨ'oLt4$ Ey }MO,qꥍ>CsΞ11ta"vRE b_ m9L%pnA'iiD6WTE٘q!gSSSURWO2Omq]2xnϛ/PH0}?,Dx'WB̦eS Ұ*KE:Z#q|wyԌ{bS*Lac$  *OVn.4kuÕgrUiMKtR:."h3܆3%jd$ w\jfuqm~ lFjj/86[t{ d{}]ve1LTM8$ Ue&IՃHFPu;{l0e:@ѩ.rܿՎj=? djeb38F/Nui%IXcޖF*ReqJ XM1yJ rOC9|,xd@7?}xf'K 'f]IȕJ53lF. skqIѳGVRԉ(yn )`܂I>PxWVRA Ki;LVc=zFmPH6%ff"O93peF8y!yki3QI,]w6#}nmDYL`t݊]&j#y4z}ޝ,9(SջTi#fXq̧,i3%_Dj飻\gKkdgUӪX؛[o\TE!CbVc&xceG`̓sv]4<|@i?bZM7SL9`uX|;W\isR$.Bc%/lw7Hrhvjq&7 n˸R3GS] 9#uvOՊ[WIU1Ym[PZc̉Q(Kjauc3TZnkG2*)3$$I%Wҡuo#7B FX bQKu~R9PN7=O\7 )Cq%)6qcW%.*yCJ;)&-eNa`FfeDF/^za~zwygZT\ӱ+=@s<5 ˆ/foK W=coߎbёv=waFƠgrTA|# Hߠz$ҭHiM"-Q0߿M% zf6q\S腌ZTMBE>֢`4ɨV`wĕ-3˘`}b7Tza~_7Ćsq|ݽ b r)겚j4]K0څ0* ȧ-bI wZ3P·/SkN˜-k׷ Mgq;1}|"xkpGb- Ւ:xke~2i%2JD_r%GY8Y]t,!|w@$ >(I/++V$|S&`(jQZ}iJ2Lj ȺUG7c#L<2Y6ۖ@spn è.X{>J5>i=r7Lzs ɽ]GoZ]f$ =:٣|1cm|K.cRSRU+Tlǘz@B#zg}1Gf([#1|oxViYɕB9xZ?>]R'(J}?6O|* Dii[X ~}AƼMYu$~ִ6)SSWJmLW8+%&3\yH]AF*U,784IM$ȓl 8D$T T`qrH.d"J$E: N ΪEm25A(* ;mYVX(lM82f 2Bac[Ncoߍ|T{? X>F2 %ڕ@Hю1)08to0l*z7vdyz#RF,^?.tMOOЀ5%I(ǡk3_`MUON[(0/w"1X,e/kȦ lZ)5:G%7@n}q,:ֻG7S]Qc*߯]v ePU9}\SjnIE%|ʦ8e\1 Պ@G3Sƒ[osGMϖ=,|W$=bpc,ѽM<)<5 -*܆8,#A|ro 2)*c-ʦy)^Ivjܛr۫X8JjWaqMQLRm";X':BhdԀ븶&%^[ BR-$Y0Ůؒ^8|xDNS܎d kD?nt*ix Z6Q~8ei˦Rφc.%dYcX;V7GSTk"!P}nl*u.TfŴfh ʱX AK\fYMIZTFUol:$USGƵQ@pL'p< {0dn+oأmVx7(ZʭO5-j cX, *ykzOlF !WT f]CbCkunlq{ *ҜɗW:acYlUͽIwjx&Yk%0)/1Am#{[; [c:i*kY\],#L~9_\PǛfIR$Uc (o8_$c|"%rS+ si]p9&g>ry*yBU;H}*Z+s:mC9O %H|xmF>x]u$1,@kDg.m¹2MGPҭdB\Pu8c_LCNf-kaǵhlE]J'1VW8)F nXU7ws|4ъfA̩:"dO{WX.0X䐬p,dqqpxYfSQ*i ki]+ 876`PW*̥Zɠ3jZP9iB,fُLS>Pdxx6:J&XP{~GtYDp I:_k 44=-6wN2lv:}x',nT[3>:j<Xy.m4tq@eQT; 8\^}9,XvVipG%dk^JQ}yh`k!VՕ$9;H5%dZ EmcEul) 2Iu]*kvl9'Rp%3!yZvou!Wkx~cOS -FbE$DՍzZ<,KStEQ4,]K.G2* ,yˡJܱݾ8e5$fJ\{kn~p͵%NHWчGZ ۘ'MVTUq.bm66+A,[;VSSM&ڼ!ag-(ˣ7%Qt^n[\($ -:N"sekr#k[q_Q,)ʑ앛uO)"efWA @4S,ȍu`ϸ",J4m7,YJA-_@9kAȺ 2"[2i,F92c?k[&?_'G[Ӹ[SSzxMG(A&_!K/-&`dt"F{y8#)+Fei\F~p{<dl=pܒ >]ur^V G/ݴ,hWS BXr=$?_=9` *i/$ݰꕟjGW)#Za`,?}~SCA4AZYl5{#,AA[_;}Np4 C$7'W@8sEiBQ }/moATS|+b)D8;,wxդ7nK#U+)MF)d2Q̱,{7raeHZcOeFaDywMWv]IE$iRs Fo>Σ[|rk# aE=v[c M7.i.]v;8FDoP'kbu5VII$$Z.qS CL;]~g""ViP.xv.:~:lfb/U/Q)%LQwx4 !}5^+kH!8QY4=M|s.o,UIkb8GzCJ:ƶ3#Rg(_ {8D[3:59Z+'>M4;,5F@GH<Š0%QѺV[<VVI7t8zAjowui|Us,X кC^4/ZJZ(*xUQz fu6b9}\ԒR6b.GC^<\dڡuұi![޷nG UYZ~iv 7k#57I*T˵UfUPE5[Wi*H ǙSq-vEj*TT sצ"%=;ݤymsպb!wvָ޶z8HeK!V  -y[edT2`6G[8r)*jRLᴒFjZU&& ZK2 zNsUB0'{Jle gT\E+sjΌ.Ǽ=ZD2D ̍ay)>JA `unb6_֮mON*&=Sf IS^K_dyP9 ZRsf6M1(4l(fflg8rtZziT7w]$]81YLcXg¾٤~Kns Dd`yHz(6vdd0|(#(l.yoK[T-n3TTFX((f%DV觰=bflTVHVAb@KJ! Hi]X)||sQw,{<]'e)(&)I.ĕ=>8T-+-3(cfe[]m+2𤰷&T;_m|Z~MMF YDr*i%W[%qoԎVF͏.q܌S*:J*4 Bu/z:7wZVmR wwyjkxo0nAL K)HuL\43dIԢq6iUM'iDUVhh*=mt7o ik,QҹKHLF۩nzv}"]/1[Re0kMϜuVn@ ٣2N5nv]ϞOрmi}qY"-ɪ6ӳ*Hm,Ac襌U>˜~^Pl}u>\iMEH3.0m_!c&S1` 7=ن6˖ECl]t8jD3 |Ґ*5{#/18|ii%b›BϟI3 \҉9m6>Fq~eGASUA$E0azB69%G*4UFy}^(j~n:⽕SjlʜX58~ؒVKNٵ:m-TC?> >[Dõ :ODrζhlT8o-a'Sٛ(=1H Juy^08rrG eBBti4G53IV yHgH6ĺZ‘)3has>A2‚xqTTN )kkZd %X?cspGe | 9 ֞ e*$z8hY,cqljLettYU‘1qy(׌@QKGCRMZxg xY+t7Vk R?o #O QR?oQ| &@਎fu jjJZY꧔5-xzG5Tҟ Sp'r%< UG%<\>~m;Y`!R[iڢXBx&#{K4ՑuK3 :IʁRe #w=/#j iNN{YPNU]lA{ywš,qzn;ܰزN,rq$~tQ8*9"u>\s׶3ÐdyXKj%e $x~ Zl |c>Kw3CeG%, I ׶祣jXn,bd+6I.2 fL:PCjNԌ뭜I$Ԡؑڬ )$HC-býl*Dcx8Gy,Ȥ;GP=]4H;VIpF l~ùU]eFYS,kM( 0 `>XnZ ,OIHԌ=p?'4Ylֱw,:IlA*Jש]&\SC+ {EC|OQdU^-?U G'"H,T w|O+UhGU=0 $e ;5)uTXŚJ.x2ܺަMFk ʲbHi.7'}6 Nb[=0,r52`>̲*'I2ƎR,F<1I\6`3wm0s\P] }1K=J:6vU^5؎4~%-$fR8ePn@>c3]j]CuČkR!IO?,H/  ;C.%T',mIE8̍|`(Br5c׮TEKTto&,uW =m'&\Ywpf5dRԤK@K*4uڨ"9,oqqَ:ܡ7$lbTjr䔪Bt YC!mb]Rf4N 9^X!$cc}kMŜE-MSԇ Fg ǍA^UW0EA-$JMSImЋmyb e@+Uie7*2%:u@0*si8~zef,Z"@;KC %9(4mvqqr\%4b*+$wV}B|L>EYgԹuvf@ '[ H*A6Ɠù&cGUMG_- =dH$nl#t6UU@u2Π '$M;$ͦH-t8K nIvc׎#W/QqaQgbe.eAr#<ھx+pf ^n{M5^[ )EID)Qo\|+˲\~c}W;7K)YpT ~c#T~ A:ȤmǞ-7ɕE_[]Mx Q *ǣi\Px[3͵W*xV1㜭?ēr|˪qM %҈A P\|-;I=I.0$IsmZۜ ϳ8x(jTr Y#;GybU;S"z1)Ǩaehś#8i*vs^Z,O^dHmF g6*l?lA|:ʺJtBܰܓԍ_SlOֿ͓r:L3̺#Q9Ԅx5&CrΉjo`9R ] 06YW#sso+bG qO$7>`#](v>ER;g͜5dƲ_V_{wֽLwi>0߲ض,xrފY#꣍$竲{԰UU*'R;}X?SSRP4*TCaGqo!)i蠛K'@*Z7d&Ӯ"/y}YtA;K!&V[*1wWp(ݐCd8YQgReMNcLݾ z#qebfJfHQm=p&HtFA{9KK drY#0}N j*rŪ9"v Mk=6oʭ솨_/h*eUeITnNxk=0jtc bP#$GW $RXV-neMm)&e1 ku5#JOy2 -p| UE 0 %' ū}~ͣXZa Rڕ޸!+H ΩRӨp07+LWi_MTO5-+K1MOn_^9Q0q/G=!եut؃}1.crhLnt(Scv(h-,E݉nQQ Ѵ21eY+v>8g$㩦YޱʺK}ꩡG\`(`oqoOawlZ0h$``uQ|q:3cyf[17'5G52뭥_6۹冲̒*ZPo{tS`~<Ҋm>|[E:EX>cep]ck44(f0 JQ:yymmfF&KkݡnIaNc[/HA=^+~\ ̐Y9Mo!~06h&ojȪ&w|w_]QAAGWG0:,Y`Ŷox퍔c$%lb>b D.HmD^ 墫޴~E,!WJjʆcOOi U;vs DZrļh wtnnoO-6kɧџSϺ{\w8FܲQggBTOv {s=H'ôՒQTE-4]ⱋޅei3DUA\y/I8GUm {$ȢZ,,:A]z6̳lʾ懑z7}nmOTbVapmY6*,[KH;fUWP鞠ZܺL5Gk.{vKxA안ҁϦJOeɪ3,sCKL}تq5`JX!ɡdfby%\̲ՉWHy &cݙ(?K,+ hvxVkM-^+cUC Ηu!վff<,/U)_RDzGWpžjTcV)(1gPG @V_aa,QeSAS:PN~@#R[ _:5+J}[8~F㠫E` |k6.2 Rsr<G2-taIl&h!h%DMӰaUWA |ZZ`QÙ,}M\4qI7'xQot2SW>~m)H1 מflAEKM=g*7ذTQtc}smR}FJf}3t./n&U6bU"K=0$*jub7 !q;nLF@yM `^eD=[13sdÖ̒dKD$=Uǡ{3i'T\쨇}Cc1*e2gWs+{:DW#Ip~<˧:VppNY+WC\0@F:^7W 0D<5 `fVP/̢Hhr3e,IOdUs! OYL<Ԁhcpf7'),;!^tgG K3G,Сc$/N dI: tT.aԓehV,'yVHIn,_{ v3t'~S<|:ty0*$ t ON"0eE0ErH}JabzkTg O bt>O}al"}IIn6*|HFoX|YhhPҪDL o`54~40Nn ;\u䜍\| v1g$ӷ5oS C3Sc(Y;[ RebN@ 7`]TBW)4WrVW!'`;SUfsgUuGD uȧ;{J=,zek8@aS6cWuBv zSI-41E."M[Yk_~N6zu'*w֩׮ jq~]SK4vX 8,LEθNL)b T]?l/y_OVʒ;MBq}6QGO 89}W7kb\RgmGdtt+GUfI"Tlr»9us;x]}1n*6dju0Ԥ$Ȱ7rL*IĩO8h+o.{⪮1GϨƵ"}<0Z:Qk|6 RZBHP޺V#[HP>2/hveyg^oc#9ùm?4/@%A#5R?8fy&PMM\ dYaWc&e6 8\ţ.4ߠHBiHہU_!aguG#_݊pʏx|FW9+; t7:.otT2IM:cn>@k?ͯo%3ƪ2K x3R6Hoa}KQMIA"-ar_݁GOD3sY3ETB ZgMu#qE~UM%mxAͤC\J%y ~^y@-đS~C핔m=JV*|o3)He.SE6~fUz7=gdV5zyݕ 3K΢$,vc) Q,$(jVt,iYf19Ҵ1nrNI;=:b\VY#!~q,m0.QUDOCG06sp:GHf& '- p8f3c8Z#Ȟ\"ҷ76b8-j$e2J}YdJjR10cȎƾ+R'o\}8NdmKG 6=ں~fI-nE]*kJ쪥.i6VVؓ@U*)jKFpO%|&Rm׉57VSM;:DnY ? ^()˗NISMi$Ɔ0% k~lYM#Tg QƤqp^n6q{x>M80K 8ӻ1avd/D; uJ[f kb[Rdu>9R}@v nݱJӴyse&;YBQ{1#419vXT!l}.Yõ`+%AonxTa)Pqin\.W +j)-5* *kJɫUnlX2E^Ymy&jؘYE%F<:۸iRnTP D5j )27tuV'*ɹܝp)%}'""Th~wd54, s1*Y MK--TG/5؉~ZE RE;lzc!ۗX&pRHDYч,0o Z`4#|'#;+KC)*XHK86f\]GOV+Q=|4ُg=,2fOE2B}LB3 wJBSЏaPi OLQ'T{:5rXÕ| µpSSB%:r3]VsVVjTcNZ#8Hu%GF׮+RǗT2t2IF >þ72$nrnd``=;#c3\}t)*)ʓϘ*|7Z5.ϫxg9ޣ0V@2#:ƥgi_"u+PJj /k]db7ĝ,n|;fnSK{Kj ָRdȪkiE@؞m'ܘQf5qLUK ]6; 8k3G0JKyx8&h8W3ŽgelPi2宋۫OI#ePzQg- er#%d||$dso} ~:˸"ٰ^4ѝo]*+L>Y-e5KOK2yWQp/nH$هoBD 3fB͎8Uq]~FypT2FQ¹NiWOK!(IKqe4>[%oJMl;;68r'*U-6UEPuE""NġX~y`F4Ɯ!Sٌ: Ji҂ܑt#k_i'fyLZkX_^6 %i*$ ؎3GYEMWF6uw獽F_ ql)U-[$S<ʔz,%:S%TSj2ve5=O0tx0j⨧szy`hƖ>ㄛ5?&M6~ɥv"E~(QeWԵ54ư#tO1aoŗ ^a1C]f`~cqsUWT5j{789R*In%y͡V -;x8Yk`,]{xIOz*)cqOA5C40b:==cɨOryerrifNMxƆہm O ]+gqrmp݇MKY,Zv`Y>hE>Pն,(X*-Ja1H]2K "rXn~c@&ʠ0٬/6#{;pid$0MUVƝtbEZ7+hl+Lx4<1{7%Lm?I$gˠ5*ᴎ04TJҖm<1? N[ȣ{=Z' *2:_A 4|%\ԵEUV*5ѽF/Q  WL4c+ xթGx6ِMrd#OpWZji% _XFxY^9|4|β<8cF+4qƜ\.Etd-<+I54FrT^p<1KIUNE!;_6*Ȫyʬk1e>GWÅ6e2k"ߛdo.*2~4Z*BJPVx)2H e+'dT5 {bIuÔCszb .7'z?d0{NF;b+ʏ!aU5 :$sb qeI]bf<Cn?n.ȼm5Ye@?Rc씠SQX #oMrbfYQuT0$|zǧ^ϲjgc,&6%{u /I+8w2ˍmF 6l6w\#I[5U5-:eS6#IKFS%??FÕ?SauGyo 9y,BR{ajMa`ufuCI\k5xƫ6>ݰ2*y"bY[J.nzzjDY08gaY۠2cbIP=nAw Cy\:P Ha`?3(i#UH#Nsn F9|+FZb%\C#0Xi~XX j'2FDWOF 7 ׇ_?֙4jtZ$G)u\y_MYaDK* 0aaacLIE':F'A~ÉO6?b__a* HM0|ƪ(dPc%=.-(5GTYU'׮6?j~=ʎ~-}0wc׷f+SZU]kHՂHҧ1hpWx?_;#MPE,Ps%ʛ4d-{WFG!u# x?e5[y*OEHS/υTj= JW8i*X# {î# x?{!^@Rq-%B=;FhoollF' ZRv~~+Թ4b,t{u?Jj&RlockvXxK#/ N! @&}xzf "u8 ;C4mQK{@ "C(FWEkUw@V*O[u/ €E`*FOž8,X)@?S_;T4=BES&p, HĞk0MKR)‡V7 K'_E]Gbr*i׸QV3:#s0LFϱ M2{}uJRD`ocO/$vMB;t~Aư,TlH, \OE0dd?=K1O݅Գd֧4T2$ !۽cZ)q@ Irq92O'oY~l{6N浟pY#osk 熗xm̙b7|L͑7,Y?vsREcW`&X 0rrŻù=Vs>WT#^WUUuPO(sCJ̰n׾ei;U$x@V[mQzX6F>QEj7WoO{&k,3;R144ˊ*$YCX.7;m2liI- oRHϮKa#8gozWX}cZ{fU@}a{}]Ӿ`s꥚2xy$ikIs~, "{B5 Ǫ^KC`mW4yJx@TR#l@t5 )]r5WQ'yV=qZWGZ6˽X: Zok91Ϟ'oY~k|=&pwf(qnB:`{sd`=K1O݅ԳdpzX6F Գd_=K1Oݍ sd`=K1O݅ԳdpzX6F Գd_=K1Oݍ sd`=K1OݎTRׅgc|/Q[-DAk7Uc{Z^Kȯ.aSIWK#= تbI,sJno-SV9H86$7y`? O$QIJx}Ŧq{?n?Sa9S%??Fǹq,,,,\+~OpH" D)X7c(e&(eʣ˙Q0ZOMдdgyLY>OpPj~@PUq-i`ŁRzp_U LS:…j/%c4T)FGn5* Z0UFqyf;j2Jl{tm'O/s q_A?92HGP–uf'˦Gh‡Kv4rd4(RT(E *A bN]CQiy +FqEJ$.)EN Hb[qeQakؼp] BWCCfM50Ҫkj^[駰j3SU}O?p1| fIm~~,-E+Cq}$}r)5TPFKI~O%7sy &/%Jo|-}1-qmCN?̗? Tf7aIu$g6_} &/%[Q΢-ǟw&| o_ra9f_%U$/>n D;$ bsN{G&/X90y(u&_!a X| &/%~OfPs^Lz'ƺcUZ L_prqd'2AGs_Hv_K=mob0yL<2^J; t&;s,xd'*Jg*,byuxT*P̗zpU_W./xX9̗zpU_W./xX92^J' AU~=_O`cy(*ǫ  UA?s% '\/WF?̗zpU_W./xX92^J' AU~=_O`cy(*ǫ  9ڿ&&OZOLhx_/Y8F?̗Ľ.kS }K r91]]q̱ dAC+Z|[=Vk`XHY<컛`rJfBc Qʼg`Aly^R9E# *JnS.Y9ccťsYVȎHCxnor` #isJc2GXЎdomw=uF1:.\p6q^Iu#g953/jĕ үdNZLjhP =1+i+ʲT˦7kyn/7 *Q$7Oc 59TB*Or =\Ta%Pj'>q;\@6`ofdjuHw6ԏ=*ey(DCbI6Ď\1 \L*J˭RL, YM|4'&ᦕ5Eڢovù}l;TPျ*OPl{t -ud6qƂ) EǸ>}5̩RyԈ\~Uo eeYMWBiV=Qܕ;X 3QTJ5]f%<{Iaܟ:2h ,ǭ#,_W}0MJC++-$Qiv~G2璝^D{IiQR,:[o2IH If#[ _ )UL0 nlr;`Y5LXv9h;n}|l[QBd lP#,#$}}UFUW9H䨉Ge*Xlz_B~ݰWU512oMnH~e'5q-R"W܋:wWWUS*9}*z[ݻ{a+jXHňB-կ ~oK*jlєTw7oKSN\7u!t$۱#g4&3e\hT} rF6 ʢ$`$f:X%E05M{PMNRbS 6_ 3J9dAR !&y.;iequo}=uDU#R8BkKtUPHEBl {w#K!1Yr2I( ym{(±SWT (:<66׾v'Kj c W!KrX HF"Ek oq*婩JUQlez\ڿ1a%RK+\b4I,,,,,,,,,,,,,,,,#I6~8GW W!~/'Y nCS$$A4S7 Zj!AS$N fUhó)$\ۊuœSXf &Xco.Ǜ9]G!tf *OxqʓobO,HT H )z~rw,q_"O,e$R~ .T*"˚}) 4meBq"_E~P*OمʓoaNa~H& KC-"IQY`cAGI70R~ 82W XCVaw GV[$'IR~ .Ty0~0$&? W'I71' Gr`aSHϐzUtFI70R~ I§8\?T?3R~ .Ty0~0$&?_DnT 'ĞL*IÅɃO#ps>AW'I71' G ,좺 ϑO'I71' \.D?*Iqϑ FPV7#G1bGJTnN>3Ʃ=Dy͏l2k#G I|_;S; 9Sreo n[VE|fJ/ꙗꙗ/xX4DS2S2 j(!Sf6@nEu4H$@f pC1ueɔfє*]2iMPYsnYġIctF(|; l3/' /l3/' N&Ϫ(*#PJJ#ok|뗘SgSFr-4i$\o{`~?a{`~?`Sg" 䞜țE}r-̓HOl3/' /l3/' ^i!Pق6[.|{`~?bɟ5ܩ(OsY]l. ϖk&R<^v4'L 5rR z62:2RAck}ďFy,P$ՑYcvc-'_Ll3/' xʣK YeKOT+TFo͏\;jZ̭nsY7k`l3/' /l3/' 7˥%7.*6,z#O3K gS4uhu+e7Y7/l3/' /l3/' [1R2jjBsN"#H)3 M*3?^?f_OФ*!EvIUȸS2o̐^v&#til3/' /m3& \:vS.dTKMϽ /_z7P&eoޗ4k+KwPL82S -C0p{%2Fc8k [kX43L̰rĒaHy'2&Qb_{\v4+L L ,@{`~?a{`~?bH3\isI Xur=k鉒e^gPy4$lXBF/1s{2+媊 OiSej#I Xur=k=1ꙗ'ߟSeٜ%&hh7Rv]ώ1ۺvx<#"(Kԕ܏M S2S2ŧ}su) 6 `L L ,@{`~?a{`~?bHOm3/' γzj(RJwT]RR=2ZNT INi}v4z$n̳8R7ZPcRtljnnk6ǤSǩr-`$#p l],cѪHįmt$H.O$q{J_Ioka~76 %b!:XzYGW=|E%3U%W]I}}=܋y}CW<23f -m::{߶#MpSҴ45cK ĢK,Rh,lvþbg͒KCO(yRX5kŒO:44a Xmqa ^"I7'C:pH$;U9\o(TOMG܃a@? uISR)ҖhNA`I: m ~bY; E 5*$nvM痆ھ8G-UpH}~A^ՙW9NC ,3>a>3won㽎!q vE!An_0<I@3<:g0+:GO<⪖v#(K#콺_\AgSšˤn:W52TSK$~-C]%Ā>c\䥩yG^=n;Xd%=Jk(դHk4-RT [`é;,zYR8 `+6 ZUeUu($,Eň_Kv%eզ^3E`u[14iںJrcFY^xQSH G=;wej RR%?2* @Zě׉Y~s]Lpr%W1ҭc~7oe'"SjhVn-~0xZiB2*!$Q~{m\ ٪i N!̮j$_|FQd]%BPQb Gmfjkb$^xvd6ְ'`lϪ ;PĮIZm[jCp}9Ulx}͏ ¸¸¸¸¸¾"UԦ<"p&^.b`$ pWab8+'*q7+,Ψ qn q7q~_S|W G͜M/Ur:c_õVj7ϔR,S5Q#c3 VI!INncԤ1 yz^H$S]|Ȱdr;S{Jn/m{1u2ʃ5;ʌXnqmD1|VSzCuy7$|];*-b6!pKW;M[H}$X[fO L$pӖ-%n15;M]Pu"jcrU|v+|jaGΜ:⢍ϚI"$:J,e t٦]USʆQ7 >%$y ͚ícfDHH k {mWdu\cJR, 6:#17_8歧֫".-MǕ;a*r'"ñ_s{aZDY 1Ae+-ٶ51L 疬~S{~3 춦&ĚLzu 0չ"WOȲ+$%ww:eYQS͖F4EX z@Հ5S+evB~چY K֝)$JMoN A*oLie0]Fs,T0ki؟ kmO.JdhY%11`2? PEeT1pХ.mӯT=[SBce)hka~8U jz^DDuRAk覨8i34cmi6F|G2j.Y%Z؅,u[Q$vՇʌbpGA V:o_1 -JDTZr0ϔ %Ep[K>7=tuPI[ moxqqk{*%KR)cM)+{G,+bJQ>X23k!k*VG54-XH4EG;%~W i KHjc Sn)2C6jjHD\]߶2* *(TejRr ^#sr:m&Yb Qge82Ο8[^r[<WXхveȬ/Bcj`k\M~}p|]Қ"6w>.շMK9cB_Maj /O=COSHsO4rm-i>FŒ+Tꗤ%eT{jqTSҮeUTrl`'WS]H)[޸ A6Ƌ6+eOND@qp]HdjVf!ŔY{H2|Z{+qO*@;"b[8alUe|SOfTrPea E݅]L)QM,{!FlI՗W@2jy2Gs:t*@d'B?Ԉr/*fY˖H7}T<_]iVT54љǨ&2^$k(eEK'@mY7On?*7-Ҹ'Հ|SVw@+jN o80]XXLW(&uU]e N`"ـߌ%76795qڿ2/2˫djj Z?DH8_[wE,|~IG(K:N.Xغ73s5 bf!"AۿX_Te-1r:xD".UcknPH`OuG˕VewSS.>(|q<̳jdg"dJenAs3Vg.45{mлbPƘ=NLS!/Oh(b ߏ9BIխ aaa`4XXXXXXXX/qI!>2ؑmC^bFv&.z?4}\|-:` aQ/"#cg97?\Vp@lu ,|$LE$C [:,,,0 8hA$ȨIfRҏCgUGΙIel0ӭLJyOj}` D~[++sم>\ehc K[1̓M;oVeENTI R備@ZM/a>Q3;N9sVxPp}Պ_WSJ\FԲfC7kw1r-T Q>ӡ;6ċt\˥ڑ]HVP\u"aFYS41ӡ~p aoE#5 8 8o P]YTZkͬ5կ~9iڢ#H1 a}mn2W@jY)畖Q?- }ùd9HJ)Q1Q,JX ZI /nZTHyԨ`KN^fS;dDS2-n^ޘC.^jdbnYkZױ|]20IQ KmLZX_$P>VjҒK:LvTzun;z (;%2MnkyBWɧrbQ'8;6x_%-\ ˔1U(IN  MIPJjVm㶟N+J ĨYؒ܃rO&2w)*m ;o|!v2D^bR}R~eu#fl%}̦ (/euK6 k[8'DtU#/Ҏ8 4|=>moxqqk{ ˌJK0R]"}%톳*- +MiCzTжz!(.rz oVp IVrǨ;Ϩl$#WPjzpGezg^xwo,>+y+ Z& nHۯǡ8)ɥ"甬tRB aj,_ʉ$uTxw%@ a_tKPC:7&Ǧ.د-޾^h✶l:~SBc !LF(l$.j"ZR깳M)$xd[jfbu_ӭ!xvRV`{w}[;ߦ9?&CoU<6 ҉e> Gz$ЦN-ŭDZ_[l RNT^zēB2_gjS$)Dm{۷CdϖW I;O:%WTORdĺG}=oHl36[XФuZg7'obDe*ic6:\0_,"sfw6$|O<@ 0kIkty^:&!fn ޞ R*J|Au|Lr,WHq17`zv8j7| -0gx7`X&]S9Ekh8}mb67m.]iMOǧQٖWT!Kӂ2pObrPkWy-MI_;ApI jOf)'nn^jy$ e.e謑f ,w$b7?E;PFCm1U0TOGOm*[*O$!ଲ cwYru˅ӤYo#*-PW1ֶL<}l-[u426Zձz\ZJ'2p? 5w*%KCt $\Nk%5t'e4B#[K"[āMbp\u~ o*l>[TgQ)טI SqJq<**fY'8]e4mUZVRN9n[{YBne=lzч. ˥*yÕc$!-껇&Ɗ-m(㿙2kS,k=wgUEN8b+x'f߫` KIS4** $0';}Y-5W"^f  _>'=^Y̠{`k^BIq Sq- BB*I"4i8!0Z@)PuXQT7l/:{nY寂ֵ۠*4sP&b&w;wy3Hhiʼ~T t;",wG1,4ŴMmo朻T0WpmpN'Fe+PXH">"DzSbv_STMK][to#R}73I$y]Y$>{CRPUUSFjs\tf>{vgtS+2u妢Oq.Fpu s$)">^Ggx"gm؊r\ITp4',d{TU<42J]QƐY{_wgncgJ;T\N'Qo[FJXvkAؒ~$ -St2)6 ?i8.'wiFi :T9$[O1/:%i$"Ā-MwR?e,e<٢*hB9ŭD 0uVz:yOo2O׀gsKF bmD|5/ۆxFFj_$ˑjRB `V] =8H0c{ cYd[l#q+˩c"iB\ؗk*uHi"N)I%ZQ؀ycsz4 HzYKM5,F) [3 MA ҉גd*6hۧ,TB;! -cє()vRe7o㶢쇖ʊiָlD=YTMnu=.&`һNY7bw=5eilP9KВHIr!Є^Jm`=v}GEP%Ԥ-. X('T-UJYc%vWIa|*ds\XmSF34XUjJOK?n'aa`D0I+{/-TJ q0"Skj7=pa]\V 1\d-;^0im/kEm)а).Z~_T}hu81yuH:Jt@4XtUĴ/5sRHܷa:⏕,21VKtAߧn-24עuU+(T-7=%}Zyr&?N˳(3 H4kRG<()!1IS}D_{ܻ,zd̀7 8ZvI+w5/oY(~"|f52OyV%shj wy AFjO-%.XJ+-bT_}yiM44+no#,u9&lA'k[/P||y d$VԑCKRf@$tt0Qr1O'_0bacf84Nṋ{}*xk/`t53O*)X(v$;[:e謭PM%@"N۝߶ o`49]p2j/Mm]l-w-˲,*91萉5Y@=T¥䞢O`*<7Oq̊*j)AvvL)M(Eر ǿ9T>a^e²\@ )ԣHE^XM{jkӑTU=tsNJ@v(2 :N˽YIyO1UǦ/,KzV.3lH_amh`0L\I)v#wۈe= OT*)gi%֤\`̶gzY H uXz*b;RP][@oޘSUDUule|4tUZT$*%_Va~Xds99LRțAbژ è[%ъaԬ$V/y.MAH6f伡Y0齘vlK.G I %$:+`AyKZT&ݵ1D kHӊί{ ;QÝT!cS,||7m7ݵ1 j 0V H[_U[j,*bgHY$mmrj;3I@b|Դ:*XxabK-U􏦺HdyuXn,^raIS.uq'2M'ůUŎce2H$li[ ۮp2lN WHܓ$vC[?}$z|>%STF!ˑn2z8`H)b7-(q(µZځ{c=P[@ o>cl`Q31BM$wإ|&5ud5RA2,>!H62_^ y*61fGR=MlBe'P0DR }ՊmsYsG"%R۠>x-.> 7ȳ-X1Ȑ5^ Q}銄8^O?V tb`#xQIݹˮ]VkH8>WTȒ4S\^:oݎ_߈TpGBh}r R{}%_Mt1ou7(R[uOM >J]Ls#-kք("5#Q<՘yE;MLHIl#U6f,@YUX`v!'͹ 1AAFb]`;$4g*\3,Tgo XG;>(FE pp?6^FQTC!yZ6,ugd8TG4Q{{|7vV+,MQj-S@ Kit&WR0niaacLIbF.l>O:I@$Sm +keOGG=C4lbqc-_ =2ަ5/oYs:ӲkӦ5 oOۉqIaTF[B &Nn/f٭eUu)Z$ͭ:lb|qvcOA,=0Y%(ebrv*1OӮ[luI#RӱwM9c,\=yj losŘ|SLy'*xLq&^bK7w[l[#vXeP&f67D' Up];D%y-c+nn 8IOEM@r-_p{ZۏNS­%;O^i/PE_b7/mHd⨝Md wG|TAr25L!Hdvm$FbI&rNھ6fڧ^ ԉgIG//@˲ʚGy.tOSC -#ޚXF!&ڈ,I6ôuVSȌuu@ }%| =ܹ-;Ӭ5s@5,nH;I#5D`$E5FH .<7DnS.4)Pcu4T|U T ˽76?l;- zgM$5GrںYYEC9bVrHICQk(< ۥ8mhUU\/5mnl.v4UqJjU"2Q|>̝DJ*xZ$]6ߥa{/L2I)aVw },EuACGUO*D@a!" u I*{%o G$" NC=Aĺ R%z.ꦹfs4x: ?;O,Vd'ޢ5YBm{u̟@JYjK1gXT\f į`VoܺXki[ӟif,ً_UO4"kҾ-:GS)M.Y%$Y]>_QW!j_C@}hǰJG,M9RZmNCimXxi:maQUV<=0_8aʸZ8Kh%jQ(CԟN&s{UYtO*ݵ }x!׊թ1uZ~؉(t!] $v{PQ 6^ͤzƫJ-GǨ{qk7Hbvvps0ZWbXsjIJcTW5:*q\v [pw86ͩ q *YIbi#d~ypr9U9ԘdBaaaa"v3Q+ER pfbv{?F_AA֊#taa{`5шLJ`Qb7k=Y!̥a3in ;܂1dKJRP$ +5@kq8j$Zj@#' n:@yeQ=eR1Iv$_Oʪݑ,̌ZWuc"#1cޘc/&6IY;@WUD" 3uEv _ p2BT\hjVvkc2Nb PJϾoc I$TE9jag {~H`2*LxY,r a2ii$r̰\p|]~C9>ar^Yd3,Ce%PE[OQ;js6\olgYN&bWun7=:9\u-%=`@jA" ڴui6a*jjjdXEH9,.XZނǠiXb*jAahCj`-_ffXaZq+fy[yTʼZ 'gyQ6pֽmۈ gpQL<,4o=-e<;-RQs`O@EM׿\9eA-K?'DwhP)$}^g!먧jd:>{`l`نA%U2WMh3M>q_qoRUKZjTbݜ\5L-1a ţ&z')EdfIq8ETe痤OS0E ~*w'`ۅkfTG?2=W  y{'Z⊺fUVh:A[[s_zQf:-}3,>L$Qhdtb7Koc./xNTI`⧂jKI4ߧa{/3Iؽst+TA SҷyP G;Dl,_7m(!=_1_eF[O^8?oy%u⟕N&jcq4zݴ^q{jR}b{7`ggSF>Y18Iy#$~^;SHQ!G~~b/ow$|_~߿̹^&SxIhqB[@`wF@>/< #>Yoܻ!*M~`.~bYi_u/.ʧWQ<ڣ+@U>O*^}QGP>{͢xpy52|02jtd=H8*:r/w/&ƺv_\}{b]PAV5%}7}ncUx 檕&G%"}U)yC5i9T=6mQ ̳ȗ?c$1E<ȓ-?o |qTFjOht{MUh]fm2JqMsdj2L5W4~!]VV ^?3凝 3vy+Cop}JK'lUu&b{8sԚtmNуOSA*G-6:zā2dʈJ gb6mO_oOTnf*+t^֠Fi8B[CĵER[5%F)Y*?*:ZoTdng;^+elg瘢ֱ>}N(F?F,P?=4ԖH_Tp|qSN-䤚c{^WbK9j˕%dlW7o?BTQ o8colKwZ>V:(%Yi5>]F,0OEe xd[ӎUy#/o2|c#):M8ʴFq'-+ʚ2O̟ߎL,K;0#w@8NJ+hC*-XǞ*M,m rVUrEو}#LyfqǕeEiFU&~ȹo1Ww߾<..MQoKSOKSRDW[-~ooz>x \v7|]x 1\c!kP+"1-}aIJ%0~V2 dolFnbsŲA*jCr[F*ie7Z`L пRgxns8or == 7g=L*8ֆ({06qOuÕY,!V[{oyzNX';vh3)Ykg4sٌEKyD.Xn/򃮕¦Q-ɷɖCdbd#0휄j zEG]76PUJ͓N4-zZx$8$m$\6t6[7,`U-utf[GU%|aUy6TE=kp,} Jգk h&Hge;y nO|g9k 5)65cHkɿnvs˛e5Ue^ MH6\D¨ԦM5M X,lyfGg-JSFHLvsmIuuh~UZ|M,rZF1+Q#QC@IV*ּ==N?&} <c&N<`m?_&7S$BG+T`/ۭ=qd*eWƞr@Tv'L&1&_iiV8#+ vCz )֣(QgBCXRyWYN)ӽ:n,tU&Hm^2?g4q5KQ`;@nk_y>-0yy[X knz,>lxRVQ~Pe1UM5$r#\"-p>sb~,DV,1 3 یei5 ,g͜AJ,ZK0(Nx` tqIg+SX;1P3jȝU%dצHXauQXۉڥazIڵ '6f>2ª? Q{SXq) &FkwTpG4- . ^|gu)Y9u=g&DSDR9; GUi Vku` o`n5//~jJ\U?)BI>TT>$ {͍>;mxXhs,Y&(vY` l >Xq \l򊓥u)7**n[05rꪨ*2飊HxrEIq/1U|gS>Z c}5b͛Ut!ma0ԾnA%t)M5r6!,zX]Dk{7@bbw]|Ī0e-ZUߔwBNkp64LEd*ezlB+w7&kos <: /khkI/<~^I7,u)APkHg^B=.y83M|ATi#D ToM*lҋ?zz*gs!TG*nL-6ù{j([o>2z8-]:@TTSCV c=q•0꿕>"I%xbUB?v$}VhdD\YK*\^'aGRI[FBʮ-ۥEs ~[:5eSYU) ~kT|p2+堗PH{_XoS 5r#H)]ei( j -mcБkvr7JxC@H]VͭԶ/aSQ1e[wMXlI(9fY*B_&V5gl5lɧ4`Gq<=ٛgK&]hکOa,'Y0WsŒ5UHPf¤.wf;)(4Mv8_Uw28jjYڞ:z<$F_76+X^iɟe9$O4n im=9]|^Q:v]6b-ۧL::e3j㦎)M̓>@ D4Ա3'MA>w0TVJ 2Ju }"Tqr͓TlOI3)a47iIϪC75Q|iʾF'/)VA]4=GE*I1OK >y˿E|\E'b9wȾ/r}<"py˿E~ |\.ۀ X]r/ 眻_n'b9wȾ/r}<"py˿E~ |\.ۀ X]r/ 眻_n'b9wȾ/r}<"py˿E~ |\.ۀ X]r/ 眻_n'b9wȾ/r}<"qW 2K-l+)f7\1ďU-iXG-MF}S4Vī, bٵ3:2jx@iӔ/e\`GLIJrZ4 LEۦu>j,?#u=4\mzmJO׀y.fVna *@o(.W%wІiT!ጋm9y( $Jc(te$]:IHOg;,]kizrE ܖïSTDh51ǧ3Bқ|:-Z**J={ x/ɴ6jo|]ꩍLu5J5 b2ܻ!MoEKI*6 =va}EZۄ+jj*䚤*FAa~K2S!, [݅YŕȞi%ȩ Jrԛ/ǩĸ'4CG {1lzhEOxB~o;TGio0_%"ǖL5v,hѳ,Q#[a:Tk 2tdHCjv\_nҟ/zfMcv^׆Oow&D!?Ύ-aҺ'DҹaK%g|A44Ü .)r6$>>]7/ +2\"ɖLUjw,`ò2O&_;J oj;/fg.8rY/M;+ d!k^o3_%ǖN9rWٍC?ɯ:Re󕥉{Q#$n,e3SC@;nv^=XSp@\o3}EKx/ɴ6jo|ufʚ?g4i j;T}EGً&ep3[TLM^kaLɜֺ%b仃8lrAoG} =KqTUOΕ 8D زG^_!I"X;aHxvx1ɨͥA/Pa=|=,|"%.[8hȇڎms<_ EE\`6GqUAN»#cF1#Нf]4ɑQ#KBN3=2"&,mQap=Z(o7VY1Ύ궰t}df; 4v܍~%ᧆ9!c~(#Vi~L86XLvI=^c䓀S6#ۡ833#] IXNKeq*@> J饙Dr;N_7C1Ƥ@F폢cȸn2<.BV1n/9,b0.'lܚX<ĥ4K[ i[ Ojy *W,eՙtWSUTl+E2lDk yL XǮ!.Il:mSMTeU~Ч3*+&$*N_!OCrd<^loέAGp<KA5{Yi"eE.6\cnu4O*" 'pZ/ɧ%{(gѥ%2Ҹ  ;̐//ppSS+TKPu^kP/zE M;3pJXb4SSerR;Cl鵺LSu GnJAHDeN"mKөl*'ͪ򌦙f-v s_|Hȥhg=fNEBR:XK\9U=QȥulZ3sO㓙)њg.HZ-'mlHco UAZi4Q--*s˝)#fyET)kSK&h3R:7"%Гa'Y]IJM$4m!Rl7|l&fS浑ˏG2` s-"IjUn SbfWYU[)'6MM4;Iesk&/6JCBZ4ZV#Y Z6/0Bϥ4Y6e;s"X6؂ɰ:oqwų)FW×ҕ$F)mW_ 훛H%s)̤βٳ*>CK+mRhWTހ킹e[Nb6%KU؝~pԹvEG=E1d1*4){eEAS$RD }:/nB0_nv$Gf۹Ǔ,m,T^j)%fTu*xo\/Q=!1#-<ɖ$<|"CwbΦ2uc4pVfYuM'$Mև1l77}193SmjesA*2x˷K? ^ z*էCF>{l69Z]@ HnZ][UD'{A!$ticxK==)!:}HАu{v\w8{1jkk4r% ؕ#}N(JpaE-ϿW&d5;$IsU `y]@=&U TjFȠv*UCvյu⫕GgCΙfXVIFmXTf:PFF@DcЋǎ+NFjY-lMCTD-}V:\`U-Nʺ|7Ie.V7hhu@$,ʒ2#̢ɫmN=;N[=Pi{x^xuu YOGPo ˘VM<aMvc*uA'pn_-d*Ju`J$>+⹓WGLHԭ 2%TnH=Ǟ9]Ǝ(' EtHfYށiRZC4.MhP b|,s#r؝}l "A}@~m틥.SHS΢x$qt Q=w#X[{-HqulSUx!1-+=wr2-dqk:A=mgkN_,i4^5H q]99ht=HSQ|-s=+CkVZ٪aذ TBDeyL1JŮ )__m$‘>!ܨv,jtJj> ڥ6N^-Ƭę}Tt$$~T\ vWGDAetA4YUAqO^9G$,=Li6R쀏P ^ؼ\"RjZ!I@`eO"ҎaxbG[GbrJrֆ4G5Ξ]L[ᤞ,acxӔBn&d#͕򕭑E=󼢎)jj0eHbMXO5yZ);$LNͧ",kuPTd$3BCd lznH{VfiiD0sH|)vX婦BrIt-<1KGCL!LGs4_ mQQb<’ ʬ$2%5ؐ<$jq=-LDA*vmugUUжiQ-322- `<8Ϫ MR ey M7QESX(b-{AWQ4pE5TnvG(s2!4VVDyA˃9|9_AWRQrUhܰm_/)Tg]_VRPҙ# 'bMXbZ zʥB$D:\l$ٞ*T)_&>mmc1x<׉j驑$iܛ 85 =>ǹu\QH̄TD̷o|~nE#iv0$R))}Kj ^5^Eʫ3r ,fb O(ueg Z?κ0maMYJ4G?n5 $*`E>v>X8j]8JY"K@ ӌev*fi6c~f~+?a{MW⺯C&>X*A͓3% IoQI6VyfU%ɿC\Ӫ ]W! j~r1eOUUEI Ng5JioV* %鉵R#ÙfU[FRk }:ԍj~r0]W!G 3U%6eOrDսoUKQB++3.Tޝ;w7OiWUu_LcU4ƒ*_d:!56ڽKPoWFscVo>U5_93lڟ8Xks?w5T:hꎨ6e]WL5HQ<_fT>oU5_9"xŃ[D|7MGzxxd&7 OF@:cGv[{Cqa9-.jJу7~qV4_vC[?̐J\@QX?cIږr vog ,"97_QoXo2~㤤QJj5 [j},X=>?̑_j<ј$C<,{%Ň 9+5 eۧc@OFtpzxxd|7arR~X=<<2@E9gUт(pId9 bFbdPR1GqM/_TK! -|bAA%YI6m2S]UI|\3l"|+KX$jwg &bH`nacc FQCcH䊠4Hv5Ҥ*Q<_Έ:c oݎ,0U6_4/6mt6$߶+hkթ#XXbe GSq%1 IF%a:\6x H (sH3[N5)M _ qN[VG;:\[| !$r 33a-D1"%b6R|rI*UU9A ŏI@* B- دޗ\# ]eK\]GMMfQ"24vMǶ:'n53yRS_Rsb:}XVɛYi@]W7kgdgWE]YbiAvo }K,P\2PǦSwӥ+&A_LK,u)jTObQMfE%*4) >(?=F>~eRK^h+Zf M *MZeJ-kv=+qeSVeu4!(m:EoT0 Ի"YߨZ̤eT*Q_ɲ,.xjd8Ě`b><[qjNzFg Uqib\ \A22grs:ou7>qMy۷O̝4_LXJ|i-3{z mѪSƱF"$;kv4_.KI*R"$'c|Z,!sϩ)-AIn sn|Y4tj3zHDT!`H;o*%C.{PAS\ OU,u<]<, sZ1Uݙ|M\U ty90e$@i;wT8yBOZg/hJjyzh#g:ʆ &X}xAgIIVpÙTW)xVF|Ko {*Ar V-bGw Rv|S2zL٠t5h,zt.M|KqjUUU1^ ctU{M 9-`fy"A$fR5a4ᆥʫ!ӴL\ht KfIߐMKQeTQ":I5CdE 5Օ&eq#O q#s|쪋(5H -5e)T5UU*Ӹ{_.JT4O$+H{Mܷt,ok[bFCQQe$%g鐏tL7oeIiM&m$Y2NYKUE_Qyご'i !&گ ͓1a1}]|$A:Mcc5=[:`jz`hØ `\lun ]ܱmٝnyGGL XUSsohg4.m ~W١t`΄?[4NK ";eG -hJSuV7b%kTR$]wvlQ eW4 LHP"|ljJ NhJI]%%cI90FjznlՂ9fo`=ǮfJ;Z-QS/B fe ħ^V.WǙh^\-P#9 T #be< HzS6eJ(`AV2Mr&' fyNgSTJi҅Yu1 @Z5)aQS(.z>d߶1܏)sg51ȵJ΂j$ObSUf@Ii\؄_۷|yfffw}]q*Rjh#l6ٛlC#;$en-:Zio {IMoDy3G"5C/Ak:l)ZcFY7߷%i=&@7}7. 9tpCg<$:[<>ر,$My3] AUeᬌEeՑiW*c7.ߧ]3n_0y^y)Y{f/dY<$eHȊ[_) QoNw|k=,іI뺖c׷~Sf4IχI]_[|hUpϸ|ASWV8T`ͱa_n3IK"FG7nRR~Uzj!5*.6;G ftU2LO=/6.C42M+C#DϨ-˩sBY6H#qvN0z ⱳ_Yd|m~%HhC6:{R6Ψ_g]1f+w>mZW An*-I#/PJB)gɨ2{Q^ɦY"YK=]`m9R;Ǡh:!n_3.=o晌lI22{iŕ#2{X_̻~,_?_+?4?v @Fe߇AϞ<)57pb@:7=;o}uCb_C_[Y5LyQHeR%f24%!B1&( 7mM=RC 3i!l4wﳌL|gEY1`ǐdȯOTv @C:ĒT,$2[Xonon$eA~O<>Z._a@ҶGMZDhpuZh$ !b1#mktoLI Y((@mpT75Z]u >{3}WQ eU{$g$XsXT$jF\@hj]dcg`<^6a{iߥJJlϔ \lڌ9Hi2`ƌ\Z'Dhp+x]W%m~%\;7(%$PA;4ӧ%"߷ߙ[0IHY cfB"X+}!e kO7|,ƒ%RkHstcⴌqq6iFa4ŏK َlKo#_2iR",ʪI6K̲s~8k*Ο/RՇc+3j9[ۭ>PZ~EHO$t1OJtS (sųfmwf(ϯQĝ=N*c6.lH T< Gdd)|*{ŌDY+(XY&((XlR=*5"aho0GppZjxEhDHiʐe*{u0]Ňao)+頔;!5kuqӮ5|7 ̦QJܪعv* sykGVd(o` mǦ+CK*eyeܒXrI4Rry-E K`C|fSY`n,i*$NdVck7M"ьF(AzXɶݲ%To$$Qp5tXu~qGY#߷k;aʣↆjz1`ݾ8OeM,J3qĚDdz78q'#H9u0]ҵ ['>ZW3K>H=;ۦ`D5 IX;UQEP͉;m2|Q497Q\~"ꥒXs oUٍ&s%id=ɿ&9~eO$RKIO$`}7 $3ƸKQ *4GR 'jcd9 u2Cqm_3,4NEɧBӱ\tejQݳf^E|5,ۍg~ ʨ+(3Ӣy", qqf1ɪ"Hn;JڮXp47фTYB]XՍ(8T &j*)hZv1l̳+IP:CaØSePK3HFFQ(y  IDR*ZW:I$e)ܶIQ9JSR\#hi>d0~k[r`Jez ,FN{b=%%9MMY^*zo#i`X6$b-e>uOVW  D_e=-aC_kupa y{8w't5G[>qW1J8j c:x6]vюIUUHJ\l,7AE[Rf* J_`G;OƔTC89>9nmTk9ALi\H@7=_LOe8I%fG(( 7f8 *hW+YIop/,jZ2%R ѽ ALQx>*)j|PZ1^ts4R xMU54|MeQ+yg=tdV #;tsW4>%$1%% N9.:GՌg:9UM5 5,%O;4rap6;fST%4u2x1pWk$(oXj> gRN E-֔iThԾ":l<.k8g0;STKيk)RNT-g\+Qm 'Pp :֒x {qEJ>i'Gٍ&N+ҴQ.H$v"?9E9u \vb7M.5eG!F%ox[`0 qUg {D:Ufݷ?sm0#M 3*6zrwAW,i{6J۸9g]H{C7sOUY+ɤ60I/س fe0:. y.7[>ʳ‡Ê ChA-LqzXdv/oJ]7$QMBP'zl5s\X=9&]RM_:yݾfn޾XpVs%UME,Y"ʹt # ͷ' 2'-HVƭ'w7jR}Um:6\x˲ue1LڇwzX_ՙdF)=`9RޟMh̩Te<;{s]M :$JthᥙCƩy"'HJH"q暪@j[)n-sӽ%k9fh&}&6hAS/svYUYlc厇$5W]k-'S  @ CJIU[nMczUTy)06]=G[KM͑b-0F9^EQM 5%%K$$>b bm7 M0H,zsK =;SH" O]ZOo nv~޸\{;nIIs$)Ҟj,,7UsUS@Rv.TNIfnC]u4T35ŖP:zZ}e 2\;1t7Tc7;\X8|3)% ZŒg#ͭ gCW WUSbtWp/X+RU{!CZj8w?jJV+t $mdwMhmxnE8x-arg4DeS-/rCrXGQpu*^)J0]Q"ꊖmQP|7xcWXi;q|e2U8_(~W U Ej%4E}LRM0(-SG8 ƃm,2ک|Г_+=Af'p|J]<4 L֍J,ۥ1qvMS'_'E*4iOʚBlqY0eMC򤍘"okno7 '3̷+oz􌴥@E=FŎϸvW%3Q#i̗I|!k8ď==m-d Tkc5zl)!( @#c ~X'6}(e&gj K 6> ȕIBk9tQRʴHTK}Gs HyUJ(` ݇׎x9Aߒ{%+ -"[Q&(6Rq:=h$x]GGT S7U >Ap&vP"H @lW}@u7/E~6Σ֎ ,A@}pQKUd ,fhDBxQe^UWDdYb![ }3h'^0VqyjܭWgQKA  G${t<*Cd 7$3gϖg'cٮdW>Zԝ]S6v] mvsKSIPD~4k[u9n2 @El,WEgW6`-m5o |ՑGc_Y.bH.ob{E)_vY]ԉ*JJڍo;_A%@=#C1@ӨU&/ G ce7#ԒV/Fit5h@\˳Jj%b"iNtdWWĒ`[rUzsuzaqTׇ?_bß _e7'ŅXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXqocqLg#,!%ox˿1Ƹ*i1)sVK Mmqo;qq:QH+J~\RяqJ"W&z#[GY:VFSnA+s"]`m۩=:-`Tɦdԑ1iT+vU:Ñ=Ul4hhuPg{I ꫸kI[|Ŀ3\@r$&B>c\7fN]?8砤˫)d&J5BtOCp_Mu9姨E啉imI˰# Kk)&$N@NN,ori'Q줒/Qas$^K 7;484=783<٣WTT?1dYqX\<%÷q领 Lx9h%EGL֪,Eee,"ܨ;/RMEt*97i]|%,o3r⦫0ᥤjDPJJ6 [mkVG=593'Hxoj$J:/ H)~k63vh= V]L zjHDq|@Y>Z)ԸVq5 EZH$.Pl.=6xA*DM53Uqu>a|Ro ynn"P6p@)+]D"(.Ġ3noLJ8վ4xy2N TZjRn|d\ Ղy+OgUB1\_sVT9dD8%mjTتdG8VcS[54u ҄B6ߵϕb~=>eKp֦Dh­^m׶3ɪG xt {X}XQpTS-P=Jp=Ȫ( j(˧WS m+RuW!Y5:{_n\#omr|SZ &v a۾<(#OA3M-,IQ~6Hƫ'3KδSe%_!r[& 3bgylBLj@5eRҤ4sF_$c牑3 /$)[37]M-a9WyUhdx䐼U:Mq8vp^푠+S͞~[JMQYAsJ9n,H?ŵduʥ9Vj J쀫kͱA8jX"6a{[!Hu'X9f6yiB@kfȰ K2s>ɞ4$CA N׾PVW 25=<(7Qcq޸OAR2ΚDB}\AU=LLgYG,$OJ%uB)$yE52whH/7֞0:mbspwQ5SO ZH-)K }+Z2LJjca,@XI_783ju*0*U6Tgiu1 TWI DoIX}н~3&\!dH2if4uKmbWPWTD8Y1716QK`^RQա@G샇dxbEYom@}@m|1ɕpXأƞ"WN|X%z~[3(:M$v ؗ] YMge7"Bo~޸!~Ep  HHT\~?J6$s򦖢0 Ȱþ*aFvf IS-e䗹' }8cYMթB]{/L_xs^$IҪEL<\!BbۍCGOu5>Zt!f4cL?(A򼖊U PtBJbm]Hs4VHȚBBF1dqPN g PF0)5{k XxҲ.i+)kb*򙧥C:䋑î;0"x r )Mn^*;}V39l=q[V.b\JQ(>;d3)e][^f6]S$sS7Hlͪ8+aIY/(Ǔ1ʕX$`v1ܭ):jU!G[gYU%B;xs,3>3cWiM1%|LEoߔ')境HOm2Jrܿ Sz4X`-ɪh2fU2}(M'802$6%`aT2[O| m4Fi sgw mBksn>Jr؜r)ոWӧk $#n}FRܳwEUgif< >3zh/%q|~oqĮOqS[FeMJKH'ܪz`S6EtQƴnN~,Z3J220  rP<,I,k>x*Hg}U,};`IQU]%mOKWMZY%7D~b_ 8tĨ^į۾,YĒ)U݋,|nM n_-ly~AxT2h6iZjZ:j9fjs%( q$6YU$tʥ v1l8zr 2DIb5yXW)9=sܟ*}gYT:(6=/p:==UU)͊ vS׈_?ۅϗI\y\y7Gpi4<+_?ۃ &qqߟ/Gpra.<<#\n_4~-L>a⨖3 Hs Ir = GElc✺J#N5H-BHz#F"r0b\w:zVY kMXISBI#Q ulgm$&r]G/mM v_|"SZKs( 9760fM%Hܾumb)ˤX%IUh凕"ɥ#Vه|tcd9rhgYl+-Mf95&]wRV8zX(dCNq.%iVa/Җ"I"a%5*PFWj%[k˦ ])񎁅.aE.a@TsN ׇ9ͩjW)eiX`(9RrDܰw*YhmFg\\60̃E-m55ah or=\)2ÁhSZ#q,LdXt93QJ6MθDYR4q872v%3xg2 Z=gSt,%pfS~eq$\r8@>qX.B01J֦ém665 lX!"`  'CfUQ×KV"Yoo}N<9-"(Kyձt֚ 1V"+;n kc:%j2XYfI$1 G0GQy.hVV7 4>_r  6a UhpCF*q7.XX|̮ro|JmH%)jDBɠuU&Ü/-Fu5W>'fSKIHln\V3"Po2ly*IXͭٴe11 b _l{жYVdSAE^hC zFR<:``BMONX SC!$<4ܑYⅭY 31WT$Tu+m{_~򢶺LƬDk={~HJ,SQ7:y~1e1}IcDX%ֲ ,)-CUdB[:|O!%u5:$M:)MLH VHR#9Vh3*ct,*{yc#Z5g 4!vS{PsRچ~Ji5ɗ̭]W4HU~p<1ث.Q$H6eR?ǧ.AqdQUM:A1q|Aŗjs0hR$پ|36"( ◘Tgk̾z+RGJLt-5~8L=jHޡ^ͩz/qCD5t#p mTUYWUȼ dvP߶ SÐT11J$vem1C*dxZvEӻ0`n!.VTpCL*ƞ LG,3i(HFGSOcc>5rƲX(T0kQ|YE,̒t)-: 'O&\qcv|uU:fWChbI**ziSSF%`..鬛7'\꩸JY:Q"1𓺩LBZ9u.ā#:H RndsF} MRdI#[Xxnx.fJ$@u_Gܷ&ZztΐZ_sk/2 򲫔ث۵1em$J*#(C3s:R`OMI͸&0i@p=o>8ች:qK kT_9sl=ZXU&UtF`D2$ NC4&!-qq~6zUWK;ߺ6ChTDL啞%u1AB%0 B˳b?V3H2T/ȓ"8$M.Vt恌/¸S'6xU9[&ˊ S5et).: jƄ2(;v$^Y]ÓN||(T(IޘuP2 Q<N]/ثOWq-eDqZ$A6@X Q{U 8*e^5j+Iɤsl|VWgdkPhdmk^._I^ g@ʖt{ ጲ* yHKH4 EmȢq'.A%L*ΐuSC-_PDyrtQ* \$$>Xx8M@s4O,[bRg=fc >Ɲh׾n:ATHӳ,Ԏa1OWP|`YHjD]V`,ZVeN)ʺyT7A IXXMԞ¤l$]tBejoh Ix;4.9i ꭩIqfn 9c| Mx =O!̩s۔ /qeUXR%T9UjD2I=ij*ad!b+cGύrx$GM,.%w'IQqke9b PY5@nwmx)[/G= ;^dTRP^+66ݱw<;3ǖDje˂OqmN.15tT."&6,6 %+C, L=9UqIO *y}@ЙbX'G}F?fQUVfB$= ,SLn^ pC":=ƒةh i" v Z{,K QoӛV>xřu,LU4h Hy)&5A$$Mo,]jG4 aOG9'5h0˛Ue22,rD?#c+mh6A|DW/ɨ:2?s)xol[MZ mLn Ջ7Sl<  ōuQ#'7`ʧFOo2~3̏ߋ^ L,$df #'7`ʧFOo2~3̏ߋ^ L,$df #'7`ʧFOo2~3̏ߋ^ L,$df #'7`ʧFOo2~3̏ߋ^ L,$df #'7`ʧFOo2~3̏ߋ^ L,91fiD-ҢgQf1D4Q-Yk{w&?;q}.y=rz ⌬v^E-A;)2QA]YM9!aBJ=Tzeb&r+Nw$:\)RZi$f+"#r@A;7-}-CGVPfĺA[vf9aE9`JZ\e#0DX.GeGcJfyf.v y E2AIT.Q[q{'RMnAWuz%XlOQpCtZKs*] T[r)ʈ$}_,Ϡ*г/(km𓌦FE{ocFR[m_ssܒX ArZ&6"/p~Sʺ冒 E*7*;ى=vT;M0 r Fݷ(-3bhe ZZZ2"y YCBA;ŕ5zT`FHg ǻ Ezzo1F-L$LV, F,xՔp(S,&]zl1VFhÒRlmgZEDFbw$$^mc`RT>uَgfYT;itSܛŹMmKW2U jDܔX^gU}%G-z?,,lv5", T #.$}U%LjdžDi7VXws4m+̾RrJzI$bXxA#h\s7 u_Fh,P6nusT1P籴9a$ <=6'_$|ȤE +HKn|Q|[Z𵰸HUEfuş+2VTZ;eVー73"J,xx5hk'Pk*V1&6G_!SŚT唾)'橍T!J`uytY>UL(cjIk0[#klN#T㎒7evv:(kys{)?RѨ2<ƪD4Jx2u :]l{\ɸ/ k*7͇ۊn̦Ix iQ:,H)* h:-NDo|f2"8q8rثFYG2&Fv`6$:XGGe]ݫ2r4ru-~PJ:Yؾ{|4)tR6{{b,M eQI` VD"zs+1%x)e]Pjԛm]M6GQfъ9 ?-ةͥjjd+7 /`ҰA$BUXL=0MnKreWC]Q=@=jc9)][צ |#vψ`@ցrxfBqfK3/aF-\kIJ-@@-MSTs)3 aЖU_}:b5[Mx@/fƅIEe"PSFH6?^%9^I*(%H TQ#ej,UZsLI$urXfӪ~Hy ouQs pgTCr@k}هr}Rӈ)LjN얐c#QRaV$w&HDVS TCQUP2$wYPcc~juB8)u ̜@gUѼŽ/LxS#2ٮ<8y%Q".M]4PS$sQ 7>6ҥ1~?_a¾l4Aaaa`aaa`aaa`aaa`aaa`aaa`aaa`aaa`aaa`aaa`ž]5GI_qpLůXI$LocqGf2&yIGom/B11mngTΌ*U'#h?i eBbmHb5T+H*v7'9J2 ܗ܃;cx͸UQYUJVJ_Jo}DSeeq*e2X]kk`Fi,QK]X2G7ـ逄PRrt:80&Xʛ{|1xΧ((L0>3s4q6A)͵.$b$6](wS]%u: g-2kׯL7R HaN'm5UuI?.b W>teэ̓ԘSɨcVsh+2е*첩&0݁ !JzZmjj;|(a EȂg4hKn<`߯LsIct?3)|8uYM~;4=d+,ْ:]f |\)*%\TFmh ~Kq@d/۱ ǡ F]R4TITz%#$bFoO^zDGOGUȹm:NN94s1XCܙX_ð6c-f2+T,Hg /k y4!⣘V{TAcb˲؞@w!⺺(I5Q$33Q{#5Gm:㖮j(V cu ~gLIjl-' WM"4#1 XmD8:|Sљgz,K of0*Zoa{bmsČ5"$ұ-8$4㎥CZӹ"cUA&b,|@~6Ep 5yL2DD@'meZYjpD-7`K|F#f4٦oYW[Y 2V mPxX-/J˷#e<+A{4H(э<\hɦ릥JzXa[݁k|1rʚX26!t>W'뷦=9ެEPIwbe.'4nx3 %)S("Җ"Ͷ/}sHZS=7F؇SUTg4(/}#ؙ 4,\HV5LK02pP0)M[sJ!a>M"TS$U4%Bw8bZCoqQIݖY4 @wC=0+uc:LIy ; t-KsReۄ 41 @M0Cq8Ҫr^NII9Qwg[cs]Ժ$idsFPu}%oٿymW.\B}V8oB~vXlV|yčN5'Hnٍ&6Hg+%sˏk1~N'?3W-u4_(i-:4賑m3ol*a$R 7sB9%7r'NE? M1fJIA15& qc7VB[kFP \Y$9O4^]Qt\TaY!K/~Q?1$in;CC3Stbî'j&jᆂ)E!bi]4YPG&2?06LHX=9+&#$u{#)^ږ\X[5邹LUu-W%@*@zJ$+T 1s2i~nˡX^a'I7$@<Û?bIvE8hrh'3:iv4s؛=@*nj`Hc.igo<>'JL:xQැ%t⢚orʝVcpdiTXJz)jR+zbYtI{z*gN*I+j SBj췹C$VƣI1L9>,Mk1fY:9DOn'ĹitM"b6]IGT ,0\}X SogF#oQI55=d S=f*圹ksJDp԰?Ѱ}EfypMmJ0'\Z*j&Aup~'E5]3Y׈hzƦ)id#".7{YǏ#<ʳOuZҲL*"a47ybvTb[u8,Z@ri+dK){>6,g%/5x7ɧ|$ ]ԂKi[24UYc2CR`cN!TV-mqag,Z: @P3jIa_Wq,ypT/EG>~}*#'pټ9-&b}%ͤ`׶|4q- P@yJ@.V篑sJUܓKSfde K3(HbJH.p}]u]M[$. B[ N4rf1K)oc_| ȳ&㚜;U'4UYe] ]uõ:aR(ܻ2:Ȳ="Z;“Rz'BeO Pa!rwz3lʶ\.\(J܄rAkt#eoOeJds0[Ոk"&1rRUk0}FqoT*/%-s|7U%SJԭkjS1_ϠyhGW} J-;Q;WJD21+Uţ#/2K-,".(VL%j4G"#+ٚݱ^H  '%4Rm,\1,/u(t?=9X` 6z$JX`ݼ?t\=E:m{-,Kcg4$9p{FRSM.ܑ!-q,z'V=rrVUI jYOeh2Y@;Ͷ+Ox(a{U?>Ox(a{U?{ U?T ,3TS/(ϵS/^Ox(`>Ox(a{U?{ U?T ,3TS/(ϵS/^Ox(`>Ox(a{U?{ U?T 'w&?1qԣ8\S,rMq .ud^wryۏ׎~*N1TV*I˳ :j[I)tKĸbz.kTBѾ:n9i4t;/1n$i;'>q6WQhL5Yuzej¦6mT;|qOj8% `IWl ~`~{.KY%<3c 6 MMIEE{tXiep֋ *KtKQqṶ,uyθv(Dse$kn y-t; ƺP<~W;y=iݜM\ _s#A+jlI%y:s-U.\PB؋ř i!)!jEԢ.{_3᎛^%ŊRdQtu&uўnsze1`m}j9!YeAҥqI: ɉ-,ZEf7PߨLT(P M=yp/iY*G,XiPb7M4Q"~iVp Ѣ@[8_(ϲ쎣8QKV܆R*95U=L\pA za**k)p!6X$QEg)Hz`E? ORʯsRts{O^1EY*ZҪʋI>%k۶&U5}@J6ݖryb*VAc%ˤHU EnSke=*A &Z)X*$8jD7n =_*x,NHI"(ZվUMP&3TM,ZX|1}Y3RQRT0.Вv#ˡ hM|ʘTvt ]B ,uHPSZ ^o:19{U)$$M?n؟q#BKB<1HR~'LzTe$ ҝ[*I,p867 /q \/qA[4ia/`!gB"QvQktt+]褮wL@Ibcqn3!`7=zE/#xJ b Rcmplwo񟐫Ơ-&kT]Y7lv;`YUqQUM j4*:׵<(P5q3ggiRO(>6ĕ3SOȎ4O 3u7' ?qH9;v)YY'5bWQߩ:zj9T~,_˙N,4m5X+4-*qp%kVyֵ>>X2d5H,-ӭ kVrgV2y#"WR$EAg8k *dM k,eJׅw^ # `Ne$IvW [{[fq'Yt%JiYP5)= =12r2|63@܁}G ]>v3,V@ oXylM\4FEWo,4qG?i!e ѵL0_Qa ֟igzZGF/ETf=0wZ{q]˸Z|ߎ]3s_Jj?M!gI+ޚ'eadVռ*7ijE>cL+9mEjfK#﨎Xk۰#/SKU4x$K}u-ddK (+\(+`ovhcMx)aAUZ)b/W,Ӽq1qrd*HGN/t_'Y Nq$U]S=]HKO>Vi㯊ݼ6PydUN04"X? chJF^n߫!M6c@Ѕhm 1fy0@ON9j.H~ vSŦk夀\f#>٩1i Ԯ`b.ULvPCicJm-0FWl|PʭWPrņIW=J Ui啨ʗ>w^긠D@P5RЍvq?GCY#zdH+b;L8t,+^^% E,pr79iO%]7e_fQg<2FA- +3S#GVCkZ]qsNN pѻVz{~Ȫ(8O6܄Xl_O ,2ZckN`fĞ1rX^L;Y"I-P`$^J0fQU4R`$Ig=0O8evTcB5`(J)SV\na2QRQ[]S&J1eh* 2{ǭSVSe9d=;me ՋPϔ,&*Xy2lGadRݍW O&1Ֆl.3t'RI4OM+kkj8JTub{^:ଯJ4W̗\ups䧮T>UUHRZGl*qԚ:tk)tlfvB,ě\t۱qqfc:LeP.<킜]UcyLi_ԛLWj"+kLe:(ՊiਂYU$+JB{ X㉣'glRnX {mٽ'5A1ӤmrZR:z1K˘iDK p0Rq~2˳ 9F16q^E[rbJo-dS}h2h%n{؂ N"4+[΍"e7\l]LeB\;Q2UqAw1> s>릢dgQ^է ĺ$>Ch`G,T-zs2hie` ԋ+UQsBKJf&K4 O҅;_854Lx%1ݴ2NaI8vnXy=^lURQ2@, pWTّ"we<8.`pبzީxu=H|xm)5$S7gUNu60-J^tҊ۫l]޶2|;(:5M2bo^lP9yT_T$w*u۶ m%YjAF v\Y``ҫX2:϶WQTI̊dh"S{lq[݉kIY-zah3GğR\ѤIuGxB<B賂-%fMg8˸OyuecCW7%DH2IuXI"Ԋ.uָ~Mgh3GFXxYa2T$"K$ȸnXV_=[2SRRsH ׹E7?煢?{QK SJ@$*@P78 /) <-߆3/⹫)5qi ^<̌֐ h 6c_њc JTq(,Q7:N߆o? ֏2 ٴr $`BGscY].{CP|29"B p5xz70Z˶۾.) <-߆#ni'!H~qƳdpM@4߆o?ײq4<%LSAtΌ'[TE:0 js#pF:O/|h) <-߆3—JZ;|]BΥ}Z :$V˧F))D$.ޞ`%6Y_?玽·{}bĵuT9}V^ڸg-}Lx՜\GMA"$CVXjrl0THX iCblAmO3ZXVB:!W~7hDl#Gh ߒ? ١+~H,d-uDtʑCk _SX pmmPx*:$߭ŷ9hM+qE wWu:i~xWgFO}@Pp?@8BvǟTdsq)CF+dyl5۱BCD mktI,].NR)PFiWe6cM ]Ut啈*6bE u`uLw3QvX;nmD7bͰ^|8NHTS*"/Z]R?mk6-Z!xzX bۚ<ȷ)tՒ2+ق(!`O(3%bZz5]mylAΡvr&9QC-i#۝Ѻ\ySH"6q1Rؿ{hMRPTsr@~'(|.8@kzù'YJdԮ؈ϙVzIK%}Ly$}JM:5H8M!|pb0Mڝ׷C%F^w)(GkpK *4m~=akN ZKQdN_WVbJ2rQlC$(p-Jkj$9{abd7o- ;[Jܽ1<+ICV;t7齾8 M(@NIĮ: C_Z` skˠ%u+IUPSjjj93ؙ25݊OT%Q+`]% 3lv ΟcH=&*#1#YlYE ԼdF$j@:@F#-T Xi}P,{vyfyr!&Y)!帳8[V3HΜ6 },ec긶8LӲ] s= 6tp6X?g$CEXo`P}sA!Wh ƂVvjh+M`\bu$~.ibsቴ|aEl/} ^bfMpn$ܳ{Y/}:2r"a`A*>gY+Eɥ\쿈s_L'*Q; l$\Yl7ʽʃRqZCAUWXa\ֺY ׿L4*Ab-,6kT:8(!Ⱦ=vS;%Q2Jjfw>Y< HV&.ubO`+i3JĤlYA[{s~̦SS<%2q} Nj$ {ہo눲Q#FQ.~۶9j`DKHr?\3JeԵ0ҟg_1XktHϖb0ͪ|&GbE O{a>m;/#bI[QWh m`0?D$ƶ@غkQtjw1(@MSCQMN٦aӈjs9)4A ~Fg-VhbZ@-e{X1(`{._+)Yy`k!V/%e(x2XX}ԚncTURXyx0IfV:E"-4v OMf5ITw+塩eekees"^}XDYe箫-:JH!uG{mRQ1Q`"HIT-WMNih鱿p>[r%$|\̩mI'_mx#bNR wb%\NKuSN)L#9$C* [~O3̙(i&gīm]E9ۂq ?`DŹX{-qik_e>ɢ3siXA:G@1@ XaTVPm]>T=m^hvfE1vbY`IX7Oۇ *O"HϘ̆;Xk䓫rV2*HmUs5kⲙL d*G pI5%`bU#;|u}<:>t!c)`JY@?W+iM7-_3m%bqeOLU&M=DdʚNaz:y6;{YÔ3ZQnX754U4LJ]AϮ Ғ`n-'0n-'1+aFY]@mgm6Ǜ'kjX*#e&Q[jhH{ jyuY T\=M5bG,m5FnhY N$*vՉGML匑IJF@([9Bl#Bڭcpۏ܍CS55-1,9ae;;y~&iy4e4#61 ۰D{l:zeG6LPZՓɤ/%yj )[;OU>q$+e$oR=KDc^Y{*,a;j %VXU@EĄ%G\O͗n,W+peI@(Zyd؛._'J6] aa{؏C{F]_z&F52D tH8? `ꥍ&ZY]Ⱦ᜴%eA2A\teTnDwYnJJ0./Co?/K-&(Ӹp;_ᇦPk9A$錎[v#:eZ  'KY,-:qݷVKb(\LXmOL7d1v ƁHVAؒ:l QF9ʙ$KL]ɽcLsƍQMm f,f;LVްpd*,lO$$ {M &E-*f+[Z CIvw+د!HcrܼXs{Rs SUU(,z}xATO(XAحv UL ED.Airښܾ*؏,RquV%FcP$WSй]$܁lWvpaH$6lif!5*c8 ,Ue-$"p\"稰peTUj$p% ʀQp;'Io;YbT EY]BYf5YbJͮGEӨ4u]GC܌17FQ:_ l[uvtSG^(|5>J58t"J%P$qmOIJ '&^1ڲؖ:qlXPզqk<0Nz nQ/\R;A%=B;3,(齇ێ\6ƫu@wve7 lF+j1JJmĻX適+(+}wb%dL&s$EV c2=lz)`,O@V%QfՔziĀH%n׵Dc@8V_I'62wE{ĒQm_z])$)!&qrw.Hk۱ Iʝ%ՎW IMUD݉<]eצ uLVQȱ+p9ʩ*:Tf> SD7GKo|Sdx[,0y`IR46'/pp}X69I ;Znno8*LLđjU:rZ8e0RlĻx=?|pWGf$< %INڼ=F}xC jPQ´O\FN Dfybj.n7GP0q,G/+2R}q̜·ˍ-|%4sΧIWxn? {U\yzKD[6m~++#U!E5=$O1hm{*lV.̣{ lԛ*eʓ*4rTuꚞ $Kp.pLrE+sr(SS=opCeDYAWn۾<<0j41%*X3r c-F-[kv))=J=+#ȑy}Q褄 idΣ8cƬָ1r ʏh*磠 PqqHYas{0VsM548:%Wǟ874Ir+ۭ#ldm,3*R`,V#kt|(*)#Iv#"*|=4f3UGI&"Rs{Yu4 D2Uc/b:߶/nG]m.s[==AgݖB| ̞n,VeVwE;ᅱUUn 9rl+sJcnM﨓,# &̜E "X$فoT8nYjPbنE:"u>rtEF:*Ɖe]Do?\@5O*!W`AyRCYP:HX#StĬ]ͥ|/i-& TS,uR4EJ'b_,3-LREg]ǹlfV9S'o 8OKEF}R7n09}HR`:_€.n"h$SC62.M9fu,9Gݑt鿞 I -`ݭw{M9qb<jӼnM_ߥ *I2iU~],1be[.N3]lO^*t`O$)NKnorf"rQyũ2̒ 57|ItFYcTZaٲ˒x$ptzxG}4R#iN_hDE˛߾!l(G*#è1[uoCT P].n#__\yPS y`T{rlqxF:k(H)f1?T+B=+h?g(d(gM> dӠ0`>(i`3 )dbJ615dԮL,lK*κZۗP)hΟ0f,Z*$2ͺ̍#+uXQϺ |ZS ٮps>8X@Mca),=Ve)yzhD 6#.\ m ~ZKs(%(`jvPzُ3p3 jHtQQRBR*"_]IO\Vz#D-=i+S&IU1<4Lew뎾\߉NQkK7q*eT4R5@$('' U-5IαtU}:dҊM4DҨJX툕<+CS=DTeJ@@l^Gc˸,ǟ5$1HՁĊʠA)B*R"&YYͬ/k"{6a~?8?َI˜b=̭9atW>'Z rk)Zpp7FH؃`_>Xl尗f&\Xxyyi4dzըB:A wÍ3=:yb54+2+m8ST>G p?G1 Z -4@Q([X 6:0ٯUPISVF꽀pWް~aYAF19X Ϧ1n)X$*"} {mlj/QUSL$ESiQ)Ptɤ0px̳ߏ!\̔71n6Ϯ8ZaZvLC0XKUt]߮%G<^m d>vׄ(=If8 v=t/VJQTk&`b2 AQ{~W2xK2$F=qQ8Y ݏ88q:oGxR9g2KYx®wb0_F-14 ]ߚ<ȷ(4 )B@.o؜K9pqpRϩ.0"HLZC}E+s ¯%Ji>`ww{b j`DaECQ>VM+%A{Y4oөWC)/rZ~gGȯ*%MmG}S\z_jhѽ/Vo]W> .kKcGG噝]ًb;/46݋6{\{_)I}.7<5e,=w#H툙y`iLm,e*=Ż4x=o5PXa7`yc۽~!kTg݋q^tVD% - :!f6Ct'lZx3FZ Y 鸾+sHyKt6Q`5/ .) 9}VKX[m;+RTMQ,Rw7$oSڨfk> 67;vħM>@E*wに*.>p g݈ڽ>QNtvZZd(,Q+kmL[ڜDKv,q~NjRԺ2e&;Ufr3I S)a~ .ѰfRFfGr-ÀsfY ^_UI/ q1Z2A]x7> F-[? dc,hmȧK|mqOˆE X-HWL]83k* e3($.rG\Uib< LMө:Ejҝ* ‘Ny:olG{5 Rw#( n4O #QRQcasK!A`𦁢C>I+3:7=]Q-FoFSMN#fQ5LY ckH8 S3.]7$EFei;jR.u5O[N·F>~⿓ۇj$1e#I2*kn6#og{}Q|#JQlYcojQm)'ȵ]jK5elBrŜF)=~[brbF$=682. J̻0`ƣ^ތۿ|ˀ鳘䩧 1;t태:2 ,^skcEb.s千'.~[Jzʱ5mu&,oq±Q|՝sK}Eվ۾I>ZW2m F+0Џ_inz%X%:XqP[!8zCEA~׍=WA'?ٝxٛ=ivz~ֈ@[lX3>*lό2sDUGOF Gnjh4l ='$CrF3v?݉r02 qH\rXY[شc{5{ KyɄ8rrC4<ګfoP)d7p5vӸPsT`Z.;*-Ϯ/~ٓ5#-(x[[)al@ }ͱL*LR} Jsd9zXk]J}1Gʽ=V]Ք/$wm2XHJ[p>J0P0i i _ ǚ~c]] jM"H.LP%.[e`5MrTܭd#鎝]]]D&抄G2T%T>6"ĩ6xUFHZb7َ]4Z/A _:4FFѩm&O]l YYd)Clm|{S-<02;oziHҖ۶fx^4[DCb[`ezH Q`bTs(*%n[‹ʌ6䁽p&ejx%c0ӽ;[aNҢfCbA7$om;D;H%vVUp0wF,祦ɳb{"mlT /em.*P慩sZi$[>(G ˧%#2!+ ߶Ɣ\ a ۛV5<^N%ZJ]ӵқJ/l9KL ?scρ|iX^v,EΑwً RϙWjM2$/ _Zar-=(ZUeN**X̰+#F܀1WI6}Yj2w[/4y~w4TEPXX`OLq\0U$P{+i$Ca)־ަ؞SqHK&E]?bYIkz6nopQ6gVSKȗF,FJM6b,n#]/3AY'{G|GfJci\6 v$mͅ;jDL(2m Ie"m7QJ3Zvm,Y\ /1K16۠ù^u='[Qt(<2 v=u_5=\($SG+悩JEyPָTq\ՏK-G ԡ۾ t53UI4[ cxdxr:ؠuLnlmkLٝ)`c0{Xl?RLej6$T굻QFDv#}";rAHk3VQʚfRXv fB1RUEWS}]0#f,aoʴ1)dԭ+۽߫ݹdEWRUThP\qCS*K aLSé.om=$F .ċa&W̋ƙp5lTrȄY[aT4\l]2*zwrFMq9eԣ*i3:>oM+Б۾ S[)yD#:Fl3,/Rf]p/Koc\\ecB3fbz%/K"Bjn1>~o 64N<3%\ٜN6+ZbTG'K]IG=EAЮQ&zbc2gˢ1Ī@e8=Hز9]Co}Ǚm 5]E4O+3DE}:W6jY+Eu$>|efl#xC@oY)E6SQy*`H> 5}K٬V5J9ݿ}[\D*U0)S빽cͽ뫨hhih"0 `wģ%!}hdٙyxjfe.$K F ti›8bt}`Z3Y*)YC%d)}AbmEg-=u%ZeR9CfpMm) nm$RPɚfFAN_4uKI6 Ǧ,ٌ)"@RfJb叼 UlӑɌ&kXmoІE-zrF>~Ftjhb~,\3C:]&Mmcl !y&".l>8̌cKMPWq_WԘNTA 4ҏ L"2E5BU.'æwGr1C|垮w=+orۋX~fWSGG R/YV@|zR aH&<.gE{I¢i/ESKF9E?*kM pq((!zwTB秈yQYV5F+\s$XRHSLh_ 66Iz<ɫ!rHo0sZ8e e';vm5F8V*,fK eըaHCnvc**i*$ҫRhnv=&u-,+NpXnzxNm6ajX,Q`}AS)⯨LY UKP# )u3\y9|%~rpsCi!+.c؛ݲzJaR;)y3 嗒FV1(t:E a?pWrQƔKB}Fok E2t:5w77Ĩ{ާi#εboh'R2( Aain((%]UHjFmrr㟔^'s36>Xi8T(臒dηaɷIڃ4rO@sa5|,Q-we4gh/!G^b4/JP ŀ= QCtKKGYS;ҴljH>qn^Z}FSڒ;YL]㖩Q!G }|8׌9Y.(cnިűU0Cy$$:MlmcKSVe,SIPႋ-ō&:$گ4eqIQS*d*4P9jeԚe+A+~j~]'wA[ 26iU< ie}~b!E ;Tܡ-+me )w==R*Ϟvjƣ fYY( ˙Vb4;7Zy%AY3{*"tTL~?hYf*7),U6LdyNr(+RU\r(ؗ\SQ׸1  Aa"ɹnMST59wX4?> 1A+4*uvŊ3 mMKCOGNAYVuET7k t0}D=\>xqgI,H/`\<ja\ҌԒDZ..[11kHCp${oƱTIYVSdrੳ)b.ɔ𩎕MtI'q$IU HŞYokDuĚj~+LWzBVxCvWʩCe96i** ,4pZ1YOUƕ LNR0![.Li2}JYi"yB KN kwk/_EIT&5V ꊈ6pϕ"b^pfHvhmo.ج5X}:ߠ`H(%HE_JG;b]$TSM3$l;~G/וdXvxf܋tDԺ \~'/!yCe`tqDK"#̑mlrc2*Ti ^޿V)K") ܓ>;MS I0zf 9b,olGg$6IJJEWUJA7]Gu3_ `T-KQ+F-iCBN; uTAz36<(ۛ(WSTQ,v:Gso<6kZž:K3tܞ :K %US}^cFՏՓi}ѤLМB̜Yz6?~AwkYMxiTI(_{Zb-e2RjV{m>g iV5S\͕4lQei@qY݈Y17*g"1GRn1:WS @:"HdHksfF@ԧqoV"{m&h $ޚS=V)) %!sֲ9+44N H;|ZH3ڧΆh[;){c9,q5>[*3%ULj5Vgʦr8שcO$_8kfTpgED:Rwn40I !R8R8ڰqmF{KS /a8[ܒƙfcRSfD4̶v[xV1 =CPB2k GpPŗUdVF%҈S߱bnIIQ%.a˒)B{{pYQKS ]Buv&9.L4L1 ܒ=L794UqS).d[mn[GLb};3L.ϫ(3ƪh=MƐKAI/f-C.H. q@8 Y8$NqwJ,4\jVrF؄ ~ֹQ̲ɮ1jZZMjf'?YQ4T-#zuYpB!#|͝W_L/kpWDžf+ݯ&8W+~o¿^s;v_3g _9i yMxsla|͝W_L7f+ݯ&$ʗ#̄պ0x]Lo_8W+~oJkgz:NLw} |35 %LI>{)4g)etD a%6XpǮ;?h1Ǥ`fZ4}ƒus$Я|@}h!x"< p?a#C鍥jt\q&_ k9FԺNk\yۈUf ,-˄N2fID.=:^@Ȳxdqt!.<NjjPj#*3qaI,꒮+Dd$$Xxw# 2^RUCPuZ=7"YOO1Eǩ6}pqp'Ϊ,љbFuboY qobEM zc_ sIY+ ~7L}t$ID$Yq7Fj%AZdr 3$srJ zDLZZ8#rl&@PѶBȂ;`mx1s h "mUJb$G^[y J+: 7QJXP`{}0] ⭆I3FUO)AOA+sͣE@lI[T2#Ĉ#% +/^¶] Ґ-,$cfx"\_틔x$n,}@u3i"7R>8wD1s)N?H"n1e(hjvaOK07z}q.W-WT ji\,_)}J "~r H݇U44c=7Ʀ9olF$Tـ&w%SeΊ,o$#sCy9pE;mRr_p-TIrI")ԓHUt>2j᥊*)fI6MvCn-ghDczM? n%%b4Ё㑘ܿ4HmqFCJK)d}6j,M z {z,)W3|-#GjP,rPh'2\sJs%]>X8eR4ԨM! dXL4qR955r0>]p`еKb-QVv 6as`6&4ukVCWo%;ZݭلPQ%FRP-c{l*xtnJ—vdDb8gPb=ba@X5n{i8p&d& N2bFkXuxnb E}ʓH\"*om B/Ӯay>5.d=ᗐ:*^,5  CimF?Y %GpM~8MNo ܩblujei"KS@pYCm!QЏKdێHFlqkc}=0/B~jmsFLMuBo\55?n$pI|zKvaRz[/_ +pFڐbmG?YFi%܃pZE`RKfkMA+pȡTyHV䆕v ­ :>zch^0%}Ly|&#c{iǜeJ#Gbw>TeOMrP6^֚6a4L$.{}G !,F5og^H6ݚ1_7f ;*wd >l@ rUS Ob}&XFFCrMt M<`m;lOȩ +dSk1|pS-Zx@(FK&i+e3rb,{/~x'GsTBkuU;x(=4Q)[(GxCtU_\haUp=[|,3Vǂ++:U4EoNh2HBFb32L4+Ki쪣4Ҥ˥A:#-nC.j%KfP;F׾&fkETc2$Q蕚r}xm_>xU%i`- Pu5KGMSS#Jdl=Fm[t,["vaJU/*a,L5=kऎP̤a:%|p"9Vwl\sُ)oMؿ0'9Vdv7O T #X(?D4UITƕ{ټQ,)Qeb;_)i)Zk($cKIZGXm_J ˯B]Fh"27O뻭M8jjzWM:j۶jjK!YUU| \R]M;GnTo M,V%PPU? \ZG?#|qT޻}i 5sD1pIE'x*ZcM3w=Nܔ)>޾4VG DŒVaѐؑ=9| cWXǞzV:`N`t |Vo-$ȱ%Y*97LrM:N{`ED4Pōl-qĢDMv lAw'=, z(1X+ XmDb8S:"m`⺦%e?m i;]ZN9,STTN‘鑎M>h>E1~g1֔=C@`> 䯨j 㐪6 aHrN(TTg'r{"S*2$HzS#ch^ eVk=qep&^Մ2 vu,{c9&L6Ӳf2esQF 7{z9* FsQlŏNreU͕s2(X#z_̓1j\f[cQ"cl/-;rQ婄̮sXͲlhR]dY $PN#ms&k-5M=KEQ iSR~]QL+b5jREK&*eeq1[-ГH-8 v9QCIskj]f3=%~Rj˳op"ŀ-vMU2cuF&Fcw3j3 y i 1|d_:ǘfC<С^o\]3/|R#K Iϖ6vPǠTt$[] ,V,m\T,ј΃'~4T[na $|UlON  fR? 䥾qW`ͥZc8D+'qш2 ,4v7ۯՌ*v4ф:C\8cE*rjJ)!jъE鿖9rI){AWP?|Tn]Az,6b/.Y3|B ǐ](F*l&Zy5"J6CulT';HT3'nQ (ͷ{R&Nri=.|/˫ji' RYpH_'5f Ykl{!eKeM&61F`/a{)ۏWȡN9YQϸK:+T)o~ 0җ/j'슺4/dg1ѝ:\\m4w5UP-%b VR7-m?buRڊt͸ft(S) !@;kLJ7CB xWڠ _vGE_ɥu`60|$LkYQ_BJc1bkizMBǏq=ǎH,TTi#H'&إPpmrTA=d"yUAF$4l#xБkZ/T\"KL0~o~Mxq%ei5=Iߠ`_UҜ1$.񏦨y.KG\ryS1t R4aIQkD\ML&& \s/'?t6!=Džo2~$RƓ-F mp >/QgZ\\ꩫZu6:uayԋ8$Xs=Dž"WͲ ^'u)RFcb:3 [(9]2$`֌6}6O,1$nqNˤ{j|gfW/ [.cY.c%4 lo{մSԣ!4}!͎X[jz%-Eʗ'~pK\c ] ԡ1ŔV́"ڀV-W؅픜/:^7:~sLQF Y>p>/ψ2HRJؕQ/cs`z_8 Wdc~ieq MufO4\yˏ'CU:"ta 070*i# ,o.nl>tn\u>dM>ЛRЧ7J(0ΔUi)?@m>rA?C[WYRYb `|;j=J(AX0 yQȧ-'45Sj* L`\cTqNfc)@C>[`Yeuc̞"6WC{ue^kWm rl7[Q q7immy V2)ѥM(ڜDKv,q<$3z<3;-0i㒒j!-gytNLI%mjr fmrsG H9P`ۦpeMRfu(jY(PIHvmI[I4_Bkө{m灺`xfj ^jcI (1IkQo_ۋT,BuCFա˲֚8*m;Ht>э*D7bͰ^|;}/èfeմtϮ.R ql S` R G#9_wDj[ay~eٔ7T4Fĕ{-[UӐ^I\Prq9%0j&4E/C%*;:-'%[IH[h:q2 4Av֘U,Km+ƗM~R9XFĘVjcbk Gӳ ս>C\|Nm&Ap|o%J״Szw7_1j];[6t/NG$τTTRY KTSʉuf5>5֒w&HG 6ӽ¹iVl#шAUY wz<^yQʺe`B i`nj)J>imn>Ljnt];[6t'U"Ehir o>lNTOpèߧ0򄬩*Pm6\ʥ̈́25{gEXv{㊺xa 1m?pa[B<ل H*S%*t:ٗ&FI 9LqWB#ej^Pq RQ@ϕRѩ'G>Fw8J]cf%Y־>N smr+s23ܯe&*^\vVKDSLe6|}&Zjj]eX&l|faZҙ8:?uvlKx. cBOU};!d4^ID"Z@ynNֽ8]Y:G2Qo('`G؎yFzq-,/TCok+bAR1IGG£LK^ʨ,O+,H 7ŖD7bͰ^| )I>ߑq98fYU;TZmZ+: ˕%x<n a fGr-Ï2Q-M)j4P= p 7 EǟKe  N\dT@jɩ%򊴞d@{b|4t]USQrakMRJ_X7 IMے<#1(+%Q@ǵ/Čg$=xh2jHVQOn4Fq+[Sm*,)Hݮ}wt阯A - kx49jSJO MruY\LWV7lOz҈@ťPPx]f<8.T˦Vvܑ^"r:*Ti'ԕܞ*6݋6{\}.>-I=R*\Z#K`爵"K!Q4tطfGr-ÊVP 4TvACK%w5TOZZ(eK1}:n<"*%<Ȇcv nk{D״p@b._ě?W5E{ ubUfC+|[餪Ԕª{;؆^Q"Uw(4tUhcy[S2pIU]#r~8is(GBTS>]|ԛ5d-5Αԟ3A):@+`./3zut1/t*1W8AK#S3\6-&X)ѻ\鸿M79:N z_OG rrF|jZ5*cxBߘqIu9\7BNԵ:G{㆒V4m fbwqԊ d1xpN!HƩ!s~0E>c*&0,{^tRfM ^d@~!;#={7dK CpΡд 亏V{E4) l7& _BӹP@m$JxhSZ2ut1<jOiCMK\[!EWn5f8,%ӷPF)F,vƒ_#dܺ rS !?FOM />qKd GKfK\O!$pF}] [dԓMO8xOA'z\p}l>y\+LF5wX}鲊Hl4I猷<-JivUHx"2\ՆLʪECaK,$ɓpNmUg =|n'It[$RR# IҧbőS%P++,I9?ϵ Bm³K[.oU=,.Ţї?g\wUW!yT;~aUs*LxB!?^,قB,#UO34c)hMvm>Rix6w6:&2J:DKLb *%ޘKR{& s(3ԭ \6zi*VHT˿Ma(ɦqfV؋ƹrd 9-!-`OF)qg\KG]Q7&0jyƯNjV%ʩ:U( _]LQyR_uuqp ?e0 3 tY߷|{C!#H|'J|4DHR]~NX(9Zb묋7oMIUU5\ Qu[3[bqeTʌɩF>k8O/]m\_$^D) 欄٭Js{qeEe*JYƘmr/_2)iRH%jsVD&Tr,TnIOS*T;Hb;YN1T$ZU9[s9];FYl@F(O,q zMJkagѵQjRcXp:Q]%t%.\'dq$h)gV*POV=S!IYvqA%SB%uȸ[㺼/'jhiDs:jif=h9L>^Cn% qfEpgpľ@#*8njiJ)M-nUQܞ],%Ǚ%orۡp^ü9Ly殂w/n =x$5P:6k,TН );lMPGMd`BiQXX+*T@L#F;6i:>wL8nۤuzWu<ڼ#V@*f%ʼnXxzl82ٜKͿ\,o)MNڵuϮ2_ڎ@X|G&Nl<&Nv_ùt8y h-v\ښZ&4)y+l$[lUXK!P!ytb1b܎ĞpoT{U5-FAOM*Ls/_Pek@暖%AZi>w:v;3 OSK$h-O xftuY5%!bYD3*j73M& :|iV?1L ε٬fZShwc.7k!P簊ҞYuky3pv 3L`Z7|Di %XQMV'cpqL[orԱU&iY,RȰDOV'}bTIEΧ屉Ѯ{MuSfPfuжaQL,Jž%R*:j-3AMŭ}) 5)n^Vh3gPPbk\8GYA #FOỷ s />44X@ 6ݻ NJjL. S| kM$|׍6㵈˅|{BO<㉭*! E |Us^,h2*t[S/2<Rm}ό_PE*jd,Wd%~Oܛ ;wљ(ibh{ն`ETH"2\kQH^BL6 J$JAXfF$/j9)Zw٣*|UA>FtVUL4)=qjczyiAǚx_m'25>H@\;nnqLz!ZGȨ2:Eǘ:#uk]CHfgYf$#vnxu83 `+Vat6,đ#&i\FLdmјnJs(/*:GpN{ yh@ @m{o/^5 a(,567;bDAL"ቡzzy3 CtlMMr1`xZz ^h1blۨ7G͔7 ʰdϸN,e};鵶>,ËT)U TUJvSvNfKOC ,u/2fx@߼{j2X4244\7IK#4m4umaf冚Xs2 D*`n:^j^(at& K:݁cG \/%%X0o~m>I2^d+xEH^BrA[B wRR7PP(ZKyY#DmoTlTC೾ 3aIb0Bػr>c#KbmI`aeKI':hs<)Ӽ;$1q'_2`Td%́e\J 99UY,v%8O18r`jk3#.P>.bM$|F$/ H+fpw,/qFg_Sf ƫ`Uۦk C UՏ9ixAN>"XV&~e)WŜGW-C6v+$zY>ceh8QDၶ; }q^yZLu^\"[֥>+p."*qO$~rN7)<8I# 0X=e4 8T-50ok܀[Nx얍)[ šJ:Ʌ1*$DHt[38jhZ|'k|;נMn@S~ y)x}yA, m;mLmmab%MMAO,Oқ_1Iѳ9|a5QMSOT$b@{ @}/cѧ~T-gEӯHBn.I:q ;7xc&34 m;~i3Is*&q3+TEMݱoeHdH*2 ]|p"f4S"ɡYQz1mv={9ˡu(G4ܣ$)'Ti04)6kkD6f$gtaMJdL:;YLqSɞU4~]Br阐[2#[mlväeXL,N qTYɩh:.ʋs׫؎)SyE5+YI RG:넖wrfKRB ,iN&fk#eU'ԢD$d#k7. 20RJ11ZK[lG $ DR]**Lrʞ#[,'LLsIF6;ZV9F 9 RҙFPB4Xc3\5fi hC;ā`vݯ:Td_ M 5p`h5D ܓ!ŕE9_7)NarMabCeMPSXrl=5j5* (B7]#M tb"'VEHEr*kɤ;.l5\ h,JJ eSq{_~8952S<,K2<ݾAfŽS)ttPn.zm^XlΫ#)B)Y/,"· SF4t4F}}}q()*F-f[t6؟is*"*h%"袒}>Y` =**Ǝ)${%v}6j90How5dT+, +#n{|1f fT5ҵE"jhlqz޾hqG[+BJ-cS1t"vuw'Ù Z9NJ|ZhYo֥Zzt~sdFʠ[q G 3:[c\ig<]TV$ԔLpoCRʬ,:ܪ0SL) ~޸挋Nɦ eո6Si6XwR 3DCLGD-EL)mf_ :׈1}cSG;E=;M=Z5Vf%TT/<c{DIbG\Q)':,/;bוD9+Q ;xŽfF1i:cqzzRriM,0SR=L.N75*fsaObY^RXX45"K0iBjY otœJc"S*tY[` _-ɇMU BUTVO^05߿bJJB)_;1[k_[GRW5hq*/߮)ʙfjAEaǞ+ 좕YIcjb$z3zR̬ =˪gyZ'O6XT$0saBa j3*nYF9V9YRo1q П3TsA,Ll]|ĕ2*d ._厤9KAKDF*\|ˣ{ҹ2-5t9vi'[患'kMU}mDBE#ɲ}TrfGYgI#rLRZ 8R;[Il>=2zfyiCZ!9St;n;\3G`U*:mϞ-)7\K-Vn #u|gg%0 f''Qտd(i*V6f[|M4ȁ;jǷۂv4;|B ۦ/N۲Iw,gDNaB}* 3u8,bX g٩i3tI周qm5[BC[=HO,cDgS"E|' .6%(%fjKX 0Yk 'j;"e F=ؘ OSՎ3Xi*L 1 DY/ Hƈ_䴦(X?ROr~*#N5dm-4[Xn"K!ƣvŕꎢFTn 7UTɉK@mh͈Pz%SCu3<(mo,Ԥ΃U/&:u(ێRT;JT4SNgX"')s_}OE˫qTU Ұ -uPB#]VKO4jYZA+LX:`(V8IƩ(jnu:btmmmiVv*juZĿ+~[ƱIeE}ٔ2@:UWXJu2 lY[{a"=;a!n_àiNPjᇓcndjv(:C6GO){VD6/=VHv%xt+*!1=ZanUu1O]#jguIȥM*~Cc܎XSTEEɚ2cO^K 朼):+i@po|#i39$T nk[$UB">F ?f4-O;rJU$k]HW$%Ĩ`m_L7ikVA,K굀#1tkc顒IY"WoqՈ(fTFK$QGK4F!"T/6#6Ւ]*Z&l5_F_eZ&"f*Gf#I 9!˖X' a-[X|q)Uw'r,.ǒLj*OiWC8R@>Xlm c1fe׉Y5Q{aZB DQctu2R_{I_BerL&n̴`AJÈi! s`@?r}bKQ F>drj y[⩯gBd$\]R:xyғt+ҲCU&=s]DN܍:JFQCASN/x7ܞcXHJ`[7oLs/'dQ>oVa e)nb550W$hjL!*eR͹ՈVOlCE*ٵal<^Ln6w;_ZS${cQ;I!SA?fe枚:Xi@eRUuPY[VU.N}M: 2J1F*USb~XˤDiӮF7Qg^2)ZX3,-yw=:cәM4f"1Nd2u)cP6oNSe`.`յbC7$ Oʩ25iP{ĊEՎ]dX5*ṂE+~b nQ${t@iePN|eViі H^K:S6Ov2 ]$ƢYD=^0ɒH*#gIh*hrW\DԶp91ʥlzzD!eUNܴ2њEWRK殥ʆKnh"l8JW&3/0{3{ ^J| /\ X!}++B~ʨh:x"em2;,v[jҺES0dMG[D*rcv\D^#X" -(zj/#SV`=ہ24rzI4D'UbzᠵΧ`T:߿CS$%e^!Y\t9JʬMFi$17!OS卭L{#!`kV!F.UWVs;㨒G$!k^8s&Nnc zvA,j{P B$ӻ+ư&I=0&PdH-obVg <],/ѾaP&)I wlIζ]c䙩±{SA/X-- $@lTlA $T2H X*CA(Xtas9}){vYs2f60?|<J$WU)yۜR>.n˪AwO2" E|{t̲Z#hhFF*Hp\3CU"rT&ᜋ+|2h# Z*Ia85ͽhRTK$"b633$9dmō0Ò@`;Ŗ(Bjڬ'? D͖j%+ )ђ [bQW=xs-u™GZOk5 ljBREBx3/j( Q6uqOZNͩ i)9;Mp jt RW[P̹%/Z~Nˤj3H> .7LJ[OM ߄Ԭed\i])S)ˣ]%oܜ^xjJI=)@eB.,{I_s3υ2^qonen<;wz7Jqy f7GN-&EQ $0Cxf%aDdUJA{7q6{[9PpRÖҳܱ7^پA̶*YRًr1O}%OY#e,4&)PFJlUU5DbX:R;Ax6>NxY|+v{ Ii2ƚM \tEPB2osixШA ant ₗ'ɯ HϕdRjeU3LcZpi5l|$eWf;GƇմI--4qpq>-%B#Uyۨ90n:[yué^?%ı;3pv~gs6bOQ '->I>wOF䳄䚞rHIXU2e-刕_&\)ISTȪO*MH\O 7oԉ0zo5S|pUG06G˙#zu!>?G2y{Dʼn U'R1CTaVRߪp;T9dU`fDM*4.e=\L{]i0K=fVj]ꦰ><\s8?"+U`gu?RQ㖮ʁ>h%Huiao ~/j&㵕8/-͉&>VeO4}66OO8O<ƧEGQU*rD 0 "6cL=^fj!`>OxdGi kXTJ?Z8c!$"dvS2Ytۯ3 ˲▂j*/$zz0H7ۮExd_dVRJVR;սsz<.lȭK\ W>/LL<#W y]Qrq^KQ-E[ Gbƨ^C'0gE1q<9>OrL]G0K6K>a‡)䥞HH#kBq䋌#|jR}纟ܣ\>L%Oa]URI=nM#1vwar{5MS%"Ksn,М|I2H2B*a6R.Y]$Bzzjy!=~C(aH]enLJ#Iz?ϳO4ljicP,}0\(r*Z.,fcs|Ήm!zfVidk/[v&x{*3:jÙ ET[bAm`F9^=7d{oo{8s6iRw[ԯ rUQeR($8tZ ym"H7n^.\ %G;p>qW/qiW9fv*Hc; O"쏔J~,K虶pusG*\@LJ)Y}ȃr.o2@$*n/ԏ 7UP08Xĭ#S˦8M!rH%KX ? TXYa %t.ghOkFf,I}G|-SIKLҥYj;V; =CϨRR̴lT|#qU&&V@"ŏEBokoiƆ)`ʡБ6qCJ]M\n%~>\ ea:^j钅5[Wl.۞l9DْCHd*dTL@ժ+r6'㏕S#* 6}Gkb9*-fٔIumۭC$Q麷ps]׭UX0laczw{ gqK̋*+%*e58JN ̟=)b34 - Sp;n!̆ IQK6[0H0bH2RMpzx`dU-u,>^J\km8vLjI¤VEaVԉ9"ٟS($,E6"HIEVIPu ehi*@2@{6|g!zbnKX$t,3Iw &ҩ\XĜ3f$_Zp[~O2!"$NB]rՁ>=q7SR8Eů:TTf&4/Q}QjIa} /lKͰlM\R$i|j*-nn>D̢,G/[ wۡ1m/+0刣CѮ{XdyM6MBԊzyv0(E=Inm-,Wc-&oL!SuC+9̏q{n'y4`z=p Qt,j3'/*(+7(Awپjrɫ e*4VW2$E+6 I[mvGدĸNF޹ZKm*] Fj,1'_(0$iX`}:>"2!lҜJu# N7&wL/GX Q(8듔]B#n)W<4*l r RUeCr~"8n,NoM*䴴AF'+->Nk$a-FtEu,uS\#1R72jBeHس~sdVݞtR QO>Y&, [Ai,:2,sxۢ UozG2Jzh*AN58-$4cdSR k&L+GE4Ҡߵ= GM5VsheE?`q$1|qY5=Vr XQ8[Qs_%sP)dkt'ӿ}`y\^ %QњeNhBdwٻOQef m'yƩW9S"A[]Oj!J$QtJqZƶ`SF"QپOꌚF1xُ-zqʡvrX6J392~gYz]n/LXXl0rJf[UI%ޠ,?9&#5-~άMŋVQw<6ͳ:) Pj$Ӊbє6E)8+2`cyDkQA<i\>;Li)KKIɦfsIX\"QHXNLLk} :wSnOM'dEc:4aDj\ݛp/nv Nr L &%c߫6,òɘ##I hƫ w 4(5[o=}At5cc aby1زL=i:(Ѓ'pX.1d yoshimi-2.3.5.1/doc/yoshimi_user_guide/navigation/images/tuning_import.png000066400000000000000000000143331506652756400270360ustar00rootroot00000000000000PNG  IHDRKt>iCCPICC profile(}=H@_JV !Cu8*BZu0 $).kŪ "%/)=B43422˯WBef$) u_<ܟcP- V7, My8ʲJ|N:)M@69Ъٳ7onJ" S͜B5Fẇ޽{ jҼ˗/ZHqjԩB 009+]`$<ԩnC-f} /۷7%QQQ3gμmMx5'U#ڼytYudJ:u<*gKJ*F}ӷf +Ud 9MFuٳg###MHk*_j0JKɩ4:i6Hyxiyx6 :OٞZEmWHx!NTsٟ:)M#Ghڙ]/58٣/  /..N`s?*3^;vPo-oܸ7$ZQ~!C(i9/^llI&~ue O~^-BDe54ׯ󑵎G]} 6V$< ޤIrZ߿ֹmL||RmhKZZM23fHo`Fzl1cT)>>JW2(qXiCv31m5P:鶫5Hx@pqJ.NDӪtJxY(2 7FiueW:J]rA\O, #G4"SqF͞Yd35JzgN@ /턧U ΥToܴD]7߬EJ^kڕץJ3V'?b5im=>\kĮ5Qv>|+ hq=ϳa.愗X$zէcBڬY3uiוoܸqBLL Hx@v'<ҥw7>.B++3B\3x)gعQu'iSlFF=Įȶ[rކ[ $< @.A=ԛ&B4vj$`4w~uj:*TMXBo`J!I,Q[()-%uc͖ӪM3;k7}6cAcj… k[n qV$<ٻwuóbԀvKQ5u:!VR NYV3 O+Wh$<}4ƭX9e;M[ r%cc9\MFMǎlE3] o9@*N+P>%̈́N8FH4Ȯpd,@V%9ݛؿ9P y$< osYzߐi˺Hx$< G$< q䜄׼yٳHx %$$(mٲ%s|%zь\.\066x XbƍǍw\kO|X\ Ն2""HxWn]*en{Y%Jy{}] ҪU\kO o{.[NQLIx[rfddi֭[`QFUP!;ޏ?SG,YvIJJ%z~ۛ{Ç7hРL2 RkΝ_ ڵ 9= :\gjk a+VНA4{Wk$W_&Ol.h cbbLٳgMIbb) ?:tƅw͛70:::""r}y5kִhѢdɒ:u̞=/8/SجmՊ-\h%XVoRQrf2MtV+8p `S@j /Ӄݞe:uRL?e/Rӧ]>}{S3,K3[l}u4sMz+={ / /t*';CmԨ-4hirmݺUl؄ڵKKIO>ygvz7lP^zILIbOe7<=Q1־}yh9T(_;Μ9ӣG?쨨ʙf̘'I5&'O뮻Ǜr%9s?رcwi;v>'|R&L0%]t 21+>3;q[ts~[vu˟vS:t~GHûx=ՉTTvm%BSgذa)>y7j1h:>kBAJ.m wLx64x駟#h)SARRGuwM]W|MG7#'%R~k۶Um7x6oiҕ-ZT =?q̙3칧Nw_|E[\ڹsgg Oo~: zm}` f.o;𿎄7xZ"ބۼ-|y9}駊GJo)5~7|c{4^i^WZeJu:<{{}g9 /IxSL9ބ\t8פ:oR<1 ojSϐqvʝ75h\9$m۶!ѮIդ7exxjZuhlg9O>OޞrAkUhK4 k)cZj 53O%7_2y'lεuҺQZEg=k6c@sJuosLᦣUuy-a7an@jay|,> {Ε]i%D4Fm>ZԳey-=3/-Yгh?{AdB CqW^vٓEmԦzUD=E .("G6PVb -:uj&MB<&$/'6-p~"/һ㱆 g͚}ݔۑ#GqMxJW<=}g{U]Æ 5M-4OC)]ʪm֬f*EU^n8hcǎEUUۇ~zco[)Sj*6S,֫(2[#8vM5&># \gz ]zm嶰Ȓ7j16~3޹v&N?Ñ)GU >:Yu`͑)3`„? osx@HxeA$< Hx$<Hx$< e1~6|8Wd;t#& //$ .R][q3m7o$Ix &<%qGaJBݟPSҬmKլ0"p <ҰY"E/QE^IZ'߶VLBŵU^;rrZ1Nx2+wẃ/5sRUk{Hx &G_e^M&,VMW}^5A#%MZuƲepv_0V:+{SZɷr]| W^K›Ɪ+WŪ-DDg'Q7-)Quc;ΖQ`ˤ1zىۢU4%^oŵnJ"J09auF-LIb%Lt^lʺg/ݶfɷEf-j3Ky!sVV}ůҕ4iڂ Y*t.ʛoJxd` Larf|MY!)5yR]$+-@>Jx'CFOMj Ad~^[mJZDkۼ}wsgtNh)R7b--_ Oy:[qϻ_V9հ칕t9c:N/ $fm@~Q/l0;թSxOxZa' H-,]ܪ'ܚBz'yx$<wKѠӵ saĒ'9ILl5pvyEJ Ӳ)4neWZQ O 8g֒-&z A{dp?+Kxa xg'yn)ބbbIx }j,*NLX;a\NesMԧVYO4hUZu`݁;{o[5Gh#>6б=HxG#  G$< q@JxxSsdʡքy(KxgL9Ԙ'/ͦ'@<]Hx$<@ "X+࿣)9v&<$iy$<IkUjDIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/navigation/navigation.html000066400000000000000000000252361506652756400252160ustar00rootroot00000000000000 Yoshimi User Manual ~ Navigation

    Navigation, Controls, Defaults

    Navigation through Yoshimi is done with a combination of windows, menus and buttons. If in doubt simply hover the mouse pointer over these and usually a tooltip will appear with additional information. In some cases you will get additional information just hovering over certain parts of windows.

    All windows are resizable up to the screen size, and their positions and sizes will be remembered between sessions. With the exception of the Console window, they will also remain in scale, including all their contents.

    The two views below show just how accurate the rescale is. This was on a 1920 x 1080 pixel display. We've reduced the images to save space, hence the slight blurring.

    normal view expanded view

    The Console window needs to be be resizable independently horizontally and vertically because you may want to see longer lines, or alternatively you may just want to see more lines. With this in mind, the text size will not scale with the dimensions. Instead there is an entry in Settings for this. It will be saved and restored over new sessions.

    Key Shortcuts
    Some menus and buttons have one letter in their name underscored. For these, if you hold down the Alt key then hit the key carrying that letter it will perform the same action as if you had clicked on it with the mouse. Once the menu is open you can change which entry is highlighted with the up/down arrow key, and 'Return' will perform that selection. Similarly, buttons with an undescored letter will be activated with the Alt/letter combination.

    Bear in mind this is only true for the window that currently has focus, and sometimes you end up with none of Yoshimi's windows having focus.

    Controls
    All rotary controllers respond to mouse pointer drags that are an average of the vertical and horizontal movement, so you can drag from left to right, bottom to top, or even bottom left to top right.

    Using the left hand button gives quite coarse control. With the middle button the control is finer and the scroll wheel also gives quite fine control without having to move the mouse itself. For all of these, if you hold down the Ctrl key at the same time, you will get much finer control.

    The right hand button is an exception as a click on this will immediately set the control to its default value, and using the Ctrl key here will initiate a MIDI learn event.

    Sliders behave in a similar way, although there is no difference between the left hand button and the middle one. Again, most of these can be learned.

    Any check/tick box with a blue bold italic name text can be learned. These will be On if the incoming value is greater than 63, otherwise Off. The counters and spinboxes with blue bold italic text can also be learned and will give a scaled response to the incoming value.

    Menus with blue bold italic are a bit strange, as you have to first click on them to open up the menu, then click the right hand button while holding Ctrl. The incoming value will again be scaled to the numeric menu range.

    The final learnable type is any button with blue bold italic text. Some of these will take immediate effect while others are only next note.

    In many places you will see a pair of small dark blue buttons marked 'C' and 'P'. These enable you to copy the entire contents of just that section and later paste it to either a Presets file or to another identical section. For example you can copy AddSynth Global in part 1 and then paste it to any other AddSynth Global engine, such as part 4 kit item number 7 AddSynth.

    Default control settings

    Navigation Aids
    In current Yoshimi versions all sliders indicate that they are at the default position when the 'peg' has a green center, otherwise it will be red. Similarly, rotary knobs have a black pointer line when at the default, and red when moved.
    Almost all of these controls have dynamic tooltips showing you what the current setting is. Also the default settings have been very carefully thought out - especially the ones deep in the synth engines so just enabling features can produce dramatic results.

    Another enhancement is that we make a clear distinction between link buttons and action buttons.

    Link buttons are rectangular and pale green. They don't change any settings, just take you to another window where there is usually an expanded group of controls. However, if the backgound is the same colour as the button should be, the button will be grey in order to maintain contrast.

    Action buttons are rounded and pale blue. These are the ones that make immediate changes such as enabling a synth engine.

    There is a third type that is used for Close and Cancel operations. These are sharply rectangular and grey. They don't normally make changes.

    With all windows, the title bar has the Yoshimi name usually followed by the instance number if it's not the main one. Most of the windows also have additional information, such as what section/context they represent and from part level upwards you will see the current part number, instrument name and if it is a kit element the kit item number.

    The Filer

    Filer Window Favourites Window

    Yoshimi uses its own file manager, maintaining style consistency with everything else. The two views here are that of loading an Instrument patch, and the variation for setting and using 'Favourites'. The top text line on both of these views is a reminder as to exactly which file type you are dealing with.

    In the example's first view, directories are at the top of the list with an appropriate icon. A double click on these will select that directory placing it in the Path field and rebuilding the list. You can also manually edit the path field to go to a known route, and on hitting 'Return' the list will be updated.
    When saving files, you can add new directories here. You will get a popup request for confirmation, and then can save the file in the newly created one. This is also true when exporting banks, PadSynth sample sets, etc.

    The Up button takes you back along the directory tree, or you can simply edit out one or more directory names and hit 'Return'.

    After these are the files. Only files with a valid extension are shown - Yoshimi would in any case reject any others. A single click on these will place them in the Name field but will not actually load them, so you can edit this and then click on the Load button. Alternatively a double click will immediately perform the full action.

    Clicking on the Add button will copy whatever is in the path field to the favourites list, and take you to that view. This can also be reached by clicking on the Show List button.

    Note
     The Path and Name fields along with the Up and Load buttons will change depending on what type of file is being managed. See below.

    In the favourites view, the entries can be selected but are not directly editable. The currently selected path is highlighted in blue, and this one can be made the default. It will then be placed at the top of the list. Currently the maximum number of favourites is 20 - although most people only seem to set five or six.

    Selecting one of these doesn't actually set the path field as you may be simply wanting to organise the list. Clicking on the Set button will do so and return you to the main filer view. Also, a double click on one of the items will set the path and return you to the main view.

    Clicking on the Set button will always set the highlighted entry, so entering the view then immediately doing this is a quick way to set the default.

    Various filer headings

    Filer Tuning Filer Root Filer Export Filer Import

    Note
     Neither 'Path to Bank Root dirs' nor 'Bank to Import' have a name field. This is because you are directly importing or registering a path containing the respective files, not the individual files. Therefore the path 'leaf' is the name. However, when exporting a bank, you will want to give it a name.

     Each time Yoshimi is started, loading and saving external instruments will always offer the default location (as set here). At other times and with all other file types the most recently seen will be offered (unless the recently seen list is empty).
     Instruments are special. If they are accidentally overwritten, there will be no way to recreate them exactly as they were. For this reason you will also see a warning message if you take any action that could destroy edited but unsaved instruments.
    Typically:
      Instruments in parts 2 5 21 44 have been edited. Still exit?
    Or when loading a single instrument:
      Instrument in part 7 has been edited. Overwrite?

    Next (The Main Window)
    Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/pad/000077500000000000000000000000001506652756400205665ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/pad/images/000077500000000000000000000000001506652756400220335ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/pad/images/padenvelope.png000066400000000000000000003064031506652756400250510ustar00rootroot00000000000000PNG  IHDRK:sBITOIDATx}\ɲW״f]sN`œf1 % %QDTD @oǓ8T+tWDDDDDDDD󉘘$sԾp:5rOCLLLLLLL\bN7̹m.p̈J>?OKh^ڱftb.PLLխSe&Gس\4'R?B.2~pv-{vmk5t*\Jwsٰz䦺,|ƥ ץ~Y66y3GV]B jZLLECZagB_|voX{vv=ݼ,Gu= ֩viB,+=ŷ&|(cQZ*7xbqQ-(;篢, .9*dFWA2ES&B i6 MWd@!)WB߄taEUB^fVws:rRw-X>_0Ҵ'7E8yҨ~7V' M7;=53vtˡ?4mԼYcDqbL&;ЏX0th};"d@&yFnY+͜`!GV w^ֶ ԯWvm[M2|h8_۷Ywv;|ч~ <յ-5mz~<̟:Ň[[rPҽ s@ Pf& d&tZEYT [sAЕ#E`! ։|$i֤aF , ;Fa{#W]ٯF>靮h9,'˛8vU&ߐ\N:^2D6|~ BoBj]~sy40fЪES&-<\EV{Rnybܺ{G6@,2t]|6nX]y[$Sݲn>{S,?<#ɣ%}4~Wd"Dr3oMfG߶ni/)32"CT&%F8 dz>[O]4Ìu" G,:i2s%$>cNwT(=pvgL6a!({eaB!'B0aAm]oN-hͺM!Ծ6$YTThMwa!qVa%PqOGizo[X}+9UwGЮP K[a~ BoBjgƐ]PA۝Xtk{iw w-ݸN۷hX:~XY-~;LK5^AKm4;k!- AFa􏼱 [i %ݴj a@GpԬzdE9 $7qސyqʢ]S h$5ŻBmRȖؑq| -Ya2 fH8fR"mjm ⎮TcѨUg^ZH5G \< ,=(-M-Za!=ķ\m.?ׅzO0_ _ a,9B ^]<j7K&gN{ K3Yx y8OpdLy9Y+l${w`Fg8)L]*EF藻5TDYYTüQ&+2F "1og!3J.'qQa AnFB5?fvʎoE>D:E.vsFj9]ZMHgeNU 4>5׋Xt?hځɛVZI\dXh[ oaUytf}% 9Y:w^{VObj sx>}dIf"'"9N& 0~bdFu[4Vy٥ .$JЍ\u"v1 q>P9LOYRVehRbfCZ0/-o;RiB4mB곐gY`ݝ7lc˦W.1QcK]kK)qT)p)8|v 3!fkdiC䟞ܲu 1ש[VYm W0kD߳B..y&Ӑ3"_.;Ff,'"2cWlq0Lu%<3#P-#P].fqlvongLQX:^F46Ӣhڄ"( NN?4,RTcK]kK)B\ݖXkF8O_~Q`E7j0)~3:=6ɻ#M$R"s;bP͒Zׅ>!Klz(+*ڪ_( S \Z'q? = :?4%ӐVscMUAϝ]"-Gܾ8Hacs+<Xc"' "2"-zT6?٠V,kKp"q< gF^d"ve𦅝n7ӆ09Chg2LiB4mBsMs(n-h XtkM{i=v 喽'K2vܲsi=A\jyf+XQK qxĥVgb#jFES$JX`OKZĥmfrFunom@K5 \nA xQLbbbbbbbX^f=L\rz:5%&&&&&&&.,.DDDDDDDD88_M<:QY"p)P所 Q9.4Z-Cp.\p!aMFK ".DDDD\p!"""B@3gJ 'vҥ6,, :|§mժU[n7n@ڵRʷ~۳gM6p!""".pQiӦĖP mѶmjժ}wPӧO~:{b Cdp)\*WK:qoٲEx:f̘zرӧ>DK. ,5jFX[[C=7 nݺ)cb=RV(T\ \|ڵHA\bŃp!"""bye$BDDTށbj}# P~#""-S LTTA;xFC`aDp) "ZwUċ<-m۶ Knl Z` $"a]P5!PpV4fř82dH㩉 `ڵkxx¢1vލW`&bTk ;wEͩ"HTC0o~_X[רTTA;2%".2ES8TdC "j-nP.pP8xEN͐ʕ+Ev.b`( ιE E#p)R\4܍.Ap vW-n8n:X[]v Zb֑xˡeT {O&X )xKh]b/rD@]\@,3WxeŻZa pQ \4":)9u|\dte5i$ Ugp(ˆ|ʪӑ:Z\ b(6 i2a +\c: ˂UEp*+bk$Dx 1N&{GUg $ g a~pV(`"+j"/[8;m@(؄N pQ5UVljLE,灒 3fǗ @+>.4%@=# ȑ/7ځ>b,)NG*P֫KUxi+Yj<=̚59ʬTSB0'`Q~;"dqQ>0^d9RF?~C6'5 o Tj"/[Eꔑ UE})p)R\jU=e`P` T;xo۷bb0mTfMeJ]Pio@R uխlȧ:UJ! IO;pCth.\p!B Q9.0ZIojLKi1\$aQEz?_.DDDD\J!BD n"""\޽}K\K9.ԉ OS \8вeT4"""""""CE$"""""""CE """"""*9DiNX@B ""Ҕm1p!GDDl=""".DDDٿ`.DDD111BBǏ{ǟ7bbbb؅ Q.p!""*e(bbbb\J:p z+bbbb.\Jpan. t0M ?+: *o,|B`?KKئOh+$&v=Z5j|o/š+Wid }2[xݵkYNT%p!""*h9 )rjLWXuQvX5k޹UjР:,-O{']qx~w^;i| ~IU]Yǎ5aOoU,Ypss^Q6mdF;v?233Sx˨z ?ڵS'qIG[vqq BD5kRۤ .&` \!c"^cDz8)ch1!uPΨQ@LDZjuҸq.zboUa5kdcƌQ'z߿ 6l@5BKef#4ukk\4hB1̘Qz6 LNn]p e> Y NMUhq\ QI.2pD}"@ 6LcccTyQp!RBiOb׎-hѐٳ9㪉 2J 9\&-[Ⱉ/;j QI899Nƍaaa| n}||Fp)lC뇦A˖3a paJU7(.ǥP#Fل2]Ǽ@,.4UDL>]EEU\ޞ AUYSXt-1p5QµB \析a `\vb`}Hq!BDSEE&޸q/ӧϵkרFp)QQΞ xݰq.]z #DXƗNj\o2bSTg|B_\! 9q,2F)vDsrB_.Q_녞G|#hE,NfW@4qE!.s6Od8`ͅ @oUtt~X\. [q3}|4j[3q%^µ^K`b2_98ٻLA!0Lr.nս;;1 w1Bkz xbGz:B4D+wxO]]!BDDDE{ƆU.a]GM6| 12OzsNwk çۏL!C>N+ts3phHcWD.(E3_%TKPo`u\ fp=Zv놵Bf \r: /qTOO P =-ټ%7<@yBH__dm X)n .DDD\apt"Og:?^O}2>5#>E|gNHH}˷*|s۟|p„asF%8>\U"y좯Dq_3Frxe4cVa]vM; l'>.+Yӟ%eހĤ۴gyy^͇_p)e;#%FH.ݤ:#.DDD`?1S3n Mn>%12qWB7S!a6Sci̛Ne$eYr_-x6& 5ޛc0g Pu]GNcdJdr8Q\=pA8khƢeBB] $.+.\R &4x=*{15'WoOGuv 9x&BDDDE3v-fdt`L[t I7 1L[nynxWrSfxY" ]SSkz {Xzp%.z)!DNع-bk ]=(2`jgLEDP˛&?A$.Dh%u?SuVޛLH,БrKݸ m`.DDD `!nK~k ]["fzo 8I9 q6Ǚϳ_={rGEF}kpQK޸l+D_rqN\ Mvq.K)s!L%?zi^DZ-~6P벜B.<&d^bI|̵=zE9;9; k9|T/: O`O6tӼVCe< ӤkB!)WnL<ޣ̴Ǚ^8oV"f-ZIK;ވ 4Dz.Q(*W(A+H @Dln+6k!Wk C-0$IA 4~ &$ٴ2ҟ@b{ݸUy!BDDD֛!<~}n2X7uPfӟJ\i/? O_{gwҞ̝@D]{IJ ;^ڕ(sNyiϡymV):Vn*>RaUa{%( XP4␔ y٥dx2[R"ydXR%}|R-+WWW+$&GNkQ"z y;y%i #HER*h]*uDuk. BKVIN+v,S7Xw=\ 3M1Bq6 4]83nlrlA9? 㬧u藡ϲZS'o)D N010coa|y$;GW\$%]J$p (ȉWK_DQGIydD"7CyO<{RkYW^$$?MJ0A(pw^\cZ\읝WxInBl~o yhc)Nby.\v)&l2sh[<T &\OqgS̔ |\Un).L2݆6ƞ2_18F狞fpt蝡禇f̿r-#.GCr<JbŸ~2ެz.,YPJg:Zeb)~k6N QBs$Q\( [\l|ةLYo8r@-nyy.^wi_Ar >ds."  w.Z/ӶF. .]z_IZhw` [v퐫TMJEZώyv[`f=s6zef#'3r {SkN#:ttЈB]q\lb儥NF\ikmJJd`NXa v.\ac:. \0g SeDs@PqkiN ݲ1"5@^}o2\ޚo -f|2:R͹AXstve?Hy'[Κ&0ݖ=5zWb*w?q/~CY#mx=hgc6>.Ds7tFvZϲرӞy p T/2sK 8vaFd>.qޑvX}*.z.bo_f PTo*T J.:SYL ͝hZ33?=Yǎ^u+2YZe nwb222}dH3+.gŷ;p;K^ᐈΚOBNaWlz+| A<4:+G#/hs^bv3r1Jcn6Q\Ă6N0mtr;L %-M`kdcr%~EgcoAh[v|ir\kCH߉1#VV01ͪg LӨɮ^;z.k|5&Wr4by"lRR5F(r)!q6*`vrL(<` OYc SC M31nC>ג@tEi3dtߵk>8RT"ÜU4"_'L/EPȩH_-mwݲ(C\b-lN#Kr:"$wbo>}1hdg>jC廎Ŀ/M 3Ά` BbGQ\TT&'YGsp4m $aa܌OΈUĔɒΝ9s҄_SmAAA4'*Po݇^U>>hJ0>W%C?q.YR%%|nǔHDa>Ϳu6Ca v@81!93p6L/ TrI1]Mzt%>Ak6nmlm=xgb._?q3EĄc8l! f[zWoN~US\TTLEN]Dz^YvX֭bd f={7XdbeLp)w%0)i)M0|q}~ǎ~ƀ)`!Ǹqqg9CURB*jEQl;w TK?/XZJw"DWKQ2} %!r5;1 SPK,q1E_|ة;(D^dv?"= ܡz.)2"ӊ!,.ʾN^etۣ/~?_nzK#.T맿_;mL'b؉^^7O:Ͳ315=}6'chn?gJ?3D,`E(7WV{$2p۾6k]p,-4Ifږ|ń_'vlW+נi]ɖ޾رC9"qjϯg 4"a BjEBhaТ\Kd-r- 5pyp!"cQ?\H<~،~?$..Aw򛕱u36b;{_{ P3),nF1pDCGQlhJEhz''Ŀ5(DE.}ر8cr]r+IT~@h!:97}:!q /L%(Rg|"|1KwuqUn!WZ-SXHY"`pQʮ };-$1t1GNlOwlz> 90wP̘oZmM[#yPZJd(5(LE;νbx3 K)J.K}(46Bӗ`haB ERO.Ň\|֫Wjժ-[477{~a&oootTT_U_7mTfǏ h\׳gϊ+r^ Vi\d{M6lg{ R|3#bO]~4 <Z b$h(+Q!f|wH+%2p\&C9Q)k8LLsrrrq}! ǀ0Bdg e𹸤+7P <?&!ԅYv:/xmOCJpС4h֭Gչsg<` pmvwѻ!Vm ,%b.rrEO.V^^ؿX2}Z&pc1Hsފϔ3=Pm{}4%iaaDeD.er ʫ̎͗doș ;.Ç/r{! elh٨c͜3oKZ/j5{12G O*)AK\;l~[v,;Ol޵jzy"*wߩ{;v(LLy3@f/^K,aH.~KXX2`8ʣE!)Qt2xtlԆ-LpS&"Y|~~UQI.8S_vei/F{5((bS:Xkj/wUNήTl-[UUcǎVZAΛ7Op:ds vq-W+p{}H~}P810LE/ ˘F}\JpQ8JSbz1 \jUͮX6 eeȑH4ْ_"#Z\ Z=4κ- fy"""[L@N0/^w0p#{GGe/_}6+YYYpy1s "?ӦM}=ݰ!ҵseҦW/G8 aҲe50lBә3ٵe-@-޲.i[z 5:#FZGr۰A5D.zÚ5kdСXJy3{ DžL,d-yϜ9ÐM.,>r䈵u;.]:22Rˡqh0FGG%cTeP'- f.D$\Tp-ٙ nH֩39yM>u!>*mĖȘV7:[jY\oR x֭[cQMԩCW^e0>1,69sԨQ[z\9ZTE NC*UG^EGpeZW0nq8|xy.;8ۭ\]͜ibf6``6ƤBcߵkI5P!Ü՚qCD;\&Մ89g-0!9+ʕkX(Eغ8ZelkgƅU#D06\mTM\U7uNբtXk ι\K#\TK} ص|O@\ $"A:5oby& ]>pj]/!BldRɺg -"uNLLg}fl0jq͛[7$-t{Dfe4jݚyV]1F,K?z_dp [UrLTg "C\>܍zm/u \p sM۷0e %#ӧv P6m x[&}|aV \7n#\ &ɰի;JM 8by% hׯlX>/0PFL/Ywe9ZUyժ7`Gֽzẓi ׻YNfÄUD䁋̔NpvS'l5i-`b57ozh.$nͻtlWu5ivIYy*]P8]XV9[,Q 111fMv9=aVP`q~0'.mn}k.^d.O\)aspm WeShqQxPR즌S!;wHKأQ||6=!jԭ\,szz96]a~mۄ[X\doٲX 0к] \}s@FHZtlL9AC3z5Q54vvy!|鸀R,:_ >pKfR@Ik٢EL> $=.0,0P#-l ;qv p;(K]da^ .`۸Lj8xCʾEp)UE7ka#P#<[i#Dkosh5 szp6KV .m٠E pL܆+ϩv`,qI!Rc>X׸q2GBL2eJJ"@?q{tVh#Qe-n.'Ne }{Slp'p qc F%H7;d!5k`U W7TԯKI\wҠ K ۯEMP:޷DQ~DQZ[[t41a!EZ\a`O1>pB^dA}H/c3e)V,[*E>.᥋9>3g-my.Aqq#))Tb'Dzd<.bb|BC?:S6\#%U5@彝MAKz U;~=FX[KZ"9>pb|G :bĉ݇h1,{pG9݇|>tĤIP!z?KA0e~%CAa6TDa<(NgX,;շDQZ 10@jt3#DЀ5N{ܲnͅ kPupWVFFiЩ >'\`,|Ed$l|0`F|JԬ_9)r \B0E{JܴCCq-:Nx@% ̱Nb=yo'Ec!, O (CR@jqqVՇ` [1rT VkNtׯG+~£Vvz "P$siK:+^]A~CZ{#̓L64" [#BTP?w5(Pݨ:;Uˀ.и8xAbR ^pټ9Pd-XY=(M pQfEwhx[~\ia 7߂f*|qwGT%wCx^_qjĿ~Ѝ?\xSPZUƓL{q6&= F!#V1vSأS# IW}_EtmOL\\`|XO@!ϟW%&ns hF~~gϖ:Bo'1pQ04)OaE05əy`e#񎎆\CԻO殁b|YPSY?dP0gC% b̓F~p ZEOylZE>E>-7ZKdXK ݏ\-bZ o(vݰ\zE0汍 ]u${w}1S+6S };9?y`\؉xpy`ow f|$,]MqL #Nfpulȫ=u!.(hYl>׷zʁzT2 [/pC|$4I0l^6 k6 ="3i!NfC^Yj!̓UYpm)Qt1NbKw+  t%( Jq11a(vZ"H /c4ARzt 9yfZ`Bv=y3sj_=o?~oo?Ys`6#o#s*<&i_]4ʃ =]6dTśq|-mE|Sh`FȃQ w0?A9QCm@|Jۍ+58>}jU.{5o>|bZߟI~">EBj(ivaở cV^xʥlɎ251ɃQ Y'߿'&&&FoP L&Xߗ;vUE/нb~uzd/E'W膊X a,]ԌĴ̛_2*p4 ]v= A"qDU+nAlPQ,6!2Al$(7B6 :V#VaGWyV77ox_[/$_Q`u߈(w6yQE Ӱukvw{w)l+̝: 1~eJI !OLD'ϳ_=|3}L0,4tXƕ-nS_yheF#UAȆX+4Es0jDVa5s6={SZυ<`2[2S9&~d$A*}^lLlw+M|e 'GNd֋(\E򨅀u/n'v6`Kț3VҞ?ϿB¸N{,) h~t"ዻ]ɍ2vңޛXb<<bl<`3}OlL6t=gMai\UzQ asV?pw~d n.lP[PoLuzx0af#q $0EL9,)G c_]$^wG&/.7kϷy5s֓-d3 XCl<ֈڭbر.w?ף(겖N]L/0pIitX@E[ؠf'bSgXJ ~ B9A%)I׸#^I1NHyxA[%<;bk49y6bSr!CTܓ3>|<|^(,hl|8˳ Uj!q&ZB x!qIǥrO_{>:t(cIvsڧԾɝ /B`KWד&N^8gnႅv]ݖ^{?ı7.]Owk '!|NaX->r_<80R˙Ryo0[2yTۦFyQRİUVQ ɳu/FS%.!.K7D\ӧeA3g">eLPy?NC$0epf2A#pOi @pnFA=}߼(!Ub!o  z K`^}y/'pm_@ZX(tĶśyX|U E EA;~so*ισ 4_,Νڍ}œzLsX=؆Wh殁Œ!)ƣg/a!?3@(<٨=?X;[EW&x-,7 u73(3ӳNFj4www ZKt1:ҰU+<=y"\7hBl&9i:kQX"ˎC*UeذS 9f l*^"\f)Up/Jg„TゅK&M$WW.1:4mxqv{y֪UbKtu.qۭ =4hPbr:Ùnjo#Vg` Q%1va/| z8@{v,3:-s<_ϹDdKl|vzFʃ|kGÉx o#sUbX2@ 0bRv&"t25upwp`d*xGu!(v{|.2PELSG(À rG|߬Y.]{ O͝ >wk@7y ϵO-zbʓD6eo+zpǜpԅ'/\qzȃpŒ qdlMyZ8ug:vbKLbM$OcEAi**vwT콠((R{|?0 ˲, 0{̙{{)%̳RsUJD}*P4r\ p 0ƃщE?G:?n>A=m>X p* 1'чMDB>1.` νz Y{.\kѪ7"9 w>xtܭ1gR}_z[A-և<NYNETС_ѡCOc!뢫tG$)))CmݺԩS-,,ի]zwmڴY`_%GP0^g2\IT9_0I( x x!|VwhX ^ya%'m/.IevJAT0qqI ryx+`S[y5`(pi) x S'7@?a_85!^^| ـ39bu+_3 'zE*"w|9'%~bfkZmDZYeܷ ? ,ym#pI{_Λ'O~͑":F.]|SΟ?/|DW^l \~ά:%.m۶544lժ1H \ m(7g.=n51b#/d(! wFB1\~DjڸPV[syEYP.UODg|'l +xخH(pit(4y˖!aI@ lpE66F AKN"& &e |ң9s5vvYK\?|F~50_#鷿n|oc9u&yZ\boQR%.C6m#(4aB,18O0Aܸq+W2Qx}H.#5f돐AbҢE!ǨwHlp\fTJ5wH @+䳁%qYP Wo^vmpXI/pl)fa ox86y*Ic5HJ|+X{Ho&.X>p6OXl> 6`]Z}\ #lj>.È)S`MiqC ?i*;vA h5#>׏1B^r}# +>|\8l]cր#GtO ]e۠AjrPXT[E.\`^`]]r0p)--EϞ=pq@- 67Ǜ^;&Ǩ|]`c/b"_LU^xR8%ᜣnojyDU<\byV8UlToRy?#* -=e/+ \323-Z ܵ & hzDQpAP=ɑgg8OCe.Un{]/x!?hЉMโx(k8ĂtlQ]\Cq!-lٲ^gㅁ qٻwoɝs 9x6vwepL&N.!a~qWwM`n^Zt$#݀a DjcC`B.Y&X^mHI\W pپ}{F5¡}\3qDr\ h>bz';$BII\ՅKWPW J(E)P%Y>.?8[%lRhN¡-}f+޽{wfæQ"2d*Z̺iYG h$-Hصjw]q[vΘ -"- ^7Yx.̜% *XJQE2rE9l l.]>lT!s.O\Ѹ/kZ h›mH9dի̪E.()9ι4+:| \`5>+:{i$-WReܹӦMۿ!P7okÒ5Vpa_9T?mھCT*, \(QjL_ZEDwiiJQ-H4tt_*IJɊJ(p \`5yVA0B}[#mRTAұFF(MGNY GzHKx*Z[(G}k/_8eյTAz޽QFΫ\3reGPMǎL=G\A>AXC "_EpJbVᅬKUA5Gp?֛ Ik6hքczUڳPɤ$kJ 7 ꉢVr XfHy(, F U·cP9EUrCʸeF5kGD ]v)3ƀW^ĎZoӬv\#u|j K m !D`ő'#VLoǍCAr1޴| kv/䆂#}uq=s&)A/N\⋁QR`"")!ecLvvOO۷Qڮ(>UƂ7*̏.. L,=}W_qr6j v1WHѪuZO.dx`/n\'Yk55hh QP"MYД3f~Ьys<ݾL8{%KVp |wZ'Kww҇as6JhN$HD -| Lp1~E+."\oV^0paRBm%i}NT Lfg]pa8ڴiX"}bq*uqa=5vD2,qPªm.,,``n?ZO^p."T(~cƌ=[6o7WGN'!,\DnZkaRBmwT5Z, pp]S-H<%.š_7>E 51XBJcFKjDY[kL8m\D2-6l@g|\@(Д٨"8Bó& lu9?w)\(޽X@۷X$l '%|JȀWQ\A.&#lpi/\} 0gRBm((,0n ;_S7oƌA۶#MLWS;Yeh ,\jb'iYΏ*"dv`ok-z pr|;'Ҳ% 25Wxlo?hX9˗ |!PxKIpBr -ܫ~Ϥ6(RixE :}|&bL \z 4S-%rF) . -#Wt֤mJO:L \h.msrEۥWC!!(_Ʌ.ZtiC JMÄ@ mQ"3p%%(Q„@ XkϞQD.TF"k,7o(QD hT X~F%J LP%G}.B%X\ITYq8XD%J L ^jT%vي%JȜ@!]SBё%J0oPH-(Li[fيD. Sѥ.)C"%J@,43PCJS."(Q<. B8)  \D%L4*K1Pt |\0UQDqzњX0` @(۬庛7 "SOR#*/NZ$GXHn}n+~[} 1p`~||o"wt]9Ce6LZOR#B23J5k}\0!p6hk,MQE4 T>o%du9C{߾/=}ZXp:C29p̔\$=ťəXeDQkJ4Ph}_5kݾC&Lu۶}559Aeuk.]:v*ulعg?Pmdz!iÍhZ g~?~zɉuu6ccɿj KPPD ,J(Da .4Dq= A.WԱ#̙jV,DFrjѪ ='Ju]Wg< gۇ=' g},&BvoǍ{wliy6wU.XbEB/-QB MJg.[ENνz/ |g;vp]2>:9NQ$al/F @Q8z,/}Xe˘3>ٯ-x%.O_׃'J \>XЫܹPB m*](pi[Ex&@o"[5. ˗򯱋3SkגmyK:8V"F#^^|DBapw=?? ,ym=/w'?HKn=D.PB.`%N-.pݽVXIon.._ ?`HB~6I,.ml_apiko{+{#A3i-7HmqBqd8*pټy*6TP҈ V vp$FG82D_ ӁV98H\8KwlDqn2dK|pXq>l׎q3l.FDu+ \ 3q"8(pҥ[>A hR ׯwٓY~󈽽5q?aߪDž1{\J] \FDwpeܹcƎ9l0EGp90v߿qsqƣBql%z%* UcCED@jbzmzjtt@UV⠝_=p@vM$|eu kikğA0l<(z?<\3>tajëBmct. A6B 7dB]}? >xŇݷo0M1|+{U`MnE/F6]kBN1}M+X/px6i .0 UeQ Rlhx^ _7wɓE*l Q˨QG/,},PaI#p°RHkBz.ۮ`QT3|٨A{<(`R((pQVmF' lg`6Ӟ;kp=LD,K٠RÛ9`Q {e'* ӣQԄqW Ovԙ4 h+NyhZ :lDiettu87c g).G2 ˞,ӗXzknټYhw './mw<~YS !9 FTjAF~x/6na$%*% 5ǃt/ 6L+ߗt+ (YQpD7&ΚER1ٓfF .F< }1"% q휞^rzgBH/I`&gsI.)*{ViA铰8({`ĸ2anAT5=O ƵCbnXu"l<<+.߰iA4lϪ#/WF=pdIDz Oyc޸ yc1l<~ܟH`/ !qOΞWSS[lĔG` cqժo$ӧ(pŜKJ(QD .~հ3be !rS?b \m(M/":]䬂L ej@YP[6"^wCQ)<ńЏHKbTljnbz^BZV]| USEQh!'aQTC(Ngl?[E!o/H9>QI;K" )SxxµbJ`1M1+BT85֍g(QD Afr42u7" a/o޾K\ƙ#S!>(!t{J1>hƘ%r"rScN_(+Ÿtnd"qb `ݸt/V/⢸tRv1ldpl@+츔XP=򩨖(XGwE@N32>-<.u՜1E (PFl|ZX2&<Qpp' uݷm;vz"BJ&NQIYr#7.Pa9ysnxa2 m9 Yk0Z.Xc%J(0! \l&2N˭LeuC^n`Uu_tnڽޑTVC$V*HF=eŦF'/5f*ki)<{_=x6rqEBx5`5Qi CH>9!. p!$*i><(Z;-R鄇0$lC.bkI&qQy= ^&('NMPdb@x@ aTHct+D1lXM`T5.mM" ظz Z~C_*(pI,(@L*UTn 5φ-ι:EA;938҄K\\ ,D%P ـ #ޕOaQpG-{ ɻD놂r$9k pɜŬbtvVzT9= 5_U! J7B f+J(Q"sl~'`RedjF.VaQx>S<_7=2 fա!0%S6; rqH.<{S3/2<0cgCcٟ0`2xXp1 Ef} 6pN_Xƒ|\NV (khh6"b" F9+Ihl:!M>35$1ɋ2s ™xW_ox%ωq5ߚYs!:(,EEDQj6\) l c%,we䕚ʆ!Kf))ŲE^ZW3/;!`Ŧakxy }CU.(QD8ɞ9%LH >LKKr53jb dQR7T6pvR`?Ͼq!tQk%I0HR#,c{>\ׅKجT\rD&wW)Q|eERDcc'Q RΤI9±],p3kZJC:=pA[^g.^p!%Wp!D6kk͛}Icl flX%m{ Hr:*?zPN.NtRFX|ֵpAJ?bXbr4`s|t< ISҏ-|K$|44.=,96JaS@XE4 o=VpqoUS9QEL_xQpl "EQP)l0@Iƒ\`dIΙťUY%QY3y;`/ s@Wxi.8B W+a؇~};WaGnƂ1p`~||ڧϷv@-33|QTS|e"+Wȿ̎bРV[hժs^6@DyxY&-& &Wn i<1iR /HbiXז=Fm#0h)WnyA7_W&˗44: gV9_0IHn M!a>8g}.=i{yu KҨ(:6uQT=WIlRبJ䁟ثB*9eaJŤϘ5D0#TV Xz?b2*2.H(iեK0vb9L??RBdB|QsLɿԂAðXdq7Ti ;#wloN40򪭍 ăJ[-?1,v*^tGeF(tƷ`OJ`p0?s.1@-3gÌ(W/ḓ;s.sKCrΥH}T X+H.]N&%feաsmoڴ%h?pD>:1\W_nFxl0p}8O^PXb3A u25ݾC&L$C*"pPhhq*E]ԀK}OPҟƬ9@7/;]'YBc '`!1?bko?1^W=v6a 7bnmzl8Dwe9g;$f8]2͔.U(ᴾHbzG;_K e]p.2d4=?p@Q8X__"Gw1`С8Ɔpr $;c׮82 \>AX oLcߺdF M`jBIX 6mpLӶW܏ ;#X71.Eb=H|]`7bHx6:X"1p_p``9G7aLb2&R5Q a EQbCxVԁ֜{-.%SpcmuMI5C7tgȝ?30`:A=m>X p* 1'чMDB>1.` A]ڳG*5ݻ>GEѳf) 9ͯۂ*o>\r?_zDɁF$ U!Cܺ%p1q#3!ofR;p޴"%Q9h3vN݀i}Gbb Lve8= 뀵FuU`cIe/bDF.AL66 O^AM`n^zt$#0>ZŐQ-t#/ >y?x6Dq3GY<.XPX=|Y{'(ey KHG&]vipl]@ VnF61T:?.Da [ٜ@?ov>x>=П"_/d;'"8C62zLn݊jjLs9wC"r04T2B)eܷ? ,ym=/w'?H9cMc{ ĖHSSrֲIVs@[T__u^4;쎽X  gD yE$D%!U; d7l RGYQ|it _Ⱥ>Lᎋ.PB`ВѠ qd_@>6LÍzz8Xqd^B68[VK[˨~(V6FZgZn{8*w sk[>>yZH ްX`an>~R\Ä8|Mt| nnnܶ[[GW#K٩ |FQa[:]q'ܥGO_\edPbBP:/^``9K",36.Tߵ@w`L,~8@['HTMj'خ]>.b n{ lj>.:f<8Đ !XcU*,լOM3` 'ᆆJ*2r$(ۮX}\8l]cpz.p33{68ދn@] t{z* 06yoo Мm`ϝyGNoھwyzo yӦ˗KE6\WeT*Ȇy@5>N5rDZg xeFƦ'>J |Fc _]~q2Į&@N={#ϝÑ5XOGѭwo+@$1tD@ _U$p<}=$d[E! b8g.,\].[6\("C)&!l e;/H+GS K6'*͆ry@^ݕNXL;#pg9ʚJ7ι4D2: y\d.RO|\P{>p!t,* ZZN63)7A#8c=7zԘJgHRs)QD .("PD:P\\ *HHC5$, )Cnp뇂z&[RB C#4YkPL\ys%* 9Id'uɐ9 ٛkDh" 4DWnĺ+W>A\]BH\PELB%|Ghk;$JF ǎ)Hʼn܁ ;Qȷ)HL= (ޖbT׭JFk_vʒF5IWi֑TJ(4U.G#" 3v,I8'#|16b ]36Af+QQPj 2U&Vx.#_LC(k@ _CX"3B#p hۨ;N@T&QQm?W-GmtuBfUmﯘ'Ru P}t'?ٗ_#KP6 N@q_QiGT0Ό;0䆬pedP<p *uE)Ribbd ?17h֐Q}n*ǎJ,HhyMŷZc(314\Q/A4U|r$E)E4T(3+$LDomv1-"hQ$E)~HZ2)&pA$iCQP,-lm?M5ݫTT^2Q[)z*+xR^XywJZ,Ϫo\Mz:xu,׷U:x&\Ky'-CO܀D!Һ+WFDxxw}k#Gj.[n"%NMc׮uusp/}\&\)E+rLIZ@@J3@@VC7 斯w`gD@+g9JbILN[\%k TYbWZD1`ԶN17.ܸBu/Fur&LLݼ;|H@Pu`7) R7h[:$-  k*$LXmekXyzdn2ŬmQ7m- 'XcF>soQN \X[D!!3* a6 B#kB "ǔDh*\PɧZyDUwv[-=[,oy +,{#83xN-6\(K&CjÇ ^MM5k׻ܸ[]o_c;'R=[5?Tv1VQ /x-*KTlHΑ>6w;B"> ~ZP1m~%.ljE8ӵoVz-T>d2! LL=bDJ+rO?%j,2ꨭ%/ j[Խo_R۲4Ѕ((X2Sօ0ꛇZ+v}ssV}=|8@Ȼf0W.X!2f9C1k*lj@atO64~wvIߎbA-a5Jㅥ*,)?tNV+c$*QrJ% EEQuKa4ʊ9+6XpN| x[P27),p:495#CKQrE O*.s"4lfW By`s^ur Ǝ "N02W $簥`QHLIC;2qV\W@H8gvZeʙM.˜14t!7`Ze@T1kQZТnk|Տ_~>:ӗo=yq݈#,$tz3ȼ r <ŏ+}Bɋ69-{ X߅EםpыBu]Bಐ]*1?'$*oAe,.8ؠ,.<fڱS6{Xa9b&;AaʅAJ;JSSDfe\P r^wbDGW7 8SO{Y8&08.xq$g=} CvɜJg3.۶x٫ GBs@Ԃ2w%_ml)0xSSIk(C\eۚ(X%.X*a RlDƥ."-Ĥla:+>./[u6Q)Y%yaźAPX*Yǃ̅A*B% \\ 7LmFk==,΄_F M KP{<4>'9YᣧO¢xk FBIyxH⡂ t2y6mм* & \(B9\ Mhc] <{H.N+-pɂ±ŏ*9.ml`(3~I#dd I %J?p Pl-DDôHBˈdP~%E$'1 r ˲ Jz lL1C\ޞQc77ۚI+9Cdr~dJ%8NO/)|_U0clUJ#cƌ`iDa#B_6M<^-.4b>bCmSBF\jls&7w$ƽ`wSPdbTJ>v"y16&ܼrrsӲ ?)Zs2Y$pAEN'i\2|b8IatvbRsR cF 1q9Qqk.k7l!L!!Tw?H"UT%n(QԘҀ Cmug^00+{hANGƦƥeTPljAŪɓ3ϰ }U?a"_SN]&G -¨jx`.QL$l@$FaǦ&%lyl(,s$DvN..6Z2xHo袠E)QEw쀋4˂m #\5K~?RCѶ99(QԂ A9hd$ Pe658ssBGg%d'd$VRΩ@-g4,u@\QxDE@$%$ \X,&:J56dǥd$g DObx#Z$;';0P p#p%%(QD.(e Tu;V#IJ8C?9UiVG&甦<eҼDYndG%eD%$kה*S܈E]vA YEOɪj(cCr6@TK` :|Ll0:>>32>-<.uREmQx874pQrZq̼ǎ]ylv޽;y<qNd!w4bLn(yjn +?Y7=D%L.sl_D/&*$X PPzFAE0< eX#M|_̵=M縸"!<P@ M'j>Sgpƒ ӚE6 :ͬK&{mxGP %JUpA&cosjF.a}8] ,zf_uEy(KN,􉦄 rq7/<{͓;A[[|M;L b`xHțpђ ʞ.G@C9MYWTd'^ ädRpkrXB}^A6Z8Brd#i08 f3w:PC㎺Z N:Bv᎚p1OI()hذgNr|-3ĜښYCœg|OSk*S FBMyP 9N$K}EAGcf͞éj76@C-4{w:P-xŊD7eQxR\a M1f )!3".uƬ9(-<8U؜F,.{JrqDtAJd q`xzڲG%᎐w3"zρ#2Qq'%JV˕{V]:G%3)`?Jʃhk "㳗? `Z)єZ{P.s/5yyk-3DD43g1f20mGl<3fW8q&_ѶqEVMY\I9;`@{zk0 %~5ÅBb3soQd|e:j82b !RaFb3 l\7]"P!IsK[4v,e;:qDz DQDJ(RZ.a.|I --mOHExvo%|dzX35l X?Tk,qvR ?4>݇PnGihԚ.v/44BIzdy3YBZ Ul:@A {u+])P\Pd{"[BÚ(@O/0[*W;&e ;y1~Bc`rQ]h$_i26-f&- |Xl gjHZrTUEKGMlYA%J LʬUM"RN.NtRFX|&w7=5I/`ic](7oy@=LeA##V;3>4.̍M&h w(?Jzt$,HD)D,צ, ~p_@HQq(x̹98a,`f + e1QKKl-kBE.ϯ"0΁1AQ,grx=yGx^gle&\ォ%J@EWաIIdmџ0!<&9"> Y29vJ*Y@[{1?Lr jmmjmL/iѣ>r}`>0:{ǥ@16A>"'`|ar#%CD)@HpYS0G&[c0 >tBKWKSw:Fw㗰lN0 tOݕB3@h;}N_t,5B&JL6k;כּySOIBEGh( Aiq˘Vg<QXR7#Ȃ(,ai@6x ͼrjk7 -zFMdqM KðXd Fa * UϨ;#wloN40󢭍 VaV4eQp>.6ghwJr /ŵ԰-XJ2FܼanȱR\\h͍Pp #Jf\“ܽn*V|\O ;°0ײQ.0}}~NbYߌ.[==ڧrwK/ jպuV:ea(,wֆIKqB\@Ӧ1Ø#FwNƤGTx0dhkbS|dM/iZU7a sv_f Ys)_Cba*N:, X>@Ih\gE۶g-pɓy h8؆4YQ̮*2 )#/: AplUp 7l*áTL 眻hɲB9cpH5">8!K`Si@:>:f9RYWqj㱱> QǎXc\T Upi_}-!{!eE=p@B~nBpL={O@#jޤV: ;8BC_(Xݾ$.'4 3Ҿ~&$>'4>`:hqocq=m{){~e3~ǝ;fdob"_LR"WPL@tZE+[" >&V5e;FD=m@[O <~8# K ODak%mvML8Ȉl&=nB*S<\0~H|u_6wuG;sCINtpá)bP)" `|[5k8_!&RҺm۾!2ٺC.v ?q\wrd#Iښr+0M0)#"3QoN7z;{~D>c#S4YSLve8= M뀵FuU`cI^ 561ur Ɇ&#+׽r͋3-ud`$0k_bt!o-j@~Xd%ϛQIkzD%gc yl 檻Ts 2!Attt6>p6n=xZ/C:p>uƻ y?#&]:ct \ ׭Ӝ9s4:}-f`J˗{o>o=.|ܽ{@x1իj_Kk̜9+`uGH3 x  ¶ ='J\YlcC`ʁL!XC) \˻5777\IT15we5uni$ X88=}bF|K@Sbd/,6:; Nw!a2ā6vW.]1B]]JjE;u&%u(P֎=S:|޷E&DxƤc 8q{p\w$pT5w.9!t0C% <rΝ{(pikbVѢ'^Y{pߚcTܽ!`q=kV.cΤd~_ǃ[<+۫_zDɁ˿548"|Xz-o8wa ! &t!5wo&Kd5=ts:_ǘYWg&5ȟjw]q[vΘ .- N)EEuh ;z"UÓr#s}]mߍY8'A>!q ٌ `1Ůc.qu-]BW>E4P3#FL۾DBBNW r2Z%N>СС>Jۧn Mjzqߪjv X\&XX42zPxa? DJ \Ҟ`s܁˜1`91}z޽[yzvg$^0MZ ϥy˖ 06|oo ]k6[x[TBKTh Tq8wwqwoo~ٓ nvݤ 9s}fggyis-rZz$ Nvs\3q=VӲy&Bem(1 5ծV-b]r9iHk^?x)nު%╛gS)j([&BgX+ls3-؉K!__ [zZLdD_Z~ue3NNkRO/\ ZP6.X\0I+q){7oV ]6J%THD|yq)9(hă. Fc w Qgu݁:+Z6cǢ'b2lXH"Vvum#Q-k=v9"\,kSaF4RW]?i)3/zڜ$8tкMq=wY"hQڵk?yS\ 8;XcjժMd#Fdq8Tpq7N?y/*5lq{H"/XL;~S*pvAg=j6 jB}R\,m[P](@m\TR[;bE8pAX[GI{}el-N"Í{@`""KEYYyF-8=4dD5m*.XQ~ϝz`W8όֶ里(R''["P9πI@\ ϫ?brzdI /Ȳ\ēgzݺٹUmcv|F0o,i05Z͊"z~FY¾kr$q3~5"z7"+Jq/Ҟaв$I\q9ސ{#Zܐ`Xԩ8-j }ת;8`fQ3"SaG1QLO|r9mud۾}*̶9jތRSK0C+%pEf󯊍ό@uDZmb;6.IGGZAz+z.,#1]bbdZO9y~Z˩Ƚ2…!897nӆ|FI~#,WQzwk?]{hWuOSEeUϏ@&Qy2YPI.",3DEYh}?Iwӊ8.VadE ^X7/KIp \dI.OL2),ȹ.ԑsԂ)Np(oԧO p_ZL"L?P4 / 9vjB }x^zjFcoEriB<Fysmd \Xpb>K",|(,Zc T[W`(v-*  ߴ dہ &n„,[" ,BZiJ_S!w-ٚS ߉q%A},F0f8~>ڛvlhBTbܥy ]-D  HNrr TS mhkS f \># QŊ5kVjU~KUQ~.O2Q6go}\-j7 OAӦ槢AfR {e>\]+pǪE)S@^%] QHeW"p5>R;O/ܹ]- BG :ymv.'$KU%xE$@U͠A)(䁍 .gJ(oƪ"qj*Mɒ%n޼ٳgϲe"Gkݺ5"+q߿Ԩe?iޮj.;tv=_khLګt92G);uvT|1Yv#799iX 5s.-2ewF¾Y]'=*х(qcrU̠-4ɲE+'*ߒ R+L1mJ^5sAhЀp&M67̘}%.f&D.Yv"֣Geՠ{$^D[3㧠6+ڬ!djGRX:[hbv,m\qr&M@x޽_+Uݻ7ʗ/ K>."0OZ/7m[/siK^RajMZ=Jc^}VUquҍǦCK(1K6NSE[beY1wC|ٲ.E,CUr_ ^EIJ\#L:lQt 2S˔/p?$|qd0 1܈Ow)&DS]yzE L+sLxm jX;ǚMwQB*UT1p9wɓ'UV|ݽ{u"cԒe*RK VJb?y^Ao{ضnj[6u5-}xl*zzi_SxulQPhUE+u6< {F_a!nyoL4#{O~oW6 =U[e0vXibAB RtAOZv(3 c*~a s TV<E=V`a ugΈaäI5Y,Z\"3,.~٪'y \z>Fa+׮tР),xUY_-k|Z;ZU!x&#xq6$|_?4О4o~jp-UUe(.Ws(D UT}  ۶əj c\P8;;Eg,.x޼y*p4-Xƹd#sz,Xui>kФQF&O9z섏_`l3oذJj3)~Žkqp΃{Dု'.0e0>SQq茢bPEuWvƦ/v*${S^YCPak?%a?@1Xv ,2In3Z8B%/{D Qܼ$VxB ? M9O?;0aÆŋ_~Y_{x#G".@5w,/o֨Ym8}{,zX6m>1 %5(`]׮4ʵqq-ã-c*^7GS%nS@NfZ=jj :N*;ϘQ-3F)leOt  9H ; b(jq9s@-q\ ?r ]0Ada̺\&j A i˶[rĻy䏷v޺ kԨaG}MMܼx[W@oãzm:egm˞  ,WX$w[(dih(,2!p(3[cG-^F ~EN,S3ruL \r`šrz$*3[5\?{w<~iԸ[ep̀k8KPgbHƝi 8sa,%>wM>݇w{5x_՘tv~{)&M1mqLP %\! T g"dEZ\4X4o7ZdC", ydh EY$pKZb˖\5i'ڪS_&85i$<:V!D' QX#^! ޡŋ?~Zoy 8eoƞV…>a:ڢ}78IJI7Sn81|T`,Zp7?q;RЧ#0S>By["3V;5T#el \,4EY̬&|tNh>}d83ê_٤C-j"-y$~y9Y/%)f׸k^w>qXQbLر}t >'Fd}O8kbG^ڽA44Tlpv*w_)3((|v ' +50ObM"-p% \h+zJ`܍("Dk _uIN9rJGŧD'D]s\FhVd$V@eEI³! 2):>92O@#ޚhi?v*6p;~  THٸ<K%GQخTYdNڱ \{yܺ8Έ=V<;{#E'dȫGhZFc$]iޢpQ" pQcRDQz,x6;La؁ щ!QSgQ(s(fld*6<pve*>D$o*2s&&XꐜN*rrӹ36.6 [1v \AD+v?y\csGYd‚`5pn*Q1q9!ؤb r%%$654įjާoP.S!aqk6n1cJ qbw_@|2Bh:,.pL S "¯{x;g16sqbTݼ2u\WR>0dF:V;MopOPdM(k\u,uz2}|:7«ǧf:F˒m7OS?jM[է6mciyoa -,BaA|7z"UI}l21MYuGD\▤` W ^A1ށ^Ⴧ0fV9rQƒUP|F>}@CzFyvasb ~aNkU _2CgX8̘3_̉ڇ=fQr~9 /,*G#v$A]̢H3NM@f %B\EYdC& Z \t^Y[#"v#6ɪUy2:>SB/,[.{8E)1n?M@ U2A! _?6`}h@S| _©X~3et՛70# wAl;} /s,nj#W]a Æeh5oU[v$K,%w6fͶ]vL5paE",,>.+8~yHȸ[WO!?Ta NG用'R] ܶpNu;pOʑ ĠE?Cʭ Jg|8}7w"Mpr3E/KYæ9U6\,[t ֓1jtʑFDDga $< xeY"OǬy[z-5+V[1E2__+4#"^3+I8oG$9"*YdEZl.(Yğ9Ș6W@VB&oҽ;%eA",lDҀyv{p>#nM(5:) 91(r4 jBc0hЫwM73w8.zu=c`_eT<{"A Z6l"8: c>9O~Aꍻ֬ *c n" 2m Lͻ߁B۵koKL&cה#Wle0VHE$I%ˁm?w,wo<($\{?%m,9)8%)zsI39 6LOR"N1$ ޣMJ{mɷxڑv0sA.yi pء{NbmtcMt Q4k^#Pˍ<3c߉"bo$$/[Q[0Uy㵨%N{_#A `cC֡zcIrĤћ *[w+$].H$)K֝Yʋyqp8~skG~ $j{&]Og+Qd(v! ]/&w)[&ܓ4N^0b(D WiD%z jT1Fz#cY ]g9ˬE_ILuߔz"a~jv'e݈$pE$IP2e6ol;pv]%f n"JЏ(Zg-BphdNvvCE,A6}ؤY5w[߇(Z,G% ,wĴp@yznGJȻ+J5t0C'݉T\ ֱkdK Q#ꉰ~T.f_>Ђ*X rDQk'Y1" \$p),ϓ*JѣG *UN<73 >{_ZիҥKa탍m-c4(+c>}g.\+*p_N*Վ$"? [+{!Uy(Ny0T[G^ <|ul۴mRﭷu@xl=UV8P8 u^hb(UԸya Jp2 V GJ,}̐W)*+"v=C@ HI-b멆DpA +W'ffdN0Iw7:s7|C=[ҥKJ\j׈%;j8  WB!?g' d p;~as[pJn a{6y؅}dlk ~% =oWt뮰j t}耚T$`<ᤫrko4o(+8tFa gӖmT7L8.i] y=k"3Uz1|B|`$$C(¨J N4!~ vQ@F{7"$DVTE."2}t-[lڴeRd3K*T_ٝ0 y睶mۺ1EكnpC"E^}U*YtҾ}0n3pK/ԲeK[p7U`*^m8>v ݑ#G4ԉ¤J2 4$>}HT Xcb52w2d=[|.@B,|C'.&w>]-t1^=< #/Pȳt7<^'*]BYn!zc=y1S1/o.S.NFQ(3,faˎ+WĎU/){+`Mt\Iʴ*aiq#~FxDzM>;0c!Lڎ=5VH \ )pʕ+7bS;w>k֬~d͚53n*B5(u6vLm@ԁ˖-q%.}12J*f0LjݺuVԕ|]vW*_< {iG(ߴ z0Xy;ubcXa'B7ʞ fCoIr6驳XTL7)3f+(.0Y{ `Gb̭ @ؾ08zЩCGYb! LE_ Thp39]ѪPO~1Wo5De`Bh:vyݖݖ]{\u_ZŅL/7`I^ZF`so9URbx^);rݪI"K.ժUݻe/ 7ѣHe߫X\MGGGqhp7UhQ.SnRl.H%@{5vZ.^8ưFWpR3fL\T -[ Ez] ?}~dn{v,|#=ܲץa&XT(*&]YVu"J$:$AQWalJ;p'Vn]ce!H;%wʩP9x.zeMZ`a,TcB/_c pپk/[~HM\u1ީ7 0R}ZxtxDWh_}Ғ[1" \$p)Ulر( T6T/@Ҹqc7p;IVw̠ESk=.;vȥ>\lKe˖5kց+ƕNL^zv.W6Dqg]Hb%Jo(9nd! x$ xl1xesm;`t9g u;(]}Åi*V# N1d:Ia/ҁoue=wTT|{<5Nh}Y6(8.:mPKIɕK#r?y%qيi~DM"qWaD p|}섩9zxKlԎj.RŘ3y打ϷEbТq;wR [($.Yh- 3inpQ Jt`"JE@iXNeO=F:r>eً d 8ᣈROYB D.  z>+(IJ\6vѻA:v4R;Mv*j5ػODp'\sMU-0LQ zw=ԠA>5j_  'g*gV/_FǢ~lӛ8;bYF;QF8!_Dr#?*ËUY%6 ^1r&olfb*pNEQ+Os Fu(g+d!ZOKP9ۮvW˸mdhjֺ U](Pgpcs }mk!fDegm噾Cϑ2"Ç_zU)qT@ ʕ+5J'Q]v{F*A߄<3Om/,j@EX5!0=~*A Vj \mr;ЉiWd;(ԉ7||r#,Tes9.~Ae4qP}olt:(S_(ӧofBC%K-NocF|q;OGOڼ5j4 _BWELr79oWi)S ]s|AJCP+zNnѻuFE &7z,]N_ q8 LB|!Ic.3eΩֆ9w..%ZѠW/q{bzzTZ>XA]ʛo.N|($ \$=EYR*+jܤ)!_9l^&;L6aƷIyxSe8&ϘjӮ{^5[Mթkz7<9G_a6+kdB@ԙN^¿攫>a{ ޡO WU*5kצSٸQRVO|3+$N;F0$M;f&S"NMkܢehN\R \""xY݊4LfC9y_Oůkքag#:hkQL>czK7+V -RXzv-o۩$(kʔ6{oڴV=%6 s5OR(t9y__0ѱM>D(_9Or~$pd- 2[RnoS ?-sZiϨľre S>gKAhԂpE -"22+cY_UVH%"+xYd® B.[bCH5uJՌl6p;ͻ߅Ev1ij۶w ׫WOkϱsϾx?|rLlݼ0M[wh-uถX,>=nQL>/_{\gϢuӾҫΐʔ.Ȓ{IΧŒ~KP-+1ro, ޡxϐx/}38щ7߉MJ2tE1l]傫GFdUJB ^wHU|VZCmJy?a".[C{֠ 4 Xy}_b -.WGT/^__re~{Uz˖EJa/VN%})' 8%o:- p2X#$vY 2lWa;vz2zto@ )s3:}&]_v󮼴Hg߃j=lޅsҢ|,f_D=MM~^}bt9 ^QZ<t^|MMfZ4ԵYSKF(fz'kC-/vjB }x^zjFmߞeVt)&$eeFK.5+ \V,ZQ_|CT/W!SN˱)D,Gv-u&\l[/Q3$$Rsm% Cd|JT|O@mMXcDOص0{ѥ@}97:FܹQq¯$?Ph+[0iSFβE\ȑkv>D_nfڵ]8bڪy;49 :ힸcE5]KsɁ"ʰ\0BBr\&wRذu*\;ڌeXue3f5pф=pݛu,vNXX|s\- uV  \jhҽ{z{LE-ׇzyo-[9{GպmYmo7s1?T=^y:uģ .hُBe[1_= F`P8AÓ I J1k+ؖЮĢo$ ^]I ,jǐ !H?v*.lzu僁LxF__l~u]W[&-q:vF;umqV^ k[ڌ[r7}W䰅6N~ WaVE6P^=RX pE^etD*S"\)(ut)RHҥ*.:s&=o۶{M;~fcθ~R:|Jvƌoɥ Qqi&jUu߳Ec3BN*hM$''+]>K߾}[Ďf͚>%Kժpo]ޘ5+VL//oNnR@3?_wq_Y'&ݳ^FmƯ 5ܮNJm8z6Ɔ< Mf԰뢄ƥ p94. 슛w6.[1o,lca ԫ딈4>[Hl*?eR8=Ŝ4z WdwC֮Eܑ6{ہ &n„,[" ,BZiJ_S!w-ٚS͛a}J,Y`]gzW̘-M \4g]Dtx&ؐ {s/^>~ٲ 99S@*)6nɩj.}bŊ͚5Z*FEE奪5kzߪXH"3gTLP aWMϘ1_.Z-޷/F#L:|BAQx 1ILM _.GyF7QFYݱ?عΰY%`W]_ѱP=@6,^F!S-Zo!{|mν#mlhZ,qV߼y  LeQ|k->wZ-Rڴuѳn>ֵh5pa8矫D-f[t2 }+3O.\βEѫ׋!.8&-oq\ݮ] E!Ɍ#bAv.'$KU%`5Č U͠A)(䁍 .gJ(o3[~gcU8f)Y$!.y&˖-uֈp.OQa.v B#"@eҥQ@#ʛo[o *e{q QͼyW͙3>O6pv tE90-b޼rM)ʦhMGx,t\VةS' z篨-\21m.Cyk Ѣ-VoSml/?uml'_$[&Ri t-J1[CS7G1y#ղe?mܘ\*{I\Ѓd٢Nak R+L1mJ^5sAhЀp&]X7̘}%.f&D.Yv# G p{$K[3㧠6+c5x TR2288E+WC {ZR%v}ܸq\V|yVH\ #pY*bǎ`{bR/:% {eZL˖w"Ewݺ0~7.ʖZO͛W֩Z{m\Ap%PGTB#nJIU> L3(aE\ ܰu6#ZO\b2QR{%_pH=$mܲ37;ŷ-Ͷiq-WUr_ ąvNtd٢U''q<` Ur2.~˖kr80p#>mܥ\\Lu 3=7y{q 9K&D} 6Bvc֦ۘwQB*UT1p9w8?DBx޽:U1jy V2e~1Heڴx~gM _1Œ-.۞=Az;Z{w|S//0ժ1<ƹZGh7\Iv8e!-ӯS.ڵoѲ% ^5).<;.%aS7Z\;r.QR|n؀ +"1D'v yk7mEX-/,8vE/_<S}RX7lnc+i X~{k qn9_|a6Kp|-vPg뛠ACܼOCeu|N^޶ȣT5kZ1mhĔ~zc`:Zzrb1. 0v羣K{ÅTW)[MJE&_:Eƣ~bF 2hW׻ ba\.¥V8?Xa cTкT]A90i{e|8,Vǎ}")PKlbꍻݸ}L  >z}=ZТPl:a0r "SzIQ;F`75 R \GU$I7-s&X k7狗(A9O( ؖŋ \ˁ/,=z6ޅXW|b>bSCcb;lac0i"ݺy`0388&/z>:e|_v݂/4ܺ?RnN- }ʼnfgCb*PpNƛz>MإE&܌MT6o&S֊DyТ.h &bhNN݁ ƹskqJOˁ NvN\%˜uOERA!\XQ)go2,"*cʀA,11}00X5M*)~U݀bܭ]ܡq\zH`7( I jAO s%Ę6bBC|٢8.=?7@"VJA\n=WO#D:輙| D$*ʃ%pE-ؠ`+˓H'E.HVJDv}Ã"|B " 8~P5?؅Ep[8UNNsEK`7hD Vmt3F !@`Y#jiܯȹթ@UdE:rP+5&t$c!>-,"Ka.HΑEDv0}\hby*+)x1ᾣd@qٝN 1^!u*"ЙO`<.][f_X,FW_tKhߩKrMp*ѻ@E4#$طŌ_yJσ?}4^xDcc_YdOP9!-$;hߟO .xxy {LvhCt%xczņ5kֲHy|q']WRN\K[=a幚U}|uu,Ui)bL>ڢ*d6˿^-R$7", ‚ Nt]sSt|ݗb==b vۘRHJhv9u߱;5kJK K1N⬬۲QR<F\ z>#<.0 WĦ=3/SU6LޖALrݢ|Ķ;o۶M<Omۡ-*imڕ*,X]YI;%G.rJ~Q3!iyWuGR(}v"y=m{\m;ءS7-Btѣ`%9\9tr_ﰓ~_bni,l̢LEEe4"Xdl΃رg mPg"B=֡;wdEY(,H1+m۶U:Pc/hӶݮ q^t'.v8|{߱ lapl^}S="Z0VXb;vޢHk֭ůk֬8dz޴(&N7|YznOR[7UQa {? ,BaAE #}Ҳ!;qס*[ejhJD2(տW2sٚ-@ܴ0jT/bO֭ߓ-R ULgǺ",PX$pd%۷_=N0zN:{㪥k8)d VN[v|0#$?ɤ{ѣrWxX~=?~>wZ'?ԏ 81cX镧=u)2]i1>1E~"@}5# ?}gϞK_8 /33rFB \t7 `-1(&98&O/N`Ȅ'Xb"'.\X%-Gij-ZyEs_rx{l͜9v/a֭1n1ҥ񱅄߬րTRnBz"Q*$$KEصdt,kTo]: ]Vg本HՊJ"݈덥0F9{Wy׃Ʀ]w6m`v'A`s5.i`/ /wpp]1^yJجysOn~Q؞9sfիWmC\=ELGA79ۅdGY^B6t/k~#FTk0.3rLނ񻋋8 \OU"l'0;6\ĦG&E%G'Xi{Fs K 4$KM E 8>vɉz"2dHʕ[ăTuٵk1DtQZ\c7cYLy -(*1*13On~=c:'6wb i?cE=5X6/_^O8; .ѕ$I]Ӧ̂pNc_զM0jT:. ,uvXMrY;a"Kb"4bf ۷o77 ˚N$p%j޲Ӿ`nӭ{߇\I#T_z3<.yu|D,Y¯C<]L-:.;v?c;AKoQ$@*_~ PX\m'rbj7fщin'HHv{YDUX'-f E=f-D7AdjBE\.3A:0a>.Y⊯1*p!Le-6V\ʭ[Y.koR9::b- \$pۈ=eoHª ̎_r_0u!\N7#so傩k-6.?n:N*?XjpQK$ؾ#t|٪fX_O(q#p,@>A[T04\>v-̄H"I\EI ᳦.BlWGMy"dyAs9)e-"e˖0mܺpA0{s66 \$pۨzV"N]{ OD 1G4dh>}Bo+??E9 M_xX^N*d2sN]fR\8Ŀ:X\">!M1Z!qP-aXaԄH"I \Ϣeվ}{-p&!d%_ѭxps S.k ,%)写emꌌuTWqL|6.DQ‡ p1@ \tC;8LQ g"xՄ7}I@gpcsQ)whߞ2e.ӫ- HOb N50E+N0Ʒ!VD01HeYBX9S?jI$\`b配q~:!a,I& ؁+hX.ϛ$.,k; }bc8.*"I֫a Hࢳ1]3,XȝE`;H#o? ʄpb gbYt9|„,K6[\݌!>. \$p/Eˬ:roooxRHl*F^;ߩoմ5:v'VV< o?5XI$I.|.;}bgA=Bb5+b,ܫHwB̈ 7zKbYsem}#FTJ[1H~uOy';QE祧g ?t}˾ckoM35 h.Gx"(IlY*XcAJM&MrےemCcǍWo$.S X`a0zhQH?ULMߠX,unѲ\ztW__ oz!n/c|s.E:FI$Z@kDSNU!I1޴GZ=R}gP"]ޯz`1jV9:"!Ea$I . #PwԨ%N95^84gR5?Pe1w@䥗SO%K1fϞ@I_4TT 7e/B=iI^VM%2SO~ qa_iF͚;w>zM5d:vQ[Pa$I*T)g_iek.\6i ՇHE-ܘF?B>N)]8ӫW 0D?_~cuKWT~B_{bܹW89o. Ϗ맟*_ϟ?BQ{10b|T+ ˸! %ITβbŊa(fLn!䓟8ӦmWW>7ww%NqF;u9kV,|ŏZ80TrϞ _{7±Z5zob=WP . Ș.wLՙPo={4ѹ@[1J$P|M,\c%jO-oN2n\/.'a<D%/>/^ڷ/"|usrפI o.E`'.SP9u˜,qAca38:![lY[Oya$I <SV6"ԍ|夈+u۪G0$d0!91\_M3HVj=?*Wj }Ui}Oz&QV/6.@ AQ:4m}!h@-N8|yʚ͚*Z@B4{dU{B1 ]UVXB7g)krKcrqIr_Wq?DVR?:-[&͙xL:uj4i7_>Z-*;K{|7gRgDDcVV:v{֯_pݺ:wu12ZqcXvt{x@)^z@ADF Tre*֪5{߾zq;]Ъ|?*v]fckfe}KW!B--NyBE|1cؙ+V?2kϞ\E\iY&qUW޼y+֨QiӦ]xQC]|-[DFFQqij\j56iJΠѪ_k0N™}@!Wܸe|-FPIQ&&*QuOn..а8nȷ5jլ5k&mތ37RRYYvuiMٲoQQQم'*D\Dzl/uÙ~S6W=:d… ^dIJvj¸ Պ+qtt4F@oը…U8Cnݺbb ;tב>>|JV2v^AB*QuOu]Nv[%ʖeږQ7n07ɩ۶~۶G_uٳnAzo?_kP.I$.3Φ~8 EWRcƍP3vSG\%KH8iHmV3qѣي˿j@\`!c{X#G/]66FqO^|B {:$q4BCC\HH;ST)wwwE+[,΀ {̎˔)֠AUĈW~JgfxҤI:u~CB,qJTfAEEEK4\ !Ʒ 7e]ԩN#FjTӄtpgD2DB>1&nn,i6X?*9~<1M]A|ӟO~|o8.1Nλ_"Ӿ?q?y]уTZqfLo?NąZ[ey\ťɦ'.RڬSՏ8.]*9smR'OVmРС$LnNe,}: ':kײc'''0 {fxzz߿FBNbǁV5/_:δba&]g%tk2yU4 jTqǸ=f1PcӐ=YϞR ӾR3q`"=V b-f>8U_EЀfoOeOk"Eg}54mڒ 88u]0a2 ?`ӯ*f%₹ΣF R $`F@q}F%.`eٲe ʕ+eǎL@3EN[nBb+%J) ".FZ{|q=;>=_1*R2}Np|-vVuO@&p7krkjIą䁩Czu+,g}!>.hD\řũ%8TqTLL\$Y>.!>.g%G % ,#.X ;v 4q5ٺu+cl  Ȱ^zi&.ꞩ`,R SHח1$Q/Z$7sIjǂHYEfkodE(ta,.Y; ?_vV9r& }?^Gq9̼ܹs8_~}?J8طo_5uJ\Ԯ]E$8qɓرcuJ Q}n*Ŝ1_|:ˡP-Nv)mVˡqX|^L\iNW%SM:UgϞv 6`tt GݺuqcΝ{衙{Ⲟ_%:g1qAn1UdIКRfmI}aѦE ӟqO~|QUEJąZ\hq*fG\𩎸W !0ųgKv={VL\nDq\Hr(kn`U%F8.1/"BB.6k$9 \5gH@\Ēۈ &ۯ_?I".$$9$7XEΕ4U [%BBbqԩ] 5XdQ?@и".ډ˱cq jD\&.y 귗"B DW& .*D\H =gs~ ".$FngPHjmwN%҉˒ӧ'OkȐ]شi䤠%gJ!֐].tvܫW8ǯxD*#&mꊷߦ]֭'fon<Vr0c b6jQkN={NTZrBBBEqk%01qb``A-мkƃ86SAAv]D9{v̙֌v:J沈r!Y]LS-:um0s;O3M!qQY" vldRqJC-DH5;dm[K@mAnD"S֮U+4 (Rע۪#$H\M!Ý;wpZlY@A]1\rXӥKlԝ H7A$OP{2!1¿s_&Rpˤ`YXLi-Y1 wA,оSɋʄĢ|9 F*W\yI{ Ŏ(7:XM νƨ UIIzun|}e'3:iDYB #Ba7ĢVVcMC\F$1Y}FW\MbQ;fӧ8cDU .ˮ&8Qy".߈^vv(KJE=.vác5('MM ͻC;ޙd@T=+-ۛ/W \AJd,tE=2Oq%ۍZD\5EvkB F~ڕ ) Z1jk6۷6}k~}5ʇO%F-'j֬ 'Po5j`ĮK""k1w5L>&goUUãΘ_AO^{6v6yaa54)R8#]'IM\߯;jBr^u"Q2 uV+VZӤ) Y%w'g?[4ʦ bMl%ܫ 8Pd 6;w&2Gkg,Bx~yf`5JV"{QV c~l 0۴Y"9|K;FiԱc?wwC 0[aWQmU))84s&& V%)AAqCmyh . +6ב#G;ᅢ?wssk߾ӧqvY@Vp#K .Ȓ8 ك+VoW&[GbcciӦGyϞ=lqC|g F5N1kw~W;p?;[a;L{?wZ 'μq I;vMMR~cǯ*Mxvf!t-2+R_&4dB2_)[moB &tRfstFsy- T 1Ձ.J.kՉ!ًb+QfM&19%6; Ko<.h .۷oWp_N8%,(ۙqoy_w%6c|*bT L ;,YmHXqعNvlV*L`oaʠ'/( kXYYܹ >yFJNLۤ ג5grjD&(n}BBq+lֽ) ˧ХGcOXs652fNTecu j+ g-F*vv)9* LbѣE>a 4Cm0#DFB9G k Ťl*_t>~ꪙyt1ݡ.' ?>[a͢ĩ"]-.k׮6?TKU%q?kjq`"lX}l]FQܿgo~=o'?|7߿ۛw8:;+{ZHx33Lgv;t8p8?|Go'qFw;CBPLA9 4Q!t4e!f |nݺW;,.*UÞY\5j-Bjj@\޾}+mҦM|=s L,?SBBhgc\{~Xz%&8~=:x'oo? &AlRpG^廯W^sBC./zar'\T4ѕ[cyq#debwﮰHx6oBfB43S!4޷+eFԲ^ tوՒ9\XL\"eo\Ѷ}{k|NdI3"e #q b~.0Ӳ%\qx.^v~9cL'mgƁ{hEsrN\0Un5eF{y0ɀϱG$\M`q|\˗/+uZS`)3F ZrH3"F1H\ >Qʪ|b .lUQ ܖxU,_/A[/8a;i2f"p-[,a:uV i8UEXTzu v4NbѣG3ܸqqBӹsg8" V'M>Gٕ FVΝ-:e4̪L)yJ,.|xODgp>.9%}eR;% v 0B܃Xv{ X8L <y4v3d^[w(4e(rZSh(dA[F˄`Q.̷˽s*`-am[%.5[oVGks#FjxMT|\KR6tk4AȆB. lÔ;gLT[W[-Q(saD\rv\|j%.@n_)p k3K)`m]CU-lٱ2c\ wz%7i8 b|u_.V>=&9@R"_e,53L*%H:& ln1^Qȵ-|\-Rq`qQI\JWDEWHC\aaYX-,`?}zSvPOQq|ӌ^jv;=;i,T8v X83`]X>ɑXFQɩ0r ]tI%gJҽgl8OtgZ BlZ n0+,u V;,$toف<[DBȰ8Z&OqGѰdjI(,dՄK'9SCw<\gxM`_b6T!<& a)ӾD\dYU4|BHS7*[Ua0'Ies'&.uĥZF.+V|j@\!7 .PI3LA\x.~4D;` WG>׷_"M|ɫp>p~ ٺgY>c.ꈋ& :{!Kn"v %D B6W3pC^[Jxx}q6mKVQ(- Xrk.wZv g/''8.AA͈ҩ2z66EJp(˸` ~? pee  7=}sWxf4H,ۯS[/kB;? 6I%Υǎ`8I1!FS3o1б;wIr Ì判l؂m&>%.| tYo_|,',PYvC$7Q5oB^llزK]B6NC!pH{D7reb?Y ,$"*eI1.y51=~3MzE\5Azs\p+5/o"KdV:jy"SS*6   Cz (,n*/Õ̐4 1P# F~aaKN)`]nOPOIw"5RxՐe]pcE:q2P,x؁ae)X}$ݷow7F6Xn "ěWRNG300\E!+R aպȆ,uy Cg.n?|uѫ9?ewosiqJΏ؂&t!>N{ nkoβ"H#.5!{9 R/]ky,KMtK|l {*$ɼAy,E!DiGaa::YqK&̍ b"`TNKJ/hąLA\zUZǸ_o{HM/Y1IbJP L=qBA'L}.t//\JȲܐ!*tácX7Y( B@ݰn ym*Zw-ńQ#c)F]AB)`;% [! Pm۩9Eܕ6Y$XqAdϾC|=⮦=cfXFx-"A=[MA0Ter/OE)ΪM;y@/[BEA/TLe|lVtjʽG|Ldy-nA森 IĎ*[ol{[s%ߑ*lv9RHqFZ-K! zy>~!V (Wjނ;pڱ"[Q7:ₚv$қž .O&pu~Bb6ҞKD f ,E!ވCiɷUOyZw&%t#{>0Wf56YE{5SY`".`-)wb%>z o>d\S OB ~edDW|Q:v$U-#.~m__3Yl{a#s !v<}C3-n.Cg||`,$+8;sNG% @}e,:nC%Ɛm,¯X̼q3#cN( ܢ%?HL]k&.x5lQXᕣG\oRzkHpq\'X!ͮ,(_)$Tx7a=}7_Xn@Ysd?p21t;R<RҐ2;Wq!"?qɝ-F^Gpi@2]F3^/&A/`+zMy)ˢޟDDV ٲIlnD`?|lvIIXяB!L܉c1zll7 m2B \{nH,iBu7,K+*9 y`"ؽv'.R Q:d_Ei qɨ nK f~5k\5A t#o95t*] !&87]O_^kl$&=tݱҲ&_ ݮⶽTo* ) D\f*ʘ%9u1sþ,V nBn;ep7D %^/\9v.,nTYb<:tXLwa9(S$bzC(?zA0[{Zڙag 3ҽC4_ތP\!=6K!1OnbJ!ӽI`@v!.T(9<1WMP*Ҝ $a](G'J+8ov͠uAPbn-<|,EF:4Wҽ{ ={9tb]@.^xy$.sn^ι6f ιt']K/܎ ,E>$ ygy}1l4>9 1N=/XSln1Af!\@*S\%Slkp&BEГ'Z^#,v1V {xYjg~[|l\:kĺjyڬA(\HVJ2b)q|Ffp?| )UzWϲS4iq!q$Ucvۤp; na72ӫ@÷o231 ~ŀdT˽aF9g j KB`.DzX^7 賑 `yBdX%!Cg j ^\-Uf,+ XTw0dMMO:A`y K_vJ GNeG&Thoƥ{#Fr]5rٳF RhS6pFeamTF9^E v jݮaد7xS&al̈‚= |mkCĩۦ[3 NM?jąЭї`G\@y]& jSb?|OX[h7#g.ߺ;;dքf \YVa,4>ё#jf) c'`} [g}]7?Y*% 2*tﮙ|4lc8u)bDɔ"".rohk*/h؊ָw㲎aQAXY/1^?]GƢqS%avi9f LF7_ƈ =:/e YeТcBs1c!?dBoGf&Clbh4p$p&}HW"3O<,ɩl(9`M~Ei%& وvw>#z``6lh͠&+ uoD B,P1$e̔|kSD%gNM7rKxZ3oUnc\)qFąRi> mv#cX<싉)Q}anߋ>~.''@#\M@κ<ӗdڍmyrRtptga?0[x$Rߺl% a(} =/~Q4:fzq\G5aهu9J0Ń0MQ+z'omp=e=;~ą؛.v^7KMPޮH90_l`ZJ]h yP-2^Q{#Ò`ncfOle,|e*ЩG>_TQl!rpg| -)*ۨQ… *Um۶7ndR|-[dt*w]e" QW|5D0pfᬪ!C)5{>.>k ?iQLiM1bŊȑ#O4h~ @\8`Tӗ+ssE[#u:vꬰFT3 a9͘Y ~`ʦ,^E.c]v 䢯9Fк#Z0 dT"ˊ}e٫H4O5a?g˹ʝ { 2jT͠5Fc72 or bffHnsar =Lx/j]Ud TpigB!yW6 )+]еk*V([6o|YϞK\"""J(">Ͻ{j V^}ɒ%'+-Znݺk׮e'˔)V^=\cƌ)[lūUyf9vbCÜSR%wwwlܹaÆO_ .7˗ooK\=j!v bV`:Dx .ev!Nƒ9>;8[X9mO0q!eLfS^ zv_`~eQ԰#.x5c[Cf]&uEp` æ,y, X;k/Kk xPнǦyxgݡk–X3+Z^ iI?I3hçl(4aC )ࣺ|'7n ;Jddf0?N 00`1WX\ lLҽ4~DŽNOF>}\31ODRdIaVk@Pmƈ ;30g`J)a_OާOs`.bEݍ@4/\u֜ECFA}fmlfo`&u@Z{o>Ui['Bu>qY0e+~:, 8~bc{ep󦣗:W69st̓J`Hz GQȞ E;'#ⰾTTU/HCfzD|ʁS[B/Vк>~R&8$&rC{E^ "TQ;{aJN.]' I.֮(SnVLר)c`GE^/X(`3A\vءdPD.`~3* N-)2%;th502u{sHxМ, ~-T*7_5wa `5)Y03|K-XNMuK0O6l ʕ Z|92L\pxp#4;`Xk=bĈsebU1`|\Ts΢Eۑ+WdH96iaXz./Y۶Uг2[{^.)ʾ:/T_:AÕclWY+l7tڬ VX6v֊E'NH|,0QnS[ *V;[>l悓'.4:zYLLR&ew @cQB={l`+UW̛[`.Ilڴ @t.]:u-´.\DpqiӦ,UE7"s8qa +m6yU#`x-5-(8w!eenЪ aa5DUry!;V?-֯Eob95ޗ'bYUҝ75ȲH=2ѻ fP7mo-dNAKrAXtB?ҕ8/_U&ÈK/X9jhL щ7OK7<)tE)Ⱦ# X.|@y6MYE3 .K~#~D岟<|?hXͅxkע6`38wYbZ>q6zν{*W6q'zY& 16JSϞkțpD1QV^d6* !Hu "J U8F\;7e=BX2+!#BEOMMBb{Ss !!J\~l+3q!!!BB=$ ;Ca 6_>M lƨ lC\fO^\:q5-E޿K>oicX36`g@`4zעgջhɒq1+ȎbQ5?u_ˀN D\rqA,BQ6\wHω# :r:yx r@>}k\Z 蚮!ǩpb(Z͚M͌Gܢ_]-@)Ex{A:4Bk4mj7g*T+bb"o5 qZq/,zec =zK#. ySI\T_#.bVVcK\tʉ1ҥ>l@Q:dEt~4p˗g6l#W'.zxH)@eJ&hȀ\!؊eʕxQUT[ MoSlM@\j:uG[^ !.*#.k $.-Z@9lCݠAp⢒(ٲKɓ1mԩHG4r$* Q@ޫ֯/0wu@慅h#0\w><_|V#uC4Ӳez $d hMWW}85K9퐓 TUk q+  xz+[]YY._ M^j,XރL& qQY[РO?d毕|`@j}] v>.;{yyuȑfeժUC_EFG=TuIN\P(רP$.0cbRhQTt2džb;vl i'.*7tdÈ`&|$KW$TQs;Z5+4fT_gUh,BwMs2)hT,.8)1u叓cUWqPUUB`Zj,PpBR [РOL 5k +L&ܹs8f=1>q|Icoy_wڥT^9;Z\~GV Z,=qt,JT!Zi#,1ClU3cd qT1+k(LZ ZFQɨV&$ ϤI] Ngc2bͅ.Snjg JP (CFeTEeQZa;{6CCŞ oP*ӱAA"u双<X Z_W =~Ca5_]Mz#ת"Z'@ATsԣ+gF]oƍkƿ=z:KkRqQ|\?s-ȶD Z땇Đ4,hPs !1Pe[T *- r$$Y q@Bb͡b($$Y q@BB"V <,W{,hPs !!bH\+#$7 Z#.HHHjY\HH,thc2j$$$ jaa In_ŃDP <,07DBk5<90Br @ @ D\@ B `)ą@ Ѝ &@0!B !wX\@ ,'@h!.g @ ,ZQ@ &W@ ą<@ X@ B @ą@ ".@ @ X2qI~$5@01~P@l]ɇHrEJ@ LL\YŲ˦k$9FN\Irq!".9̏@c @ q!BBą@  Λ=Ją `%όxctb q!BBą@ q!B%/Σ+?NkWu}@ąeѢm4/STKjڴݫSƟ+W ".z ( ˃}D\".CQ[do{LF0KfD#B r q|YҎk^}h=d__"_ÈcXR`;>O_`ʖ-E%q~rXm+zFUi_K/qjj*Ub (W⇀lѼpb ,_FEGUW7_?תIą@ <}_W?A~ߙ?hF\W&'߶mŮ]*[F-R@*U*98 ع3|WJb ?Aժ}6v0".~m֯~*P{qrDy`jd`Os<ͫE>^|{"E|Kٗ@~uvו.5zIe_֕-[y(q0aD^nU&iǎRJr^|p']]3n,T`Eٍu%b"ڰ_=ΝXg5mR&/˘w |=q;p+LD08~u& ^}9@SE!fpޛn.1q*L>sqYd&P1qn]wx_4`O5% `;Ob7H$+A9ͻj".&%.*V?@\ *sѢՁ.N1!C?y;Dι!qiy&y# 2odvзoM2J͚UaJ%(h>{ SKx װ3#%Cb®i(1T3 vfWν>d [,봰L=ۋ.MY\B\˱;ƽm+E" g[$cޡ59-q> nTƨQD\LM\̜&pv9G`z34;S,.ιYh".!}\|oKQ˝6KN]s ~ؙegO];cHz$bG :N9γqXL9|ˋ|\Z tπ>.[7,b^ĥtwv 4q!9uUQw˟_Uˌc}ziC}\f>. 힞nNNCp=O+W|\*T(˜Z G͚5]D\LL޿D57c럱Ιsd1q. yV~rmG%qiǥ]׿zoW9x_˛h4 OEfˋ˱I(7k[,'b:"?VGOڷS<0YX oa~YXShQ奫y#(d˄X\Qq!9"V挐S8 ڰa]|Ya1ݻ^ V;'ljBƹs'0n֬!2lB:A,".D\hEq!Bą@ q!"U},XLą @PxC6ʀىJGXD%,D\ 6&E,L6FYVKą @ ".@ b.($9FN\_z Ivz? ɾ,(.q! =z^IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/pad/images/padharmonic.png000066400000000000000000001616231506652756400250370ustar00rootroot00000000000000PNG  IHDRJ|sBITOKIDATxE1{WEADAD̀Q$%%Ò3+%sZA$ 1wpwjy_{SOU7 H)~ $H A߆ӻij\ $H AYZN~T $H AE:kj9q|D $H A;jjH8 ct ש>1TE'Tz6 NhF?K/W5S5jׄu>UVh:fv?x-]^k˕|͍zmz+rwi anggfsз^y+\~e*#zoI!Waɴ, Rϩ#nɇA޵#]}J&W,nWU iM9 S:_z%^+/ߺ:ؽsVr (UkgLoa'mDD7o2gVlJ}]8~&piDedzȳ|NKxX>=twuTǫ0ddkgإ-e{صrH2YB/BSA%^a֨6Z_7BBuT|}쮟+J[KN풤gUWWvxBS \>8[$z*ՂnW{ԑwܘNSiX?q 0;퐬SyN=Y/[ b\OWk͗iu%\+3?M'[$}y?2ԹRm ]}J&*NjkbE;]{V 1G៞.ɰ`m7_9=\Ymy:!o|}.R3 Ƶח͂կWz@3WSiG]]5e9ak^ ˦uaWFUtCm' ]ϑsĎ:& ت5x0Z&lRW#:anO-?oӚTrW^qyҗrcO=nv./yTTeOԺW]ff7~箛پ2W/T`Uۇ˲uJ }mrۘժ^pH>txa^Q,bzF7cgZGݥ! ȻW]W,?kHfiCԲm򁦠 t]BYU~4~@3%Sr.ұk:uN_>wLu+h^*0tB>Yk7x> ]5"N6-^~Lӡy}ud y*7\{ED:_."W jV)餿3ӹIPaԷ/)~H!E꒦ kSJFLsQY ޸˦.g;]u|ajWWķXs|feB/'OX8=kU)_aȖ[4бzGmHl2BiFR'Cf%mI"-7k-NYhb9ՑGK/ꈎs7ohb{+bL:^c13WYmdY9 6/xmحW՘U@e.Wj{-6voJCx(inw–=%yJy-Gz%Ȟ/7}ѧD*-6Ps!ڽ[o$b7:SZ>.VN=^VGYS| qn}v)ߌq#Fb:6"*SYh |uD[_gN]ڠeB$vF{MuIEAjcs]bAt)cātQ^ESAyT,q=kHƬmV ؾMJ<[`|c}U1zbIeHbKcӞ}Z8[cv{yL ,լ-K*wS 4bHp)ߌq>QsX7X`]h(WLs7 \<\2x!. qe;G{%qNVre]zsjUǜ]bA_=cQlD)>fﳶh DuR iY]CxZ 5K^/#}'UY9cN;Y#lz5UAG֡ߺjx|mRUv2p7qBwؠ<8o yLG+osF4_^ojtGz1.Mjۼ]%$"d?,*1^pʕ%x^X8fŒv0L^8M rz6TuWjHnHzM0t L{Kn,%A }=YL-y^ !u>Bח/;sk'(BM305( *j]ZgԬaJ"[zw83!$:ԨV>볒TVbjaǐ^ A $HgFbjS7 A $HgxYbj9WW A $Hm(KmBaaX~B"~""""""""0j˓DDDDZDC-bZjjjjjjjI-/ҹk:x㍾Ma *T%[nʺ?\xᅷrKFl٢~4hPn܈{ZZDDDDZ@-z:u⺤YfJz'۫W/K/ݰa+Vt#iI- 4vTEX̙3h ek*mٲ%F;p!\H)WѺbv4 F@ҥK+&uWLh/&CFR$ZMj]YlIZdڅrPE alv:}mƍvʕN~‚%v`ht˕+5mT+/ԏ4kڈp1t_b{=]$ژbREh9VRqZXS)"+.\H}cm~2dETV">nkԶbe y^c^+"s@3!ijhj{>F@T|Q9ޥ۞J???_[lUMO#|d+=wyFڈ;i\|9Ǎ=Bpm"hbJmXD#j1k C.*UͰ5V^j=\s3<L@iAP.9k*'N+aBmTgG\7u1nѢE%0dFk)RV-8;eo>G2w:]KPZ\ve\'pp=|MB|t]Ņ ,S,h" PJ3-Y wތkRb'xD#ZX1nܸ ML*5`g}Z?&""XܻwKZ<_kԎjEժEy3\F1(""""Zh0w^htZbjv%.[IpzS ^ԻmX ҌŜߋ%-iizqNRJpPJ ML*A+&MrЯfQ4 DYN;B-a=؃`Z믿ގ_GSOlXS #ot1Fhk~_40ёωQ Bۉ8aZp32F l-v@mӦM`>!bFGmc=J 7n4 D!eH  'Sb=0zkڤe;t/b\!N:qSZD|?iW,@sEO OMG j~=i#Z45[ rM\6|WB5..4_II֭KVJ!qnhkY2_6M,s bR wl\ RS)ja~!akP&ˣQN67}6J๐E]×%j*p 5-V7kjNZDDDZDdg$IIDjjjjjj YpV$ _EEEDDDD%Hb=MPoQXEDDDEDE$(,""""""""=D""""*;iҵ Ġ"[H: ZDDDDDDDZDDDDDDDDZDDDDDDDZEJ[sB"""""""PdS")"""""""""""""""PPPPPK套^*U"^z>8gΜT5k v?ߠA *mx_nڥK[ns9*WwѡCbbŊP/J/o>4[nWڵ~/G^{N:R xW}CBҮ];P.[fMzMF%ީS)S,^_ubW ?8Iz߫W/*zo߾P b|4eС_|ŦAƎoM޽5jtE]xᅓ&M+x≘gԓ +`EuY H~&bٳ!ӧO@ُ~% m۶5v>3g͚Oj)Kt9 /|ӦMɐu9K-. ߕ+WH:ʖ- %̞==z(_<pW4oޜ֨QY0uT#G~|?LW+4Ud팵׮]Iɧ )//xHƤ &TVK.4қZ c#}zV^=o޼ロ]tbd?1S8E?=񣙾b8n8;X'|YtiÇLuSn]}&Ϛ_ɐ59|r}Ό3]DR8 TJć{qյ^K:X4i1{xJ17,+L%!ℐ?-T%§s.=J)[lI.\(\jQ5Up TuF^_>**s&u}6mN?Z(裏VKХymZMq{1?#f^FAh-֦Y2iK2o$ÝRD!YDtLҸd 堊"Sg|(kU@Z'3ItY'UV#>X΁h~g@FM arocC33'NXh&8.1JmTdC FCD@\/^gz򶖸q#V#ZMiݍ= PK̏c;bBMDikCmW>t3lb>hر#l[\C2|r|&L-JZ0%FjI74 pQFH'B娘ys`5^"i 9ʨC׏AE)XQ\jI9u~sm~-_4*uEl?»Ʒ7`HwZ&kAc#bc~-8&fl-|RMD 8ODPʟz) ;.jkή{Y/N%58עhU9J$I_hoEI뱈ҝĘ-Z@-ƁM6@Ԣ}@l3R7z%p(a-d*UL]<H!hb8E-cZx 4o(tWOp43'",zF`BƐ`1عPIlRjqCHh™ =l(6U1+bI-thؼ"S"ÚF5|-_OXg֭QNZԯL_Uj$ژ"ԇ1gD񟵘џ0ۑRu5 1b=?nRJ@l $$V CC_CDZAJs2SAzvScB0j`xéEq(JxU>mBED$tdwnEMd)S)]jKNEDK {2+`Ɣ hUN1ĵPzZ0}ӒZףo0[fP1'PK O&?L"1PHꩥEP g*pjjI|K8MePPKfE-'("q25$+!n{%Q{2W*(LfojC-SK$_Q$ō tulZʐP 343-@-fˠymB-1%(͒Ud!72$B 8!i@-V3>¼LTmc}Q˃M;wTW 8f"u +K{F;$NQKx!j$3$pNɨfNΐR'jqZܮZM-̠={DlYӇ)&YЋU~8 KZE!r Kq]"Yw9Li2Up~JVHg7 I@%33hjj 6K DQG:cQIlXP Sd9?F#Ԓ!&of^ǟN8gǴK$[Pjq6CK-+$lܸ=ZXOhD-KX*$iC-SHcy5k2B 9R=f傂64`5f0ыTRԂf„ 0à!:P`SK8?tN;PӒӎŎPK28Lq5gLtWi!M/{RK'"`Q#Y#JD-jqXVu{Ԓ&!.u՘I~Lxjqj%SQ:}J-۶M-~[uZ:8 BPjqB8KPjI) j)nPK}܋yp%tp?]ڠPKPDW;A-N<# jJ$J-]p/)G>3fnZ\"g=:ŋ%m-]pj @ S2|1tyA8j-xc>m]@tw;)ZZqeY6H-,Rzu M-be7nhA-C 1bMjaFX4K045J!HZqI!]jLԲ7bȄڏ[bw_)$ΊԲ|nݺ 6`S8.t zκ4Փ3fg$~-cƌQ=z^^J.\b@SK;+ɂZ֯_I!g˖-!evRKJS;ZF-)).=pm=ӇZ0KL0A1ڵk I(jA m,ѱ*Z -7jժU 7olC'\9͟%%y%{3d&!iWmR\ 8ܞ&-_QKjwZ@E ݼyڅ$%K/>}"V4X -0`^"ZQ: V-NF-N1K~,.ߨ% qiJo?eey uJQG@viM#AwZpQD)|456j~Ҷ4:Dq">|S['!P vv#C\r{H=g$5}mDQCMԢZ EF F#_Ɛp;_d/ FJ)~{\РjIU N-W_aܞ<tyZP ҴL>,%`ЂPKءJZ23N1pA*(v24c!iE4E?q"~s^s;>6]C-~U `_Qۓ7C_ /8'2T~]%(ZjIת~ܞ@V!jjq"XٙoԒ.Sܞ\}k\r{U+(cjq*OZ2ZRqe;RK-/5.rZRō%'ӜZp cǎmڴiժUːnݚ#*q58 %UDؘ{q ( %Dύ5F-KnO^Vw($S#y/j!Iڵֻæ.5kyrfb#Wqo š{~#&x5coș]8'A~=.>{SE\Ǵ?D-)Y}ڇÍ%'Kjq0B- СC6m ߝf_0aQa8I_ %@!Eqh߷%q">_ݽbRNj %ĸ1ۓKKnO_HRB-/X/6)‚i+wIꝝg3 &/ݮNLo۶-9B .Cŷ(`%}Wg-ST'L.8Z<3:UT4Qo6ZoO's=GۤN,ˆ4W3-gJ|rdT:h4 hHځ(3 Blơ)W%?8Z<9:UTD|9.Zޞ#}9?y}juy~E+-'oQJ@е@eqAObqdqupmTr\s!F-F8(8@<?>}~^fU1c801kқ@6o߻-K~2ZNA 6~J.7/$Zօ~z#.P N-L} 10O|_}{~_p '?OO) :\8 sn޶{Ɋujk׮ɉqvpȗ7``tu8hjZP=ZIB JHLjaA'S şZHBj% !&?v>Gc}0BD58=G8e/-;e붢mf>980UuYs)^ۯޒe5AS8Z.,z AZ j9؃8Nĥ?P Ij%$Z]1t˓?2}G[ 9l*_ fs.Vo`ņXmDsq;N1684HpYt -M'j9h@PJgh'F:ja! ěTZ =_N 1)0c :ѷ߾CzF>aӎ׿pٺl-Eq:4\v8fhqH[D,~6Ԓt8\jqp3{iSK-)$)2j~-ژDf H08pYpٳG{aĉS8@ ۽dy }J5ltG¯l|uqHǿl҉ZfuXSoߚSK3g_PK\iI @ jc,g9  ]0Ǿ%'e)Knp7bdo1f5cǎ*8_2qpu QJϽȁ*J%CooMljjI!$ brw:\m}J̧NO_Ͽ3K Xד-;_nnn={^4Й|-6_~O8eCV^Z`#fԒ伜ndHpUHbR?ߚ qB"enYj{C:zg1h\̝L1Ȓ58c^Ƶ©?זǾ5ơeVZ;7nP&N 8J:QK *$WoMlj+jC!OTJ! 9 ݶk?smy S]01?nh#+6}8s˳zpKQЈIC  Ͼ<=_q/CKp!r|Et7PDž;÷&D\@ Z͐Q˨QXgR@CS36k}Ѡ>r´yK3-_lqzqsp|v $u\E- 4+%ͥDQK ߨfRF-'m‚[w0ɚ[?<_|(0yg_:|0eNS;}Ǫg ġC\ХGH#Kbq-$v;B-B- $ ISԹԁjIjM?j+CRI-\^4f,a4`k29~}w\v_Q”Fs~k۶mjժ=lOGǾ@4$SK\w1$!J-Կ*RKb$-%'RbzPKx_TR qէ?s0XUhV=ifW Cl͛pFd4$RKw4APKb$-%B#R%oߪ`P ҫ f39Sf-&.mt8ZGB# :4q9ؼ2$%1 \HZ-$iL-q=w2W⇷Ɵ3eqi0hܹNb2Ԓ@/Z+$@- wZR f16.\u#1ɢERSKI{j!@-mFbW!IojYHsj1ηbXPiӦacBwf%A; /miL-qտ⸐⥖ IPBx4;_Ԣge} uۚ#8kbg :X:L9bmZ6$%f!q5CiJ!Z,GjX3X:b9KojYfTc]}|Yo!j.$.W՚I 8vEE- dj㉜dǥ7>la%<ZZ+ f@j($F-ߚV _C]V\j'9B:/sZ_  B-))$ASVxM-+V`şfgg,[LgJx1Ac3B-61XjbֿH-hj ΁E,\<-[ 4hٛ7o޴iSAA˭e֭v%//oK$! 4`f؜-J&]j PK_%j1($xkXj'订yMvg[7J'"PPdPRvVD4ԩƏrU98={뀜lk6G8޾S H> HV H00GK{q>QmӶ]YFXL^}ƚȴU}]fjj|jjwjaaG,[jxΥWqxNX (:v6~&9WwȉvE*aɮ*Gp4~v$B[p>WeisLE~ʋ'5HjEl-bk|[ #ac߶syx΃_ؾ@>bazOQ9*W[cܔq1~rڽ!Ebk[IV HH1ǪuV6'[ l|t.s-4%•ؙ!7+C΀"={ukMPPPdP Q s)2>br}_QOKz#߰AE|G.g.Q&+khņѐr}6Q D~Ș)EFjj|jj#jѮV`bg_8c'?9'_|wɃGvcƻxwDH+(}ǧG^Ssgoz' Vnvitzjj|jjwjѽ0[!6E+:tDR|ݾϾ_|'N{?c{?w.T3N]{M]|~*,(Jw%<',0Zv8e4S}n H> HV H;:w9mQˎǰUЫrw?"{`b5_|ӱ)lX5@՛?@D zLʷn3sn^~$\gskO*~5s7HV Heݦ 9g {?9e!|2xwgN1֒e;•c8͏>|ڣ_L@9ұK-gz"zjj|jjyy{tbd9wS?`煆4| דv;(y }!Uw?r2#~"?\3)^kjjjj1Dك=|}M˶كT ~p"+!oW6{O1D 7]+@*N?)aclD X Uq?;gQW HV H|-tmμEZ0N0o^LJq:'N,Y=)w>ש"*3h9Y+r0l!(G:`t3 2wa?\?gZ4B-B-B-B-R6|:7AC۹p 3<~/cٹf,XգW̹qw:zR,|0$\ύe;}j?ث]jjjjXD2$x}έӓ/OuP-dʹTYh|'NrW^J>!N H> HjjI͚c'NcZجܴm{@}Vnɟ2;?D=zXO.bFNqV^9^)^󹽬,PPdPP ^}\Pl.\.䏙2k^:]6rrd޼y ;|"W-]f H> HV H 3g4 V3rLD%((((HrO}ćXgj)~e]E15kD, H> HV H(7gj3\kJ jj|jjkj#'Nq$-ܣ1IMr'<~~MLPPPdP ?RPPPdP ;N?;.ZlH>" j{9)"""""blZI-DDDDDD2CmPK0EDDDDDDDEEDDDDDDѨQ/)UV\YZ|Qm8,#FAM4iƍ6/pBuPPs0- 2+:_-&e   K-j{Μ9999l OۑjjIgjy^\"thjW/$NHĈ:>l޽;$4E'.1r_nb6-[VV-D<ɰjJ[H;&ʰ<|{ 4]%9A=iQѠσ>ȵ+V{I:w:6D@yg&c 28ƩX GPǣE(E;j-bCTv +wU!%F-R㥥2B~R[-"%v=4_K\clC_vmNjL׊$FjW02!ec<>)EfQ |e*"FLR/O5dV'\d ]'*,s;.*a+tKO- IW3U3#""" ҵkW y304~RJWp CN+g&71"Fyn% L2^':\3'`p KIRh0^e$ZI*ƈE-XsOmj%e$nf =gchxIZ([޽{cZ""PPH VGgTZLjJ$jU;U)qF PKJԙ 05i{.S#J52J`QKՉ6WQ CCl-"bkUsUŠcJ:iC-?:oXLXu!k,)CL-~M'JZp A[2e\jKqggXZe9n IZZDJUW\Dj]Vn]u)-9ڷ__1?m6jJ)d ,%dgqF)ѧ~7n)jjU*]T9'СZmKGh??K]9SNjrtC؏jܤʹg=XICpjQ斋/ .io%"H""Dêt<CT|yC4M-&6m{B'ԯ[X\LQ%0E1$WƝf!dz1<1jIHMn*"DU)j΄ >io%>HK)rZf͚mFܥ@7mL[Bw  GؤdEi6R ËE-onk *Q嘪p ED%qZ0@*xn(\nO-%b1C+VP5p  wT-NFjx~-xOf}PU$+joH1h֝&pwW&誩(ZO?؁V([ЩH-oq Q,B-JT9ʉV9QpjjqL`NETj>Q%Ҥ%KZCD$޸B-B-JT#iZqHxA-3^Ȅ8""DU I/ʞpQ%;sZ%3 Z>%."DU jJZD2Z<(Ln6D1ZbPU6,W4)R"W^y%oVH੅ Yer[_Yq׮]]EU:-Hu}|M-|u].;sر)hQѣ pCR _HRsYٳg_Y ]ȏ+"JjrOU<=`8袋ZhC ЦZHe߾}'//Oa"1۶m3kݹs_$jU*UIU{j3g' ?W\qoQ[;.䒎;^}{nÆ YΥbŊlWVM/9~6h@-k]yG/bi~A]R"D)BIR:GX3 ,BͬFoݻw?m-EETxR+UZҥKרQ_즅:` .]Yr4Gw,K?N۶m5CRj︪͛QFz…\s Q2Yk0Ɣ+WSN1ui[L,MϢKȴpdjU*ޯ+W7?+38_ WZ|"a5\uzM4Qۭ[[-,Y^9syq۷o/%#@*<O<"ink .DLPUqW.fo>CMސh[n/P<~aM-ӦMS&SYgUDʔ)CٌZ6mzmmܸtޯUGi@S޸,$4gwI|2KmPp2ؤmZe需:q*JFja:򁭎ǫS$c-[01z ѬY"bPZDJŝ&0|B*q.S.  qD ̦cd_S:-B-J*7jtܙǡxժU82IF?u̲xjQjU*!dl/RۿZ)*My|}݀,ƃjR7tEj$=v We}?|&SNǦ#xaa7sFeƍCNyFS)DPJsj*ZNqGESy@ mh#_b U|y0v0gdxB-! aQW>1 xnLubk[UJ"TSo"?.$c#R srS5=ڇ!\zu#&j) { =0B-B-JT* dlO &SjᒫT&`k37 8?1޻f͚ldee1>`21RKuB'*j9ŰPPUNJY$S*G&*۬XPk1B_vdhkC'sE<%ZF_#S *Q*'?r\Z|K-oi(((` z)SO[~ Y݉_e8 ?bs9YlAa گB-B-JT9ʡO=%?S hgFk1 g 08|Q2I=C zGV\~CqcTPKp^1!9ŰPPUNyB-ϝ)ς Z eFܛsssZDA=}| S <|+0w͇8po!CW?Qge˖ŝ >w%"53gc=*ID֭[^#GjUʩѳWğ: j^ :©Tm~R Ƚ6V xG-z5k#2lذٳgk1?1 { ۜ3sԵÇǁYZ8A;3$N+jiɆ$NМĈv\~ij#%S2WjUd$dw(8+Mȑ#O?t}wh槟~2Q lp Ts|Ӷrk=qW'Z"JOjM.5nJ l|XJ ЄE6@a!aR@!V6t6͜EO48'??_ET%JƮS?N:͟:uJcrFjKLp{bfԂ RT,r}ܤ],8x{Ujo:T0a1Eˑ:+ g@$DazN@9AWlh㊢lyVPxC` mpk>)j|FGa,)"J{jK+ӝqU~GݮzU_|=~%b,S #5?Ims斿Qm E^ytJ]EX4`\Qh V5\]UG q\%ZX8.;2i`Y%B`Q"yު7?9cǎ٣.j|ҬY3&a?=q-Aj},6{_CE*gnssn~CGj*х20$Cv>6E;@&[2Ҁ*m-ӱBpzRH`tg;&l!'nB6IRI4M!4z1`z7z7ƀ1l)6`:ݻw-҇'[eKGhOGҜw9wEN1nJ*/|~?3? q;}Y${^ yp5^K"o,jd_|Y TwϚv+v6cĕ[v2}֜.^~oBHM-( 6)_H#|?BK^=xbӞ‘y-|m&W%ui8/$עPSR۔[{kټe%vcY@ V4_|q 1Dv"7p|.bw>#?k}Ӂ=M5_irǿz\x+u&M{uBl0%`Gja?iʽXb"S ߴyk(0bCD8J2є&]Utj!ى,7[ZqM`\\9ym?rzKqS죣-IQE|T1QtU֚\D-M-&UV^Y.Ψ?u⒓~9}MKbaeGOԹO![j. ZtUS/2ܔ P COLf5^G<@+$:.-3%+NvYs9qӇrOvDžZ?V4D"jQSj*85pB-ZJ3AC5[qj^xM;kFY,wfO˯6;:h&-ko윓8tI.G'|e)HD-j*2*bIWe)EDj_)Q >uY^A-H.KY==╍ڼ=:uܠcٳqe𾤤e;P9 X#c‘Zb˼UZTD6僭c_̉P)Nf36l˒@+wڲ֌#:/} LOXov p8k ]%:::ei\߄# ZT*JM.Sq HI@xh$f] Z2e1), &"%6mY,{jYyWھRtychQfZ3hZ~&j)9j^pрEM⠀tU &9ZL.I1no K dRvP3Yp\WrwfۺdWvdȅ]8f\ ڿeǾs[Xj)TѢ5U0+fK-?<qc)P }f& hIY@NdJr }E+_}q6 48c8 6glؾ'uˮhZmFYeJSo3EԢElkb u6!jzq|B/ .]^{ȱN]z;|MvL#nY5cݖk7hڢZ5jB}W9KyY7m$jpJM .HTZ~i3gSߖzq8WhBćXdq(Ld=q3$.nq[n۷fcZ} )Pˎ;8jLihٽ{7+vsʞ={ؤT?g6eYpu޽{O:u߾}nDԢʕ"R{<)TP 6;˴%+M}[ÑtEp=)Y9[eqb3Y .Wxnߟmeʖ‰@- a̮$>6lâ oB\:dCXgzZ<"EM+IJSBB1;u&pd#Ł,cюY=t,{@ÈQrTߞ|Me&</;A"2]|&sfb83'SLap#EMEXS#^rZ"Z&u;1fgx߉rHhPow9'ϳ=qH9. 34Jt[aq1OHj1yfJ)&Mrfov3Y_b NxӀEME@S!^֛wjI?}RK1-E"D.178*:eQC$# ).;}Xpld;eV[R uqvbZ[1CϿ"̕ڸL#yT7U4dԯ?$|-RWk)/jiҤ?Sef *ZۑrZb?.Z2bg-KI>yVE2YTjq,ZqWRSj*/ݽk'[lg6`i#o.q חnj1'>x쉟5kk3q0 6GZY!s%I-8ZN](f,X9eI3{7>YE-.Z Yb{ݻbNi6g3<LOANٺFQhnww*\|-,B6̜kg-9`%::߁N%D-9ԴN_1o}(jA|IxfPKMzW}ݪm4">df!\)Ā.&`F>1Eˬūqǟ ckX_Knj*]MZ:^Q|y6o{A7;7;+UZu>Pj68PKMOF ():%F-Ǐ7-\:#OM5O}%WnD&9*Ö ,YuҜWLIhm3da5Z;*HWj*ҩ!q-̱=is@TҲj9g|MgO!2ĀԪxSΞ|,;DJvlVJ"G{=CI1}(1jAyGW,?֦?_4:ajSߖzq,Nޜa9S9Jʶ}+RwK\7+#'r ڵ bZ"ZTy]M"]HK*V/> bŌmU/ yjsSټKʋJ =ЎyCIR'?So Է5⨿b3A&}XlHԢYTY+5Uj祺1kv="8SK6}Yiiqv()B;%L-gJˇ2h8yѓu7>xzݺub-j)[N܉ZT)kix~4/|9ȑj^}Z\9{<ZPhǂ8:`jA͛ \>ߠ7Qww>FuѿMtOʥ]^xĢXLQKSK9Q <WRS#͒a꥗qVU7hEp:/fL  ;rWyٵ4?c^Kڱ0q13"j)ujACҕ*LB?f[1QfC"~T|Z܇]vP XPEG b4ř1>>~ժU>vtLؽ{c:1J3c~BC-~ne)/JMjh[q A_WڵʼjZW_^zՕVgսoY ? &L邋eC@-L_|9 I &'ZիNu?(ovP?࢛o٥JMj Po&O0tj?Na[ѿ`2d)KPY:uY4iR߾}{ .,\мۧO`πql+1#BF-D-joԔ]9kOSR%}OԒ?b_z%]Mv:u⩾8uȨ3tѣG>gΜ$\+ЬYzIRK`C8V_tUS*+5%jwB,('c_D4VB@-zLV\r9"K.5p^X(b8,pͷ 5UARSRZ@-3f0 k'N$0L,[$%qʈ#Fe?7d"C JWj*AZiAâ`!}'A%A*#GZCbԔoj*B%Zi 00i"\op1ZX 1Ik@NJZʉZ|SJrRSaO-Sh)TV8 =!ŕ8#V7L8ŗQ7oeڴiE-[&0x5!Ԃ3@K1-M ڸ*,TrPME&H$QZ+5%jZD-a@-YZ ,-X*Uh /P")BlٲS;EGGSBhR$>Q!WEGSjWSH"NBI-oѢ(дYw4q=[.4iQQQX劦cQ3^& Y#ËZ܌n)EjWS%C-U")xnnIڄ]1B :rpΝ)WBLFw?vθ%IӦM  %A-5ifjTQ+I$2yd,Z?fg3j:^=:ܥa䜵vѼef͚1=P1! ->Wqvl}FNOǚh؋ĘaJ-6pͷ6EjWS%C-IZ(ˆi1zF}FMkyW&oKߵ? ++W@-clo6d=A䆥[uuc&eGSҦE]MZ$2p$4!WDΚ3~DžfΞձK},>/q5е/xt$ɗKV<ftӦJjJ"tbYܓ9qV<_Neֽ+Džvh}㗦ӱxRlp} 97([rYF/DLj yX҆KWoc$/\teSv5%jZy _ H™qs?msHqpN썻..PYG<ۥKu Gj:֣w߶mۭݚQhU{JZtԦ~)QOZ[4cb7ddzℕCwڲ0֌#feĘ @ ٓut㶝TIr)EeicPTۥM6k6f}Cwf:)bBC-zR-SSߑeqvXYfY&3Ð&'l{di%ePBTtt}!vN88zD{;jzܥ+Iݚ:{P;2jQVDStD->PKmZ[.Pif:pu|9uN2sHߟ@c,u%YȻAj;2ܿnS:EU,>~M6xұKؑlٕ#3=JBI-M)ZMZ~[k l)BxC9kal$<+`cPCM۟1$Kܘ~Zp0p4QJn^j30۝u&Xٸ mˆZ>^My.+5%j .tX\l1ovhovVZ嗙|5+/j6+Txٵ?ka9.wi;v +T9̻Ukt9W^r\J.1}B97\5 DH˖-aʲQI!ٹggƀ \N=ppH~`֢ VtL@m&yUŽZKZ+5%j)6jdH\smlbQI˪]w<N}6˗/toLCOǔU ǎzg7sbK/-hw[-wsX؁iM;i<}Y˯>pZNW %NEMTo DH=4i:vVgN3ܐ7;a0h p?d˦z ^ \p¤'\HͺT2dUC1;K ,[-Z㜵hmfLqp@hŌmfN1:}̩D0Lf̞'`aGJAPyo2_{#;x;6D DȲec)?ve[v J GBf QS%N{<ϦH:-z, Կtk)1DT>y[ORbo~~i1s߫/[؁żtt.6y'co[W׶G.Z\D̞8~+n\eM;*K+V !w"3?pYKRLMX>qQgE= QfZǐt,Lŷ\Nj)]MZJ0~aL^m[Ge xt 8V:yٜvbo[=b\Z|D_eɖW얎$l,[Һmk> ㇉8z^bޒ1e39Sl;Ƙg;phNj+5%j)l\"> 1p@.= 䪛n4ixA`[MaZvMkk~2~4Ԫc-;e6͸fi;Zڙ~61*Z<%ښj?cz^,yeNSْ@ߑ5/q݄ N?iNtLY2z.Ӽe 7;D3ޱaÆ~Ƞ*SSjR gy+&`I.` ,blN4pM%;}T[w|`c TH-!*Z<M8WHύqDʜ[a Sڴt%$X?}J`) Mw4k,)))(vh]LW:ƄDt(رիKhJu/[jJM jrnqDU1 믫U *o;o]g-ELGЃ0 ^{ۭ/|(fJj+78 yu;*}V'x'j.}NKXưap!4 FMݵg?b.v2,cmcT7hԢ!T&GM)͞ڸeZQF5vl]9$~qӆ7|\C4-d2eJ?9DEEX֭,Xu#ZUǃӔJ)QEԂ|;wn1}xZ:.1RND ҕZD-aH-&Dž\ɀ`UoeTj)iim5D-2G-VPEATTTXxS"̧E-W,"jj)ѕI(d>ՔwarD--I)J>"+MSMZ|LQMZU5&D-E"K\M5%D-EԢGGdԔE" 7j%ZaZR @2jJ"Z$E(q5D-Q%b~yEԔE"Z"bn|E)QD"j)%͎kQ qZ$eKyk ,RVjJD-KiRPZlZwl"j=j9?7}L<5%j ۲^K`ER&7K)5)uQ SKa=R>SSQ%|eYa1E-ȻRVӍՔ*-r&ß 3{8GxqTVcʪW[w7WT+ Xbjp+V|];PvywCzXc&n+oӡo}gȡYxs2\ wn0r2ݻ'$$n1/F`rJMNN?~|=zݿQF֪U8ecN>}!0aٹzjZ`Ϟ=/^l0`{ĉ׮]N-։48bĈ+VZJȿyjJ{2}n:{zKʗ/١={@ms@)MTW`SN`0^.]s0h|yC6&qbZȹ=PKU)em^rZZ#G 82(Z}-C_;˗/n p,Y̅80sr 1b:骨%8S^he׋kkm$Gb@ ygfϗcF=OWj)_CC-l/zvcQ~oD-S yDpLP5,"Z.\XA<f<+аa {-Zd?)tJivM8%M 9WdԔ%"+1yO;FAԖ|1PBVGv9rݴI"0bb֬wzKM{!PeXy9vjCS-Z@/[@.]ꋯ9YD}\RR+N-DT6n 5Cݫ_,2TjJMjU LkiaPmwφv,o# XuzPy7ʣ8yUs=l\wjvZQk҈Z5/8W\rlǎk"2[B[W2diNД 6tc9Y{Rtݩk1q!Ra]QKK&ŧfeԔ*l/3B$ImK2;͸f rS΄/lI*&Ȃ熰ѝOi|qy-GBJy-}E-A^}8po%D").j1~D"X_W(H$IqQD"H$E"HJmW".C-&L8qoɒ%7ҧOe˖*HJaQ"P9)=z2dHс)S >߿9s2{UV@-}cE"Z$?KnXvmrrq,jYhQϞ=i$|* 'F"HD-Wj1AIYpE SN4hѣGA#F3fccܹǗcmBo#D0OgΜ9`A"HD-IYիW?0 @޽{Yȑ#:0!AA,XR$C6mYfQڄKR@#oĕ`D"H$eZK^/^)avҥ, BxhA8ls˗ϟ?ڴH$E")C)n+W8d@ P1 ɓ';yٳapX"dpqMiŊvj)Z>H$E")[y- _,8, Z5jC* ;ЄM[#D"jHD-C#_ A0JL.KBBŤ,aܱ ƿ2}tˉf|| Ј@#jH$Dy-WHn%g6%1䗐;1P NL^|$S ӸIIqb _*sep1gZ$E")"){-bW2%}'|"j p  허ZD-eEqRUƧ4 O=ǿ?wiDK~m> p??իW'x Z<~m:l׮{>[v"<Ĝrw^{"KdKE[ԩyvx&O+BW{${֗YP] 4q⊳|.+K]" q#O=o=QK`3XFiӡkߎ=X:tf@6aDAe9'k~MkgqT1gԔc8c9`<~FZ1aI!6Zx[. w:uv 83Pދ-ax!;cu@I/kSGg0 Z<#|q|S*.Ǐ'ѫ͛{ton{=z힟=;67zViG+ajHhs?Op9֝۠>Exԉ9gMv HS7UFz*VXOT qIqpQXmٲ%XݣB;fǬ?~|\h7Tj'?\S8n 0_.A1#p70ūv+řc<撻P@]Tm"<ĜbQ?3cwdZ[7@#h2x<[0`'"Xu :3-U]k#9>5N1уuc0Wj[owT%#ZКHP- ?;x[8[\|-8 8j3.XvD/ kc9ń*>p{/ A;Ţ͔ $p6zkA.;ɦ@/Y ܬi"qp?ԫW,jq_|=tk'cG _ +Hsai.uvv,}bX8_~<^fV[Y8BL-~u8X3fJ7w}8ӓQu]fЕw}gb}jbSLȘ۵^}D9~ %G ob=]͝KF%7a> .QRݏhklaɬ$F\^Kk)s?Gfu-*@ KwqzŜ+Έ[5@.58ՅZ,3`_+RDj1^*U_Qu:7wC-?Z S =Š6OmϿ>EpuBH6"% kQP_KQKėdX ~@|( ISk>;jFJqHF "}FNռEN:8bT< +l6o"K>B#-۴ARE-e&hI*ƄTJi G )8hk'Bh2)D@[EJxJ,H$' ;?ct>jL4`=?[LY 3\tjXoV^ > wp~pqK@J~ S׮]\a.&y$cgx쳋_Gxym=!ܭ y<ע{Z|IuqVBk.>9wje~az-ZZ~bntp=g%V[?qmyϝ. ;yk Z22z&٘}L{8} 6iw-cN,UUn̺W)w7/g!oǪK@$d*3$YL ~KK(>b\1i?""Ht7鰾EHQtj5?2(aMڧ礉yҹsgHo\ 3b+nw}vQQ' })|qCne=^WZ|Is(U!<C+Xpn~+6B3zt﨑G-18h49zMXpYwXq_8[nk$qKhӞ=qBι[Iĉ哨6DRjvxY [4x#'̅krϧy('nYqFXgCi\s!MpE"ZJZFYҺ]4^@N*ٹgvIM?v{fJf'x,(s'N5UhA\QE~={ U3-ZD-$eo;,]DQW١ I3"5]Eи0aSæ|Rnm7WLIw,}e*BO-^þ' ;ual+U:i͎p~c'&`Ce:ڧo^/&Y8{ڳ7jyY(f14߁%I-ˌ$hLQ/- D4j"̎w )O zgn0mdѻ?R{-REo rf<⠐,_ٴ+[ޒqdsٶȶuo.Mhρ#{2>px-[Cw0Zz%eZ)e$j)gMZP)t e)>PʝU]vʠI䟯ᶶqw~}gxrո쯰X1Pe.3ޔ*BL-M4>b~Jk2ȂeW lw%m_N~/m{vHpYs_d8YY?a`Yj LK4)j C 5阿NۤIKW=p0'&׌~ƞS TO8TIׯk2aҔ;vg=Nxݖ=_5nzﻟ>fpǚG,TJj!_NGui%h9~b]oM|d10bhǁ\;2sz_b ijigݙ[w_9rB\ QESRׂm:it0fn t*UZ EwА mܼ|惹q8bC,dI> CŹN'8.۝ݲ~vn5cB.a5bF4)v [j!i MOOjX"O:%j!sNu8,΁#Ǻ:ك%Ѽ3H^pk!vöN/˿ykC¢exY,p!97TJjq4$۬y 2m]t` 2Ȳ+{;|b8'{:(m_k7XYV/6`JL-D=F?۷͍70(QKM6[LKTZ5&cqӄQ(`3_zȚS|?Qj1=aRL-`m,[p-%ꑝe0̛]35-kYG:s|{#SW~}骉g}iaܥ7ؾ`CGH *BI-u2uO}[St8CY2rR9p/9Sv1K8sQSJځӒoOJֶ]w;'|xO``ԲwވnFWPt7RɊiX7KB-_0)jaK8hsu%X]Hq1Q#;(GZDN$ 8r\' wQf֭%kYD-od؃?_ev׿ʉ'͘ {7ol07}Ǵ43py;9??dg֩Wi.[nJ*5j .,njXo?^{)N,ʗ\r n{d?58 a/f[8xym۶kffsfB1-32D]mƌ!E)>|f DLgv2b#Vݎ1+V&8{Xf2-reդI-{.Y}.}X4k<}pUaҖ*BL-LlbФCpt.;Zv$hq:ZH[1^<+ )X:9 .OB|PXb5&oֳ72W҄ ~T#rj.o1{Y0`䗗ePaBN-;ddd9bZ|+t{˖-d~Y:N(\U1D)?,JBpisXGY>,Yffuv׳]2H-'ZAuS`h~>lv999~) %C-a;?=7|ͬ?S{Qs2l&}T<:&*:c:6hЀC!*}ρm!1zCL)&fƝk6リVgl3^ z{?59@$-[^Z:=dꧯ7`]Ӻ-Ԓ5{}[3練:`B\U 6yLjq;Z^бֶɗα뷤|Y.o8^ZZټdE+SZϟOj!2v҄rELp2j7nܚ|83X禼)n8P o"X„Jc<% |p 2LPɈ1ºa O2un%pv2Ry-#1 p9yf͚Ew& dpWo"wjq?BaGo(b{tYYY@jEVdZ,dG̼<67M|BED]wN&GP`"vց4U\D |RD(lfrGx<39Sgh9>``}KVݻeR>FDEE*«fCàtZrNr{9&;@~>`=Z4c|~@-J8kQ̅+W@?a:.b\&v↱pV7$}T"L>!3<oɳP "6hD%\뵬_OzlժUFz-rHŞ1x$ 6O\cΝFs(ߩCлヒ> [7Ӏ8|r8HY%xd"Z qJ0;2GysN!M2p~'`9  \0T:C,|t7pvΉqjl0{2-]oI`TauRE~@?c"*Sn:3nC=Gj tRcNG BI:kv拲G-Zm?2}i ];z ~8S")ܩL<9EE-*ƪڸk3-.~d2Pt"sis5FٟX!] mEjڼek&NO Wfr^vC0bZPyK ۩sl Ik)UZ0.'lj=f iS=08ZeZN :(nfb]^:wل ZliE =ѲLq0M8bXAe0#|VO |dD7v`޲KD4m2oD-QE_G8P5ߘY3$P$m{+7I gsOtgņG*‚ZHJu3ǨǛL=k'oZ~tB)S9K~?k+c{@ |%d$Aj$PWKlLl*h`wG@ё2A1nOڸk挕w.NP݃Zt57ϟR>8C B#NB-) :H5?hشyK +f<;8 KӦ<"KiʱH$IHDb1bGNƩNJ"}c>}PMظFNA4oλأB`G*ˆZ4"KO8c;8c{$&&F6D"jb/lPA<0*vq/j1_CaIm@];t>cVm\]]&H$IB*9~i,śP\[\U8iTQ.D"HCSqfcO+.1 0Im"%Y۞ 5M"HD-/bs4/GÄ?XgH{ۢSRчիG DXg8KLhUԒ?EkB}D"H$FԒ?_>ڵW+HD-%4.Jqqq꺏3bO֭}E"H$I$XE-D"HD-D"H$D"H$QD"H$(iʱ|̊+x@P 0xRTd!JR K"{ +JRT*ZR0JRT*J!wd)\ddbRT@*JP7d.2RT*{ JRi`d.2RT*{ JRiIS/.2RT*{ JRE@*JRT*Q.2RT*{ JRE@*JRT*ZOJRT*J#ZE;JRT*JT*JeRT"j?M*JeRT*8j Y,p=JRT*JE-RT*HREԢT*HRT*j=JRT*JE-RT*HREԢT*HRTRd1LT*HRT*j=JRT@*JE-ӤRT@*JRQLT*HRT*j=JRT@*JE-ӤRT@*JRQLT*HRT*j=JRT@*JE-ӤRT@*JRQLT*HRE"{ JRLT*ZD-IRT*JXT*=JRQE@*JeRT*ZdbRT@*JRQT*JRT*j&JRT*ZddbRT@*JRQT*JRT*j&JRT*ZddbRT@*JRQT*JRT*j&JRT*ZddbRT@*JE-T*JebRT"j?M*JeRT*JRT*ZD-RT*{ JRE"+JRT*ZdRT*=JRQE4T*=JRT"{ +JRT*ZdRT*=JRQE4T*=JRT"{ +JRT*ZdRT*=JҲC-IRT*JA-D"H$!QD"H$QD"H$E"H$E"H$D"H$D"jH$D"jH$D"H$D"Z$D"Z$D"HB PAD"H$ XRE"H$$L+%H$$D"H$D"H$D"jH$D"jH$D"H$D">t,H$IJR+ݒ.Ԃ[t,|oD"$L6t/E-;i)E"HD-ZmYt,0L-x/\"j)ij锺ZKYD-,ʕ۰~^Kg}߹E"j"j)%Բ`|-x,j yfxfZD-ZD-_}-$Q7qRbZ|v@"j"jD-c%ZD-QűWΓOj3˟IgZ$P%|MP bԧOGGG=~s%3=V^=wu|-zMv6+_@Q%_=|=Wk4QK˖__~ʕ{ﵮ][vܼ~7JQKSKq.o}4yw߰q]5j>7\__kQRko~^F`?Tz+רy[ホYd޲NtjYbūnTԸE_W_}sϙ{Ĩ6kK-FX"<fO?mwΞ=z\|\yU嵄Z^!c?0Eww/-Mr7w}b?aB)Syo﹧%TT7GoN<ȼէO{ik}GO喛6PRrFƘw|5ުTj9q\_;v#D.F獒W7ە+_D+WF-Q$||-;vdsĈfoֲeK`v3 wj>nv\(:ছw[nlr?.rmGhSԬYq+/dƍc4hpw^qtjժaÆ-n+WFfO_|E }v#%?%L-v7wgW#/5\eXj˻٬G&Mx啗;L^ $?hN曋'VRK/1' k:v_qu;U&z \Hq\z%QI˪^z)]{ V ~z:710j>o"D0joanFc0f'YW^y՜b*Tйsg;CzG-uֵ1Æ  f?9:uO[I艊r 9 U|- tb|O?;\g~GnZ"ގS <%竮ѣ ww1[{D̉՝ M8Bz5ZŗҨQ# ; &Zԭ[7xug:y愍z\\W\ڵ͞kɉ1>c(D)YZ Zjq&>j>|& aP ׬;(8Wdر9w1Ua%p* 9B (+k锂"pͼ%.4roEET{Qklkro]gLs/w·<%P1E?%~jS.RܖH@GtږGkCC4544&6g<.1Qn>H[rssSf-PH t\By!˦TTTxa$Xr+W*2ʢE=}mLεX]oOkP~!R;tni;*$#nr-JK͵X*գ~r… ٶ};YFڋ:kqo[gEB%nl8?Ct߿ձRCokٳg|Ws__Ggo]K(k){zZOhiiF;Zl\]KAVȢ#MQXK*ZD;okn2:vվUZ[==k^{O\k>2\i!XQ߶+6НfgֵXC>1000<gkI8 50c-X <x$fO Z?iDXܵX  גIVLgccpkZ ZZ\ `-Z=/k\˛G7֒jkZ2Zno|͢cðZRj-Bk.h-`- |o-k_?kGqYtZZZZ2Z2 kvJ"g# "{#VpT//HJl:AAYI#kp@K`]RBgK֩ HPY . ;IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/pad/images/padrandom.png000066400000000000000000000432371506652756400245170ustar00rootroot00000000000000PNG  IHDRF)MiCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|Nz#7剎{l+C DNoo?q᾵S@Ѫ/ƅ#|xAa~SW,0j@;& "b_9KJ%V]R"C60\TRA|>y:tj"[4;ǖ% V!j⚑h)b,Nڻ5{tЉ%)}mK-cV<V~+Ntlߙ{UgwYSasɳ$ʐ":ik>$`i@$H4pPownH7lj6|hqE5E:75 fcv*6A-E5[A гCcl]<折#1URVte:[:1~٠vQ,20`\7qKa`yC}Ĕ"t_ta1'}6C?сֿ΃k]kb,-m_ظEalSڵj*Y6󣸢hMyf~oĞʖi^"}PJ<]n?(>{ujLZ!fx'ASwłzTcxo7o#VD&AeTk9;_/g6/MZnMk\nHd|;X5fa%u\5ƚXo{V*,cMY,ź=I6p!2hQOca:UE#u5{W^b"~Cp6Ty/l,:V:X=Bn:a^Tۤau?_kjR0@Kh*+k[;vP(z'_`4L&DYrhoFQ _mfJm&54UC QorLU0Q VŔT`ZS^BSYYS xb&aÆ!}A !_~X~-/&/L}4&LPj5i)">k25`ls;qD @FIUF8foM1VXĩS7@$\ d FApڵJuTךrR|ADmh/"P[ךP_kjךb{T1/hD &4  Cx&ءZSN`uWzyL ?f2x،IND;gZS*#d5(_vx8I [lQ&[bnʈ4\Vm&5J@`L(ӯ[N>hQ Vr1٤kpʈ55YkM1YEQoߎJeX񬢂`#Xșg8zŹ(X^8}[1Zƚreݴ |oaA$ AAA>T#QGG D&HǒZxxpEwؤkph5Yk%ገOqE'R`t C /4eX2z})bE7h'xtM,skS,+@&V8fyIN 6A(;/[Iܣ?&[:AoVk`pPebMZCɓ';gxXVѶm[TmI\!bkk/APca.<==A!a|[P K pĚ0?:# _KD"}g(lҤI³aX+/g .^` o!6Ƀ b֭[c<8 %lRmۆ6uHp.P>|M eMoAk%8 ..y}r' o[MzjldH&٨&yFڵkd``y smF|b/ˉ McbJ-qo~0䏫P&7^l9RPli.jWbU~ ~1٤#{ 7wc.Xx{"G-Xx|ke>Iɍ٨Ļ M7* Ik-RҡCK^_ofђ;t'SXl^ĮW:lRm0;X4Cq@==-`("ažRA6vXs7meWO_aVnnfܞrNI ,6k|3#[g{nd?Iz?C %_g/ͩo?̵#(/6A6|͸Ø[^(B"$g"BZvzvQ^}lfvMM̃gf%_0٤Es/@;d7_hKSgRΤf5 WZʳRo?y>x2ɋYvÌ[{aC(٤KM ?8zꩽs&-ùkxAVHJ~ v=~N{'NjkxQI&W Vm^wkF4]^T [0moYndD۷b1e pI5v#35z33[IՌia:vӲ5^p%Ea{ꢞl"ۤ`vÛwgğdʼQm*lbo-J*٤lZpgQmкgЮZ&£wëZH`xќu.5^v[oiQ0pΪ/)TlbކJ6ݻWYJGn1!U۴jZQ-p \z SېVӬ7 GRo^HI?|c_jy0Zđ#G ?5 lRM.8ƮHw0Kُ В-YY؛0Q7%\?{9mGYkjjacˑ&W즡gضN xD3яnFӺJ5j݀Uʀ OLG{j {ҵĤ'7WsvA91cƌMJ6GU3vܕQLmƨ+CA0P.#C\ iMc9^A3[G2ZR%0HukvEnNXfޔWI=j;)3'W;LVnӻkEYψA`:]ҦjG:hf-In+\<͸HXDL|lvڕJ6G^@i6un#Kh`FzѴ vAꝇ/(>#FCǢvw1 Lt"!i܅Ejݺ5"PKm۶MQWWW ݹ'RDz;GE$As/jd{_"`ѻ:u4fh9iwр]H/=}aQR-BuB&ֳR^&r':ǡuḮ!I Zi.+O4d+iNifPf i`7&|tӾ_ؤMzw=bPD'83Ea`puIC yfPc*lK6&ko{ҷzG6®$xfȜ=]<}5hFKU(h gR'ϚK-M&פH{^}_c֮$xV ~'d7H̾)S1l݈çvGwU3{M2h׊BȦ/lRM}tDku/Yxc"W0hB1C'wGX?$:zǀ& _ """Tݗod)L /-Aa?h`su*x4cq`㇯ n3)q`w;9ևٍ&?#߷P}Gv)72gS20ґ_fr} YE@<$ )2o>4LNbw4h~v! ;~!.RQu !(lR1`Su}_{ccc:Ǘ;5{)]t8RxD]!G\:t(lRMbݪ[Vy}D܉N쇄p"E&ׯQLEiw.<2ƀ5[#ʹ0o<_Bm͖-[S0ӻA_ ..Nu3|eWudk!¼-ر P4W ][ \fIuG45G EMsfܘ8'ہlR]vY9_|Fpr/٤͏ʦ oX9Pd7QԮ_H6hNi67і]V^mj{C}٤e;IakwqV~lNM&6u/ǻ:٤7൘x2G?lݺ|F -&MÁ ,Bx9`6m3bo1hM/A%K%KP R _ _ _ _/A_/A_/ / /KKA<uH%m ,"ވAMA8 k[ AP /A AP _ /A AP /A AP /A K%AP?X+Vla>t<^bɒ%H3~x'{_Bi'Nxyy}w}~ jS@]vS-QDgΜÇ;+߯XWi۶AO?xOOOC5;lߧOd۪U#F5*...4 2J*iӦg(:;2t=޽{Q۷  EFFR-5uw:uO?-YA jժ5jpn6 CG!\redhkoLL .|KsssԩSÆ kĄS"Z~EV CIPtRĴh-1B|;v(V>LIg̘!c NիUw 1 .tn6UY|9"ԩ,0"Q?\ N>=vXT;j૯jܸ1$IfGפJ+.L֭[g*E:bP*E *`qW B+,;J㏑ _~ha FO-[B4iAqdؔqڵkVҥ *N*3#)sNÀ%0PTV)Ot"RJ`w5k 3%ʂQ[.zsiFQ3B ?V$ïWx.`Dⅇ#k ?, }vڮ];6y:Tb!oEVSpk-[,_/Aӡb(V:xl11_D.ZH%\t"*WN\Rȫ_ЀÈqfA6m2)Ö503b5_~_?qo(c1dFdhh MlpcYs 3;mڴtbHtXM6I0ts'&=" z^ӳ)+0f͚!~HQCm_iLŁB97C񯳦o~BV4=퉲AJ"!:D0aذa)**J ?xޕ=&XMg\-bNrr劙e;KQ.JEC|^`ӳiLh1m RQ [U n`GQ &t,a)jh0`G6/7N/ 7cF~7) 9G9qDy'kp-to Fpq7!(1Ϭ3w73?M ua֭f #`gXjժ%1hE.1قrlZԔ=j @ft[nZ Ѱ0O'k;5P'BmL_@;ge76l<'kMwFȮ0 CEiϞ=cSw}-+9B7)7A"jժ)ӰiSnZ/)MkM1T3Dd믰kSp(&5<ۅ]ID_KbSO|,eGy ,nFLNi /E)z!yDq>V:,jDU1!~"~b!Q<tIb`|e}f%0CC5E/f$d V,adPD7vb6_Q...xD#Σ}3e_~+*D诜>zbA!./0 *x [Ws"st`  o, lz`õp&Eu0~ڡrBˇ*ѣ{  c)1e'fnMd='\[>Złŋ"7ol+VC5C-@@R_%;G*[W;Lu'pVmn#xx3IJ>(Al|cYs 4XA]U!ZW()ttä17+Mnv=wpef^=1c@QP: =vbJf„ (0B uXI0P9=6e ֿv% A_ KA%:۲L+غukl ?Gg1CE ٤.鱓^EMl!5qcgO9 nPlMa/Vpc=ڵkMlRMQ%``>Bd _CU1l@ %IMo +] &M2VldH/vMV>zoݶcO#1{"o1r6ld(/.},RҡCK^_ofђ;t'vR}!+A6 ֵW/}=jG?iEWЕld(/l=3nn÷ʮ/ś}歭\e|&A6b14h͌lU㗷=$-߾ 1>W?4^կ3:$f_qg }1=x=;!93QEHD'ã8ГldGT/)Y3)YgRD+-Y<} v<}AsЬfM|&A6_T]7 8ыw;jk2dknԬ`ޣ<ͼx䩦.wF#dl:b Sڼ?<֌h:j/ !ܽ4AϷ`Z&'߼v?wȸݻu؅lMLͨV|5hZAݴl &!ܸwIpt'6z6ؽY9.2oa7&>dlM_///;rhUGv8vIj/Mm^J-7f{#{i._Z!$d9722Rr+%%X۴*|KRnx|!ʼn:3ne_y]vS- 7&dl:b|=pH9 Cvh`nM )Pא 4'i;)Y3eۤZGlM;)X;K+k[T `~o4,t4dKݾtօmzZ(MI6M9ڬa#Q|mmZ5Gg=)mzH|ei؛L[I7/O1/и05H6&t*5"Io}*¨/ gЊJjod?rpCKdgfaoDfܔ| 잻rldH3T ։h#эhZWI] Qa: hִq Cm3v\tj.('HI6ɦSvvcƎr<}Umo`h#F*[{dA2il4#+hfqhV@&]KzBJܹ~nlMT ڊr?̜\G3*X1Oe7'3f=x.>#t}K頙EhO']g:sg4"uڕ$$dөui6un#Kh`FzѴ vAꝇ/(>#FCǢvw1 Lt"!i܅Ej۶-HI6ɦSo͍+tH]a`p Zvϙǒ+=~mFьSnhYEw! xynylMT:;b܉q(9Gk]5h3aHcúVZxxy MJjY4Ըc)B؍;{nA/HI6ɦ#Ntc8\&GX4 ,1$pɃgeh[$C;k903i9>y*=rgf/eld׬$Mocl`]II̐9s_?z6yFKkЌūPP#7A'ΤC'O5CI"n6~%h9~* 2n1O^"<~!LkZ/5,9o9ؘbcNsIM_WFfcؘX|o?2Rj~;ZZ؛bsc:X=u y$֫w?zMloZ/cPۢ4>.;mӀ!ʡWbO&x)>ψ͏4kX2ƏlO_)؍8|jwqW5/HI6f!x}9)M[キ:?(-+y%b}V ^4zǸEp`Єlc/=N:4l#w ,ZL|#Kifoൌ~o  (D#Waoģc?|epӜIɌyȱ>1ldv?vRndݗϦd`#9 g͆cM/xHS%!dx4`wG[sXI͢7ݗ/f=$  k7g1 D pp$$un-2WͻH6&tB/ݵŔt+Zgɷ3C`1~3ޓWࠁ Y?vF5Ȧ]Qad | CWݗht19$.h6E3 Bؒ LT󁶁)R]H}`w˞Ûw0ŏo%,rZXYxX}Y 4k _,f4260%n`@)&d[5sU-Ú5kMI6VT]/=@hiuF--2hQ_h-hoۺ8$ݸ3j]^KkP6>dlM_`ݺu.&0b8P+ęd!x}kar{EՐhh Ɉnqp} 1uiO $dod ENU_|Df[ ^mewHvg |&A6s5nb vΒUFkn1|&A6qqq?յyOF4=pZ@߬S}`w3WW+q]>cd EZ`Ǽɱ8P%٤&*g]88pg8$&7QТn gzMlR/4> "٤&ZիMmg=sb!٤&ڱ-MM.-oMlRzoiŋគڴi#&x|rldKQtA%APA_ /AA%A_ /AA%A_ /AKA%A_ /AN%LG_ Q+s 7O%"BàADA%_ `_/AKR `_ eKDANK%~'%Kť޸q×4_}DmӦER p@w95jPL/*V^T"KD_? *WvX.Z|f> }oӦ qnmذ@59SV aK#?SAAI&n Z~~ծ] ta\,Yaɐwʕ+  h<=;]멿Aoqb2%Lo3g|g6n\ysiʀʋ4ƍ s3De>+VRHKԮ]~+~}YXH%͚ w~5b:ur߾}7oH6li۶9ukj˖%!!g(5HSf.l#r po:q"&V)" )!p8T&UVR _Gf ͣ_zu4HwML+V,ct{uwoHfo A8U7pq8f|K̞=Cի)??TY?_ 7cT߯2g[ P=+TÂ3%©y?3eԙ`g| .hfefؐ:K_ 787.u!Cz)T0 `eKZKs[nqҏ6Y:wn<_ K/AK%%_ `_/AKR `_ >/+S (k*_S HA ©@%APA_ /AA%A_ /AA%A_ /AKA%A_ /AA%A/AQcsc```(<Os:$ 7GeP-lH=g` QY1000X} 2a4MIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/pad/pad.html000066400000000000000000000300201506652756400222130ustar00rootroot00000000000000 Yoshimi User Manual ~ PadSynth

    PadSynth

    PadSynth Harmonics Window PadSynth Envelopes Window

    The PadSynth engine was designed by Paul Nasca and to the best of our knowledge there is no comparable type generally available. It starts with a waveform that is virtually identical to the one used by AddSynth. However, each harmonic of this waveform is then widened and shifted and blurred, by rendering it with a harmonic profile (Frequency Distribution). The resulting sound is similar to Granular Synthesis, but can be generated very efficiently from a set of perfectly looping wavetables. These wavetables need to be precomputed after a change, so none of the harmonic profile controls are real-time. Also, it is the wavetables that are called for actual sound generation after passing through the usual envelope controls (and this part of sound generation does work real-time).

    There are two tabbed views in a single window. You will normally be shown the harmonic structure, the envelopes one (as it's name suggests) consisting mostly of envelope and LFO inserts.

    Harmonic Structure

    (left side)

    The way some of these controls operate is rather obscure. The effect on the sound is often quite subtle, while making dramatic changes to the visual aspect of the harmonic profile. Generally speaking, when widening a harmonic profile, the corresponding sound starts to beat and fluctuate irregularly, like a swarm of bees hovering around common focal points.

    Base Type Base shape used to widen and spread each harmonic: Gauss, Square or Double Explonential.

    Width (spread) of a single peak within the profile.

    Repeat Repeat the same base shape multiple times in the generated profile.

    Str Modulate and spread the base shape, thereby creating several side bands with frequency shifted slightly above / below the centre — side bands create a chorus like quality.

    Freq Increase the frequency of this modulation to increase the density of side bands.

    Scale The profile as a whole can be stretched or squeezed by this parameter.
    Note: when AutoScale is on (see below), the effect of this parameter is almost completely compensated.

    Profile Which part of the profile to use: Full (default), or only the upper or lower half.

    AmpMultiplier Apply a secondary modulation on top of the profile built thus far;
    the modulating shape can be a bell function (Gauss), a Sine wave or just a plateau in the centre (Flat).

    AmpMode The way this secondary modulation is worked into the profile.
    • Sum: a linear blend between the secondary modulator, and the original profile; the fade is controlled by par2
    • Multiply: the profile is filtered by (multiplied with) the modulator; the strength of filtering is controlled by par2
    • Div1: the profile is divided by the modulator — where the latter is strong, the profile is damped
    • Div2: the modulator is divided by the profile, i.e. the profile is carved out of the modulator shape
    Par1 Squeeze or spread the secondary modulating shape.

    Par2 Controls how the secondary modulation is faded or combined with the harmonic profile.

    AutoScale Automatically stretches or squeezes the resulting profile, so that all the various profile shapes generate a similar blurring effect. What is taken as nominal bandwidth is indicated in the profile display by the vertical bars and the dark background. If AutoScale is disabled, this nominal bandwidth is fixed and thus reshaping the profile also increases or decreases the actual spread.

    Bandwidth This is the most important control, and defines the effective Bandwidth of the harmonic profile in cents. By increasing this value, the sound transitions gradually from the precise waveform to a sonic cloud.

    Bandwidth Scale How the Bandwidth is adjusted with the increasing frequency of each harmonic.
    • Normal: Bandwidth grows with frequency, and thus perceptually the spread is the same on each harmonic.
    • EqualHz: Bandwidth is constant, independent of frequency. Perceptually this means that the bandwidth on higher harmonics seems to diminish.
    • Quarter, Half, 75%, 150%, Double: all these setting increase the Bandwidth for higher harmonics to various degrees
    • Inv.Half: here the Bandwidth is even reduced for higher harmonics by half an octave per octave

    (right side)

    PadSynth builds a series of wavetables to cover the most important middle octaves. Each tone is drawn from the closest wavetable starting at a random point (phase) and sampled up or down to the required note frequency. The quality of this resampling interpolation can be increased with the PadSynth Interpolation global setting. These quality settings (and the number of octaves) can be relevant for sharp and dense sounds, and for very high or low notes.

    base The note value for the lowest wavetable generated.

    smp/oct The number of wavetables generated within each octave.

    no.oct The number of octaves to cover with dedicated wavetables.

    Sample Size Size of the generated wavetable(s). A large wavetable captures more fine details of the harmonic profile and gives more time until the patterns repeat, but it costs more time to build and it takes up more memory.
    • 128k: the default value provides 2.6sec of sound at 48kHz sampling rate and requires ½ MiB.
    • 1M (big): the largest possible wavetable holds 21sec of sound until repetition, and requires 4 MiB of RAM per table.

    Crossfade The time it takes to fade from the old wavetable to the new one (for Background and Auto-Apply modes).

    Retrigger This button opens a window for Random regeneration of the wavetable.

    There is a button to give access to an overall Resonance that can be applied to the engine. Below this is a Waveform button which gives access to a highly detailed waveshape editor, which is identical to the one available in AddSynth — with the exception of the phase control on individual partials; PadSynth ignores these and always picks completely random phases, whenever building a new wavetable. Note also that you can copy and paste the entire settings of this waveform editor between AddSynth and PadSynth; you may create a clear and pronounced sound with AddSynth and then take it into PadSynth to soften, spread and blur it, while retaining its character.

    (bottom)

    Spectrum Mode defines the way PadSynth generates the spectrum, which is then rendered into wavetables.
    • Bandwidth(default): widen each harmonic of the base waveform spectrum with the harmonic profile, by an amount controlled through the bandwidth setting and bandwidth scale.
    • Discrete: similar to AddSynth, each harmonic is retained as a sharp line, not using bandwidth and profile, yet the overtones position can still be shifted and unharmonic.
    • Continuous: likewise ignoring bandwidth and profile, but this time taken to the other extreme; the outline of all harmonics is connected into a common distribution and thus rendered into a form of coloured noise.

    Overtones Position Since PadSynth re-renders the partials with high resolution, it is possible to shift overtones to non-harmonic positions, to create a wide array of metallic and noisy flavours. For Harmonic there is no control, so the other parameters are inactive. Similarly Par 2 does nothing for Shift so is disabled for that variation.
    • Harmonic(default): Overtones are located at exact multiples of the base frequency.
    • Shift: all overtones are spread towards higher pitches
    • Power: here the spread is guided by a power function and thus increases excessively for higher harmonics;
      par2 defines the exponent (i.e. the acceleration)
    • ShiftU / ShiftL: par2 defines a threshold, harmonics above are spread or condensed
    • PowerU: par1 defines a turning point, par2 the strength of the effect;
      harmonics are condensed around the turning point by a power function
    • PowerL: par1 controls a linear blend between the harmonic positions and positions shifed by a power function;
      harmonics are here spread away from a fixed turning point at the 10-th overtone
    • Sine: harmonics are alternatingly shifted up or down, causing them to cluster;
      par2 defines the frequency and thus the density of these overtone clusters

    Par 1 spreads the harmonics according to the 'Overtones Position' type.
    Par 2 provides a further variation on the harmonics spread, depending on type.

    ForceH moves the shifted harmonics by a variable amount back towards the nearest actual multiple of the fundamental. This allows you to reduce and fine-tune the actual amount of noisiness


    Note
    Apply Changes: If any of the above controls for the harmonic profile are altered it will be necessary to rebuild the wavetables to hear the effect. Also, be aware that with a very big sample size and/or octave range and samples/octave this could take many seconds to complete. Yoshimi provides several modes to handle these PadSynth wavetable builds, which can be configured in the Global Settings
    • Mute: build is triggered manually with the Apply button — disable part while wavetable is assembled.
      This is the legacy mode and should be used if the other modes cause audible clicks.
    • Background(default): build triggered manually — continue using old wavetables while building the new ones in the background; smooth transition with crossfade when ready.
    • Auto-Apply: automatically launch a wavetable build whenever a parameter is changed, then crossfade when ready.

    Envelopes and LFOs

    Once again we have all the standard inserts. There are also the same local controls found in AddSynth and SubSynth. None of these affect the wavetable itself, so there is no need for the apply button here.

    The Export button that appears at the bottom of both of these views takes you to a filer window for exporting a complete wavetable with the total number of samples you have currently set. These don't include any changes in the sound produced by controls in the envelopes window.

    Next Effects Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/pad/random.html000066400000000000000000000036741506652756400227460ustar00rootroot00000000000000 Yoshimi User Manual ~ Random Walk

    Random Walk

    random walk window

    The sound from PadSynth can be soft and scintillating, yet after playing some time, you will notice recurring patterns. This is due to the fixed wavetables, which are built once and then looped over and over again, for performance reasons. However — each new set of wavetables will re-shuffle the phase information randomly, and so we'll get a completely new patterning, whenever building all wavetables from scratch. This is an expensive operation, but fortunately it suffices to do it occasionally.

    Retrigger The sample time before recomputing, from 200ms to 60sec.
    Zero (left) disables retriggering completely.

    At the above times the settings of the following controls will be read. They each randomly change one characteristic of the wavetable by a variable amount between 0 (off) and 599%

    Detune: slightly change the note pitch

    Filter freq: nominal frequency of the filter, rsp. vowel position of the formant filter

    Bandwidth: spread of the harmonic profile

    Line Width: width of a single peak within the profile

    Profile Stretch: stretch out and modulate

    Note
     This extension to PadSynth is still experimental, and the precise control behaviour and ranges may change following experience and feedback from users.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/000077500000000000000000000000001506652756400207705ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/controllers.html000066400000000000000000000073021506652756400242260ustar00rootroot00000000000000 Yoshimi User Manual ~ Controllers

    MIDI Controllers

    controllers window

    The controls affect the way incoming MIDI Continuous Controllers (CCs) behave, both their range of control and in some cases, the type of control.

    (general group)

    Exp MWh (Exponential Modulation) Changes the Mod Wheel behaviour to an exponential form.

    ModWh (Modulation Wheel) The control range of the Mod Wheel.

    Exp BW (Exponential Bandwidth) Changes the Bandwidth behaviour to an exponential form.

    BWDpth (Bandwidth Range) The control range of incoming bandwidth messages.

    PWheel Rng The control range of the Pitch Wheel (double arrows are x10).

    PanWdth The control range of incoming Panning messages.

    FltQ The control range of incoming Filter Q messages.

    FltCut The control range of incoming Filter Cutoff messages.

    Vol Rng (Volume Range) The control range of incoming volume messages.

    Breath Enable Breath control.

    Expr Enable Expression control.

    FMamp Enable FM Amplitude control.

    Vol Enable Volume control.

    Sustain Enable the Sustain pedal.

    (Resonance)

    CFdpth The control range of incoming Center Frequency messages.

    BWdpth The control range of incoming Bandwidth messages.
    Back to top

    (Portamento)

    Rcv Enable Portamento control.

    Thresh The minimum or maximum (depending on th.type) difference between notes for portamento to start or finish.

    Prp.Rate The distance required before changing from non-proportional to proportional (if enabled).

    Proprt Enable proportional Portamento.

    time Portamento sweep time.

    t.dn/up Portamento up/down time ratio.

    th.type Portamanto type (whether 'up to' or 'starting from').

    Prp.Dpth The amount Proportional diverges from non-proportional portamento.

    Reset all controllers As its name suggests, this simply returns all the above controls to their default values.

    Aftertouch This button opens the Aftertouch window (shown in that section of the Parts and Channels page). divider

    MIDI CCs

    midi window

    These are five of the most commonly used CCs sent by external systems. This window not only tracks their current positions (so you can see when they are being changed) but you can also directly set the values from here. Additionally the controls can be MIDI-learned.
    As an example a foot pedal can be diverted to change the filter cutoff setting instead, or even as well as changing volume.

    Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/images/000077500000000000000000000000001506652756400222355ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/images/aftertouch.png000066400000000000000000000322531506652756400251140ustar00rootroot00000000000000PNG  IHDR>}IXsBITO4cIDATx}iPٚmc9(2)("*("(( 8S8 8S9u޸7⾈^Tt/;ޏx*agJ8֊Ν;wfkwAP?o4Fٿ=m)i4Fs{\*_fF4K*FhvnwJ]I珗)2O/'fIY葅-߶Wֶ ?s4᷏yqpIN/p@N 2cN'P߽87}=.Q#;-č;O2uEsSV8'owa@⢂šn]*?Mi&Lwq xxѤV,[Ok{S~↕77+]h*ow(~$/n~ ~x\yvPZ\>/Ovm0:u ܾ9W[JU{Ƕ7P\no ևr b|{bCk/m MeiQŮ]w.Ӧbq%,/?.3j+j*ok4[k# &Vr6S@-a~,7Oy6|ȼ7e )7k*3aK߶nh7v!JΖ4pܶl؁"Eu6S#zTi&(sœe[V|f.;BA"K]xTvJ3un3Tj)r:o}nx*ǯRM˹2oˊm5n 3S޴^y:O -ʊ}RSr_~.M7l~制4w?; GRߟk/14F`4)FtMqHzJ"[+&[rHyy#iY㣗 ?<'bULg2MQ-FY\|Z(.˻Ձv2AP"S. 1V ÔaY)TQ&6TYܣF r!p{ C@V Q1bo]t5u;ؽk,}1t~P$5.ԊsevFI37\UJFSxAъ~S'<|UҮ8޷.J?x:OE?4~!g~vh5Sm=[bm{bb?[X#-"ŵ.b'x_4E-߻O<,)dn0Z\zrYStsK]څNl,3Q~/HȈFo#+arۓ>+pyKGH}q/ꌻj*@h`áX,#/VުŪ,R}(Y㕲ڶ'd⫖1MbŹ2jZxa#RLm"gmgJ֝H/$\ʿcs wa]Yw o]Oaf,vlGpugVUh 7M󇷂 Z)K^I X|Gum׭cԟH3Z\Pxx\ '5.TV[wm_b4tg czoώPe=1nrBHtd[jw83]󙃮$6U !`F+ 7%t#2\9>lxw3{.ޢJYm6_H\m4Ŋ%sxpPC ϕʚaJLmr"e{|h7}gpbӇ #&| PeSn]Yw o]Zρ]Q-=oׂ]Q؅Ȁۯ:Y/]h4Nlmht)<4ϏKSLFX-O٠)Hn^jh4;z/C <4]ukU*FhvnD_?tr+FhvnEzˇ#vh4M/]A@E\/# *JAA" JAAP JAAاtm&D~"JJyAt (]$$APE. }(]A"J I.t JAPE"JAPEkp޽9s邛LkkXEn߾mt Y{nǰ0p7o,Q(]=G)]b l ,x5O444 >\PhʕMMMׯ t{dJKt+22R,Ο?EtK.Zfjշ~R7N0aҤI˗/E'N;99mĈ...111>4ԕ .I2n8U 3p`b]L<k*Et9tedd[N,q $ e~www,<ɔt &aYQD[bdC wީJꫯwAU gϞEHAL"=v7nP(]$]{2F~֭/)>HEag5.ȑ#;5s+WւNX /^DoQgI䯨Pht3>}PԩSQmmmb|. Er sң ccCcLOO<Ô(]F"]p )+mO>g/<$ko߮*̙3Jg$nLh8Ot9t) hiϟy KahFdnժUR'[RfTJ{Q`1 x(҅ggg Z{pKJ]ii)O/K7di`pXgiTիW˔F9ESe$K +i.a2۷Oe%%%"&FoRe044]?19>::x`Ku9勖}%]`ZgϞjJˁ:zT<]XF`ĉӘAP9xŔ PC2 xLLƏ7Q(]5 Lb3jiiiiyR.ܹe| 3 <gCP*]iiib/>.Lyzz&$$\zErDʄzQQF.#)tArO)O3$(]AP'O5kp*Pt5BxkȔ. (]A"JA>.t$JAPE (]At (]A"E.tQE.tA"JAP(]A"JAPtGi酵l.EPlȮohFQW,e{?_5Tt9,e[=GQQ,eCU=Vv_GQQ$,JcK1Lh1)ST,eC < :yKEN7I NE3nįt&^z_zǏׯ_onns'v횙'ׯoHliitُtYd fԭtL:U2!$$|ԨQ~~~W\lݺuPhXD}y[ðJh(R^^Ln ?TsLy䮑 0 =`*"]Lyݯt)]deW̢t$%|w@;,&oذKӾ!ndS}C EU x%׫%ÿ!)]d̢t}ޟzxx`b&Lk!% ̙3UyAL01WhdSyq(x30ڬpEEfY,J߸$iAE@\1cPVVS8#^@&z.Xm6J ,j_Ztw,2e_WAD4P|#2;;gAO|iAēav t ,2eCT@,..Y WEM fΝ# HJi @",JWGҙK ꏸ 2+ v4w\e" f> ^KK uYd%&&* 2Ѕֺ_r3kucՋ/Tv^I0-auf e$J1߼y'O躣 !(Q>DBMYdkjjz _3õIHH@{]^`\pap EpA0DsuuE%]UCDž(v K'HEWro!sG{ +U(y߿ Q,25i'n>[pqq$PhggݻwXw `8tq G!IڵkpKHThHG]lN",` Kݐ@#:;;LNNV'==!%V܌WR3qEDD`="<JOtznƟ'9CtǐjD2EfYv,u$Q(4R,>JʛqkܼyGn ?TGC Q0"D8W9R,2ΙE2I0\aÆMaV\9zh@FF#z4loB ,"Wmm-JCGS,2ˡE;33?eΥKzxx`pJǏ7(߻J+"<@6Th{r\x}UtYdC37. 6à"e3f̼ypqR`@NN]paii)-#^GEyq 7U$!kT)mmm.2r-C^ 066op c`pS'hݙ /fd{ >Wc,bs%[G)]d58AOhC47yϓAfnIO=q͒%Ku̙ QpŎBBBpHUdFp_hvZ V\ufC3wV,M~} }J-e~M]B+ CHTʐwHG]lK",`֐a(!!$|5C> 6L7$kں;q18(ЃOН &''+7IOOǀʵVBP;w*ׂ`l(=gyrׇ!7}Ce!HsA0Ð"Y\DT]33S36ܿdUgDN `kq_/^(.\pл5@Py/1űkqLaCs*]d5Bc] !Z9-̚5 @[A'/7T4/ǠL67- XEZ tYdC3ҥDcz.,p9л-[&w!kP 2ÿ # +"<@6TH{r\~y(]d̢tp%0_j0gΜR<{g5ċ(c8t^eƬ*L*++E;H邖}yP8fK4pDCI&D W̓cȺQe`5"@_ :N8Q|QF^R+&iĪ c`{ǔ\nq_lX]}\O͕yEfYYfBǯiY tC~!Ƚ.2̢t1$A0$APE (]At (]A"E.tQE.w'(]dA鲗ojKkA"JC~~۪ӅwϬ~f﹙񥊳}[EfYϠcǪnXX`Ћ}||@)])]dA!aA2W~z'Ag"J w777Ē &*!‚ =tWXޮ@vX5J]1 6ӦMC93f@WHLLTFp!T4SCK!??-EfY.G.}}}l"-Zi&S !~a&|񈴦SĝgΝ;W^^0V (8wgF; F70^r[5@Z6=yptM",JJ~ z(XS ]*tdOs2x+. zЀm Ȇrnܸaʭ| A0$٢ظ)]dErTz#HfUJ姦~s~| ݮ;w*N> uvvΝ;lN3_CA0MW]jM",JJ~cvR ~+@S 9H+`G7oD`l\QQa`k"(]!]=F!Xsƾ&! ak ]B^0`kHQ,2Ç5k!eC<ݨ-YD >u%**4$t%QSRRC9``.2"}t`8 @o ΃Bsnj۷oçv/ с۶m{/^LFHx޾yСC`ص]r A! F",  ٬#N'莡VXXzq>wS0֔Gӧ1 LRӧO'N{tYdˎ< ^NEfz^QEf.$$JA.t (].t JAPE (]A"! ECCPA."pj#%aH_g:1T~!-Lq' d$]"<*鈶@"YOp$D"AQMt.E. 58@Sx@QG)]k׮7oVA"OKK b(DO{?xcƌYl*Bޅ 8]r͋EKdʞ={r-]wTB ;UI E>]dǏ///wrrӞܶ%"ٳgCCC!la. t PfD)]ee9p$-,ܝeرcXb30Hv8>Q+,,KJP%%Khxt z&]׮U}PۦyBvnYBE A-p^®n7BnG ׽Գ]h^fUg"`48cL<۴1x~vk]%ˌs]ɪ'_dUs_ # ${:qZz4to,rgOdSֿo%>mjXM.QŅ{&Z%bx79Zywtf[ astV8.@0_%fJEe͘~N_yeAuY~M65Q@)ARiT1c42 X.}5Yn7xΘΐE 4R1q#X&+H{񧐽%Wmt*W"D&4[=_T#yEMV_x⤩;iRۢ,kzcU<-ESwJ=UD}L,"m}jk0? "|/)ydۋk"5z_װ1lIBRZغ?uٳfЗ[{i,OnmDcD>xLG 3JBC,,dܶfΘ 1tGly:0k“=1оV[;u;umUMTկSmwE|.ӦQ[T-szi;atfM3 8*PX<_P˦t}O{ RW)N? uG׏QR^6Hs;fɆ(aG2ӌ?-1yM.ؿSm.uD%놋J-8:|NGMn_1Զ8Jw;;56پ%YvzS?L̫$Asd< -r6;z-tĦQ; @ԳgMv.  ̞giRq6vb*l+uZWmfP2v Yn!jM+*m}Dѧ[&BV[¨AAݯ(0O#}Bn:#.Q<A"Y,-gurߩ۩YBVX3碉]+$r Fz/KcSN성jIar)p \QoQ?wd~ EPb6npB9Ek97h*oef5ŽRO3LJV ׯZ4\=P[/W"rPS1\{!r>?FG㉓J\2ﮒRhHpT7oQo]kw 9Ij^\:)S<,);\=$E m2#kfu R{vG!d@#ՒX7-cĠYhQI)޻Kg}[liÈkfڙ=-"erӆvD }Kk% T+_X#4j#P;gן˳fN.uutߩU:fQmd :5lWG{hm~Sç oվIzտGr.nQsF9a+G&gn iVM?FG㉑ݽu52ﮒmQşwY;nҿNGe_eZ\ߦ*e DΔzՊb kZTy4txi•%SӺµQ)]DNUӻ Ӛ_1H.#XPŀNn!jp#Y6PZ@Ub%vXzu Lm)/KutߩU0dB9CӊV`.42=ЊZ7(QNȦ*8Ѧj*y%2UAɶ-(zb?Sp3&"g^H;b[ V^ƈV]j7Н26*}D vsNkT(?ݳt8-?\~:tt 4RزlCk~ھAVDC[ :#qG=FNҚ?Astv+X\b|ޢrٝ6aEݲ^Y vRޜA X4m1H?dR^ pqx%ڿ"0]T .u$z񧐽%d@cNXw ЏoQtb11%ro}xHZ5Mk%6wWiƽK[%9=5׺T>h*,HZ/3ۡ=nsxzB`.ٵ/[*+t7!渥95+ZP’XV+_Hcpn3Uwt 47Mg9UpuE26zLP2VyX*FS >wԟr9BsmKlƢε37dFNNm']WU|8=K7yߵ#&dذuk~V1m*":KJU(o-*O jFr,&F'&Q-a̮@Z/th۰95URCɥf)doݷe T-WpKhO8@_ְ+ qa*ߎ# U v쑽Kg\ TA4I8xzVI9M}wG %-}1/DHjqޙ%SZ{(aضvsN8Bu ȫ8U5Ң]ڽAHS#0'uH階Ms;yWhu:v@Cǔ-Kwºߩ۩U}ˢNM+qv7!sK-7t}hZw툱).$n4sD G.Y$OEq=y4/$l vIm?oHBQ]O#iƟB*,r&5 ^q~VW?Ơn#D53j* Ђ*x*E^b>f3劥MTyN%ώ_+ ڳu-s-V+g1'cuZL~YkY:ZwoY-a,Js`AH'wYrTZÛa% @r^7Gp鎶ѢzY2rrefJ79ENN-Zuh\nX]wܑ֬XhphP"wm]r snW/6Lk'͞1yȇ-s:o y 3n?T*̦2K44~`#zZgr&pB]jj'}axO3 QW9 efseytFOرi.u5?6U ]%~-lE%TR)e×Rl ,-j_ZuFcA9w*J'U.c>z ۡKț3Ӫ)UW1iD ۪J*ŞT.9epC*yڭU?;q*J*JXP! 4SI%TRI%Tr/ Pɂ*ѯmyTRI%TRI%U(RH"EyNطH&E)RH"WH*)RH"E U(RH"EPH"E)TH"E)RP"E)RH E)RHBd:tDx9V v4i:jy=_>7SL"*)kڴS 3Ǎ-~͕d6mj}<V(reӶm_,\x?={NyaN*jW_o޼oΜk?2&@ԩ7",ܼ+Jv pJ0alz?ď?C ۷?xU,YJ4hWQB(co \ŋ(ѿͲk^"E~vw;vpCT @>,T? +U16FfG8-R7R%lMd Kgh8(ٺK[9Gryo:9{~KZz׵ͻ:c p eO<4i-yWEWժU9f_rڮ];ݻ4i>}z3eԫWG8f:A'yIF(\B͛&MJ)Re&N(~W^4i$^xwQU{iٲeƌiF$I"lvC@UTo1g^b'30#˿Yd'Nŋ (0cƌuժ1ΟE Eb,!\͈7)h{K@4G M:/fΝ{-\F.707bN~rif?W~p$YlɰaȶmgI܎U{'"G4HzeqNZ"GNTD #Qk^ցɥ.LUw܉YDȉ}͞=[(Erf)@7n;w4Bl޼Yj3?߿FWTI/l̓T;ov4p@|X T!`b߾}E+VA|vYP(f ˓ϥJfcHYE Om?3rd*: iӧ{V222qǚ_Pr)\o$qܫc_r]-j&-jNV7;|'-iʔ9sE3ADޥL.=z==.Q+%cXCRRbE[Z&^#,=,^lq LhGaj a\bS3MD&M4=8f2*%KPX{yM_,N̙#%͞+7n]Æ L2bף ۫uN*dpT?? g B\>j(%Jd*[mgQ"SiM1+*^Hrfb Z\m mYJʪu/oYYв+ =:tx^5hON]5?ispŽq./‘BQ7bqN1/~Bg#VzFp#G * xft&G>.!9sfNs΍mDRЁSI3;w,9 =@!\o﷕4!!!B b;"<0!~<JAR;ME/Bě1V- @#V&'Pbx/7uSѵ~z,b P0 \޽;6l(Z( SU (0k֬pNKJ 璆ދzg8~ҥ SkG͎18GIarp958*b8mٲ]!4jh?9o٢G! \ռ[lhbNIqՋ,A#ȅ!Öz$Q?D)*5a1EDQHBр.]Nī/K pt#lٽ`E^*n>k}~EoV]WK!W]nS~2լK U#UoQ,T#vĆ z SΎӆmΨwHBуƌ0d4s@zȳup<GKϯT=M8~)Rp kc3YZX~7!W7ljF%bLF˖]RlQHB~H%K'Ds.WlrSϸt_(]zcʴ_`Νbl] 5fHqDds&]hO%)RPÙ~߬dVo6&dϝH>~{ >>[K'/S,3|ZEu"ӻo]r,)WRXY/,ׂE\g폿>x<=19&͇_W~ڱg_lbŊ% =Wy* "/9l)DC%?)KR$; RhsRԭ[ֽR|OM.;~}/zo?<WOXvm gj\omt;S<# "PVr4$B9閱ULۺc7aX|Uqr53p5ټF`$*WPE,GqVBB?ԑXQ(D+V|H(?m2.n<>U{l5u|<>}Oo{rΣC&bw]_j& +>puU \%^B U(THQCȭ2nJdLVB㜘(li+W9sO7%fyJ}6x9>y!/pwӋ^ҳKw6: g޿z<'<%QETqUH3vA.^UN+\u.PD̳+_reݺuن%3-yycILiD{^QVᰑWP"E Ubˮ0V2dA׷mf &M"݉]\3Hq ґ3lD;.}~t Sf" 7hxҝs75Dp~µ2|zݻwG-W :+*lm` p !9. {U ؉4ТE ['8qB_ uطM.ذ˽xŮ0, #og؏1JN'/ VƪUT^\!8p`8Y+;4O-B#Iʉ۳ RPFuI2 tԆ@"SKB`r~OL0G< sv?VL[v@ " |O|wYgΜKT%\3&^}8W-Z>z/![\u.R6%Trkײe?Ss/;9׿d5n޼)r={{gDowQ`UyA*۶m+|z4cTaҌ[2(b ߣh1|eVt\E:)lr=z0hX1lܜ 3Ƞw)UfIP̫^sRfػwoFT7#_Pn]!1V1O^xW|q&M&M'L/2XأpkWVwKT%\8W/t#ۛ^Eڕyz'VG9. 'G_^8=t؊S_ e* Z. #(P_ WD#`o]>vcHBNP)x&y{dUݻ50?p^vn |/p\mPAPz ?-Fey1cFWg8'!WF/!>yB-i=~7D~7w62)ئm#2̭;wؙGN]w~'ZjM*;K S( {"Wc0`e_*Nq7nw٭[7e6`k+L1kܩ)䥜uE*mXG'I*0*e3ݧE"积5yƐK^1~*N%z|ˣ 0rZAvЁ ό^-ZD}Uhd5au lj%"9"X̒9vO~9ݧo=}qnD`UMg.s"5 =wɋ3a~aե8'W8Wg.μɻ\q U8<7np/lp2I&CI_իWdV\x@F! #ɻE!ȰL$]x?c̐! Anx[Ѽy:`X@ So4|  mܼuϾ$8 4h >8n&*6"BF;Jy=# 35 p<~ãD@R5~xk{>g(3T%\-RTW-\ Wg[sU=f #{}Lg_Œ>_d>z b0R& t~Xf5j пz  og4l蹏{U#B|J>ɓ''Ώ?Ϩu:_@ )Fz㶑^zʍ#Gu<1(TaU)UZLD~͑Ϛ1"3Ef=R#~_}ue<|Ogo~D "={D^lI37vxjz`؋*<'Z7jG&.d{Ohj!4E̛ ?Y*!sk:B,܋cPIFVH>kYanwzo !P#ޘR3F*6*r^qc:Kݲ膝o?Proū.\r~՘KB`GeD"ŋI$Lծ]5hvo̾ڼ~z*.E&{}u'p0B;Ar9*TW3M o>օΔ݄{[ˆf+P|K,Wuo \ur |)R&r"qRE`)m@Ed/bҥQ &Y@, z;T 6m#\&ssK/-)9sժN4E "o[ ܱ?KI*U9zNg9nQ?e $kxBv?l\w"7/Gl [yo}vdB0\+*ƌ=KtcQޖ;ЃCjbbm˰Zdf]X)*/|_ԂuXl^#6ǁ=w+VoئlKTa) RbrzG1ZnՍC(6RN魉)QD&F:m!SAÂY)꼗2%#|;hPPŦatރzu!}*ё%Cv\rJ]3de2eΈ&_%&B]O&Ygwt$>zɷbХJ,=K.jG5g1+j'tb"8WϚ#x넂P2}Wa ) jGVDٳzŖ1F+ uiRPUNLQ*! 9zARs>|9e ŬR+lLXgѣK%ҥ?aD'൫y|繚wQ+ LTS&Ln3?;`gތ_~ 0^[5k+7Ya;tboUf]1L$IG0` U(TapdefXrpbe?S`f^+gqNSt3WԹU,Ypn!.@RWd(֭U%Xрa >vbˌ97l1bۏ JTJ@_ {;71 p&s3gB ,|ܱ1n߾} ˬHSgwM<7.XZ4qԥco։{"'l@0bDmދ[vSx(#6UMZ&(9n3O7Hr5\UB #DqNjʖi3fd?8X4h\rKcq c^KD .+me~ #Ү\ؒp͚5a] J"r)|)9Νy6DgHA_qKU9qI/1gD"YڢE {¢7lz`23f t ]5(:=$˜SNpMU0dXl[ezmMi94B (㝇.۰ ɷhͶI.]jJmܤE a5OHp5qN]#mDr+V!!ROhDCxSڼV2X?|VvIĄgZfb3/B}9<=aGΌ;Q٨%#A`r)S5 C]YHN]]*o޼X$1 ew 8 HbZ4t2f AA 7rBPCITKйAyLN\-P~0;'3UT k'(f9ZT^cݖ"24w:}uثϋ9wWo/$U[~*W~HKTXx!9Ifqlq$ɻlAvUV-\w64ӷZ@ؗ?tҵsn@a- Z(X-6^=z>"xPFRS߳X:Z_NE=Kba/6}攩x缗Ξ$f \|4l =`YkPB %臶'VBj+F/XҜˉ -"9yH ;3]b}#q潦HG2TҶ{"Zs oJIHlnŊCs& 1n[@ܜzº =|Yeajz²R/4ۏ,n-«N+!# Uj$U"턎y"xPńl^:yl*sP,&-#U`" j|OtLm׀N9zw' (ZT֞w{Dr V6Ax%ߌ+۴beiX:xCɝ;7\'S(zKޚY͡Vܷ@-,g'he1^kO)Kty}4X-h۫,A۞=[p|iV{VB[oM=ޚzޚn D?sGP x`r)5+-YR±=*YT>g-XDM>c%J[Q*FSk9\⧇#( >@VJwyHAD7̫e6Dc6@zaʕ+ﳕUm튎6Dϟפ[Yv bk R/קOh=T,5/lQl2d,| sTa2AK"DtN`Wү1O)qUQLE8>s6oC'%d1^3:7OȀN8䍻ٺoPEl!zˢ'`n><"d!4thmT'+T,%5)|I$9p+d7z"\ f%F%Fa\USQ-6YݩKWȃD ­u1apsblZc^['+AVnݤy+_F^ En=vrP;'Ny/:bt4} @~(qT\UmTa2mQZomnA箚.!Ob-}x_6kAO bb1!70 a;{Kg/\=vք-](ܐ|eBEy*ʭYqV:&9zmb (eUfmݎeT8GGMHFoMA]1ga68x{tMFcP1-@SxQ虊 -PB;'mEv,HAO]'N(!3c?;]~5Ҡq3JW(BuEÚd LACGxPe:sL6h֬9F:ϯD]T;[e8HLmZnua"jeǁW9v6qbiyy,Lst(TytЉx˦(3g^: 5~IUcwx/|`5P"E U(Ta@@Bӆ,fV5gJx_mn߿b4ɋWDLmep/ޚAdr~ n7u|+7kϞS"~j*)ٽG-_H/^ړO EP!5$׼U)޲WxkAVGjc&jԴUGv1o H3N<&K7&rp a=p.۰ `P@tzҠa#mru8*)RB ׈5v}jբu[a{mֲ-ٍ2bP{f0ݵk'L7L-[ ?,Kݺ'WJ?>||DqTLtd>/|Ap"_|1Vcؙ=cqw7 T^?~4iҰ#} M 'H0$"U/ B .q=S )PoƕU+M0wc3;:pܸQx{&Iύy:(_r&Fhi+qR8%B\p=S k1)S&}j+eΜ=T!ƍex,Y8%8۷/ƣ x8ۈ34i40&BFP0b+X$T!'c:Kq)"@= $:dJ)`0i]m;+ c IgrȂAy&DZ`$8s0>nw# *TQ(.9*D;v`}#FwH,#}HMiUWBK 䀘yj3A(p`a&2֯_o2;<@B)RFLqv͕+\[S -Z:CT^Q8TT!g!ܠA:^ 3q)䭙ۨ"f(F'"͚ &͛hO8x 7D6FhU$Ōs3Ś6}~SF +cOfS '7r+Tah佐|#G,T~v&J6|;8=F˶lXY(02XS =RW@iBl1'h,00N:ԱHLK x+}0 3vDı:P;֢ _ۨ?TA: WuP¿sڲ+۟&M^ MC:tx^xe^}ҧj>lѦ P ~SljRͺu~ `DLv޵H[) *1QWpХK=M}bz- $@KYrDA88`\߾} p |i@|VPTz*$NP]`/=@spp0=~%N-8Q A)S$>S,)Tቂw{AbF}ލˤ>3GMнSo`ew~2Y<猸qq: c;YI j38n+TPՉfA$`7n\]'6>eL>ågO*6o1TbYv .?KTkf&sfuS Ei+ro٠bRJʜOco*,"Dz`/'N˕+ѷy9r w^ GfGP,)T *@;wf]vr E UD1` [[* 0XA`m ?_Y^0ԀĤ9-bְaCi=B  \Btq++ɓ;dW!]_!*tp UXA ƑI Z~ -[f J.UDb"R UȯWɵ"fvʑ]'q=RV)TPEEh bPX"G8d ʗ/P-mX*ČP0P.Adك0sFR @i 㖡G U80®qpÆ ,6(؍VV*3MdbmTքDYЯDA*)=sNS\=Y]t_Y aVw*N2^ wPr<> 'G 0;9qBa _bJc #/% SbAb˨G1)2abJ PK<" BFЯBpҳV 7%P^t<D~ CP7 '[C@@BAŻ?+lI\͜=/W=(d>%zbJ5$KdUvRBIT+K)V@?cU CN,gFK^Œ [n]㵭mr/ *+IN9r5s\ Q|bsCo2ar8]t)/h\}U&mÔ1 QSb&T+=j TɛLQ.Ν VBBU߉Dd@ҦMG~Ok6_|֭[KTŒBxMa1-drK}oq9r5sdaU U*XcPZ{:S8VfHc;R_;OUXL>R"B#_4JW 2rBulL{&yzyi*&v,/hA&Ǯfܞ.RV!sp*PL0ExFsTȕ) : EmAk֬:آ 4KX U(RP(6ujN"8^_6pUAeU8r5sdu b*lTA 6;t.'^ H,LpO.dFPX"a #NJ`m*X=֭[1L4&٢ 5b()pPHYjR{>K]"pKė *I5D4gSl" )ڼ,`Yy?ןwh]Ndq* vu*#XIrcT *ְP"E U(TarYf(@ր-/hPTQ*9%"gS618u꿳e IL2'Nr(Rw`ۼgV`G#G)o!ݧѻqI"q26eKm#S3ڱl޼^A60KH&7HxaU9TMMeyWr/Ӡ22]I %̜9j֭ SB́B~X'ov:-6Usʔ UD aUjEU.gCVSe-FXK U6TѷcDuVyr̮/dNFoɘ&38[rZ;?j?)¬yH>pZo/^lq"~`{$PG98Rf<Hq?98'dBGkmK*urڎ[5`SGRZjafӒ=`dz/_ed4YuqS~`EJWa{NBb>Z|ذ{&FHB=?8198=#OVԢ+Qє)9jT#+(*~YTy rl]&FH.WFBGny@e+p!SIjEK\ͻ%]pjR ϰA.6E@2HfefC4tmm,4XBU{& A׮՜W@HJw} vjiG8WP"?6|+nD`EIր(E/S9i@v' ]Te^ P`ߗ@蟄ٟߤ\M;ZH2$r5L MqN(%p9_lC …甦{RO܀&v:!c/\q}cƒHQKqȏ̬Q/fn{"vh={|?[EK+RB EU[Fst()&M.Y~t} 4n҄\V؟s@#{)̓RsɇPe˕:}ƥ75t)f!Djf̴%2Ӷ;a~UHKGlTBB@DeZ @߀ZvϿ;2o&l]9 8j^<c2Fɳ{tTppXP.C3pv^a*[Ux*_lf^t?N' _ۈ "LpJ&?ɭ¢NXәX~_T6!c z77$q)O_ 婦lՀřh_X=t#O*hvye3F]ҝo>?h~~{/_CWL&'#fsY/ HflB UDH& *ytiaI1UsF2l=z4t!32cq'@ż#Tٚ^?R%ʓW.~btt}̧.z;D?>W͜C%'tZc3[D*V|i)7O6uֻulw?_t1?&M/~xZkɳkծm*ē̬'iBVzV 37౫ U(T؞?BkkǮiQETۈH/0h|N/ f7zjUQ*[>-, KNc-X,%~AlqrWXs7=xwysXSor HKFH[Q24G!5jĢ/7vBVmB9u+v<xK#<}}J+[}0D,16Jcf,EV$#\~I3ũ3fڬtvl'a5v7|`*pD찀`)ffG(eRiۙvRˑO1V\U" [wm8yѦaWzXRl̥ N W'-%}񊃚/Pvq :SX4[ Ԅ&Q4qx>}kt]ZKF xn>x~ɫ_yOTš_s灓2v 4`p$<4/\ VB DLa**b҅s7TJACf̜|jiWFpT-ڻ67oZc&/uA EQ .ڸy}HpJc&- J.y~hB%*jJG'E5Ggo<>G'H7C>2'kwz'ޮRj5){gnG݃v,A,"eRK$_81-4 MMi>y{Oy8xէ"7sfAf6kъv8p3K=biip鲢8lp>iҵ[|`1L2@##Dq U1nBZໍw 4ӯSg:O}F%ږG9b!3}@ 3C0͞zMGsR*.5@#D&x}R-m.o=x;DlFM`.>0y{h/Hڶx*r3Nɣz퇗o>8r^!6Ot= 37lD;h̴iLrx6Yqß;M6E/TǯPN~XPQ&'^t_Hȩ Nɳ 6nCQr[!@A8f|m#ܾxȑXB"U/8@&Bpr;.yvs.?lz¬L\GzZM82c-fM Wr[&NrĀ&ܔUL,=<+JK:H4lޢȰǢ%ji'TMN\{ӗnn WK0/.1ScgdU;]bMm]F0BԑnذAyn #ZBfL#)s1Uঃ/ HW>$bp ~gO^vjuCdm-+>\4̜=Ɋ2uvl!V# ]!Clm%T5\Z "HX7S2%hx2;Z֌ g#)ft#թ[W4;h).%bd[^|̰y".'_3ZZuufcf I(y][J4Xk\mpiY_6خrW;ÈXlL5 *$t,iӦEɕ+WΜ9CCCMhhѢ`3f :qȤmI&:7K 3N Aʔ)1ITCuԉ?>hk:u r $PT _ިqgLp5 _ѿ#ad 3]^*\i.ۗݩ[UT-bG\ yǵF~#n^ }aG 1{8"rQEvloMo"<//饵6O'ҷy|&5eE4 ;reT:t0N2.;Slэ=>D%0q ^YC/$Gh՜K$NB;Oޘ_)Dv8vSzd.3D'u,o=2L};]bugl#1,D4&0#!Cr=4M4;w4i;#OK(8&?]t.w U8d2mٲeF89r$ iĉU%KaӦMdS @mvZp$P>? O}`m]~u%+SWV|㭻>QUo>PEԶb)'/#n#DrGNtѸqU6fuV 9ZDHTHgOAH}^xXlD&J}kHC'.tћ}D5@Oh:uShso\G 1A'P ̘|4Cf.䓘4ugHŅףn>yc&L!euf֪L*ylvL nޥש[vח v"d]1DIAD,BGL)Ssz]F_{C(* `AУ ==Y>lnݤʨ̕+W$JP-d58!DTX1{p]:uḭ '.ۗ>@;uG4nv UDmoX虄 6̙;9/'m" T;wnū7ls/K"j[W|I[jI V:綕Cxݒԫ+09E.WjD`"2"ux6!T"HN]G_.5bw!L\CZ=rzdDn!B5N-B"R;vxg̖'1քLm.哘=o95,xfEu-ZЩsZyD3*2=ޓWX?|֗ vh%[@J,~S<A*p q[ӽǑKa7X qFNpUI ShVVM]ʮ+18n | dzz _f +^,32PEԶܯ %"yg^"UiڽgWUml菨BU.GTq'6όi},TȒv;ZjpIlMC{ɕSWw:F*-%u+׬l}^(x1BQnx5í/[EDo"={cnik&pu[W!Wſwtܥ#dPUwܵRL5 +M߿j1HbѢE۷/?I  #UhDJ½YdqUI j`]aW~`b%#aTⲹ2.=vK~\-I T-+xBɶa+.3BndYq O ='L*Q{Q[@]ӁW9ml5@ ,n fm\w"z>Ӏ T%"l~Ige5X<$IE~~f`Ay'­{5m 3AEfwZ _3f9*VbNİUșQc'Qs UDmo^DoJ U\sOXܞ^E5j2q#7,^Fۻ~#* k -8UUms~R*nǫ3}`{8gV&o o^ a lj"Z1+.Yޓf4~'FFMj {2E–߼*}*،t=r{&N:wsnϞQiTM؇j8ˢXvp8ivREKGf'Qʯ4i+rCѣgZ[PŇ,ڃizǁХkc{LbllFp7+/qvؿ{v?MWM.V #G|S  Xm˭\5?lXㄙzr 0YB=?o/7ɯPtuSOX7a4,w01, JƘlA/1yĶc} B d–"U8 [ a[ܞ *Tx-= mWA,=z )=\xg DKq5[VmۥG_}@}WYWze2JH7XnRjjf$^}oIW4ͥ͝PMa=5mwfܯuTa04ޚW5'[25I/`sQk[m]vp p* 7.h 8jBB 0 !Q7R:s; 0R ]2eΈ;_%&֢wvg))pTaﴟ$>zظ;t麒%Kygi+ 2SN7MPB& I\ꍻQ)Bt?1  6 k1yͪ5o&5LѫV\y,–"U MkE/.%nӧ,5,[Q.Xą͛>^e+W hZ~p70d ^جB ƒ]>uؿt6"P-_i+NfSVnC ٦C>Ң;d'tI;rNcyPBԩږu95y"$&fYmi]>}##7:f뾉3 VԶܯI"д(sn.^Q 'Xjժ>y޲ÙkBZ dTjj_?Ձ )Aif]|C w 2G7vׯw,g']D'삥O]:vi,x1ofa2r^Zdc*n"G̴2ӸL; 6+jnxh@PWȃD  tlp[3KSR(,MYj_-2*5EI&N9r7Le+tދN^fi-,q&\x-CyXHEk5kٖWTineߩ `ٲo#bBzSP?6/[xy|s7<|vن]f-*]|mmafm~*\wiNϷ^ m)=N$1 T#|.kD<~p4ch8ݧPDs:t͚rP_.-EfiMQa=+}w1AADWzmYQ'uر!4%XT *MI&$U[{ *Vmh[17"Ɵ{H䑛w-r7Pzu[vx,}3ׅCDlՍcWo/[T.ryΛPEԶWBD;Z/hPvp VnmQ*q'tWAW0)#ZD\&Bgl}ʬ $CDf}溝D!u*."Pmq|Cbvh+Y\p1?0%ZEh^ӊM{-2TV(*0ӊqB,tlʍ w:lk-XAfL]EQr?QɕдWW?p13;:sEPԭ[nUOI5y3W-ZQnwҚF̷?i#8޸eRnR*ZիǍ<|CĐ6_D=utrcxVښFzQw3lӾ/Ϟ=F3fo-~`E UeC k?;_[nuaw8؅xƉͦy硳L{%D#۷G6ږ ߼HG⇆LU, :pcw8-h)ywGںu+KĜUW aHD n#z /_=Q!s 1cG%Kg˝ wֻDɒvk J #rqMH AlBK?,4mbyBZs+_mn߿b4ɋ{lV |n(o?[iWZ3}A6,|#ܞ^wPx6>[k 22tGe%URTK)j$x]nF 8z! rbʎ.6n7.̌ VPQFNp;mH2yYj&ln(oy-VuC,[zK]nO]4lU ,0y;TYFYuN84Onl*̑^,jP B iƉV.mܸg8f#EhтnDό K]Et!%0c@yGż_sTU-6BA 8s0>nwQ*LQPm"$Q8 C2fЬY*U9sϯ.D V *D/A80O^ ,-Tco0&d8yO3q)ۆ0oF)̙3ۆ.dٲe[.$$.U5mڴH"r?o_Ff'.Yl4#Ll@ۼyۏ1&޽;«O wB~ކn`O'$JVsP,a„L52¹*"2ohUƌ[lҨg;kw*^^W!8v$SJշOAy;v`PҤI%KVF G$%KV"E qF1T"%b`0;dS A)SkD>VZ-Z4܎H*`ED]>ޠ y%$(P6MۑCmxUl!q;yы@3Z|/ ꫯ.\(Nb4UEEic\|bR9"|R>Fq A@dW U6K.F%_&mܹsܸq݈guTѰaÃ$A'򛱛TDSصkСCQKbbg~ ,9rdd e+bi5~sIW!EqvM;v̚5)< %x"Ɣ(Uy3E*Z&7Ed)>}zvQELķcwX T!O4:q Q믿fO|D C<pdw Ta{+>wԉɋ㘑n#PS(#kY Ύ8>)3 u EcmpY]RV-6d=0$ӂ'B*|lP@~|G;{NA fU M8Q(C?M1>aϭmoMT!L&q4Aqԫ<\#jAҰa@B謼*m0a(g'fPTW8?n23Ȑ!~DW'GI -=)]F7{PWaqx5c>=z_. ܝ 1ZEpM1']T!-JONEVJ>1/跈4xp)WtV|N6-6\3JQɋvG9UU.L'LpJ*0gQG\" ؁*ćƳ#i|Fb[c稂BB[] hD.@驣 ^gFmmu;>Ͱ2wPIAFZBݩg'Eh3lG:?.\ TaWa+mŰP FfQ(L{ԁ6d1T|TU|`GGGFCq/GB*뫒ZvYF#y::(VB?\]W3zXg0UBFKf[T! rl*ė ࿜88U~nho4߄Xo#ʳxUxުC^;L?v? HxvuV^N0/G˅<)@B` UԮ]{跹sGQЊ 6˜ʙ#bql҅N S@<2VPp3vݶU:GvjrL/ )K |6Go-ZCw&i5# NjcUʿS;w*įr+o eZ988z~nho$ 7Ta"Uxq.;\9u1ĉF^C˗ObŊb3ր}8ݚof3hr:y=])lAҫMLrǷV7 *OmF8cH).W \̇I CKLfMZnt!qT%1?q PINgDWaWaDjy'''-Ol b؁e_, V~[GÄA֬]_ zg(7]]aQrGԡO*1wa0FC@QĘHgHFO0%àYx; (u~*S0n mvО0DW"<ՀA0ziwjp!F>2>-".uը"1Z{1qT}D{`&^xE$ЯA(dG5У(FN&(N>$O>cW?Wx%h&' % b/QUC$Rwks3ʬI@J h !Acx V1:яGcFC/;NX N=DVwqUX[H?wGf&# F ~Q*%=c9`~e$^8@;%bTdC3vsP~j;|bb8/vUha*iwk[YՓ2aD%Xpk@:-tHz[%Df7:x~. a Ԡ"v"{t:f߄sQdK8LjRڳTh@,={-("amydfq$]"U !PB&B U(R6݄KP¤,UH EL^D_ PšhH U(RB"E@aѐPg U(R єbDC@[!9A-+F_B)40I"E~H U(RH"E"PH"E)TH"E)RB"E)RP"E)RHB)RH"*)RH"E1U YJ*EFj=` ߽QI%d򃐎rU0{M%T=TMD9XfJQ*O]?sTRIHJ|bQ,@\PI%ۤPJ^F;O?_J*IOPŤs'UR6)TQ%GݮJ*ERT1TM UeT_J*I|6|po&Ny8}٠{bn>uUOO* kذBPpPgi@":h힪njyOL 2,@7T_K4o¯*إcn=6t9:wV^B1U ңdɒ}/^2StU=;X wPZFnLGq},eRꌝ  ź-y^)+vvO*y1$)TAqg.ǶRdΔ$MH U(TaVZL1Mč#Ge*U$ctďCpg Ǜd7/2iTk7'\'uL$|ܘafذM/ϫ=kUoiT%/>??f$?Yҫl66ml |tyr+TP/SŊ%y/9rd>}>ѶLJ3h*W& E|SVZɿ]xWXl]Tr-eȐ/%L@SgϜ(QB`[)V,ر;w UQU) M\Bf >=W &"~7:hB\sP YEKU` Znت[m6YʸqLW\1j&JLRX)ɬ5-`kf~@ek- 6ewy')Wͧ?0hb.򫄙1xS#9{oS C-gNMI v\ވoӥaѼ.+ FE&I/Ӷ& 2g*RnfMʩT U|W4 GxSIʗ%L ĉ|*(ղ99 MRN-sWi9clRreƋEO-6*PETѪU zk+yKVJ*J~eVS M2)S&k۶NW5TR2YfDB UULXs/Ϭۼ i3dTim|WUL NFöHuk7ok])Vj"m5Grи}ĉ'(8I 5q\l5$įEKWzglhH_ ψx(P Y#`rP\XdE⻼"74x3·M*U^q|;,qU|( Hs&mG>Y*.7zx63L iH$IС0i/l&}y, C^u+W&0aKwvʕDΤIA'N$t &KD ǒ%1 {Fy2eˑ] Z@fN:rrk|UYnK2.2?cl9ctzA<~^IQ朷\81d]Ooc7f+r(\Iw9y@q6 7rSim*Tᇨ%?zd3Ȝd23h7PE*ċkӺiB С L$F*r,̈G& dbg1*Xi3U(]JY3-Qg)Iq.…)2Ĩ!QEp[!Mƍ;sHn-Ӹqj(Tޚk6&2Mm~) ek`kszLclBKʡ-qF qkwU+iLZjׂߗ33}A/ }_A_mzUXi cṣ; U!0K˜5[@7Pŷi~怤DplFP7RqJ6*5*pt[TQC;}fIɬ9BQ*,I!VezjK ƍkr*Uz C LQB#HlAV|b)Ӥwz:a랜J4@?5XqTjAA_FQETi}+vū? C&Sg~On2!M?;P~52eŒO5{0*ՊV*bU0Kk@Df}F+CX>^Ӏi/ӈa Rriis A2lĉI?R xGۦkȯ`wGay_~c3k0*'5lڀ1?#F4` fnbC귶r{E  M?;P >sL=֭rU|*<7-t[WQ{`}=}H:B]B1[ӈBsǰ| ɪLdQYj=2;qޜ2 ǠPrbg_?3cA}f$Q]UحвXQVn#n HN ׀ ӯQo`͘IS,n,$_D!^׀K_߁Z_DK3Fo:fLPOQJzxqaOnv⢝r!hzRoJhuk5UȫꐯHiQ5 ӯ[$?MX=~/m׀8GvБ\7rSim*TW4_Ţ U8w YBZ.'f|ժi۪hzk1sTBK,q$D tW/@"ǫ ܅9^ŷ.ժy*qǫP#v.]TD,4s@/(bWDڕ%īW~" 8l&65)-bD*TkT}_HA¾^b-|/*n &$ `AסT <݆:#b'+082H!0?YMo)d U4*U٘jKT_uLpl$W ҿmU8GvЉ ›F#| US"oɄv+ #8BBE+ؚ`%KE̅ U+p߮cۭ-N #hF4& Oe +؍0dK.I3۱E ]{bq $=.`hѢ.EM][ ꦄ(X0_'d)fѦMCh*h~f>iyccd 9Ŝ D*Ѿ׈._Vx)?I9xB:@?o &/J #G0zNy܈XXK]>&ߦDm{=u@$f@UjuzKQx1jV 96CQNoj1ݍMJ|b* J~P˨URIHJ|b UPBU0:pJ*IO,v (%KJ U8a q-P;U:z':J{Ͽ';QEeD`/%*T1~ 'h| U*K]x7Jk^rWo VI%'OP[8 سԉI*٦؉*Xi7H& V"F*_z3c.Gi3jRU41>QŠUR6) *2TR)RC *nߤJ)Q$?$GoeT!J*PI%="! E)RH"*)RH"E U(RH"EPH"E)TH"E)RP"E)RH E)RHQL@)RH"E*~Vnm*J*R%/JKHTq䶉^I歪TRI%TRIHM^svBZ7DmުJ%TRI%T]*)RH"E^ݔ8Q1IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/images/edit.png000066400000000000000000001061621506652756400236760ustar00rootroot00000000000000PNG  IHDR285hiCCPICC profile(}=HPOSkUvqP" EjVL^MGbYWWAqvpRtK -bxsx>@hfuMD\dW+zэeIRuO}TwQg9>8 JAmZa;ukWTyFqDCȎˇ2n0w*@٫cCѡ Ķ)Cz(V`%.Alؽ}p(UN-KҤ^ӻB5um*io[P~VPB)hvթuC\hXR`⑄dS` :˷-ުqrȟ/o<߭G&b(\(Պ#s:/Omrh׮VE|Қ#@FS I9ǽ=-ඪ`T%lzWB1^Ņ.Bn -ݽ7&O]3|xų˸s*+}ν}pl%2>~|$s{xV;C\e6m}RE,] g !Dxӹq;m?viò}]3`~_<4+G$$l l\h %1YSD35-WB1c~TP2!Q5?ahP~:c4_e7g?-`[i7lzrTlXaˆMI:P$iUoO؄woVMK~X@z AEҔzp6ͩ p|rV_3g󧗜?0<`R,YI2hDv.QVͤqSrٹuۊmo8->yê^t„#';5 cn5=u0)_<óg3U~nh,?X4WL2ppǷNܿvL5KJ@/>DxdV}] EZ9CsIᨣznL& x(-qIce&eJ}l_\ ?c)<0~F|7㝰U lV MKܩEA,٠ޢxo gۖ1ƥqgUふ:6/o޸TREuiĉ˖|X63 һSCh3 G<"`^ۧvb~X~FTuwzWDHrl_:6-pyA,x?٠"zoJB&oSB?ax[ۺ[uspRUDG65;ߦ71.n<\vhQɇfy|xZ1&0ox}ඁw.|*ul(~n䎉X0;{y֙tukCFLԑeVͻvNdp:n3dQص|X_P]q&Qy*~tGl *փwۢzi>ֻ x[ MKߟzdv >P"}iAY}-kW-Z>Ը\:0}ˢAtѾQ3:C3A]\t^^>4\֪Z{%v2Ì+]v&xp݈M(Qe4T/*[ңIeK(Lpy %[E5^X!JUB뭟>!lp;CAF3u2- ]V!ɱbZxZ{Om# ISoe(CH㙖[׿v:I3׽oIR-)ɇ}ˆ T/W\JT1]IhZhAgJ={zbJx:;M$!-M2۷Pbe˖_~n]paɒ%qbKL4hʕ+y#X-ZjHi3Nv=yKΜ9LH7ol~ЬY3.}H +^{ -I-%Z##ׯ_`~#%m%9Rdqrg˖-9oDY8Y4>* icTq_t)gB\n۶ JJh)Y+\Bx`܃J0`=M3"SdJ>rg}f%IJxbCܻJKO?tݻ.Fdz#&B %:' !F}u0}Ȼ& Lhzۉ9$B0`!nو?BzZ܂?Z=ȃ߿?lafM&V=۝_[3(TR.Z*9;Hd'-9 >*JKp-Q2O8LC̼%Xxeӿo[je ȴTD z7P,|SMKa' 07lo1,za͝;שSsKF07/|Ғ%nD$ZҜ}]f*@w1A$z-h{Ɔ&#F-h,,6&3aofEvwʷӧ;w# KK+PO9-ؒO D7M"Z-IDKDK4pSd'XX|ݻY;anV05}o>Yu[xGuK7^n>|Y}_۶m@t$%ђ$%#-zžSҥ{G|CǝF:ӠQ]/vܮcAK9s`,$LiiY4{mhC/]c}Ըa^ҍ?.Ӡ􏟨߬ݴR3fȑ3{fΛRpATQCNZbJ龟 _'N{UW?IgɚŎ#=Ԥylٳ&o_y_sy`]8y( UdA-ELK_{6t5 ԧu-?QM3yبAG)CsQ;Ouxу!ҋ^;t|O̙!xW--uցi3}ȁݬ̨ȩ˞#Kgh AKtKf048u 17,u71@ RѶk64bEK 鈊 ŚFv_y (ٜ~xgN?۵IKh\1ӿ${ןq*`k0JOZ&*ARd4gtZGv"oV0y{ܤQΉDKpso?o܋-SqãKgK|rY|OZ1wYL !N=ETvAQuADKВ12bh\^-BQ\g>N%3=NZKYIY?Pώ}|-+]bX\~l ^y9,ⷱQA-ECKfдٓRi_fmࢥD-Ƅ@}2eK[ r h)͇^3s.Mۍ*nhӏ+jn)z;&a34rYeUJ ҬS̯+W?~dijk SL64崿YkiXٵjۜK^b"oK<勚l:1+w_ '>}FTADK O6-k!TXfKS]']ń0Fg!8B6"8ØG 9 "-Umˆ1CCĂ[uXoT1Ԏ!d8vH3%#.fLiu %e ɣ\oE+;&ܼ;;><{u,Dlnt5AK Ҧ}Ky/ -F-?\uLwl45!ܡ@x:|b/gZ ˉAUZ>8:lgX- ZLm{6ܷ^;{EFS$w󧻾B`#hlV>#6dRvu?DZ+F]{aFGۻűٲg#bDoQJ%Sb]:_EGK=/#'c`nqꍙ0b {EAaZ2碣%xX؉FGKO뗭 Y_px1Cbn\^}F' z#R1Z d99oC:L: LЋ:J9Ffo;i HŊMɃ[xr 8.{m6(pz7CϿӑuC=$eP:mAi B~}{°b%h9a/wӒb nOo 'vƺAj+>l, E&dSqC(ݪ!pQϒz; =7-a_z<AHJi8'߲2RZh~E{I*U$zhy<v%X XD%c7Vhj9i~-1q p% xX XD%bw 緟^-'_9d斠#K疢%YhOF,ђ ZN;]N>&qh icT=I<-!Xd @K(hC綌xgvT-]d ]FԻt|Æ&Z!m>ĆCf!13ph?n4 '-e./aUGxfV&]FuK+`>0b> uKQI&L1!XUBY'-aЁ"U-Z>gQ04vH3GdDK ƭZˡAD"=3=psTlc,}@6Ի~Ƴ7=wyXqFX@0aPt@K<,׬ p:1p'-1Ps,>Gllž|hIl! %AA$ %AA$ZADK hI$ AђhIA- %ђ  ZAђ  ZAђ  ZAђ  Z- %AA$ZADK hI$ AђhIA- hIA- hIA- hIA-AdIKW  TZBNK$D` hhGD"Hb$-I$Dr7D$H$ђD"H$%D"$D"-I$D$H$hI"H$%D"HDKD"-={h"wiӦ͞={zVXqȖ-[Ǝ!H$-M:-J,9nܸe˖͞=e˖iҤYv="C ɒ%JD"K{n8Yfׯ_w>|x%D"$*-5i$C .]zƍ+WN>}̙6lx{_~r:x`ժUPpa1cFB2eTN3gDdF WReǎpT mʔ)V޽sH޼yqΝ?U@'|\>쳥K۷j׮ݍ`Jk׮s窬H$ɽJKO=Mj*Qs[ػ w,1 ۷oO طo_#GHݦMV^=ɡ{衇Tb$S$P9۴i8gwwi׹0=';wF1s0eИ:bx}QwaѱcGlQZ܃PWH$m*H$ђhI"H$%D"DKD"iiD"H$@H$$a’X  D ђ  ZAGK/iqXl~vfⴱŊe{ <"ʔQr"+%M7![JKSgMO^]^bdǮ ߸YÇ6i=++WH1˷'{7$2hXk/\&%+'B%rR/-AE&F йmq̒5b{F$T?#9RJ勗( ؕԵ}Lq6{R_ʔydWPZX'.tJTLh)0[-%0 Zn|ӟP̙V2rԭ_;Ғ+;3fd -y$QR.B%#'pLR9y&e˞RXJuWڻ8SrFM0Y*>~-[4i7xE|߿9oJPFgySJ.ʨqW1I=׻|/P&Kr#EڣӋ^9--#L!O2%|۰QgM9!EOևMۈR^Hhk׭˼3qPܘ #̜PnM.{je:w5A&i ŔExuQ.XaBE_hÃ(և*U$?smЭgJϙYTO?Ř q0x)#w?}gK,tӵ}i8P&-};UVMif̝ ӖQ^PZ^ Lv-plظ;t-w|We PȈ;Ŗ& q̛/ψ1CݳO78 .'V]M>kw )~;m#My!4%P.p86'NūgGUq3*oJvz\R7.{+R⅊yc"^}ȏ?YNP5+۴}qDjgލC>L2"DOXo3>{a'Wg;+K< (Ȇ4*HzAi{9qiI CG"Ͼs?(O>{ܒϚrEO{m)/ZZtJ*Y *.-^D0oŊqi)0 ùB8gSbvKWh$-]A[*3&F.0cm{6$tiQ9#x˕Q^PZ^z߁fyE勵!}g=VJt5Xf9rI"@C䆨S/ɃFQ`hyWV> DQВ%ϚrEO{m)/Z] vtƒ%#h{_}N{ϻb>Z ]>\uF$2-1f/tɗ?oRR% 5mϘĐ&}FKakwQQ?Y3m}*h9EM\0 -,0Bb|w|n)0D鈕W]%3G2phfD" 8=`J(gJ`ŐjÍYC6l )0aBq(k+؃:ccm!"ZbNu2wZ♧bHK6gqy`@KGKDU& HdZ(B6Ja-t,rY@Y1A-͠r2 D.~;m#My!-`o֯5[VqP+Sc'Z2.ԁ(h 0CLˮ[cX1d?tgR c1O4\CZ֝`#<$HdZbFDc̺1TDi٦YFa) = S`J$p:k|#&`.($f=2V3I-؈3<5#䨋NHS^H[R1VA=k) tBlֲ |qdU(NAKaY(Z"ELK^*-&hL̊9 vsG~&T'qy[b˦tHO}Q&cumVlVˁ<!G]DfwFRT9R9ǐ* Z~>,t^P }A- IW}б%̩VAflzO&X $CH`6@ށlm7~ʃ AђhIA- %ђ  Z fs E!xU ZJ-Vc#lgx8m`(] ^JEf0"G3HNo LdEK6`;/٨RbCXO[f--mLY9 lb̶`r-y$5P։-E؏-8{nb;{45 ZcYJw\1ɖYǏ6w%gZJ 8*۵d̈MS_AHDcʎVhKXnv>_m٢ ;3@0D@V2gԠ[^ =|qT[ )|;Tqq Vn8]mžTd5C ?ы0X{f.+WĤs[~yT ꁃA8Ya+VJ<HR qy8Q uWē#qnAH-sKI6p=ƶ>4 7H`_:Rbŋ5y^DA%Ppe˞.:.NoZvSyE;#HjOOzВQ$u$I`nN ;ܼym#0َ} B%lҼz Wj8 m{6Ktuqqq>sapZZbwK. o>X\DK"|N/ќNT%H$I`9'WdB1 <#AHDCT gѲ4:s?9fcQ-9'z %ΜC8ԞI $L,g%w+4}\D/,Â]hxS\BJ%:Pٻ4f(v"m}2Zh+DoI N?s,`*-Ŷ`jۜkvMޖxq៬,~qAH Ĝik&L/۽YH[n yg1%&(HK~wgeL t3KZDTDa5Ҝa+ϦkCŪsx`8jU.?{٠koiHŨy5TyF8bȬ%QDy#UJ.j![A 5hhgY8և/YXzwyp!lnύUt1#DdrZj!漅`N%gfs'4A733"c#Tep wyÂ8>hI7v./v}đ<{QQ hOEM\<;g|](99rfg_WZ+6).Sc͉iP P\Oɕ;'jr_|Mσ޽XGMu?*\nڊJ+vwi4ah4qJ9xe5ҟC?hX{hf=hoG:ovg [DKģ%s_p|sh+9iC.8uJ 8"M9a "\5$Onؤ>uu@P=h'!='"hJϙLݦc[k 잎v~smͮ+@j)r4A_6l|Ke`$bh1eh*=C 10g9-42B;KSHsCLBGi"aH?$(or3ԉPp6oՔ %=щ!)wPǥB4G!#uqcOSDK(i9yyВ9C`m8J`i G{$St9N: iD['9,ɨS׹dsyWy ;?N,sɃxr :3geh$=C9e:'7hT׺ɋP%yOZ8f&&`ޘ;mbo`/bP ~J ZJ<%tY|`y/1]m{6˒JbD]1mLLH0lPGo:ח2gmX㣏r)BK~iRE3zA?u OP䜝4_tmu~"Ti.~蟖—ŜowNEGKd^z}{Tj(`qa` GOSR}&2>JWzS)~L ptѡw.K{ 3i8,uK~ jZO] 9dY -%<=}h?LErӶϋP%yOZE0:,"9ҫl٣0 v16*8fb)Qh)9KvbE 䗶uzqG~^h!%?@oIN`?g ih)Dh2o:Zd&{6oϡmX+|(&~*FKB%sK%".1* li0 -c]0[bZ8P='ùg iO^*-E}B;tȐp"V[b&#"c^?1Sy5$$/Z{2aV %w6~Vǣ%M`~~]PKVm~ŸKa-XC&A?d>iT[%dYPZJ`zƐE]T'-ш3F"6[FJKA >L,YKqIaXiLT^?%J-%꺥mBW 砮oulԷ0{?vȪ+hL`ve'E*W`"eIYeE5ZĢ Am=\d֐\tLK!t,iZuKa,(-%0=cHK~£DU1M))!XDZވh)hvf#:%Ҙ~J ZJ]XúTofVYKO=-0V 5ko8M&iBuAwy 5hR , hܬ! nHd;tbLPf,K IRؼ.-Fgc QfUE# 6Rc@ GOp0lL|Vް%J-%yK: 2A%JH9B<%K遲C*BY&D )0Rb1!YBK䤊 v֍Ç)*sKrBf|^z @- 40,C 6̸={fĩS^?.]J w={%֭H⏖J-tTjRko|z.wޜQOZ.Zǜѓl?pi4iB 1nZ?rmWhiG$kˁk%ZI ZzvqUfghj}`tV s쵣>řWfr_|Und=Ihn)l wvځ3fcNK2dغu}6}Z2.Xry!˩S+jtM !7fݶ=KR@un6ٸ_eP!e}`4cnkK!]\K/rDg~l?/S8ec܆U]Bq׸qxG46OKOI9sIZ]hJveXd[[ftG;o듖d3dM/٩q rW0+'-4Z\)'@;C;哖K+ڑΝNK-Z`g5jԸݠۼyɬmK,ټysrﷁ?3gĦMp)'?8.[6%@/_܏z33@̻r*>i t-1dMəj۩zo02,0^|bSg|G'-yiiܱur=z{nx*m[G6 Ĭ'.=K\i3dmXSEZbQ(o~%}[wV7C7?-"%^Pv)'o`3z48b q*cѺieЪϠ~h [SFc3B`yvDg>b̙3ڧP ЬO?6LK-ƌx\c=kOs[IKK'Wy7dJ۰43S{k˴ zh۝ga%N/6NyvY>:Z H9ٷ[۱cǬرcd%hiܸqwE;\۸q#mBWÁ,u4~m׮mڵk$C <һ*a>J۰Zyu[ s昽Y?l\X*.G26h)l əpRPlqCluzh5q`doGXo+W߯O %'hOWy.G\zqW+am:Eȭz{iGINKD^,>}}޽{,6,Qqgte=ϛ7ϛ<º;wKNVJ#+F3Qx] sԵw˰Uiy>ڑ#i 1\::D|ܚB\;5ԪHK5yS[B' V1\-'3.K<%Kum ZS7!.W@!*5˃*gvsc&30벅֘?) FAW1}RyCbHӒ%, `rlٲw:ݷVX[XQ3-?9=ۆ{nXC%H?ٰaCЙ-CS\G0ѣ-(2勷 Zdo[/0X!*Va^g@} %PM=<4f(n|R9b(c] N;K< :R-VuIHK30s} v\lѵ;]w'h Xv3sP+e+ :BX0@u4I>(L0ﲎcySPX+,7> *Tp2s::zV-v4G\wGi X3֒"W!@]Et0@6uoL1d(<ݦPsKN?|g}rmTJKjR@!;+N 6e֫y:Vacq H1R6`FMKo?r5&;M؎jr%~LMT`# h߾Kgq6s<\06رCOIB5l9څǍh.]QmF[԰YHcvѩHKSU+6fCS,001bd^8r )'jZbԒ4as$%R*lLFK-\VtX WyK WD5" fq~Lի9)(̸|}sLh)sKJcj+,h !ZJ4a<؋EK4-%>X&E*4-% f J $hZ[PC j… Ae#5g-M=wZHr$-]xg.$$cLAe#f IP{ZZ{%; HƘ6;@q/fs @xOoʎTR|3 t@|™b$cLABBC"Zx N8HƘeGh鎭1/KֈL~)aeǽxB# h`o!Xշ*;%ċ/$9uݒO߇>}:M^@XYKqߘV :(PlrHV%eGr%eGҞ_I@KΊ$hA+ގIxk>_z3oF3o<޲ӟa;Pvu?AHr$h)T}ÏGūRS&-|O f4&zIe*C t|ԯh)v0eGӒjݣ%mj3=*^+\;V|z ._!+v&m\diYzݛ|zu?5*t]߷}/Ѓq9x;#%@z K}h%c!ν}OSV tϕ%Rb¡*ަ3eDA[]cs7}IkWZVGsgEK-vP١-%-^"*m[Ki #̃}֬,Ӡ~9Lٳ_uؼB} mڌٲ,WQ=h'1+ZjƬYOs+ZuKђDKRܵjh@gൺu ̈́&Æ[^8Z*;R7O kZMV}[.Aeϸ|I1m MG z9,b}֯1oo?}}{ܹ쎷rMM=-n2ÄO|)Gx2ecׅVr%g)8_h~>L11&!!Pv܋ّL?RgAso:jnK׏(XcωN[pD7ܧZ/sυdI;PvH4<%K\cS>yB&*wayKآY#FܛBL\}/A2Ƥ!$ʎ{1;R4aoZ2::7|Ҙf˛70ZݻZ/{1&Cّj#eВsqIv#R:`:IUڵS9о{˼ vP١Hّ2h d?TEsW8c=8hfRBf=q1ѳO[(n|v]4_%!?{juϕBّ~ ˗sQlM-aDWv[;%^oLJ5,*n"` ( 4 .+* nj3޸'~Ηq?0CUq(NFU)ťƂJX2rѷonoסXʨ8)k#CdmW/Y0 c7lۭ-u#]ΫVcх⒒Bv…˗6nbɘ S G޼tF,1֭:76O6uvLﱔ\tVQ)z4+vmrO$}ǟ/ݺURVKYU%4 @>OoN C]\GvBt1݆ |8L|FD,K҉wvP5)9{yW{6sK1/JK}]XP[ ,UZ uua SN^'s=B(5tФ3:6 bXr$^O"ۢe3HKkgeʜs6_ ?Ǵ@\Oq[٬6sv{$U\yZ٭k`wȜ@Ε{`oYzf]ԡšW0&Cv%x@,FK&x5'DyРN~W %}>^ﰄTc2{Ge:DbueSyqDm,MsbW %-)^UcnZ~aaV\R&߃I>M -a"oSmOtRC{ۭKwn 7jL]}@KEſ](1>s%7Xr1/$x["sbJP`pjЫiKĒCk+hjHo%KXђH|\9/޼1FKi V:bNgH<h +3`M<|+ #Lx:7sq=i"Wғ6 % O^-=є(pnMV&1U7I|@WY\[zkKi V>՞w{wN-,kKV|T}dIkO X \Y"ۏY~稓nf>!,N f D<M _Xi({u|[RiE Mԗ{' ڊT]bwݾQAi6u{=nmUU74(,a rk^'^aa1%4hirL[o7[bMX2 Ivk*:X8.r ħp3U] >%=It'bbs/lz6sA:t[R[RK5 nKSsfTXxefSgim|_M|R7)z4%+cȹ;`ɁM,:&߾> NWir$yӊ(Cj9]?N'R }rlz6rKbI /0"v PC ,a0tw3 93ؙ'jk?1(PxGĊBJh<1bdN<"#n7ƒ51_l5F~f7,/ TC؉lj p*KF(̠X|EO\Ezw42꯱ y[Mlز;L9DyK ӑDr.Ciw?kjFr%"ʈϓl"BXʃQ&眻)MyĒ=dK7kdұXb;,Y,ly2SZq4Wr7}Z-Oyvyr_=7ub%L+!6xp@Wb Od};t2+1bSpr &|Ē@L6jc l9tX$'%d}̗^00HmOxև7)Z% +>RbX"%}dSKX҈g)l{ef ,i+e{ /Pr&L@po5I,K֡lb Kq40].`]=t(v}%Uxe'^6i=`;غ 'BǦ$̰%܇'%bX5%,iѰo KXp"qA .S6o׶h-Klx֡?b Kq4p8 .qI`ם=%'ʴ]8UY?Sw57#a)\ 1B LjEy*1%<-QBKlxDyKb`jG%#G1. |M#[BLi.o#['%qX:%bb?`uK4b AK)VD#(J,q㗑7K*J:I7ك%/տbu:(2'|f3/bu:( dN,QEQTX(%("((b(%(X((b(X^q "q8EQƉ@K;IQWD%b(b"("lTCf&hVH,QB)5% hX8ҭ奃K#[v;w^ h;D,KN靊aKߚ hbXX%ZNxt ̀!%)RN*s;vL$zyyގyׯ_^zȑȰhѢ/^ CEEEXXذaƎiӦ6yGCCCG ƍ[xK,M}6y'O8<̙3]\\xqҥgϞU[ZZ:w\|Q2n.\oc kKh4%b,yzz Q^^СCׯbNӦG̘1CPK?OZj<[lǩ$h4T D,uiҤI k`)88J, ,X@EC [ ޾}+6mڶm@?~<""Bd5jT{{ 6BQQQI;|6|}}EbFFDD܅paḄ* c&X^^b E\1j%bgb  뱴o>1USSd˗/a,{߿vuS,͛7CKĤŋNjrrrUDb\\?NGWlc=%G`͛7" 9"%22R`$\`dVXPP %`bI> Ȅ9I,zeeeI=\oq?X;tڒLH\bO)++~(GKX***ڻw/JKyC%@Sx!ΤlY… O:? l޽bn,͜:uITTtHL2fnbX"lGhΜ9:bI9+(Mciĉfb۫o "`BVH x )Iu yaau{(36?==*(ãcW?11`}9ѿY(rlbrCy[l"#`70c[*>*Lb,#;0H|0 lھ}Kv ?st/`Yxz&%ořքmNJf b(X҇Ҵts{ST$3Gsʊ;@ >m ;w۲eU!rJnZR>ƅ 1nˤ"DQ.>ջv)3%.+21%>k0&Ru.*ҦrDQE,u s:9)*67zHJ]]]FEYQ[!(5~93u©DQ^^D'NޡԆ l*X(RoUU3LxUP`:9*u{bjΜvݣG/XR(EGĻ}j#l|YT<>y!;[ӄddTηm݉KZ_eIĒa ׽&ZDbnwzhQd$[,{oرp޳f |1;,&u(̔)֮EpkPcz(XHXjP\FI1f3O=ˁ%DG3Į%\a>LW 1>>!|(3\d9VcSǮçZKEˁ}<~M\"Aȳ4ߥ y1DDQvcIQ92&CyТjjjf[` bKLzѝ5kM)E,ш%bz%eHï7l@,ш%bKٳqK8"2sŊ`,})+ki]1jKEYKk%J;N;w΄qt# Kx=b %_vM^pxY~f@C8PeNc3 ,8 㕍7*fdd *?U!c?ˑX¯nnP5E Y?'ְ҂8]!%%K` /z,Gb ̀q>,(˲K8&X~P5ty *',SiT)8<]}%fRMN/[F,Q`N 0;ryyyN)W0wUv#ôۦMZ[[2k,Y%r3̀f%rC3|?RTm%8~?Z(r$߯ֈ%%DQE,ш%%bX("hEQD,ٷ(M'%bIC}NQ_XrB,mߞ*{{{K(XX:z//OWWxJ dă-,MJKE,9;ݫYnbNӉ%DQK8aP[ rK1bD/IYNݽ{7j"%&N=43f|O,K5$;I<'N@zmmctP:33kcܹCH>>'[G,8522tHoWWW\ wܮ,*++m OOz;7:;ge9YQQx QNTT㻉%bKmmm8\g.5k,???չ}%%ؼy1K.fώhjWr.3租KE^|)SDw-u7K"O](WQ(uL)n54qDڒl(#wic Lo`R!0l]bj;mLLiUxpSz⥤ty?JM] NK,qX'QE,ш%%bX"("hEQ·lvThXa}E9LVZXPE9RA(((-,9>(r-,QEQEQEDX׿W/ӷ4Ft[nI,eJӫ(Ft/Eb(Mh4f|ӷEQe,?H IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/images/effects.png000066400000000000000000000650741506652756400243760ustar00rootroot00000000000000PNG  IHDRUEsBITOiIDATx]\h&ػbW{WD@.E ֈEņ`" (],KL1W+ }̛7>&!!!!!yW@ #ػn&WO" @x{7')k@x /&"]S9ݾ \;U3O~ji&X=۱oXxvzĀN<ϺPW *W*Nٽ0rd yJN\ȁY]4CPz2K׬^53 =P-ԫQR43aXs{_iSv \Y\ν6,v3CIloJZlOkW`z:ٜw[zpzdA:ULiTM a&g.{%Swv#!?!n; 102(SQZ0PV$eu~7`P3Ծ3dީjTAkd*OV*ˤ%i*Uuds5D-壋„ٹ5mn8{]˛sln~0r W{ENR:ґv]  ˰.d0np`).{{ 6C#'9ܽk,tn=A@kbOkUcE\xuManAC8Xul٤yN3e_yvV"!2ԅCAJ`-C{qi~Q8ǯ~Vbל=y#˰}ŔmjU\l`}-EqJ AlnnK݇PJU+!CJC܊F-q R9l\Үur h2 NS! MtA c;=~nWOυ (66,t ToB6O}|I|.ɦI*\Twm{tlK+qZD ;y8&[|^Vv0Pm t7RPlRt7Q{ ksKJ@L~QX8@ ?4I}pjhX*[2Qچjr|l >ë.U)SqسiԪ*߫KkaU,P{U@& 풓c8oZ? J?+l_~苀Y}qʪE}. )c{O?npgVݵkTa^V8Tc4 XI#jë]FޓDN䍁A:+Hg퍗PP(R;~.dˣ`׸$5`Lwv*TlPm6}4G^xQgAbb|0 Kt|A6I9iٓ0g!zu]Q¬ra+=pþe.BQ:l]޺1;+*(Njzr{*G CU)e0+hNͪ{"s<0|&,jGmRlZ2Qv\|8.?ϱݕ~0AvEm^+sVzvnWff]z ӵ/wlմΧ洇H4~3Ony$dX_[_KAgFMQ:bTx/; F:h %Q,չgϖ̂X6(˰pg;QNv75-,1:|"TNam,4c ;EwSVW! ;e,kkZ71{^jD-9J/gX0Z%->kڰ6۵WA~# ҙAL{:z@_Cզ(4n_:A k=(W 'dQٽc3M>W[ 2wN)eX᭖`פfJ(K5FC ֡)[M> NXo  Nvj3qnӬ.~gt>8Y'0S[(Mjq޷]&֮QGgjO ҞAg{SjKb|OGvU`׸GZcx@ ,p2WD/C » :}IT@ ̚A.`8{=JD »i;*SF@$$$$$$HC< Iw$$$$$$$$$$$$$$$$$$$$$$$$$$$dvӧ 3   43_}o__v?&? d?ŦGvׁKb/bpLmְI-h6ըQR[5:<􀓟ϱJg"~6_ASΝ;]SbAI*c*j\g>{_KD(&M$7ނwP[5uVW@<dO0* 0r]aBGbff[gq}ϬW GJgX$Vi'u+h/_uBGGGGgN>-kĵw"ӜW@Yjߥ?|E+t 99bN+ NL _`W ??)?uڵk{h ֞Ng?Ds+۟߷eӅWVfCoHHS5ڪTBtߐ!{p`G۱zY+]ήs111Vzjٲ%K_vq/}tfj$VVV<8iJ7S{{w |/42e888*U0lm7 f࿌ v%JbŊă?t?߻fԩSO_6!?R-)Q"l2v!9R~}fm?!ٳgF=[ ,ׯyTVS:' błX"\x!4}bY~\%lؒTvպ«;8ls%k~󹳏Nl>>._ᰭ\y))dРA֬YSѣGǏ_^ŋ)RB ݺuҗ [XXX֭K,YhO?t_bŋl jdeemvکeff?j%':hJ LիWa TRϝ;S>E?Yy/ s3@[J^tKU7'Qc92|,o~)Z4]em%>~}B GHr?}ڗSn) 02eKD iۿU&; @$UZZjqpy? ?~,Y;'tLymڴQj"T[c !}E1xjo}]蟄1pI6+ kx$&}bXʪi,p3yvOz\>c) Yʊ$5goo]r0%nڴe7j(aSZZf:ƍR:u#v,XgeP57nd&&爦9-˗/G 41f剧O+E>ϼ1cƌcǎ޽{ҤI+V0)DG[g3+!y7WB#Eq5,]_%֪)cbwa |1Xr$|PD_Xg:_bEFF7mڔ%8P$СCpٲeJw5:.y:f%WߴifMbDѣGfB[BO/Z0";ĠmۍSn,sР=z݇Gu<X`D ʕoi⿏ !m, 0v/7Ay9?-V)?-%"MX TV2p`1LJnl,oaDG"~??_Q:U'kR04P޹sG%PH , +XD~ /_3g?1"b(,̀ N€O˶U??K"'voƧvVR+/LpkKsbRG 'SY"?X$a jՊǿ8p@/`#U >4iԩSϟ?GHll[fX1ǭX6&mΜ9Qc ܘB1`߼y ?2fd9k,xt'z Z_ttt\ \o,E2 w,l`,vX d/³!o)=_?bo|m5-}DG yWO(<$s{`)o- ƏJ oD|֤ER0[>?j{Viboo>$- /U⿼|۟H$/fHHHHHHHHHHHHHHH 13^a?JK    w$7|@ z.Y[]^D B@Com |-@ y /F_TvvPJ @ y \ѣ{a !oGl @ WCHr"!+R-@ rIG ?@ @ #Сwqҷo[i"ebÇO(%eEz̑&6=-UľwopT?@ U_2ڦOU';@ -5.qY!ر.̚\>xg8e ,BfU m 9?x,v`wȯ׍1rԍ<7~y <{ _~>{̛CW@vr?HG0I$)?5wKE{ם;iGs=}_}wӔ+/܌Ov 8LrZ_?zeWw<1SrJG0 +H"1ٹsg^?WX1%XLc?e=zq'>Vbċ\x9pF7Z֣{ge?ɴJE&ҬkW:-&?OK?TXήi{{0YG3_p`A..go =16]wޣY/߸;h!t萛!!ޖ"E\$v>ªbEO7Jnws~Ye%_Jr75\A^ɺzRQf?.{cF?U5|P^s{CvmO&,%%ٹJ*E\r׮]cbb_o3gΝ;kԨarVDJߟ0aBÆ Q8VlxѢ 9wfXojCyPMQBKRHU:ymdjU-?,S@IΓt@fmAnOɇ}rgvp>cAd(Iϼ5k!u'_~ *R>I:,)_|x``[[ڏmf5WE_@@ZSc=zw&5zb%KVkؐN $AAaE:-Z ?dhh)SZطT{\_=w-u@ܫy cxǘ~ٌ2nfi0MG7/\z3VD9W;@-,joϟUa8r$*tjX:{G##k7o^X)ڶn6E/^~'Nfc*})EP{oVhŊOMM={lHHHժUot/^7oޑ#Gڴi#YSB2ew`Y'UVȑSN\M(#}{cI22|,pTSG,pAgKjjܧLea$q@o.|x#Wn?|ѥ[3n> b,pX3̤ WFV.P _=UA՞*,sYJ*y3K,] y!Ɂ`c*Ԯ RހD`ݿ?R>-fMF0ٙiԾ= 54q߰M9:U |TmՊմ)KlKkx1d)`_6mP\RF !:;wBI0"7̭gi$$h o3cc_S%+EWioltBkǫJ,GS o3**ʹ.]e1c;YIϩ;vh"it?X -=xw^==;}|p˩5|j^Zb޽e2e ~AgR o7Q~EG`Z40T}3xכw۷]'{{^v+=?x2/e=~)?q Q0~+SIi~k_}CKu䇹7Fw+iie0=-sN:8w/01Q$ v(S.Ne>lXtekC/#`6p֭.=Aѩ?X Eӻ}ر,ΗU.k:ً072mRj?/w===eBRF0>cw˻^"LDRDdWaxLzsN&]RB|B[,h^y"GJ!hg ϲ9%źr֡Xݺ>^^b:Z9)YE8 SD JbhfcyO/ &ea4y!:?qJ4`HՔVe( T_U:lZ#h"CP4~B"l{J]?굟eҢE YzȐ5kMja@i_]ɒ#&La٠0t#+] ߍC N?2Ͽz$gH/C@%e8zԹGw8.0y!<5gqeԠղȎÇ" t]3)b#P9e CBZL}c($W9"۟8D]b-8YKxrJo"O`:`ѣ?X"6G֏?Q)&xtN=Z.6662eءY8rp  {cu>`JxϾr᜖?,W\7)FpV Cx[tqOByfZȻ)fcYwО_}eKP>_~I@>p^2i$ټy3 !yl_o:jK`ڵyfϖA*%3=B;w61p<Ј굟e{[NwJn?Ml X&`=Y ߃EϲȻY&X^vF?9aC=hٗ"RT٣/qp̝On|?yP<"Ppa.qeX u.pɉ`kKµG FqݺT?}3"?WIJB'1AP,|^k}'Ձl{= :lF;!ի{'n9@@K,2# qqq4]x0ؽ{w [q߅[S50ac;-Sw+/֞U(Ҝګ^YQ___wHD X֭?Li&-Xv;PT_*UP1hm R/\&]e? /4=~ {kp,X)UN&o{,zϑACर00 5R2^xM XR~=wOLv/6fdBZ؂Ox,4!2{nfSyl3vbd6$ aH%ր/׻[u9w~kؽ,D6@1c|W? Y؄688v[@Gp\bD;0`b^O=>t<^v: "91%XގP89Aupx wB"mxĦ6m'ZH 8j$|O>wo۷oѡHNi3ؽę']b0 |L ˒߾|q+/DzBRpYU#W Ǝ&LreG㒱ˑ'_~+},7/~o=v> O$RjNG 1v횷mW"VŅ-Zoq=qX8p2p#1?0Wnޣ^{FG S+*Uֈ$wύ|Xb;<gkJpC6fM+OIsFDټ1ߪyzw44zn5Ai<-J[@{dƖ-Ҋ@ &d0uI?@ )"{usE2MǎXhO?@ \xӹwo1̇ͰKnAZX#%~,q&M)?C7&#@ ?@ @ @ ##@ @ #@ ?QNݻ ԮS'(tELI\C`^T֭[wqc!qq =,pQ'&MruuznӦzx@%tEjd :5׷Cn"q٪MUf;oog[\CUm׸kmnV JϵHT5aQRuܽ]777iȏ,5=uMyb>CIFIJG= >lǷ .b6mpq?]Cp^ +;@ʿR}eA 5TͿc_0݀ϻlzoӦ`jBhbwXt.ɓµ^1X2_*zK QkE䴈`sz%.ig[UX[fjjX2NJ]ſE4|K=e-zYb;8;4T5!<=I'C̙#Mpw3+6tDBs=U'bb$\o-p[ڪ>͆ϿFg0;׮߈kՌmm s3 pUdˇnA NIv%Ry5]=4~6&bI9&˯u4`.s~l=ï0->Yv̽$}#oCl.U+F=߰z߾.^6e+Yg2ħW"%gy7O_~yˤ^)7XHa˖pSpgUeѐR2gt P{*Di" Mnβejj޼o5q/_3gn#B9e<+"bE&W +O 0rvb6I\=K`q+Ѥ Tw 1/篿ͼ8!V|M.Cs/~*O^<- UKhX37!:5[vIH3 -~޴E:ՋMHz 84}jQ[$S)ʔALj) #?\yWQzX`fUeh ZFIm&Tb*<籔F҅@bxg.>q;),Dy!;>|'iSu“'ӰNɢb45ήG^SNC^_SS)P AISn+zW4z|Ι;W.yKWo͜5`/(L~qљ3*vt6|Hmd& ZTZA׏6(м|O/ %D^sRֹ\B"+D+ڽ[ݸqgڶUv2E/ y'Kuavr{4t2>^+I`AISSjg)̠j'Մ~?NbraC@bfo|Vi$6Lg-e/i|(W"7n~\nixrA,SMͼǑ"O gf] ֽ7._w~]W uC?h" ziנH1;?(iԢ Sj4zqtҡأFvG(vT4z]{ jnFIp(ɾM #< K[S5 \;%ZyF98s_=9W#P:2\u N!6+EU Y:,ok4p&P^j?)RçnPҤ(rB|U9ɜ}I3ܘ.Dߙ?ssParQNl n߾}׮J1ۤQ9+UՋpTrEԳed` K15K@\(5f-?$,5. "ڃo3)4TVonx_aAIWU7|1zXXm&}omq|nV/T^.2nFImbpTgp޴cyԳ$MP_-ᅮ$dɧ=,ѸW`(&Y.DGp|fBJF|Uk bʾ'S4Ę5,eVgYQLᴫwL!SCOƈW|mLWZ^jzWF_=#@U<Ӥsx(nqD*lT.e 5(- p_2ԃo/'eZ06 _ٱcG^J|.޸o#o1u{4c{bh&Ȼ-l̎DСtqؾЍ2uds;Y;;SIi)v [LGɮUB=]wM!ԃJokc-^YLWVڲJzUHJ7z&'/L8O>>WSBiS|ܟYͺ7FYjQͭ۲?X*lШEwe5t؈tSy񟭽=&HS'{ Fݖx y?I1˿X{;9p x}Y^Q:{(߸O9|BBʓ2z z}.\)+5ϊPo{un3.yΘ>jW49t,&Vw9'N&$IHx5ڝYd?5= SUOmi$r&}K[I=4m^U< g_*HϞ51OJF7ӶEl̛l3KsƬhϚ Xg O^~7@!.Ph\{L %ЩB%ZE+Ii(S5Bg%[b䥊kj(vI!A\g\>0iwLZѻ&Sz(m|TH~z?OY[m-A%_۬5&Q(vJAm}>)tKU4q1/1 FG/&:e>} tEs>B8,ZfښG^m[%az/e9jKUHzw~*}I͚DIK{ڨܬӢJ;m3Uӽ|Ci(CYcޭfk%n̾K%>_Q<b[[lh:J@1~%/(JAlw 쌛8ـ+74T4[3KJm_4q#{oVbQ3/chu&-mI=굑cgPi'~J>ҴQڛk:u,wK|Ӝ6o_yZ(olpkbmL3ebK7 +r09E5\x頼p]Pө(|A. i[^ꉯރ%?vN~p7j,L7_T@g΋{DxAUoiYVUO:Ij']v:}ǴI,c$kB-?_߷H>}Ϧ]abK7dD; ڇ ;~&EwƣP68.zo \òˏ|ꌤ4TR'ZjQSRjzΤfQ=}@C3x3^6=SUt@~6\jm\yҴQڛm–1)*r`hfNrF6@m }(񋯾C:2 ϢP"GwHGC59Tv? jމG⌫5kp}TK{aRc}]Uc UKFlQs6Ғ`ZxP|ݎfKZJENkr{,+{#  b~.I =wJGCGϾQObTמ{{騭JKmۚA=C%(>)#>βM)@” ̠LqW,25!Ml-) !%g IPKm;RhV:,ݵ#fX.VJb{E,IY|E,VYon?pʚ{FldE9zɓziyQW zqJI=j7o騍Uf2zƍ|(l#<}FyMJ~Z"_ML4YL~qљ3z(,Tب{%hpWS>x*_j6 uBvi(sw#{oס|KML+֋\e!ڳ?aV(v\9T2ct 3 X*M TTåvKubRL4{A5{q| VRBL⟪R6֥_?,zްOg-1lK7ͮçO:~*93!vILq2   PvheV8ꕑz=Ƿ\naԻCj)D6:t7gfo/x6ټ[w2qR;}a|ꅧO7O&&Roy/F ; M&IYQ~ǎY%v"7.ֳc&6a"G,`|SX(_lqF]~q5~cXTg4|ގT/ֻZ/)3S :mK#R\)gu.0W5%&|Zf1+vxȝl(ibSM(P7oM4~E4ki=B{{0TR&W0ӹ'(QR7:r5<m Ν۵yk9;#g}ݻ 0/ԀOpP{t Κtc^0.Ũm4&7RCmlT~?@ @ #!O_Y HbTyN/Pwd `ͿHLaf'mgm2*TWoܹalkD;W@T]y'O.Z+_MbrfSc )RqqĈoX35{}[vb!$/>u͚TYƠ ՛,IL4\S"SRdz>Vf??Em[jSKkn"gL\Ժ?ĞfSR='{S^˗^韶jϬ?/9`c8(h Z98#cP၁8="Qdj I3h<$IDO*\s˖;wZB[t(k/44\J\CEfl,Gvʀu|M=7x;yd!|w58 ڲRDoQIoω4VvCQVᏲUì4+[*>O,U\MԶ!J~B6!Ϲ)¯x v, L1;qBeYhiS@DCEQ#lYC7p -L̤gR%s?mM^6E MIag~ +VY5uj^ZtR8{aeݿ?R;G6ڵtŊP >ҹoPqcYU25 /S`6e _&ksB[$:>ǎ /iԾ=^5' \n:o |glgmBNFAɑ!!J-[G!;wZ呡h~DH~@*gqCLTYٙy ` /]-,Y:d!B Qdؿ_dQo o VCˇ,|zDӶnb,)t0kgt%sS/{xI(?ſJ忱K"}d[&;>S==7 _ro|V={+QˆI$Wh~'N`CMUL]zXOi٣9 ^0qq1|TTE3T)49n]#:O-0ƴ2sѮXj X ĕ3:K0'dQ jÒ&  il1`ZU:%f tOP -7%3"N)^)_%ߘ0Yyol[@\#Gc]:occ1A]r|IZZ/c 䁯Wsw޾N?. q 0(j(v>\xfJN(LD2ѩψj?"aD<3A3PB^l<T6 ^r“* |)d#Six'90ŋ`_诉,6oȤv:%0xҪ?{)DJ x{x ZTr?!Ps &Hm GJB0a}\Fl[{lWX  %;k^Af5E:'rOx6 $p8vɀC*f3% 85PG?#+3k6nఖ5x1 .|ٲ %'Dcb̩J??J]b;i23b칾S$Q+/vrJ ~8,@ XaNY^p-:&y0")TxX%yԃN ;3R) ;6fm>N6Y( 5.-T̘&T8i?Ic5:|'Ӻh>]CE MF;7[?pl\),ZmȠ-56tFL17חgukzIp_-\區!w0 0V`bD41bD"4 p٣&-RLwZx< 憀.f# ԢanDj?8̀V3P+d}n!o320D>#hkxQ6$ENN&X4i VBDs Në`F\WIB)GU/EV&/>śp^++$vsq1'a*i.A"-vλdžPҥI;AH1ū4  `^'wZ4 H JA@)[k͹;bAAq'盹ϵkU7RANߎfPeu[؊F0Ѥ1lA?r*I}kX&@,/F ~+%@ @GG ??@ @ ?@ @ #@ ?@ @ #@ _PJJĭ[@ -rШl@ _?P/@[@@ Wz_ @[@ > @!@ -03.@ !p3HHHHHH?$$$$$$$$$$$$$$$$$$$$$$fHҧO?wl '0I z1HHH<GvIGBBB7.9ҩqz}TpŋUZ])S^5~Q)RxҤabcp! ^$w-Y[8"tsYB=;[2gynfΛw|X'N/ ;~Z֦M͛TϮ_2gd&cTWԟ<K_bg ?vP҇"ENEJX̝{A%Kգ#G޸R/Ҿj~.Y…-VZ~5>(gРʕ~Ŋ:ڻwgFcQQY"H8qn#.[ -Sc9?wO#8bch ~r[!g;U` AHׁ8lٛٳo]ae5K)Tݻyz~dk֤oݚqq6!ˀ71/;%]0|{Iժ2vgEf !!!3'5iR_sNNݐ޵;޽#1`(-#XHoҤq^hM |WSĶ̘qbgYΪ<`J!#?Dۜ>Ү]b9a ~`.VIϜOL!J..C@vfMgf /mذa}׮ ܰfS:q-0uN'۷tKl;5 ƃ_d) 6uUŘ12ڰ +@%6n03|‘^11oQĉ[R{NY=++W/VepIQ"#0}t2 FL?3t?X#!tl6mXnOLZ_+cuB?xO>K)C,ڭK*an3 ߭ſ`N)Rjy#""ʖ`A?JJK`m/r7#6AD~w^6mA0'm X EDxxdav!bAY|Uo5bۛ6+b HHHrY*@ؿ,\7ƩȃFuX8c7lX$q.bi xcm"7ȷwY)2pzHHHט]}׿c^T} σKժU(Ʀe:5؝ȒOO d5%!vA fSO1Wl`@56׼wyMzHHH0@K."h[tizɒ?ֶ5<îfE=b:t5sKIP/ f#Ei 1@0%^%eoi ZĆI>3g̝g9yNZ`X,b\8pؽ}78p8.\#!>Á8pp!-jt||$8pÅm ҿ'u<}%A;8^3Gq _U [VϤ0b/=p=[y&?o׺Yg{p/Njִimg=;Rn,~O/>ݽSV-[4o֭KyGfְWWLاS6v_<{l|&uo C' [4[iSM6{){x3 ҩO4[${^q(Kv6k7jӲo|*F u0đ/xn*e  istbVK!^9fC:#/n"g;rdSٹvOﶶK#ϟV9aTvSڶ6QZgdShB6JH;A8.{ bVOScv9xp[WZLp)z穣kdUa fש?}n[F;Tk^8+)bM,5'{MSDNXA[Hax]K{SV>Xga0„*ҹ}ex 33Ǵ@ҳ[E1fXu zy6ŏїbk N1d >S5>?88N{IBw|MtZ\uFtEN G_kӪ%-n^:M>Pdqf}{,5H'H[LB4$M\ކՙjקϚ2Tڥs,v$Gl&@Q" Y!--;vγ`V;fP1zW?bW(Fpge5Xp-A~[K־)]zWvIųFQ䙀(fԐ^RJ>} {[u{v4#Rb݋b 7buĪJ؞X͉Y>lݒ{`ܪ.lE=rHUv49ׇBn%WԱ}!lZO>Ndཧ4)C1'}WU'Q|«NrEm3XZ8s|S[  X՘@݂3pRVEwlC[UmY5ҏڋbroG1TϸO4C˫ᕒĽ^ZLfrU4_uybU E=el޴ z`UHǶRՈeyZ6~<}]ӎv? 鶯y'ªUF zMH~yڿavUgu)[Mkz hJQI$o>@ɽ wWcL?G.Emldʘ5m[3]'ܷ{f~ddŌ[ [:ὂbʲ/͘;u(5M'Y1Y:n|5vZا.[WM&\ f U\:gذ|j V~poz hBC~ݕt -1l]UkKg}ůI]Yd- `3z2Os4)oGՓ" jT|٧5췊>l`;۶~}9\"پ(B[`eUVO?뫟aUfF^"L$K_2 |Z<88-F?^=$HŷU ׮5Fr0D_M{|>/ݾ#78 1[^^6lJ] [Q){ OY1UݕN^f1duҨ>ՔU{zv߾juK'Z QUs҄l_2jU J;_u?Ow(UI/>pLο)v`q&5m|նa5^S}a}-[6٭ÜgGy?oC,^>w~ݺtjc(@&x)6M5}H0#'pd|SP*OAk䉏ٱ:whzNI0+e[g%En[lϮ{<JJC >S&V/G/~<88|ΩB?N 8h&IbB?eH97< ޏL ÝGU Vh/Z[q+W!_ XFTuQ=g98p'U!o^ā8ppaǪ UHq+[W8p`Pt,bX,CP(gX,bD1ұX,b1ұX,bX,bXt,bXtt,.ρתUrﻂb1լ]|yGbbb(fԩ5jk-LK]ֿ(DEI۵;En#]S2(]Etnsm^={6E8b3q6yHWVvmϞ_mF?|Cvk|ڴit njc׮]q=zXjUnnxY9cƌ-[֩S'ٳ5kLҴmҥK f4h DH5k^i]t-Z\lZ2L{9ڴpBl3Y)zD[\\l$/WW\?>8J7ŋjkZ7ۚ4 !ڣ/`"nj3VgtݺO-N| 7ԼOGn拾@nيGzji&M %bWF<x|Rx}RرƍKKK=eKCk%Hտe<>ڰaC\cǎX/[ ͚5q}Y$ꗙzGzf5uSsQX.Tt:tQҥU%wH f5KN@ p5cEt0SCetëKZ y߱ aGNOa~X{ǫ'Y*B.axpKm #FƕB/U[nr ʫх8xSKO&&c#c^KKUGEvcx_LbZn_EYYIORcr#f$/V=E ?^u}Q>(kD}Wv4jD)I$Wn.=-Om?5w`=VuJ’M5o^EKHÆm#T=:ӋqBo*vT᪑7KT/^x! BBB$ոq4W]4`t0 oAQQQjS^!41I/ƣnFpHLtiiiX=}ՕC$u.>MDWJְSO u9EENPi/4%-"/#4ɑS.CrÇ\lFy4ݻwwx4?@tj4>A# 28qB +nv@79d j ,te fr<ߝtx`9 7X,-c0Y,?b $⡩8 MeXt,KB4dk38Y,#bX,bX,bX,HbX,bcX,b1ұX,b1ұX,b t߳X,b9s(G:_bX,=bX,bX,HbX,b3ug,>vtu,]wa;=ŜN{^WA{sտF5cs徲t),Uk)C5}HMVF3ұDNV@ .,^eOe ޼ 8a 5zH]tvR蘑OrСCׯߤIYftzF[n͜9UV**zĉI&iӦ^zڵ[h~m-KZjNAqZ ] LG:{5.D:A8#}HWcHRP: qE 6O>qҙ@"Jf=/_qΝ;#}jjӧO̙3 #裏>3k׮:Jиq?w=&l۶M u8Ez*akE+Xnޡ8"M 2D9##KHG3gqp ͛cuٲeC:k ҁx D43~x%Zf &''nݺN: _?E;tЃh&668|Zcqj7|O{toHg,D:Rs7|߿?33 M6/6lbv؁U<DI31ұ<2H@ ǩHgD#\J(@LS_~X1bD~~8p֭2XMV^ݡCZ]r֭PkH'Wii)Avl矻wMg8C͋Seuh/- >"տlcZ θ&+!b!,oxЪ@st631ұ'1Q 钒0V P#HxN8RƁ± *m!*ao%E.P ft1lӮٕC+#-mzxīLv$&.TPbc$TGE* ۸jHHTR6dT9Tj!䨃Jr-ҡ0 'Lꌹs"vO.zTըFR܎Y_WV}zZzcǎ$ső^c a aP9ƴJ]h@J0 QV.t.PZM*o`Po*(NEE _FgT=2R ں{΃N۹bdx0p"{,nRA@dNPb0JY{Vk0!1ұ!]7 `WIzX͊ PՋS{Ku=LWԅ]"͵ebqc9kIb C3T0Cj]Wtҹγa0F:]YƕEҹ ,r3Z4] C5ixF:bLhu|8!^d ݁%eۯd`3O?{؅tv!҉\s}!G}ԯ_ &Ν۽{w*w,~q # g ?,͛7e˜t @ 4hf"HKfZMNN '0A:3믿~GHwС)Mllq pE 'ŦϽJ!1))Z"IH7 ߺGv+)\A;}L,4m/vذaٱcVH8% bH=zW^tW_}{nFFHrg ~:8b.\H>"EA:p) #|8l~'et9@1[lt,jo+..V{ӦMHWTT4c ,3F鼽QXGGGcm۶ N L> nTȕAc % Hϓjz"h@@LJy=rH@@C:Dj+AU3d'Z=Yq#mLO-ӱZQطۼuu6Du޶4\[lM~~~6ׯWtat(eF颋ɓr\\\lH2(Y{hUD\ۼyΑchyȑ(hyÆ SNKG0`ZFe޼yHeHnF:'N.]| cǎ>CA'PO)+ШTXJ/\1f4mkŽ#-iսkňзOwn˾e},sB:xWjܸq&46Jb (C: &oA!>m4t'^:6*Fg2§H۷o ÷4" \D!H?A]?|ߒڷ-. yBA~ULY9 y P| W!E#HR*b //נgc7$ GKCtZft{$,m8ZxH4* Flr(xBXܗ_ևGPqC#uU#G:K{,HU`GNthWÅ4ť#uIjtYΏHmmq񙙨dhs!ҙr閟8.:R? mLK2:i6BhUAHc*"B:zT~&}BXAbCIHdtIm;f~u_Y!=j2j9nEÎ~:k2àriр$`07]!S]b v?oc6bM"fjR9Gp |UAq*>(2" E1âS+k} @㧒,gbdPxHd9/>Ҡƽ: W.#˰w/ݻ/ŗ#"]Ě+{Y,(9CkD:e)j7tđN@7'"cƫk\_H֭c=裏֯_]vVJOOW6St##fpʕCAkҤɬY}F:=#ݭ[fΜ٪UZ o=qĤIڴiS^=-2oeI(]]t S*؅t L߾ t toQ$թSoذ!:`Sfee)#HH''!ޔpE>'!!! ҬY32/_qΝ;#}jjӧO̙3 #gt]vE$ Qƍ1|`۶mZf)j2UBbaÇ r*9YqE:{M^JؚyYJ>sw(8]Hgz\"5ݸqcϞ=ϟ;w.0ʝ_\HrH}88p7o˖-sYm3h Nj .њ5kh599uxtPK~GHwС)Mllq p?-3TH~>*Ǥhtk+'!EZ޾};D %"&x)F:ͼt(?ij4߷-((pKK,GuP_SV{jNB^.w9UHgmCmBˋ5h ) Q #/}ZHgσ^ӟ 8͵k0ұ/ݿↆG|W:8Q_:؋etdD:,0 ܗx0⾸tD.P .>+)-.##>3տ v.D:B"1ԥYR@C`#BvRiIFG:-3W 4 1Hgc༎-ͿhP)i kHyl(%%1iILB$)X D:\(B Vr8G  *ܫ0@7x J\ ]B#Ǽk<9rVfgYC48m pؖm:tshuetEkӳQNuPbc$TGE3410)]ڵqr"` 5grռto##fS Kِ!CP0n@CS t*A˵Hü4S03)1맟~r#ݭ"##y.(6= *jxjCy>vD-'!ҍ>j$5}eXnߧ˨51;Hgz\G1SBGPQ_wHLue$pw^to/X`ƍxTpӨYTxexUP;AhZ=""С>($٬8.)3Ytk~ 4hq}NUtH2lh:8m6Hdx0*j!c ]DD";uꄧb䟳e !$W0K t,eHgMBP+K$=,ZTF ʊS)e% Hd ޒ|AS`2WW_D>keRH W0е$WHEe!* ~rI]^:ʿ 3zZC:TЏKҰW:QEs:#CQ'*ht[.'8 ixF:bLhu409kh #bX,{bX,bX,HbX,bcX,bccX,bc)P<˭gggvWu,r3It4<^[zX0ҹ徲t!,.Je:XO-/S%$VIEX 98"M 2ߣtt׮]ꫯ>  6dcy2yUH{|7|(Uo?` A:Oxx8ɓ'E Crз~wE;ECqK˔gk~m}OMO?{CcRRl8SRs  *h ޠH?~% bRSS>nРAuԙhvx J{饗!H'UC:N^ مt ZgNhtZ=H`GD*C:u36ҡq؊3dLP}j7pvGRVLaaQQɥ%+Ew2N3]t)RaYB1br!9~_pڵk핆G۰:k,0#tFoxUC2ZF)yk1ҡख़o"HORty7UQP?k ppjMbA>* *՜܊.g iikؗyeΝ;j!t wYˊMv%F:G*"#S(tTPkHJC4ey{+ ׊%geVHmmq񙙨dhsd"-oxБCE#3sdjԨ5jnn.#SktJ3@`6ILB:4,##Cp0{E:tg(N8]\X{a e͛7pIL*9]ɑXz6;Jb8d"-G:T*?&iD:cx/ԗN'#👎NS y=sxTj!䨃Jr-ҡV06Vk)G}u#ݭ"##y.(6= *jP;tXWӌsҹHgT|ԅdN80F2?AV"Gm3gQ Xπ ;AhZ=""С>(8FZfe ɠpu=Lv7^o a4"14Ԍz*c䟳e֠'ц@HWo ~d Il쵨܍j;CSJt=LWԅ]"͵Zw^X{X|Z!nc-78C~rI^:렰sK}rwYti+ۨ"wz9CXycHbX, kHbX,U^:bX,#bX,bX,HbX,HbX,bLųZ־a$aWu,eӞ{쒜³*hp/yē7^Yƫա"f"nf/ڑ3T0CnU`a!#>#_~yb1ŗ1#K+~)Uzl/ڑ3T0C,NQg߼ 8a 5zHr⋽{2ӬYJJJ̑")cF:>(""ȑ#111nb3لp._,ߚ>>>gΜ2w9lIΝs)(NQ_^`ҹHgԅH'ҁpGeBdaaEMt5|t,uIHWPP@c@uXݽ{IHgnfH%9z(Ǽ<1+((󥘰08tdhvvwhhE &%w!Ͽ$%%iST 7RQ!BCN%'+;HgtB:5E:(="SO=5G[1ұ* {Ao 㷟  '<<44"˦TG >F:H$+((zرc:,wҙ@ b= ),,q ϗb9( -"]pp0(1߽{|] ))I u8EZ^JH, r*9YqE:le!,u- G>|rJ?>uԹs.\͛wiF:!Wt9(7X~7XuA @񄇇͜>KBN0ifˑεZC: &[T`ukv<[ڋtatɋDYf͟?YfXmܸeXtRe<ɹ Ő]HeI -ޗBPpYbcc1*C:u36ҡq؊3dLP}j7pvGRVLaaQQɥ%+Ew2N3]t)RaYB1br!9Q`'|rdX]6z1ұK tHF(7%ZcM:YC:44Mi8CN3/Q*jcAN3TI,Y%WŔ[QP| A:-Mv-ҹҡ|0 ݹsG-SއG|90zԡh=z`C_XؗGtԗ.Je:XO-/S%$VIEX 98"M 2ߣtԗTt'Nܻw/#ӐΫR@{|,@:~ k ҁxÉfN<)tDϟU#H`-";uH˔gk~m}OMO?{CcRRl8SRs H^PRa Q &55՝Nm<׺ukʥKXt/; PThbyHgAÉ@D "N.F̰YRR"t(=|,8"Hv@Z=[)bS+C!\eee$jN;}OA:&Ե҅5tPqJSzēUAH]<Drэ3fÆ G0ұ騾t'bBC8LPO)+ШT"ͻ[K.G:Zj Q)0 1ʐΜ tӟPhnk֬^:#6*!-ܔ(8FZfe ɠpu=Lv7^o a4"14Ԍz*c䟳e֠'ц@*M@jGXʐή{ ^H3TYqZ?DWAqdA{kK]%\ۭzGeǍȇ%6vܢx3TP'*h{ a޻ ^:g,wEҹ ,r3I  9Jt,ґP*xnqt,bXcX,b1ұX,bX,bXt,bXt,bX,F:T<˭eNvUR6Y.Z.<{ثKA< 㕥o JIPJIP,Rk(fm9C3*-] { anR~=|ɷ~+}/KŤ_:Bnjt,㯼;T RhGP u8E}󆮂8⸇ɂ*0!5#o?i˖-O>dJ=#F.++3GGjRZZHXD__#GܺuNH^dÕ||kVVVTT9sFwy%;wUH8Ez]H&#R"k\GHŋתU 4֢E \J;$$"˦TG >F:H$+((zرc:,޽$37D3=zSXXX^AAAH/ń!&''s$CCCC-"]pp0(1߽{|] ))I u8EZ^JH, r*9YqE:le!,u- GMڷoիW;w^~=#ӐΫR@{|,@:~ k ҁxÉfN<)tDϟU#H`-"_]Z48[h۷P}MlzܫHd!E\xH/W(WEcG(IH׮]e˖[r&MLo>F:G!KrY4Gpb(Q¡S>3,GFF JO,_p8ҡ]200VV DPkH'zP9͓?g>F<l8SRkHVբ*NsJxr"ɰ#ݯ~+\:Ԫ w]ff&#sK!0_\\L1?ΆE5"|lFA{"\JKK (RE.==%+W)//O1ҩ5"݃N:%E"t 3TI.)='XEрd9Sѱ4 !f&\k5C`b[oEŋ[˵k ^3_Cɡ#'NcaT!H'UC:N^ مt ZgN Kh(t,yvD2S7Cm#gј8=#Ag6| jw)eq\Z>[yw+z43HZK!ޝ"*杕!#&W@ҙS~:ڵk j*Cw 7^d #tnKdrS̡5֤c5CC- ,K39D ?4ҡFU.ԏZ,g|XJ(ȯ)+=5'!/f-,ntZZs5C`_sZH':]7k~!-w! m۶-V[ ,`cyZ_:"Q_:`tDI w#HbZC:P)[IVD.P &>+$0@ hkȈD/%C &\nxëԅ*"Q}͚5#Bio߾˗/gct*NbNi&&u2ZH—ƚedd".fHG V GKp8 䓕 vy1n3IB#Ǽk<9rVfgYC tZZsH Ut]$Hg(q֭[?غubNTHt,wj {4V $GzbEDC}PqtX:A"{oRAh*Db#iT@+?gZAO !. H#Ku~v9kQ3v*+NQ맔*#{,hc a ߻D>kPH W0е$CƎ[oqjcj"] tb!,u{AaKҰW:QE<51͐3w /IH3m\ivƱFd,ɲ,ٲfɒ5xo<۷U +Tv:u;9Zk7 4Iu,@7u,KD:(ABE-LNqK5 QEQE2JGQEQE((("EQEQE(("QEQEQDT5iE[="Iº,cӞ,QY[J{oiIL+5^$$h\5 p5wɍ,PMطQS ԱCWصkׯ>@p™3g|͈,Lt qWJ՞ 7Knd*h~]&+kXWXjCWhAHw.W^yk4ie]/})==7"]2MD:tLt@ 333;;b޽D:'#Ν;QLp}jkk } fdd|7jzՑyf΀;EQGmq!LVGxu6"zh)HtŻk„ kfڴi؟9s3<'"}S#ݸHGtiiiIB>׬YIB:!! &''?]>=YTT3 ]"с&naaaDb|YYYz+ 4AwZitĔ_?Џ}_ac/ҹ丐..c]aH؎r ҝ8qm Aq-ZpzVD:*Ր.-d ɓ'ȁ`СC@&A )..)--UA:|E555rQ%t #G;vHwgm_տo>+ ԙ|SR%s G:&̵ToxPDQWlH]gIHV壟NP.9H">*BadhhH=e}Tyyyr)(a3@!]FFF%a ԙ|6uHgѐ`ݧq9&%\2q۱c t&N8{S ]~?8J2yH 3uuurq!] E:ؐFA"| V`\醇}Tkiiݾ};{zz #:.ҡcH$a8j 4 WVfffeK=ZMC*}s+=#c,+(]"dۑ^K!/Ori2mG:{-th;BF>Y !tp@hFEAItR"(:^ Gpoj9Ɔ%EC:t4%t?k #eQ:I*j!jS~rfd8#3{fUmA:+Mlt\:}2~. ={. _vzwKD:*r8}t9Q~HGq^D> &1[,fH/ D.V"'HH B'+n߽{w1Ĥ6ѧK Xr=J_:d{vKՑT*RW] ҹ`xhO<9KW\qmW_2հHD:KS ȼ9#)08հYHRDPًtc6BXwcOkܩrUD*[w5V"S: iV% <`:k+,UD:<_UR4Pz /}\MgSO!~i2##"olsコD:"׏^l2"U1(q[T^ >x-R##s0p2\I]*"FS$?҆I2Zihh<1 tqYAf/Eֈt1G"l;kѨ])jƑ!Gm 5`+,ݥlnB#Gr]}@YZ+~Ɖ[T@~Ѐ6 t)b+,ޡ!xp X䥧׺^Gm ]؛:%"EQ uԖj&((F((tEQEQ(("QEQE((("]j򴢭$a]iFSxvIe,-η $&\r ]ԁ ]4.̚JٚFb&^͂S^WX؇Զ#oƍZ:6olp9-.HFS[tɭ\5k, /_vlٲ)S&M#"e.ҥ% ^_f ;$ Xt0PpOw^LQQ΄0ED #==0"~1Pc,te|VrA}};E4:bV?Ǿ`}Cnr\H^SlGYtw{]`… Ð?q?;^wur J)K *HwIr7?tPb@4@ %"t`pp("ĈKJJT>G/'F: 4҅jddDӼ6l`q:oBA:&̵4!ylݧq9&%\2XI!o49y]wr=A:/t yA9SWW'gJŰh\C NDt>.X|rEC"/ RUy۷o!|7ڢN8~Z$TBveqZ7 CŕٹYY@moV's|}JK, J׹,3vhHfÇlݺUZZz-E:}:sW??אHGie$g҅#i U[[[^^K#}TVVb'!9t13d,Pk}Z7vG82\R]²!TyH}Ktl;ki4C)2:H7` T\'F7fLbrwH+> ttx5eE Q+ h _#d,!7N:UQHOY8/P 3#5]=c5kjk YiHg?!$tTg+^?tΞ=$\ԩSexċ/OM&#KG`.GtK',mqNQg&t&h4KZ Q*w%tkKZ7Z&y>mC_[Ukkmad{vK;^:=LD::GҁеIL9sܹsWX{W;Kd￟#^)Kg$&HJ @oM:dWƚ*"("'A X ̮"!U"0>P#Lxf` G/dbᦎ(~JE:-UG:8RqH]vMH]jfϞtRɌ?ĉs,Y /Tp72`Hm N5li:D.T"j}~4XͧVg`!.kܩrUD*[w5V"S: iV% <`:k+,UD:<_UR4ɈWx!xE.󣑴l2?-Z=V@`o4ܸ,Hz5 @F Dg7k}dbH/^Ȉ< /.6arRxuHT8P3Thhh<1 ladR\dHGC~$B@zH,j̝orԦ80Y^ƺR]*-t:},+5gE. P7 8j J"R]+Q:O҈WрE^zYIxufҥc]"QEQ*ZGmfr[ި((jQ:((HGQEQE((("EQEQ(("ҥ)O+N`l4gd*^͂R|K Nb5^)G%A%AȬYKnd*hU,j8Eu}Hm[=ΝxZשS_ SDHG WyOpT 2pFb&NQwMqauv=q-EӧOϟ?ƌ7o^AAʫzd<577tHG9@fffvvvEE޽{tNF;wVj{{{YY^|7n ѣ#iv!wZB:t KmD:иHʕ+[fҠm*FDct(s.---IH'5k@u8p IH72{ǽ+??jgp3K@;:: #"5Bׇ ]g%[Y SM#luc?~ 74{x&Džtq KE:vH{n ,\Pm_%QtiA%N<@ 0_  XhT!>D%XG9v#"ݞ={}V>_},PgMeKKMw-W46z :3R]ECg-Fi\Egւ#vZxijjr7҉g9sLDh*JC}g>IHV壟NP.9H">*BadhhH=e}Tyyyr)(a3@!]FFFxT=K"!Uh؇KUAx۷MHgbt'NX~}h-* !@v@ᛆ̬,IGq9>_Ecowgd%|\tl;ki4g3vn*i-;v@ږ">HGtZe<مtn(.>"sH֖A*"J<;13@c#:gљW#fFj/PkGKr~9WTTXV0<>/Ori2mG:{-th;BF>Y !tD:Q:;;^ Gpoj9Ɔ%EC:t4%t?k #eQ:I*j!jS~rfd8#3{fUmA:+Mlt\:}2~.xcPh÷pq_%QK&"IK?5R4 ™  @i蒖B] RMuIOVZm2ty4^RW-N|Nty]sѦ)2e̙3ΝbŊد(Kg$&HJ @oM:dWƚ*"("'A X ̮"!U"0>P Lxf` G/dbᦎ(~JE:-UG:8RqH]vMH]jfϞtدڎtK40܍C;RÁS tZ*E HZA>h)'9vھzwnU/)ʖf]E;$GcyUIB:t KrU9M1^F ax+re˖jolsコD:"׏^l2"U1(q[T^ >x-R##s0p2\I]*"FS$?҆I2Zihh<1 ladR\dHGC~$B@zH,j̝orԦ80Y^ƺR]*-t:},+5gE. P7 8j J"R]+Q:O҈WрE^zYIxufҥc]"QEQ*ZGmfr[ި((jQ:((HGQEQE((("EQEQ(("ҥ)O+N`l4gd*^͂R|K Nb5^)G%A%AȬYKnd*hU,j8Eu}Hm[=ΝxZשSW_ګ.\o~o&2:&Q*HU\)U{ h.X Sw9jSGohc]a]i\qKϟ1cƄ͛WPP ~ؿfΜ9qiӦtM?O:::""%㩹D3LD:ʙH700233+**Ks2ܹ׷:WjFF۸qVG]I7o SouyduXWXj#ҩ-E:V\ ؚ5kt˗/אk)SL:U.\ ҵn߾hF: t\;qCkPIڵkj 4 WVfffeK=ZMC*}s+=#c,+(]"dۑ^K!ax}^0-Rn(e&ێtZ v }27 C:=90 Kg~衇z)h#^ttx5eE Q+ h ?2tE']$'Z,|S׋OUə̚ڞOWz4^qsbUf!](WBٳge+.yPP? Q)K&"IK8i\ |t$KgJFC:P"|WB|Sݾme6UVoۆ_ vA:+MlTUK!DsD.C9sIL0_ f;w+z\s|+pD:ҙ8 &1[,fH/J3K@*R!«aJ=m̄g&1 rA&nhR4^Ru#U?a$tNUVM }K.EsWo_|v_"奩nd^ڑj,uT)"]E: hFO!;ɱC\# StItT4#jv/*Dt!A>bӬJyduXWXtxЅiݍ2^#^h$-[ >_EG:tn\pHGQ\= ]TqPdj#E3˛>2$EjdZS{{N^Nt09k:REC?Nb#md*cVkȓCfYAf/Eֈt1G"l;kѨ])jƑ!Gm 5`+,ݥlnB#Gr]}@YZ+~Ɖ[T@~Ѐ6 t)b+,ޡ!xp X䥧׺^Gm ]؛:%"EQ uԖj&((F((tEQEQ(("QEQE((("]j򴢭$a]iFSxvIe,-η $&\r ]ԁ ]4.̚JٚFb&^͂S^WX؇Զ# UD8LGq2Ғt}}}RYT݁tzC,C:ALNNܻq}oovg:;;AD #==0"~1Pc,re|VrA}};E4:bV?Ǿ`}Cnr\H^SlGYtw{]`… Hk׮W^yeŋ-;C7gJR ҂Jҝ :a? A:OqqLii +C|*K@9rرǏGD:={hr >}}YYʖ.9[hl<6uHgzċ ZҸ_gGrڵ$8nӃ &qٟp I."RH|~'G?!]Ds E|T~IIА {b˖- %pSP BHgVFCP5pzxކ ,.PgM"Hgd!FC:$T!T1<ҤēC \["!h؇KUA:dn߾hF: t\;qCkPIBj 4 WVfffeK=ZMC*}s+=#c,+(]"dۑ^K!ax}^0-Rn(e&ێtZ v }27 C:=90TPh;]r-_HG1J灎WQ:\&Zdaqѐ2f}1?2tE']$'Z,|S׋OUə̚ڞOWz4^qsBPϟsHoٳo{`\CCv&Z,u/J\:0$N"XI"LL,hHJCUJ֖o۷L|چmPk3Hg"햪wj)t"{tBuȥütZ3g6ɔ)SfΜ9w\u}w䴠IL^J8/ )-l5ILB:8_kڪt\D.V"'HH B'+nGH1Ĥ6ѧK Xr=J_:d{vKՑT*RW] 9exvWZ5Aٳg/]b+&4ip S  _=cED:3S ȼ9#)08հYHEtP+m>:$qYW0NӭJ%%=W?8PҌڽ9a,O*IHՑ.^c]a"BB6Iww7ˈWx!xE.󣑴l2t꫏?8C%KKVHgtD:# بe@E6bP$:𷨼)X#+?@B}~ZFF7ad~qH ƫ-UD:IdiC$S\vWZC 0K 2).F!]\?!` ^F=$h5NQ7 9jSGohc]a.esc:>RrBך\3NܢjjEYK{]a]ו('uE i+h"/=,$u:jRԱ.(( T39-uoԀHGQEQ5(EQEQE((tEQEQ((HGQEQERSՔmx' rM{6³K@Gg/sfo)uu]n'1#xUT蒠T蒠qYd,P%7@ 4*`^GmL5"R>qs]xQ[ԩSI*WMfe"tLT'R]r# T@t;vrԦ80Y^ƺRҸB"ӧϟ?cƌ A͛7 Ǐx W#"%㩹D3LD:ʙH700233+**Ks2ܹ׷:WjFF۸qVG]I7o SouyduXWXj#ҩ-E:V\ ؚ5kt˗/.p̈́O{g!1e:ҍtH$z}͚5:8$b@ brrr=ޕ{{{3EEE8ٙ%R酅eeecD.㳒 ,)jS@?}OHvBu"b;R۽{7 .\G;v{iӦONR҂Jҝ :a? A:OqqLii +C|*K@9r1cDD:={hr >}}YYʖ.9[hl<6uHgzċ ZҸ_gGrڵ$8ns=ҽ~׿ɓ'?#Qt/' wª|ӉJE4G@PGE13엔 'lق} ҡ //O7"4tfh4 Ȉ\ymذu&߄n)tMvҙki4CغO%Ns*MJ<8 e#H': C:|bkw޹dɒ+HG&I}<ʙ:98P.E"blH? V`\ȋ\4å ]KK  ]vY\M`qeevnnfV$Pۣ8A732K}u.B:L43xaq;[ntB^ mxN\C7ߜ8qu]Vؿ "?tT VY&@rv!] @0ȜRtz=H#8i -HYtU| cZ A;Ƒ\_5  Eӭ\dۑ^K!NѡOVF¾cH:"ݻ PݤI*p;0btL7zc!:je`xSA:5^Gβ(rSDEozjz?932YY=VV &ۋt[:n.>_ڿYHJuwb1/]([8{,'DC=o騔ʥNr$6qR |™  @i蒖B] RMuIOVZm2ty4^RW-N|Nt]s&12e̙3Νb xGC*D:ҙ5 &1[,fH/ D.V"'HH B'+nGH1Ĥ6ѧK Xr=J_:d{vKՑT*RW] 9exvWZ͞={ҥWZ.CG/Tp72`Hm N5li:D.T"j}~4XͧVg`!.kܩrUD*[w5V"S: iV% <`:k+,UD:<_UR4Ap Ce+qG"HZlYؕ=mtn\pHGQ\= ]TqPdj#E3˛>2$EjdZS{{N^Nt09k:REh*GP3T@+->֐'1pm#R_(cH׏D v;vעQ@S#C&+kXWXjcKeؽNGa%е&W%bZcjGmDR^WXjWue;JICy]C6KO1 4Iu,@7u,KD:(ABE-LNqK5 QEQE2JGQEQE((("EQEQE(("QEQEQDT5iE[="Iº,cӞ,QY[J{oiIL+5^$$h\5 p5wɍ,PMطQS ԱmGŋG(#]ZP@'O"C8LA5H)..)--UA:|E555rQ%t #G;vHwgm_տo>+ ԙ|SR%s G:&̵ToxPDQWlH]g܍t{zzΜ9&OԩSe˖P" H|~'G?!]Ds E|T3~IIIX{/{b˖- %pSP BHgVFCP5zxކ ,.PgM"Hgd!FC:$T!T1<ҤēC \[J2yH 3uuurq!] E:ؐFA":q>"!h؇KUAx۷mQHgbt'NX~}h-* !@v@ᛆ̬,IGq9>_Ecowgd%|\tl;ki4g3vn*i-;v@ږ">H~?Cߋ-뮻nAHGy2yH BP\H}D4-//Wϥ4TD:|-yvIcHgnF:t΢3Ǧ Z_ &Q7 TWr>ax}^0-Rn(e&ێtZ v }27 C:=90 r;Fϋ˦Lk'|HG1J灎WQ:\&Zdaqѐ2f A/#HgYS:UQHOY8/P 3#5]=c5kjk YiHg?!BPvyKtΞ=W/\. sMknƧzHGZ.GtK',mqNQg&t&h4KZ Q*w%tkKZ7Z&y>mC_[Ukkmad{vK;^:=LD::Gҁjs&1An̙b I&!_&QIL6 @ߚt$&f!5kmmUD:|Q=DN&t(-^]EB8Dx5,`:Y |v;=$&@>5^9ĒMQj!&ۋt[tpT*')#j*d³g^t/o~f0*T?&1y7lG:%Q^jF̡MB:-PH"҅^CϏFk ;em_=€;UN*H\@eK3jB`J#<ͪ$!LVGxuH Z ]؜&+Pz /}\e~40Y ^Eς$ȴҢÐc#%~W`FUڈAߢ`L@ kޞ"7LNηT0 '16L21JEkwE5I!\`Ԭ "kD:#hCb.Pc~Ȑ6uɊ0RY67voӑ#e> xX,t?-vXXZahQQz]YyRP^WĐFr,SMRk]6 .EMK(rP:jK5SRF tEQEQQEQEQD:((HGQEQE((tEQEQ.5UMyZVw.شg)<$ tTy2GmR^[qJ9bWE. @. Ef%l]r# T@ufT)b+,uCjƍ=zHڼy]Hgc稣&#]ƺRN=4n)!&rJ֬Y4[|nF]q/^zw]XX>)ӑn\GE$!]__k֬a`xNoeH5{W~~>Lggg"HHvttFD:/j̗AJ.@tFGL~oh0>"M 2ڋt(Kq8 ,\Pt.\xgq1|pѢE?8>c6l QtiA%N<@ 0_  XhT!>D%XG9v#"ݞ={}V>_},PgMeKKMw-W46z :3R]ECg-Fi\Egւ#vZxijjr7҉g9sLҽȜ>}:N^}՗_~ɓ"Q)t/' wª|ӉJE4G@PGE13엔9hH-[`t˓MA #Y B522"i^yh'[\-EΰɮC:s-tH[Cܩ|XHZˎ;B/eHOu.!us]xW^C$=SD:*EN,t 9. Ņt GOr\:@CERYYk -HYtU| cZ A;Ƒ\_5  Eӭ\dۑ^K!NѡOVF¾cH:"#0*'?-Yӗy84i2ttx5eE Q+ h ?2tE']$'Z,|S׋OUə̚ڞOWz4^qsBP0M rB79DFFK|_!̥Nr$M4.IP> Dt4tIK![Enm)P }X$ϧmkjm޶ տv:JUUHD:KS ȼ9#)08հYHRDPًtc6BXwcGpV%鞫liFX^TLC|Z?Y$HT|!WUK ӤCe+qG"HZl\ /'1#?6MC:tn\pHGQ\= ]TqPdj#E3˛>2$EjdZS{{N^Nt09k:REh*GP3T@+->֐'1pm#R_(cH׏D v;vעQ@S#C&+kXWXjcKeؽNGa%е&W%bZcjGmDR^WXjWue;JICy]C6KO1 4Iu,@7u,KD:(ABE-LNqK5 QEQE2JGQEQE((("EQEQE(("QEQEQD:((HGQEQE#QEQE((("EQEQE(("((tEQEQ(("QEQE EQEQX"ݣEQEQc(EQEQTF((("EQEQE((tEQEQD:(JXe(J>J ǜFKL(tE߈t )/cM "EQE#9 &)3% t=NWG(tD:"WG(tD:"Et)t v[s}3^%Q)t6GYQ_钅t7^y̦Mpfԩ ݉\rѸb!99:N\Hk엗^[/=@x+]@SLkx "EB}ɓ'Ϟ}m?鏈t!ݍ7կ~U;dɒ/~#?ی8sU,s~넘"QBŋ 헖6qL;(*.X}UG?իzO{_>k"HO̞=_~K/!ݶm~\pW>۷oK5k.hjjRA?oۇ3WhH/,h }+H_^ˆwpK+r ҡ?W_=22/}Kp&_nիW|AA\҂sgg\!ԇ͛7\cVaR\gEQD:7q+"',neKam\qŬɓ'͝{kv~xݔ)N>oZvNxb!^:yΜ?R"]~Oµ_׬Y!=_сm:(5/9|\ֆf:oѐt[>wsaت{ߋt6;}gI\T!]CR&ezy8nWO6j\~=9Ez{HE#br&[]n /~>H7-;+"Ż O~W"]uu>r믿~aM|WCo2c=x_&E@:y<W\W 銋'M] ]^^pF@5 !§WA/~1 ?P@n*$҅RGPnҽk*H\Η>#a!ݸ(H?ҭPD:DN{l޼/ ޡ3׭ɬY"#r_qE鴆,RXBݚ/ o#8ak/0ÐO? > :ǀYNbt+r4I$qd#Ίt:^,y҅F8rN ,23ׯY G(!IФKo w%oV{\o}[Xq H _(wѶ#~ߟ} ֕sXVz{8/E%i+iҥ񚑑/S,X;F:ӝE <3ÆGg WmChk/݈)Q5-"҅*E Ȑ5jn y-v嚗DkP27t[ҁ?cr\ѐ}838pHGQTĹ祻K1/g3"xAbM7twHg(" C򊫮<9D0_eILpj#ƆG \F+_9s$gCl=>?xHtWl+("]\[ii&m\']~_&( ᇿ `}U_s͕?$>l?L_f/喟D:">q*EQD:J#EE:R'QEQD:"AH/}:EQE9G3tE)K*,](#ҍ:3b:EQE#9>=EQE#QEQEEU* Ӿs"EQEQfє(("QEQEQ1((rƐ/6sߍ7nܸq͓Vtv1eûVܸqƍ7n^LD?Aǔ f[qƍ7nܸyu3KGQEQ%dIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/images/midiCCs.png000066400000000000000000000372421506652756400242660ustar00rootroot00000000000000PNG  IHDR܇sBITO>ZIDATx}T˶9s9Kń1 "Q  #*&ǜᘳpw{ZsTO CU]@  =׿~'!!!!!!!ȮXn+䯌«Ve[Tn+<}|f XNƒ%$z횱Q~<̎m)Ë!>.,M3̋PG(>%* z‡HdžMRujUЦAWN ~!95%dt$RzUH֍z[o߻&.:ddX$h0*ԯ[_/KT!;VD͛ԫ^JJ73iwnHҢi}SN _JYh˿ZM%!ΘQ-̡>,Хkk>Dľ­S+VE;5ƅ bt򇂌?3KІ"JdҸhP֍#,yjV?A3B 1}to+ժVMk{Kܸ,FZ$AI%PKG!SfFîU ݲuYz\ݻ`M 1^JrC1(%-^n8unyi_(aV~0#O.7:4?sd3ĐmKWIW>IJb苳䞨\L7giJ@Oﰱ^,–{umP&:0{ш-_ӯk^r~Ǒ)3| x֮'̐Dؽ*H]o '4U7@KVۖM+-0!%Uڵ5 ئ K%5A|A3;R ES[jtj{2[\ZV (;e㲙Q7ԬQu&=<1]lL%g&ܶI:ժV\RFuO (ĨL eC1vW1he1gBxlt3$%:ŏ c։]q,1y9]=M|3z؆pC,d ɕT"CLV' #fխba, UiAV8sqLp, 1d+Ms ]Z*gToܢ'clZ3د#r$OƥOQzv_6_$) 2"=>c2m[fA{Ɂ)A>ކB w6־qEu:y#% <2ӼCl\/C쏖Dmyb- <.Gm=X֫q@?$ɧe"#vlˎ줙܃+E^;i[L]3?bޫqW`KLa܌ %VTA}qoM4/VGh۲!./PY3QA3ń mɊP0^9f!6'nN\I%†Z[;8^2 9uXAnܜiYjیݫ[t x!,dYXN_W1,dߪ GN л s<`?yu+H.{__.;nn#ҿGHҁ\3л?pr#< "{VF&a9I~ڵ"Ba|l0-~^}DbHdwlM^|vlxӢh<A [n.j$eAVxMK%"פFPBߟ7Drӭr a}F`aǒIc{zD&:*;zϠ ҦkYe%IB|zt=u>xzQWMYIZtnԖ&Jؿg'wVJE摠< էO4J E^Np?g6W~ cH!)>ߊYڂF 2tcfZ60ܘa(M܎1 az%8[9vnftiׄOS3!LC:p0lYSMQa(`[Z\D4 N_7A{ڎBbOaczTIiC‹=+&IW>IJbȷVrO4Cp_9SV #K6!uk]BFvgg"DM_۵jn:OCHtSл)%?X?p$D;>ߨWBVI(ڹ]װmI>MzQb- ܺ8uiܺl۲R0A0+EpAʶCzJYq^1aSYfg2f+)u@3u4pթ%谻Skx S|ۻYO#EZ@"ٳk bNE͇֩xg/V)f$TYSw?:F+eTib wnW*ŜpGGa)g-iS }v,ak1hߊo6\.愆MXx뎝G O> ?pt'c.uJ?9V4߬fT▯s7:(FىJWX=R|`J%l^999|Z~iţmm"RsJ [AO9#G4`֮/}M u81"9w}{O~˷^?po?^xudLas֍UՖJB(6 Fͳ=eRᷥVJ)lEofOM_GSg/H8?o?~} W?y{ ~xf_٫{m,*mVjUzcWǒS)Q=k/[ cK*)?,HԜVP)JaOb؟s.].yNyp@uyÚR7O54#m־ YJ\?ۧU񿙪SkEJb!Rl KJ)l }ӦWhr%1_GIN39}}Դ \BO?{'@^=xQR(R½"3IP(O_*{lC|R hiS p9y~~|7 ={a5|roAPHعre98A{ϖ._ihs(Rip!MUZb1EC-vb:#Fb)`+HԜVP w];(1UgASn>^;84jÑ/߻~ h}?yqPDjVZ"&?xhJu$VvCb}HI*%Plζ $8 Xw>`ܜ٠,{^C?N*%P^l{Ƙ3\18.чxzPMkƍ_֟aUOn=)rʕϮV^trj2~+=[p{ӓg굅=%2_q~yy*ըٕ;1KxPKXJ0~> TJD%[ ;:8sQ|Ak {:WKiq<{[=ئY#t nֹ?G-RiTJ_R(PI.fl?UvU1 a]{RsJY[!77Wge䮑8W]& i }1rG&|r r(N_ Z|̥smڴɊJvFzUzCF37TZ|U`b} J휨d+ [!55q1ɏ;2+`}9_fg䞞<֣WcgGɬf g\ Zxkg8;9< Uib 5|eJ{8Ncǎ%gGѓJ휨d+ [!44m,fc]p:?_V0lX6Vl֥i嫵N19lF#UM/4V{`JuƆTU{豺4ieU bWhROsUCahS>~߾}IvNTʅԧ Ǭw=eL~:=zkwM 神-tid䞗яojjk8Lm ~ @'*~h}d%72iETZwJV[-~,I)P* ֥RFb}TjD%[ Ts$?ltẙ`1$޼m'#w޶]8?} =C}jܠZ6lKtVA)NIPy*ES;v R;h+Q 6;Q;&?DQ֒[= ,VS }AbH޶y~oL4,Q7"ma I1r;wsê%+lc vbMQ)L"s!94CԙJ vXq Jٹc]}r7/,"7^ьcžZ+XmkwՄ'VߞM?#2,hH Ǵֻ?X<{mml'9U)YH.2~5U߮9( J6K[F"*fLDc|v>y@˷an!\DnL_,0[C?J$8Q PqaJsr8qޱ}&EFȚI2 UnIiָfXjuLQ 6h+==! Zo{t랂!~#}R_HNB"<3ݺ[^LR;ֵ5;O†~0v?ad\WoGzY3熖ܘ_!\+c~oZ[ ~ &3#7fH 0:ou=sL5z c.>{6D)[Jx&Y7nΉJB6nT%}ܶs/hDQl >.aqt o?\"&3ȍ{L @ͻoyhNR7olE[Ҍ=W)vM9KijΈF:de\ҁ?W2e[0YJ16_;wJd+/[ T9F"mzutt\N.S )*_٠1F"o~lG;_·jp8W'A/㭺TUڦ7hYlCl_4s]-_u1} />}M=,NYً?i˰^e֐E.<1_Yis>M|-ZD}*5ƭ$JvpT۪X4k.5;ČO-Eˇ\ҝs7O"cDL7+So]i3]&*}CmO>>>健VJ)l V+!Fj F6o'5xm)ʷKw:=k;2`KR)٤JƸoٲ*5Ğ={)29+}hۃ6YR#''T*Ch[mHT-$ ;"i?l):-!%yY _6OK 0ht8<Ԇ-DRűj*`CmSJu߲{キq"_?Fl`߾}|q6P"Zyyy|q$RݷF.\[A9%l<~fߐJU%0)KZxMf$R/MDlVPi +t $|rT*zM=HTɯ@~Iې`[8u -U+Hom)`a$cV_ &8j6p{bbRUIN;F'?|p[]BBZO~+JvƏꪜӈ[p#N*- {Խ!2ntHZO~+X6m9sITݻ7U777\"?!!2 RUYL([pq˔9K'D@4ᎴJu W  NNwW *m܅W}_Uf paU W ~Y֬Y=x=<֭K'ByD6m0rZZ o֬YyE!ت>%Cl!;w֭[ XI7ä n4q,@"eW6-O>F6>ݝbcC,Iəhɓ\\:ǀ_Rɯ`.]ʬ-ݣw u֭[g[a%9e8X]߿l?{Q/T^ؤI/O?S!@D9rHxxx6mk?O~ĉ4J(',[Lo㏫Wc1*$l 0sRws荓9yFk+_O>/QK?~A9PwѲ`Zd.PָQRgu$( skԨGtY Ʊ~|zGd۞5`65n !!!y iv!5ܾ}0 &Le{>͛7O[AI'WeW@ah6d_aVHLԥK  X!!#[j)~_|^Z[;htK%OZ٧bᜑh5~OOO] okI_JR\7%&$zDCŁnݺ4T7|goJzA3SNxb% KnHq4 ʧ`jf+(+X1]fSAۍ{ƍA]3!`. 21;{8fX'lDqTTuUcǎ<|ʕеكVRrʕqBoߎ$8*a4Ub#e|ZoD-6O8lĈ_]!&rw=zĕz l3ϝ;wرժUCZjajVZA<M$nAY+ 2RJR %y={6>VhfX쵂fB)n]BiYx 1ʨb QQQ+Ɣ)S dCɤ caH&ʒh8554k kLKuV܎aW ~6PIܐY5k֛Wt]¸qYR_4!kG o׮hz1WG||(]*DodΝ2sVWMQQ` GEoyHlooo Z1x9t0JL3VRbE D3_د[lA}`{$b4ی9vZXcUqj UW ֭[ô|%իWY!G@ۇt̙d$"k׮xShn 5 oÆ T'LhQF8t3qD;t & Aݞ5aÆ 2)X̛7.d^|0`o]vm7kJjіe+ov lz]>qCJfyW%֛W2ċuX[a_}0D B ˶m]É՛9hPݟZlb꜉P@&0k@k|o0j(ğAݽ{w {BP].nJxKM ģjJ_ M2?>-m*QF8t:f(Huv7ڀͤQ:tH2R ^l m֌ --"tn '&sa Mނ6ޔ1u4_V[~~jJ[7G2bD\֩SSwX`[ Pn+V: `K>"dVoc2,t%"vEm+uE,Wb+6cyLL8f͚=OwOq4o%ΜO3 |<K"C}؜J%piKw5 `"MT3F=`]Y3ZoYeC\>q[Alp]M+f[׷Lύu^Z2-mРA Rb0ARWIVWߘ†0:KWb+>NuG YX{Q8\$xNH`4|Mp” 2hFJbe1|b`[<)/3Ck5ْ<`M<6Q\6*oQF8Lzϑ$XV0X  KgiUجAF[Z()`$cp :p^]xƍ elQ&,5F?xĒg)_%/L'9 )J- na+IKCA;LGcs( PR&3]Xē[Ag)&d?.b|sV>CC?>˼G4X@<_6_jƼ | ,쬚m֌ --sUeK\\\0w^4 +_QZo_Rsи80;{& X`wu|`B`-n$:K\yIc xH T6d+`Ny-Tl`4eb+`B߀9gȴJ;1@[J3| ]T+m@f(cKV$: 55hKΞVn-jzMoCn4qJ.[VBb임`1fʰ[M4tah$ԨlĖ 0޳68P=Dq=0`1kڐfb*4:JIx!2͓Yg(%d+ݷO 0dz{P%)1lyzo,PF+@ %3$iK4g[?d:ʃ>KG(yŚ ߷CH ӊD p!-[)wUr NǷfyyb $3Fb;H !Y33#O_ke0#+'ś.mM~c &WCuEE]۶msww4{1a0mۈun$haX۹`2ًI&%d+X vb~2W-B`@ 5H+O5@ذh|j8' ,b#2?}fQ5u:vzD/ D{ .&MBYx8l \?\1IyƖܚI֨Sx 6|miUU*ۥO-hJ.s$:zt͔0g@ͭ+6L4zvߋ k#YLCX۷1 R@|3GڄZnjȆHp&fTXP_&}|9s` S h(!m9gUFUCj|gz8Js=ηC9r6mK},o xklB_'nA ع`_o>G'54ks <R.m( #%1QpR؃klk&+&ucFu  Uv ~H +V  l[ȯ@ [@ ,Wy![@ +_@ +_@ R+̙cV =؉F-ȯ@@ hW [@ W@ BȑWl@ >| A@ bl@ d+@ [@  @ V @@ @ @ l@ CP ˦FBBBBBBR}Xn+\:3", IKg ͩu 5K%EBBBBBBR}1W `u+{̲IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/images/mixer.png000066400000000000000000000706621506652756400241020ustar00rootroot00000000000000PNG  IHDR=nsBITOqjIDATx\Y=$3:E% ( (F  3FĜscivvl~}ow.Tu7\TW7ݧNu|~XYYYYYYYYYZݹrdլyn_>Z2_5Oմ%#$CٹŬyn^+ǏN-dee5rw|Wbpiժ$OՑmT|ϑ?aM֧4 ".*XV[ CCD)X@%5ܾ|08ϦOA5Sųx"E UEƵ ~PgؑQwㇿ(UZRVVV$C|ޱ$VVVF,Xm֣X['cwswh">OXSDH',QLz 8Gg\9]Ǟ2_q&h`O?P=klGE9b)eee5B]7odo:4D;o/&+Z/ *sH<Ŀǘ#zy ~o@_l'&?z`BgeLjP$7xNjҠ܄ƀqC;et?:ct#xZ?W8uaVG-4jzNd\7SQEǹuvvŽ)U*~!Ƣ}ۃ{lYλl  z Io蠶Y7lY'Fpݎ~ķm?G<=J,2A]+F%J\7oP߆[W(W*aHg5stD*eiic%oPW =E=o]CWe`;@,{@ݙ+28U'{VRbhv K/ZJ98=G6$H\#[5U\bE.\RW֊YS8#֣5G8+/*߽srDWUw)E e؈ӡN Q%7iP Hn^8o s_L > k( lLs`heCoH|fTfŞU {.}@էK+a`P\tFlBkpkEC%C)ТjZK:oĘvM Σ'EPj1XL6?|z8U}Ykcv.+kWZAMUxzU>̻zܙ)\8#}Ul. \4҇PGQmP6-FVJ]{_0cA?!A]OmwlX~VΉ&sM5pXos?2l~O%)E,ݱc6nh$T|U"]X^YC s#Ğ>u3bZ0&yBB$&dc,CY0RD2Hqs)^?ZyJ-#+VV{d8dqsWɏyE3kֽڶ^B ;xd߆RKK/>mp̉{7@үE])%şe(~B|}wX %FM]!{Fel>W; ?1N7׎PphX:Lm+g1'.e Lޘcs{f 9К$|A?][=\2-v0HꨊJ ihA f!v<6E0yXY_u6?[ܣxۼUqeğK%PTj|{ͳӐr@DȄ>أM] ͚׾ؿdjos<5ZߕW6&Gg-5gqckU4=M/W#0v\c匌 ^#bqRrl5sdžg_R4Қ*[>NVVs'v{؁A J,WY> u@DsoY0Pׯ"2+g6GOm]˲F֩^^YOҫPE jSܱi&>3qXG:sltjO{/aC/]QY O(Yk g#:d=a ҏ†Q9cF%K[?/ޝ"-Х<Ѫq +AoXs[ (]C VZYiMV'ͱ,`VY v 3J;M2cIYYY ^2zz{@VVV7%S(ߟ8 LL^F om[߻nɊwתZvP鋲mѓ)"LQlݤ qd-pݭPy]Z1w]?0PzIxF٣B !umSL`ɳxꕿm0{tٻ$'{ש_kQ{T85uPՊf0VѻN>>+#EϿJea3!vc֓b!NehQyN>|gy}XYYYYYݮ΋5Y ++5u ,Cӵyfdeeeeeujnɚ=H++kuvY3WMvuXϖ&JjEկu!~}zʲ]XYYYYYYYYYT޻e!~vt\LOVVVVVVVVVּV 1 K-abaaaaaaaaaE24,,,,,,,,,4*C܁%k /,,,,,,,,,,`HgaaaaaaaaMEr1=֬1lm?o<+%ZВXK%u!xC [%O߹sf!ZВXK%U{b qoޜy|'7ZG<ŋ3APpxÇ=6!ZВXEXKX9Zb*ĒX H,e@CLCL%1XKe hi$Kb2 l_ 1 1ĀBbI,R$2!v!eE[ J"Z %DKX/ OE-%--Cѣoǿe>Po 5Pm%ѣGųO׿~WGu@{} -o cʷ~+0={gϞ)s#{??scE'NX{ ~8waepׯ_Kh_|cGz믿x݉5~kZc_9n_@K }˗VV{gر qPmTpV~ᇕ+W6mݻ$ǍWXwyw]ɒ%cbbUD+۷}||עE 68P_~dFs1&.\@9vXڵ[(L2G6 0ğ~iߖvڥXO> 裏)ҫWTc=b~8qإ5Tޕ+W#8؏?-Qȑ#wء/Кo@bCk6Te1/sht6 C޽~c6U3 v*4_~f O>fĈ)Aϟ^=|pΝ%VpB42EχfUhQ4ۗ/_> ;p"?D4l8epeOY䗈Ynժ-Yo2~kZc_N/sPCkGjC,vټyzJJTT ev6\ 2B ",%9={p޽{Hw:ad@mڴqn@q.TP*Vfdn:Y H,>O -[6$$dW\+ H,ʾ}Bpčr$ի.йh?.\G_~%}߀4ȽN ӡ2G1/Z#_&5l@k_Ϥ:mg]<5!1eN3NE,qQ.](9e4b<ӓ'O0541["6`47oĝqqkp98uTgMJpq,\j#Mo5bR:?$p #XzAE:P@qX}1|m   Ӥ$yw,:+BK.K x&E~3BBcOma/0YC&~'ΦrTc_2֘9bCkGˮ{0ߏ (H2޲k8[,{.F9sZd7'Z0F@ nP0p#hNH_)tW^F{yH֤X 2hڴ)^)SA2шEm = e>}bha!FKNNFȀg@iР\f`\f*U-VkՑ ^ݺu1 {b#ΚT\ޖIHb/s2ǭ/s2֎u[8`k!~\+Ɲ৞Oc[ AC<h5z<%DKX/ OEbbVDE@!$h)E)SI ($-e@bپ(bF*b9Cl4DNDKbI,e@bI,e@b5_}Kzn뫴rCzY+PfO$k%ZDG{MY<"CuEA 6k"m _OZhܨQ;ysVo>jUN;Թ% 1 1 GOwmظfݦc؉h.H?*8 2vEZ?=SqbGHH 1 1 qn+G[9Nx [[ C\D:sƂ!Nyy`H5X×/yx}R2[8wnѣiݻĉ#֭+oܸ/<8ײevZ4nu~쉎UgXX[a4پSZu+OI ;:dxl\zVZٛ/v?RN[r  ڵ.22\|yժ?bEݺ5 ٱb$"b( [ёnҲ}ʵ :{\WiKmk6h9*v&w!nXvd`U 3$C|oD(V4ig5RLZqս 1 1 bB >ztAenڤm@mLƱ@;O =Mza,͍h?S> hҤ.\E{xyX&-M;==”)'LC&p5<644H?>A:cϞ]ybdd8۶icbD!6} r 1 1 {E{.zʡݻ׫ q~bͱcCOhMrȥ[A2À^pMz5ou;23&w!FI, ôx)#7sRMbԽ 1 1 dKHbl(p;cZ PEpY$M67xpׯ3j̆@aC سabd-ϝ;Q ޱc nxPP;bY<;[bbbw_d11gW>K۷O(!lYeDjՊS#<vw#2iNѓ1svp3ɼʚHc CFRLxޱxb9.do_CXbX`h^ ]'֪Z0us)pI'z!>~|w]E0Pt0 uC ? pgIIIS0?j,C|WYW;n哵><apC,IͲi˕j֍W;q!pRbk4`=l>PHZHv\yƴ3!F˪^b[&~\gG 5/bpgx+RV9 ZotxZ7<\9LOb5dm@z»|ϒԉ1J4rϒj' M4ܹ=NPt H>݌ ֫52`>ljڢz52b 9óZwkٯ_PH4ĨcpsnNpkhDDRJu,9jx9hPoO@bӦƥx)5=0# ѱcGbb7mN8 e*<\X P! 16y9 C+k"&nڣc850;2 +V$b3[ q{R4Y[E~.߃XTAݲe9 倒p BIjayqGFa.yXJ#I|XiJXw?Ou4Gª Vu+`j^xq6B[?qnOxt* C\|%běM4gKA!ZEV%TgpC ~!I7 npa"ZbC O^TL]{=V\C%#Bk60]ryI 械|ҫ5ږU&a)AcyD!t6ݺ`qW*0{N.iجv䀎[XU cۭ:u;y!F*ת'n0GX̡5\fAC7(t~8& 1cG}lPIa?8?wz=}Xn2q#y&M>Vz<nzoW\YFb;kol7KbIЗOz>7MClH[K#_eFDx+qp 1,ֳF\A؝gn(a9C kĒ94ĺ+Vg_b0o9b۳LyqHcy ]gCCl|CைZx /1L#({2qڢ 1?Olυf&GhwK#c(ЈX -OAso1<آu<5 kM޴߲!VЗOzzM F8a+q[sumz2MZ` c6l֧}g1X\z^\ypjh y>3Ž Fˌ`D^\fđU&0]Ŵ*q{4,jhrm5b(++yg+? ĥSvcM]XuPK7洊"/M%v& 'ՙ\)hP :mQ AgeeZni"!w:8Sѥ'>.&ZZȢu .*q[73Ė+Fbɲ%J^X멻ZwLpbk4Dݷoc ecur. .c]9E&WJf W/C-us!F2UO~WlK&5b\/M 1ұcRZ>V>RҴٿ\4y8|,r{N-?bEqXb੧ȩSZf~=1펆 1gs۶"mݺ57R݄FĪsޭ>`1rԋ(X=^;s\)3jA'\h?h}[#'+fH׌!F\vE 6x°4RO<<0]&6zR? !n]+Ǎ9\#7^^@!VKޜ*;d 5. l&P;\`,< \^YnM\#) U,cV : FmWT/Ңޣ><:+0i+ QI>gA'IYuwcǍUL#'Gi_ZYW !t]ljUab>-Ppu&| zquk,OZ98hAhC16ĊiX':z!#K%L?Bk,&4"V*8b.դuՋ(XRbds+H=',d!$_I !F߀AK:\Odv*أ! qέhҼ.Wec jZ3ڀ dVīK }4 )BXhƚmξb.l1+!bC*juR Daqŵmm}I.~~-_Q\ (P3޽Rlش֒ԉx 3ڪe;o$8 9bk&oX݉xTٌ ؐc!ƌϔ-[m 8.!Wՠ-QkׯrѶ=$)ϨUʔ? +a倠ޣL^6i^[NOF8À^Z ~,x=İ#P1y:`OeĞ=WI444Ć5buKrCQ+.[XEC qD]LTDBlj<9F=b ]##_Wǯ$+*mdd;Y=eC,fu`)2iNѓ1svŶ;nMfMAd1~X+P,?extSأ|Mz!!!6!V$_Ib 3cF<AbIb ChxŞnBp{ ۋs 1jP^O␮m1jO(_4 1 1 b+.r@PQw6S%NV/2ĖJ չJ"ZђXEXKXCbLCL ($2 $2 j!f@a@!$2 $h)f!f@a@!$2 $h)f!&ZKb)Kb2`be@!l_%DK0C 12X/ʀĒXʀ2C 12X/ʀĒXʀ2C 12X/ʀĒXʀ qʯ6T2ĎAuVBbI,R$2p[0CK+^aXKe !b*ĒX H,e@C 1ĀBbI,R$2!fJb@!$h)E3CL%1XKe h!PH,%ZʀIJ}Q4SI ($-e@bپ(bf$Kbabu~IJ}-e 13DˀBbIl2ħ+4l_DK0Cn*?`@u}A.VjPH,%Z 1e"Z@kҊW$-3l_l_3CL%1XK.1,3$h)!fĒ\k 1Wiپ2!fĒ?d‚! / h!Νhk-Q$88@CE 13Ĺj& e@basR H,3T 1HM4l_$2 SI4V?X.$h)cmͷ1C qZ!ff l*$h)\em9`S@!CTW+I ZM 1eQ&%DKhp\8x.F ;b06n1ߦcJb⾑  ؾsHY.b[mR8 u:!8JO#nU'XAMhhsMr^aVSؑf!C!vӛ8'l=;t!fbÆYbcd4Ĝۗҥ!fb僥 f!v1| 1 qo_FCKCECf!v.7aOq=;W. 1, f!vK+rFOB]l U%FĒX H,e2`V&$h)E0C1T %DKX/ʀb*ĒX H,e@C 1ĀBbI,R$2!fJb@!$h ~HBbݑX/ 1ĀBbI,Rf}) [Eb!PH,%Zʀab*ĒX hiپh!PH,%Z@:X,gHEb!NU]s>Q]!>J"Z %Dd y_CBUӾĺl_$b^Z ĒX roqD. r 1ĀBbI,R|[K;l_$b*ĒX 8ؾf!PH,%Zʀ틆eE2)}desj(%FĒX )$}e"bT!ɇ)d[8c;GU~{ЁbA$IJ}Q9BbݗX/!" 0b;sck6mU:ĒX/ʀĒXʀĺ.Cl_bG }VDZKbپ(Kb)ktCܪ!vnZIDQ@!$h)E h$Kb2 l_ 1 1ĀBbI,R$2!!PH,%ZʀIJ}Q4ĺݻ{O" qcTl%v&c(CХK6; n/oMIDQ@ >7m`Z۠hbqfa 4CA`F ;t0]@cZ 񨴴[,mt7īV%R>uKw]ɡcFPjP,}߼u_Q/=rX_[9y?歋_N[yhbX\l_RsowB"؇;xKFJᮗBh//^"U cN@;z.t>rXa.xԏҟd =wUHa^J"ZJnޗp"@}<$mb^s߻,GQ㪝#'֭ [ؾ(C =ɟ{>rJx7ߕc{_ͿQh_.h C!r_6C8 f8hE7nICFA)?l ر#Kǔu~!SZ?tV_ Rb⪬wibbR6Tlt9}C%Ǎ@,) (9-&,O9s[)r!S"ֽ bkKH \l_1p&18 &)wOxCAlji5PhN@;悐Qi ~bgM6{b}ZxP,Zj%T.YWjPТ\Nړվov%gmy[ՅXR,dPdv56m,y"<*ĝ Ke2pf,3u%%w?щذ,I,hq8$qvh1P"dxĴ[wؾ??y/}/?}]vC22r 1SSݥf uȐ!TjP"6l|bK_.FZپ:E{)Vh ge@"""pX$k63Wxb=^Y+e(n*j7oW4pq@cZ 1fa8|G~[W_t+g?kx|guqPpitbԮmFL4]<|N]}`*^5J"Z V +4>E UWv>v+`lF ֽ[S/1$6׷/AνЎa!v(ș|^-ˉaVn rD,zT&>:@N@;:b,Iuex{Ͼ>壧Cc߄\=qgn?n=,\ޓ\hҤ qxxi3lCY9[O;t9x%FPd9& NM}fMlx-w?-?ʎ:V 2 -ػrC9l_8uWijVQwN!,r8+|x~~87޵ ʥQjPXG ?05Cwzٻ|gV# ΖfǢō*H_eג}2b48rbپr ~Z/{F~tg6Me`b 2zzkNFlfEsD{sסg]yX_t 4ڡu!ƃ6 ߏ.6o׋7a\5ho?v曐N+w͇?|`AOڰaCqgcgטiYg?xҍG7Nk%FE9u97z)Ud/~/Ewe~ZGR-3.ҧhglvtFjTAl˭ePtv ԡ}G͊#&ˡPo]<&lH5ڍ_gekm_t 4ڡu!e_`1,G_]{%ˡ1w~z41̕/FMm*8V6n?~ssPUZ+h5 (~<PC&&zW}fd 7o7_gh7QґXRl IJۺLχ[ؾZOkh'-ġa^H6Cʤb8K8qs1}&7hjn2fEo?Ou 4ڡu! n$,?^yo8}ݻOtqwϿ}7>rk RN^{1 Κ6n,}q7Z¹ex̠J"Z 1A&4mgFwҧo%m@{ K}tEKu$ֽ 6C /S}y%Vy;2`DIS3@nBvB5XAG/_NŘ;7Gb,Z<9&>mǎO3)hՆN@ nWqK( E42oڰ%k#Xeoq <;qLܰIM qL9^|YrZ+h5 (*u(yn݉m# θ0t'][߿0/g}f[WFʐ[߿k) /CBn~] Cr-)g'})hVC?mbo> ?>}ݛ1ob^~ƥ6.@ʉKw93ilYY/9BuE@!Z- Adꛘ7b^Ab3{A.,7^m7s*_͡}eFe6@<>ͬ k(۠-7_];^r0"#)hV!di>|-0 z7x{\}c]3dm@`*53qP]rh2^Ķ+X+R3پ fM68TPl5}u!֎i:v 4ڡaRG鏡qs< e`z1"~?PO'3v1nz [vIuLw9:hT>a{ O{)/ؾ[{^Kʂ.+s6.=Nni CòkbY{_yC"y8NYG/lyxޮ[v-)c⳶:EFdBĊՋ7"XN7j_t 4ڡU:ΘWw1^ve" n?~=zySk0$ε΀zNTWhM,luf>܀XRl 0(sl_yWh1e #I0nVN@;:=y͌g$ڱ ׎_uk^bthc)杇ϯ޼{nʪbGiGF|Xk9܂؏3쑼ĺb?x+# W^B,.n <vhu0ģ2{\:2zC˘6Dh+6\bS6̿tUVU/ qv@ZzkD,3TMtbãĊKcn(1gf߮}PMhh C!F 1I~k7muԎ'w=̵cox{ɫ8ԕv-[}qð#GZCb!CxLYq:cP.*h5 (j +2Js bK[vNu/Ŗx(.W^g’zƧ{kգS1>xƅ )qC^wC1 p~ꢕkԨtX2C.A ßRIDQ@!$h)EbcQ8k[_V6>pc'ƍplNa  1ʎ;P'ÃǕDKb2 l_A.nX1v#>[S0R¦ܰ dA:>leDKb2 l_AnXTL Ϣژh*>`nDKb2 l_AXԄ={,20лqcTle_\C,ʆ |48`/4:@qVBbI,R$2e20!֮:kWPjPH,%ZʀIJ}QFZYz J"ZђXEXKX+iii6bݡڤ$u-%l_%u!Ub!J"ZGВXEXKX} G1pĈӧOX"_|#zj:uׯ-}U! ڴi1c#Jgڶm;jԨJ*EFF02ZI ovӦMz~O?7n`FB\\ԋU KѣGʄ L,?(mҤIpp0_СC[h;΍]@ݵkWR{=֭_m;]!` ڗK\fLbh̀20ף:C?PB(^ܹ#Gmq[6N6fϞwk7Td={n۶hQՅ)RClZC۷F&- `oX/`%ڵÏK.a%KSN52Z\a'hs.r PϏ Xʕ+WZU;xgF \dffG3&z4df@r}r!7ooٲE/_ܺukvŊ|y`!12ĶBz»tڭ$;Θ19shO~YOOO+ h5 N:mdb: @r K_WQfMk4t$arrױg#bs[l@ .@ˑFPPjRwؾx"`5`U_=F\ZEfdb=aњь)=Z\3x09rDXpݱ]@\g1; I{Dv*gjlE;eʔ?gϞgd?ƝlXoGtbϟ?ϟw?ndbW\B;veΜ9)))Հ Ye رcr 6܌d0Ģ[~@[عo>uw RYɋ>v 6b}ۗG32͘hhƔ-.2Ԕ<%m8d&4h-aM5J, "-!ƁXtXŷt A:ӉōEb~wqmpbqF2!v֭؉o]<`@aP#\C&bvOʻs30jul_ `&{4#ь\fLr}rbx|/[ pcc ql0*))n '޽;wTۊֹP7h"edbwH.ae͚5'OqBĢc'`R Rwh1qϟ?ǻb 1VVRE!69pPhq_!u`e!6B3ףXs=e`2Cl4r}r* ĘE3x`ľk␼?\QqK.N1@֭[:BK.cLX ]|C#TGgZ02 `:7|cd AcX|:*}TE"sذaƢX -iK !N{[^= w؟ѣyO>52Z|؃{ veUtix#2!'Tw*VhlGӽ})Y H͘20ףMz5W-6bTJ"ZђXEXKXWb4]#GC/T[N%$2 $2 0ĿXiz%hI,e H, H2d R"ZђXEXKXb*ĒX H, H, 1ĀBbI,R$2 h$Kb2 l_ Vˮ[lZvMw6WB%$2 $2 {0^Ŏs $IJ}Q$R$V'9[MG7ՑGhI,e H, Hx֭xѣGŞ7eٲe߯><ԶpUE#Xv+h@KbI,e@bI,e@b)x 5@-^Gf<󟑑Ǿ;S-b]:riE%$2 $2 ⨨Aۯ_qƲeˤ}ߨQU&\Un||̙3Ѯ]]+VΗYh]%hI,e H, Hn0 M:ϟ?~ʕwIѻwo,TL^8J"ZВXEXKX 1)X >oߧO:u m>`l`ghh LJ"Z-n9XKe \m}]pll{?0W08J"ZђXEXKX 1f͚[l$''H}}g8-[k]ooo1lc8Tҝ;w/12;buj$IJ}Q$R$EkΜ6bTJ"ZђXEXKXWb4]#GC/T[N%$2 $2 0ĿXiz%hI,e H, H2d R"ZђXEXKXb*ĒX H, H, 1ĀBbI,R$2 h$Kb2 l_ < ĹXSNWڊĒX/ʀĒXʀ`딖ł'Dv%$2 $2 6`dΝ/,~s&C2NQڇĒX/ʀĒXʀ`o޼@| k:KIDkZKbپ(Kb)!k,~gb@u$IJ}Q$R$VC1"[bcc *;e>\z7$$$_|WѩSɓ'o6U,LDv%$2 $2 :b1LDQj֬ $%%Io-YޢEĕ+WbO^v*~gb@u$IJ}Q$R$VCJڵ?l$$$L:;vhРARqx:t(6z쉍իc2Į,%hI,e H, H>L¨[.R⾾89s`ϠApT ưaÎ9nݺm۶ &p*.Dk+ZKbپ(Kb)k C+lc#88Gu֍7;J"Z %DKX/ EwIUpb{׮]K.RSSWZ#F9s=z8p6 ~g*JS k:KIDkZKbپ(Kb)!n$''{xx=3K``q.\дiS(ڵ+^zbh.ԩq>r ŷYxX5P$-%l_%ä?Բe]YJ"Z;ВXEXKX}T:@u#^V$IJ}Q$R$VC,~Uw!v Tg)h@KbI,e@bI,e@bsg#%C ntiВXEXKXWbi 97l!%hI,e H, H, 1ĀBbI,R$R$6ӧ˹AߍvhI,e H, H O!6lPŃ7O jĒX H, H ;j'4lCtEA,jĒX H, H 1 [b^l0T$g!ޙ%k 1Kttgf)[Eطo_RH S ʊ+J,ylڵ+--8YfըQɓ#G,Y"##X (CavwyՌ\i W>\J$q'55'ѪUΛ7O2H pkd:tnؐlJCl%K .;jԨP֐!Cz)b[deN-~Վ iYSO^vmb[ ̕X44:X|dB daaaaa^* 1 eڵj*VX5jcK. Tx*Cg'o 6!~˷`$bg#gP߽'UxԌ ;gNz_JaoIEa|aiŻ} .4j2,Wt>Ux; 55lױ?gZ}LlΑ1 nrM/@~ç[ETf$~zlZ/'MY Ԭ#j:e`+f~p Yv9nܐux L3>_r9$lۂ?{w>$?/^<;,بQ?4kժ@C!~˝ MC’ ia779f:kLN]|VZ|ws_T&>w5 p 1 wJ50&a3ӗ*ZԠy2s201b2x0λlQHW_W}( qJzŇzC<|x|eI^=hьqŊe4 88َ#-_9B q!:6/rGB9U :|PIٶ&zV š9I(Ϥ~v{۳IHu΃9Qk+5vw:fB̀ .bTAǗx׮V+qLqiii__RKKKssy<==}nn.!p|˄2eB+ <q^. ՚bIjj`≌˪dzJTZbuߪm~pK0ƭ͉j<_6%8Rc,26@}CGGeDss}^HKK 2>!v\r܎%ˋ!VX'uvz`xmTT9irjB/ODklUM_mHJJVTC<4t^mٲeBZlWNc}|3wk䜒IjxnC7O}>_MM掏@l=9bHD}]>nN\!R311u!6NLeݴm ѐY_#ONNn2LĂ!ؑlz;'*'@➞9bSSSccc# ؏O譋l BB<==5bb~~>B?Cr=@ DoۭL b ,:!qG8bÆXbKEצ1?G'ۑSŨG8 @䯸# 1 ( ˪߿?T!B![W,!˷DWsRB!DT8Gz;4?Ht5.E!BH1$:.X$a*IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/images/section.png000066400000000000000000001101471506652756400244130ustar00rootroot00000000000000PNG  IHDRG{9iCCPICC profile(}=H@_JU*vqPqU(BP+`r4iHR\ׂUg]\A]pRtZxp܏wwQandBV+C2$)u_<ܟc@[ qf6̦mp'OtAG+-~\tYa3'.VL8FQ5lU[J_+\9$ "PF6XH~?%r)*cUh]?*LOB q>ƀ.Ь;4O3pw0IzEm⺣){0dȦJ~B7倡[[{@Jx=ۿgr. pHYsP|tIME :"DtEXtCommentCreated with GIMPWbKGD?IDATx\Ǚ$DQEEDE(bAQl vQQłbPj k﮽v߾mdB>Gp9{V BP"-4 BPu BPu BPu BPu B(TэcÆ " aÆ Z`"/r~*6lذAuMk5X$ bѮ|6lؠzߦuB#uQ:"vb&+Æ 6hrޢIro͓$XKKi1:6lؐƣHr6luz#QJKZr6luzcPJKj?a( rxҪAu[&?Ml4!בG)-Bbu:6:rހRBj:lƂ!]u(bz.!בؐrcd94z#:ҒAWvp© lJRZJK\/Nf N:mZ%_?ܿpLo'+m]g߱'CԞdlX66bY{hE r([mcc?_ %>0{(|+?=i'K#=54rp{ȨYK} L6 9 Ss `D"EWΞ&| )EFfJX3,+8N7I5l=EzV ؊jzَH2uXgBZ3 B۲Fhkd4.7 r]^M䛬l\ucOH`3ik:rr<(=RXpJ q%~ -TncW^|/;%sq1A<̫~ uqկUG\o2C ZU95PI-oj*aKP%6r\WuQV -,~^rxCL؀nlM9lg>h#R4$c)wuS2fd./U<ܹ=23{s}61w9,fIQdbŐa[>~tK[rz0L%.CV;RIOM\0ϽǨ41+yoN{\p.[?Ecݼ=\WuvTxqa[ĮǨ9Wtޕz3ekslEg=Om` 'غL;R\usJ̐>.5i3jڶ/jaETn)Élmς2j1(t\ɮ>Izm$ޮݔ{_Ϯl_4{[[ײ9JSmtXz=FDtrSq՘r'W462m5`#+O)-0 ٲH3GGms%s^~6i+u \uLų{uzep_}m?}g屙\3 3lnKڶ=GL$ESb;RDN,ߍQuI#HATxFx:6n^1s#}qX4tmb`/Uaۉ0ynݽ{8qF#pnaΊ7-߱yqDh@w6}Z J۠9 ״y~e{u2)m^#T%Dɂ/zsu:'Yhwv4)#\#;u,ci/oVi̛?ܱ\撐K@\WŐ 4yKulM!^r \G7<\WŐulu:rIC#ױakh%9jr:R `\džZ%II!RR zESw\oG j<|:訦J: -V5?ZlذՓsus$TZCcÆ ބu 6:r\dž rB5/,+† 6hrޢj\-dž 6hrޢj\9u6lؠz_:9llذa "/rBP#: BPu BPu BPu BPu B( B( B ׇP( `k :~QBP(뿠P( p|BP(rBP(: BP(: BP(: BP(zcj-ө( \G::z(rB Q*I)O;v,\022rСݻw_?-ڹs'G ב-.FVaauƌӣG ΄UZ>Z1br\WFөSbbbz%\z>'Ll+Vśi6QKg:gyxtYepSpXwFVn8 ב;F;w8:ӳ]<T?-Ȋ_]jM+tk@NK4%y'c d^vZB7OƱVu#ב먺j֭?rr!SM.Y%30 WF 7- Z*Verz^z|‰mMX$bs[lWnr]Ml-6ѕ#ב ..;k,Qm*A<0{]4{lx~❌sF/o8a?o@hnb{j߁ I{ܽz7u^y: ÓKZ$?7˖!m6hm9w~\ov\/$ؾ+J FE!Y_K&VѷV+;(v~~C  S޳û{5L-X:|9̻#zQ4W鄮}߈-N).-?~K ,:\.f&p],QYG7L@MG),rfT-.lgr]ܠ +B\S쏴s_C5Pw&oߑQ٥Wo?K68w9uCrL ,E\K;wquGuN?&h ԋ녩!vag̞N.5Yv}euI~JL{!!! f+lA{@7 "V)S($ .ٳg ">AF٫o߾6m~#læ>}(p Pe&i%2Bn7HVۙtKyfR u<_RʓNqgY10+i.kb0u]NZ. Rs&<[˻i:CQD={P΋o\rųi9|Pٮp].Piiȑ#>};W}<2`HϞ=׬ھ/xbjBMWZ[@^?X-~%Ϻ *eչ^ٞ.чx5(m n<[;I \E阴 M:p|a5 TEz |LsUp  u* ?@\#~X{-2׹[G xmAaڀߓOl!}-H"̂SJq:@ .5_<:'yG'ZүfXM-?煛 #^~u?4zAIH+RwbY,H0"),]#u^2_C09{ d// a'/1|sܤ)ìHa[ƩxgڱfA 5p z.9iF_ I&wW>x+o<>'h܋w+=8s.y՗^ۯ_7b4- -ĥ7#[@ܔX~#xb^<d2j91_<' uerޑٮ-F^8#V ugT[Y1!FWfWA6]KQe×_}lusB]5Vpwّx)R\%xidy.D[QHC<[:ȖxPyy}*MOɕ̩)娭6iO>v49aID' 4ٴm ]}@<M_z/y8xpuEOF  1B  d~#h+iW@q6Y>˪ ,ɛe@]3d%C}|u~=c D7~u`a1MQahWIs}C1Aڏ*ybXlΡ'KaSum{ZFءZIW_ ۄ4p.UB_~#):F3ڗyvKw Hg._{^xO_{G/ JzS {c-`,ݔ@oP=-P*^R7\\}j\WޜB+1>u 3 i3Vf~mk\ўl I9M/si!V B7IҒV i}A#{Ôs" о ;vy%{A{7k3w>٭O1i@lXBP_W ] K?uGX~k낱s1bzzh+З_R0_e$n%8ĻY2}}}_J`@Q xQvBEn=vm_p1q{TׯG 7zUY`b,w}pZO9 -Puiʳ pui{֥']p]1u`vP0]nLKuS*9e蹕[o [gEs 6 dC+pO\`p}̘1D`Q]_P iIBOG/ՍCFz͇ w*  >z['Uw롡hƴ+_Z ܔnuG}mzZ^lJ׼,9nؙ?4=+r6)q]0a)1ӇKL\',=tKzsRowA?_#pzZiD_s`px iq8e ==΋??$<<4i篟:3| tl : 0 \)tgI;5أ/NUBtʣ [}1lڭ.݂k:ߝ]y{gJ*/!C%%%hFx}=ՇUܵdT/;#]}_|'-N=p[lφОVh͕^[\ueQg#uzALuezǤ_oLzY&o 3= cWYg4%7sNZ=[p:49Rr XdҏPPx4.^(n ٝ'onʝO@\ gk߿pϮ=NȘ#6Zo,@j;U~ -ɳ;O^lP ֳ1Jp]r@zdLw_ uZh6K` OGc;{oaR?~޳w]7pMgH+W;|VVwj7~XvSPp˂* W\Yr!` g-إXj\@'ؿD]'Sf7>}xޏUEJs7r&O O;5+#/)^Ԛvt_ ”/[w8poAZ鈍w!3S2e Zoq, \7}Ae -o\ܞ~="&EE g&ÿyr`Z{毿FꠡCpX/,&gÏM/e e,hً_[?z壗_>|% N=;Ax-:0.y 7]+=w5Wݩ9~V+le~{7>0Bs.%A-մ|zs|quJŨ}oF/ަ/3H~h`iuѫ'~+8w B FI˅K>C 7Ļߢ{)[G9\s'\̈kP 4%&!5t6N /ooo'X:dPS(IG*EpӒ ؅=3A +868 L,@o;+(x€2NwhƱqzxXq3/Cq;v|Y@ r]V%5hD >n$9*Dԝǯ//3H5ipac~й=:bV|3K-7Zoq,` *[_sX}euMo"ꡆhQh0keАVS"$#0h7__`);wkAC/ړkrϝ.? k-<1U[0#zSgSYAc(hYO MOǯIHS{u;H-@h_|A_pm90 |ȩ=>Sv ٩Š>>r|ZzJms4u 5k95-6ax-'V:[B<@hw5A/™ᅐ?[vh-nՊ}7l@P-Zwu? Jashz+I) NY|ȏTG*vgᅤA?6w׃3!Yn?+rٱ|Ѽҍ[3>n|Trzr: C;5_ڍ)а[(F.J858#K/껟Ww?k{3!B& ݂kΎ>]`'^nZzsc+]?6i Q-ݻ3K.>rbp>E4r&TwjH0%e58pv0S+@Љ pgNe,:lDuo ~7i Qy"l-Uv94l%y!a-d%Hy4_g^ .B10, #%ݦv>~n-T&gHrj78h*[Ko}JAB!O> SHEƣ !X3~"d rpgw̴1v>(t-\GZ֭[C,xqXҒw94l%Yq> 1J+tJ|h| 40k"gxWhwu$G^^^՝xjO/g!>*ٕ_˽|;uסжmx6Kw-;5- h55Pߠu};Hjٴs7\}2G'vgE%0sJ(|yŇ_#5&^+2ؑ\h6RԈvޕNWh=ݎHdС VNƎ jZ!ZoZ@%7$MVbCz-  ¼ۙ(6I/Ty|\ύEam<{ϟmt?Cj@ӗ;&nJJJvܙ׻wopa/q-g6n|4*qSLI`xPstrB6ai'F v1qp-# .I48M[Q~U{ikܛ2E}3ۅ$2Е"M ^H:~nTOm:~h1DŻCWZHRX>/Mlk[7~RNVVKz+A߾Sɍ_ؽU2M}6cwjzGo'?̿~0(/>Q(g+ jD"z' PArizD 3*k^rop40ψYWb>xC~BϨ/"ÿv1at_v#un);m}:g2m" ̧C}1?"g=MH& ۱_,F\>*'>9>^܇KzDɆ⛑$/4ud܃U˟u!M[a[p"W< 31QV!^n\&]SŚbRGhx/)묜q=uHiq}-a&UA;4SSësH3j9k6svp3h0hDѹW2$}Weewb}H>stNL^d |.3^HvU}NҾc?/'$sw- q5aRlu[WSV+p8|7>)zWkC]&S]ikS9-ED-YlE:tt/gkll_!尰&QahW3r}C1A9N*foK!j,gZ0Rѽ@caXo7k[y gׂ}TWf5xt)N}n1xe|5U-Oqra_Ǥh1VgXJ?be7Ƕ!1+;cM)fyDRxLvUuveCsDugGwiӠ Ei ӧqbi`B#L ́tKi"C@W ҘiSmLMbFglN㐝[Z-組)rw$+abfBRNS ne덶zr2}6A|dnc䇙Bq iUqa zrOL:_-#H嗗 U OB V]t)B'hpXk{eIזT4O-6X-։[7ZnGy[AEkMߢ"S [J]r!t\HI8|B˟8KG7)c 8=E-ςwdUd4Y}syde-F 4QC2Sޘ.чi(3כg=7ņfsl܂3 qke5Hɿ:,*9e^E\+,5h͐U)$b?.0sz _n5n`hᐳUm??tdw!Dsaʌwq*37 _rc( !:amƱ" <4hSB׭iJWӑNVe3 wY:ޮZ^";uf92F۱ U&_/.*̨N3!M6T )q+: ɱc!$u% Af f"rEu!8}?Ű Z/ QNyV Ncp7.E9RC1TXo $tBO}i!Rɧ~ٚ-gdZ%٢(a :l ~c"=>1.PN]->0h~']Ys<[+J: |Wb ֜vT'‘d،?{@QYz-xDBzi$)Q+!l$z}g Tm9JZQ$gZ7nnu O9^-[T˕58gz`7}?誝 Pzxj1JȠ­$w 8{\D&'Ảg`swb>O͙R k}#,I.Kp+nTGh' UGNwu>zۧ/ˆc|4g{i:kmؼ;G$QYKO!]0\~4 y!=ke9V(2/5\J?az$ UwQr!Oٟl#U22=)Uh.\-(.QPĿ|Ѻ&5`Ioܧl qX3/^.N7JzMzv?Elgt-zF-S`ܢ: PzNIV%'^)-d=nj6Iڎ?O;^gY|I24.C-\Hw7!9FS]fu}DHά.:d9])%9r]B\C8imva2̆l(`HЋIIz.¸mu5AG.D[ y؄|9waeV S>j¨k2\: 3҅M+ʚ`qvy+@=(zA%.j:w030 Hbj T\o<| /J Y'?_1ΎdHRuuUsz+z}Bh rvAeR>$m  ^# BtP,TmJe߇[~V HU 4f,`SO1$yK%S XP5+ڹ3g9mPɸ.s>(KSW\n41C\7w U9^^ly &:p]Pjz=u+opjKjnmC݂"fϟ99tpO{C{,V!۸\G@iѳfN 3\`X]%\\OQFΊMHݒI$Ey ơ}J>,auPԙ3ң?Y'kb;`E1~&v'ÏvL+ةAIy !Fw`yns 3wx'sG6zq]ޔ毣P CB/Y2η`wmCsF.<ë ]9qim&hE[}R .^O/LXg m;NXyX+kqD1[ΆNV@.څx6;u|@#f>Št-|lI Oe rᰘ:&ma]葶cs篣8{eoG+bꙷM[ú4 pt;Huiu՞s:rBL?Oi\cxB4](P(T T*c#ֲo\Pq$P(T am:N$aN /$FMhmu jY*^:l` #lCN&.A4xBP(rBP(: BP(: BP(: BP(: BP(: BPu BPuH7zI4'B!QzGؚD usDP(:A~*&uF}"(r \_{<&uF}"(r \OT;b !Z2'OmMѹ^R: ^cl+tS&DuOYQB`yE̫r㓗;뛎K_\o\ڲ ^C~Y0,).=p鶹u亲/ۃhO)rjt dcfMl;zOO>X ]}bubk Kge^Qf6כ>י]LdmJ6nC>AYNb ue[57ă׈O)rj\NJ Զɜ ?l(iJK}s=~KCx Uҡ˷E-8M#5p|=pUz8tZV,&iҨRaN5z =+)cޜJ9EڃV/Ts}Cz۴2f(&ܢGrENgv-zIϱ6p#uA;rYUt~H!AuZ*u+qK[]m&kf?oJy:=xu|JB5$y'W 0ga׈\a p.Wכ׋'*o4`s<:z3'Ngy,l? CݳGC8_:+eLjF]N3.W] Kӡ r\.Ș`ڹԽ"M]({/r:=̂Mh1\z9ǣﲶHC~*wC?GDdzKw9t\/c@Mt۾nm:=xu{Jԕ뿠P] Q6 -U|YzrW) !! 2+ئi9loc::kmd3taĥD/A0یO/zoֺFv0 I^׷P.!W`}ڔv";&Jl;X:t8,8VSϪ%Ν5+6Jpc{L﹩#-!2+'Ƴr M7%=!kO l fFkU#7 9͎q%(}-'|r\VNEuLI!˥G= 鐰r;s}㮛ds P+n^Μ+ e _4 <Ç8[D~h\r;bNɴ>qoL,qfaYMz"owk֦-E.*SN5qFsAP$tB8z _;]T>]s7elo׃Yd'wvaS #dN>>xʝ\B5.Q=[(M^C%(#ױ5\džQ(z։p>r)5rBk]z:6: \WԾaNܓ3EO@hgݒ>/: \8i>e VqբGkgݢ>/: \D/,+薻cÖFl=ᷠV ?: j$ck\G~O^4ydm8L P-aBfƺ^^ؚhScѶ۠)4zuv2 W谙Ș-Ǹyg6ېV\Eǜ:Ism ?:ˊ5mdDl8kp|BQa<,<]'Vd5/v'?\rZ" ѣGiN?\G-k$^כ+jT?o>&@y&: j\:{[y.τ\G!Q͖:~ҴB7ǸLur<.Ss/qⲦ5rs>y&rٳ'!!!"""00ǧ@AinFP˝RW]t)Mk+zz}LjCf͚էOJN%##["k^PN\u5k\gI-\?|]Bxy#a :/7rAؐQ6)uz[jQf:5;d=ʼv͊EF)qA͕3Փ;7o^=CrH䍱- { }%{$9b./U"(lj%2œ&OO?ëC+;v5Xv𝴁wZIICһՓZ IgwjvqQkt#)אʏC͒j3ՇǏ:thw5)88.ؠ)vevNX"-x{Q,ITqrKK}.xq؜JI;ď(M0 N3wp7SÎм`YggxSzf\=D|?.̌ ba1BUi庺L*sMG Yd;? dȑo߾l;b;\ѧGl'❌ާ'{i;kEQm3^u^nBŮ Mę~lq\bG2V):moΡ>ֳ16ui8~}H;} Ӿ52r'Vs`GoTϼ]B}mtu[WSV+Ve%ED-YlErI)MK;5PI5߿K# {O|嶻 BB. W;r- uNx}<=繳}8Dyx46i=aZ+~!xW#KWMu6`3Cdj+!xy;cGjg{ 9V}'$*!da5U (3[\^2EhzF5Aaةט؈9KF6g}m>s+=@tpl{̅k=rsxP>ԝBSrսDQZx;m4p=,|!Anvmc<.qN3ii'͙~ s~?krߒ:w&0p BvwṾr?%r VZ363Ll|"L_9Ä:w{)̌p(r;c`:N7Z+*}\\?|T;l3|-ԴWΤn& G/ a&IV YCV>Ú*r~ֶXAZ;eM'$|miHR[Ϋ}փ7_ׄ<ˎ ,sy ?ArVU37<ה$1;N;L.?0͙i4puAZNP'hr\{r18ދ! ׋61wb/.:Rߓ;)]י {Pva;O#vqWP^x3ɸ?_䡾ݬ LCGmgD@RWSWwۡn,+X~T2:gW 0d$H\e%P-/ޚ$F)m|a $ %wdX ;Ƥ4P\n۾C}x/*?Vy ~|tދz_|߼|[_sjybzE ɎiІ %N9+u%ܞ"BKdMav,Kp$zYz-xDBzNQټ{P3OuV9kis#X ׸߲upp=q_ҠV,y6Y+obFr|$^R!Ȕ4[^}w|;YD.TuҶcK{i1sxڰ</@ZJ|-Iu MTjcRvjin<>{ozW6l>)''`ÍaC֔@\%.Mc[~+j:O+y\/Hf1GlLm@]Q2O. :Ʀ՚uԙ뢶g,rK !,wB¦KY5&^gZY0 NIip8S-Ć yeHZ#ݼ ({wf+r]a5xh9ёcA*yxH;5PN\Z|"p|٭n?x{ߞq-r?yۇϿx9a_xxx=W0vѸ^Q5ĚvulF"}:5ʼnIV 4SsuvM\}nKUB| 1^jRegk g%C~_%ጂynn"H+%9]et @=KrH"] ] 1 ־3DuUzn038&kFکLs"UQTPde_痡}/.Cqp9Av{O^}ŕ[,=VuǰFz7 a.$glP\`17!Z>l(|n5M b0R!UQkF|T':N'x¯kwړ_shOSsהR3Wk+*{W `n'wPkٝgqCڽڽWシ"pC0g?yIt={7.+0qpi,рc9MvU'b%˖Jƴ"Ik&*N.)*8,EfbG(8~-n[m(o|pDlؔY= u*,{dw`[]e! j\Sfx[=iQv$i3*b[eTuseGl)B1dD[^lW<`96z|F^=ӅEjPcӧ(Ϥ$סYf,rtGՍn>|M~ ?|ΣK7 B"m0v.:T3d&(6ύ49/~]fç=0IXtSW92w ?= v4AhA{Z}?`eszbOm]XHcζu:[Ioy{oH?;,DdZYw?yGr jgi3j{Ы^ׂinٕNԡ'ef.2.%s71!u9I)MM;5PII62aS}RwBT҃Cv]o=U ~)p~.|p7ZAݫƒ7Eu/.+.MqpߎVSϼwhނupknJKsvϒqkiu54rY^ zpg;9w^Ԉf=}}a.y5.w*}c2[jܤ><7![ƷaUٍ;hNd)p_qxf zR7JLLTAcq֊0/ p6f;q?7o~i zՠfLj@0Lh}IG@iѳfN ,:OUR&MJifr}ĉ2 }oQ)Wadi}ٻϡ?={{88h K7/ܐɻN4I;Fj?iZ^5Fo ,|dt*7A'RAfqN)#|\Z,I%5p(Ϥ$׃kea_٭'tdtXvWÚb_~H^9w8CXg0Z~vgK]6CkȐ!*Duҋ /-dVcu)G8%]iM;}؉V DL҉Cp Sa2Ljkg}?vvoNw۷j`uUenfvj<ؽE] KU^8a„zv;\GՋkv-vJ R !Tѣlqr*zoXw0lj?w++*rH>)՗T8Sxw?1#ferrryka0rU/:@TVϡuWlxK~a܋܋w?t]KwvPn}C=5,Xc(չN6& 3$$!Qgf{=]n+:J]\rCs'M~$D`d%˯]/{$_}o}z_Y oc(չIoՆӖ4"jښy#C(uqt kTKLJ9]L/'BO>JtaxДvY&[:pqx 5 vwW=jSvcLsL:uwss2bPON<7G{yyu/\`M{}~. W=b[rOu]Wom_>„A89/r1\buT3=:ܭCxD}ıusB޽{'M4d׆ l lXC;;\GiFɣutzuT: մp:wm& urB.׳ΔDtBPuTqm=RXiz+>߿api6A.B(|‘:sc\vbr^5O~ub}šWurO8rUgCp\|kMk+: 'j~QIybCp\'Mk+: '^/GҜ~P7_}5r\G\/TIr7DQ3li3!QuT3:TuqI5zH;5P B3 uQj@6ǸLٰ͕\|եؠ. tW=\GYQfոǸ]B}mtcjwĔ? y;M~ywY+|r"#m/˜ؖl}",]"8OMez MRu _7;[1'9])%:ywuҡH)MM=v+ƕ:8īezKVBcL u^^:k)8|IrrgYنG\.#utjrgjp oMm){QY!mwB!-ЌN=&cӴV6Sۤ˥r{⇻YWH I{&C6 O+^5ڀd[]USή`0 H.,ܹx4چ6ξU|xK>v^RNs}pz3溺L "]"wxʙm٤ӀQ!=٤߲<&V>I[wgaq-"{yN2w1#n&mtr+8|T;l3|-Դ;c`:N7Z)EpgpG$ _[!Ȕ4[w2ǀgܬEёcwQoڇurt 3y mGp=fzLLd! ZLYْ:[,$8hKRC[9} #cĔq:-5$Ez-:͓,GX$ѐ\/}HoݸrnD!{R :8Ykre)b1`d1m`ItBuAO"G1ŐE9-GU%Z3B;/7r.o+h8՘gju^`;~'D'8V$X;)]יKOe+AGX7&4u?9m2chL# 5Ď$:a )bw_TwLswT-ĆoAr!iZ uB;K€w:[a­Kݜ!ޮZ^Nm qy<^ ףOw]mU'=utߐ\vh׊ڄgp?%?|yŇ_#pg̹G8#؊A0]WF7,_. 숪ҨeV9io75Pڹ()%+R>?\=6Dz 7՛gjz] ] k'9z}g }|Yz-xDBzNQ<[䬪ϝu%V=#,^ (?0U' .twBؙe}u ΀:ߑ U@=ee<8Ep) ]%JMv2MqUGNwGG9,Y.kw];w6ښA5u8}sDw;6ϝ:#vq0aC4Ɋ;(!H.͜0_k$>J9\atI]({˫ޜKeY[~8]w ]xAxVcMcIۊd[!p=,>$^_Q .b>b `&W2w?Չb ?\%mF ^ך Sπ蕙e}(U3x9P#<%٩L\-\Wɂ|­h6\_}j}݅eԚAR\/]hi3hٱjMhw)CqF,bqD*p|*|5T.kORmG}\jw&=O5pK IBo`WTu4kEKҴR3ˎ Ds<'(U#dr)_/:Q^U~b`S&??"eT=m4L%ݖ.̣Ksl~zjuKQ;=lW<`96z|dX9rHauFfuuIwul\_S c+F̎ DL JJsXrt iDO I' 2)jJߗψ^$exȄjDY)Ӡ ո.aC.bAi7UaцF=Khz,kORaG=\ KpϧAdq*GVuz[jQf:5;d=ʼv͊EF)qA}IZNd 6\[x qklJ[!Z7 eTzLR*}c2V$k^ژV$i3xTB^\(Zϯ2cFS5U'bdXN3q΁hW]usߑ>T+0ѻ*YVpFȮx]1CeqM}}>k館nnc~9$^Q2̂rߑޚ([#k2&wHlفN0Cڅ(h7f{Is$yO dw<&=̀ gUTwݩ'b N;ׁ vZ>&LyʏCutV NJ9 k^A<2)G!yڇ)^,-v?j35N@CӢg͜26.uD(v:-(bv\C7Z^Q~8Ӑ,``gӚ ^F(I+K.K8U5ύ49/~]㒳sSO3}nUļFΊMHݒI$>qzsW J%)aN۶icL to?LP(+JXS֮VzBE!(ǘKVoJM۞:՝EJeO{'8+)NL՘)20O료`aV͑w;uC?wK:Xeޔv$g82n𠨮cT~ _#jK( o^2`p]NJ{g|n@8sóu%_hfl4m"I-;g8΂ֵ :,2:̎ j 蘴`]!5n[Hg )y;ĽץQ'n 6g:̄Xܫm' +ҷG5WmJs]a'?t4ۆui'+& n:<|\nfF$K DP 1 =#"< )u0ڪ^ 5'0S?h0[a'ڿ7=&@UT~Jq=/g!jecoޅgclpv}W]kDzG'C<.(Z9jrSJ"n`7~UԑV~%yŠt-|lIMs]0ya*L^``wD-;4Ɠ<#!y7sdu#&<==k`گäb,9F:*O4agXh͝N\_w B#e×/YrZn{r%IlLxu{٪ϲE'ʷ $njqu j\t U|x4p7>8"6lʬfTa#,QbO230ڠ|I#IQ E-ܲ,fSz |%τ\G!Q͙봣Ty,zvg[ʺa-uTi[8u0{ޛ9 t5f2نV|O޼>k+Y0fWM6Ipy&: j\uasMk+M_XLur\Z ޼^<r\G)_:!Cp\'Mk+z:_G -S~uU \GuKSx}Ԍd|,zکLur$^B٤"τ\G!QZըJsJ;=τ\G?g: jA / \GP(LNPMOu B( B!Q( B!Q( B!Q( B!Q( jI?IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/images/solo.png000066400000000000000000000161631506652756400237260ustar00rootroot00000000000000PNG  IHDR)HtiCCPICC profile(}=HPOST ␡:EEVP VhФ%Iqq\ ,V\uupW'E)" q=Vif_tȤb.*^AY4}ĮŋGGx͛ʃt**?f+mw[ƼeHy6"Bh˴er2(+z|CCCa_ |c#[Pk.S,cQ/BQ}r[FoUO>Zu1OX u uaaa-ʗB7AzVl5Ѫ*l2Fveiy6;mB-ӖimdˠW^(r}}=*lY[[ ؼtGp0j.rW={6>>m|` Y/b0`#\ǽkHH6y˸w2!_[NZޢҖHUZku&LfkbB!O`%7btR"l4E[+:+'>C~F^6\܂C#rwV=1nظWߖKRS pty~˖v2mr۔a3#L-B!f˹XKp)LKY6lt$h˳l~!4b|WKːᑓӢl0u]z08gLܙiFE[Xtut1rIFooNXd6mLHǴaҟ6 .='F>CrĢi˄BQ[Nή]G5ayMd7[X^./qj\Bl*[͖I>1b!gOKJܼR mqm98*rmeu~XC23 !#e$-pea ڈ"F={yY=zcIJrZ~zDd,\p Ef2q Wl܇C *EҺvq"oKEV%viW#'98]|{[@w4l4N'2]ܽDs׷?اīq-' >~hmyʔ"uekC ⢼Qƺo_KEÇbcxx!yȐ䢎wGXҲ AAYYKcc'Cm i{[/~L8/Y}}}v#Λ.N$Š qĘ;[kgGc4gb+ᥳ% l4L!ݖ1;z-raIc1WTy7NLfpwSf.FwzV![~8vHOv>7c,ށ*-MD.HWԝ.@q,q8Z; p\䬴, -?YN#N~m*Ċa48HQU ֖! CuUVI=si!U0l@"-gΜxrg;wp5P Kޔo>tk,8YqP[]?_ho/'M.z׺](<{[GOk:j[ƥX6kemg@/7gw|hsRHh˄Bm+ X#L[&X-=G̹lx 9v1%}L#O~o_/]n˨o483:l,1ӃQB@_֥غplt\> Vϲ: o-gVBtW\2jI[R^n m}ęTQej$xGKgHc˥[ :reN|9#D,Aԧ_>ر=R>}z,+/zD8aeeX33̘1{HF[6~AȖՓIݖ?d]6~]a}iu",\75a8xBx^ JnmF f gVUTӖ !c-T_[6JT1S7~rB|r@|"a575̙wL__$lY❴. ǖȘ⽈Kc#n1'2CИ->Re䖨|0wy%Y;;Rl9??YlK-HBmmmޝ]۶ev*іpO Zejemז{^C4B3aCirׅ ׽lYeB!M-#+Xc*[ĖtW, \eLE}/``Pu9\e1[*,CFiUڮ×te jt &N<7)BKY#},W~CUnXLL4yz"6R/-=Zʖ.G V!["۴eB!@i* +ߎD*]t74bӒ^m9b*_ҺPqzp%N76H?"bC]1m:OZ8cfhx65p%kVLҞ4$["R޲ >5WSm^0i0={zI6o^!!AҏaaC>p`Ds[[vZ~~Kmw#ܹgϞ՗-ןnˈbf R Uh>~;w ; L#E_q"ƛf&Kӭw5 C1*CnVBnE29FC޴tW^DŽy+5vSc^V͆yt-lIJ$ٲ.+H' FMcTW`['ز={ ?l/믿"Xmee dΝۿ[|9QWWg k1lYaxv1XjՂ wq?m݇Z O?:,~@bMPrWl\G1m2!b[|Bqaq09)RjQwPe'gWn?lmY%a8I\BXnS)jŒJ&L֬Ncgİ…#K:ݡm4C5~U~qTJ7G\J|[en.PFh%IHvtlnxm(o׮V B|u„Q!ӦEx 1}l?_nƽ*弼<Wœ׮]kmm'(8/rFoL[ 4-[V^]x 0§OƯ>ٳgEEEǖĖTqHg>|1==}ʕҳmh[.LwSX:4w h˄BAmڌaUf5eSleszmgHZMMAi~ DsYp[mophPPMV7eUy<QQQ<=zhLvj cb<; H`,mc˝um\Yv>2ho;bPֲjeB!m<=m XǏL[6:[$ϑ#Gj/wyy+VL8Q[T/#1/F, &*ز*<L sY2oZ>ȈO0?d۱/@|Çnr[~wn6φ{-B!&g޾ Q iH'7^er_yI-/w'u˷OeSlY*<(v!mZ}@/bԩcǎŋ+WHu%.^|g"z-#:lw2!brO9nqI-Ɩ2\8![w냟LL[-Ӗ–ŖEYllTeB!D03AUY۲6i˚NZDZwПlCmlYfx6~"BfZOEBGŭǠ vߋ Iز !B/l9|gt~R dbTCml,ݣ.I[&B! Αp*m qcv!#B!=yj SwzuB!Bqtv&kFkIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/part.html000066400000000000000000000344101506652756400226260ustar00rootroot00000000000000 Yoshimi User Manual ~ Parts

    Parts and Channels

    Main - Bottom

    The first control is the part number you are currently looking at, and alongside this selection is an entry to decide the number of parts available. These are rows of 16, and can be 16 (the default), 32 and 64. Initially the higher numbered ones take the same channel as the matching default ones. This is especially useful for Vector control where a 'column' of up to four parts can be linked and controlled by a MIDI joystick, or similar.

    On the same line you then have what is both a shortcut button to open the window for the current selected bank, and (with a right-click) an editable field for the part's current instrument name. Finally, there is an Edit button that opens a new window for detailed part editing.

    Below the part number is the switch to enable or disable the entire part, and alongside this is the playing mode. This can be Polyphonic, Monophonic or Legato. Legato is not available if Drum Mode has been set in the Part Kit editing window, and temporarily reverts to Poly with a red warning background.

    Just underneath these is the Midi channel it will respond to and the switch to set whether Portamento between notes is allowed.

    If the Omni switch is enabled, then the part will listen for events on all MIDI channels instead of only the numbered one.

    The four controls to the right set the respective levels for the entire part.

    Vel. Sens. This sets the velocity sensitivity to incoming MIDI messages.

    Vel. Offs. Velocity offset sets the point at which Yoshimi starts to actually respond.

    Pan Is a normal panning control for the part and is directly linked to the one in the mixer.

    Volume This is also directly linked to the mixer control for overall part volume.

    Controllers button opens the MIDI Controllers window so you can adjust their ranges.

    Midi CCs opens a window for the MIDI CCs window for emulating the 5 commonest controls.

    Underneath 'Controllers' are the key range controls.

    Min Note sets the lowest MIDI key this part will respond to. The Set button alongside sets this to the last note played.

    Max Note sets the highest MIDI key this part will respond to. The Set button alongside sets this to the last note played.

    R resets both the lowest and highest keys to their default values.

    Key Shift provides up to three octaves of key shift in semitone steps.

    Key Limit sets the maximum number of concurrent notes for this part.

    The four controls at bottom right set the amount of this part that will be sent to each of the System effects (if they are active).

    divider Mixer Panel Window

    Yoshimi can operate simultaneously across all 16 MIDI channels, so it makes sense to be able to see all of these together, hence the mixer panel shown to the right. The part that is accessible in the main window is shown highlighted in this panel.

    This window gives a view of what is happening overall, and allows you to select instrument patches, change volume and panning, as well as selecting the incoming MIDI channel. If using Jack Audio you also have the ability to decide the audio destination from here.

    divider

    If more than 16 parts have been enabled, a new menu appears to the left of Solo, to enable you to select which row of 16 that you want to manage. This cut-down image shows both multiple columns, i.e. more than 16 parts, and Solo in the process of being set up. solo section

    Mixer controls

    (Channel strips)

    Check box Clicking on this will turn the part on or off. Turning it on it will also make it the currently selected one.

    Instrument (name) As well as showing the name and which engines are used (from the colours) clicking on this will make it the currently selected one, and open the instrument bank window.

    Volume Changes the part's volume but doesn't make it the current one. Alongside are the left and right VU meters. A peak overload will produce a red line at the top. As with the main window clicking on the meter will clear this.

    Panning Changes the stereo position of this part. Doesn't make it current.

    Ch (MIDI channel) Provides a menu for selecting the channel to listen to. Doesn't make the part current.

    Main (audio destination) Only when using Jack Audio, allows you to send audio to the main pair, the part ones only or to both. Doesn't make the part current.

    Edit Makes the part the currently selected one. A right click also opens the part's Edit window (if it's not already visible).

    (Bottom row)

    Part Group If more than 16 parts are selected this will let you switch the view to which 'row' you want to manage.

    Solo Provides a menu for the Solo actions.

    CC The controller that Solo responds to.

    Change to (display format) This gives you the choice of one row of sixteen, or two rows of eight parts.

    divider

    Part Edit Window The Edit button mentioned above opens this window for full access to all part instrument editing. Enabling and disabling the engines is done from here, along with access to them via the respective 'Edit' buttons.

    Editor controls

    Default This refers to the copyright field below. Clicking on this button will fill the field with a saved entry (if it exists). To store a default message, fill in the entry manually, then while holding down Ctrl click on this button.

    Author and Copyright (text entry) A free text field for you to enter whatever copyright information you like.

    Comments (text entry) A field for additional comments, such as how the instrument can be modified, where it sounds best etc.

    Enabled (AddSynth) Makes this engine active or inactive.

    Edit (AddSynth) Opens the AddSynth global editing window.

    Enabled (SubSynth Makes this engine active or inactive.

    Edit (SubSynth) Opens the SubSynth editing window.

    Enabled (PadSynth) Makes this engine active or inactive. If the PadSynth build mode is set to 'Muted' making changes to this may cause disruption to the sound while the PadSynth wavetable is being created.

    Edit (PadSynth) Opens the PadSynth editing window.

    Kit Edit Opens the part's kit mode window.

    Effects Opens the Effects window for editing.

    Aftertouch Opens the Aftertouch editing window.

    Detune (Humanise) This control enables you to set a small random detune of the entire part.

    Velocity (Humanise) With this control you can set a random whole part attenuation.

    Reset This button reverts the part's instrument to the default 'Simple Sound'.
    Normally it doesn't change the other part level settings (at the bottom of the main window). However, if you hold down the Ctrl key when hitting the button you can clear the entire part. In either case there is a confirmation message before the action is performed.

    Back to top divider

    Part Kit Window Part kits can consist of up to 16 kit items, each with a full set of engines. Kit items also have their own key range, although this must be within the overall part's range.

    Kit controls

    (kit item strips)

    No. (checkbox) This enables or disables the kit item. It silences the part while doing so as it has to change the total number of engines for that part. If disabling there is a confirmation popup, as this is a destructive change.

    Mute Silences this kit item. It has no effect on any other items, or the part overall.

    Name Each item can be named independently

    Min key The minimum MIDI key number this item will respond to.

    m Use the last pressed key to set the minimum key number.

    R Reset the key range.

    M Use the last pressed key to set the maximum key number.

    Max key The maximum key number for this kit item.

    On (AddSynth) Enables or disables the item's AddSynth Engine.

    Edit (AddSynth) Opens the AddSynth editing window for this item.

    On (SubSynth) Enables or disables the item's SubSynth Engine.

    Edit (SubSynth) Opens the SubSynth editing window for this item.

    On (PadSynth) Enables or disables the item's PadSynth Engine. A first time enabling, will also silence the part as it has to generate a new wavetable.

    Edit (PadSynth) Opens the PadSynth editing window for this item.

    FX.r. Sets which of the part's three effects will be applied to this item.

    Note
    Item level Min and Max note ranges are constrained by the overall range set at part level.
    e.g Part MIn is 60, Item Min is 40, Resultant Min is 60.

    (bottom row)

    Mode This menu selects the kit mode that is used.
    Multi - All kit items will sound over their full key range.
    Single - Only the item that has the lowest min. key will sound over any overlapping ones. Beyond its highest note, the next one with the lowest min. will sound etc.
    Crossfade - Pairs of items, i.e. 1/2, 3/4 etc, will fade from one to the other across their overlap key range, without affecting any others.

    Drum mode This blocks various pitch modifying controls for this part (such as Key shift, Legato).

    divider

    Effects window

    Effects

    This is the part level window which selects, contains and manages the individual Effects and their routing.

    The spinbox selects which of three part effects you are managing.

    The menu chooses the effect, which will then appear in the area below.

    The last menu determines the routing of the effects:

    Next Effect (default): will send the output of the effect (added to the incoming signal) to the next one in the chain.

    Part Out: makes the current effect the last one in the chain, effectively ignoring any other following effects.

    Dry Out: This will send the incoming signal component directly where part effects are added together, so it won't be passed on to later effects. However, the output of the effect itself is passed on to later ones. Consequently, if this effect is bypassed it also effectively bypasses all later ones.

    At the bottom of this window is the bypass button to allow you to disable this effect without losing the settings, or altering the routing for the other effects in the chain.

    divider

    Aftertouch

    Aftertouch window Each part can have independent Channel, and Key aftertouch. The controls shown operate in parallel to the incoming CCs so you should not use the incoming CC at the same time as aftertouch, otherwise the results can be quite confusing. You can have several of the controls working at the same time, but not on both channel and key at the same time.

    The normal range is from the CC value at the time the key was pressed up to the maximum for that control. If 'Down' is set as well, the effect will be in the reverse direction. i.e. down to the control's minimum value.

    Note
     If two parts such as, part 1 and part 5 are receiving the same MIDI channel, they can still have quite different aftertouch settings.

    divider Next (AddSynth Engine) Back to 'Edit'
    SubSynth Engine Back to 'Kit'
    PadSynth Engine Back to top

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/part/solo.html000066400000000000000000000061051506652756400226340ustar00rootroot00000000000000 Yoshimi User Manual ~ Solo

    Solo

    Solo allows you to switch silently from one instrument to another retaining the note-off and tail of the previous one. There are five different forms provided by the menu.
    With all of these you set the mode first (from the menu), then enter the control CC you want to respond to. Finally, to activate it you click on the pending button that will have appeared.

    Row This normally only operates on parts 1 to 16, setting them all to channel 1, but with only part 1 receiving note-on messages. From then on sending the control CC with data values between 1 and 16 will set that part only to receive new notes. All other values will be ignored. The exception is where Vectors have been set on any parts, in which case the entire vector will become fully operational when its base channel number is sent.

    Column This mode only works if you have at least 32 parts set, and is much more useful if you set 64 parts, as it selects one from each row to receive note-on messages. For incoming channel 1 you would set the control CC value to any one of 1, 17, 33, 49. For incoming channel 7 it would be 7, 23, 39, 55. Each of these are completely independent so you effectively have 16 four part solos.

    Loop This is similar to row mode, but in this case a control value greater than zero will cause the next part in sequence to be the receiving one. After 16 it loops round to part 1 again. Zero is ignored so that a normal MIDI on/off foot pedal can be used.

    TwoWay This is a variation of loop mode, where a control value of less than 64 but greater than zero will step backwards, and from part 1 looping round to 16. Again, zero is ignored.

    Channel This mode is very different to the rest. A control CC value of greater than 63 will result in only parts that are set to that CCs channel being able to receive fresh notes (of the possible 64 parts). However if the control CC is then seen from a different channel, parts set to this channel will be the only ones receiving new notes. Finally, if any channel sends the control CC with a value less than 64, everything will be returned to normal.

    On setting Solo off, all parts will return to their default channels, and will be able to receive note-on messages.

    Note
     If you switch to a part that has not been enabled, then you will still get the note-off for the previous one, but new notes will be discarded until you switch to an active part.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/preset/000077500000000000000000000000001506652756400213245ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/preset/images/000077500000000000000000000000001506652756400225715ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/preset/images/copy.png000066400000000000000000000404741506652756400242620ustar00rootroot00000000000000PNG  IHDRCk iCCPICC profile(}=H@_[EJv鐡:EEkP! :\MGbYWWAquqRtZxp܏wwT'edRI!_^1FTb>'ix{zYCJdO N0ݰ7g6->q%x  ?r]vsa?όN,ue{ϴyr= pHYs~tIME $tEXtCommentCreated with GIMPW?&IDATxx]ŝ b{ýޫ;.*w[,˒*ܱl `L16% ! !aӳI ]'ѹܫ}{Ω̜9ab/+$TT~ŻI$Hҹ喌$T$ޥ~{H$HSY2o;۶hh Kgt1y ӫb'hլ~JZ67u\KO*¿9Z?Zrs7muL\;\C+|Ytiߴ|mYx4];X2/mӹK˔yDSbW3Mʹ#c?zq[~?jPg班@w2팟ZB9},kg7/}#y&j7o\sQOڼr$M \كJM趹~ [ ͜iūW{\23s#v2tx-ݿin o߂ҩe˖vf݉'tߣuQi64}|޹?ɜ5I\:>p̘o'fMoVѺtAZ2zɎd9pNd3 4k0oVw-֯}Ut֪QES /^>۪+_;h:9իVQ zz˴MţZ:WOlڨrkrf"[N:ZS`..BNMgρ/u$f+1K'F2j#*j*G6:;w[ߴ^jӯҴQ7Ƶ ;J;?ѫsuWP\ 7 Vyo~ \\kڪ6RXGe*']Ke <1jؗ}/5W67¸aBcNͪVX?g9`?y7L |0q<ܝXi_\}⽓Y_ʻ\gPwڊug$]e8N?MtWno({̺ UVnsɸE=,Z?u8u׆)r#hu{ 8l޸ΑKgQ=NޱY=؅قw:5w7A} z)Gү{+WسYp t];J4t^>wc[^t<>wd. چ^ w1W[N6&,4M#]̒C컎;\}s5>DDj]ˬ l2096JvmdHʕ1-C:/1x׆_>*lkxQ3^T\-&/ˇzlʛͮr؅قw~zK'V*rj'wȨ|W,R؏Dؓ8SV7ciQs QdN}Iqmډ;M٬R:o]==k7WNm=iz8M%->Hh Sɹ2ӥOBW&ZY,Zw?ֱ&'uxOo[؈㴸znL֙Vѭ3M73LΠܜcf =Z˿pdY}| x .H/i6Rx֡щ94^5gv:sBo+B:0#NcCmߑ/].WЇ.2 襾5reW.Ng1)} u&w&gO_Y:#{c&ҁEL\:cL@-|8woi_|hYlմY-.2.Iw%νKIu|u~:K<pӲ1&G 69+b=Nm&۳ UrXӴqL¸tb{l5_ h[7wrG@ַu g.]=WEM[V˕їW-r$sMRAS. FꡌX9{]sVft6ŌJ&>:͔?6Ԓt=<7)>s}/^i٤Y},O_0p]smVzwntԮIַMM\ 4)-rAwfG:#7WH"xGae<_7Ƶ ;.NEsˏ)Uϳ!uA*M:/ϳ+&is\}~ɜs&OT=|c [M 2O VP؉so}q,̾hmE:fe3zt' Gڹv)0w2va@bus)GRf{ k=#Z_m_=>!imY7qmN/Efڬ*7n޸@mOS}hx&=1JʭO=;~~C[WթiclY1|u6=vտV?֞3ӻ<?gcw;= -6/y;]8ҶUΠ-_} u:֯Q|YKz5bٱzKa?lamD{n& k>u=Ftދ>0m)Um߲2V0G\>i.>Pké3|C*VJX7LA"YOGk(}GrZP'/)?i!GNnJ"YWgϣmF,tzui_3GRm/)i͜mGS#Գ7g 6 /)i~}V $T$)nzo>-a$T$iɔ}zmǺH$RQ%E/0(HmflcLJT_=Sׯ_.@#Gd@\F8 d6Q" #d2zWϑ#G4ڪw*TWާOuֹ*Yf2E`n޼ jeoneź&L`\v޼뮻"("0Ґ9 fZǎu˗4hAQ$eaÆ%J7xqٷo>߿CW[nӦO?m`zzz&M瞇zhȑZDdTJСC]GTZli;޽){m5z\bƌlr^~eK.ٷ+nZ M) skG?ڵkɒ%k2qnEY9cǎZ[oed۬}.\xjժU{7Lɝ;wyvٺuիuC 1_eddhG:dԩS'hzu?}ʨUVe@>.T̬r13{l-)S}9N[%2K.6tHrL5jTݺu_]ɬY̢dX ϫ~YW^۶ml߾]nR_>8p@TaÆΝsH|` |'O4111.w!+[nVXQsl_WjfQ41zhUbcck2? ϛ7o-J%#^X*cƌчWj-UTcR5!555"O.qX\~_j$*[]PI%}{K_?S %%%tMU裏>rpw`[ܹjVd{IUzgΜ1 m(gҥg7ߨ!c37J>eh2\)k#BQr<_C+j_fu9(^ vQ\\Zgjhz[%k׮mcЦtf%ˤԾjݘ)VW325Q]U9TF }HJJ\LqhE14nwKo7olU2RSNE=wcԒ"h_Ϙ/^p̙3Mj*S@+_ze7(.ħ~5VvmrԞEFBgdLU%Q@k郞W|(99YW\Ǖ+W߁mZa>3GiiYOӂ!5ӓ^+o}˦21inu Qc#ducr3(&MҍG~~U@TA\\F=7HIڵ3$J0hL%$ oSBFܢwuI2_?|VU|]RowG2*(i$Z1<4(+ez5Č@Fg #dK"d2@F VF|Y [Fȋ.1 #@FQqf&~ y˦LRhP{@F #d2eddݓ:~˫=;Ca+VTJ|xjպ{<3'jG*ٶm[{W2q.\ĭo2*)nچ *̢Ls+4m4E7nG+D LllS|rbڵ[Fʗ_v0p+xu~^FOy+yh„ b?̙c?ԽrLk2#LME9XLe˖V+4[W~pS&5#=ӢLg/T,%%Eԍ&?J@FNFgVe23ҥe,?2gM6U'K@FKF}W}K nh4=qiFŋ2j##q] n/i2*F2GkT^5gŊz4Tf֬Yڅ:gdW{ァ T'W||űc_FTn/_' b$#*#իWs(uK1KСh aZZZ TjժnF`d"Q 1Dȭ:>( #3d2d #@FQʈI2d2f{MHHp$_|QShk&i_R%c )YkvQ7ͥNkG!&Z@΁m [Ξ??"!#ß^zIQW=>s/#7VFz]cRpeb̉'M;Lc(zg\212zWb̙*3ϸkwhҥJt۫цCU 4:I4,HTUQ3iޥ\_ #fiؑ:DLu_c;:uĈXT)}aA|?!l7x7 2d2d2BF22oSRR4k^gӐk=ŤȨedf>رcbbbjj|\9 “nP4QQȨYf_2 YFA㑝={k׮VQ]BM6UCo*..1e^W𤋮uekƍne94ۚLԽ{wI##A*PBE=[|>=zh Z}!ZjΝ;ӟtǎ\~_d'h"MT2cƌ%KuҥΨC yOCUɭ[#oIuͧ\\#" "Qxdo 6+iڐ!CG2۷4o/^h娱f6h(9 X(h<2z5Կ27֢F(lQ 1AzamӦM8#bHAnU{UwF iؤǎkQs$"@xd_Ro|HF elL$79xkD$sPM+j_v>G"0 #d2d2BF"5~'wmJsc;@F2{ofwRFUqܯ Uv&9 5A4Ň~)c;eqĉCի g3-@5dT㦅$ϲrTӚD>ZfhBQ4P֭mڈVQ$vGs #Qqj_eʔqtHHg =d2DpYDs'#QqcjϨFy`e%NuPQkȨM IFA#|lR2k&I3+hnd32*qBQgjb=MS}Z[7;qK7u%I\DQ~jF%㦽;޵ 0 (DsCFQ7MǧQ,OӂM47dmqӖ.]jIR"i)(qFg"##gvZ nRGOϞ=CQhn iH:gj/<_3C{hmPj0`*`ܐ2BF!#@F #@F #dT4M|$@F #dE6@FȨ8)#3wȑ#QFvw]8e?|X?kI޽8Ɏ رc ujժ-^XIShGI i"3ɓ3%(-L-uQNPL>S}J5 DUH~,eY,uvi3YqT(:L6Ms'M>]T[R2%8WsH:_5M$hkMS2I"K~wnd94\ǎ5R>}#HORpR}'U2JIIm!y)rLLn8lI UW_U$/&GӼ22R+.7ҔLJT@6nܘw.MG>kkڲ2lJFϯv{/nKYh)=VjŦɛ5k}5}W_}luH+WWLR/_WhE"w(-RHGnFFvѨ-i[#}kFx-j٬PqdNkiEkqU41vLLMȋ5$/-jID0CE*?ifKZמi*nN dʕ+͢ZJ2Y>^;ҢedUTҀ&Kf9jaGoZRImP]KTctDEPFnN :ei&#=MY p2F3ܼyS {05ϾcW:[ փ*XhF!yd[]իuTjpiÑnQݴ@⋺tDpzg(8jH{ ڗw e)/C1Jz+5?R#Zzoˌr'֛ۤ ^j< ^U!uTRz}v\@F #@F b+G9u2BFNC'#"ga“D{wl>|N:eejkhF/)&[l& ڒ%KY[ӜzDk^qeWrLjl+, 6e1녙L;AcX3G\Euf|P1Mk5s6i$(Y.⑝ .s.30)Z7JM6 qgoQHRQ$2u3iVo=.W Ȩe;SBab&رcf|Q13 /# H˴5=&/Т"9B*-#~4M<2õwg|g2*YEmTbɩzmgd8#Y.i(jRmM[ַȨ@dκL1˲Qԓ,wCHU0Al"8*2AG`[M<(\1Rz$.{ [l>P#/E@F!#@F16 #@F #d2d2d2BF!#@F #@F #d2d2d2BF #d2d2BF!#@F #@F #d2d2d2BF!#@F #@F #d2BF!#@F #@F #d2d2d2BF!#@F #@F #d2d2@F #d2d2d2BF!#@F #@F #d2d2d2BF!#@F #dȈK2d2d2BF!#@F #@F #d2d2d2BF!#@F #@F2d2BF!#@F #@F #d2d2d2BF!#@F #@F #d2d #@F #d2d2d2BF!#@F #@F #d2d2d2BF!#@F2d2d2BF!#@F #@F #d2d2d2BF!#@F #@F2d!#@F #@F #d2d2d2BF!#@F #@F #d2d2d #@F2d2d2BF!#@F #@F #d2d@Hie$xR џP5#AF #d2@F #de5'q:):RFFpAI >rI}ĄPfhwܽ//!#UeDU"2dDBFȈ2dDBFHA׷=-!q ISv}/&7gވߒ~0"[{yؐqmO9_d&2u7꧿1yKjLٱOBRN]Q,#iw۞J:v-mw!#(_dQ(#iݟrNRg߶qZRzvew?e.6<ы*#ڷ1ޑJ7溙vL;tԵo?p(e^댲 ?}# |Qd[$Q9IȈ2  F(>-ѕ׾d*#嚵:uQ➳o#$~Z'޺sjFEmhΝWֺS=4iթdSQ dD͈ f4lB6eK9cs֬Q3"!mw^JܽvIv|վ8mqbF+YRN9Nߴ]|ѡǠ;O7kӥT>խmcYzTecG{~|jwsc׼C;Ë) ]5#d{hИiFn ;qI>S{j둫C;g??+i.[Am qڲ L7FY)-->ݺ 2*uknҪ-kv\ѾO(?i~Fn )Wn 5 ݭ[̞fܸ!=h=fͪ{wn۶ڵ훚2e2K(! ڻ{իWiԨ]|*쮗rֽQ3rӖm8 jF/#CEZF틇s=w߿.#&36vrZlliS Ut|Ն5k]׺{W9PFUTnb筶Ń{$ޝ`/fQٲ^^m:Օ^:es=Xf޽IQΝs`3vɨr ,-pSxƥzޯcF'e 4b@,kF**uj;UQg2fDmDj.]r^*t錸& wt`;Ue֢Us$S`ɒ+VN!#jFԌnl=~g!5#W<ڧfDv{_"۟[PeP 5䌋#iupTIohjF<+VA Lb,\8*ƚ UFyf7d%W0ܹ!R3  Q3 :"=אEXc6lX$եKۘ~*E CFJ GU!uZ͘1N>R=װAzjgpdT,jFn"yG/jFZFKc^23Y!eWW^I 4U[0dGx[7հF;Ig'U+Sa=SǹM1 v=S05HFFsLs}1!&Ʈ1-_Y49IG[X%_ɇr}sE[ok^|QԌO,^FA#,2̢Դ?1͵*3b\4,SJlCK}%:A/WJQ vet.G\2jF$dT5h沘gH-2u9^g:Ov!4L՛N͈ fT؅Y3j׵ V?ˇΑ2BFŨf>2Z yVahnTʈ>#dl igzNE{#5ƃHÚ)F5#2*wDF8#/P l'lnu =UC(nd=ΨO8# d2BF/2ZHԂ/ &TkFIJJ+#M!QF&p( 1qɖQV֯#"5TlSoWX2z3IZ6E"s;+qGF/J4gDMH"{gŅO4wIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/preset/images/paste.png000066400000000000000000000414011506652756400244130ustar00rootroot00000000000000PNG  IHDRCk iCCPICC profile(}=H@_[EJv鐡:EEkP! :\MGbYWWAquqRtZxp܏wwT'edRI!_^1FTb>'ix{zYCJdO N0ݰ7g6->q%x  ?r]vsa?όN,ue{ϴyr= pHYs~tIME  8=tEXtCommentCreated with GIMPW@IDATx|Te-X(6@:H W7Q)w !@HHE) *}]wu]׻{wWwnM33g$d'{;sy{n IC"H%^f_D"J$Zj"HI'/dO_F"H%nY`_Ɍዛ۶ld6-5fw1y(&y; w_ZՆp:+.,U}n%3)=gY䬪ēcyҾW0цEH6ϳd/otzaV|M#&?~aca?r`g(XoK@0T9{Rg/hV7!rVU<{ѲQ|b-m4mB?N/?rzYBYK :߻o;L3IDנ4f?'-ALp6&Ez䤥.9*ι䐎+c۴6h>17u%w޻H:s›>(8иfm[Lۭ{cLc[׾Nj*ŋu4sK{z:uG (whvx܉#zԬ^V*UOZZy㬘;VnsF5.횞ض|3KJ11+p¡V%vjՏܢAݚ+_bj{Rz۶vYPǢ#@u_ܞ@*OɪZgV4G4VW1:h u?@iat+9֒ko?֑(R e;U|Ck֖I:IP|Ff& kLN66<'}Sk9(pzܧyYN {!}_֭]~3A }MS]\9j>>PݴA魠СMc.s$mdzy_n/:Wmw?]V*pjX^Ze7_cၚUMv97ch^oEwETڑ89_F߾x[~JVy -F]~ƭ!+ՓtڛǼppyRܸ^zbӻE=̬Sq F={yiIa:񶬙T%DYoz?qTw_ڌӆX{G2t̼9؄Yoڿq)0r`@{:Gw?>++9Oז&uU@;vjczwVNzX=)rkqn5\sMt,Ю]UO0 uo ) w Z95h'쾥p{Z;ؾ!mMx<_F<~DʄkY @%֯!M枔XӹmdMM/\Vbίq:5 (vЖ5x IX8=orNnk/p$c^-O^:V//]drY9yb0kMW|hKGtS4V>i+&<>~zSۼK -wʹm:T}Ld}r꾪@z.Zjq԰l[;)ڧmʱA;Xӂ)*S2/@eܗb!m7hݥEƘ ^l^S%$ԪUm4SxP\J59sln/`^^{X %sdp@& &p.FT![e] j^OʻX:cQzrf<*Oʑeβomˆ*Cqnzk O z,iޤyYCi|&ߪ[,P uABݨ{թٟuGm o*9woGM] 68vаۙK]m&9woeyaBufq;R@p$MQzv@f%}ת6N&-mrbse37o_ɔL~W񓲧Cf\' mѪuK{X?_aGrڰ|l<~qG>B/$!Y#;f͂&ܮU5=g9e֊CiksYO/u),citz#O.'qۭ;6g_:=@_@p-) tw5eb}|,v/ѱC:TTzX3?zdUzu[E#M:у:@r ŰjXӬI&lR7O"MvW*M0Ǎʗ9ǑLu7j̇q;4ce?̌t 4eNmVIZU+͙1Y|X>]_ZoٴY|IlހY{ڄ#m~r)0w@>!&o}=1V*[&-ԱK=<~RouȜ [/VzewNjURIV uZ4kTYA+3 t,iO@@E&%.'o?{z!雔58{=?m:O֝nX6ڼu2s[7oaz-yכ5~ޝ_ۜ7ѲIyfh1y=[:qCgNoc۷j^R-8j@{/dkY9)o^9_kVՂZyF ]Q.TU|RIV kl%i)x(б8RֺG("Q蛏wψ%nԧKp'RşV'?xፓI67D`O+g ȓo۸?QM=;] 6?-/OF_'qݼtMa^>sjƼ_~۶mlڴInRw޵kVNdև̍5:}CF:e$͛_>|ؼ Wݺu~mʕrΜ9*yh^# z&Fь3K2i,U#Ȓc/ѣG^KAdZ Nwjt$ʐdǿoN *x܄Vj4}_|)TF^裏KЁ}M1;wVʗ'b/P^lj'̵m6xp3ot3'H=~eTjUkUJ{ل,m~٠AVtj^4AAedR譸8]Aڵk2Rd:uoZNSYj?19#ԧedZ.-r4VZ#111}1ǡaлiK ._SEVK.#?ry7|g&J }cR[ӦM3'O#u3 駟`MI+[n59EFBgdL&t=v)nFFz@d|r5@.^Xls@7>3S@rn閖{Fu7-&R3=޵ol #O2R!fMӡ.!Mw3p$ݔΥnݺSn־^I&F~߇~h-ΤE5ngvڙqFM4qi[!#@F!osI2a?O|9 R>1AFUۑ$҅Ok@ 2ʶݛǡGC̨kd|F2BF-B!#@F #@F@det3hn蒑#M2dE4{5dzPTMQ6iҤbہ"2BF!#dwFF9ƍUywQʕ++"M8O>qF2 ^xd_-Z$?xС^_LDTZ;lذڵky ݽ{3g=0a6m۶l+#M|o/( "8mԨb+,4bJOSLQc*N!*ޡ] A̘1Ä$[tbuU+#/ *sJ|;ļyNk+STE\zU+oٲ_WMfSa=HX2ޱRGXd6_U36l{ Ȩ$e8ܤ_ףK$WXFgvntWF:(ՈY\u'(vW_}_Z2VLjZj\j+HKHYO!*R2*aױs.S`L2j"o5=+a.o>RLL]w\VV}UcUM6%c;vT?w}J^F?cCg}e^8J=x+hb=g͚e^~"Sˏ?t钺TF}t#˗/[je] {*w9/e2ҭ:e ,#KII&_J@F'3g*ɒ%.Lxt颗2qVo-5kN("KF}.ԭ+85@!߻i^iy2Νb,X]vf4/ (d$/רnkPϲetk\}= ӵ u0l]=r4xR\ږ^32Xz}|;E̻jԬYSm,Ũ/YCB*1 6Tի{&G+;wFfߝ.T!*G"j>3 #d2d #@F*#&@F2@F*n5!!ӚCls^xMP~*U45f⯹l6nG>|XŤ 4yl!!0}Cq<ʨsΒcvPCy!ڸie& a% jyۍٳ !̼_sDm4 کS'wom(`_sD&ЪU?)22|p}]F^⯹oVFbRpeb̡CK5 @H{1A(zgtdb(eK/;ŴiT̙3e% C-^Xo鶗N{54pȐ! dF')b* yE?mn{Qkh[Af+с@ÇW\2e- R?!u`{!4@F #d2d2dѷ~Yk8\kl&@F/#3Yǎ׮]PfGFȨd[%Mk #dT2j޼WdBQxd'OڵUTPft!ݼ瘲ZԫTIw}ǚ6D|!zWw si5w{##A*PR%E=[t>=zzWCz545\N>,=="痿$;yDiҥKuC yN]Uɴ4HD6{<2ZԉZN7&G-8PZU-G!/ӄb7Z?я4=Rn1 QZ: c$"@%ɓuOэ,&L P?z\Ls"=nZH2 ,;wM5H䣕+WX˖-M iFFhM=F^@F7-$?Զʗ/ʑ8zdɉ{HF~# Hcf^n۶ͽϨVZy`e%mNmPK5dqBQZK.#IR%[ "=nZH2 vz2tiWOk%[ F^@4 j*{Iu*UZFAeTqyքrEEgTF^!#(]Y}IӟLMOj}'فhn -^MD`E RP DVV5'&u3$e{憌-n[}jF'@ mQBEsCFg2d2BF!#@FQq6!#dQ6!H2*i#Fݹƍk?tΟKAz 7w^]hY3MRIv4O@zz q5j,\PդN4g_4`ĉB Vn.Sh~Kճ"ʩO?ջpIk,QƐ ZF:Ef)˶娘eٞ㔵kN|j-4Awaʔ);iԩZ ٗR2%8mWsH:^5M$hmMS2I"e˖}w (-,Hs}(GfZMū*-A d@1BsQ>9NNݯGyr$j_؛NW\"_WiTFv_F\HMiJP+Kue_?ԣF6Y6l~Q%#?ni658e:gTխ^K޼ys#k+f]/^hdzy{yE pH~QH\+[ i6add%V @u`sDoMh^>zfCƑ?Ν;hb옘t=W%JrD% (-\H3[ڗ,LMSir&Ǐ|rRz$;8eB'V>h jP_:8*L-mK>_tICZIff-A,.#M/Cͮ+ǹnM13R:Լ @H'&W3G t xlF.TRAGu3H:왚.#-#rp܏W@0D8#ӥIAdddd?sSf8&s8rV-*t~HaE ð(\(#/22]~j+$P+fw+[esv;vK2D={8%ˣ~xmH/5.#!64i[13 ۿNWkԒJjZRrM%[eSFIIIF"淀{2Jtq9fzvw.@ϾcW:Z ֍*X`F!dS]5kŵW& GWFAgxtR :uk>Qpti#qˣkоGiP֓b1DZR *uKzDQmQNzzrQ@tCGSSH()Smڴz" #d2d(beh<~'.@F {hɈeJFڼP׳ٶYP9bejkhF coVO+" h"߀h4'.ѣ_}ULjl+WQtivζmLh d1Č3iZsխ[7 YxC4iZ * f{GvaJҬFwI3Hj 6+ ȨeM'7/5^jX5^$ciG@4=S8Zk&m1EԄr #SSQ_+ʊDF=0j;v(ӄ`{ShRίtt֌v#^IFj+9@FE+#ݖҵi(Z LO'O[ hL1bCWFj9ֶo>{%^⑙Ԟ4&Q&2* TC@q\u*tvn"uwCY5gJV|'uԼ" $F=#:uRגVdT2JMM5m>Z7-C%f͚e8ͳ"eR<2ET$LL[ 2*BiM1y3O_pae!}FG~}q(22Mu/R! ,#񽛦|7K<2õwgxHdw #@F2d #@F2d!2J?tD䔼?T]Qv8emC)S|wj;l2q->]<NHߕHPa?OVԵH|mdD@FȈDBF62*ͻO&O[Y19Ww":~uIX~֭/q+ϼUo>Zaͻos2+("d5Z9m۾G_OWȨ6eoJi[ZqD78'@ʦZgމOdfJLhj^?Z:jdݐQD{#/U3oD I_l3O}"#/ծkwk]rjH?](Rdazּܲ}0DUa[oNoڦ76199-3c)2*އ]~Q&t#kEFېv^'#EG#ߜ?{NZ8UYN~u0:Y>64VV뒚[>,t$Z|mR2vuwF-{M;sMlv@K#ɍl=򅶕e'SW{}0鲫Akåԧg28JJXKdT {]Vͫg߼~SN˜5kԈ |u>5k9jNo&˴4s D?M+}3o[?F+wp,pkA;ٸ㠕uag]Re 7eZ޻W7/+mt`u{鷕t&߳N ZZgw{Q/]ey:)o0/.)zd=g]Re 7&WkWFϹ{+~?)w'qI^UbD"#sl ʹ uuu s?.MaMݜu>N[]P3z zTF\y%_n =2O7TF׺/2{Oۺ.ɻƅ61+]&@2RsI9wWۿ릴5_G]9zCM@!z z2m+mșas_?kA- K厓<76g{8ܧ gT2RAK},qIt ZKn =GFe3YI'^.}On~LWzjI{t9q#SurJsHǣ702:}ugKв7%"ԧg]ʦAYG_Z 40u[9SHg|F|`$dDBF$2BF|`$dD!# !#dDBF|{2:ϼI_Pewj;2҆K)“ʈv1vdd>3O!vv8ed>3mDV]Եf d2@F #&/ul_S>w{xDT z56mS{lԬrdFI۪Qm֦2M.##2*˴tsiu^ 5䌍. i bֻ.VgSkH@G_2Wn:|ǝתUkq\Fm;xNeVTuSyUj(se{QOAczd9IHȨ8:!:'7ٔ=LV6X2JR>RġEkw+ڞtI|KeDisC:Fʾl-$q]TC"#2*[eݭ I\h޶zR5b]N"#s1ǻi(_s_E .lvyL4V#Q9itE6Bߘ4뉍f:GMZ`4l&o5.e&BQ%QA#):dS왺Sϐ t{Ked{q2@ŹOnV:Ԓ2MdT_T7z2BFEt?[e6~ٞV~ed%wSʹٞsӺc/GRtN _t2RV&2n4d'Z)ZPkge"#޹[=ukUjnUdT2JM]޷oի.}~֭Κ5„:{,]VIhjh]F-ݨ#ZzjTNlqr_U* ѨI[ LhפT-}Ӂ/.#Or۷֭])S:gi:Ȉ)DHX_y{wn۶.۵OεjҤQ,U|4dH׬Yqzv]w\/]#d"k=UP(=|C!=jXwӼD@-4nZ:MC(ZC5ZGFA=agdb^"y 2KqF08#d"AY2PyPVSH:V묖btz;z,%o.2쑏ϯTƠ[~F`##d%ECgg2BF`2:ϿeI^ SPRI5H蚌tV.t⻒Ѡ>TR͏H蚏DRȀ;ž, s@pnL #d2@FD>/&Tk"FILL (#M!рF&pdd|P8eP(;7J]DƓe޹z&9,Ik תH$R$0[{G3,Ik תH$R$@(>O6IENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/preset/preset.html000066400000000000000000000041041506652756400235130ustar00rootroot00000000000000 Yoshimi User Manual ~ Presets

    Copy/Paste Presets

    Paste Window Copy Window

    These two very similar windows are the ones that open when you click on the blue 'C' or 'P' buttons. For both windows, at the top you will see the type of preset that is being managed - SubSynth in the images shown. Next is a list of all the ones of that type saved in the current Presets directory.
    The preset directory can be selected from the main window dropdown menu entry "Path->Preset Dirs..."

    Each preset type has it's own clipboard, so you can have several different types held at the same time, but only one of each type.

    All clipboards remain in place unless overwritten so you can quickly make multiple copies. They are also retained over hard resets, and even when restarting the computer.

    Copy If there are any entries in the presets list, selecting one fills in the 'Name' field and activates the 'Copy to Preset' button. Alternatively you can fill in a new name. Once there is an entry, clicking on the button will store it in the current presets directory. You can also copy it to the clipboard. No name is used there.

    Paste If there are any entries in the presets list, selecting one makes the 'Paste From Preset' button active, and a click on this will then perform the operation. At the same time, the 'Delete' button is activated so you can remove this entry from the list.
    Alternatively, you can paste from the clipboard if an entry is there. If the button is disabled there is currently no entry for that clipboard.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/resonance/000077500000000000000000000000001506652756400217775ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/resonance/images/000077500000000000000000000000001506652756400232445ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/resonance/images/resonance.png000066400000000000000000001143241506652756400257340ustar00rootroot00000000000000PNG  IHDRbi(zTXtRaw profile type exifxڭivrc^a9|*RD>g[fuCdDh?~歉r-6׸:K^7uz2C_޽oC7uK~?o voxo;#ʭߦT+X@|b\{MK=c;`72o} R{~p oq%CuNUj_6?!g/^G|~G O^~w͟_}ݥ} |>}u}j zE[wRSqݐ2͆|ߍv;e'69nt!FU4>+Nj~Cow|! VD|b(ϱv7];nx\rNڊqye' w^k_L̕ v;sܯ с _we7D<:1.$Q8!+ ݇p) } !g>eP5DRȡRgŘ+1SH1SI5sʼK<J,RJ5^C5\K| wjiyhΝww.}FiQF͌> gyYg} *vPqwuv‰'|9?5= ˧x[8IlV3YiYc8=~t ʶ=ja錸zl\D\şs^ILlꍉv?_bEyB:ϲB9ޡ5N>R.+dW>=re/YˋqyV3lL*֧v_#g/.HϹ,iSzQJq%I  |ƥ:)v5i SkKOTҴN% "p' (),ʕ>Cl[:r/:87?0등DHj[q4w'В?~Uo';'3Skvam;){p/G\3|Õ(ٷp%I3a<A iJ"b3j RZc "- 'C'$-d%X (7BU)EuDjΙuO »* p/>!Z CexK 3ۻ73w|k(S%?ݡ,DZRA`%\@m=pv̌{`B|!<s|*twȈcɆ\R@x2@)k1vh#)@aE<[B#1acW+Sq-'"[QI6L4XܒoeTr 8 yRqgR:`=$on L$uQ1;la*TyH'#bg@9X2Wi^8cA}B$h2ls"2 W͛ZZtS̛_?7F7 Buȳ ApD'1W0nf \pU0<, " v9S*)KK̰~2%Y973ƍ7A2d!8"<z[DzEZ;Q~@CHp!~LaGAq`ğ@jU?&0 e")CgkjR> J]>W1{Dj uДRi'z޹#J~c l L- -.Ձ@/;ODot8m?Fp%ݨQh.ub1"eh"ܛ>X>9(* K?=@1XNx逼Un CƵ*8lTb0|E2j$׼7P)fQ':y$mEAIM&D((t2)1ӜJBe[ǻ=]5e'("ذ8`Z|*^T`ru{s ޿.C`#EM2ӎx%Y!#@@%pޙg_^24I*rbdVO$\f4#̰pBr!irF\Oeݨ꼞P*\6C_;j!-iD=ɴ3vn;K9 C" w ru ꝇzRHiU~%ճ<-j1V=W[)K䏅o _(y|8GpS P@G2H֌k(C{i~ IPj=5rymLa~S<L>4ִţ |^Ć *0[\h$HlxU)L J2Z @Tܯn).ւ-'QpבVƀvJ knA5qéDŽ؈Rԕ@bpȁF. e(ۥbߠ9h$KhxPFOnq#SL8"D#(DˊK҈_Ȼw(wA"X,d\US`wҙP=\J `[0N퇅+$@uvNEGL^{1]8t̞Hq͛QFrO$oZ#8eZY-GApIjrF8.oW6RB$ d-89 F!?s 6 Sg9[k3JХ \(2BMKapZd]REM/SNRJNW2Phݎ/v"//@l)1-Ԧ^XYPnóL$"\_^jR[ ,L9OpHl< ouI0;x^C6AHx Of[tvOKyوIU} 8KH Fa?  ƌn%ChMx3^ 324R|7,~L^5ErR-#$@L" !$TCOh@aJq wD{jYR/pu7X%XVUAeG6y@D<!5_|@S̃SN >,FZ3fR(KVmX-b=@YP[ĕG]ZΨ+$Jz'j z39Դ[Pf&j2j< H@NM8w!l}̥ 6krGĆ5<n/3_= CICNM#E؟2+7ȁ.R 퉀hYwy\`6aѴZs\DcZ 5 UAOM|,$4mpP0]ëht g2!/aa\&,:uMSe.0TiڄI9Ȥ0Z9Oo*p*Ǵ xv-m (j R\hjQ w!2Y8K٧txqz P.U9e\E bpH1> M J Y}lH"=R#"rCVrTjP%-@iEƛP>W"Ciz}uFjW|2?KOHJSmOӮ8=cZ+(,ZOZHҐyPh*wCb7. xzxP#^`gRy/ܣC)w [`A5 DpXu%9hf!xp(Z VB/8v6_m,Syյai;YiCHUzZ5h`}[WnBag0X4?O!5}宋{w4ŵL/+B4XhnjkYhpqtD&tpk`ɮ8ʽY2_&T2 7 .2."qQÚP [k-Uܬv, K.E<J.bK( fcT KGD%3!\ZZ-۵>Z)GYQ٫+aO#-7GJFΔ}Y CD龍Kh]zbڡ13`!Ļa;swthjah@0`=j) x}2j3Q fKJJ Z$q w֐ j\{-w컈F7Eԡj_eMGr7s#Q0(b=Gz B,@OI[ Nbzoke}r(@n,I“KBeܨ$rT(!8͸AC:-og[F2trύ6@8G~o"Z-gBaK,vxW2h(]hͦji&xS4D/+MZB$@.ѿԇQG rT&qMih \ d"o'!6 &=YNzm"BwQ! Wn?cU 4mbC蹧Y'x$YRNU;M[:&QTo찢)(#`5<ĉJhSQ'Pm쨵-Xrӂxq|&_4n"R$ hjR]4mQs m,o7LEUB Q9ے m4 )]&٧&) >.O 0vfN9]}r p2(R58QFc$>sz 7>8'< ~4iigv֨^y7i-<= 5zY>BJ C3\R ;F B$vu ȡ=IN'WEQE;N{(,Gq{FrSˠ۩1v-..U D3o lJ 2YQ-+6| 쨈<\\-2Sd>(-JZ$Tv0^5Bn4(U}*2f A{"ZŦ<; =YFCu:mP'H2-h)xS"ÀCu,1mx66 1h&͙~HUYn\ \]CSs:uզI]_Veeھ@=Xebut<sCWnrxvxIY5&Jd ̱6hSwxgo`0}Rԭu&ƤMُ]nAkd) Vp;')5s(]ƽEM{4F.ZPzifVܚ& :P{uXIrwǝui"۱IO@Yᑤro7 ܟPh!,{窢`[ݩZ#S!:%vCGͼ]1b}i4G />5׏5j{V&r[E muP_EDx㽭3 LHG )j)"<&G9$DCڧ Z\ڍZDW >-$bZ QCLԦYjJ!7שi\J:|X--$m!,u, _<,#y,F(^<ZNBԞ1A#5 Dj[:}B`֮=|hidZ} Ve)kcUH=%P2#A}5dV qx+y)cgL&"-9_Kiz/ =X!pч:2LMIO 9!$C7 p_iCCPICC profilex}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N |k pHYs~tIME hytEXtCommentCreated with GIMPW`IDATxĹqލ{w{ލ .4SM?$14Hn/$7IHA߻geJZh4h4   DӴI$D"H$ߦǎe?|D"H$庌%H$D".^~D"H$DgzB]ƿy~'/mմ ~h}O_ۢI]5}1|ňr?.R6>:̃zUsf_hpg\3ug)]Jt;2k>qbYC$]>"R?u@-eJ[!]^c'QJ^^m9̢} :]};}>+Zk&%{fjSO+nSMŇ[W]_%읯ݟDr~z%J|W.WWjv-t?_g\ ٵX;ol|须p"9F߷;aXW6=+'enY6.RkrwרV黗r줙Ƿ϶bN-vlf3c[5zq1K"9-5Wte4s\/UZ>wzueTcG}۫?ybE9侭3%]5H zZ4}`ɯv*?|v{Ԝϝ^cd|ѹ }׶j;mtWlZ2& L>2eTw)}J"fF޷yPS42|b[} :n9cl&9-6 V˗}mtBQyr{u }C,tb,]oԶvSMInL~t~%=hX0WU+.]J.ʩ?ubVPNN^N-yuR|dWί[Ԯ9{5kINHn!S:nxB}"dm vL\ Ue>+|K4WCڐZ6{hӴ~[ٞ9 -בו+ޓ[cR9ϝZ <<۵}jiք޺ Ԕcz)gm![J委2G{WJ{nԩYL麵ʃ/A#GA4ɂL6 1`SNV{ Ƴ&Z e^3> =DY9(Ԝ{MVSzbl8"[&Q֬^Kw\BtQ3~©ݳlN=*=vtqɒju'5E2>2yd/ Qٶ Sl4s\O5ςiՔcC2^;"U&Zsɜn%s^s|#G{WJRX?լVI]Py̾o}|!3r.ާO~ݷAx|i`H`s0Yٿ{+Ք^'QIR>Åm-s/(xN)4i9 gV>+ƪyR^crZ6sjZ7<# Lmk%n+Ϟօ51So>s:F&wҡU}N8mW)S*KnQ:,I/]Ϭo\4BMˣjʥCg8o-rKBbW5$UopW%Dk^~+}*y=R\crd65el{X` [u,䴴 2/]3ZI)㟍9[RKUޱIJG)W ]Jmh6MD깃^%xVCM;]wϠ<|+'MkdhZPKH-ݻ"VM1S҂})a)?յ}Ps!^ ͟'bOKlfܶᖥD};5=qt5ErGۆ Lak%v+{}4Ɯ-^J1gKKIIr'QSm kq>[ܖ&)O޿pqKfһ."ԟvZ1DݹYۧFjި~Y0OHkYgN,w}!!]/P;4?%k8{V3[9E|N,wO\1+ԇ}UG,OKgxN9'7D '%Go u93 x+jKhѸ=dCoͅAd\ς&z f0<Ɇԉ7gxF5E?@tפ^:Ό_vUՓ]n7]kƥ)o\rѹw oM$Ҏse O_~|@FRg?ω$.]x7,~dw:9|汃ڛ)o\E^=ի9_t1K"9-mY<4$/;$~B>] $g9Yd.X1RY8J{UN]Mט3B)Sq1DޡQ{C6>sn""Z5*tk3'O\=0^,K+z̟KB#gؽz![5-3YNSq~̈UO U gyJZ:8{F1CcgOw͘^w4^SVxh.adHwY=GiVG,_ݧKe?Fmc+Uc* [6u0}d0xS YS} :nO>k3];Ɣ5Oy۵`WfrdYii!# H#`w4H$YɍyB2;J"Hɦ%{[Kơ{'Q&$,ƴfNߐ?x{ש{'H$Ri1 -׺w D%\V+$?g-cI$D"H$eӻdomo(D"H$ɟi!š H$D"|B2&  "(gOW)   1AA1AA1AAA c  @AAN+W UrzfdMRR {UMv51Amz"cdLP3Pb #cڄDȘf2F 뉌1A F/d j#c#_&'2F5%F12&MXOd j0J|!cdLP cd j0J|!cdLPh#c#_S;Ph#c#_SPh#c#_SPh#c#_SPh#c#_*2*А12F5%ƹUDUBm12& eOeJT%&#c\ƪTRP cd j0J|Ș#cdLPQbXU8cN*6A`BȘ#cdLPQb {Z U 2FȘ2FT%&#c#_ػ2 X*6A`bU}"c3PP cd j0J|!cdLUBm12&(1򅌑1U 2FȘ2FȘ#! c#_&OeE%dLPQb [OiPP cD&jdLP3Pb @dQ&Z^)ُ^dLPQb [.+:5AV9cAf=]d۟+X͘m MXO?X/c+:#c#_ء2֨JMkՌ8 c#_ؕ2NuS c!kb5dLPQb {[dQ$cӏ_e@5%F12F&غ5R:$5XC5%F12&MXtdl!lȘ2F LI#D``gĐedOUBm]tYOEȘ2vS8#cjdl)kȘf2ΔTGaCu8k>"djȘf2F 뙚4+2F"(1dq'!d̮L12C;%+c^k &2N7Y2&(1Sq'NZȘ#c; j0J|!$d$㔛sh66A` TNWelAj#cso&pLXS cd j0JVqS9W&cpLm\#m jdLP3PbWL)rA6A؆!c˸_!#Me c#c3xSFsCV[-㈷ȘtȘĐqe 1j'#2&(LiB8-j6'~ 2f=moe!c86!OT8mgT22f=%1dZŅ3&cS 猝EgLR"lGdHfI;eCjkȘtȘ@؇2hKd_ r̜"c2X&c*dL c|d}_ ]Z#l 6ͦSF z>= ٺ}x=IQ VlpG78q{mƬ[ڌ5ڌ3Lo5F1mƴ#cǏdȘLVXKc{dSbސq2A1뙂b3Xo c?-;28r12v5с]-cY2֐12f@#co{2X#2F  4۳12ȘDS!cO8]!~ c,p)1oXCv81$2FȘ5Ji"c8'ZYU $RhȘD0C#cd12F cdm*n<h#cd4J #cdcdz"cdl4e@#c7ޝelXCP&j: c_89 ce@ȘpA 2Nx$2F2#cd12F$~FmU<9s7@)2N Șܥ2Nvd12F>+cw 12F)XCd wd12FV+Ud12F#cd3sA#c~k12^>2vZ;2fHvXRK!cXsr2H."dLmn۞2FF]궚٢ ߭o+GS^= MܙR2ˣ}h:aѾcgQޮ.d7WkW mڌm_CڌΡ;m7e!cd12F2x 2C2#cdqebfx12FyXCƙL픱qdlV|de_e\zV6k1636Y{ˊ}@'8?V`Ҭ,-Cȴ;e|ڌi38F+ڌ-,h6͘6cڌi3F#cd12F#cd52᫑12F؊, 2F[W#cdu2֐12FޮJ=/c ;O2&| 2Fy^132F8-c'ڑ12FƎե12F#cdi #cd12F2v_$12Fڝ6v"cdJ2NF#d%c #cdk.mu2֐12Fؔ‘12F{RƉ?Q3S}e#cdl5d12m8#26ws cdd@#HMq3G f282F#cd12Nwx2vlnF#cd12F.9c 6<Ms%czd12F;Bƚ-2d\Wo812Frg5=2p->|4d12Fƾ8:dp2YƚdM FQ{L12FVP Spc&̓f]1|"?g%ߓ2 cd.c2'x'2N@ Y^8PihCޗ 2Fث2X)GHm=,c} ќА12F#c78F2CU$uk@+3Fd2rBY3eط'[ǻ2 > cd%c#c8W#c-C2*ó8W$L/R{eΎOky812FΔT{q#c('oV؞\xd12p.d12gR[ cdlGy12NSYt` 2֐q@}A12F#cdc]m#;E?&S#csjI #cdj-g>#c?XC82 cd52F؊=2Nty[W|l/!YsqQMYU/7x J2ygv2ܑl;d%cY!fL1mƴfLqҍffh366ضK1n3N0ͷƫ M12F26i[#c=#c; #2FA@9LMRAƎ12F;Sd< !cdA12F#cdlidߌX3;28摪#cdl]m2FyΜ #cd12vM+e0M\A]bYI12_?EKƚ;g~7ؙ#c;MĐ12F#cSdp֬?#cG8BD6 чNI#cX3OVtB#cd--i4;SƦ״12FƩ 2#cd= c+d12F/2֐125?812Fy֐12d;^ƚIOfΠ-*dele12vx12?#cd3~ '%d=#2F> '2#cd12F;Zfi12LJ)!2Fƶf1F󹌓mJw-2FAS12F82Ndlmd2֐125W8=#cߵq#cd6G12ݸ 125d12܁TE}+c#cd]#c="cddl7d@#cd!cdcd2*delu 12FƎz.2#cd0-E/Pv[*[7͗ZO:mټE\+gڌi3p wfNm64$^2mɶfLKڌM-{O e@#c (E832g$2812FƎy(2F.ޡgfy2abS#ccd12v?;2F#cd126J#cdj]#cd=.2F#cd]%c~12vs2@؇2NjWG#cd'4\KyE62F#c'ɞː12F(4'׹ޓ+2F#cd12F#cd12F{Q߂12F#cd12F#c#cd=%c #cd12F#cd2 c[12F#cdMXV#cOXC#cd$2F[w!cd'#cd12F#cdl{M8啱S{;\2Nu͑7d #cvodͤ2`3e@ m/812Fƾq!cdYh#2F#cdi6Fؿ2 cd3X[!c6XC2dbCd 12FIP#eǰO 2} cd12v=12FƮq#cd12F#cd@#cd12F2v჌12F82 cd(k#cdq;C 뉌12FzB[dln82F#cd12F#cd12FƑ%;@ 2B.>h|zhώVhsS(ɶKa=-2-b~{w*'fL1mƴfL1mƴfLی #cd&C8Y?e9^94#cd nECkmg@#cdۧEBl8́12F#cm{n&cV#cd12FƉwxd&ҹ#cdW|bd&@q2 cd12F#ce#cd12F;`sm5X12F#cd#cdqR=12Fld 2F#caB8A;Aض3d9!cd3PU!cdS@#ceDkS cdi29!c+d@Ș#cdk#cd%c {T ͺ|e􀌑126Ed1k5leLQdՄmBPZQ.vFJݒ[fL1i3͘6cwphfԚ{s`5VEȘ3Dj.S[#cd1BȘ6 @d12FƜːu n02F`s.CȘB5d12FƜː12fpGi>E2FȘsr2&M9C$0 kE!c3v+2F2 cd6hq12&_s^А12Fi6FȘs2FwdT'?dmk8a^2Yͻ2v`ː12f|-"c?Ș,"we̹|!cdLP;d12FƜ2fpy*_=.12x dlz<ٕs9Ph#cdS12򅌑1AmbG;FȘ̙EƜ2FؿJl12FnWRp.cU1 #cdX ǚeLO12&M126[e^12򅌑125NKS!cKe+2Vs^ϗ26xZBȘ [3me #cdwS!cKwU2򅌑1Ambӿ #c{Be+/_F]qEȘsBȘ2֐126X V2\F126!_?#tvj0GɘsBȘ':)j#c7XCƜ2FT%)Jpf|15Ӛ12򅌑1 h#cj0d@!cd́Ai. [Ɓ҂ۡs.#_S<Сy12s.#_8u_!OG)dwmG ڌ ~gfZ#5:T8Aq mА125dvbgĐ12fbW&_S2 ˘ѽ2f'_S/dcSŦC+jvp(1d90(4d!c-b5dfc`gĐ12А12vǷ1{eL@O1266a=q*ފX]ۡi 2F2FnŚB+jL5; 2F2FƮ͚$Red1;%1e)1d*u N-5S3Sb U82FS3Sb #c:򅌑12&(1򅌑1GB`BȘڄ|!cd j0J|!cdLmB12F5%F126!_#c#_S/d1A F/dM2FȘ2F& #cdLP3Pb #cj򅌑12&(1򅌑1 B BȘڄ|!cd jJ|!cdLmB12F5%F126!_'2F5%F12&MXOd jJ|!cdLP BȘ6a=12&(1򅌑1Amz"cdLP3Pb #cڄDȘf26OAA@AA  AA2&q!&js1(I`6>4~.I kNȘ "e|]!_wE%cBu'c2Gbɧ$LInIb Dluِeu˔xhϙ#|Ir*4HejǻZnI+^ʔ||޺m:=gjK$5mzUmfdR/ol9HZG u^IDXls:2FcWHe+VVaJS߸-gğɷ`TOgnxl<7%Zeyl۫>}"鬹ϏLOfuKQƦ\ުQc4ۮrƍ] uԊHhGk,y&gӦia_/]Z22v* ;67o>vX8&%b2~nZ *|˭W}G?URCdܶK?4'+ R^G꼰m6>2C&*TFo;}ݢ2\kgFf+ybLP4#cd%Y'? ~>e˻[n\u_jʱcowwi̟ xOzQ/\Ky+ܤɿr^Q׬&-ʝ:x/DҢ[ieo3_.}Wǎ#Dz<lڵt//9f9rCvJ*r^|r3*VYHћ+z[fmn:ZN}z(*_9S2>xj_W-TrVؙ+ Х9TGsXI{Hd(cuڂTþ}?e+R&C…+\ZB ;ҥ? :/xRsqOav-M7?Xz]c ?jj9Wc2֋4_S)pWD2K>都ei_ jՎ|+V yݺ_ߣG!oS7|b*%ϛY~crg:uJ.99/]6b6aFzS<il|/ v l\^?裢sy۽{w5Ä ?^?^-p2BuIVǍJoDeW2]v3ѡXZj˗/wސ!C#k5mTM4hP=B1cƼ3,~.\jU26~HeUl7|ō/װ 2~OM72&c:˸ODwz-ȩ[oq[W`$iT| ]y5A?Л(PΝ+XbVvZ+-zQ 7$E[Ҡ+M2{ҷ$niS:+7NjbłFڸ]Up/;%!Z9Go.EscܹF9˹\#sjJΝUW;wT3+2v]B"5kȯ& ƍcO4ILϟ?/-ZtÆ BPR}Y5E:Kd'lΜ91e, Ƣp,jl۶~e,qСVZ5jԨ`27#%eGd60ύ|P6ӭ T7|X1zХoKdy{Ga'iy"VtZ-ˑ`Go%< m-V98&c/j~ƕRLY^S;N)m}ފ72N_7=K7CO}.?GտdRƊ,6µg#6SASȇe7ʞ9zCٹ7 mabQw2:yME- \Iҋw%sRImsK:djn[}۪^ջ}_rxH;{sNix3fl|/']5ϖ-[ԔC)Җqu2RJ=\ 2vW;$}g7ZƲ?H?;vsNx.x)QK5/okֽ>mW הpC{ ugo+y=D| 2NS,~C)jlzKM,۝ ?q4~OX߾C]ONx44]a/T5s~2~|7jv_t=zIaEE~â*{OQCt=ɹ[bo;v>,NȦQ&o.m~F#Z![FX%ZO>dfdw M3=ztةSh;v,z} 9KFXDç`oV -ý|Dӑ|cSjNG#_VIh=zTvxC1DO&SݻwX'7G:v(=+ Yg>"}jQΜ9%K@Xm29r &IoM%eòȅ182e~@0'u&H dlHyꩧ|lٲPo1#%;"2Xb-J%#/fƟ1xܜ5Z Urz҇u'UZKFmUڡϪN^ּ}ʂ V89jC -}?v`?L&',6Ku۷o/}"3ׯ~Rq_zutOSƪI.aˉ\"dSeN2r)dpBM(? y1e,Np+>/DGSƊR۫qӔ#^իT'Y5wJp3j[xfXo6>j[̻<)zy/oWG먱)2/cU%vl|JQthdӡ{mOĻc);m| ͛8qo?_ϮO3/n!R'(jd A*;cm؄'R6@xmqO8d}%cGmž31]Dm(c!\!㌗GJjȶ]ZlTXϺu㥲N]Z`-Q,^/,ӡ t!cHcR2eo2EdwܬS o,S.u{hoѨ{Smu|6booΟ1ؚp!cHcO dl7w|T sÁۦm>2C&*TFo;}ݢ2\kgp-Ӳ?M:B9Fel/ l3ة۫Z /0b[A_ޜ﫵{~ dl5P >ϞCD5ug'eG%ґW@Ʃ,EX?fjl xކ|oxΉ!c:dTx2^4\t`'capYtךۊU?Us S^.L_y̼xOMy5A c #`{CVƞQ܆6yאY[n-XL;]?Vo{4h|PybI{cQ=1{wB[y-}U#UAyݱ߂Mn~ƕRLYl S}j%8[~mkM c?XNr";jKAyv3\=jo_z=~ ۹5j#?H^<.QK5/okֽ>mW!VԺcS7߬5iy4gG~2R[7nDz]P+/_^VLf.Pse,9^pfIWmr"_8k޲e˩Sm&|dJ#3?f͚X=G%KӠY54Sq=g8 OԐ}m~ibvvϵFZW\yڴiC=$$=djժ^z'4hPZgO?+:h-Sйec/ESm"iy-~&=sLycYT}aÆ5i$lzE,_~RJbVVVnNtڌ(cًdmڴ)2]6EҵFpv))";C d oF8N=/<]*$UB~ B2sQd,7Ƚ-ŋ?~|e~سg,S~B.˅AvoT?X'/}E$m̥V}:-[Z)K,޸q !e#SI=yH]~jQR{:j5a/Ү\*YqMܛB.j?x*5[q)2t>yǟL͖-ъ|<_ŋ-jԨj}efVV[ .\v{1cJSt+V,7chXADj(7N-ZTABzڵK+kRyI5Dv%f?c ֭[~>ZRZuӈU="]/ZKa9gl3v߁'ͷ KЛSNʈa=}tcϺ{`<|ADhS=W9-/zo>|o21e,.xktU~vUcD .œ\ ѦM>,UT&.]bl˕.zm׵z+-VnSlT{ꐓ_˸amnm 8ϫv&+^lW?'O|V y8<yA)ČTcw}3+VT:Zl߾gN9kBģGط;V͚5N^!Cz ,!͟?YzJ5m%KTlZBi_g,n' Jmo_ɦSBBX9I˩.|6Y(Ocܬ# B .TG)sŸS-_u1e,,gϞNv*{S}K%rc>!de4sB5˗O^?y^,w/Ç 7^?ca\'--yq=pBc[U s7{oBߛoWHc)27.Љ?,|^㿗*" oYyn98=/Wi+UW6}n~H8Men`yvDž.+y{YȽۅ˗ҧ ڻQnqx)f&i*neNMR{k֬Tv_YzuY~RUVUgˢW^kT'i8Խ.`;!e [0bz҇ȏ(m6hl'+*zR=A&C~ScƌaPdf,dgvK)'%lx e,^k6otUAyݱr}U2DΓJMS'Ԏo=},WΚs {&iʒ'}+QⶦM#E&.#Fm7iR_M*5lX,iҤ2^L/VHu-#uꃸ\ьӗY -el !II1^&۹5j#?H^<eD/l2Y._醼.[S }s-~~Κs;|҇eβ;2v:,$9);0)ˤ~`'y+e\W\`#˟U[ߵrC ZwrظG鍟]kFR_ϯJ^=Ek"cڵNrK8dqNe`!X7HRy?3$5GȘ6cwoNE8pd^ <~$9ɽeZ12&  8^Q c  l?C@AA(1AAA c  'c   2ִJ.D"H$DA[fJ(D"H$y4#$+6Ք$K3kQ$D"H$m1AAA2rIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/resonance/resonance.html000066400000000000000000000060441506652756400246460ustar00rootroot00000000000000 Yoshimi User Manual ~ Resonance

    Resonance

    Resonance window

    Yoshimi emulates resonance by varying the amplitude over a given frequency range with a graph of 256 evenly spaced reference points, irrespective of the note played. The horizontal centreline represents 0dB, so values above this are amplification, and those below are attenuation.

    Once enabled, there are two ways you can set up a resonance graph. You can either 'draw' it with the mouse pointer, or you can use one of the random buttons, then maybe redraw parts that you're not happy with.

    If drawing, you will see the frequency and amplitude of the point where the mouse is in the kHz and dB displays below the graph (slightly right of centre). You will almost certainly want to use one of the interpolations to get a smooth graph.

    • Enable Activates the resonance feature and its graph.
    • Prot. 1st (protect first) Ensures that the amplitude of the fundamental of a note doesn't get changed by the graph.
    • Max dB Sets the range of amplification/attenuation.
    • C.f. The center frequency of the resonance graph.
    • Oct. The number of octaves covered.
    • InterpPk S Interpolate peak levels for a smooth overall graph.
    • InterpPk L Interpolate peak levels for a linear slope between peaks.

    • kHz Indicates the frequency component of the mouse position in the graph. The scale of this control is set by the octave setting.
    • dB Indicates the amplitude component of the mouse position in the graph. The scale of this control is set by the Max. dB setting.

    • Clear Set the graph to a flat line, so no resonance.
    • Smooth This is not like smooth interpolation but can be used to progressively even out and reduce the amplitude of the graph.
    • Rnd1 Sets a coarse randomised graph.
    • Rnd2 Sets a more detailed randomised graph.
    • Rnd3 Sets a highly detailed randomised graph.
    If Resonance was called from PadSynth there will be an additional Apply button just above the Close one, as the wavetable has to be rebuilt.

    Next (Effects) To AddSynth
    To PadSynth

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/scale/000077500000000000000000000000001506652756400211115ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/scale/images/000077500000000000000000000000001506652756400223565ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/scale/images/pietro.png000066400000000000000000001371771506652756400244060ustar00rootroot00000000000000PNG  IHDR }ۄ{iCCPICC profile(}=H@_S*fq:EEkP! :~A$Qp-8XupqU?@\]]%1ݽ;kVInTRW+$2D1 u[,ܟcP-X a3xWʒJ|NS5sڴsug;._)YZUnzdpS[ށJj#A<9_3[m[2} ]jWi;{{6YX|9g˚5K";rcyȍx[j2,Éڂ}&FGD Kf(Wlr@G|b$.-ҋ;fɜyro%nܾ~`zkK=5Ɩ`ے᜶lTYNkMߪqiy?z@7KZUo{ǭ+g 0>վɗ)\ Lcg9O5.L2A8w ua5hpۺ:ą{ ݚ`ˢhx.W9GoeJu{zYz9lÚwHvk{} {˺~N0^Pzv{Ũ׌}W'_*oǃNlW[ $ir+R0#!eT+iA˰hJxz-w ֪/M,jXػr4u'ԪD>|?YIDE"{pݸYcE ز~-NĆ & L^bḤXl\0f *̱8}lKӚ$ۻl?l;l'7Npޮyud_ME<9wuپ^&U7FRO4*>`? .Â{=Ol3X+4wg!ar]sG5%YP&Y[. I׉ӻߚ3^q˟{͜E|wjV?ivk9^EkGɄ>q%zѧCgxfyre4MSltϻ׳[4%C~X \ywwwX3;xWA`o,؇jphPFSz\ZZIV3~\hgywwկEUDH.5ݽiӺ=TE7<0'Ab]Nt8|X \;-{n gy&X *}H ŋ'Mbv/TthAw n-ˆtmzVIy2qsIޥ~^>cl딷\:ĈtZJ̝={-,~޽zK߹}c;.m V攻O{5 ܺy٩#n9WqN[1Y|:]N>,bXUvFKAK_>ЇՠeoLxztݮwڂTJ{J_/DNFYAٺAyįqص4_2v1FZOMo*,Lbuo0bIТa%^bq5obLyblY0@A˕.d/uhQg9hkYɗ'7Q͇ՠe>%zݡAC~Mߑ> Vț;G7A.=vͪV,SM\O,WРn .toڗ$&uc;mXtt!}D聯:. =N( ׯթ{Z-\ 76˖ʔ(ث]&{.+/{Xzs3F&S (-H3&7ꯜܤNr6rn> .Ôa^?^eA? 4hРpk 7A 4=|5߮A 4hr>3]4hРA˜ /çG,Q 4h U=aѠA $\BP(lWP(T CJ BPzP( C B8PzHBP$R=wPX )Ա(=(=(ZJ ҃҃BAPzPzP(=( ӦQ2.Y^_OۡC'M٧JѴi4Ot'N *Cɓ']tP~}EqZ+'{ re^ 9e^ wz*{>H`0i$9,]TnסCEѬWW_/9oޫM>|tw?!Y\l}'$M_rcŊ?r-7w.ߵ &,^r|UU/o/&.JKzVZ721c-gV"X+#GEڳ Ʊ龋Ӵikj~v|zطik9aҥn1cQzPD*Wls lٲI9͟?5٬Y*V骫*Tȑ#} 8p`h%ygeX-EdF m;&:J!KMxgN2fs˖gN_"J8^0NR4i|`T{)[+Ò9 ȑ#)ڶm{0 :'=:t+|&رc%k$}ǎKSa&ټ\BL :}&޽'"𱉉9sn!O`a@̚|۷?izh׮-H";w.W{?mƗ;Vږ-[$9K۵kWX*ymֳgO95j$ؿ?Ys#GPxN!M6`Ĉr {OvlFLɧEGE߬fY;YXY!1l{;eҞ='$2w) sZ帪n*ҡN+U/ 4YG{j_dz̊GJACܹv;ItҥhѢė-[qtӰ\Fz0`yFT1Fb0C*z T$T\}ɣk'zy8{?V` ]X\\3tgdNйgz}|-_uݺcbgԠ|svta_wtM>N 9s+vW,XJ%˔))S&*Uj„ ޷/YKϘ1ÁɸS=%o/пI裏Y/O>$vʕ7n@ x Ip;#6Io2[w ;1ui6 J2a=z|Teؼٞ=?!< aϜ_u/rVƿʖ\bg:%C*Zx`4EmH9ݷ8cSQz/_n7ѣIkvݒQFp)s̤1k`SҦMkЃ;Cì> !TXy}n#=0> իi~lj|&JH,yiخFINrZ0 J2[K_O2_Kze"b k 6,wu$֭[gٲe*hbki͚5!; W}Gxk~?Qg2}$7 2|AO-8-1vQorm31e"mgI(+d>?251 'dӛXf=~\"`t6zXxlْ̤C2n5mҼ ɎDbK|ikuyrj޴mC8f]&]\q [ vY3gRhzC"!ӃU5 Cw ɩTy4Zkoz,w{'VzPzPz` U? Ipmvl4Qb]\b0 B2?IhCD 6Ƥ[GV1cFJrNV.9˸ =$@襑I >8#=c vḀ;|[R$a7M%e襏kjz>4x2 [67=p;R%JȾӧ;{pq+=(=$@}V4{E[ж/+Vh ^E'Y&s3 cJD=qCW/ALbCbĥ7E`K/.dV*Y"ln=b"Vba 4 OpU믏 kr%%qlL`QzHz"E@LChmٮ,1F:z˅ )7"zdVzK21˓&Lx̟LB @F/=HŲ<Zg"O!Yot&_˪$%IM8<\܈A![Db.& %$mJlQ =$y+zgQ|r6u".pC'_z0T2 #Ah^"+T LMO=C[U(ryLs,so6>dɒV~dexk?!M2C|ABkw_vWmId@fTzPzHx=@8r c?)* ]ˤwߕSL#PM+j2֮]k-ZdDžDuqi0<%_ /I(+X=z(J,ɬ͚5{7|<2ƚ+Z|jC[ᠪJJTc>[_b$1xTtTJw wnӃrH~mmhF@=z +_񊁗Plŋ 駟BzZjE/aͩSJޫW/gƇ~8Q*&5a֕ʢRC6oPO (p%#'d$y!MXjF=YsP=P7Yz6z`~7sL-'Z ֭[.\XЃ,ozJ{=g̠yٳgiH`㣄y1U^!CP1E<SLsp5Cx?N/d8HI(< ;&g_J ?MXDnLGQ_Gȗ bb41γ$BYbuf gK 0pƁ=JB JZF:+5{yK]a'p;ѻZJMr:ez GhѢh\~m8%~5>=Axa /bb=1d3~Mn #k5RC骫AW|!%]`4H*1h o(¥u&2'w+k֬qB0iEQ~!F,0@^~zAFO!QcU0?)\-aqpz`Q `52YilxE-q)#V*T9`g}MIӆ5|p JQL z`н{tX˛]ذd@o810A V4b,%֖"@b8bXN?SL#jvډNf&"C_|qӧ3}҃qӤ#(KQMİP'=%,NV Ka, 1Hxb쏝& ,O?MalٲZG)0<}iKꫯ86>2ydN9ԥ l ,ظq\B.Rj$@tXìwrt͚0p*W#m5pRj u_S\Ν; [*,lTR&'|7*vJG1G_JLƍ}C[ ; [m¥_~*޽{#C+2ܹs7z 3nb@$uUEd8@&sܹA?~QnYeM?<m3ڣ[Kyq2~̓"Z9p/N&={xu8B|4Ѓ(HLDܡC5 tQ(dHb{HK Ks'j9Žhz[/m|=-,˾}c]\.UL֜;u:S/F4fDd-NjD3u4N`t"!hFLvjIՈNԬ!D41QfT#i[u&QH1Af$׋Q({#K6%VL)~MYHO TF5ɮI>E8gY>(J ҃BAPzP(=(J ҃BAPzP(=(J ҃BAPzP(=(1j~EXRpBP(R4B_ Br zBPAAP( BAAP(EE/6(-[&1M6%f͚ E2šCpcxҶmԮ 7MLz*=-[VAP$/,Xj*?4s+Nҗc'll\R {^P)˖iР-zِ٧.?uTozhݺuΜ9tΝwoĔ+W*UԆ 1ݻw7)Ӿ}gNl>bĻs[>C2ڵK̲e/J̮]O)=CÆ >l2e4nh۶-cZ!mڴUTɜ937p+Wɼybb.Tŋٳg޼y9- EBP;fb6o>qZ8˥53ȎtTҴhe dص/vz`Oz=ͥbb/ Io)+9sޮÇ7v2ɟ7bWz8@ `.eϞ]O[A&'NّsH6,/( EhxWr݌!>}>( pp+ҿ#R?rܾ&O!>}>Qմ:=ôiӤӟ0a… 9 H聱?s2d3]ƃc=(c͚G|`)]E/-ӅU-$T!*ߊ|QӬY)=\F( P>^aʔ)Bcƌ1bDC-P%KDѥKի#}Q݃B翺j [XA|bҝ:RܹͥST<+Tn%+JO%tH`ڵkݻ;tꫯ&78 8PAP 9rn}„c#)ej..Mr9r䨤dՓӸאV(1c޹f@)c?iސKEƲƍqc2d6ii%YoqXD¿*=( "Fj(=( ҃҃BP(=@) 25 BGyD!҃GP(CAAP( ҃҃҃BH.%x UzP(JhPŃӁ EUz VPҧ~2jҾN CЃ`SEMc1ǧ},ɥh/"ϟ?4*#|L"⽣nݺӧO믵S(=ӈR/=\{-[~8X?mz!_$9=_3,([,ɠ.%1/\|Ξ={ܸq1߷o} gzRz|7~{{Ɛ2~dD6tܙdtɫm/裏Z#y]w{ァݟ"O>eɒAjŊIIz'9HwXdRxn۶m^K?ȑ#qS/3b%k֩SL2=?$M̙'߲ew3s7|k׮;nW_ >M3%N4jɓa$.<=3.f{zԩSrn9~{zqꪫ)^OR}G8t| 矿 9tz.>OPzpCܜ9sx 2,[Nu@F?^F IsNgz駟6mZz m:uozȃ @g͚oBxGijHäKt@Pn߾xΝ;|y &M /lݺYf.DϜ93t.r9r-ZTB@/7?C|aO|;.畭\rϟ/7 6$f~;10~2҃zٳ'+d2xj5޽{eHYŋ0j(NmlKHz_~D"ߐS~:ڧpywm3 > .X- #@eI4j  (!p<~xZLIpW^1Ba6hЀr- \d U3ܴXtC? UVOPC!o޼UV[y笑|-ظq#`&|aǎ#E/c$1zp(OzpH:̇B!p~p֘R11N7=z4/R*w t*6zسg7=8'=K/X~"d?Tpz?\L=*d($M6wY.zDͪ@ᒵ[)vشi;nʍpzK.Ѳ ,MfG>K" m咙ɓͳwd KovĄKj7=ũ!jFD=eH6蘌r\}7KeK*5ߍ=rD~"M}˒bO>*Lh)ܫk׮$i5lp֞+VuX\Sօ6z`,yVgs=HWn][oqڢE ѩ]*/ڵk8BHiF=K.-eKFzmGLXG# O2CP [YRJ^ت&JcȐ!(QŶ8zRN B2G~@l,MjGe\8IJ\xKw%_|\r5kcʸ\rB qt$[lL;=[n-s… sI& 4@ dك^Lƍcě Fa߿?9ڵ㪕xi7ody"M2m۶0_ Cpw8}ΝE-]v^z|g͚uر-2v6!tf^bqnRɒ%9| ̍R$eCZ`…&٣>*~aN/_s*P(= 6̧իW3<'H3(q$ rѣG;Ø1cN8Ӄ<:tH3qDlC`VP( aʔ)V݃. =xŊwy{5>gըc2/P=ԬYc^=QI*>-l=( +b|=tӈzzCq@o޷oߦMAV:4 AVݺuE"Bi̙yȑ#mʕ .)UTP(\{/}Ѐuݻ;t%!߼ysJxs e˖?~e,jbm3=ӧr§SJ2uM7InD)m@$;B,jFhBPzPzP( BPzP( E BaLW( "y^KBP$C(=( BAP(J BPzP( ҃"jK%~)A EaǎHXΑ#ox1i~y-_ٱl80x믿'شii?`yܸq&_ b4?=c7Ak୷La,?of%H@׍Q&ŋCR/PzpΛ7./رriZ #$ɗRd榍g}'&C q@xa/lh9Ҕu~H? *!^;O{JJQMe51%l `}ɒ%7|3!!CXXR5m|Y=[_)܃gEKϼaÆέ.yT"DK&68{`h 2}Gg9OBitm!SH.}HQ]^{+Vį<&8[epׯUց lR$87=/O@zˈS|:uDeH$|ɟ~zM% 뀍e ЦW^y[8h0/o]a_Gci[q (grk~T97UV B>I"M0U,XpFёֹsgNǎp ^wGopF :CPSsTb<?8< M4^غu+Q\RH}q8wTtDŕ86E<%g*㐊"̡ ߮N: L<' fСA=ߧIU5jԐٳV\iꦒUuZ<'l Ц\i[}Yu]׳@6miz2-ܒ3gN[Alb4h| m*}) ==?eꊌ}>]ww<}@ iIL6Y05W< l2F]t4HyY緶A'=,^Gq,*1H>{U3`Szx6H XI*C:Wv#q!)e&ѣİ`m_Gci۰tREo6l7n>}:g{G[# }=4QzxgP3̼̑q&czd܁׌/  *,SIֿP(#` 1Y8TZ5`ֶ^;8\ 70-!9s={*$E Tr$2e7aChSrSO=eo@?|06К ӦM# 2 Zƌwd0˱yÞ={<>;.bUGC>7ߘ̅m_vkt"L}vOY,0 E56 Xgu<6 QPc-cXvI|HÂ@_?miӦƃb޸$A!`r+66+3ڵk)SmƆBGҸgfn3X>ƶI>Q>onAGL>}0_>@g1or;?qRz:$Ou rv@f6 @ܙkPg݃%R@֏D/sP~ڬX]JGN`i.ckf?{Z ?y.(E21+OXhnK*Xpӹ iF \r~k'ESh  Br %=B$ e7_ÆLVjXeK>1Z`f@z@yn+׬Y b۶m]Y#齓@5^z`6+ kl /fC,97ްf>ڹ0ϥԒy:6Eу5sPM;v."FdtAу|~jKtjpeyU$ulϯaC&M2S@.'CkTj(A{;#BY;D>Ϝm9.Y/5J ּ%oz@B XJ5,G #= a|FňUq<6ECl甭16lPȚW!O[A&T>}eCw&wU+VꋔvJ ,lu~k[\f$fEA>?ώ[J*.4^L[I^6J6dz`%+:!%Dn~J_,؏Zo9 "D(^z/ XoJWX nf\#&jٲ%XɁlfQ?xfɛxg]ga(wu? c.f\2s~fLcӬ,bu3[ޭ2A7y: F Lҳ Dga lQx5鋝{CyH_Sh"7+J:Wgt!Rz7J{͚>'Cn_F5mR"ϽJ Bj zB z+ G) ҃BP( BP(HOP(tEBP$[8ï BHHكBP(R BP( BP(=( "5߂Yv(D[xPI=dȐˇ[Ϸc`n#%CK'8:Lj"zj۶- W:pOzNi~[ $x=Ԯ]H jK{4B 4"m ҥK%]tVYVҥKsLKǹ1,XS:͛٘cz2sW2e7nLL[f4vXk͜F;KIeˆfr@z Ors-ZX!ySf͚Qz=̚5=HE4x͙3G7l%a*Ђ 8Ț5+?EMlW Ej#ln6mZ2|KsD1c-K嘮_(]vr;زep rzAI! {ܹs}ց%8@shM6VztSN16oMǏZ;]?LlA9@TqခTNQЁ4 6ҒիWs!L,VX!C.H3fdBiDW:$!Fzp/_A3S[޺uzaY4h@^'FuJ1Foz`L DL]q+=HդNyw^=(RU-hn<8H;2$7kx:{#479}M&7CYUhcuΝ;9%z0D%d+=y (P@gTD"FܹQU: c:Y$BIPAW.!z9Ȝ> a]zuJ0mXtʖ-+jD^Wf*mHSLA:*)?z e0`i}v荩< [ݺuyy=$.= )k%ĝHT_TǨjZsi mItЁakCi^Ķ"\ԧO>r8uԘE̠ɓcɨh6h@Eȩ`QF+l¥O:JըḴ|v EqM7Y&pYZiYl EqRPzPzH6){P+V O>Yz%.Tb8G$<"jOTӧQηٲ]L)V>}>ڿ5M I!vN%~HZEN4HN_<4_~qM̟t_~{/db^z/߰f9[YC>Lٲ?In gωK ^ZꅘKOH̵spу(Eуx}wL4\&M6)JlQ\>)spKC C…q}eMDz`?"Jaǎs4Ϙ?j~04ж{޴s ;Ĕ)SKZQGM4Ac-ӧ~JL`CZ#!11 }%ĵaVΜ9|"N#Ł7= ?t+W$ٳ~ECK?ov=m63䌕J8/ЉĴkyAk"S8=%=m-^P#Z'">Qq5?x31/>?J'. ˙U{I0M6 1h)A}EC_H~M?.Mr:9;|U/=kkr0r令̕lj͚HZ)|@gg6O6{au֬Yϝ;k?dEȜ93^99rR3=M`p[)mpRNYilp"zi=(7n[9~x ~i_uk$y>?[VFM4xٓߞ}gyEIIEyt˅޶]Rfg9K53ӎKJIrw5eںu+1( \&XTy㏛咿'iH">eK[,('8j Gczi^b ^K&{̩/*u^n҃(E+B;=񫭑19Fի{$ ȭ[6B' … ?g},s9XDu9rDn੧BަMvYQ%\ʜtU`"{DѢH|?JdŊh#:g]=H =hRDiΰ ]1Q[K0 sW6mJK#)^}k+=0Q Q4`tK*j*[)&B?=7P٪F\rԺԛ<сP}wv2a?K(()ҥJe˳lKzY/{.\ϓO ;=hRV"ɶaUoߏMu,kn~$DԕWo]ZlU(=(jU z+ ҃BPzJPzPzP(=(=(JJ ҃҃BAAh0ӍsP잲ޯvUVݷo*AtSʕ+^j†Oiv<~YٳcomwlO孹ʞj={6qCMCS(=DHvrgĀcΚ5J*dk.c c{njSB;}OzfX/[`{5 {'Nq;ab`|:ʃQʆQ&Lce8^!+"M_xQaKge Nn/bInƤ <onW^y? ( > ˔)c3m0w\rؿ>}լlq|2D% 1ZdcJAG+ID?8ڵk黭C (q@%z/V 1Gu:Opkx!EЃ{jm\HҧOo#'%fY5r:u_~mr~6n܈P$uLzQ$HTp`jY_3grS:}1҃B!jݻe$~I)M6M{ɘ7fNu̙?NC%7änmuӎ;($sN]AǧTz҃B! ҝ 2HbYN89rf++Ch'SL!%n2Obz-3 VXA 9!Ѓ7(=(l29su0u'7(=(tt`-b[,=bIR69=)w&smee˖,e ,;wng ܽ{w,^M kgCӦMыQ٩3ΗI|8KcT f:Ûi&Vȑ ф ̌ٯGX*[~fVR(dc!CT8>\rӃsW(=V" [qCR  BwMkKT(=(JJ "X TzP(=(#@)TA҃B״BA+BA!!k{QJآbD09Wtiy.``=gU\yMmn\;?†z v˗G#giU? HXc4<^_m"s,G"B\V{[doN!bl 4c3 O"njSB`sRgΏt;" 4X`6V1i CwVcVzˁ8,s4a)҃3=JJSNY Y3-ul$ HA+xkB=Gw[r|'X+Zb͂B2e0}Q+X0afbR gzXj3M!l1zjʄKboC !{!<*dF㫇yG}p ؁ag,EJκ[ la ϸ Sa\::8rڵ+ 0D~Kނ{.Ɂv׻wLq`Dd̄vL#7k܂kac>Mv᠅aT!Q~[?/D ҙ3glwhт`́jժ"K)VCoW@% p"E`h)/)Kz@=ټycӱc"o ,@ _[/_>zh8A-.&il7%߁C8#\4{vUh2};/ ,Pc(|NNPM7ق1bJ#f붬K!B}`m$K!ôiӬr!9,2p)[lF=ғ*M$==~ {wM[/95X.{Ҁ100FѣG}~5騝Yug eaOR=%L\]nݑ#G v*0TqB~)CP{nPPYaL lbO&h-_V1)[qe0<*P}״^z/|c4*nBfi2[Ѕ#lY)`f4M6eBx5j iߨ{e|ޕR(=En'ȅl%6o X$2=0o034cHUX聅,^bd"%c pYªzR( gW_MYjՀ!1:f@ۦ.ԝab!Sc :72d{Z?z`:B!(zpS탥BRV'"k VJϛ7Yz@rX:}Y5U⮻Pe+5eΤ[JjU6 BAPzZP(=(=( ҃BPzP(JQ ԉ9#+Q_!_H`[ ئRzP(=$1=Pd,c[4cCrOx=L^/bGf |z}i\aP!zz P%5V^tKizh׮uy,̲{⌮3C IBL?CF͢x} ^j`=P ^R!su/4`u „x*tCҎ=A:@I)k`V"Ɉ:.iը.1o'}Q(=D؅Lp< ڴi'.Bpbn0{\ p*x94Ĺi1&>;}VXn?ر#Vϰ܉ |v>8 }@A} ȑ#W0#< B~qiÆJ:OػD2{=H˲ZT(=$=ORxPh}EA91AtƔ,~7?sz.#Xc;3qۏA<^2PH2PꁺtBߊ!~ 'zw@|P_9v"A҆N}C(xBE^vc.-[dkS1|73_FJIFo6gϞqӧ3ZR5ě w^׷z%=s!/8p@s١9f*t Rtg>KW8=΁1m)B*8%W0C8pޗZK}cUU/o7Tr1]fؠAl]?MD/~9\ 4̀DJ[؊(.˺M$R&${ i*uں):ԩSߺ.p __#3'l;Ģ~Q:lCBU0rgƒH牡d(xzw@|P_# =8CiSQ )(5="LA!z-N 5[JaΜ9,:IPzP(J CSzP(=()ezOAPD)= [?ԥ˧YJ֚5۸?{$9],5K͚ݷ҃BAH VҦe/UAL'֮qFѼYs={ۿx:G,m'҃BAHN`ɮ7c^i׮1Sgpiƌ҆ 'MM[1yu/uśp37r b8"zAaCINiJ?AӦ_ɥ5c z}ޓ͚}5w) _ uNA\skX5{w`7?0u`I :g/ykLmb Xʈd^ʆ V" A)B83۷cf )W'?Ŷȴsz[…ܺu+=(R&=L0nCL֞sis!`|c)%760Eces9 R6Qd)V$=XaMqp10a{oKC3Gbfٲ]DI`9rh Q0eaJ&M0I$3t֞ڸ65}7 n{,n-sR'>Z[+j.qVmII ڝw__vmfC:K9Yެ" 6o.\`۳sErTd8؆$=|) F9[+4_ǁ:&ĻEzӫW/J^ŋmڴ?3;'Nf:ed,rc1,meݻwobׯolN/ZY.dI`vZy)3!Xl? [+3gZ=~sY&hHJz@W_}5>>M#GecˆuGJ3X}J y'8~НZ؄OUdbRx bB:=q55PzP( xPO_)҃BAHbzpF]*҃B[˥PzP(R;=ۦPzP(R/=q҃BA.z`ٴiӰjQ(HuRzP(=(QACeΎ:q@*=(VSNū3qJ.q:O #H6 ٧70bcgjժs'YŹyb^, }>cs̙3AuRح[ `f,Oj-|/x~`R ӡcY bرc1PJV_ t&5TG(q[ņ l!ᵖhpKB!n~*A<0z/ZE9 \ LxPCj['JNErkCgί_jժ=WNUTɚfʕdg|0רQ# _OK|"R{'oް^5lT(=$3ѷ~t7n>}:dC~m[DI6l0߅&M 뭷҃'Fԙh4\.]f@>2]TT(=D-[V,og6!u(m0yd'<^sI0 ]H(|>a1CÇ{TPDPkB !!F5\ICDwMkg&Nj/6WNj+awi{;!uA="QΝ"ꫯ<TG("O;i ^.B!N;_|=/UԪUEd*+SsrVP!x|mSk1 a$v҃#R0=G" >]pY'JjUm#8z5)F ҃BXdm BAAP(=(=( ҃BPzP(J ҃҃B^)ٵ?uTcgt.~ٳ-lG.U۷/<.Y}{QoXU̼c6/Ξ=qboܶ7bSt%zpʕW^m5 )D z`?# 4xҥRb-kBXf?qxaƎ;k֬*U]|߿6LLeƌR脝jYcVzs{L*T@;zoPzj& DSNѯ 4oZf͚ء4't2ex0H'7cWO,iLhp2';F;j5k̝;`-bBlKݸ鈃R> Jc`#wS(=E6C zcҔG%frOkժŔsft@Tn]L{.רQ#Xl/joB!(z(ޙhzҧOO$_7Hc3c 7Iԅa>xr6ll';3?gFkݡC7X[o9AEz=LT!q!fPzHtz۷c z=z0Wj`]J$+g8dFpduI:b bP Yt9gz\%%F5C›B!иqc2)Ӧ [cX31N\>ٟ~i♆ə֘o,4☕Nx4eF6o)7C\zw={D)ͳ- E ՀHǝOvy+W.K,}#NPHeXw6n !DfzxWl*įg˸fP uFVanٰaȺB\9 . 2kF]dGBzޟcǎa3sL3akž&i'eYlkPz6C P1iӦXV5j0ިlc`sTq[v״K2Z7",围"\hD5OвeKR$WlΝ;7 P6mwS(=kڹ(Щҳ˗.TRV = {H2SVZ@ҥ U2a9kF.}3'7+x-:bQɄy*7Q -Μfs)wS(=ED[ تP(=(J ҃BPzP(J ҃҃BAPzPzP(=(JJ BAA %Vʗ/wvjBO#l#<;dŦ6˫uEáCҥ/Mjr }YK9LV7 [ :p`%̰_L2̚zm_lA+N<zI"<':}b6lxT{Or7mewKK1mNp>r`s2vJHTJ O>wEd…|l/^K4Iu]0uH";uD.Zsݶ$RK#FPq{ Uì)mQ{}1*vZrP`*Gu]н;Vύ7ʕ$fٲ?Dhuww~}3gx Qx-r\~l9gw,5;o߉> UM ZjVg Bs[0իWH z`hOݼ̙ "E~o5v_oX_80'caxu\ӻwʕ+{'Gu]vz|ɒ`9X1VĔ=~%VYhno%dDFpɪV{0!gH,98qB6nesLBŭ'QwM6==uEaڴXtڴTi96o>ɠުrܱ=M7ŪZRrTG|vdKY=%aΜS遙4˖ yz͚5t{SIpꫯ;=t;8=iE'eNhEDpɚCgչgz}|-_ezqݺBO?4mIO{977n^{@īϔA+NU7?k9@KzE/i9fbQ]O|%5gKtp&[Z %w 7h |mILThР+=곈u;1YʎEu]F5|^յ(*/ׯ_߶ch6{ ;9Y$W9x}^lѢEd NIߙ2Yw7$kOm/~9!J Eу_ci˖_bU=4d4&s.kǎ};oXK֮vN$’҃BA.z0vdkwk4Osiƌ҆ ' s6x-,)=(O^]lѤ .L9- <YZXRzP(=(EV.)9Ō4m\Y{1Ƞ-,)=(d˟qF>YM%~ƍL-,)=(=` (^ҥѫW/e[wyٳgJeUY=tUVemE@ֳgO\ a'ǘ 0܅ Vko1Ble#=^D)VAIhK0U%cr*T8'֖Ep K᥇|ж4x|(VBشsxطK.5W5kV2fj$}7ۧ6!? mB'cΚ5J*<}׮]>J@[lYeZB|wݚ/loߞ>O0x` Ovc Xf]ɚNY'$9<NbfРAx Xo(1q1w\eB3jo5`&J=yV t  n¶wͦ$nC !1'vZa*S%- m2n pEqϟOdDid8&(z]Kྗ2s}k?cǎRcVb-[H|x|Dh ӊJxw)tr)ݰG{~u?.`RJG\[_NO5TF HjRB֯_jժeɒc1)\MO\tp(tҤIIyho`b-XjuNXƅ1 *} wܹsޏ@B@vp3g΄ht:-8 h=йsgcŋ[sOs{,PСV=[^rH䇑ud;~ b-\PNԷ~7"BLXS;FѣG/PzJtSO͟?jnX'ٲ,`|,37œ .X;QVBa+z@V,5lm*.ch}+޽[LܔYgJFμd8Ȼںc .ى0z n"$ DK'e6ȔGZO0Pz=4nɝ |_~uNxx:ht˽Ovp) C<5Qy89wS(=@G[[cXp3%]ʏT%lƈdD-Tp\)mTm69-WUg+%`oP 8[w:o;@sEPU~&H6{97?B!Xzv1amP%:w>94(tuMMd)4z<,!a [d~;buf$8|)4K ZO=+4pamUpAVO>QXM/,?e[ȆRˬ!`~7EᾈWwqZm6VPv2b7U0o8F 6ZL!GZ7YmĮi|b61}CRŋU\߲rBwνŊ3&@†2&,hc34 vx(ɎRӱisMJ"ЏSB@FE)ݻ70m6e+")8muRTNٱIV?g K!' pl_zuߜv~˷VD`2~FIqGp  Ŧp‹pK[,)]f{߾}Z $%=Q_GpKtظT 0A[#FHz> +[{aP7JT춵f[5[!_6o7oHz`t8q?Cm.aq0S`KJ*\&kM&du1%Q%ֹcĂ 1O0'.)SKn>ܹsmnF mۖK'S :#" u,IבJFք;l^\l ]+.sl i&=he&ĺX詉A'N_]&'xgp(Yn16몌 ai3=I 8Ӄ#" A* Cb_V"q:6ڌ9q[\ [WeUdZ D)=` G K'{!3|cAZ;zt@Tn]V{.هht\0Ô#\mٙIuXTڈd0@CXs 8^Q LLVT.Z D)=0÷A#Gȋ]c%츭FlZK"Z ycׁ~p3=8?BCI3zCEVÆ ʠM J~5-ۍ d:U"X-{tN3`ECXby??0r1[|DVAA1i+'K-;.*otxo tGOEUP`2Hϝ;L] n>BgJF5lQ 9Q #Gje&иqc֤zǏw##>? l 86˄8f3~x>xmcʨ][yDVIl.zFAXQ-֧DC\r7fx%ʺ,U֛#ZQʕ+'k eE)} >#"E><+m.QF}Z D)=`xz#,blLo֭?aA:3VN/\(ɬ:ŀW>l nxeƂ=E\e-/<H`S ݼG|kE<YK,̳{ꩧXt -ZwVY*qn vP&#ݲrɾsдiS_5j0}lYJ'b(wI:]?[emq?B==%*Ibg]EW)N!0ѠAm;cb3X`2݌ ?SD&%Oǣ0ÀN>[ 0Ik36zp, !-QfzxugԩSƘ'6*2fhb̝;7L>jKV| ={ѢE}tMl(DC~wL nyپ}bnA=zk㾍3 i':f!m., t!DC[ PY7&X<=pubkWV;=L, ҃V9L%{ڡC\,{cǎf9`;<с݋QeLT!ACe"9E[N;w2A ò"mO7sY`aPN۝a#TU1(HZgjZWXP~}&CN>[O2SΝG:Szك"Cƍ-dcZǺrʔ?eyϷqϧpc.(KZtWM֭[ٶm+WΦzY: Qd }oR, XUN!W^!}˞Ŝ?^b:vHÇ[fΜi#g qK]/\(ya@h)\0rYJrJI@-1c|՛Y H~8^x ޽;+Vlrݻ7ԯ_0btn״gQ(=K l (ǏX4`tl.UԪUlqiOϟQ|ܹ 7W>5_|Oza@CϢPzJjU[JJ mJ BAPzP(%* ҃BPzP(y4imnzٽR?oީrp5 !kOLXCfN!d%nݚ6x`rl㏩FPD=T]yŊlu|[7={~Ҿk4]|J> nWz^okN$o $˟v>'8p<,YiSz4=߿jO>aaѢEm]p!e[@ ECƌFt-c≣?~jX iKb&Nj'ge^:|X_ԧGUMlV^ЪU+*_ּ$Džf"J聩M2%Z vxx_Ld#kgz-[)=$==TVnC[zVSEri.7lL/]ȯDs瞚:YU.9#$1oޫ%J'C3,_~I/sJEǎ=gj5U$zK<_ԥr2ihsV11:b{fk4YkNG#-^< ^dجY'[̙OH 0ڲrp|~ɣk)ѼYs={[ۿ8&a5; M6]+=(߃B,z+88K"Sgpiƌ׭7l&NMu-[E4v;q)=(dITy <28V{ŗ2L2=m}OV]J E#X ^b\J~4MK5k@'5 ~0hJ "Y҃S2SŹ=>%4iUr?qiIp$ӎΝ?[n /r=PzP(%=-Q<`M&w@,aʝwu/qydv$o8ȑJ BwM'iBAPzЖPzP(J ҃҃BAPzPzP(=(JJ BAAP(=(=(R*R=q5҃BpE!-9!RzP(=(IL.Ѓo.҃BAHSAPvzHJ "CG(=(袇;w֪U+C M[5jT 2etuו(Qb̙~.v{p(҃BA ztBA:z5kwrkCr+ʕ+Gѣu״BA]jsIPzP C$ABwM+ 5PzP(=?bYjTCP$zD.}\Q ҃BkR@j(d0{HvЖPzP(J ҃҃BAPzPzP(=(JJ BAAP(=(=(R*JJ ҃҃BAAPzPzP(=(=(JJ ҃B҃BP(=(JJ BAAP(=(=( ҃BPzP(J ҃҃BAAPzPzP(=(=(JJ ҃҃B! hjm M BQ(zA[}=P$lzW DnP$;كB+=(J ҃BP(=(J ҃BP(= "*wl4iaRw_Yz4D2(=hNUZ!5=!A!1fZ$ȗWzHMcOhdPz:j҃6- J=$ZqŕWCmqZ}K]s yr5$_^A!E!G! Yõ{|XxnG=|[rWL!ش.or*9|>(O`t={NvÇ-[\h yVChc Dj?G7xcُ9"GC JL8`s&ƍKUW]ud:{|複BU*[c Ukk.z*m&,RȓO>>}B!6pz{=+VlܹrZLŋL7oΐ!Æ 8Қa͒%K %C82j8z 7 Ȝ75Wh|ߺ~Y ˷h6rέJ5!sk2dW[oi2|H3̑9_4esk<9n0ho>vr֒|X4`j;n.ݰYmjU'wݺuqӶm"ʕ޽;'O.QDѢE^:ti 6m5k֫WcL4pԩ(mc5ovCiӥ.cF{ȋ҄,Z>OdШQ#K*űPVZ{NHluS<[6STSCbƍsEc3bC2!ڵG޽:sNknL25lpذaTl¥WP$(TG}Y(=>cWԞc.׼v]0+26m2nj]d D7!ji0-^2)w*reg&CiG#l'Z|:80z3fL%whe7.GPd.]Z.oCʕmfNsKy} )H|wc;1g%.foéz.peD@HTi.!E(15 jSZ4hcqΔ8%X%m;& kcqڿMFU1dvfq#j?MڍYٳg34HY mhI@X|["ŲN,HUIg9ֹ#c%kJ֏^.5 )1T`Ee+v Kj%CXCe4%Iy".ӤEJI!vjl 9f*$=VS,=LwwնPDk} ZoJJZ*=(=մ=_C$҃T[YHéJ+=$5t#"*O!!XpJJ EؚVcEjJ ҃BP$( HfP$_h5Vʟ( f( ٞPAP()[ЪP(JJ BPzP( ҃BP(R=,]C҆-[Fg2e F̍e5)蛞?_C(d{_ѐ!jiRaH_m/|9.DVێ>|;+=zӧ#m&*=(z8:{vn.Z4c WM#S*ŋO%f֬MG "F}ٳ\*K, 4Xjê^vW>z׆ ֶm>N_Q!S[h'Okꫯʛ7W֍TzHe„|ٲ :E=͚Ք횫:rJ޽{ kˬ^x~Xn̕+W~=L42\qʕlӦIvTVknTzHp`t Vʆ* nٲ-ԺtiFy11+MM!!C2eʔ,Yo-[)7|Իxg#|OD@|~[I'31\%A6Ï?=˩ˠBXdzƌ7Oݽ?:u*=Lz֠4ԴW^tݓ&=_' poٯN.5T(Rdv߾ۗ RlY%_w#B`5_?|LCo5w,ӌ^c:iJrPD %BGk߾5Z#Oݏ?9s;̙3gڴiӥK-[6Rߺ|~|ʕYfp]mڴӪU\yƎ; 1|_0p@)W\߾}\`޲-<"`Bm69(Ü9wUR>CW]@<u7/٬Yl2\}b \]tz&3g?_֬o5s"My8ГWfaŝZnSa&[8\GOϛO5nJiJN:폯ZL}.w/]9KW]tML =Xt֭+1^{5аa XB|7^===,X0 au]~[6E&WLh2՚5on׮\Zܹspc{ШQʹi$CDi9q}@zQĴZuw/:Th+xd3{ҽq2:wҥ#M,YlقJM;5gďe`f#oM!p 7ԨQc„ e˖ zku{_7ϟ}ڵ:9]x +Ԏw9CjNLd~ :ހeX `…rnݪIt EWS=΀9fkb :uCaĉ^'GrC ͌SEO͛'iFm+i4mziCrɃJV@!iΘaͶhhڼJI|wΜ.6LNo*P@! UԄŋnz)}>xֵ9cƌ#GiR%F5cߑN}N^>uxJ&?L]vOtM V 7T,(z/dM0p`WчL22`O,~Pppcέ}`fh>q5[(±9s2I C3gۈ$7Z)SΝ.̉W>ڷoCȝ;w;}yw?dW܁t-]Ԕcnʠس ׫W͚?8F2(=w;Cȅ^0 [zh79v= z7h/ē-Vz`״F J!EM \Bgs1 mq?;fB1E NAm4ײe92`ʂVBJj[ zGA/g0_n=M<\wסS[cebڵg= ;5sim]_ʰ}CL6 5M{gQz04$y*n.^Ґ!:A:!1d4҃0} a& InMH-P($ZBP(=( BAP(1 X :=Ĥn]BP6u+znQ( EJEP(TBP(=( BAP(J BHLzP( †Xzx Won4hР! = Yoshimi User Manual ~ Scales

    Microtonal Scales

    scale windows

    Yoshimi fully supports the Scala microtonal scale and keymap standard and can import these files directly. These are combined with Yoshimi specific tuning controls, and can then be saved and reloaded in our own XML format.

    (controls)

    • Enable Activates the whole of microtonality.
    • Ref. Freq. The actual frequency of 'Ref. Note'. Usually 440Hz. You must hit the 'Return' key, or click on the arrow to set any change.
    • Ref. Note The MIDI value for the reference note. Usually 69 (A4).
    • Invert Keys Reverses the incoming MIDI note numbers. i.e. Note 0 becomes note 127 and vice-versa.
    • Center Sets the actual reversal point if the keys are inverted. Usually 60 (C4).
    • Shift Changes the octave start position. The effective shift (per key) is then dependent on both the scale and the keymap.
    • ON (keymap) Enables key mapping.
    • First note The lowest note in the mapping. Lower values are ignored.
    • Middle note The mapping centre point. Represents the actual octave start point.
    • Last note The highest note in the mapping. Higher values are ignored.
    Map Size is the number of notes actually mapped before a wrap around. This can be different to the number of map entries. If it is greater, the unmapped ones are regarded as silent. If it is smaller, the extra entries are ignored. If it is zero, then no mapping is performed but all the above controls are still active.
    • Import .scl file Imports the Scala-compatible tuning elements of a scale.
    • Export .scl file Exports the Scala-compatible tuning elements of a scale.
    • Import .kbm file Imports the Scala-compatible keymapping for a scale.
    • Export .kbm file Exports the Scala-compatible keymapping for a scale.
    • Clear All Sets all controls to their default settings - including disabling microtonal tuning.
    • Retune When changing either the tunings or the keyboard map you must click on this button to fix the changes. However, this is done automatically when exporting either the Tunings or Keymap.

    (text fields)

    • Name The name for this scale.
    • Description An optional description of the scale.
    • Tunings Lines of tunings either in cents as floating point numbers, or ratios such as 5/4.
    • Keyboard Map The mapping of the tunings to actual keys. They can be in any order. Two keys can have the same tunings, and an 'x' denotes the key not being used at all.

    As of Yoshimi V 2.3.1 you can add comments to the text fields. These will be included in any exports, and also in saved scales (as shown in the example). They are not recognised by earlier versions.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/starting/000077500000000000000000000000001506652756400216555ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/starting/images/000077500000000000000000000000001506652756400231225ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/starting/images/keyboard.png000066400000000000000000000242321506652756400254330ustar00rootroot00000000000000PNG  IHDRiCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|Nnfg=o39sܩ?AATT?`0 Ó4i_}f!`0 }Rm `xlY,mk `xl,HU k.[YI2։N-Dz0{61rP׶ϱ`&ʍ>+=UF; nPazJPi=_@B AH2\s2 أk+,u>2)3ٙؖ m žUVWVSDbn׹זٳU|m7Qn,/S{MH֥ -L'h f;d"̸Ź.Cx8ؙܷ;2/3\E˦J۾zÕ11$kuUڸa]+wJ)LEGZN-6^ÃסڶǏР^pjō)姢eSBYFৼv O=k֠ Üؖଘ!R."url,2pHo:5۵j׹6㬙 ~/gĬ<",ύ@J j!z^ C}>ƍ'уF4"/x4'3m)~(I4G /}ضbv~Zujْo1~JaO9)am[6QZgPu@.4fd+cc^Ws-2rc)SAݗ E殺U2+B,ۦEco˟*~ gaܦkm]Eط.5݈WQ6m\޹kvFdX!8t)kD^u7$g5#&ڴl۩6ʎo;S3LLF~r,Ƅ=+mڨcH'(]59Q0KTJx*T3ԩku~=aFi  Ю a*EzV(:Ѹ@Lڜ\p=sATmtܾ,mho4s!ԥYQF Յ7%9Έɣ_ۚ;3LQz}Ϝ7dL*s乙Y#nJn[x5adG.vWvN>Ŭw[%O,j+3l@ m-,#t3wTܱmHY,0m,$Z=?-aϝ>Bϊ܄׶\[EJ@Y[@ F f2x(;|g<ոIHٹ*^=M7YRƗեY]FE>=,sHYfE҆ZV lԐeu&KhXhDAXf-)R_6II:*G·X|vɶ6!`sˉvA>+ dLRf{Ц$mmء4rTNP -'+ bAB M'8(>.)8"or/S)c:Nvaת)̿ WYclhC{̅ Ҭ(E`M0'yHY3oIf:{H91q؁CQu{bú)~:(gl6ձ]34mB~r lP45Q/.2L)p5SwT"KRwzqܲG1Cz< #z ¤1}%=e\_AX;Ԅ# :Cֹ0?aj{"eajHY͇)k[ԗby/Õ$=̶DUH՝5e◛x"8;qH9qM 3N[G E{?dÛ"uST}{Wξ>㩭Xg 樁~r=]RCv^؍MyQ0=LXcab {v,4w$X8sdmiץdž:4m :7>D&fO*oNjSo/p7nXZY@x2^7nj(g۷m*O .+A1 USKe6F(s̐n_-﹌FV{V!}Q/ÍxYؙ?qI–ܳk6Md/Q} ix饯QDJz*Us?IdOo7gsحrU˽]AؿDRca&Ekk޴>׬QMl΋de2f[=pK6j 4u2}ihqǍo]6JwU܈(op_q nd>/oj\ӽrvWݴ}&bqyhnX1TۻC"tzKM0O\)15cyHO j80I:Fݺ4 ڡ94Wf3PFw5xaM#G1qq"%VXPO a[m[6BMԑUɇ+;HcaNacZ6k5 憜̿ WƼ!&uW2 {cy(a *2 /b0 wErLmiw& lY405%d^^Vh<`+t~k̡F m 0 ؘd>{4`0 M}ج{2 06AA%Jab  < ҦiAA& MAm6AAж mAm  6AAm mz6+ xp}!6v۶jcٶ/ͅT-WJT*Q%d~ 3g?Xl{aж=UJTmڴmfDUJnml6UJT*Q%mdҶ=UJT*ѶiT*Q%Dۦm3{P%DUmӶ=UJT*ѶiT*Q%Dۦm3{P%DUmӶ=UJT*ѶiT*Q%Dۦm3{P%DUmӶ=UJT*ѶiT*Q%Dۦm3{P%DUmӶ=UJT*ѶiT*Q%Dۦm3{P%DUmӶ=UJT*Ѷy=UJTMfJT*Q%Dۦm3{P%DUm3{P%DmAUJTMfJT*Q%DgJT*Q%6mك*Q%DmAUJTAUJm6UJT*Q%6mك*Q%Dmك*Q%DmAUJTMfJT*Q%6mك*Q%DmAUJTMfJT*Q%6mك*Q%DmAUJTMfJT*Q%6mك*Q%DmAUJTMfJT*Q%6mك*Q%DmAUJTmȶ$2$L2(&mL2$L2i۴m2$L2ɤmӶ$L2ɤmӶ$L2$mm` `Ҷ$L2ɤm߶omI&dI۶ͶHxmI&dI۶`p 8m2$L2tmж$L2$m0c%um6dI&m6,y02$L2immI&dIviíI&dI&m'L2$L6mL2$L2i۴m2$L2ɤmēI&dIۦmI&dI&mM&dI&m^"dI&dҶidI&dIۦmI&dIۦmI&dI&mM&dI&m6dI&m6dI&dҶidI&dIۦmI&dIۦmI&dI&mM&dI&m6dI& lAAm x@& 6m  hAAۦmA Zjڵ}||,ꫯ&&&a9rA ڶ}ĉJ*_[# lnݺ5klܸԩSO:$X>r.>K,aȐ!v$=08,9x`@@@R 4zygy w/t(~0sz B.]ƌ;(Ǎ'~0ZV׶[l٬Y};vLO>ٞ={XmqR~i]=Pgk8("s8=HOKKӽ)b>t/(Չ#WU>Zy*x`ڴi?vxۺj(sZaa ªV 6(/W^y婧z+u^aaa,S6yd趭{'v-֑x8222pRT[nWK/,ge˖!EjΜ9gb_K.mR &$$$(Jr]O>/2J999m7kkm[| LƇ+En^yu}g8q"ut6WڋuΝh;OBIV^X'de:u@jZ59M{=zm\xzRhbʕZUmui&MSFݫ=NTCpmu̠mO]vœZȅ ڶ؄fgڶ*73g#FbV#"U l~6kժ] lkm6&P,Tmcfs=ߢ&O Tmg%͛7km޶333\r^i/Ç֨nL:u,^X=Z59M{Q0zhY@NOOW=/¶Qi\:D NǾ}0ݮ];^b8[PvRm,h˗^2 N߬Y[?^۾{2`L?apm7| FAgImc f"eOFM#[eym4U^Cvdbۨ~<`+o_߽مy=ą߿y> 5kb۪ {\s]k׮f۪V¶N裿% 䓏-zu7榠T6^.ґ7<^̎?߿+ϝ;kc$Yt'DE)mQ)ܪLԖicPHM02Rx_ P+0A >|>$hۆgϾ[6۶/Ohm&ڳ{³?o}n}ʝWv;%Wܺk'&E; =ԴͶ1<'r;>낱K em{`7 N!m:^#FvDllh& `ݺuB aEԨQsv.m|Nt?;6Ԃm aZ&^1WJNQ43 I] x#u]V5Ҷ2߿om[^lw< ڶJvthԍƵ{g.xo޼}Kws_;~6?)Gw,ȿomKpgڶuKےvmNmQsW K_ D%fQ7o޾}K_BkQ hm[YIB0];3g2tu7!ɺ+@+mӶbۖ٭J: ڶJvS0ڳQ75Jp폮1·o܇s| Lf9枣5<ȃa)m[NUX ^%K|C 0T6>܊U- v $B3 =2'9 ЊΙ ڶ.L;7^Jra0l/F޴i!Y(MSsm ۽{E=*\׶ N)p|JMXXAVdѶVv h۶i뢢c_߸~(d_}wxާ/wxݏP>}S/ "Ң*q|嗞`۰CXp,g۶UYղ`|4|{x #܈۷WdIFD)S!%++aúp}|ׯ=Qa27x <55e4wy0@)0 E۞m$§P@~|Rf=BYI~zslvm;ضJv 1Ͼ~5<۷'DDEN?O.GO!6n*A͍mPBum|'44e ̢|6Ҷ!/`ZHqZpćPAP1)8͛7٣Zղ`Ý9 €x6Ҟ#mFlE7Ү%{) hMǶuWD ,ܾ}{m41rHmk||tI=3-EjԊ_nؘpxODdԇ?~sQ~ףb'ivm'ˀ.N.i¶QcTo|ɯ&jal۶ hkF`~r)#- [q𐧴mamqY'g|m?-*OusW+}R>{oǟ27{:|=}W_0\ V/Ҷm{<Yo޼YOw6|189>owoYeێcrnҶؓYtI;W=}fh/-[?KT>>vvI{[=vX`qiK,bͻK.NhކP|cҤIN*moYʶ0~lax?6m #Ѷuߥm;i&_Yx/}M!=wv49!!/=~=di6ۚm1;< eq4;vL,茶mZp[O <ڶIm1CaPU9Ҷm[?%[A[}tF>a}EE{_ZrQCnmKHF6^jQO.lN= KHA;¨Ew{V,x;+ ׹zP vA?aX!^L (J(@yoᶽt .޸p7|z 56njYgY7apfD֕+ )?n)EnJў#;nض&)˕ i3lp'A8nQN$ӵnj3.rАa>âr6h6j״yZm?ImxHsٶՍp'Aж 9=E/wTR`HMA& MAm6AAж pmAQ!Pb?±kc0 Bm4isH`mZ`0=hcM}tǼ{;$6G`0EmADEVIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/starting/images/virtual.png000066400000000000000000001610171506652756400253240ustar00rootroot00000000000000PNG  IHDR:U; zTXtRaw profile type exifxڭir$9r:vL7=dmldb7d—8@w翯/bzZ=eO}?|~>?{_aۅ|0^( Q ^(y,_a}_?az4b-5}kGqZhj_FO kI4xSkx|>uZ)ي7>jgߔ_%{3^@^~?|җ\y+\3^7[w[o[%m 4ސ#pK]ovaq@Jy 7diNnnkv+tnCwTObU;/W A$ߨf\^FF`yac|g]ZcKHPdWz{۽v4wxJcٲ+Ar%:;ld'Sso]< VĜ[D\B8 H|}'GRNi@]I>`efz<]F-.{uF~w0x,eg)3%o2w, i)fnSE<(y6z}@|Z8mE= 85 *v}{+5t`9ϓVMu۹X*[6I̳u+k aڞmX8ۚr9G0ۨEnxj,%S,ݔjpښ7VtʎA<#֊:s2;I+©<Y\M7i3(ĜR(;L*Vi3`Ǹ["h[q7ެvkK+'Cm!-(p)ϒð˜@Gȹ}oD?HuhDI*/a-ѹ!XW<"ԕ2!:<-F3r'k&W5&p@?g9Xꑾ yBQ7tWo/Yu߳,@k@>Œ3$^g70̇4"]UV0C^Qq>;@ճ) thص^OjA a iJ}Sc E8mP6&'d 0:m/eQhzIQ1d*"7>&"S::Yt2Ix}e%Pf; #@f((qⓂ(Hv?(9AOAY% -|F.hD*8À~MH&Ȯ7@7z(.Q9-ydWtB/EQ4Bt:*aT A [FWDL8^OQDF^jX ot౻hu@ )"ZDT$W5d[:uf\G Ȝl/ɬd"3 l7]A2+&ZyMتcDh^FȰ@36fсdzD z=i_ԉ6%GyJ $%{'?D^BE~a"&)eBd; II4u5 OZ^ *)( `9wi!İ%-  T@`C-XQYJ!# m|asъHdž 7p?~|tmcF?ԙ)%JtTPoOCet) (ol Rgcho?D5f'EB(C* JdP0@Di 즼y|G Q0j2î Y);OAkJg +PRJBute8|Wp)C9v?*Hj(='TlB5nk%jGlB~ iZ eِF8<0IE-HlP55%$}yC˽[$4Dcsy(E ~u<.#H a\YAP"Q@t(JsAv3&z_>Mf Itoc."pR\#4QE2/γ?s%A,R鎝zJ V@4G RG^^6~a@(T ؐe,+l(5 !eҍ\~ܐ_B~{ø bF#a""=vѶH+`$ހZ0=!눬@{]~Ӣÿqg ̛$V* {HrF X@)O~#,)ǠYgʚKfPhCWzcsUzU62CĹ)5)"6Y=ἱuaM+)4@,J8dg4K ?o͇BRߣe!ܺ^+*)'#kwdJBCIZ`\{k $XV@4Ēp6>諩W#^mӈjrAjD=SltLƽۮ:Tz. +Q 5bq1#H"M}%AA~9_4,vUbtt*:S`-dMgcS΄扏m hpW)@m\0υ.^I<#dpL7i2dC`WDI9TH w%r8x7_p%r}n*(4 g{CYRՃǬ >: ]i (*eA-:uA0w(#>GGF]t J=`OP1 քN3Ji4VـGRf(im̄Cڐ8)vouKE囤;hy9)qhc/91 HAA?G @)b0*~h IW,3 A9J(a@(;@@6>Ë7- RUs䒝t4E@h֑L ad0Lj&Ʋp!ƌB6J`PMM4"]i S4G[ 5Z:)mJuDK#E"fF$#`Y Zzla(3-!nX`",S+-ՏgJh&@"h kF?hc ԣ{V 2ၣ.YǓbEOubX7#HZ;8\@W1 v`lb5hT4&0BR!hϬk#'drCR]C{h)  {NO9l|Hi_a'ƨhⱡ]̆=5*ZDž|4H.e- `$<jZȀ |60Qxn<8 tid 3ӵ]Ei*ڐ_FwcDcY|~V5֑zSE/@KMı'&X͙D=<^"ZQp|]`:E-C@܅-Դ aǓ5L(ou51!@[r MS_L6^B܍f@śd$CP> BT R3m\bBע+XJ^u|SM$ Yy66]hDM,)8]9[hfc󳁗LCҀ5T*<ΏM _À^;HVzi†]:"9N{ ")YuiKy "F܎sjX# w_c9Z.Hˋ?bID6H}j&7F "Y<+h:^@xs!f(N7.ؘg7XI ;Y2Y&Q-% / ' )အF أҷ {E 3ؙ'DDE:.Fɢ4d]KV?ᾱ*^ H:dciSAucx )yCyt!C d? =PZ/76\^.A8)f-tL0l&iZw"v? .C柇?Sp(35!Krn͸HxεS q1wjP.UCDHn[ky󝒣)!tHz- 9U <5fcO|> 2J-R6"xӔ&t6i/U}RA^ܮ ^fnąQ&űK,؃ ECY c9Oψw]ע˕ںy㏜ M!'SM%g=nZj8MYBgNŒyN" =櫹Tq#sHGuHվ]k4\ڬCrDXǔ~'%la&&DvQވN]JRλڛKU `\4`;%#Bu]eaa Q?'c֏@Jt,+~dL,`PT`(.a ."UБdx-mQ!l\~9oybJTf}܇:2[*0oFZrn!-69`^@ԨVp楾JU:1t!6\ 4W{*z>t_"7CG-1 B튣TT9> r( 0r?@5CC5Ĩ!4P4"Af iS> _ YrlFձD-w\IAV VIK>:j.AGu@gjiC ]3c]S>>3ֽ6@B[VGoIbl Rկ"_C`0.OhΉ|"1Û!) { aTa"0MBIDckɣ{..M2L >BI|;.&Gҭ%8*s(-V.ሓtۛBFB:T`Mw+FK 77`+HySk#%h_t]R-Iܭ5mXg۵Qt`ɚOjXЦ(\AAu$Hf* %4zeL"tf &-F9iu/ R@Q=A$:(u(*j:>ACwbg^<ژ# P:)H)t-6ZצL+(wӮ:6Ȑ]wV't2)`Ўt~4b`B 4} ujw8I&9.@oA'mk2S kY1:i pGytɥi ^S+r.Kuj[&9TPҴRރ5#ʠz]mI:͚tHa@ Y(PyRT@|I9}9Ƽ|;a;Q+ħK~A.kǸG]BIX<0XD : )z )DQC~q"8/D,}4o\5!NXtP78Y/vz5@?aw*e΂7@W|'o*ѯJYJ&wth i/$C~btpB3hd'MsUSO ])z4i>a;@[MUTg 饘qMX"*%\CA%k~dX{#s&@M؝QO6:s'~`1ݰ >m ai)HM}WHNP%VM`"_6%G\qxc.LYRV8]'ІĚhmT c 4̹ pHYs  tIME0!tEXtCommentCreated with GIMPWbKGDqIDATxgpdyys9s9w{yyy)TL T$'-%[%.YiY*U{f8wvpNagwt?F[![ɓN>wsT>)EهmCH"9~89sZ"]8{xq!ӧzfֲL;䙓g.>si~^N:qGMONIV9Ŭ;s:YnSǎmN /L;{IG^0 3Μ+""b9g1c'NRWΜ8}6LK͞}T[lrPyM0 ͩǎm p&$ٕӧT.#ӉMyhh˗/&9TUs)XR*]. SV̌|e74VMǿVp3;7ek 8Y_y_''䤌ťgׯ13u}%ŋqHHHww~NG}[ߺqx~~"F\\\TTߥ%^ZXX UVحMBFFj"WtTWW"pܹeV05ؿ؟w "32W|޽}ӿ~&1q=//O˜83yAAO:TٹB|⿞^yy}CݵCKm#%..B GG\1zÇ_Q988 :ddmAޱ궮ΩMu]/fgVwT:::n eZfN=ZkTfN?\;ruu[᷼fzrME}YY[wJKnGGْK.9ܪz4o5T;tNO=|yu/-5KrvܹsӎB6A[Íh1Yʬ};?ĤeNdpU^'׹֖ @þ4 Fgg"AyyyfR$ -s1gXJnsȢL&m~A0Ƕ4T ;./ʳNWE}9ȟXמ9&78p?#c UvI"wcSc(}RݺU'd:jqqQ+==]s{=NwZͥҗԸ69qS՜ُM~z>ZxxQaGDD("]83sKizjմzaM1 kO-;,SWޝzf Tfk_\=O)\}i^RM}v]|.T: Gh>>>V RGG2u2|s3O4TܜjmmUP/1!}zENCG!Ǧ̚ݮ_49~w)sI?-NpOgb0z-9<4#4]?d[69-YiQoph!\MjI _gȌk” ք٧[Ҁׯ뭣RRRt"ؘ2*gDqW=CG4,,Sv?SW-=чd7kb ؽ֖yuŵ5X" ,73.L[b7 y d̿k-el ^rӏyرetjŪAdt/ulWWW'*,,ݻ7;;k5ʷB$Vd J512ti+5s3R񣣣ֿ Q###j5_nֺyL ;ryY=./Q> Ƀ#s4]I.55%rmkxpqԵidpHkp/:ۛх^>^a>~I߁ JҒfkbtFyY_aAKUO-F ^^^u٨p&5͛7΂%FHdkvv6!P|T===Ufg#5ŧ,C%22 nFm#ߟO^ҬI| wea!iD'^cwEGd|IJJRQ޾(?HI]:j DTVutt>0e;[0D//7yё[II6 {bG8ZM|ɹfx{B-e~ވW誰Ơ-K2<ml^^NΎ3UPXxlH:jrrR Tf"ŒM--vRkvSvt---݋Pk7eeھšΙ܊ᛖm/j=d7is|ij L߳!BJ~+'99yKv |a,,)/k)+m 7k[6ح'9q_(+ڮn;]>jPKqJrvff~rrfrKw~BBzZZBc}-eVbBm/_W[GZo[/)&i/2}sPV3og p E_w6'_X ;g[Gzj{qxeMuop=5G~Za-; u%&))Q/ڗMd KJlj@V­#3P$ !,INS_8|Š((bcm/p_5\^yӽb+EY=2<<ܱhee@o6vD[1a\vM~Fԟ _0 / <{b^ffaxx4VDb:ۧζVOOHp|)m"V&/Fm2jOMbK%1w]m7SZR6..ۧsޜyU<ɢ DEńG"Frr؝L7 ƣ;fpq(oF96cl|SXs|aK-JiI#l]ӼUNvM5ׅ9L_0KؚCMPggȘ i/jn<ŒŨ$6s ^.&Saa1W%M; _K@'}7|aP[鄎%((4175mnOZ=s<ßWU5",ߡBVN3KO [7!n2syC- c/ jRbFJė][__xȢ𘒨0 zJlL"Q3-'|֦xc7%#c4 N' 8"~tEEN6BiP#be< 7>km/v_I|e'K O"Ύ9 QRb]p%܉!gbU_bⷬ |aBUYn}ޗ/sC)}E_= 7dUe;,­eA~- >H–LW_u[c48aUTlFf C?O+9ZKI `Ѩ3DG}!4mmڰmz@ իW%mbv'zYl1R \>/Nwݵm_Ka6Rrt/xr(LHسe?m}_пbVux<{ziĚ"b1əjjtww)y߂*$[GOPxGG ӣ;T[qq hJ0%܉JiKIB]B',ڑ 99eM褖4™!! Ŷm/` !/%?(>/P:=6zK[|! ܟF,qx$XAb xP_qHb;m_b|-6[[nxà YYŃ4Z 6eBC|A@3$$ mx [NN B"=[C9cV2<6" J.o##bVE(SsLLB"T4:>ƻ2J|Q@A,gQ51ZC2?UU+:U!l=}a(\4V0?xۊo+*<|@4ee LE~=V^O|k QZ P_r9 E>=S\T.8=v1ox}_Ӕ0-Fʬ7&|s\ZZˮy_DarNVPv/ޞC`]mEXb|d&2X5+p1!Ӌ/ԗGYiI~!oibLV4/?&zdh9Ǔ2Q\m90e +s{8&M %O:K`XeL%@-^^A$ ȹ _8b&u#yLMt 8UgAՙM@/U6Q X 46+*̜]DGɴu_ͣ/;gZǬ%y}_ZjFj9Ʉm2ѝ͍C)*m/Ln*FRfE ࠪ`E$Ӈ[*$p8! ᩾I]/mG_Pڡ2WK,(E⋖b+M+'LH"EB#/|!U/_$X5%,HK%Earb<$MI| |nȌEo/E⋭//_/`l'k=KԘmOemdYZD 9SU@/_^7|H_$) qI eű1I#7%H|"E/_6799A<&k/g"EQ5*d/_$ݴ m|?ᛚK°K[1Maő#)o _㏬go5j)_VVV4T$NjBC|1ܭVTTԶ_:' d#PbbFA~UweŗD-KVLLLTTT$g_JbzX@_^_|Q3#C7z萐cMK-%"[LATxNh`UϠ@K=_ fDxzS%.\}s/Z(yjZ/8}utt_NHC*#RP+|b@0p GHqㆆ).KA* &dzᣋ5Qyyy )ivJKjJNFz(LO'5^|C86%1Q-Ko=08S)eEkmm_̞|͍G萢S W?/+?{N`+SMyֆ11&:s.7,4TcQlJy׌do?o`.oh/t;&)1uMue*'>b#I>Y/kk!*\2Xg Ӡի:Va|A#ow+sQ|TLDktUoKS& X|x_ -76t8;9/$Z#NtT~:Ѧo&;$::Nsߗ-4#8,>T?GSBS5}[RV9 _8%QEEE🛛bB=KfDw~޺uK'[o4}U̶TwLxk,_؃5LHfϳ]_na(>alʃ1g痹94/6M"Ī Y7|ɞJLDFGaJk|F[|a667 2 eN=h_ХC 555MY]5= 7.[gp0a+Dq g4Š - #'u|x5ށ>Y{87k/ zBP+z~LW@v ~j/n ~wnnYYiIcc0' VQFgZ:Ř4e%l/;zkMDs -_bbU6KvVqDD~fV`P`pRGK[W0+#^+|!XRbGd";/]Դg9PgC?O|ٝ͏nTB-`nCMu== ӆh[dfW<@ +-haޗXC ;j_,TG_APS999>n2<ȓ s ..1ٳBu~y{ #:V_"#ct/s,M ͺ p7&&a6~<*PƐxn4R O{{ƣZl|녝GȺ^7<<{DA67,N?6m4,hD{E_`b׾T_/}x rS5|!@ze*G+!]/Gܒ: g7 HEJ a˞Lw 0 ɻ} `9sPGK8#vF$XVv<(6X~&06|SCyx11qvˆz|ؘ vE_,𰡾̙Su}1×0%"CQb2FNy!a "YN2<(Aszz!4[Y6{mn% mh5}_uv#_VB TL:q:ǹ5J _p(M_H' %ORF@⋞aeVN)8{c$|!p:&:^[|IjrNH\]]|o}Cx^vާ^Ħ8o'4|_RT <$ xTVVs n_46 luP@ۏgI }_(db$uPLLRsX R<hm=s0UPN㛢z _oB(`?"^8-@,xH^k~.Vxp)O/ؘt1J|Xc.Y/y3< ?25"0?0& "%MhZp K4FoK}e^d\p L swrO\?/6)@tZeioD HAT&W\AnR ݨ viPt^t u =wՕ!!a%1Ae@,ya=|`daH0$HӚG栋PDb%;PCŻ/#:#/!.ֆշJ_YAɓ_ x 0褣>(WQ0;XIEjP`ؕ0=(}>qano{CWG׮ZM޷;KuZTC;&^rbbTԤY_(>A0oGZL}} 5)2>\NReUlҰ^)˸٤=>cGǧX}Ø> zzZ3g0G/f{GyzOM#x]{%d"IQ{II͍ՕTnEŒG%Q2q@ KKkΝ;T1yхד}$ddgd]/7d%?zRMf$$!+//SW)/wWɞӡzoG@dQhdž,MX]~v)#DzOؿIؽ>_Ԣꆺ>u&UnNIzzp߭ѓ,LV7l BZŽ&Q緪ҘظBQ.WTwef:QSs^oU(0{K>:+W.A5S<&l&l麑HdM6dM6dsswwh5x)nbG⢊̌Ctedd]|w|;l/^Dʞ͐p:V^0^{󳳳d g(yPTN[WFE͛7_Y^2 /rk"D`49;~W^IhB3'Jx 9W[DCK8/c& 9IE CB.Tэi*CΙWJKiXRH=&"2&n1?_)aAߋ|(7`R3,ba1en%YLubIxL{eGHBTYf{M .Lʚ8uH%j#(k@YCTL ~&R1۟6'R$\fffbB'N*+8l{JJ _v948u#x2-HU.j=UU9{q{rlhט"icҳk(7'O64m:4'? ͤx''JEvR'_ÇT tFjjQ=RR) 圶R!psg?HO"l3P**3f@ R]3 ٹG=j<&f8l95o~ôԜTTOi.%cLwe)aH~KeXk.@CUeagkdhUGӬY=G,LgLG֠HuH$DBװ 뤣0 ~EC u oo)Ŝx`%уH>pQꓟBQL*.`'P'J' 2 CW{dԑ*𠬴4X#/}ΝO4a }~3H)N:[B*:4D*jV õ56/Z;(:;IIJC7 E\~&~M'")JbQ* >WZ9WXoۢ4ݭ)҉H((|7ϓwZcA.F߀@(SoGG-D\-^GDTu롎Q/pfN[N:VMM, ܁&5h#VDxdRe&:II ~" V1PfI&: ~D"WPĐ_o oG9 ۘ_xa*?ToWW笣&T//007hMnll1'+u$8#/MG*_t#'vJKqq~"]D$|Da:bU4"E/_6vWPrm/,\_/..ȅ |C|}yyי~ /_$H|"ecوaYIe 19#F/:ŗeeuK~GQ)Ko.==5k/~~ġQnݝk_/_$H|9|I< mLYH|ѩ.*ә!pu;ځ$ 46 e/O>%w{gz-^{{{+sX/ϟ曦pF;h}5RjʧoJei&Y>`XUv0W\f$|I9̽RY)22RC|?M17x ^Dױ@&n!>MskuC|(q8GkIz TQޞZ8;|øDƍ//@x%PAR266W V 9B4\&77wװ__ _8"P8l}_SIBNj<裏T}!?ݵ#\RȂk% :_܃HXKBW,ٍT<Jܽʬc_!LNNr3_%bL9 = _p_؉;WG˜ _P(,-EFF$6&-)1g+%9Mm|b]MO}]_S vwΡʟ/~~` vM6W.x&Vv hyv>7` gG VdzuӾ0{/, ؤ>ĝu =1+ 1?wSbx/2`3][#.70>b ~AkeeE8?|…qcw%n@ #2BR& +6ėCo\ė{'=sٳHkT}6ϛsK'(RYV[ӝ5m* PVmW N*KJJ/;}I\:RRR)a1k)EaN`ukpI+b?_v(}P Y) Z '? w,9J|&?ç0}g?YAk?+Ph׫fk 9PŕmE:1!N|_  fxp%/fwn<)+mjmZGTo 8Qk3:rS[+iؿWdvY !ύ76L X l4)c"g_Xta=%D [UU_R|!jTDohxa*yVx3 r :ɺx1t]D7juw?y_u(&gJ3^prKc*&Ҏ-])Bŗ !X~9ޑG,&11ԎAA!_0UULt(ix}S?t#'Ձ/,r/|AoȦ]Ԝ=LpSZ11$ loHrP k/&.,'wlk?)j/83 B+O< SK/g̟} ,ȩNd|S FQ~Ĭmmm}bEGK륥5dI#z))aaUm孙}_)"p J ,r/,qWH(ѵath35#[2KrDTh/ApGY;}X~c#+*I'rx iO|'·w FS/lҚh_h% ] =#/A{ͺ+bFsFn|YZx㋋.߬hfe< HNJ[ZxI6Nhc+^Wde|`+o~!(9冗0JHF1f)ȓ!r lC|ato~J62 +/xkM>YkNO%ڟٟO?Ghyc/Eh}ܟ59(9򞇤! á}K#KiICXX$m``¬_y>1PȊ[j()TIjhxYVqZh\1%Yky15r[W|gޗ#s7Amyޗpf΁A/c&FUEA/N/-{+_LnFqph/,t WG_ߦ|MEp_)ARq|)66z 0 51U؏oV[Q]W'#XTw 3! x'Z^/͌4zgؤԾDl %>#l\\,{'yUFCtnYT ;~WWƣӧOu?SL PJyD̑ {5wIC:'Y_7<fNpcX)7Vqä .DaDT?$~E}w|PσOgME!)0̓f-`LҎ/{IXmTN#FP/Ƭ әH{Sl_DFAzpnu@y8':7,7|nk#C+-M*8d|G*ˆ1T`"5=ܰ/0|{c0xVED!mlKêə׿ԑ W4B?lYDmh2}21cT_DQFa:F3Vt|zоV} ˑͩ^bџj 9fl< Ļzb/zоH/,(($s)vs s /+FJQ("*鈠\6WAInW|~-,iStOl_5>\76C~rEA5V}#Tqa|a#T?y_}Ns eJ"D*o#\{MmEa<$ˆI]Ϭr`yim7qY>E'#FHR60>GvakjџcgkLxXMdz*c5aҢeC@5Ese=lPW㋈Q' Gv<ea:Ś+4- W T,GdW_,0qv"/?y|Iu%??_mn(鑛E/ E__h(ll¤fA d:F$&?&ҫV_t3@¹K?E)q1-nnElFNNe  (LZ-=kOL4g$$61c̡Ծ) -G/#|yi+OdW*-J!rbD {c+y?x/v}Z,5IIݓap$eN ϮI">M cZ/0K6^zWhq#[1R8 B#ÄCL$](f,{9 G# _hlxpp\~4l_m0K/u/T6 ` eJ .<> |_buU9$\-{﩯Y&<>mcsumbbnK" G 0쿎J&=-lHfm("(k_-_`3pO"S$H|"EKzzc(e?xb9jmuqq2QٯwoP#c!g=s!!^T ( 0[b}!IIi ݪ8qDA^#/_$H|"e|Ċ>G{z0mi.%'i~^(fRU`5M[xŕ7&M RbI|"E/ d.Ouu]V ęnCIl1Wa, Tv577#i,Ldtǚ4_(. 7:G?n/idRټ___Y*~Ru|<5f_O؄MBB&.܁R*`4E$~:DƢJKKQ.嗑j{t D_QgT'"Q; pA$kD۰}[oG*]H9^obY#s3n+ ,Hm_ɓ'Dt[o<"ј -%9kyΝ;+g?Y~d~EG_'"a0w 9=HJz77 U u;qxO+]E1PXX}h|ɇc+&k577k>OkFsg甜4SOj+ՏcE)ۡ"aVl4pP_"bztRO`viFq Ǹ/| Z{ <i>ݻg&VTwHϟ|I7ӧO?~o5|Q ??ߩɕ)?6=9oKKVS?)mRv |T7 >{v(@^EAl6P׼ӯڹǚZC:ZI722wWbbvPJ|3;g6ۣFf좹]3 μZGkWkKⳣA0 i1X?ph.)%&d6~B֭[7e9m7p1o Ç~hoC E;JC O~| }5qOǎ`\wBG1uz4%WL*t8ͱH}L*.Ց jmĚ!pi7<6-!'##c#kaFA[*<-{K7)R*SwvvzvkϫQϞ=cSюUYpZT7|FveVHK^cƫk7 l&lvZPPXhhdiIշ矙{=| Y\6dM6d;ԩW8WULJ|ADQo;i9Rj.T(;Tu'j]u5Ri5|ziq*7wwښVҒCs7vTDOOo%8VUY񪧧/9 RR\axAmϞꗻi/{&4/e'g"""JMy%Ϻe]$k]IAJɓ'RsbL,%63ʩs)SB%&QBn3UiGZ˔Iw"lǸᕢT(z G #My)wV U'eᱷw@JrfmMg*kB~~Ippii!>?I:JFUG+}yN:QTxF&2q*-Wrrr JLH--iRgM(LZdb *.x&t˿J{{Jwݸ =6zP⋒$9)cla` ;w=<<+W6Yzz^'3{C[\-_QQwY9x{|p-d~?HV4AI$<.}Irl~#[ouܔ$00s"=޻ׯ1;ܻ}KOL;4K-ވ*wIʈĆdaqg'H%'@te068))_}WY$"zť]'WW7,X}{n1YՙQ?;>vCbE-0A"nDo~*x2RbR +T;&Je'A NLLrRx:%%{dxOʾ]5Kr5͂Mq[UUm+OY7lqVT8z՞pxZTTIdk),iy[[ĺ׮+f{{LE:{|b͍nAUR^=W>mES/xMOcJb4?uT#0YGd"hRQLC4Ӯ,?$RCLŅ'ݝ/+޽{Wɔ>Hdn4>ez~ %t3Vian=2c!N[wwluQ:6p'9T{k>^#C7/]؊S}#^"}ӚWX@SSs3!QMMMMz1YA*Te&so0>z;:*VW@L#ԗJz  z>?kjn+-T$ػyz{+%05y5d^TeffOӃ` U6Ex᧮aGhStysW;4ׂO] +kDTy#baB'Ej(ۻĵ0Uќ&JE"ŏJ'D%0T7Vxܼ8gg4e&xC/sVVk/^O|a=e.։ kܹM:Y<6^Eg Z[z4W|ܹ"c7itQdq*Ȗ&(==T ǤZ+/kK]R;N'X҉H(BI;aFo'e[a'mrIC~~>_NBK8&HxuTZG/\+)Yq|Y{bM߅g=] 5]U} Sswx -R=ƛy[+"4%Rݫ|goZc#w#!~`/?|"~JtThh~D5ho-K[ŋ/u5ߍtx%[>T4b|ueGTd43 ?!ZBsFn|Mx㯰nl[ l/_$H|"E⋵T1_֪*:bb]]CC#rsj{jkk{9&Jg Zp| m4hjJLLurvtuu.ꘁcް@-/_$H|"EmVb|W^N̪v`~ hYe4"" 4??ydhU+|eAD/_$H|" `yi U_?ߌ|́r+D!L9!!a| _dV0秮ſv@J@ʧ_vᎷ0k8KH7ks|$rVg|1,Ɖl\S}-%_)߻cvM(7>'j{eW꜑"p _*ww׉wzPTF?w/ -(}o/a ^^^Hc__ E.V+Jxu8}TKTTtԾH|927ĸ$6Y% ů7.g!\AlAOZ!|=bl>pvw[r=:*RluF7=H˓gɓ|Q_zzz 3!$06:P"jBFze>u/HKG/-~rkن/lrݝAA!F,5[ )11Qp %..v1>.ztv t3LE{_77פ}%h/خc͛sm/tKK0KCppHDD4{6ɉ{_KJW> ~+mq czFg#O@px`ZG@xXL@XPDhL`Js`D4WDMKll"56VVp&(o./k*.hE3/ ?)YRTf6t&PxR^1TM|a0⯇:҅mvٿEVBo_۵.))C8@z1щu+, laI|_P0N4?G;M[^Vk'社/"V1ɐ&<~Zv7jjs_pc T_S #|Mn>Pu7"6A3f@oO|҉|xm/̟ё~~C/b3:i+|/.g\ɪ< AԉlYi Eg$A%˨O _9-Yk!@)Nx&88n+Z3#¢M'"Ӈge7?TDnOX&Tk|C [pC5Qdd|w $%%!DE轝y f-Luz)M}TǗFc1ז˜?Jy!_v&e ?(78#M8;/뾞%ؓ:5534$J9?ɇWt3WdRņ_ >| _x%V Ō.+Mlw Q%c}Y#m3v\sRRrX|}aYu+%( (0 (P%$21] LOCB}<2ZԾ XxXŬiC|-́<1-B882AѾRXT65U,k_}}|D‚H틚Bs gp[FΎȈHlFy#7ӣbC e?<-K| _pbp?#:7R3€g!E)YZ blRb&::T(Qf7|\IN .%ꪎؤ'Ŋʌz|㒒0i/"l׻f Mej_k >^A:"|_о| \}_P9sDޏS /Fߗdve}QxTR`TQ{/- uڸ/5}]R\:qsw{[m/Lu/{&]^>AR)K"y_pT c|<+a<3nue.G:˺  cglB72*̌n1<:;&$ 0>z30k;gf2 Y+_X?5GfR[M]3@IYiKLLa'&gVt-;Bސ%?pyʊPur11IwRV҄QDۃ)9٥iy% (Y1 r gnY/|(<23D_Fݵ;n b) )?0`9Zث(R!n #>JėrR`_4wg:&qbe0tuNr`~mb3dKO5+*ZKpP("DZ3F6h\5ݼh4.ˋo5uA3D"zK%p"|DDT(&:23J}u;l\ܮϹEz{g*Fo/7/砚wU< g4w2n~c1@ ̙݌GƲ"뮰1aIy#֫0݅E/!!SDTh+#ӓ櫁e#hC|aRPF'i/ 6:|#::I,"/~ѯ*$Nf8=@Hft 7NMTun(qj{%򨾮Qm NEݐA8SDba4 G9y_Xv΀,|1 r}9y_H[(\wn_,L0ÂFgy_/6Bo|a cFzkėR \CPe8yArI0`-3# , f`΂rE\ F;:h7qD0|P/y}9H" ,;M {-NnN;~6(RZ谖dڗ5d6lFLzni57~ ((E?!!@5XSr>ާK`X\`#zMKy_5C:Z\\_Y0%Q"?|ktDPYTH5_gfz]V^wtS_DKnnL0&ˆ,ޮW^ܾ/K|PWlμK2v⌻cY{^ڲ^`Boy%_]\q (#kJw0%Eɕ/RJl׊ؒX+:́LHIVz^W۫O|軆]q!hbz\hSR] VV)̰q߼X|g+}_SZB IaAUo68,$8M`DG}x]nVGGHŒƼ/yDu t__yq5eWl|(mJ{ԄJ%}_D$4onPnEdy.-i:[}A"0u90&{OHH ė_ UHڟ6)Y{|;( wr_<ى|Ө/Faprsp⧷UwgoO7AUg׾x_?B!2yخJ9H`"=ɵU=k_H#23X>Syl}fXYxђ|'f[Prvvv16'''/͍CK,# * ܥ ދ'{KFz_^S|a)h#ֽ{ ~~ƽ05#S#|<=]|=ܝqtRTGjدY/v[l/򾨏/l/h2#ՏayD2kf}i<"E/_$ _ئ "~oW/_$H|"E |~UB__^,*E/_$H| oO?(esS\ LLH]ps-stD`u$H|"E/Wxk7 GX/_$H|"E͌Gըz}J6"E/_$ _ $H||)X/|e, _ lʋ\W.; |2m啉×V𥦦FtҒﶰgP]ˢnei%QC/W6duUk/b['u//*N~!RPj~Pi!Սzbx+SP BH.jq&R_w9D:PN{7J40$_zG'72/> w"AroiZz~JG̸]ܜr" [Zx{\QިU߄yn> m~-=.s~p`jjb]ۉu[11T.>~SE!n̙P޾Hzue-m'9[l||\[3gξw~Y\TTHϟ?7<:mn世gɱs3ΣeddRDB_u}EwKNE*ff4V,?PB"O#ǫ,+2]9kjڦ'Cxm!v}>TNW8lk4ZoFFFBg]I6dMڮV -fRq"԰>|:n*f5g>75z{tok<ܹNLlTv ̤V/3inޔk KzBҝ۟Dk8o3Sy8=xG `>dғ^[x37sqΝ#UyyNcD{G*= ؄JHmxOE!s$2̙%MDv訳gOwMM=?9~wtFGGG|׵2]SNizEɯ(`scckݻ&GoGLc}|̉JtȿhW===̟%k 9EFF8|;;YRքuքc#7 w*&&nd,j4>:LݝSNnXنG՛ 7@b@@K. e'>11e%G*?7..!0av1_?|2ҊU,=='00J{Hx>82/=9ޗ{BWXVbb"3M=C2:.S\ohrO|HÞ-1)1,,*3Py}K6`<=:&%%#? O?=|#ƫҐIT , N˭PgRfFG( .."(u#nVAzRDGG_|ydd$'g1CB "3铔cdNKF8ܮIdM6dM6߰_r"l&l9;; L<')^<< /^..\"Eٳg^Xxҕ+WͯW8/WWwsŃIf+W^֬)9[OhI`{XxQ3IE+Ƣ7>D*8[%Az25A (u±2sggg]\ITt3%4։ndRuBB 7:E衺ϕ?`Z}}{ uX]a~ }kTeiFFFDGqh։H?O.; ^:ݻp9(4gJAFE3J?T}Z^^ްYH⠟5a+Xn6ߵ?_%Eu}*\]yqtt=r>yZy`e٧QQdq5RV*E?X]iDCk-vCnRtϵY#H__D$ mqU-{3+_mߙBD[ӧzRWWɟ^@\ @oK %[p+@ė~y$`/G_;"?9*\Zl_og?aG#_0lJ z!&ć3]%H|"E/j 5 # YQ b:/u/[6Hկ'qkɷ$H|9#=44B/_/䔣6' Z3%_`;MH7=u]el}y*/_$H|}~H Hm౧9XgHHE,5:1<miϾmXcPgf(z 7VJ.#R[X*Cf^'GI0vDa˵kQp( _ SG i0pܳ&BaEz{w_}sCƦ̸D_E Y/;eBqE2\d( ) .P_BIү[& 8CcY-_{ts] Ƣ5͑ls틿ڗ[nO_S<#+~σf-Vg_qhuV.6 ޽{ Qhd46c=Y-#hȐp<:ϻ+~׋RA* j >ط{Q.\7LNNA^ !3/VmeCS h\SMޗ uj/o)aBB"fgp3az'%_f ꊋWBIV3?/!hB JrבjH?c6E<{$ Ғ:#6fv ,fE0X% QˊBwqn&tH{2D[ScE+>Ƒ =@+FL!1.uNlۨ،(ѧ+PV2|A,36: ϒNb Z: =cW|!MOOσ45Hٳsxl8Qo$5g&}SmXh]Nbq1>{{CEsqIVs`V`1L ޱ5 _@P`mmm8g%"鼢Ӑ1])a`_ag3bס G\|ؓaZ|A$wc2x0rA >t{./|WtA5 {m5dc_gTq0@ $sfË _t/_ 9nQQ݊LmnDӁ%V(6ݡq^7>z̽3gz<ّ`Pی ݀~ żFcy(/`YL͍G fk(C2yğh2ᄻ"'TeY&(+E:X 8"3 b>~G$?&8WVVny"A ;P /B0>َ .şcbCh)K|3$Oe|Y\x;;LCw枔6۷ޱFU\fOb?e @Nv]u7>]>m}F_VރO\aAT脄{8]\wr/pBByp ob&%\&w…gf|88<,67u[ax<^ăޞ1s[=]s16; h1ŗuxMTd\Ey{[˄":ҒFggCzYi-YysmMWGDeE;kUe~pA޶wq'kkz[[FJ|ٱ6.ju&.. _} iiQ٪330 /BG3@479e@p  2TĒ͵/D%/ ؅,Leכּ|)agw<ʫ/?/Ȇ"و)kGQxħIhmHEdTBO}{χ`L1o^SrnN5{eqacDX<AyibMӊyV/նԾ4DEš0dZDž#3S hlMMA"^ ))9~~,fHN4i6~|V]x%._"^^3LBBbA88* "Ō`#LEgQl6y%$8,?sry%<<ǿ*)1~Sׇ9u(f.^_vkoy. rFg$@ܰ瞇GT\^_.(h""nib`xXd+|aFᏍ3e[""]Ev/,~]V$H>"43͛71 uk} J&>2@N9V aɠ,8P|yH E;,,, lX" "/R#q< [:ip93)I0zE5&:Q_ a#/D>WV*>+$1 CM0,oNRYcH AM.[ዒVީ Fco˒Zv["mU3}vzW8>PX GlEa_PRR€rP5&H|7^lDx{0^Aׂ_A_zY /G_PDFF&_} |SŐO%"Rh_2QW𥮶;9yS› pz&*Nyu\9":vX/NR6P~e4.doii9YJ|%HdeeVSTH/01鋌Ž=:,,200Xi|>#3{᛭7>׶hNHa˒Buw㠬2s^p4qa{fS*l$-[2w@m1ll@m/X|;$Ũح?PGͻ QcV?YCGqP8Z͈:]SSCf9#EBu6ƈ\BQaMoϜxQaARWq:#͗&% #D.ҒΎytdJ6MGo$lv"ی d~X<8[l;Xŝ Iܻt?1{a|,y_ `QHHB`E#In32h| "yfC/fclH}y_Dc s}Xy :3&n¶HrOLб GOF)3iZr " TVqHm&5BV^EVm"/dQSU"(v{  eÐtљIJGUB*g}Z"k3ӉFČI/[/չo( E#HT}b>h.\țVLU,Ee|!Ԏ7|嵫8-moXXTTc|Rl u<`kWJ6)B"%렕")Rbacb# e Ƨ> -7L&t  2 _a*2:;+GyU-xQC8h[|u{?x9ʎg//*CU/q"! AC oʋl{8/hˆأY/keb&Ee|A&/VKEYO ƚG_/3.9:]uJL⊎JoS^|衣~ӟ*"'NOϙ}, Λ̼ӧO5%&VZ쌖\<;WrgMZ5,꩜կj Ȧ"[ZxJ+0%emppP牆TpOv 2jknR-=YZRa&ءbO8ᰭIlV aFb/~񋚈ӌ]DZ2lhnaZ[[wTlQZL*9'g6|̷_h8E#]~ qDlœZ??èÇOFk=7}џR{zz64tNkm522a_Q81Tm5]-}7G#kǘiuس잞"rXٱ4%h0Ilc(t|{. B*D7778涇HhX`RG* ъydžԄ1WqA=Dbo***sS!ĵf3ObRm'*-$[[$֭[ Lib!UUm-Ss?^[WW{q~>M#-#?NM|QWS5R~2ȍ62RR`TRUXys~ek.,-<_lxq88ñbNOcz48pu$))ͤ3SS?"H{zl{uwi=](,/.h>=]÷i7om;:rNrs>} ִhΜ9=3q奇& .vO9u _UUkz#x-B^hz%Lӡcc"4 OD)\,!pbB؝NJRvhfġ]'vvn:Ȭ|:Dz{w#n\4. DZ"RdD sU>^S*BK^z6Ͽx!LSg/_$K^_l14|^{|y.tmS_$H|"/yI|"E/򒗼$H|"EyK/_$H|"/yI|b!L<"EyK EOEY{eEǁֱ_$H|"/yI|60Iy5*J|"E⋼%E_yq+/ǡKPY/_%//_OO?Ƽ꽯ʁ從 .K|"EkQdɦ²GZė쓰8_/Ǒ_$H|:m-M}-ś/Uޞė2'/W Zo.e/㑧қ_y}y`÷1сx~6}UamxpuӺ<)jܚ+abiIW@@P``K]]mlnW2˚}}wе=v>y_X%ZG3 :'L$?bxpŸtwl~52|7+(;~|`(.KRbe%͖uėf|SpBBjPPHDDdppXkxi85%lSD{o_̮0ww:s;&CN&3%sA!!%u8Re˓5}dfO1wsVِXz{xt21Sm``@Zj^ZjnBBJxxtߒr j=)-9٥Eչ9ee^ _;tի...E)vڎTpP TF5W\Tg;1!] -7#0 2aX,,JX…(6$˫g~/_0DXh8 ,wbs7){f";ǂC ;t|NEY3&q㠱qPPhDxdttu".6)$$4""C|DC}oIq-k|[ݘQfF2$$<--GuėW.8cbz'nmk*23Go({?3a%22%B鞚]b< ,082|czh_\FQQYBZ/>ЍW^X*xӧA5זpicrl6カ :A ҃IY3&McMu7V ww7o4^^|890 W⋚tag|||:fB@ {wė{V2ⱱ },@⤥i7==Ϙ~~UAAFaqww.f4C3em<έ]RRόšAu77󤼬ǜ}97m:%%Md{zzs$gD4NT/xi/(BC#Utu}bUgx{vD'05ʂ{dbIUWkܖf1 yyeh_wD7q߹%kf<:sܙ3gs8qR|Љ'N:xPַ_ Z~db`niyUYsӏ^Wvc`c1-|RpwSR ҒƮ/j ԜVGDt Ef_!Xjʏښ|ߗJ;{lfGq.-`\> }nؤržPWTX6 7^SVZdaisS? `2Zٽ8b|OXdN5!1X-s BCC[' CyƄ1`OâJmW\~uvZYqJ0ahmuss-*JM˩Sg`}^ǎW<`X0Go/FvZj 6II`Eyc|\xCF^1 :ČR_<<[FLZ|~rSxKfS{C⋚7Ctt~'*$lf(w;I|9`jtUy(p n amocI=o0/ܪU[!Q S&L]mr__[xsoȅ ¶W]9?1ŵ .ip<1$U^)eo|1ڗW||}д.DтN:6 _£$$A1 a lF\Xldz݂1%Æ}ףcSSGI:hoł0;n.skoXXDO7ʹE5ܼh+ʛgNUrs77 xxx7\[|+>fQ`EBghdD 3p bhK2NGaL^dz _d׀;L=dKcIL"co Ulb1D$/zpi_X-HO+N1$u-m+gϜKJ.TYeǙ쪪lN0FpqB6K|b>΂7.¢_`J|\ʈ}C?jI/ đvF')) _hdޗcV3Ciӈ/.r{>DKelD\cV_//oށ!c5xy{D .3*+Z}}##y]\j >**h1br92z:x׾%`cPu  }̢ܙQXA Mdd,K&/D}c!#"~g;&#<_9Ed;uTVfs X/3!&* 0h/X? b$`ʔr#"@Ea@ lVI/* Zl^1 ,x-ا1`rҤ{svv3dcU Ʃhܺ`Y0:|@zb'(g'b-c2Θq˟>fjQ z;uJ&ex@l~_65b;5d1IquR͜ hk""xA\lb^n_EQa|Y/+Wr_G9G`P)T8=5 *ϳ}C*ڗaZΝ;/DP[LnnٳϞ~ibL[}:0?Ŷ%|9uV ̞gbnfݢ{]Ko5GښǻI8_/Eyyiɓ;43w]dM6dp6s^N>Gӧϐܹ 6aOǞ8q̙B*ǿIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/starting/starting.html000066400000000000000000000071131506652756400244000ustar00rootroot00000000000000 Yoshimi User Manual ~ Starting

    Getting Started

    The virtual keyboard window

    The first time you run Yoshimi you will see the main window (shown on the index page) and also this virtual keyboard to the right.

    If all has gone well, clicking on one of the keys should immediately produce sound, and if there was a MIDI keyboard plugged in that should also have been recognised and be playable. The virtual and real keyboards work quite independently, although things can get a bit confused if both are on the same note!

    If the VU meters are showing activity but there is no sound output, this may actually be as simple as the system volume control being switched off or set to zero.

    Failing that, you should look at the Jack and Alsa tabs in Settings. On a first time start you should see Alsa being set for MIDI and Jack for audio. If neither Jack nor Alsa has audio selection checked, set the one you want, save settings, close and restart Yoshimi. If the problem persists, then either there isn't a valid audio backend, or something else is blocking Yoshimi.

    The commonest problem with current Linux installations is interference from Pulse Audio. This will grab all sound devices and block anything else from reaching them. There is a program, pavucontrol, that can be used to disable connection to individual devices, thus freeing them up for your use. Alternatively, for a dedicated music machine it may be better to delete the Pulse Audio sound server.

    While Pulse Audio works well in a mixed desktop environment it is comparatively slow and not suitable for dedicated quality audio generation where time, i.e. latency, is critical.

    divider Keyboard layout

    Provided the virtual keyboard window has focus, key presses will also produce sound. The layout is shown here for the standard QWERTY keyboard.

    You can operate the various controls with a mouse at the same time as playing on a keyboard. Some of the controls are real-time i.e. take immediate effect, while others only take effect on the next note played.

    To the left of the keys, there is a slider for pitch bend. Unlike a real bend control this doesn't spring back when you release it, however, right-clicking the control will return it to the centred position.

    Alongside and underneath the keys is a spinbox to select the channel to send to. All parts listening on that channel will respond.

    Next is a slider to set the velocity of notes being played, and then a rotary control to add a randomising element to make it sound more interesting.

    You then have a counter to decide what octave to centre on, immediately followed by independent octave shifts for the key rows.

    After the usual window closing button, there is a menu for selecting which MIDI CC (continuous controller), the final slider will emulate.

    Next (Navigation, Controls, Defaults)

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/sub/000077500000000000000000000000001506652756400206135ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/sub/images/000077500000000000000000000000001506652756400220605ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/sub/images/sub.png000066400000000000000000003365401506652756400233720ustar00rootroot00000000000000PNG  IHDRmosBITO IDATxw|ϔnz%)J Tyl<bCYHA)"]Z(!@zmfN1ɺ$͒8_s;wVu1uE5645S&˭H:,,,,,,,,,,)7 ^xk}\|YAv,,,,,,,,,, $QN>uB <0p[T7)9 ȾUQ 6~_T^L8IRϼ?3sŻzz6%?/nDyVR\ѰׄܢFiPu w>nȐ^ԤX&Zj> yOuwEH0ʘqB{"ٜ-+{M).(5HܹS#ҳ೷l iz?4^p!5çRn069ϟ$Iz/(wG fzl0 =KQ/MI o0~p Ϙ=iS4E3$Iv*= 6lghCEܢ)ppldx@oi+X&zϡ+`/Z[([+Ro|SG^1gKGdO%$ec1𹫷7gT1>`OckweTYUcYUceM,ZYXXz WX^_Qu5|{{ ^a s[8sS:{l~:߮?7ڹ:Evi\:'j0p^㡮Z8.rpA5.^fJ.]V[ER&yIj჻#|Y#y>eqC>߃ |j3a.0E1p'v)|yŵL/~<ŏg`󆘨A]VD1:"lX=cنEN*⭪:B%)fholXGp?>~s3SJlmmxl騃ڧ&@Cc3bWF JHWkS Ə50 ?$ wqʔu'?3 0/s18;+0ة|FgowO H"v閯Od#W(~'[Z ;V_QTQ40{1h5o~H[K7ڴ.4IIoIYR GمWsxG  $+5CWgqIDҾÂBBݸw"9AbFM ʪxiuܩ'.f4~4VJ`B $AR4sinW-M1b0A .ȩPN$Pit MsW2wl8`RDsŔ[,)C;I1'ꗐsFG@zv\~6Bn/եeyFxI;f/I$UA"b'[4n&eiIhF_\?]k{{k"Nخ6FVqgGP,;/|&N0h:Ӌ'< WTPVv(rꝲ+I<9V^Ȝ6&4 ?/^G 5S/.#NBRP\ް%fAJ 6QE K߷'VNQɃSiu sfOt5Bݼ0f3} sMSf,O2U]VD㭍i;bO]}mc8 +"",=-JRL&Jޢf"T4{I1(0g]$eiȠW y=`\d͌b9}yC,WeK+N~nB z⠳ YUu2 jh꫸ gTk:+vQ`&t~֢.-\e,,:vuҮIZj3_`)N%\ak锥,,|뒞]C{1Td: o s!mV8=x#29LXnsM |^|VO1AAݜDAho"-t:C#uNc~i&kݜl_xjڥkr+;k9EC<&Z=3Kd 1j 0Z6+5LH rtRS/)BhÄppԴ<)8._ˊhWM-ߜ4;-v*B]O n0pyѱ<L51ga<6",HH.r0VQ(Atʢil\j`k"ߖqI/djYTMӊH`a'(BQ@V4yw~Vk,2g ߇{rmj-80:YۥY' :D3Ms`y\1)upFeB$RohjDh+9~xp IMCsI$!PPv6ڎIE$u-}w|PIqN좁"M-nN!ܜD3DžRkLyI՚53AMFmIe%iM.0s\UH|gvRyyU"EvhW f0?ĘY [Y\!a@WWMqȩlϟ&u3r;ɔLcYx;9Y5zCk1Aֿ`4\o(3h+:VcN+׮EvZ=nXd6s$BW op8@$V\Qv{[+1e{YW#^,+uW ̯-;^ӟ5/%%rORfVg5ڍ}$iH[[ci#x,QZW'`\dК%c; a`gVH]aDfZ;P&Ge8 IcBaM.wdjJ[\Q8XYn:NoLخ@v_Hs">AӊZ]Ԡ9[:BӴR`W֬ \*3,LJNlD3WY]"7+eW QR`rsʚթYwʆy&)e#13ԑYnbRTؖ/3r+[?;SiZz9^zzxL y˞{{̺L˺,+ঃ˱G|@Q\3DQd4MçqZT:opGwIB:RB+v hq ݙtyF.|H?O/֣F\"E3p9@@\aԨEF!nQ}O\42ĥ,v\DQna(IR睿߾ŻLiXeWNlW( )ERYoliߜ&lCLI)OXH0rۨ!~Ʒzsse gx$ ܢ$i\`|EchJxk%x9<ŶUGJi)]P˄559 8_1ЙYIeP&&HĜ-u0_a. XTR܎kʲQENȑ6ݜE >{=qy n^;̵2BEy/7?בC|Q}|=.&5U8.=ڥE,,s#&HA|'QbB-GfwMYXXX'5 [w^izi ;9TەTގ̖9{~Kh:Jb$뗓5]5(her+9Ri` jhR~eCmmx9ş1t0a2rp^CRz2޺XXXXNTjDӓ3!`v~3Kʲ<*j-j`<9*NV: eWX!%4J\`8  '4Ef,,,,,,,,,, B5z zaaaaaaaaaay@Pu^gгϰ] 1DhpAC#(t_򀐩:k29Baaaaaaaaaay@T5jN/À cGEE=XXu/_Z<-,_|TpEP.&%%u :<b%l baaߨuJVsxSie{ciiİaC9/^|-"`aaaaaaÆR(N#z^];XXcED|z,,,,,,"$jÀ")bpf,,}ţDeeKkEmmm Я_?8$I8p(Xt)k6,,lT*9O<񄣣1 \.ήLr SL\@xb&΁ رc\.#*&&F$YҩSLiT՝;wΨv/+ ˃Ŵ!:u# ÜeBZѤUWWgddP(lؔE"QLLZz0IuVYYND~~~aaaiii?R… {P,}OY]a3%Irwg3\F뚱<V"..,X ?.ɖ,YvZcĽ{23fh...FT2!cǎutt4NQԙ3g*++ i&WWWϟ?_[[aoiӦ988TWW޽f5uTHdYQ .ک͈zS_i=).ee٩T.*N=Xl߿`0lذ!::rBvg}Lqqq8k&MΚRrr===W}=֭[}D">|x@@@^^w}lݺ>77?ׯ[ovѲ>>Ludm9+qtÆ%9{֣^0aBA 8Ç˸%IrcƌI&mڴi֭nnnLVoN[fҥK& ÄBo믧:ujܸqu(~MQ0zRNHnSeeKG-Y4} |,;WWc4P϶b114\ZUUlfdvД)4MPT/FĘBrvv F0eԩf27//BӴ``\Ff3|KHHd...]Hp[noǕ5(;"oW8'!JHϰٳkE]]B\s3p`Pd$d_ti&ߨQnh-7ֆOw1>滸35 rTUyD-\hco\ORVNBiZZґ#^^~TԨE s$C.z{7vmM\\r.GgϞEQtA?gΜ(aɒ%O>}t.{n֭vz-rz}AAӇ :.//5kVbb"3Mxx5l̠.gpOn80P9~%ҿ3 d2PHn2(19*Us\'d㔛BƘj5~Ν!}ﯼq%#! @ ?8L |B3gYcH IDAT<Ʒ-[f1 KJJoۻ2(,,??? :Ϧ"qFIˣKTfCpgG! ӝ^a{7q$`i0<9&& rZ@z|cځ4 <.WM^gԩzu#0n)3-dpHȻqq'-[֭\]NE@mi0mڔuOq.]-{`.(IҴ |Ϝ9'NDQtҤIΝ3><=v˗ǎke^LGGmmmfffffmpppxx糳jWd>?`„cT/.KT][ |>1BzO`*6(xporOPS#~ _,!lK116 ;to [ѣpioo7vq^leL2p86mz'n#@#JZ#$b/<UzhnhOLY֝[]L 0!ʕ\uKKeNΠI._6'Эm[O;p_u劤"?#ҋ0,Y`/FGG3=r<..O剉Ǐ7Mnݺ3,PUU $$ a DDD ¸[[۠ k(J 33APR[ UEh+W\Q~2摫!$$:XW'Pt(S@u9w95+W\8M}+fT*At\a1a```iiiUUUb;"I0 ֲV~=BBBJJJH41l4zGWմ`(eg/dgɿNQqʕLiұcL^ .{q^E'\iA`}[l/@eNiՃ~=4H;fSN@XX/xxx0SpS&NhyA?x{{3+СΝ;:nȐ!dldDasYwZ;th`l{Fܴb]߮B1yf-HUU,DQ?QQ,G&6tҊcOLL̻ᄏdɒ>@"颳<&&ET&$55 A@@@㤖1 +|5c\.W*2;1HRvBI t<:a_(At@i(>={RO~%d$w\DS)S\)yAPq,D̚a;r?9zMzz:M>>>ǏW(7n%KkȸuVjjj5k\~ ::z(M-όFnnn8ǖ6'qtԹj1b[__T$`A֖`:[]?Hx11/Tk mpNN!>0Ω(*y{+WMMM;w4]f:wȑ߿o_{ /^p8֭c /cǎ/2;;6''gmiG"tzoٲ?޹sgzzz@@@mmmrrnooۥn4ZHZӢ7>ҚPg^^_J4;!aݻLY(5 p&ܶɶt2")/'z{O=f9ɓ'X"22񲲲~  ėdƴww7| rK. icfN qn?1N0b~P :nnnL6K]˅R)uM9|>) ef:FD`V{Ah8r'0PS"P49 R)u ##ܱ!B-ysf[m뭷Uj'NJKKJLLtK.e.\8jԨ[nd2GGH㟣w}7o^``Q5ˣ\iQ8(4'e\!C5j^^Ç&;7z\*3C-F1"f"r]q1xH ' \|}çMu}XX|||Vwaivi'OlpSQ:Fi,MHJrnjbcKZ{qӌdJWW/` [JJrVq%K*564Ti [m qj$JHD̛W":> 7F _~>,h^nݡCh^ <====={UV8>qSa[F!(wtyľV@ܜu LZrp[s*LN.JMͿy!6erՃm'W "Gy6_?43SZ]]vgK/û䆲e79n=0qpϚU#L}|>>q&Nl0'|N$#=jTQ՘<"hׯ_rObn(G;FU45Myg v- J]g] vfL;LSOͅram4Ə/LIiJQ FEܿɱ{v &**8bx˖-@S>R7 'i0\k,,}Aի(0 tP;@9pJXXX<\ Ҁ-RG474?{r SyF @,v +$ģG'ED0o6sfӧujKJePdf# @\\\\\SO=m 4MZ3gݸqO>/;zJ]BQTrr)e3c^PͨA/)ϼpj1#Ghyi'o*^L]5 ---555IIIbxڴii=4MdggkZpVje2Yqq@  · *qB҃KKIP7Qp [wʒAM<NOպh J~}YSwvڎ&hrRs$lj.> jK8FnSM**L5M\[_&,~qL cBQ*Am  (:y{l l*HNVJEa8XQa3x0ػzsV46@yVV؄ LO-&xm4ع.8z>q@K'=-?] 9xr|o'2ѓ'8iT_߻D1Yw[?ݱkgu'C\.ۻeU=xiEyٞ]ߧ$Rܳgϫ0أVMf̜vW0nĆsgNNz3Gisbh 2o]K˥7_`)8/گ⼛."W77{{e KZTQqFJ/F99\=!<~)>bIDi.e]uҳW﷞˄6[s1]΍]n \ay۷?pŃ?dT3kjZZDEM!BMikQyll52柤hJwo_M,,,֐[~0w[>5J\\ܐ!CS;#xs/? uRHP<7Ϟ_>( ݻw+pN(jY+>ۻږ~OδZWWw˘;8U*lcM׮]c`A͘5n$0Z98<ׯ]|i>}#4oq# zJ^ѵFi4vYWN|!͘5U^^G*n&Dž"K2l{*7޸_z>V㘅 *HPaڌY^^aVsg*+*LÛ0PݦQ@{!\bڌY^YyL@Qt _?Un;7nRvYN;hPvBgAPTVOօƊ8z S}0Ow:=4b%ᱱ d2方bcc1h3Ӵ|xeœ N7( (hzF5v˜ٳ Qaj @JJ5u ߿|{#k<Z-ZdjZAn־]_M5o9Ff?1@@MMͽ&J\h-[&/_P(ǽd9뻌PRRb]Gqe奥}h=)iI&|TjlԠ=_q⊕La@ooE>,pwrO\O؅cfvIɆMG(~%7EϸF񑢾~i |(:h CyVlyo MQ\>r O?~7k &hƒg?P/_t&{oz~ꩧN:JQ ғ-)Lq2V?て&|ZBӀc(:8F4EEK6ܹӦfe "##ې_rqrr7nXܣU@٣\a N&gH/N޷i-2P+[88fjsrdv4HuuuJJV9r$(W_ i^ R)SXocG,qhf͚^rdQQQek[z@eP EQ hښ0|7\pqvm,//?zhLL I7oܵkw}ssS(O\ܩic4EE4Lc8tO?xgϞ۶mX,WT׿~Ϟ=֏^~0?Hvmٲ`0ŋpp 6nܘ}ԩO> ),,4GqqM7\zf4Eg̊e1iFS__TT=_[ZZT*{%XNYqpM?c*ksr^m5q<^/TJkRhuz Aq9Nb! Moo5y[dSzNFFߋzJ#f07Bv=.]0J.LHE=6a즨3Ajj;{Ǟ`j&=(Ƚm1x ˖1'҅i`cӨyqsl|8{7 ?/2Gllذaĉ[C999/@TQ@(s diV gF(Y+W^}'@'&&J$ 8 jkklmm'Oloܸ!  srr@TY:F9FB!`i˦ݾ}{۷ogo_~nݺ_~ ehnni2eJZZZqqرclWr<11*..-]3 A|G|>qy-;wO<īرc햳`z|>ɒ%0~.n^K]ي. + ǿgu:]SSa~~~8880+YITBϡIBAQ?腦 b@@;cqqijuzC[E15 IXzp*a;<+zV.7w'xN6T~oi K ~7qZ0ᗸoۻZ\Q?xF;ʘ/qt(vhCh# 8a̘1׿6n`x\!M5c(a8a8rp_k־P ?SUUe!fbCKK?SN555m۶СCsO>D">|x۶mLu֥lڴ%PQ[ 9NMcVBs8Gq 1ǰ.M;}رc?\իT*9M_K.}G抢طo_aaڻ̅_t BCC $$n߾-J… qqq(0$גazoh۷]oBB:t(**WcD=ǖF1\l4EEpc|.M+//o1((qbܹB#d\.766vʔ)/ڵky˗wZ<oޱK8??cƌsR9 M(2L ;sÇo߾e]px...VT((fcck04M#(vRI7 r78b.&ns0(*d2Yuu5dgg }9sA5$$0/paaȶj۞Bc Ӵ3! 8{2힘>B $!UH %F;n""FSE` EQEc[ӹ;v/i0'… lubG*ܴ1&8FQ;AD1w#Fر~SWWsf߿̙kkkJ%T*jJKKz~q~BKK˻ᆱhD"͛<2*Zwם^9u쐴%lАNNV嘊57WaVpBOQ$Aw3\!쌙6 _AQCo Aki@h(.J4="jL~ʩAC]0w*=i=O~5] WZcNP~0&XilTpqԲ~p @`؋t5trrrvv{_Is9sD"FڢEBayyy^^̙3Muj?U`h0LC}ٸq3ֺБd|h4ihP]TZO?P(bcc}'|Ѵu~R=3>>>βe\[wÇSlD)#Ȕ#͖6$]Ӱ T֭(h`h^gK;ZܐB_~'իW?3/BLLLmmmkkL'|뭷rիW aEɓ|^xa̙ ";;gϞ__^oELL{キeB1l«")i4vުUBG9ta.\H$?xWa`XXXAAAAAA$T*;|ZyٙLchkU޳rD*qZvYX_aG???H$/bTVVv& Hf<C)fכ#A%~2qpHEspCAaahaFHRN ^[7mh&#x;rvN G(ZNLn_U0D2(*+KQn"\rWMA1 jKȨX*Ė>4!;Xv-EQ;i}{lI&]r%33ի͝6mZnn.N 7LӴ6^>Sҽ_~'xb)))SNe ܹ344$[ZZ\nNbG+ye˖8;HHHGdͩ@@Q(M4tip`(0zNinl̔N7EFFX?w &$$OK5+WffffggLG}tڴizR22lʕ+rŋϜ9E^oEXXػoc@%ƼN8ܹs+Wd &&fݺunK.moog9fg^(uMMR8U]~*HmGc68X8@0e6ZXXعs|>+읰$48iCp\`Eqaz}d}oS(w>mtS}]F9qcAÝůq<##Lll,eڵc__;= \]tttOoOY\5;!!!f@RG\.w-u[=-o[&O F"e$F*eZ$DbR$Aa $I -De/rڤJ@m7KbhaeFq~Z'~}kyp'|Ҟ: kwGG&!4槟~ꫯY9&))ŋj:**)'''((ȅ8}^cO>}k֬Yzɓ',Xkkt7%ǗLR~|W⇏y4 2f2+EIFfhQFKcK{MMl}П%7Ѱ# 7$6?#clq PMJJ+9I 14&ٳkжw%%%Nz!" |9n X1t~r(a-M60 lH{=A$ɮ %mXn ??40NT]sg=`r\U~o cccYYbbɓ'.\]u>qKzzz-og6Mz/"Etܜsϝdw66m9a VƐjcZ]VVW.$o27xvMu:aJZEQ\OP(̀aMb8!m$E14P]3yL'J jA:h^GkNh4$_@ʕHQM3Z&ϔ9?[j`rbfP"i?DvK Y( PN*&nAR|7x7SO1h7JpN/gG\줙4iݻz!?^bGd2m^^޻ロ,JWLzR\駟~grss|ɀ:kָEчVlڸvPqtּ[*_i)iokpxMפX,~vKkf-<ddd>|b0 Sw>*.Y |vfT&322ޙGhISOm߾ 0Lmuem֭w00UT a^Jr̙6L @ДԸĤ!؄hjU1(IʸMQB0 `׸%Sz(!6L" EGTNUT]Ġ&qه VU5ə^œ9s~ b;U6~W1Dy?~ivv=j=qw}uL2†[͵GkZ۷ogߚKJJN8QUU>|q[CBذaÊ+\wu׆ F8UD L:DP(:u F xH!R4N$>tj.tr󝧾ˬ CQf0a.|;f(&)( ^28FÆ鷞)g*ORS߽J9s;]>bHnθo{VS; &O@@=ܳkhѢn^̺jի1 sd(EiӦM2Z X,JCCCFQP;cX1 MMMmmmfb|@RFcwjqm(}ʡ5%k=KNgNeMy&C4'Ul֎\fm.hFRVj4h.Ȼی:wrܾAYG)g*~cgWZ]WW0L=z&q[x\\\\\ܐ^eDêyP A`ZTU;C}s[m=CsU|OL4MZ@> B!t&FoxӰHf:Zi1gn&繟3;rϯg_q<㌮Ǵ9_=q0fh%Cawk.KxgH 5Ff)SxӶ)u_}}EPڦIM 4 CQ4 Xl5 --4E6/AA]۫.gоOSh㧗M\r¦ C1ٝnkK[N+O;g` y(ׯ_ B=S[#\@( (_q@Pt}}7*WAv"(bifP, $pa&m6Cklj0 4Pu!{r)A4;rկWxVc^([*UTGoUZ\<:v߻{^zLc&#+444ٳ fkFnIFJ=\ͽe 4p&M3kdܜqw乗~zkBm#&c<>A36l2 zf3Mp3𜐺4~x tC挻;&ϻѥB!<ɛǠ&4ZΝ={N2ztK22mڴ͛7;"kqYB88|D@|0 {۪ޕ^T^: ׯm3gO f6iiiaah.+pdZvC"\r0t&"(==5G$#>>>l\~=,Pd 6b9q&IS}W0䓇WaIVsɄ䔈ҧZu(O=³ΓOb1>*qlDڱc;FtZFCqSf;܉ IDAT1u]챽)G=K p3(n y ;|t /Ϸ6>q"D* bd4unvv|9O> ENdtwޡkܫjF zxEXa|GhYaTs4+FޙH̜9iw=ENd<1-06nȊ:Ƣ8Ig@nG, $ 3 1H_:lʔݻ5+ rll-r` 'Bjt:]߅F &fF{W,!08GD[_cǚˁqi#_ttܹiij1Bxco;(0UMUj>7v}9FZ?9 . Vd)9 :5lTCkk}AASij3>>L;ZtPOƃ53!8A < ̌iA`1B98! Ü={R.Ϝ9S.988m q 8Ԗ<8/EN>lC[T/D .{ګcW_,Bs=o655ڵ(--u988 4CkZf(A lo~=?+ksFw+\W\|_neP./ENCGG~VQ KLLKZFk &%͞#4Eә'NvmmIIkݞiuD1u{S.~F/;2?tҧ~ʕ+=ܦMYO9z2g 6QirPܼ9vڴVG' \ҏ}4zTC[‡{o('wμ~u/Q8 Űլzȑ_>cyN8Ψ-*zjV^="ptgXps`(* PQbQT4kV}v31RNI1jYYf>zhZrrCbf&V/_|G.(hW˲E2Yņ+G`1e^Si8ij KNVO<@9l7L;_g?VۿH`ttB4ublžɳg#(!?{,˓<|}22~~ERS]ھ._r뭎{kNSgmmYYUUn Ɗ!R|DY3oVܛe\@,H$BanbnV'PVRqaQN_t[o-{i {!񊀀C[˩۫_ildMa֭ ~.,<2_ߨ; Nl: ȑ} ڏyD6aBPL̮^q:f"Ѕ%%P]Xxe&SRck~ov4o^uAcVgKlڴ}BBUD+i-[a?^reVWSRJ/pluA7o5DeuľY}P?'cF71hvf@ϞMж]/|/#SRּ6Ĥ} ۶<^M7kW-FշK_" :ZfZ|]|39{m׬ٺaEEOwͬIز2;'J~^H9n<C[VkSAaIIAON}>L!D~ VZW7!,, 2ҨղIZrfd?{~$*UҬY4M989z kYҀ= H9 G4-@-2iKd9FL\SX*1#C^(Єe`@"W/r}{;\%ß~zx۶? HsUrZ@d+G >~lv!"`h u}|o]pG">>ck O֭-UU͕l^E* k/_Q@ĤIdVx;5EE3f .~989sb())I&T۷}:sv~DtqDb! 6\@R 6l֙}2￿ {9w teCsC\b MfrH&X~F ~/~)ꬅ 3+KΟyй }۶M;W$Yg*v-'nw:%Q%Q8xfѢEG9ta.\H$?8m߾=""owQy F ŃW80:_>'-UU,'N ZN{|ҥ~]+b$Vk7jUAAkk/[h'o67?~k._LVtH&c=@%ַDE17ח:x?ii{XT A11͕V9bn%[|K{~ߗT"Lsppx-(Θ1cFKppGq\p'cIa|YҖ,1ta?*߽; _ 8cU6a³;vge[ݬDhB?AP}{s֮( J났ZuJkg>5Yf%ϛ%?GE`ᣏVOe˖M;;VŢG mR߱/!D6×<;쳤bTAAؑw8O$Z={ع|wgEq@P̓lB@ xPc :?0cǎ&B8j{LJ0! "k@ r0ǸEyPpp kf[XFc%qyB3A1\p%ǠcIC$ff @Mq[A1( 6]lhjj l6]2Q3988888F-Vۢ׵#ѣC!!9913`NJ!c1U 9#-(C'@($yyi.ǨG!3\j+.64wpm5aHp%VVV]988ii>yg\^9'(ݹYÃA dўSS.xrrbc32=n_~ Vܰ2j Žg0b f%ln " _91`A.JPkk!d.&6QXX8uח< 11rԩw'Λr/W]l5v?AGZˁ 0`KK7}:`^jjE}|PȲ2@ &U*,* \ T}="`!!Q_g7Ac;yg㥲￿; CYYG}x{JKKO>=D%K UAi6J!#4!O.>y0oi +W*&!D]kQ$͝T^|^7,,>3AQ 0 <q t &QJejQ X…ȩSIz5aij*9sƤ^"ɲs$1Ӧnڱ2ey=xQl%͝K;$O 3Wœ ?M^zƍn6o]vum?F%N| C/NÏ HǓ&'ihx!!TG Cb< +Bg}AB"8@Lbaǣ}|lN' ( 0@ R*V1u5l\NԠNX3A!ׯʙv)ELJGFд11.nre=Z,3m;MW3zN7%"0ˁm?[u55QmmJ14m))A\ ښ VAE""06UUWi ۱cc;/\Ax ϏȐxJ֭c6lذk׮kj={lsssBBBRRRGGٳgkjjo\8}tݻ׮] HIII}}ZxD";wݶ֦$iiiiii?UVܹn3 sΥK666ׇ_t'33. Ilx{[3|ȃ&.9w.NOٷ1IP};LZ"RR"Q3ŧN}]+,dϜ '2>#c;۽XS-6eދ( 8azN={2VL0$ymO{imK˔Km{oBxvA@&֬y㏉4j4U=}{ĉ{;)>tv_V!Mstp$g:"iE?{6*O| 5BS{L:,k0_D%LP7Z0h..FA.P܌WWKfJӟ< 8Tz ȶ6ǕJGT*`煇.ZsѠBa7R(o`V" l"\>TWm歿-t>FlNP[RђԷvA྾@L3gfv\P 1Hpd~d$`hvEu:"56 OSz=/$jmI,׮16DdSf xs=_vN{g|||"##ye˖-Z[W677M۷^ð]vL8ϟgdzy:񜜜999_jUVV֮]$Ijj޽{ԁ>'8j#0t 7ݤNIa4ϯ|!IDxo-ʚn]pӲeCr=Q(PяB_?'wUcL3t O6@[_F za^?L.20V6h S(  w㖲2ke%?:=diUslA Mď&g/@KJ%Rh5qTZd2"8ZSx*JLN&L}|\T[**luuh[m-BC=ËF @/w6u'H$3g3lZNWٞl͕̘bt0Akǔkk췽aS^cb@LBB,jA\>cȸ?^ju]]0w`+V<#˖-i"aAqk׮( ð^:w[:̇Z`;l"J׬Yf͚⸸6>p>8.%")ɔw$ϙmm%wT si, g;Ap\\Seeu^^M7 ! _@]q[z=\|ičuN@gi1n;Wreމ8p2 -,`vϖI׹(I"1ƘWI]>4hpňAQC06iS*liZf4z{aL.gDրnܾ166i`҉)5g*wPKEikh%\nv*( 3cf9+vCjiJ11$ Tk+0=Ek췽V ؓPNS86urf ;c!0 ki;v0 ÞqvZR͘g̙3O>ihhdO޼y3{>!!A*T*MLL,--oUfQgm$zd˗ h޷n ;::U^al']4aH_^$-rp<VW;N7y{*zTjd'5:)B'wN$IZFk߿dS߆Ϛ5fY՗  4h?Y](@BU`-(ʴ@"bGxUKJӦ/]VUaJ%5v>1HbGKy몪*p 9n0s3Ð퀢R鴇80V+k2}J__l0b1M^vCaϞ=lDNg(++ 64RyU~^t]eɒ%BXt\XX%^/,,\~gɈp\,b#kk+Ww |ybf?9xrű+p[;wg+)K&Ν1iR+C[RwZv`&,Q=.%߾6a_/E ޿{ ״mo*1~D?,tWq_#VzM`moU'7~u%ByΚF};p&0EbIZ٬ Hl+WPZ]N;x\\LL=7a>>PZ ̞m뷋P AQJ3c ݥn#?"uy^H('=7EiL$ R S`%zp$HO eW;aa^|tl )֜Ot@J%'{D@VSc0q\ @k4Rdb(5؎02:nVܹsgϾ`< /S[[ļ{[lQ(wߴi6o;D^t]%)) ð?bKMM_LYXڭ80|ysaho_#n)*DScoh(@ TǺ -Y2i|dTjꢮe߾ys",9.9wj6O[=FR ~n,Fn ,o-<}JPAUMp2Xlr?;_xAz=ᙹ(;fùfL#y}X!жy7iWu']@@ 15U?B!܍Ip??T )ր`&#65PL&Ιckh`V=iWU*./$ߵ ;65T ̞M673]&.r#BpDbd2ܥb'ZQ@kwx f2zG۝|֗ esښh11HT*;V_XPsIo-+RM]v֚> yl^AAj\;b !DzȞbC"lڴܹsuuulw}>yg(@\\!ڵkkٓxMSLinn;ǯ[ҥK<@ff 6mN8@#[ҬYIfQSv_[ z݆<vֳ*20u ɳg]|S>,|OmnF0kNs68%%=1qԓ;vO$f+<%׶EvTd:54=1SNt[ Ǿ9"QmglwZ}Ά_1[Dt{KaɆodnIb&]-=FCJke%*h8gCf>p7|H TsH<#I o8VirV$z%ƕ_V ~;1spDyk4wdx|_tEȇË )Oi{Cod(--+Wpf D7nYkD|g)68ܧ{jns W еm_ms&c˅~>qAęWJ${ crȰ9)ofP߱cu Ac<A ;Q=1~R*LmqV*UKf88rYkTk{W(G жp@}z[ᚖ$#cd`!3%"" ov``-uuu/..^jիW۷m۶=C}K/t7|-[f6>}Ǐ*ɫo\RR>>ۭ Wkxݺu.B%75+:Ɠ\@l M%%Fd3  eP؀+8'ak`u;ѮeHP[k7Z5bm6 P>' ||AA!i02hSSG=vN̐۲eKYYŋ+@YY믿 э'ɓ'oذݬA'pApBIcGǥᆱƭ63g§NMaor 2“[-L1Erc>r4]^=w`KS@s|A_4LyQ;{]W$z/V,KreŦPB}(? L`llB16M\"ɒev;I+*>/Zμwf?wߙQ*^k֬u#$E(8B"QW5wX,WBBlVkwwנeA9իTE69{.6cxwʃ!g%“A馜y 󶢺46 {dIJ520ִ|cbŎ{^K_ Uڽ`P{o!;rPQ!ʓ *0ʨmu@Pa1)FbR"%YWmghq0IJ988VXi4<L} {X 8*cg͠p]` a`MUFmCZ=v E|M P(tXԔm"i{bILqݺu .X,}L&{`۶mǎ7;o9s_ooo ?7wc=y=lݺ(..EZJ,{_xy@2 iw!Q E(ɟ9'49o7B(pyEEϏ:ݱcG>}ojͮ]6gڑ,x U07wΊdžb8{ZoxĜ=S?zg`ʙ۸%F"',=1;>, oڜ0>[>hɘ}-i>>JVi߲e:n:Ma}ZED|J@DSNmi}ӹE3J&sUg~D]Ypcɝ ^ht WB zhWsuJJB u'"">p !svhWKuJJ’9PaR~;BiY9SǡV$Sl`/f*,,駟^z}l6|UWy iii|5\kkkSSS:ܶmۅ jO< ,xg x>cǎܹl6KLL\fǰ8nw!'YH k_$;s&&&&TtM2Vk+}Jw |ӧZ~@cޢ^0\y4i ӓ|g8^t3칈R`(Xڸ*'m}iVF 'j׼`.f~;b2 *~9[wlvZ,P(V(111qӦI7¹cSO=)| qv7S߭~{rT, x5tИԔ%a.[;LmvloikKTql㩽мȾ#}gPF%\fַ53" A:c)BItfRbBǓahlkkVnL $J%KHIJ"d2Oi|1 5ogڔq)m e^˯"oħzj^{mo x._I0B0\cBe$E[.fqL@!RYKIM}湗sܚ]“}U̙_ե_M|x >VѮ74wL,vp);ߌmo=Hb:ϟ?~#)D,:]ۙ3LOreT0uuJ_!LRqȵ׭/>K}EEEgNY#SrS ӤpX1gcf,En=vڕ7a.3شPgY텓AaPD?O'ZT%O.Idmn{;Ŧ%_. K,Sf L䩇q O>|l&# !4=`⼼0Je4 =g=r)@ :ݞ>/y]r И:ͧFdt`-MSE' Lb3(TQI M6.4{NXl:Cw̜rڻcbGկo_v՘{=OL^הOP]P5m2%CX/,NԨ+BqpX_kuxF \FERBB0^3\?$C3L\|┌-( p9DWa2dD i|?CA޴1tC.`:etu-[Ⱦg-ǟ}k~6G]kgh۝$Iv'i[= zA+~_UyϽg7Q))c=%4nMII 5@hlKv/ T0h}ak8SGD ߶!c =uÖ\K9!. t))Öhacy<4p⧕W/]T l=yq f\MVt^Tlƌ"25-=|@ +gO 8@2A2IZpEh8&bӲ-7 ! .~%{p `hfi/kT zjWT`0M-e1״|[0]]~ZS9_ĺ/1tZap#p qX]F+M39S|Zw *?|Wy97*5=Ix]ed:srgb{@{G:z|dk; &.~XKamV 5` ʨ$0h| ot~)ӥi8Y_}vqJ^N_FƦBq q撼)m S۬ gDLL:eR(J.$E <58'Ia1 iBp E`"heY63{%y.u2=] ٬TTw(soϜUkm`~Yz8.aX_dS'Uۥ>%Ӂj "WW. &}Ff֨*D/?~Wszzb b< l ZM;&8A 6@TbY[H»w|g H`Y U :qB-=3P?F4Nvn^cÅ4O\r+k6~c0.ptX?oZ_jjD9gm_WŁ_&Y&Sܚ@I@r4uJ<8bqZ0Da<۳oT/~$)BA`eR RTn(gt* $6H3q\ԣuF&:bR-:Df K }g8\  }n;a00 ߕK,0c p,G~Y]U9F4"fL*B 㺻tڎNMN5z .)uV2" vSWo^CD‘f3?-0խ0,6.0/P$q=y7. f[-Jʻw|geXXa) jS/ͅW!8cp8 tѫ T_p%\PʺJT6%uJVTL!_i}619%6>lN@/A7t[2(h1pь>r8aa Ͱh1-] oXLrvV' `CB,4p,+W({|CMK9t 0a#p2Ngd"Jvn3$$D0p ,ݾ*_.69AL(Ϟu(2='cދUqa ."&*:&mJf]m ǵ=`&i5rV>hI "LY_bfǸ\C2Ƞ8.2:F$r[`(GR٩iZ8 4 hG>!(ksT˔*!?x{!rE@Uv|-ǰN-O?&uj6jwR4CP}] s,1q$MLm tTU|>'H}zw(Ȩ؈hee9fush7g @#GGxo}d{h#Chh\2;?ɉP$ M mfv ma>~"hػ%4L5Эkm;o1Δ+62*:#+\SÅ@/A7ˤS&d, 0YN1DĈ$ݭ"0 ˲>J a|/?\nxXA aBX| rݣQ !:$;{wJ"M/yH❁ , Jڿ{d!rp 7L]\,9X sbsq|1,X`i:!%ŝ56_++' H,˱0,Ͱ/hpL(쟽z8sϚ:b7b8+7 p@>2LNxfNnhU ^ã pLx9%"2::&vzVi HM¶ /˜[%~ Y&2)?Hba\$IRXxY †fXuB}TWI?߄&o q!qXAo,MӼB!V$H$n В/ Vs>xuoq$ya`! 4hȠP*/?L{[+/>BBdR}-y,s D]cLBiE1G'U 1Es88q<-rr -^h@dX|/T:c[}ph(@`2Ф0pvQ`HeuQ8+ .Kt%7n 4q3As5%&...!>P55i%ftʤ bvt: ˣ.SdhͲAf;%yyp8OpBq.fXA9qN'-CpÓb6P $2{4ePTO?b|Bb{[+/>w 1Nzk!0u.ս-(fEmυǏNya iFU%*rPpY Ui6 /xN/T*bpZ ! 4j.U.h`(! e "Ћq0Cd\ tNY&t:ݶm۶nz!W F7nܸq˖-۷oonz .ٳgvSixx,' ñ 8\WDJ7܍|(@Z$IC3j幟ŝ`K֏omzJBq|k5d`KM=!TzZ[gfefIGXSGP <^i {) C*70M#' `YibOAܱ#J04r UEKtDC1041  "fR,r9"€|g [SM_dY^A8< ɸ%趝 %DL:G}WwqGYYl޽{}ݧ>믿v׿+4=d<… v=`mDv:QO?ˏ+YeYq n:>qX\!ݻpOf6aY%KEfd`GQ)=3VzA0('D.x51CϜ_1(g_x鹧Q3(:bMSKʏA9.@PozXzB*~-ķ q8Hf [!Ӽ詧͛74JsYPWt=ilkW$$TD%2eZX 2!aq B"q9rLi2A?6)0$Ig,eGdCMn m'J ,NE믿>}zXz&X,Gl)))wdžjh4ɧN>yd}}}llyB$Iȑ#z>;;{ԩ1r5kmVnٲoxhg+O b㐦?yCKG! =v ^#%-Auv?t.vdeL{\UM8;&V4\L, \ pלtp8hni8s#eQ$XI0'dtk5ԗm2tÄ!qqPV mb0h ,6M,~} 1œ媖~Ɓ(KGލuqwh6-AD)e)~())q """,,Lׯ_mmm7;.>XXL8c8 h1[l]zln}zN"^#CV'ONo^O?|~kMNX _z1$o~L9ZOQEu~ ~EiŅLQP@psZ 8BEVjwwht V>r%cD" >Q3(*4ޗpB9ts*C#/T{.AcBaD_ -K"C¢cPq(gjYhTl 2d_5堞9Qy"TULb9a{(:iΚ5_v tNY&2G}bZT~ܔ)S=d8zRT\~ҥK`Æ KOOWXqUWWWWI~7p zH$U㏷~{JL e΅PRjm?>xf;W]{cn~!re۬a#p a4CSI\(ubb L< IDATn󇁰C{Q7kݺˎ!_9au3uwBɒ6tIdrF$Hsr$IFcZXmkn,;x1@9v4/sV( EN`EdQ%%={ORt5p,ݿ3g$Gik.=/nc3@$ C] X'~(346VRq(}ʶRudƱ;.%&JG5t+wKm;J ftʰ6mxYfjڦ_~o~衇y晈]v=C܏?Q3H_|a0LRWWVoGy2eJ{{{ww~gY,7$h=p›o=wʔ)o￯Rn馮7z+F\1S]IZ+ZV- f;:>>ߔȕV\. 6*.r:ͧ~{cښpD*cfhl6fs:M,t4vm:s_KΕWf]qp4?? 򺓡gJj.SCgOՅ:9Q8tP$)fvewlvhwuwhZX򃻷s DCo7={<}<99NFS˲;druDI6o8wq6Yx~ 2 DIkNBb =yLJJK_{!dܓ!5999999vDD3"XEqМk2Yͮ]~6565A!!"rڭVM .-\F#20ag$7j/'&'e&H2XbZVNu-zoDڼy-[F}x*z"L$2TTo{a@( it,3X2ӦEO2\ T$t]E(N1 ]NY&Cd??;g-AtʤFVbb(U*/ÓmD GӔ8KX\t3gN2\ ң|B~q\kscx8/YY6ptY?1/P#/ξ{sN&i;C9lJ5+2#ԗ_6?>v !4{v7bIɐ8cFhB?館7g\Ć?hI&=j HK3&&<5UV~,11r\c[N 2 DN46ߝw {z* `h/`#Re7;IpRvq!"SxJTνW_]sgKy95$$qƌKG$DfGF.z!]moyD(2=="L H֗4fɒ KCà-„ByjjX^^W d B"M׉3%?Q+w$@;2|9eǪ{<} B}Y(1 11Ek;ϟ<jHr:bP&GF&$DefFefzYwgGFcٳUU&i6S@"+ʘܸiFL εk4Ww7i42$ɒ$&BPKccC;3`$^{-mY[Zl@;|քD" %$$% 3PI L:eD舍 6^͝a@N \ $DfT /X,K d IrB&Seg奠-At/{F‘#GJKKY-**ZݻI"=#m,Ć?b(jdž ,3*j-߾}ssNo:usL&YYS3%׺a4RN;XtƯ~`&Mx,hAƍ7n88[fܹs{ȑ ^0,^t{t8Zߥh'(6qdž >4Ek Hadž ;6lGǾe1lFoݷiSCy?@,;w2Ԑz(@_Ni>[Seٿ}/#IgM c2c2QN±y~Df~YS㬩q^@pleiä6t]p$Ihu^F)Hy)g=t[16"M2A˸لׄ6K/b,qm۶ `iӦO?4;;oꫯ 9,ݻݟznNB] HI˻qׇpc[i֔q-= Cメp믯:pݽcÆydIZp{>k bpJGQz^z3\q]OqPd[UW7Y1lb-WCE9/\8 ټkղ.VVֻ*vOv;GQ҂o O Z&(~f,x m[3ufϞ駼J+D.L(nL߆w߽O6x%sM:]b,oZkOOՁ6H+ׯ{::z?huqϧ-^|TU;&=ۅ pW۷#Z]Ro*1w ,㎧,iL0G?Lܹ 'N$dg'MFd&.177eA3IN1gN|ee+4t{7n)jdž Q))qqs/5"[Z:QKcY t@gm(9#I D"": ڡHxhA}8jYSp\ H(ge(#ômm00L WC &FZP 3F#ka ՅTDh(DzF:xh(6%s,KkADFr;Sbz$rp8\d0 Hߗ* M2A8؄D6K2z 7'*nT({w EXcrX&EX i:v[TJʙttymo:sfÃ[an䀷c,x8ujܡCU}k4:UҾ{9S޼>l/+Z]_6t0ߺo1[yfߧܠny3gz:w7vv۴g_C|I:bfbc!!DaRZ-M65!S-6ۘve>Zgzzl85+CR,O訪speݷ:A 9jh`{y9ӻ-c08NbW]m$[H {ML8/cawʗY'˜9sݴtޛ~ h_qӧO{ H/rl8DĈp^}]R"J/?E]}~=oߛxxe `˲*&=8za, >5k g,.LSbũ / !t~_w60UspfqqAt({_~rkU7;e?xכoCQ0ye}B(,կ^:22xsߞ[<>]z@$ʙ??gwʕ{̸jjur^={!aaqP;iNӗ.}̞< ?앺/b8U_K}^oPTNǺ\X,My &aaTG0W*読o91?sT(:A\a""{asH] DG ř;)VD<;$JMEs0^B ⚉`e|lқed$C( ᛃ$Ir}÷vO?iӦ+W 3gx Ƨ r nPHYL8x:yyX9sNt6YY[Dطi_b|0Z*+ I=+w(߾` ~OŞ=xU?B,dҴiEE{7n@_PW=+Kb'NYrw֭Kɩ//GD/)K7qLQՆ̝(ʼc <$uTT0X7",Y]ͬ͘~Dn9pv8&zJQU ~ )Qzqf&t?àuAwwˉp$:32YKKqXS`ASSX:Ttwdڴ<#]d!}w]&hML@/cd^YzI2K(Ǿhܹs,װ tϕ_YfW0x ajW-?o4̷j咡]FwG@$ qq",} D./\&ɰ_(Ϙ0,$44}L)ӧs"bq\f5>8KXc$M]i æ_qGKFVv bc)k%UHXX\f& IO)FHhhRpИH$U(ju/+"""/^ ]D&c(*蚇F;E(]X&CVL/1bw^@$& X$YYjuHj5$9j qTp H4> ~&E bc%|b?~Ŀe;() |.p\ (=P_:Gz G6AZ|1RML/`S&Yz+ K||h 7F{{={|ɁO>=::Z.,YdϞ=͋:֪,**j` @鲲"~⥢ 5;ϦOOt:)km4vv~n?^̢~h4111}9I`4*/do͛XqRF]1Ԥ@566<]SYYSO=e6/>Sx-e˖k;wo< q6[5pr:M1_W3IMjRԤ&5w}؃7o޼e?F#_Ft>hy|T8{g_+!-B `E+HU[UZy_R-Zp)h})@&Ⱦd;w;?n$L{=y <9nEG:\!BB֫ӕFi] 2: `zk__B!HLnt,zTguTH49V b!B C z)>}-ԧǧB!B$7EÆ0Zv_C^K;/]{55Ӻw]uq^E@ C+Ξ-++NzUG~C tcnfXh:As׫7A\\PoF<_g]+|!Ѱ&#a)!!B@!jU8˰;B!2h(#8= v<!B$*^#\!B,n qZP+H8A!. IDATB,dIx>~ĈFΟ?k.3gz$IZz5=`0|Wmz.^;ŲlDDDNNNlllqq; #???11xmvvvnn.8uw?nRzrk0"##srr,u(S24[#"Lv<!1޽W_zrJxɓ'YF;CmgϞ+WBMv̙+W̙3V.\իWOmPYYm6CBB!!!+W4LNS=2nܸpqۄz_>}:???""GyG/,  )`O>nP !B]IIɟ'Y?;&O 4v؝;wn޼W o޼rssϜ95kz۵=FO>?8++ <3gLJJb111ׯz PRR{n ...&&AS (pUT;BΝ; ]R>|xll,\eEQBBBƌW^"IR_~߅b<>>(+V\WC>|8^xaƌ-׿as1Z;.\<xB!tv@ ` q\X~oqħz:4iRvv;zpذa? !/_|]fO|{I.2<^FXlEAAu]aWv]aWIKK+++?~ۿiӦ\?TkoM?&A$Ilŋ{vaH&L0af;r|PUU@7:g}.&VUV\.۸q#v]aWv]+xgꫯjjjݫN=t !gVDFF9H]CmܺB-IGK,y'I&ܹWTT\` $Dg.C;$Bv>믿/Bon4{1n"uB̭_޷r٨Q2334X`֭[y{:~gϞiVIII$i˖-F?^#t#p pT^NA!MnҤI#GmiSO9ҷj̘1I'^adB!jat '9Lf+,aB!Pߠ3R*j`Ka!\LA!B(@#Z #67 B! h[924 B! zmsaF~CB!B(4ȄDVoR!Bq 5+ v<!BVj-7ȊN`ǃB!PuZF"\s/1 v<!B ;v7VxB!  ( 'WpPxB! e9&$\1:!,xB! @TB?v!B9 ,SUs4::* B! xbU]txygA!jKųgϞ;wx^Ng0"##5M#zz@ӅDEE;̮qJ ywU0k\L-//͑˝Z[lB!tS-,,<~8 BxC9-n5VΞ={]z!C&L/8p.QxvǎQF5J5jhB%8w\]}7;4V=X.;*++JM6]!y/رcRgZmX={,&5] n?`=OEY*J(qu!5W_aB]?߽{sၗh ;-З&""d6Nx_fMEE !NիW X?~N坿V0 櫐e`2lv9/VUU՛oygee.ҩ ʎzP_w(5r:>:>xBɮ~Ck,l3#$IDgs>kʔ)3f̸3f]!(|ÇrK_`a-`O]d;p`{~}Rv{A?XE۰|go7CGDgAhjl<~E>rH#ʕ+ L:DԖ^!7FUMyK =K)XthQv򺯧3flg9B!M6>|9'lዔӚM{Q=vxITt;gLsƙG>|h4y 'O~ǂ1dhT^s_7n3/wΜK! <@[,^_ɣGٳǑ>쁥DXn_An(ɲ,XQX~iiXt--Q}&&&c}}5kD#oykZ3x0':>-J J$cuXJl~vJNWeڵ/D۞Z[7ʉ tLd񻞄gY6/J:>FhrZdhz@>q=#B v765R{n_n7"O_&lKjs뛝( (P F'G[ZZ|__~!!׾RReՂ =;)SW!ŏ+6ٜv'{ &ENc5B 4,"K/vluzW^裏l_:;1C_w!͇y0^p'?r/\ 7nt:.[bB(E vA#YZI {'OI0K~+fdf JkyA`a!#6}x,OJ$uM&2藖%$I/rܶ{VUU5m<}tژQIiK`Xl (5ؤw`ia~QJiί|WVV۷oܸqN6d"uش#;IrtN6md: LfPVrlᬿnjX:]F!*z˖- @`ǎo48}cP`7/V{EeZ,2tPueeXHRp{YSS8zo&֭[%ShŬ }'Գ5 &EQX0 2D# a;o?eX5Am&[eIm6ANNJaNy:MG~%K !TÚqcrleq%5B(R`*,,V wG ?e*t(+Z+-hh0j2 bkzEI12[RZXXt<OmerHݿ}@Mdȥ^MGȭz%,øxʲLyE;K\:WN5Dzj78`ata\ff0f۵u!Bxqwr;)s٢SkJYaaBa! Jx0(QB(( :(]3.>[a3gTkuAEg#H썻fvd.Ba PPJ(%@( P8XCB':ehJ>H! Ctұ}זI-X+$k$0B!={; hulWab!    JJI 3DIHL00t:gϞtjjjjkk 댆ss[ 5 v&KkYPJ(* Uh֞N=ij=m -[9lٲ7)!zSN]V3bĈ#G7Yii)8s 1&W Kt˒0RB(%0 J BiaRXKg@|ܻ>gu&Km !XRJz(^Qf@3=v7ܙ3gzvlM'g Dؕto w%C_sn zkOӞGld$=vvohtrlB(N:dɒ%K45544?/**/~olذa%Krss͜9s߾}suݏ>C=;0 sС%K2eJ`IHHj+W\ ,B#Y@Ww><(( HLFo0jztZW@_,&KWj8i{:tz euDe"!P/lٲgyf޼ypqm6=z&//wpʔ)so'?IKKˑ#GKau} / c{C p :]@[ZZdYe2j╱{߄aZؒeYeI./^(5P5EV|EWO/ͯm]t#\]Vt8 (Ibk3qu%=0[ F+Dzh6X Bzܮ 1vXT[[NxxgVX;TWW cZV{o:bw'q]| Ah$IBB@.­OϩY0NB(QRPSSkaIdYVhZN8Lf*s0BX4@4C},$M(V˺[U믐J+?1;O(X7 c1zxB(H_jo@@L4￟'NT 2eʇ~h6_xOj8(u0DDD4TWL^jYFݝԩWCZ" F! !@J)$v[("##{:PgS5P_CuLT3mQj)Pu^z) ,(2UdTւI֝W$Z,zAʒ| {:(9d| Y)UrV¥a.DUzQdBYiG_M:!!ϐd^{q:/JFz=N{MMZN9GP$r+BYff?|wm۶ :4XC׮]3=qro?roU#TT1Tt߆@z?UV$+-v,ˊBKϜj3VOr1MZ2G}`ޘBY5u~OwwF@ZrO;{pKǑq鄄}V|i)^E~TkhNK. @:nluZۥxxB(233}wy;D2eFdka9qĉ'9{ yz>u<| o+=B(UP(DQEQ\|(,nEQښʊ(Թ IDATY7Sr5yjii1,QDQw[-}BJAQ,S+8vYV@=Hlond<&uB!q7dS Ӆ)n6DdIAJ,Ɋ,+* 4eGQQr{uU,ɲo66C=sbcccbb¾zQ_~AeY |Y UK3@! EQԕEQeBX={YDdM:L>:sB@:ě4zFJbG!0a!$v O-ڷ[dYD[%QEI$YdQVD{k p^,'=ZUQkC0aB`5juG .yjW%Y( |rd_j RV(^A R]]"˲|ͺIw䵤c2{zxkNŬ' jtڈdTMo|B!P =+.`9W>xRI%Q8m< %(yD/y owz.OCR%ruUŞ6tFe4cb-δa'odYyV+{_(ɒ:OU7/ykj$YadYb2Ftb-δkLG]I~XPsmiCo0FqznINJ!BiӦ`pY~{qqqҧ8 q +ت6w ) UFV5zcYu DTbW( umc0}jLqčo}쁥ƥ|`+nQ F) EIR!PE$D]U]t:( -L:U2 o,5 T(\/@†79gԙ3N:>&Bϙ-Ld5{p!PdZBgBBBf͚f͚w8߁r] N*.Ie#ɒ( [z"߻?md5kG3ð3 !|OGc= *x4:`4 =!@eknm,+ eygN}oDu+Ā}DېIןsg*„cuLVWtlW!Y&QYAAACk,)GPyEQPEZ7Uڷ~jÆ p. ̛7ﭷ3%ߵb=45{5$TQAt8Z0 2 ($I+J8-;6o\ϛ7a`lDҞ=߇u3=biBŋ;UӧOw݇&KKLnX`eg.-`ĈӦM T5wUV |׭P_9fNgP(Rk*~;ۯeIa/t:q_$ܷ`ANadF`ŁBudtC {Fg.?1:N$] &L>ξ>#$I<EɩS%&fer9j*/^,/p}j ̝;7;;;Yt{:1Ca\iX]LL, b4!BΤu<߾$-;sOtk׮m$Μ:wi3 p‡~__v? :t֭k֬yt:z͛{-[,==rtNFFtmذ?ϗey/BBBBUUէ~_SW|c],&&&&&fܸq{ܸ NU}B!t] Y~W0mڴ3gΔJׯ_p8/_5k? _%rJJ[oŲ(> ~Woߞ(SRR駟v8Ё͛wڐ|۩r}^.B唜ZN.C!QJ/Əo~79997o7nzo?6U__~>}zرj]h򊋋Sj) ڵk9;sѣG_z饵kv8ԩSWX!!Cjo zƺ*;wTJHH;vlg755}{&5uuuEEE#F/xUbbb~~~p>쳜nsZ caõI!PW9sWΜ9Z[oݼy$I۷oC&˲[կu~df@Q[v2J=7>2d}Æ ׯlN*oM_zذaZvĈ!Cٳ?Zxt:Q={,\PcPTT4}Nb(\>}:##cҤI&MzWlْI6+Ս,:cܹsOqqqXX """//O]RRR]]_gdddee-\n=صt}]Fk֬ L\_>c߾}.+''G khh1bz>++EQ È ^vH!еKNN~?y޽ ݷoܹs}fff9s9s91cǎ-\P/--vQQQvۜ9svڵhѢaÆ9rd2͜9غ8Jv8͛~A;w>ܕ>/cǎ{zӧOY&44t7]LffYQ: ŋGGGᇋ/oyKKc=:pW^y嗿AO<K/u]#@dEtF€ UF!ǤIn喢z7U#\݆r\paW/7ŋKJJ?h>u:i||o6;8+W PTTԿL|& 6<#z_{5^s\L_{=G ^zҤI7n r˛oNo[RRG$֮]sٳz衻M`Vkw ^ 5!ZSNsrrrrr$%%%%%urDL4M?m >QEEEuH>m?uGLƍSk'N8Jst$Iz$JJJ|=zɒ%꣟y'BBB (RBHEEE02hhPW[{Tz->6B k??uӦMV?~zzվesȲtRI6LD~{?J)˲,Ξ=bTWW_]04zfN+"B;[!B(( ~)SᆱvJ:җ_~t.]l(=`3~BcuDlllvvUgϞ-)) p5ؚMFbMΚ`B!=ʪKJJڗ_@)]j:O>1 _J:+Wܵkٳ׮] Zvܹs.ZCTT֭[-Zvy{'x"##رc/cccϟO< lll|BV&'pzc9$*:wPD!P0`WVV<PW5P'NkN'==h>::޽{n믿&rm߾}O?tJJ ˗߿jGr;Fw=ĥ\ȱB!HIIQ'Uum#"Xu7.( 0x tZlY  B!Bbı`ookh>_l`N:B!""cxi=p9 B! F jp6!!B!89DVKJႂB!zTts׬ ali!BT趋[e64;B!mS{x#;F!B! lJ-ˈA#aB!Pf 5(6KNLil4y=-[9lٲ79!BDFZxT*4W6;B!jh5zB`B!P DEZC⣸ߞjֈ\A!B(@2qa nmA!ϟB}iܨctB!x׃Bƶ}+sԗ78 BC8#@u"C!,! ow~Za`ǃB!P|s^f ǡ7B!BD8PxB!ǹ6cbb Tbb"qmmiiijjϘJaZmhh^ Hj$*sPNQxS^^^#;kZotBnv !!OĨfG-m5M׻MHHrJz2Qt%ʼn6*t.>riӦ!Bm$$$ W19jZVhjjRKᄄѨu\WV=E8<(h,V;Bԩ PJ !Z)d 3YJB!n )))U^[d2az6%cÂO[lY  Bwſ/^UVV@uu` v8(QhtnB΀ŁBh̙ 9 |լsɭ[kl0Hc4$&/߈jlX4HII4;;ۣE7Ic$sؚL;gZV"";wƬYǻ9.{Ɣ- |So0 {\ݲ,e!,,-yљ:0CD@}9J|r!nf[ĉu\IUJJ,|#sgLKF,{hLMMʩNZ?n 44444K>>9. xB!m\. >mx$X`ڴ* F)H"m; FF] n#B73ovS@+̖-[YlƍpbW~ȊˍMM={ooOch8s ]an"Z g 5qBPPPf͚m?E66jSS] ZZ,…e MP7ztàA(B7)(pK!zŋ_U0aڴdzZ1o !tDT87$p!Bg!LbsT&8A!B,GdAB!B"9ŰT郻!B!!(nF&%mG!BDQ?n|z;B& X uBmPZJ4]Z%%^o01t ^MM n$[aHZ.*̜=Jr؇SP]׍UtbBj@AKJtbM eL&.60 HR}BM\Pqˆpc6SW {DQZ"z&&h4rKVxF?p`-; d,t:)Tk \bltvF` v<қ$ IDAT>o ߄wDqӧ^o4h4Rc#4p\dm[64-!UZ4z4(s^d9IرaKln_\̗hF--զW3GTe5<,Ruϳx}VH]׍Uݵ/0 P)N'0&V8ٳBy.=]=qNZ# 0ѣ$7uu(0'0t_?MLs>ϱcc5 BEpCr> NU8 . p6;{I饬VkCatk;_BITSGazu6 PQTKIݳ\X%k:1]RY& #74lNQI(md-CbVhٲ aCCuii])f^Z۷oox]Fsx%^1S{3G-[qFp88m_7Vw˾ÀBƘͦ\.6믅 ذ0MTzV>/5yt\uF$)qFkq,űK/'9>9VGΌO̜fl)qb[JٖLR"QHs4w~kfb̌91}֙*iY#tBѠopf_hp8 ùh kΝ;4_@綾^Zn ߺ%548zӒh$zz ([=}!@.EͥJWXcÀªUز81Jfj{/sF@`8p4BpO-5dP(JTUSd2㺮,5p8A\5h;44GÌ}8wPY;\NIh)Y^TthmwyRAĊBSS3wyzpC2UU}'%I~:466B&''{C=[oiv֭K.:t>HX,ff,drx\Z˲젭i#fߏ4-J@0w%̋mUmmmk 1 HR}ёx ZnSC}͞ǷFcePCҚ+% Dp."8é.\ uuu˺'ËmUxHa\4\Rz/\P!գh&1TUuUUUXVۥ@i eY迻!TFw/^$YSSH )d,+[PMz{;KS80 7J(3~$Vx2Ap(Ws8M]]|xrٽ{w4d2PH v155uL&3::ZWQ^lj+ Qo^uuu +҆ 3MS@x\Gl/W<Q=nMLsa#RysvaY3jˏp8gsT*۶m|>޾}{nyXOBt:}\35OZ[[{zz`2IIkcǎX ں`i@~ Y?~[+kHDJD b<\u$p8lBvխ9Dz @@8q\',E gٹsgmX 2^]K]t+%#s8skF555?|_zQĹ79qMYE+VƖYC]TgE"p8NV])mH5l1ʚ=~\bk'p8Y;. 'W6Nx5U6 [kIܱPQs]SxjgSpY Rkp8ùK8R]cXvooݺp8N9l֚bn x$|_clHJk|;YYo|Lqg}7@uKejׯc[9H,fB<p86#GhWOMZk=ŜOORSY 7MsS"k#Gjf!JV*usbRZOe`Z4!@YsbT[ baNN2H,FiZӂgJ{lN1M 5\[=eƲ8ujX>ZUhlt56޶Lfl,;9iV*EM$n9띍u0iMEBсu ?T4)rS:714$54`{T 1+x~xaL3u4RU/^TڔvN'O}}$PnEl6ua#ؽ[njb1 (RM V8Nich.4Fգ+Ɂj 虄61+W,{6n -W)i{zb==b]#[N_g'.n/5*n%ik\}XQ5!bsGCS%Zp8BIaqvvպΝR}=0v͛u8ʦMɓ'6_sp%dM1t8bMMey`z3rK1;?8ų>AnZ禊b 3MJ!03dYqtbbmm5y&TW j~naCU Y6C!cU#7y 5 }[=@}QbY-!.ATw@qz7߼'n/5<\w옷}%Xl }zDקΝ߸>5ڴPuK ޮH&"2-C Blj8>=. H3>Y9k)NwֹC .e`!Iٴ I+YnHFcd+ z]"zիx)}X53z3D#ea@]aSƝN_&.8õ!54:q.zaPUhڒ#q%pNCmێ+SZ*PP  {2{p8&ٳV$"VUGesf(a(d |@a%HXzץ_ݸa>bXzz}D_ĩSF[;:mzEQ˲@a9?X)j[>kDxd}+ܾSOr ȘYU`ԘP @ʆ8ùkUU;#bf24t:$Zw7I$;l|>23²l٢nݚ:s&utjGo/\bE"ʖ-N?ctԱ{Vb`"|j^&i󁧰 &£jio>6,:?tCӟ\;=;߸UɓI:tGs8(@03Nw+/( <%ZQR~ z&955ܟVfE  5ISY 7MsSP6o-Y0(!N;AIQ<ב#$"I<99IiJry{n&&~0pxܜ`>vn& K554]jk | cqj+s幽/0TF7-B,۩H@׿qR%zZ]]dΈB'N @O&?mZ0-" "(0UȓO?pFGn`,tDsS'jkiˡ9o@A) l[s$%/FIΝeӧEYݸq`/~nSX2 Ӝ a0`$r jG^.Q:sQ<&m6bꃿ8OM-d=\ij}7~R e:bmm~+ rj7[W74ݷ E1#0F@wN>3=u_K^o56:c3W?R0;v O'&~Zq1B(Nk&ԥ>W[G4-صm G4$ 1 +GB̩b$L 0TfWY[LҰ>M-d=\ij}7榖݉>ZVr`T5Z+}(eL#4vRt]zofz56a@"cD)ۡ0@֭GQ^D>^,5`ڙ|Oe#T: j߶[Uռ  !0@T3*bp8}DޥB[Cmyo۞"M cs0:{꧌{446 `cEHc=12 "{j6@|rhS_L1JY^8iBԼאL5p "NAęDs+Q$*Mp8}T{.:DΌku}7(E(cĐW&+= c (1Ƙ3wT(UU ~}f3TmFs;0"` PfKBI)7ݒ$;Tk5TdB3gt^qIp8h%gc#& аV B!DD1Fl@a/ "4ٵ‘s-Q_8j[oث<1`'oᔐ.< `Jh&"!Dwp-!lo5*fQ9Z몛kWkph͛iPOOeA% Xcݸ+466 Y F(!tF"bGB4"$ɤ "X$ΝeyP> @qP&&hn'# 4c@)#J-B OڰHW[C"< -\}"8Bں%p8 X}}}28::zĉx<~_}mfK Gٸ1 gPq-XB (es%9E dиE,BHo9M ,A @ 15B*.# f&ͅAl@PJ[aӴ!7i^ ʁR2*g I bAUp8·JXooАi~7nO2Mv??x`SSi===Np8AY(`!{7v-#3}7-bz4-"5o$ԴHb8ôՍdZuXd*4m=R:;)`C=]WEL!ĎoL膥T8LB2t845mٸ}UYiP1%W:L(% Aaf5#KNK'b#w͛ /NuvF.^\ݲl7n>}g= (G2< hzF3B3a%֭_7TpxqrUs;Xmg +1TTD+ɕ[_g?kmmtx~?|k_SU=K |3RMB/2ۧN>;vؗextww_튱#G ߏF?ƍ˓o~^9|/o] {2B/>1tk_ZMMW^w~7/|-fla򗿜f?]~ꯞ{[4j)l$/pr_T_K( * *u¦Jr¦we=xo_TI>g75o"ُ}cKZ /_NR{ٺuk4}7/\$i;OOOK/M̢p1qM+;}SոaۡsoБG}jʨGIvܪ XY$T21+8,:TXΝ~c;t ~ࡣRjfLp8TV(-F1J hJfCTQJ)ΤT8`okWXXݏlk'5ܷV *D" xo/ٳ?شi֭[^'h4}^H/??<3%ZO. *} ;1WH/l$/`T/`T/`$/9%yNX0D,;#4MKR555HD4ۭj$E -:{uuueJ1/.>;v,tDol=, dؾVFi3BX, aXid3C f¡сvZ?,q/ѿ}{ƍu_meCO}3;>gCŭ1Bh2Eg%R( 55mۊ0=k׵n93?b繆T QdJ`YDh")<8,QMI~9]eDtEGGH_Գ>[vRW_}^x;EQVb6LY1'?RONdGow(4l1N>m?; /?ϣ(߿\.m~}KuJue_B__ME* * * {NI޾0Dw;ލD"UUUӑHBa;333SSSsѲ lroIq=kW:6}W0(.ܩ̴Ead<'fhT4B(,Jw_>/ټDZ$ \S={={z{{w}cZ vԹ)Hd= Ý)zN^',Tي`FWWXU͛7޽n9dB(c$IJiuu=1K ߼yshh6B+ ScXQs_orfv7VIVQ$e:K5v=|Tֆ8u* %dd-q$ŒR"Dl:Ya8a5@ũ0Y&@DI&jT>oXYeQA9yswTeY<<6_Ws_|[?_\#Gw~w^|wy._<22w./` f2UU1nR fffJM}z뭷^|Ň~܇M\:E;9x{gW_4r~P(No^WW2i&UUB^cfnm-#>쨭8}g)%)lr#x6m*Orĉy(!3቙QRp_,ˍǏZZa%ʃRa蕇eYgfY__)ѣG= oƟw?ϕd^_p8^~eC222/?S=c_).\(r+9n:000<<\]SN}[_|߾tҋ/+ɔ(_җ>OӖ~i ݏ=Vp/ Ys :aaS󞵻4M ,э_E M_X ͛ wMCI_n\sP1 nii'C?6=9Pkj/>85dX-S@L]~W?7nxbkkWoY W|_D"]]]a|xgK5ś* *+-lT/$/l$/`T/x/9%yNX0D%́ $fWY߸V]]h4=60q+ XD[uuJ夹aH0=^xG_z_96}b<|ayS:22b˛G0qҥ4Ν;WW^cL$۶m[*˲AӹqƲsqQ֭[-вuww' Ix:RrJ__t{)f>dΟ??11p8[gaS%9KuſeYU;aS%9weMxN޾ݮ/_Ԣb/| 7n\]UukK&&>Z{fo~߾^D{=豏?O+ 9Y  In?()&aks$J*f)fkkW2:sF. NSS̲G[a$&&(VUqn`aNL0ҽ h@2mUUA ;bu5^:F\WąJ}\T4l8z +mp8]&[!9:Zqe0[74''aSh4aܷo=ɓdfiՕ|m6׼ldI<;^dD"u'][4V9`aMNΜ1*>M1(skB#Gsj]#8Yg YVl@~L͉ Ji==H-[QjBTӄ@@ b4^5=-A}`uv1Mf245=UUjhȅe +^>r$l~HY(zz\E C5 (Jѱǎ1J3r+1$I7FFsMgP)J~UuKjhpgHeH ` I<].~ٗ_@9>>Y8z4w)4JV~^eüOܝmtb{CmG]'~V9YsH<^8L3u>4D5-sV,\Ȳ ^ q'kzB<;h&uw?` I e(p|kYTdNY0I=VjYsXݶg˵=^'b:f0ۈ0<${fŋq7s2uct4sRe4,dU^c!-cV$ Rm-SSR]4+vdϝKX]-VWKyGc1ݸ1 dÎ]:[ 5Cajʿi`J[vo}w>0X|peg\[-BdNAr.eI7p823dYq#e߿]iÆի4AlB e@$v(}.% wEXLwNFZ0eǝE+Ani^*75TrD/UUH)CSz_u'bUbb.< Ī*ΝsĚ0Ӵ&&] nH% ZV-B?d`]/V4é瞜uV)0?4Tp8sX,QQXQ5ZB*xXQj0  (HRƱ}; ܨvÑ+V\W5]iJuuP_eA juNl(X] BHui^W&\jG߯vtJ4SJnld14'']c"@p ȭ.w`PjhJBRccNt+VU!FpaՎ;jۗ *1OxԎCN+6aE\,%`ٷ`+]^< @*j/5kfEg+' U5 C}A p8㙷H w/x~S@ 3''.yWv8NGr%XQr˒y-l̪vVn`t}XEÂB`x.H~r갔"5?w[ 'n6N[gL,HUUjp8·kj*q[ۜ8vkkN+m/]QPuH#.SqdNY8{+o"Uh Ct xfdQp1zeA>X o@~p8ĺ7[wy[}l{q8RTC+ 9=OjdK.f ^P_.7wΟ?MqS7MqSdpʕ7G&D8=,LT`'^{⦸)n*nJUUp8ad[7@L%1Z^*TMZYc*{(iVZ8é GMl4Ya&41EYWEQ*pp8뜣y`ѽ8}3z<XWVap*:D0s|MsN"d.7Ȫ83Pp8zg˶pVt }9p8"bSsA3ZKp8pSo6q*z8p8Q,SYk=p8]ⵟָ(< s8p?=^&8p8 ߋDQz4Zk=p8]bG/6tibZp8~^CG*ц()=ald <pVZYK~<1Q -5x _JRk-1?7`uG1EJnҊ(p8gPX4*kH _ֺJC*Cu8*b'Ĝ^Q<YDy|`?n\_O&&>!s7jZE(:VdP9b1p8UO gYh"A(6o55t#4/R:7Tp`YqPz pVUU+.!IeΝ-YDQeIU5IA C$XUEխ[(5''i:TUCs 9RC-?o(!m؀fee&{FMPl=KsEŊp:#]|"'N$+BpfegE:T$l:NTf$0Vnp8=hrk벅4M;4Mni1oҮ_w9"ݶbȈQ(3 ;f8 tt,%L9rK98Ȯ\q>T[?h==R}ky֙R¼GMj%V}c`zGG ( op8O eah==?+Y46ljgvuTJݾݱks^f\ ?{wVu&vYxߒ8'YH! tBP[-7LvaIK@;vl"Kow;QYeINo#_Of6rHxvIب_D4WXO"$|Zm}~r"'pF}c#m02NKX4AA3j5A!aXO\"BIv;H.W"H*MO< fJLq#EJ⊋C|\Xo<4!Bh?u* M&9r7 B!jc yB.+ %qp RlEEՂ|W~<B!RJYW6 M]hViȯMkpks $BeiɩB!PټnbU}ΠL c]L-" sW}}}^IieF!B5pLjGM^x3 㘌`LDLt~TB!Pqgp/:]}`0 Y cZh 'XI!B]}nP]f*ݫ&؈;.<%AD9G BDD . ɂ@TZͥi23^搲i.Mz˺v&hBd`}ng$hH2r!М 93g<2rZSKBܶ>YDgg,+XKO"ɂRhV5Y]:ͨ Z@,g1aHYXB!0g=zs"s3+MY&~m<_yׅ L+W:]|s\ 7WUsK:3|hi~ɨ4eki=gںϏ?.rFrċ ;dըsB!4[eOYPXBkP˲(|!Eӓ{Y<af7T致L[Y x|P1*Nc0]19ܒ"Ahzk@cDi#j=#G8ΞUi+7 @%[WsXU*h2i4̬,OTP80>˲[> `*X }''̂3O?0`?~<`9.<:xP|`M#XF HA!fB>H֕-@QH/>  SFA2[Tf~8)ɔXNSN`goaN?!A֕/DLste([yG8"nA__ԧ,7^ͥ@(2:2 +Bc=zT7eh9AyAk:DQdh04CӢ(YG<G$Irgd;c%K֩:LtR,Y˪ޑ9(M}G=8P=i棓`>}ngܟE<0+Xz{ttLyPLhbK04RU]|Bi 9r Sq畂/BУv9w:(C3 %Je$egpsdyRIu>=FKx [b-DľX:g], c&afq9})8\--}#B#EWTm~~?=won*gʂ0o% RZ-UYpҭN!6Ǚ3PP]P\te b0:4E]ii(;DQ*k \nG S,g : R+gv df3ZP-) >w|E<GDGk7Ukrzw/?PeUudC>"džYXVkꪯX|BE٩7Ҳ7޼Yy iKeд$) 4C344 $IO %]Z1@䃶scrޏ{9_7TCz>=WγS@Ӵ$;09q]ZmMs0Rg"C!{¥h펭w^~>!m>[EQt˭tx B,.W#Kzx30?,By>Jʔh))Zxc(藎(8.ܥ)%Q32 <Cfq58.!حz5bWr4 Rs`hz6H*0.PP #ees0Hǡ:t(Emp{LxupEH!QVI,,nNF0 B(ȡR F RTтztZ&EQWE~=_& J$I6VZTcrY=9_|ӭ[U~W(8 @b64@Sx堔ǘI.qǫRqxï+ x0`a.7\!QEєf+0|'!Q T!B)Ca@ZN$YEQ ( (+J_TiR)ЄLB MI$Y.s%qJ+_yhpB C*E1r@т8{?g@(W)8"wӨ?(;:<ۥ2{t;B@4ȄTP`hpy^s]d>^e/ŋ_msFUiz(rۓB!4cJEi~$I,_( ŸJ/eiJ&%P4(zt\IDIh*Gb!+'g=_lkio-KX]TdeҭFc?,Y\.[)8D7L$OQiJ5 !a$S (geNd7>coaÆF#J$/fհNb6!tj5R{=Qd"$LZ럢u:]uP@(B@P2FEQ)_B@-F, 4Ƙ^{(`=׭o"a+)8"gj:QBDQ1=~E^li[h!2ETeдL(JDSO9vwuׄǭV KyQqaj3F,I!.dm3et:zC.}]I23P2PLEBB(IOؿKK,4$`V%)9Δ%!E\.ZEIKsi>|sK#v% ׍ 4Q@%fѢ X{ IDATf;q-28aAG3 itz]A!G% zsVQ,Q@dB< hR2aBH(|H%Ssՙ Kb}znrH~D>u4cHKb! tiYI!E^^exiB4Ňoyid؞]ehX@eQ#Qff:tHI^¬Xw zCe婯@!R~(hoUe)BhA`tY @%Tᙚ@d"JT&e[-ۚ,˒C*>i EUI!EʄEkQ ]fK_AxA|>Ⱥmmm"L}vBnu1 H8Q!<+,9n *,$QD%IEKϤׄIEI^[%sr&- isv@NY`rH~@fQ@_rp v@F!E~)"C+˄^Ȱ=33 wk0Y]X DQ]l6OvItiBEQ]ŵױc2pY[l g(1Vrş+H!QDI$YGOd3$%I J !($^ybhNedw.;irꓕwwْ)8E7hoD"2!LHr32>Ai'e_(B@`0DQ[/﷬/.cAQԚ5k>ue}NNv>!дe,Y ,$B/ J($ ɂ(ES1! B!IW~=cW><R.WO@nRqJ.$s;{/D6aReKo<~ ດCŲMǏ~HF?`zm^2!C7lLd"ɤ$ie҂r$ɼ(Bjz<,\lKcڼ??kHqIu&䰲e(ZGns!FoOOكuk?gH-m<|`ҳd"BÌ T %mV%BdZr4e\kg>~1nerH~8wCF^A]r8{pӧԮH|8/}M@_OKٲZÕ,˅b( 7Cv$ցnāݰaCrѤI7氙B"!>]B`ܿW|(x .D|~hJM MѢ$ PH6`6BO-vm,`9_v(%/CROj?T5 @% @_\U~ê8NT ͈ ^e-mh*gժ=UGꖗNhlII>It$;%BhrVC!Wkkun5gdgedja6 :{ sqIOKK[~`>ecBӟ U/Hʲ Ds\޺ursKIO#8ˁL B\#v׈=u]XV6vS߈c$X:)B!4/+*G/´x(SEEʕ3^. sR3 cy:+zP[t/Xz5g2͸gF.= !V߰!sґg=E9X^dɌ70O36oڏ F?Y|vE3% 2ZQ!?urWBü)41ǙL]A >pŤ_ey{z|!JӬV˥닋 %%qO}iFaYWq:$!@ꋋŘ"9$= V7ՙzH3iOZ~x|똳;6>JcccMLw1P C]塶oCuvvFhb6%y<\QQ"`kTꊤ'0>HN &EMuu|X>OβxUyqs7 ٚYԶ6 8 7P Ca( fjJC|fvkJ.000#L,/\PWWS5Gx~j63g f3$]1&FSM'&6=Eyb!<Ϥ {\":6E)Lc1(YV Q\8n-0P Clm}>ݲei1HN088OxBr"8sFUPڹ*"2`[[͸n]bM3 ރ٬,ZZZ(76Œ".=OAti'!Ȏ4*?L\<߽{7P Ca( 5|O:NDbO'6ueeHVui)y(Vټ<:Ns0e ˲ [Z(QWUͬi4? ijj"NPWL֜uEdjoGxt>#p)9ޅ26D1t" 2lFƄ7NdYX@ap#lJY@ liaFZq1cyXqe4 'f>0<ٟawp1P Ca( 5PQHn񨯿^X~SoӴ`WX0ե&ʚVÁڵQ0u&B6#VCmml. ZTT?U&+$]1jܚK`L} Dg'ueaρlV.,^?OLJ./\iKLYw0\=д\V޻!ժKKEETMstNe>T[[fP Ca( O[_7f8MUX<0ajt##D$$)HNByӳmt1HLWY&|s@ѸqhIGܹ .՝cfs42Bq\5<*|cΗt/-9̤)"#):Jjw(=_j#lue4&F!NZPHt:%(Y<0VjC3ڪϧ8 $ O};ǟnOd2]~*,:fgZmb>aTyy84*(TU &+bdNb ueMMMiS}'NJ%ZJ˛.4ރ3ii'u\|Al/c1et|NH;‚DG9k!cr( Ri5 J'^S[lF][B9G:4N1WK3hz4ѨR,.\wE]WD`335uur biԕBj%U*珹 l#@P*qzahHLUnK(3phAYlLMMyɔF݉bNc̜agwz"xz?@qCa( 01``ƍxTCl35a#/,cF#3ɢVЮ99"7:=Z >}̘͟ln%Brc_+h:|۝ =6G.vXhj4(&)^ a( 0Cmٲ%^"Pt]=]2Gʊx|똳c_G_3a Ca( P?C=TVV9FG5mCkgiYvi?RUŽϚ[ .Nue9!BcJKhl ! B!rshmtIv>!B%ɘHh[A!ݧB/%ǘ}r$ݽ=q B!PSt2ϛ|B)hZ ."}  M!BbX V 5=BDh48* \AxϋbJv>!`S@%YhB.q>7f:!Jq JIF*6`sV6.B!GO`@!BWӱX #B2*,B!UG\aB!tqj50B!\ޠ !BCDpX #BE!DF!BWPPѹ„fB)ߟBW@0ac`B䮻Jv m=Ps4:SNv!!RαcǒBB566^mP/* j!B]-3s3 #B TF!BW? ʨpsA!t9sԩSW|7<FGF!RP[[ۑ#G"xgϞݵk͛W^:M<ȑAҪ***?1X[[b ;::`%%%l?b͚5 ߄Vk~Z #Bm׮]F;<^__cǎ1߿?33nM.|6m ofYYSO=&C@޽{7MӡPG?ٗa'N8w\AAƍ37!~$ *F!RhܱcǔuuuwۿFF00۷oQ=:00بV [,;w*|v#o۶MVO:u]444̶(vu۷P~fX]]]]]<;vX,ng?K/QMMMឧ(jk׮E&do˜_CEMt]& X #B2)b܉ l;w>36^عsgooo8®]N:%򘫆?lmm%0 T{ ?||>tuu}_~n;C4 d_Gimm|?Oo&P[[k0^yxWg222__>]v} Ä{=ɺ%-Ybj!Px<ʧаx O+--ݰa£?mݺ?T-**я~DQԘPK,y7[[[կ{h&Z[oo=2roeuax$Ixb\:Pl޼Oӟ/~ ;qM7kݻ{Q[~}be'N444DXIH/ZsmMf!=544(G~c<{lkkkSSÇg;^^^ުU:aÆ]EEEuuukkK/r.\=ɑ()ܻO(!ЕeY$)|[nB,J.\PTTKJJxW_}5 fffN؄2KKK}Z~*ߵ2m۶m۶- }y>%Y***n1g}fw͛7֦ͷåQ=9߄_xV`:0 B)رcOx衇$tvv //--˃W&V}K.|Vo;Κ5k !{/*,FvM7KpSɲWs`0iӦ˗ǥV\,*<fsd̆"tׯjkk̎T oܸqڵɺ%0mv,+!Rd/ro<|…: cDzzR nАvݺRߜd?UUU-Ydɒ%_@YYYYYY,ˎ߈nUcZjw40̆ ƟxhV>?sK/d ,X`dMOd /,,?{!o|IDAT O-߄ &7d+Bh>|瞫G')@w>##D]gOۭoah47Lҥs& |g*ڌ csHWUUi4t~8IM,{~L@lvxeB>`֭c>%˔Ǟ>m^IӤ tnʹAj`ϸ喁sWۚv* vN@y'3ne<@]wuv,[So{`j[kJK}?,+G9g?wű(ʋ(SSDxww7|31(?(fב1Cns!o}KV,fׯwv6pUUv9ʋ]0j͛:x3vf4ټyay&RfċjvB3cإzgvdKI鮤u{7(B!4wX}WiXnDzrCȒ%6ʕ6NZ/n,*\ͦaR^~ɓ z7ծ]x߹s\yjooWUs ۷YǏ1WN pt3Vb!P*`'IpRGyVۗdGg*{{ﺫ{ٲzٳ}oINNh0O=u3z9nC\llzEVðsŵko]vڵ뮻ݷ~… KJJ?<ʚ`׮]jEY?~O>YQQ:p*w`xG,?<R9#2GGF!v}VN|>&//y@}3cDz~Veıc:Q>ev(YZzy^dgrsǏ]{ȣW֦;J;v$ wqk'8ǏoݺW_ژ{WT;o~3gR)C2:~ɣG|>yA XPP0:X1.Ld ]wݍ7޸gY?Ԍ9!ʽ'> KKKco7)wMNgTZ!:%Dhjj! 1R>Ex8J%ˎE/|'khhWT<| υ!)c)ec=6(vH@GGtM]k^a@ #B@r۷^Z!ih(vSvvv hV+%;B!fuԦW\{KA!B(A$PZ ]}͒-7JA!B(ATtVgo^bM, B!(UkEDYu: B! 4EԜINW|B!۷';ЕϤB:<|B!\!:^.ttvʑ|B!J5iUzZu ^dB!Pdrم`ǓB!BaRl5gxےB!B "FEuB!բv/Ү8)!Bzd4wŝdFm߾}ʵh/Jr>{%ūb)B(eQ҆"i~4$; 4_yS@kD^.; B{`YYYY;2ڰWoj824XP1pTA!&UVVܜ,+JqD~?+ݻ1P Cajnnaq: heN2w3L+ teit,YvIV;v Ca( 0ox0 &!wj;ye24p}hni9s̞]MN !Fh4sJogk:Mwu[Ӣj {t^۴lx:X٠h 6O|BIi46n,IM'z;>7r K˫1jWwenx gHgy`TV,d^奰K@d}g̓NvJ!*[sO؇-]YXRyaϮ|~YZUT+=靐**4ucyq^bFBKrՐ&C=%0/47/8/.*__eeN-UZ\Z63S`~AsM&ӿ?N] ߇dgJ.0L[ld`ۻ4߽ I) }newRj]Qםq:VmhqMknȶViZ G g!ɽ!?e+}@0$_9~g&rr=4myU=]gtF$bHe @w"q3'}Ew/̬L\)#>¾E -I4رoDyR{MTHp,&b`` 0ttt8tG#z<\mT@Q-@k/lןY{1q2VH"֭g-7{ӆJ Y@M_~gfHD ^'\% }{Å^C: @,Tܬ`g察}vP&'oؐ 7CG?s$UCCKrrSOn9~"66jsjk |Hy^BMU3gsnXyuUb6ؽP[üUmx>V+ahl[;^ >P>iR k91b߯c2}ug}}[(i4-[$$‚X,Gg…I !jjj|OT*x BhJohV* @*5_imCCN @{?)8*`FP%̦V=ZyzŒu)Ax&JZ[ :qh6[.V5:]{EŹs c]d.pii 9%rWjjlJ.p<ZJRrr!&JweÙ>qrY<2I~T$*ʋ/^ }f.kEfkե_|1֫ >qbo$ǧbw?dDċ\XW?Outq/5X2p8呑oAD\\t\\=-XzccbcLLQ Ft`-̆B9JT::{pQcgG]G] @m|]G|jF֌(^׋6sGF~4'BhƑ/ <(t1ٙ3!y@1Z(ó,RBjҥ㻯0 ;4i7OFAڹ\q Bc45VxrM)w:/S>|_1sv35Gwٞ!4?ч#ωMawؼĔ^M3$gsss׬Y3rwrg VK+ۤ<zobSƎ$FqGb!rbH; n ɅQv.i ;vw<!BB6P|"BЬ%ER$A8A!BE` Hl@!B!mMMoȀlB!d$XE`3f}qWwަ%B!Ba13&á3< Ɖ!B̉y¾Vb8$ng 7㴭B!4RApx$$H 8kq w9+B!497\4%) ^rb!ByGg\Pq}nRIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/sub/sub.html000066400000000000000000000061161506652756400222760ustar00rootroot00000000000000 Yoshimi User Manual ~ SubSynth

    SubSynth

    SubSynth Window

    SubSynth uses the idea of subtractive synthesis in a slightly unusual form. Instead of starting with a spectrum and taking out what you don't want, it is a broadband noise generator with a series of harmonics filters that only allow comparatively narrow bands that you do want through to the output.

    It is the simplest of Yoshimi's engines in terms of the number of controls almost all of which are real-time. There are also the following standardised inserts. Most of these are initially disabled.

    Volume and Panning
    Filter Type and Style
    Envelope
    LFO

    Local Controls

    Very obvious is the scrollable row of sliders. These represent 64 harmonic bands, the upper row being the amplitude, and the lower row the bandwidth. At minimum bandwidth the harmonics are close to sinewaves, and at maximum they are very obviously noise.

    The Bandwidth control (top centre) sets the overall range and the Bandwidth Scale changes the frequency scaling of this range that is applied. You can have quite narrow LF bands with wide HF ones, vice-versa or anywhere between the two.

    Octave, Bend, Offset, 440Hz, Eq.T, Detune, Detune Type, Coarse Det.
    These all work in exactly the same way as the ones in AddSynth, but are quite independent.

    (overtones)

    Overtones Position This sets the type of overtone variation. For Harmonic there is no control, so the other parameters are inactive. Similarly Par 2 does nothing for Shift so is disabled for that variation.

    Par 1 spreads the harmonics according to the 'position' type.

    Par 2 provides a further variation on the harmonics spread.

    ForceH This moves the shifted harmonics by a variable amount towards to the nearest actual multiple of the fundamental.

    (bottom row)

    Stereo enables a stereo output rather than mono

    Filter Stages This sets the number of stages of the harmonic filters, not the filter insert above.

    Mag. Type defines the magnitude of the harmonic filter controls.

    Start sets where in the cycle that note starts from.

    Next (PadSynth Engine)

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/vector/000077500000000000000000000000001506652756400213245ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/vector/images/000077500000000000000000000000001506652756400225715ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/vector/images/vector.png000066400000000000000000000560551506652756400246140ustar00rootroot00000000000000PNG  IHDR4tVsBITO[IDATxXTWޑ" X@ vEE j,XD,%b,&bmOy~ٖOnqf}g-sϝ9{XT((~/4M4m >oӟN4M{I8}=4M4]ڵ@;ii:Wü4mt֍y#dGookӪHO?4ElRFR2~Eg C[f)?Iz˙+JyϤ'O1=|}tl -4]>w\fjָzbHL)jm}pisi?g ,CwQ7,'0rp2y"SHҟu c, 6_וD"g@=?9_3*sr:㘑k6NCzǶM>;WMRsD0w_MyiwmoҰu.]e;ܼ;e(P5 `x+ue YrؾbXY#*[~t >iXr 52=!b102^픋܂q0" lO "Rv$Rzw );WOD;-i*5^fP*aաMώ5gX~zu|ċf<4]VŚ\mk]g6}կX=Ҧl4eEײjA# ) G~-+)g|ʒCvXb7-*rOME͎ՕN„mbfn`@yTㆅ>[bu.}h4aXN>>]:]:),ZxB@ڧ^g B̾-ڸt̎\>gxw٬_[V~@L[5E83Ey.# N?]|2VrB_X|>/#vNJ!dN UĽk'_:˫ vtDRǿDf=󆋔[읳m~=ڈŵF`l.]bKgy# m_vh|g`b;D"3~:Xy*F3d:lP#Ws[y<4]F޾|+8}vbVF_kw]gV-R6$," Ub\՘Ra]Ц)"W9!Vrxs2Xxّ'*ӼI5v!Pb^#ӭC5Q5>ƩЩSg munA"âe3,?u4|ie٨Wp鋇⵭ љMK"]YݣSKq=^0\\90MsH~Z8weҧx__a3EcO -e?']hv b;jh] 'O QjΰhtycˆWpsjXrE+U]j:'ynH9wXCŗ0m`v3JcğFvKE݃< mZJBlKe#{ݼq}ڭ_4\fؑ4oXkq۶j R?_u%m- Ey.#3N?=}b{,M4MWϊ(flH4Me6Z?i+ q ǛkE4M{;+_Ki pzֲ9Bii\'(2)Bl<( INEQDQEQEQE8QEQDQENEQE8QEQEQENEQE8QEQEQENEQDQEQEQE8QEQDQENEQE8QujժRJUl8U+weeeG$Ef(S*NTIKJ '㱰w,,J5CN8QSdJE8N/VoE8QDN ' ]"(‰p!C t޼yf}' "(ӄS||<ǏN N3fPA8_΍72eʥKL/^8gΜ`777kkkoom.^N'''9NEpJAժU bkk w0aMNU gp*رcޑ#Gj׮pQVV8=ԩ^>pP'‰*v, #F>|̞=r+W}ՊŞS̚5k"""deT3gΠ$2,, uLLLNpWb8xoŋǏ["(oaWWķzK.,YR8Up*Zj%RA/w%o޵kWtb0gee ck^ynnСCºvvv5jСҥKAs [[[;!8 -/!q+e˖8???T2sNrjoDM5XsNU 4~x\ gϞDgԩȶg|[_G999"sttF?~:222АŖlРAbb|K={Dm -SN 3!ؠhѢRILSI>rJJHA勪VYڒnΝ%KdH)lp"*";"5Ҙ<%F΍ɣc&_0U\8_|Y  M=򊋋`֯_o+;v,22VX ֆlcƌ9sfӦM.\ʪwܸqhy/_j׮<H9r$P&M*ep24@P ©XOcLNh6iD[s.:7|w˖-H?a= 8_9C4[D؅iӦ!UXDNtь8G8Nhz(w֭2B.~y7qEeÆ PqoD4j<04۷H8.RV\)Rڷoxt46RdT'j ۴i]Kr)1|"#ݽe˖  A1.vںu+R_,߆V p224%|蕽oDi 0]iii0:l}"Rp N޺E4M* pɧiћo4Mt\pb+iVo‰i&hipi '‰i&hi‰pi 'ip"hi‰i 'ip"he~+_2sUxW*++,2W8=ͯ"dqB٪m p"h꾏/ JP@DN[SS) ©))iS 6@۷/6"dK˖MׯO|>D8UHw\ ϟ?'*=zꊲՙB8NeCY5 D ^NT/&5e==&бck5h`鉝Nۿ(7L!2Ӯ]eӧU׷&D8N%>w )k85ƦI.KH{gg蔔Rw}#ߺu‰p*o8͚5W\2=٠AӴi6lH0!jР>vvӧl۶:9y!h tte7T/7n@bFFX|Ytt=ƋN8QNnܹs7"᤯bcc5kN!P(SeŖ-+ 4?W{^w/z& ~ cǎU/3gD%_<:tx}E8޵5sts+dyr[fX"^װ.娝ְ zkժ[[7GdjzfͲC2B777 )HLKK39'Ii~M |֑#*' (D8Anٹs1'o_6zu}/̠'́aǦ!D}_>lX2d"p´9 ȑ#gΜ S4a=ϔ"lpۧ YD8")ygPvB-^Ydp)Le _VT1Q8 RYb+>' \D4MWYN4M4D4MӄM4M8N4M4D4MNM4M84MӄD4MN4M4M84MӄD4MN4M4D84MӄM4M8N4M4D4MNM4M8fufPtjX4M8 j&,TK|./MNӖNyD84sM8U$,,,'&'ɄdJe.81iF5ۨШS'^u4D8ѕNUEF^-jwçL;;'0w:rĈ;sdx5<]*w6L|K/Z/*IgVQz-zP+0pu~Haem-|9/ ͛fwN8WΠmbƦz͚ ڵ2/e'^ ̙3`??,Bx񢓻<11H\}OÆ2I.ۻQJ/9{dr&*Tr;q«NU%KL]Vpz96^NppիT!p(J1f:CX)KϟgNAA:fWݺֶvðެ5B }Nh&;Pnȡb92EbۈgXfi9?+K9ǎa01k%3fR08[Y '2'|&$g\)k/q}6~,W׸4ObUI*~IeM1 N+W^!p*cJ UrEI-0i!(mBcګpeAD:n8)-_ꆓbẂ&  i Tu\_5:^84/TIgHQvy %ӟg{{+V< & o|L'3V]V^= $4hxp2'Gq3FA;DΤTd\ί=ǏKH8MݷpF |[1hՀ<怱Mɪ"` \5F™380S[;ӌ+(:z4^Kx56X6tJ_m7[@dfJ~Lz뭉۷+bw"J')0d⏔7<pBAN AHNjLgO!"S = d`gD,Yd6]%ۯv#B9rիU5T p"'t뾼bp4D8߉1-,,8K8 K'\Z~pݽ>‰p" ԙ5M>d^pڜyvy'n}l -{,t +Na=z(<<<77Wg "LNg7t۵uhqƕa²SܒwS>cf.TzdX|3geU_&KܸQ֥0fz:\z< p*>S՝]r6x+}ڴwrXp*VwToݺ@}c֭v11]Giݐ!eZ+yzZFS. ©T;&>o9`gޮ9<й;8ggcۼ~SeݍQcck$(dH2>Ncnվ%ŜDdH;vhN.v_Wg^ bDZ>V޾f {rvuE;On};r$6e脷=u%iK*D^Ta=mfJ *S;w9 W>n0$!q΀Ӭ#G̯v SMrP X@S Ŀ>>~˯FM 8) xiIaJJQ#4 6˃$ӯU%5BdKYD<-魷'Try'CK'zzJga 򁓾oY%vYs;]ӣY@N?vwK:-,>4Sn{ڗ]`mkcDLn ьrsY@S\܁@;F3|id,~^髨E@D΃ϲo?T#"s?5So g&V)1to€[p:eN82`Zk"% n}uS F233eH+|5k fg.4ir N^"8ċ:CBiPr!Bo|cLuƇ ׳dՔwvqYdp)Le _VT1Q8 RYb+>' \D4MWYN4M4D4MӄM4M8N4M4D4MNM4M84MӄD4MN4M4M84MӄD4M ^{H4M* p9K?H4M* p\ $.*M4Ep|žhiZՐp((p('("((‰('(p((‰("'(i4M4E>8pž=x@4M*O}*<>ĐiVo<~lie.M4͟iii‰i&'ipi '‰i&hi‰pi 'i&hi‰pi 'ip2>Sb몶~|Y@ (Uu_, \<78U_~^MlU6yD8NdfuGŗԄS%( ‰p"'ӭ)©T43y7 '‰pbNo'a5,Ii=xwƝLBwJ GsssuNTԧC:5}?lD8H7L1Ӻ/&5%hĔݙ:vl l\<=iN6֫kبJ=$LN}x֭R̷[x4>w`HHYéy66Mt^GF;;FN;e|k+2r&ʹe _ojg.,{<۲lަI3Sb2C"FOcem[;:nvgF^DԪ} Gs4>/vfee-f۷}*d"pziAW)[_r^;q4~ċ\st]p"Lm7 nwXV0s6jծ7"nΦc 7rqs&3{󆣳KuOMIXиJ8eptr3uGNtQJ8%; ;kaZ6#NQ-ٶO&zzZl[iF}vp*78={,::Cv'N鱱 լYS;r}'m7;]}ڲe =x 22|...F,3|siڴ#t۷5VGy N*_[1?Q,vnܮY+m8 I8ag\H9RE\5xv>_H8PyyyKLLLMMС]֓'O222hѢ|Ty)S]Y3G7" HoӦMhF\tnݺ[E .4nŷXk];;;Hz``+޽{zz׏p"Ty;ٗYQTJT11&= )/<<)}%jԽ'ClY% ۆ7tS"sM+?ƌ7Ie%S3<Ls._Ynݜp*8.hC@"LN?SCXw@l5A/Rصk-Z׿RRR4ibek0 @_cFD8Udg*gEEn<N:ЉQ!AeJZ]FXcLO X(k?W+NhekIT^iiif'ϔ眖_פ g9k+駟*۵k'4w\'b{S׿U|O>mFD8U?=}IO.⮈&SA D /o6ʾXp ;uVl^ Zw}Qoڴ)-#*jX/33\?SH˫۲%not9L?J9x#Gj7mRp*}N}KD:[ " "J.%_{uĭ5l\Ҳ{Dԥ'':؎ 5vC'a^W'jnqV{T>p9޽{b1`!!!f]rުkicmk;9-X$һw?"'){Ç058 pߎ}!ߚV y!g ܄ n'G I5lCH4p+Ȅ7jzqkg w:+ W_斔y;PrS"#):`&(E99F?m (Ep؅FL>8!vO>שּׂ1BoUO~a(qϓ ‰|*y]KЕKX||Qބc?nE N5jhOe3 H8sF `cB8U"'‰p2Q+"T p"2) ͷV მX@f 'TPeUa8X@E*E*7q2N4Mt5D4MN4M4M84MӄD4MN4M4D84MӄM4M8N4M4D4MӄM4M8N4M4D4MNM4M84MӄD4MN4M4D84Mӄmv^g>*EWVKӄmpfHb4D1~1y)qZXXh_MN<ׄS'&'$d[?Vg|7^sFYGXZZ<]GUGN]idKsݵ ;l)7n5m*[ǫNzܹzqG{N \pKÆoETY8YW$Fdd4A`4pL_X5QJnܸرck֬AݻwDH*"hgXNNfeT܀>ӧ S50z-D0!4'Bw,h99r (O5&ayО s "1&֪תƥ٬[7˷Qǎt_}pR٨y CICjժ?DAZyCf)eA[\_WfN=zhD @@Dtj);pB:Ğޞ02&g>,W׸4ObUI*~IeM1NʗY7o,ST!מw@,^qq$Pi$[r^fFh!1TS9&l٢,r $qÉHi2TU7sjLvl i Tu\_5:^84/TIgHQvy ƂӡCܹs6d?A87ZO KΝc"gRj*2`.מSZ%$'cmĠEW6%12pROJ݄,05NFG] ^ V1 '}2mW#Eepz)xb{nyFOfNƅ$LǸpZu횜U fm^yS>VQ ! 'TM}N20tFkap.wYl)jnFӓ'OG`'C 2 ۸qfn=B0 YqԷ/ ?ĤHȣ(X 1W jNp7{6*Dh?tq~A8"~BDB᤯]6V([>{U&_w ҰaI&%&&;*''ԞA84d&kӦzuҥzwЮS; i7|36 w[T~~x733gϞ5kģX޺uo%hpSo'3Tr‰ 'p2sip '%\ 'pLMNTO%&DӄD8'3h&hc EipAOf4M811L$D4MNY2i‰i&'ipi '‰i&hi‰pi 'i&hi‰pi 'ip"hi‰i&'ipi '‰i&Ty0EVWeᗽLe+~(3W}ժf'yn+e- kV/+҅*X\Pb*O!X@f 'YWzK*n'(uGŗԄS%( 39Nٙp2VݗWLNs"M+J}Þ"̯g*lsF~޽,ԲeӒܹcO}F9ZѣpWWWxnn‰D8YIih^160 8 {Ѣ[$ Nk$ ݻLd`oFg}󳲂[ٯIȥKSn(R~h-=ĞSEi2˵<|0-ӁӮ]2WFpz{Ne euV)[Yf``ہt5ʧaC|vCi|jNs*W8ԫ+ѣBDtbme;OM8A4霜tiaYa(,.n\:~n!!imەɓHLMM)%&O)3> 99ǣ1NNKMcߒ5H<~zgOް!iѢP_rU1۶NN^9cnB>`@/e9rPɓrw=+J76XܳgpQDd~&4m| AA(nƎ*[s*=={aoo'NXef͚)0l>ע2:'OZ`XOH%X@9y@2=^Gi\!G_^{˨QC"[!|],~稨"dXp*ְ J @q 8d,8}^^^!$ᔛ{zƂhk߹sG,xm۶=?~1FRQuA:EG˵[]F'ƍVVs33'{N7484J89xZ糜< [YYL0E&fMz퓲4ܬYv=bP?+9'p쳻.e${='c #?ʔcǎϝ;guO}݇> $$4puHYU׮a T =ֹK i.U<#0@Zgر-zka Cs))KԼ9$la.sZFCKN"pB? ){jΝN|{NF=8ea2_J 9LrXCBBb]+"RnTN mRth{W\i- KLbϩCm|k1ɩ 铬 SvڋQ>'L̠{TٸEJH>oIw;{]g3f}|j.Y2СJ8 /D| Iי>͜91 .1Il!|9N_}"0i;HeJx0>ʡ DTbϩj=۷Ξ3**.((jTEkVvNN6 ]W,8UbϩjI i<Lj~/2'3'*NwuDO{N'‰=f0K XN{Nv'‰ĞDĺp"s"hʧ}Xpd=*_ko 'ci] JP@9DMNo_R,2K8e2/ *(W)ʬUϿdpi 'ipii‰i&'ipi '‰i&hi‰pi 'i&hi‰piMN=|xii8Nͥii8zYSp|biV"d8 >aO4M4jb8QEQqE8QEQEQENEQDQEQEQE8QEQDQENEQE8QEQDQENEQE8ihEQ~UjjZjӯpFQT+++pR DmL8NPU"GVANEND8QD8NDQD8NEND8QD8NEQSӤI[&Njǎt)n/#xbժUswwٸqc^-iUeggkkkSϠAH$J_*;8H_-~+‰p28X1 ZVM =lXWw%J'e~{ΝB8N&ݻ׸8::,_>[kתT9S<g 6svvn߾k(w ֨Q#\֞{pԴi*{MMM[SDD7|O?-XF믕mŠKXXعsT>p"L NC9eb9mڴ]NN66M>Vw~jٱaCXkݻGu+++//{:p"Nڵ/߯ dO귿e ]:vZhкuHeJn|Wf7oL8N:u|1t&pھ}1/5f̐oĸq] X2eܹa[>qbTxxg++K'!CYLjtΞ=.Е)s:q?D9s g'h֬YزL3gζm*ÇZ )'O~͛7ԩEKK'ON =+Z[X\bXCjʛp?͛7txnŭKwVynGd$ t !`pMK.m֬nE EP;V?A8Nfl7!zgxl^T [wڴ12#96!BynDDϚ5НBw A''"'dDQD8NENSF~XK;‰p(‰*9!}S!!'‰(©A~Xa;NEQ'‰'‰p"("'©<;(L%]G j p(*{<[UVRE"Uʋp(UEQE8QEQDQENEQE8QEQEQENEQD8QEQEQENEQDQEQEQUDQEQ&8_eni6 ?oO55cmi6O][7(֌)i\lʟsNEQ)Wj mWIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/vector/vector.html000066400000000000000000000063271506652756400235240ustar00rootroot00000000000000 Yoshimi User Manual ~ Vectors

    Vectors

    The Vector Window

    Vector control enables you to manage two or four completely different instruments all on the same MIDI channel. It does this by enabling Yoshimi's ability to run 'rows' of parts that cover MIDI channels 1 to 16.

    Setting a CC for the X dimension will put Yoshimi in 32 part mode (if it was 16) Giving you two instrument control. Adding the Y dimension will bump this up to the full 64 (if it was less). However disabling these will not reduce the number of available parts, as this may have been set independently by some other feature such as Solo.

    X and Y are the standard horizontal and vertical joystick axes.

    Base Channel This sets the MIDI channel the vector will respond to.

    (Options Menu)

    • Load Opens a filer window for installing previously saved vector data to this base channel.
    • Save Opens a filer window for saving the vector data on the current base channel.
    • Recent Opens a list of recently managed vector files.
    • Clear Ch Clears all the vector specific data from this base Channel.
    • Clear All Clears the vector specific data from all Channels.
    X and Y controls are identical so we only describe X.

    The upper button opens the current bank for selecting an instrument for the top row (parts 1 to 16)

    The controller is the MIDI CC that this axis will respond to

    The lower button is for selecting an instrument for the second row (17 to 32). This responds to the incoming CC in the reverse direction.

    (features)
    • 1 Off, Volume.
    • 2 Off, Panning, Reverse Panning.
    • 3 Off, Filter Cutoff, Reverse Cutoff.
    • 4 Off, Modulation, Reverse Modulation.
    Volume is in the same sense as the incoming CC, i.e. 0 is minimum and 127 is maximum. The other controls can be in either sense so you can have (say) modulation decreasing as the volume increases, so whichever of the two instruments is the quietest will have the greatest modulation depth.

    The Y axis controls rows three (33 to 48) and four (49 to 64) respectively.

    At the bottom is a field for entering a name for the complete vector.

    Note
     For any given CC, vector control takes priority over both MIDI learn and the Solo features.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/volume/000077500000000000000000000000001506652756400213315ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/volume/images/000077500000000000000000000000001506652756400225765ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/volume/images/volume.png000066400000000000000000000506421506652756400246220ustar00rootroot00000000000000PNG  IHDRLS* pHYs~tIMEttEXtCommentCreated with GIMPWQIDATx}gxǶ혜s09 L4DM6D $"#%9$r"gs޻|ouWOuuOЌ4鑪٢gjڥK?~:ׯ\p…@5lPn..\pR@r.'Oz&&u㯾2s_U];,?}ſ <<ߐUWפI?v5W0N-zKwYcw߱|`y%TT _vMڶԧOް/5r\LK?{.v9VGGsbg R*ժ-;[Mlh7{gNnxeˊ«Q㛅 ?g&M~f% >ƇÇ 9JӨѐw\#j2|,v5kjԩ㝐rչsTTOrep< hM8qq4iƨֆƹO,5k߾_Cz ڼcG{լ-mHr] h4jJѪ , džktжGߔb`TV_>Nr\ʿݿ_Zc)l#""w{')Vz% 9CL\NͦVOz*="9PB֭Uz?iR)Z.\8q)wxYdܹtTFп]eݍ^c-ASdƍP$G+>CϞiժDNr\◒zZ(@R 96lhA<}:e-tU_*֒^С ӢDNr\Ȃzt`kٲ#w*U/]5st1˗ݛ{rDz^pI #} &__$fYBr?ϜkҎsgiHGÜSRHN͛[[]z\pR>emLLUÂ뀌 G \ZZ$u[!QivxU$״m[b\@LTWFEUX}j<'9.pQ V~/ZTV,)S]ҿAo֒-$ '9.pQ VYo6S9Ka )Ph+ i$pa c/k`:\ijܐ_~.且gYq,k 6n.Ua"huZŒ/PR K%&9|лϾ7{WPh3򑲭J¶>9 '\8qᢐa3fXչ u%ܯ[޸ĉUY#$7~jJ| i5?XTn.S~Nr\8qUbAPҘ3[^Ik-+Q㛜lV}z1ŋpE,1mΟ/ 3?__qH5u6Tl0z4-Cb6`Sv &(mpE!XI͚B` +!Wg[Brp_:Eğٍ+Ӎ W,H2EEBh(w׮mFAjt1豤A%…r%05`#Wڵ vZBrn$gʈ&Mu3uB): ԛfS]Ip$ŹEetfJ$Mxށ? fl_xҪtU_n&X`gȑp%#+M y]Iμ,>zD8Y:Ԇ@H}Ϟӧ-"U>CP闚jCUpI .\p$Dž .\p… .p… Nr\p… '9.\p….\pI .\p$Dž .\8q… .MXvWQдm[mv ]hΝz$l~Dssk =$wԇ6ICMH>V&!o,$Wѯp$c׮]˖-2eʗ_~٥K͛7lذ8_Ap z%ɩ4ȑYf8PCVZreu?q/\mGHdʕ]/\$ĉ+VX`9s\\\f3x 2\8-W$Ǫ>,,lѢEC iڴYfxŋUCs[Ug77={֭[WWoիn) I\jp{W׊Lr,R{vϟ]oqg䨮O:>pj/ԆZ i\ײN}3zۚ5kN>]a$m^m*ͥyI*v}u6:jԨܹS %9¶f']Owy*U5iѰaRW+USokns7|aaFfݺUkǻi(4;wlnGny 9zónѢz VU7jnnݞkĿq偺tzZgRo19vX7anNARm,4W3>ڵ3t\sۣ=*Ŗ]5vHQV2v`;bt0S`i7ܰ3m־}}.୅Wؾ'_rν㧟b+~':(G$W_k}o{fs'Nm/_~Rs) 7nvjҭ;y4K$n^݀5ٻ6iqjvTz3uC|tW_S$}:n۶hG? 3wc"ZǮupQ[z0'7%d\=f=s 6χFzW||Fpr]H!$GP ]tbkc;N'i8똫 8NLr6ׯO GG΂W$f(ϲ6Oԩƍ7ϙTou+,SoV%iSNDr4ܿZE"{mrHGmzc|N?3xGu&3V^ɒ=T%b?ӅZݲmy{{;:9r`~ٲ~))XBjai߳'2z2ɭP[8p=d2$LrD!!!ۜ<+Vn3sUݫ|$GS:t`\-t^F>֝ҷ&/féՋp:zn!ꔦASu #@U^ufӍ]hed{bZ'|dӪDd蓏pqaI1LQ!IЫAp=IhO役/1gSyux \'#95,ڨ_) = 2C7b fu?rx'o &S7iNIV\Y>xθz.yn9[QAUmV)jH}QC6O6<0U"DɁۚ(3 HO[~Ob"ӧ ugVWZBr7mr ɑd mGM&v_L  i<#Q8UA ]r?;i a @es=D׺r{Zv|1߁_Wv`_Q $0R]=TsFۢPjFk ZVQIԈ7^qu%#guO/i`?~/>,Ր)^͒Υ`݄u*|蚶!?M%2*_;h7;<^YsHTT] $7!ۻoJ 9㝐AQK@r^qq E+Kkf2%9ñK/w5\Eo ,wn 웹x;D77.Z9' 9bfΜ)Č֘`яؾcwzm /+֠:tuO\AJ9猨wra]:e^W$Gl"J٭.zhJ6C{PJ w 0aWkq ҙ"9ڝK9#TiS,zʁZmQJFr+3b2^B@plr5{Υ|+d;tT~N$G,ڪUDˌJ>bW=(ҙo=}Q>,CuRa%W$vZY)('9_̐qӻ7~̕|{y f泒x/\f>}gZ͞>dY'Ήcŷ\ipj%ַ||?|ZλC>k~U~CC Ӑzz}8!V(WHש3LAϓdT\{铗oY axD䐣26nN+aK^*'w_"9K?Pin'yo}ؽo`|㞌 Y^3|7 s >}5pv?6|%k|ʩ =MZ`ˡ,#/m z/󍛷~}#Nuxl;iCD)WFQa nԨqx(>{y㲄 *>@lA!gȳ<| k>{髢'/ϜlР`Y 9k;flj^<72.jjN[\rvﯯ r<ح= UhMy!vsYq7pO^1,xB]r?ơ'ї RJ!%qVk*"ɅI՞=G۶]폣=ָ 6[ e~Π8}ʍbr3og[ef$gK-+ԋc^z+Iԅh3%BsZVHnF36 MUhظc+a'X7((vg.`5dvIdKG24YYzy+EFĬ8InϞ=46߸,ɥG?;u̹3q8%"Q[YeVI" f) 𰤑QN_-&kdoMq'!fӦ̌dvBD6V2g.DU/dӪzKrd۳gOm-Pj5 AJam#Cc)Șd{G,œ~n;ٷGg^z͙Tñ}Jܤ}[[*0?hE{D)BӖ@w*C1A]p9l;4f84qNib54,s '93RV`*Wz v[il`/}'W@$^/ү~/ +v|:,m@4 VSEVMی:p ۔r?z%q&L43WXX;Eްl۪83rJ6-z#CEu8ehEC3Bаc,vMK.8c6b' >X+l!wʅib(bPB-b\lJZ fà$g}45vՙmIV'& }ARz4YcΗr^^^Hiʔ);c;ş)` X@S;pHQJ si7גETcBWV*Kʅ" Bu ӼzHr{ ֎bw9WXݫ^8 6Nh,NtU=9T=.;&)tD:ud$G49(ݛDЉXr׶By^19w҇_&6"9,x~! +&o8O!(0}O)SIH}:ga$!5b5X䵔45Kr{W#Xs}lu8ɻN 묧+1p'biYV bm5pXLIO#(G,4Rj͠L]jP:ّ]5[03h$MR6jF?|Al1kX!5bS #&oX3^Z*={#3ZQ'9n>S˼v P99ZE'(z\a}%|A"sǯ8Zs68/@r!dɒ+1 B@2v|HrJ+|k7_K1FEa ȧo 2S9.9CRK2agL<8p0dw(hb[s'fb.Ŧw! %a'9ے%POI\ԵD~6q\5Vx(EO^BdWpU@>{,ٓCZnKO^=z̢--2QT<pJ|Ͼp2ONtmޙ\\X"N^ +ןZp~ yE&͜T.D\"1%9w m̘|+ȋA >E fnf."&8~9~wy$v:FOhw яO<Xz}62GeE$9)i԰E?jG + tg|Gƍ;0C5{NBj4E|N|c%+|-.^ǦFrFkm+7]wСoVN^PIW][ ?xʚ9!L{tB&,v@"_W*E臧7s8w&2Cxm O`E⹫D/uM@PE/<1Y]YNnݩ-|dܨg+ad?_OƳlX SeR O_ֶ}WW!H/zTu%X6@[$t3bD=c0sH\W9v,0ICF-$[DPq:G\cĴSjܩ1wΗ~ ׶rʠC¢?9) +]-|wq N@avY $(=Iu/θVVL) ZqQ8K}OXŤ$^g"s͢&()(p'#bN^Z^=S5hЀ"~K,- -cJ|ׇTrK=V+ia|r&@ǙB.VX?[AՐg{P)C`G2%b)OX!e\coX $V^xiz cw9C ܝ{n>JϹ'WQUK{"NMX^B}qq*O6fNXb3(p'G4_,l͓Į)ۅe~l '/Zz]Elew})|t፻EB'PuX.VFZalE ȗhߒ(FOXgs)E-]9zWԻ`=W35hfXMu<p} ,|d9cBL \MidTd$g7-4U.~X\I,OHN5\W`!O_Zhz]uTs;sz 3s-U^K,iVal#8W*q5^ͩK~B dN3^}rjpԭ[Wht"SD ;A \vnaVNAƭ||YzdG\?'fN3NOIN\eGSp^zgJq8vΟ?7c}疲<~(=8TJȝM ė*kj䰸Jc o3]-ϼGHHzbY,{Rv5D+,o6:Ɍ U x~E<|*2N03 q"+TMgzOrzp:e6mk@ \]^ͼDc9 cy` !c݅kxdĀ`駟mhԇTsVD6%[v5ܕkŢSػe&#H*QX^H` I#!u5ov6@1]U&X-30 y#}YPX?)Vmj$Uu0KOӤYs3# Դ0]]wWIo߾Fbm]OjԬ~*1p.1Vb͸ۘULbUeĘ4G)';qb>*}GWV v$g9vNR>7o>vky򾚐n͙#ߎ0EQߢ8k֬F@t0?KVP oƧ݄!j:@6uD2wyosV\~*ǁ_IlfޑWX =7a4C;zQc? NZիY#m߾]g+k.T~9x5p iF\،ۊiN3>3s$b' Af0.'8t" \ȑz6Ν;9YÇim}Yx7+`v_zd29+ dHrOXn8WԯUvxU"7"KU*r 3`#Xzr| $rECF!9zM[ 2h߾:Pxm*k1I؁g4HnF8d{DX)&coƱ.83\ǎg-˗/׷|+n\sT_uy#-.s+}"ɑг4P66o>JW2+&)+&:'bR"CLjfs`/s\` NDIJ7$]{|l~$ۡFE\Z%9`@S?rp]"7pYW233ߖ->=ctFIf7Yž3]S{513:!#*!=*15a"JX,4Ua3*h=gLl~7kɓjUaF0hݺ>3WIw0U/&"&Iŧ_Kιb枑 M^՗ILTLMXCm޶#Q}nkIhhRVU{= jH@^KC%pV glDkRnSTwwiE++Ę=z ݶĿӈMzIrɓ*rI,a~^M%۬_ψEJ ,Q$l)m!5pz[܏Ms|>tz灓,&Gr3\ ldrK..Bɾ/?Z.9[_\|5}l$톾I:uoHm/ta9j$ߙjG%Cd\f R5JB'_q1`PzD0sv|)w1/9p"A'2\͚5˺]a9(CTfQT}>*>c~C|8amA |޼yvhp9Rԯ_P_v;i`y1.C2[R*X" fgg$~ >xrٹܲ]ǣ/۷khM)rI3Y$6x@bScE)bTʭkw/.G%ݺp-CXo,9D3>zJ5w`KY{TsUz~pp-Gjj}^nV8D7p o<$g2Э,9Lw=\2zwF6s` H)S95n2jzmXۻSNuh WS-CSʣiCvWĝϜˡ#5njx}lnϑc%k7o 9|<E [,XOmw'&9j'NhպoF_zC^X^SMmooZlmGɘ@?~ ;J[+́hAZ$GD{٥ǡ/% Rqs,g8ڗR;;%ɱXcΝl4N,ØyIE}òt7f>"{ h }'&9 $Z7oڴ1Hr?z(86lP)heB%ᴆ>'-ӂܜ쀪MX,B,e˖e4qg,(IJr*cn}aׯnM臅yxx0W[]8X @H} {Rd^&98?z 5O?dYn=$$Y/'$g$֟[ڰaÚ7o^awfc#ID)k1 4VJ~h ?q/Tbҽ g¤8[̣> ,Xpot:\p!.@E .%EN~"9SXi=h[QhѢaÆr&gpqܳg\LXr37l% \J%W߮\ ,2sV@¥J"9.\8qI.p$Dž '9Nr\p….\8qI .p$Dž Nr\p…'9.\8qI _ӧ#G AVݹVxwBBŁi>;{ƭ[W^^zs$giOJժ }׷. % >$ק^;qK<^U)izzg֧}|,|<8Qs'^5MYOߔZb_l$(eZ kT\k"ZF_ҷ/^4mZمʓ2-%KpM>99-*td \%Pɶmի|앚 uZqlTͫV^rTӧUg!F:?pO xLbkI!SKD;u6DkMT KI[UV^& a@5#{ת˚u0߽J +{eZ8~~4`=gsW]z?д];\AmbAFf&t ?i"̵4\ ~ 6Сci9C 7,L3Lș Wㅗn&x~JeHJR ݂|vwPUV+1H0xΘ:ܹ8ؓz||6mpπ,#J?%$w:+ (Hl&p 1ݬ}{Z,d"6 o|rv P1L ID?7 #u&v6n,\쟖r`KTi9B{>/C|d&֭؁$=zGo">k͛TQqGƵBrHc4h<@ &sa۸1N:&0 j+Á)KH t>5⋏E!/9~\5O .07hGV=%$#\߷~nMY;vHT8 s,OҁERMrFr}Gtݺ~ꇄk0 .e- !fh,-??odrށKM.Cޕ+ W ʤ"cϞKra`>oaիq҉K6$qV',_NΫb8|-N?ްA$-@x&feYL'*j֫U||4^y)\}`{7ə!9LDP[۸U+lԪA:+= e3łrҬ$BC2KK3S<`O*)s" Y g#5p)+{B~nz$Eq*䱿7;"?$5LժB8pH[bjJNv%8""TWp7VS'q}j=ßS͔L@`H!9 i߳0[Z,yZІ>-'%bZD/3TL%ɑM֍cZ HLT'o1;*$Bzu8A㉉$FDɉw yڄQMK]@<<$?^ҙ=8BeZ%V%E) ͛KF᠈{pa|9y;I0eʢ#G8ɱ=j>J3p%ɉX;|vEXxHBbH8M9H.9&Օ$+b[;c '[pgא!j-a4$9*#O264L 4K2h+GÔaw"`́)ц58<'gy0+y3H, .vJˑ!%E &1-Cr` $Lu*A%ц9$ے&OiKiգr!bx;*J%3aPH˂8zmuNnPNrM˅%u+ FJl#5 TaXrS{ OӘ)D\I- $P,YINi9Rui#~ǎMș,oU2#kC6!QI`sML C8Z߬EG4XV=NhL e7¸pSۂ13"0䴟|5Ќ!l,&zPOhu+xj'=N7mkI Lޠ .p$Dž Nr\p… '9.\>rp$Dž .\p… .\8q… .p… '9Nr\p….\pI .\p$Dž .\p… .\8q… .p… '9.\pI.S .\)Hp… r ׯHwop…KpIIIo^-wIENDB`yoshimi-2.3.5.1/doc/yoshimi_user_guide/volume/volume.html000066400000000000000000000030701506652756400235260ustar00rootroot00000000000000 Yoshimi User Manual ~ Volume and Panning

    Volume and Panning

    Volume window

    These controls are identical across all engines. However, the default value of Volume and its control range is dependent on the engine. Also, some volume controls go down to zero, while others (for technical reasons) go down to -60dB.

    Vel Sens controls how much incoming velocity level affects the actual volume. The amount reduces as you rotate clockwise, and is disabled if fully clockwise.

    Pan moves the apparent sound position from 100% left to 100% right. If Rand is checked then this becomes the position of the centre of left/right randomness and combined with Width gives you the possibility of a small range to one side or the other instead of randomly across the full stereo stage.
    Obviously, the random element can't go more than extreme left or right, but instead of clipping to the limits (which would give a bias to the randomness) the actual range is calculated based on the reduced width.

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/wave/000077500000000000000000000000001506652756400207645ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/wave/images/000077500000000000000000000000001506652756400222315ustar00rootroot00000000000000yoshimi-2.3.5.1/doc/yoshimi_user_guide/wave/images/wave.png000066400000000000000000001303041506652756400237020ustar00rootroot00000000000000PNG  IHDRr^lJiCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|NtWUUUaaaGII@ ᅅ[Xս @ 0,ziX@ !0gtk +/:@ @#񉅕O%' }fXnU}內F{謙%"›*/#px JSGrrƷW~eăܛnvf~ֻHndBQt]tWnMsg<3oiK:bTe2@ 8 7齢isnm}ם ǶP|׍҉0L4PصOx?Z+x4mW#WkS?4cx?ۮ׭RԭӮ>a^ޓ\ =KZkW.ּ]9s'`P֯V|pZ 0'}#>=`s e/ 5GtSV[9`ֈe{4wu:gon&g}T|P|[d6}h9~@lEhjޛ2% rtR5\Gמ3|P̛IL\:LT]>MsBFjS܏" OY"VLnWR~K򐾕^_2bܾq9?TjTsžO=3Mm->n9kwxr'.IWMhlyE6+a{{\m5ɘD60epjSĻի\齟[J>~: yɄ6N(N^fg5~bUpl+7[f.KJo{_Z`eIw$#ð1j])fO'w١I9soHwGJZ;flnnۨlhl0+ᎴyբnfWmkpzUt{쑇L_ɩ9]yk4gH|EŌQ2Z?`dsg[/Ĵ, 鴭Xuu+1`)?uo f&t$3ٸm~7_,X;ǀL j Ss.gk>ЧmUS) x.Ƶ2ұi9lRnT\<ٴpsٍ^YN}͵YH޴&lԺϽV(?aÔAXmRFaTѹ=}ɜ}g%j?X6Mz?_8eHDٽD)S2ZQKNpڽ/VcvJϮ-*}}uf~hi'L־;ȭQWNi7Sݓ\/,9fofNRkUV &ʹ+]굗rkӾl_Tnդjʩ=ZU2j5ב#{QmB2/ӆ4۷~т/=?k vJnsC|dɇ%,em%I6`Qwo3֑׷ޚ}?{o_zDOhl>hYqj}aMYqZ}U沉SQv\Z>?aC⬄u:(l1뫜owWNn=ZzZaO=v-=IVx5*3(vj[X1jgB>0# U 5iܱGTgžw/}7-osش!-Wi96˶KYv^b_Sc믦o֭Q !}(CtiN) )&pr-N)Xэ<ӝzNS:|F0N;Xҙt/oL6/Gu^~z(;oB]B&"ot͞v{:||iMVU٩N\: 'og꠆͒_>~6VRew}~(>mz Z)i(Yt5zHZeI$nݴ:Oz(mַXsNؤZ)쓞:2Jxb0UVg{IWp^"08ZVp6<,X23@ZW4{FHm9+J0˵ٳt'_\LlUĀ{|6K ټ-Oڢv`?ĦQX1UkDMxlі=k*uFM>[t؃[;7J=o!xl io^` r?ӌ-6kPBuWFe=$.Gŭ*H19 oY;U ρ6 tw$N̞%Z ;IeM%c+4^drYSp*&[;b^\Y3{T 0[ne xMigY%V/ujM}8e@tО~T}_#ؤW8{|hZ-@֯ hM-R*W@:e[8,>t\ eߘ6 Lϖm[ɨI$`VOLP-vz:(ԭU0̞`һuk q2uvk^. O\?|l˶[ν72zOJ}[F-`xSEԯN%)+dzT4RR0N>S|ԡmfzPgS*¸Яm4ş}LnVCg/" oOӵ-ʙ}q6:RMr|ழ(U{4LÀ{|6ⳏoS?շ6Y$OJZKJ)7UJ[lYuKvr@ xS(}N ZTڟnzNW_:gx#',S[Z׽/һfYYٳeyU\};?\Aշ͆ ͣ0Ǥ[ž{o : {g^T:Q Sv׭N%)FW2ɭnbԗ* ?e>mL%+9OqwXslL T oZ{a~оjFJuuMߪ yG(2oD+:jdly9YCb3ЭQwO1ݷ_ xUtk~]c)MkhOZŋr幟ѼVq%vlͿ0S|'$+/|.w 甬 ܏xO7=+牜V2cp},V5sUomG_ޥZ/5鉚 :~hB^ȕi._m6ܔ\x.֋dyr}XͩZ[žlT%KO'tlTT>fkaPnt < k9`y;K8**avI2.zzٶoXZmֳP#?h~*VԘ ;U2o46A L]>2b:!Cz%;3&iB L MJbMCQ yӶH@ d~аx*V^wBj@ Bm"XŦuL @ Z~;+ϭMha!@ !aa%cʉMH0 0 0fa$XaaaaXaaaaVbaacū1 s>V0,LP1>ðx4bof>ðx`%aXaVba`%aXaVa`%aXaVba`%aXaVb`%aXaVborx<%Jpa`%e0T[xq*Urys=cjZrece2etd9# ҵW_}Փf7xߞ?g X֦MŀNJ,l֬Yw}oYdɒ4׭[fY9`X'X)?&'CW&\jU\a0<{嗍kڴիWXQzuXb显}>ӿoo7XpoܸEO<8o喧zjѡV֮][{~WRPP3fh?۷o6lhذnW^6lczūU&5U-d1VV|q/x{/'ߨo~oʔ)/2qbŊf֦ܦ*Zh͚5N>!o:`N:~+J,7oqF*/祝r igK}Gբ밲e˚onNBJ~8_|t3b`%X`,Ɖԭ[ק SN1bq[kMy׮]K.UzX&ѣݑ#G&ߙ6m9˗]Tj00 ڶm5[n=cƌ~W[x޼y\ 籕jӦ}'Olmr>"J4r{6]t3.VXbxoNpmΙ3GCky-[r)pl޼ҥ=V~g6.R}Cd.VJq/q{9V5/k֬1lu ^e-+J,1Wv4_mi[}UdI_F+˖-={vHX)n~kܹT{'1NpfJR=G˙c7nl};vXuMjX>/ZHͨ;:J 1y^kR̚` Ѹum(P@N}Qr:@#B}eGҦ5H\:X~(gq:7d9XtNpY>}콍+U9LWƏ>7j( 4({!n~ V8ۀN2WvJ ݝ]^[ݚ`Bߪ4zw͜1=^T=!!+;?(3/fLV2J 90ñ/ab% aXh0 fZa'>0 +1 J 00 0 +1 J0 0 +1 J ðJ&v0,m aJ 00,2OͨjQXINjJPC 55PC D 5P+QC 5J 5PْRXI)B 5J5P S-/"PC ĥj% +)EXKE 5Ԃdt/JPC 5B Q #=6J$jVUWj64RJ$jVUjѤﹹ`%jXIƣZTeSp Vjd0:o5\WJP"j&8Xj`%XIڢaE t +*Psu;VQ7tVVn`%jeZ$V^*P+Jr 5- `eXDVZjI`%XjYfSS;D$WQfO. `%$Pr +6ePt5 1ҍ+QtXZ6S ] 522bZvJ Dú8j`eF'GےbXI.yv0cF ^wRP+]ntC j{bXI.ym]eJXXIE `%j`%iI7$j`%VXn3%XukRP+I75OVIBj`ev$j`%Vj͓j`ecD-{%`%jQ栿tC &XI5LD-값t+QD*ޤj`evJߡV `%j^$XVV `%jj`%Xj `%jnMV#b+I7,|co`+)T*ޤj`e|b/\XTK+JԲto 5| XIŌZJ D͓yKi0 5JQ+I75VF 5wiQC!`%9UI7P+Y쌕XUQC +QKXxXXcVn`%jj`e&ndIDI`%%DUQC u])FQ,8/5*ޤjE=V2b+X.&Jkz<աL=jQiPC dPC jLbbP+][}Rj`%XjAqN j`%/j`e;,S3n?PkLRjd#7|rVzx5P+ȱ2)-ɝP~wX|Xa%4$FsZa%/j`'vv2=Mn?P e>PC yL[eL"PC e>PC A 5ґ/j`'{/fl7 jAj`e6TK 1nVFgwPC 5gIXXIVj`e!QC 55PC Z>D 5P?̘y(E+QC 5+z 5P+xPC z 5P+xPC $jdVbE+1 J ðXʿ`eSsafVbŃJ ð`%aX`{J*n:wORwq)FVv7Ͽo֬YC100 ױb7x1cXE[0 0,XbŊ\r/ZSO=cK.5Ypay'x sȑ#_x'|2w܃N+-[=Q-i5hРH"޽{Æ {]}V{!V^mVu>/O>F swT%c+1ˑ#G.]#~j۶mm- [-uCtMFkŋ͇W^]c 7s ,s{k׮׿뮻K1)`YfIǜ>zh}ްaѧ`~]M6M{Zn'O`XvMbX$ \PS*Se4V_~_͟??ްR9nkߴiSe˖?s=@מٳg ˖-ۭ[UViMHBj, y7s^k ngϞ#f׀\VX*P5RX]хgb@`nN:VtISÇTRm/J^;uCV٢EF{^Cu5O>ш#FhbAIhcǎ}MVIS)Mu+Wj\r*P3R}d>D>[nE%9VkGoSNW^"Ej˗/[oF\Gt2MOeC {`{ҬE&MjjȐ!a< ѿKQYjL~q`FNSPԇqY].v_8p`Μ9[_?`顛9s> Vtۙ~v"0`>7nܸD^nS~8y훰⠂>72|T.X`YeO*=7oPT9s.п*3龲5*6X)q9)47Ժ;ͣbyOҥk;nϮWe?Jm2VLCǮv26t>=QShٶ&"1=Z4omڴ V7dk5rfw TXub~QP'=_?`n_B 6vBtVG#+^n|E/ߟiĴeO٫wf,Ǫ9$ӰSC&mCo*Iʕ+>[1jA[QF|Ke{h V}w$f=tI\?WvGt谗^zɻ f۷S.&Myٗ/U4q4Bvr٩E#q2&?Эקg549vɮѳV|) ԀKPg2P/w?QX!X Ƌ/]CĿȈ.< vm .L E&"B =bG +I `sDsݐ?læ.Yyo~?ϛڭj3+xZjlMj㟟0ɉ[>~JamGBE, ,2{)Edk~r=7׾;Q-WSG9y.U k<_չԅƘ> Xa3Q:MԻܦ9V+XvJYv{v9w_\'Nj5'wTX9[ 0-X9{ɊIrf.XTHQC<6XooQ߷)#w2wXJ;y?rrµ]GYfڜ%?v/ݽHv3eiߡѓg,-O+8Q++ø:2T`)D ߭Gŋ畝`vα2%_ik~uG b]:_g:{* 'йjz$IC'΍8 w` +]&~O} d6Kw2+5EVZm8p jM=r2 SY]# [\?y]sw{֫hI/3}=!#Fa~F*k0MHgG3Vo:5:S:k"gQ{|vʫn}t;&wQI2# ʂE߸<;jT!TGdJ'/-\NXYN=qZGr[vJ`jH226K}ZB`ZF ;+p`X)~gjXoo~jWoذO??+%>lڴH:m_W'V\q2^kgڷS*q5Cg._?u+ ^;j>J-H 57mvFNԢ+V.t-TQPY[5J*֘%~j65v*wu֦iz)zҚ(b5#5#2ֽ~Uja`w'Wtsn5W[k6_)etWhp G{]W <2eX ݪcΜd +-/S;wt2Q|vr?R<.I}W~(-/?oR K^ULw[nk=T`etD!VjL8; V>W*G%t*jԘ63WS-Vb%qCr5]6l;n j=gАZ+@TGb6Xp&s;JM Vѣ9s˟?^YbE:t0tP}PΝfhvXJC(]t2g/3yxTC7`_+jbT՛{4VT;xέ{ quXZjfvvr5[X#B@`{UaD(Y{@47vcʴĭ Ujzb3:ZEj>SwET|ӁFCqJ̿o?5١6̈́d\f{?=-L-3ă3eTaetZ=;Éⳓ䆄)ܯf9X|ՙW.fض}[+0-!JYiFRTÕzZ^KzXRc3+y҇~;1e]338$,qe1D-5:FM)x5KW:3.<]yEmw+iS__Un/^ ]}E#VnTYT'j7VzLmTkgS>bLeʔ1\u䒼gx׃&bƐ78q+X)}}vqf*ϟ[8,3T6ԊSvm}^oq=,m2:2`1XV&Ne 64;uTFN=-'ʎfu'w:vD/ίZvK4+;E#VꃺƦ"~poԩޛb*P< +T~d5h.,Jo/PNI}*.9Lbq!Vjĉ>J;v3fLē'OPT݄~=z~ÃcJWR(%խ)8֓fVEC ̯峝`Gt:] Oz'7g*.uB+J>TOɨY mՃGMpwqiUO5AW.|~91& 5f6յ4g'f2+m*ȷu`zWU{c+iѩ* WϦt߼kZyzզI~)4= VnTtP4Wv0}^ 8ނz)'6gϞ5}#5LY}#F+4AȻdjp7ڣ[N&5zN]_gm{hkSgԾGjout= `Sբ+Mʁ>[X)RTRBVR&?Nw/N}q[r:jMTAщ VJ% +M]T#֟6^dsodȱRwhRr:ambV5UZv)2C_~q^V~:vNrԥz!q)j6|.Ӄ,8aƢOZpJww(kg5mu_ }Vx`?ɰLn cVj>iz WJ6xY$֩*=PbɯJ4x ںwW)n6-!HZWvCi֪JebS-uRN ?r(J=Jj+CoVGYsYՌFgy&J`X#Óq7j9SJ|o4U\\?=3KzB5z4sCTEKge:uR:+qNR7XFLMߪaFȢB\xXwPӖ0|,z^ 0RCRF>rn /ܽO؏LQyȔ]rE65c>{GLLr8j#5]:~Da3 oSu7*6@e|gc1KS*%5:ꏕ껿}a3>tb75R!y߫H]Q+(n Hf?9&Uv"t2ox⍽M9^Ya^!:j M}tM:fJxcjQ WrXX)Sy\ߺ4͸Ik>jC)w5=|U/_Մlzti9Jmԣ5-7!R푚4ʱRPnK wRiLRV@t+=b+c' ghզ+7ixmfy+7Od̔ydMpjS޽{WfHl1ؔ MFM;'O)](H#jɒ!6F{*P?FMWҪ Wz4z~G2[JKbein-^z6:d6o߮M655J1mUcֿQ ~ʎ LpUH~>Jַ(,T(3󙄁RKߺ,[vu+g_t)ߩA'Y+7F͉ ݞ;oSۖ7JMmߩSמhӮcMD4:=V&X^`3bT][Qk`eXff4lG[ 2*}PðR+hXXeQ@rz.oզkmgtӄgVjHTU 3Lm#;vnmoͿQf7.V KU;ơy8lTur=,74sk,[cݎfkѤfYkԀ4p䤢KԸMlmȲdMgR h*I4\FMOԲ VWsUUlY{S;_5'(/+k<Tvye'Wvp!9zV{5 n֦[*#ҰnaECMU?V~fM19Cm5`#j +uJdb*??n*]xV tMT מ~e'u^9[ x伯Z=?hS;GEf ;Sp9!9͇KC2i$v"7t]?ULVpl.hz^e;ͮ:x#'v;-/i N&j ̞C|CkFI=DjJz;'Tdt:VwUN0ٌ|23SwH dLqTP˪UvvnXL`e<&+G5mRzGxJ\XGCXɍJ[ +e0X>uTg)ƕI}Ц&r8MsDˑTR`%5MAa XmZ+1,J,}S<;A/0aT| a`%XafaV&2 ðxm0a%ÿ0 і$a 7w +1 0 0 0 0 J 0 0 0 0 J,1>eg `,xü_sT`B9ec~{d0 F!2!JQ`BXQ`BXQ`B#V2@8րoHEd=/-h+V?G ]{KSN}5Av*SNW[o/_)N}I*-ZO>5j(U)N}1``e|j<հcVL,wo&̙3PLFO$zgOtF^:wOM`ƍ;HlҤi!iV> 3+c+k?괣+g̘.PrkG0vnkku +c A7:t]V`ef`e換@{__Fʳp=.lwjSӻ?}ڥ/9tTAĔ5j֬8KyPjqsgr?8H02>2$u~/w˯+]xGFϟ??XŃ]&*٫gS)K(un/㩋_>>\kaӶK#˗/vZ2 +^zY]V&wxVX?Wp42rً_|ßBbvg$Xo!+#h"6Zٞd9Y=n<2aZwxm6o&kAS8|N-z }-N 6j̄;>t܅K VҧtX4]`RyCgM⏝8վ= reef9)'ލ76m6ohoy9կ~e[oWE3V:Kven1tɚΩ`۶pJ7/Vfaԭ[붽iA9+ +f2%k6nyٻ3~rnR3}]h\B5t%$$hme@S;|`o>k_3՛-\pȏjd)8tj5?3bN:TV1s+}2!V "M0}t}6XsP}_~Y_Y/˭>{~AχM65%JNL^vM /]rlSׯ^VS~eeѳW7l۲M{M_PMostݖ *=(Aj:>hSCݝFeW_o埼+0/W%nxʡc&.]C+7H3W~EX)w=}lذO?BtsڱAUK}(trF ~j4S|@Ĕ{y Μ+}Z+50KB=Ν[mUEh̳JRqa .X;+hnp=ۗ@ɒ%T_/Opąk廽 Uܴ~Q5J1٦}H^YXIt U VUn:OQqg`tvg97ݳgvZJtӠnf.ZUG&[Paԙ] ՍDV64iѣG-.qא!V.YD;hZQX9tڪ#'ΜZԖ ܗzmoz8~NC@j7ힻxJ;lRq_Z+e;wyWTW/Ra|.XXOzV)'.ٽ('Z oAo/]Iis[cPҾ+E/4(be"m6r#*ⴰҿXP-Oڵc%U|~}f,ʚXYnjwnwdȈ+UJW- RX*V#z+PMb<<u`r"8fjj275ح߹fy_GeHymB?SOz_}7jX[+;%V>2e{@.H)Є)#`e+_o.Pc4`biEUMkXzSBĴ92Ϧ"ԐjǗ*GՌjPc$T$--ѪүkQRt+W\[adgȉ _ΘJj4 ՍdV*th$tbR`7+!*0ZF>%͠4g6?5N;1BilăaUmzZ3+ +YC(R1*r_Ea f/^F'9PfP)Yr=pjș9@" V|, +5rCɓ'c:]R OZiTDR1=~ n$rȐ!^3#L\2(hlML} PC&H_ԣfTaEn_0q`Uxs!#|eGYDL5C9#AD$g (0E$9'!ÐrF%09{㞽6g{kzz{z窫ꪻޮzNf&;RD-1wtJe4uݩmF-#{iV:|0w52?!J=L(E؅@VGJ];eCd'~c:xI c@*5V=GfY`lec+uo5TzVָ/Nl*ZSgO?IK5PH([S2AJ1W kRt0ۓ?rS6Mv><4yv޲*s zT Y:mw޻Ɏ~*jn&nz-5U:{[y9SgIEGrJM *gSXZw\]*T ;1chҼVpÓfl i 6Sg3~eF^q%s~tҳ6:p>/UYSRϾQ!g OQ g[bPĮ(yarf,YSG,?s3#Gsc+-nJnX tÑTXeCcK)h j!d^wzr]<2V1tOULIE&FMH+tPZV*MKpQppGfw޶2U.׍Z9L)4%cjL+ݫón%~mulU]ZwOdǯ],L )Ch+f[xE5c폿ԍo5r 'KاLҴŤ|+ @̓C[b&ݯ~_ʔmEW$5ޮ]VP'u׮9w7s~&б}C_Np7M3HBJOzk,loLr~@eϼr[J1*?ܤ/L Voݶ}GӑMj֤ϐB o߸󪀭oVW^":Jb rliaM~@e߲J^(Gc*F[RSFg_nRU D7%S|p$G˗L*M7:2S_mQv<;xcde'jC Nmeu+Yb*}kF-Z]vcϹwTy_O#t` Ĺ,;tƀUtr:'_5bC!O%`yUk ~0kotiɾRAރb[W.7ԯ%FMőWW&Xq#Cݓ?Bvڀat8ES{=g/z_PR-uD3͏RQjj*ަ^daGuiJndmn#1x#Vnў݂~,7^cW; {PUJBw_SbMOqdm]z鑝89s7yc=>rd]D.hd7F 3G1dS yL鲖رzvr]GVnعh'G5R}:ZmAĀg;ٟ9Kִ>hpC*rǞqE/lM!~+_c~oѩnݫbǗ7QNq[4ͺ:I/T4%Və -۶_z5߱?iϑ%?m5[W1e֢-Zlu}0fuBxVb+.jGyԗͦ\i^5`4}A5rb\mTzӮCvٰ1eX}ܥVR0n6ȩeU 8=h^-_vqVo#TҘe^wEuHE%KY6zw|>*YwASz~Ou:=Mi/M{JzhrVWV7X-[(/!K&j/ZoPJleD,Q;U}Φ8R? )3PF~*A< YہH+dB}Jleچ!cRNxe I"9_\%ߠTSBօB t "xaxz5/7D4*) uB֭SQIJߡ4>H&I4XI' JDDc(=&]갩в1((Jē' Am!B< qDJē' AJD%8A JO w.' A5VW 98A ):!B@JB!!Bi;̶+Jj B8zC!$xB!<ٸЌ qx|& @FҵLd̙me @ V:+ @M7o-^ի3 ɓȑ#J @e+?Z[|򤤤0J'ε& @tn+۶m[FU6k,11|2dH-bccaÆie.ZgϞS~z+WZ*Uq7n ڪM6O6-Ur…kSj>mek9'l% @[V+Vu̙={ڷo_N4VoǏɓ'˗oٚ1bD4s… oذAcǎUq[l)YNɲe˴ĉV @dlѣ֭[Ne 7nl9Ç{Jbܺu8f%KfNP1w0[;v,ϛ77rԩ 6 g4m%u+ Jrʕ˗7e,Zomۦ ͼr*6QF~mEPӈ;V @mիgdpzcƌ1 m eM!ZYu:i  @%mr5W^JNŊׯd'ŋU SO6qu=@l"f:Q @Vb+#b\( @`+D! @[  @V @`+@ 45Fנڵuc|O8Qh80)) [  @m.P~R[jF[|r 5\Ҁ[  @maѢEly2e4ң+[٣G+Uٹs>}hz)`+/ncv @HP6k֬H"z'66YQG5j**԰=d+]+aI @HVnaÆqi\%Jg2Rʛ7cǰ鵕F' @d*TKsol% @j3o<G w|GޮleBكLV>̚J @HV7oVٷjOJ*lTm+Oa?a+ tN[  @Vb+3neCJ @[io+vZ @V:`{fa/ྜྷ[  @ tyi 8;:m]`+ aio%o[*7cJ{ @`+n b+; V^z]v괲xG?N[}H.[  @mV믷v[\49NͤV:Kl% @Hו[i8m۶O?%JVrJ @H9[E歊sHla+ @"VoV4ȼ͛7ohmuxJ @hVT6m4?l% @Hv[&;k6Mvt"ڔ)S[  @BC;㏕Twbbcc @ݡ:QhM0& @Vb+ lgX @e`@3tJ+ ذ@l+=vV(ag#kLcVV a1 YHذ@l+HKfMl% @le4 [ $w+ @Vz @`+z @d <(V@@u .lodo+'MTre˖,Y]vfaju'O#GhfĉڤF8p`RRʽz*]8˖-:6Vzh  @Br˖- ظqO8d[|rcԩcŜ9s?~wŋo۶MnV[3 @$ JyE>|8rëUVLiӦyg+{?~*;wܧOY/EVjۖ-[VZzM6ͱ@ YV*C٬Y"Ei&66611Ѳcƌ̪UT8\rF_[9}t&% @҆ ƍרQ%Jg1Rʛ7co+nZT.]L<СCJ @h*Tne|LL6Hk׮ZnJ@ g+Vzw)&;3 qpGwTV*ThϞ=Nle+5sQUٵ[  @QvȆyf}_JL}JWrqqO67ݺu+^ Vٷ̞=[uTΉJ @4: @˜J @l% @[ @Vb+Cp~q#O@Qv$lVV^q&D3θDӑDs @![6[pL0.Qs$l&2PJ, @ 4Ѫ@$3l䠵lNG9  @Ɇ,D[Z)ӌKtI@8'@$BC񷍰X(  @R3i^6B9ȁpNH6`+f+gq# @dC2J-2:G9  @ɆlexlPMG9  @ɆlexX 3ʎ$r  @ \2A2ƥ2θDّDs @!{2F @>cc+ @J @l% @[$ @J @L{͝;w=m3gN|tMŋ^[  @'e;ԧǏV @d[YZyq/0..B u4he+kN˧N%}z):|[ٶm5jTZYfyȐ!-Z5o uʖ-hѢ={VN뱕@ h+WZUtibO82 wYp͛7k^VN4ɓRn^Dݻwg++V꺴{1+ :o߾kf={GѡCl% @H$nݺrfk,TMI&f%m|ӦMMD!ѣ֭|7N=rfn*Ydm @8[yQ6>P̟?Jl޼Y޶*Vjsnmʕ+˗/o r*yZomۦ ej׮ @8["fՉ.]\rB%K۷O*ÇƍUJnʵ̙ckmڴ Vz[  @f[٨Q#I{/)S… 53e8oGIe+Ԛ4ّ*V)ZX'NMjzիWж{GJ @,z*;t @Vb+ @[  @1rfV?V @VdM@ d+$@ZM @V+:氱@ 4lV @Dϫo|~ǯ\@ә7?W/A ?vС=-*yG~h[  @6[v2jNS&~{99/;|#䝺5rC-<?\nX?-دݸ^F8np;V @V/Z=x?r{ѵe>G/o=٤s(wxͫ)J(Q>g_j۶eL3QWѴp ꥏN_AC7oyסv @ V~".eGHKxݳM nGh+\3 @ d+ՅdOXrwDgJ )M(Kwk'7e^:e폾|/.ٹ7oOރ>:]wGj-+eG(c!B(3SBr{5TlMro&h% ˃'^mٲ*2GO9|E˖i(@qGmv$79d谠wD! {!\k_u U|/Y}_TRk8mǬ;JܹH"iy3kAʕ+ ɓtҏ<ͷlْß?yfPhܹs.\XT.]l۶MD.+V;vl'&0YA,Y_~ư8f5 y0yNcAxSK&U?sz;m4$$$88ɚn99 @W6B9q~!n*M3D y:\>b!#F=a@G5Gܷo_8KK~V^;gߺS RkFţ\ -׶m@^oߞp'eɈEURn ǫRAӶ CK֟<`ͫ6%rf憎IcΝ;7sSOwM55kέ9 6xWuп:=3@l`ٝ`~m0Bfs<}!As#q~mGÈ8X5F_ۈ t$"/mڟ6bm:q @WX#q~]yJOJ}Z _ѳvy~u|y+_9s3\IܓR̭P|*k6k>JO4?qDl% @H$J9<\T-FzFBIګW/c+e^G)24t|@ ٱɋnuJUW`*om oRWD4U*vGK *|]-.[  @(; H @^RYVȱ@ b+ܤבc+ @"Vʢ,7V @VgEK{ @[iYV.l% @Hfʨ @[ @Vb+ @J @ą9eMXt%m @>E9MCi+869sf @eod~+u5ʎ9Me @&ҡ8AVp  @$!2+f+5e| -kcـ @ iPjH4p(-尟\6 @Vz`\dy *\Zz|tM*WuJ @Lcq[$o,Pf;rۍoBpM; @5% 䔭;uYtۙn-7WΝ(^c5]wK.C|U~pDt؟e @&HhJ_,]rn;}vau+|\[vzPR \#cZb5Xֽ,SAr+ @ sfXfReleJ+'ݠfr5evY`cRJl@ QɈ3V%=av/>د|4? ة+{ß[9Rle @ Z[)8q3Bme e1J3Le+OOΣ̨4A  @ Z[3gy~dzn.ZB1o*vh+l=zTzm@MTAu+.7_m @$ }FWƱP"5nڪ@u+}mΉ?>%ʔϓ?Q#@ VF @[[,j+uJ @H[pwYnȱ@ b+e_[t\b+ @o+̢%=FLV @D4,+NO @$3le [  @V @`+@ Jl% @,Ҿ2gG{a+ @"V=eZb4?k d+C8a+ @"Vg$  7[V[  @9<5f'WެK-E]װ@ QtG|≯A[>ʠl/b/iۚ@ Y>[yǜKvSV0߸,k_|/|l% @HV>㪼ݙO9u+U9yc+ @|ҭ UJW?ǟV @dle~ .IM޻m/^%8 @HxY=WeI_]֭! @j kc~ǿs>Rf+@ (;D! @l%`+ @ғ42J @Mmr2V:<]J @d¸#l% @HxAJ @l% @[ @Vb+ @l% @[ @|[K|Sl% @H G儭 @Vb+ @J @Vb+ @J @l% @[]ldθ'} @Ґɓo\r,xcݺFz|ԣGyof[7f @Ĕ+Wwx{5n\?gΜc !BV>|m}`sJstSܹs)RA^zieR6цիW4i$!B(l^ݺ5mVO?=\vу{Ro1ܤJ ˗Qז-/_>-SjՊ*a7n|Ib+B!VZ5CmZnVVVDbVqϫO6M5vۗPNbŊ^y~ \V:ŋe~A(2q!\9He\fvw}m?[ʖ-e+V,+ؿ3V#٩SKﭺti[P+i9sW B(mÇT/Y2E_ޟ6iҠpBf~Ѣ*VJVh>}hҥ[ʕ3VGN[iQD!F[!iMve+3QMرȑk+UlY&"VzDJBj+[骃j*,_u+yl۶/V(ڵj?;":kSu@DJBQl+}eHleJw)_CݯرC}[kMAÇn WOPi4 %x|yN|ذ&L;)2ua+!P6eleݮZի䓃SR7t*RW}MYLuBdm"oYB Z]Z2[B(J_[%&[BEz2[JV"l%B!Vb+i !PDVo%V"JlePR.>xck"\ ވB(\ҡVS'uf":q_C!.9|Ha+g2ЊB̗󇔱JGҼ"B!_ڧh~kt#B@J>ڵD!B[B!!B[B!!Ba+B!PJB!ҩd[o?j -)ڶ]/=mv$ZPLLLLLLLLL7ж- Yoshimi User Manual ~ Oscillator Waveform

    Add/Pad Waveforms

    Waveform window

    This waveform editor is used for both AddSynth and PadSynth. There are quite a lot of controls that are highly specialised. Unfortunately, it is difficult to describe their operation without deep understanding of the mathematics involved.

    At the top there are a pair of graphic views. On the left is the complete oscillator with all filters and harmonic effects applied, and on the right the basic wave it is derived from.

    The narrow images at the top are the harmonic distribution. Each vertical bar represents one actual harmonic. This is most obvious with a sinewave base.

    The larger image below is a more familiar waveform as would be displayed on an oscilloscope.

    Note: PadSynth doesn't have the Phase or Harmonic Randomness controls. Instead it has an Apply button, as the wavetable has to be rebuilt.

    Controls

    The bank of sliders control 128 individual harmonics. The top row being amplitude, and the bottom row, relative phase.

    Mag. Type (magnification type) This controls the amount of effect the harmonic sliders have on the waveform. Higher negative values giving less range but finer control.

    Phase Randomness Provides a small random variation to the overall phase. Only really noticeable with multiple voices.

    Harmonic Randomness Provides a small amplitude randomness to each harmonic.

    Base Function Decides the basic waveshape. This is applied per harmonic so, for example, a square wave can become a complex stepped wave.

    Par. (for base function). This modifies the actual mathematical formula. For example, with the control anti-clockwise the 'power' wave is logarithmic and in the other direction, is exponential.

    B.F.Mod (base function modulator) This sets the type and enables the three modulation controls for the base function. These change the modulation formula in ways we don't currently understand.

    Use as base Use the current wave shape as new base function, which can then again be mixed and modified with all controls.

    Wsh (waveshape) Modifies the overall waveshape dependent on its parameter setting.

    Filter (harmonics filter) Various filter types applied to the waveshape. The first parameter is the filter degree and the second one seems to be the Q factor.

    F (first) If checked, this moves the filter ahead of the waveshaping (if it's used).

    Mod. (harmonics modulator) This sets the type and enables the three modulation controls for the overall waveform. These change the modulation formula in ways we don't currently understand.

    Sp. adj. (spectrum adjustment) This provides three different types of adjustment of the frequency spectrum of the overall waveform. The control varies the degree of change.

    Harmonic Shift Changes the harmonic position in ways we don't currently understand.

    Shift 1st Moves this function ahead of both Waveshaping and Filtering.

    Adpt. Harm (adaptive harmonics) Changes the positions and amplitudes of the harmonics. The best way to understand the relationship between the slider and two parameter knobs is to watch the oscillator spectrum display (top left) while adjusting them.

    Clear Returns the main harmonics sliders to their default positions.

    Sine Recast the current wave shape in terms of simple sine waves, producing almost the same final result by setting all the harmonics to suitable amplitudes and phases.

    C / P You can copy the entire settings from this window to the clipboard or store/load them as preset; this allows to replicate and then further modify them within another voice or even to use settings from AddSynth in PadSynth.

    Next (Resonance) To AddSynth
    To PadSynth

    yoshimi-2.3.5.1/doc/yoshimi_user_guide/yoshimi_cli.html000066400000000000000000000252361506652756400232300ustar00rootroot00000000000000 Yoshimi User Manual ~ Command Line Interface

    Command Line Interface

    Yoshimi supplies a command line interface (CLI) that can perform any action that is available in the graphical interface (GUI). The CLI closely follows the GUi with respect to context levels. However, some control names are changed to enable shorter, unambiguous abbreviations to be used.

    With Yoshimi installed, open a terminal window and type 'yoshimi' to start. Unless you have disabled the GUI it will also show, but the prompt you will see will be something like the following:

    Yoshimi 2.3.0 is starting Using jack_audio for audio and alsa_midi for midi Alsa midi priority is 39 Yoshimi 2.3.0 Build Number 2220 Clientname: yoshimi Audio: jack -> 'default' Midi: alsa -> 'Hua Xing:0, Komplete Audio 6:0' Oscilsize: 512 Samplerate: 48000 Period size: 64 Yay! We're up and running :-) Found 7284 instruments in 201 banks Root 9. Bank set to 115 "The_Mysterious_Bank" GUI refreshed yoshimi>
    A minor annoyance is that the GUI (if it is enabled) will take input focus as it opens, so you will have to click in the terminal window again to make further commands.

    There are a number of commands that can be set at the time you start Yoshimi. Before starting you can view these with:
    music@devuan:~$ yoshimi --help
    This doesn't actually start Yoshimi itself, but as you can see there are a lot of options available.The full list of options is:
    music@devuan:~$ yoshimi --help Yoshimi 2.3.0 is starting Usage: yoshimi [OPTION...] Yoshimi 2.3.0, a derivative of ZynAddSubFX - Copyright 2002-2009 Nasca Octavian Paul and others, Copyright 2009-2011 Alan Calvert, Copyright 2012-2013 Jeremy Jongepier and others, Copyright 2014-2023 Will Godfrey and others -a, --alsa-midi[=<device>] use alsa midi input -A, --alsa-audio[=<device>] use alsa audio output -b, --buffersize=<size> set internal buffer size -c, --no-cmdline disable command line interface -C, --cmdline enable command line interface -D, --define-root=<path> define path to new bank root -i, --no-gui disable gui -I, --gui enable gui -j, --jack-midi[=<device>] use jack midi input -J, --jack-audio[=<server>] use jack audio output -k, --autostart-jack auto start jack server -K, --auto-connect auto connect jack audio -l, --load=<file> load .xmz parameters file -L, --load-instrument=<file> [@part]; load .xiz instrument file(no space)@n to part 'n' -M, --load-midilearn=<file> load .xly file --null use Null-backend without audio/midi -N, --name-tag=<tag> add tag to clientname -o, --oscilsize=<size> set AddSynth oscillator size -R, --samplerate=<rate> set alsa audio sample rate -S, --state[=<file>] load .state complete machine setup file -S, --state[=] load .state complete machine setup file -u, --jack-session-file=<file> load named jack session file -U, --jack-session-uuid=<uuid> jack session uuid -?, --help Give this help list --usage Give a short usage message Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options. music@devuan:~$
    Many of these options can be stacked when you do start, such as:
    yoshimi -b=128 -i -j
    In the above example we are setting the buffer size to 128 frames, disabling the GUI and setting MIDI input to Jack. These settings only apply to the current instance, and don't change the stored ones.

    Once running in the CLI you will be at the top level. Entering 'help', or just a '?' will list all the available commands and also the names of the available contexts. If reporting is set for the CLI this will be paged as shown below.
    yoshimi> ? Commands: ? Help show commands List list current settings STop all sound off RESet [s] return to start-up conditions, 'ALL' clear MIDI-learn (if 'y') EXit [s] tidy up and close Yoshimi (if 'y'), 'FOrce' instant exit regardless RUN <s> execute named command script forcing top level start RUNLocal <s> execute named command script from current context level WAIT <n> 1mS to 30,000mS delay, within script only .. step back one level / step back to top level Part [n1] ... - part operations VEctor [n1] ... - vector operations SCale ... - scale (microtonal) operations MLearn [n1] ... - MIDI learn operations COnfig ... - configuration settings q=quit /=search PgUp/PgDown=scroll (line 1 of 65)
    Quitting this pager will return you to the prompt, and it now shows the current context level.
    @ Top yoshimi>
    Notice the odd capitalisation. This indicates the minimum abbreviation for the respective controls. Be aware that the same command doesn't always have the same minimum in other contexts.
    Back to top

    Examples

    When entering the query on other context levels you will normally get the first few top level ones as a reminder these are available from any level. Other than that you will only see the commands (and deeper contexts) appropriate to that level. However, you can also specifically query a context from any point , in which case you will see the list for that one only, without changing your current position.
    @ p1+, Sub yoshimi> ? vector Vector: <n> set current base channel [X/Y] CC <n> CC n is used for X or Y axis sweep [X/Y] Features <n> [s] sets X or Y features 1-4 (ON, Reverse, {other}) [X] PRogram <l/r> <n> X program change ID for LEFT or RIGHT part [Y] PRogram <d/u> <n> Y program change ID for DOWN or UP part [X/Y] Control <n1> <n2> sets n2 CC to use for X or Y feature n1 (2-4) OFF disable vector for this channel Name <s> text name for this complete vector @ p1+, Sub yoshimi>
    Another very useful command is 'list' (or 'l'). The command by itself just shows what lists are available. A full example listing the current MIDI learned CCs is shown below.
    @ Top yoshimi> l mlearn Midi learned: Line 1 CC 7 Chan 1 Part 1 Effect Send 1 Line 2 CC 81 Chan 1 Part 1 Kit 1 Add Voice 1 Harmonic 1 Amplitude Line 3 CC 82 Chan 1 Part 1 Kit 1 Add Voice 1 Harmonic 3 Amplitude Line 4 CC 83 Chan 1 Part 1 Kit 1 Add Voice 1 Harmonic 2 Amplitude Line 5 CC 84 Chan 1 Part 1 Kit 1 Add Voice 1 Harmonic 4 Amplitude Line 6 CC 85 Chan 1 Part 1 Kit 1 Add Voice 1 Harmonic 6 Amplitude Line 7 CC 86 Chan 1 Part 1 Kit 1 Add Voice 1 Harmonic 8 Amplitude Line 8 CC 87 Chan 1 Part 1 Kit 1 Add Voice 1 Harmonic 10 Amplitude Line 9 CC 88 Chan 1 Part 1 Kit 1 Add Voice 1 Harmonic 12 Amplitude Line 10 CC 94 Chan 1 Main Master Mono/Stereo @ Top yoshimi>
    As a general rule '?' tells you what you can do and 'l' tells you what has been set.

    Many context levels have defaults that kick in if you don't add additional information. The most obvious being the Part level with just:
    @ Top yoshimi> set part @ Part 1+ yoshimi>
    You not only see that it is on part 1 but the '+' indicates it's enabled. There are lots of hints like this. Also any context with numeric settings can be changed simply with the number:
    @ Part 1+ yoshimi> set 5 @ Part 5 yoshimi>
    Note that part 5 has no '+' so is not enabled.

    Many actions will stack if all the required context levels are active:
    @ Part 5 yoshimi> s 1 add voice wave @ p1+, A+, V1+ Sine yoshimi>
    Here we used the minimum abbreviation for 'set'. You will also see that not only have we jumped right up into the waveform context of Addsynth Voice 1, but that the current waveform is 'Sine' and all the earlier labels are now compressed so that the line doesn't get ridiculously long.

    Other useful commands are:
    • Read The current value of the control.
    • MINimum The minimum value.
    • MAXimum The maximum value.
    • DEFault The default value.
    Instead of 'Read' you can use 'Get' but we don't recommend that. When working quickly it's easy for the wrong muscle memory to kick in so you mix up 'Set' and 'Get'.

    Here is another sequence of commands:
    @ Top yoshimi> s sys ec System Effect 1 set to Echo @ Sys eff 1 ECho-1 yoshimi> r del System Effect 1 Echo Delay Value 35.000000 @ Sys eff 1 ECho-1 yoshimi> s del 40 System Effect 1 Echo Delay Value 40.000000 @ Sys eff 1 ECho-1? yoshimi> max del Max 127 - learnable @ Sys eff 1 ECho-1? yoshimi>
    Notice the '?' when you change the delay value. This is a warning that although the effect started with preset 1, you have now changed it. If you change either the preset or the effect itself, that setting will be lost.

    Calling for the maximum also gave you the information that the control could be MIDI-learned.

    The prompt can become 'stale' if there is a lot of activity from the GUI or via MIDI, but can be refreshed simply by hitting the 'return' key, although it may be best to return to top level if you are not actively working.

    Back to Examples Back to top

    yoshimi-2.3.5.1/non-install_README000066400000000000000000000006371506652756400165650ustar00rootroot00000000000000Once complied, the Yoshimi image can be run from anywhere in the file system, but if it is not installed to the normal locations it will be unable to find the default banks, the user guide and other documents. These can be copied to suitable locations in .local by running: 'sh copydocs.sh' from *this* directory. You can do this either before or after building, but should do so before the first run of Yoshimi. yoshimi-2.3.5.1/presets/000077500000000000000000000000001506652756400150465ustar00rootroot00000000000000yoshimi-2.3.5.1/presets/Advoice.Padsythn.xpz000066400000000000000000000017241506652756400207600ustar00rootroot00000000000000WMs8 Whu*Nt&i:?83^8l%R+Rn__Ȓ,ʔ @k9;L~:(|p}^? nݏ.~_矽Sy2@};= b&{ڭOO. 2͏|p,!܋< 4$3]IƥNl.)%2{ju 5=Mr& ^YH+Jo\dz߹f\cX)f1 ʦL1 CBS43 P{l'usϦj d mJP&> y"5\QAT03*=SIPGt1Ei-[&7;\ϒ-dP,Șƨȫ?O 0} HR-2qd(j&ϣ30> ;9a@&u4)NReE7 pYcYp1"Rp&W9̄O|DTg j.<_4[>i8&' }w&?`Lm!foSVt,A ɮ׫F%\6YkR%i )}O%:!NL#,?KKX?uiYSUsH4*nQjcYrXWVb{x0V|:7o-嫚SM0iU͌Uv4[>Nϟ:woha;w[gJ[h-Y-#sM e5s6慈 D2SMNjy2Xo|PWGNZ@^uERn:m(ϞPgPiz| )u *{|h0Agqr3j}  yoshimi-2.3.5.1/presets/Bubbly.Padsyth.xpz000066400000000000000000000064471506652756400204560ustar00rootroot00000000000000]]s8|ϯ=+r8[{aesO"u$o("H=i= l~y:y ,J^$">vܝw~݇]}%.翿_y@5$.~;N(.뼓A6,|dzOQU${{hfifiѨH[vW׷wWYM:e ;?ߤaهgj׭nE? dU^"4L^Ֆf.5~r6oO=>%:<=j rhAsToyYgrK\l,(,_1^cWf}0~H p|^]k)wFn$~ċdM4nZƬo뛙:4 u$ix?$sr)d4AWcvb1qV2I:~ :w Z( bQ[SXۙXVO^OSq[3ϵ[]:/ϯkF3 ;Ҙ͋'4t'9$)˵B [SXS{㊗oPx^eť< j 5LKڊ}˃=*~}Lo-NpUzDqy6Q¬[rI.ױ7C(Fs[xgb+ǣa};PYL_+YogW-ZpU9ea"D!oRIYdl&yHr/p!΃XPi<$qffJ_;!JAJ$vW i pt}-صQ˨! { pj-3hs6BVF x,Iz,rt1=A!JУze G#hijp:GCqBQ<@;1rs0.M8y0`ڄs0M,ab F ca\4#`1 <0377a<0L$czˀacΟ\<0l3P-`1JS⨷̂ø`0@ 1sbU0 6\|S5XJ,a#n; a#ΟhGϜW F,0ly0ly7#q.9D ca?8"q`]xwP]Fa<0ƃ &w0n`!^^ŃgzLAo$T׃`0F ca,1$3 F mNY0bh7́$Y p1lƃh׀en`\oqm e.z)0L͖俒h^M{Un9lUhmk2Jؾ]N+'V_VB&Tjz]>ų:x`Y&yNzZ3zU)(SoK"UPB90D/pT^#=&\=dCo^6\-Q-QĆ=5F`E&:AlLY ݰpCNRv]r2oQZ ͅ^"v1yhI)KJ]_FiE#"U1GQ8EőDJ1pIp_m)Ԉ:>t}uqZH6cW~hj]q*RWYVך#!/${Q[Œ,a%oҵ|ႉBt*0PnY{d}|&Y֚*D#_4SW\q{~Ulm? ։+ޠ"iꥑFy{fSD=LԼGGЊhl68ub %}mH@*PRX+j&vw*CA!žȥ!%Q 1A'I, E1C:fHE&o{$H~GK #!oU|0D*OOߵ(횪d䞞T4=E RYB%ctL1Ah 1A*H⛫p 1A: _[BB׍׵VQQaiVjUF>uX!H܉S%? )|~}Ϣ$D jI<%Fx$pWl}ـYxyoshimi-2.3.5.1/presets/ChurchOrgan01.Poscilgen.xpz000066400000000000000000000011021506652756400220710ustar00rootroot00000000000000V]o0}Wdyg!jXG=tE/.3ۡͿ# !Nb`}=ilf!Gm&CzOߞW)Bl𻏠i:)|B2prq-ڒB0HĥP&%?L2m]C S R,aRb^2(Q @a "$sb$U;j٤9!I6CA9#!pTt %Q¢PJ٢!e r(Z8[nm9]ׁٙ\@KvopacG$Qzcj1Q,AkqAk=reWU65ʞ JX@s{ i =bJK2&QujdX!+ BSE2n91{ل 7/@^#0\od }x|㾸oE0x%b?1Jc)rgRjcW6j~\9˘)˨XwR7ɬKBP; yoshimi-2.3.5.1/presets/Deep.Presonance.xpz000066400000000000000000000035601506652756400205660ustar00rootroot00000000000000[o"G+ȼ;m] ,َ4q< 3X˿O!-]է{N>Njfi~mD4Yiq}ttW_]j-x|?zLQVKU=g)zdžL&?f%9Ǖnt45nWwlw0_>^HvaٳaَfXMl07VVl/߮3BkkFldH K!Vk ,W -Fm xud _(, ¼@XLzd^ 3 uɚ@M/™ڛ ^ ,&zd>fn uQX CVT>PS0:@zϦa0 uȞa-T@Xfn)Ql)ÆAVe&OR>gK VIYUKEI(..[ Gڶ88s@VQVQU$mC $Vc{Vlbpa(\ŇuTF|aOa02I V>;q adL8<6vKȃ›.P1,LGeVPIڶn3 9VlVY I޳+ՍUecn0i;V> jìFXՒl0Lc0la:U<am3DP2b,E {ϖ"g&g`ýq٪Da& Zsv 1 !0@P;0뱴YZc]CXZ93ֹ9$;CJXS ~k_ge)L8fwŏ XgZU|s*n֬K:X4HF5HZNS:ZS~Kdhߊd"fU'q.CiGnYzTT߱U 6UDwaH$OaiUt"ЛʳjU+!FpT@(=-Ed"Z UV':6EXI UjP$ݼ8v`n:}"eO'xs@)N8Wkn- Lxi*S̀(inE `m7}>o%EX=Vb8(o~:p7Rd оM`q[x)*{*S\pkhc-Sg- [x)(= Թ" \FkNrsD'*Eў@kPy {KW%4AYJ\L 7c8o!%}V6>Xk>cn5r^{{ Mk>w7:W}ŨWKkDgR^i>O^>@x({mY/ eEJ2>`mbKN|"{&Eb6OE|ZbnQ؃ֲ^{R¦Jo${yػ=`Ϥ{{^7BF8Ayoshimi-2.3.5.1/presets/Delay.Plfoamplitude.xpz000066400000000000000000000007451506652756400214610ustar00rootroot00000000000000S0l.Pt$Pik66Nm$Ŵjny3oޛqot3J. bB~yB{ϻ8U2dl[_ ,`:ԶCy ]D:e6+0 xAb(3{U&跠0T%7{ GkA "rbt7pXX"= 9[<ƚn?/n#pKG &(Aِ|0& K幡TH$,s.Q?Le'[:_ w*L%mJJ$4]l /2aK9,}qL&!^cCK5ƞ~~{ƽ0zt!-Fc37H ru`A+'ъuhY1p K&4ϙqL "nyD2'oD k[L7YuKaDxAfĜ3yM{7ףB]|kntEASk6g/'SqA9CXmp(2, dRsᳬ袝eςzKWpxTO=7\錈1\OnXs1tm%b5EĚ\.WdE:-0']b6è6*ZF.h(,v!0=b+v=Cv'˨SPW;[ VÚm^vX:M.MIk|}.ΞH|:/aPyIM}Zbřdkɢ A+e!8ђ=̡GK-WBey$ K{`t`TlBqznRg$C874 3B_DtjG7>ȹ<lN}۞V縶_ӓ+ftf4_wλyٯLOb5JZbzjؘ" aDrњh]nY?áArvzftC$%/0, Pn җpQ6RB9E|98{=rxEhwΚge7돮"EPqGJ9bD#1 Xb `:9r!c.ZIqRSXswoRפ,Wf_P+Ì~V4&!2EUvR0=2\`-PR%TX3%[_Y J/yPnoLb2_mSZSFӒ!8F}`-lM(՛Lƣ,u$ކ8:fC/૖Ȫ%jTSZ"jdm}ҝ~:ۑ~lxdžo#E_2~;Oؑ5Eyoshimi-2.3.5.1/presets/SmoothSaw.Ppadsyth.xpz000066400000000000000000000030321506652756400213260ustar00rootroot00000000000000Y]s8}ϯ`@`i%ff_4–Z[bmےmҝzxZlt=zc|s''-B_Sg8pc 58 'lhD/s0WnH"#iĶxbC'|y?|gW"bppDnS"& 5߇+-.W8%¯(>EH$6SؼsM D%1 L#e>E3ˎM!<}0&`KV7zp3%EAIn|5L8z(o elOUvBI0YKTZ`w//ؒf|\)q+j}(Yo"5uAoafԤHRo TRpmcLPkR"J0`t!KqSt}I*<4$<5a[ѭAsj+uB1(q0efco2שiƢcwC 5K~[o9PL7[=AH} !%eg6)8V.fδKw5 gl2 C%S_H|d2P]?J:MMwmd*NS",ڔQ<'#̉$?T0-&q+s)5fmsЩGp]VRJVIn1cl#!#0'ee}0L 9Nس'+pj^j6Ҧ6lVztZ՝N狒V٦ /RVwS%P|A*[fG|0RF@5m;3D~ݭN}meh(u,wgޯ%d,ݠYip:T 'Dyӻ:]u%J~uAЇܒW ia׫q}}3;eP7ľ.e TNrÀrln *V}ZTg>2j4]ZR/ѝ>,:̛-s "e%5tjEAAGMDL1x=8r,IɬBg͹2³eW+Nw\2]Owz_\ەY=vs-!>z6P>VK%E$F$$ B>q5M&@)2k'-rhz=O\<.Qf$e@΃C_«' j3\e!ME(Q gpip7aW5P: {2dќQ %Z5pNr^טn<[>UZ!gE!H'MKz+EnlȽ$FT+d?if^rKNyGַ/_EnV]7O#`Y04*HǙ73I9Fu > jʸ$4A7A{?!7"PG6T]N8}F"~t ˋF>`X(`GI 9 M,*a4WbPO\nY/gTRVjBc]Ӯ16ۺK;OWۧkaOo[²ygN]g]I[aHSC@̳}@#2a*M\c(Ҩ{[DbIטr}SixZl*. 88CW X% k~?xQ +a6|<0R͔ɔR愐𴺵Dtj'F܀X58ټIwWz]$]*_OvPyV| >w8yoshimi-2.3.5.1/presets/WahWah1.Peffect.xpz000066400000000000000000000006701506652756400204270ustar00rootroot00000000000000[O0s8p-!!0)k*k-{ +;Ļ_c n6l Ӑ!B75={47Oq>-+Z?_ӫGqj ɋ?[L`2{Qo;Ea}1`/0Ryoshimi-2.3.5.1/presets/alienWah21.Peffect.xpz000066400000000000000000000007031506652756400210570ustar00rootroot00000000000000Tn0}+;DAgP!aJ:Akh1WC${9{ 7& >s CAu5pn<*<&$ (XHyMsپ M4{sHE&v=ϝ5 .#C:S $0cxv \k?Ǖn^;׫>-}`1]dz6QJԪZU܌Uc yoshimi-2.3.5.1/presets/ampenv.Penvamplitude.xpz000066400000000000000000000010201506652756400217040ustar00rootroot00000000000000TMo0+)c{([M8D$ڽXn<,n;TI)cf޼yofg5Z(9L?'-=ᇏk?I8ː3l4t]!AUf ϙN SւI*ÃWW"d6A, FP۱;^b+t6'¹*XIߔʐd9L0}fE+ *fYeRacU=8Y u-1g4\P28i4vPa ״ MY jkezmNN^kp}x~k%Rh;E&LڲзztJs޷]iÄlƧv SIW cL2`z9LHk@sfO%}uznzTjZ]'G_nQ8'H ؾutoht\ԙKIU#]9?4yoshimi-2.3.5.1/presets/disty.Peffect.xpz000066400000000000000000000006711506652756400203240ustar00rootroot00000000000000Tn0}+;t:ɘA(&^J̿_܀eo{NϽz}&18T2عmC@y$o܄~kGOt9 _K:-wKvT7eb]peazrֺX_y)R uT*\ _n8[.S"'ԁt*O\Q&)юq*Uz3?8plt5v ܕ;BoΥtIc_x~0D"ƥJryZ=M&!JW'TPw<`-kը@7W:T2i{MTEa>ofs 뛀kywͼq\^z&Z^C3oXѳB ?$R&yoshimi-2.3.5.1/presets/echo.Peffect.xpz000066400000000000000000000006711506652756400201060ustar00rootroot00000000000000T]o0}Wt}w= *$>D1{i*3@P7z{=P~h(C|n@@'Cqzjrn |I:uwKzD¼xR]pqyS0|X y`_@SںJ؆la/Wsӝ-t! :t*\P$)ю*Ez3?1u6n]͵se-ZbPCd<^BL@# RQ@+}Z9M&!SJS& xꡀo1!I'<7mnr7fonC*ixږm[0`d2c_@%`E9)\kUzK_^lVF|FW Iyoshimi-2.3.5.1/presets/phase.Peffect.xpz000066400000000000000000000007551506652756400202730ustar00rootroot00000000000000T]O@}W}疢"&$ D}iv5nr_TA 6Gf9sΔ# M$|L=Q͘Ndz|,gS|9od!ymfwx#/>NO)͒<4#al]EwCޡm&K,(ƒrt K|*IK(Z=~kEq<ـ~ qƹ_э4~q8 f)}3F[Z 9tmJЇJ  Ox$8 F[{."@<2C/ ͮOuVކP<撂~p=o,7'n>pyoshimi-2.3.5.1/presets/sweep.Penvfrequency.xpz000066400000000000000000000007241506652756400215700ustar00rootroot00000000000000T]o@|W\: $r" .\{Ep4}ʽݫVdKkt0ӟiF&SڤB,c_;/5mݘ~mE}x6ENrCr^){~#IB(s| \@ɑLt*>̧bsIb1}mC#/9}=]f,Otb-wM_B2,`HIdV =>b^Cٙlf#?荆;p!|m†,4Or0X}HX =Js|MR#By'76OdYW`pQ[@Y<:c+)M.< #8exFo''0"o8okuyoshimi-2.3.5.1/presets/systype.Peffect.xpz000066400000000000000000000023271506652756400207100ustar00rootroot00000000000000͚s8Ə_g2n>0*( -pR_2YӫzjwzXgDԏKk4rcϏ.wD7˫ͧ}G3[?{$#T;8aJuGǖz' D[yI.>,`$i] =ӵR[Z:bm _%I-"!?d-_,0lm;wk&%I%$?|5e)s;! ~3h:[8~ B1on>ezOݚa M$>yA$?h'y}r 6R(|Rc~PaV&,;/w3گi>PHV{Ɛ&P7ap%}}wR2'{շ̿YiFj`,Ńj'K 0@hQ 9Lh:qVR Nόgdg8n@Ɂ|xrbdi.~TVY +8$rHKU,V:٠ʪP })TYаjhSOUhB BZ>aSp.o[ s+v>GS4ZB~FVѰz6'h9 УN S m%1+ m s^tEtz1Bv=B;F;C;CUa BC[!FЬh$>h4Pt2zt4]w/F3 u7xGA L+mk!ZXAHhӂ輂"zv1B8hW[] 'hGbEo!4o*>z,4L{G?A.%4sC~|xV'zU(>Bhm}g/ A;qJoIOQ'Ds}R N%PSS'#p_K [x+z~e 4CC~+yoshimi-2.3.5.1/presets/windpipes.Psubsyth.xpz000066400000000000000000000015161506652756400214360ustar00rootroot00000000000000Vr0}+\S0qL $}KR[LBk-2YɵǏ04L|e[0~e?>?ij~K,^_+ RFW:WOVZq:Yack+e[vU5 Y=S.@ (NA`O|0?"H8evj?L"*! 8;ĝCoMg(e  aqyζ) %1!mr'a% g4Po <"w\V0|Sr,D SR1x"p]=nPpоSYee@X"+!͝ǣA7Wb$b1|A`igԍp4a w#mIp_ҽz_}ŬICXw8y̟{|A:0>ywڊ&Q .Ѽ5(h |vHR.4Z7='ޡ.EˈR p]Jm箂#c sƄA*_砖. R+VE)Lܦ!W S7h/M[#"pn]JC~h ??{”>y:f-9Q]TJ[PN&o`vu%hLU1nh5F|#IQihɣ.8ErQL.U4 hk܇rAJy`wFٔ (5ӦxPrMrys—|)5αN14+dk yoshimi-2.3.5.1/src/000077500000000000000000000000001506652756400141505ustar00rootroot00000000000000yoshimi-2.3.5.1/src/CLI/000077500000000000000000000000001506652756400145575ustar00rootroot00000000000000yoshimi-2.3.5.1/src/CLI/CmdInterface.cpp000066400000000000000000000100021506652756400176000ustar00rootroot00000000000000/* CmdInterface.cpp Copyright 2015-2019, Will Godfrey & others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Misc/Bank.h" #include "CLI/CmdInterface.h" #include "CLI/Parser.h" #include "Interface/TextLists.h" #include "Misc/FormatFuncs.h" #include "Misc/CliFuncs.h" using std::this_thread::sleep_for; using std::chrono_literals::operator ""ms; using std::string; using func::asString; using cli::readControl; CmdInterface::CmdInterface() : interpreter{} { } Config& CmdInterface::getRuntime() { return interpreter.synth->getRuntime(); } void CmdInterface::Log(const string& msg, char toStderr) { getRuntime().Log(msg, toStderr); } void CmdInterface::cmdIfaceCommandLoop() { // Initialise the history functionality // Set up the history filename string hist_filename; { // put this in a block to lose the password afterwards struct passwd *pw = getpwuid(getuid()); hist_filename = string(pw->pw_dir) + string("/.yoshimi_history"); } cli::Parser parser; parser.setHistoryFile(hist_filename); interpreter.synth = & Config::instances().findSynthByID(0); bool exit{false}; while (not exit) { parser.readline(); if (parser.isTooLarge()) std::cout << "*** Error: line too long" << std::endl; else if (parser.isValid()) { // in case it's been changed from elsewhere interpreter.synth = & Config::instances().findSynthByID(interpreter.currentInstance); cli::Reply reply = interpreter.cmdIfaceProcessCommand(parser); exit = (reply.code == REPLY::exit_msg); if (reply.code == REPLY::what_msg) Log(reply.msg + replies[REPLY::what_msg]); else if (reply.code > REPLY::done_msg) Log(replies[reply.code]); } exit |= not getRuntime().runSynth.load(std::memory_order_acquire); if (not exit) { do { // create enough delay for most ops to complete sleep_for(2ms); } while (getRuntime().runSynth.load(std::memory_order_relaxed) and not getRuntime().finishedCLI); } if (getRuntime().runSynth.load(std::memory_order_acquire)) { string prompt = "yoshimi"; if (interpreter.currentInstance > 0) prompt += (":" + asString(interpreter.currentInstance)); int expose = readControl(interpreter.synth, 0, CONFIG::control::exposeStatus, TOPLEVEL::section::config); if (expose == 1) { string status = interpreter.buildStatus(true); if (status == "" ) status = " Top"; Log("@" + status, _SYS_::LogError); } else if (expose == 2) prompt += interpreter.buildStatus(true); prompt += "> "; parser.setPrompt(prompt); } if (not exit and getRuntime().runSynth.load(std::memory_order_relaxed)) sleep_for(20ms); } } yoshimi-2.3.5.1/src/CLI/CmdInterface.h000066400000000000000000000020731506652756400172560ustar00rootroot00000000000000/* CmdInterface.h Copyright 2015-2019, Will Godfrey & others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef CMDINTERFACE_H #define CMDINTERFACE_H #include "CLI/CmdInterpreter.h" class CmdInterface { public: CmdInterface(); void cmdIfaceCommandLoop(); private: cli::CmdInterpreter interpreter; Config& getRuntime(); void Log(const string& , char tostderr = _SYS_::LogNormal); }; #endif yoshimi-2.3.5.1/src/CLI/CmdInterpreter.cpp000066400000000000000000007474371506652756400202400ustar00rootroot00000000000000/* CmdInterpreter.cpp Copyright 2019 - 2025, Will Godfrey and others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "CLI/CmdInterpreter.h" #include "Effects/EffectMgr.h" #include "CLI/Parser.h" #include "Misc/TestInvoker.h" #include "Misc/TextMsgBuffer.h" #include "Misc/FileMgrFuncs.h" #include "Misc/NumericFuncs.h" #include "Misc/FormatFuncs.h" #include "Misc/CliFuncs.h" #include "Misc/Util.h" // used to hold back shutdown when running sound generation for test extern std::atomic waitForTest; // these two are both zero and represented by an enum entry const unsigned char type_read = TOPLEVEL::type::Adjust; namespace cli { using std::this_thread::sleep_for; using std::chrono_literals::operator ""ms; using std::chrono::duration; using std::string; using std::to_string; using std::stringstream; using std::vector; using std::list; using std::cout; using std::endl; using file::loadText; using func::bitSet; using func::bitTest; using func::bitClear; using func::bitClearHigh; using func::bitFindHigh; using func::asString; using func::string2int; using func::string2int127; using func::string2float; using cli::readControl; using test::TestInvoker; /* * There are two routes that 'write' commands can take. * sendDirect(synth, ) and sendNormal(synth, ) * * sendDirect(synth, ) is the older form and is now mostly used for * numerical entry by test calls. It always returns zero. * * sendNormal(synth, ) performs 'value' range adjustment and also * performs some error checks, returning a response. * * * readControl(synth, ) provides a non-buffered way to find the * value of any control. It may be temporarily blocked if * there is a write command in progress. * * readControlText(synth, ) provides a non-buffered way to fetch * some text items. It is not error checked. */ // predefined OK-Reply constant Reply Reply::DONE{REPLY::done_msg}; CmdInterpreter::CmdInterpreter() : currentInstance{0}, synth{nullptr}, instrumentGroup{}, textMsgBuffer{TextMsgBuffer::instance()}, context{LEVEL::Top}, section{UNUSED}, npart{0}, kitMode{PART::kitType::Off}, kitNumber{0}, inKitEditor{false}, voiceNumber{0}, insertGroup{UNUSED}, insertType{UNUSED}, nFXtype{0}, nFX{0}, nFXpreset{0}, nFXeqBand{0}, filterSequenceSize{1}, filterVowelNumber{UNUSED}, filterNumberOfFormants{1}, filterFormantNumber{UNUSED}, chan{0}, axis{0}, mline{0} { } CmdInterpreter::~CmdInterpreter() { /* destructors invoked here */ } void CmdInterpreter::defaults() { context = LEVEL::Top; section = UNUSED; npart = 0; kitMode = PART::kitType::Off; kitNumber = 0; inKitEditor = false; voiceNumber = 0; insertType = UNUSED; insertGroup = UNUSED; nFXtype = 0; nFX = 0; nFXpreset = 0; nFXeqBand = 0; filterVowelNumber = UNUSED; filterFormantNumber = UNUSED; chan = 0; axis = 0; mline = 0; } void CmdInterpreter::resetInstance(unsigned int newInstance) { currentInstance = newInstance; synth = & Config::instances().findSynthByID(currentInstance); unsigned int newID = synth->getUniqueId(); if (newID != currentInstance) { synth->getRuntime().Log("Instance " + to_string(currentInstance) + " not found. Set to " + to_string(newID), _SYS_::LogError); currentInstance = newID; } defaults(); } string CmdInterpreter::buildStatus(bool showPartDetails) { if (bitTest(context, LEVEL::AllFX)) { return buildAllFXStatus(); } if (bitTest(context, LEVEL::Part)) { return buildPartStatus(showPartDetails); } if (bitTest(context, LEVEL::Test)) { return buildTestStatus(); } string result = ""; if (bitTest(context, LEVEL::Scale)) result += " Scale "; else if (bitTest(context, LEVEL::Bank)) { result += " Bank " + to_string(int(readControl(synth, 0, BANK::control::selectBank, TOPLEVEL::section::bank))) + " (root " + to_string(int(readControl(synth, 0, BANK::control::selectRoot, TOPLEVEL::section::bank))) + ")"; } else if (bitTest(context, LEVEL::Config)) result += " Config "; else if (bitTest(context, LEVEL::Vector)) { result += (" Vect Ch " + asString(chan + 1) + " "); if (axis == 0) result += "X"; else result += "Y"; } else if (bitTest(context, LEVEL::Learn)) result += (" MLearn line " + asString(mline + 1) + " "); return result; } string CmdInterpreter::buildAllFXStatus() { assert(bitTest(context, LEVEL::AllFX)); string result = ""; int section; int ctl = EFFECT::sysIns::effectType; if (bitTest(context, LEVEL::Part)) { result = " p" + to_string(int(npart) + 1); if (readControl(synth, 0, PART::control::enable, npart)) result += "+"; ctl = PART::control::effectType; section = npart; } else if (bitTest(context, LEVEL::InsFX)) { result += " Ins"; section = TOPLEVEL::section::insertEffects; } else { result += " Sys"; section = TOPLEVEL::section::systemEffects; } nFXtype = readControl(synth, 0, ctl, section, UNUSED, nFX); result += (" eff " + asString(nFX + 1) + " " + fx_list[nFXtype].substr(0, 6)); nFXpreset = readControl(synth, 0, EFFECT::control::preset, section, EFFECT::type::none + nFXtype, nFX); if (bitTest(context, LEVEL::InsFX) && readControl(synth, 0, EFFECT::sysIns::effectDestination, TOPLEVEL::section::systemEffects, UNUSED, nFX) == -1) result += " Unrouted"; else if (nFXtype > 0 && nFXtype != 7) { result += ("-" + asString(nFXpreset + 1)); if (readControl(synth, 0, EFFECT::control::changed, section, EFFECT::type::none + nFXtype, nFX)) result += "?"; } if (nFXtype == 8 && bitTest(context, LEVEL::Filter)) { if (bitTest(context, LEVEL::Formant)) result += " formant edit"; else result += " in filt"; } return result; } string CmdInterpreter::buildPartStatus(bool showPartDetails) { assert(bitTest(context, LEVEL::Part)); int kit = UNUSED; int insert = UNUSED; bool justPart = false; string result = " p"; npart = readControl(synth, 0, MAIN::control::partNumber, TOPLEVEL::section::main); kitMode = readControl(synth, 0, PART::control::kitMode, npart); if (bitFindHigh(context) == LEVEL::Part) { justPart = true; if (kitMode == PART::kitType::Off) result = " Part "; } result += to_string(int(npart) + 1); if (readControl(synth, 0, PART::control::enable, npart)) result += "+"; if (kitMode != PART::kitType::Off) { kit = kitNumber; insert = TOPLEVEL::insert::kitGroup; result += ", "; string front = ""; string back = " "; if (!inKitEditor) { front = "("; back = ")"; } switch (kitMode) { case PART::kitType::Multi: if (justPart) result += (front + "Multi" + back); else result += "M"; break; case PART::kitType::Single: if (justPart) result += (front + "Single" + back); else result += "S"; break; case PART::kitType::CrossFade: if (justPart) result += (front + "Crossfade" + back); else result += "C"; break; default: break; } if (inKitEditor) { result += to_string(kitNumber + 1); if (readControl(synth, 0, PART::control::enableKitLine, npart, kitNumber, UNUSED, TOPLEVEL::insert::kitGroup)) result += "+"; } } else kitNumber = 0; if (!showPartDetails) return ""; if (bitFindHigh(context) == LEVEL::MControl) return result +" Midi controllers"; engine = contextToEngines(context); switch (engine) { case PART::engine::addSynth: if (bitFindHigh(context) == LEVEL::AddSynth) result += ", Add"; else result += ", A"; if (readControl(synth, 0, PART::control::enableAdd, npart, kit, PART::engine::addSynth, insert)) result += "+"; break; case PART::engine::subSynth: if (bitFindHigh(context) == LEVEL::SubSynth) result += ", Sub"; else result += ", S"; if (readControl(synth, 0, PART::control::enableSub, npart, kit, PART::engine::subSynth, insert)) result += "+"; break; case PART::engine::padSynth: if (bitFindHigh(context) == LEVEL::PadSynth) result += ", Pad"; else result += ", P"; if (readControl(synth, 0, PART::control::enablePad, npart, kit, PART::engine::padSynth, insert)) result += "+"; break; case PART::engine::addVoice1: // intentional drop through case PART::engine::addMod1: { result += ", A"; if (readControl(synth, 0, PART::control::enableAdd, npart, kit, PART::engine::addSynth, insert)) result += "+"; if (bitFindHigh(context) == LEVEL::AddVoice) result += ", Voice "; else result += ", V"; result += to_string(voiceNumber + 1); int voiceFromNumber = readControl(synth, 0, ADDVOICE::control::voiceOscillatorSource, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); if (voiceFromNumber > -1) result += (">" +to_string(voiceFromNumber + 1)); voiceFromNumber = readControl(synth, 0, ADDVOICE::control::externalOscillator, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); if (voiceFromNumber > -1) result += (">V" +to_string(voiceFromNumber + 1)); if (readControl(synth, 0, ADDVOICE::control::enableVoice, npart, kitNumber, PART::engine::addVoice1 + voiceNumber)) result += "+"; if (bitTest(context, LEVEL::AddMod)) { result += ", "; int tmp = readControl(synth, 0, ADDVOICE::control::modulatorType, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); if (tmp > 0) { string word = addmodnameslist[tmp]; if (bitFindHigh(context) == LEVEL::AddMod) result += (word + " Mod "); else result += word.substr(0, 2); int modulatorFromVoiceNumber = readControl(synth, 0, ADDVOICE::control::externalModulator, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); if (modulatorFromVoiceNumber > -1) result += (">V" + to_string(modulatorFromVoiceNumber + 1)); else { int modulatorFromNumber = readControl(synth, 0, ADDVOICE::control::modulatorOscillatorSource, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); if (modulatorFromNumber > -1) result += (">" + to_string(modulatorFromNumber + 1)); } } else result += "Modulator"; } break; } } if (bitFindHigh(context) == LEVEL::Resonance) { result += ", Resonance"; if (readControl(synth, 0, RESONANCE::control::enableResonance, npart, kitNumber, engine, TOPLEVEL::insert::resonanceGroup)) result += "+"; } else if (bitTest(context, LEVEL::Oscillator)) { int type = (int)readControl(synth, 0, OSCILLATOR::control::baseFunctionType, npart, kitNumber, engine + voiceNumber, TOPLEVEL::insert::oscillatorGroup); if (type == OSCILLATOR::wave::user) result += " user"; else result += (" " + waveshape[type]); } if (bitTest(context, LEVEL::LFO)) { result += ", LFO "; int cmd = -1; switch (insertGroup) { case TOPLEVEL::insertType::amplitude: cmd = ADDVOICE::control::enableAmplitudeLFO; result += "amp"; break; case TOPLEVEL::insertType::frequency: cmd = ADDVOICE::control::enableFrequencyLFO; result += "freq"; break; case TOPLEVEL::insertType::filter: cmd = ADDVOICE::control::enableFilterLFO; result += "filt"; break; } if (engine == PART::engine::addVoice1) { if (readControl(synth, 0, cmd, npart, kitNumber, engine + voiceNumber)) result += "+"; } else result += "+"; } else if (bitTest(context, LEVEL::Filter)) { int baseType = readControl(synth, 0, FILTERINSERT::control::baseType, npart, kitNumber, engine + voiceNumber, TOPLEVEL::insert::filterGroup); result += ", Filter "; switch (baseType) { case 0: result += "analog"; break; case 1: { filterSequenceSize = readControl(synth, 0, FILTERINSERT::control::sequenceSize, npart, kitNumber, engine + voiceNumber, TOPLEVEL::insert::filterGroup); bool unusedVowel = true; for (int i = 0; i < filterSequenceSize; ++i) { if (filterVowelNumber == readControl(synth, 0, FILTERINSERT::control::vowelPositionInSequence, npart, kitNumber, engine + voiceNumber, TOPLEVEL::insert::filterGroup, i)) unusedVowel = false; } filterNumberOfFormants = readControl(synth, 0, FILTERINSERT::control::numberOfFormants, npart, kitNumber, engine + voiceNumber, TOPLEVEL::insert::filterGroup, 0); result += "formant V"; if (bitTest(context, LEVEL::Formant)) { result += to_string(filterVowelNumber + 1); if (unusedVowel) result += "?"; result += " F"; result += to_string(filterFormantNumber + 1); } break; } case 2: result += "state var"; break; } if (engine == PART::engine::subSynth) { if (readControl(synth, 0, SUBSYNTH::control::enableFilter, npart, kitNumber, engine)) result += "+"; } else if (engine == PART::engine::addVoice1) { if (readControl(synth, 0, ADDVOICE::control::enableFilter, npart, kitNumber, engine + voiceNumber)) result += "+"; } else result += "+"; } else if (bitTest(context, LEVEL::Envelope)) { result += ", Envel "; int cmd = -1; switch (insertGroup) { case TOPLEVEL::insertType::amplitude: if (engine == PART::engine::addMod1) cmd = ADDVOICE::control::enableModulatorAmplitudeEnvelope; else cmd = ADDVOICE::control::enableAmplitudeEnvelope; result += "amp"; break; case TOPLEVEL::insertType::frequency: if (engine == PART::engine::addMod1) cmd = ADDVOICE::control::enableModulatorFrequencyEnvelope; else cmd = ADDVOICE::control::enableFrequencyEnvelope; result += "freq"; break; case TOPLEVEL::insertType::filter: cmd = ADDVOICE::control::enableFilterEnvelope; result += "filt"; break; case TOPLEVEL::insertType::bandwidth: cmd = SUBSYNTH::control::enableBandwidthEnvelope; result += "band"; break; } if (readControl(synth, 0, ENVELOPEINSERT::control::enableFreeMode, npart, kitNumber, engine, TOPLEVEL::insert::envelopeGroup, insertGroup)) result += " free"; if (engine == PART::engine::addVoice1 || engine == PART::engine::addMod1 || (engine == PART::engine::subSynth && cmd != ADDVOICE::control::enableAmplitudeEnvelope && cmd != ADDVOICE::control::enableFilterEnvelope)) { if (readControl(synth, 0, cmd, npart, kitNumber, engine + voiceNumber)) result += "+"; } else result += "+"; } return result; } string CmdInterpreter::buildTestStatus() { int expose = readControl(synth, 0, CONFIG::control::exposeStatus, TOPLEVEL::section::config); // render compact form when status is part of prompt return TestInvoker::access().showTestParams(expose == 2); } bool CmdInterpreter::query(string text) { char *line = NULL; bool result = false;; text += "? (y / {other})"; synth->getRuntime().Log(text); line = readline(""); if (line) { if (*line == 'y' || *line == 'Y') { result = true; free(line); line = NULL; } } return result; } bool CmdInterpreter::testPartsChanged(string message, int partNum) { string replyMsg = ""; //bool found = false; int count = 0; if (partNum >= NUM_MIDI_PARTS) { for (int i = 0; i < NUM_MIDI_PARTS; ++ i) { if (readControl(synth, 0, MAIN::control::partsChanged, TOPLEVEL::section::main, i)) { replyMsg = (replyMsg + " " + to_string(i + 1)); //found = true; ++ count; } } } else if (readControl(synth, 0, MAIN::control::partsChanged, TOPLEVEL::section::main, partNum)) { replyMsg = " " + to_string(partNum + 1); //found = true; ++ count; } if (count == 0) return true; if (count > 1) replyMsg = "Instruments in parts " + replyMsg + " have been edited. "; else replyMsg = "Instrument in part " + replyMsg + " has been edited. "; replyMsg += message; if (synth->getRuntime().toConsole) cout << replyMsg << "? (y / {other})" << endl; //found = query(replyMsg); return query(replyMsg); } void CmdInterpreter::helpLoop(list& msg, string *commands, int indent, bool single) { int word = 0; int spaces = 30 - indent; string left = ""; string right = ""; string dent; string blanks; while (commands[word] != "@end") { left = commands[word]; if (!single) right = commands[word + 1]; if (left == "") { left = " " + right; right = ""; } if (right > "") left = left +(blanks.assign(spaces - left.length(), ' ') + right); msg.push_back(dent.assign(indent, ' ') + left); word += (2 - single); } } char CmdInterpreter::helpList(Parser& input, unsigned int local) { if (!input.matchnMove(1, "help") && !input.matchnMove(1, "?")) return REPLY::todo_msg; int listnum = -1; bool named = false; if (!input.isAtEnd()) { // 1 & 2 reserved for syseff & inseff if (input.matchnMove(3, "effects")) listnum = LISTS::eff; else if (input.matchnMove(3, "reverb")) listnum = LISTS::reverb; else if (input.matchnMove(3, "echo")) listnum = LISTS::echo; else if (input.matchnMove(3, "chorus")) listnum = LISTS::chorus; else if (input.matchnMove(3, "phaser")) listnum = LISTS::phaser; else if (input.matchnMove(3, "alienwah")) listnum = LISTS::alienwah; else if (input.matchnMove(3, "distortion")) listnum = LISTS::distortion; else if (input.matchnMove(2, "eq")) listnum = LISTS::eq; else if (input.matchnMove(3, "dynfilter")) listnum = LISTS::dynfilter; else if (input.matchnMove(1, "part")) listnum = LISTS::part; else if (input.matchnMove(2, "mcontrol")) listnum = LISTS::mcontrol; else if (input.matchnMove(3, "addsynth")) listnum = LISTS::addsynth; else if (input.matchnMove(3, "subsynth")) listnum = LISTS::subsynth; else if (input.matchnMove(3, "padsynth")) listnum = LISTS::padsynth; else if (input.matchnMove(3, "resonance")) listnum = LISTS::resonance; else if (input.matchnMove(3, "voice")) listnum = LISTS::addvoice; else if (input.matchnMove(3, "modulator")) listnum = LISTS::addmod; else if (input.matchnMove(3, "waveform")) listnum = LISTS::waveform; else if (input.matchnMove(3, "lfo")) listnum = LISTS::lfo; else if (input.matchnMove(3, "formant")) listnum = LISTS::formant; else if (input.matchnMove(3, "filter")) listnum = LISTS::filter; else if (input.matchnMove(3, "envelope")) listnum = LISTS::envelope; else if (input.matchnMove(3, "section")) listnum = LISTS::section; else if (input.matchnMove(1, "vector")) listnum = LISTS::vector; else if (input.matchnMove(1, "scale")) listnum = LISTS::scale; else if (input.matchnMove(1, "load")) listnum = LISTS::load; else if (input.matchnMove(1, "save")) listnum = LISTS::save; else if (input.matchnMove(1, "list")) listnum = LISTS::list; else if (input.matchnMove(1, "config")) listnum = LISTS::config; else if (input.matchnMove(1, "bank")) listnum = LISTS::bank; else if (input.matchnMove(1, "mlearn")) listnum = LISTS::mlearn; if (listnum != -1) named = true; } else { if (bitTest(local, LEVEL::AllFX)) { switch (nFXtype) { case 0: listnum = LISTS::eff; break; case 1: listnum = LISTS::reverb; break; case 2: listnum = LISTS::echo; break; case 3: listnum = LISTS::chorus; break; case 4: listnum = LISTS::phaser; break; case 5: listnum = LISTS::alienwah; break; case 6: listnum = LISTS::distortion; break; case 7: listnum = LISTS::eq; break; case 8: listnum = LISTS::dynfilter; break; } } else if (bitTest(local, LEVEL::Envelope)) listnum = LISTS::envelope; else if (bitTest(local, LEVEL::LFO)) listnum = LISTS::lfo; else if (bitTest(local, LEVEL::Formant)) listnum = LISTS::formant; else if (bitTest(local, LEVEL::Filter)) listnum = LISTS::filter; else if (bitTest(local, LEVEL::Oscillator)) listnum = LISTS::waveform; else if (bitTest(local, LEVEL::AddMod)) listnum = LISTS::addmod; else if (bitTest(local, LEVEL::AddVoice)) listnum = LISTS::addvoice; else if (bitTest(local, LEVEL::Resonance)) listnum = LISTS::resonance; else if (bitTest(local, LEVEL::AddSynth)) listnum = LISTS::addsynth; else if (bitTest(local, LEVEL::SubSynth)) listnum = LISTS::subsynth; else if (bitTest(local, LEVEL::PadSynth)) listnum = LISTS::padsynth; else if (bitTest(local, LEVEL::MControl)) listnum = LISTS::mcontrol; else if (bitTest(local, LEVEL::Part)) listnum = LISTS::part; else if (bitTest(local, LEVEL::Vector)) listnum = LISTS::vector; else if (bitTest(local, LEVEL::Scale)) listnum = LISTS::scale; else if (bitTest(local, LEVEL::Bank)) listnum = LISTS::bank; else if (bitTest(local, LEVEL::Config)) listnum = LISTS::config; else if (bitTest(local, LEVEL::Learn)) listnum = LISTS::mlearn; else if (bitTest(local, LEVEL::Test)) listnum = LISTS::test; } if (listnum == -1) listnum = LISTS::all; listmsg; if (!named) { msg.push_back("Commands:"); helpLoop(msg, basics, 2); } switch(listnum) { case 0: msg.push_back(" "); msg.push_back(" Part [n1] ... - part operations"); msg.push_back(" VEctor [n1] ... - vector operations"); msg.push_back(" SCale ... - scale (microtonal) operations"); msg.push_back(" MLearn [n1] ... - MIDI learn operations"); msg.push_back(" COnfig ... - configuration settings"); msg.push_back(" BAnk ... - root and bank settings"); msg.push_back(" LIst ... - various available parameters"); msg.push_back(" LOad ... - load various files"); msg.push_back(" SAve ... - save various files"); msg.push_back(" "); break; case LISTS::part: msg.push_back("Part: [n1] = part number"); helpLoop(msg, partlist, 2); break; case LISTS::mcontrol: msg.push_back("Midi Control:"); helpLoop(msg, mcontrollist, 2); break; case LISTS::addsynth: msg.push_back("Part AddSynth:"); helpLoop(msg, addsynthlist, 2); break; case LISTS::subsynth: msg.push_back("Part SubSynth:"); helpLoop(msg, subsynthlist, 2); break; case LISTS::padsynth: msg.push_back("Part PadSynth:"); helpLoop(msg, padsynthlist, 2); break; case LISTS::resonance: msg.push_back("Resonance:"); helpLoop(msg, resonancelist, 2); break; case LISTS::addvoice: msg.push_back("Part AddVoice:"); helpLoop(msg, addvoicelist, 2); break; case LISTS::addmod: msg.push_back("AddVoice Modulator:"); helpLoop(msg, addmodlist, 2); break; case LISTS::waveform: msg.push_back("Part Waveform:"); helpLoop(msg, waveformlist, 2); break; case LISTS::lfo: msg.push_back("Engine LFOs:"); helpLoop(msg, LFOlist, 2); break; case LISTS::formant: msg.push_back("Formant Filter:"); helpLoop(msg, formantlist, 2); break; case LISTS::filter: msg.push_back("Engine Filters:"); helpLoop(msg, filterlist, 2); break; case LISTS::envelope: msg.push_back("Engine Envelopes:"); helpLoop(msg, envelopelist, 2); break; case LISTS::eff: msg.push_back("Effects:"); helpLoop(msg, fx_list, 2, true); break; case LISTS::reverb: msg.push_back("Reverb:"); helpLoop(msg, reverblist, 2); break; case LISTS::echo: msg.push_back("Echo:"); helpLoop(msg, echolist, 2); break; case LISTS::chorus: msg.push_back("Chorus:"); helpLoop(msg, choruslist, 2); break; case LISTS::phaser: msg.push_back("Phaser:"); helpLoop(msg, phaserlist, 2); break; case LISTS::alienwah: msg.push_back("Alienwah:"); helpLoop(msg, alienwahlist, 2); break; case LISTS::distortion: msg.push_back("Distortion:"); helpLoop(msg, distortionlist, 2); break; case LISTS::eq: msg.push_back("EQ:"); helpLoop(msg, eqlist, 2); break; case LISTS::dynfilter: msg.push_back("Dynfilter:"); helpLoop(msg, dynfilterlist, 2); break; case LISTS::vector: msg.push_back("Vector:"); helpLoop(msg, vectlist, 2); break; case LISTS::scale: msg.push_back("Scale:"); helpLoop(msg, scalelist, 2); break; case LISTS::load: msg.push_back("Load:"); helpLoop(msg, loadlist, 2); break; case LISTS::save: msg.push_back("Save:"); helpLoop(msg, savelist, 2); break; case LISTS::list: msg.push_back("List:"); helpLoop(msg, listlist, 2); break; case LISTS::bank: msg.push_back("Bank:"); helpLoop(msg, banklist, 2); break; case LISTS::config: msg.push_back("Config:"); helpLoop(msg, configlist, 2); msg.push_back("'*' entries need to be saved and Yoshimi restarted to activate"); break; case LISTS::mlearn: msg.push_back("Mlearn:"); helpLoop(msg, learnlist, 2); break; case LISTS::test: msg.push_back("Test:"); msg.push_back("Settings for automated testing..."); helpLoop(msg, testlist, 2); break; } if (listnum == LISTS::all) { helpLoop(msg, toplist, 2); msg.push_back("'...' is a help sub-menu"); } if (synth->getRuntime().toConsole) // we need this in case someone is working headless cout << "\nSet CONfig REPorts [s] - set report destination (Gui/Stdout)" << endl; synth->cliOutput(msg, LINES); return REPLY::exit_msg; } void CmdInterpreter::copypasteList(string name) { listmsg; size_t pos = 0; size_t last = 0; int count = 1; string txt = ""; while ((pos = name.find('\n', last)) != string::npos) { txt = name.substr(last, pos - last); if (!txt.empty()) { msg.push_back(to_string(count) + " " + txt); ++ count; } last = pos + 1; } txt = name.substr(last); if (!txt.empty()) { msg.push_back(to_string(count) + " " + txt); } synth->cliOutput(msg, LINES); } void CmdInterpreter::historyList(int listnum) { listmsg; int start = TOPLEVEL::XML::Instrument; int end = TOPLEVEL::XML::MLearn; bool found = false; if (listnum >= 0) // its a single list we want { start = listnum; end = listnum; } for (int type = start; type <= end; ++type) { vector const& listType{synth->getHistory(type)}; if (listType.size() > 0) { msg.push_back(" "); switch (type) { case TOPLEVEL::XML::Instrument: msg.push_back("Recent Instruments:"); break; case TOPLEVEL::XML::Patch: msg.push_back("Recent Patch Sets:"); break; case TOPLEVEL::XML::Scale: msg.push_back("Recent Scales:"); break; case TOPLEVEL::XML::State: msg.push_back("Recent States:"); break; case TOPLEVEL::XML::Vector: msg.push_back("Recent Vectors:"); break; case TOPLEVEL::XML::MLearn: msg.push_back("Recent MIDI learned:"); break; } int itemNo = 0; for (auto const& historyEntry : listType) { msg.push_back(to_string(1 + itemNo++) + " " + historyEntry); } found = true; } } if (!found) msg.push_back("\nNo Saved History"); synth->cliOutput(msg, LINES); } string CmdInterpreter::historySelect(int listnum, size_t selection) { vector const& listType{synth->getHistory(listnum - 1)}; if (listType.size() == 0) { synth->getRuntime().Log("No saved entries"); return ""; } else if (selection >= listType.size()) { synth->getRuntime().Log("No such entry"); return ""; } return listType[selection]; } int CmdInterpreter::effectsList(Parser& input, bool presets) { listmsg; size_t presetsPos; size_t presetsLast; int presetsCount; string blanks; string left; bool all; if (bitTest(context, LEVEL::AllFX) && presets == true) { synth->getRuntime().Log("Type " + fx_list[nFXtype] + "\nPresets -" + fx_presets[nFXtype].substr(fx_presets[nFXtype].find(',') + 1)); return REPLY::done_msg; } else if (presets) { synth->getRuntime().Log("No effect selected"); return REPLY::done_msg; } else all = input.matchnMove(1, "all"); if (!all) msg.push_back(" EFFECT presets"); for (int i = 0; i < 9; ++ i) { presetsPos = 1; presetsLast = fx_presets [i].find(',') + 1; // skip over count presetsCount = 0; if (all) { msg.push_back(" " + fx_list[i]); msg.push_back(" presets"); while (presetsPos != string::npos) { presetsPos = fx_presets [i].find(',', presetsLast); msg.push_back(" " + asString(presetsCount + 1) + " =" + fx_presets [i].substr(presetsLast, presetsPos - presetsLast)); presetsLast = presetsPos + 1; ++ presetsCount; } } else { left = fx_list[i]; msg.push_back(" " + left + blanks.assign(12 - left.length(), ' ') + fx_presets [i].substr(0, presetsLast - 1)); } } synth->cliOutput(msg, LINES); return REPLY::done_msg; } int CmdInterpreter::effects(Parser& input, unsigned char controlType) { kitNumber = EFFECT::type::none; Config &Runtime = synth->getRuntime(); int nFXavail; int par = nFX; int value; string dest = ""; int effClass; if (bitTest(context, LEVEL::Part)) effClass = npart; else if (bitTest(context, LEVEL::InsFX)) effClass = TOPLEVEL::section::insertEffects; else effClass = TOPLEVEL::section::systemEffects; int effSend = 0; // only used to check insert effects if (bitTest(context, LEVEL::Part)) { nFXavail = NUM_PART_EFX; nFX = readControl(synth, 0, PART::control::effectNumber, npart, UNUSED, UNUSED, TOPLEVEL::insert::partEffectSelect); nFXtype = synth->part[npart]->partefx[nFX]->geteffect(); } else if (bitTest(context, LEVEL::InsFX)) { nFXavail = NUM_INS_EFX; nFX = readControl(synth, 0, EFFECT::sysIns::effectNumber, TOPLEVEL::section::insertEffects); effSend = readControl(synth, 0, EFFECT::sysIns::effectDestination, TOPLEVEL::section::insertEffects); nFXtype = synth->insefx[nFX]->geteffect(); } else { nFXavail = NUM_SYS_EFX; nFX = readControl(synth, 0, EFFECT::sysIns::effectNumber, TOPLEVEL::section::systemEffects); nFXtype = synth->sysefx[nFX]->geteffect(); int tmp = input.toggle(); if (tmp >= 0) { return sendNormal(synth, 0, tmp, controlType, EFFECT::sysIns::effectEnable, TOPLEVEL::section::systemEffects, UNUSED, nFX); } } if (input.lineEnd(controlType)) { if (bitTest(context, LEVEL::Part)) dest = "Part" + to_string(int(npart + 1)); else if (bitTest(context, LEVEL::InsFX)) dest = "Insert"; else dest = "System"; Runtime.Log(dest + " effect " + asString(nFX + 1)); return REPLY::done_msg; } value = string2int(input); if (value > 0) { value -= 1; input.skipChars(); if (value >= nFXavail) return REPLY::range_msg; if (value != nFX) { // partially updates GUI nFX = value; if (bitTest(context, LEVEL::Part)) { sendNormal(synth, 0, nFX, TOPLEVEL::type::Write, PART::control::effectNumber, npart, UNUSED, nFX, TOPLEVEL::insert::partEffectSelect); nFXtype = synth->part[npart]->partefx[nFX]->geteffect(); return sendNormal(synth, 0, nFXtype, TOPLEVEL::type::Write, PART::control::effectType, npart, UNUSED, nFX, TOPLEVEL::insert::partEffectSelect); } if (bitTest(context, LEVEL::InsFX)) { sendNormal(synth, 0, nFX, TOPLEVEL::type::Write, EFFECT::sysIns::effectNumber, TOPLEVEL::section::insertEffects, UNUSED, nFX); nFXtype = synth->insefx[nFX]->geteffect(); return sendNormal(synth, 0, nFXtype, TOPLEVEL::type::Write, EFFECT::sysIns::effectType, TOPLEVEL::section::insertEffects, UNUSED, nFX); } sendNormal(synth, 0, nFX, TOPLEVEL::type::Write, EFFECT::sysIns::effectNumber, TOPLEVEL::section::systemEffects, UNUSED, nFX); nFXtype = synth->sysefx[nFX]->geteffect(); return sendNormal(synth, 0, nFXtype, TOPLEVEL::type::Write, EFFECT::sysIns::effectType, TOPLEVEL::section::systemEffects, UNUSED, nFX); } if (input.lineEnd(controlType)) { Runtime.Log("efx number set to " + asString(nFX + 1)); return REPLY::done_msg; } } bool effType = false; for (int i = 0; i < 9; ++ i) { //Runtime.Log("command " + string{input} + " list " + fx_list[i]); if (input.matchnMove(2, fx_list[i].c_str())) { nFXtype = i; effType = true; break; } } if (effType) { if (effSend == -1) { synth->getRuntime().Log("Insert effect " + asString(nFX + 1) + " unrouted"); synth->getRuntime().Log("Use 'SEnd Master, Off or part number'"); return REPLY::done_msg; } //cout << "nfx " << nFX << endl; nFXpreset = 0; // always set this on type change if (bitTest(context, LEVEL::Part)) { sendDirect(synth, 0, nFXtype, TOPLEVEL::type::Write, PART::control::effectType, npart, UNUSED, nFX); return REPLY::done_msg; // TODO find out why not sendNormal } else if (bitTest(context, LEVEL::InsFX)) return sendNormal(synth, 0, nFXtype, TOPLEVEL::type::Write, EFFECT::sysIns::effectType, TOPLEVEL::section::insertEffects, UNUSED, nFX); else return sendNormal(synth, 0, nFXtype, TOPLEVEL::type::Write, EFFECT::sysIns::effectType, TOPLEVEL::section::systemEffects, UNUSED, nFX); } if (nFXtype > 0) { int selected = -1; int value = -1; string name = string{input}.substr(0, 3); /* * We can't do a skipChars here as we don't yet know * if 'selected' will be valid. For some controls we * need to do an on-the-spot skip, otherwise we do so * at the end when we know we have a valid result but * 'value' has not been set. * If it's not valid we don't block, but pass on to * other command tests routines. */ if (controlType == type_read) value = 1; // dummy value switch (nFXtype) { case 1: { selected = stringNumInList(name, effreverb, 3); if (selected != 7) // EQ nFXeqBand = 0; if (selected == 10 && value == -1) // type { input.skipChars(); if (input.matchnMove(1, "random")) value = 0; else if (input.matchnMove(1, "freeverb")) value = 1; else if (input.matchnMove(1, "bandwidth")) value = 2; else return REPLY::value_msg; } break; } case 2: selected = stringNumInList(name, effecho, 3); if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } else if ((selected == EFFECT::control::bpm || selected == EFFECT::control::sepLRDelay) && value == -1) { input.skipChars(); value = (input.toggle() == 1); } break; case 3: { selected = stringNumInList(name, effchorus, 3); if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } else if (selected == 4 && value == -1) // filtershape { input.skipChars(); if (input.matchnMove(1, "sine")) value = 0; else if (input.matchnMove(1, "triangle")) value = 1; else return REPLY::value_msg; } else if (selected == 11) // subtract { input.skipChars(); value = (input.toggle() == 1); } else if (selected == EFFECT::control::bpm && value == -1) { input.skipChars(); value = (input.toggle() == 1); } break; } case 4: { selected = stringNumInList(name, effphaser, 3); if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } else if (selected == 4 && value == -1) // filtershape { input.skipChars(); if (input.matchnMove(1, "sine")) value = 0; else if (input.matchnMove(1, "triangle")) value = 1; else return REPLY::value_msg; } else if (selected == 10 || selected == 12 || selected == 14) // LFO, SUB, ANA { input.skipChars(); value = (input.toggle() == 1); } else if (selected == EFFECT::control::bpm && value == -1) { input.skipChars(); value = (input.toggle() == 1); } break; } case 5: { selected = stringNumInList(name, effalienwah, 3); if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } else if (selected == 4 && value == -1) // filtershape { input.skipChars(); if (input.matchnMove(1, "sine")) value = 0; else if (input.matchnMove(1, "triangle")) value = 1; else return REPLY::value_msg; } else if (selected == EFFECT::control::bpm && value == -1) { input.skipChars(); value = (input.toggle() == 1); } break; } case 6: { selected = stringNumInList(name, effdistortion, 3); if (selected == 5 && value == -1) // filtershape { input.skipChars(); string name = string{input}.substr(0,3); value = stringNumInList(name, filtershapes, 3) - 1; if (value < 0) return REPLY::value_msg; } else if (selected == 6 || selected == 9 || selected == 10) // invert, stereo, prefilter { input.skipChars(); value = (input.toggle() == 1); } break; } case 7: // TODO band and type no GUI update { selected = stringNumInList(name, effeq, 2); if (selected == 1) // band { if (controlType == TOPLEVEL::type::Write) { input.skipChars(); value = string2int(input) - 1; if (value < 0 || value >= MAX_EQ_BANDS) return REPLY::range_msg; nFXeqBand = value; } } else if (selected == 2 && value == -1) // type { input.skipChars(); string name = string{input}.substr(0,3); value = stringNumInList(name, eqtypes, 3); if (value < 0) return REPLY::value_msg; } if (selected > 1) { selected += 8; } break; } case 8: { selected = stringNumInList(name, effdynamicfilter, 3); if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } else if (selected == 4 && value == -1) // filtershape { input.skipChars(); if (input.matchnMove(1, "sine")) value = 0; else if (input.matchnMove(1, "triangle")) value = 1; else return REPLY::value_msg; } else if (selected == 8) // invert { input.skipChars(); value = (input.toggle() == 1); } else if (selected == 10) // filter entry { bitSet(context, LEVEL::Filter); return REPLY::done_msg; } else if (selected == EFFECT::control::bpm && value == -1) { input.skipChars(); value = (input.toggle() == 1); } } break; } if (selected > -1) { if (value == -1) { input.skipChars(); value = string2int(input); } //cout << "Val " << value << " type " << controlType << " cont " << selected << " part " << context << " efftype " << int(nFXtype) << " num " << int(nFX) << endl; return sendNormal(synth, 0, value, controlType, selected, effClass, EFFECT::type::none + nFXtype, nFX); } // Continue cos it's not for us. } if (input.matchnMove(2, "send")) { bool isWrite = (controlType == TOPLEVEL::type::Write); if (input.lineEnd(controlType)) return REPLY::parameter_msg; if (!bitTest(context, LEVEL::InsFX)) // system effects { par = string2int(input) - 1; input.skipChars(); if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int127(input); } else if (isWrite) { if (input.matchnMove(1, "master")) value = -2; else if (input.matchnMove(1, "off")) value = -1; else { value = string2int(input) - 1; if (value >= int(Runtime.numAvailableParts) || value < 0) return REPLY::range_msg; } effSend = value; } if (!isWrite) value = 1; // dummy int control; int section; engine = nFX; int insert = UNUSED; if (bitTest(context, LEVEL::Part)) { section = npart; control = PART::control::partToSystemEffect1 + par; engine = UNUSED; } else if (bitTest(context, LEVEL::InsFX)) { section = TOPLEVEL::section::insertEffects; control = EFFECT::sysIns::effectDestination; } else { if (par <= nFX || par >= NUM_SYS_EFX) return REPLY::range_msg; section = TOPLEVEL::section::systemEffects; control = EFFECT::sysIns::toEffect1 + par - 1; // TODO this needs sorting engine = nFX; insert = TOPLEVEL::insert::systemEffectSend; } return sendNormal(synth, 0, value, controlType, control, section, UNUSED, engine, insert); } if (input.matchnMove(3, "preset")) { /* * Using constant strings and bedding the number into the list * of presets provides a very simple way to keep track of a * moving target with minimal code and data space. * However, all of this should really be in src/Effects * not here *and* in the gui code! */ int section; nFXpreset = string2int127(input) - 1; if (bitTest(context, LEVEL::Part)) section = npart; else if (bitTest(context, LEVEL::InsFX)) section = TOPLEVEL::section::insertEffects; else section = TOPLEVEL::section::systemEffects; return sendNormal(synth, 0, nFXpreset, controlType, EFFECT::control::preset, section, EFFECT::type::none + nFXtype, nFX); } return REPLY::op_msg; } int CmdInterpreter::midiControllers(Parser& input, unsigned char controlType) { if (input.isAtEnd()) return REPLY::done_msg; int value = -1; int cmd = -1; bool isWrite = (controlType == TOPLEVEL::type::Write); if (input.matchnMove(2, "volume")) { value = !(input.toggle() == 0); cmd = PART::control::volumeEnable; } if ((cmd == -1) && input.matchnMove(2, "VRange")) { value = string2int127(input); cmd = PART::control::volumeRange; } if ((cmd == -1) && input.matchnMove(2, "pan")) { value = string2int127(input); cmd = PART::control::panningWidth; } if ((cmd == -1) && input.matchnMove(2, "modwheel")) { value = (input.toggle() == 1); cmd = PART::control::exponentialModWheel; } if ((cmd == -1) && input.matchnMove(2, "mrange")) { value = string2int127(input); cmd = PART::control::modWheelDepth; } if ((cmd == -1) && input.matchnMove(2, "expression")) { value = !(input.toggle() == 0); cmd = PART::control::expressionEnable; } if ((cmd == -1) && input.matchnMove(2, "sustain")) { value = !(input.toggle() == 0); cmd = PART::control::sustainPedalEnable; } if ((cmd == -1) && input.matchnMove(2, "pwheel")) { value = string2int(input); cmd = PART::control::pitchWheelRange; } if ((cmd == -1) && input.matchnMove(2, "breath")) { value = !(input.toggle() == 0); cmd = PART::control::breathControlEnable; } if ((cmd == -1) && input.matchnMove(2, "cutoff")) { value = string2int127(input); cmd = PART::control::filterCutoffDepth; } if ((cmd == -1) && input.matchnMove(2, "q")) { value = string2int127(input); cmd = PART::control::filterQdepth; } if ((cmd == -1) && input.matchnMove(3, "bandwidth")) { value = (input.toggle() == 1); cmd = PART::control::exponentialBandwidth; } if ((cmd == -1) && input.matchnMove(3, "barange")) { value = string2int127(input); cmd = PART::control::bandwidthDepth; } if ((cmd == -1) && input.matchnMove(2, "fmamplitude")) { value = !(input.toggle() == 0); cmd = PART::control::FMamplitudeEnable; } if ((cmd == -1) && input.matchnMove(2, "rcenter")) { value = string2float(input); cmd = PART::control::resonanceCenterFrequencyDepth; } if ((cmd == -1) && input.matchnMove(2, "rband")) { value = string2int127(input); cmd = PART::control::resonanceBandwidthDepth; } // portamento controls if (cmd == -1) { if (input.matchnMove(2, "portamento")) { value = !(input.toggle() == 0); cmd = PART::control::receivePortamento; } else if (input.matchnMove(2, "ptime")) { value = string2int127(input); cmd = PART::control::portamentoTime; } else if (input.matchnMove(2, "pdownup")) { value = string2int127(input); cmd = PART::control::portamentoTimeStretch; } else if (input.matchnMove(2, "pgate")) { value = string2int127(input); cmd = PART::control::portamentoThreshold; } else if (input.matchnMove(2, "pform")) { if (input.matchnMove(1, "start")) value = 0; else if (input.matchnMove(1, "@end")) value = 1; cmd = PART::control::portamentoThresholdType; } else if (input.matchnMove(2, "pproportional")) { value = (input.toggle() == 1); cmd = PART::control::enableProportionalPortamento; } else if (input.matchnMove(2, "pextent")) { value = string2int127(input); cmd = PART::control::proportionalPortamentoRate; } else if (input.matchnMove(2, "prange")) { value = string2int127(input); cmd = PART::control::proportionalPortamentoDepth; } } if ((cmd == -1) && input.matchnMove(2, "clear")) { if (isWrite) return REPLY::writeOnly_msg; value = 0; cmd = PART::control::resetAllControllers; } // midi controllers if (cmd == -1 && input.matchnMove(1, "e")) { if (input.matchnMove(1, "modulation")) { value = string2int127(input); cmd = PART::control::midiModWheel; } else if (input.matchnMove(1, "expression")) { value = string2int127(input); cmd = PART::control::midiExpression; } else if (input.matchnMove(2, "breath")) { value = string2int127(input); cmd = PART::control::midiBreath; } else if (input.matchnMove(1, "cutoff")) { value = string2int127(input); cmd = PART::control::midiFilterCutoff; } else if (input.matchnMove(1, "q")) { value = string2int127(input); cmd = PART::control::midiFilterQ; } else if (input.matchnMove(2, "bandwidth")) { value = string2int127(input); cmd = PART::control::midiBandwidth; } } if (value == -1 && controlType != TOPLEVEL::type::Write) value = 0; if (cmd > -1) return sendNormal(synth, 0, value, controlType, cmd, npart); return REPLY::unrecognised_msg; } int CmdInterpreter::LFOselect(Parser& input, unsigned char controlType) { int cmd = -1; float value = -1; int group = -1; if (insertGroup == UNUSED) insertGroup = TOPLEVEL::insertType::amplitude; if (input.lineEnd(controlType)) return REPLY::done_msg; engine = contextToEngines(context); if (engine == PART::engine::addVoice1) engine += voiceNumber; if (input.matchnMove(2, "amplitude")) group = TOPLEVEL::insertType::amplitude; else if (input.matchnMove(2, "frequency")) group = TOPLEVEL::insertType::frequency; else if (input.matchnMove(2, "filter")) group = TOPLEVEL::insertType::filter; if (group > -1) insertGroup = group; else group = insertGroup; switch (group) { case TOPLEVEL::insertType::amplitude: cmd = ADDVOICE::control::enableAmplitudeLFO; break; case TOPLEVEL::insertType::frequency: cmd = ADDVOICE::control::enableFrequencyLFO; break; case TOPLEVEL::insertType::filter: cmd = ADDVOICE::control::enableFilterLFO; break; } value = input.toggle(); if (value > -1) { if (engine != PART::engine::addVoice1 + voiceNumber) return REPLY::available_msg; return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, engine); } if (input.lineEnd(controlType)) return REPLY::done_msg; value = -1; cmd = -1; if (input.matchnMove(1, "rate")) { cmd = LFOINSERT::control::speed; if (controlType == type_read && input.isAtEnd()) value = 0; else { value = freqBPMset(input, readControl(synth, 0, LFOINSERT::bpm, npart, kitNumber, engine, TOPLEVEL::insert::LFOgroup, group), 1); if (value < 0) return REPLY::done_msg; // error already reported } } else if (input.matchnMove(1, "intensity")) cmd = LFOINSERT::control::depth; else if (input.matchnMove(1, "start")) cmd = LFOINSERT::control::start; else if (input.matchnMove(1, "delay")) cmd = LFOINSERT::control::delay; else if (input.matchnMove(1, "expand")) cmd = LFOINSERT::control::stretch; else if (input.matchnMove(1, "continuous")) { value = (input.toggle() == 1); cmd = LFOINSERT::control::continuous; } else if (input.matchnMove(1, "bpm")) { value = (input.toggle() == 1); cmd = LFOINSERT::control::bpm; } else if (input.matchnMove(1, "type")) { if (controlType == type_read && input.isAtEnd()) value = 0; else { int idx = 0; while (LFOtype [idx] != "@end") { if (input.matchnMove(2, LFOtype[idx].c_str())) { value = idx; break; } ++idx; } if (value == -1) return REPLY::range_msg; } cmd = LFOINSERT::control::type; } else if (input.matchnMove(2, "ar")) cmd = LFOINSERT::control::amplitudeRandomness; else if (input.matchnMove(2, "rr")) cmd = LFOINSERT::control::frequencyRandomness; //cout << ">> base cmd " << int(cmd) << " part " << int(npart) << " kit " << int(kitNumber) << " engine " << int(engine) << " parameter " << int(group) << endl; if (value == -1) value = string2float(input); return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, engine, TOPLEVEL::insert::LFOgroup, group); } float CmdInterpreter::freqBPMset(Parser& input, bool isBPM, int max) { float value; if (isBPM) { int num = string2int(input); input.skipChars(); if (input.isAtEnd()) { synth->getRuntime().Log("BPM mode requires two values between 1 and 16"); value = -1; } int div = string2int(input); if (num > 3 && div > 3) { synth->getRuntime().Log("Cannot have both values greater than 3"); value = -1; } else if (num == div) num = div = 1; value = func::BPMfractionLFOfreq(num, div) * max; } else { value = string2float(input); if (value < 0 || value > max) { synth->getRuntime().Log("Frequency requires a value between 0.0 and " + to_string(max)); value = -1; } } return value; } int CmdInterpreter::filterSelect(Parser& input, unsigned char controlType) { int cmd = -1; float value = -1; int thisPart = npart; int kit = kitNumber; if (input.lineEnd(controlType)) return REPLY::done_msg; engine = contextToEngines(context); if (engine == PART::engine::addVoice1) engine += voiceNumber; bool isDyn = false; if (bitTest(context, LEVEL::AllFX) && nFXtype == 8) { kit = EFFECT::type::dynFilter; engine = 0; if (bitTest(context, LEVEL::InsFX)) { thisPart = TOPLEVEL::section::insertEffects; } else if (!bitTest(context, LEVEL::Part)) { thisPart = TOPLEVEL::section::systemEffects; } isDyn = true; } if (!isDyn && (engine == PART::engine::subSynth || engine == PART::engine::addVoice1 + voiceNumber)) { value = input.toggle(); if (value > -1) { if (engine == PART::engine::subSynth) cmd = SUBSYNTH::control::enableFilter; else cmd = ADDVOICE::control::enableFilter; readControl(synth, 0, FILTERINSERT::control::baseType, thisPart, kitNumber, engine, TOPLEVEL::insert::filterGroup); return sendNormal(synth, 0, value, controlType, cmd, thisPart, kit, engine); } value = -1; // leave it as if not set } int baseType = readControl(synth, 0, FILTERINSERT::control::baseType, thisPart, kit, engine, TOPLEVEL::insert::filterGroup); if (baseType == 1) // only formant filter controls { if (input.matchnMove(2, "edit")) { filterVowelNumber = 0; filterFormantNumber = 0; bitSet(context, LEVEL::Formant); return REPLY::done_msg; } if (bitTest(context, LEVEL::Formant)) { // now actually IN the formant editor if (input.matchnMove(1, "invert")) { value = (input.toggle() == 1); cmd = FILTERINSERT::control::negateInput; } else if (input.matchnMove(2, "center")) { cmd = FILTERINSERT::control::formantCenter; value = string2float(input); } else if (input.matchnMove(1, "range")) { cmd = FILTERINSERT::control::formantOctave; value = string2float(input); } else if (input.matchnMove(1, "expand")) cmd = FILTERINSERT::control::formantStretch; else if (input.matchnMove(1, "lucidity")) cmd = FILTERINSERT::control::formantClearness; else if (input.matchnMove(1, "morph")) cmd = FILTERINSERT::control::formantSlowness; else if (input.matchnMove(1, "size")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); if (controlType == TOPLEVEL::type::Write && filterVowelNumber >= value) return REPLY::range_msg; cmd = FILTERINSERT::control::sequenceSize; } else if (input.matchnMove(2, "count")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = FILTERINSERT::control::numberOfFormants; } else if (input.matchnMove(1, "vowel")) { if (controlType == type_read) return REPLY::done_msg; // it's already showing! if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); int number = string2int(input) -1; if (number < 0 || number >= FF_MAX_VOWELS) return REPLY::range_msg; filterVowelNumber = number; filterFormantNumber = 0; return REPLY::done_msg; } else if (input.matchnMove(1, "point")) { if (input.lineEnd(TOPLEVEL::type::Write)) // always must have a value here return REPLY::value_msg; value = string2int(input) - 1; if (input.lineEnd(controlType)) return REPLY::value_msg; input.skipChars(); int position = string2int(input) - 1; return sendNormal(synth, 0, position, controlType, FILTERINSERT::control::vowelPositionInSequence, thisPart, kit, engine, TOPLEVEL::insert::filterGroup, value); } else if (input.matchnMove(2, "formant")) { if (controlType == type_read) return REPLY::done_msg; // it's already showing! if (input.lineEnd(controlType)) return REPLY::value_msg; int number = string2int(input) - 1; if (number < 0 || number >= filterNumberOfFormants) return REPLY::range_msg; filterFormantNumber = number; return REPLY::done_msg; } else { if (input.matchnMove(2, "frequency")) cmd = FILTERINSERT::control::formantFrequency; else if (input.matchnMove(1, "q")) cmd = FILTERINSERT::control::formantQ; else if (input.matchnMove(1, "gain")) cmd = FILTERINSERT::control::formantAmplitude; if (cmd == -1) return REPLY::range_msg; value = string2int(input); return sendNormal(synth, 0, value, controlType, cmd, thisPart, kit, engine, TOPLEVEL::insert::filterGroup, filterFormantNumber, filterVowelNumber); } if (value == -1) value = string2int(input); return sendNormal(synth, 0, value, controlType, cmd, thisPart, kit, engine, TOPLEVEL::insert::filterGroup, 0); } } else if (input.matchnMove(2, "type")) // formant doesn't have a 'type' { if (controlType == type_read && input.isAtEnd()) value = 0; switch (baseType) { case 0: // analog { if (value == -1) { int idx = 0; while (filterlist [idx] != "l1") idx += 2; int start = idx; while (filterlist [idx] != "hshelf") idx += 2; int end = idx; idx = start; while (idx <= end) { if (input.matchnMove(2, filterlist[idx].c_str())) break; idx += 2; } if (idx > end) return REPLY::range_msg; value = (idx - start) / 2; } cmd = FILTERINSERT::control::analogType; break; } case 2: // state variable { if (value == -1) { int idx = 0; while (filterlist [idx] != "low") idx += 2; int start = idx; while (filterlist [idx] != "stop") idx += 2; int end = idx; idx = start; while (idx <= end) { if (input.matchnMove(2, filterlist[idx].c_str())) break; idx += 2; } if (idx > end) return REPLY::range_msg; value = (idx - start) / 2; } cmd = FILTERINSERT::control::stateVariableType; break; } default: return REPLY::available_msg; break; } } // the following are common to all categories if (input.matchnMove(2, "center")) cmd = FILTERINSERT::control::centerFrequency; else if (input.matchnMove(1, "q")) cmd = FILTERINSERT::control::Q; else if (input.matchnMove(1, "velocity")) cmd = FILTERINSERT::control::velocitySensitivity; else if (input.matchnMove(2, "slope")) cmd = FILTERINSERT::control::velocityCurve; else if (input.matchnMove(1, "gain")) cmd = FILTERINSERT::control::gain; else if (input.matchnMove(2, "tracking")) cmd = FILTERINSERT::control::frequencyTracking; else if (input.matchnMove(1, "range")) { value = (input.toggle() == 1); cmd = FILTERINSERT::control::frequencyTrackingRange; } else if (input.matchnMove(2, "category")) { if (controlType == type_read && input.isAtEnd()) value = 0; // dummy value else { if (input.matchnMove(1, "analog")) value = 0; else if (input.matchnMove(1, "formant")) value = 1; else if (input.matchnMove(1, "state")) value = 2; else return REPLY::range_msg; } cmd = FILTERINSERT::control::baseType; } else if (input.matchnMove(2, "stages")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input) - 1; cmd = FILTERINSERT::control::stages; } if (value == -1) value = string2float(input); return sendNormal(synth, 0, value, controlType, cmd, thisPart, kit, engine, TOPLEVEL::insert::filterGroup); } int CmdInterpreter::envelopeSelect(Parser& input, unsigned char controlType) { int cmd = -1; float value = -1; int group = -1; unsigned char insert = TOPLEVEL::insert::envelopeGroup; unsigned char offset = UNUSED; if (insertGroup == UNUSED) insertGroup = TOPLEVEL::insertType::amplitude; engine = contextToEngines(context); if (engine == PART::engine::addVoice1 || engine == PART::engine::addMod1) engine += voiceNumber; if (input.matchnMove(2, "amplitute")) group = TOPLEVEL::insertType::amplitude; else if (input.matchnMove(2, "frequency")) group = TOPLEVEL::insertType::frequency; else if (input.matchnMove(2, "filter")) group = TOPLEVEL::insertType::filter; else if (input.matchnMove(2, "bandwidth")) { if (bitTest(context, LEVEL::SubSynth)) group = TOPLEVEL::insertType::bandwidth; else return REPLY::available_msg; } if (group > -1) insertGroup = group; else group = insertGroup; switch (insertGroup) { case TOPLEVEL::insertType::amplitude: if (engine < PART::engine::addMod1) cmd = ADDVOICE::control::enableAmplitudeEnvelope; else cmd = ADDVOICE::control::enableModulatorAmplitudeEnvelope; break; case TOPLEVEL::insertType::frequency: if (engine < PART::engine::addMod1) cmd = ADDVOICE::control::enableFrequencyEnvelope; else cmd = ADDVOICE::control::enableModulatorFrequencyEnvelope; break; case TOPLEVEL::insertType::filter: cmd = ADDVOICE::control::enableFilterEnvelope; break; case TOPLEVEL::insertType::bandwidth: cmd = SUBSYNTH::control::enableBandwidthEnvelope; break; } if (input.lineEnd(controlType)) return REPLY::done_msg; value = input.toggle(); if (value > -1) { if (engine != PART::engine::addSynth && engine != PART::engine::padSynth) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, engine); else return REPLY::available_msg; } if (input.matchnMove(2, "fmode")) { return sendNormal(synth, 0, (input.toggle() == 1), controlType, ENVELOPEINSERT::control::enableFreeMode, npart, kitNumber, engine, TOPLEVEL::insert::envelopeGroup, insertGroup); } // common controls value = -1; cmd = -1; if (input.matchnMove(2, "expand")) cmd = ENVELOPEINSERT::control::stretch; else if (input.matchnMove(1, "force")) { cmd = ENVELOPEINSERT::control::forcedRelease; value = (input.toggle() == 1); } else if (input.matchnMove(2, "linear")) { cmd = ENVELOPEINSERT::control::linearEnvelope; value = (input.toggle() == 1); } bool freeMode = readControl(synth, 0, ENVELOPEINSERT::control::enableFreeMode, npart, kitNumber, engine, TOPLEVEL::insert::envelopeGroup, insertGroup); if (freeMode && cmd == -1) { int pointCount = readControl(synth, 0, ENVELOPEINSERT::control::points, npart, kitNumber, engine, insert, insertGroup); if (input.matchnMove(1, "Points")) { if (controlType == type_read) { if (input.lineEnd(controlType)) return REPLY::value_msg; int point = string2int(input) -1; if (point < 0 || point >= pointCount) return REPLY::value_msg; int x = readControl(synth, TOPLEVEL::action::fromCLI, point, npart, kitNumber, engine, TOPLEVEL::insert::envelopePointChangeDt, insertGroup, 0); //int y = readControl(synth, 0, point, npart, kitNumber, engine, TOPLEVEL::insert::envelopePointChangeVal, insertGroup); std::cout << "point X " << x << std::endl; //synth->getRuntime().Log("Point " + to_string(point) + ", X " + to_string(x) + ", Y " + to_string(y)); return REPLY::done_msg; } value = 0; // dummy value cmd = ENVELOPEINSERT::control::points; // not using already fetched value to get normal reporting } else if (input.matchnMove(1, "Sustain")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input) - 1; if (value == 0) { synth->getRuntime().Log("Sustain can't be at first point"); return REPLY::done_msg; } else if (value >= (pointCount - 1)) { synth->getRuntime().Log("Sustain can't be at last point"); return REPLY::done_msg; } else if (value < 0) return REPLY::range_msg; cmd = ENVELOPEINSERT::control::sustainPoint; } else { if (input.matchnMove(1, "insert")) { if ((MAX_ENVELOPE_POINTS - pointCount) < 2) { synth->getRuntime().Log("Max points already defined"); return REPLY::done_msg; } if (input.lineEnd(controlType)) return REPLY::value_msg; cmd = string2int(input) -1; // point number if (cmd <= 0) { synth->getRuntime().Log("Can't add at first point"); return REPLY::done_msg; } if (cmd < 0 || cmd >= pointCount) return REPLY::range_msg; input.skipChars(); if (input.lineEnd(controlType)) return REPLY::value_msg; offset = string2int(input); // X input.skipChars(); if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); // Y insert = TOPLEVEL::insert::envelopePointAdd; } else if (input.matchnMove(1, "delete")) { if (pointCount <= 3) { synth->getRuntime().Log("Can't have less than three points"); return REPLY::done_msg; } if (input.lineEnd(controlType)) return REPLY::value_msg; cmd = string2int(input) -1; // point number if (cmd <= 0) { synth->getRuntime().Log("Can't delete first point"); return REPLY::done_msg; } if (cmd >= (pointCount - 1)) { synth->getRuntime().Log("Can't delete last point"); return REPLY::done_msg; } if (cmd < 0 || cmd >= (MAX_ENVELOPE_POINTS - 1)) return REPLY::range_msg; insert = TOPLEVEL::insert::envelopePointDelete; } else if (input.matchnMove(1, "change")) { if (input.lineEnd(controlType)) return REPLY::value_msg; cmd = string2int(input) -1; // point number if (cmd <= 0 || cmd >= (pointCount)) return REPLY::range_msg; input.skipChars(); if (input.lineEnd(controlType)) return REPLY::value_msg; offset = string2int(input); // X input.skipChars(); if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); // Y insert = TOPLEVEL::insert::envelopePointChange; } } } else if (cmd == -1) { if (input.matchnMove(1, "attack")) { if (input.matchnMove(1, "level")) cmd = ENVELOPEINSERT::control::attackLevel; else if (input.matchnMove(1, "time")) cmd = ENVELOPEINSERT::control::attackTime; } else if (input.matchnMove(1, "decay")) { if (input.matchnMove(1, "level")) cmd = ENVELOPEINSERT::control::decayLevel; else if (input.matchnMove(1, "time")) cmd = ENVELOPEINSERT::control::decayTime; } else if (input.matchnMove(1, "sustain")) cmd = ENVELOPEINSERT::control::sustainLevel; else if (input.matchnMove(1, "release")) { if (input.matchnMove(1, "level")) cmd = ENVELOPEINSERT::control::releaseLevel; else if (input.matchnMove(1, "time")) cmd = ENVELOPEINSERT::control::releaseTime; } } if (cmd == -1) return REPLY::op_msg; if (value == -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2float(input); } //cout << ">> base cmd " << int(cmd) << " part " << int(npart) << " kit " << int(kitNumber) << " engine " << int(engine) << " parameter " << int(insertGroup) << endl; /* * seems to need direct send foo inserting a point * mabe wrong range check value. */ return sendDirect(synth, 0, string2float(input), controlType, cmd, npart, kitNumber, engine, insert, insertGroup, offset); } int CmdInterpreter::commandGroup(Parser& input) { string line; float value = string2int(input); if (input.isAtEnd()) { synth->getRuntime().Log("\nInstrument Groups"); int i = 0; string entry = type_list[i]; while (entry != "@end") { entry = func::stringCaps(entry, 3); line = " " + func::stringCaps(entry, 3); synth->getRuntime().Log(line); ++ i; entry = type_list[i]; } return REPLY::done_msg; } string name = string{input}; value = stringNumInList(name, type_list, 2) + 1; //cout << value << endl; if (value < 1) return REPLY::range_msg; synth->getRuntime().Log("\n" + type_list[int(value - 1)] + " Instruments"); list msg; /* * Having two lists is messy, but the list routine clears 'msg' and * we need 'instrumentGroup' kept for later actual part loads. * Also, the search list needs embedded root, bank, and instrument IDs * but the reported one only wants the list number. */ input.skipChars(); bool full = (input.matchnMove(1, "location")); int count = 0; instrumentGroup.clear(); do { ++ count; line = textMsgBuffer.fetch(readControl(synth, 0, BANK::control::findInstrumentName, TOPLEVEL::section::bank, UNUSED, UNUSED, UNUSED, value - 1)); if (line != "@end") { instrumentGroup.push_back(line); if (!full && line.length() > 16) line = line.substr(15); // remove root, bank, instrument IDs line = to_string(count) + "| " + line; // replace with line count msg.push_back(line); } } while (line != "@end"); synth->cliOutput(msg, LINES); return REPLY::done_msg; } int CmdInterpreter::commandList(Parser& input) { Config &Runtime = synth->getRuntime(); int ID; int tmp; list msg; if (input.matchnMove(1, "instruments") || input.matchnMove(2, "programs")) { if (input.isAtEnd()) ID = 128; else ID = string2int(input); synth->ListInstruments(ID, msg); synth->cliOutput(msg, LINES); return REPLY::done_msg; } if (input.matchnMove(1, "roots")) // must be before bank { synth->ListPaths(msg); synth->cliOutput(msg, LINES); return REPLY::done_msg; } if (input.matchnMove(1, "banks") || (bitFindHigh(context) == LEVEL::Bank && (input.isAtEnd() || input.isdigit()))) { if (input.isAtEnd() || !input.isdigit()) ID = 128; else ID = string2int(input); synth->ListBanks(ID, msg); synth->cliOutput(msg, LINES); return REPLY::done_msg; } if (input.matchnMove(1, "vectors")) { synth->ListVectors(msg); synth->cliOutput(msg, LINES); return REPLY::done_msg; } if (input.matchnMove(1, "parts")) { listCurrentParts(input, msg); synth->cliOutput(msg, LINES); return REPLY::done_msg; } if (input.matchnMove(1, "config")) { synth->ListSettings(msg); synth->cliOutput(msg, LINES); return REPLY::done_msg; } if (input.matchnMove(2, "mlearn")) { if (input.nextChar('@')) { input.skip(1); input.skipSpace(); tmp = string2int(input); if (tmp > 0) synth->midilearn.listLine(tmp - 1); else return REPLY::value_msg; } else { synth->midilearn.listAll(msg); synth->cliOutput(msg, LINES); } return REPLY::done_msg; } if (input.matchnMove(1, "tuning")) { Runtime.Log("Tuning:\n" + synth->microtonal.tuningtotext()); return REPLY::done_msg; } if (input.matchnMove(1, "keymap")) { Runtime.Log("Keymap:\n" + synth->microtonal.keymaptotext()); return REPLY::done_msg; } if (input.matchnMove(1, "history")) { if (input.matchnMove(1, "instruments") || input.matchnMove(2, "program") ) historyList(TOPLEVEL::XML::Instrument); else if (input.matchnMove(1, "patchsets")) historyList(TOPLEVEL::XML::Patch); else if (input.matchnMove(2, "scales")) historyList(TOPLEVEL::XML::Scale); else if (input.matchnMove(2, "states")) historyList(TOPLEVEL::XML::State); else if (input.matchnMove(1, "vectors")) historyList(TOPLEVEL::XML::Vector); else if (input.matchnMove(2, "mlearn")) historyList(TOPLEVEL::XML::MLearn); else historyList(-1); return REPLY::done_msg; } if (input.matchnMove(1, "effects") || input.matchnMove(1, "efx")) return effectsList(input); if (input.matchnMove(3, "presets")) return effectsList(input, true); if (input.matchnMove(3, "section")) // section presets { if (insertType == TOPLEVEL::insert::envelopeGroup || insertType == TOPLEVEL::insert::LFOgroup) { presetsControl(0, TOPLEVEL::type::List, section, kitNumber, engine, insertType, insertGroup, UNUSED); return REPLY::done_msg; } presetsControl(0, TOPLEVEL::type::List, section, kitNumber, engine, insertType, filterFormantNumber, filterVowelNumber); return REPLY::done_msg; } msg.push_back("Lists:"); helpLoop(msg, listlist, 2); if (synth->getRuntime().toConsole) // we need this in case someone is working headless cout << "\nSet CONfig REPorts [s] - set report destination (gui/stderr)" << endl; synth->cliOutput(msg, LINES); return REPLY::done_msg; } void CmdInterpreter::listCurrentParts(Parser& input, list& msg_buf) { int dest; string name = ""; int avail = readControl(synth, 0, MAIN::control::availableParts, TOPLEVEL::section::main); bool full = input.matchnMove(1, "more"); if (bitFindHigh(context) == LEVEL::Part) { // part level list results if (!readControl(synth, 0, PART::control::kitMode, TOPLEVEL::section::part1 + npart)) { if (readControl(synth, 0, PART::control::enableAdd, TOPLEVEL::section::part1 + npart, UNUSED, PART::engine::addSynth)) { name += " AddSynth "; if (full) { string found = ""; for (int voice = 0; voice < NUM_VOICES; ++voice) { if (readControl(synth, 0, ADDVOICE::control::enableVoice, TOPLEVEL::section::part1 + npart, 0, PART::engine::addVoice1 + voice)) found += (" " + to_string(voice + 1)); } if (found > "") name += ("Voices" + found + " "); } } if (readControl(synth, 0, PART::control::enableSub, TOPLEVEL::section::part1 + npart, UNUSED, PART::engine::subSynth)) name += " SubSynth "; if (readControl(synth, 0, PART::control::enablePad, TOPLEVEL::section::part1 + npart, UNUSED, PART::engine::padSynth)) name += " PadSynth "; if (name == "") name = "no engines active!"; msg_buf.push_back(name); return; } msg_buf.push_back("kit items"); for (int item = 0; item < NUM_KIT_ITEMS; ++item) { if (!readControl(synth, 0, PART::control::enableKitLine, TOPLEVEL::section::part1 + npart, item, UNUSED, TOPLEVEL::insert::kitGroup)) continue; name = ""; if (readControl(synth, 0, PART::control::enable, TOPLEVEL::section::part1 + npart, item, UNUSED, TOPLEVEL::insert::kitGroup)) { name = " " + to_string(item + 1) + " "; { if (readControl(synth, 0, PART::control::kitItemMute, TOPLEVEL::section::part1 + npart, item, UNUSED, TOPLEVEL::insert::kitGroup)) name += "Quiet"; else { if (full) { name += " key Min "; int min = int(readControl(synth, 0, PART::control::minNote, TOPLEVEL::section::part1 + npart, item, UNUSED, TOPLEVEL::insert::kitGroup)); if (min < 10) name += " "; else if (min < 100) name += " "; name += to_string(min); name += " Max "; int max = int(readControl(synth, 0, PART::control::maxNote, TOPLEVEL::section::part1 + npart, item, UNUSED, TOPLEVEL::insert::kitGroup)); if (max < 10) name += " "; else if (max < 100) name += " "; name += (to_string(max) + " "); string text = readControlText(synth, TOPLEVEL::action::lowPrio, PART::control::instrumentName, TOPLEVEL::section::part1 + npart, item, UNUSED, TOPLEVEL::insert::kitGroup); if (text > "") name += text; msg_buf.push_back(name); name = " "; } if (readControl(synth, 0, PART::control::enableAdd, TOPLEVEL::section::part1 + npart, item, PART::engine::addSynth, TOPLEVEL::insert::kitGroup)) { name += "AddSynth "; if (full) { string found = ""; for (int voice = 0; voice < NUM_VOICES; ++voice) { if (readControl(synth, 0, ADDVOICE::control::enableVoice, TOPLEVEL::section::part1 + npart, item, PART::engine::addVoice1 + voice)) found += (" " + to_string(voice + 1)); } if (found > "") name += ("Voices" + found + " "); } } if (readControl(synth, 0, PART::control::enableSub, TOPLEVEL::section::part1 + npart, item, PART::engine::subSynth, TOPLEVEL::insert::kitGroup)) name += "SubSynth "; if (readControl(synth, 0, PART::control::enablePad, TOPLEVEL::section::part1 + npart, item, PART::engine::padSynth, TOPLEVEL::insert::kitGroup)) name += "PadSynth "; if (name == "") name = "no engines active!"; } } if (name > "") msg_buf.push_back(name); } } return; } // top level list results msg_buf.push_back(asString(avail) + " parts available"); for (int partno = 0; partno < NUM_MIDI_PARTS; ++partno) { string text = readControlText(synth, TOPLEVEL::action::lowPrio, PART::control::instrumentName, TOPLEVEL::section::part1 + partno); bool enabled = readControl(synth, 0, PART::control::enable, TOPLEVEL::section::part1 + partno); if (text != DEFAULT_NAME || enabled) { if (partno < 9) name = " "; else name = ""; if (enabled && partno < avail) name += "+"; else name += " "; name += to_string(partno + 1); dest = readControl(synth, 0, PART::control::audioDestination, TOPLEVEL::section::part1 + partno); if (partno >= avail) name += " - " + text; else { name += " to"; if (dest == 1) name += " Main"; else if (dest == 2) name += " Part"; else name += " Both"; bool omni = bool(readControl(synth, 0, PART::control::omni, TOPLEVEL::section::part1 + partno)); name += omni ? " Omni " : " Chan"; int ch = int(readControl(synth, 0, PART::control::midiChannel, TOPLEVEL::section::part1 + partno) + 1); if (ch < 10) name += " "; if (not omni) name += to_string(ch); if (full) { name += " key Min "; int min = int(readControl(synth, 0, PART::control::minNote, TOPLEVEL::section::part1 + partno)); if (min < 10) name += " "; else if (min < 100) name += " "; name += to_string(min); name += " Max "; int max = int(readControl(synth, 0, PART::control::maxNote, TOPLEVEL::section::part1 + partno)); if (max < 10) name += " "; else if (max < 100) name += " "; name += to_string(max); name += " Shift "; int shift = int(readControl(synth, TOPLEVEL::action::lowPrio, PART::control::keyShift, TOPLEVEL::section::part1 + partno)); if (shift >= 10) name += " "; else if (shift >= 0) name += " "; else if (shift >= -10) name += " "; name += to_string(shift); } name += (" " + text); int mode = readControl(synth, 0, PART::control::kitMode, TOPLEVEL::section::part1 + partno); if (mode != PART::kitType::Off) name += " > "; switch (mode) { case PART::kitType::Multi: name += "Multi"; break; case PART::kitType::Single: name += "Single"; break; case PART::kitType::CrossFade: name += "Crossfade"; break; } } msg_buf.push_back(name); if (full) { name = " Drum "; int drum = readControl(synth, 0, PART::control::drumMode, TOPLEVEL::section::part1 + partno); if (drum) name += " on"; else name += "off"; name += " Portamento "; if (readControl(synth, 0, PART::control::portamento, TOPLEVEL::section::part1 + partno)) name += " on"; else name += "off"; int key = readControl(synth, 0, PART::control::keyMode, TOPLEVEL::section::part1 + partno); switch (key) { case 0: name += " Polphonic"; break; case 1: name += " Monophonic"; break; case 2: name += " Legato"; if (drum) name += " (drum blocked)"; break; } msg_buf.push_back(name); } } } } int CmdInterpreter::commandMlearn(Parser& input, unsigned char controlType) { Config &Runtime = synth->getRuntime(); list msg; bitSet(context, LEVEL::Learn); if (controlType != TOPLEVEL::type::Write) { Runtime.Log("Write only"); return REPLY::done_msg; // will eventually be readable } if (input.isdigit() || input.nextChar('-')) // negative should never happen! { int lineNo = string2int(input); input.skipChars(); if (lineNo <= 0) return REPLY::value_msg; else mline = lineNo -1; } int tmp = synth->midilearn.findSize(); if (tmp == 0 || tmp <= mline) { if (tmp == 0) Runtime.Log("No learned lines"); else Runtime.Log("Line " + to_string(mline + 1) + " Not found"); mline = 0; return (REPLY::done_msg); } if (input.lineEnd(controlType)) return REPLY::done_msg; { unsigned char type = 0; unsigned char control = 0; unsigned char kit = UNUSED; unsigned char engine = UNUSED; unsigned char insert = UNUSED; unsigned char parameter = UNUSED; if (input.matchnMove(2, "cc")) { if (!input.isdigit()) return REPLY::value_msg; kit = string2int(input); if (kit > 129) { Runtime.Log("Max CC value is 129"); return REPLY::done_msg; } control = MIDILEARN::control::CCorChannel; Runtime.Log("Lines may be re-ordered"); } else if (input.matchnMove(2, "channel")) { engine = string2int(input) - 1; if (engine > 16) engine = 16; control = MIDILEARN::control::CCorChannel; Runtime.Log("Lines may be re-ordered"); } else if (input.matchnMove(2, "minimum")) { insert = int((string2float(input)* 2.0f) + 0.5f); if (insert > 200) return REPLY::value_msg; control = MIDILEARN::control::minimum; } else if (input.matchnMove(2, "maximum")) { parameter = int((string2float(input)* 2.0f) + 0.5f); if (parameter > 200) return REPLY::value_msg; control = MIDILEARN::control::maximum; } else if (input.matchnMove(2, "mute")) { type = (input.toggle() == 1) * 4; control = MIDILEARN::control::mute; } else if (input.matchnMove(2, "limit")) { type = (input.toggle() == 1) * 2; control = MIDILEARN::control::limit; } else if (input.matchnMove(2, "block")) { type = (input.toggle() == 1); control = MIDILEARN::control::block; } else if (input.matchnMove(2, "seven")) { type = (input.toggle() == 1) * 16; control = MIDILEARN::control::sevenBit; } sendNormal(synth, 0, mline, type, control, TOPLEVEL::section::midiLearn, kit, engine, insert, parameter); return REPLY::done_msg; } return REPLY::op_msg; } int CmdInterpreter::commandVector(Parser& input, unsigned char controlType) { Config &Runtime = synth->getRuntime(); list msg; int tmp; bitSet(context, LEVEL::Vector); if (controlType != TOPLEVEL::type::Write) { if (synth->SingleVector(msg, chan)) synth->cliOutput(msg, LINES); else Runtime.Log("No vector on channel " + asString(chan + 1)); return REPLY::done_msg; } if (input.lineEnd(controlType)) { if (!Runtime.vectordata.Enabled[chan]) Runtime.Log("No vector on channel " + asString(chan + 1)); return REPLY::done_msg; } unsigned char ch = string2int127(input); if (ch > 0) { ch -= 1; if (ch >= NUM_MIDI_CHANNELS) return REPLY::range_msg; input.skipChars(); if (chan != ch) { chan = ch; axis = 0; } Runtime.Log("Vector channel set to " + asString(chan + 1)); } if (input.matchWord(1, "off")) { sendDirect(synth, 0, 0,controlType,VECTOR::control::erase, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, chan); axis = 0; bitClear(context, LEVEL::Vector); return REPLY::done_msg; } if (input.matchnMove(1, "xaxis")) axis = 0; else if (input.matchnMove(1, "yaxis")) { if (!Runtime.vectordata.Enabled[chan]) { Runtime.Log("Vector X must be set first"); return REPLY::done_msg; } axis = 1; } if (input.lineEnd(controlType)) return REPLY::done_msg; if (input.matchnMove(2, "cc")) { if (input.lineEnd(controlType)) return REPLY::value_msg; tmp = string2int(input); if (axis == 0) { sendNormal(synth, 0, tmp, controlType, VECTOR::control::Xcontroller, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, chan); bitSet(context, LEVEL::Vector); return REPLY::done_msg; } if (Runtime.vectordata.Enabled[chan]) { sendNormal(synth, 0, tmp, controlType, VECTOR::control::Ycontroller, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, chan); return REPLY::done_msg; } } if (!Runtime.vectordata.Enabled[chan]) { Runtime.Log("Vector X CC must be set first"); return REPLY::done_msg; } if (axis == 1 && (Runtime.vectordata.Yaxis[chan] > 0x7f)) { Runtime.Log("Vector Y CC must be set first"); return REPLY::done_msg; } if (input.matchnMove(1, "name")) { string name = "!"; if (controlType == TOPLEVEL::type::Write) { name = string{input}; if (name <= "!") return REPLY::value_msg; } sendDirect(synth, TOPLEVEL::action::lowPrio, 0, controlType, VECTOR::control::name, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, chan, UNUSED, textMsgBuffer.push(name)); return REPLY::done_msg; } if (input.matchnMove(1, "features")) { if (input.lineEnd(controlType)) return REPLY::value_msg; int feat = string2int(input) - 1; if (feat < 0 || feat > 3) return REPLY::range_msg; input.skipChars(); int enable = 0; if (input.toggle() == 1) enable = 1; else if (feat > 1 && input.matchnMove(1, "reverse")) enable = 2; sendDirect(synth, 0, enable, controlType, VECTOR::control::Xfeature0 + (axis * (VECTOR::control::Ycontroller - VECTOR::control::Xcontroller)) + feat , TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, chan); return REPLY::done_msg; } if (input.matchnMove(2, "program") || input.matchnMove(1, "instrument")) { int hand = input.peek() | 32; input.skipChars(); // in case they type the entire word if ((axis == 0 && (hand == 'd' || hand == 'u')) || (axis == 1 && (hand == 'l' || hand == 'r'))) { Runtime.Log("Bad direction for this axis"); return REPLY::done_msg; } if (hand == 'l' || hand == 'd') hand = 0; else if (hand == 'r' || hand == 'u') hand = 1; else return REPLY::op_msg; tmp = string2int(input); sendDirect(synth, 0, tmp, controlType, VECTOR::control::XleftInstrument + hand + (axis * (VECTOR::control::Ycontroller - VECTOR::control::Xcontroller)), TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, chan); return REPLY::done_msg; } // this disabled for now - needs a lot of work. /*if (!input.matchnMove(1, "control")) return REPLY::op_msg; if (input.isdigit()) { int cmd = string2int(input); if (cmd < 2 || cmd > 4) return REPLY::range_msg; input.skipChars(); if (input.lineEnd(controlType)) return REPLY::value_msg; tmp = string2int(input); if (!synth->vectorInit(axis * 3 + cmd + 6, chan, tmp)) { synth->vectorSet(axis * 3 + cmd + 6, chan, tmp); return REPLY::done_msg; } else return REPLY::value_msg; }*/ return REPLY::op_msg; } int CmdInterpreter::commandBank(Parser& input, unsigned char controlType, bool justEntered) { bitSet(context, LEVEL::Bank); int isRoot = false; if (input.matchnMove(1, "bank")) isRoot = false; // changes nothing as we're already at bank level :) if (input.matchnMove(1, "name")) { string name = string{input}; if (controlType != type_read && name <= "!") return REPLY::value_msg; int miscMsg = textMsgBuffer.push(string(input)); int tmp = readControl(synth, 0, BANK::control::selectBank, TOPLEVEL::section::bank); return sendNormal(synth, TOPLEVEL::action::lowPrio, tmp, controlType, BANK::control::renameBank, TOPLEVEL::section::bank, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscMsg); } if (input.matchnMove(2, "instrument")) { if (input.matchnMove(1, "rename")) { if (controlType != TOPLEVEL::type::Write) return REPLY::writeOnly_msg; if (!input.isdigit()) return REPLY::value_msg; int tmp = string2int(input) - 1; // could be up to 160 if (tmp < 0 || tmp >= MAX_INSTRUMENTS_IN_BANK) return REPLY::range_msg; input.skipChars(); string name = string{input}; if (name <= "!") return REPLY::value_msg; int miscMsg = textMsgBuffer.push(name); return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, controlType, BANK::control::renameInstrument, TOPLEVEL::section::bank, UNUSED, UNUSED, tmp, UNUSED, UNUSED, miscMsg); } if (input.matchnMove(1, "save")) { if (controlType != TOPLEVEL::type::Write) return REPLY::writeOnly_msg; if (!input.isdigit()) return REPLY::value_msg; int tmp = string2int(input) - 1; // could be up to 160 if (tmp < 0 || tmp >= MAX_INSTRUMENTS_IN_BANK) return REPLY::range_msg; string line = textMsgBuffer.fetch(readControl(synth, 0, BANK::control::readInstrumentName, TOPLEVEL::section::bank, UNUSED, UNUSED, UNUSED, tmp)); if (line > "!") { if (!query("Slot " + to_string(tmp + 1) + " contains '" + line + "'. Overwrite")) return REPLY::done_msg; } return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, controlType, BANK::control::saveInstrument, TOPLEVEL::section::bank, UNUSED, UNUSED, tmp); } return REPLY::done_msg; } if (input.matchnMove(1, "root")) isRoot = true; if (input.lineEnd(controlType)) return REPLY::done_msg; if (input.isdigit() || controlType == type_read) { int tmp = string2int127(input); input.skipChars(); if (isRoot) { return sendNormal(synth, TOPLEVEL::action::lowPrio, tmp, controlType, BANK::control::selectRoot, TOPLEVEL::section::bank); } return sendNormal(synth, TOPLEVEL::action::lowPrio, tmp, controlType, BANK::control::selectBank, TOPLEVEL::section::bank); if (input.lineEnd(controlType)) return REPLY::done_msg; } if (input.matchnMove(2, "ID")) { int tmp = string2int127(input); if (isRoot) return sendNormal(synth, TOPLEVEL::action::lowPrio, tmp, controlType, BANK::control::changeRootId, TOPLEVEL::section::bank); } if (justEntered) return REPLY::done_msg; return REPLY::op_msg; } int CmdInterpreter::commandConfig(Parser& input, unsigned char controlType) { float value = 0; unsigned char command = UNUSED; unsigned char action = 0; unsigned char miscmsg = UNUSED; if (input.isAtEnd()) return REPLY::done_msg; // someone just came in for a look :) if (input.matchnMove(1, "oscillator")) { command = CONFIG::control::oscillatorSize; if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; value = string2int(input); } else if (input.matchnMove(2, "buffer")) { command = CONFIG::control::bufferSize; if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; value = string2int(input); } else if (input.matchnMove(2, "padsynth")) { command = CONFIG::control::padSynthInterpolation; value = !input.matchnMove(1, "linear"); } else if (input.matchnMove(3, "buildpad")) { command = CONFIG::control::handlePadSynthBuild; if (input.matchnMove(1, "muted")) value = 0; else if (input.matchnMove(1, "background")) value = 1; else if (input.matchnMove(1, "autoapply")) value = 2; else if (controlType == TOPLEVEL::type::Write) return REPLY::value_msg; } else if (input.matchnMove(1, "virtual")) { command = CONFIG::control::virtualKeyboardLayout; if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; value = string2int(input); } else if (input.matchnMove(1, "xml")) { command = CONFIG::control::XMLcompressionLevel; if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; value = string2int(input); return sendNormal(synth, TOPLEVEL::action::fromCLI, value, controlType, command, TOPLEVEL::section::config); } else if (input.matchnMove(2, "reports")) { command = CONFIG::control::reportsDestination; value = !input.matchnMove(1, "stdout"); } else if (input.matchnMove(2, "saved")) { command = CONFIG::control::savedInstrumentFormat; if (input.matchnMove(1, "legacy")) value = 1; else if (input.matchnMove(1, "yoshimi")) value = 2; else if (input.matchnMove(1, "both")) value = 3; else if (controlType == TOPLEVEL::type::Write) return REPLY::value_msg; } //else if (input.matchnMove(3, "engines")) //{ //command = CONFIG::control::showEnginesTypes; //value = (input.toggle() != 0); //} else if (input.matchnMove(2, "state")) { command = CONFIG::control::defaultStateStart; value = (input.toggle() == 1); } else if (input.matchnMove(2, "single")) { command = CONFIG::control::enableSinglePath; value = (input.toggle() == 1); } else if (input.matchnMove(1, "hide")) { command = CONFIG::control::hideNonFatalErrors; value = (input.toggle() == 1); } else if (input.matchnMove(1, "warn")) { command = CONFIG::control::enablePartReports; value = (input.toggle() == 1); } else if (input.matchnMove(1, "display")) { command = CONFIG::control::showSplash; value = (input.toggle() == 1); } else if (input.matchnMove(1, "time")) { command = CONFIG::control::logInstrumentLoadTimes; value = (input.toggle() == 1); } else if (input.matchnMove(1, "include")) { command = CONFIG::control::logXMLheaders; value = (input.toggle() == 1); } else if (input.matchnMove(1, "keep")) { command = CONFIG::control::saveAllXMLdata; value = (input.toggle() == 1); } else if (input.matchnMove(1, "gui")) { command = CONFIG::control::enableGUI; if (controlType == type_read) value = 0; else { value = input.toggle(); if (value == -1) return REPLY::value_msg; } } else if (input.matchnMove(1, "cli")) { command = CONFIG::control::enableCLI; if (controlType == type_read) value = 0; else { value = input.toggle(); if (value == -1) return REPLY::value_msg; } } else if (input.matchnMove(2, "identify")) { command = CONFIG::control::enableHighlight; value = (input.toggle() == 1); } else if (input.matchnMove(3, "expose")) { value = input.toggle(); if (value == -1 && input.matchnMove(2, "prompt")) value = 2; if (value == -1 && controlType == TOPLEVEL::type::Write) return REPLY::value_msg; return sendDirect(synth, TOPLEVEL::action::fromCLI, value, controlType, CONFIG::control::exposeStatus, TOPLEVEL::section::config); } else if (input.matchnMove(1, "jack")) { if (input.matchnMove(1, "midi")) { command = CONFIG::control::jackMidiSource; action = TOPLEVEL::action::lowPrio; if (controlType != TOPLEVEL::type::Write || !input.isAtEnd()) { if (controlType == TOPLEVEL::type::Write) miscmsg = textMsgBuffer.push(input); } else return REPLY::value_msg; } else if (input.matchnMove(1, "server")) { command = CONFIG::control::jackServer; action = TOPLEVEL::action::lowPrio; if (controlType != TOPLEVEL::type::Write || !input.isAtEnd()) { if (controlType == TOPLEVEL::type::Write) miscmsg = textMsgBuffer.push(input); } else return REPLY::value_msg; } else if (input.matchnMove(1, "auto")) { command = CONFIG::control::jackAutoConnectAudio; value = (input.toggle() == 1); } else return REPLY::op_msg; } else if (input.matchnMove(2, "alsa")) { if (input.matchnMove(1, "type")) { command = CONFIG::control::alsaMidiType; if (input.matchnMove(1, "fixed")) value = 0; else if (input.matchnMove(1, "search")) value = 1; else if (input.matchnMove(1, "external")) value = 2; else return REPLY::value_msg; } else if (input.matchnMove(1, "midi")) { command = CONFIG::control::alsaMidiSource; action = TOPLEVEL::action::lowPrio; if (controlType != TOPLEVEL::type::Write || !input.isAtEnd()) { if (controlType == TOPLEVEL::type::Write) miscmsg = textMsgBuffer.push(input); } else return REPLY::value_msg; } else if (input.matchnMove(1, "audio")) { command = CONFIG::control::alsaAudioDevice; action = TOPLEVEL::action::lowPrio; if (controlType != TOPLEVEL::type::Write || !input.isAtEnd()) { if (controlType == TOPLEVEL::type::Write) miscmsg = textMsgBuffer.push(input); } else return REPLY::value_msg; } else if (input.matchnMove(1, "s")) { command = CONFIG::control::alsaSampleRate; if (controlType == TOPLEVEL::type::Write) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); if (value < 0 || value > 3) return REPLY::range_msg; } } else return REPLY::op_msg; } else if (input.matchnMove(2, "midi")) { if (controlType != TOPLEVEL::type::Write) { return sendDirect(synth, TOPLEVEL::action::fromCLI, 0, controlType, CONFIG::control::readMIDI, TOPLEVEL::section::config); } else { value = 1; if (input.matchnMove(1, "alsa")) command = CONFIG::control::alsaPreferredMidi; else if (input.matchnMove(1, "jack")) command = CONFIG::control::jackPreferredMidi; else return REPLY::value_msg; } } else if (input.matchnMove(2, "audio")) { if (controlType != TOPLEVEL::type::Write) { return sendDirect(synth, TOPLEVEL::action::fromCLI, 0, controlType, CONFIG::control::readAudio, TOPLEVEL::section::config); } else { value = 1; if (input.matchnMove(1, "alsa")) command = CONFIG::control::alsaPreferredAudio; else if (input.matchnMove(1, "jack")) command = CONFIG::control::jackPreferredAudio; else return REPLY::value_msg; } } else if (input.matchnMove(2, "root")) { command = CONFIG::control::bankRootCC; value = 128; // ignored by range check if (input.lineEnd(controlType)) return REPLY::value_msg; if (input.matchnMove(1, "msb")) value = 0; else if (input.matchnMove(1, "lsb")) value = 32; if (value != 128 && value == readControl(synth, 0, CONFIG::control::bankCC, TOPLEVEL::section::config)) { synth->getRuntime().Log("In use for bank"); return REPLY::done_msg; } } else if (input.matchnMove(2, "bank")) { command = CONFIG::control::bankCC; value = 128; // ignored by range check if (input.lineEnd(controlType)) return REPLY::value_msg; if (input.matchnMove(1, "msb")) value = 0; else if (input.matchnMove(1, "lsb")) value = 32; if (value != 128 && value == readControl(synth, 0, CONFIG::control::bankRootCC, TOPLEVEL::section::config)) { synth->getRuntime().Log("In use for bank root"); return REPLY::done_msg; } } else if (input.matchnMove(2, "program") || input.matchnMove(2, "instrument")) { command = CONFIG::control::enableProgramChange; value = (input.toggle() == 1); } else if (input.matchnMove(3, "extend")) { command = CONFIG::control::extendedProgramChangeCC; if (controlType != TOPLEVEL::type::Write) value = 128; // ignored by range check else if (input.lineEnd(controlType)) return REPLY::value_msg; else { value = string2int(input); if (value > 128) value = 128; } } else if (input.matchnMove(1, "quiet")) { command = CONFIG::control::ignoreResetAllCCs; value = (input.toggle() == 1); } else if (input.matchnMove(1, "log")) { command = CONFIG::control::logIncomingCCs; value = (input.toggle() == 1); } else if (input.matchnMove(2, "show")) { command = CONFIG::control::showLearnEditor; value = (input.toggle() == 1); } else if (input.matchnMove(2, "omni")) { command = CONFIG::control::enableOmni; value = (input.toggle() == 1); } else if (input.matchnMove(1, "nrpn")) { command = CONFIG::control::enableNRPNs; value = (input.toggle() == 1); } else if (input.matchnMove(3, "lock")) { command = CONFIG::control::historyLock; value = (input.toggle()); string name = string{input}.substr(0,2); int selected = stringNumInList(name, historyGroup, 2); if (selected == -1) return REPLY::range_msg; input.skipChars(); value = (input.toggle()); if (controlType == TOPLEVEL::type::Write && value == -1) return REPLY::value_msg; return sendDirect(synth, TOPLEVEL::action::lowPrio, value, controlType, command, TOPLEVEL::section::config, selected); } else return REPLY::op_msg; sendDirect(synth, action, value, controlType, command, TOPLEVEL::section::config, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); return REPLY::done_msg; } int CmdInterpreter::commandScale(Parser& input, unsigned char controlType) { if (input.lineEnd(controlType)) return REPLY::done_msg; Config &Runtime = synth->getRuntime(); int enable = input.toggle(); if (enable > -1) { int result = sendDirect(synth, 0, enable, controlType, SCALES::control::enableMicrotonal, TOPLEVEL::section::scales); if (input.lineEnd(controlType)) return result; } if(readControl(synth, 0, SCALES::control::enableMicrotonal, TOPLEVEL::section::scales) < 1) return REPLY::inactive_msg; float value = 0; unsigned char command = UNUSED; unsigned char miscmsg = UNUSED; string name; if (input.matchnMove(1, "tuning")) command = SCALES::control::tuning; else if (input.matchnMove(1, "keymap")) command = SCALES::control::keyboardMap; else if (input.matchnMove(2, "name")) command = SCALES::control::name; else if (input.matchnMove(2, "description")) command = SCALES::control::comment; if (command != UNUSED) { if (controlType != TOPLEVEL::type::Write &&(command == SCALES::control::tuning || command == SCALES::control::keyboardMap)) { Runtime.Log("Write only - use 'list'"); return REPLY::done_msg; } name = string{input}; if (name == "" && controlType == TOPLEVEL::type::Write) return REPLY::value_msg; miscmsg = textMsgBuffer.push(name); return sendNormal(synth, TOPLEVEL::action::lowPrio, value, controlType, command, TOPLEVEL::section::scales, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); } int min = 0; int max = 127; unsigned char action = 0; if (input.matchnMove(2, "frequency")) { command = SCALES::control::refFrequency; min = 1; max = 20000; controlType &= ~TOPLEVEL::type::Integer; // float } else if (input.matchnMove(2, "note")) command = SCALES::control::refNote; else if (input.matchnMove(1, "invert")) { command = SCALES::control::invertScale; max = 1; } else if (input.matchnMove(2, "center")) command = SCALES::control::invertedScaleCenter; else if (input.matchnMove(2, "shift")) { command = SCALES::control::scaleShift; min = -63; max = 64; } else if (input.matchnMove(2, "mapping")) { command = SCALES::control::enableKeyboardMap; max = 1; } else if (input.matchnMove(2, "size")) { command = SCALES::control::keymapSize; action = TOPLEVEL::action::lowPrio; } else if (input.matchnMove(2, "first")) command = SCALES::control::lowKey; else if (input.matchnMove(2, "middle")) command = SCALES::control::middleKey; else if (input.matchnMove(1, "last")) command = SCALES::control::highKey; else if (input.matchnMove(3, "CLEar")) { input.skip(-1); // sneaky way to force a zero :) command = SCALES::control::clearAll; } else return REPLY::todo_msg; if (controlType == TOPLEVEL::type::Write) { if (input.lineEnd(controlType)) return REPLY::value_msg; if ((input.toggle() == 1)) value = 1; else { value = string2float(input); if (value < min || value > max) return REPLY::value_msg; } } return sendDirect(synth, action, value, controlType, command, TOPLEVEL::section::scales); } int CmdInterpreter::commandImportScale(Parser& input) { if (input.lineEnd(TOPLEVEL::type::Write)) // always must have a value here return REPLY::what_msg; size_t command = 0; if (input.matchnMove(1, "tuning")) command = SCALES::control::importScl; else if (input.matchnMove(1, "keymap")) command = SCALES::control::importKbm; else { synth->getRuntime().Log("Specify TUNing or KEYmap"); return REPLY::done_msg; } string name = string{input}; if (name.empty()) return REPLY::value_msg; size_t miscmsg = textMsgBuffer.push(name); return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, command, TOPLEVEL::section::scales, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); } int CmdInterpreter::commandExportScale(Parser& input) { size_t command = 0; if (input.matchnMove(1, "tuning")) command = SCALES::control::exportScl; else if (input.matchnMove(1, "keymap")) command = SCALES::control::exportKbm; else return REPLY::what_msg; string name = string{input}; if (name.empty()) return REPLY::value_msg; size_t miscmsg = textMsgBuffer.push(name); //cout << "name >" << name << endl; return sendDirect(synth, TOPLEVEL::action::lowPrio, 1, TOPLEVEL::type::Write, command, TOPLEVEL::section::scales, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); } int CmdInterpreter::modulator(Parser& input, unsigned char controlType) { if (input.lineEnd(controlType)) return REPLY::done_msg; // NOTE modulator number always the same as voice. int value; int cmd = -1; string name = string{input}.substr(0,3); value = stringNumInList(name, addmodnameslist, 3); if (value != -1) cmd = ADDVOICE::control::modulatorType; if (cmd == -1) { if (readControl(synth, 0, ADDVOICE::control::modulatorType, npart, kitNumber, PART::engine::addVoice1 + voiceNumber) == 0) return REPLY::inactive_msg; if (input.matchnMove(2, "waveform")) { bitSet(context, LEVEL::Oscillator); insertType = TOPLEVEL::insert::oscillatorGroup; return waveform(input, controlType); } if (input.matchnMove(2, "source")) { if (input.matchnMove(1, "local")) value = 0; else { int tmp = input.peek() - char('0'); if (tmp > 0) value = tmp; } if (value == -1 || value > voiceNumber) return REPLY::range_msg; if (value == 0) value = 0xff; else value -= 1; cmd = ADDVOICE::control::externalModulator; } if (input.matchnMove(3, "oscillator")) { if (input.matchnMove(1, "internal")) value = 0; else { int tmp = input.peek() - char('0'); if (tmp > 0) value = tmp; } if (value == -1 || value > voiceNumber) return REPLY::range_msg; if (value == 0) value = 0xff; else value -= 1; cmd = ADDVOICE::control::modulatorOscillatorSource; } else if (input.matchnMove(3, "follow")) { value = (input.toggle() == 1); cmd = ADDVOICE::control::modulatorDetuneFromBaseOsc; } else if (input.matchnMove(3, "fixed")) { value = (input.toggle() == 1); cmd = ADDVOICE::control::modulatorFrequencyAs440Hz; } else if (input.matchnMove(1, "volume")) cmd = ADDVOICE::control::modulatorAmplitude; else if (input.matchnMove(2, "velocity")) cmd = ADDVOICE::control::modulatorVelocitySense; else if (input.matchnMove(2, "damping")) cmd = ADDVOICE::control::modulatorHFdamping; } if (cmd == -1) { if (readControl(synth, 0, ADDVOICE::control::externalModulator, npart, kitNumber, PART::engine::addVoice1 + voiceNumber) != -1) return REPLY::inactive_msg; if (input.matchnMove(2, "local")) { if (input.matchnMove(1, "internal")) value = 0; else { int tmp = input.peek() - char('0'); if (tmp > 0) value = tmp; } if (value == -1 || value > voiceNumber) return REPLY::range_msg; if (value == 0) value = 0xff; else value -= 1; cmd = ADDVOICE::control::modulatorOscillatorSource; } if (input.matchnMove(2, "shift")) cmd = ADDVOICE::control::modulatorOscillatorPhase; } if (cmd == -1) { if (input.matchnMove(3, "detune")) { if (input.matchnMove(1, "fine")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDVOICE::control::modulatorDetuneFrequency; } else if (input.matchnMove(1, "coarse")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDVOICE::control::modulatorCoarseDetune; } else if (input.matchnMove(1, "type")) { if (input.lineEnd(controlType)) return REPLY::value_msg; if (controlType == type_read) value = 2; // dummy value else { string name = string{input}.substr(0,3); value = stringNumInList(name, detuneType, 3); } if (value == -1) return REPLY::range_msg; cmd = ADDVOICE::control::modulatorDetuneType; } } else if (input.matchnMove(3, "octave")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDVOICE::control::modulatorOctave; } } if (cmd > -1) { if (value == -1) value = string2int(input); else if (value == 0xff) value = -1; // special case for modulator sources return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); } if (input.matchnMove(3, "envelope")) { bitSet(context, LEVEL::Envelope); insertType = TOPLEVEL::insert::envelopeGroup; if (insertGroup == UNUSED) insertGroup = TOPLEVEL::insertType::amplitude; return envelopeSelect(input, controlType); } return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); } int CmdInterpreter::addVoice(Parser& input, unsigned char controlType) { if (input.isdigit()) { int tmp = string2int(input) - 1; if (tmp < 0 || tmp >= NUM_VOICES) return REPLY::range_msg; voiceNumber = tmp; input.skipChars(); } if (input.lineEnd(controlType)) return REPLY::done_msg; int enable = (input.toggle()); if (enable > -1) return sendNormal(synth, 0, enable, controlType, ADDVOICE::control::enableVoice, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); if (!input.lineEnd(controlType) && !readControl(synth, 0, ADDVOICE::control::enableVoice, npart, kitNumber, PART::engine::addVoice1 + voiceNumber)) return REPLY::inactive_msg; if (input.matchnMove(2, "modulator")) { bitSet(context, LEVEL::AddMod); return modulator(input, controlType); } else if (input.matchnMove(2, "waveform")) { bitSet(context, LEVEL::Oscillator); insertType = TOPLEVEL::insert::oscillatorGroup; return waveform(input, controlType); } int cmd = -1; int tmp = -1; if (input.matchnMove(1, "volume")) cmd = ADDVOICE::control::volume; else if (input.matchnMove(1, "pan")) cmd = ADDVOICE::control::panning; else if (input.matchnMove(2, "prandom")) { cmd = ADDVOICE::control::enableRandomPan; tmp = (input.toggle() == 1); } else if (input.matchnMove(2, "pwidth")) cmd = ADDVOICE::control::randomWidth; else if (input.matchnMove(2, "velocity")) cmd = ADDVOICE::control::velocitySense; if (cmd != -1) { if (tmp == -1) { tmp = string2int127(input); if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; } return sendNormal(synth, 0, tmp, controlType, cmd, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); } int value = 0; if (input.matchnMove(3, "detune")) { if (input.matchnMove(1, "fine")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDVOICE::control::detuneFrequency; } else if (input.matchnMove(1, "coarse")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDVOICE::control::coarseDetune; } else if (input.matchnMove(1, "type")) { if (input.lineEnd(controlType)) return REPLY::value_msg; if (controlType == type_read) value = 2; // dummy value else { string name = string{input}.substr(0,3); value = stringNumInList(name, detuneType, 3); } if (value == -1) return REPLY::range_msg; cmd = ADDVOICE::control::detuneType; } } else if (input.matchnMove(3, "fixed")) { value = (input.toggle() == 1); cmd = ADDVOICE::control::baseFrequencyAs440Hz; } else if (input.matchnMove(3, "octave")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDVOICE::control::octave; } else { int tmp_cmd = -1; if (input.matchnMove(3, "equal")) tmp_cmd = ADDVOICE::control::equalTemperVariation; else if (input.matchnMove(3, "bend")) { if (input.matchnMove(1, "adjust")) tmp_cmd = ADDVOICE::control::pitchBendAdjustment; else if (input.matchnMove(1, "offset")) tmp_cmd = ADDVOICE::control::pitchBendOffset; } if (tmp_cmd > -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = tmp_cmd; } } if (cmd > -1) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); if (input.matchnMove(3, "lfo")) { bitSet(context, LEVEL::LFO); insertType = TOPLEVEL::insert::LFOgroup; return LFOselect(input, controlType); } if (input.matchnMove(3, "filter")) { bitSet(context, LEVEL::Filter); insertType = TOPLEVEL::insert::filterGroup; return filterSelect(input, controlType); } if (input.matchnMove(3, "envelope")) { bitSet(context, LEVEL::Envelope); insertType = TOPLEVEL::insert::envelopeGroup; return envelopeSelect(input, controlType); } value = -1; if (input.matchnMove(1, "type")) { if (input.matchnMove(1, "oscillator")) value = 0; else if (input.matchnMove(1, "white")) value = 1; else if (input.matchnMove(1, "pink")) value = 2; else if (input.matchnMove(1, "spot")) value = 3; else return REPLY::range_msg; cmd = ADDVOICE::control::soundType; } else if (input.matchnMove(3, "oscillator")) { if (input.matchnMove(1, "internal")) value = 0; else { int tmp = input.peek() - char('0'); if (tmp > 0) value = tmp; } if (value == -1 || value > voiceNumber) return REPLY::range_msg; if (value == 0) value = 0xff; else value -= 1; cmd = ADDVOICE::control::voiceOscillatorSource; } else if (input.matchnMove(3, "source")) { if (input.matchnMove(1, "local")) value = 0; else { int tmp = input.peek() - char('0'); if (tmp > 0) value = tmp; } if (value == -1 || value > voiceNumber) return REPLY::range_msg; if (value == 0) value = 0xff; else value -= 1; cmd = ADDVOICE::control::externalOscillator; } else if (input.matchnMove(1, "phase")) cmd = ADDVOICE::control::voiceOscillatorPhase; else if (input.matchnMove(1, "minus")) { value = (input.toggle() == 1); cmd = ADDVOICE::control::invertPhase; } else if (input.matchnMove(3, "delay")) cmd = ADDVOICE::control::delay; else if (input.matchnMove(1, "resonance")) { value = (input.toggle() == 1); cmd = ADDVOICE::control::enableResonance; } else if (input.matchnMove(2, "bypass")) { value = (input.toggle() == 1); cmd = ADDVOICE::control::bypassGlobalFilter; } else if (input.matchnMove(1, "unison")) { value = input.toggle(); if (value > -1) cmd = ADDVOICE::control::enableUnison; else { if (input.matchnMove(1, "size")) cmd = ADDVOICE::control::unisonSize; else if (input.matchnMove(1, "frequency")) cmd = ADDVOICE::control::unisonFrequencySpread; else if (input.matchnMove(1, "phase")) cmd = ADDVOICE::control::unisonPhaseRandomise; else if (input.matchnMove(1, "width")) cmd = ADDVOICE::control::unisonStereoSpread; else if (input.matchnMove(1, "vibrato")) cmd = ADDVOICE::control::unisonVibratoDepth; else if (input.matchnMove(1, "rate")) cmd = ADDVOICE::control::unisonVibratoSpeed; else if (input.matchnMove(1, "invert")) { if (controlType == type_read) value = 1; // dummy value else { value = stringNumInList(string{input}.substr(0, 1), unisonPhase, 1); if (value == -1) return REPLY::range_msg; } cmd = ADDVOICE::control::unisonPhaseInvert; } } if (cmd == -1) return REPLY::op_msg; } else return REPLY::op_msg; if (value == -1) value = string2int(input); else if (value == 0xff) value = -1; // special case for voice and oscillator sources return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); } int CmdInterpreter::addSynth(Parser& input, unsigned char controlType) { int kit = UNUSED; int insert = UNUSED; if (kitMode) { kit = kitNumber; insert = TOPLEVEL::insert::kitGroup; } int enable = (input.toggle()); // This is a part command, but looks like AddSynth the the CLI user if (enable > -1) sendNormal(synth, 0, enable, controlType, PART::control::enableAdd, npart, kit, UNUSED, insert); if (input.lineEnd(controlType)) return REPLY::done_msg; if (!readControl(synth, 0, PART::control::enable, npart, kit, PART::engine::addSynth, insert)) return REPLY::inactive_msg; if (input.matchnMove(2, "resonance")) { bitSet(context, LEVEL::Resonance); insertType = TOPLEVEL::insert::resonanceGroup; return resonance(input, controlType); } if (input.matchnMove(3, "voice")) { bitSet(context, LEVEL::AddVoice); // starting point for envelopes etc. insertGroup = UNUSED; insertType = UNUSED; return addVoice(input, controlType); } if (input.lineEnd(controlType)) return REPLY::done_msg; int cmd = -1; int tmp = -1; if (input.matchnMove(1, "volume")) cmd = ADDSYNTH::control::volume; else if (input.matchnMove(1, "pan")) cmd = ADDSYNTH::control::panning; else if (input.matchnMove(2, "prandom")) { cmd = ADDSYNTH::control::enableRandomPan; tmp = (input.toggle() == 1); } else if (input.matchnMove(2, "pwidth")) cmd = ADDSYNTH::control::randomWidth; else if (input.matchnMove(2, "velocity")) cmd = ADDSYNTH::control::velocitySense; if (cmd != -1) { if (tmp == -1) { if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; tmp = string2int127(input); } return sendNormal(synth, 0, tmp, controlType, cmd, npart, kitNumber, PART::engine::addSynth); } int value = 0; if (input.matchnMove(3, "detune")) { if (input.matchnMove(1, "fine")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDSYNTH::control::detuneFrequency; } else if (input.matchnMove(1, "coarse")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDSYNTH::control::coarseDetune; } else if (input.matchnMove(1, "type")) { if (input.lineEnd(controlType)) return REPLY::value_msg; if (controlType == type_read) value = 2; // dummy value else { string name = string{input}.substr(0,3); value = stringNumInList(name, detuneType, 3); } if (value == -1) return REPLY::range_msg; cmd = ADDSYNTH::control::detuneType; } } else if (input.matchnMove(3, "octave")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDSYNTH::control::octave; } else if (input.matchnMove(3, "stereo")) { cmd = ADDSYNTH::control::stereo; value = (input.toggle() == 1); } else { int tmp_cmd = -1; if (input.matchnMove(3, "depop")) tmp_cmd = ADDSYNTH::control::dePop; else if (input.matchnMove(2, "punch")) { if (input.matchnMove(1, "power")) tmp_cmd = ADDSYNTH::control::punchStrength; else if (input.matchnMove(1, "duration")) tmp_cmd = ADDSYNTH::control::punchDuration; else if (input.matchnMove(1, "stretch")) tmp_cmd = ADDSYNTH::control::punchStretch; else if (input.matchnMove(1, "velocity")) tmp_cmd = ADDSYNTH::control::punchVelocity; } if (tmp_cmd > -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = tmp_cmd; } } if (cmd > -1) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::addSynth); if (input.matchnMove(3, "lfo")) { bitSet(context, LEVEL::LFO); insertType = TOPLEVEL::insert::LFOgroup; return LFOselect(input, controlType); } if (input.matchnMove(3, "filter")) { bitSet(context, LEVEL::Filter); insertType = TOPLEVEL::insert::filterGroup; return filterSelect(input, controlType); } if (input.matchnMove(3, "envelope")) { bitSet(context, LEVEL::Envelope); insertType = TOPLEVEL::insert::envelopeGroup; return envelopeSelect(input, controlType); } if (input.matchnMove(2, "bandwidth")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = ADDSYNTH::control::relativeBandwidth; } else if (input.matchnMove(2, "group")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = (input.toggle() == 1); cmd = ADDSYNTH::control::randomGroup; } if (cmd == -1) return REPLY::unrecognised_msg; return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::addSynth); } int CmdInterpreter::subSynth(Parser& input, unsigned char controlType) { int kit = UNUSED; int insert = UNUSED; if (kitMode) { kit = kitNumber; insert = TOPLEVEL::insert::kitGroup; } int enable = (input.toggle()); // This is a part command, but looks like SubSynth to the CLI user if (enable > -1) sendNormal(synth, 0, enable, controlType, PART::control::enableSub, npart, kit, UNUSED, insert); if (input.lineEnd(controlType)) return REPLY::done_msg; if (!readControl(synth, 0, PART::control::enable, npart, kit, PART::engine::subSynth, insert)) return REPLY::inactive_msg; int cmd = -1; int tmp = -1; if (input.matchnMove(1, "volume")) cmd = SUBSYNTH::control::volume; else if (input.matchnMove(1, "pan")) cmd = SUBSYNTH::control::panning; else if (input.matchnMove(2, "prandom")) { cmd = SUBSYNTH::control::enableRandomPan; tmp = (input.toggle() == 1); } else if (input.matchnMove(2, "pwidth")) cmd = SUBSYNTH::control::randomWidth; else if (input.matchnMove(2, "velocity")) cmd = SUBSYNTH::control::velocitySense; if (cmd != -1) { if (tmp == -1) { tmp = string2int127(input); if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; } return sendNormal(synth, 0, tmp, controlType, cmd, npart, kitNumber, PART::engine::subSynth); } int value = 0; if (input.matchnMove(3, "detune")) { if (input.matchnMove(1, "fine")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = SUBSYNTH::control::detuneFrequency; } else if (input.matchnMove(1, "coarse")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = SUBSYNTH::control::coarseDetune; } else if (input.matchnMove(1, "type")) { if (input.lineEnd(controlType)) return REPLY::value_msg; if (controlType == type_read) value = 2; // dummy value else { string name = string{input}.substr(0,3); value = stringNumInList(name, detuneType, 3); } if (value == -1) return REPLY::range_msg; cmd = SUBSYNTH::control::detuneType; } } else if (input.matchnMove(3, "fixed")) { value = (input.toggle() == 1); cmd = SUBSYNTH::control::baseFrequencyAs440Hz; } else if (input.matchnMove(3, "octave")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = SUBSYNTH::control::octave; } else if (input.matchnMove(3, "stereo")) { cmd = SUBSYNTH::control::stereo; value = (input.toggle() == 1); } else { int tmp_cmd = -1; if (input.matchnMove(3, "equal")) tmp_cmd = SUBSYNTH::control::equalTemperVariation; else if (input.matchnMove(3, "bend")) { if (input.matchnMove(1, "adjust")) tmp_cmd = SUBSYNTH::control::pitchBendAdjustment; else if (input.matchnMove(1, "offset")) tmp_cmd = SUBSYNTH::control::pitchBendOffset; } if (tmp_cmd > -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = tmp_cmd; } } if (cmd == -1 && input.matchnMove(3, "filter")) { bitSet(context, LEVEL::Filter); insertType = TOPLEVEL::insert::filterGroup; return filterSelect(input, controlType); } if (cmd == -1 && input.matchnMove(3, "envelope")) { if (insertGroup == UNUSED) // why do we need this here? insertGroup = TOPLEVEL::insertType::amplitude; bitSet(context, LEVEL::Envelope); insertType = TOPLEVEL::insert::envelopeGroup; return envelopeSelect(input, controlType); } if (cmd > -1) { return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::subSynth); } value = -1; if (input.matchnMove(2, "overtone")) { if (input.matchnMove(1, "Position")) { if (controlType == type_read) value = 1; // dummy value else { value = stringNumInList(string{input}.substr(0, 2), subPadPosition, 2); if (value == -1) return REPLY::range_msg; } cmd = SUBSYNTH::control::overtonePosition; } else { if (input.matchnMove(1, "First")) cmd = SUBSYNTH::control::overtoneParameter1; else if (input.matchnMove(1, "Second")) cmd = SUBSYNTH::control::overtoneParameter2; else if (input.matchnMove(1, "Harmonic")) cmd = SUBSYNTH::control::overtoneForceHarmonics; if (cmd > -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); } } } if (cmd > -1) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::subSynth); if (input.matchnMove(2, "harmonic")) { int value = -1; if (input.matchnMove(1, "stages")) { cmd = SUBSYNTH::control::filterStages; value = string2int(input); } else if (input.matchnMove(1, "mag")) { cmd = SUBSYNTH::control::magType; if (controlType == TOPLEVEL::type::Write) { string name = string{input}.substr(0, 2); value = stringNumInList(name, subMagType, 2); } } else if (input.matchnMove(1, "position")) { cmd = SUBSYNTH::control::startPosition; if (input.matchnMove(1, "Zero")) value = 0; else if (input.matchnMove(1, "Random")) value = 1; else if (input.matchnMove(1, "Maximum")) value = 2; } if (cmd != -1) { if (value < 0 && controlType == TOPLEVEL::type::Write) return REPLY::value_msg; return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::subSynth); } int control = -1; unsigned char insert = UNUSED; bool set = false; if (input.lineEnd(controlType)) return REPLY::parameter_msg; control = string2int(input) - 1; input.skipChars(); if (input.matchnMove(1, "amplitude")) { insert = TOPLEVEL::insert::harmonicAmplitude; set = true; } else if (input.matchnMove(1, "bandwidth")) { insert = TOPLEVEL::insert::harmonicBandwidth; set = true; } if (set) { if (input.lineEnd(controlType)) return REPLY::value_msg; return sendNormal(synth, 0, string2int(input), controlType, control, npart, kitNumber, PART::engine::subSynth, insert); } } value = -1; if (cmd == -1) { if (input.matchnMove(2, "band")) { if (input.matchnMove(1, "width")) cmd = SUBSYNTH::control::bandwidth; else if (input.matchnMove(1, "scale")) cmd = SUBSYNTH::control::bandwidthScale; else if (input.matchnMove(1, "envelope")) { value = (input.toggle() == 1); cmd = SUBSYNTH::control::enableBandwidthEnvelope; } } else if (input.matchnMove(2, "frequency")) { if (input.matchnMove(1, "envelope")) { value = (input.toggle() == 1); cmd = SUBSYNTH::control::enableFrequencyEnvelope; } } else if (input.matchnMove(2, "filter")) { value = (input.toggle() == 1); cmd = SUBSYNTH::control::enableFilter; } } if (cmd != -1) { //cout << "control " << int(cmd) << " part " << int(npart) << " kit " << int(kitNumber) << " engine " << int(PART::engine::subSynth) << endl; if (value == -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); } return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::subSynth); } return REPLY::unrecognised_msg; } int CmdInterpreter::padSynth(Parser& input, unsigned char controlType) { int kit = UNUSED; int insert = UNUSED; if (kitMode) { kit = kitNumber; insert = TOPLEVEL::insert::kitGroup; } int enable = (input.toggle()); // This is a part command, but looks like PadSynth t0 the CLI user if (enable > -1) sendNormal(synth, 0, enable, controlType, PART::control::enablePad, npart, kit, UNUSED, insert); if (input.lineEnd(controlType)) return REPLY::done_msg; if (!readControl(synth, 0, PART::control::enable, npart, kit, PART::engine::padSynth, insert)) return REPLY::inactive_msg; if (input.matchnMove(2, "resonance")) { bitSet(context, LEVEL::Resonance); insertType = TOPLEVEL::insert::resonanceGroup; return resonance(input, controlType); } if (input.matchnMove(2, "waveform")) { bitSet(context, LEVEL::Oscillator); insertType = TOPLEVEL::insert::oscillatorGroup; return waveform(input, controlType); } int cmd = -1; int tmp = -1; if (input.matchnMove(1, "volume")) cmd = PADSYNTH::control::volume; else if (input.matchnMove(1, "pan")) cmd = PADSYNTH::control::panning; else if (input.matchnMove(2, "prandom")) { cmd = SUBSYNTH::control::enableRandomPan; tmp = (input.toggle() == 1); } else if (input.matchnMove(2, "pwidth")) cmd = SUBSYNTH::control::randomWidth; else if (input.matchnMove(2, "velocity")) cmd = PADSYNTH::control::velocitySense; if (cmd != -1) { if (tmp == -1) { tmp = string2int127(input); if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; } return sendNormal(synth, 0, tmp, controlType, cmd, npart, kitNumber, PART::engine::padSynth); } int value = 0; if (input.matchnMove(3, "detune")) { if (input.matchnMove(1, "fine")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = PADSYNTH::control::detuneFrequency; } else if (input.matchnMove(1, "coarse")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = PADSYNTH::control::coarseDetune; } else if (input.matchnMove(1, "type")) { if (input.lineEnd(controlType)) return REPLY::value_msg; if (controlType == type_read) value = 2; // dummy value else { string name = string{input}.substr(0,3); value = stringNumInList(name, detuneType, 3); } if (value == -1) return REPLY::range_msg; cmd = PADSYNTH::control::detuneType; } } else if (input.matchnMove(3, "fixed")) { value = (input.toggle() == 1); cmd = PADSYNTH::control::baseFrequencyAs440Hz; } else if (input.matchnMove(3, "octave")) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = PADSYNTH::control::octave; } else if (input.matchnMove(3, "stereo")) { cmd = PADSYNTH::control::stereo; value = (input.toggle() == 1); } else { int tmp_cmd = -1; if (input.matchnMove(3, "equal")) tmp_cmd = PADSYNTH::control::equalTemperVariation; else if (input.matchnMove(3, "bend")) { if (input.matchnMove(1, "adjust")) tmp_cmd = PADSYNTH::control::pitchBendAdjustment; else if (input.matchnMove(1, "offset")) tmp_cmd = PADSYNTH::control::pitchBendOffset; } if (tmp_cmd > -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = tmp_cmd; } } if (cmd > -1) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::padSynth); if (input.matchnMove(3, "lfo")) { bitSet(context, LEVEL::LFO); insertType = TOPLEVEL::insert::LFOgroup; return LFOselect(input, controlType); } if (input.matchnMove(3, "filter")) { bitSet(context, LEVEL::Filter); insertType = TOPLEVEL::insert::filterGroup; return filterSelect(input, controlType); } if (input.matchnMove(3, "envelope")) { bitSet(context, LEVEL::Envelope); insertType = TOPLEVEL::insert::envelopeGroup; return envelopeSelect(input, controlType); } value = -1; if (input.matchnMove(2, "overtone")) { if (input.matchnMove(1, "Position")) { if (controlType == type_read) value = 1; // dummy value else { value = stringNumInList(string{input}.substr(0, 2), subPadPosition, 2); if (value == -1) return REPLY::range_msg; } cmd = PADSYNTH::control::overtonePosition; } else { if (input.matchnMove(1, "First")) cmd = PADSYNTH::control::overtoneParameter1; else if (input.matchnMove(1, "Second")) cmd = PADSYNTH::control::overtoneParameter2; else if (input.matchnMove(1, "Harmonic")) cmd = PADSYNTH::control::overtoneForceHarmonics; if (cmd > -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); } } } else { int tmp_cmd = -1; if (input.matchnMove(3, "depop")) tmp_cmd = PADSYNTH::control::dePop; else if (input.matchnMove(2, "punch")) { if (input.matchnMove(1, "power")) tmp_cmd = PADSYNTH::control::punchStrength; else if (input.matchnMove(1, "duration")) tmp_cmd = PADSYNTH::control::punchDuration; else if (input.matchnMove(1, "stretch")) tmp_cmd = PADSYNTH::control::punchStretch; else if (input.matchnMove(1, "velocity")) tmp_cmd = PADSYNTH::control::punchVelocity; } if (tmp_cmd > -1) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); cmd = tmp_cmd; } } if (cmd > -1) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::padSynth); if (input.matchnMove(2, "xport")) { if (controlType != TOPLEVEL::type::Write) return REPLY::writeOnly_msg; if (input.isAtEnd()) return REPLY::value_msg; sendDirect(synth, TOPLEVEL::action::lowPrio, 0, controlType, MAIN::control::exportPadSynthSamples, TOPLEVEL::section::main, kitNumber, 2, npart, UNUSED, UNUSED, textMsgBuffer.push(input)); return REPLY::done_msg; } value = -1; if (input.matchnMove(2, "profile")) { if (input.matchnMove(1, "gauss")) value = 0; else if (input.matchnMove(1, "square")) value = 1; else if (input.matchnMove(1, "double")) value = 2; else return REPLY::value_msg; cmd = PADSYNTH::control::baseType; } else if (input.matchnMove(2, "width")) { cmd = PADSYNTH::control::baseWidth; } else if (input.matchnMove(2, "count")) { cmd = PADSYNTH::control::frequencyMultiplier; } else if (input.matchnMove(2, "expand")) { cmd = PADSYNTH::control::modulatorStretch; } else if (input.matchnMove(2, "frequency")) { cmd = PADSYNTH::control::modulatorFrequency; } else if (input.matchnMove(2, "size")) { cmd = PADSYNTH::control::size; } else if (input.matchnMove(2, "cross")) { if (input.matchnMove(1, "full")) value = 0; else if (input.matchnMove(1, "upper")) value = 1; else if (input.matchnMove(1, "lower")) value = 2; else return REPLY::value_msg; cmd = PADSYNTH::control::harmonicSidebands; } else if (input.matchnMove(2, "multiplier")) { if (input.matchnMove(1, "off")) value = 0; else if (input.matchnMove(1, "gauss")) value = 1; else if (input.matchnMove(1, "sine")) value = 2; else if (input.matchnMove(1, "double")) value = 3; else return REPLY::value_msg; cmd = PADSYNTH::control::amplitudeMultiplier; } else if (input.matchnMove(2, "mode")) { if (input.matchnMove(1, "Sum")) value = 0; else if (input.matchnMove(1, "mult")) value = 1; else if (input.matchnMove(1, "d1")) value = 2; else if (input.matchnMove(1, "d2")) value = 3; else return REPLY::value_msg; cmd = PADSYNTH::control::amplitudeMode; } else if (input.matchnMove(2, "center")) { cmd = PADSYNTH::control::spectralWidth; } else if (input.matchnMove(3, "relative")) { cmd = PADSYNTH::control::spectralAmplitude; } else if (input.matchnMove(2, "auto")) { value = (input.toggle() > 0); cmd = PADSYNTH::control::autoscale; } else if (input.matchnMove(3, "base")) { for (int i = 0; i < 9; ++ i) { if (basetypes[i] == string{input}) { value = i; cmd = PADSYNTH::control::harmonicBase; break; } } if (cmd == -1) return REPLY::range_msg; } else if (input.matchnMove(2, "samples")) { unsigned char sizes[] {1, 2, 4, 6, 8, 12, 24}; value = string2float(input); int tmp = value * 2; for (int i = 0; i < 7; ++i) { if (tmp == sizes[i]) { value = i; cmd = PADSYNTH::control::samplesPerOctave; break; } } if (cmd == -1) return REPLY::range_msg; } else if (input.matchnMove(2, "range")) { cmd = PADSYNTH::control::numberOfOctaves; } else if (input.matchnMove(2, "length")) { value = bitFindHigh(string2int(input)) - 4; if (value > 6) return REPLY::range_msg; cmd = PADSYNTH::control::sampleSize; } else if (input.matchnMove(2, "bandwidth")) { cmd = PADSYNTH::control::bandwidth; } else if (input.matchnMove(2, "scale")) { if (input.matchnMove(1, "normal")) value = 0; else if (input.matchnMove(1, "equalhz")) value = 1; else if (input.matchnMove(1, "quarter")) value = 2; else if (input.matchnMove(1, "half")) value = 3; else if (input.matchnMove(1, "threequart")) value = 4; else if (input.matchnMove(1, "oneandhalf")) value = 5; else if (input.matchnMove(1, "double")) value = 6; else if (input.matchnMove(1, "inversehalf")) value = 7; else return REPLY::range_msg; cmd = PADSYNTH::control::bandwidthScale; } else if (input.matchnMove(2, "spectrum")) { if (input.matchnMove(1, "bandwidth")) value = 0; else if (input.matchnMove(1, "discrete")) value = 1; else if (input.matchnMove(1, "continuous")) value = 2; else return REPLY::range_msg; cmd = PADSYNTH::control::spectrumMode; } else if (input.matchnMove(2, "xfadeupdate")) { cmd = PADSYNTH::control::xFadeUpdate; } else if (input.matchnMove(2, "buildtrigger")) { cmd = PADSYNTH::control::rebuildTrigger; } else if (input.matchnMove(3, "rwdetune")) { cmd = PADSYNTH::control::randWalkDetune; } else if (input.matchnMove(3, "rwbandwidth")) { cmd = PADSYNTH::control::randWalkBandwidth; } else if (input.matchnMove(3, "rwfilterfreq")) { cmd = PADSYNTH::control::randWalkFilterFreq; } else if (input.matchnMove(3, "rwwidthprofile")) { cmd = PADSYNTH::control::randWalkProfileWidth; } else if (input.matchnMove(3, "rwstretchprofile")) { cmd = PADSYNTH::control::randWalkProfileStretch; } if (input.matchnMove(2, "apply")) { value = 1; cmd = PADSYNTH::control::applyChanges; unsigned char parameter = UNUSED; if(input.matchnMove(5, "force")) parameter = 0; // see InterChange::commandPad, case PADSYNTH::control::applyChanges // invokes PADnoteParameters::setpadparams(blocking) with blocking = (parameter == 0) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::padSynth, UNUSED, parameter); } if (cmd > -1) { if (value == -1) value = string2int(input); return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::padSynth); } return REPLY::unrecognised_msg; } int CmdInterpreter::resonance(Parser& input, unsigned char controlType) { float value = input.toggle(); int cmd = -1; engine = contextToEngines(context); int insert = TOPLEVEL::insert::resonanceGroup; if (value > -1) { sendNormal(synth, 0, value, controlType, RESONANCE::control::enableResonance, npart, kitNumber, engine, insert); return REPLY::done_msg; } if (input.lineEnd(controlType)) return REPLY::done_msg; if (input.matchnMove(1, "random")) { if (input.matchnMove(1, "coarse")) value = 0; else if (input.matchnMove(1, "medium")) value = 1; else if (input.matchnMove(1, "fine")) value = 2; else return REPLY::value_msg; cmd = RESONANCE::control::randomType; } else if (input.matchnMove(2, "protect")) { value = (input.toggle() == 1); cmd = RESONANCE::control::protectFundamental; } else if (input.matchnMove(1, "maxdb")) { if (input.lineEnd(controlType)) return REPLY::value_msg; cmd = RESONANCE::control::maxDb; value = string2float(input); } else if (input.matchnMove(2, "center")) { value = string2float(input); cmd = RESONANCE::control::centerFrequency; } else if (input.matchnMove(1, "octaves")) { value = string2float(input); cmd = RESONANCE::control::octaves; } else if (input.matchnMove(1, "interpolate")) { if (input.matchnMove(1, "linear")) value = 1; else if (input.matchnMove(1, "smooth")) value = 0; else return REPLY::value_msg; cmd = RESONANCE::control::interpolatePeaks; } else if (input.matchnMove(1, "smooth")) cmd = RESONANCE::control::smoothGraph; else if (input.matchnMove(1, "clear")) cmd = RESONANCE::control::clearGraph; else if (input.matchnMove(2, "apply")) { // this is a padsynth level control but must be callable here if (engine != PART::engine::padSynth) return REPLY::available_msg; value = 1; insert = UNUSED; cmd = PADSYNTH::control::applyChanges; unsigned char parameter = UNUSED; if(input.matchnMove(5, "force")) parameter = 0; // see InterChange::commandPad, case PADSYNTH::control::applyChanges // invokes PADnoteParameters::setpadparams(blocking) with blocking = (parameter == 0) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::padSynth, insert, parameter); } if (cmd > -1) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, engine, insert); if (input.matchnMove(2, "points")) { insert = TOPLEVEL::insert::resonanceGraphInsert; if (input.isAtEnd()) // need to catch reading as well { if (controlType & TOPLEVEL::type::Limits) return sendNormal(synth, 0, 0, controlType, 1, npart, kitNumber, engine, insert); else { for (int i = 0; i < MAX_RESONANCE_POINTS; i += 8) { string line = asAlignedString(i + 1, 4) + ">"; for (int j = 0; j < (MAX_RESONANCE_POINTS / 32); ++ j) { line += asAlignedString(readControl(synth, 0, RESONANCE::control::graphPoint, npart, kitNumber, engine, insert, i + j), 4); } synth->getRuntime().Log(line); } } return REPLY::done_msg; } cmd = RESONANCE::control::graphPoint; int point = string2int(input) - 1; if (point < 0 || point >= MAX_RESONANCE_POINTS) return REPLY::range_msg; input.skipChars(); if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, engine, insert, point); } return REPLY::unrecognised_msg; } int CmdInterpreter::waveform(Parser& input, unsigned char controlType) { if (input.lineEnd(controlType)) return REPLY::done_msg; float value = -1; int cmd = -1; engine = contextToEngines(context); unsigned char insert = TOPLEVEL::insert::oscillatorGroup; int thisVoice = voiceNumber; if (engine == PART::engine::padSynth) thisVoice = 0; // we don't want voice offsets here. if (controlType == type_read && input.isAtEnd()) value = 0; // dummy value else { string name = string{input}.substr(0,3); value = stringNumInList(name, wavebase, 3); } if (value != -1) cmd = OSCILLATOR::control::baseFunctionType; else if (input.matchnMove(1, "harmonic")) { if (input.lineEnd(controlType)) return REPLY::value_msg; if (input.matchnMove(1, "shift")) cmd = OSCILLATOR::control::harmonicShift; else if (input.matchnMove(1, "before")) { value = (input.toggle() == 1); cmd = OSCILLATOR::control::shiftBeforeWaveshapeAndFilter; } else { cmd = string2int(input) - 1; if (cmd < 0 || cmd >= MAX_AD_HARMONICS) return REPLY::range_msg; input.skipChars(); if (input.matchnMove(1, "amp")) insert = TOPLEVEL::insert::harmonicAmplitude; else if (input.matchnMove(1, "phase")) insert = TOPLEVEL::insert::harmonicPhase; if (input.lineEnd(controlType)) return REPLY::value_msg; } if (value == -1) value = string2int(input); return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, engine + thisVoice, insert); } else if (input.matchnMove(2, "convert")) { value = 0; // dummy cmd = OSCILLATOR::control::convertToSine; } else if (input.matchnMove(2, "clear")) { value = 0; // dummy cmd = OSCILLATOR::control::clearHarmonics; } else if (input.matchnMove(2, "shape")) { if (input.matchnMove(1, "type")) { string name = string{input}.substr(0,3); value = stringNumInList(name, filtershapes, 3); if (value == -1) return REPLY::value_msg; cmd = OSCILLATOR::control::waveshapeType; } else if (input.matchnMove(1, "par")) cmd = OSCILLATOR::control::waveshapeParameter; else return REPLY::op_msg; } else if (input.matchnMove(1, "filter")) { if (input.matchnMove(1, "type")) { if (controlType != TOPLEVEL::type::Write) value = 0; // dummy value else { string name = string{input}.substr(0,3); value = stringNumInList(name, filtertype, 3); if (value == -1) return REPLY::value_msg; } cmd = OSCILLATOR::control::filterType; } else if (input.matchnMove(1, "par")) { switch (input.peek()) { case char('1'): cmd = OSCILLATOR::control::filterParameter1; break; case char('2'): cmd = OSCILLATOR::control::filterParameter2; break; default: return REPLY::op_msg; } input.skipChars(); } else if (input.matchnMove(1, "before")) { value = (input.toggle() == 1); cmd = OSCILLATOR::control::filterBeforeWaveshape; } else return REPLY::op_msg; } else if (input.matchnMove(1, "base")) { if (input.matchnMove(1, "par")) cmd = OSCILLATOR::control::baseFunctionParameter; else if (input.matchnMove(1, "convert")) { value = (input.toggle() != 0); cmd = OSCILLATOR::control::useAsBaseFunction; } else if (input.matchnMove(1, "mod")) { if (input.matchnMove(1, "type")) { if (input.matchnMove(3, "off")) value = 0; else if (input.matchnMove(1, "Rev")) value = 1; else if (input.matchnMove(1, "Sine")) value = 2; else if (input.matchnMove(1, "Power")) value = 3; else return REPLY::value_msg; cmd = OSCILLATOR::control::baseModulationType; } else if (input.matchnMove(1, "par")) { switch (input.peek()) { case char('1'): cmd = OSCILLATOR::control::baseModulationParameter1; break; case char('2'): cmd = OSCILLATOR::control::baseModulationParameter2; break; case char('3'): cmd = OSCILLATOR::control::baseModulationParameter3; break; default: return REPLY::range_msg; } input.skipChars(); } else return REPLY::op_msg; } else return REPLY::op_msg; } else if (input.matchnMove(2, "spectrum")) { if (input.matchnMove(1, "type")) { if (input.matchnMove(3, "OFF")) value = 0; else if (input.matchnMove(3, "Power")) value = 1; else if (input.matchnMove(1, "Down")) value = 2; else if (input.matchnMove(1, "Up")) value = 3; else return REPLY::value_msg; cmd = OSCILLATOR::control::spectrumAdjustType; } else if (input.matchnMove(1, "par")) cmd = OSCILLATOR::control::spectrumAdjustParameter; else return REPLY::op_msg; } else if (input.matchnMove(2, "adaptive")) { if (input.matchnMove(1, "type")) { string name = string{input}.substr(0,3); value = stringNumInList(name, adaptive, 3); if (value == -1) return REPLY::value_msg; cmd = OSCILLATOR::control::adaptiveHarmonicsType; } else if (input.matchnMove(1, "base")) cmd = OSCILLATOR::control::adaptiveHarmonicsBase; else if (input.matchnMove(1, "level")) cmd = OSCILLATOR::control::adaptiveHarmonicsPower; else if (input.matchnMove(1, "par")) cmd = OSCILLATOR::control::adaptiveHarmonicsParameter; else return REPLY::op_msg; } else if (input.matchnMove(2, "apply")) { // this is a padsynth level control but must be callable here if (engine != PART::engine::padSynth) return REPLY::available_msg; value = 1; insert = UNUSED; cmd = PADSYNTH::control::applyChanges; unsigned char parameter = UNUSED; if(input.matchnMove(5, "force")) parameter = 0; // see InterChange::commandPad, case PADSYNTH::control::applyChanges // invokes PADnoteParameters::setpadparams(blocking) with blocking = (parameter == 0) return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, PART::engine::padSynth, insert, parameter); } if (cmd == -1) return REPLY::unrecognised_msg; if (value == -1) value = string2float(input); return sendNormal(synth, 0, value, controlType, cmd, npart, kitNumber, engine + thisVoice, insert); } int CmdInterpreter::commandPart(Parser& input, unsigned char controlType) { Config& Runtime = synth->getRuntime(); section = npart; if (bitTest(context, LEVEL::AllFX)) return effects(input, controlType); bool partIsOn = readControl(synth, 0, PART::control::enable, npart); if (input.matchnMove(2, "bypass")) { if (!partIsOn) return REPLY::inactive_msg; int effnum = string2int(input); if (effnum < 1 || effnum > NUM_PART_EFX) return REPLY::range_msg; input.skipChars(); bool value = false; if (!input.lineEnd(controlType)) value = (input.toggle() == 1); return sendNormal(synth, 0, value, controlType, PART::control::effectBypass, npart, UNUSED, effnum - 1, TOPLEVEL::insert::partEffectSelect); } if (input.lineEnd(controlType)) return REPLY::done_msg; if (kitMode == PART::kitType::Off) kitNumber = UNUSED; // always clear it if not kit mode // This is for actual effect definition and editing. See below for kit selection. if (!inKitEditor) { if (input.matchnMove(2, "effects") || input.matchnMove(2, "efx")) { if (!partIsOn) return REPLY::inactive_msg; context = LEVEL::Top; bitSet(context, LEVEL::AllFX); bitSet(context, LEVEL::Part); return effects(input, controlType); } } if (input.isdigit()) { uint num = string2int127(input); input.skipChars(); if (num > 0) { num -= 1; if (!inKitEditor) { if (num >= Runtime.numAvailableParts) { Runtime.Log("Part number too high"); return REPLY::done_msg; } //if (npart != num) // TODO sort this properly! { npart = num; section = npart; if (controlType == TOPLEVEL::type::Write) { context = LEVEL::Top; bitSet(context, LEVEL::Part); kitMode = PART::kitType::Off; kitNumber = 0; voiceNumber = 0; // must clear this too! sendNormal(synth, 0, npart, TOPLEVEL::type::Write, MAIN::control::partNumber, TOPLEVEL::section::main); } } if (input.lineEnd(controlType)) return REPLY::done_msg; } else { if (controlType == TOPLEVEL::type::Write) { if (num >= NUM_KIT_ITEMS) return REPLY::range_msg; kitNumber = num; voiceNumber = 0;// to avoid confusion } Runtime.Log("Kit item number " + to_string(kitNumber + 1)); return REPLY::done_msg; } } } int enable = input.toggle(); if (enable > -1) { if (!inKitEditor) // part enable { int result = sendNormal(synth, 0, enable, controlType, PART::control::enable, npart); if (input.lineEnd(controlType)) return result; } else if (partIsOn) // kit item enable { if (enable >= 0) { if (kitNumber == 0) { synth->getRuntime().Log("Kit item 1 always on."); return REPLY::done_msg; } return sendNormal(synth, 0, enable, controlType, PART::control::enableKitLine, npart, kitNumber, UNUSED, TOPLEVEL::insert::kitGroup); } } } if (!partIsOn) // part must be enabled for all further operations. return REPLY::inactive_msg; if (input.matchnMove(2, "clear")) { if (controlType != TOPLEVEL::type::Write) return REPLY::writeOnly_msg; if (not testPartsChanged("Still clear", npart)) return REPLY::done_msg; if (input.matchnMove(3, "all")) // clear entire part return sendNormal(synth, 0, npart, controlType, MAIN::control::defaultPart, TOPLEVEL::section::main); return sendNormal(synth, 0, npart, controlType, MAIN::control::defaultInstrument, TOPLEVEL::section::main); } if (input.matchnMove(2, "program") || input.matchnMove(1, "instrument")) { if (controlType != TOPLEVEL::type::Write) { Runtime.Log("Part name is " + synth->part[npart]->Pname); return REPLY::done_msg; } if (!input.isAtEnd()) // force part not channel number { if (input.matchnMove(1, "group")) { if (instrumentGroup.empty()) { Runtime.Log("No list entries, or list not seen"); return REPLY::done_msg; } size_t value = string2int(input); string line; if (value < 1 || value > instrumentGroup.size()) return REPLY::range_msg; -- value; list:: iterator it = instrumentGroup.begin(); size_t lineNo = 0; while (lineNo < value && it != instrumentGroup.end()) { ++ it; ++ lineNo; } if (it == instrumentGroup.end()) return REPLY::range_msg; line = *it; int root = string2int(line.substr(0, 3)); int bank = string2int(line.substr(5, 3)); int inst = (string2int(line.substr(10, 3))) - 1; if (not testPartsChanged("Overwrite", npart)) return REPLY::done_msg; sendDirect(synth, 0, inst, controlType, MAIN::control::loadInstrumentFromBank, TOPLEVEL::section::main, npart, bank, root); return REPLY::done_msg; } int tmp = string2int(input) - 1; if (tmp < 0 || tmp >= MAX_INSTRUMENTS_IN_BANK) return REPLY::range_msg; if (not testPartsChanged("Overwrite", npart)) return REPLY::done_msg; sendDirect(synth, 0, tmp, controlType, MAIN::control::loadInstrumentFromBank, TOPLEVEL::section::main, npart); return REPLY::done_msg; } else return REPLY::value_msg; } if (input.matchnMove(2, "latest")) { int result = readControl(synth, 0, BANK::control::lastSeenInBank, TOPLEVEL::section::bank); int root = result & 0xff; if (root == UNUSED) { synth->getRuntime().Log("Latest not defined"); return REPLY::done_msg; } bool isSave = ((root & 0x80) != 0); root &= 0x7f; int instrument = result >> 15; int bank = (result >> 8) & 0x7f; string name = "A part was "; if (isSave) name += "sent to I "; else name += "fetched from I "; name += (to_string(instrument + 1) + ", B " + to_string(bank) + ", R " + to_string(root)); synth->getRuntime().Log(name); return REPLY::done_msg; } if (!readControl(synth, 0, PART::control::enable, npart)) return REPLY::inactive_msg; int tmp = -1; if (input.matchnMove(3, "normal")) tmp = PART::kitType::Off; else if (input.matchnMove(2, "multi")) tmp = PART::kitType::Multi; else if (input.matchnMove(2, "single")) tmp = PART::kitType::Single; else if (input.matchnMove(2, "crossfade")) tmp = PART::kitType::CrossFade; else if (input.matchnMove(3, "kit")) { if (kitMode == PART::kitType::Off) return REPLY::inactive_msg; inKitEditor = true; return REPLY::done_msg; } if (tmp != -1) { kitNumber = 0; voiceNumber = 0; // must clear this too! kitMode = tmp; inKitEditor = (kitMode != PART::kitType::Off); return sendNormal(synth, 0, kitMode, controlType, PART::control::kitMode, npart); } if (bitTest(context, LEVEL::AllFX)) return effects(input, controlType); if (input.matchnMove(3, "addsynth")) { bitSet(context, LEVEL::AddSynth); insertGroup = UNUSED; insertType = UNUSED; return addSynth(input, controlType); } if (input.matchnMove(3, "subsynth")) { bitSet(context, LEVEL::SubSynth); insertGroup = UNUSED; insertType = UNUSED; return subSynth(input, controlType); } if (input.matchnMove(3, "padsynth")) { bitSet(context, LEVEL::PadSynth); insertGroup = UNUSED; insertType = UNUSED; return padSynth(input, controlType); } if (input.matchnMove(3, "mcontrol")) { bitSet(context, LEVEL::MControl); return midiControllers(input, controlType); } if (input.matchnMove(2, "drum")) return sendNormal(synth, 0, (input.toggle() != 0), controlType, PART::control::drumMode, npart); if (inKitEditor) { int value; if (input.matchnMove(2, "quiet")) return sendNormal(synth, 0, (input.toggle() != 0), controlType, PART::control::kitItemMute, npart, kitNumber, UNUSED, TOPLEVEL::insert::kitGroup); // This is for selection from 3 part effects. See above for definitions. if (input.matchnMove(2,"effect")) { if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; value = string2int(input); if (value < 0 || value > NUM_PART_EFX) return REPLY::range_msg; return sendNormal(synth, 0, value, controlType | TOPLEVEL::type::Integer, PART::control::kitEffectNum, npart, kitNumber, UNUSED, TOPLEVEL::insert::kitGroup); } if (input.matchnMove(2,"name")) { int miscmsg = NO_MSG; if (input.lineEnd(controlType)) return REPLY::value_msg; if (controlType == TOPLEVEL::type::Write) miscmsg = textMsgBuffer.push(input); return sendNormal(synth, TOPLEVEL::action::muteAndLoop, 0, controlType, PART::control::instrumentName, npart, kitNumber, UNUSED, TOPLEVEL::insert::kitGroup, UNUSED, UNUSED, miscmsg); } } int value = 0; int cmd = -1; if (input.matchnMove(2, "min")) { cmd = PART::control::minNote; if (controlType == TOPLEVEL::type::Write) { if (input.lineEnd(controlType)) return REPLY::value_msg; if (input.matchnMove(1, "last")) cmd = PART::control::minToLastKey; else { value = string2int(input); if (value > synth->part[npart]->Pmaxkey) return REPLY::high_msg; } } } else if (input.matchnMove(2, "max")) { cmd = PART::control::maxNote; if (controlType == TOPLEVEL::type::Write) { if (input.lineEnd(controlType)) return REPLY::value_msg; if (input.matchnMove(1, "last")) cmd = PART::control::maxToLastKey; else { value = string2int(input); if (value < synth->part[npart]->Pminkey) return REPLY::low_msg; } } } else if (input.matchnMove(2, "full")) cmd = PART::control::resetMinMaxKey; if (cmd > -1) { int insert = UNUSED; int kit = kitNumber; if (inKitEditor) insert = TOPLEVEL::insert::kitGroup; else kit = UNUSED; return sendNormal(synth, 0, value, controlType, cmd, npart, kit, UNUSED, insert); } if (input.matchnMove(2, "shift")) { if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; int value = string2int(input); if (value < MIN_KEY_SHIFT) value = MIN_KEY_SHIFT; else if (value > MAX_KEY_SHIFT) value = MAX_KEY_SHIFT; return sendNormal(synth, TOPLEVEL::action::lowPrio, value, controlType, PART::control::keyShift, npart); } if (input.matchnMove(1, "volume")) cmd = PART::control::volume; else if (input.matchnMove(1, "pan")) cmd = PART::control::panning; else if (input.matchnMove(2, "velocity")) cmd = PART::control::velocitySense; else if (input.matchnMove(2, "LEvel")) cmd = PART::control::velocityOffset; if (cmd != -1) { int tmp = string2int127(input); if (controlType == TOPLEVEL::type::Write && input.isAtEnd()) return REPLY::value_msg; return sendNormal(synth, 0, tmp, controlType, cmd, npart); } if (input.matchnMove(2, "channel")) { tmp = string2int127(input); if (controlType == TOPLEVEL::type::Write && tmp < 1) return REPLY::value_msg; tmp -= 1; return sendNormal(synth, 0, tmp, controlType, PART::control::midiChannel, npart); } if (input.matchnMove(2, "omni")) { return sendNormal(synth, 0, (input.toggle() == 1), controlType, PART::control::omni, npart); } if (input.matchnMove(2, "aftertouch")) { int tmp = PART::aftertouchType::modulation * 2; int cmd = PART::control::channelATset; if (input.matchnMove(1, "key")) cmd = PART::control::keyATset; else if (!input.matchnMove(1, "chan")) return REPLY::op_msg; if (input.matchnMove(1, "Off")) tmp = PART::aftertouchType::off; else { if (input.matchnMove(1, "Filter")) { tmp = PART::aftertouchType::filterCutoff; if (input.matchnMove(1, "Down")) tmp |= PART::aftertouchType::filterCutoffDown; } if (input.matchnMove(1, "Peak")) { tmp = PART::aftertouchType::filterQ; if (input.matchnMove(1, "Down")) tmp |= PART::aftertouchType::filterQdown; } if (input.matchnMove(1, "Bend")) { tmp |= PART::aftertouchType::pitchBend; if (input.matchnMove(1, "Down")) tmp |= PART::aftertouchType::pitchBendDown; } if (input.matchnMove(1, "Volume")) tmp |= PART::aftertouchType::volume; if (input.matchnMove(1, "Modulation")) tmp |= PART::aftertouchType::modulation; } if (tmp == PART::aftertouchType::modulation * 2 && controlType != type_read) return REPLY::value_msg; return sendNormal(synth, 0, tmp & (PART::aftertouchType::modulation * 2 - 1), controlType, cmd, npart); } if (input.matchnMove(1, "destination")) { int dest = 0; if (controlType == TOPLEVEL::type::Write) { if (input.matchnMove(1, "main")) dest = 1; else if (input.matchnMove(1, "part")) dest = 2; else if (input.matchnMove(1, "both")) dest = 3; if (dest == 0) return REPLY::range_msg; } return sendNormal(synth, TOPLEVEL::action::muteAndLoop, dest, controlType, PART::control::audioDestination, npart); } if (input.matchnMove(1, "note")) { int value = 0; if (controlType == TOPLEVEL::type::Write) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int(input); if (value < 1 || value > POLYPHONY) return REPLY::range_msg; } return sendNormal(synth, 0, value, controlType, PART::control::maxNotes, npart); } if (input.matchnMove(1, "mode")) { int value = 0; if (controlType == TOPLEVEL::type::Write) { if (input.matchnMove(1, "poly")) value = 0; else if (input.matchnMove(1, "mono")) value = 1; else if (input.matchnMove(1, "legato")) value = 2; else return REPLY::name_msg; } return sendNormal(synth, 0, value, controlType, PART::control::keyMode, npart); } if (input.matchnMove(2, "portamento")) return sendNormal(synth, 0, (input.toggle() == 1), controlType, PART::control::portamento, npart); if (input.matchnMove(1, "humanise")) { int cmd = -1; if (input.matchnMove(1, "pitch")) cmd = PART::control::humanise; else if (input.matchnMove(1, "velocity")) cmd = PART::control::humanvelocity; else return REPLY::op_msg; if (input.lineEnd(controlType)) return REPLY::value_msg; return sendNormal(synth, 0, string2int(input), controlType, cmd, npart); } if (input.matchnMove(2, "name")) { string name; unsigned char miscmsg = NO_MSG; if (controlType == TOPLEVEL::type::Write) { name = string{input}; if (name.size() < 3) { Runtime.Log("Name too short"); return REPLY::done_msg; } else if (name == DEFAULT_NAME) { Runtime.Log("Cannot use name of default sound"); return REPLY::done_msg; } else miscmsg = textMsgBuffer.push(name); } return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, controlType, PART::control::instrumentName, npart, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); } if (input.matchnMove(3,"copyright")) { string name; if (controlType == TOPLEVEL::type::Write) { name = string{input}; if (name.size() < 2) return REPLY::value_msg; } unsigned char miscmsg = textMsgBuffer.push(name); return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, controlType, PART::control::instrumentCopyright, npart, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); } if (input.matchnMove(3,"info")) { string name; if (controlType == TOPLEVEL::type::Write) { name = string{input}; if (name.size() < 2) return REPLY::value_msg; } unsigned char miscmsg = textMsgBuffer.push(name); return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, controlType, PART::control::instrumentComments, npart, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); } if (input.matchnMove(3,"type")) { if (input.lineEnd(controlType)) return REPLY::value_msg; int pos = 0; if (controlType == TOPLEVEL::type::Write) { string name = type_list[pos]; while (name != "@end" && !input.matchnMove(3, name.c_str())) { ++ pos; name = type_list[pos]; } if (name == "@end") pos = 0; // undefined } return sendNormal(synth, TOPLEVEL::action::lowPrio, pos, controlType, PART::control::instrumentType, npart); } return REPLY::op_msg; } /* Special operations used by the Yoshimi-testsuite for automated acceptance tests */ int CmdInterpreter::commandTest(Parser& input, unsigned char controlType) { bitSet(context, LEVEL::Test); if (input.matchnMove(2, "test")) { // just consume; we are already in the test context } if (controlType == TOPLEVEL::type::Write && input.matchWord(2, "swapwave")) {// special treatment for testing the PADSynth wavetable swap and cross-fade synth->setReproducibleState(0); // re-seed PRNG and rebuild all PAD wavetables (blocking). synth->swapTestPADtable(); }// note: the following handler will consume the "swapwave" command and store the offset parameter string response; if (TestInvoker::access().handleParameterChange(input, controlType, response, synth->buffersize)) synth->getRuntime().Log(response); // proceed to launch the test invocation and then cause termination of Yoshimi if (controlType == TOPLEVEL::type::Write && input.matchnMove(3, "execute")) { using Seconds = duration; auto at_least_one_cycle = Seconds(synth->buffersize_f / synth->samplerate_f); sendNormal(synth, 0, 0, TOPLEVEL::type::Write,MAIN::control::stopSound, TOPLEVEL::section::main); do sleep_for(at_least_one_cycle); // with buffersize 128 and 48kHz -> one buffer lasts ~ 2.6ms while (synth->audioOut != _SYS_::mute::Idle); // Activate test sound computation at end of main() TestInvoker::access().activated = true; // NOTE: the following initiates a shutdown synth->getRuntime().runSynth = false; return REPLY::exit_msg; } else if (!input.isAtEnd()) return REPLY::op_msg; //"Which Operation?" return REPLY::done_msg; } int CmdInterpreter::commandReadnSet(Parser& input, unsigned char controlType) { Config &Runtime = synth->getRuntime(); if (input.matchnMove(2, "yoshimi")) { if (controlType != TOPLEVEL::type::Write) { //Runtime.Log("Instance " + asString(currentInstance), _SYS_::LogError); Runtime.Log("Instance " + to_string(synth->getUniqueId())); return REPLY::done_msg; } if (input.lineEnd(controlType)) return REPLY::value_msg; resetInstance(string2int(input)); return REPLY::done_msg; } if (input.matchnMove(4, "tone")) { if (controlType != TOPLEVEL::type::Write) return REPLY::writeOnly_msg; if (input.lineEnd(controlType)) return REPLY::value_msg; int chan = string2int(input) - 1; input.skipChars(); if (chan < 0 || chan > 15) return REPLY::range_msg; int pitch = string2int(input); input.skipChars(); if (pitch < 0 || pitch >= MAX_OCTAVE_SIZE) return REPLY::range_msg; int velocity = string2int(input); int control; if (velocity > 0 && velocity <= 127) control = MIDI::noteOn; else control = MIDI::noteOff; sendDirect(synth, 0, velocity, controlType, control, TOPLEVEL::midiIn, chan, pitch); return REPLY::done_msg; } if (input.matchnMove(4, "seed")) { if (controlType != TOPLEVEL::type::Write) return REPLY::writeOnly_msg; int seed = string2int(input); if (seed < 0) seed = 0; else if (seed > 0xffffff) seed = 0xffffff; sendDirect(synth, 0, seed, controlType | TOPLEVEL::type::Integer, MAIN::control::reseed, TOPLEVEL::main); return REPLY::done_msg; } switch (bitFindHigh(context)) { case LEVEL::Config: return commandConfig(input, controlType); break; case LEVEL::Bank: return commandBank(input, controlType); break; case LEVEL::Scale: return commandScale(input, controlType); break; case LEVEL::Envelope: return envelopeSelect(input, controlType); break; case LEVEL::Filter: case LEVEL::Formant: return filterSelect(input, controlType); break; case LEVEL::LFO: return LFOselect(input, controlType); break; case LEVEL::Resonance: return resonance(input, controlType); break; case LEVEL::Oscillator: return waveform(input, controlType); break; case LEVEL::AddMod: return modulator(input, controlType); break; case LEVEL::AddVoice: return addVoice(input, controlType); break; case LEVEL::AddSynth: return addSynth(input, controlType); break; case LEVEL::SubSynth: return subSynth(input, controlType); break; case LEVEL::PadSynth: return padSynth(input, controlType); break; case LEVEL::MControl: return midiControllers(input, controlType); break; case LEVEL::Part: return commandPart(input, controlType); break; case LEVEL::Vector: return commandVector(input, controlType); break; case LEVEL::Learn: return commandMlearn(input, controlType); break; case LEVEL::Test: return commandTest(input, controlType); break; } if (input.matchnMove(3, "mono")) { return sendNormal(synth, 0, (input.toggle() == 1), controlType, MAIN::control::mono, TOPLEVEL::section::main); } if (input.matchnMove(2, "config")) { context = LEVEL::Top; bitSet(context, LEVEL::Config); return commandConfig(input, controlType); } if (input.matchnMove(1, "bank")) { context = LEVEL::Top; bitSet(context, LEVEL::Bank); return commandBank(input, controlType, true); } if (input.matchnMove(1, "scale")) { context = LEVEL::Top; bitSet(context, LEVEL::Scale); return commandScale(input, controlType); } if (context == LEVEL::Top && input.matchnMove(1, "part")) { nFX = 0; // just to be sure // TODO get correct part number /*if (controlType != TOPLEVEL::type::Write && input.isAtEnd()) { if (synth->partonoffRead(npart)) name = " enabled"; else name = " disabled"; Runtime.Log("Current part " + asString(npart + 1) + name, _SYS_::LogError); return REPLY::done_msg; }*/ context = LEVEL::Top; engine = 1; insertGroup = UNUSED; insertType = UNUSED; bitSet(context, LEVEL::Part); nFXtype = synth->part[npart]->partefx[nFX]->geteffect(); return commandPart(input, controlType); } if (input.matchnMove(2, "vector")) { context = LEVEL::Top; return commandVector(input, controlType); } if (input.matchnMove(2, "mlearn")) { context = LEVEL::Top; return commandMlearn(input, controlType); } if (input.matchnMove(3, "test")) { context = LEVEL::Top; return commandTest(input, controlType); } if (context == LEVEL::Top && input.matchnMove(3, "system")) { section = TOPLEVEL::section::systemEffects; bitSet(context,LEVEL::AllFX); bitClear(context, LEVEL::InsFX); nFX = 0; // just to be sure input.matchnMove(2, "effects"); // clear it if given input.matchnMove(2, "efx"); nFXtype = synth->sysefx[nFX]->geteffect(); return effects(input, controlType); } if (context == LEVEL::Top && input.matchnMove(3, "insert")) { section = TOPLEVEL::section::insertEffects; bitSet(context,LEVEL::AllFX); bitSet(context,LEVEL::InsFX); nFX = 0; // just to be sure input.matchnMove(2, "effects"); // clear it if given input.matchnMove(2, "efx"); nFXtype = synth->insefx[nFX]->geteffect(); return effects(input, controlType); } if (bitTest(context, LEVEL::AllFX)) return effects(input, controlType); if (input.matchnMove(1, "volume")) { if (input.lineEnd(controlType)) return REPLY::value_msg; return sendNormal(synth, 0, string2float(input), controlType, MAIN::control::volume, TOPLEVEL::section::main); } if (input.matchnMove(2, "detune")) { if (input.lineEnd(controlType)) return REPLY::value_msg; return sendNormal(synth, TOPLEVEL::action::lowPrio, string2float(input), controlType, MAIN::control::detune, TOPLEVEL::section::main); } if (input.matchnMove(2, "shift")) { if (input.lineEnd(controlType)) return REPLY::value_msg; int value = string2int(input); return sendNormal(synth, TOPLEVEL::action::lowPrio, value, controlType, MAIN::control::keyShift, TOPLEVEL::section::main); } if (input.matchnMove(3, "BPM")) { if (input.lineEnd(controlType)) return REPLY::value_msg; float value = string2float(input); return sendNormal(synth, 0, value, controlType, MAIN::control::bpmFallback, TOPLEVEL::section::main); } if (input.matchnMove(2, "solo")) { int value = MIDI::SoloType::Disabled; if (input.matchnMove(2, "cc")) { if (controlType == TOPLEVEL::type::Write) { if (input.lineEnd(controlType)) return REPLY::value_msg; value = string2int127(input); string otherCC = Runtime.masterCCtest(value); if (otherCC > "") { Runtime.Log("In use for " + otherCC); return REPLY::done_msg; } } return sendNormal(synth, 0, value, controlType, MAIN::control::soloCC, TOPLEVEL::section::main); } else if (input.matchnMove(2, "row")) value = MIDI::SoloType::Row; else if (input.matchnMove(2, "column")) value = MIDI::SoloType::Column; else if (input.matchnMove(2, "loop")) value = MIDI::SoloType::Loop; else if (input.matchnMove(2, "twoway")) value = MIDI::SoloType::TwoWay; else if (input.matchnMove(2, "channel")) value = MIDI::SoloType::Channel; return sendNormal(synth, 0, value, controlType, MAIN::control::soloType, TOPLEVEL::section::main); } if (input.matchnMove(2, "available")) // 16, 32, 64 { if (input.lineEnd(controlType)) return REPLY::value_msg; int value = string2int(input); if (controlType == TOPLEVEL::type::Write && value != 16 && value != 32 && value != 64) return REPLY::range_msg; return sendNormal(synth, 0, value, controlType, MAIN::control::availableParts, TOPLEVEL::section::main); } if (input.matchnMove(3, "panning")) { int value = MAIN::panningType::normal; if (input.matchnMove(1, "cut")) value = MAIN::panningType::cut; else if (input.matchnMove(1, "boost")) value = MAIN::panningType::boost; else if (!input.matchnMove(1, "default") && controlType == TOPLEVEL::type::Write) return REPLY::range_msg; return sendNormal(synth, 0, value, controlType, MAIN::control::panLawType, TOPLEVEL::section::main); } if (input.matchnMove(2, "clear")) { if (input.lineEnd(controlType)) return REPLY::value_msg; int value = string2int(input) -1; if (value < 0) return REPLY::range_msg; if (!readControl(synth, 0, PART::control::enable, value)) return REPLY::inactive_msg; return sendNormal(synth, 0, value, controlType, MAIN::control::defaultInstrument, TOPLEVEL::section::main); } return REPLY::op_msg; } void CmdInterpreter::presetsControl(float value, unsigned char type, unsigned char section, unsigned char kitNumber, unsigned char engine, unsigned char insert, unsigned char parameter, unsigned char offset, unsigned char miscmsg) { /* type flags (set) List - all entries of section type Copy - from section to file Paste - from file to section no name given - from/to clipboard)) */ string name; if (engine == PART::engine::addVoice1 || engine == PART::engine::addMod1) { engine += voiceNumber; } if (kitNumber == EFFECT::type::none) { value = nFX; kitNumber += nFXtype; if (kitNumber == EFFECT::type::dynFilter && bitTest(context, LEVEL::Filter)) { insert = TOPLEVEL::insert::filterGroup; } } if (type == TOPLEVEL::type::List) { string name = readControlText(synth, TOPLEVEL::action::lowPrio, TOPLEVEL::control::copyPaste, section, kitNumber, engine, insert, parameter, offset); copypasteList(name); } else { sendDirect(synth, TOPLEVEL::action::lowPrio, value, type, TOPLEVEL::control::copyPaste, section, kitNumber, engine, insert, parameter, offset, miscmsg); } } Reply CmdInterpreter::processSrcriptFile(const string& filename, bool toplevel) { if (filename <= "!") return Reply::what("Exec"); Config &Runtime = synth->getRuntime(); stringstream reader(loadText(filename)); if (reader.eof()) { Runtime.Log("Can't read file " + filename); return Reply::DONE; } cli::Parser scriptParser; if (toplevel) context = LEVEL::Top; // start from top level string line; int lineNo = 0; const char DELIM_NEWLINE ='\n'; while (std::getline(reader, line, DELIM_NEWLINE)) { //cout << "line >" << line << "<" << endl; scriptParser.initWithExternalBuffer(line); if (scriptParser.isTooLarge()) { Runtime.Log("*** Error: line " + to_string(lineNo) + " too long"); return Reply(REPLY::failed_msg); } ++ lineNo; if (line.empty()) continue; // skip empty line but count it. scriptParser.skipSpace(); if (scriptParser.peek() == '#' || iscntrl((unsigned char) scriptParser.peek())) { // skip comment lines continue; } if (scriptParser.matchnMove(3, "run")) { Runtime.Log("*** Error: scripts are not recursive @ line " + to_string(lineNo) + " ***"); return Reply(REPLY::failed_msg); } if (scriptParser.matchnMove(4, "wait")) { using MilliSec = duration; MilliSec mSec{string2int(scriptParser) - 1}; // -1ms for internal overhead mSec = util::limited(MilliSec{2}, mSec, MilliSec{30000}); Runtime.Log("Waiting " + to_string(mSec.count()) + "ms"); sleep_for(mSec); } else { sleep_for(2ms); // the loop is too fast otherwise! Reply reply = cmdIfaceProcessCommand(scriptParser); if (reply.code > REPLY::done_msg) { Runtime.Log("*** Error: " + replies[reply.code] + " @ line " + to_string(lineNo) + ": " + line + " ***"); return Reply(REPLY::failed_msg); } } } return Reply::DONE; } Reply CmdInterpreter::cmdIfaceProcessCommand(Parser& input) { input.trim(); unsigned int newID = synth->getUniqueId(); if (newID != currentInstance) { currentInstance = newID; defaults(); } Config &Runtime = synth->getRuntime(); buildStatus(false); #ifdef REPORT_NOTES_ON_OFF if (input.matchnMove(3, "report")) // note test { cout << "note on sent " << Runtime.noteOnSent << endl; cout << "note on seen " << Runtime.noteOnSeen << endl; cout << "note off sent " << Runtime.noteOffSent << endl; cout << "note off seen " << Runtime.noteOffSeen << endl; cout << "notes hanging sent " << Runtime.noteOnSent - Runtime.noteOffSent << endl; cout << "notes hanging seen " << Runtime.noteOnSeen - Runtime.noteOffSeen << endl; return Reply::DONE; } #endif if (input.matchnMove(5, "filer")) { string result; file::dir2string(result, "/home/will", ".xiz"); cout << result << endl; return Reply::DONE; } if (input.matchnMove(2, "exit")) { if (input.matchnMove(2, "force")) { sendDirect(synth, 0, 0, TOPLEVEL::type::Write, TOPLEVEL::control::forceExit, UNUSED); return Reply::DONE; } bool echo = (synth->getRuntime().toConsole); if (currentInstance > 0) { if (echo) cout << "Can only exit from instance 0" << endl; Runtime.Log("Can only exit from instance 0", _SYS_::LogError); return Reply::DONE; } string message = "All unsaved data will be lost. Still exit"; if (echo) cout << message << "? (y / {other})" << endl; if (query(message)) { if (not testPartsChanged("Still exit")) return Reply::DONE; Runtime.runSynth = false; return Reply{REPLY::exit_msg}; } return Reply::DONE; } if (input.matchnMove(2, "guide")) { synth->getRuntime().Log(readControlText(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::section::guideLocation, UNUSED)); return Reply::DONE; } if (input.nextChar('/')) { input.skip(1); input.skipSpace(); defaults(); if (input.isAtEnd()) return Reply::DONE; } if (input.matchnMove(3, "reset")) { int control = MAIN::control::masterReset; if (input.matchnMove(3, "all")) control = MAIN::control::masterResetAndMlearn; if (query("Restore to basic settings")) { if (not testPartsChanged("Still reset")) return Reply::DONE; sendDirect(synth, TOPLEVEL::action::muteAndLoop, 0, TOPLEVEL::type::Write, control, TOPLEVEL::section::main); defaults(); } return Reply::DONE; } if (input.startsWith("..")) { input.skip(2); input.skipSpace(); if (bitFindHigh(context) == LEVEL::Formant) { filterVowelNumber = UNUSED; filterFormantNumber = UNUSED; } else { insertGroup = UNUSED; insertType = UNUSED; } /* * kit mode is a pseudo context level so the code * below emulates normal 'back' actions */ if (bitFindHigh(context) == LEVEL::Part && kitMode != PART::kitType::Off) { int newPart = npart; input.markPoint(); defaults(); npart = newPart; bitSet(context, LEVEL::Part); if (input.matchnMove(1, "set")) { if (!input.isdigit()) input.reset_to_mark(); else { uint tmp = string2int(input); if (tmp < 1 || tmp > Runtime.numAvailableParts) return REPLY::range_msg; npart = tmp -1; return Reply::DONE; } } else return Reply::DONE; } if (bitFindHigh(context) == LEVEL::AllFX || bitFindHigh(context) == LEVEL::InsFX) defaults(); else if (bitFindHigh(context) == LEVEL::Part) { int temPart = npart; if (bitTest(context, LEVEL::AllFX) || bitTest(context, LEVEL::InsFX)) { defaults(); bitSet(context, LEVEL::Part); // restore part level } else defaults(); npart = temPart; } else { bitClearHigh(context); } if (input.isAtEnd()) return Reply::DONE; } if (helpList(input, context)) return Reply::DONE; if (input.matchnMove(2, "stop")) return Reply{sendNormal(synth, 0, 0, TOPLEVEL::type::Write,MAIN::control::stopSound, TOPLEVEL::section::main)}; if (input.matchnMove(1, "list")) { // we've added the 's' as people tended to autmatically assume it was needed. if (input.matchnMove(1, "groups")) return Reply{commandGroup(input)}; return Reply{commandList(input)}; } if (input.matchnMove(4, "runlocal")) return processSrcriptFile(input, false); if (input.matchnMove(3, "run")) return processSrcriptFile(input); if (input.matchnMove(1, "set")) { if (!input.isAtEnd()) return Reply{commandReadnSet(input, TOPLEVEL::type::Write)}; else return Reply::what("set"); } // special shortcut when in Test context: 'execute' directly launches test if (bitFindHigh(context) == LEVEL::Test && input.matchWord(3, "EXEcute")) return Reply{commandReadnSet(input, TOPLEVEL::type::Write)}; if (input.matchnMove(1, "read") || input.matchnMove(1, "get")) { /* * we no longer test for line end as some contexts can return * useful information with a simple read. */ return Reply{commandReadnSet(input, type_read)}; } if (input.matchnMove(3, "minimum")) { if (!input.isAtEnd()) return Reply{commandReadnSet(input, TOPLEVEL::type::Minimum | TOPLEVEL::type::Limits)}; else { return Reply::what("minimum"); } } if (input.matchnMove(3, "maximum")) { if (!input.isAtEnd()) return Reply{commandReadnSet(input, TOPLEVEL::type::Maximum | TOPLEVEL::type::Limits)}; else { return Reply::what("maximum"); } } if (input.matchnMove(3, "default")) { if (!input.isAtEnd()) return Reply{commandReadnSet(input, TOPLEVEL::type::Default | TOPLEVEL::type::Limits)}; else { return Reply::what("default"); } } if (input.matchnMove(2, "mlearn")) { if (!input.isAtEnd()) return Reply{commandReadnSet(input, TOPLEVEL::type::LearnRequest)}; else { return Reply::what("mlearn"); } } if (input.matchnMove(3, "add")) { if (input.matchnMove(1, "root")) { return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, BANK::control::addNamedRoot, TOPLEVEL::section::bank, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(input)); } if (input.matchnMove(1, "bank")) { int root = readControl(synth, 0, BANK::control::selectRoot, TOPLEVEL::section::bank); return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, BANK::control::createBank, TOPLEVEL::section::bank, UNUSED, root, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(input)); } if (input.matchnMove(2, "yoshimi")) { if (currentInstance !=0) { Runtime.Log("Only instance 0 can start others"); return Reply::DONE; } int forceId = string2int(input); if (forceId < 1 || forceId >= 32) forceId = 0; sendNormal(synth, TOPLEVEL::action::lowPrio, forceId, TOPLEVEL::type::Write, MAIN::control::startInstance, TOPLEVEL::section::main); return Reply::DONE; } else { return Reply::what("add"); } } if (input.matchWord(3, "import") || input.matchWord(3, "export") ) { // need the double test to find which then move along line int type = 0; string replyMsg; if (input.matchnMove(3, "import")) { if (bitTest(context, LEVEL::Scale)) return commandImportScale(input); type = MAIN::control::importBank; replyMsg = "import"; } else if (input.matchnMove(3, "export")) { if (bitTest(context, LEVEL::Scale)) return commandExportScale(input); type = MAIN::control::exportBank; replyMsg = "export"; } int root = UNUSED; if (input.matchnMove(1, "root")) { if (input.isdigit()) { root = string2int(input); input.skipChars(); } else root = 200; // force invalid root error } int value = string2int(input); input.skipChars(); string name(input); if (root < 0 || (root > 127 && root != UNUSED) || value < 0 || value > 127 || name <="!") return Reply{REPLY::what_msg}; else { sendDirect(synth, TOPLEVEL::action::lowPrio, value, TOPLEVEL::type::Write, type, TOPLEVEL::section::main, root, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(name)); return Reply{REPLY::done_msg, replyMsg}; } } if (input.matchnMove(3, "remove")) { if (input.matchnMove(1, "root")) { if (input.isdigit()) { int rootID = string2int(input); if (rootID >= MAX_BANK_ROOT_DIRS) return Reply{REPLY::range_msg}; else { sendDirect(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write,BANK::deselectRoot, TOPLEVEL::section::bank, rootID); return Reply::DONE; } } else return Reply{REPLY::value_msg}; } if (input.matchnMove(1, "bank")) { if (!input.isdigit()) return Reply{REPLY::value_msg}; int bankID = string2int(input); if (bankID >= MAX_BANKS_IN_ROOT) return Reply{REPLY::range_msg}; int rootID = readControl(synth, 0, BANK::control::selectRoot, TOPLEVEL::section::bank); input.skipChars(); if (!input.isAtEnd()) { if (input.matchnMove(1, "root")) { if (!input.isdigit()) return Reply{REPLY::value_msg}; rootID = string2int(input); if (rootID >= MAX_BANK_ROOT_DIRS) return Reply{REPLY::range_msg}; } } int tmp = int(readControl(synth, TOPLEVEL::action::lowPrio, BANK::control::findBankSize, TOPLEVEL::section::bank, bankID, rootID)); if (tmp == UNUSED) { Runtime.Log("No bank at this location"); return Reply::DONE; } else if (tmp) { Runtime.Log("Bank " + to_string(bankID) + " has " + asString(tmp) + " Instruments"); if (!query("Delete bank and all of these")) { Runtime.Log("Aborted"); return Reply::DONE; } } sendDirect(synth, TOPLEVEL::action::lowPrio, bankID, TOPLEVEL::type::Write, MAIN::control::deleteBank, TOPLEVEL::section::main, rootID); return Reply::DONE; } if (input.matchnMove(2, "yoshimi")) { if (input.isAtEnd()) { return Reply::what("remove"); } else { unsigned int to_close = string2int(input); if (to_close == 0) Runtime.Log("Use 'Exit' to close main instance"); else if (to_close == currentInstance) Runtime.Log("Instance can't close itself"); else { sendNormal(synth, TOPLEVEL::action::lowPrio, to_close, TOPLEVEL::type::Write, MAIN::control::stopInstance, TOPLEVEL::section::main); } return Reply::DONE; } } if (input.matchnMove(2, "mlearn")) { if (input.matchnMove(3, "all")) { sendNormal(synth, 0, 0, 0, MIDILEARN::control::clearAll, TOPLEVEL::section::midiLearn); return Reply::DONE; } else if (input.nextChar('@')) { input.skip(1); input.skipSpace(); int tmp = string2int(input); if (tmp == 0) return Reply{REPLY::value_msg}; sendNormal(synth, 0, tmp - 1, 0, MIDILEARN::control::deleteLine, TOPLEVEL::section::midiLearn); return Reply::DONE; } } if (input.matchnMove(2, "instrument") || input.matchnMove(2, "program")) { int tmp = string2int(input); if (tmp <= 0 || tmp > MAX_INSTRUMENTS_IN_BANK) return Reply{REPLY::range_msg}; if (query("Permanently remove instrument " + to_string(tmp) + " from bank")) sendDirect(synth, TOPLEVEL::action::lowPrio, tmp - 1, TOPLEVEL::type::Write, BANK::control::deleteInstrument, TOPLEVEL::section::bank); return Reply::DONE; } return Reply::what("remove"); } else if (input.matchnMove(2, "load")) { if (input.matchnMove(2, "mlearn")) { if (input.nextChar('@')) { input.skip(1); int tmp = string2int(input); if (tmp == 0) return Reply{REPLY::value_msg}; sendNormal(synth, 0, tmp - 1, TOPLEVEL::type::Write, MIDILEARN::control::loadFromRecent, TOPLEVEL::section::midiLearn); return Reply::DONE; } if (input.isAtEnd()) return Reply{REPLY::name_msg}; sendNormal(synth, 0, 0, TOPLEVEL::type::Write, MIDILEARN::control::loadList, TOPLEVEL::section::midiLearn, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string{input})); return Reply::DONE; } if (input.matchnMove(2, "vector")) { unsigned char ch; if (input.matchnMove(1, "channel")) { ch = string2int127(input); if (ch > 0) { ch -= 1; input.skipChars(); } else ch = chan; } else { ch = chan; } if (ch >= NUM_MIDI_CHANNELS) return Reply{REPLY::range_msg}; if (input.isAtEnd()) return Reply{REPLY::name_msg}; int count = 0; string replyMsg = ""; for (int i = ch; i < (ch + NUM_MIDI_PARTS); i += NUM_MIDI_CHANNELS) { if (readControl(synth, 0, MAIN::control::partsChanged, TOPLEVEL::section::main, i)) { replyMsg = (replyMsg + " " + to_string(i + 1)); ++ count; } } if (count) { if (count > 1) replyMsg = "Instruments in parts " + replyMsg + " have been edited"; else replyMsg = "Instrument in part " + replyMsg + " has been edited"; replyMsg += ". Overwrite"; if (synth->getRuntime().toConsole) cout << replyMsg << "? (y / {other})" << endl; if (not query(replyMsg)) return Reply::DONE; } string name; if (input.nextChar('@')) { input.skip(1); input.skipSpace(); int tmp = string2int(input); if (tmp <= 0) return Reply{REPLY::value_msg}; name = historySelect(5, tmp - 1); if (name == "") return Reply::DONE; } else { name = string{input}; if (name == "") return Reply{REPLY::name_msg}; } sendDirect(synth, TOPLEVEL::action::muteAndLoop, 0, TOPLEVEL::type::Write, MAIN::control::loadNamedVector, TOPLEVEL::section::main, UNUSED, UNUSED, ch, UNUSED, UNUSED, textMsgBuffer.push(name)); return Reply::DONE; } if (input.matchnMove(2, "state")) { if (input.isAtEnd()) return Reply{REPLY::name_msg}; string name; if (input.nextChar('@')) { input.skip(1); input.skipSpace(); int tmp = string2int(input); if (tmp <= 0) return Reply{REPLY::value_msg}; name = historySelect(4, tmp - 1); if (name == "") return Reply::DONE; } else { name = string{input}; if (name == "") return Reply{REPLY::name_msg}; } if (not testPartsChanged("Overwrite")) return Reply::DONE; sendDirect(synth, TOPLEVEL::action::muteAndLoop, 0, TOPLEVEL::type::Write, MAIN::control::loadNamedState, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(name)); return Reply::DONE; } if (input.matchnMove(2, "scale")) { if (input.isAtEnd()) return Reply{REPLY::name_msg}; string name; if (input.nextChar('@')) { input.skip(1); input.skipSpace(); int tmp = string2int(input); if (tmp <= 0) return Reply{REPLY::value_msg}; name = historySelect(3, tmp - 1); if (name == "") return Reply::DONE; } else { name = string{input}; if (name == "") return Reply{REPLY::name_msg}; } sendDirect(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, MAIN::control::loadNamedScale, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(name)); return Reply::DONE; } if (input.matchnMove(1, "patchset")) { if (input.isAtEnd()) return Reply{REPLY::name_msg}; string name; if (input.nextChar('@')) { input.skip(1); input.skipSpace(); int tmp = string2int(input); if (tmp <= 0) return Reply{REPLY::value_msg}; name = historySelect(2, tmp - 1); if (name == "") return Reply::DONE; } else { name = string{input}; if (name == "") return Reply{REPLY::name_msg}; } if (not testPartsChanged("Overwrite")) return REPLY::done_msg; sendDirect(synth, TOPLEVEL::action::muteAndLoop, 0, TOPLEVEL::type::Write, MAIN::control::loadNamedPatchset, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(name)); return Reply::DONE; } if (input.matchnMove(1, "instrument")) { if (input.isAtEnd()) return Reply{REPLY::name_msg}; string name; if (input.nextChar('@')) { input.skip(1); input.skipSpace(); int tmp = string2int(input); if (tmp <= 0) return Reply{REPLY::value_msg}; name = historySelect(1, tmp - 1); if (name == "") return Reply::DONE; } else { name = string{input}; if (name == "") return Reply{REPLY::name_msg}; } if (not testPartsChanged("Overwrite", npart)) return REPLY::done_msg; sendDirect(synth, 0, 0, TOPLEVEL::type::Write, MAIN::control::loadInstrumentByName, TOPLEVEL::section::main, npart, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(name)); return Reply::DONE; } if (input.matchnMove(3, "section")) { if (section < NUM_MIDI_PARTS) { int thisKit = kitNumber; int result = 0; int insert = UNUSED; if (kitMode) insert = TOPLEVEL::insert::kitGroup; else thisKit = UNUSED; int thisEngine = engine; int voiceNumber = 0; if (thisEngine >= PART::engine::addVoice1 && thisEngine < PART::engine::addVoiceModEnd) { voiceNumber = (thisEngine - PART::engine::addVoice1) & 7; thisEngine = PART::engine::addVoice1; if (engine >= PART::engine::addMod1) engine -= 8; // there is no separate modulator entry for copy/past } switch (thisEngine) { case PART::engine::addSynth: result = readControl(synth, 0, PART::control::enableAdd, section, thisKit, PART::engine::addSynth, insert); break; case PART::engine::addVoice1: result = readControl(synth, 0, ADDVOICE::control::enableVoice, npart, kitNumber, PART::engine::addVoice1 + voiceNumber); break; case PART::engine::subSynth: result = readControl(synth, 0, PART::control::enableSub, section, thisKit, PART::engine::subSynth, insert); break; case PART::engine::padSynth: result = readControl(synth, 0, PART::control::enablePad, section, thisKit, PART::engine::padSynth, insert); break; default: result = true; // we don't need to check the rest. break; } if (!result) return REPLY::inactive_msg; } if (filterVowelNumber != UNUSED) presetsControl(0, TOPLEVEL::type::Paste, section, kitNumber, engine, insertType, filterFormantNumber, filterVowelNumber, textMsgBuffer.push(string{input})); else presetsControl(0, TOPLEVEL::type::Paste, section, kitNumber, engine, insertType, insertGroup, UNUSED, textMsgBuffer.push(string{input})); return Reply::DONE; } if (input.matchnMove(1, "default")) { if (bitFindHigh(context) == LEVEL::Part) return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, PART::control::defaultInstrumentCopyright, TOPLEVEL::section::part1 + npart, UNUSED, UNUSED, UNUSED, 0); else { synth->getRuntime().Log("Only available at part level"); return Reply::DONE; } } return Reply::what("load"); } if (input.matchnMove(2, "save")) { if (input.matchnMove(2, "mlearn")) { if (input.isAtEnd()) return Reply{REPLY::name_msg}; sendNormal(synth, 0, 0, TOPLEVEL::type::Write, MIDILEARN::control::saveList, TOPLEVEL::section::midiLearn, 0, 0, 0, 0, UNUSED, textMsgBuffer.push(string{input})); return Reply::DONE; } if (input.matchnMove(2, "vector")) { int tmp = chan; if (input.matchnMove(1, "channel")) { tmp = string2int127(input) - 1; input.skipChars(); } if (tmp >= NUM_MIDI_CHANNELS || tmp < 0) return Reply{REPLY::range_msg}; if (input.isAtEnd()) return Reply{REPLY::name_msg}; chan = tmp; sendDirect(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, MAIN::control::saveNamedVector, TOPLEVEL::section::main, UNUSED, UNUSED, chan, UNUSED, UNUSED, textMsgBuffer.push(string{input})); return Reply::DONE; } if (input.matchnMove(2, "state")) { if (input.isAtEnd()) return Reply{REPLY::value_msg}; sendDirect(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, MAIN::control::saveNamedState, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string{input})); return Reply::DONE; } if (input.matchnMove(1, "config")) { sendDirect(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, CONFIG::control::saveCurrentConfig, TOPLEVEL::section::config, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push("DUMMY")); return Reply::DONE; } if (input.matchnMove(2, "scale")) { if (input.isAtEnd()) return Reply{REPLY::name_msg}; sendDirect(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, MAIN::control::saveNamedScale, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string{input})); return Reply::DONE; } else if (input.matchnMove(1, "patchset")) { if (input.isAtEnd()) return Reply{REPLY::name_msg}; sendDirect(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, MAIN::control::saveNamedPatchset, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string{input})); return Reply::DONE; } if (input.matchnMove(1, "instrument")) { if (!readControl(synth, 0, PART::control::enable, npart)) return REPLY::inactive_msg; if (readControlText(synth, TOPLEVEL::action::lowPrio, PART::control::instrumentName, TOPLEVEL::section::part1 + npart) == DEFAULT_NAME) { Runtime.Log("Nothing to save!"); return Reply::DONE; } if (input.isAtEnd()) return Reply{REPLY::name_msg}; sendDirect(synth, TOPLEVEL::action::lowPrio, npart, TOPLEVEL::type::Write, MAIN::control::saveNamedInstrument, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string{input})); return Reply::DONE; } if (input.matchnMove(3, "section")) { if (filterVowelNumber != UNUSED) presetsControl(0, TOPLEVEL::type::Copy, section, kitNumber, engine, insertType, filterFormantNumber, filterVowelNumber, textMsgBuffer.push(string{input})); else { if (engine >= PART::engine::addMod1 && engine < PART::engine::addVoiceModEnd) engine -= 8; // there is no separate modulator entry for copy/past presetsControl(0, TOPLEVEL::type::Copy, section, kitNumber, engine, insertType, insertGroup, UNUSED, textMsgBuffer.push(string{input})); } return Reply::DONE; } if (input.matchnMove(1, "default")) return sendNormal(synth, TOPLEVEL::action::lowPrio, 0, TOPLEVEL::type::Write, PART::control::defaultInstrumentCopyright, TOPLEVEL::section::part1 + npart, UNUSED, UNUSED, UNUSED, 1); return Reply::what("save"); } if (input.matchnMove(3, "undo")) return sendNormal(synth, 0, 0, TOPLEVEL::type::Write, MAIN::control::undo, TOPLEVEL::section::undoMark); if (input.matchnMove(3, "redo")) return sendNormal(synth, 0, 0, TOPLEVEL::type::Write, MAIN::control::redo, TOPLEVEL::section::undoMark); if (input.matchnMove(2, "zread")) { /* * For testing only * See dev_notes/CLI_zread */ float value = 0; unsigned char control = UNUSED; unsigned char part = UNUSED; unsigned char kit = UNUSED; unsigned char engine = UNUSED; unsigned char insert = UNUSED; unsigned char parameter = UNUSED; unsigned char offset = UNUSED; unsigned char miscmsg = UNUSED; if (input.isAtEnd()) return REPLY::value_msg; control = string2int(input); input.skipChars(); if (input.isAtEnd()) return REPLY::value_msg; part = string2int(input); input.skipChars(); if (!input.isAtEnd()) { kit = string2int(input); input.skipChars(); if (!input.isAtEnd()) { engine = string2int(input); input.skipChars(); if (!input.isAtEnd()) { insert = string2int(input); input.skipChars(); if (!input.isAtEnd()) { parameter = string2int(input); input.skipChars(); if (!input.isAtEnd()) { offset = string2int(input); } } } } } sendDirect(synth, 0, value, TOPLEVEL::type::Adjust, control, part, kit, engine, insert, parameter, offset, miscmsg); return REPLY::done_msg; } if (input.matchnMove(4, "zset")) { /* * For testing only * See dev_notes/CLI_zset */ npart = 0; if (input.isdigit()) { npart = string2int(input) - 1; if (npart < 0 || npart > 15) npart = 0; // only test the 'standard' part numbers } sendDirect(synth, 0, npart, TOPLEVEL::type::Write, MAIN::control::setTestInstrument, TOPLEVEL::section::main); return REPLY::done_msg; } // legacyCLIaccess goes here return REPLY::unrecognised_msg; } bool CmdInterpreter::checkOnePart(SynthEngine *synth, uchar npart) { CommandBlock checkData; checkData.data.value = 0; checkData.data.type = 0; checkData.data.control = MAIN::control::partsChanged; checkData.data.part = TOPLEVEL::section::main; checkData.data.kit = npart; checkData.data.engine = UNUSED; checkData.data.insert = UNUSED; checkData.data.parameter = UNUSED; checkData.data.insert = UNUSED; bool changed = synth->interchange.readAllData(checkData); if (changed) { changed = query("part has been editied. Overwrite"); } return changed; } }//(End)namespace cli yoshimi-2.3.5.1/src/CLI/CmdInterpreter.h000066400000000000000000000122151506652756400176600ustar00rootroot00000000000000/* CmdInterpreter.h Copyright 2019 - 2022, Will Godfrey and others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef CMDINTERPRETER_H #define CMDINTERPRETER_H #include #include #include "Misc/SynthEngine.h" #include "Interface/TextLists.h" using std::string; using std::list; class TextMsgBuffer; namespace test { class TestInvoker; } namespace cli { struct Reply { // note these are immutable const int code; const string msg; Reply(int c, string m ="") : code{c}, msg{m} { } // reassignment prohibited Reply& operator=(const Reply&) = delete; // some frequently used shortcuts static Reply DONE; static Reply what(string question) { return Reply{REPLY::what_msg, question}; } }; class Parser; class CmdInterpreter { public: CmdInterpreter(); ~CmdInterpreter(); string buildStatus(bool showPartDetails); Reply cmdIfaceProcessCommand(Parser& input); unsigned int currentInstance; SynthEngine *synth; private: string buildAllFXStatus(); string buildPartStatus(bool showPartDetails); string buildTestStatus(); void defaults(); void resetInstance(unsigned int newInstance); bool query(string text); bool testPartsChanged(string message, int partNum = UNUSED); void helpLoop(list& msg, string *commands, int indent, bool single = false); char helpList(Parser& input, unsigned int local); void copypasteList(string name); string historySelect(int listnum, size_t selection); void historyList(int listnum); void listCurrentParts(Parser& input, list& msg_buf); int effectsList(Parser& input, bool presets = false); int effects(Parser& input, unsigned char controlType); int midiControllers(Parser& input, unsigned char controlType); int LFOselect(Parser& input, unsigned char controlType); float freqBPMset(Parser& input, bool isBPM, int max = 127); int filterSelect(Parser& input, unsigned char controlType); int envelopeSelect(Parser& input, unsigned char controlType); int commandGroup(Parser& input); int commandList(Parser& input); int commandMlearn(Parser& input, unsigned char controlType); int commandVector(Parser& input, unsigned char controlType); int commandBank(Parser& input, unsigned char controlType, bool justEntered = false); int commandConfig(Parser& input, unsigned char controlType); int commandScale(Parser& input, unsigned char controlType); int commandImportScale(Parser& input); int commandExportScale(Parser& input); int addSynth(Parser& input, unsigned char controlType); int subSynth(Parser& input, unsigned char controlType); int padSynth(Parser& input, unsigned char controlType); int resonance(Parser& input, unsigned char controlType); int addVoice(Parser& input, unsigned char controlType); int modulator(Parser& input, unsigned char controlType); int waveform(Parser& input, unsigned char controlType); int commandPart(Parser& input, unsigned char controlType); int commandTest(Parser& input, unsigned char controlType); int commandReadnSet(Parser& input, unsigned char controlType); bool checkOnePart(SynthEngine *synth, uchar npart); void presetsControl(float value, unsigned char type, unsigned char section, unsigned char kitNumber, unsigned char engine, unsigned char insert, unsigned char parameter, unsigned char offset = UNUSED,unsigned char miscmsg = UNUSED); Reply processSrcriptFile(const string& filename, bool toplevel = true); private: list instrumentGroup; TextMsgBuffer& textMsgBuffer; /* == state fields == */ // all these are used by findStatus() // the following are used pervasively unsigned int context; int section; int npart; int kitMode; int kitNumber; bool inKitEditor; int engine; int voiceNumber; int insertGroup; int insertType; int nFXtype; int nFX; // the remaining ones are only used at some places int nFXpreset; int nFXeqBand; int filterSequenceSize; int filterVowelNumber; int filterNumberOfFormants; int filterFormantNumber; int chan; int axis; int mline; }; }//(End)namespace cli #endif /*CMDINTERPRETER_H*/ yoshimi-2.3.5.1/src/CLI/Parser.h000066400000000000000000000202151506652756400161640ustar00rootroot00000000000000/* Parser.h Copyright 2010, Alan Calvert Copyright 2014-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . Modified August 2019 */ #ifndef PARSER_H #define PARSER_H #include #include #include #include #include namespace cli { using std::string; inline string asAlignedString(int n, int len) { string res = std::to_string(n); int size = res.length(); if (size < len) { for (int i = size; i < len; ++ i) res = " " + res; } return res; } /* * Finds the index number of an item in a string list. If 'min' <= 0 the * input string must be an exact match of all characters and of equal length. * Otherwise 'min' should be set to a value that provides the fewest tests * for an unambiguous match. * If a string in the list is shorter than 'min' then this length is used. */ inline int stringNumInList(const string& toFind, string * theList, size_t min) { if (toFind.length() < min) return -1; int count = -1; string name; bool found = false; do { ++ count; name = theList[count]; if (min > 0) { size_t match = name.length(); if (match > min) match = min; int result = 0; for (string::size_type i = 0; i < match; ++i) { result |= (tolower(toFind[i]) ^ tolower(name[i])); } if (result == 0) found = true; } else // exact match { if (toFind == name) found = true; } } while (!found && name != "@end"); if (name == "@end") return -1; return count; } class Parser { char* buffer; char* point; char* mark; string prompt; string hist_filename; public: Parser() : buffer{nullptr}, point{nullptr}, mark{nullptr}, prompt{"yoshimi> "}, hist_filename{} { } ~Parser() { writeHistory(); cleanUp(); } // Parser is not copyable and can only be passed by reference Parser(const Parser&) = delete; Parser(Parser&&) = delete; Parser& operator=(const Parser&) = delete; Parser& operator=(Parser&&) = delete; // string conversion: get content after parsing point operator string() const { return string{isValid()? point : ""}; } bool isValid() const { return point && 0 < strlen(point) && strlen(point) <= COMMAND_SIZE; } bool isTooLarge() const { return point && strlen(point) > COMMAND_SIZE; } void setPrompt(const string& newPrompt) { prompt = newPrompt; } void readline() { cleanUp(); buffer = ::readline(prompt.c_str()); if (!buffer) cleanUp(); else { point = mark = buffer; add_history(buffer); } } // initialise the parser with an externally owned and managed buffer void initWithExternalBuffer(const string& buffer) { if (buffer.length() == 0) return; cleanUp(); point = mark = const_cast(buffer.data()); } void setHistoryFile(const string& filename) { if (filename.length() == 0) return; else hist_filename = filename; using_history(); stifle_history(80); // Never more than 80 commands if (read_history(hist_filename.c_str()) != 0) { // reading failed perror(hist_filename.c_str()); std::ofstream outfile (hist_filename.c_str()); // create an empty file } } void markPoint() { mark = point; } void reset_to_mark() { point = mark; } private: void cleanUp() { if (buffer) free(buffer); buffer = mark = point = nullptr; } void writeHistory() { if (hist_filename.length() == 0) return; if (write_history(hist_filename.c_str()) != 0) { // writing of history file failed perror(hist_filename.c_str()); } } public: void trim() { if (!point) return; this->skipSpace(); char *end = point + strlen(point) - 1; while (end > point && ::isspace((unsigned char)*end)) { end--; } end[1] = '\0'; // place new end terminator } /* ==== Parsing API ==== */ bool matchnMove(int prefixLen, const char * word) { bool found = matchWord(prefixLen, word); if (found) skipChars(); return found; } bool matchWord(int prefixLen, const char * word) { if (!point) return false; char* oldPos = point; bool matched = false; for (int i=0, size = strlen(word); i < size && isprint() && tolower(*point) == tolower(word[i]); ) { ++i; ++point; } // word must either match complete, or be abbreviated with at least prefixLen chars if ((point - oldPos) >= prefixLen && (isspace() || iscntrl())) matched = true; point = oldPos; return matched; } /* this allows you to specify enable or other, disable or other or must be those specifics */ int toggle() { if (matchnMove(2, "enable") || matchnMove(2, "on") || matchnMove(3, "yes")) return 1; if (matchnMove(2, "disable") || matchnMove(3, "off") || matchnMove(2, "no") ) return 0; return -1; } void skipSpace() { while (isspace()) ++point; } void skipChars() { if (!point) return; while (*point && !isspace()) ++point; // note: will also stop on line ends skipSpace(); // now find the next word (if any) } void skip(int cnt) { if (point) point += cnt; } bool lineEnd(unsigned char controlType) { return (isAtEnd() && controlType == TOPLEVEL::type::Write); // so all other controls aren't tested // e.g. you don't need to send a value when you're reading it! } bool isAtEnd() { return point && *point == '\0'; } bool nextChar(char expected) { return point && *point == expected; } bool startsWith(const char *prefix) { return 0 == strncmp(prefix, point, strlen(prefix)); } char peek() { return point? *point: '\0'; } bool isdigit() { return point && ::isdigit((unsigned char) *point); } bool isspace() { return point && ::isspace((unsigned char) *point); } bool isprint() { return point && ::isprint((unsigned char) *point); } bool isalnum() { return point && ::isalnum((unsigned char) *point); } bool iscntrl() { return point && ::iscntrl((unsigned char) *point); } }; }//(End)namespace cli #endif /*PARSER_H*/ yoshimi-2.3.5.1/src/CMakeLists.txt000066400000000000000000000433651506652756400167230ustar00rootroot00000000000000# # CMakeLists.txt # # Copyright 2009-2011, Alan Calvert # Copyright 2014-2023, Will Godfrey & others # Copyright 2024, Kristian Amlie, Will Godfrey # # This file is part of yoshimi, which is free software: you can # redistribute it and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation, either # version 2 of the License, or (at your option) any later version. # # yoshimi 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 yoshimi. If not, see . cmake_minimum_required (VERSION 3.12) cmake_policy (VERSION 3.12) cmake_policy (SET CMP0004 NEW) if (POLICY CMP0046) cmake_policy (SET CMP0046 NEW) endif () # opengl version if (POLICY CMP0072) cmake_policy (SET CMP0072 NEW) endif () #set(CMAKE_CXX_COMPILER "clang++") set (CMAKE_CXX_STANDARD 17) # we seem to need both for add_definitions(-std=gnu++17) # various versions of cmake add_definitions(-Wall) # avoid exporting any (spurious) symbols in EXE and Plugin # Note: the two LV2 descriptors are already marked visibility=default in LV2 headers cmake_policy (SET CMP0063 NEW) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) # vvv #add_definitions(-Wpedantic) # full ISO spec #add_definitions(-Werror) # warnings as errors #add_definitions(-Wfatal-errors) # stop on first add_definitions(-Werror=format-security) #add_definitions(-fsanitize=address) add_definitions(-Wextra) add_definitions(-Wno-vla) # Nothing wrong with variable length arrays #add_definitions(-Wno-unqualified-std-cast-call) # supresses clang warning 'unqualified call' # ^^^ comment these out on release pushes project (Yoshimi) set (YOSHIMI_VERSION "2.3.5.1") file (WRITE version.txt "${YOSHIMI_VERSION}") set (CMAKE_INCLUDE_CURRENT_DIR ON) set (CMAKE_USE_RELATIVE_PATHS OFF) # relative paths break some scripts(?) set (CMAKE_SKIP_RULE_DEPENDENCY OFF) # Rebuild objects if rules have changed, even if source hasn't. message (STATUS "Building Yoshimi version ${YOSHIMI_VERSION} for ${CMAKE_SYSTEM_NAME}") include (CheckCSourceCompiles) include(GNUInstallDirs) mark_as_advanced (EXECUTABLE_OUTPUT_PATH) mark_as_advanced (LIBRARY_OUTPUT_PATH) mark_as_advanced (CMAKE_BUILD_TYPE) mark_as_advanced (CMAKE_INSTALL_PREFIX) # Check for jack session availability check_c_source_compiles ( "#include int main(int argc, char **argv) { jack_session_event_type_t x = JackSessionSave; return 0; }" HasJackSession ) if (HasJackSession) option (JackSessionSupport "Include Jack Session Support" ON) else() set (JackSessionSupport OFF) endif () option (BuildFor0ld_X86 "Build for legacy x86 system" OFF) option (BuildForAMD_X86_64 "Build for AMD x86_64 system" OFF) option (BuildForCore2_X86_64 "Build for Intel Core2 x86_64 system" OFF) option (BuildForRasPi4 "Build for ARM Cortex A9 system" OFF) option (BuildForThisCPU "Build for presently running system" OFF) option (BuildForDebug "Debug build without optimisation. Enable gdb debugging support" OFF) option (BuildForDiagnostic "Add diagnostics and debug info for optimised release build" OFF) option (BuildWithFLTK "Build with FLTK GUI" ON) #option to build lv2 plugin option (LV2Plugin "Build yoshimi lv2 plugin interface" ON) # developer info option (ShowNoteOnTimes "Report Note-On Times" OFF) option (ReportNoteEvents "Report Notes On/Off Count" OFF) set (BuildOptions_X86 "-msse -msse2 -mfpmath=sse -ffast-math -fomit-frame-pointer" CACHE STRING "basic X86 compiler options" ) set (BuildOptions_X86_64AMD "-march=athlon64 -m64 -Wall -msse -msse2 -mfpmath=sse -ffast-math -fno-finite-math-only -fomit-frame-pointer" CACHE STRING "X86_64 compiler options" ) set (BuildOptions_X86_64Core2 "-march=core2 -m64 -Wall -msse -msse2 -mfpmath=sse -ffast-math -fno-finite-math-only -fomit-frame-pointer" CACHE STRING "X86_64 compiler options" ) set (BuildOptions_RasPi4 "-march=native -mfloat-abi=hard -mfpu=vfp -mcpu=cortex-a72 -mtune=cortex-a72 -pipe -mvectorize-with-neon-quad -funsafe-loop-optimizations" CACHE STRING "Raspberry Pi V4 compiler options" ) set (BuildOptions_ThisCPU "-march=native -mtune=native -Wall" CACHE STRING "Current CPU compiler options" ) set (BuildOptions_Basic "-ffast-math -fomit-frame-pointer" CACHE STRING "basic compiler options" ) set (BuildOptions_Debug "-O0 -Wpointer-arith -Wpedantic -Wextra" CACHE STRING "Compile without optimisation and with debug information") set (BuildOptions_Diagnostic "-g3 -ggdb" CACHE STRING "Additional flags for debug information and diagnostics") set (BuildOptions_Release "-O3" CACHE STRING "Compile with optimisation for Release builds") if (BuildWithFLTK) add_definitions (-DGUI_FLTK) endif () find_package (PkgConfig REQUIRED) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) check_c_source_compiles ( "#include #include int main () { int argc=1; char *argv[]={\"test\"}; argp_parse(0,argc,argv,0,0,0); return 0; }" LIBC_HAS_ARGP ) if (NOT LIBC_HAS_ARGP) message(STATUS "libc does not have argp") find_library (ARGP_LIB argp REQUIRED) endif () # libz find_package(ZLIB REQUIRED) # fftw3f pkg_check_modules (FFTW3F REQUIRED fftw3f>=0.22) # mxml pkg_check_modules (MXML REQUIRED mxml>=2.5) # Alsa if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") pkg_check_modules (ALSA REQUIRED alsa>=1.0.17) add_definitions(-DHAVE_ALSA) FIND_LIBRARY(LIBDL_LINUX NAMES dl) else() endif () # Jack pkg_check_modules (JACK REQUIRED jack>=0.115.6) # fontconfig pkg_check_modules (FONTCONFIG REQUIRED fontconfig>=0.22) mark_as_advanced(FONTCONFIG_LIBRARIES) if (BuildWithFLTK) # libcairo pkg_check_modules (LIBCAIRO REQUIRED cairo) # fltk find_package (FLTK REQUIRED) mark_as_advanced (FLTK_DIR) mark_as_advanced (FLTK_FLUID_EXECUTABLE) mark_as_advanced (FLTK_MATH_LIBRARY) endif () # libncurses / libcursesw set(CURSES_NEED_NCURSES TRUE) find_package (Curses REQUIRED) find_path(Readline_ROOT_DIR NAMES include/readline/readline.h ) find_path(Readline_INCLUDE_DIR NAMES readline/readline.h HINTS ${Readline_ROOT_DIR}/include ) find_library(Readline_LIBRARY NAMES readline HINTS ${Readline_ROOT_DIR}/lib ) #find_package(PkgConfig REQUIRED) if (Readline_INCLUDE_DIR AND Readline_LIBRARY AND CURSES_LIBRARY) set(READLINE_FOUND TRUE) else() FIND_LIBRARY(Readline_LIBRARY NAMES readline) include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG Readline_INCLUDE_DIR Readline_LIBRARY ) MARK_AS_ADVANCED(Readline_INCLUDE_DIR Readline_LIBRARY) endif () mark_as_advanced( Readline_ROOT_DIR Readline_INCLUDE_DIR Readline_LIBRARY ) if (READLINE_FOUND) message (STATUS "Readline library found" ) else() message( FATAL_ERROR "Readline library not found! Please install development components (libreadline-dev)" ) endif () # set platform specific compiler flags if (BuildFor0ld_X86) set (OurCxxFlags ${BuildOptions_X86}) elseif (BuildForAMD_X86_64) set (OurCxxFlags ${BuildOptions_X86_64AMD}) elseif (BuildForCore2_X86_64) set (OurCxxFlags ${BuildOptions_X86_64Core2}) elseif (BuildForNEON) set (OurCxxFlags ${BuildOptions_NEON}) elseif (BuildForThisCPU) set (OurCxxFlags ${BuildOptions_ThisCPU}) else() set (OurCxxFlags ${BuildOptions_Basic}) endif () set (CMAKE_CXX_FLAGS "${OurCxxFlags} ${CMAKE_CXX_FLAGS}") if (BuildForDiagnostic OR BuildForDebug) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${BuildOptions_Diagnostic}") else() set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG ") endif () if (BuildForDebug) set (CMAKE_BUILD_TYPE "Debug") set (CMAKE_CXX_FLAGS_DEBUG ${BuildOptions_Debug}) message (STATUS "DEBUG Build, flags: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") else() set (CMAKE_BUILD_TYPE "Release") set (CMAKE_CXX_FLAGS_RELEASE ${BuildOptions_Release}) message (STATUS "RELEASE Build, flags: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") endif () configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/../desktop/yoshimi.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/yoshimi.desktop" IMMEDIATE @ONLY) set (DSP_sources DSP/AnalogFilter.cpp DSP/Filter.cpp DSP/FormantFilter.cpp DSP/SVFilter.cpp DSP/Unison.cpp ) set (Effects_sources Effects/Alienwah.cpp Effects/Chorus.cpp Effects/Echo.cpp Effects/EffectLFO.cpp Effects/EffectMgr.cpp Effects/Effect.cpp Effects/Phaser.cpp Effects/Reverb.cpp Effects/EQ.cpp Effects/Distorsion.cpp Effects/DynamicFilter.cpp ) set (Misc_sources Misc/Bank.cpp Misc/BuildScheduler.cpp Misc/CmdOptions.cpp Misc/Config.cpp Misc/InstanceManager.cpp Misc/Microtonal.cpp Misc/Part.cpp Misc/SynthEngine.cpp Misc/WavFile.cpp Misc/XMLStore.cpp ) set (Interface_Sources Interface/InterChange.cpp Interface/Data2Text.cpp Interface/GuiDataExchange.h Interface/GuiDataExchange.cpp Interface/InterfaceAnchor.h Interface/Text2Data.cpp Interface/MidiLearn.cpp Interface/Vectors.cpp Interface/MidiDecode.cpp Interface/RingBuffer.h Interface/TextLists.h Interface/TextLists.cpp ) set (CLI_Sources CLI/CmdInterface.cpp CLI/CmdInterpreter.cpp ) set (Params_sources Params/ADnoteParameters.cpp Params/EnvelopeParams.cpp Params/FilterParams.cpp Params/LFOParams.cpp Params/SUBnoteParameters.cpp Params/PADnoteParameters.cpp Params/Controller.cpp Params/ParamCheck.cpp Params/UnifiedPresets.cpp Params/OscilParameters.cpp ) set (Synth_sources Synth/ADnote.cpp Synth/Envelope.cpp Synth/LFO.cpp Synth/OscilGen.cpp Synth/SUBnote.cpp Synth/Resonance.cpp Synth/PADnote.cpp ) set (MusicIO_sources MusicIO/MusicClient.cpp MusicIO/MusicIO.cpp MusicIO/JackEngine.cpp MusicIO/AlsaEngine.cpp ) if (BuildWithFLTK) set (FltkUI_names "PresetsUI" "EnvelopeUI" "LFOUI" "FilterUI" "VirKeyboardUI" "ConfigUI" "SUBnoteUI" "ResonanceUI" "OscilGenUI" "ADnoteUI" "PADnoteUI" "EffUI" "BankUI" "PartUI" "MicrotonalUI" "MasterUI" "MasterMiscUI" "ParametersUI" "ConsoleUI" "VectorUI" "MidiLearnUI" ) set (guitmp generated-gui-sources) file (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/${guitmp}") # workaround fltk_wrap_ui breakage set (FltkUI_sources) set (FltkUI_headers) foreach(basename ${FltkUI_names}) set (fluidfile "${CMAKE_CURRENT_SOURCE_DIR}/UI/${basename}.fl") set (sourcefile "${basename}.cpp") set (headerfile "${basename}.h") add_custom_command( OUTPUT ${sourcefile} WORKING_DIRECTORY ${guitmp} COMMAND ${FLTK_FLUID_EXECUTABLE} ARGS -c -o .cpp ${fluidfile} COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${sourcefile} .. COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${headerfile} .. DEPENDS ${fluidfile} ) set (FltkUI_sources ${FltkUI_sources} "${sourcefile}") set (FltkUI_headers ${FltkUI_headers} "${headerfile}") endforeach(basename ${FltkUI_names}) set (FltkUI_sources ${FltkUI_sources} UI/DynamicTooltip.cpp UI/WidgetPDial.cpp UI/WidgetCheckButton.cpp UI/WidgetSpinner.cpp UI/WidgetMWSlider.cpp UI/MiscGui.cpp UI/Splash.cpp UI/ScaleTrackedWindow.cpp ) set (YOSHI_INCLUDES ${FLTK_INCLUDE_DIR}) endif () add_definitions ( -D'YOSHIMI_VERSION="${YOSHIMI_VERSION}"' -D'BASE_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}"' -DYOSHI_FIFO_DIR="${FifoDirectory}" ) add_definitions (-DYOSHIMI="yoshimi") if (ShowNoteOnTimes) add_definitions (-DREPORT_NOTE_ON_TIME) endif () if (ReportNoteEvents) add_definitions (-DREPORT_NOTES_ON_OFF) endif () if (JackSessionSupport) message(STATUS "With jack session support") add_definitions(-DJACK_SESSION) else() message(STATUS "Without jack session support") endif () # Check for jack latency API >= 0.120.1 check_c_source_compiles ( "#include int main(int argc, char **argv) { if (jack_set_latency_callback) return 0; else return 1; }" HasJackLatency ) if (HasJackLatency) add_definitions(-DJACK_LATENCY) endif () set (ProgSources ${Interface_Sources} ${CLI_Sources} ${Misc_sources} ${Params_sources} ${Synth_sources} ${DSP_sources} ${Effects_sources} ${MusicIO_sources} ${FltkUI_sources} ) include_directories (AFTER ${MXML_INCLUDE_DIRS} ${ALSA_INCLUDE_DIRS} ${JACK_INCLUDE_DIRS} ${FONTCONFIG_INCLUDE_DIRS} ${FLTK_INCLUDE_DIR} ${FFTW3F_INCLUDE_DIRS} ${LIBCAIRO_INCLUDE_DIRS} ${Readline_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} ) set(ExternLibraries ${FONTCONFIG_LIBRARIES} ${FLTK_LIBRARIES} ${MXML_LIBRARIES} ${ALSA_LIBRARIES} ${JACK_LINK_LIBRARIES} ${LIBSNDFILE_LIBRARIES} ${FFTW3F_LIBRARIES} ${LIBCAIRO_LIBRARIES} ${CURSES_LIBRARIES} ${Readline_LIBRARY} ${ZLIB_LIBRARIES} ${LIBDL_LINUX} ${CMAKE_THREAD_LIBS_INIT} ) if ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") link_directories(/usr/local/lib) endif () add_executable (yoshimi ${ProgSources} main.cpp) target_link_libraries (yoshimi ${ExternLibraries}) if (ARGP_LIB) target_link_libraries (yoshimi ${ARGP_LIB}) endif () if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") target_link_libraries (yoshimi atomic) endif () install (TARGETS yoshimi RUNTIME DESTINATION bin) install (DIRECTORY ../banks DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/yoshimi FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) install (DIRECTORY ../doc/examples DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/yoshimi FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) install (DIRECTORY ../presets DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/yoshimi FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) install (DIRECTORY ../doc/ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/yoshimi FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/yoshimi.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/../desktop/yoshimi.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/../desktop/64/yoshimi.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/64x64/apps) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/../desktop/128/yoshimi.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/../desktop/256/yoshimi.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/../desktop/yoshimi.svg DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/../desktop/yoshimi_alt.svg DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/../desktop/metainfo/yoshimi.metainfo.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/../desktop/yoshimi.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) set_directory_properties (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${FltkUI_headers}" ) add_custom_target (showversion COMMAND echo -n "Version: " COMMAND cat version.txt COMMAND echo WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) configure_file(${CMAKE_SOURCE_DIR}/version.txt ${CMAKE_SOURCE_DIR}/../doc/yoshimi_user_guide/files/yoshimi_user_guide_version COPYONLY ) # clean sweep add_custom_target (distclean COMMAND rm -f ${CMAKE_SOURCE_DIR}/*.log COMMAND rm -f ${CMAKE_SOURCE_DIR}/Makefile COMMAND rm -f ${CMAKE_SOURCE_DIR}/install_manifest.txt COMMAND rm -f ${CMAKE_SOURCE_DIR}/cmake_install.cmake COMMAND find ${CMAKE_SOURCE_DIR} -type f -name CMakeCache.txt | xargs -r rm -f COMMAND find ${CMAKE_SOURCE_DIR} -type d -name CMakeFiles | xargs -r rm -rf COMMAND find ${CMAKE_SOURCE_DIR} -type f -name "*.marks" | xargs -r rm -f COMMAND rm -f ${CMAKE_SOURCE_DIR}/LV2_Plugin/Makefile COMMAND rm -f ${CMAKE_SOURCE_DIR}/LV2_Plugin/cmake_install.cmake COMMAND rm -f ${CMAKE_SOURCE_DIR}/LV2_Plugin/ -type d -name CMakeFiles | xargs -r rm -rff WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) if (LV2Plugin) if (NOT BuildWithFLTK) message(FATAL_ERROR "Can't build LV2 headless") endif () if (EXISTS $ENV{LV2_PATH}) set(LV2_INSTALL_DIR $ENV{LV2_PATH} CACHE PATH "Specifies where the LV2 libraries should be installed") else() set(LV2_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/lv2 CACHE PATH "Specifies where the LV2 libraries should be installed") endif () pkg_check_modules(LV2 REQUIRED lv2>=1.0.0) add_subdirectory(LV2_Plugin) endif () yoshimi-2.3.5.1/src/DSP/000077500000000000000000000000001506652756400145765ustar00rootroot00000000000000yoshimi-2.3.5.1/src/DSP/AnalogFilter.cpp000066400000000000000000000342651506652756400176630ustar00rootroot00000000000000/* AnalogFilter.cpp Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2021, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original */ #include #include "DSP/AnalogFilter.h" #include "Misc/SynthEngine.h" #include "Misc/NumericFuncs.h" using func::decibel; AnalogFilter::AnalogFilter(SynthEngine& _synth, uchar _type, float _freq, float _q, uchar _stages, float dBgain) : x{} , y{} , oldx{} , oldy{} , type{_type} , stages{_stages} , freq{_freq} , q{_q} , gain{decibel(dBgain)} , order{0} // will be set in computefiltercoefs() , c{0} // zero-init , d{0} , oldc{0} , oldd{0} , needsinterpolation{false} , firsttime{true} , abovenq{false} , oldabovenq{false} , tmpismp{0} , synth{_synth} { if (stages >= MAX_FILTER_STAGES) stages = MAX_FILTER_STAGES; cleanup(); firsttime = false; setfreq_and_q(_freq, _q); firsttime = true; outgain = 1.0f; } AnalogFilter::AnalogFilter(AnalogFilter const& orig) : Filter_{orig} , y{orig.y} , oldx{orig.oldx} , oldy{orig.oldy} , type{orig.type} , stages{orig.stages} , freq{orig.freq} , q{orig.q} , gain{orig.gain} , order{orig.order} , c{orig.c} , d{orig.d} , oldc{orig.oldc} , oldd{orig.oldd} , needsinterpolation{orig.needsinterpolation} , firsttime{orig.firsttime} , abovenq{orig.abovenq} , oldabovenq{orig.oldabovenq} , tmpismp{0} // No need to copy sample data, as this is filled from input data , synth{orig.synth} { } void AnalogFilter::cleanup() { for (int i = 0; i < MAX_FILTER_STAGES + 1; ++i) { x[i].c1 = x[i].c2 = y[i].c1 = y[i].c2 = 0.0f; oldx[i] = x[i]; oldy[i] = y[i]; } d[0] = 0; // never used needsinterpolation = false; } void AnalogFilter::computefiltercoefs() { double tmp; double omega, sn, cs, alpha, beta; bool zerocoefs = false; // this is used if the freq is too high // do not allow frequencies bigger than samplerate/2 float freq = this->freq; if (freq > (synth.halfsamplerate_f - 500.0f)) { freq = synth.halfsamplerate_f - 500.0f; zerocoefs = true; } if (freq < 0.1f) freq = 0.1; // do not allow bogus Q if (q < 0.0f) q = 0.0f; double tmpq; double tmpgain; if (stages == 0) { tmpq = q; tmpgain = gain; } else { tmpq = (q > 1.0f) ? pow(q, 1.0 / (stages + 1)) : q; tmpgain = pow(gain, 1.0 / (stages + 1)); } // most of these are implementations of // the "Cookbook formulae for audio EQ" by Robert Bristow-Johnson // The original location of the Cookbook is: // http://www.harmony-central.com/Computer/Programming/Audio-EQ-Cookbook.txt // (Remark 2021: URL went offline in 2005; content can still be found on archive.org): // https://web.archive.org/web/20050404051659/http://www.harmony-central.com/Computer/Programming/Audio-EQ-Cookbook.txt // Note: filter coefficients are computed using doubles, // to get reproducible numbers under optimisation on different compilers/platforms switch (type) { case TOPLEVEL::filter::Low1: // LPF 1 pole if (not zerocoefs) tmp = exp(-TWOPI * freq / synth.samplerate_f); else tmp = 0.0; c[0] = 1.0 - tmp; c[1] = 0.0f; c[2] = 0.0f; d[1] = tmp; d[2] = 0.0f; order = 1; break; case TOPLEVEL::filter::High1: // HPF 1 pole if (not zerocoefs) tmp = exp(-TWOPI * freq / synth.samplerate_f); else tmp = 0.0f; c[0] = (1.0 + tmp) / 2.0; c[1] = -(1.0 + tmp) / 2.0; c[2] = 0.0f; d[1] = tmp; d[2] = 0.0f; order = 1; break; case TOPLEVEL::filter::Low2:// LPF 2 poles if (not zerocoefs) { omega = TWOPI * freq / synth.samplerate_f; sn = sin(omega); cs = cos(omega); alpha = sn / (2.0 * tmpq); tmp = 1 + alpha; c[1] = (1.0 - cs) / tmp; c[0] = c[2] = c[1] / 2.0; d[1] = -2.0 * cs / tmp * -1.0; d[2] = (1.0 - alpha) / tmp * -1.0; } else { c[0] = 1.0f; c[1] = c[2] = d[1] = d[2] = 0.0f; } order = 2; break; case TOPLEVEL::filter::High2: // HPF 2 poles if (not zerocoefs) { omega = TWOPI * freq / synth.samplerate_f; sn = sin(omega); cs = cos(omega); alpha = sn / (2.0 * tmpq); tmp = 1 + alpha; c[0] = (1.0 + cs) / 2.0 / tmp; c[1] = -(1.0 + cs) / tmp; c[2] = (1.0 + cs) / 2.0 / tmp; d[1] = -2.0 * cs / tmp * -1.0; d[2] = (1.0 - alpha) / tmp * -1.0; } else c[0] = c[1] = c[2] = d[1] = d[2] = 0.0f; order = 2; break; case TOPLEVEL::filter::Band2: // BPF 2 poles if (not zerocoefs) { omega = TWOPI * freq / synth.samplerate_f; sn = sin(omega); cs = cos(omega); alpha = sn / (2.0 * tmpq); tmp = 1.0 + alpha; c[0] = alpha / tmp * sqrt(tmpq + 1.0); c[1] = 0.0f; c[2] = -alpha / tmp * sqrt(tmpq + 1.0); d[1] = -2.0 * cs / tmp * -1.0; d[2] = (1.0 - alpha) / tmp * -1.0; } else c[0] = c[1] = c[2] = d[1] = d[2] = 0.0f; order = 2; break; case TOPLEVEL::filter::Notch2: // NOTCH 2 poles if (not zerocoefs) { omega = TWOPI * freq / synth.samplerate_f; sn = sin(omega); cs = cos(omega); alpha = sn / (2.0 * sqrt(tmpq)); tmp = 1.0 + alpha; c[0] = 1.0 / tmp; c[1] = -2.0 * cs / tmp; c[2] = 1.0 / tmp; d[1] = -2.0 * cs / tmp * -1.0; d[2] = (1.0 - alpha) / tmp * -1.0; } else { c[0] = 1.0f; c[1] = c[2] = d[1] = d[2] = 0.0f; } order = 2; break; case TOPLEVEL::filter::Peak2: // PEAK (2 poles) if (not zerocoefs) { omega = TWOPI * freq / synth.samplerate_f; sn = sin(omega); cs = cos(omega); tmpq *= 3.0; alpha = sn / (2.0 * tmpq); tmp = 1.0 + alpha / tmpgain; c[0] = (1.0 + alpha * tmpgain) / tmp; c[1] = (-2.0 * cs) / tmp; c[2] = (1.0 - alpha * tmpgain) / tmp; d[1] = -2.0 * cs / tmp * -1.0; d[2] = (1.0 - alpha / tmpgain) / tmp * -1.0; } else { c[0] = 1.0f; c[1] = c[2] = d[1] = d[2] = 0.0f; } order = 2; break; case TOPLEVEL::filter::LowShelf2: // Low Shelf - 2 poles if (not zerocoefs) { omega = TWOPI * freq / synth.samplerate_f; sn = sin(omega); cs = cos(omega); tmpq = sqrt(tmpq); alpha = sn / (2.0 * tmpq); beta = sqrt(tmpgain) / tmpq; tmp = (tmpgain + 1.0) + (tmpgain - 1.0) * cs + beta * sn; c[0] = tmpgain * ((tmpgain + 1.0) - (tmpgain - 1.0) * cs + beta * sn) / tmp; c[1] = 2.0 * tmpgain * ((tmpgain - 1.0) - (tmpgain + 1.0) * cs) / tmp; c[2] = tmpgain * ((tmpgain + 1.0) - (tmpgain - 1.0) * cs - beta * sn) / tmp; d[1] = -2.0 * ((tmpgain - 1.0) + (tmpgain + 1.0) * cs) / tmp * -1.0; d[2] = ((tmpgain + 1.0) + (tmpgain - 1.0) * cs - beta * sn) / tmp * -1.0; } else { c[0] = tmpgain; c[1] = c[2] = d[1] = d[2] = 0.0f; } order = 2; break; case TOPLEVEL::filter::HighShelf2: // High Shelf - 2 poles if (not zerocoefs) { omega = TWOPI * freq / synth.samplerate_f; sn = sin(omega); cs = cos(omega); tmpq = sqrt(tmpq); alpha = sn / (2.0 * tmpq); beta = sqrt(tmpgain) / tmpq; tmp = (tmpgain + 1.0) - (tmpgain - 1.0) * cs + beta * sn; c[0] = tmpgain * ((tmpgain + 1.0) + (tmpgain - 1.0) * cs + beta * sn) / tmp; c[1] = -2.0 * tmpgain * ((tmpgain - 1.0) + (tmpgain + 1.0) * cs) / tmp; c[2] = tmpgain * ((tmpgain + 1.0) + (tmpgain - 1.0) * cs - beta * sn) / tmp; d[1] = 2.0 * ((tmpgain - 1.0) - (tmpgain + 1.0) * cs) / tmp * -1.0; d[2] = ((tmpgain + 1.0) - (tmpgain - 1.0) * cs - beta * sn) / tmp * -1.0; } else { c[0] = 1.0f; c[1] = c[2] = d[1] = d[2] = 0.0f; } order = 2; break; default: // wrong type so give it the simplest type = TOPLEVEL::filter::Low1; computefiltercoefs(); break; } } float AnalogFilter::getFreq() { return this->freq; } void AnalogFilter::setfreq(float frequency) { if (frequency < 0.1f) frequency = 0.1f; float rap = freq / frequency; if (rap < 1.0f) rap = 1.0f / rap; oldabovenq = abovenq; abovenq = frequency > (synth.halfsamplerate_f - 500.0f); int nyquistthresh = (abovenq != oldabovenq); if (!firsttime && (rap > 3.0f || nyquistthresh != 0)) { // if the frequency is changed fast, it needs interpolation // (now, filter and coefficients backup) interpolatenextbuffer(); } freq = frequency; computefiltercoefs(); firsttime = false; } void AnalogFilter::setfreq_and_q(float frequency, float q_) { q = q_; setfreq(frequency); } void AnalogFilter::setq(float q_) { q = q_; computefiltercoefs(); } void AnalogFilter::settype(int t) { type = t>0? t : 0; computefiltercoefs(); } void AnalogFilter::setgain(float dBgain) { gain = decibel(dBgain); computefiltercoefs(); } void AnalogFilter::setstages(int stages_) { if (stages_ >= MAX_FILTER_STAGES) stages_ = MAX_FILTER_STAGES - 1; stages = stages_; cleanup(); computefiltercoefs(); } void AnalogFilter::interpolatenextbuffer() { if (needsinterpolation) // Don't repeat the coefficient saving, because if interpolation was // requested due to multiple parameters, some values may already have // changed. The oldest coefficient are the correct ones, basically. return; oldc = c; oldd = d; oldx = x; oldy = y; needsinterpolation = true; } void AnalogFilter::singlefilterout(float* smp, FStage& x, FStage& y, Coeffs const& c, Coeffs const& d) { float y0; if (order == 1) { // First order filter for (int i = 0; i < synth.sent_buffersize; ++i) { // anti-denormal added in here y0 = (smp[i] + float(1e-20)) * c[0] + x.c1 * c[1] + y.c1 * d[1]; y.c1 = y0; x.c1 = smp[i]; smp[i] = y0; // out it goes } } if (order == 2) { // Second order filter for (int i = 0; i < synth.sent_buffersize; ++i) { // anti-denormal added in here y0 = (smp[i] + float(1e-20)) * c[0] + x.c1 * c[1] + x.c2 * c[2] + y.c1 * d[1] + y.c2 * d[2]; y.c2 = y.c1; y.c1 = y0; x.c2 = x.c1; x.c1 = smp[i]; smp[i] = y0; // out it goes } } } void AnalogFilter::filterout(float* smp) { if (needsinterpolation) { if (not tmpismp) // allocate interpolation buffer on first usage tmpismp.reset(synth.buffersize); memcpy(tmpismp.get(), smp, synth.sent_bufferbytes); for (uint i = 0; i < stages + 1; ++i) singlefilterout(tmpismp.get(), oldx[i], oldy[i], oldc, oldd); } for (uint i = 0; i < stages + 1; ++i) singlefilterout(smp, x[i], y[i], c, d); if (needsinterpolation) { for (int i = 0; i < synth.sent_buffersize; ++i) { float x = (float)i / synth.sent_buffersize_f; smp[i] = tmpismp[i] * (1.0f - x) + smp[i] * x; } needsinterpolation = false; } for (int i = 0; i < synth.sent_buffersize; ++i) smp[i] *= outgain; } /** @return Response for a given frequency, as numeric factor */ float AnalogFilter::calcFilterResponse(float freq) const { float fr = freq / synth.samplerate_f * PI * 2.0f; float x = c[0], y = 0.0f; for (int n = 1; n < 3; ++n) { x += cosf(n * fr) * c[n]; y -= sinf(n * fr) * c[n]; } float h = x * x + y * y; x = 1.0f; y = 0.0f; for (int n = 1; n < 3; ++n) { x -= cosf(n * fr) * d[n]; y += sinf(n * fr) * d[n]; } h = h / (x * x + y * y); return powf(h, (stages + 1.0f) / 2.0f); } yoshimi-2.3.5.1/src/DSP/AnalogFilter.h000066400000000000000000000071441506652756400173240ustar00rootroot00000000000000/* Analog Filter.h - Several analog filters (lowpass, highpass...) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original, modified April 2011 */ #ifndef ANALOG_FILTER_H #define ANALOG_FILTER_H #include "DSP/Filter_.h" #include "Misc/Alloc.h" #include "globals.h" #include class SynthEngine; class AnalogFilter : public Filter_ { public: ~AnalogFilter() = default; AnalogFilter(SynthEngine&, uchar _type, float _freq, float _q, uchar _stages, float dBgain =1.0); Filter_* clone() override { return new AnalogFilter(*this); }; // can be cloned and moved, but not assigned AnalogFilter(AnalogFilter const&); AnalogFilter(AnalogFilter&&) = default; AnalogFilter& operator=(AnalogFilter&&) = delete; AnalogFilter& operator=(AnalogFilter const&) = delete; void filterout(float* smp); void setfreq(float); float getFreq(); void setfreq_and_q(float frequency, float q_); void setq(float); void settype(int type_); void setgain(float dBgain); void setstages(int stages_); // Request that the next buffer be interpolated. Should be called before // changing parameters so that coefficients can be saved. void interpolatenextbuffer(); void cleanup(); float calcFilterResponse(float freq) const; static constexpr uint MAX_TYPES = 1 + TOPLEVEL::filter::HighShelf2; // NOTE: change this if adding new filter types private: struct FStage { float c1{0}, c2{0}; }; using FStages = std::array; FStages x,y,oldx,oldy; uint type; // The type of the filter (LPF1,HPF1,LPF2,HPF2...) uint stages; // how many times the filter is applied (0->1,1->2,etc.) float freq; // Frequency given in Hz float q; // Q factor (resonance or Q factor) float gain; // the gain of the filter (if are shelf/peak) filters uint order; // the order of the filter (number of poles) using Coeffs = std::array; Coeffs c, d; // coefficients Coeffs oldc, oldd; // old coefficients (used to interpolate on fast changes) bool needsinterpolation, firsttime; bool abovenq; // if frequency is above the nyquist bool oldabovenq; // (last state to determine if it needs interpolation) Samples tmpismp; // used if it needs interpolation in filterout() SynthEngine& synth; void singlefilterout(float* smp, FStage& x, FStage& y, Coeffs const& c, Coeffs const& d); void computefiltercoefs(); }; #endif /*ANALOG_FILTER_H*/ yoshimi-2.3.5.1/src/DSP/FFTwrapper.h000066400000000000000000000323401506652756400167710ustar00rootroot00000000000000/* FFTwrapper.h - A wrapper for Fast Fourier Transforms Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2021, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code, modified March 2011 */ #ifndef FFT_WRAPPER_H #define FFT_WRAPPER_H #include #include #include #include #include #include #include #include namespace fft { /* Explanation of Memory usage and layout * * Yoshimi uses the "half-complex" format of libFFTW3 * http://fftw.org/fftw3_doc/The-Halfcomplex_002dformat-DFT.html#The-Halfcomplex_002dformat-DFT * * Note: the transforms implemented in libFFTW3 are unnormalised, so invoking smps2freqs followed by * invoking freqs2smps on the same data will result in the original waveform scaled by N. * * Generally speaking, Fourier transform is an operation on complex numbers; however, in signal processing * the waveform is a function of real numbers and thus the imaginary part will always be zero. For such * a function, the spectrum (result of the Fourier transform) exhibits the "Hermite Symmetry": Given a * waveform with N samples, line(N/2) in the spectrum corresponds to the Nyquist frequency and will * have an imaginary part of 0*i. And line(N-k) will be the conjugate of line(k), i.e. have the same * real part and an imaginary part with flipped sign. This can be exploited to yield a speedup of * factor two in the Fourier operations, but requires the non-redundant information to be arranged * in memory according to the following scheme: * r0, r1, r2, ..., r(N/2-1), r(N/2), i(N/2-1), ..., i2, i1, [ i0 ] * * Here, r0 is the spectral line for freq = 0Hz, i.e. the DC-offset, r(N/2) is the spectral line for * the Nyquist frequency and can be ignored in practice. The following imaginary parts (the "sine * coefficients) encode the phase information; i0 is always zero and thus likewise ignored. * * In practice, the Synth code typically works directly on the "cosine" and "sine" coefficients, * indexing them with 0 ... N-1. Thus, for practical reasons, the Spectrum type provides accessor * functions c(i) and s(i). To simplify handling, an additional slot at index N will be allocated, * so that s(0) = coeff[N-0] is a valid expression (not out-of-bounds), but never passed to libFFTW3, * while coeff[N/2] is always set to zero and never accessed. * * For optimised implementation with SIMD operations (SSE, AVX, Altivec), libFFTW3 requires strict * alignment rules, which can be ensured by allocating memory through fftw_malloc (which allocates * some extra slots and then adjusts the start point to match the required alignment. Thus, all * data is encapsulated into the fft::Spectrum and fft::Waveform types, which automate allocations. * The Synth->oscilsize corresponds to FFTwrapper::tableSize(). * * Lib FFTW3 builds a "FFT plan" for each operation, to optimise for the table size, the alignment, * for in-place vs. in/out data (Yoshimi always uses the latter case). In theory, this plan could * be optimised further by automatic performance tuning at start-up; but this would require to * run test-transforms on each application start-up and thus we just use the default FFTW_ESTIMATE, * which never touches the data pointers on plan generation and just guesses a suitable execution * plan. Another relevant flag is FFTW_PRESERVE_INPUT, which forces libFFTW to preserve input data; * FFTW could gain some additional performance when it is allowed to corrupt input data, however * for the usage pattern in a Synth it is more important to avoid additional allocations and * copying of data; thus we run each OscilGen with the fixed initial data allocation and pass * these data arrays directly to libFFTW, ensuring proper alignment and memory layout. */ class Calc; /* ===== automatically manage fftw_malloc allocated memory ===== */ struct Deleter { void operator()(float* target) { fftwf_free(target); } }; class Data : public std::unique_ptr { static float* allocate(size_t elemCnt) { if (elemCnt == 0) // allow to create an empty Data holder return nullptr; size_t allocsize = (elemCnt) * sizeof(float); void* mem = fftwf_malloc(allocsize); if (!mem) throw std::bad_alloc(); return static_cast(mem); } public: using _unique_ptr = std::unique_ptr; Data(size_t fftsize) : _unique_ptr{allocate(fftsize)} { } /** discard existing allocation and possibly create/manage new allocation */ void reset(size_t newSize =0) { _unique_ptr::reset(allocate(newSize)); } float & operator[](size_t i) { return get()[i]; } float const& operator[](size_t i) const { return get()[i]; } }; /* Spectrum coefficients - properly arranged for Fourier-operations through libFFTW3 */ class Spectrum { size_t siz; // tableSize == 2*spectrumSize Data coeff; friend class Calc; // allowed to access raw data public: // can not be copied or moved Spectrum(Spectrum&&) = delete; Spectrum(Spectrum const&) = delete; Spectrum& operator=(Spectrum&&) = delete; // copy-assign other spectrum values Spectrum& operator=(Spectrum const& src) { if (this != &src) { assert(src.size() == siz/2); for (size_t i=0; i <= siz; ++i) coeff[i] = src.coeff[i]; } return *this; } // automatic memory-management Spectrum(size_t spectrumSize) : siz{2*spectrumSize} , coeff{siz+1} { reset(); } void reset() { size_t allocsize = (siz+1) * sizeof(float); memset(coeff.get(), 0, allocsize); } size_t size() const { return siz/2; } // array-like access float & c(size_t i) { assert(i<=siz/2); return coeff[i]; } float const& c(size_t i) const { assert(i<=siz/2); return coeff[i]; } float & s(size_t i) { assert(i<=siz/2); return coeff[siz - i]; } float const& s(size_t i) const { assert(i<=siz/2); return coeff[siz - i]; } }; /* Waveform data - properly aligned for libFFTW3 Fourier-operations */ class Waveform { size_t siz; Data samples; friend class Calc; // allowed to access raw data public: static constexpr size_t INTERPOLATION_BUFFER = 5; // can only be moved, not copied Waveform(Waveform&&) = default; Waveform(Waveform const&) = delete; Waveform& operator=(Waveform&&) = delete; // copy-assign other waveform sample data Waveform& operator=(Waveform const& src) { if (this != &src) { assert(src.size() == siz); for (size_t i=0; i < siz+INTERPOLATION_BUFFER; ++i) { samples[i] = src[i]; } } return *this; } // automatic memory-management Waveform(size_t tableSize) : siz{tableSize} , samples{siz+INTERPOLATION_BUFFER} { reset(); } void reset() { size_t allocsize = (siz+INTERPOLATION_BUFFER) * sizeof(float); memset(samples.get(), 0, allocsize); } /* redundantly append the first elements for interpolation */ void fillInterpolationBuffer() { assert(samples); for (size_t i = 0; i < INTERPOLATION_BUFFER; ++i) samples[siz+i] = samples[i]; } size_t size() const { return siz; } // array subscript operator float & operator[](size_t i) { assert(i cache; std::mutex mtx_createPlan; using Guard = std::lock_guard; public: FFTplan retrieve_or_create_Plan(size_t fftSize) { Guard lock(mtx_createPlan); auto pos = cache.find(fftSize); if (pos != cache.end()) return FFTplan{pos->second}; auto res = cache.emplace(fftSize, FFTplan{fftSize}); assert(res.second); return FFTplan{res.first->second}; } }; inline FFTplan getPlan(size_t fftSize) { static FFTplanRepo planRepo; return planRepo.retrieve_or_create_Plan(fftSize); } /* Calculator for standard Fourier Transform operations: * A wrapper to invoke (I)FFT for a predetermined table size. * - on creation, a suitable plan is fetched from the FFTplanRepo * - if no plan exists for the given size, a new one is created. * - retrieval or plan generation is protected by a global mutex * - the actual FFT can be invoked concurrently, without any locking. */ class Calc { size_t fftsize; FFTplan plan; public: Calc(size_t fftSiz) : fftsize{fftSiz} , plan{getPlan(fftsize)} { } // shall not be copied or moved Calc(Calc&&) = delete; Calc(Calc const&) = delete; Calc& operator=(Calc&&) = delete; Calc& operator=(Calc const&) = delete; size_t tableSize() const { return fftsize; } size_t spectrumSize() const { return fftsize / 2; } /* Fast Fourier Transform */ void smps2freqs(Waveform const& smps, Spectrum& freqs) { size_t half_size{spectrumSize()}; assert (half_size == freqs.size()); assert (fftsize == smps.size()); fftwf_execute_r2r(plan.fourier, smps.samples.get(), freqs.coeff.get()); freqs.c(half_size) = 0.0; // Nyquist line is irrelevant and never used freqs.s(0) = 0.0; // Phase of DC offset (not calculated by libFFTW3) } /* Fast Inverse Fourier Transform */ void freqs2smps(Spectrum const& freqs, Waveform& smps) { assert (spectrumSize() == freqs.size()); fftwf_execute_r2r(plan.inverse, freqs.coeff.get(), smps.samples.get()); } }; }//(End)namespace fft #endif /*FFT_WRAPPER_H*/ yoshimi-2.3.5.1/src/DSP/Filter.cpp000066400000000000000000000052641506652756400165360ustar00rootroot00000000000000/* Filter.cpp - Filters, uses analog,formant,etc. filters Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2020 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #include "DSP/Filter.h" #include "Misc/NumericFuncs.h" using func::decibel; using func::power; Filter_* Filter::buildImpl(SynthEngine& synth) { uchar type = params.Ptype; uchar stages = params.Pstages; switch (category) { case 1 : return new FormantFilter(&synth, ¶ms); case 2 : return new SVFilter(&synth, type, 1000.0f, params.getq(), stages); default: return new AnalogFilter(synth, type, 1000.0f, params.getq(), stages); } } void Filter::updateCurrentParameters() { switch (category) { case 1: // Handled inside filter. break; case 2: filterImpl->outgain = decibel(params.getgain()); if (filterImpl->outgain > 1.0f) filterImpl->outgain = sqrtf(filterImpl->outgain); break; default: uchar Ftype = params.Ptype; if (Ftype >= 6 and Ftype <= 8) filterImpl->setgain(params.getgain()); else filterImpl->outgain = decibel(params.getgain()); break; } } void Filter::filterout(float *smp) { if (parsUpdate.checkUpdated()) updateCurrentParameters(); filterImpl->filterout(smp); } void Filter::setfreq(float frequency) { filterImpl->setfreq(frequency); } void Filter::setfreq_and_q(float frequency, float q_) { filterImpl->setfreq_and_q(frequency, q_); } void Filter::setq(float q_) { filterImpl->setq(q_); } float Filter::getrealfreq(float freqpitch) { if (category == 0 || category == 2) return power<2>(freqpitch + 9.96578428f); // log2(1000)=9.95748 else return freqpitch; } yoshimi-2.3.5.1/src/DSP/Filter.h000066400000000000000000000046421506652756400162020ustar00rootroot00000000000000/* Filter.h - Filters, uses analog,formant,etc. filters Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2020 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #ifndef FILTER_H #define FILTER_H #include "DSP/Filter_.h" #include "DSP/AnalogFilter.h" #include "DSP/FormantFilter.h" #include "DSP/SVFilter.h" #include "Params/FilterParams.h" #include class SynthEngine; class Filter { public: ~Filter() = default; Filter(FilterParams& p, SynthEngine& synth) : category{p.Pcategory} , params{p} , parsUpdate{p} , filterImpl{buildImpl(synth)} { updateCurrentParameters(); } // can be cloned Filter(Filter const& o) : category{o.category} , params{o.params} , parsUpdate{o.parsUpdate} , filterImpl{o.filterImpl->clone()} { }; // can be moved, but not assigned Filter(Filter&&) = default; Filter& operator=(Filter&&) = delete; Filter& operator=(Filter const&) = delete; void filterout(float *smp); void setfreq(float frequency); void setfreq_and_q(float frequency, float q_); void setq(float q_); float getrealfreq(float freqpitch); private: Filter_* buildImpl(SynthEngine&); void updateCurrentParameters(); uchar category; FilterParams& params; ParamBase::ParamsUpdate parsUpdate; std::unique_ptr filterImpl; }; #endif yoshimi-2.3.5.1/src/DSP/Filter_.h000066400000000000000000000030001506652756400163240ustar00rootroot00000000000000/* Filter_.h - This class is inherited by filter classes Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2018, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. Modified October 2018 */ #ifndef FILTER__H #define FILTER__H class Filter_ { public: Filter_() : outgain{0.0} { }; virtual ~Filter_() { }; virtual Filter_* clone() = 0; virtual void filterout(float *smp) = 0; virtual void setfreq(float frequency) = 0; virtual void setfreq_and_q(float frequency, float q_) = 0; virtual void setq(float q_) = 0; virtual void setgain(float /* dBgain */) { }; float outgain; }; #endif yoshimi-2.3.5.1/src/DSP/FormantFilter.cpp000066400000000000000000000203141506652756400200560ustar00rootroot00000000000000/* FormantFilter.cpp - formant filters Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009, James Morris Copyright 2009-2011, Alan Calvert Copyright 2020-2021 Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #include "DSP/FormantFilter.h" #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Misc/NumericFuncs.h" using synth::aboveAmplitudeThreshold; using synth::interpolateAmplitude; using func::decibel; using func::powFrac; using func::power; FormantFilter::FormantFilter(SynthEngine* _synth, FilterParams* pars_): pars(pars_), parsUpdate(*pars_), synth(_synth), inbuffer(synth->buffersize), tmpbuff (synth->buffersize) { numformants = pars->Pnumformants; for (int i = 0; i < numformants; ++i) formant[i] = new AnalogFilter(*synth, TOPLEVEL::filter::Band2, 1000.0f, 10.0f, pars->Pstages); cleanup(); for (int i = 0; i < FF_MAX_FORMANTS; ++i) oldformantamp[i] = 1.0f; for (int i = 0; i < numformants; ++i) { currentformants[i].freq = 1000.0f; currentformants[i].amp = 1.0f; currentformants[i].q = 2.0f; } sequencesize = pars->Psequencesize; if (sequencesize == 0) sequencesize = 1; for (int k = 0; k < sequencesize; ++k) sequence[k].nvowel = pars->Psequence[k].nvowel; oldinput = -1.0f; oldQfactor = Qfactor; firsttime = 1; // Prevent parameter update happening next time. parsUpdate.checkUpdated(); // And do it now. updateCurrentParameters(); } FormantFilter::FormantFilter(const FormantFilter &orig) : pars(orig.pars), parsUpdate(orig.parsUpdate), sequencesize(orig.sequencesize), numformants(orig.numformants), firsttime(orig.firsttime), oldinput(orig.oldinput), slowinput(orig.slowinput), Qfactor(orig.Qfactor), formantslowness(orig.formantslowness), oldQfactor(orig.oldQfactor), vowelclearness(orig.vowelclearness), sequencestretch(orig.sequencestretch), synth(orig.synth), // These don't hold persistent state and don't need a memcpy inbuffer(synth->buffersize), tmpbuff (synth->buffersize) { outgain = orig.outgain; memcpy(formantpar, orig.formantpar, sizeof(formantpar)); memcpy(currentformants, orig.currentformants, sizeof(currentformants)); memcpy(sequence, orig.sequence, sizeof(sequence)); memcpy(oldformantamp, orig.oldformantamp, sizeof(oldformantamp)); for (int i = 0; i < numformants; ++i) formant[i] = new AnalogFilter(*orig.formant[i]); } FormantFilter::~FormantFilter() { for (int i = 0; i < numformants; ++i) delete(formant[i]); } void FormantFilter::cleanup() { for (int i = 0; i < numformants; ++i) formant[i]->cleanup(); } void FormantFilter::setpos(float input) { int p1, p2; bool needsUpdate = parsUpdate.checkUpdated(); if (needsUpdate) updateCurrentParameters(); if (firsttime) slowinput = input; else slowinput = slowinput * (1.0f - formantslowness) + input * formantslowness; if (!needsUpdate && (fabsf(oldinput-input) < 0.001f) && (fabsf(slowinput - input) < 0.001f) && (fabsf(Qfactor - oldQfactor) < 0.001f)) { // oldinput=input; daca setez asta, o sa faca probleme la schimbari foarte lente firsttime = 0; return; } else oldinput = input; float pos = input * sequencestretch; pos -= floorf(pos); p2 = (int)(pos * sequencesize); p1 = p2 - 1; if (p1 < 0) p1 += sequencesize; pos = pos * sequencesize; pos -= floorf(pos); pos = (atanf((pos * 2.0f - 1.0f) * vowelclearness) / atanf(vowelclearness) + 1.0f) * 0.5f; p1 = sequence[p1].nvowel; p2 = sequence[p2].nvowel; if (firsttime) { for (int i = 0; i < numformants; ++i) { currentformants[i].freq = formantpar[p1][i].freq * (1.0f - pos) + formantpar[p2][i].freq * pos; currentformants[i].amp = formantpar[p1][i].amp * (1.0f - pos) + formantpar[p2][i].amp * pos; currentformants[i].q = formantpar[p1][i].q * (1.0f - pos) + formantpar[p2][i].q * pos; formant[i]->setfreq_and_q(currentformants[i].freq, currentformants[i].q * Qfactor); oldformantamp[i] = currentformants[i].amp; } firsttime = 0; } else { for (int i = 0; i < numformants; ++i) { currentformants[i].freq = currentformants[i].freq * (1.0f - formantslowness) + (formantpar[p1][i].freq * (1.0f - pos) + formantpar[p2][i].freq * pos) * formantslowness; currentformants[i].amp = currentformants[i].amp * (1.0f - formantslowness) + (formantpar[p1][i].amp * (1.0f - pos) + formantpar[p2][i].amp * pos) * formantslowness; currentformants[i].q = currentformants[i].q * (1.0f - formantslowness) + (formantpar[p1][i].q * (1.0f - pos) + formantpar[p2][i].q * pos) * formantslowness; formant[i]->setfreq_and_q(currentformants[i].freq, currentformants[i].q * Qfactor); } } oldQfactor = Qfactor; } void FormantFilter::updateCurrentParameters() { for (int j = 0; j < FF_MAX_VOWELS; ++j) { for (int i = 0; i < numformants; ++i) { formantpar[j][i].freq = pars->getformantfreq(pars->Pvowels[j].formants[i].freq); formantpar[j][i].amp = pars->getformantamp(pars->Pvowels[j].formants[i].amp); formantpar[j][i].q = pars->getformantq(pars->Pvowels[j].formants[i].q); } } formantslowness = powf(1.0f - (pars->Pformantslowness / 128.0f), 3.0f); vowelclearness = power<10>((pars->Pvowelclearness - 32.0f) / 48.0f); sequencestretch = powFrac<10>((pars->Psequencestretch - 32.0f) / 48.0f); if (pars->Psequencereversed) sequencestretch *= -1.0f; outgain = decibel(pars->getgain()); Qfactor = pars->getq(); } void FormantFilter::setfreq(float frequency) { setpos(frequency); } void FormantFilter::setq(float q_) { Qfactor = q_; for (int i = 0; i setq(Qfactor * currentformants[i].q); } void FormantFilter::setfreq_and_q(float frequency, float q_) { Qfactor = q_; setpos(frequency); } void FormantFilter::filterout(float *smp) { memcpy(inbuffer.get(), smp, synth->sent_bufferbytes); memset(smp, 0, synth->sent_bufferbytes); for (int j = 0; j < numformants; ++j) { for (int k = 0; k < synth->sent_buffersize; ++k) tmpbuff[k] = inbuffer[k] * outgain; formant[j]->filterout(tmpbuff.get()); if (aboveAmplitudeThreshold(oldformantamp[j], currentformants[j].amp)) { for (int i = 0; i < synth->sent_buffersize; ++i) smp[i] += tmpbuff[i] * interpolateAmplitude(oldformantamp[j], currentformants[j].amp, i, synth->sent_buffersize); } else { for (int i = 0; i < synth->sent_buffersize; ++i) smp[i] += tmpbuff[i] * currentformants[j].amp; } oldformantamp[j] = currentformants[j].amp; } } yoshimi-2.3.5.1/src/DSP/FormantFilter.h000066400000000000000000000046471506652756400175360ustar00rootroot00000000000000/* FormantFilter.h - formant filter Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2020 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #ifndef FORMANT_FILTER_H #define FORMANT_FILTER_H #include "Misc/Alloc.h" #include "globals.h" #include "DSP/Filter_.h" #include "DSP/AnalogFilter.h" #include "Params/FilterParams.h" class SynthEngine; class FormantFilter : public Filter_ { public: ~FormantFilter(); FormantFilter(SynthEngine*, FilterParams*); FormantFilter(FormantFilter const&); Filter_* clone() override { return new FormantFilter(*this); }; void filterout(float *smp); void setfreq(float frequency); void setfreq_and_q(float frequency, float q_); void setq(float q_); void cleanup(); private: void setpos(float input); void updateCurrentParameters(); FilterParams *pars; ParamBase::ParamsUpdate parsUpdate; AnalogFilter *formant[FF_MAX_FORMANTS]; struct { float freq, amp, q; // frequency,amplitude,Q } formantpar[FF_MAX_VOWELS][FF_MAX_FORMANTS], currentformants[FF_MAX_FORMANTS]; struct { unsigned char nvowel; } sequence [FF_MAX_SEQUENCE]; float oldformantamp[FF_MAX_FORMANTS]; int sequencesize, numformants, firsttime; float oldinput, slowinput; float Qfactor, formantslowness, oldQfactor; float vowelclearness, sequencestretch; SynthEngine *synth; Samples inbuffer; Samples tmpbuff; }; #endif yoshimi-2.3.5.1/src/DSP/SVFilter.cpp000066400000000000000000000114641506652756400170060ustar00rootroot00000000000000/* SVFilter.cpp - Several state-variable filters Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2020-2021 Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #include #include "Misc/SynthEngine.h" #include "DSP/SVFilter.h" #include "Misc/NumericFuncs.h" SVFilter::SVFilter(SynthEngine *_synth, uchar _type, float _freq, float _q, uchar Fstages) : type(_type), stages(Fstages), freq(_freq), q(_q), needsinterpolation(0), firsttime(1), tmpismp(_synth->buffersize), synth(_synth) { if (stages >= MAX_FILTER_STAGES) stages = MAX_FILTER_STAGES; outgain = 1.0f; cleanup(); setfreq_and_q(_freq, _q); } SVFilter::SVFilter(const SVFilter &orig) : par(orig.par), ipar(orig.ipar), type(orig.type), stages(orig.stages), freq(orig.freq), q(orig.q), abovenq(orig.abovenq), oldabovenq(orig.oldabovenq), needsinterpolation(orig.needsinterpolation), firsttime(orig.firsttime), tmpismp(orig.synth->buffersize), synth(orig.synth) { outgain = orig.outgain; memcpy(st, orig.st, sizeof(st)); } void SVFilter::cleanup() { for (int i = 0; i < MAX_FILTER_STAGES + 1; ++i) st[i].low = st[i].high = st[i].band = st[i].notch = 0.0f; oldabovenq = 0; abovenq = 0; } void SVFilter::computefiltercoefs() { // calculations done in doubles for better portability of results par.f = double(freq) / synth->samplerate * 4.0; if (par.f > 0.99999f) par.f = 0.99999f; double qq = 1.0 - atan(sqrt(q)) * 2.0 / PI; par.q = pow(qq, 1.0 / (stages + 1)); par.q_sqrt = sqrt(qq); } void SVFilter::setfreq(float frequency) { if (frequency < 0.1f) frequency = 0.1f; float rap = freq / frequency; if (rap < 1.0f) rap = 1.0f / rap; oldabovenq = abovenq; abovenq = frequency > (synth->halfsamplerate_f - 500.0f); int nyquistthresh = (abovenq ^ oldabovenq); if (rap > 3.0f || nyquistthresh != 0) { //if the frequency is changed fast, it needs interpolation (now, filter and coefficients backup) if (firsttime == 0) needsinterpolation = 1; ipar = par; } freq = frequency; computefiltercoefs(); firsttime = 0; } void SVFilter::setfreq_and_q(float frequency, float q_) { q = q_; setfreq(frequency); } void SVFilter::setq(float q_) { q = q_; computefiltercoefs(); } void SVFilter::settype(int type_) { type = type_; computefiltercoefs(); } void SVFilter::setstages(int stages_) { if (stages_ >= MAX_FILTER_STAGES) stages_ = MAX_FILTER_STAGES - 1; stages = stages_; cleanup(); computefiltercoefs(); } void SVFilter::singlefilterout(float *smp, fstage &x, parameters &par) { float *out = NULL; switch (type) { case 0: out = &x.low; break; case 1: out = &x.high; break; case 2: out = &x.band; break; case 3: out = &x.notch; break; } for (int i = 0; i < synth->sent_buffersize; ++i) { x.low = x.low + par.f * x.band; x.high = par.q_sqrt * smp[i] - x.low - par.q * x.band; x.band = par.f * x.high + x.band; x.notch = x.high + x.low; smp[i] = (*out); } } void SVFilter::filterout(float *smp) { if (needsinterpolation) { memcpy(tmpismp.get(), smp, synth->sent_bufferbytes); for (int i = 0; i < stages + 1; ++i) singlefilterout(tmpismp.get(), st[i],ipar); } for (int i = 0; i < stages + 1; ++i) singlefilterout(smp, st[i],par); if (needsinterpolation) { for (int i = 0; i < synth->sent_buffersize; ++i) { float x = (float)i / synth->sent_buffersize_f; smp[i] = tmpismp[i] * (1.0f - x) + smp[i] * x; } needsinterpolation = 0; } for (int i = 0; i < synth->sent_buffersize; ++i) smp[i] *= outgain; } yoshimi-2.3.5.1/src/DSP/SVFilter.h000066400000000000000000000047071506652756400164550ustar00rootroot00000000000000/* SVFilter.h - Several state-variable filters Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2020 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original */ #ifndef SV_FILTER_H #define SV_FILTER_H #include "DSP/Filter_.h" #include "Misc/Alloc.h" class SynthEngine; class SVFilter : public Filter_ { public: ~SVFilter() = default; SVFilter(SynthEngine* _synth, uchar Ftype, float Ffreq, float Fq, uchar Fstages); SVFilter(SVFilter const& orig); Filter_* clone() override { return new SVFilter(*this); }; void filterout(float* smp); void setfreq(float frequency); void setfreq_and_q(float frequency, float q_); void setq(float q_); void settype(int type_); void setstages(int stages_); void cleanup(); private: struct fstage { float low, high, band, notch; } st[MAX_FILTER_STAGES + 1]; struct parameters { float f, q, q_sqrt; } par, ipar; void singlefilterout(float* smp, fstage& x, parameters& par); void computefiltercoefs(); int type; // The type of the filter (LPF1,HPF1,LPF2,HPF2...) int stages; // how many times the filter is applied (0->1,1->2,etc.) float freq; // Frequency given in Hz float q; // Q factor (resonance or Q factor) int abovenq; // this is 1 if the frequency is above the nyquist int oldabovenq; int needsinterpolation, firsttime; Samples tmpismp; // used if it needs interpolation in filterout() SynthEngine *synth; }; #endif yoshimi-2.3.5.1/src/DSP/Unison.cpp000066400000000000000000000136131506652756400165610ustar00rootroot00000000000000/* Unison.cpp - Unison effect (multivoice chorus) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original Modified January 2019 */ #include #include #include #include "Misc/Config.h" #include "Misc/NumericFuncs.h" #include "DSP/Unison.h" using func::power; Unison::Unison(int update_period_samples_, float max_delay_sec_, SynthEngine* _synth) : unison_size{0} , base_freq{1.0f} , max_delay{std::max(10, int(_synth->samplerate_f * max_delay_sec_) + 1)} , delay_k{0} , first_time{false} , voice{} , delay_buffer{new float[max_delay]{0}} // zero-init , update_period_samples{update_period_samples_} , update_period_sample_k{0} , unison_amplitude_samples{0.0f} , unison_bandwidth_cents{10.0f} , synth{_synth} { setSize(1); } void Unison::setSize(int new_size) { if (new_size < 1) new_size = 1; unison_size = new_size; voice.reset(new UnisonVoice[unison_size]); for (int i = 0; i < unison_size; ++i) { voice [i].setPosition(synth->numRandom() * 1.8f - 0.9f); } first_time = true; updateParameters(); } void Unison::setBaseFrequency(float freq) { base_freq = freq; updateParameters(); } void Unison::setBandwidth(float bandwidth) { if (bandwidth < 0) bandwidth = 0.0f; if (bandwidth > 1200.0f) bandwidth = 1200.0f; //#warning // : todo: if bandwidth is too small the audio will be self cancelled (because of the sign change of the outputs) unison_bandwidth_cents = bandwidth; updateParameters(); } void Unison::updateParameters() { if (!voice) return; float increments_per_second = synth->samplerate_f / float(update_period_samples); for (int i = 0; i < unison_size; ++i) { float base = powf(UNISON_FREQ_SPAN, synth->numRandom() * 2.0f - 1.0f); voice[i].relative_amplitude = base; float period = base / base_freq; float m = 4.0f / (period * increments_per_second); if (synth->numRandom() < 0.5f) m = -m; voice[i].step = m; } float max_speed = power<2>(unison_bandwidth_cents / 1200.0f); unison_amplitude_samples = 0.125f * (max_speed - 1.0f) * synth->samplerate_f / base_freq; //#warning // todo: test if unison_amplitude_samples is to big and reallocate bigger memory if (unison_amplitude_samples >= max_delay - 1) unison_amplitude_samples = max_delay - 2; updateUnisonData(); } void Unison::process(int bufsize, float* inbuf, float* outbuf) { if (!voice) return; if (!outbuf) outbuf = inbuf; float volume = 1.0f / sqrtf(unison_size); float xpos_step = 1.0f / update_period_samples; float xpos = float(update_period_sample_k) * xpos_step; for (int i = 0; i < bufsize; ++i) { if (update_period_sample_k++ >= update_period_samples) { updateUnisonData(); update_period_sample_k = 0; xpos = 0.0f; } xpos += xpos_step; float in = inbuf[i]; float out = 0.0f; float sign = 1.0f; for (int k = 0; k < unison_size; ++k) { float vpos = voice[k].realpos1 * (1.0f - xpos) + voice[k].realpos2 * xpos; float pos = float(delay_k + max_delay) - vpos - 1.0f; int posi = int(pos); int posi_next = posi + 1; if (posi >= max_delay) posi -= max_delay; if (posi_next >= max_delay) posi_next -= max_delay; float posf = pos - floorf(pos); out += ((1.0f - posf) * delay_buffer[posi] + posf * delay_buffer[posi_next]) * sign; sign = -sign; } outbuf[i] = out * volume; delay_buffer[delay_k] = in; delay_k = (++delay_k < max_delay) ? delay_k : 0; } } void Unison::updateUnisonData() { if (!voice) return; float newval; float pos; float step; float vibratoFactor; for (int k = 0; k < unison_size; ++k) { pos = voice[k].position; step = voice[k].step; pos += step; if (pos <= -1.0f) { pos = -1.0f; step = -step; } else if (pos >= 1.0f) { pos = 1.0f; step = -step; } vibratoFactor = (pos - 1/3.0f * pos*pos*pos) * 1.5f; //make the vibrato LFO smoother // #warning // I will use relative amplitude, so the delay might be bigger than the whole buffer // #warning // I have to enlarge (reallocate) the buffer to make place for the whole delay newval = 1.0f + 0.5f * (vibratoFactor + 1.0f) * unison_amplitude_samples * voice[k].relative_amplitude; if (first_time) voice[k].realpos1 = voice[k].realpos2 = newval; else { voice[k].realpos1 = voice[k].realpos2; voice[k].realpos2 = newval; } voice[k].position = pos; voice[k].step = step; } first_time = false; } yoshimi-2.3.5.1/src/DSP/Unison.h000066400000000000000000000050771506652756400162330ustar00rootroot00000000000000/* Unison.h - Unison effect (multivoice chorus) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (version 2 or later) for more details. You should have received a copy of the GNU General Public License (version 2) along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA This file is a derivative of a ZynAddSubFX original, modified January 2011 */ #ifndef UNISON_H #define UNISON_H #include "Misc/SynthEngine.h" #include #define UNISON_FREQ_SPAN 2.0f // how much the unison frequencies varies (always >= 1.0) class SynthEngine; class Unison { public: Unison(int update_period_samples_, float max_delay_sec_, SynthEngine*); ~Unison() = default; void setSize(int new_size); void setBaseFrequency(float freq); void setBandwidth(float bandwidth_cents); void process(int bufsize, float* inbuf, float* outbuf = nullptr); private: void updateParameters(); void updateUnisonData(); struct UnisonVoice { float step; // base LFO float position; float realpos1; // the position regarding samples float realpos2; float relative_amplitude; UnisonVoice() : step{0.0f} , position{} , realpos1{} , realpos2{} , relative_amplitude{1.0f} { } void setPosition(float newPos) { position = newPos; } }; int unison_size; float base_freq; int max_delay, delay_k; bool first_time; std::unique_ptr voice; std::unique_ptr delay_buffer; int update_period_samples; int update_period_sample_k; float unison_amplitude_samples; float unison_bandwidth_cents; SynthEngine *synth; }; #endif /*UNISON_H*/ yoshimi-2.3.5.1/src/Effects/000077500000000000000000000000001506652756400155275ustar00rootroot00000000000000yoshimi-2.3.5.1/src/Effects/Alienwah.cpp000066400000000000000000000215161506652756400177700ustar00rootroot00000000000000/* Alienwah.cpp - "AlienWah" effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2021, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include "Misc/SynthEngine.h" #include "Effects/Alienwah.h" using std::complex; Alienwah::Alienwah(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine& _synth) : Effect(insertion_, efxoutl_, efxoutr_, NULL, 0, _synth), lfo(synth), oldl(NULL), oldr(NULL) { setpreset(Ppreset); cleanup(); oldclfol = complex(fb, 0.0); oldclfor = complex(fb, 0.0); Pchanged = false; } Alienwah::~Alienwah() { if (oldl != NULL) delete [] oldl; if (oldr != NULL) delete [] oldr ; } // Apply the effect void Alienwah::out(float *smpsl, float *smpsr) { outvolume.advanceValue(synth.sent_buffersize); for (int i = 0; i < synth.sent_buffersize; ++i) { smpsl[i] += float(1e-20); // anti-denormal smpsr[i] += float(1e-20); // anti-denormal } float lfol; float lfor; // Left/Right LFOs complex clfol, clfor, out, tmp; lfo.effectlfoout(&lfol, &lfor); lfol *= depth * TWOPI; lfor *= depth * TWOPI; clfol = complex(cosf(lfol + phase) * fb, sinf(lfol + phase) * fb); //rework clfor = complex(cosf(lfor + phase) * fb, sinf(lfor + phase) * fb); //rework for (int i = 0; i < synth.sent_buffersize; ++i) { float x = (float)i / synth.sent_buffersize_f; float x1 = 1.0f - x; // left tmp = clfol * x + oldclfol * x1; out = tmp * oldl[oldk]; out += (1 - abs(fb)) * smpsl[i] * pangainL.getAndAdvanceValue(); oldl[oldk] = out; float l = out.real() * 10.0f * (fb + 0.1f); // right tmp = clfor * x + oldclfor * x1; out = tmp * oldr[oldk]; out += (1 - abs(fb)) * smpsr[i] * pangainR.getAndAdvanceValue(); oldr[oldk] = out; float r = out.real() * 10.0f * (fb + 0.1f); if (++oldk >= Pdelay) oldk = 0; // LRcross efxoutl[i] = l * (1.0f - lrcross.getValue()) + r * lrcross.getValue(); efxoutr[i] = r * (1.0f - lrcross.getValue()) + l * lrcross.getValue(); lrcross.advanceValue(); } oldclfol = clfol; oldclfor = clfor; } // Cleanup the effect void Alienwah::cleanup() { Effect::cleanup(); for (int i = 0; i < Pdelay; ++i) { oldl[i] = complex(0.0f, 0.0f); oldr[i] = complex(0.0f, 0.0f); } oldk = 0; lfo.resetState(); } // Parameter control void Alienwah::setdepth(uchar _depth) { Pdepth = _depth; depth = Pdepth / 127.0f; } void Alienwah::setfb(uchar _fb) { Pfb = _fb; fb = fabs((Pfb - 64.0f) / 64.1f); fb = sqrtf(fb); if (fb < 0.4f) fb = 0.4f; if (Pfb < 64) fb = -fb; } void Alienwah::setvolume(uchar _volume) { Pvolume = _volume; float tmp = Pvolume / 127.0f; outvolume.setTargetValue(tmp); if (insertion == 0) volume.setTargetValue(1.0f); else volume.setTargetValue(tmp); } void Alienwah::setphase(uchar _phase) { Pphase = _phase; phase = (Pphase - 64.0f) / 64.0f * PI; } void Alienwah::setdelay(uchar _delay) { if (oldl != NULL) delete [] oldl; if (oldr != NULL) delete [] oldr; Pdelay = _delay; oldl = new complex[Pdelay]; oldr = new complex[Pdelay]; cleanup(); } void Alienwah::setpreset(uchar npreset) { if (npreset < 0xf) { if (npreset >= alienNUM_PRESETS) npreset = alienNUM_PRESETS - 1; for (int n = 0; n < alienPRESET_SIZE; ++n) changepar(n, alienPresets[npreset][n]); if (insertion) changepar(0, alienPresets[npreset][0] / 2); // lower the volume if this is insertion effect // All presets use no BPM syncing. changepar(EFFECT::control::bpm, 0); Ppreset = npreset; } else { uchar preset = npreset & 0xf; uchar param = npreset >> 4; if (param == 0xf) param = 0; changepar(param, alienPresets[preset][param]); if (insertion && (param == 0)) changepar(0, alienPresets[preset][0] / 2); } Pchanged = false; } void Alienwah::changepar(int npar, uchar value) { if (npar == -1) { Pchanged = (value != 0); return; } switch (npar) { case 0: setvolume(value); break; case 1: setpanning(value); break; case 2: lfo.Pfreq = value; lfo.updateparams(); break; case 3: lfo.Prandomness = value; lfo.updateparams(); break; case 4: lfo.PLFOtype = value; lfo.updateparams(); break; case 5: lfo.Pstereo = value; lfo.updateparams(); break; case 6: setdepth(value); break; case 7: setfb(value); break; case 8: setdelay(value); break; case 9: setlrcross(value); break; case 10: setphase(value); break; case EFFECT::control::bpm: lfo.Pbpm = value; break; case EFFECT::control::bpmStart: lfo.PbpmStart = value; break; } Pchanged = true; } uchar Alienwah::getpar(int npar) const { switch (npar) { case -1: return Pchanged; case 0: return Pvolume; case 1: return Ppanning; case 2: return lfo.Pfreq; case 3: return lfo.Prandomness; case 4: return lfo.PLFOtype; case 5: return lfo.Pstereo; case 6: return Pdepth; case 7: return Pfb; case 8: return Pdelay; case 9: return Plrcross; case 10: return Pphase; case EFFECT::control::bpm: return lfo.Pbpm; case EFFECT::control::bpmStart: return lfo.PbpmStart; default: break; } return 0; } float Alienlimit::getlimits(CommandBlock *getData) { int value = getData->data.value; int control = getData->data.control; int request = getData->data.type & TOPLEVEL::type::Default; // clear flags int npart = getData->data.part; int presetNum = getData->data.engine; int min = 0; int max = 127; int def = alienPresets[presetNum][control]; uchar canLearn = TOPLEVEL::type::Learnable; uchar isInteger = TOPLEVEL::type::Integer; switch (control) { case 0: if (npart != TOPLEVEL::section::systemEffects) // system effects def /= 2; break; case 1: break; case 2: break; case 3: break; case 4: max = 1; canLearn = 0; break; case 5: break; case 6: break; case 7: break; case 8: max = 100; canLearn = 0; break; case 9: break; case 10: break; case EFFECT::control::bpm: max = 1; canLearn = 0; break; case EFFECT::control::bpmStart: break; case EFFECT::control::preset: max = 3; canLearn = 0; break; default: getData->data.type |= TOPLEVEL::type::Error; // error return 1.0f; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } getData->data.type |= (canLearn + isInteger); return float(value); } yoshimi-2.3.5.1/src/Effects/Alienwah.h000066400000000000000000000054341506652756400174360ustar00rootroot00000000000000/* Alienwah.h - "AlienWah" effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. Modified March 2019 */ #ifndef ALIENWAH_H #define ALIENWAH_H #include #include "Effects/Effect.h" #include "Effects/EffectLFO.h" static const int alienPRESET_SIZE = 11; static const int alienNUM_PRESETS = 4; static const uchar alienPresets[alienNUM_PRESETS][alienPRESET_SIZE] = { // AlienWah1 { 127, 64, 70, 0, 0, 62, 60, 105, 25, 0, 64 }, // AlienWah2 { 127, 64, 73, 106, 0, 101, 60, 105, 17, 0, 64 }, // AlienWah3 { 127, 64, 63, 0, 1, 100, 112, 105, 31, 0, 42 }, // AlienWah4 { 93, 64, 25, 0, 1, 66, 101, 11, 47, 0, 86 } }; class SynthEngine; class Alienwah : public Effect { public: Alienwah(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine&); ~Alienwah(); void out(float* smpsl, float* smpsr) override; void setpreset(uchar npreset) override; void changepar(int npar, uchar value) override; uchar getpar(int npar) const override; void cleanup() override; private: // Alienwah Parameters bool Pchanged; EffectLFO lfo; // lfo-ul Alienwah uchar Pvolume; uchar Pdepth; // the depth of the Alienwah uchar Pfb; // feedback uchar Pdelay; uchar Pphase; // Control Parameters void setvolume(uchar Pvolume_); void setdepth(uchar Pdepth_); void setfb(uchar Pfb_); void setdelay(uchar Pdelay_); void setphase(uchar Pphase_); // Internal Values float fb, depth, phase; std::complex *oldl, *oldr; std::complex oldclfol, oldclfor; int oldk; }; class Alienlimit { public: float getlimits(CommandBlock *getData); }; #endif yoshimi-2.3.5.1/src/Effects/Chorus.cpp000066400000000000000000000233221506652756400175000ustar00rootroot00000000000000/* Chorus.cpp - Chorus and Flange effects Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2024, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include "Misc/SynthEngine.h" #include "Misc/NumericFuncs.h" #include "Effects/Chorus.h" using func::power; #define MAX_CHORUS_DELAY 250.0f // ms Chorus::Chorus(bool insertion_, float *const efxoutl_, float *efxoutr_, SynthEngine& _synth) : Effect(insertion_, efxoutl_, efxoutr_, NULL, 0, _synth), lfo(synth), fb(0, synth.samplerate) { dlk = drk = 0; maxdelay = (int)(MAX_CHORUS_DELAY / 1000.0f * synth.samplerate_f); delayl = new float[maxdelay]; delayr = new float[maxdelay]; setpreset(Ppreset); changepar(1, 64); lfo.effectlfoout(&lfol, &lfor); dl2 = getdelay(lfol); dr2 = getdelay(lfor); Pchanged = false; cleanup(); } // get the delay value in samples; xlfo is the current lfo value float Chorus::getdelay(float xlfo) { float result = (Pflangemode) ? 0 : (delay + xlfo * depth) * synth.samplerate_f; //check if it is too big delay (caused bu erroneous setDelay() and setDepth() if ((result + 0.5) >= maxdelay) { synth.getRuntime().Log("WARNING: Chorus.C::getDelay(..) too big delay (see setdelay and setdepth funcs.)"); result = maxdelay - 1.0; } return result; } // Apply the effect void Chorus::out(float *smpsl, float *smpsr) { outvolume.advanceValue(synth.sent_buffersize); const float one = 1.0f; dl1 = dl2; dr1 = dr2; lfo.effectlfoout(&lfol, &lfor); dl2 = getdelay(lfol); dr2 = getdelay(lfor); float inL, inR, tmpL, tmpR, tmp; for (int i = 0; i < synth.sent_buffersize; ++i) { tmpL = smpsl[i]; tmpR = smpsr[i]; // LRcross inL = tmpL * (1.0f - lrcross.getValue()) + tmpR * lrcross.getValue(); inR = tmpR * (1.0f - lrcross.getValue()) + tmpL * lrcross.getValue(); lrcross.advanceValue(); // Left channel // compute the delay in samples using linear interpolation between the lfo delays mdel = (dl1 * (synth.sent_buffersize - i) + dl2 * i) / synth.sent_buffersize_f; if (++dlk >= maxdelay) dlk = 0; tmp = dlk - mdel + maxdelay * 2.0f; // where should I get the sample from dlhi = int(tmp); dlhi %= maxdelay; dlhi2 = (dlhi - 1 + maxdelay) % maxdelay; dllo = 1.0f - fmodf(tmp, one); efxoutl[i] = delayl[dlhi2] * dllo + delayl[dlhi] * (1.0f - dllo); delayl[dlk] = inL + efxoutl[i] * fb.getValue(); // Right channel // compute the delay in samples using linear interpolation between the lfo delays mdel = (dr1 * (synth.sent_buffersize - i) + dr2 * i) / synth.sent_buffersize_f; if (++drk >= maxdelay) drk = 0; tmp = drk * 1.0f - mdel + maxdelay * 2.0f; // where should I get the sample from dlhi = int(tmp); dlhi %= maxdelay; dlhi2 = (dlhi - 1 + maxdelay) % maxdelay; dllo = 1.0f - fmodf(tmp, one); efxoutr[i] = delayr[dlhi2] * dllo + delayr[dlhi] * (1.0f - dllo); delayr[dlk] = inR + efxoutr[i] * fb.getValue(); fb.advanceValue(); } if (Poutsub) for (int i = 0; i < synth.sent_buffersize; ++i) { efxoutl[i] *= -1.0f; efxoutr[i] *= -1.0f; } for (int i = 0; i < synth.sent_buffersize; ++i) { efxoutl[i] *= pangainL.getAndAdvanceValue(); efxoutr[i] *= pangainR.getAndAdvanceValue(); } } // Cleanup the effect void Chorus::cleanup() { Effect::cleanup(); fb.pushToTarget(); for (int i = 0; i < maxdelay; ++i) delayl[i] = delayr[i] = 0.0f; lfo.resetState(); } // Parameter control void Chorus::setdepth(unsigned char Pdepth_) { Pdepth = Pdepth_; depth = (power<8>((Pdepth / 127.0f) * 2.0f) - 1.0f) / 1000.0f; // seconds } void Chorus::setdelay(unsigned char Pdelay_) { Pdelay = Pdelay_; delay = (power<10>((Pdelay / 127.0f) * 2.0f) - 1.0f) / 1000.0f; // seconds } void Chorus::setfb(unsigned char Pfb_) { Pfb = Pfb_; fb.setTargetValue((Pfb - 64.0f) / 64.1f); } void Chorus::setvolume(unsigned char Pvolume_) { Pvolume = Pvolume_; outvolume.setTargetValue(Pvolume / 127.0f); volume.setTargetValue((!insertion) ? 1.0f : outvolume.getTargetValue()); } void Chorus::setpreset(unsigned char npreset) { if (npreset < 0xf) { if (npreset >= chorusNUM_PRESETS) npreset = chorusNUM_PRESETS - 1; for (int n = 0; n < chorusPRESET_SIZE; ++n) changepar(n, chorusPresets[npreset][n]); // All presets use no BPM syncing. changepar(EFFECT::control::bpm, 0); Ppreset = npreset; } else { unsigned char preset = npreset & 0xf; unsigned char param = npreset >> 4; if (param == 0xf) param = 0; changepar(param, chorusPresets[preset][param]); if (insertion && (param == 0)) changepar(0, chorusPresets[preset][0] / 2); } Pchanged = false; } void Chorus::changepar(int npar, unsigned char value) { if (npar == -1) { Pchanged = (value != 0); return; } Pchanged = true; switch (npar) { case 0: setvolume(value); break; case 1: setpanning(value); break; case 2: lfo.Pfreq = value; lfo.updateparams(); break; case 3: lfo.Prandomness = value; lfo.updateparams(); break; case 4: lfo.PLFOtype = value; lfo.updateparams(); break; case 5: lfo.Pstereo = value; lfo.updateparams(); break; case 6: setdepth(value); break; case 7: setdelay(value); break; case 8: setfb(value); break; case 9: setlrcross(value); break; case 10: Pflangemode = (value > 1) ? 1 : value; break; case 11: Poutsub = (value > 1) ? 1 : value; break; case EFFECT::control::bpm: lfo.Pbpm = value; break; case EFFECT::control::bpmStart: lfo.PbpmStart = value; break; default: Pchanged = false; break; } } unsigned char Chorus::getpar(int npar) const { switch (npar) { case -1: return Pchanged; case 0: return Pvolume; case 1: return Ppanning; case 2: return lfo.Pfreq; case 3: return lfo.Prandomness; case 4: return lfo.PLFOtype; case 5: return lfo.Pstereo; case 6: return Pdepth; case 7: return Pdelay; case 8: return Pfb; case 9: return Plrcross; case 10: return Pflangemode; case 11: return Poutsub; case EFFECT::control::bpm: return lfo.Pbpm; case EFFECT::control::bpmStart: return lfo.PbpmStart; default: return 0; } } float Choruslimit::getlimits(CommandBlock *getData) { int value = getData->data.value; int control = getData->data.control; int request = getData->data.type & TOPLEVEL::type::Default; // clear flags int presetNum = getData->data.engine; int min = 0; int max = 127; int def = chorusPresets[presetNum][control]; unsigned char canLearn = TOPLEVEL::type::Learnable; unsigned char isInteger = TOPLEVEL::type::Integer; switch (control) { case 0: break; case 1: break; case 2: break; case 3: break; case 4: max = 1; canLearn = 0; break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; case 11: max = 1; canLearn = 0; break; case EFFECT::control::bpm: max = 1; canLearn = 0; break; case EFFECT::control::bpmStart: break; case EFFECT::control::preset: max = 9; canLearn = 0; break; default: getData->data.type |= TOPLEVEL::type::Error; return 1.0f; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } getData->data.type |= (canLearn + isInteger); return float(value); } yoshimi-2.3.5.1/src/Effects/Chorus.h000066400000000000000000000072701506652756400171510ustar00rootroot00000000000000/* Chorus.h - Chorus and Flange effects Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. Modified March 2019 */ #ifndef CHORUS_H #define CHORUS_H #include "Effects/Effect.h" #include "Effects/EffectLFO.h" static const int chorusPRESET_SIZE = 12; static const int chorusNUM_PRESETS = 10; static const unsigned char chorusPresets[chorusNUM_PRESETS][chorusPRESET_SIZE] = { // Chorus1 { 64, 64, 50, 0, 0, 90, 40, 85, 64, 119, 0, 0 }, // Chorus2 {64, 64, 45, 0, 0, 98, 56, 90, 64, 19, 0, 0 }, // Chorus3 {64, 64, 29, 0, 1, 42, 97, 95, 90, 127, 0, 0 }, // Celeste1 {64, 64, 26, 0, 0, 42, 115, 18, 90, 127, 0, 0 }, // Celeste2 {64, 64, 29, 117, 0, 50, 115, 9, 31, 127, 0, 1 }, // Flange1 {64, 64, 57, 0, 0, 60, 23, 3, 62, 0, 0, 0 }, // Flange2 {64, 64, 33, 34, 1, 40, 35, 3, 109, 0, 0, 0 }, // Flange3 {64, 64, 53, 34, 1, 94, 35, 3, 54, 0, 0, 1 }, // Flange4 {64, 64, 40, 0, 1, 62, 12, 19, 97, 0, 0, 0 }, // Flange5 {64, 64, 55, 105, 0, 24, 39, 19, 17, 0, 0, 1 } }; class SynthEngine; class Chorus : public Effect { public: Chorus(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine&); ~Chorus() = default; void out(float *smpsl, float *smpsr) override; void setpreset(unsigned char npreset) override; void changepar(int npar, unsigned char value) override; unsigned char getpar(int npar) const override; void cleanup() override; private: // Chorus Parameters bool Pchanged; unsigned char Pvolume; unsigned char Pdepth; // the depth of the Chorus(ms) unsigned char Pdelay; // the delay (ms) unsigned char Pfb; // feedback unsigned char Pflangemode; // how the LFO is scaled, to result chorus or flange unsigned char Poutsub; // if I wish to subtract the output instead of the adding it EffectLFO lfo; // lfo-ul chorus // Parameter Controls void setvolume(unsigned char Pvolume_); void setdepth(unsigned char Pdepth_); void setdelay(unsigned char Pdelay_); void setfb(unsigned char Pfb_); float getdelay(float xlfo); // Internal Values float depth; float delay; synth::InterpolatedValue fb; float dl1; float dl2; float dr1; float dr2; float lfol; float lfor; float *delayl; float *delayr; int maxdelay; int dlk; int drk; int dlhi; int dlhi2; float dllo; float mdel; }; class Choruslimit { public: float getlimits(CommandBlock *getData); }; #endif yoshimi-2.3.5.1/src/Effects/Distorsion.cpp000066400000000000000000000233111506652756400203700ustar00rootroot00000000000000/* Distorsion.cpp - Distortion effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018 -2021, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Effects/Distorsion.h" #include "Misc/NumericFuncs.h" using func::power; using func::powFrac; using func::decibel; Distorsion::Distorsion(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine& _synth) : Effect(insertion_, efxoutl_, efxoutr_, NULL, 0, _synth), Pvolume(50), Pdrive(90), Plevel(64), Ptype(0), Pnegate(0), Plpf(127), Phpf(0), Pstereo(1), Pprefiltering(0), level(0, synth.samplerate), lpffr(0, synth.samplerate), hpffr(0, synth.samplerate) { level.setTargetValue(Plevel / 127.0f); lpfl = new AnalogFilter(synth, TOPLEVEL::filter::Low2, 22000, 1, 0); lpfr = new AnalogFilter(synth, TOPLEVEL::filter::Low2, 22000, 1, 0); hpfl = new AnalogFilter(synth, TOPLEVEL::filter::High2, 20, 1, 0); hpfr = new AnalogFilter(synth, TOPLEVEL::filter::High2, 20, 1, 0); setpreset(Ppreset); changepar(2, 35); Pchanged = false; cleanup(); } Distorsion::~Distorsion() { delete lpfl; delete lpfr; delete hpfl; delete hpfr; } // Cleanup the effect void Distorsion::cleanup() { Effect::cleanup(); level.pushToTarget(); lpffr.pushToTarget(); hpffr.pushToTarget(); lpfl->cleanup(); hpfl->cleanup(); lpfr->cleanup(); hpfr->cleanup(); } // Apply the filters void Distorsion::applyfilters(float *efxoutl, float *efxoutr) { float fr; fr = lpffr.getValue(); lpffr.advanceValue(synth.sent_buffersize); if (fr != lpffr.getValue()) { lpfl->interpolatenextbuffer(); lpfl->setfreq(lpffr.getValue()); lpfr->interpolatenextbuffer(); lpfr->setfreq(lpffr.getValue()); } lpfl->filterout(efxoutl); lpfr->filterout(efxoutr); fr = hpffr.getValue(); hpffr.advanceValue(synth.sent_buffersize); if (fr != hpffr.getValue()) { hpfl->interpolatenextbuffer(); hpfl->setfreq(hpffr.getValue()); hpfr->interpolatenextbuffer(); hpfr->setfreq(hpffr.getValue()); } hpfl->filterout(efxoutl); hpfr->filterout(efxoutr); } // Effect output void Distorsion::out(float *smpsl, float *smpsr) { outvolume.advanceValue(synth.sent_buffersize); float inputdrive = power<5>((Pdrive - 32.0f) / 127.0f); if (Pnegate) inputdrive *= -1.0f; if (Pstereo) // Stereo { for (int i = 0; i < synth.sent_buffersize; ++i) { efxoutl[i] = smpsl[i] * inputdrive * pangainL.getAndAdvanceValue(); efxoutr[i] = smpsr[i] * inputdrive * pangainR.getAndAdvanceValue(); } } else // Mono for (int i = 0; i < synth.sent_buffersize; ++i) efxoutl[i] = inputdrive * (smpsl[i] * pangainL.getAndAdvanceValue() + smpsr[i]* pangainR.getAndAdvanceValue()) * 0.7f; if (Pprefiltering) applyfilters(efxoutl, efxoutr); waveShapeSmps(synth.sent_buffersize, efxoutl, Ptype + 1, Pdrive); if (Pstereo) waveShapeSmps(synth.sent_buffersize, efxoutr, Ptype + 1, Pdrive); if (!Pprefiltering) applyfilters(efxoutl, efxoutr); if (!Pstereo) memcpy(efxoutr, efxoutl, synth.sent_bufferbytes); for (int i = 0; i < synth.sent_buffersize; ++i) { float lvl = decibel<-40>(1.0f - 1.5f * level.getAndAdvanceValue()); float lout = efxoutl[i]; float rout = efxoutr[i]; float l = lout * (1.0f - lrcross.getValue()) + rout * lrcross.getValue(); float r = rout * (1.0f - lrcross.getValue()) + lout * lrcross.getValue(); lrcross.advanceValue(); lout = l; rout = r; efxoutl[i] = lout * 2.0f * lvl; efxoutr[i] = rout * 2.0f * lvl; } } // Parameter control void Distorsion::setvolume(unsigned char Pvolume_) { Pvolume = Pvolume_; float tmp = Pvolume / 127.0f; if (insertion == 0) { outvolume.setTargetValue(4.0f * powFrac<100>(1.0f - tmp)); volume.setTargetValue(1.0f); } else { volume.setTargetValue(tmp); outvolume.setTargetValue(tmp); } if (Pvolume == 0.0f) cleanup(); } void Distorsion::setlpf(unsigned char Plpf_) { Plpf = Plpf_; lpffr.setTargetValue(expf(powf(Plpf / 127.0f, 0.5f) * logf(25000.0f)) + 40.0f); } void Distorsion::sethpf(unsigned char Phpf_) { Phpf = Phpf_; hpffr.setTargetValue(expf(powf(Phpf / 127.0f, 0.5f) * logf(25000.0f)) + 20.0f); } void Distorsion::setpreset(unsigned char npreset) { if (npreset < 0xf) { if (npreset >= distNUM_PRESETS) npreset = distNUM_PRESETS - 1; for (int n = 0; n < distPRESET_SIZE; ++n) changepar(n, distPresets[npreset][n]); if (insertion) changepar(0, distPresets[npreset][0] / 2); // lower the volume if this is insertion effect Ppreset = npreset; } else { unsigned char preset = npreset & 0xf; unsigned char param = npreset >> 4; if (param == 0xf) param = 0; changepar(param, distPresets[preset][param]); if (insertion && (param == 0)) changepar(0, distPresets[preset][0] / 2); } cleanup(); Pchanged = false; } void Distorsion::changepar(int npar, unsigned char value) { if (npar == -1) { Pchanged = (value != 0); return; } switch (npar) { case 0: setvolume(value); break; case 1: setpanning(value); break; case 2: setlrcross(value); break; case 3: Pdrive = value; break; case 4: Plevel = value; level.setTargetValue(Plevel / 127.0f); break; case 5: if (value > 13) Ptype = 13; // this must be increased if more distortion types are added else Ptype = value; break; case 6: if (value > 1) Pnegate = 1; else Pnegate = value; break; case 7: setlpf(value); break; case 8: sethpf(value); break; case 9: Pstereo = (value > 0) ? 1 : 0; break; case 10: Pprefiltering = value; break; } Pchanged = true; } unsigned char Distorsion::getpar(int npar) const { switch (npar) { case -1: return Pchanged; case 0: return Pvolume; case 1: return Ppanning; case 2: return Plrcross; case 3: return Pdrive; case 4: return Plevel; case 5: return Ptype; case 6: return Pnegate; case 7: return Plpf; case 8: return Phpf; case 9: return Pstereo; case 10: return Pprefiltering; default: break; } return 0; // in case of bogus parameter number } float Distlimit::getlimits(CommandBlock *getData) { int value = getData->data.value; int control = getData->data.control; int request = getData->data.type & TOPLEVEL::type::Default; // clear flags int npart = getData->data.part; int presetNum = getData->data.engine; int min = 0; int max = 127; int def = distPresets[presetNum][control]; unsigned char canLearn = TOPLEVEL::type::Learnable; unsigned char isInteger = TOPLEVEL::type::Integer; switch (control) { case 0: if (npart != TOPLEVEL::section::systemEffects) // system effects def /= 2; break; case 1: break; case 2: break; case 3: break; case 4: break; case 5: max = 13; canLearn = 0; break; case 6: max = 1; canLearn = 0; break; case 7: break; case 8: break; case 9: case 10: max = 1; canLearn = 0; break; case 16: max = 5; canLearn = 0; break; default: getData->data.type |= TOPLEVEL::type::Error; return 1.0f; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } getData->data.type |= (canLearn + isInteger); return float(value); } yoshimi-2.3.5.1/src/Effects/Distorsion.h000066400000000000000000000065011506652756400200370ustar00rootroot00000000000000/* Distorsion.h - Distortion Effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. Modified March 2019 */ #ifndef DISTORSION_H #define DISTORSION_H #include "globals.h" #include "Misc/WaveShapeSamples.h" #include "DSP/AnalogFilter.h" #include "Effects/Effect.h" const int distPRESET_SIZE = 11; const int distNUM_PRESETS = 6; const int distPresets[distNUM_PRESETS][distPRESET_SIZE] = { // Overdrive 1 { 127, 64, 35, 56, 70, 0, 0, 96, 0, 0, 0 }, // Overdrive 2 { 127, 64, 35, 29, 75, 1, 0, 127, 0, 0, 0 }, // A. Exciter 1 { 64, 64, 35, 75, 80, 5, 0, 127, 105, 1, 0 }, // A. Exciter 2 { 64, 64, 35, 85, 62, 1, 0, 127, 118, 1, 0 }, // Guitar Amp { 127, 64, 35, 63, 75, 2, 0, 55, 0, 0, 0 }, // Quantise { 127, 64, 35, 88, 75, 4, 0, 127, 0, 1, 0 } }; class SynthEngine; class Distorsion : public Effect, WaveShapeSamples { public: ~Distorsion(); Distorsion(bool insertion, float* efxoutl_, float* efxoutr_, SynthEngine&); void out(float* smpsl, float* smpr) override; void setpreset(uchar npreset) override; void changepar(int npar, uchar value) override; uchar getpar(int npar) const override; void cleanup() override; void applyfilters(float* efxoutl, float* efxoutr); private: // Parameters bool Pchanged; uchar Pvolume; // Volume or E/R uchar Pdrive; // the input amplification uchar Plevel; // the output amplification uchar Ptype; // Distortion type uchar Pnegate; // if the input is negated uchar Plpf; // Lowpass filter uchar Phpf; // Highpass filter uchar Pstereo; // 0 = mono, 1 = stereo uchar Pprefiltering; // if you want to do the filtering before the distortion void setvolume(uchar Pvolume_); void setlpf(uchar Plpf_); void sethpf(uchar Phpf_); synth::InterpolatedValue level; // Real Parameters AnalogFilter* lpfl; AnalogFilter* lpfr; AnalogFilter* hpfl; AnalogFilter* hpfr; synth::InterpolatedValue lpffr; synth::InterpolatedValue hpffr; }; class Distlimit { public: float getlimits(CommandBlock *getData); }; #endif yoshimi-2.3.5.1/src/Effects/DynamicFilter.cpp000066400000000000000000000320411506652756400207650ustar00rootroot00000000000000/* DynamicFilter.cpp Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2021, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include "Misc/SynthEngine.h" #include "Effects/DynamicFilter.h" DynamicFilter::DynamicFilter(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine& _synth) : Effect(insertion_, efxoutl_, efxoutr_, new FilterParams(0, 64, 64, 0, _synth), 0, _synth), lfo(synth), Pdepth(0), Pampsns(90), Pampsnsinv(0), Pampsmooth(60), filterl(NULL), filterr(NULL) { setvolume(110); setpreset(Ppreset); changepar(1, 64); // pan Pchanged = false; cleanup(); } DynamicFilter::~DynamicFilter() { delete filterpars; delete filterl; delete filterr; } // Apply the effect void DynamicFilter::out(float *smpsl, float *smpsr) { outvolume.advanceValue(synth.sent_buffersize); if (filterpars->changed) { filterpars->changed = false; cleanup(); } float lfol, lfor; lfo.effectlfoout(&lfol, &lfor); lfol *= depth * 5.0f; lfor *= depth * 5.0f; float freq = filterpars->getfreq(); float q = filterpars->getq(); for (int i = 0; i < synth.sent_buffersize; ++i) { memcpy(efxoutl, smpsl, synth.sent_bufferbytes); memcpy(efxoutr, smpsr, synth.sent_bufferbytes); float x = (fabsf(smpsl[i]) + fabsf(smpsr[i])) * 0.5f; ms1 = ms1 * (1.0f - ampsmooth) + x * ampsmooth + 1e-10f; } float ampsmooth2 = powf(ampsmooth, 0.2f) * 0.3f; ms2 = ms2 * (1.0f - ampsmooth2) + ms1 * ampsmooth2; ms3 = ms3 * (1.0f - ampsmooth2) + ms2 * ampsmooth2; ms4=ms4 * (1.0f - ampsmooth2) + ms3 * ampsmooth2; float rms = (sqrtf(ms4)) * ampsns; float frl = filterl->getrealfreq(freq + lfol + rms); float frr = filterr->getrealfreq(freq + lfor + rms); filterl->setfreq_and_q(frl, q); filterr->setfreq_and_q(frr, q); filterl->filterout(efxoutl); filterr->filterout(efxoutr); // panning for (int i = 0; i < synth.sent_buffersize; ++i) { efxoutl[i] *= pangainL.getAndAdvanceValue(); efxoutr[i] *= pangainR.getAndAdvanceValue(); } } // Cleanup the effect void DynamicFilter::cleanup() { Effect::cleanup(); reinitfilter(); ms1 = ms2 = ms3 = ms4 = 0.0f; lfo.resetState(); } // Parameter control void DynamicFilter::setdepth(uchar Pdepth_) { Pdepth = Pdepth_; depth = powf(Pdepth / 127.0f, 2.0f); } void DynamicFilter::setvolume(uchar Pvolume_) { Pvolume = Pvolume_; float tmp = Pvolume / 127.0f; outvolume.setTargetValue(tmp); if (!insertion) volume.setTargetValue(1.0f); else volume.setTargetValue(tmp); } void DynamicFilter::setampsns(uchar Pampsns_) { Pampsns = Pampsns_; ampsns = powf(Pampsns / 127.0f, 2.5f) * 10.0f; if (Pampsnsinv) ampsns = -ampsns; ampsmooth = expf(-Pampsmooth / 127.0f * 10.0f) * 0.99f; } void DynamicFilter::reinitfilter() { if (filterl != NULL) delete filterl; if (filterr != NULL) delete filterr; filterl = new Filter(*filterpars, synth); filterr = new Filter(*filterpars, synth); } void DynamicFilter::setpreset(uchar npreset) { if (npreset < 0xf) { if (npreset >= dynNUM_PRESETS) npreset = dynNUM_PRESETS - 1; for (int n = 0; n < dynPRESET_SIZE; ++n) changepar(n, dynPresets[npreset][n]); filterpars->defaults(); switch (npreset) { case 0: filterpars->Pcategory = 0; filterpars->Ptype = 2; filterpars->Pfreq = FILTDEF::dynFreq0.def; filterpars->Pq = FILTDEF::dynQval0.def; filterpars->Pstages = 1; filterpars->Pgain = 64; break; case 1: filterpars->Pcategory = 2; filterpars->Ptype = 0; filterpars->Pfreq = FILTDEF::dynFreq1.def; filterpars->Pq = FILTDEF::dynQval1.def; filterpars->Pstages = 0; filterpars->Pgain = 64; break; case 2: filterpars->Pcategory = 0; filterpars->Ptype = 4; filterpars->Pfreq = FILTDEF::dynFreq2.def; filterpars->Pq = FILTDEF::dynQval2.def; filterpars->Pstages = 2; filterpars->Pgain = 64; break; case 3: filterpars->Pcategory = 1; filterpars->Ptype = 0; filterpars->Pfreq = FILTDEF::dynFreq3.def; filterpars->Pq = FILTDEF::dynQval3.def; filterpars->Pstages = 1; filterpars->Pgain = 64; filterpars->Psequencesize = 2; // "I" filterpars->Pvowels[0].formants[0].freq = DYNform::Preset3V0F0.freq;//34; filterpars->Pvowels[0].formants[0].amp = DYNform::Preset3V0F0.amp;//127; filterpars->Pvowels[0].formants[0].q = DYNform::Preset3V0F0.q;//64; filterpars->Pvowels[0].formants[1].freq = DYNform::Preset3V0F1.freq;//99; filterpars->Pvowels[0].formants[1].amp = DYNform::Preset3V0F1.amp;//122; filterpars->Pvowels[0].formants[1].q = DYNform::Preset3V0F1.q;//64; filterpars->Pvowels[0].formants[2].freq = DYNform::Preset3V0F2.freq;//108; filterpars->Pvowels[0].formants[2].amp = DYNform::Preset3V0F2.amp;//112; filterpars->Pvowels[0].formants[2].q = DYNform::Preset3V0F2.q;//64; // "A" filterpars->Pvowels[1].formants[0].freq = DYNform::Preset3V1F0.freq;//61; filterpars->Pvowels[1].formants[0].amp = DYNform::Preset3V1F0.amp;//127; filterpars->Pvowels[1].formants[0].q = DYNform::Preset3V1F0.q;//64; filterpars->Pvowels[1].formants[1].freq = DYNform::Preset3V1F1.freq;//71; filterpars->Pvowels[1].formants[1].amp = DYNform::Preset3V1F1.amp;//121; filterpars->Pvowels[1].formants[1].q = DYNform::Preset3V1F1.q;//64; filterpars->Pvowels[1].formants[2].freq = DYNform::Preset3V1F2.freq;//99; filterpars->Pvowels[1].formants[2].amp = DYNform::Preset3V1F2.amp;//117; filterpars->Pvowels[1].formants[2].q = DYNform::Preset3V1F1.q;//64; break; case 4: filterpars->Pcategory = 1; filterpars->Ptype = 0; filterpars->Pfreq = FILTDEF::dynFreq4.def; filterpars->Pq = FILTDEF::dynQval4.def; filterpars->Pstages = 1; filterpars->Pgain = 64; filterpars->Psequencesize = 2; filterpars->Pnumformants = 2; filterpars->Pvowelclearness = 0; filterpars->Pvowels[0].formants[0].freq = DYNform::Preset4V0F0.freq;//70; filterpars->Pvowels[0].formants[0].amp = DYNform::Preset4V0F0.amp;//127; filterpars->Pvowels[0].formants[0].q = DYNform::Preset4V0F0.q;//64; filterpars->Pvowels[0].formants[1].freq = DYNform::Preset4V0F1.freq;//80; filterpars->Pvowels[0].formants[1].amp = DYNform::Preset4V0F1.amp;//122; filterpars->Pvowels[0].formants[1].q = DYNform::Preset4V0F1.q;//64; filterpars->Pvowels[1].formants[0].freq = DYNform::Preset4V1F0.freq;//20; filterpars->Pvowels[1].formants[0].amp = DYNform::Preset4V1F0.amp;//127; filterpars->Pvowels[1].formants[0].q = DYNform::Preset4V1F0.q;//64; filterpars->Pvowels[1].formants[1].freq = DYNform::Preset4V1F1.freq;//100; filterpars->Pvowels[1].formants[1].amp = DYNform::Preset4V1F1.amp;//121; filterpars->Pvowels[1].formants[1].q = DYNform::Preset4V1F1.q;//64; break; } if (insertion == 0) changepar(0, dynPresets[npreset][0] * 0.5f); // lower the volume if this is // system effect // All presets use no BPM syncing. changepar(EFFECT::control::bpm, 0); Ppreset = npreset; reinitfilter(); } else { uchar preset = npreset & 0xf; uchar param = npreset >> 4; if (param == 0xf) param = 0; changepar(param, dynPresets[preset][param]); if ((insertion == 0) && (param == 0)) changepar(0, dynPresets[preset][0] * 0.5f); } Pchanged = false; } void DynamicFilter::changepar(int npar, uchar value) { if (npar == -1) { Pchanged = (value != 0); return; } switch (npar) { case 0: setvolume(value); break; case 1: setpanning(value); break; case 2: lfo.Pfreq = value; lfo.updateparams(); break; case 3: lfo.Prandomness = value; lfo.updateparams(); break; case 4: lfo.PLFOtype = value; lfo.updateparams(); break; case 5: lfo.Pstereo = value; lfo.updateparams(); break; case 6: setdepth(value); break; case 7: setampsns(value); break; case 8: Pampsnsinv = value; setampsns(Pampsns); break; case 9: Pampsmooth = value; setampsns(Pampsns); break; case EFFECT::control::bpm: lfo.Pbpm = value; break; case EFFECT::control::bpmStart: lfo.PbpmStart = value; break; } Pchanged = true; } uchar DynamicFilter::getpar(int npar) const { switch (npar) { case -1: return Pchanged; case 0: return Pvolume; case 1: return Ppanning; case 2: return lfo.Pfreq; case 3: return lfo.Prandomness; case 4: return lfo.PLFOtype; case 5: return lfo.Pstereo; case 6: return Pdepth; case 7: return Pampsns; case 8: return Pampsnsinv; case 9: return Pampsmooth; case EFFECT::control::bpm: return lfo.Pbpm; case EFFECT::control::bpmStart: return lfo.PbpmStart; default: break; } return 0; } float Dynamlimit::getlimits(CommandBlock *getData) { int value = getData->data.value; int control = getData->data.control; int request = getData->data.type & TOPLEVEL::type::Default; // clear flags int npart = getData->data.part; int presetNum = getData->data.engine; int min = 0; int max = 127; int def = dynPresets[presetNum][control]; uchar canLearn = TOPLEVEL::type::Learnable; uchar isInteger = TOPLEVEL::type::Integer; switch (control) { case 0: if (npart == TOPLEVEL::section::systemEffects) // system effects def /= 2; break; case 1: break; case 2: break; case 3: break; case 4: max = 1; canLearn = 0; break; case 5: break; case 6: break; case 7: break; case 8: max = 1; canLearn = 0; break; case 9: break; case EFFECT::control::bpm: max = 1; canLearn = 0; break; case EFFECT::control::bpmStart: break; case EFFECT::control::preset: max = 4; canLearn = 0; break; default: getData->data.type |= TOPLEVEL::type::Error; return 1.0f; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } getData->data.type |= (canLearn + isInteger); return float(value); } yoshimi-2.3.5.1/src/Effects/DynamicFilter.h000066400000000000000000000055761506652756400204470ustar00rootroot00000000000000/* DynamicFilter.h - "WahWah" effect and others Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. Modified March 2019 */ #ifndef DYNAMICFILTER_H #define DYNAMICFILTER_H #include "DSP/Filter.h" #include "Effects/EffectLFO.h" #include "Effects/Effect.h" static const int dynPRESET_SIZE = 10; static const int dynNUM_PRESETS = 5; static const char dynPresets[dynNUM_PRESETS][dynPRESET_SIZE] = { // WahWah { 110, 64, 80, 0, 0, 64, 0, 90, 0, 60 }, // AutoWah {110, 64, 70, 0, 0, 80, 70, 0, 0, 60 }, // Sweep {100, 64, 30, 0, 0, 50, 80, 0, 0, 60 }, // VocalMorph1 { 110, 64, 80, 0, 0, 64, 0, 64, 0, 60 }, // VocalMorph1 {127, 64, 50, 0, 0, 96, 64, 0, 0, 60 } }; class SynthEngine; class DynamicFilter : public Effect { public: DynamicFilter(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine&); ~DynamicFilter(); void out(float *smpsl, float *smpsr) override; void setpreset(uchar npreset) override; void changepar(int npar, uchar value) override; uchar getpar(int npar) const override; void cleanup() override; private: // DynamicFilter parameters bool Pchanged; EffectLFO lfo; // lfo-ul DynamicFilter uchar Pvolume; uchar Pdepth; uchar Pampsns; uchar Pampsnsinv; // if the filter freq is lowered if the input amplitude rises uchar Pampsmooth; // how smooth the input amplitude changes the filter // Parameter Control void setvolume(uchar Pvolume_); void setdepth(uchar Pdepth_); void setampsns(uchar Pampsns_); void reinitfilter(); // Internal Values float depth, ampsns, ampsmooth; Filter *filterl, *filterr; float ms1, ms2, ms3, ms4; // mean squares }; class Dynamlimit { public: float getlimits(CommandBlock *getData); }; #endif yoshimi-2.3.5.1/src/Effects/EQ.cpp000066400000000000000000000302431506652756400165420ustar00rootroot00000000000000/* EQ.cpp - Equalizer effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2018-2021, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include "Misc/NumericFuncs.h" #include "Misc/SynthEngine.h" #include "Misc/Util.h" #include "Effects/EQ.h" #include #include using func::power; using func::powFrac; using func::asDecibel; using util::unConst; using util::max; using std::make_unique; EQ::EQ(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine& _synth) : Effect(insertion_, efxoutl_, efxoutr_, NULL, 0, _synth) , Pchanged{false} , Pvolume{} , Pband{0} , filter{synth,synth,synth,synth,synth,synth,synth,synth} // MAX_EQ_BANDS , filterSnapshot{} { // default values setvolume(50); setpreset(Ppreset); cleanup(); } // Cleanup the effect void EQ::cleanup() { Effect::cleanup(); for (int i = 0; i < MAX_EQ_BANDS; ++i) { filter[i].l->cleanup(); filter[i].r->cleanup(); } } // Effect output void EQ::out(float *smpsl, float *smpsr) { outvolume.advanceValue(synth.sent_buffersize); memcpy(efxoutl, smpsl, synth.sent_bufferbytes); memcpy(efxoutr, smpsr, synth.sent_bufferbytes); for (int i = 0; i < synth.sent_buffersize; ++i) { efxoutl[i] *= volume.getValue(); efxoutr[i] *= volume.getValue(); volume.advanceValue(); } for (int i = 0; i < MAX_EQ_BANDS; ++i) { if (filter[i].Ptype == 0) continue; float oldval = filter[i].freq.getValue(); filter[i].freq.advanceValue(synth.sent_buffersize); float newval = filter[i].freq.getValue(); if (oldval != newval) { filter[i].l->interpolatenextbuffer(); filter[i].l->setfreq(newval); filter[i].r->interpolatenextbuffer(); filter[i].r->setfreq(newval); } oldval = filter[i].gain.getValue(); filter[i].gain.advanceValue(synth.sent_buffersize); newval = filter[i].gain.getValue(); if (oldval != newval) { filter[i].l->interpolatenextbuffer(); filter[i].l->setgain(newval); filter[i].r->interpolatenextbuffer(); filter[i].r->setgain(newval); } oldval = filter[i].q.getValue(); filter[i].q.advanceValue(synth.sent_buffersize); newval = filter[i].q.getValue(); if (oldval != newval) { filter[i].l->interpolatenextbuffer(); filter[i].l->setq(newval); filter[i].r->interpolatenextbuffer(); filter[i].r->setq(newval); } filter[i].l->filterout(efxoutl); filter[i].r->filterout(efxoutr); } } // Parameter control void EQ::setvolume(uchar Pvolume_) { Pvolume = Pvolume_; float tmp = 10.0f * powFrac<200>(1.0f - Pvolume / 127.0f); outvolume.setTargetValue(tmp); volume.setTargetValue((!insertion) ? 1.0f : tmp); } void EQ::setpreset(uchar npreset) { const int PRESET_SIZE = 1; const int NUM_PRESETS = 2; uchar presets[NUM_PRESETS][PRESET_SIZE] = { { EQmaster_def }, // EQ 1 { EQmaster_def } // EQ 2 }; if (npreset >= NUM_PRESETS) npreset = NUM_PRESETS - 1; for (int n = 0; n < PRESET_SIZE; ++n) changepar(n, presets[npreset][n]); Ppreset = npreset; Pchanged = true; } void EQ::changepar(int npar, uchar value) { if (npar == -1) { Pchanged = (value != 0); return; } switch (npar) { case 0: setvolume(value); break; case 1: Pband = value; break; } if (npar < 10) return; int nb = (npar - 10) / 5; // number of the band (filter) if (nb >= MAX_EQ_BANDS) return; int bp = npar % 5; // band parameter // how to translate filter parameter into the internal value used for computation.... auto calcFreqVal = [](uchar par){ return 600.0f * power<30>((par - 64.0f) / 64.0f); }; auto calcGainVal = [](uchar par){ return 30.0f * (par - 64.0f) / 64.0f; }; auto calcQVal = [](uchar par){ return power<30>((par - 64.0f) / 64.0f); }; switch (bp) { case 0: // Change type of the filter band filter[nb].Ptype = value; if (value > AnalogFilter::MAX_TYPES) filter[nb].Ptype = 0; if (filter[nb].Ptype != 0) { filter[nb].l->settype(value - 1); filter[nb].r->settype(value - 1); // need to re-sync the interpolated filter parameters // to ensure a change is detected and the filter coefficients are recomputed. // (without this the filter will sound neutral on very first usage of a EQ band) filter[nb].freq.setTargetValue(calcFreqVal(filter[nb].Pfreq)); filter[nb].gain.setTargetValue(calcGainVal(filter[nb].Pgain)); filter[nb].q .setTargetValue(calcQVal (filter[nb].Pq )); } break; case 1: filter[nb].Pfreq = value; filter[nb].freq.setTargetValue(calcFreqVal(value)); break; case 2: filter[nb].Pgain = value; filter[nb].gain.setTargetValue(calcGainVal(value)); break; case 3: filter[nb].Pq = value; filter[nb].q.setTargetValue(calcQVal(value)); break; case 4: filter[nb].Pstages = value; if (value >= MAX_FILTER_STAGES) filter[nb].Pstages = MAX_FILTER_STAGES - 1; filter[nb].l->setstages(value); filter[nb].r->setstages(value); break; } Pchanged = true; } uchar EQ::getpar(int npar) const { switch (npar) { case -1: return Pchanged; case 0: return Pvolume; break; case 1: return Pband; } if (npar < 10) return 0; int nb = (npar - 10) / 5; // number of the band (filter) if (nb >= MAX_EQ_BANDS) return 0; int bp = npar % 5; // band parameter switch (bp) { case 0: return(filter[nb].Ptype); break; case 1: return(filter[nb].Pfreq); break; case 2: return(filter[nb].Pgain); break; case 3: return(filter[nb].Pq); break; case 4: return(filter[nb].Pstages); break; } return 0; // in case of bogus parameter number } /** * Special implementation, since only EQ uses the high number of parameters. */ void EQ::getAllPar(EffectParArray& target) const { for (uint i=0; igetpar(i); } float EQlimit::getlimits(CommandBlock *getData) { int value = getData->data.value; int control = getData->data.control; int request = getData->data.type & TOPLEVEL::type::Default; // clear flags int min = 0; int max = 127; int def = 0; uchar canLearn = TOPLEVEL::type::Learnable; uchar isInteger = TOPLEVEL::type::Integer; switch (control) { case 0: def = EQmaster_def; break; case 1: max = 7; canLearn = 0; break; case 10: max = 9; canLearn = 0; break; case 11: def = EQfreq_def; break; case 12: def = EQgain_def; break; case 13: def = EQq_def; break; case 14: max = 4; canLearn = 0; break; default: getData->data.type |= TOPLEVEL::type::Error; return 1.0f; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } getData->data.type |= (canLearn + isInteger); return float(value); } /** * Helper: an inline buffer to maintain a temporary copy of an AnalogFilter, * used to compute the filter coefficients and then the response for GUI presentation. * We can not use the actual filters, since their values will be interpolated gradually. * Rather, we need to work from the pristine FilterParameter settings of this EQ. */ class EQ::FilterSnapshot { // a chunk of raw uninitialised storage of suitable size alignas(AnalogFilter) std::byte buffer_[sizeof(AnalogFilter)]; EQ const& eq; public: ~FilterSnapshot() { destroy(); } FilterSnapshot(EQ const& outer) : eq{outer} { emplaceFilter(0, 1000, 1.0, 1, 1.0); }// ensure there is always a dummy object emplaced void captureBand(uint idx) { assert(idx < MAX_EQ_BANDS); FilterParam const& par{eq.filter[idx]}; destroy(); emplaceFilter(max(0, par.Ptype-1) // Ptype == 0 means disabled -- skipped in calcResponse() ,par.freq.getTargetValue() ,par.q.getTargetValue() ,par.Pstages ,par.gain.getTargetValue() ); } AnalogFilter& access() { return * std::launder (reinterpret_cast (&buffer_)); } private: void emplaceFilter(uchar type, float freq, float q, uchar stages, float dBgain) { new(&buffer_) AnalogFilter(unConst(eq).synth, type,freq,q,stages,dBgain); } void destroy() { access().~AnalogFilter(); } }; /** * Prepare the Lookup-Table used by the EQGraph-UI to display the * gain response as function of the frequency. The number of step points in the LUT * is defined by EQ_GRAPH_STEPS; these »slots« span an X-axis running from [0.0 ... 1.0]. * The translation of these scale points into actual frequencies is defined by xScaleFac(freq), * where 0.0 corresponds to 20Hz and 1.0 corresponds to 20kHz. This render calculation is * invoked on each push-update for an EQ -- see SynthEngine::pushEffectUpdate(part); * this is unconditionally invoked on each parameter change (yet seems to be fast enough). */ void EQ::renderResponse(EQGraphArray & lut) const { auto subNyquist = [this](float f){ return f <= synth.halfsamplerate_f; }; for (uint i=0; i(*this); float response{1.0}; for (int i = 0; i < MAX_EQ_BANDS; ++i) { if (filter[i].Ptype == 0) continue; filterSnapshot->captureBand(i); response *= filterSnapshot->access().calcFilterResponse(freq); } // Only for UI purposes, use target value. return asDecibel(response * outvolume.getTargetValue()); } yoshimi-2.3.5.1/src/Effects/EQ.h000066400000000000000000000073741506652756400162200ustar00rootroot00000000000000/* EQ.h - Equalizer Effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2018-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. Modified March 2019 */ #ifndef EQ_H #define EQ_H #include "globals.h" #include "Misc/SynthEngine.h" #include "DSP/AnalogFilter.h" #include "Effects/Effect.h" #include #include const uchar EQmaster_def = 67; const uchar EQfreq_def = 64; const uchar EQgain_def = 64; const uchar EQq_def = 64; class EQ : public Effect { public: EQ(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine&); ~EQ() = default; void out(float *smpsl, float *smpr) override; void setpreset(uchar npreset) override; void changepar(int npar, uchar value) override; uchar getpar(int npar) const override; void getAllPar(EffectParArray&) const override; void cleanup() override; /** render transfer function for UI */ void renderResponse(EQGraphArray & lut) const; /** scale helpers for the response diagram */ static float xScaleFreq(float fac); static float xScaleFac(float freq); static float yScaleFac(float dB); private: constexpr static auto GRAPH_MIN_FREQ = 20; constexpr static auto GRAPH_MAX_dB = 30; void setvolume(uchar Pvolume_); float calcResponse(float freq) const; // Parameters bool Pchanged; uchar Pvolume; uchar Pband; struct FilterParam { uchar Ptype, Pfreq, Pgain, Pq, Pstages; // parameters synth::InterpolatedValue freq, gain, q; std::unique_ptr l; // internal values std::unique_ptr r; // internal values FilterParam(SynthEngine& synth) :Ptype{0} ,Pfreq{EQfreq_def} ,Pgain{EQgain_def} ,Pq{EQq_def} ,Pstages{0} ,freq{0, synth.samplerate} ,gain{0, synth.samplerate} ,q {0, synth.samplerate} ,l{new AnalogFilter(synth, TOPLEVEL::filter::Peak2, 1000.0, 1.0, 0)} ,r{new AnalogFilter(synth, TOPLEVEL::filter::Peak2, 1000.0, 1.0, 0)} { } }; FilterParam filter[MAX_EQ_BANDS]; class FilterSnapshot; mutable std::unique_ptr filterSnapshot; }; class EQlimit { public: float getlimits(CommandBlock *getData); }; inline float EQ::xScaleFreq(float fac) { if (fac > 1.0) fac = 1.0; return GRAPH_MIN_FREQ * power<1000>(fac); } inline float EQ::xScaleFac(float freq) { if (freq < GRAPH_MIN_FREQ) freq = GRAPH_MIN_FREQ; return logf(freq / GRAPH_MIN_FREQ) / logf(1000.0); } inline float EQ::yScaleFac(float dB) { return (1 + dB / GRAPH_MAX_dB) / 2.0; } #endif /*EQ.h*/ yoshimi-2.3.5.1/src/Effects/Echo.cpp000066400000000000000000000264741506652756400171260ustar00rootroot00000000000000/* Echo.cpp - Echo effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2021, Will Godfrey Copyright 2024 Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include "Misc/NumericFuncs.h" #include "Misc/SynthHelper.h" #include "Misc/SynthEngine.h" #include "Effects/Echo.h" #include using func::power; using func::powFrac; Echo::Echo(bool insertion_, float* efxoutl_, float* efxoutr_, SynthEngine& _synth) : Effect(insertion_, efxoutl_, efxoutr_, NULL, 0, _synth), Pdelay(60), Plrdelay(100), feedback(1, _synth.samplerate), hidamp(1, _synth.samplerate), lrdelay(0), ldelay(NULL), rdelay(NULL), lxfade(1, _synth.samplerate_f), rxfade(1, _synth.samplerate_f) { setvolume(50); setfeedback(40); sethidamp(60); setpreset(Ppreset); changepar(4, 30); // lrcross Pchanged = false; maxdelay = 5 * synth.samplerate; ldelay = new float[maxdelay]; rdelay = new float[maxdelay]; realposl = realposr = 1; cleanup(); initdelays(); } Echo::~Echo() { delete [] ldelay; delete [] rdelay; } // Cleanup the effect void Echo::cleanup() { Effect::cleanup(); feedback.pushToTarget(); hidamp.pushToTarget(); lxfade.pushToTarget(); rxfade.pushToTarget(); memset(ldelay, 0, maxdelay * sizeof(float)); memset(rdelay, 0, maxdelay * sizeof(float)); oldl = oldr = 0.0f; } // Initialize the delays void Echo::initdelays() { if (Pbpm) { auto calcDelay = [this](unsigned char paramDelay, int delay) { int olddelay = delay; std::pair frac = func::LFOfreqBPMFraction((float)paramDelay / 127.0f); delay = roundf(60.0f * synth.samplerate_f * frac.first / (synth.getBPM() * frac.second)); if (delay > maxdelay) delay = maxdelay; if (not synth.isBPMAccurate()) { // If we don't have an accurate BPM source, we may have // fluctuations. Reject delay changes less than a certain amount to // prevent Echo artifacts. float ratio; if (delay > olddelay) ratio = (float)delay / (float)olddelay; else ratio = (float)olddelay / (float)delay; if (ratio < ECHO_INACCURATE_BPM_THRESHOLD) delay = olddelay; } return delay; }; delay = calcDelay(Pdelay, delay); if (PsepLRDelay) { // Reuse lrdelay for right delay only. lrdelay = calcDelay(Plrdelay, lrdelay); dl = delay; dr = lrdelay; } } else { auto calcDelay = [this](unsigned char paramDelay) { return int(paramDelay / 127.0f * synth.samplerate_f * 1.5f) + 1; // 0 .. 1.5 sec }; delay = calcDelay(Pdelay); if (PsepLRDelay) { // Reuse lrdelay for right delay only. lrdelay = calcDelay(Plrdelay); dl = delay; dr = lrdelay; } } if (!PsepLRDelay) { float tmp; tmp = (power<2>(fabsf(Plrdelay - 64.0f) / 64.0f * 9.0f) -1.0f) / 1000.0f * synth.samplerate_f; if (Plrdelay < 64.0f) tmp = -tmp; lrdelay = (int)tmp; dl = delay - lrdelay; dr = delay + lrdelay; } if (dl < 1) dl = 1; if (dr < 1) dr = 1; } // Effect output void Echo::out(float* smpsl, float* smpsr) { float l, r; float ldl; float rdl; outvolume.advanceValue(synth.sent_buffersize); initdelays(); for (int i = 0; i < synth.sent_buffersize; ++i) { lxfade.setTargetValue(dl); rxfade.setTargetValue(dr); int targetpos; targetpos = realposl - lxfade.getNewValue(); if (targetpos < 0) targetpos += maxdelay; ldl = ldelay[targetpos]; targetpos = realposr - rxfade.getNewValue(); if (targetpos < 0) targetpos += maxdelay; rdl = rdelay[targetpos]; if (lxfade.isInterpolating()) { targetpos = realposl - lxfade.getOldValue(); if (targetpos < 0) targetpos += maxdelay; ldl = ldelay[targetpos] * (1.0f - lxfade.factor()) + ldl * lxfade.factor(); } if (rxfade.isInterpolating()) { targetpos = realposr - rxfade.getOldValue(); if (targetpos < 0) targetpos += maxdelay; rdl = rdelay[targetpos] * (1.0f - rxfade.factor()) + rdl * rxfade.factor(); } ldl += float(1e-20); // anti-denormal included rdl += float(1e-20); // anti-denormal included l = ldl * (1.0 - lrcross.getValue()) + rdl * lrcross.getValue(); r = rdl * (1.0 - lrcross.getValue()) + ldl * lrcross.getValue(); lrcross.advanceValue(); ldl = l; rdl = r; efxoutl[i] = ldl * 2.0f - 1e-20f; // anti-denormal - a very, very, very efxoutr[i] = rdl * 2.0f - 1e-20f; // small dc bias ldl = smpsl[i] * pangainL.getAndAdvanceValue() - ldl * feedback.getValue(); rdl = smpsr[i] * pangainR.getAndAdvanceValue() - rdl * feedback.getValue(); feedback.advanceValue(); // LowPass Filter ldelay[realposl] = ldl = ldl * hidamp.getValue() + oldl * (1.0f - hidamp.getValue()); rdelay[realposl] = rdl = rdl * hidamp.getValue() + oldr * (1.0f - hidamp.getValue()); hidamp.advanceValue(); oldl = ldl; oldr = rdl; if (++realposl >= maxdelay) realposl = 0; if (++realposr >= maxdelay) realposr = 0; lxfade.advanceValue(); rxfade.advanceValue(); } } // Parameter control void Echo::setvolume(unsigned char Pvolume_) { Pvolume = Pvolume_; if (insertion == 0) { outvolume.setTargetValue(4.0f * powFrac<100>(1.0f - Pvolume / 127.0f)); volume.setTargetValue(1.0f); } else { float tmp = Pvolume / 127.0f; volume.setTargetValue(tmp); outvolume.setTargetValue(tmp); } if (Pvolume == 0) cleanup(); } void Echo::setdelay(const unsigned char Pdelay_) { Pdelay = Pdelay_; } void Echo::setlrdelay(unsigned char Plrdelay_) { Plrdelay = Plrdelay_; } void Echo::setfeedback(unsigned char Pfb_) { Pfb = Pfb_; feedback.setTargetValue(Pfb / 128.0f); } void Echo::sethidamp(unsigned char Phidamp_) { Phidamp = Phidamp_; hidamp.setTargetValue(1.0 - Phidamp / 127.0f); } void Echo::setpreset(unsigned char npreset) { if (npreset < 0xf) { if (npreset >= echoNUM_PRESETS) npreset = echoNUM_PRESETS - 1; for (int n = 0; n < echoPRESET_SIZE; ++n) changepar(n, echoPresets[npreset][n]); if (insertion) changepar(0, echoPresets[npreset][0] / 2); // lower the volume if this is insertion effect // All presets use no BPM syncing. changepar(EFFECT::control::bpm, 0); Ppreset = npreset; } else { unsigned char preset = npreset & 0xf; unsigned char param = npreset >> 4; if (param == 0xf) param = 0; changepar(param, echoPresets[preset][param]); if (insertion && (param == 0)) changepar(0, echoPresets[preset][0] / 2); } Pchanged = false; } void Echo::changepar(int npar, unsigned char value) { if (npar == -1) { Pchanged = (value != 0); return; } Pchanged = true; switch (npar) { case 0: setvolume(value); break; case 1: setpanning(value); break; case 2: setdelay(value); break; case 3: setlrdelay(value); break; case 4: setlrcross(value); break; case 5: setfeedback(value); break; case 6: sethidamp(value); break; case EFFECT::control::sepLRDelay: PsepLRDelay = value; break; case EFFECT::control::bpm: Pbpm = value; break; default: Pchanged = false; break; } } unsigned char Echo::getpar(int npar) const { switch (npar) { case -1: return Pchanged; case 0: return Pvolume; case 1: return Ppanning; case 2: return Pdelay; case 3: return Plrdelay; case 4: return Plrcross; case 5: return Pfb; case 6: return Phidamp; case EFFECT::control::sepLRDelay: return PsepLRDelay; case EFFECT::control::bpm: return Pbpm; default: break; } return 0; // in case of bogus parameter number } float Echolimit::getlimits(CommandBlock *getData) { int value = getData->data.value; int control = getData->data.control; int request = getData->data.type & TOPLEVEL::type::Default; // clear flags int npart = getData->data.part; int presetNum = getData->data.engine; int min = 0; int max = 127; int def = echoPresets[presetNum][control]; unsigned char canLearn = TOPLEVEL::type::Learnable; unsigned char isInteger = TOPLEVEL::type::Integer; switch (control) { case 0: if (npart != TOPLEVEL::section::systemEffects) // system effects def /= 2; break; case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case EFFECT::control::sepLRDelay: case EFFECT::control::bpm: max = 1; canLearn = 0; break; case EFFECT::control::preset: max = 8; canLearn = 0; break; default: getData->data.type |= TOPLEVEL::type::Error; return 1.0f; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } getData->data.type |= (canLearn + isInteger); return float(value); } yoshimi-2.3.5.1/src/Effects/Echo.h000066400000000000000000000071761506652756400165710ustar00rootroot00000000000000/* Echo.h - Echo Effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2019, Will Godfrey Copyright 2024 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. Modified March 2019 */ #ifndef ECHO_H #define ECHO_H #include "Effects/Effect.h" // The ratio which, when exceeded, causes the echo effect to update its internal // delay. If not exceeded, the delay remains constant even if the BPM // changes. This is to combat fluctuations in inaccurate BPM sources, such as // ALSA. Must be a number above 1.0f. #define ECHO_INACCURATE_BPM_THRESHOLD 1.02f static const int echoPRESET_SIZE = 7; static const int echoNUM_PRESETS = 9; static const unsigned char echoPresets[echoNUM_PRESETS][echoPRESET_SIZE] = { { 67, 64, 35, 64, 30, 59, 0 }, // Echo 1 { 67, 64, 21, 64, 30, 59, 0 }, // Echo 2 { 67, 75, 60, 64, 30, 59, 10 }, // Echo 3 { 67, 60, 44, 64, 30, 0, 0 }, // Simple Echo { 67, 60, 102, 50, 30, 82, 48 }, // Canyon { 67, 64, 44, 17, 0, 82, 24 }, // Panning Echo 1 { 81, 60, 46, 118, 100, 68, 18 }, // Panning Echo 2 { 81, 60, 26, 100, 127, 67, 36 }, // Panning Echo 3 { 62, 64, 28, 64, 100, 90, 55 } // Feedback Echo }; class SynthEngine; class Echo : public Effect { public: Echo(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine&); ~Echo(); void out(float* smpsl, float* smpr) override; void setpreset(uchar npreset) override; void changepar(int npar, uchar value) override; uchar getpar(int npar) const override; void cleanup() override; void setdryonly(); private: // Parameters bool Pchanged; unsigned char Pvolume; // 1 Volume or Dry/Wetness unsigned char Pdelay; // 3 Delay of the Echo unsigned char Plrdelay; // 4 L/R delay difference unsigned char Pfb; // 6 Feedback unsigned char Phidamp; // 7 Dampening of the Echo bool Pbpm; bool PsepLRDelay; void setvolume(unsigned char Pvolume_); void setdelay(unsigned char Pdelay_); void setlrdelay(unsigned char Plrdelay_); void setfeedback(unsigned char Pfb_); void sethidamp(unsigned char Phidamp_); // Real Parameters synth::InterpolatedValue feedback, hidamp; int dl, dr, delay, lrdelay; void initdelays(); float* ldelay; float* rdelay; int maxdelay; float oldl, oldr; // pt. lpf float prevBeat; // Used to calculate BPM. int realposl, realposr; synth::InterpolatedValue lxfade, rxfade; }; class Echolimit { public: float getlimits(CommandBlock *getData); }; #endif yoshimi-2.3.5.1/src/Effects/Effect.cpp000066400000000000000000000057421506652756400174370ustar00rootroot00000000000000/* Effect.cpp - inherited by the all effects Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2011, Alan Calvert Copyright 2020, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code, modified April 2011 */ #include "Misc/SynthEngine.h" #include "Effects/Effect.h" #include "Misc/NumericFuncs.h" using func::setAllPan; namespace { const float PAN_NORMAL_CENTRE = cosf(0.5f * HALFPI); } Effect::Effect(bool insertion_, float *efxoutl_, float *efxoutr_, FilterParams *filterpars_, uchar Ppreset_, SynthEngine& synth_) : Ppreset{Ppreset_} , efxoutl{efxoutl_} , efxoutr{efxoutr_} , outvolume{0.5f, synth_.samplerate} , volume{0.5f, synth_.samplerate} , filterpars{filterpars_} , insertion{insertion_} , pangainL{PAN_NORMAL_CENTRE, synth_.samplerate} , pangainR{PAN_NORMAL_CENTRE, synth_.samplerate} , lrcross{40.0f/127, synth_.samplerate} , synth{synth_} { setpanning(64); setlrcross(40); } // base implementation: force to clean reproducible state. // Note: be sure to invoke that from overridden implementations. void Effect::cleanup() { outvolume.pushToTarget(); volume .pushToTarget(); pangainL.pushToTarget(); pangainR.pushToTarget(); lrcross.pushToTarget(); } void Effect::setpanning(char Ppanning_) { Ppanning = Ppanning_; float left = 0; float right = 0; setAllPan(Ppanning, left, right, MAIN::panningType::normal); /* * we fix panning as 'normal' for effects, because this has * never been any different, and we don't know what subtle * changes might take place in the final sound if this * followed user panning type changes. */ pangainL.setTargetValue(left); pangainR.setTargetValue(right); } void Effect::setlrcross(char Plrcross_) { Plrcross = Plrcross_; lrcross.setTargetValue(Plrcross / 127.0f); } /** * Base implementation: fetch through `virtual getpar(n)` * Only the EQ uses the high number of (band) parameters. */ void Effect::getAllPar(EffectParArray& target) const { const uint LIM = EFFECT::control::bpmStart; for (uint i=0; i<=LIM; ++i) target[i] = this->getpar(i); } yoshimi-2.3.5.1/src/Effects/Effect.h000066400000000000000000000056021506652756400170770ustar00rootroot00000000000000/* Effect.h - inherited by the all effects Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. Modified march 2018 */ #ifndef EFFECT_H #define EFFECT_H #include "Params/FilterParams.h" #include "Misc/SynthHelper.h" #include "globals.h" #include /// maximum number of parameters supported in all effect modules constexpr int EFFECT_PARAM_CNT = 46; using EffectParArray = std::array; /// resolution (distinct points) for rendering the EQ transfer function constexpr int EQ_GRAPH_STEPS = 300; using EQGraphArray = std::array; class Effect { public: virtual ~Effect() = default; ///< this is an interface Effect(bool insertion_, float *efxoutl_, float *efxoutr_, FilterParams *filterpars_, uchar Ppreset_, SynthEngine&); // shall not be copied nor moved Effect(Effect&&) = delete; Effect(Effect const&) = delete; Effect& operator=(Effect&&) = delete; Effect& operator=(Effect const&) = delete; virtual void setpreset(uchar npreset) = 0; virtual void changepar(int npar, uchar value) = 0; virtual uchar getpar(int npar) const = 0; virtual void getAllPar(EffectParArray&) const; virtual void out(float *smpsl, float *smpsr) = 0; virtual void cleanup(); uchar Ppreset; // Current preset float *const efxoutl; float *const efxoutr; synth::InterpolatedValue outvolume; synth::InterpolatedValue volume; FilterParams *filterpars; protected: void setpanning(char Ppanning_); void setlrcross(char Plrcross_); bool insertion; char Ppanning; synth::InterpolatedValue pangainL; synth::InterpolatedValue pangainR; char Plrcross; // L/R mix synth::InterpolatedValue lrcross; SynthEngine& synth; }; #endif yoshimi-2.3.5.1/src/Effects/EffectLFO.cpp000066400000000000000000000105761506652756400200010ustar00rootroot00000000000000/* EffectLFO.cpp - Stereo LFO used by some effects Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code, modified March 2011 */ #include #include "Misc/NumericFuncs.h" #include "Misc/SynthEngine.h" #include "Effects/EffectLFO.h" using func::power; EffectLFO::EffectLFO(SynthEngine& _synth) : Pfreq{40} , Prandomness{0} , PLFOtype{0} , Pstereo{64} , Pbpm{0} , xl{0.0f} , xr{0.0f} , ampl1{_synth.numRandom()} , ampl2{_synth.numRandom()} , ampr1{_synth.numRandom()} , ampr2{_synth.numRandom()} , lfornd{0.0f} , synth{_synth} { updateparams(); } /* Reset operational state to reproducible values, without changing parameters. * Relevant for automated testing. */ void EffectLFO::resetState() { xr = xl = 0.0f; ampl1 = synth.numRandom(); ampl2 = synth.numRandom(); ampr1 = synth.numRandom(); ampr2 = synth.numRandom(); } // Update the changed parameters void EffectLFO::updateparams() { float lfofreq = (power<2>(Pfreq / 127.0f * 10.0f) - 1.0f) * 0.03f; incx = fabsf(lfofreq) * synth.fixed_sample_step_f; if (incx > 0.49999999f) incx = 0.499999999f; // Limit the Frequency lfornd = Prandomness / 127.0f; lfornd = (lfornd > 1.0f) ? 1.0f : lfornd; if (PLFOtype > 1) PLFOtype = 1; // this has to be updated if more lfo's are added lfotype = PLFOtype; xdelta = fmodf((Pstereo - 64.0f) / 127.0f + 1.0f, 1.0f); xr = xl + xdelta; if (xr > 1.0f) xr -= 1.0f; } // Compute the shape of the LFO float EffectLFO::getlfoshape(float x) { float out; switch (lfotype) { case 1: // EffectLFO_TRIANGLE if (x > 0.0f && x < 0.25f) out = 4.0f * x; else if (x > 0.25f && x < 0.75f) out = 2.0f - 4.0f * x; else out = 4.0f * x - 4.0f; break; // \todo more to be added here; also ::updateParams() need to be // updated (to allow more lfotypes) default: out = cosf(x * TWOPI); // EffectLFO_SINE break; } return out; } // LFO output void EffectLFO::effectlfoout(float *outl, float *outr) { float out; out = getlfoshape(xl); if (lfotype == 0 || lfotype == 1) out *= (ampl1 + xl * (ampl2 - ampl1)); *outl = (out + 1.0f) * 0.5f; out = getlfoshape(xr); if (lfotype == 0 || lfotype == 1) out *= (ampr1 + xr * (ampr2 - ampr1)); *outr = (out + 1.0f) * 0.5f; if (Pbpm) { std::pair frac = func::LFOfreqBPMFraction((float)Pfreq / 127.0f); float oldx = xl; xl = fmodf((float)PbpmStart / 127.0f + synth.getSongBeat() * frac.first / frac.second, 1.0f); if (xl < 0.5 && oldx >= 0.5) { ampl1 = ampl2; ampl2 = (1.0f - lfornd) + lfornd * synth.numRandom(); } oldx = xr; xr = xl + xdelta; if (xr > 1.0f) xr -= 1.0f; if (xr < 0.5 && oldx >= 0.5) { ampr1 = ampr2; ampr2 = (1.0f - lfornd) + lfornd * synth.numRandom(); } } else { xl += incx; if (xl > 1.0f) { xl -= 1.0f; ampl1 = ampl2; ampl2 = (1.0f - lfornd) + lfornd * synth.numRandom(); } xr += incx; if (xr > 1.0f) { xr -= 1.0f; ampr1 = ampr2; ampr2 = (1.0f - lfornd) + lfornd * synth.numRandom(); } } } yoshimi-2.3.5.1/src/Effects/EffectLFO.h000066400000000000000000000040471506652756400174420ustar00rootroot00000000000000/* EffectLFO.h - Stereo LFO used by some effects Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, Alan Calvert This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original, modified October 2009 */ #ifndef EFFECT_LFO_H #define EFFECT_LFO_H #include "globals.h" class SynthEngine; class EffectLFO { public: ~EffectLFO() = default; EffectLFO(SynthEngine&); // shall not be copied nor moved EffectLFO(EffectLFO&&) = delete; EffectLFO(EffectLFO const&) = delete; EffectLFO& operator=(EffectLFO&&) = delete; EffectLFO& operator=(EffectLFO const&) = delete; void effectlfoout(float *outl, float *outr); void updateparams(); void resetState(); uchar Pfreq; uchar Prandomness; uchar PLFOtype; uchar Pstereo; // 64 = center uchar Pbpm; uchar PbpmStart; private: float getlfoshape(float x); float xl, xr; float xdelta; // position delta to x when using stereo separation. float incx; float ampl1, ampl2, ampr1, ampr2; // necessary for "randomness" float lfornd; char lfotype; SynthEngine& synth; }; #endif /*EFFECT_LFO_H*/ yoshimi-2.3.5.1/src/Effects/EffectMgr.cpp000066400000000000000000000236751506652756400201120ustar00rootroot00000000000000/* EffectMgr.cpp - Effect manager, an interface between the program and effects Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include #include "Misc/XMLStore.h" #include "Misc/SynthEngine.h" #include "Effects/EffectMgr.h" #include "Effects/EQ.h" EffectMgr::EffectMgr(const bool insertion_, SynthEngine& _synth) : ParamBase{_synth}, efxoutl{size_t(_synth.buffersize)}, efxoutr{size_t(_synth.buffersize)}, insertion{insertion_}, filterpars{NULL}, effectType{0}, // type none resolves to zero internally dryonly{false}, efx{} { defaults(); } void EffectMgr::defaults() { changeeffect(0); // type none resolves to zero internally setdryonly(false); } // Change the effect void EffectMgr::changeeffect(int _nefx) { cleanup(); if (effectType == _nefx) return; effectType = _nefx; switch (effectType + EFFECT::type::none) { case EFFECT::type::reverb: efx.reset(new Reverb{insertion, efxoutl.get(), efxoutr.get(), synth}); break; case EFFECT::type::echo: efx.reset(new Echo{insertion, efxoutl.get(), efxoutr.get(), synth}); break; case EFFECT::type::chorus: efx.reset(new Chorus{insertion, efxoutl.get(), efxoutr.get(), synth}); break; case EFFECT::type::phaser: efx.reset(new Phaser{insertion, efxoutl.get(), efxoutr.get(), synth}); break; case EFFECT::type::alienWah: efx.reset(new Alienwah{insertion, efxoutl.get(), efxoutr.get(), synth}); break; case EFFECT::type::distortion: efx.reset(new Distorsion{insertion, efxoutl.get(), efxoutr.get(), synth}); break; case EFFECT::type::eq: efx.reset(new EQ{insertion, efxoutl.get(), efxoutr.get(), synth}); break; case EFFECT::type::dynFilter: efx.reset(new DynamicFilter{insertion, efxoutl.get(), efxoutr.get(), synth}); break; // put more effect here default: efx.reset(); break; // no effect (thru) } if (efx) filterpars = efx->filterpars; } // Obtain the effect number int EffectMgr::geteffect() { return (effectType); } // Cleanup the current effect void EffectMgr::cleanup() { memset(efxoutl.get(), 0, synth.bufferbytes); memset(efxoutr.get(), 0, synth.bufferbytes); if (efx) efx->cleanup(); } // Get the preset of the current effect uchar EffectMgr::getpreset() { return efx? efx->Ppreset : 0; } // Change the preset of the current effect void EffectMgr::changepreset(uchar npreset) { if (efx) efx->setpreset(npreset); } // Change a parameter of the current effect void EffectMgr::seteffectpar(int npar, uchar value) { if (!efx) return; efx->changepar(npar, value); } // Get a parameter of the current effect uchar EffectMgr::geteffectpar(int npar) { if (!efx) return 0; return efx->getpar(npar); } void EffectMgr::getAllPar(EffectParArray& target) const { if (efx) efx->getAllPar(target); else target = {0}; } // Apply the effect void EffectMgr::out(float *smpsl, float *smpsr) { if (!efx) { if (!insertion) { memset(smpsl, 0, synth.sent_bufferbytes); memset(smpsr, 0, synth.sent_bufferbytes); memset(efxoutl.get(), 0, synth.sent_bufferbytes); memset(efxoutr.get(), 0, synth.sent_bufferbytes); } return; } memset(efxoutl.get(), 0, synth.sent_bufferbytes); memset(efxoutr.get(), 0, synth.sent_bufferbytes); efx->out(smpsl, smpsr); if (effectType == (EFFECT::type::eq - EFFECT::type::none)) { // this is need only for the EQ effect memcpy(smpsl, efxoutl.get(), synth.sent_bufferbytes); memcpy(smpsr, efxoutr.get(), synth.sent_bufferbytes); return; } // Insertion effect if (insertion != 0) { for (int i = 0; i < synth.sent_buffersize; ++i) { float volume = efx->volume.getAndAdvanceValue(); float v1, v2; if (volume < 0.5f) { v1 = 1.0f; v2 = volume * 2.0f; } else { v1 = (1.0f - volume) * 2.0f; v2 = 1.0f; } if (effectType == (EFFECT::type::reverb - EFFECT::type::none) || effectType==(EFFECT::type::echo - EFFECT::type::none)) v2 *= v2; // wet function is not linear for Reverb/Echo if (dryonly) { // this is used for instrument effect only smpsl[i] *= v1; smpsr[i] *= v1; efxoutl[i] *= v2; efxoutr[i] *= v2; } else { // normal instrument/insertion effect smpsl[i] = smpsl[i] * v1 + efxoutl[i] * v2; smpsr[i] = smpsr[i] * v1 + efxoutr[i] * v2; } } } else { // System effect for (int i = 0; i < synth.sent_buffersize; ++i) { float volume = efx->volume.getAndAdvanceValue(); efxoutl[i] *= 2.0f * volume; efxoutr[i] *= 2.0f * volume; smpsl[i] = efxoutl[i]; smpsr[i] = efxoutr[i]; } } } // Get the effect volume for the system effect float EffectMgr::sysefxgetvolume() { return (!efx) ? 1.0f : efx->outvolume.getValue(); } /** * Prepare a LUT for the UI to display the current * amplitude/frequency response of the EQ's filter */ void EffectMgr::renderEQresponse(EQGraphArray& lut) const { if (effectType != (EFFECT::type::eq - EFFECT::type::none)) return; auto eqImpl = static_cast (efx.get()); eqImpl->renderResponse(lut); } void EffectMgr::setdryonly(bool value) { dryonly = value; } void EffectMgr::add2XML(XMLtree& xmlEffect) { xmlEffect.addPar_int("type", geteffect()); if (!efx or 0 == geteffect()) return; xmlEffect.addPar_int("preset", efx->Ppreset); XMLtree xmlParams = xmlEffect.addElm("EFFECT_PARAMETERS"); for (uint n = 0; n < 128; ++n) { // \todo evaluate who should oversee saving and loading of parameters uchar paramVal = geteffectpar(n); if (paramVal == 0) continue; XMLtree xmlPar = xmlParams.addElm("par_no", n); xmlPar.addPar_int("par", paramVal); } if (filterpars) { XMLtree xmlFilter = xmlParams.addElm("FILTER"); filterpars->add2XML(xmlFilter); } } void EffectMgr::getfromXML(XMLtree& xmlEffect) { assert(xmlEffect); // Instantiate Effect implementation according to the given effect-type changeeffect(xmlEffect.getPar_127("type", geteffect())); if (!efx or 0 == geteffect()) return; // disabled; no further settings to retrieve bool isChanged{false}; changepreset(xmlEffect.getPar_127("preset", efx->Ppreset)); if (XMLtree xmlParams = xmlEffect.getElm("EFFECT_PARAMETERS")) { for (uint n = 0; n < 128; ++n) { uchar defaultVal = geteffectpar(n); // find default seteffectpar(n, 0); // erase effect parameter if (XMLtree xmlPar = xmlParams.getElm("par_no", n)) { seteffectpar(n, xmlPar.getPar_127("par", int(defaultVal))); isChanged |= (defaultVal != geteffectpar(n)); } } seteffectpar(-1, isChanged); if (filterpars) if (XMLtree xmlFilter = xmlParams.getElm("FILTER")) filterpars->getfromXML(xmlFilter); } cleanup(); } float LimitMgr::geteffectlimits(CommandBlock *getData) { int effType = getData->data.kit; float value = 0; switch (effType) { case EFFECT::type::none: value = 0; break; case EFFECT::type::reverb: Revlimit reverb; value = reverb.getlimits(getData); break; case EFFECT::type::echo: Echolimit echo; value = echo.getlimits(getData); break; case EFFECT::type::chorus: Choruslimit chorus; value = chorus.getlimits(getData); break; case EFFECT::type::phaser: Phaserlimit phaser; value = phaser.getlimits(getData); break; case EFFECT::type::alienWah: Alienlimit alien; value = alien.getlimits(getData); break; case EFFECT::type::distortion: Distlimit dist; value = dist.getlimits(getData); break; case EFFECT::type::eq: EQlimit EQ; value = EQ.getlimits(getData); break; case EFFECT::type::dynFilter: Dynamlimit dyn; value = dyn.getlimits(getData); break; default: value = EFFECT::type::count - EFFECT::type::none; break; } return value; } yoshimi-2.3.5.1/src/Effects/EffectMgr.h000066400000000000000000000071421506652756400175460ustar00rootroot00000000000000/* EffectMgr.h - Effect manager, an interface between the program and effects Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, Alan Calvert Copyright 2018,2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. */ #ifndef EFFECTMGR_H #define EFFECTMGR_H #include "globals.h" #include "Effects/Effect.h" #include "Effects/Reverb.h" #include "Effects/Echo.h" #include "Effects/Chorus.h" #include "Effects/Phaser.h" #include "Effects/Alienwah.h" #include "Effects/Distorsion.h" #include "Effects/EQ.h" #include "Effects/DynamicFilter.h" #include "Misc/Alloc.h" #include "Params/FilterParams.h" class SynthEngine; class XMLtree; class EffectMgr : public ParamBase { public: EffectMgr(const bool insertion_, SynthEngine&); void defaults() override; void add2XML(XMLtree&); void getfromXML(XMLtree&); void out(float *smpsl, float *smpsr); void setdryonly(bool value); float sysefxgetvolume(); void cleanup(); void changeeffect(int nefx_); int geteffect(); void changepreset(uchar npreset); uchar getpreset(); void seteffectpar(int npar, uchar value); uchar geteffectpar(int npar); void getAllPar(EffectParArray&) const; Samples efxoutl; Samples efxoutr; bool insertion; // the effect is connected as insertion effect (or not) // used by UI void renderEQresponse(EQGraphArray&) const; FilterParams* filterpars; private: int effectType; bool dryonly; unique_ptr efx; }; class LimitMgr { public: float geteffectlimits(CommandBlock *getData); }; /** * Data record used to transport effect settings into the UI */ struct EffectDTO { int effType{-1}; uchar effNum{0}; bool enabled{false}; bool changed{false}; bool isInsert{false}; uchar currPreset{0}; int insertFxRouting{-1}; uchar partFxRouting{1}; bool partFxBypass{false}; EffectParArray param{0}; //////////////////////////////////////////////////TODO 2/24 as partial workaround until all further direct core accesses are addressed EffectMgr* eff_in_core_TODO_deprecated; }; /** * Graph data for the EQ frequency response display in the UI */ struct EqGraphDTO { EQGraphArray response{0}; /** LUT with linear interpolation */ float lookup(float scaleFac) { scaleFac = std::clamp(scaleFac, 0.0f, 0.99999f); const uint UPPER_BOUND = response.size()-1; uint slot(UPPER_BOUND*scaleFac); assert (slot < UPPER_BOUND); float pl = response[slot]; float pu = response[slot+1]; float rel = std::clamp(UPPER_BOUND*scaleFac - slot, 0.0f,1.0f); return pl*(1-rel) + pu*rel; } }; #endif /*EFFECTMGR_H*/ yoshimi-2.3.5.1/src/Effects/Phaser.cpp000066400000000000000000000351561506652756400174670ustar00rootroot00000000000000/* Phaser.cpp - Phaser effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2021, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #include "Misc/SynthEngine.h" #include "Effects/Phaser.h" #include "Misc/NumericFuncs.h" #include using func::limit; using func::invSignal; #define PHASER_LFO_SHAPE 2 #define ONE_ 0.99999f // To prevent LFO ever reaching 1.0f for filter stability purposes #define ZERO_ 0.00001f // Same idea as above. Phaser::Phaser(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine& _synth) : Effect(insertion_, efxoutl_, efxoutr_, NULL, 0, _synth), lfo(synth), oldl(NULL), oldr(NULL), xn1l(NULL), xn1r(NULL), yn1l(NULL), yn1r(NULL) { analog_setup(); setpreset(Ppreset); Pchanged = false; cleanup(); } void Phaser::analog_setup() { //model mismatch between JFET devices offset[0] = -0.2509303f; offset[1] = 0.9408924f; offset[2] = 0.998f; offset[3] = -0.3486182f; offset[4] = -0.2762545f; offset[5] = -0.5215785f; offset[6] = 0.2509303f; offset[7] = -0.9408924f; offset[8] = -0.998f; offset[9] = 0.3486182f; offset[10] = 0.2762545f; offset[11] = 0.5215785f; barber = 0; //Deactivate barber pole phasing by default mis = 1.0f; Rmin = 625.0f; // 2N5457 typical on resistance at Vgs = 0 Rmax = 22000.0f; // Resistor parallel to FET Rmx = Rmin / Rmax; Rconst = 1.0f + Rmx; // Handle parallel resistor relationship C = 0.00000005f; // 50 nF CFs = 2.0f * synth.samplerate_f * C; invperiod = 1.0f / synth.buffersize_f; } Phaser::~Phaser() { if (oldl != NULL) delete [] oldl; if (oldr != NULL) delete [] oldr; if (xn1l) delete[] xn1l; if (yn1l) delete[] yn1l; if (xn1r) delete[] xn1r; if (yn1r) delete[] yn1r; } // Effect output void Phaser::out(float *smpsl, float *smpsr) { outvolume.advanceValue(synth.sent_buffersize); if (Panalog) AnalogPhase(smpsl, smpsr); else NormalPhase(smpsl, smpsr); } void Phaser::AnalogPhase(float *smpsl, float *smpsr) { float lfoVall; float lfoValr; float modl; float modr; float gl; float gr; float hpfl = 0; float hpfr = 0; lfo.effectlfoout(&lfoVall, &lfoValr); modl = lfoVall * width + (depth - 0.5f); modr = lfoValr * width + (depth - 0.5f); modl = limit(modl, ZERO_, ONE_); modr = limit(modr, ZERO_, ONE_); if (Phyper) { // Triangle wave squared is approximately sine on bottom, triangle on top // Result is exponential sweep more akin to filter in synth with // exponential generator circuitry. modl *= modl; modr *= modr; } // g.,g. is Vp - Vgs. Typical FET drain-source resistance follows constant/[1-sqrt(Vp - Vgs)] modl = sqrtf(1.0f - modl); modr = sqrtf(1.0f - modr); diffr = (modr - oldrgain) * invperiod; diffl = (modl - oldlgain) * invperiod; gl = oldlgain; gr = oldrgain; oldlgain = modl; oldrgain = modr; for (int i = 0; i < synth.sent_buffersize; ++i) { gl += diffl; // Linear interpolation between LFO samples gr += diffr; float xnl(smpsl[i] * pangainL.getAndAdvanceValue()); float xnr(smpsr[i] * pangainR.getAndAdvanceValue()); if (barber) { gl = fmodf((gl + 0.25f), ONE_); gr = fmodf((gr + 0.25f), ONE_); } xnl = applyPhase(xnl, gl, fbl, hpfl, yn1l, xn1l); xnr = applyPhase(xnr, gr, fbr, hpfr, yn1r, xn1r); fbl = xnl * fb; fbr = xnr * fb; efxoutl[i] = xnl; efxoutr[i] = xnr; } if (Poutsub) { invSignal(efxoutl, synth.sent_buffersize); invSignal(efxoutr, synth.sent_buffersize); } } float Phaser::applyPhase(float x, float g, float fb, float &hpf, float *yn1, float *xn1) { for (int j = 0; j < Pstages; ++j) { //Phasing routine mis = 1.0f + offsetpct * offset[j]; // This is symmetrical. // FET is not, so this deviates slightly, however sym dist. is // better sounding than a real FET. float d = (1.0f + 2.0f * (0.25f + g) * hpf * hpf * distortion) * mis; Rconst = 1.0f + mis * Rmx; // This is 1/R. R is being modulated to control filter fc. float b = (Rconst - g) / (d * Rmin); float gain = (CFs - b) / (CFs + b); yn1[j] = (gain * (x + yn1[j]) - xn1[j]) + 1e-12; // anti-denormal // high pass filter: // Distortion depends on the high-pass part of the AP stage. hpf = yn1[j] + (1.0f - gain) * xn1[j]; xn1[j] = x; x = yn1[j]; if (j == 1) x += fb; // Insert feedback after first phase stage } return x; } void Phaser::NormalPhase(float *smpsl, float *smpsr) { float lfol, lfor, lgain, rgain, tmp; lfo.effectlfoout(&lfol, &lfor); lgain = lfol; rgain = lfor; lgain = (expf(lgain * PHASER_LFO_SHAPE) - 1) / (expf(PHASER_LFO_SHAPE) - 1.0f); rgain = (expf(rgain * PHASER_LFO_SHAPE) - 1) / (expf(PHASER_LFO_SHAPE) - 1.0f); lgain = 1.0f - phase * (1.0f - depth) - (1.0f - phase) * lgain * depth; lgain = limit(lgain,ZERO_,ONE_);//(lgain > 1.0f) ? 1.0f : lgain; rgain = 1.0f - phase * (1.0f - depth) - (1.0f - phase) * rgain * depth; rgain = limit(rgain,ZERO_,ONE_);//(rgain > 1.0f) ? 1.0f : rgain; for (int i = 0; i < synth.sent_buffersize; ++i) { float x = (float)i / synth.sent_buffersize_f; float x1 = 1.0f - x; float gl = lgain * x + oldlgain * x1; float gr = rgain * x + oldrgain * x1; float inl = smpsl[i] * pangainL.getAndAdvanceValue() + fbl; float inr = smpsr[i] * pangainR.getAndAdvanceValue() + fbr; // Phasing routine for (int j = 0; j < Pstages * 2; ++j) { // Left channel tmp = oldl[j]; oldl[j] = gl * tmp + inl; inl = (tmp - gl * oldl[j]) + 1e-12; // anti-denormal // Right channel tmp = oldr[j]; oldr[j] = gr * tmp + inr; inr = (tmp - gr * oldr[j]) + 1e-12; // anti-denormal } // Left/Right crossing float l = inl; float r = inr; inl = l * (1.0f - lrcross.getValue()) + r * lrcross.getValue(); inr = r * (1.0f - lrcross.getValue()) + l * lrcross.getValue(); lrcross.advanceValue(); fbl = inl * fb; fbr = inr * fb; efxoutl[i] = inl; efxoutr[i] = inr; } oldlgain = lgain; oldrgain = rgain; if (Poutsub) for (int i = 0; i < synth.sent_buffersize; ++i) { efxoutl[i] *= -1.0f; efxoutr[i] *= -1.0f; } } // Cleanup the effect void Phaser::cleanup() { Effect::cleanup(); fbl = fbr = oldlgain = oldrgain = 0.0f; memset(oldl, 0, sizeof(float)*Pstages * 2); memset(oldr, 0, sizeof(float)*Pstages * 2); memset(xn1l, 0, sizeof(float)*Pstages); memset(xn1r, 0, sizeof(float)*Pstages); memset(yn1l, 0, sizeof(float)*Pstages); memset(yn1r, 0, sizeof(float)*Pstages); lfo.resetState(); } // Parameter control void Phaser::setdepth(unsigned char Pdepth_) { Pdepth = Pdepth_; depth = Pdepth / 127.0f; } void Phaser::setwidth(unsigned char Pwidth_) { Pwidth = Pwidth_; width = Pwidth / 127.0f; } void Phaser::setfb(unsigned char Pfb_) { Pfb = Pfb_; fb = (Pfb - 64.0f) / 64.1f; } void Phaser::setvolume(unsigned char Pvolume_) { Pvolume = Pvolume_; float tmp = Pvolume / 127.0f; outvolume.setTargetValue(tmp); volume.setTargetValue((!insertion) ? 1.0f : tmp); } void Phaser::setdistortion(unsigned char Pdistortion_) { Pdistortion = Pdistortion_; distortion = (float)Pdistortion / 127.0f; } void Phaser::setoffset(unsigned char Poffset_) { Poffset = Poffset_; offsetpct = (float)Poffset / 127.0f; } void Phaser::setstages(unsigned char Pstages_) { if (oldl != NULL) delete [] oldl; if (xn1l) delete[] xn1l; if (yn1l) delete[] yn1l; if (oldr != NULL) delete [] oldr; if (xn1r) delete[] xn1r; if (yn1r) delete[] yn1r; Pstages = Pstages_; oldl = new float[Pstages * 2]; oldr = new float[Pstages * 2]; xn1l = new float[Pstages]; xn1r = new float[Pstages]; yn1l = new float[Pstages]; yn1r = new float[Pstages]; cleanup(); } void Phaser::setphase(unsigned char Pphase_) { Pphase = Pphase_; phase = Pphase / 127.0; } void Phaser::setpreset(unsigned char npreset) { if (npreset < 0xf) { if (npreset >= phaserNUM_PRESETS) npreset = phaserNUM_PRESETS - 1; for (int n = 0; n < phaserPRESET_SIZE; ++n) changepar(n, phaserPresets[npreset][n]); // All presets use no BPM syncing. changepar(EFFECT::control::bpm, 0); Ppreset = npreset; } else { unsigned char preset = npreset & 0xf; unsigned char param = npreset >> 4; if (param == 0xf) param = 0; changepar(param, phaserPresets[preset][param]); } Pchanged = false; } void Phaser::changepar(int npar, unsigned char value) { if (npar == -1) { Pchanged = (value != 0); return; } switch (npar) { case 0: setvolume(value); break; case 1: setpanning(value); break; case 2: lfo.Pfreq = value; lfo.updateparams(); break; case 3: lfo.Prandomness = value; lfo.updateparams(); break; case 4: lfo.PLFOtype = value; lfo.updateparams(); barber = (2 == value); break; case 5: lfo.Pstereo = value; lfo.updateparams(); break; case 6: setdepth(value); break; case 7: setfb(value); break; case 8: setstages(value); break; case 9: setlrcross(value); setoffset(value); break; case 10: Poutsub = (value > 1) ? 1 : value; break; case 11: setphase(value); setwidth(value); break; case 12: Phyper = std::min(int(value), 1); break; case 13: setdistortion(value); break; case 14: Panalog = value; break; case EFFECT::control::bpm: lfo.Pbpm = value; break; case EFFECT::control::bpmStart: lfo.PbpmStart = value; break; } Pchanged = true; } unsigned char Phaser::getpar(int npar) const { switch (npar) { case -1: return Pchanged; case 0: return Pvolume; case 1: return Ppanning; case 2: return lfo.Pfreq; case 3: return lfo.Prandomness; case 4: return lfo.PLFOtype; case 5: return lfo.Pstereo; case 6: return Pdepth; case 7: return Pfb; case 8: return Pstages; case 9: return Plrcross; return Poffset; // same case 10: return Poutsub; case 11: return Pphase; return Pwidth; // same case 12: return Phyper; case 13: return Pdistortion; case 14: return Panalog; case EFFECT::control::bpm: return lfo.Pbpm; case EFFECT::control::bpmStart: return lfo.PbpmStart; default: break; } return 0; } float Phaserlimit::getlimits(CommandBlock *getData) { int value = getData->data.value; int control = getData->data.control; int request = getData->data.type & TOPLEVEL::type::Default; // clear flags int presetNum = getData->data.engine; int min = 0; int max = 127; int def = phaserPresets[presetNum][control]; unsigned char canLearn = TOPLEVEL::type::Learnable; unsigned char isInteger = TOPLEVEL::type::Integer; switch (control) { case 0: break; case 1: break; case 2: break; case 3: break; case 4: max = 1; canLearn = 0; break; case 5: break; case 6: break; case 7: break; case 8: min = 1; max = 12; canLearn = 0; break; case 9: break; case 10: canLearn = 0; max = 1; break; case 11: break; case 12: canLearn = 0; max = 1; break; case 13: break; case 14: max = 1; canLearn = 0; break; case EFFECT::control::bpm: max = 1; canLearn = 0; break; case EFFECT::control::bpmStart: break; case EFFECT::control::preset: max = 11; canLearn = 0; break; default: getData->data.type |= TOPLEVEL::type::Error; return 1.0f; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } getData->data.type |= (canLearn + isInteger); return float(value); } yoshimi-2.3.5.1/src/Effects/Phaser.h000066400000000000000000000125361506652756400171310ustar00rootroot00000000000000/* Phaser.h - Phaser effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, Alan Calvert Copyright 2018-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. Modified March 2019 */ #ifndef PHASER_H #define PHASER_H #include "Effects/Effect.h" #include "Effects/EffectLFO.h" const int phaserPRESET_SIZE = 15; const int phaserNUM_PRESETS = 12; const unsigned char phaserPresets[phaserNUM_PRESETS][phaserPRESET_SIZE] = { // Phaser // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 {64, 64, 36, 0, 0, 64, 110, 64, 1, 0, 0, 20, 0, 0, 0 }, {64, 64, 35, 0, 0, 88, 40, 64, 3, 0, 0, 20, 0, 0, 0 }, {64, 64, 31, 0, 0, 66, 68, 107, 2, 0, 0, 20, 0, 0, 0 }, {39, 64, 22, 0, 0, 66, 67, 10, 5, 0, 1, 20, 0, 0, 0 }, {64, 64, 20, 0, 1, 110, 67, 78, 10, 0, 0, 20, 0, 0, 0 }, {64, 64, 53, 100, 0, 58, 37, 78, 3, 0, 0, 20, 0, 0, 0 }, // APhaser // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 {64, 64, 14, 0, 1, 64, 64, 40, 4, 10, 0, 110,1, 20, 1 }, {64, 64, 14, 5, 1, 64, 70, 40, 6, 10, 0, 110,1, 20, 1 }, {64, 64, 9, 0, 0, 64, 60, 40, 8, 10, 0, 40, 0, 20, 1 }, {64, 64, 14, 10, 0, 64, 45, 80, 7, 10, 1, 110,1, 20, 1 }, {25, 64, 127, 10, 0, 64, 25, 16, 8, 100, 0, 25, 0, 20, 1 }, {64, 64, 1, 10, 1, 64, 70, 40, 12, 10, 0, 110,1, 20, 1 } }; class SynthEngine; class Phaser : public Effect { public: Phaser(bool insertion_, float* efxoutl_, float* efxoutr_, SynthEngine&); ~Phaser(); void out(float* smpsl, float* smpsr) override; void setpreset(uchar npreset) override; void changepar(int npar, uchar value) override; uchar getpar(int npar) const override; void cleanup() override; void setdryonly(); private: // Phaser Parameters bool Pchanged; EffectLFO lfo; // #include "DSP/Unison.h" #include "DSP/AnalogFilter.h" #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Effects/Reverb.h" using func::power; using func::powFrac; // todo: EarlyReflections, Prdelay, Perbalance Reverb::Reverb(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine& _synth) : Effect(insertion_, efxoutl_, efxoutr_, NULL, 0, _synth), // defaults // Pvolume(48), Ptime(64), Pidelay(40), Pidelayfb(0), // Prdelay(0), // **** RHL **** // Perbalance(64), // **** RHL **** Plpf(127), Phpf(0), Plohidamp(80), Ptype(1), Proomsize(64), Pbandwidth(20), roomsize(1.0f), rs(1.0f), bandwidth(NULL), idelay(NULL), lpf(NULL), hpf(NULL), // no filter lpffr(0, synth.samplerate), hpffr(0, synth.samplerate), inputbuf(_synth.buffersize) { setvolume(48); for (int i = 0; i < REV_COMBS * 2; ++i) { comblen[i] = 800 + synth.randomINT() / (INT32_MAX/1400); combk[i] = 0; lpcomb[i] = 0; combfb[i] = -0.97f; comb[i] = NULL; } for (int i = 0; i < REV_APS * 2; ++i) { aplen[i] = 500 + synth.randomINT() / (INT32_MAX/500); apk[i] = 0; ap[i] = NULL; } setpreset(Ppreset); Pchanged = false; cleanup(); // do not call this before the comb initialisation } Reverb::~Reverb() { int i; if (idelay) delete [] idelay; if (hpf) delete hpf; if (lpf) delete lpf; for (i = 0; i < REV_APS * 2; ++i) delete [] ap[i]; for (i = 0; i < REV_COMBS * 2; ++i) delete [] comb[i]; if (bandwidth) delete bandwidth; } void Reverb::clearBuffers() { for (size_t j = 0; j < REV_COMBS * 2; ++j) { combk[j] = 0; lpcomb[j] = 0.0; for (size_t smp = 0; smp < comblen[j]; ++smp) comb[j][smp] = 0.0f; } for (size_t j = 0; j < REV_APS * 2; ++j) { apk[j] = 0; for (size_t smp = 0; smp < aplen[j]; ++smp) ap[j][smp] = 0.0f; } if (idelay) memset(idelay, 0, sizeof(float) * idelaylen); } // Process one channel; 0 = left, 1 = right void Reverb::calculateReverb(size_t ch, Samples& inputFeed, float *output) { ////TODO: implement the high part from lohidamp (comment probably from original author, before 2010) for (size_t j = REV_COMBS * ch; j < REV_COMBS * (ch + 1); ++j) { size_t offset = combk[j]; size_t combLen = comblen[j]; float lowpassj = lpcomb[j]; for (size_t smp = 0; smp < size_t(synth.sent_buffersize); ++smp) { float feedback = comb[j][offset] * combfb[j]; feedback = feedback * (1.0f - lohifb) + lowpassj * lohifb; lowpassj = feedback; comb[j][offset] = inputFeed[smp] + feedback; output[smp] += feedback; if ((++offset) >= combLen) offset = 0; } combk[j] = offset; lpcomb[j] = lowpassj; } // feed result of comb filters into AllPass filters for (size_t j = REV_APS * ch; j < REV_APS * (1 + ch); ++j) { size_t offset = apk[j]; size_t allpassLen = aplen[j]; for (size_t smp = 0; smp < size_t(synth.sent_buffersize); ++smp) { float feedback = ap[j][offset]; ap[j][offset] = 0.7f * feedback + output[smp]; output[smp] = feedback - 0.7f * ap[j][offset] + 1e-20f; // anti-denormal - a very, very, very small dc bias if ((++offset) >= allpassLen) offset = 0; } apk[j] = offset; } } namespace { //Helper: detect change above rounding errors for frequency interpolation const float FREQUENCY_EPSILON = 1e-3; bool significantChange(float newVal, float oldVal) { return std::fabs(newVal - oldVal) > FREQUENCY_EPSILON; } } void Reverb::preprocessInput(float *rawL, float *rawR, Samples& inputFeed) { for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) { inputFeed[i] = float(1e-20) + ((rawL[i] + rawR[i]) / 2.0f); // includes anti-denormal if (idelay) {// shift input by pre-delay float tmp = inputFeed[i] + idelay[idelayk] * idelayfb; inputFeed[i] = idelay[idelayk]; idelay[idelayk] = tmp; idelayk++; if (idelayk >= idelaylen) idelayk = 0; } } if (bandwidth) bandwidth->process(synth.sent_buffersize, inputFeed.get()); if (lpf) { float currFreq = lpf->getFreq(); lpffr.advanceValue(synth.sent_buffersize); if (significantChange(currFreq, lpffr.getValue())) { lpf->interpolatenextbuffer(); lpf->setfreq(lpffr.getValue()); } lpf->filterout(inputFeed.get()); } if (hpf) { float currFreq = hpf->getFreq(); hpffr.advanceValue(synth.sent_buffersize); if (significantChange(currFreq, hpffr.getValue())) { hpf->interpolatenextbuffer(); hpf->setfreq(hpffr.getValue()); } hpf->filterout(inputFeed.get()); } } // Effect output void Reverb::out(float *rawL, float *rawR) { outvolume.advanceValue(synth.sent_buffersize); if (!Pvolume && insertion) return; preprocessInput(rawL,rawR, inputbuf); calculateReverb(0, inputbuf, efxoutl); // inputbuf -> left calculateReverb(1, inputbuf, efxoutr); // inputbuf -> right float lvol = rs / REV_COMBS * pangainL.getAndAdvanceValue(); float rvol = rs / REV_COMBS * pangainR.getAndAdvanceValue(); if (insertion != 0) { lvol *= 2.0f; rvol *= 2.0f; } for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) { efxoutl[i] *= lvol; efxoutr[i] *= rvol; } } // Reset the effect to pristine state void Reverb::cleanup() { Effect::cleanup(); lpffr.pushToTarget(); hpffr.pushToTarget(); setupPipelines(); settime(Ptime); clearBuffers(); if (hpf) hpf->cleanup(); if (lpf) lpf->cleanup(); } // Parameter control void Reverb::setvolume(uchar Pvolume_) { Pvolume = Pvolume_; if (!insertion) { outvolume.setTargetValue(4.0f * powFrac<100>(1.0f - Pvolume / 127.0f)); volume.setTargetValue(1.0f); } else { float tmp = Pvolume / 127.0f; volume.setTargetValue(tmp); outvolume.setTargetValue(tmp); if (Pvolume == 0.0f) cleanup(); } } void Reverb::settime(uchar Ptime_) { Ptime = Ptime_; float t = power<60>(Ptime / 127.0f) - 0.97f; for (int i = 0; i < REV_COMBS * 2; ++i) combfb[i] = -expf(float(comblen[i]) / synth.samplerate_f * logf(0.001f) / t); // the feedback is negative because it removes the DC } void Reverb::setlohidamp(uchar Plohidamp_) { Plohidamp = (Plohidamp_ < 64) ? 64 : Plohidamp_; // remove this when the high part from lohidamp is added if (Plohidamp == 64) { lohidamptype = 0; lohifb = 0.0f; } else { if (Plohidamp < 64) lohidamptype = 1; if (Plohidamp > 64) lohidamptype = 2; float x = fabsf((float)(Plohidamp - 64) / 64.1f); lohifb = x * x; } } void Reverb::setidelay(uchar Pidelay_) { Pidelay = Pidelay_; float delay = powf(50.0f * Pidelay / 127.0f, 2.0f) - 1.0f; if (idelay) delete [] idelay; idelay = NULL; idelaylen = lrint(synth.samplerate_f * delay / 1000.0f); if (idelaylen > 1) { idelayk = 0; idelay = new float[idelaylen]; memset(idelay, 0, idelaylen * sizeof(float)); } } void Reverb::setidelayfb(uchar Pidelayfb_) { Pidelayfb = Pidelayfb_; idelayfb = Pidelayfb / 128.0f; } void Reverb::sethpf(uchar Phpf_) { Phpf = Phpf_; if (Phpf == 0) { // No HighPass if (hpf) delete hpf; hpf = NULL; } else { hpffr.setTargetValue(expf(powf(Phpf / 127.0f, 0.5f) * logf(10000.0f)) + 20.0f); if (hpf == NULL) hpf = new AnalogFilter(synth, TOPLEVEL::filter::High2, hpffr.getValue(), 1, 0); } } void Reverb::setlpf(uchar Plpf_) { Plpf = Plpf_; if (Plpf == 127) { // No LowPass if (lpf) delete lpf; lpf = NULL; } else { lpffr.setTargetValue(expf(powf(Plpf / 127.0f, 0.5f) * logf(25000.0f)) + 40.0f); if (!lpf) lpf = new AnalogFilter(synth, TOPLEVEL::filter::Low2, lpffr.getValue(), 1, 0); } } void Reverb::settype(uchar Ptype_) { Ptype = Ptype_; if (Ptype >= NUM_TYPES) Ptype = NUM_TYPES - 1; cleanup(); // invokes setupPipelines() } void Reverb::setupPipelines() { int combtunings[NUM_TYPES][REV_COMBS] = { { 0, 0, 0, 0, 0, 0, 0, 0 }, // this is unused (for random) // Freeverb by Jezar at Dreampoint { 1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617 }, { 1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617 } }; int aptunings[NUM_TYPES][REV_APS] = { { 0, 0, 0, 0 }, // this is unused (for random) { 225, 341, 441, 556 }, // Freeverb by Jezar at Dreampoint { 225, 341, 441, 556 } }; float samplerate_adjust = synth.samplerate_f / 44100.0f; // adjust the combs according to samplerate and room size for (int i = 0; i < REV_COMBS * 2; ++i) { float tmp; if (Ptype == 0) tmp = 800.0f + synth.numRandom() * 1400.0f; else tmp = combtunings[Ptype][i % REV_COMBS]; tmp *= roomsize; if (i > REV_COMBS) tmp += 23.0f; tmp *= samplerate_adjust; // adjust the combs according to the samplerate comblen[i] = size_t(tmp); if (comblen[i] < 10) comblen[i] = 10; combk[i] = 0; lpcomb[i] = 0; if (comb[i]) delete [] comb[i]; comb[i] = new float[comblen[i]]; memset(comb[i], 0, comblen[i] * sizeof(float)); } for (int i = 0; i < REV_APS * 2; ++i) { float tmp; if (Ptype == 0) { tmp = 500.0f + synth.numRandom() * 500.0f; } else tmp = aptunings[Ptype][i % REV_APS]; tmp *= roomsize; if (i > REV_APS) tmp += 23.0f; tmp *= samplerate_adjust; // adjust the combs according to the samplerate aplen[i] = size_t(tmp); if (aplen[i] < 10) aplen[i] = 10; apk[i] = 0; if (ap[i]) delete [] ap[i]; ap[i] = new float[aplen[i]]; memset(ap[i], 0, aplen[i] * sizeof(float)); } if (NULL != bandwidth) delete bandwidth; bandwidth = NULL; if (Ptype == 2) { // bandwidth bandwidth = new Unison(synth.buffersize / 4 + 1, 2.0f, &synth); bandwidth->setSize(50); bandwidth->setBaseFrequency(1.0f); //TODO the size of the unison buffer may be too small, though this has //not been verified yet. //As this cannot be resized in a RT context, a good upper bound should //be found } } void Reverb::setroomsize(uchar Proomsize_) { Proomsize = Proomsize_; if (!Proomsize) this->Proomsize = 64; // this is because the older versions consider roomsize=0 roomsize = (this->Proomsize - 64.0f) / 64.0f; if (roomsize > 0.0f) roomsize *= 2.0f; roomsize = power<10>(roomsize); rs = sqrtf(roomsize); settype(Ptype); } void Reverb::setbandwidth(uchar Pbandwidth_) { Pbandwidth = Pbandwidth_; float v = Pbandwidth / 127.0f; if (bandwidth) bandwidth->setBandwidth(powf(v, 2.0f) * 200.0f); } void Reverb::setpreset(uchar npreset) { if (npreset < 0xf) { if (npreset >= reverbNUM_PRESETS) npreset = reverbNUM_PRESETS - 1; for (int n = 0; n < reverbPRESET_SIZE; ++n) changepar(n, reverbPresets[npreset][n]); if (insertion) changepar(0, reverbPresets[npreset][0] / 2); // lower the volume if this is insertion effect Ppreset = npreset; } else { uchar preset = npreset & 0xf; uchar param = npreset >> 4; if (param == 0xf) param = 0; changepar(param, reverbPresets[preset][param]); if (insertion && (param == 0)) changepar(0, reverbPresets[preset][0] / 2); } Pchanged = false; } void Reverb::changepar(int npar, uchar value) { if (npar == -1) { Pchanged = (value != 0); return; } switch (npar) { case 0: setvolume(value); break; case 1: setpanning(value); break; case 2: settime(value); break; case 3: setidelay(value); break; case 4: setidelayfb(value); break; // case 5: setrdelay(value); // break; // case 6: seterbalance(value); // break; case 7: setlpf(value); break; case 8: sethpf(value); break; case 9: setlohidamp(value); break; case 10: settype(value); if (value == 2) setbandwidth(20); // TODO use defaults break; case 11: setroomsize(value); break; case 12: setbandwidth(value); break; } Pchanged = true; } uchar Reverb::getpar(int npar) const { switch (npar) { case -1: return Pchanged; case 0: return Pvolume; case 1: return Ppanning; case 2: return Ptime; case 3: return Pidelay; case 4: return Pidelayfb; // case 5: return(Prdelay); // break; // case 6: return(Perbalance); // break; case 7: return Plpf; case 8: return Phpf; case 9: return Plohidamp; case 10: return Ptype; case 11: return Proomsize; case 12: return Pbandwidth; default: break; } return 0; // in case of bogus "parameter" } float Revlimit::getlimits(CommandBlock *getData) { int value = getData->data.value; int control = getData->data.control; int request = getData->data.type & TOPLEVEL::type::Default; // clear flags int npart = getData->data.part; int presetNum = getData->data.engine; int min = 0; int max = 127; int def = reverbPresets[presetNum][control]; uchar canLearn = TOPLEVEL::type::Learnable; uchar isInteger = TOPLEVEL::type::Integer; switch (control) { case 0: if (npart != TOPLEVEL::section::systemEffects) // system effects def /=2; break; case 1: break; case 2: break; case 3: break; case 4: break; case 7: break; case 8: break; case 9: min = 64; break; case 10: max = 2; canLearn = 0; break; case 11: canLearn = 0; break; case 12: break; case 16: max = 12; canLearn = 0; break; default: getData->data.type |= TOPLEVEL::type::Error; return 1.0f; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } getData->data.type |= (canLearn + isInteger); return float(value); } yoshimi-2.3.5.1/src/Effects/Reverb.h000066400000000000000000000130051506652756400171240ustar00rootroot00000000000000/* Reverb.h - Reverberation effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018-2019, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. Modified march 2019 */ #ifndef REVERB_H #define REVERB_H #include "globals.h" #include "Misc/Alloc.h" #include "Effects/Effect.h" #define REV_COMBS 8 #define REV_APS 4 static const int reverbPRESET_SIZE = 13; static const int reverbNUM_PRESETS = 13; static const uchar reverbPresets[reverbNUM_PRESETS][reverbPRESET_SIZE] = { // Cathedral1 {80, 64, 63, 24, 0, 0, 0, 85, 5, 83, 1, 64, 20 }, // Cathedral2 {80, 64, 69, 35, 0, 0, 0, 127, 0, 71, 0, 64, 20 }, // Cathedral3 {80, 64, 69, 24, 0, 0, 0, 127, 75, 78, 1, 85, 20 }, // Hall1 {90, 64, 51, 10, 0, 0, 0, 127, 21, 78, 1, 64, 20 }, // Hall2 {90, 64, 53, 20, 0, 0, 0, 127, 75, 71, 1, 64, 20 }, // Room1 {100, 64, 33, 0, 0, 0, 0, 127, 0, 106, 0, 30, 20 }, // Room2 {100, 64, 21, 26, 0, 0, 0, 62, 0, 77, 1, 45, 20 }, // Basement {110, 64, 14, 0, 0, 0, 0, 127, 5, 71, 0, 25, 20 }, // Tunnel {85, 80, 84, 20, 42, 0, 0, 51, 0, 78, 1, 105, 20 }, // Echoed1 {95, 64, 26, 60, 71, 0, 0, 114, 0, 64, 1, 64, 20 }, // Echoed2 {90, 64, 40, 88, 71, 0, 0, 114, 0, 88, 1, 64, 20 }, // VeryLong1 {90, 64, 93, 15, 0, 0, 0, 114, 0, 77, 0, 95, 20 }, // VeryLong2 {90, 64, 111, 30, 0, 0, 0, 114, 90, 74, 1, 80, 20 } }; class Unison; class AnalogFilter; class SynthEngine; class Reverb : public Effect { public: ~Reverb(); Reverb(bool insertion_, float *efxoutl_, float *efxoutr_, SynthEngine&); void out(float* rawL, float* rawR) override; void cleanup() override; void setpreset(uchar npreset) override; void changepar(int npar, uchar value) override; uchar getpar(int npar) const override; private: static constexpr size_t NUM_TYPES = 3; // Parameters bool Pchanged; uchar Pvolume; uchar Ptime; uchar Pidelay; uchar Pidelayfb; // uchar Prdelay; // **** RHL **** // uchar Perbalance; // **** RHL **** uchar Plpf; uchar Phpf; // todo 0..63 lpf, 64 = off, 65..127 = hpf(TODO) uchar Plohidamp; uchar Ptype; uchar Proomsize; uchar Pbandwidth; // parameter control void setvolume(uchar Pvolume_); void settime(uchar Ptime_); void setlohidamp(uchar Plohidamp_); void setidelay(uchar Pidelay_); void setidelayfb(uchar Pidelayfb_); void sethpf(uchar Phpf_); void setlpf(uchar Plpf_); void settype(uchar Ptype_); void setroomsize(uchar Proomsize_); void setbandwidth(uchar Pbandwidth_); // float erbalance; // **** RHL **** // Parametrii 2 int lohidamptype; // 0 = disable, 1 = highdamp (lowpass), 2 = lowdamp (highpass) int idelaylen; // int rdelaylen; // **** RHL **** int idelayk; float lohifb; float idelayfb; float roomsize; float rs; // rs is used to "normalise" the volume according to the roomsize size_t comblen[REV_COMBS * 2]; // length for each CombFilter feedback line (random) size_t aplen[REV_APS * 2]; // length for each AllPass feedback line (random) Unison *bandwidth; // Internal Variables float *comb[REV_COMBS * 2]; // N CombFilter pipelines for each channel size_t combk[REV_COMBS * 2]; // current offset of the comb insertion point (cycling) float combfb[REV_COMBS * 2]; // feedback coefficient of each Comb-filter float lpcomb[REV_COMBS * 2]; // LowPass filtered output feedback from Comb float *ap[REV_APS * 2]; // AllPass-filter size_t apk[REV_APS * 2]; // current offset of the AllPass insertion point (cycling) float *idelay; // Input delay line AnalogFilter *lpf; // LowPass-filter on the input AnalogFilter *hpf; // HighPass-filter on the input synth::InterpolatedValue lpffr; synth::InterpolatedValue hpffr; Samples inputbuf; void preprocessInput(float *rawL, float *rawR, Samples& inputFeed); void calculateReverb(size_t ch, Samples& inputFeed, float *output); void setupPipelines(); void clearBuffers(); }; class Revlimit { public: float getlimits(CommandBlock *getData); }; #endif yoshimi-2.3.5.1/src/Interface/000077500000000000000000000000001506652756400160505ustar00rootroot00000000000000yoshimi-2.3.5.1/src/Interface/Data2Text.cpp000066400000000000000000003457561506652756400204000ustar00rootroot00000000000000/* Data2Text.cpp - conversion of commandBlock entries to text Copyright 2021 - 2023, Will Godfrey Copyright 2024, Will Godfrey, Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* **** WARNING **** * * Text2Data tracks many of these conversions - principally to be able to interpret * MIDI-learn files. * * If you change any of the text you must check whether Text2Data uses them, and if * it does, ensure that it carries *both* the old and new versions. */ #include "Interface/Data2Text.h" #include "Interface/TextLists.h" #include "Misc/SynthEngine.h" #include "Misc/TextMsgBuffer.h" #include "Misc/FormatFuncs.h" #include "Misc/NumericFuncs.h" using std::string; using std::to_string; using func::string2int; using func::stringCaps; using func::bpm2text; DataText::DataText() : showValue{false} , yesno{false} , textMsgBuffer{TextMsgBuffer::instance()} { } string DataText::withValue(string resolved, uchar type, bool showValue, bool addValue, float value, std::optional extra_value) { if (!addValue) return resolved; if (yesno) { if (value) resolved += " - on"; else resolved += " - off"; return resolved; } if (showValue) { resolved += " Value "; if (type & TOPLEVEL::type::Integer) resolved += to_string(lrint(value)); else resolved += to_string(value); if (extra_value) { resolved += " and "; if (type & TOPLEVEL::type::Integer) resolved += to_string(lrint(*extra_value)); else resolved += to_string(*extra_value); } } return resolved; } string DataText::resolveAll(SynthEngine& synth, CommandBlock& cmd, bool addValue) { float value = cmd.data.value; uchar type = cmd.data.type; // (source) uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar effSend = cmd.data.kit; // (note: also the kit) uchar engine = cmd.data.engine; uchar insert = cmd.data.insert; // (parameter) uchar offset = cmd.data.offset; // (miscmsg) if (control == TOPLEVEL::control::textMessage) // special case for simple messages { synth.getRuntime().Log(textMsgBuffer.fetch(lrint(value))); synth.getRuntime().finishedCLI = true; return ""; } showValue = true; yesno = false; string commandName; if (npart == TOPLEVEL::section::vector) { commandName = resolveVector(cmd, addValue); return withValue(commandName, type, showValue, addValue, value); } if (npart == TOPLEVEL::section::scales) { commandName = resolveMicrotonal(cmd, addValue); return withValue(commandName, type, showValue, addValue, value); } if (npart == TOPLEVEL::section::config) { commandName = resolveConfig(synth, cmd, addValue); return withValue(commandName, type, showValue, addValue, value); } if (npart == TOPLEVEL::section::bank) { commandName = resolveBank(cmd, addValue); return withValue(commandName, type, showValue, addValue, value); } if (npart == TOPLEVEL::section::midiIn || npart == TOPLEVEL::section::main) { commandName = resolveMain(cmd, addValue); return withValue(commandName, type, showValue, addValue, value); } if (npart == TOPLEVEL::section::systemEffects || npart == TOPLEVEL::section::insertEffects) { commandName = resolveEffects(cmd, addValue); return withValue(commandName, type, showValue, addValue, value); } if (npart == TOPLEVEL::section::undoMark) { if (control == MAIN::undo) return "Nothing to undo!"; else if (control == MAIN::redo) return "Nothing to redo!"; } if ((effSend >= EFFECT::type::none && effSend < EFFECT::type::count) || (control >= PART::control::effectNumber && control <= PART::control::effectBypass && effSend == UNUSED)) { commandName = resolveEffects(cmd, addValue); return withValue(commandName, type, showValue, addValue, value); } if (npart >= NUM_MIDI_PARTS) return "Invalid part " + to_string(int(npart) + 1); if (kititem >= NUM_KIT_ITEMS && kititem < UNUSED) return "Invalid kit " + to_string(int(kititem) + 1); if (kititem == UNUSED || insert == TOPLEVEL::insert::kitGroup) { commandName = resolvePart(cmd, addValue); return withValue(commandName, type, showValue, addValue, value); } if (engine == PART::engine::padSynth) { switch(insert) { case UNUSED: commandName = resolvePad(synth, cmd, addValue); break; case TOPLEVEL::insert::LFOgroup: commandName = resolveLFO(cmd, addValue); break; case TOPLEVEL::insert::filterGroup: commandName = resolveFilter(cmd, addValue); break; case TOPLEVEL::insert::envelopeGroup: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointDelete: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointChange: commandName = resolveEnvelope(cmd, addValue); return withValue(commandName, type, showValue, addValue, value, offset); case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::oscillatorGroup: commandName = resolveOscillator(synth, cmd, addValue); break; case TOPLEVEL::insert::harmonicAmplitude: commandName = resolveOscillator(synth, cmd, addValue); break; case TOPLEVEL::insert::harmonicPhase: commandName = resolveOscillator(synth, cmd, addValue); break; case TOPLEVEL::insert::resonanceGroup: commandName = resolveResonance(synth, cmd, addValue); break; case TOPLEVEL::insert::resonanceGraphInsert: commandName = resolveResonance(synth, cmd, addValue); break; } return withValue(commandName, type, showValue, addValue, value); } if (engine == PART::engine::subSynth) { switch (insert) { case UNUSED: commandName = resolveSub(cmd, addValue); break; case TOPLEVEL::insert::harmonicAmplitude: commandName = resolveSub(cmd, addValue); break; case TOPLEVEL::insert::harmonicBandwidth: commandName = resolveSub(cmd, addValue); break; case TOPLEVEL::insert::filterGroup: commandName = resolveFilter(cmd, addValue); break; case TOPLEVEL::insert::envelopeGroup: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::LFOgroup: commandName = resolveLFO(cmd, addValue); break; case TOPLEVEL::insert::envelopePointDelete: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointChange: commandName = resolveEnvelope(cmd, addValue); return withValue(commandName, type, showValue, addValue, value, offset); case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: commandName = resolveEnvelope(cmd, addValue); break; } return withValue(commandName, type, showValue, addValue, value); } if (engine >= PART::engine::addVoice1) { switch (insert) { case UNUSED: commandName = resolveAddVoice(cmd, addValue); break; case TOPLEVEL::insert::LFOgroup: commandName = resolveLFO(cmd, addValue); break; case TOPLEVEL::insert::filterGroup: commandName = resolveFilter(cmd, addValue); break; case TOPLEVEL::insert::envelopeGroup: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointDelete: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointChange: commandName = resolveEnvelope(cmd, addValue); return withValue(commandName, type, showValue, addValue, value, offset); case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::oscillatorGroup: commandName = resolveOscillator(synth, cmd, addValue); break; case TOPLEVEL::insert::harmonicAmplitude: commandName = resolveOscillator(synth, cmd, addValue); break; case TOPLEVEL::insert::harmonicPhase: commandName = resolveOscillator(synth, cmd, addValue); break; } return withValue(commandName, type, showValue, addValue, value); } if (engine == PART::engine::addSynth) { switch (insert) { case UNUSED: commandName = resolveAdd(cmd, addValue); break; case TOPLEVEL::insert::LFOgroup: commandName = resolveLFO(cmd, addValue); break; case TOPLEVEL::insert::filterGroup: commandName = resolveFilter(cmd, addValue); break; case TOPLEVEL::insert::envelopeGroup: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointDelete: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointChange: commandName = resolveEnvelope(cmd, addValue); return withValue(commandName, type, showValue, addValue, value, offset); case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::resonanceGroup: commandName = resolveResonance(synth, cmd, addValue); break; case TOPLEVEL::insert::resonanceGraphInsert: commandName = resolveResonance(synth, cmd, addValue); break; } } return withValue(commandName, type, showValue, addValue, value); } string DataText::resolveVector(CommandBlock& cmd, bool addValue) { int value_int = lrint(cmd.data.value); uchar control = cmd.data.control; uint chan = cmd.data.parameter; bool isFeature{false}; string contstr; switch (control) { case VECTOR::control::name: showValue = false; contstr = "Name " + textMsgBuffer.fetch(value_int); break; case VECTOR::control::Xcontroller: contstr = "Controller"; break; case VECTOR::control::XleftInstrument: contstr = "Left Instrument"; break; case VECTOR::control::XrightInstrument: contstr = "Right Instrument"; break; case VECTOR::control::Xfeature0: case VECTOR::control::Yfeature0: contstr = "Volume"; isFeature = true; break; case VECTOR::control::Xfeature1: case VECTOR::control::Yfeature1: contstr = "Panning"; isFeature = true; break; case VECTOR::control::Xfeature2: case VECTOR::control::Yfeature2: contstr = "Filter"; isFeature = true; break; case VECTOR::control::Xfeature3: case VECTOR::control::Yfeature3: contstr = "Modulation"; isFeature = true; break; case VECTOR::control::Ycontroller: contstr = "Controller"; break; case VECTOR::control::YupInstrument: contstr = "Up Instrument"; break; case VECTOR::control::YdownInstrument: contstr = "Down Instrument"; break; case VECTOR::control::erase: showValue = false; if (chan > NUM_MIDI_CHANNELS) contstr = "all channels"; else contstr = "chan " + to_string(chan + 1); if (addValue) return("Vector cleared on " + contstr); break; case 127: break; default: showValue = false; contstr = "Unrecognised Vector"; break; } if (control == VECTOR::control::undefined) { showValue = false; return("Vector " + contstr + " set to " + to_string(chan + 1)); } string name = "Vector Chan " + to_string(chan + 1) + " "; if (control == 127) name += " all "; else if (control >= VECTOR::control::Ycontroller) name += "Y "; else if (control >= VECTOR::control::Xcontroller) name += "X "; if (isFeature) { showValue = false; switch (value_int) { case 0: contstr += " off"; break; case 1: contstr += " on"; break; case 2: contstr += " reverse"; break; } } return (name + contstr); } string DataText::resolveMicrotonal(CommandBlock& cmd, bool addValue) { int value = cmd.data.value; uchar control = cmd.data.control; uchar parameter = cmd.data.parameter; string contstr; switch (control) { case SCALES::control::refFrequency: if (addValue) { if (parameter >= 21 && parameter <= 84) contstr = noteslist[parameter - 21]; else contstr = to_string(parameter); } contstr += " Frequency"; break; case SCALES::control::refNote: showValue = false; contstr = "Ref note "; if (addValue) { contstr += to_string(value); if (value >= 21 && value <= 84) contstr += " " + noteslist[value - 21]; } break; case SCALES::control::invertScale: contstr = "Invert Keys"; yesno = true; break; case SCALES::control::invertedScaleCenter: contstr = "Key Center"; break; case SCALES::control::scaleShift: contstr = "Scale Shift"; break; case SCALES::control::enableMicrotonal: contstr = "Enable Microtonal"; yesno = true; break; case SCALES::control::enableKeyboardMap: contstr = "Enable Keyboard Mapping"; yesno = true; break; case SCALES::control::lowKey: contstr = "Keyboard First Note"; break; case SCALES::control::middleKey: contstr = "Keyboard Middle Note"; break; case SCALES::control::highKey: contstr = "Keyboard Last Note"; break; case SCALES::control::tuning: contstr = "Tuning "; showValue = false; break; case SCALES::control::keyboardMap: contstr = "Keymap "; showValue = false; break; case SCALES::control::keymapSize: contstr = "Keymap Size "; break; case SCALES::control::importScl: contstr = "Tuning Import "; showValue = false; break; case SCALES::control::importKbm: contstr = "Keymap Import "; showValue = false; break; case SCALES::control::exportScl: contstr = "Tuning Export "; showValue = false; break; case SCALES::control::exportKbm: contstr = "Keymap Export "; showValue = false; break; case SCALES::control::name: contstr = "Name: "; if (addValue) contstr += textMsgBuffer.fetch(cmd.data.miscmsg, false); showValue = false; break; case SCALES::control::comment: contstr = "Description: "; if (addValue) contstr += textMsgBuffer.fetch(cmd.data.miscmsg, false); showValue = false; break; case SCALES::control::clearAll: contstr = "Clear all settings"; showValue = false; break; default: showValue = false; contstr = "Unrecognised Microtonal"; break; } if (value < 1 and ( control == SCALES::control::tuning or control == SCALES::control::keyboardMap or control == SCALES::control::importScl or control == SCALES::control::importKbm )) // errors :@( contstr += scale_errors[0-value]; return ("Scales " + contstr); } string DataText::resolveConfig(SynthEngine& synth, CommandBlock& cmd, bool addValue) { float value = cmd.data.value; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); uchar control = cmd.data.control; uchar kititem = cmd.data.kit; uchar parameter = cmd.data.parameter; bool write = cmd.data.type & TOPLEVEL::type::Write; string contstr; switch (control) { case CONFIG::control::oscillatorSize: contstr = "AddSynth oscillator size"; break; case CONFIG::control::bufferSize: contstr = "Internal buffer size"; break; case CONFIG::control::padSynthInterpolation: contstr = "PadSynth interpolation "; if (addValue) { if (value_bool) contstr += "cubic"; else contstr += "linear"; } showValue = false; break; case CONFIG::control::handlePadSynthBuild: contstr = "PADSynth wavetable build "; if (addValue) { switch (value_int) { case 0: contstr += "Muted"; break; case 1: contstr += "Background"; break; case 2: contstr += "AutoApply"; break; } } showValue = false; break; case CONFIG::control::virtualKeyboardLayout: contstr = "Virtual keyboard "; if (addValue) { switch (value_int) { case 0: contstr += "QWERTY"; break; case 1: contstr += "Dvorak"; break; case 2: contstr += "QWERTZ"; break; case 3: contstr += "AZERTY"; break; } } showValue = false; break; case CONFIG::control::XMLcompressionLevel: contstr = "XML compression"; break; case CONFIG::control::enablePartReports: contstr = "part_changed_reports"; break; case CONFIG::control::reportsDestination: contstr = "Reports to "; if (addValue) { if (value_bool) contstr += "Console window"; else contstr += "stdout"; } showValue = false; break; case CONFIG::control::logTextSize: contstr = "Console text size"; break; case CONFIG::control::savedInstrumentFormat: contstr = "Saved instrument format "; if (addValue) { switch (value_int) { case 1: contstr += "Legacy (.xiz)"; break; case 2: contstr += "Yoshimi (.xiy)"; break; case 3: contstr += "Both"; break; } } showValue = false; break; case CONFIG::control::defaultStateStart: contstr += "Autoload default state"; yesno = true; break; case CONFIG::control::enableSinglePath: contstr += "Single master instance"; yesno = true; break; case CONFIG::control::hideNonFatalErrors: contstr += "Hide non-fatal errors"; yesno = true; break; case CONFIG::control::showSplash: contstr += "Show splash screen"; yesno = true; break; case CONFIG::control::logInstrumentLoadTimes: contstr += "Log instrument load times"; yesno = true; break; case CONFIG::control::logXMLheaders: contstr += "Log XML headers"; yesno = true; break; case CONFIG::control::saveAllXMLdata: contstr += "Save ALL XML data"; yesno = true; break; case CONFIG::control::enableGUI: contstr += "Enable GUI"; yesno = true; break; case CONFIG::control::enableCLI: contstr += "Enable CLI"; yesno = true; break; case CONFIG::control::enableAutoInstance: contstr += "Enable auto instance"; yesno = true; break; case CONFIG::control::enableHighlight: contstr += "Enable bank highlight"; yesno = true; break; case CONFIG::control::historyLock: { string group[] = {"Instrument", "Patchset", "Scale", "State", "Vector", "Mlearn"}; contstr = "History lock " + group[kititem]; yesno = true; break; } case CONFIG::control::exposeStatus: showValue = false; contstr += "Show CLI context "; if (addValue) { switch (value_int) { case 0: contstr += "off"; break; case 1: contstr += "on"; break; case 2: contstr += "prompt"; break; default: contstr += "unrecognised"; break; } } break; case CONFIG::control::readAudio: contstr += "Audio Destination "; if (addValue) { switch (value_int) { case 1: contstr += "JACK"; break; case 2: contstr += "ALSA"; break; default: contstr += "None"; } showValue = false; } break; case CONFIG::control::readMIDI: contstr += "MIDI Source "; if (addValue) { switch (value_int) { case 1: contstr += "JACK"; break; case 2: contstr += "ALSA"; break; default: contstr += "None"; } showValue = false; } break; case CONFIG::control::jackMidiSource: contstr += "JACK MIDI source: "; if (addValue) contstr += textMsgBuffer.fetch(value_int); showValue = false; break; case CONFIG::control::jackPreferredMidi: contstr += "Start with JACK MIDI"; yesno = true; break; case CONFIG::control::jackServer: contstr += "JACK server: "; if (addValue) contstr += textMsgBuffer.fetch(value_int); showValue = false; break; case CONFIG::control::jackPreferredAudio: contstr += "Start with JACK audio"; yesno = true; break; case CONFIG::control::jackAutoConnectAudio: contstr += "Auto-connect to JACK server"; yesno = true; break; case CONFIG::control::alsaMidiSource: contstr += "ALSA MIDI source: "; if (addValue) contstr += textMsgBuffer.fetch(value_int); showValue = false; break; case CONFIG::control::alsaPreferredMidi: contstr += "Start with ALSA MIDI"; yesno = true; break; case CONFIG::control::alsaMidiType: contstr += "ALSA MIDI connection type "; switch (value_int) { case 0: contstr += "Fixed"; break; case 1: contstr += "Search"; break; default: contstr += "External"; break; } showValue = false; break; case CONFIG::control::alsaAudioDevice: contstr += "ALSA audio device: "; if (addValue) contstr += textMsgBuffer.fetch(value_int); showValue = false; break; case CONFIG::control::alsaPreferredAudio: contstr += "Start with ALSA audio"; yesno = true; break; case CONFIG::control::alsaSampleRate: contstr += "ALSA sample rate: "; if (addValue) { switch (value_int) { // this is a hack :( case 0: case 192000: contstr += "0 (192000)"; break; case 1: case 96000: contstr += "1 (96000)"; break; case 2: case 48000: contstr += "2 (48000)"; break; case 3: case 44100: contstr += "3 (44100)"; break; } } showValue = false; break; case CONFIG::control::addPresetRootDir: contstr += "Preset root add"; if (addValue) contstr += textMsgBuffer.fetch(value_int); showValue = false; break; case CONFIG::control::removePresetRootDir: contstr += "Preset root unlinked "; if (addValue) contstr += textMsgBuffer.fetch(value_int); showValue = false; break; case CONFIG::control::currentPresetRoot: contstr += "Current preset root "; if (addValue) contstr += textMsgBuffer.fetch(value_int); showValue = false; break; case CONFIG::control::bankRootCC: contstr += "Bank root CC "; if (addValue) { if (parameter != UNUSED) contstr += textMsgBuffer.fetch(parameter); else { switch (value_int) { case 0: contstr += "MSB"; break; case 32: contstr += "LSB"; break; default: contstr += "OFF"; } } } showValue = false; break; case CONFIG::control::bankCC: contstr += "Bank CC "; if (addValue) { if (parameter != UNUSED) contstr += textMsgBuffer.fetch(parameter); else { switch (value_int) { case 0: contstr += "MSB"; break; case 32: contstr += "LSB"; break; default: contstr += "OFF"; } } } showValue = false; break; case CONFIG::control::enableProgramChange: contstr += "Enable program change"; yesno = true; break; case CONFIG::control::extendedProgramChangeCC: if (addValue) { if (parameter != UNUSED) { string test = textMsgBuffer.fetch(parameter); contstr += ("Extended program change CC in use by " + test); } else if (value == 128) { contstr += ("Extended program change disabled"); } else contstr += "CC for extended program change "; contstr += to_string(value_int); } showValue = false; break; case CONFIG::control::ignoreResetAllCCs: contstr += "Ignore 'reset all CCs'"; yesno = true; break; case CONFIG::control::logIncomingCCs: contstr += "Log incoming CCs"; yesno = true; break; case CONFIG::control::showLearnEditor: contstr += "Auto-open GUI MIDI-learn editor"; yesno = true; break; case CONFIG::control::enableOmni: contstr += "Enable Omni Mode Change"; yesno = true; break; case CONFIG::control::enableNRPNs: contstr += "Enable NRPN"; yesno = true; break; case CONFIG::control::saveCurrentConfig: { string name = textMsgBuffer.fetch(value_int); if (write) contstr += ("save" + name); else { contstr += "Condition - "; if (synth.getRuntime().configChanged) contstr += "DIRTY"; else contstr += "CLEAN"; } showValue = false; break; } default: contstr = "Unrecognised Config"; break; } return ("Config " + contstr); } string DataText::resolveBank(CommandBlock& cmd, bool) { int value_int = lrint(cmd.data.value); int control = cmd.data.control; int kititem = cmd.data.kit; int engine = cmd.data.engine; int insert = cmd.data.insert; string name{textMsgBuffer.fetch(value_int)}; string contstr; showValue = false; switch(control) { case BANK::control::renameInstrument: { contstr = "Instrument Rename" + name; break; } case BANK::control::saveInstrument: { contstr = "Instrument Save to slot " + name; break; } case BANK::control::deleteInstrument: contstr = "Instrument delete" + name; break; case BANK::control::selectFirstInstrumentToSwap: contstr = "Set Instrument ID " + to_string(insert + 1) + " Bank ID " + to_string(kititem) + " Root ID " + to_string(engine) + " for swap"; break; case BANK::control::selectSecondInstrumentAndSwap: if (name == "") name = "ped with Instrument ID " + to_string(insert + 1) + " Bank ID " + to_string(kititem) + " Root ID " + to_string(engine); contstr = "Swap" + name; break; case BANK::control::selectBank: contstr = name; break; case BANK::control::renameBank: contstr = name; break; case BANK::control::createBank: contstr = name; break; case BANK::control::findBankSize: if (value_int == UNUSED) contstr = " Bank " + to_string(kititem) + " does not exist."; else if (value_int == 0) contstr = " Bank " + to_string(kititem) + " is empty."; else contstr = " Bank " + to_string(kititem) + " contains " + to_string(value_int) + " instruments"; showValue = false; break; case BANK::control::selectFirstBankToSwap: contstr = "Set Bank ID " + to_string(kititem) + " Root ID " + to_string(engine) + " for swap"; break; case BANK::control::selectSecondBankAndSwap: if (name == "") name = "ped with Bank ID " + to_string(kititem) + " Root ID " + to_string(engine); contstr = "Swap" + name; break; case BANK::control::selectRoot: contstr = name; break; case BANK::control::changeRootId: contstr = "Root ID changed " + to_string(engine) + " > " + to_string(value_int); break; case BANK::control::addNamedRoot: if (value_int == UNUSED) contstr = name; else if (kititem != UNUSED) contstr = "Created Bank Root " + name; else contstr = "Link Bank Root " + name; break; case BANK::control::deselectRoot: if (value_int == UNUSED) contstr = "Bank Root " + to_string(kititem) + " does not exist"; else contstr = "Unlinked Bank Root " + to_string(kititem); showValue = false; break; default: contstr = "Unrecognised Bank"; break; } return ("Bank " + contstr); } string DataText::resolveMain(CommandBlock& cmd, bool addValue) { float value = cmd.data.value; int value_int = lrint(value); uchar control = cmd.data.control; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; string name; string contstr; if (cmd.data.part == TOPLEVEL::section::midiIn) { switch (control) { case MIDI::control::noteOn: showValue = false; break; case MIDI::control::noteOff: showValue = false; break; case MIDI::control::controller: contstr = "CC " + to_string(int(engine)) + " "; break; case MIDI::control::bankChange: showValue = false; contstr = textMsgBuffer.fetch(value_int); break; } return contstr; } switch (control) { case MAIN::control::volume: contstr = "Volume"; break; case MAIN::control::partNumber: showValue = false; contstr = "Part Number " + to_string(value_int + 1); break; case MAIN::control::availableParts: contstr = "Available Parts"; break; case MAIN::control::panLawType: contstr = "Panning Law "; if (addValue) { switch (value_int) { case MAIN::panningType::cut: contstr += "cut"; break; case MAIN::panningType::normal: contstr += "default"; break; case MAIN::panningType::boost: contstr += "boost"; break; default: contstr += "unrecognised"; } } showValue = false; break; case MAIN::control::detune: contstr = "Detune"; break; case MAIN::control::keyShift: contstr = "Key Shift"; break; case MAIN::control::bpmFallback: contstr = "Fallback BPM"; break; case MAIN::control::mono: contstr = "Master Mono/Stereo "; showValue = false; if (addValue) { if (value_int) contstr += "Mono"; else contstr += "Stereo"; } break; case MAIN::control::reseed: showValue = false; contstr += "reseeded to " + to_string(value_int); break; case MAIN::control::soloType: showValue = false; contstr = "Chan 'solo' Switch "; if (addValue) { switch (value_int) { case MIDI::SoloType::Disabled: contstr += "Off"; break; case MIDI::SoloType::Row: contstr += "Row"; break; case MIDI::SoloType::Column: contstr += "Column"; break; case MIDI::SoloType::Loop: contstr += "Loop"; break; case MIDI::SoloType::TwoWay: contstr += "Twoway"; break; case MIDI::SoloType::Channel: contstr += "Channel"; break; } } break; case MAIN::control::soloCC: showValue = false; contstr = "Chan 'solo' Switch CC "; if (addValue) { if (value_int > 127) contstr += "undefined - set type first"; else contstr += to_string(value_int); } break; case MAIN::control::exportBank: showValue = false; contstr = "Bank Export" + textMsgBuffer.fetch(value_int); break; case MAIN::control::importBank: showValue = false; contstr = "Bank Import" + textMsgBuffer.fetch(value_int); break; case MAIN::control::deleteBank: showValue = false; contstr = "Bank delete" + textMsgBuffer.fetch(value_int); break; case MAIN::control::loadInstrumentFromBank: showValue = false; contstr = "Part " + to_string (int(kititem + 1)) + " load" + textMsgBuffer.fetch(value_int); break; case MAIN::control::loadInstrumentByName: showValue = false; contstr = "Part " + to_string (int(kititem + 1)) + " load" + textMsgBuffer.fetch(value_int); break; case MAIN::control::saveNamedInstrument: showValue = false; contstr = "Instrument Save" + textMsgBuffer.fetch(value_int); break; case MAIN::control::loadNamedPatchset: showValue = false; contstr = "Patchset Load" + textMsgBuffer.fetch(value_int); break; case MAIN::control::saveNamedPatchset: showValue = false; contstr = "Patchset Save" + textMsgBuffer.fetch(value_int); break; case MAIN::control::loadNamedVector: showValue = false; name = textMsgBuffer.fetch(value_int); contstr = "Vector Load" + name; break; case MAIN::control::saveNamedVector: showValue = false; name = textMsgBuffer.fetch(value_int); contstr = "Vector Save" + name; break; case MAIN::control::loadNamedScale: showValue = false; name = textMsgBuffer.fetch(value_int); contstr = "Scale Load" + name; break; case MAIN::control::saveNamedScale: showValue = false; name = textMsgBuffer.fetch(value_int); contstr = "Scale Save" + name; break; case MAIN::control::loadNamedState: showValue = false; name = textMsgBuffer.fetch(value_int); contstr = "State Load" + name; break; case MAIN::control::saveNamedState: showValue = false; contstr = "State Save" + textMsgBuffer.fetch(value_int); break; case MAIN::control::loadFileFromList: showValue = false; contstr = "Load Recent" + textMsgBuffer.fetch(value_int); break; case MAIN::control::defaultPart: showValue = false; contstr = "Part " + to_string(value_int + 1) + " completely cleared"; break; case MAIN::control::defaultInstrument: showValue = false; contstr = "Part " + to_string(value_int + 1) + " instrument cleared"; break; case MAIN::control::exportPadSynthSamples: showValue = false; contstr = "PadSynth Samples Save" + textMsgBuffer.fetch(value_int); break; case MAIN::control::masterReset: showValue = false; contstr = "Reset All"; break; case MAIN::control::masterResetAndMlearn: showValue = false; contstr = "Reset All including MIDI-learn"; break; case TOPLEVEL::control::dataExchange: showValue = false; contstr = "Engine initialised"; break; case MAIN::control::openManual: showValue = false; contstr = "Open manual in reader " + textMsgBuffer.fetch(value_int); break; case MAIN::control::startInstance: showValue = false; contstr = "Start new instance " + to_string(value_int); break; case MAIN::control::stopInstance: showValue = false; contstr = "Close instance - " + textMsgBuffer.fetch(value_int); break; case MAIN::control::stopSound: showValue = false; contstr = "Sound Stopped"; break; case MAIN::control::readPartPeak: showValue = false; if (engine == 1) contstr = "Part R"; else contstr = "Part L"; contstr += to_string(int(kititem)); if (value < 0.0f) contstr += " silent "; contstr += (" peak level " + to_string(value)); break; case MAIN::control::readMainLRpeak: showValue = false; if (kititem == 1) contstr = "Right"; else contstr = "Left"; contstr += (" peak level " + to_string(value)); break; case MAIN::control::readMainLRrms: showValue = false; if (kititem == 1) contstr = "Right"; else contstr = "Left"; contstr += (" RMS level " + to_string(value)); break; default: showValue = false; contstr = "Unrecognised Main"; break; } return ("Main " + contstr); } string DataText::resolveAftertouch(bool type, int value, bool addValue) { string contstr; if (type) contstr = "ChannelAT"; else contstr = "KeyAT"; if (!addValue) return contstr; if (value == PART::aftertouchType::off) contstr += " Off"; else { if (value & PART::aftertouchType::filterCutoff) { contstr += "\n Filter Cutoff"; if (value & PART::aftertouchType::filterCutoffDown) contstr += " Down"; } if (value & PART::aftertouchType::filterQ) { contstr += "\n Peak"; if (value & PART::aftertouchType::filterQdown) contstr += " Down"; } if (value & PART::aftertouchType::pitchBend) { contstr += "\n Bend"; if (value & PART::aftertouchType::pitchBendDown) contstr += " Down"; } if (value & PART::aftertouchType::volume) contstr += "\n Volume"; if (value & PART::aftertouchType::modulation) contstr += "\n Modulation"; } return contstr; } string DataText::resolvePart(CommandBlock& cmd, bool addValue) { float value = cmd.data.value; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar effNum = engine; // note uchar insert = cmd.data.insert; uchar parameter = cmd.data.parameter; bool kitType = (insert == TOPLEVEL::insert::kitGroup); int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); if (control == UNUSED) return "Number of parts"; string kitnum; if (kitType) kitnum = " Kit " + to_string(kititem + 1) + " "; else kitnum = " "; string group = ""; if (kititem != UNUSED) { switch (engine) { case PART::engine::addSynth: group = "AddSynth "; break; case PART::engine::subSynth: group = "SubSynth "; break; case PART::engine::padSynth: group = "PadSynth "; break; } } string contstr = ""; switch (control) { case PART::control::enable: contstr += " Enable"; yesno = true; break; case PART::control::enableAdd: contstr += "AddSynth Enable"; yesno = true; break; case PART::control::enableSub: contstr += "SubSynth Enable"; yesno = true; break; case PART::control::enablePad: contstr += "PadSynth Enable"; yesno = true; break; case PART::control::enableKitLine: contstr += " Enable"; yesno = true; break; case PART::control::volume: contstr = "Volume"; break; case PART::control::velocitySense: contstr = "Velocity Sense"; break; case PART::control::panning: contstr = "Panning"; break; case PART::control::velocityOffset: contstr = "Velocity Offset"; break; case PART::control::midiChannel: showValue = false; contstr = "Midi CH "; if (addValue) { contstr += to_string(value_int + 1); if (value_int >= NUM_MIDI_CHANNELS * 2) contstr += " Midi ignored"; else if (value_int >= NUM_MIDI_CHANNELS) contstr = contstr + " Note off only from CH " + to_string(value_int + 1 - NUM_MIDI_CHANNELS); } break; case PART::control::omni: contstr = "Omni Mode"; yesno = true; break; case PART::control::keyMode: showValue = false; contstr = "Mode "; if (addValue) { if (value_int == 0) contstr += "Poly"; else if (value_int == 1) contstr += "Mono"; else if (value_int >= 2) contstr += "Legato"; } break; case PART::control::channelATset: showValue = false; contstr = resolveAftertouch(true, value_int, addValue); if (parameter != UNUSED) contstr = contstr + "\n" + resolveAftertouch(false, parameter, addValue); break; case PART::control::keyATset: showValue = false; contstr = resolveAftertouch(false, value_int, addValue); if (parameter != UNUSED) contstr = contstr + "\n" + resolveAftertouch(true, parameter, addValue); break; case PART::control::portamento: contstr = "Portamento Enable"; yesno = true; break; case PART::control::kitItemMute: if (kitType) { contstr = "Mute"; yesno = true; } break; case PART::control::minNote: contstr = "Min Note"; break; case PART::control::maxNote: contstr = "Max Note"; break; case PART::control::minToLastKey: // always return actual value contstr = "Min To Last"; break; case PART::control::maxToLastKey: // always return actual value contstr = "Max To Last"; break; case PART::control::resetMinMaxKey: contstr = "Full Key Range"; showValue = false; break; case PART::control::kitEffectNum: if (value_int == 0) contstr = "Effect Off"; else contstr = "Effect Number " + to_string(value_int); showValue = false; break; case PART::control::maxNotes: contstr = "Key Limit"; break; case PART::control::keyShift: contstr = "Key Shift"; break; case PART::control::partToSystemEffect1: contstr = "Effect Send 1"; break; case PART::control::partToSystemEffect2: contstr = "Effect Send 2"; break; case PART::control::partToSystemEffect3: contstr = "Effect Send 3"; break; case PART::control::partToSystemEffect4: contstr = "Effect Send 4"; break; case PART::control::humanise: contstr = "Humanise Pitch"; break; case PART::control::humanvelocity: contstr = "Humanise Velocity"; break; case PART::control::drumMode: contstr = "Drum Mode"; yesno = true; break; case PART::control::kitMode: contstr = "Kit Mode "; showValue = false; if (addValue) { switch(value_int) { case 0: contstr += "off"; break; case 1: contstr += "multi"; break; case 2: contstr += "single"; break; case 3: contstr += "crossfade"; break; } } break; case PART::control::effectNumber: contstr = "Effect Number " + to_string(value_int); showValue = false; break; case PART::control::effectType: contstr = "Effect " + to_string(effNum + 1) + " Type"; break; case PART::control::effectDestination: contstr = "Effect " + to_string(effNum + 1) + " Destination"; break; case PART::control::audioDestination: contstr = "Audio destination "; showValue = false; if (addValue) { switch(value_int) { case 3: contstr += "both"; break; case 2: contstr += "part"; break; case 1: contstr += "main"; break; default: contstr += "main"; break; } } break; case PART::control::instrumentCopyright: showValue = false; contstr = "Copyright: " + textMsgBuffer.fetch(value_int); break; case PART::control::instrumentComments: showValue = false; contstr = "Comment: " + textMsgBuffer.fetch(value_int); break; case PART::control::instrumentName: showValue = false; contstr = "Name is: " + textMsgBuffer.fetch(value_int); break; case PART::control::instrumentType: showValue = false; contstr = "Type is: " + type_list[value_int]; break; case PART::control::defaultInstrumentCopyright: showValue = false; contstr = "Copyright "; if (parameter == 0) contstr += "load:\n"; else contstr += "save:\n"; contstr += textMsgBuffer.fetch(value_int); break; case PART::control::resetAllControllers: showValue = false; contstr = "Cleared controllers"; break; case TOPLEVEL::control::partBusy: showValue = false; if (value_bool) contstr = "is busy"; else contstr = "is free"; break; } if (!contstr.empty()) return ("Part " + to_string(npart + 1) + kitnum + group + contstr); switch (control) { case PART::control::volumeRange: contstr = "Vol Range"; // not the *actual* volume break; case PART::control::volumeEnable: contstr = "Vol Enable"; yesno = true; break; case PART::control::panningWidth: contstr = "Pan Width"; break; case PART::control::modWheelDepth: contstr = "Mod Wheel Range"; break; case PART::control::exponentialModWheel: contstr = "Exponent Mod Wheel"; yesno = true; break; case PART::control::bandwidthDepth: contstr = "Bandwidth range"; break; case PART::control::exponentialBandwidth: contstr = "Exponent Bandwidth"; yesno = true; break; case PART::control::expressionEnable: contstr = "Expression Enable"; yesno = true; break; case PART::control::FMamplitudeEnable: contstr = "FM Amp Enable"; yesno = true; break; case PART::control::sustainPedalEnable: contstr = "Sustain Ped Enable"; yesno = true; break; case PART::control::pitchWheelRange: contstr = "Pitch Wheel Range"; break; case PART::control::filterQdepth: contstr = "Filter Q Range"; break; case PART::control::filterCutoffDepth: contstr = "Filter Cutoff Range"; break; case PART::control::breathControlEnable: yesno = true; contstr = "Breath Control"; yesno = true; break; case PART::control::resonanceCenterFrequencyDepth: contstr = "Res Cent Freq Range"; break; case PART::control::resonanceBandwidthDepth: contstr = "Res Band Range"; break; case PART::control::portamentoTime: contstr = "Time"; break; case PART::control::portamentoTimeStretch: contstr = "Time Stretch"; break; case PART::control::portamentoThreshold: contstr = "Threshold Gate"; break; case PART::control::portamentoThresholdType: contstr = "Threshold Gate Type "; showValue = false; if (value_int == 0) contstr += ">= start"; else contstr += "< end"; break; case PART::control::enableProportionalPortamento: contstr = "Prop Enable"; yesno = true; break; case PART::control::proportionalPortamentoRate: contstr = "Prop Rate"; break; case PART::control::proportionalPortamentoDepth: contstr = "Prop depth"; break; case PART::control::receivePortamento: contstr = "Receive"; yesno = true; break; } if (!contstr.empty()) return ("Part " + to_string(npart + 1) + kitnum + "Controller " + contstr); string name = "MIDI "; switch (control) { case PART::control::midiModWheel: contstr = "Modulation"; break; case PART::control::midiBreath: ; // not yet break; case PART::control::midiExpression: contstr = "Expression"; break; case PART::control::midiSustain: ; // not yet break; case PART::control::midiPortamento: ; // not yet break; case PART::control::midiFilterQ: contstr = "Filter Q"; break; case PART::control::midiFilterCutoff: contstr = "Filter Cutoff"; break; case PART::control::midiBandwidth: contstr = "Bandwidth"; break; case PART::control::midiFMamp: contstr = "FM Amp"; break; case PART::control::midiResonanceCenter: contstr = "Resonance Cent"; break; case PART::control::midiResonanceBandwidth: contstr = "Resonance Band"; break; default: showValue = false; name = ""; contstr = "Unrecognised Part"; break; } return ("Part " + to_string(npart + 1) + kitnum + name + contstr); } string DataText::resolveAdd(CommandBlock& cmd, bool addValue) { float value = cmd.data.value; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; string contstr; switch (control) { case ADDSYNTH::control::volume: contstr = "Volume"; break; case ADDSYNTH::control::velocitySense: contstr = "Velocity Sense"; break; case ADDSYNTH::control::panning: contstr = "Panning"; break; case ADDSYNTH::control::enableRandomPan: contstr = "Random Pan"; yesno = true; break; case ADDSYNTH::control::randomWidth: contstr = "Random Width"; break; case ADDSYNTH::control::detuneFrequency: contstr = "Detune"; break; case ADDSYNTH::control::octave: contstr = "Octave"; break; case ADDSYNTH::control::detuneType: contstr = "Detune Type "; showValue = false; if (addValue) contstr += detuneType [int(value)]; break; case ADDSYNTH::control::coarseDetune: contstr = "Coarse Det"; break; case ADDSYNTH::control::relativeBandwidth: contstr = "Relative Bandwidth"; break; case ADDSYNTH::control::stereo: contstr = "Stereo"; yesno = true; break; case ADDSYNTH::control::randomGroup: contstr = "Rnd Grp"; yesno = true; break; case ADDSYNTH::control::dePop: contstr = "De Pop"; break; case ADDSYNTH::control::punchStrength: contstr = "Punch Strength"; break; case ADDSYNTH::control::punchDuration: contstr = "Punch Time"; break; case ADDSYNTH::control::punchStretch: contstr = "Punch Stretch"; break; case ADDSYNTH::control::punchVelocity: contstr = "Punch Velocity"; break; default: showValue = false; contstr = "Unrecognised AddSynth"; break; } return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + " AddSynth " + contstr); } string DataText::resolveAddVoice(CommandBlock& cmd, bool addValue) { float value = cmd.data.value; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; int value_int = lrint(value); int nvoice; if (engine >= PART::engine::addMod1) nvoice = engine - PART::engine::addMod1; else nvoice = engine - PART::engine::addVoice1; string contstr = ""; switch (control) { case ADDVOICE::control::volume: contstr = "Volume"; break; case ADDVOICE::control::velocitySense: contstr = "Velocity Sense"; break; case ADDVOICE::control::panning: contstr = "Panning"; break; case ADDVOICE::control::enableRandomPan: contstr = "Random Pan"; yesno = true; break; case ADDVOICE::control::randomWidth: contstr = "Random Width"; break; case ADDVOICE::control::invertPhase: contstr = "Minus"; yesno = true; break; case ADDVOICE::control::enableAmplitudeEnvelope: contstr = "Amp Enable Env"; yesno = true; break; case ADDVOICE::control::enableAmplitudeLFO: contstr = "Amp Enable LFO"; yesno = true; break; case ADDVOICE::control::modulatorType: contstr = "Modulator Type "; if (addValue) { showValue = false; contstr += addmodnameslist[value_int]; } break; case ADDVOICE::control::externalModulator: if (addValue) { showValue = false; if (value_int < 0) contstr = "Local"; else contstr = "Modulator Source Voice " + to_string(value_int + 1); } break; case ADDVOICE::control::externalOscillator: if (addValue) { showValue = false; if (value_int < 0) contstr = "Local"; else contstr = "Source " + to_string(value_int + 1); } break; case ADDVOICE::control::detuneFrequency: contstr = "Detune"; break; case ADDVOICE::control::equalTemperVariation: contstr = "Equal Temper"; break; case ADDVOICE::control::baseFrequencyAs440Hz: contstr = "440Hz"; yesno = true; break; case ADDVOICE::control::octave: contstr = "Octave"; break; case ADDVOICE::control::detuneType: contstr = "Detune Type "; showValue = false; if (addValue) contstr += stringCaps(detuneType [int(value)], 1); break; case ADDVOICE::control::coarseDetune: contstr = "Coarse Detune"; break; case ADDVOICE::control::pitchBendAdjustment: contstr = "Bend Adj"; break; case ADDVOICE::control::pitchBendOffset: contstr = "Offset Hz"; break; case ADDVOICE::control::enableFrequencyEnvelope: contstr = "Freq Enable Env"; yesno = true; break; case ADDVOICE::control::enableFrequencyLFO: contstr = "Freq Enable LFO"; yesno = true; break; case ADDVOICE::control::unisonFrequencySpread: contstr = "Unison Freq Spread"; break; case ADDVOICE::control::unisonPhaseRandomise: contstr = "Unison Phase Rnd"; break; case ADDVOICE::control::unisonStereoSpread: contstr = "Unison Stereo"; break; case ADDVOICE::control::unisonVibratoDepth: contstr = "Unison Vibrato"; break; case ADDVOICE::control::unisonVibratoSpeed: contstr = "Unison Vib Speed"; break; case ADDVOICE::control::unisonSize: contstr = "Unison Size"; break; case ADDVOICE::control::unisonPhaseInvert: showValue = false; contstr = "Unison Invert " + unisonPhase[value_int]; break; case ADDVOICE::control::enableUnison: contstr = "Unison Enable"; yesno = true; break; case ADDVOICE::control::bypassGlobalFilter: contstr = "Filter Bypass Global"; yesno = true; break; case ADDVOICE::control::enableFilter: contstr = "Filter Enable"; yesno = true; break; case ADDVOICE::control::enableFilterEnvelope: contstr = "Filter Enable Env"; yesno = true; break; case ADDVOICE::control::enableFilterLFO: contstr = "Filter Enable LFO"; yesno = true; break; case ADDVOICE::control::modulatorAmplitude: contstr = "Modulator Volume"; break; case ADDVOICE::control::modulatorVelocitySense: contstr = "Modulator Vel Sense"; break; case ADDVOICE::control::modulatorHFdamping: contstr = "Modulator HF Damping"; break; case ADDVOICE::control::enableModulatorAmplitudeEnvelope: contstr = "Modulator Amp Enable Env"; yesno = true; break; case ADDVOICE::control::modulatorDetuneFrequency: contstr = "Modulator Detune"; break; case ADDVOICE::control::modulatorFrequencyAs440Hz: contstr = "Modulator 440Hz"; yesno = true; break; case ADDVOICE::control::modulatorDetuneFromBaseOsc: contstr = "Modulator Follow voice"; yesno = true; break; case ADDVOICE::control::modulatorOctave: contstr = "Modulator Octave"; break; case ADDVOICE::control::modulatorDetuneType: contstr = "Modulator Detune Type "; showValue = false; if (addValue) contstr += detuneType [int(value)]; break; case ADDVOICE::control::modulatorCoarseDetune: contstr = "Modulator Coarse Detune"; break; case ADDVOICE::control::enableModulatorFrequencyEnvelope: // local, external contstr = "Modulator Freq Enable Env"; yesno = true; break; case ADDVOICE::control::modulatorOscillatorPhase: contstr = "Modulator Osc Phase"; break; case ADDVOICE::control::modulatorOscillatorSource: if (addValue) { showValue = false; if (value_int < 0) contstr = "Modulator Internal"; else contstr = "Modulator Osc from " + to_string(value_int + 1); } break; case ADDVOICE::control::delay: contstr = "Delay"; break; case ADDVOICE::control::enableVoice: contstr = "Enable"; yesno = true; break; case ADDVOICE::control::enableResonance: contstr = "Resonance Enable"; yesno = true; break; case ADDVOICE::control::voiceOscillatorPhase: contstr = "Osc Phase"; break; case ADDVOICE::control::voiceOscillatorSource: if (addValue) { showValue = false; if (value_int < 0) contstr = "Internal"; else contstr = "from " + to_string(value_int + 1); } break; case ADDVOICE::control::soundType: contstr = "Sound type"; break; default: showValue = false; contstr = "Unrecognised AddVoice"; break; } return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + " Add Voice " + to_string(nvoice + 1) + " " + contstr); } string DataText::resolveSub(CommandBlock& cmd, bool addValue) { float value = cmd.data.value; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar insert = cmd.data.insert; int value_int = int(value); if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicBandwidth) { string Htype; if (insert == TOPLEVEL::insert::harmonicAmplitude) Htype = " Amplitude"; else Htype = " Bandwidth"; return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + " SubSynth Harmonic " + to_string(control + 1) + Htype); } string name = ""; string contstr = ""; switch (control) { case SUBSYNTH::control::volume: contstr = "Volume"; break; case SUBSYNTH::control::velocitySense: contstr = "Velocity Sense"; break; case SUBSYNTH::control::panning: contstr = "Panning"; break; case SUBSYNTH::control::enableRandomPan: contstr = "Random Pan"; yesno = true; break; case SUBSYNTH::control::randomWidth: contstr = "Random Width"; break; case SUBSYNTH::control::bandwidth: contstr = "Bandwidth"; // it's the actual bandwidth control break; case SUBSYNTH::control::bandwidthScale: contstr = "Bandwidth Band Scale"; break; case SUBSYNTH::control::enableBandwidthEnvelope: contstr = "Bandwidth Env Enab"; yesno = true; break; case SUBSYNTH::control::enableFrequencyLFO: contstr = "Frequency LFO Enab"; yesno = true; break; case SUBSYNTH::control::detuneFrequency: contstr = "Detune"; break; case SUBSYNTH::control::equalTemperVariation: contstr = "Equal Temper"; break; case SUBSYNTH::control::baseFrequencyAs440Hz: contstr = "440Hz"; yesno = true; break; case SUBSYNTH::control::octave: contstr = "Octave"; break; case SUBSYNTH::control::detuneType: contstr = "Detune Type "; showValue = false; if (addValue) contstr += detuneType [value_int]; break; case SUBSYNTH::control::coarseDetune: contstr = "Coarse Detune"; break; case SUBSYNTH::control::pitchBendAdjustment: contstr = "Bend Adj"; break; case SUBSYNTH::control::pitchBendOffset: contstr = "Offset Hz"; break; case SUBSYNTH::control::enableFrequencyEnvelope: contstr = "Frequency Env Enab"; yesno = true; break; case SUBSYNTH::control::overtoneParameter1: contstr = "Overtones Par 1"; break; case SUBSYNTH::control::overtoneParameter2: contstr = "Overtones Par 2"; break; case SUBSYNTH::control::overtoneForceHarmonics: contstr = "Overtones Force H"; break; case SUBSYNTH::control::overtonePosition: contstr = "Overtones Position " + subPadPosition[value_int]; showValue = false; break; case SUBSYNTH::control::enableFilter: contstr = "Filter Enable"; yesno = true; break; case SUBSYNTH::control::filterStages: contstr = "Filt Stages"; break; case SUBSYNTH::control::magType: contstr = "Mag Type " + subMagType [value_int]; showValue = false; break; case SUBSYNTH::control::startPosition: contstr = "Start "; showValue = false; switch (value_int) { case 0: contstr += "Zero"; break; case 1: contstr += "Random"; break; case 2: contstr += "Maximum"; break; } break; case SUBSYNTH::control::clearHarmonics: contstr = "Clear Harmonics"; showValue = false; break; case SUBSYNTH::control::stereo: contstr = "Stereo"; yesno = true; break; default: showValue = false; contstr = "Unrecognised SubSynth"; break; } return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + " SubSynth " + contstr); } string DataText::resolvePad(SynthEngine& synth, CommandBlock& cmd, bool addValue) { float value = cmd.data.value; int value_int = int(value); uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; bool write = (type & TOPLEVEL::type::Write) > 0; string contstr; switch (control) { case PADSYNTH::control::volume: contstr = "Volume"; break; case PADSYNTH::control::velocitySense: contstr = "Velocity Sense"; break; case PADSYNTH::control::panning: contstr = "Panning"; break; case PADSYNTH::control::enableRandomPan: contstr = "Random Pan"; yesno = true; break; case PADSYNTH::control::randomWidth: contstr = "Random Width"; break; case PADSYNTH::control::detuneFrequency: contstr = "Detune"; break; case PADSYNTH::control::equalTemperVariation: contstr = "Equal Temper"; break; case PADSYNTH::control::baseFrequencyAs440Hz: contstr = "440Hz"; yesno = true; break; case PADSYNTH::control::octave: contstr = "Octave"; break; case PADSYNTH::control::detuneType: contstr = "Detune Type "; showValue = false; if (addValue) contstr += detuneType [int(value)]; break; case PADSYNTH::control::coarseDetune: contstr = "Coarse Detune"; break; case PADSYNTH::control::pitchBendAdjustment: contstr = "Bend Adjust"; break; case PADSYNTH::control::pitchBendOffset: contstr = "Offset Hz"; break; case PADSYNTH::control::stereo: contstr = "Stereo"; yesno = true; break; case PADSYNTH::control::dePop: contstr = "De Pop"; break; case PADSYNTH::control::punchStrength: contstr = "Punch Strength"; break; case PADSYNTH::control::punchDuration: contstr = "Punch Time"; break; case PADSYNTH::control::punchStretch: contstr = "Punch Stretch"; break; case PADSYNTH::control::punchVelocity: contstr = "Punch Velocity"; break; case PADSYNTH::control::applyChanges: showValue = false; contstr = "Changes Applied "; if (addValue) { if (value_int != 0) contstr += "Yes"; else contstr += "No"; } break; } if (!contstr.empty()) return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + " PadSynth " + contstr); switch (control) { case PADSYNTH::control::overtoneParameter1: contstr = "Overtones Par 1"; break; case PADSYNTH::control::overtoneParameter2: contstr = "Overtones Par 2"; break; case PADSYNTH::control::overtoneForceHarmonics: contstr = "Overtones Force H"; break; case PADSYNTH::control::overtonePosition: contstr = "Position " + subPadPosition[value_int]; showValue = false; break; case PADSYNTH::control::bandwidth: contstr = "Bandwidth"; break; case PADSYNTH::control::bandwidthScale: contstr = "Bandwidth Scale"; break; case PADSYNTH::control::spectrumMode: contstr = "Spectrum Mode"; break; case PADSYNTH::control::xFadeUpdate: contstr = "XFade Update"; break; case PADSYNTH::control::rebuildTrigger: contstr = "BuildTrigger"; break; case PADSYNTH::control::randWalkDetune: contstr = "RWDetune"; break; case PADSYNTH::control::randWalkBandwidth: contstr = "RWBandwidth"; break; case PADSYNTH::control::randWalkFilterFreq: contstr = "RWFilterFreq"; break; case PADSYNTH::control::randWalkProfileWidth: contstr = "RWWidthProfile"; break; case PADSYNTH::control::randWalkProfileStretch: contstr = "RWStretchProfile"; break; } string padApply{synth.getRuntime().usePadAutoApply()? " - rebuilding PAD" : " - Need to Apply"}; if (!contstr.empty()) { if (write) contstr += padApply; return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + " PadSynth " + contstr); } switch (control) { case PADSYNTH::control::baseWidth: contstr = "Width"; break; case PADSYNTH::control::frequencyMultiplier: contstr = "Freq Mult"; break; case PADSYNTH::control::modulatorStretch: contstr = "Str"; break; case PADSYNTH::control::modulatorFrequency: contstr = "Freq"; break; case PADSYNTH::control::size: contstr = "Size"; break; case PADSYNTH::control::baseType: contstr = "Type"; break; case PADSYNTH::control::harmonicSidebands: contstr = "Halves"; break; case PADSYNTH::control::spectralWidth: contstr = "Amp Par 1"; break; case PADSYNTH::control::spectralAmplitude: contstr = "Amp Par 2"; break; case PADSYNTH::control::amplitudeMultiplier: contstr = "Amp Mult"; break; case PADSYNTH::control::amplitudeMode: contstr = "Amp Mode"; break; case PADSYNTH::control::autoscale: // contstr = "Autoscale"; yesno = true; break; } if (!contstr.empty()) { contstr = "Harmonic Base " + contstr; if (write) contstr += padApply; return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + " PadSynth " + contstr); } switch (control) { case PADSYNTH::control::harmonicBase: contstr = "Base"; break; case PADSYNTH::control::samplesPerOctave: contstr = "samp/Oct"; break; case PADSYNTH::control::numberOfOctaves: contstr = "Num Oct"; break; case PADSYNTH::control::sampleSize: break; default: showValue = false; contstr = "Unrecognised PadSynth"; break; } if (contstr != "Unrecognised PadSynth") contstr = "Harmonic Samples " + contstr; if (write && contstr != "Unrecognised PadSynth") contstr += padApply; return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + " PadSynth " + contstr); } string DataText::resolveOscillator(SynthEngine& synth, CommandBlock& cmd, bool addValue) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar insert = cmd.data.insert; bool write = (type & TOPLEVEL::type::Write) > 0; int value_int = int(value); string isPad; string eng_name; if (engine == PART::engine::padSynth) { eng_name = " PadSynth"; if (write) isPad = synth.getRuntime().usePadAutoApply()? " - rebuilding PAD" : " - Need to Apply"; } else { int eng; if (engine >= PART::engine::addMod1) eng = engine - PART::engine::addMod1; else eng = engine - PART::engine::addVoice1; eng_name = " Add Voice " + to_string(eng + 1); if (engine >= PART::engine::addMod1) eng_name += " Modulator"; } if (insert == TOPLEVEL::insert::harmonicAmplitude) { return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + eng_name + " Harmonic " + to_string((int)control + 1) + " Amplitude" + isPad); } else if (insert == TOPLEVEL::insert::harmonicPhase) { return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + eng_name + " Harmonic " + to_string((int)control + 1) + " Phase" + isPad); } string contstr; switch (control) { case OSCILLATOR::control::phaseRandomness: contstr = "Random"; break; case OSCILLATOR::control::magType: contstr = "Mag Type"; break; case OSCILLATOR::control::harmonicAmplitudeRandomness: contstr = "Harm Rnd"; break; case OSCILLATOR::control::harmonicRandomnessType: contstr = "Harm Rnd Type"; break; case OSCILLATOR::control::clearHarmonics: contstr = "Clear Harmonics"; break; case OSCILLATOR::control::convertToSine: contstr = "Conv To Sine"; break; } if (!contstr.empty()) { return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + eng_name + " Oscillator " + contstr + isPad); } switch(control) { case OSCILLATOR::control::baseFunctionParameter: contstr = "Par"; break; case OSCILLATOR::control::baseFunctionType: contstr = "Type "; showValue = false; if (addValue) contstr += stringCaps(waveformlist[int(value) * 2], 1); break; case OSCILLATOR::control::baseModulationParameter1: contstr = "Mod Par 1"; break; case OSCILLATOR::control::baseModulationParameter2: contstr = "Mod Par 2"; break; case OSCILLATOR::control::baseModulationParameter3: contstr = "Mod Par 3"; break; case OSCILLATOR::control::baseModulationType: contstr = "Mod Type"; break; case OSCILLATOR::control::autoClear: // this is local to the GUI break; } if (!contstr.empty()) { return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + eng_name + " Base Func " + contstr + isPad); } switch(control) { case OSCILLATOR::control::useAsBaseFunction: contstr = "Osc As Base"; break; case OSCILLATOR::control::waveshapeParameter: contstr = "Waveshape Par"; break; case OSCILLATOR::control::waveshapeType: contstr = "Waveshape Type"; break; case OSCILLATOR::control::filterParameter1: contstr = "Osc Filt Par 1"; break; case OSCILLATOR::control::filterParameter2: contstr = "Osc Filt Par 2"; break; case OSCILLATOR::control::filterBeforeWaveshape: contstr = "Osc Filt B4 Waveshape"; break; case OSCILLATOR::control::filterType: contstr = "Osc Filt Type "; if (addValue) { showValue = false; contstr += filtertype[value_int]; } break; case OSCILLATOR::control::modulationParameter1: contstr = "Osc Mod Par 1"; break; case OSCILLATOR::control::modulationParameter2: contstr = "Osc Mod Par 2"; break; case OSCILLATOR::control::modulationParameter3: contstr = "Osc Mod Par 3"; break; case OSCILLATOR::control::modulationType: contstr = "Osc Mod Type"; break; case OSCILLATOR::control::spectrumAdjustParameter: contstr = "Osc Spect Par"; break; case OSCILLATOR::control::spectrumAdjustType: contstr = "Osc Spect Type"; break; } if (!contstr.empty()) { return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + eng_name + " Base Mods " + contstr + isPad); } switch(control) { case OSCILLATOR::control::harmonicShift: contstr = "Shift"; break; case OSCILLATOR::control::clearHarmonicShift: contstr = "Reset"; break; case OSCILLATOR::control::shiftBeforeWaveshapeAndFilter: contstr = "B4 Waveshape & Filt"; break; case OSCILLATOR::control::adaptiveHarmonicsParameter: contstr = "Adapt Param"; break; case OSCILLATOR::control::adaptiveHarmonicsBase: contstr = "Adapt Base Freq"; break; case OSCILLATOR::control::adaptiveHarmonicsPower: contstr = "Adapt Power"; break; case OSCILLATOR::control::adaptiveHarmonicsType: contstr = "Adapt Type"; break; default: showValue = false; contstr = "Unrecognised Oscillator"; break; } return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + eng_name + " Harm Mods " + contstr + isPad); } string DataText::resolveResonance(SynthEngine& synth, CommandBlock& cmd, bool addValue) { int value = int(cmd.data.value + 0.5f); uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar insert = cmd.data.insert; uchar parameter = cmd.data.parameter; bool write = (type & TOPLEVEL::type::Write) > 0; string name; string isPad; if (engine == PART::engine::padSynth && control != PADSYNTH::control::applyChanges) { name = " PadSynth"; if (write) isPad = synth.getRuntime().usePadAutoApply()? " - rebuilding PAD" : " - Need to Apply"; } else name = " AddSynth"; if (insert == TOPLEVEL::insert::resonanceGraphInsert) { return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + name + " Resonance Point " + to_string(parameter + 1) + isPad); } string contstr; switch (control) { case RESONANCE::control::maxDb: contstr = "Max dB"; break; case RESONANCE::control::centerFrequency: contstr = "Center Freq"; break; case RESONANCE::control::octaves: contstr = "Octaves"; break; case RESONANCE::control::enableResonance: contstr = "Enable"; yesno = true; break; case RESONANCE::control::randomType: contstr = "Random"; showValue = false; if (addValue) { if (value == 0) contstr += " - coarse"; else if (value == 1) contstr += " - medium"; else contstr += " - fine"; } break; case RESONANCE::control::interpolatePeaks: contstr = "Interpolate Peaks"; showValue = false; if (addValue && value == 0) contstr += " - smooth"; else contstr += " - linear"; break; case RESONANCE::control::protectFundamental: contstr = "Protect Fundamental"; yesno = true; break; case RESONANCE::control::clearGraph: showValue = false; contstr = "Clear"; break; case RESONANCE::control::smoothGraph: showValue = false; contstr = "Smooth"; break; default: showValue = false; contstr = "Unrecognised Resonance"; break; } return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + name + " Resonance " + contstr + isPad); } string DataText::resolveLFO(CommandBlock& cmd, bool addValue) { float value = cmd.data.value; int value_int = int(value); uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar insertParam = cmd.data.parameter; string name; string lfo; if (engine == PART::engine::addSynth) name = " AddSynth"; else if (engine == PART::engine::subSynth) name = " SubSynth"; else if (engine == PART::engine::padSynth) name = " PadSynth"; else if (engine >= PART::engine::addVoice1) { int nvoice = engine - PART::engine::addVoice1; name = " Add Voice " + to_string(nvoice + 1); } switch (insertParam) { case TOPLEVEL::insertType::amplitude: lfo = " Amp"; break; case TOPLEVEL::insertType::frequency: lfo = " Freq"; break; case TOPLEVEL::insertType::filter: lfo = " Filt"; break; } string contstr; switch (control) { case LFOINSERT::control::speed: if (cmd.data.offset == 1 && addValue == true) { contstr += bpm2text(value); showValue = false; } else contstr = "Freq"; break; case LFOINSERT::control::depth: contstr = "Depth"; break; case LFOINSERT::control::delay: contstr = "Delay"; break; case LFOINSERT::control::start: contstr = "Start"; break; case LFOINSERT::control::amplitudeRandomness: contstr = "Amp Rand"; break; case LFOINSERT::control::type: { contstr = "Type "; showValue = false; if (addValue) contstr += stringCaps(LFOtype[value_int], 1); break; } case LFOINSERT::control::continuous: contstr = "Cont"; yesno = true; break; case LFOINSERT::control::bpm: contstr = "BPM"; yesno = true; break; case LFOINSERT::control::frequencyRandomness: contstr = "Freq Rand"; break; case LFOINSERT::control::stretch: contstr = "Stretch"; break; default: showValue = false; contstr = "Unrecognised LFO"; break; } return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + name + lfo + " LFO " + contstr); } string DataText::resolveFilter(CommandBlock& cmd, bool addValue) { uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; string name; if (engine == PART::engine::addSynth) name = " AddSynth"; else if (engine == PART::engine::subSynth) name = " SubSynth"; else if (engine == PART::engine::padSynth) name = " PadSynth"; else if (engine >= PART::engine::addVoice1) name = " Adsynth Voice " + to_string((engine - PART::engine::addVoice1) + 1); string contstr = filterControl(cmd, addValue); return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + name + " Filter " + contstr); } string DataText::filterControl(CommandBlock& cmd, bool addValue) { int value_int = int(cmd.data.value); uchar control = cmd.data.control; int nformant = cmd.data.parameter; int nseqpos = cmd.data.parameter; int nvowel = cmd.data.offset; string contstr; switch (control) { case FILTERINSERT::control::centerFrequency: contstr = "Cent Freq"; break; case FILTERINSERT::control::Q: contstr = "Q"; break; case FILTERINSERT::control::frequencyTracking: contstr = "Freq Track"; break; case FILTERINSERT::control::velocitySensitivity: contstr = "Velocity Sense"; break; case FILTERINSERT::control::velocityCurve: contstr = "Velocity Sense Curve"; break; case FILTERINSERT::control::gain: contstr = "Gain"; break; case FILTERINSERT::control::stages: showValue = false; contstr = "Stages " + to_string(value_int + 1); break; case FILTERINSERT::control::baseType: contstr = "Filt Cat "; showValue = false; switch (value_int) { case 0: contstr += "Analog"; break; case 1: contstr += "Form"; break; case 2: contstr += "StVar"; break; default: contstr += "Unrecognised Filter Base"; break; } break; case FILTERINSERT::control::analogType: { contstr = "An Type "; showValue = false; int idx = 0; if (addValue) { while (filterlist [idx] != "l1") idx += 2; contstr += filterlist [idx + (value_int * 2)]; } break; } case FILTERINSERT::control::stateVariableType: { contstr = "SV Type"; int idx = 0; if (addValue) { while (filterlist [idx] != "low") idx += 2; contstr += filterlist [idx + (value_int * 2)]; } break; } case FILTERINSERT::control::frequencyTrackingRange: contstr = "Freq Track Offs"; yesno = true; break; case FILTERINSERT::control::formantSlowness: contstr = "Form Morph"; break; case FILTERINSERT::control::formantClearness: contstr = "Form Lucidity"; break; case FILTERINSERT::control::formantFrequency: contstr = "Form Freq"; break; case FILTERINSERT::control::formantQ: contstr = "Form Q"; break; case FILTERINSERT::control::formantAmplitude: contstr = "Form Amp"; break; case FILTERINSERT::control::formantStretch: contstr = "Form Stretch"; break; case FILTERINSERT::control::formantCenter: contstr = "Form Cent Freq"; break; case FILTERINSERT::control::formantOctave: contstr = "Form Octave"; break; case FILTERINSERT::control::numberOfFormants: contstr = "Formants"; break; case FILTERINSERT::control::vowelNumber: contstr = "Vowel Num"; if (addValue) { contstr += " Value " + to_string(value_int + 1); } showValue = false; break; case FILTERINSERT::control::formantNumber: contstr = "Formant Num"; break; case FILTERINSERT::control::sequenceSize: contstr = "Seq Size"; break; case FILTERINSERT::control::sequencePosition: contstr = "Seq Pos"; break; case FILTERINSERT::control::vowelPositionInSequence: contstr = "Vowel"; break; case FILTERINSERT::control::negateInput: contstr = "Neg Input"; yesno = true; break; default: showValue = false; contstr = "Unrecognised Filter"; break; } if (control >= FILTERINSERT::control::formantFrequency && control <= FILTERINSERT::control::formantAmplitude) { contstr = "Vowel " + to_string(nvowel + 1) + " Formant " + to_string(nformant + 1) + " "+ contstr; } else if (control == FILTERINSERT::control::sequencePosition) { if (addValue) { contstr += " Value " + to_string(value_int + 1); } showValue = false; } else if (control == FILTERINSERT::control::vowelPositionInSequence) { contstr = "Seq Pos " + to_string(nseqpos + 1) + " " + contstr; if (addValue) { contstr += " Value " + to_string(value_int + 1); } showValue = false; } return contstr; } string DataText::resolveEnvelope(CommandBlock& cmd, bool) { int value = lrint(cmd.data.value); bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar insert = cmd.data.insert; uchar insertParam = cmd.data.parameter; string env; string name; if (engine == PART::engine::addSynth) name = " AddSynth"; else if (engine == PART::engine::subSynth) name = " SubSynth"; else if (engine == PART::engine::padSynth) name = " PadSynth"; else if (engine >= PART::engine::addVoice1) { name = " Add Voice "; int nvoice; if (engine >= PART::engine::addMod1) nvoice = engine - PART::engine::addMod1; else nvoice = engine - PART::engine::addVoice1; name += to_string(nvoice + 1); if (engine >= PART::engine::addMod1) name += " Modulator"; } switch(insertParam) { case TOPLEVEL::insertType::amplitude: env = " Amp"; break; case TOPLEVEL::insertType::frequency: env = " Freq"; break; case TOPLEVEL::insertType::filter: env = " Filt"; break; case TOPLEVEL::insertType::bandwidth: env = " Band"; break; } if (insert == TOPLEVEL::insert::envelopePointAdd || insert == TOPLEVEL::insert::envelopePointDelete) { if (!write) { return ("Freemode add/remove is write only. Current points " + to_string(value)); } if (insert == TOPLEVEL::insert::envelopePointAdd) return ("Part " + to_string(int(npart + 1)) + " Kit " + to_string(int(kititem + 1)) + name + env + " Env Added Freemode Point " + to_string(int(control & 0x3f) + 1) + " Y and X"); else { showValue = false; return ("Part " + to_string(int(npart + 1)) + " Kit " + to_string(int(kititem + 1)) + name + env + " Env Removed Freemode Point " + to_string(int(control) + 1) + " Remaining " + to_string(value)); } } switch (insert) { case TOPLEVEL::insert::envelopePointChange: return ("Part " + to_string(int(npart + 1)) + " Kit " + to_string(int(kititem + 1)) + name + env + " Env Freemode Point " + to_string(int(control) + 1) + " Y and X"); case TOPLEVEL::insert::envelopePointChangeDt: return ("Part " + to_string(int(npart + 1)) + " Kit " + to_string(int(kititem + 1)) + name + env + " Env Freemode Point " + to_string(int(control) + 1) + " X"); case TOPLEVEL::insert::envelopePointChangeVal: return ("Part " + to_string(int(npart + 1)) + " Kit " + to_string(int(kititem + 1)) + name + env + " Env Freemode Point " + to_string(int(control) + 1) + " Y"); default: break; } string contstr; switch (control) { case ENVELOPEINSERT::control::attackLevel: contstr = "Attack Level"; break; case ENVELOPEINSERT::control::attackTime: contstr = "Attack Time"; break; case ENVELOPEINSERT::control::decayLevel: contstr = "Decay Level"; break; case ENVELOPEINSERT::control::decayTime: contstr = "Decay Time"; break; case ENVELOPEINSERT::control::sustainLevel: contstr = "Sustain Level"; break; case ENVELOPEINSERT::control::releaseLevel: contstr = "Release Level"; break; case ENVELOPEINSERT::control::releaseTime: contstr = "Release Time"; break; case ENVELOPEINSERT::control::stretch: contstr = "Stretch"; break; case ENVELOPEINSERT::control::forcedRelease: contstr = "frcR"; yesno = true; break; case ENVELOPEINSERT::control::linearEnvelope: contstr = "L"; yesno = true; break; case ENVELOPEINSERT::control::edit: contstr = "Edit"; break; case ENVELOPEINSERT::control::enableFreeMode: contstr = "Freemode"; yesno = true; break; case ENVELOPEINSERT::control::points: contstr = "Points"; break; case ENVELOPEINSERT::control::sustainPoint: contstr = "Sust"; break; default: showValue = false; contstr = "Unrecognised Envelope"; break; } return ("Part " + to_string(npart + 1) + " Kit " + to_string(int(kititem + 1)) + name + env + " Env " + contstr); } string DataText::resolveEffects(CommandBlock& cmd, bool addValue) { int value = lrint(cmd.data.value); uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar effType = cmd.data.kit; uchar effnum = cmd.data.engine; uchar insert = cmd.data.insert; uchar parameter = cmd.data.parameter; uchar offset = cmd.data.offset; string name; string actual; if (npart == TOPLEVEL::section::systemEffects) name = "System"; else if (npart == TOPLEVEL::section::insertEffects) name = "Insert"; else name = "Part " + to_string(npart + 1); if (effType == EFFECT::type::dynFilter && cmd.data.insert != UNUSED) { if (npart == TOPLEVEL::section::systemEffects) name = "System"; else if (npart == TOPLEVEL::section::insertEffects) name = "Insert"; else name = "Part " + to_string(npart + 1); name += " Effect " + to_string(effnum + 1); name += " DynFilter ~ Filter "; name += filterControl(cmd, addValue); return name; } name += " Effect " + to_string(effnum + 1); string effname = ""; if (npart < NUM_MIDI_PARTS && (control == PART::control::effectNumber || control == PART::control::effectDestination || control == PART::control::effectBypass)) { if (control == PART::control::effectNumber) name = "Set " + name; else if (control == PART::control::effectDestination) { effname = " sent to "; if (value == 0) effname += "next effect"; else if (value == 1) effname += "part out"; else if (value == 2) effname += "dry out"; } if (control == PART::control::effectBypass) { effname = " Bypass"; showValue = false; if (addValue) { if (value) effname += " - on"; else effname += " - off"; } } else showValue = false; return (name + effname); } else if (npart >= TOPLEVEL::section::systemEffects && effType == UNUSED) { string contstr; string second = ""; if (npart == TOPLEVEL::section::systemEffects) { if (insert == TOPLEVEL::insert::systemEffectSend) { contstr = " from Effect " + to_string(effnum + 1); second = " to Effect " + to_string(control + 1); return (name + contstr + second); } if (control == EFFECT::sysIns::effectEnable) { contstr += " Enable"; if (addValue) { showValue = false; if (value > 0) contstr += " - on"; else contstr += " - off"; } return (name + contstr); } } if (npart == TOPLEVEL::section::insertEffects && control == EFFECT::sysIns::effectDestination) { contstr = " To "; if (value == -2) contstr += "Master out"; else if (value == -1) contstr = " - off"; else { contstr += "Part "; second = to_string(value + 1); } showValue = false; return ("Send " + name + contstr + second); } if (control == EFFECT::sysIns::effectNumber) { name = "Set " + name; showValue = false; return (name + effname); } } string contstr = ""; if ((npart < NUM_MIDI_PARTS && control == PART::control::effectType) || (npart > TOPLEVEL::section::main && effType == UNUSED && control == EFFECT::sysIns::effectType)) { name += " set to"; effType = value | EFFECT::type::none; // TODO fix this! showValue = false; } else contstr = ""; //" Control " + to_string(control + 1); string controlType = ""; int ref = control; // we frequently modify this# bool isBPM = ((ref == 2 && (offset == 1 || offset == 3)) || (ref == 3 && offset == 3)); switch (effType) { case EFFECT::type::none: effname = " None"; contstr = " "; break; case EFFECT::type::reverb: { ref = mapFromEffectNumber(ref, reverblistmap); effname = " Reverb "; controlType = reverblist[(ref) * 2]; if (control == 10 && addValue == true)// && offset > 0) { showValue = false; switch (value) { case 0: contstr = " Random "; break; case 1: contstr = " Freeverb "; break; case 2: contstr = " Bandwidth "; break; } } break; } case EFFECT::type::echo: effname = " Echo "; ref = mapFromEffectNumber(ref, echolistmap);; controlType = echolist[ref * 2]; if (addValue == true) // && offset > 0) { if (isBPM) { showValue = false; contstr += (" " + bpm2text(float(value) / 127.0f)); } if (control == 7 || control == 17) yesno = true; } break; case EFFECT::type::chorus: { effname = " Chorus "; ref = mapFromEffectNumber(ref, choruslistmap); controlType = choruslist[ref * 2]; if (addValue && offset > 0) { if (control == 4) { showValue = false; if (value) contstr = " Triangle"; else contstr = " Sine"; } else if (isBPM) { showValue = false; contstr += (" " + bpm2text(float(value) / 127.0f)); } if (control == 11 || control == 17) { yesno = true; } } break; } case EFFECT::type::phaser: effname = " Phaser "; ref = mapFromEffectNumber(ref, phaserlistmap); controlType = phaserlist[ref * 2]; if (addValue == true) // && offset > 0) { if (isBPM) { showValue = false; contstr += (" " + bpm2text(float(value) / 127.0f)); } switch (control) { case 4: showValue = false; if (value) contstr = " Triangle"; else contstr = " Sine"; break; case 10: case 12: case 14: case 17: yesno = true; break; } } break; case EFFECT::type::alienWah: effname = " AlienWah "; ref = mapFromEffectNumber(ref, alienwahlistmap); controlType = alienwahlist[ref * 2]; if (addValue == true) // && offset > 0) { if (isBPM) { showValue = false; contstr += (" " + bpm2text(float(value) / 127.0f)); } if (control == 4 && offset > 0) { showValue = false; if (value) contstr = " Triangle"; else contstr = " Sine"; } else if (control == 17) yesno = true; } break; case EFFECT::type::distortion: { effname = " Distortion "; ref = mapFromEffectNumber(ref, distortionlistmap); if (addValue == true) // && offset > 0) { switch (ref) { case 5: contstr = " " + stringCaps(effdistypes[value], 1); showValue = false; break; case 11: { contstr = " Pre dist."; yesno = true; break; } case 7: case 10: { yesno = true; break; } } } controlType = distortionlist[ref * 2]; break; } case EFFECT::type::eq: { effname = " EQ "; if (control == 1) { contstr = " " + to_string(int(value) + 1); showValue = false; } else if (control > 1) { if (offset > 0) effname += "(Band " + to_string(int(parameter) + 1) + ") "; ref = mapFromEffectNumber(ref, eqlistmap); if (ref < 4 && addValue == true && offset > 0) { showValue = false; contstr = " " + stringCaps(eqtypes[value], 1); } } controlType = eqlist[ref * 2]; break; } case EFFECT::type::dynFilter: effname = " DynFilter "; ref = mapFromEffectNumber(ref, dynfilterlistmap); controlType = dynfilterlist[ref * 2]; if (addValue == true)// && offset > 0) { if (control == 17) { contstr = "bpm"; yesno = true; return (name + effname + contstr); } if (control == 4) { showValue = false; if (value) contstr = " Triangle"; else contstr = " Sine"; } else if (control == 8) { yesno = true; } if (offset == 1 && ref == 2) { showValue = false; contstr += (" " + bpm2text(float(value) / 127.0f)); } } break; default: showValue = false; contstr = " Unrecognised Effect"; break; } if (control == EFFECT::control::preset && effType != EFFECT::type::eq) { contstr = " Preset " + to_string (value + 1); showValue = false; } else if (offset) { controlType = controlType.substr(0, controlType.find(' ')); effname += stringCaps(controlType, 1); } return (name + effname + contstr); } int DataText::mapFromEffectNumber(int effectIndex, const int list []) { for (int index = 0; list[index] >= 0; index++) { if (list[index] == effectIndex) { return index; } } // Kind of bad to return a bogus entry, but this function is often called // even when the result will not be used, and the index is often out of // range then. return 0; } yoshimi-2.3.5.1/src/Interface/Data2Text.h000066400000000000000000000053411506652756400200240ustar00rootroot00000000000000/* Data2Text.h - conversion of commandBlock entries to text Copyright 2019-2020, Will Godfrey Copyright 2024, Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DATATEXT_H #define DATATEXT_H #include #include #include "globals.h" class SynthEngine; class TextMsgBuffer; class DataText { private: bool showValue; bool yesno; protected: TextMsgBuffer& textMsgBuffer; public: DataText(); std::string resolveAll(SynthEngine&, CommandBlock&, bool addValue); private: std::string withValue(std::string resolved, uchar type, bool showValue, bool addValue, float value, std::optional extra_value = std::nullopt); std::string resolveVector(CommandBlock&, bool addValue); std::string resolveMicrotonal(CommandBlock&, bool addValue); std::string resolveConfig(SynthEngine&, CommandBlock&, bool addValue); std::string resolveBank(CommandBlock&, bool addValue); std::string resolveMain(CommandBlock&, bool addValue); std::string resolveAftertouch(bool type, int value, bool addValue); std::string resolvePart(CommandBlock&, bool addValue); std::string resolveAdd(CommandBlock&, bool addValue); std::string resolveAddVoice(CommandBlock&, bool addValue); std::string resolveSub(CommandBlock&, bool addValue); std::string resolvePad(SynthEngine&, CommandBlock&, bool addValue); std::string resolveOscillator(SynthEngine&, CommandBlock&, bool addValue); std::string resolveResonance(SynthEngine&, CommandBlock&, bool addValue); std::string resolveLFO(CommandBlock&, bool addValue); std::string resolveFilter(CommandBlock&, bool addValue); std::string filterControl(CommandBlock&, bool addValue); std::string resolveEnvelope(CommandBlock&, bool addValue); std::string resolveEffects(CommandBlock&, bool addValue); int mapFromEffectNumber(int effectIndex, const int list []); }; #endif yoshimi-2.3.5.1/src/Interface/GuiDataExchange.cpp000066400000000000000000000203131506652756400215340ustar00rootroot00000000000000/* GuiDataExchange.cpp - threadsafe and asynchronous data exchange into the GUI Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #include "Interface/GuiDataExchange.h" #include "Misc/DataBlockBuff.h" #include "Misc/FormatFuncs.h" #include #include #include #include #include //////////////// !! NOTE important : add all relevant types here which shall be published via GuiDataExchange !! #include "Interface/InterfaceAnchor.h" #include "Effects/EffectMgr.h" namespace { const size_t SIZ = MaxSize>::value; const size_t CAP = 64; ///< (fixed) number of slots (each with size SIZ) to pre-allocate const size_t INITIAL_REGISTRY_BUCKETS = 64; ///< initial size for the hashtable used for lookup of data receivers std::atomic_size_t dataExchangeID{1}; static int isStartup = 4; // could be 2 but given extra wiggle room /** when to consider an asynchronous data message still "on time" */ inline bool isTimely(std::chrono::milliseconds millis) { if (isStartup > 0) { isStartup -=1; return 0ms <= millis and millis < 2000ms; } return 0ms <= millis and millis < 500ms; } } using Guard = const std::lock_guard; using RoutingTag = GuiDataExchange::RoutingTag; using Subscription = GuiDataExchange::Subscription; /** * Generate a new unique ID on each invocation, to be used as _Identity._ * This allows to keep track of different connections and update receivers. */ size_t GuiDataExchange::generateUniqueID() { // Note : returning previous value before increment return dataExchangeID.fetch_add(+1, std::memory_order_relaxed); } /** * »PImpl« to maintain the block storage and manage the actual data exchange. */ class GuiDataExchange::DataManager { static_assert (CAP <= UCHAR_MAX, "index will be passed via CommandBlock"); public: std::mutex mtx; using Storage = DataBlockBuff; Storage storage; using Registry = std::unordered_map; Registry registry; DataManager() : mtx{} , storage{} , registry{INITIAL_REGISTRY_BUCKETS, RoutingTag::getHash} { } }; // destructor needs the definition of ProtocolManager GuiDataExchange::~GuiDataExchange() { } GuiDataExchange::Subscription::~Subscription() { if (detach) detach(*this); } /** * Create a protocol/mediator for data connection Core -> GUI * @param how_to_publish a function allowing to push a CommandBlock * into some communication channel */ GuiDataExchange::GuiDataExchange(PublishFun how_to_publish) : publish{std::move(how_to_publish)} , manager{std::make_unique()} { } /** * Open new storage slot by re-using the oldest storage buffer; * @param tag connection-ID to mark the new buffer, so it's contents * can later be published to the correct receivers by dispatchUpdates() * @param dataSize size of the actual data to be copied into the buffer; could be used * to select from a differentiated storage pool (sanity check only as of 1/2024) * @param storeIntoBuffer a function with signature `void(void*)` to _drop off_ * the actual payload into the buffer slot. * @return the indexNr of the claimed slot * @note * - using information encoded into the tag to ensure the buffer * size is sufficient to hold a copy of the data to be published * - note this function also constitutes a _memory synchronisation bracket_ * to ensure the changes to the buffer structure are visible to other threads */ size_t GuiDataExchange::claimNextSlot(RoutingTag const& tag, size_t dataSize, EmplaceFun storeIntoBuffer) { if (dataSize > SIZ) throw std::logic_error("Insufficient preconfigured buffer size " "to hold an object of size=" + func::asString(dataSize)); Guard lock(manager->mtx); // protect against concurrent data corruption and ensure visibility of published data size_t slotIdx = manager->storage.claimNextBuffer(tag); void* rawStorageBuff = manager->storage.accessRawStorage(slotIdx); storeIntoBuffer(rawStorageBuff); return slotIdx; } /** * This function is called automatically whenever a Subscription (=data receiver) is created. * The Subscription is associated with the RoutingTag and gets a callback for detaching on destruction */ GuiDataExchange::DetachHook GuiDataExchange::attachReceiver(RoutingTag const& tag, Subscription& client) { DataManager::Registry& reg{manager->registry}; std::mutex& mtx = manager->mtx; Guard lock(mtx); // prepend to single-linked list in Registry client.next = reg[tag]; reg[tag] = &client; return [tag,®,&mtx](Subscription const& entry) {// will be called from the Subscription's destructor.... bool found{false}; Guard lock(mtx); for (Subscription** p = & reg[tag]; *p != nullptr; p = & (*p)->next) if (*p == &entry) {// remove entry from registry *p = entry.next; found = true; break; } if (not found) throw std::logic_error("GuiDataExchange: registration of push data receivers corrupted."); if (reg[tag] == nullptr) reg.erase(tag); }; } void GuiDataExchange::publishSlot(size_t idx) { CommandBlock notifyMsg; notifyMsg.data.type = TOPLEVEL::type::Integer; notifyMsg.data.control = TOPLEVEL::control::dataExchange; notifyMsg.data.part = TOPLEVEL::section::message; notifyMsg.data.source = TOPLEVEL::action::lowPrio | TOPLEVEL::action::noAction; notifyMsg.data.offset = static_cast(idx); // notifyMsg.data.kit = UNUSED; notifyMsg.data.engine = UNUSED; notifyMsg.data.insert = UNUSED; notifyMsg.data.parameter = UNUSED; notifyMsg.data.miscmsg = UNUSED; notifyMsg.data.spare0 = UNUSED; notifyMsg.data.spare1 = UNUSED; notifyMsg.data.value = 0; // send it via configured messaging channel publish(notifyMsg); } RoutingTag GuiDataExchange::fetchTag(size_t idx) { return manager->storage.getRoutingTag(idx); } void GuiDataExchange::dispatchUpdates(CommandBlock const& notification) { if (notification.data.control != TOPLEVEL::control::dataExchange) return; pushUpdates(notification.data.offset); } void GuiDataExchange::pushUpdates(size_t idx) { if (idx >= CAP) throw std::logic_error("GuiDataExchange: invalid data slot index "+func::asString(idx)); Guard lock(manager->mtx); // sync barrier to ensure visibility of data published by other thread if (not isTimely(manager->storage.entryAge(idx))) return; RoutingTag tag = fetchTag(idx); void* rawData = manager->storage.accessRawStorage(idx); DataManager::Registry& reg{manager->registry}; auto entry = reg.find(tag); if (entry == reg.end()) return; // no(longer any) subscribers for this conversation channel for (Subscription* p = entry->second; p; p=p->next) p->pushUpdate(tag, rawData); } yoshimi-2.3.5.1/src/Interface/GuiDataExchange.h000066400000000000000000000222151506652756400212040ustar00rootroot00000000000000/* GuiDataExchange.h - threadsafe and asynchronous data exchange into the GUI Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef GUI_DATA_EXCHANGE_H #define GUI_DATA_EXCHANGE_H #include "globals.h" #include "Interface/RingBuffer.h" #include "Misc/Hash.h" #include #include #include #include /** * A communication protocol to exchange blocks of data with the GUI. * Based on a publish-subscribe model with "push" from the core, but in the * GUI the message blocks are retrieved by "pull" by the command handling hook. * * GuiDataExchange can handle several distinct _communication channels,_ each * allowing to publish some _arbitrary_ yet _specifically typed_ data blocks * to several "listeners" / "subscribers". * - A new channel is opened by [creating a connection](\ref GuiDataExchange::createConnection) * Note that the type `Connection` is templated to a specific data type to transport * - Connection objects are handles and freely copyable. All equivalent handles represent * the same connection, and can be used to operate on that connection * - A receiver (typically in the GUI) must be created from such a connection handle; * it must be a subclass of GuiDataExchange::Subscription and implement the single * pure virtual method Subscription::pushUpdate * - Registration and de-registration of Subscriptions is managed automatically * (by the constructor / the destructor) * - to publish new data, invoke Connection::publish(data) * - this causes a _copy_ of that data to be stored into an internal data ringbuffer; * moreover, a notification-message is sent through the Yoshimi CommandBlock system. * - The code handling GUI updates in the »main thread« will receive this notification * and has then to invoke GuiDataExchange::dispatchUpdates(commandBlock), which will * use the internal registry of Subscribers to push an update to each active receiver. */ class GuiDataExchange { class DataManager; using PManager = std::unique_ptr; using EmplaceFun = std::function; using PublishFun = std::function; PublishFun publish; PManager manager; static size_t generateUniqueID(); // must not be copied nor moved GuiDataExchange(GuiDataExchange &&) =delete; GuiDataExchange(GuiDataExchange const&) =delete; GuiDataExchange& operator=(GuiDataExchange &&) =delete; GuiDataExchange& operator=(GuiDataExchange const&) =delete; public: ~GuiDataExchange(); GuiDataExchange(PublishFun how_to_publish); /* ========== Types used to implement the communication protocol ========== */ /** @internal tag to organise routing */ struct RoutingTag { size_t identity{0}; size_t typehash{0}; template bool verifyType() const { return typehash == func::getTypeHash(); } static size_t getHash(RoutingTag const&); bool operator==(RoutingTag const& otag) const; bool operator!=(RoutingTag const& otag) const; }; class Subscription; using DetachHook = std::function; /** * Connection-handle and front-End for clients, * allowing to push data into the GUI asynchronously */ template class Connection { GuiDataExchange* hub; RoutingTag tag; public: Connection(GuiDataExchange& link, RoutingTag id) : hub{&link} , tag{id} { } // standard copy operations acceptable (but only for same DAT) operator RoutingTag const&() const { return tag; } void publish(DAT const& data); size_t emplace(DAT const& data); DetachHook attach(Subscription&); // Equality: Connections to the same routing tag are equivalent... template friend bool operator==(Connection const&, Connection const&); }; /** * Create an unique new connection handle * configured to transport data of type \a DAT */ template Connection createConnection() { return Connection(*this, generateNewTag()); } /** * Establish a connection with a routing tag retrieved from * a designated data slot currently present in the buffer. * Typically used to bootstrap a client-side end point. */ template Connection bootstrapConnection(size_t slotIdx) { RoutingTag routingTag = fetchTag(slotIdx); assert (routingTag.verifyType()); return Connection(*this, routingTag); } /**Interface used to mark and track all receivers of data push-updates */ class Subscription { // must not be copied nor moved Subscription(Subscription &&) =delete; Subscription(Subscription const&) =delete; Subscription& operator=(Subscription &&) =delete; Subscription& operator=(Subscription const&) =delete; protected: template Subscription(Connection& connection) : detach{connection.attach(*this)} { } virtual ~Subscription(); ///< detaches automatically Subscription() = default; template void activate(Connection& connection) { if (detach) throw std::logic_error("Subscription already activated; " "can only attach once."); detach = connection.attach(*this); } public: Subscription* next{nullptr}; virtual void pushUpdate(RoutingTag const&, void* data) =0; private: DetachHook detach; }; /** * Dispatch a notification regarding data updates -> GUI. * The given CommandBlock contains a data handle(index); routing info an * actual data is fetched from the DataBlockBuff and pushed synchronously to all * MirrorData receivers currently enrolled actively within the GUI and marked * with the same RoutingTag as found in the index table. */ void dispatchUpdates(CommandBlock const& notification); /** performs the actual push-dispatch * @param idx valid "slot" holding data to publish */ void pushUpdates(size_t idx); private: template RoutingTag generateNewTag() { return RoutingTag{generateUniqueID() ,func::getTypeHash() }; } DetachHook attachReceiver(RoutingTag const&, Subscription&); size_t claimNextSlot(RoutingTag const&, size_t, EmplaceFun); void publishSlot(size_t idx); RoutingTag fetchTag(size_t idx); }; template inline size_t GuiDataExchange::Connection::emplace(DAT const& data) { const size_t dataSiz = sizeof(DAT); return hub->claimNextSlot(this->tag ,dataSiz ,[&data](void* buffer) {// copy-construct the data into the buffer new(buffer) DAT{data}; }); } template inline void GuiDataExchange::Connection::publish(DAT const& data) { size_t idx = emplace(data); hub->publishSlot(idx); } template inline GuiDataExchange::DetachHook GuiDataExchange::Connection::attach(Subscription& client) { return hub->attachReceiver(tag, client); } template inline bool operator==(GuiDataExchange::Connection const& con1 ,GuiDataExchange::Connection const& con2) { return con1.tag.identity == con2.tag.identity; } template inline bool operator!=(GuiDataExchange::Connection const& con1 ,GuiDataExchange::Connection const& con2) { return not (con1 == con2); } inline size_t GuiDataExchange::RoutingTag::getHash(RoutingTag const& tag) { size_t hash{0}; func::hash_combine(hash, tag.identity); func::hash_combine(hash, tag.typehash); return hash; } inline bool GuiDataExchange::RoutingTag::operator==(RoutingTag const& otag) const { return this->identity == otag.identity and this->typehash == otag.typehash; } inline bool GuiDataExchange::RoutingTag::operator!=(RoutingTag const& otag) const { return not (*this == otag); } #endif /*GUI_DATA_EXCHANGE_H*/ yoshimi-2.3.5.1/src/Interface/InterChange.cpp000066400000000000000000010042341506652756400207470ustar00rootroot00000000000000/* InterChange.cpp - General communications Copyright 2016-2019, Will Godfrey & others Copyright 2020-2020, Kristian Amlie, Will Godfrey, & others Copyright 2021 Will Godfrey, Rainer Hans Liffers, & others Copyright 2023-2025, Will Godfrey, Ichthyostega & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "Interface/InterChange.h" #include "Interface/Vectors.h" #include "Interface/Data2Text.h" #include "Interface/TextLists.h" #include "Misc/FileMgrFuncs.h" #include "Misc/NumericFuncs.h" #include "Misc/FormatFuncs.h" #include "Misc/Microtonal.h" #include "Misc/SynthEngine.h" #include "Misc/Part.h" #include "Misc/TextMsgBuffer.h" #include "Params/UnifiedPresets.h" #include "Params/Controller.h" #include "Params/ADnoteParameters.h" #include "Params/SUBnoteParameters.h" #include "Params/PADnoteParameters.h" #include "Params/PADStatus.h" #include "Params/LFOParams.h" #include "Params/FilterParams.h" #include "Params/EnvelopeParams.h" #include "Effects/EffectMgr.h" #include "DSP/FFTwrapper.h" #include "Synth/Resonance.h" #include "Synth/OscilGen.h" #ifdef GUI_FLTK #include "MasterUI.h" #endif enum envControl: uchar { input, undo, redo }; using std::this_thread::sleep_for; using std::chrono_literals::operator ""us; using std::chrono_literals::operator ""ms; using std::string; using std::to_string; using file::localPath; using file::findFile; using file::isRegularFile; using file::createDir; using file::listDir; using file::isDirectory; using file::setExtension; using file::findLeafName; using file::createEmptyFile; using file::deleteFile; using file::loadText; using file::saveText; using func::bitSet; using func::bitClear; using func::nearestPowerOf2; using func::asString; InterChange::InterChange(SynthEngine& synthInstance) : synth(synthInstance), #ifndef YOSHIMI_LV2_PLUGIN fromCLI(), #endif decodeLoopback(), #ifdef GUI_FLTK fromGUI(), toGUI(), #endif fromMIDI(), returnsBuffer(), muteQueue(), #ifdef GUI_FLTK guiDataExchange{[this](CommandBlock const& block){ toGUI.write(block.bytes); }}, #else guiDataExchange{[](CommandBlock const&){ /* no communication GUI */ }}, #endif syncWrite(false), lowPrioWrite(false), sortResultsThreadHandle(0), swapRoot1(UNUSED), swapBank1(UNUSED), swapInstrument1(UNUSED), searchInst(0), searchBank(0), searchRoot(0), partsChanged{} { noteSeen = false; undoLoopBack = false; setUndo = false; setRedo = false; undoStart = false; cameFrom = envControl::input; undoMarker.data.part = TOPLEVEL::section::undoMark; sem_init(&sortResultsThreadSemaphore, 0, 0); } bool InterChange::Init() { #ifndef YOSHIMI_LV2_PLUGIN fromCLI.init (); #endif decodeLoopback.init (); #ifdef GUI_FLTK fromGUI.init (); toGUI.init (); #endif fromMIDI.init (); returnsBuffer.init (); muteQueue.init (); if (!synth.getRuntime().startThread(&sortResultsThreadHandle, _sortResultsThread, this, false, 0, "CLI")) { synth.getRuntime().Log("Failed to start CLI resolve thread"); return false; } else { searchInst = searchBank = searchRoot = 0; return true; } } #ifdef GUI_FLTK void InterChange::createGuiMaster() { // provide InterfaceAnchor record with all connection IDs guiMaster.reset(new MasterUI(*this, synth.buildGuiAnchor())); guiMaster->Init(); } void InterChange::shutdownGui() { guiMaster.reset(); } #endif void InterChange::spinSortResultsThread() { sem_post(&sortResultsThreadSemaphore); } void* InterChange::_sortResultsThread(void* arg) { return static_cast(arg)->sortResultsThread(); } void* InterChange::sortResultsThread() { while (synth.getRuntime().runSynth.load(std::memory_order_relaxed)) { CommandBlock cmd; /* It is possible that several operations initiated from * different sources complete within the same period * (especially with large buffer sizes) so this small * ring buffer ensures they can all clear together. */ while (synth.audioOut.load() == _SYS_::mute::Active) { if (muteQueue.read(cmd.bytes)) indirectTransfers(cmd); else synth.audioOut.store(_SYS_::mute::Complete); } while (decodeLoopback.read(cmd.bytes)) { if (cmd.data.part == TOPLEVEL::section::midiLearn) synth.midilearn.generalOperations(cmd); else if (cmd.data.source >= TOPLEVEL::action::lowPrio) indirectTransfers(cmd); else resolveReplies(cmd); } sem_wait(&sortResultsThreadSemaphore); } return nullptr; } InterChange::~InterChange() { if (sortResultsThreadHandle) { // Get it to quit. spinSortResultsThread(); pthread_join(sortResultsThreadHandle, 0); } undoRedoClear(); sem_destroy(&sortResultsThreadSemaphore); } void InterChange::Log(string const& msg) { bool isError{true}; synth.getRuntime().Log(msg, isError); } void InterChange::muteQueueWrite(CommandBlock& cmd) { if (!muteQueue.write(cmd.bytes)) { Log("failed to write to muteQueue"); return; } if (synth.audioOut.load() == _SYS_::mute::Idle) { synth.audioOutStore(_SYS_::mute::Pending); } } void InterChange::indirectTransfers(CommandBlock& cmd, bool noForward) { int value = lrint(cmd.data.value); float valuef = -1; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar switchNum = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar insert = cmd.data.insert; //synth.CBtest(cmd); while (syncWrite) sleep_for(10us); bool write = (type & TOPLEVEL::type::Write); if (write) lowPrioWrite = true; bool guiTo = false; (void) guiTo; // suppress warning when headless build uchar newMsg = false;//NO_MSG; if (control == TOPLEVEL::control::copyPaste) { string name = UnifiedPresets{synth, cmd} .handleStoreLoad(); /* * for Paste (load) 'name' is the type of the preset being loaded * for List 'name' lists all the stored presets of the wanted preset type * alternatively it is the group type * */ if (type == TOPLEVEL::type::List) { cmd.data.value = textMsgBuffer.push(name); } else if (engine == PART::engine::padSynth && type == TOPLEVEL::type::Paste && insert != UNUSED) { int localKit = kititem; if (localKit >= NUM_KIT_ITEMS)//not part->Pkitmode) localKit = 0; synth.part[switchNum]->kit[localKit].padpars->buildNewWavetable((cmd.data.parameter == 0)); } #ifdef GUI_FLTK toGUI.write(cmd.bytes); #endif return; // currently only sending this to the GUI } if (switchNum == TOPLEVEL::section::main && control == MAIN::control::loadFileFromList) { int result = synth.LoadNumbered(kititem, engine); if (result > NO_MSG) cmd.data.miscmsg = result & NO_MSG; else { cmd.data.miscmsg = result; switch (kititem) // group { case TOPLEVEL::XML::Instrument: { control = MAIN::control::loadInstrumentByName; cmd.data.kit = insert; break; } case TOPLEVEL::XML::Patch: { control = MAIN::control::loadNamedPatchset; break; } case TOPLEVEL::XML::Scale: { control = MAIN::control::loadNamedScale; break; } case TOPLEVEL::XML::State: { control = MAIN::control::loadNamedState; break; } case TOPLEVEL::XML::Vector: { control = MAIN::control::loadNamedVector; break; } case TOPLEVEL::XML::MLearn: { // this is a bit messy MIDI learn is an edge case cmd.data.control = MIDILEARN::control::loadList; synth.midilearn.generalOperations(cmd); lowPrioWrite = false; return; break; } } cmd.data.control = control; } } string text; if (cmd.data.miscmsg != NO_MSG) { text = textMsgBuffer.fetch(cmd.data.miscmsg); cmd.data.miscmsg = NO_MSG; // this may be reset later } else text = ""; if (control == TOPLEVEL::control::textMessage) switchNum = TOPLEVEL::section::message; // this is a bit hacky :( switch(switchNum) { case TOPLEVEL::section::vector: value = indirectVector(cmd, newMsg, guiTo, text); break; case TOPLEVEL::section::midiLearn: if (control == MIDILEARN::control::findSize) value = synth.midilearn.findSize(); // very naughty! should do better break; case TOPLEVEL::section::midiIn: // program / bank / root value = indirectMidi(cmd, newMsg, guiTo, text); break; case TOPLEVEL::section::scales: value = indirectScales(cmd, newMsg, guiTo, text); break; case TOPLEVEL::section::main: value = indirectMain(cmd, newMsg, guiTo, text, valuef); break; case TOPLEVEL::section::bank: // instrument / bank value = indirectBank(cmd, newMsg, guiTo, text); break; case TOPLEVEL::section::config: value = indirectConfig(cmd, newMsg, guiTo, text); break; case TOPLEVEL::section::guideLocation: { string man{synth.getRuntime().manualFile}; if (!man.empty()) { size_t pos = man.find("files"); man = man.substr(0,pos); } else man = "Can't find guide"; value = textMsgBuffer.push(man); noForward = true; break; } case TOPLEVEL::section::message: newMsg = true; cmd.data.source &= ~TOPLEVEL::action::lowPrio; break; default: if (switchNum < NUM_MIDI_PARTS) { value = indirectPart(cmd, newMsg, guiTo, text); } break; } // CLI message text has to be set here. // But flag will be cleared further down... if (synth.getRuntime().incompatibleZynFile) text += "\nPossibly incompatible file from ZynAddSubFX 3.x"; if (newMsg) value = textMsgBuffer.push(text); // TODO need to improve message handling for multiple receivers if (valuef > -1) cmd.data.value = valuef; // curently only master fine detune else cmd.data.value = float(value); if (write) lowPrioWrite = false; if (noForward) return; if (cmd.data.source < TOPLEVEL::action::lowPrio) { #ifdef GUI_FLTK if (not text.empty() and synth.getRuntime().showGui and (write or guiTo)) { cmd.data.miscmsg = textMsgBuffer.push(text); // pass it on to GUI } #endif bool ok = returnsBuffer.write(cmd.bytes); #ifdef GUI_FLTK if (synth.getRuntime().showGui) { if (switchNum == TOPLEVEL::section::scales && control == SCALES::control::importScl) { // loading a tuning includes a name and comment! cmd.data.control = SCALES::control::name; cmd.data.miscmsg = textMsgBuffer.push(synth.microtonal.Pname); returnsBuffer.write(cmd.bytes); cmd.data.control = SCALES::control::comment; cmd.data.miscmsg = textMsgBuffer.push(synth.microtonal.Pcomment); ok &= returnsBuffer.write(cmd.bytes); } if (switchNum == TOPLEVEL::section::main && control == MAIN::control::loadNamedState) synth.midilearn.updateGui(); /* * This needs improving. We should only set it * when the state file contains a learn list. */ } #endif if (not ok) synth.getRuntime().Log("Unable to write to returnsBuffer buffer"); // GUI report must be set after action completed... if (synth.getRuntime().incompatibleZynFile) { #ifdef GUI_FLTK if (synth.getRuntime().showGui and (cmd.data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromGUI) { cmd.data.control = TOPLEVEL::control::textMessage; cmd.data.miscmsg = textMsgBuffer.push("File from ZynAddSubFX 3.0 or later may have parameter types incompatible with earlier versions, and with Yoshimi so might perform strangely."); returnsBuffer.write(cmd.bytes); } #endif } } // in any case clear out the warning flag. synth.getRuntime().incompatibleZynFile = false; } int InterChange::indirectVector(CommandBlock& cmd, uchar& newMsg, bool& guiTo, string& text) { bool write = (cmd.data.type & TOPLEVEL::type::Write); int value = cmd.data.value; int control = cmd.data.control; int parameter = cmd.data.parameter; switch(control) { case VECTOR::control::name: if (write) synth.getRuntime().vectordata.Name[parameter] = text; else text = synth.getRuntime().vectordata.Name[parameter]; newMsg = true; cmd.data.source &= ~TOPLEVEL::action::lowPrio; guiTo = true; break; } return value; } int InterChange::indirectMidi(CommandBlock& cmd, uchar& newMsg, bool& guiTo, string& text) { int value = cmd.data.value; int control = cmd.data.control; int msgID; if (control == MIDI::control::instrument) { msgID = synth.setProgramFromBank(cmd); cmd.data.control = MAIN::control::loadInstrumentFromBank; cmd.data.part = TOPLEVEL::section::main; // moved to 'main' for return updates. if (msgID > NO_MSG) text = " FAILED " + text; else text = "ed "; } else { msgID = synth.setRootBank(cmd.data.insert, cmd.data.engine); if (msgID > NO_MSG) text = "FAILED " + text; else text = ""; } text += textMsgBuffer.fetch(msgID & NO_MSG); newMsg = true; cmd.data.source = TOPLEVEL::action::toAll; // everyone will want to know about these! guiTo = true; return value; } int InterChange::indirectScales(CommandBlock& cmd, uchar& newMsg, bool& guiTo, string& text) { bool write = (cmd.data.type & TOPLEVEL::type::Write); int value = cmd.data.value; int control = cmd.data.control; switch(control) { case SCALES::control::tuning: text = formatScales(text); value = synth.microtonal.texttotunings(text); if (value <= 0) synth.microtonal.defaults(1); break; case SCALES::control::keyboardMap: text = formatKeys(text); value = synth.microtonal.texttomapping(text); if (value <= 0) synth.microtonal.defaults(2); break; case SCALES::control::keymapSize: if (write) { synth.microtonal.Pmapsize = int(value); synth.setAllPartMaps(); } else { value = synth.microtonal.Pmapsize; } break; case SCALES::control::importScl: value = synth.microtonal.loadscl(setExtension(text,EXTEN::scalaTuning)); if (value <= 0) { synth.microtonal.defaults(1); } else { text = synth.microtonal.tuningtotext(); } break; case SCALES::control::importKbm: value = synth.microtonal.loadkbm(setExtension(text,EXTEN::scalaKeymap)); if (value < 0) synth.microtonal.defaults(2); else if (value > 0) { text = ""; int map; for (int i = 0; i < value; ++ i) { if (i > 0) text += "\n"; map = synth.microtonal.Pmapping[i]; if (map == -1) text += 'x'; else text += to_string(map); string comment{synth.microtonal.PmapComment[i]}; if (!comment.empty()) text += (" ! " + comment); } cmd.data.parameter = textMsgBuffer.push(synth.microtonal.map2kbm()); } break; case SCALES::control::exportScl: { string newtext{synth.microtonal.scale2scl()}; string filename{text}; filename = setExtension(filename, EXTEN::scalaTuning); saveText(newtext, filename); } break; case SCALES::control::exportKbm: { string newtext{synth.microtonal.map2kbm()}; string filename{text}; filename = setExtension(filename, EXTEN::scalaKeymap); saveText(newtext, filename); } break; case SCALES::control::name: if (write) { synth.microtonal.Pname = text; } else text = synth.microtonal.Pname; newMsg = true; break; case SCALES::control::comment: if (write) synth.microtonal.Pcomment = text; else text = synth.microtonal.Pcomment; newMsg = true; break; } cmd.data.source &= ~TOPLEVEL::action::lowPrio; guiTo = true; return value; } int InterChange::indirectMain(CommandBlock& cmd, uchar &newMsg, bool &guiTo, string &text, float &valuef) { bool write = (cmd.data.type & TOPLEVEL::type::Write); int value = cmd.data.value; int control = cmd.data.control; int kititem = cmd.data.kit; int insert = cmd.data.insert; switch (control) { case MAIN::control::detune: { if (write) { add2undo(cmd, noteSeen); valuef = cmd.data.value; synth.microtonal.setglobalfinedetune(valuef); synth.setAllPartMaps(); } else valuef = synth.microtonal.Pglobalfinedetune; break; } case MAIN::control::keyShift: { if (write) { synth.setPkeyshift(value + 64); synth.setAllPartMaps(); } else value = synth.Pkeyshift - 64; break; } case MAIN::control::exportBank: { if (kititem == UNUSED) kititem = synth.getRuntime().currentRoot; text = synth.bank.exportBank(text, kititem, value); newMsg = true; break; } case MAIN::control::importBank: { if (kititem == UNUSED) kititem = synth.getRuntime().currentRoot; text = synth.bank.importBank(text, kititem, value); newMsg = true; break; } case MAIN::control::deleteBank: { text = synth.bank.removebank(value, kititem); newMsg = true; break; } case MAIN::control::loadInstrumentFromBank: { uint result = synth.setProgramFromBank(cmd); text = textMsgBuffer.fetch(result & NO_MSG); if (result < 0x1000) { partsChanged.reset(kititem); if (synth.getRuntime().bankHighlight) synth.getRuntime().lastBankPart = (value << 15) | (synth.getRuntime().currentBank << 8) | synth.getRuntime().currentRoot; else synth.getRuntime().lastBankPart = UNUSED; text = "ed " + text; } else text = " FAILED " + text; newMsg = true; break; } case MAIN::control::loadInstrumentByName: { cmd.data.miscmsg = textMsgBuffer.push(text); uint result = synth.setProgramByName(cmd); text = textMsgBuffer.fetch(result & NO_MSG); synth.getRuntime().lastBankPart = UNUSED; if (result < 0x1000) { partsChanged.reset(kititem); text = "ed " + text; } else text = " FAILED " + text; newMsg = true; break; } case MAIN::control::saveNamedInstrument: { bool ok = true; int saveType = synth.getRuntime().instrumentFormat; // This is both. Below we send them individually. if (saveType & 2) // Yoshimi format ok = synth.part[value]->saveXML(text, true); if (ok && (saveType & 1)) // legacy ok = synth.part[value]->saveXML(text, false); if (ok) { partsChanged.reset(value); synth.getRuntime().sessionSeen[TOPLEVEL::XML::Instrument] = true; synth.addHistory(setExtension(text, EXTEN::zynInst), TOPLEVEL::XML::Instrument); synth.part[value]->PyoshiType = (saveType & 2); text = "d " + text; } else text = " FAILED " + text; newMsg = true; break; } case MAIN::control::loadNamedPatchset: vectorClear(NUM_MIDI_CHANNELS); if (synth.loadPatchSetAndUpdate(text)) { partsChanged = 0; synth.addHistory(setExtension(text, EXTEN::patchset), TOPLEVEL::XML::Patch); text = "ed " + text; } else text = " FAILED " + text; synth.getRuntime().lastBankPart = UNUSED; newMsg = true; break; case MAIN::control::saveNamedPatchset: if (synth.savePatchesXML(text)) { partsChanged = 0; synth.addHistory(setExtension(text, EXTEN::patchset), TOPLEVEL::XML::Patch); text = "d " + text; } else text = " FAILED " + text; newMsg = true; break; case MAIN::control::loadNamedVector: { int tmp = synth.vectorcontrol.loadVectorAndUpdate(insert, text); if (tmp < NO_MSG) { cmd.data.insert = tmp; synth.addHistory(setExtension(text, EXTEN::vector), TOPLEVEL::XML::Vector); text = "ed " + text + " to chan " + to_string(int(tmp + 1)); for (int i = 0; i < NUM_MIDI_PARTS; i+= NUM_MIDI_CHANNELS) { partsChanged.reset(tmp + i); } synth.CBtest(&cmd); } else text = " FAILED " + text; synth.getRuntime().lastBankPart = UNUSED; newMsg = true; break; } case MAIN::control::saveNamedVector: { string oldname{synth.getRuntime().vectordata.Name[insert]}; int pos = oldname.find("No Name"); if (pos >=0 && pos < 2) synth.getRuntime().vectordata.Name[insert] = findLeafName(text); int tmp = synth.vectorcontrol.saveVector(insert, text, true); if (tmp == NO_MSG) { synth.addHistory(setExtension(text, EXTEN::vector), TOPLEVEL::XML::Vector); text = "d " + text; for (int i = 0; i < NUM_MIDI_PARTS; i+= NUM_MIDI_CHANNELS) { partsChanged.reset(insert + i); } } else { string name = textMsgBuffer.fetch(tmp); if (name != "FAIL") text = " " + name; else text = " FAILED " + text; } newMsg = true; break; } case MAIN::control::loadNamedScale: { string filename = setExtension(text, EXTEN::scale); int err = synth.microtonal.loadXML(filename); if (err == 0) { synth.addHistory(filename, TOPLEVEL::XML::Scale); text = "ed " + text; } else { text = " FAILED " + text; if (err < 0) // incoming negative values inverted for the text list text += (" " + scale_errors [0 - err]); } newMsg = true; break; } case MAIN::control::saveNamedScale: { string filename = setExtension(text, EXTEN::scale); if (synth.microtonal.saveXML(filename)) { synth.addHistory(filename, TOPLEVEL::XML::Scale); text = "d " + text; } else text = " FAILED " + text; newMsg = true; break; } case MAIN::control::loadNamedState: vectorClear(NUM_MIDI_CHANNELS); if (synth.loadStateAndUpdate(text)) { text = setExtension(text, EXTEN::state); string defaultName = synth.getRuntime().defaultSession; if ((text != defaultName)) // never include default state synth.addHistory(text, TOPLEVEL::XML::State); partsChanged = 0; text = "ed " + text; } else text = " FAILED " + text; synth.getRuntime().lastBankPart = UNUSED; newMsg = true; break; case MAIN::control::saveNamedState: { string filename = setExtension(text, EXTEN::state); if (synth.saveState(filename)) { partsChanged = 0; string defaultName = synth.getRuntime().defaultSession; if ((text != defaultName)) // never include default state synth.addHistory(filename, TOPLEVEL::XML::State); text = "d " + text; } else text = " FAILED " + text; newMsg = true; break; } case MAIN::control::readLastSeen: break; // do nothing here case MAIN::control::loadFileFromList: break; // do nothing here case MAIN::control::defaultPart: // clear entire part if (write) { undoRedoClear(); synth.part[value]->reset(value); synth.getRuntime().sessionSeen[TOPLEVEL::XML::Instrument] = false; cmd.data.source &= ~TOPLEVEL::action::lowPrio; partsChanged.reset(value); } break; case MAIN::control::defaultInstrument: // clear part's instrument if (write) { undoRedoClear(); doClearPartInstrument(value); synth.getRuntime().sessionSeen[TOPLEVEL::XML::Instrument] = false; cmd.data.source &= ~TOPLEVEL::action::lowPrio; partsChanged.reset(value); } break; case MAIN::control::exportPadSynthSamples: { uchar partnum = insert; synth.part[partnum]->kit[kititem].padpars->buildNewWavetable(true); // blocking wait for result if (synth.part[partnum]->kit[kititem].padpars->export2wav(text)) { synth.addHistory(text, TOPLEVEL::XML::PadSample); text = "d " + text; } else text = " FAILED some samples " + text; newMsg = true; break; } case MAIN::control::masterReset: synth.resetAll(0); partsChanged = 0; break; case MAIN::control::masterResetAndMlearn: synth.resetAll(1); partsChanged = 0; break; case MAIN::control::openManual: // display user guide { text = ""; cmd.data.control = TOPLEVEL::control::textMessage; string found = synth.getRuntime().manualFile; if (not found.empty()) { size_t pos = found.rfind("files/yoshimi_user_guide_version"); found = found.substr(0, pos); file::cmd2string("xdg-open " + found + "index.html &"); } else { cmd.data.miscmsg = textMsgBuffer.push("Can't find manual :("); returnsBuffer.write(cmd.bytes); newMsg = true; } break; } case MAIN::control::startInstance: value = Config::instances().requestNewInstance(value); break; case MAIN::control::stopInstance: text = to_string(value) + " "; if (value < 0 || value >= 32) text += "Out of range"; else { SynthEngine& toClose = Config::instances().findSynthByID(value); if (toClose.getUniqueId() == 0 and value > 0) text += "Can't find"; else { toClose.getRuntime().runSynth = false; text += "Closed"; } } newMsg = true; break; case MAIN::control::stopSound: #ifdef REPORT_NOTES_ON_OFF // note test synth.getRuntime().Log("note on sent " + to_string(synth.getRuntime().noteOnSent)); synth.getRuntime().Log("note on seen " + to_string(synth.getRuntime().noteOnSeen)); synth.getRuntime().Log("note off sent " + to_string(synth.getRuntime().noteOffSent)); synth.getRuntime().Log("note off seen " + to_string(synth.getRuntime().noteOffSeen)); synth.getRuntime().Log("notes hanging sent " + to_string(synth.getRuntime().noteOnSent - synth.getRuntime().noteOffSent)); synth.getRuntime().Log("notes hanging seen " + to_string(synth.getRuntime().noteOnSeen - synth.getRuntime().noteOffSeen)); #endif synth.ShutUp(); break; } cmd.data.source &= ~TOPLEVEL::action::lowPrio; if (control != MAIN::control::startInstance && control != MAIN::control::stopInstance) guiTo = true; return value; } int InterChange::indirectBank(CommandBlock& cmd, uchar& newMsg, bool& guiTo, string& text) { bool write = (cmd.data.type & TOPLEVEL::type::Write); int value = cmd.data.value; int control = cmd.data.control; int kititem = cmd.data.kit; int engine = cmd.data.engine; int insert = cmd.data.insert; int parameter = cmd.data.parameter; switch (control) { case BANK::control::renameInstrument: { if (kititem == UNUSED) { kititem = synth.getRuntime().currentBank; cmd.data.kit = kititem; } if (engine == UNUSED) { engine = synth.getRuntime().currentRoot; cmd.data.engine = engine; } int msgID = synth.bank.setInstrumentName(text, insert, kititem, engine); if (msgID > NO_MSG) text = " FAILED "; else text = " "; text += textMsgBuffer.fetch(msgID & NO_MSG); synth.getRuntime().lastBankPart = UNUSED; newMsg = true; break; } case BANK::control::saveInstrument: { if (kititem == UNUSED) { kititem = synth.getRuntime().currentBank; cmd.data.kit = kititem; } if (engine == UNUSED) { engine = synth.getRuntime().currentRoot; cmd.data.engine = engine; } if (parameter == UNUSED) { parameter = synth.getRuntime().currentPart; cmd.data.parameter = parameter; } text = synth.part[parameter]->Pname; if (text == DEFAULT_NAME) text = "FAILED Can't save default instrument type"; else if (!synth.bank.savetoslot(engine, kititem, insert, parameter)) text = "FAILED Could not save " + text + " to " + to_string(insert + 1); else { // 0x80 on engine indicates it is a save not a load partsChanged.reset(parameter); if (synth.getRuntime().bankHighlight) synth.getRuntime().lastBankPart = (insert << 15) | (kititem << 8) | engine | 0x80; text = "" + to_string(insert + 1) +". " + text; } newMsg = true; break; } case BANK::control::deleteInstrument: { text = synth.bank.clearslot(value, synth.getRuntime().currentRoot, synth.getRuntime().currentBank); synth.getRuntime().lastBankPart = UNUSED; newMsg = true; break; } case BANK::control::selectFirstInstrumentToSwap: { if (kititem == UNUSED) { kititem = synth.getRuntime().currentBank; cmd.data.kit = kititem; } if (engine == UNUSED) { engine = synth.getRuntime().currentRoot; cmd.data.engine = engine; } swapInstrument1 = insert; swapBank1 = kititem; swapRoot1 = engine; break; } case BANK::control::selectSecondInstrumentAndSwap: { if (kititem == UNUSED) { kititem = synth.getRuntime().currentBank; cmd.data.kit = kititem; } if (engine == UNUSED) { engine = synth.getRuntime().currentRoot; cmd.data.engine = engine; } text = synth.bank.swapslot(swapInstrument1, insert, swapBank1, kititem, swapRoot1, engine); swapInstrument1 = UNUSED; swapBank1 = UNUSED; swapRoot1 = UNUSED; synth.getRuntime().lastBankPart = UNUSED; newMsg = true; guiTo = true; break; } case BANK::control::selectBank: if (engine == UNUSED) engine = cmd.data.engine = synth.getRuntime().currentRoot; if (write) { text = textMsgBuffer.fetch(synth.setRootBank(engine, value) & NO_MSG); synth.getRuntime().updateConfig(CONFIG::control::changeBank, synth.getRuntime().currentBank); } else { int tmp = synth.getRuntime().currentBank; text = "Current: " +(to_string(tmp)) + " " + synth.bank.getBankName(tmp, cmd.data.engine); } newMsg = true; break; case BANK::control::renameBank: if (engine == UNUSED) engine = cmd.data.engine = synth.getRuntime().currentRoot; if (write) { int tmp = synth.bank.changeBankName(cmd.data.engine, value, text); text = textMsgBuffer.fetch(tmp & NO_MSG); if (tmp > NO_MSG) text = "FAILED: " + text; guiTo = true; } else { text = " Name: " + synth.bank.getBankName(value, cmd.data.engine); } newMsg = true; break; case BANK::control::createBank: { bool isOK = true; int newbank = kititem; int rootID = engine; if (rootID == UNUSED) rootID = synth.getRuntime().currentRoot; if (newbank == UNUSED) { isOK = false; newbank = 5; // offset to avoid zero for as long as possible for (int i = 0; i < MAX_BANKS_IN_ROOT; ++i) { newbank = (newbank + 5) & 0x7f; if (synth.bank.getBankName(newbank, rootID).empty()) { isOK = true; break; } } if (!isOK) text = "FAILED: Root " + to_string(rootID) + " has no space"; } if (isOK) { string trytext{synth.bank.getBankName(newbank, rootID)}; if (!trytext.empty()) { text = "FAILED: ID " + to_string(newbank) + " already contains " + trytext; isOK = false; } if (isOK and not synth.bank.newIDbank(text, newbank)) { text = "FAILED Could not create bank " + text + " for ID " + asString(newbank); isOK = false; } } if (isOK) text = "Created " + text + " at ID " + to_string(newbank) + " in root " + to_string(rootID); newMsg = true; guiTo = true; } break; case BANK::control::deleteBank: break; // not yet! case BANK::control::findBankSize: if (engine == UNUSED) engine = synth.getRuntime().currentRoot; if (synth.bank.getBankName(kititem, engine).empty()) value = UNUSED; else value = synth.bank.getBankSize(kititem, engine); break; case BANK::control::selectFirstBankToSwap: if (engine == UNUSED) { engine = synth.getRuntime().currentRoot; cmd.data.engine = engine; } swapBank1 = kititem; swapRoot1 = engine; break; case BANK::control::selectSecondBankAndSwap: if (engine == UNUSED) { engine = synth.getRuntime().currentRoot; cmd.data.engine = engine; } text = synth.bank.swapbanks(swapBank1, kititem, swapRoot1, engine); swapBank1 = UNUSED; swapRoot1 = UNUSED; newMsg = true; guiTo = true; break; case BANK::control::selectRoot: if (write) { int msgID = synth.setRootBank(value, UNUSED); if (msgID < NO_MSG) synth.saveBanks(); // do we need this when only selecting? text = textMsgBuffer.fetch(msgID & NO_MSG); synth.getRuntime().updateConfig(CONFIG::control::changeRoot, synth.getRuntime().currentRoot); } else { int tmp = synth.getRuntime().currentRoot; text = "Current Root: " +(to_string(tmp)) + " " + synth.bank.getRootPath(tmp); } newMsg = true; break; case BANK::control::changeRootId: if (engine == UNUSED) cmd.data.engine = synth.getRuntime().currentRoot; synth.bank.changeRootID(cmd.data.engine, value); synth.saveBanks(); break; case BANK::addNamedRoot: if (write) // not realistically readable { if (kititem != UNUSED) { kititem = synth.bank.generateSingleRoot(text, false); cmd.data.kit = kititem; synth.bank.installNewRoot(kititem, text); synth.saveBanks(); } else { size_t found = synth.bank.addRootDir(text); if (found) { synth.bank.installNewRoot(found, text); synth.saveBanks(); } else { value = UNUSED; text = "Can't find path " + text; } } newMsg = true; } break; case BANK::deselectRoot: if (write) // not realistically readable { if (synth.bank.removeRoot(kititem)) value = UNUSED; synth.saveBanks(); } break; case BANK::control::refreshDefaults: if (write) { if (value) synth.bank.checkLocalBanks(); synth.getRuntime().banksChecked = true; synth.getRuntime().updateConfig(CONFIG::control::banksChecked, 1); } break; } cmd.data.source &= ~TOPLEVEL::action::lowPrio; return value; } int InterChange::indirectConfig(CommandBlock& cmd, uchar& newMsg, bool& guiTo, string& text) { bool write = (cmd.data.type & TOPLEVEL::type::Write); int value = cmd.data.value; int control = cmd.data.control; int kititem = cmd.data.kit; switch (control) { case CONFIG::control::jackMidiSource: if (write) { synth.getRuntime().jackMidiDevice = text; synth.getRuntime().updateConfig(CONFIG::control::jackMidiSource, textMsgBuffer.push(text)); } else text = synth.getRuntime().jackMidiDevice; newMsg = true; break; case CONFIG::control::jackServer: if (write) { synth.getRuntime().jackServer = text; synth.getRuntime().updateConfig(CONFIG::control::jackServer, textMsgBuffer.push(text)); } else text = synth.getRuntime().jackServer; newMsg = true; break; case CONFIG::control::alsaMidiSource: if (write) { synth.getRuntime().alsaMidiDevice = text; synth.getRuntime().updateConfig(control, textMsgBuffer.push(text)); } else text = synth.getRuntime().alsaMidiDevice; newMsg = true; break; case CONFIG::control::alsaAudioDevice: if (write) { synth.getRuntime().alsaAudioDevice = text; synth.getRuntime().updateConfig(control, textMsgBuffer.push(text)); } else text = synth.getRuntime().alsaAudioDevice; newMsg = true; break; case CONFIG::control::addPresetRootDir: { bool isOK = false; if (isDirectory(text)) isOK= true; else { if (createDir(text)) { text = " FAILED could not create " + text; } else isOK = true; } if (isOK) { int i = 0; while (!synth.getRuntime().presetsDirlist[i].empty()) ++i; if (i > (MAX_PRESETS - 2)) text = " FAILED preset list full"; else { synth.getRuntime().presetsDirlist[i] = text; text = "ed " + text; } synth.getRuntime().savePresetsList(); } newMsg = true; break; } case CONFIG::control::removePresetRootDir: { int i = value; text = synth.getRuntime().presetsDirlist[i]; while (!synth.getRuntime().presetsDirlist[i + 1].empty()) { synth.getRuntime().presetsDirlist[i] = synth.getRuntime().presetsDirlist[i + 1]; ++i; } synth.getRuntime().presetsDirlist[i] = ""; synth.getRuntime().presetsRootID = 0; newMsg = true; synth.getRuntime().savePresetsList(); break; } case CONFIG::control::currentPresetRoot: { if (write) { synth.getRuntime().presetsRootID = value; } else value = synth.getRuntime().presetsRootID = value; text = synth.getRuntime().presetsDirlist[value]; newMsg = true; break; } case CONFIG::control::saveCurrentConfig: if (write) { text = synth.getRuntime().configFile; if (synth.getRuntime().saveInstanceConfig()) text = "d " + text; else text = " FAILED " + text; } else text = "READ"; newMsg = true; cmd.data.miscmsg = textMsgBuffer.push(text); // slightly odd case break; case CONFIG::control::historyLock: { if (write) { synth.setHistoryLock(kititem, value); } else value = synth.getHistoryLock(kititem); break; } } if ((cmd.data.source & TOPLEVEL::action::noAction) != TOPLEVEL::action::fromGUI) guiTo = true; cmd.data.source &= ~TOPLEVEL::action::lowPrio; return value; } int InterChange::indirectPart(CommandBlock& cmd, uchar& newMsg, bool& guiTo, string& text) { bool write = (cmd.data.type & TOPLEVEL::type::Write); int value = cmd.data.value; int control = cmd.data.control; uint npart = cmd.data.part; int kititem = cmd.data.kit; int parameter = cmd.data.parameter; assert(npart < NUM_MIDI_PARTS); Part& part{*synth.part[npart]}; switch(control) { case PART::control::keyShift: { if (write) { part.Pkeyshift = value + 64; synth.setPartMap(npart); } else value = part.Pkeyshift - 64; cmd.data.source &= ~TOPLEVEL::action::lowPrio; } break; case PART::control::enableKitLine: if (write) { part.setkititemstatus(kititem, value); synth.partonoffWrite(npart, 2); cmd.data.source &= ~TOPLEVEL::action::lowPrio; } break; case PADSYNTH::control::applyChanges: // it appears Pkitmode is not being recognised here :( if (kititem >= NUM_KIT_ITEMS)//not part.Pkitmode) kititem = 0; if (write) { // esp. a "blocking Apply" is redirected from Synth-Thread: commandSendReal() -> commandPad() -> returns() -> indirectTransfers() synth.part[npart]->kit[kititem].padpars->buildNewWavetable((parameter == 0)); // parameter == 0 causes blocking wait cmd.data.source &= ~TOPLEVEL::action::lowPrio; } else value = not part.kit[kititem].padpars->futureBuild.isUnderway(); break; case PART::control::audioDestination: if (npart < synth.getRuntime().numAvailableParts) { if (value & 2) { Config::instances().registerAudioPort(synth.getUniqueId(), npart); } cmd.data.source &= ~TOPLEVEL::action::lowPrio; } break; case PART::control::instrumentCopyright: if (write) { part.info.Pauthor = text; guiTo = true; } else text = part.info.Pauthor; cmd.data.source &= ~TOPLEVEL::action::lowPrio; newMsg = true; break; case PART::control::instrumentComments: if (write) { part.info.Pcomments = text; guiTo = true; } else text = part.info.Pcomments; cmd.data.source &= ~TOPLEVEL::action::lowPrio; newMsg = true; break; case PART::control::instrumentName: // part or kit item names if (kititem == UNUSED) { if (write) { part.Pname = text; if (part.Poriginal.empty() || part.Poriginal == UNTITLED) part.Poriginal = text; guiTo = true; } else { text = part.Pname; } } else if (part.Pkitmode) { if (kititem >= NUM_KIT_ITEMS) text = " FAILED out of range"; else { if (write) { part.kit[kititem].Pname = text; guiTo = true; } else { text = part.kit[kititem].Pname; } } } else text = " FAILED Not in kit mode"; cmd.data.source &= ~TOPLEVEL::action::lowPrio; newMsg = true; break; case PART::control::instrumentType: if (write) { part.info.Ptype = value; guiTo = true; } else value = part.info.Ptype; cmd.data.source &= ~TOPLEVEL::action::lowPrio; break; case PART::control::defaultInstrumentCopyright: string name = file::configDir() + "/copyright.txt"; if (parameter == 0) // load { text = loadText(name); // TODO provide failure warning text = func::formatTextLines(text, 54); part.info.Pauthor = text; guiTo = true; } else { text = part.info.Pauthor; saveText(text, name); } cmd.data.source &= ~TOPLEVEL::action::lowPrio; newMsg = true; break; } return value; } string InterChange::formatScales(string text) { string delimiters{","}; size_t current; size_t next = -1; size_t found; string word; string newtext; do { current = next + 1; next = text.find_first_of(delimiters, current ); word = func::trimEnds(text.substr(current, next - current)); found = word.find('.'); if (found != string::npos) { if (found < 4) { string tmp (4 - found, '0'); // leading zeros word = tmp + word; } found = word.size(); if (found < 11) { string tmp (11 - found, '0'); // trailing zeros word += tmp; } } newtext += word; if (next != string::npos) newtext += "\n"; } while (next != string::npos); return newtext; } string InterChange::formatKeys(string text) { string delimiters{","}; size_t current; size_t next = -1; string word; string newtext; do { current = next + 1; next = text.find_first_of(delimiters, current ); word = func::trimEnds(text.substr(current, next - current)); if (word[0] < '0' || word[0] > '9') { word = "x"; } newtext += word; if (next != string::npos) newtext += "\n"; } while (next != string::npos); return newtext; } float InterChange::readAllData(CommandBlock& cmd) { if (cmd.data.part == TOPLEVEL::instanceID) { return synth.getUniqueId(); } if (cmd.data.part == TOPLEVEL::windowTitle) { return buildWindowTitle(cmd); } if (cmd.data.type & TOPLEVEL::type::Limits) // these are static { /* * commandtype limits values * 0 adjusted input value * 1 min * 2 max * 3 default * * tryData.data.type will be updated: * bit 5 set MIDI-learnable * bit 7 set Is an integer value */ cmd.data.type -= TOPLEVEL::type::Limits; float value = returnLimits(cmd); synth.getRuntime().finishedCLI = true; return value; } // these are not! /* * VU always responds even when loading a *huge* * PadSynth instrument. This is safe because the part * being changed is disabled, so won't be seen. * * Other reads will be blocked. * This needs improving. */ CommandBlock forwardCmd; uchar control = cmd.data.control; if (cmd.data.part == TOPLEVEL::section::main && (control >= MAIN::control::readPartPeak && control <= MAIN::control::readMainLRrms)) { commandSendReal(cmd); synth.fetchMeterData(); return cmd.data.value; } int npart = cmd.data.part; bool indirect = ((cmd.data.source & TOPLEVEL::action::muteAndLoop) == TOPLEVEL::action::lowPrio); if (npart < NUM_MIDI_PARTS && synth.part[npart]->busy) { cmd.data.control = TOPLEVEL::control::partBusy; // part busy message cmd.data.kit = UNUSED; cmd.data.engine = UNUSED; cmd.data.insert = UNUSED; } reTry: memcpy(forwardCmd.bytes, cmd.bytes, sizeof(forwardCmd)); while (syncWrite || lowPrioWrite) sleep_for(10us); if (indirect) { /* * This still isn't quite right there is a very * remote chance of getting garbled text :( */ indirectTransfers(forwardCmd, true); synth.getRuntime().finishedCLI = true; return forwardCmd.data.value; } else commandSendReal(forwardCmd); if (syncWrite || lowPrioWrite) goto reTry; // it may have changed mid-process if ((forwardCmd.data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromCLI) resolveReplies(forwardCmd); synth.getRuntime().finishedCLI = true; // in case it misses lines above return forwardCmd.data.value; } float InterChange::buildWindowTitle(CommandBlock& cmd) { string sent_name = synth.textMsgBuffer.fetch((int(cmd.data.value))); // catch this early string name = synth.makeUniqueName(""); int section = cmd.data.control; int engine = cmd.data.engine; if (section >= NUM_MIDI_PARTS) { if (section == TOPLEVEL::section::systemEffects) name += "System Effect "; else if (section == TOPLEVEL::section::insertEffects) name += "Insert Effect "; if (section != UNUSED) { name += to_string(engine + 1); name += " - "; } if (cmd.data.kit == EFFECT::type::dynFilter) name += "DynFilter "; name += sent_name; return synth.textMsgBuffer.push(name); } if (engine == PART::engine::padSynth) name += "PadSynth "; else if (engine == PART::engine::subSynth) name += "SubSynth "; else if (engine < PART::engine::addVoiceModEnd) { name += "AddSynth "; if (cmd.data.engine >= PART::engine::addMod1) name += "Modulator "; else if (engine >= PART::engine::addVoice1) { name += "Voice "; } if (engine != PART::engine::addSynth) { name += to_string((engine & 7) + 1); name += " "; } } if (cmd.data.insert == TOPLEVEL::insert::envelopeGroup) { int group = int(cmd.data.parameter); switch (group) { case TOPLEVEL::insertType::amplitude: name += "Amplitude "; break; case TOPLEVEL::insertType::frequency: name += "Frequency "; break; case TOPLEVEL::insertType::filter: name += "Filter "; break; case TOPLEVEL::insertType::bandwidth: name += "Bandwidth "; break; } } name += sent_name; if (section < NUM_MIDI_PARTS) // it's at part level { name += " - Part "; name += to_string(section + 1); name += " "; name += synth.part[section]->Pname; if (synth.part[section]->Pkitmode != 0) { int kititem = int(cmd.data.kit); name += ", Kit "; if (kititem < NUM_KIT_ITEMS) { name += to_string(kititem + 1); name += " "; string kitname = synth.part[section]->kit[kititem].Pname; if (!kitname.empty()) { name += "- "; name += kitname; } } } } return synth.textMsgBuffer.push(name); } void InterChange::resolveReplies(CommandBlock& cmd) { //synth.CBtest(cmd, true); uchar source = cmd.data.source & TOPLEVEL::action::noAction; // making sure there are no stray top bits. if (source == TOPLEVEL::action::noAction) { // in case it was originally called from CLI synth.getRuntime().finishedCLI = true; return; // no further action } if (cmd.data.type & TOPLEVEL::type::LearnRequest) { synth.midilearn.setTransferBlock(cmd); return; } if (source != TOPLEVEL::action::fromMIDI && !setUndo) { //synth.getRuntime().Log(resolveAll(synth, cmd, _SYS_::LogNotSerious) + ": Ctl " + to_string(int(cmd.data.control))); synth.getRuntime().Log(resolveAll(synth, cmd, _SYS_::LogNotSerious)); } if (source == TOPLEVEL::action::fromCLI) synth.getRuntime().finishedCLI = true; } // This is only used when no valid banks can be found void InterChange::generateSpecialInstrument(int npart, string name) { assert(npart < NUM_MIDI_PARTS); Part& part{*synth.part[npart]}; part.Pname = name; part.info.Ptype = 17; // Warm Pad part.info.Pauthor = "Yoshimi Team\nGPL V2 or later"; part.partefx[0]->changeeffect(1); part.kit[0].Padenabled = false; part.kit[0].Psubenabled = true; SUBnoteParameters& pars{ * part.kit[0].subpars}; pars.Phmag[1] = 75; pars.Phmag[2] = 40; pars.Pbandwidth = 60; } /**********************************************************************************//** * Core operation : retrieve, evaluate and forward command messages. * @warning this function runs at the begin of each audio computation cycle. * @remark Command messages are fetched from the ringbuffers * - fromCLI * - fromGUI * - fromMIDI * Commands are then either directly processed (`commandSend()`), or dispatched * indirectly with the help of the background-thread. Responses and retrieved data * is collected by side-effect in the COmmandData block and send back (`returns()*); * moreover, result values are also published through the toGUI ringbuffer, from where * they are dispatched by the »duty-cycle« in the event handling thread. */ void InterChange::mediate() { CommandBlock cmd; cmd.data.control = UNUSED; // No other data element could be read uninitialised syncWrite = true; if (setUndo) { int step = 0; while (setUndo and step < 16) { undoLast(cmd); commandSend(cmd); returns(cmd); ++ step; } } bool more; do { more = false; #ifndef YOSHIMI_LV2_PLUGIN if (fromCLI.read(cmd.bytes)) { more = true; cameFrom = envControl::input; if (cmd.data.part != TOPLEVEL::section::midiLearn) // Not special midi-learn message commandSend(cmd); returns(cmd); } #endif #ifdef GUI_FLTK if (synth.getRuntime().showGui && fromGUI.read(cmd.bytes)) { more = true; cameFrom = envControl::input; if (cmd.data.part != TOPLEVEL::section::midiLearn) // Not special midi-learn message commandSend(cmd); returns(cmd); } #endif if (fromMIDI.read(cmd.bytes)) { more = true; cameFrom = envControl::input; if (cmd.data.part != TOPLEVEL::section::midiLearn) // Normal MIDI message, not special midi-learn message { historyActionCheck(cmd); commandSend(cmd); returns(cmd); } #ifdef GUI_FLTK else if (synth.getRuntime().showGui && cmd.data.control == MIDILEARN::control::reportActivity) toGUI.write(cmd.bytes); #endif } else if (cmd.data.control == TOPLEVEL::section::midiLearn) { // we are looking at the MIDI learn control type that any section *except* MIDI can send. synth.mididecode.midiProcess(cmd.data.kit, cmd.data.engine, cmd.data.insert, false); } if (returnsBuffer.read(cmd.bytes)) { returns(cmd); more = true; } } while (more and synth.getRuntime().runSynth.load(std::memory_order_relaxed)); syncWrite = false; } /* * Currently this is only used by MIDI NRPNs but eventually * be used as a unified way of catching all list loads. */ void InterChange::historyActionCheck(CommandBlock& cmd) { if (cmd.data.part != TOPLEVEL::section::main || cmd.data.control != MAIN::control::loadFileFromList) return; cmd.data.type |= TOPLEVEL::type::Write; // just to be sure switch (cmd.data.kit) { case TOPLEVEL::XML::Instrument: cmd.data.source |= TOPLEVEL::action::lowPrio; synth.partonoffWrite((cmd.data.insert << 4), -1); break; case TOPLEVEL::XML::Patch: cmd.data.source |= TOPLEVEL::action::muteAndLoop; break; case TOPLEVEL::XML::Scale: cmd.data.source |= TOPLEVEL::action::lowPrio; break; case TOPLEVEL::XML::State: cmd.data.source |= TOPLEVEL::action::muteAndLoop; break; case TOPLEVEL::XML::Vector: cmd.data.source |= TOPLEVEL::action::muteAndLoop; break; } } /** * Publish results and retrieved values up into the GUI */ void InterChange::returns(CommandBlock& cmd) { synth.getRuntime().finishedCLI = true; // belt and braces :) if ((cmd.data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::noAction) return; // no further action #ifndef YOSHIMI_LV2_PLUGIN uchar npart = cmd.data.part; if (npart == TOPLEVEL::section::display) { /* * This will write directly into toGUI where the value in 'offset' will be * used as the section number in place of 'display' so the correct section * is identified for opening, closing, resizing etc. */ manageDisplay(cmd); return; } #endif if (cmd.data.source < TOPLEVEL::action::lowPrio) { // currently only used by gui. this may change! #ifdef GUI_FLTK if (synth.getRuntime().showGui) { uchar type = cmd.data.type; // back from synth int tmp = (cmd.data.source & TOPLEVEL::action::noAction); if (cmd.data.source & TOPLEVEL::action::forceUpdate) tmp = TOPLEVEL::action::toAll; /* * by the time we reach this point setUndo will have been cleared for single * undo/redo actions. It will also have been cleared for the last one of a group. * By suppressing the GUI return for the resonance window we avoid a lot of * unnecessary redraw actions for the entire graphic area. */ if (!(setUndo && cmd.data.insert == TOPLEVEL::insert::resonanceGraphInsert)) { if (type & TOPLEVEL::type::Write) { if (tmp != TOPLEVEL::action::fromGUI) { toGUI.write(cmd.bytes); } if (cameFrom == 1) synth.getRuntime().Log("Undo:"); else if (cameFrom == 2) synth.getRuntime().Log("Redo:"); } } } #endif } if (!decodeLoopback.write(cmd.bytes)) synth.getRuntime().Log("Unable to write to decodeLoopback buffer"); spinSortResultsThread(); } void InterChange::doClearPartInstrument(int npart) { synth.part[npart]->defaultsinstrument(); synth.part[npart]->cleanup(); synth.getRuntime().currentPart = npart; synth.partonoffWrite(npart, 2); synth.pushEffectUpdate(npart); } bool InterChange::commandSend(CommandBlock& cmd) { uchar npart = cmd.data.part; if (npart == TOPLEVEL::section::display) return true; // no data change, just GUI display issues bool isChanged = commandSendReal(cmd); bool isWrite = (cmd.data.type & TOPLEVEL::type::Write) > 0; if (isWrite && isChanged) // write command { synth.setNeedsSaving(true); uchar control = cmd.data.control; uchar insert = cmd.data.insert; if (npart < NUM_MIDI_PARTS && (insert != UNUSED || (control != PART::control::enable && control != PART::control::instrumentName))) { if (synth.part[npart]->Pname == DEFAULT_NAME) { synth.part[npart]->Pname = UNTITLED; cmd.data.source |= TOPLEVEL::action::forceUpdate; } } } return isChanged; } /** * Process the given command message directly within this (Synth) thread. */ bool InterChange::commandSendReal(CommandBlock& cmd) { uchar npart = cmd.data.part; if (npart == TOPLEVEL::section::midiIn) // music input takes priority! { commandMidi(cmd); return false; } if (cmd.data.control == TOPLEVEL::control::forceExit) { cmd.data.source = TOPLEVEL::action::noAction; Config::primary().exitType = FORCED_EXIT; Config::primary().runSynth = false; return false; } if (npart == TOPLEVEL::section::undoMark) { if (cmd.data.control == MAIN::control::undo && !undoList.empty()) { setUndo = true; undoStart = true; } else if (cmd.data.control == MAIN::control::redo && !redoList.empty()) { setUndo = true; setRedo = true; undoStart = true; } } uchar type = cmd.data.type; uchar control = cmd.data.control; uchar engine = cmd.data.engine; if(npart < NUM_MIDI_PARTS && (type & TOPLEVEL::type::Write)) { if (synth.getRuntime().enablePartReports) partsChanged.set(npart); /* std::cout<< std::endl; for (int i = 0; i < 64; ++i) // easier to read this way! { if (partsChanged.test(i)) std::cout << "1"; else std::cout << "0"; if ((i & 15) == 15) std::cout<< std::endl; } std::cout << "latest part " << int(npart + 1) << " write" << std::endl; */ } if ((cmd.data.source & TOPLEVEL::action::muteAndLoop) == TOPLEVEL::action::lowPrio) { return true; // indirect transfer } uchar kititem = cmd.data.kit; uchar effSend = cmd.data.kit; uchar insert = cmd.data.insert; bool isGui = ((cmd.data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromGUI); char button = type & 3; if (not isGui and button == 1) { return false; } if (npart == TOPLEVEL::section::vector) { commandVector(cmd); return true; } if (npart == TOPLEVEL::section::scales) { commandMicrotonal(cmd); return true; } if (npart == TOPLEVEL::section::config) { commandConfig(cmd); return true; } if (npart == TOPLEVEL::section::bank) { commandBank(cmd); return true; } if (npart == TOPLEVEL::section::main) { commandMain(cmd); return true; } if ((npart == TOPLEVEL::section::systemEffects or npart == TOPLEVEL::section::insertEffects) and effSend == UNUSED) { commandSysIns(cmd); return true; } if (effSend >= (EFFECT::type::none) and effSend < (EFFECT::type::count)) { commandEffects(cmd); return true; } if (npart >= NUM_MIDI_PARTS) { return false; // invalid part number } if (kititem >= NUM_KIT_ITEMS && kititem != UNUSED) { return false; // invalid kit number } assert(npart < NUM_MIDI_PARTS); Part& part{*synth.part[npart]}; if (part.busy && engine == PART::engine::padSynth) { cmd.data.type &= ~TOPLEVEL::type::Write; // turn it into a read cmd.data.control = TOPLEVEL::control::partBusy; cmd.data.kit = UNUSED; cmd.data.engine = UNUSED; cmd.data.insert = UNUSED; return false; } if (control == TOPLEVEL::control::partBusy) { cmd.data.value = part.busy; return false; } if (kititem == UNUSED || insert == TOPLEVEL::insert::kitGroup) { commandPart(cmd); return true; } if (kititem > 0 and kititem != UNUSED) { if (not part.Pkitmode) return false; else if (not part.kit[kititem].Penabled) return false; } if (engine == PART::engine::addSynth) return processAdd(cmd, synth); if (engine == PART::engine::subSynth) return processSub(cmd, synth); if (engine == PART::engine::padSynth) return processPad(cmd); if (engine >= PART::engine::addVoice1) { if ( engine >= PART::engine::addVoiceModEnd) { cmd.data.source = TOPLEVEL::action::noAction; synth.getRuntime().Log("Invalid voice number"); synth.getRuntime().finishedCLI = true; return false; } return processVoice(cmd, synth); } cmd.data.source = TOPLEVEL::action::noAction; synth.getRuntime().Log("Invalid engine number"); synth.getRuntime().finishedCLI = true; return false; } bool InterChange::processAdd(CommandBlock& cmd, SynthEngine& synth) { Part& part = * synth.part[cmd.data.part]; int kititem = cmd.data.kit; switch(cmd.data.insert) { case UNUSED: commandAdd(cmd); part.kit[kititem].adpars->paramsChanged(); break; case TOPLEVEL::insert::LFOgroup: commandLFO(cmd); break; case TOPLEVEL::insert::filterGroup: commandFilter(cmd); break; case TOPLEVEL::insert::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: commandEnvelope(cmd); break; case TOPLEVEL::insert::resonanceGroup: case TOPLEVEL::insert::resonanceGraphInsert: commandResonance(cmd, part.kit[kititem].adpars->GlobalPar.Reson); part.kit[kititem].adpars->paramsChanged(); break; } return true; } bool InterChange::processVoice(CommandBlock& cmd, SynthEngine& synth) { Part& part = *synth.part[cmd.data.part]; int control = cmd.data.control; int kititem = cmd.data.kit; int engine = cmd.data.engine; switch(cmd.data.insert) { case UNUSED: commandAddVoice(cmd); part.kit[kititem].adpars->paramsChanged(); break; case TOPLEVEL::insert::LFOgroup: commandLFO(cmd); break; case TOPLEVEL::insert::filterGroup: commandFilter(cmd); break; case TOPLEVEL::insert::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: commandEnvelope(cmd); break; case TOPLEVEL::insert::oscillatorGroup: case TOPLEVEL::insert::harmonicAmplitude: case TOPLEVEL::insert::harmonicPhase: if (engine >= PART::engine::addMod1) { engine -= PART::engine::addMod1; if (control != ADDVOICE::control::modulatorOscillatorSource) { int voicechange = part.kit[kititem].adpars->VoicePar[engine].PextFMoscil; if (voicechange != -1) { engine = voicechange; cmd.data.engine = engine + PART::addMod1; } // force it to external mod } commandOscillator(cmd, part.kit[kititem].adpars->VoicePar[engine].POscilFM); } else { engine -= PART::engine::addVoice1; if (control != PART::control::sustainPedalEnable) { int voicechange = part.kit[kititem].adpars->VoicePar[engine].Pextoscil; if (voicechange != -1) { engine = voicechange; cmd.data.engine = engine | PART::engine::addVoice1; } // force it to external voice } commandOscillator(cmd, part.kit[kititem].adpars->VoicePar[engine].POscil); } part.kit[kititem].adpars->paramsChanged(); break; } return true; } bool InterChange::processSub(CommandBlock& cmd, SynthEngine& synth) { Part& part = *synth.part[cmd.data.part]; int kititem = cmd.data.kit; bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; switch(cmd.data.insert) { case UNUSED: commandSub(cmd); if (write) part.kit[kititem].subpars->paramsChanged(); break; case TOPLEVEL::insert::LFOgroup: commandLFO(cmd); break; case TOPLEVEL::insert::harmonicAmplitude: commandSub(cmd); if (write) part.kit[kititem].subpars->paramsChanged(); break; case TOPLEVEL::insert::harmonicBandwidth: commandSub(cmd); if (write) part.kit[kititem].subpars->paramsChanged(); break; case TOPLEVEL::insert::filterGroup: commandFilter(cmd); break; case TOPLEVEL::insert::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: commandEnvelope(cmd); break; } return true; } namespace { inline PADnoteParameters& getPADnoteParameters(CommandBlock& cmd, SynthEngine& synth) { size_t partNo = cmd.data.part; size_t item = cmd.data.kit; PADnoteParameters* padPars = synth.part[partNo]->kit[item].padpars; assert (padPars); return *padPars; } } bool InterChange::processPad(CommandBlock& cmd) { PADnoteParameters& pars = getPADnoteParameters(cmd, synth); bool needApply{false}; switch(cmd.data.insert) { case UNUSED: needApply = commandPad(cmd, pars); pars.paramsChanged(); break; case TOPLEVEL::insert::LFOgroup: commandLFO(cmd); break; case TOPLEVEL::insert::filterGroup: commandFilter(cmd); break; case TOPLEVEL::insert::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: commandEnvelope(cmd); break; case TOPLEVEL::insert::oscillatorGroup: commandOscillator(cmd, pars.POscil.get()); pars.paramsChanged(); needApply = true; break; case TOPLEVEL::insert::harmonicAmplitude: commandOscillator(cmd, pars.POscil.get()); pars.paramsChanged(); needApply = true; break; case TOPLEVEL::insert::harmonicPhase: commandOscillator(cmd, pars.POscil.get()); pars.paramsChanged(); needApply = true; break; case TOPLEVEL::insert::resonanceGroup: commandResonance(cmd, pars.resonance.get()); pars.paramsChanged(); needApply = true; break; case TOPLEVEL::insert::resonanceGraphInsert: commandResonance(cmd, pars.resonance.get()); pars.paramsChanged(); needApply = true; break; } if (needApply and (cmd.data.type & TOPLEVEL::type::Write)) { PADStatus::mark(PADStatus::DIRTY, *this, pars.partID, pars.kitID); if (synth.getRuntime().usePadAutoApply()) {// »Auto Apply« - trigger rebuilding of wavetable on each relevant change synth.getRuntime().Log("PADSynth: trigger background wavetable build..."); pars.buildNewWavetable(); } cmd.data.offset = 0; } return true; } void InterChange::commandMidi(CommandBlock& cmd) { int value_int = lrint(cmd.data.value); uchar control = cmd.data.control; uchar chan = cmd.data.kit; uint char1 = cmd.data.engine; uchar miscmsg = cmd.data.miscmsg; if (control == MIDI::control::controller && char1 >= 0x80) char1 |= 0x200; // for 'specials' switch(control) { case MIDI::control::noteOn: synth.NoteOn(chan, char1, value_int); synth.getRuntime().finishedCLI = true; cmd.data.source = TOPLEVEL::action::noAction; // till we know what to do! break; case MIDI::control::noteOff: synth.NoteOff(chan, char1); synth.getRuntime().finishedCLI = true; cmd.data.source = TOPLEVEL::action::noAction; // till we know what to do! break; case MIDI::control::controller: synth.SetController(chan, char1, value_int); break; case MIDI::control::instrument: cmd.data.source |= TOPLEVEL::action::lowPrio; cmd.data.part = TOPLEVEL::section::midiIn; synth.partonoffLock(chan & 0x3f, -1); synth.getRuntime().finishedCLI = true; break; case MIDI::control::bankChange: cmd.data.source = TOPLEVEL::action::lowPrio; if ((value_int != UNUSED || miscmsg != NO_MSG) && chan < synth.getRuntime().numAvailableParts) { synth.partonoffLock(chan & 0x3f, -1); synth.getRuntime().finishedCLI = true; } break; } } void InterChange::vectorClear(int Nvector) { int start; int end; if (Nvector >= NUM_MIDI_CHANNELS) { start = 0; end = NUM_MIDI_CHANNELS; } else { start = Nvector; end = Nvector + 1; } for (int ch = start; ch < end; ++ ch) { synth.getRuntime().vectordata.Xaxis[ch] = UNUSED; synth.getRuntime().vectordata.Yaxis[ch] = UNUSED; synth.getRuntime().vectordata.Xfeatures[ch] = 0; synth.getRuntime().vectordata.Yfeatures[ch] = 0; synth.getRuntime().vectordata.Enabled[ch] = false; synth.getRuntime().vectordata.Name[ch] = "No Name " + to_string(ch + 1); } } void InterChange::commandVector(CommandBlock& cmd) { int value = cmd.data.value; // no floats here uchar type = cmd.data.type; uchar control = cmd.data.control; uint chan = cmd.data.parameter; bool write = (type & TOPLEVEL::type::Write) > 0; uint features = 0; if (control == VECTOR::control::erase) { vectorClear(chan); return; } if (write) { if (control >= VECTOR::control::Xfeature0 && control <= VECTOR::control::Xfeature3) features = synth.getRuntime().vectordata.Xfeatures[chan]; else if (control >= VECTOR::control::Yfeature0 && control <= VECTOR::control::Yfeature3) features = synth.getRuntime().vectordata.Yfeatures[chan]; } switch (control) { case 0: break; case 1: if (write) { switch (value) { case 0: case 1: case 2: // local to source break; case 3: synth.vectorSet(127, chan, 0); break; case 4: for (int ch = 0; ch < NUM_MIDI_CHANNELS; ++ ch) synth.vectorSet(127, ch, 0); break; } } break; case VECTOR::control::name: break; // handled elsewhere case VECTOR::control::Xcontroller: // also enable vector if (write) { if (value > 0) { if (!synth.vectorInit(0, chan, value)) { synth.vectorSet(0, chan, value); if (synth.getRuntime().numAvailableParts < (NUM_MIDI_CHANNELS * 2)) synth.getRuntime().numAvailableParts = NUM_MIDI_CHANNELS * 2; } else cmd.data.value = 0; } } else { cmd.data.value = synth.getRuntime().vectordata.Xaxis[chan]; } break; case VECTOR::control::XleftInstrument: if (write) synth.vectorSet(4, chan, value); else { ; } break; case VECTOR::control::XrightInstrument: if (write) synth.vectorSet(5, chan, value); break; case VECTOR::control::Xfeature0: case VECTOR::control::Yfeature0: // volume if (write) { if (value == 0) bitClear(features, 0); else bitSet(features, 0); } else // read all features for X or Y { if (control == VECTOR::control::Xfeature0) { cmd.data.value = synth.getRuntime().vectordata.Xfeatures[chan]; } else if (control == VECTOR::control::Yfeature0) cmd.data.value = synth.getRuntime().vectordata.Yfeatures[chan]; } break; case VECTOR::control::Xfeature1: case VECTOR::control::Yfeature1: // panning if (write) { bitClear(features, 1); bitClear(features, 4); if (value > 0) { bitSet(features, 1); if (value == 2) bitSet(features, 4); } } else { ; } break; case VECTOR::control::Xfeature2: case VECTOR::control::Yfeature2: // filter cutoff if (write) { bitClear(features, 2); bitClear(features, 5); if (value > 0) { bitSet(features, 2); if (value == 2) bitSet(features, 5); } } else { ; } break; case VECTOR::control::Xfeature3: case VECTOR::control::Yfeature3: // modulation if (write) { bitClear(features, 3); bitClear(features, 6); if (value > 0) { bitSet(features, 3); if (value == 2) bitSet(features, 6); } } else { ; } break; case VECTOR::control::Ycontroller: // also enable Y if (write) { if (value > 0) { if (!synth.vectorInit(1, chan, value)) { synth.vectorSet(1, chan, value); if (synth.getRuntime().numAvailableParts < (NUM_MIDI_CHANNELS * 4)) synth.getRuntime().numAvailableParts = NUM_MIDI_CHANNELS * 4; } else cmd.data.value = 0; } } else { cmd.data.value = synth.getRuntime().vectordata.Yaxis[chan]; } break; case VECTOR::control::YupInstrument: if (write) synth.vectorSet(6, chan, value); else { ; } break; case VECTOR::control::YdownInstrument: if (write) synth.vectorSet(7, chan, value); else { ; } break; } if (write) { if (control >= VECTOR::control::Xfeature0 && control <= VECTOR::control::Xfeature3) synth.getRuntime().vectordata.Xfeatures[chan] = features; else if (control >= VECTOR::control::Yfeature0 && control <= VECTOR::control::Yfeature3) synth.getRuntime().vectordata.Yfeatures[chan] = features; } } void InterChange::commandMicrotonal(CommandBlock& cmd) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; bool write = (type & TOPLEVEL::type::Write) > 0; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); bool retune = false; switch (control) { case SCALES::control::refFrequency: if (write) { if (value > 2000) value = 2000; else if (value < 1) value = 1; synth.microtonal.PrefFreq = value; retune = true; } else value = synth.microtonal.PrefFreq; cmd.data.parameter = synth.microtonal.PrefNote; break; case SCALES::control::refNote: if (write) { synth.microtonal.PrefNote = value_int; retune = true; } else value = synth.microtonal.PrefNote; break; case SCALES::control::invertScale: if (write) { synth.microtonal.Pinvertupdown = value_bool; retune = true; } else value = synth.microtonal.Pinvertupdown; break; case SCALES::control::invertedScaleCenter: if (write) { synth.microtonal.Pinvertupdowncenter = value_int; retune = true; } else value = synth.microtonal.Pinvertupdowncenter; break; case SCALES::control::scaleShift: if (write) { synth.microtonal.Pscaleshift = value_int + 64; retune = true; } else value = synth.microtonal.Pscaleshift - 64; break; case SCALES::control::enableMicrotonal: if (write) { synth.microtonal.Penabled = value_bool; synth.microtonal.Pmappingenabled = false; retune = true; } else value = synth.microtonal.Penabled; break; case SCALES::control::enableKeyboardMap: if (write) { synth.microtonal.Pmappingenabled = value_bool; retune = true; } else value = synth.microtonal.Pmappingenabled; break; case SCALES::control::lowKey: if (write) { if (value_int < 0) { value_int = 0; cmd.data.value = value_int; } else if (value_int > synth.microtonal.Pmiddlenote) { value_int = synth.microtonal.Pmiddlenote; cmd.data.value = value_int; } synth.microtonal.Pfirstkey = value_int; } else value = synth.microtonal.Pfirstkey; break; case SCALES::control::middleKey: if (write) { if (value_int < synth.microtonal.Pfirstkey) { value_int = synth.microtonal.Pfirstkey; cmd.data.value = value_int; } else if (value_int > synth.microtonal.Plastkey) { value_int = synth.microtonal.Plastkey; cmd.data.value = value_int; } synth.microtonal.Pmiddlenote = value_int; retune = true; } else value = synth.microtonal.Pmiddlenote; break; case SCALES::control::highKey: if (write) { if (value_int < synth.microtonal.Pmiddlenote) { value_int = synth.microtonal.Pmiddlenote; cmd.data.value = value_int; } else if (value_int >= MAX_OCTAVE_SIZE) { value_int = MAX_OCTAVE_SIZE - 1; cmd.data.value = value_int; } synth.microtonal.Plastkey = value_int; } else value = synth.microtonal.Plastkey; break; case SCALES::control::tuning: // done elsewhere break; case SCALES::control::keyboardMap: // done elsewhere break; case SCALES::control::keymapSize: // done elsewhere break; case SCALES::control::importScl: // done elsewhere break; case SCALES::control::importKbm: // done elsewhere break; case SCALES::control::name: // done elsewhere break; case SCALES::control::comment: // done elsewhere break; case SCALES::control::clearAll: // Clear scales synth.microtonal.defaults(); retune = true; break; } if (write) { if (retune) synth.setAllPartMaps(); } else cmd.data.value = value; } void InterChange::commandConfig(CommandBlock& cmd) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; bool write = (type & TOPLEVEL::type::Write) > 0; bool mightChange = true; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); switch (control) { // main case CONFIG::control::oscillatorSize: if (write) { value = nearestPowerOf2(value_int, MIN_OSCIL_SIZE, MAX_OSCIL_SIZE); cmd.data.value = value; synth.getRuntime().oscilsize = value; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().oscilsize; break; case CONFIG::control::bufferSize: if (write) { value = nearestPowerOf2(value_int, MIN_BUFFER_SIZE, MAX_BUFFER_SIZE); cmd.data.value = value; synth.getRuntime().buffersize = value; synth.getRuntime().updateConfig(control, value); } else { value = synth.getRuntime().buffersize; } break; case CONFIG::control::padSynthInterpolation: if (write) { synth.getRuntime().Interpolation = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().Interpolation; break; case CONFIG::control::virtualKeyboardLayout: if (write) { synth.getRuntime().virKeybLayout = value_int; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().virKeybLayout; break; case CONFIG::control::reportsDestination: if (write) { synth.getRuntime().toConsole = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().toConsole; break; case CONFIG::control::logTextSize: if (write) { synth.getRuntime().consoleTextSize = value_int; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().consoleTextSize; break; case CONFIG::control::savedInstrumentFormat: if (write) { synth.getRuntime().instrumentFormat = value_int; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().instrumentFormat; break; case CONFIG::control::handlePadSynthBuild: if (write) { synth.getRuntime().handlePadSynthBuild = value_int; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().handlePadSynthBuild; break; // switches case CONFIG::control::enableGUI: if (write) { synth.getRuntime().storedGui = value_bool; synth.getRuntime().showGui |= value_bool; synth.getRuntime().updateConfig(control, value); } else value = synth.getRuntime().storedGui; break; case CONFIG::control::enableCLI: if (write) { synth.getRuntime().storedCli = value_bool; synth.getRuntime().showCli |= value_bool; synth.getRuntime().updateConfig(control, value); } else value = synth.getRuntime().storedCli; break; case CONFIG::control::showSplash: if (write) { synth.getRuntime().updateConfig(control, value); synth.getRuntime().showSplash = value; } else value = synth.getRuntime().showSplash; break; case CONFIG::control::enableSinglePath: if (write) { synth.getRuntime().singlePath = value; synth.getRuntime().updateConfig(control, value); } else value = synth.getRuntime().singlePath; break; case CONFIG::control::enableAutoInstance: if (write) { synth.getRuntime().autoInstance = value; synth.getRuntime().updateConfig(control, value); } else value = synth.getRuntime().autoInstance; break; case CONFIG::control::exposeStatus: if (write) { synth.getRuntime().showCLIcontext = value; synth.getRuntime().updateConfig(control, value); } else value = Config::primary().showCLIcontext; break; case CONFIG::control::XMLcompressionLevel: if (write) { synth.getRuntime().gzipCompression = value; synth.getRuntime().updateConfig(control, value); } else value = synth.getRuntime().gzipCompression; break; case CONFIG::control::enablePartReports: if (write) { synth.getRuntime().enablePartReports = value_bool; synth.getRuntime().updateConfig(control, value); if (not value_bool) partsChanged = 0; } break; case CONFIG::control::defaultStateStart: if (write) { synth.getRuntime().loadDefaultState = value_bool; synth.getRuntime().updateConfig(control, value); } else value = synth.getRuntime().loadDefaultState; break; case CONFIG::control::hideNonFatalErrors: if (write) { synth.getRuntime().hideErrors = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().hideErrors; break; case CONFIG::control::logInstrumentLoadTimes: if (write) { synth.getRuntime().showTimes = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().showTimes; break; case CONFIG::control::logXMLheaders: if (write) { synth.getRuntime().logXMLheaders = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().logXMLheaders; break; case CONFIG::control::saveAllXMLdata: if (write) { synth.getRuntime().xmlmax = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().xmlmax; break; case CONFIG::control::enableHighlight: if (write) { synth.getRuntime().bankHighlight = value; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().bankHighlight; break; case CONFIG::control::readAudio: { value = int(synth.getRuntime().audioEngine); synth.getRuntime().updateConfig(control, value_int); } break; case CONFIG::control::readMIDI: { value = int(synth.getRuntime().midiEngine); synth.getRuntime().updateConfig(control, value_int); } break; // jack case CONFIG::control::jackMidiSource: // done elsewhere break; case CONFIG::control::jackPreferredMidi: if (write) { if (value_bool) { synth.getRuntime().midiEngine = jack_midi; synth.getRuntime().updateConfig(CONFIG::control::readMIDI, jack_midi); } else { synth.getRuntime().midiEngine = alsa_midi; synth.getRuntime().updateConfig(CONFIG::control::readMIDI, alsa_midi); } } else value = (synth.getRuntime().midiEngine == jack_midi); break; case CONFIG::control::jackServer: // done elsewhere break; case CONFIG::control::jackPreferredAudio: if (write) { if (value_bool) { synth.getRuntime().audioEngine = jack_audio; synth.getRuntime().updateConfig(CONFIG::control::readAudio, jack_audio); } else { synth.getRuntime().audioEngine = alsa_audio; synth.getRuntime().updateConfig(CONFIG::control::readAudio, alsa_audio); } } else value = (synth.getRuntime().audioEngine == jack_audio); break; case CONFIG::control::jackAutoConnectAudio: if (write) { synth.getRuntime().connectJackaudio = value_bool; synth.getRuntime().audioEngine = jack_audio; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().connectJackaudio; break; // alsa case CONFIG::control::alsaMidiSource: // done elsewhere break; case CONFIG::control::alsaPreferredMidi: if (write) { if (value_bool) { synth.getRuntime().midiEngine = alsa_midi; synth.getRuntime().updateConfig(CONFIG::control::readMIDI, alsa_midi); } else { synth.getRuntime().midiEngine = jack_midi; synth.getRuntime().updateConfig(CONFIG::control::readMIDI, jack_midi); } } else value = (synth.getRuntime().midiEngine == alsa_midi); break; case CONFIG::control::alsaMidiType: if (write) { synth.getRuntime().alsaMidiType = value_int; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().alsaMidiType; break; case CONFIG::control::alsaAudioDevice: // done elsewhere break; case CONFIG::control::alsaPreferredAudio: if (write) { if (value_bool) { synth.getRuntime().audioEngine = alsa_audio; synth.getRuntime().updateConfig(CONFIG::control::readAudio, alsa_audio); } else { synth.getRuntime().audioEngine = jack_audio; synth.getRuntime().updateConfig(CONFIG::control::readAudio, jack_audio); } } else value = (synth.getRuntime().audioEngine == alsa_audio); break; case CONFIG::control::alsaSampleRate: if (write) { switch(value_int) { case 0: value = 192000; break; case 1: value = 96000; break; case 2: value = 48000; break; case 3: value = 44100; break; default: value = 44100; break; } synth.getRuntime().samplerate = value; cmd.data.value = value; synth.getRuntime().updateConfig(control, value); } else switch(synth.getRuntime().samplerate) { case 192000: value = 0; break; case 96000: value = 1; break; case 48000: value = 2; break; case 44100: value = 3; break; default: value = 3; break; } break; // midi case CONFIG::control::bankRootCC: if (write) { if (value_int != 0 && value_int != 32) { value_int = 128; cmd.data.value = value_int; } synth.getRuntime().midi_bank_root = value_int; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().midi_bank_root; break; case CONFIG::control::bankCC: if (write) { if (value_int != 0 && value_int != 32) { value_int = 128; cmd.data.value = value_int; } synth.getRuntime().midi_bank_C = value_int; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().midi_bank_C; break; case CONFIG::control::enableProgramChange: if (write) { synth.getRuntime().enableProgChange = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().enableProgChange; break; case CONFIG::control::extendedProgramChangeCC: if (write) { if (value_int > 119) { value_int = 128; cmd.data.value = value_int; } synth.getRuntime().midi_upper_voice_C = value_int; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().midi_upper_voice_C; break; case CONFIG::control::ignoreResetAllCCs: if (write) { synth.getRuntime().ignoreResetCCs = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().ignoreResetCCs; break; case CONFIG::control::logIncomingCCs: if (write) { synth.getRuntime().monitorCCin = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().monitorCCin; break; case CONFIG::control::showLearnEditor: if (write) { synth.getRuntime().showLearnedCC = value_bool; synth.getRuntime().updateConfig(control, value_bool); } else value = synth.getRuntime().showLearnedCC; break; case CONFIG::control::enableOmni: if (write) { synth.getRuntime().enableOmni = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().enableOmni; break; case CONFIG::control::enableNRPNs: if (write) { synth.getRuntime().enable_NRPN = value_bool; synth.getRuntime().updateConfig(control, value_int); } else value = synth.getRuntime().enable_NRPN; break; // save config case CONFIG::control::saveCurrentConfig: //done elsewhere break; default: mightChange = false; break; } if (!write) cmd.data.value = value; else if (mightChange) synth.getRuntime().configChanged = true; } void InterChange::commandMain(CommandBlock& cmd) { float value = cmd.data.value; uchar type = cmd.data.type; uchar action = cmd.data.source; uchar control = cmd.data.control; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; bool write = (type & TOPLEVEL::type::Write) > 0; int value_int = lrint(value); switch (control) { case MAIN::control::volume: if (write) { add2undo(cmd, noteSeen); synth.setPvolume(value); } else value = synth.Pvolume; break; case MAIN::control::partNumber: if (write) { // from various causes which change the current active part synth.getRuntime().currentPart = value_int; synth.pushEffectUpdate(value_int); } // send current part-effect data to GUI else value = synth.getRuntime().currentPart; break; case MAIN::control::availableParts: if ((write) && (value == 16 || value == 32 || value == 64)) { if (value < synth.getRuntime().numAvailableParts) undoRedoClear(); // references might no longer exist synth.getRuntime().numAvailableParts = value; // Note: in MasterUI::updatepart() the current part number // will possibly be capped, causing npartcounter->do_callback(); // to send a command MAIN::control::partNumber ... } else value = synth.getRuntime().numAvailableParts; break; case MAIN::control::partsChanged: // read only value = partsChanged.test(kititem); break; case MAIN::control::panLawType: if (write) synth.getRuntime().panLaw = value_int; else value = synth.getRuntime().panLaw; break; case MAIN::control::detune: // writes indirect value = synth.microtonal.Pglobalfinedetune; break; case MAIN::control::keyShift: // done elsewhere break; case MAIN::control::bpmFallback: if (write) synth.PbpmFallback = value; else value = synth.PbpmFallback; break; case MAIN::control::mono: if (write) synth.masterMono = value; else value = synth.masterMono; break; case MAIN::control::reseed: synth.setReproducibleState(int(value)); break; case MAIN::control::soloType: if (write && value_int <= MIDI::SoloType::Channel) { synth.getRuntime().channelSwitchType = value_int; synth.getRuntime().channelSwitchCC = 128; synth.getRuntime().channelSwitchValue = 0; switch (value_int) { case MIDI::SoloType::Disabled: for (int i = 0; i < NUM_MIDI_PARTS; ++i) synth.part[i]->Prcvchn = (i & (NUM_MIDI_CHANNELS - 1)); break; case MIDI::SoloType::Row: for (int i = 1; i < NUM_MIDI_CHANNELS; ++i) synth.part[i]->Prcvchn = NUM_MIDI_CHANNELS; synth.part[0]->Prcvchn = 0; break; case MIDI::SoloType::Column: for (int i = 0; i < NUM_MIDI_PARTS; ++i) synth.part[i]->Prcvchn = (i & (NUM_MIDI_CHANNELS - 1)); break; case MIDI::SoloType::Loop: case MIDI::SoloType::TwoWay: for (int i = 0; i < NUM_MIDI_CHANNELS; ++i) synth.part[i]->Prcvchn = NUM_MIDI_CHANNELS; synth.part[0]->Prcvchn = 0; break; case MIDI::SoloType::Channel: for (int p = 0; p < NUM_MIDI_PARTS; ++p) { if (synth.part[p]->Prcvchn >= NUM_MIDI_CHANNELS) synth.part[p]->Prcvchn = p &(NUM_MIDI_CHANNELS - 1); } break; } } else { write = false; // for an invalid write attempt value = synth.getRuntime().channelSwitchType; } break; case MAIN::control::soloCC: if (write && synth.getRuntime().channelSwitchType > 0) synth.getRuntime().channelSwitchCC = value_int; else { write = false; // for an invalid write attempt value = synth.getRuntime().channelSwitchCC; } break; case MAIN::control::knownCCtest: // read only { string text = synth.getRuntime().masterCCtest(value_int); value = textMsgBuffer.push(text); } break; case MAIN::control::loadInstrumentFromBank: synth.partonoffLock(kititem, -1); //std::cout << "Main bank ins load" << std::endl; cmd.data.source |= TOPLEVEL::action::lowPrio; break; case MAIN::control::loadInstrumentByName: synth.partonoffLock(kititem, -1); //std::cout << "Main ins load" << std::endl; cmd.data.source |= TOPLEVEL::action::lowPrio; break; case MAIN::control::loadNamedPatchset: if (write && ((action & TOPLEVEL::action::muteAndLoop) == TOPLEVEL::action::muteAndLoop)) { muteQueueWrite(cmd); cmd.data.source = TOPLEVEL::action::noAction; } break; case MAIN::control::loadNamedVector: if (write && ((action & TOPLEVEL::action::muteAndLoop) == TOPLEVEL::action::muteAndLoop)) { muteQueueWrite(cmd); cmd.data.source = TOPLEVEL::action::noAction; } break; case MAIN::control::saveNamedVector: // done elsewhere break; case MAIN::control::loadNamedScale: // done elsewhere break; case MAIN::control::saveNamedScale: // done elsewhere break; case MAIN::control::loadNamedState: if (write && ((action & TOPLEVEL::action::muteAndLoop) == TOPLEVEL::action::muteAndLoop)) { muteQueueWrite(cmd); cmd.data.source = TOPLEVEL::action::noAction; } break; case MAIN::control::saveNamedState: // done elsewhere break; case MAIN::control::readLastSeen: // read only value = textMsgBuffer.push(synth.lastItemSeen(value)); break; case MAIN::control::loadFileFromList: muteQueueWrite(cmd); cmd.data.source = TOPLEVEL::action::noAction; break; case MAIN::control::defaultPart: // clear entire part if (write) { synth.partonoffWrite(value_int, -1); cmd.data.source = TOPLEVEL::action::lowPrio; } else cmd.data.source = TOPLEVEL::action::noAction; break; case MAIN::control::defaultInstrument: // clear part's instrument if (write) { synth.partonoffWrite(value_int, -1); cmd.data.source = TOPLEVEL::action::lowPrio; } else cmd.data.source = TOPLEVEL::action::noAction; break; case MAIN::control::masterReset: case MAIN::control::masterResetAndMlearn: if (write && ((action & TOPLEVEL::action::muteAndLoop) == TOPLEVEL::action::muteAndLoop)) { muteQueueWrite(cmd); cmd.data.source = TOPLEVEL::action::noAction; } break; case TOPLEVEL::control::dataExchange: // this trigger is sent immediately after a new instance becomes operational synth.postBootHook(cmd.data.parameter); cmd.data.source = TOPLEVEL::action::toAll | TOPLEVEL::action::forceUpdate; // cause InterChange::returns() to also to forward this into GUI -> MasterUI::refreshInit() break; case MAIN::control::undo: case MAIN::control::redo: if ((action & TOPLEVEL::action::muteAndLoop) == TOPLEVEL::action::muteAndLoop) { muteQueueWrite(cmd); cmd.data.source = TOPLEVEL::action::noAction; } break; case MAIN::control::stopSound: // just stop if (write) muteQueueWrite(cmd); cmd.data.source = TOPLEVEL::action::noAction; break; case MAIN::control::readPartPeak: if (!write && kititem < NUM_MIDI_PARTS) { if (engine == 1) value = synth.VUdata.values.partsR[kititem]; else value = synth.VUdata.values.parts[kititem]; } break; case MAIN::control::readMainLRpeak: if (!write) { if (kititem == 1) value = synth.VUdata.values.vuOutPeakR; else value = synth.VUdata.values.vuOutPeakL; } break; case MAIN::control::readMainLRrms: if (!write) { if (kititem == 1) value = synth.VUdata.values.vuRmsPeakR; else value = synth.VUdata.values.vuRmsPeakL; } break; case MAIN::control::setTestInstrument: if (write) { generateSpecialInstrument(value_int, "test subsynth"); synth.getRuntime().currentPart = value; // make sure it's on synth.partonoffWrite(value_int,1); // fake a part number change to update GUI and CLI cmd.data.control = MAIN::control::partNumber; synth.pushEffectUpdate(value_int); } break; case TOPLEVEL::control::textMessage: cmd.data.source = TOPLEVEL::action::noAction; break; } if (!write) cmd.data.value = value; } void InterChange::commandBank(CommandBlock& cmd) { int value_int = int(cmd.data.value + 0.5f); uchar type = cmd.data.type; uchar control = cmd.data.control; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar parameter = cmd.data.parameter; bool write = (type & TOPLEVEL::type::Write) > 0; switch (control) { case BANK::control::readInstrumentName: { if (kititem == UNUSED) { kititem = synth.getRuntime().currentBank; cmd.data.kit = kititem; } if (engine == UNUSED) { engine = synth.getRuntime().currentRoot; cmd.data.engine = engine; } textMsgBuffer.push(synth.bank.getname(parameter, kititem, engine)); break; } case BANK::control::findInstrumentName: { if (parameter == UNUSED) // return the name of a specific instrument. textMsgBuffer.push(synth.bank.getname(value_int, kititem, engine)); else { int offset = type_offset [parameter]; /* * This version of the call is for building up lists of instruments that match the given type. * It will find the next in the series until the entire bank structure has been scanned. * It returns the terminator when this has been completed so the calling function knows the * entire list has been scanned, and resets ready for a new set of calls. */ if (offset == -1) { synth.getRuntime().Log("caught invalid instrument type (-1)"); textMsgBuffer.push("@end"); } do { do { do { if (synth.bank.getType(searchInst, searchBank, searchRoot) == offset) { textMsgBuffer.push(asString(searchRoot, 3) + ": " + asString(searchBank, 3) + ". " + asString(searchInst + 1, 3) + " " + synth.bank.getname(searchInst, searchBank, searchRoot)); ++ searchInst; return; /* * notice this exit point! */ } ++searchInst; } while (searchInst < MAX_INSTRUMENTS_IN_BANK); searchInst = 0; ++searchBank; } while (searchBank < MAX_BANKS_IN_ROOT); searchBank = 0; ++searchRoot; } while (searchRoot < MAX_BANK_ROOT_DIRS); searchRoot = 0; textMsgBuffer.push("@end"); } break; } case BANK::control::lastSeenInBank: // read only value_int = synth.getRuntime().lastBankPart; break; case BANK::control::selectBank: // done elsewhere for write value_int = synth.ReadBank(); break; case BANK::control::selectRoot: value_int = synth.getRuntime().currentRoot; // currently read only break; case BANK::control::refreshDefaults: if (!write) { value_int = synth.getRuntime().banksChecked; } break; default: cmd.data.source = TOPLEVEL::action::noAction; break; } if (!write) cmd.data.value = value_int; } void InterChange::commandPart(CommandBlock& cmd) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar insert = cmd.data.insert; bool write = (type & TOPLEVEL::type::Write) > 0; bool kitType = (insert == TOPLEVEL::insert::kitGroup); if (kitType && kititem >= NUM_KIT_ITEMS) { cmd.data.source = TOPLEVEL::action::noAction; synth.getRuntime().Log("Invalid kit number"); return; } int value_int = lrint(value); char value_bool = _SYS_::F2B(value); assert(npart < NUM_MIDI_PARTS); Part& part{* synth.part[npart]}; if (not part.Pkitmode) { kitType = false; if (control != PART::control::kitMode && kititem != UNUSED) { cmd.data.source = TOPLEVEL::action::noAction; synth.getRuntime().Log("Not in kit mode"); } } else if (control != PART::control::enableKitLine && !part.kit[kititem].Penabled && kititem < UNUSED) { cmd.data.source = TOPLEVEL::action::noAction; synth.getRuntime().Log("Kit item " + to_string(kititem + 1) + " not enabled"); return; } if (write) { /* * The following is not quite correct.the sections will be inactive * but still present, so although an undo might appear to do nothing * it won't actually cause a problem. * if (control == PART::control::enableKitLine || control == PART::control::kitMode) undoRedoClear(); // these would become completely invalid! else */ if (control == PART::control::resetAllControllers) { // setup for group undo CommandBlock resetCmd; memset(resetCmd.bytes, 255, sizeof(CommandBlock)); resetCmd.data.source = TOPLEVEL::action::forceUpdate; resetCmd.data.part = npart; for (int contl = PART::control::volumeRange; contl < PART::control::resetAllControllers; ++contl) { noteSeen = true; resetCmd.data.value = 0; resetCmd.data.type = 0; resetCmd.data.control = contl; commandControllers(resetCmd, false); resetCmd.data.type |= TOPLEVEL::type::Write; if (contl == PART::control::volumeRange) add2undo(resetCmd, noteSeen); else add2undo(resetCmd, noteSeen, true); } } else add2undo(cmd, noteSeen); } if (control >= PART::control::volumeRange && control < PART::control::resetAllControllers) { commandControllers(cmd, write); return; } uchar effNum = part.Peffnum; if (!kitType) kititem = 0; switch (control) { case PART::control::enable: if (write) { if (value_bool && synth.getRuntime().currentPart != npart) // make it a part change { synth.partonoffWrite(npart, 1); synth.getRuntime().currentPart = npart; cmd.data.value = npart; cmd.data.control = MAIN::control::partNumber; cmd.data.part = TOPLEVEL::section::main; synth.pushEffectUpdate(npart); // send current part-effect data to GUI } else synth.partonoffWrite(npart, value_int); } else value = synth.partonoffRead(npart); break; case PART::control::enableAdd: if (write) part.kit[kititem].Padenabled = value_bool; else value = part.kit[kititem].Padenabled; break; case PART::control::enableSub: if (write) part.kit[kititem].Psubenabled = value_bool; else value = part.kit[kititem].Psubenabled; break; case PART::control::enablePad: if (write && (part.kit[kititem].Ppadenabled != value_bool)) { part.kit[kititem].Ppadenabled = value_bool; if (synth.getRuntime().useLegacyPadBuild()) {// do the blocking build in the CMD-Dispatch background thread ("sortResultsThread") #ifdef GUI_FLTK toGUI.write(cmd.bytes); // cause update in the GUI to enable the edit button #endif cmd.data.source = TOPLEVEL::action::lowPrio; // marker to cause dispatch in InterChange::sortResultsThread() cmd.data.control = PADSYNTH::control::applyChanges; } else part.kit[kititem].padpars->buildNewWavetable(); // this triggers a rebuild via background thread } else value = part.kit[kititem].Ppadenabled; break; case PART::control::enableKitLine: if (write) { if (!_SYS_::F2B(value)) undoRedoClear(); synth.partonoffWrite(npart, -1); cmd.data.source = TOPLEVEL::action::lowPrio; } else value = part.kit[kititem].Penabled; break; case PART::control::volume: if (write) part.setVolume(value); else value = part.Pvolume; break; case PART::control::velocitySense: if (write) part.Pvelsns = value; else value = part.Pvelsns; break; case PART::control::panning: if (write) part.SetController(MIDI::CC::panning, value); else value = part.Ppanning; break; case PART::control::velocityOffset: if (write) part.Pveloffs = value; else value = part.Pveloffs; break; case PART::control::midiChannel: if (write) part.Prcvchn = value_int; else value = part.Prcvchn; break; case PART::control::omni: if (write) { part.Pomni = static_cast(value_int); // Reset state set by MIDI CC when receiving explicit toggle. part.resetOmniCC(); } else value = static_cast(part.Pomni); break; case PART::control::keyMode: if (write) synth.SetPartKeyMode(npart, value_int); else value = (synth.ReadPartKeyMode(npart)) & 3; // clear out temporary legato break; case PART::control::channelATset: if (write) { part.PchannelATchoice = value_int; int tmp1, tmp2; tmp1 = tmp2 = part.PkeyATchoice; tmp1 &= ~value_int; if (tmp1 != tmp2) { part.PkeyATchoice = tmp1; // can't have the same cmd.data.parameter = tmp1; // send possible correction } } else value = part.PchannelATchoice; break; case PART::control::keyATset: if (write) { part.PkeyATchoice = value_int; int tmp1, tmp2; tmp1 = tmp2 = part.PchannelATchoice; tmp1 &= ~value_int; if (tmp1 != tmp2) { part.PchannelATchoice = tmp1; // can't have the same cmd.data.parameter = tmp1; // send possible correction } } else value = part.PkeyATchoice; break; case PART::control::portamento: if (write) part.ctl->portamento.portamento = value_bool; else value = part.ctl->portamento.portamento; break; case PART::control::kitItemMute: if (kitType) { if (write) part.kit[kititem].Pmuted = value_bool; else value = part.kit[kititem].Pmuted; } break; case PART::control::minNote: // always return actual value if (kitType) { if (write) { if (value_int > part.kit[kititem].Pmaxkey) part.kit[kititem].Pminkey = part.kit[kititem].Pmaxkey; else part.kit[kititem].Pminkey = value_int; } value = part.kit[kititem].Pminkey; } else { if (write) { if (value_int > part.Pmaxkey) part.Pminkey = part.Pmaxkey; else part.Pminkey = value_int; } value = part.Pminkey; } break; case PART::control::maxNote: // always return actual value if (kitType) { if (write) { if (value_int < part.kit[kititem].Pminkey) part.kit[kititem].Pmaxkey = part.kit[kititem].Pminkey; else part.kit[kititem].Pmaxkey = value_int; } value = part.kit[kititem].Pmaxkey; } else { if (write) { if (value_int < part.Pminkey) part.Pmaxkey = part.Pminkey; else part.Pmaxkey = value_int; } value = part.Pmaxkey; } break; case PART::control::minToLastKey: // always return actual value value_int = part.getLastNote(); if (kitType) { if ((write) && value_int >= 0) { if (value_int > part.kit[kititem].Pmaxkey) part.kit[kititem].Pminkey = part.kit[kititem].Pmaxkey; else part.kit[kititem].Pminkey = part.getLastNote(); } value = part.kit[kititem].Pminkey; } else { if ((write) && part.getLastNote() >= 0) { if (value_int > part.Pmaxkey) part.Pminkey = part.Pmaxkey; else part.Pminkey = part.getLastNote(); } value = part.Pminkey; } break; case PART::control::maxToLastKey: // always return actual value value_int = part.getLastNote(); if (kitType) { if ((write) && part.getLastNote() >= 0) { if (value_int < part.kit[kititem].Pminkey) part.kit[kititem].Pmaxkey = part.kit[kititem].Pminkey; else part.kit[kititem].Pmaxkey = part.getLastNote(); } value = part.kit[kititem].Pmaxkey; } else { if ((write) && part.getLastNote() >= 0) { if (value_int < part.Pminkey) part.Pmaxkey = part.Pminkey; else part.Pmaxkey = part.getLastNote(); } value = part.Pmaxkey; } break; case PART::control::resetMinMaxKey: if (kitType) { if (write) { part.kit[kititem].Pminkey = 0; part.kit[kititem].Pmaxkey = 127; } } else { if (write) { part.Pminkey = 0; part.Pmaxkey = 127; } } break; case PART::control::kitEffectNum: if (kitType) { if (write) { if (value_int == 0 ) part.kit[kititem].Psendtoparteffect = 127; else part.kit[kititem].Psendtoparteffect = value_int - 1; } else value = part.kit[kititem].Psendtoparteffect; } break; case PART::control::maxNotes: if (write) { part.Pkeylimit = value_int; if (part.Pkeymode == PART_NORMAL) part.enforcekeylimit(); } else value = part.Pkeylimit; break; case PART::control::keyShift: // done elsewhere break; case PART::control::partToSystemEffect1: if (write) synth.setPsysefxvol(npart,0, value); else value = synth.Psysefxvol[0][npart]; break; case PART::control::partToSystemEffect2: if (write) synth.setPsysefxvol(npart,1, value); else value = synth.Psysefxvol[1][npart]; break; case PART::control::partToSystemEffect3: if (write) synth.setPsysefxvol(npart,2, value); else value = synth.Psysefxvol[2][npart]; break; case PART::control::partToSystemEffect4: if (write) synth.setPsysefxvol(npart,3, value); else value = synth.Psysefxvol[3][npart]; break; case PART::control::humanise: if (write) part.Pfrand = value; else value = part.Pfrand; break; case PART::control::humanvelocity: if (write) part.Pvelrand = value; else value = part.Pvelrand; break; case PART::control::drumMode: if (write) { part.Pdrummode = value_bool; synth.setPartMap(npart); } else value = part.Pdrummode; break; case PART::control::kitMode: if (write) { if (value_int == 3) // crossfade { part.Pkitmode = 1; // normal kit mode (multiple kit items playing) part.PkitfadeType = 1; value = 1; // just to be sure } else { part.PkitfadeType = 0; part.Pkitmode = value_int; } } else { value = part.Pkitmode; if (value == 1 && part.PkitfadeType == 1) value = 3; // encode crossfade velocity mode } break; case PART::control::effectNumber: if (write) { part.Peffnum = value_int; cmd.data.parameter = (part.partefx[value_int]->geteffectpar(-1) != 0); cmd.data.engine = value_int; cmd.data.source |= cmd.data.source |= TOPLEVEL::action::forceUpdate; // the line above is to show it's changed from preset values synth.pushEffectUpdate(npart); } else value = part.Peffnum; break; case PART::control::effectType: if (write) { part.partefx[effNum]->changeeffect(value_int); synth.pushEffectUpdate(npart); } else value = part.partefx[effNum]->geteffect(); cmd.data.offset = 0; break; case PART::control::effectDestination: if (write) { part.Pefxroute[effNum] = value_int; part.partefx[effNum]->setdryonly(value_int == 2); synth.pushEffectUpdate(npart); } else value = part.Pefxroute[effNum]; break; case PART::control::effectBypass: { int tmp = part.Peffnum; part.Peffnum = engine; if (write) { bool newSwitch = value_bool; bool oldSwitch = part.Pefxbypass[engine]; part.Pefxbypass[engine] = newSwitch; if (newSwitch != oldSwitch) part.partefx[engine]->cleanup(); synth.pushEffectUpdate(npart); } else value = part.Pefxbypass[engine]; part.Peffnum = tmp; // leave it as it was before break; } case PART::control::audioDestination: if (synth.partonoffRead(npart) != 1) { cmd.data.value = part.Paudiodest; // specific for this control return; } else if (write) { if (npart < synth.getRuntime().numAvailableParts) synth.part[npart]->Paudiodest = value_int; cmd.data.source = TOPLEVEL::action::lowPrio; } else value = part.Paudiodest; break; case PART::control::instrumentEngines: // read only { int engineCount = 0; for (int i = 0; i < NUM_KIT_ITEMS; ++i) { if (synth.part[npart]->kit[i].Penabled) { // nested so we don't access non existent kit items if (synth.part[npart]->kit[i].Pmuted == 0) { if (synth.part[npart]->kit[i].Padenabled) engineCount |= 1; if (synth.part[npart]->kit[i].Psubenabled) engineCount |= 2; if (synth.part[npart]->kit[i].Ppadenabled) engineCount |= 4; } } } value = engineCount; } break; case PART::control::resetAllControllers: if (write) part.ctl->resetall(); break; case PART::control::midiModWheel: if (write) part.ctl->setmodwheel(value); else value = part.ctl->modwheel.data; break; case PART::control::midiBreath: ; // not yet break; case PART::control::midiExpression: if (write) part.SetController(MIDI::CC::expression, value); else value = part.ctl->expression.data; break; case PART::control::midiSustain: if (write) part.ctl->setsustain(value); else value = part.ctl->sustain.data; break; case PART::control::midiPortamento: if (write) part.ctl->setportamento(value); else value = part.ctl->portamento.data; break; case PART::control::midiFilterQ: if (write) part.ctl->setfilterq(value); else value = part.ctl->filterq.data; break; case PART::control::midiFilterCutoff: if (write) part.ctl->setfiltercutoff(value); else value = part.ctl->filtercutoff.data; break; case PART::control::midiBandwidth: if (write) part.ctl->setbandwidth(value); else value = part.ctl->bandwidth.data; break; case PART::control::midiFMamp: if (write) part.ctl->setfmamp(value); else value = part.ctl->fmamp.data; break; case PART::control::midiResonanceCenter: if (write) part.ctl->setresonancecenter(value); else value = part.ctl->resonancecenter.data; break; case PART::control::midiResonanceBandwidth: if (write) part.ctl->setresonancebw(value); else value = part.ctl->resonancebandwidth.data; break; case PART::control::instrumentCopyright: // done elsewhere break; case PART::control::instrumentComments: // done elsewhere break; case PART::control::instrumentName: // done elsewhere break; case PART::control::instrumentType:// done elsewhere break; case PART::control::defaultInstrumentCopyright: // done elsewhere break; } if (!write || control == PART::control::minToLastKey || control == PART::control::maxToLastKey) cmd.data.value = value; } void InterChange::commandControllers(CommandBlock& cmd, bool write) { uchar control = cmd.data.control; uchar npart = cmd.data.part; float value = cmd.data.value; int value_int = int(value); char value_bool = _SYS_::F2B(value); assert(npart < NUM_MIDI_PARTS); Part& part{* synth.part[npart]}; switch (control) { case PART::control::volumeRange: // start of controllers if (write) part.ctl->setvolume(value_int); // not the *actual* volume else value = part.ctl->volume.data; break; case PART::control::volumeEnable: if (write) part.ctl->volume.receive = value_bool; else value = part.ctl->volume.receive; break; case PART::control::panningWidth: if (write) part.ctl->setPanDepth(value_int); else value = part.ctl->panning.depth; break; case PART::control::modWheelDepth: if (write) part.ctl->modwheel.depth = value; else value = part.ctl->modwheel.depth; break; case PART::control::exponentialModWheel: if (write) part.ctl->modwheel.exponential = value_bool; else value = part.ctl->modwheel.exponential; break; case PART::control::bandwidthDepth: if (write) part.ctl->bandwidth.depth = value; else value = part.ctl->bandwidth.depth; break; case PART::control::exponentialBandwidth: if (write) part.ctl->bandwidth.exponential = value_bool; else value = part.ctl->bandwidth.exponential; break; case PART::control::expressionEnable: if (write) part.ctl->expression.receive = value_bool; else value = part.ctl->expression.receive; break; case PART::control::FMamplitudeEnable: if (write) part.ctl->fmamp.receive = value_bool; else value = part.ctl->fmamp.receive; break; case PART::control::sustainPedalEnable: if (write) part.ctl->sustain.receive = value_bool; else value = part.ctl->sustain.receive; break; case PART::control::pitchWheelRange: if (write) part.ctl->pitchwheel.bendrange = value_int; else value = part.ctl->pitchwheel.bendrange; break; case PART::control::filterQdepth: if (write) part.ctl->filterq.depth = value; else value = part.ctl->filterq.depth; break; case PART::control::filterCutoffDepth: if (write) part.ctl->filtercutoff.depth = value; else value = part.ctl->filtercutoff.depth; break; case PART::control::breathControlEnable: if (write) if (value_bool) part.PbreathControl = MIDI::CC::breath; else part.PbreathControl = UNUSED; // impossible CC value else value = part.PbreathControl; break; case PART::control::resonanceCenterFrequencyDepth: if (write) part.ctl->resonancecenter.depth = value; else value = part.ctl->resonancecenter.depth; break; case PART::control::resonanceBandwidthDepth: if (write) part.ctl->resonancebandwidth.depth = value; else value = part.ctl->resonancebandwidth.depth; break; case PART::control::portamentoTime: if (write) part.ctl->portamento.time = value; else value = part.ctl->portamento.time; break; case PART::control::portamentoTimeStretch: if (write) part.ctl->portamento.updowntimestretch = value; else value = part.ctl->portamento.updowntimestretch; break; case PART::control::portamentoThreshold: if (write) part.ctl->portamento.pitchthresh = value; else value = part.ctl->portamento.pitchthresh; break; case PART::control::portamentoThresholdType: if (write) part.ctl->portamento.pitchthreshtype = value_int; else value = part.ctl->portamento.pitchthreshtype; break; case PART::control::enableProportionalPortamento: if (write) part.ctl->portamento.proportional = value_int; else value = part.ctl->portamento.proportional; break; case PART::control::proportionalPortamentoRate: if (write) part.ctl->portamento.propRate = value; else value = part.ctl->portamento.propRate; break; case PART::control::proportionalPortamentoDepth: if (write) part.ctl->portamento.propDepth = value; else value = part.ctl->portamento.propDepth; break; case PART::control::receivePortamento: // end of controllers if (write) part.ctl->portamento.receive = value_bool; else value = part.ctl->portamento.receive; break; } if (!write || control == PART::control::minToLastKey || control == PART::control::maxToLastKey) cmd.data.value = value; } void InterChange::commandAdd(CommandBlock& cmd) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; bool write = (type & TOPLEVEL::type::Write) > 0; int value_int = lrint(value); char value_bool = _SYS_::F2B(value); assert(npart < NUM_MIDI_PARTS); ADnoteParameters& param{*(synth.part[npart]->kit[kititem].adpars)}; if (write) add2undo(cmd, noteSeen); switch (control) { case ADDSYNTH::control::volume: if (write) param.GlobalPar.PVolume = value_int; else value = param.GlobalPar.PVolume; break; case ADDSYNTH::control::velocitySense: if (write) param.GlobalPar.PAmpVelocityScaleFunction = value_int; else value = param.GlobalPar.PAmpVelocityScaleFunction; break; case ADDSYNTH::control::panning: if (write) param.setGlobalPan(value_int, synth.getRuntime().panLaw); else value = param.GlobalPar.PPanning; break; case ADDSYNTH::control::enableRandomPan: if (write) param.GlobalPar.PRandom = value_int; else value = param.GlobalPar.PRandom; break; case ADDSYNTH::control::randomWidth: if (write) param.GlobalPar.PWidth = value_int; else value = param.GlobalPar.PWidth; break; case ADDSYNTH::control::detuneFrequency: if (write) param.GlobalPar.PDetune = value_int + 8192; else // these steps are done to keep the GUI happy - sliders are strange :( value = param.GlobalPar.PDetune - 8192; break; case ADDSYNTH::control::octave: { int k; if (write) { k = value; if (k < 0) k += 16; param.GlobalPar.PCoarseDetune = k * 1024 + param.GlobalPar.PCoarseDetune % 1024; } else { k = param.GlobalPar.PCoarseDetune / 1024; if (k >= 8) k -= 16; value = k; } break; } case ADDSYNTH::control::detuneType: if (write) { if (value_int < 1) // can't be default for addsynth { cmd.data.value = 1; value_int = 1; } param.GlobalPar.PDetuneType = value_int; } else { value = param.GlobalPar.PDetuneType; if (value < 1) value = 1; } break; case ADDSYNTH::control::coarseDetune: { int k; if (write) { k = value; if (k < 0) k += 1024; param.GlobalPar.PCoarseDetune = k + (param.GlobalPar.PCoarseDetune / 1024) * 1024; } else { k = param.GlobalPar.PCoarseDetune % 1024; if (k >= 512) k -= 1024; value = k; } break; } case ADDSYNTH::control::relativeBandwidth: if (write) { param.GlobalPar.PBandwidth = value_int; param.getBandwidthDetuneMultiplier(); } else value = param.GlobalPar.PBandwidth; break; case ADDSYNTH::control::bandwidthMultiplier: if (write) write = false; // read only value = param.getBandwidthDetuneMultiplier(); break; case ADDSYNTH::control::stereo: if (write) param.GlobalPar.PStereo = value_bool; else value = param.GlobalPar.PStereo; break; case ADDSYNTH::control::randomGroup: if (write) param.GlobalPar.Hrandgrouping = value_bool; else value = param.GlobalPar.Hrandgrouping; break; case ADDSYNTH::control::dePop: if (write) param.GlobalPar.Fadein_adjustment = value_int; else value = param.GlobalPar.Fadein_adjustment; break; case ADDSYNTH::control::punchStrength: if (write) param.GlobalPar.PPunchStrength = value_int; else value = param.GlobalPar.PPunchStrength; break; case ADDSYNTH::control::punchDuration: if (write) param.GlobalPar.PPunchTime = value_int; else value = param.GlobalPar.PPunchTime; break; case ADDSYNTH::control::punchStretch: if (write) param.GlobalPar.PPunchStretch = value_int; else value = param.GlobalPar.PPunchStretch; break; case ADDSYNTH::control::punchVelocity: if (write) param.GlobalPar.PPunchVelocitySensing = value_int; else value = param.GlobalPar.PPunchVelocitySensing; break; } if (!write) cmd.data.value = value; } void InterChange::commandAddVoice(CommandBlock& cmd) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; int nvoice; if (engine >= PART::engine::addMod1) nvoice = engine - PART::engine::addMod1; else nvoice = engine - PART::engine::addVoice1; bool write = (type & TOPLEVEL::type::Write) > 0; int value_int = lrint(value); char value_bool = _SYS_::F2B(value); if (write) add2undo(cmd, noteSeen); assert(npart < NUM_MIDI_PARTS); ADnoteParameters& param{ *(synth.part[npart]->kit[kititem].adpars)}; switch (control) { case ADDVOICE::control::volume: if (write) param.VoicePar[nvoice].PVolume = value_int; else value = param.VoicePar[nvoice].PVolume; break; case ADDVOICE::control::velocitySense: if (write) param.VoicePar[nvoice].PAmpVelocityScaleFunction = value_int; else value = param.VoicePar[nvoice].PAmpVelocityScaleFunction; break; case ADDVOICE::control::panning: if (write) param.setVoicePan(nvoice, value_int, synth.getRuntime().panLaw); else value = param.VoicePar[nvoice].PPanning; break; case ADDVOICE::control::enableRandomPan: if (write) param.VoicePar[nvoice].PRandom = value_int; else value = param.VoicePar[nvoice].PRandom; break; case ADDVOICE::control::randomWidth: if (write) param.VoicePar[nvoice].PWidth = value_int; else value = param.VoicePar[nvoice].PWidth; break; case ADDVOICE::control::invertPhase: if (write) param.VoicePar[nvoice].PVolumeminus = value_bool; else value = param.VoicePar[nvoice].PVolumeminus; break; case ADDVOICE::control::enableAmplitudeEnvelope: if (write) param.VoicePar[nvoice].PAmpEnvelopeEnabled = value_bool; else value = param.VoicePar[nvoice].PAmpEnvelopeEnabled; break; case ADDVOICE::control::enableAmplitudeLFO: if (write) param.VoicePar[nvoice].PAmpLfoEnabled = value_bool; else value = param.VoicePar[nvoice].PAmpLfoEnabled; break; case ADDVOICE::control::modulatorType: if (write) { param.VoicePar[nvoice].PFMEnabled = value_int; cmd.data.value = value_int; // we have to do this otherwise GUI goes out of sync } else value = param.VoicePar[nvoice].PFMEnabled; break; case ADDVOICE::control::externalModulator: if (write) param.VoicePar[nvoice].PFMVoice = value_int; else value = param.VoicePar[nvoice].PFMVoice; break; case ADDVOICE::control::externalOscillator: if (write) param.VoicePar[nvoice].PVoice = value_int; else value = param.VoicePar[nvoice].PVoice; break; case ADDVOICE::control::detuneFrequency: if (write) param.VoicePar[nvoice].PDetune = value_int + 8192; else value = param.VoicePar[nvoice].PDetune-8192; break; case ADDVOICE::control::equalTemperVariation: if (write) param.VoicePar[nvoice].PfixedfreqET = value_int; else value = param.VoicePar[nvoice].PfixedfreqET; break; case ADDVOICE::control::baseFrequencyAs440Hz: if (write) param.VoicePar[nvoice].Pfixedfreq = value_bool; else value = param.VoicePar[nvoice].Pfixedfreq; break; case ADDVOICE::control::octave: { int k; if (write) { k = value; if (k < 0) k += 16; param.VoicePar[nvoice].PCoarseDetune = k * 1024 + param.VoicePar[nvoice].PCoarseDetune % 1024; } else { k = param.VoicePar[nvoice].PCoarseDetune / 1024; if (k >= 8) k -= 16; value = k; } break; } case ADDVOICE::control::detuneType: if (write) param.VoicePar[nvoice].PDetuneType = value_int; else value = param.VoicePar[nvoice].PDetuneType; break; case ADDVOICE::control::coarseDetune: { int k; if (write) { k = value; if (k < 0) k += 1024; param.VoicePar[nvoice].PCoarseDetune = k + (param.VoicePar[nvoice].PCoarseDetune / 1024) * 1024; } else { k = param.VoicePar[nvoice].PCoarseDetune % 1024; if (k >= 512) k -= 1024; value = k; } break; } case ADDVOICE::control::pitchBendAdjustment: if (write) param.VoicePar[nvoice].PBendAdjust = value_int; else value = param.VoicePar[nvoice].PBendAdjust; break; case ADDVOICE::control::pitchBendOffset: if (write) param.VoicePar[nvoice].POffsetHz = value_int; else value = param.VoicePar[nvoice].POffsetHz; break; case ADDVOICE::control::enableFrequencyEnvelope: if (write) param.VoicePar[nvoice].PFreqEnvelopeEnabled = value_int; else value = param.VoicePar[nvoice].PFreqEnvelopeEnabled; break; case ADDVOICE::control::enableFrequencyLFO: if (write) param.VoicePar[nvoice].PFreqLfoEnabled = value_int; else value = param.VoicePar[nvoice].PFreqLfoEnabled; break; case ADDVOICE::control::unisonFrequencySpread: if (write) param.VoicePar[nvoice].Unison_frequency_spread = value_int; else value = param.VoicePar[nvoice].Unison_frequency_spread; break; case ADDVOICE::control::unisonSpreadCents: if (write) write = false; // read only value = param.getUnisonFrequencySpreadCents(nvoice); break; case ADDVOICE::control::unisonPhaseRandomise: if (write) param.VoicePar[nvoice].Unison_phase_randomness = value_int; else value = param.VoicePar[nvoice].Unison_phase_randomness; break; case ADDVOICE::control::unisonStereoSpread: if (write) param.VoicePar[nvoice].Unison_stereo_spread = value_int; else value = param.VoicePar[nvoice].Unison_stereo_spread; break; case ADDVOICE::control::unisonVibratoDepth: if (write) param.VoicePar[nvoice].Unison_vibrato = value_int; else value = param.VoicePar[nvoice].Unison_vibrato; break; case ADDVOICE::control::unisonVibratoSpeed: if (write) param.VoicePar[nvoice].Unison_vibrato_speed = value_int; else value = param.VoicePar[nvoice].Unison_vibrato_speed; break; case ADDVOICE::control::unisonSize: if (write) { if (value < 2) value = 2; param.VoicePar[nvoice].Unison_size = value_int; } else value = param.VoicePar[nvoice].Unison_size; break; case ADDVOICE::control::unisonPhaseInvert: if (write) param.VoicePar[nvoice].Unison_invert_phase = value_int; else value = param.VoicePar[nvoice].Unison_invert_phase; break; case ADDVOICE::control::enableUnison: { int k; if (write) { k = value_bool + 1; if (param.VoicePar[nvoice].Unison_size < 2 || k == 1) param.VoicePar[nvoice].Unison_size = k; } else value = (param.VoicePar[nvoice].Unison_size); break; } case ADDVOICE::control::bypassGlobalFilter: if (write) param.VoicePar[nvoice].Pfilterbypass = value_bool; else value = param.VoicePar[nvoice].Pfilterbypass; break; case ADDVOICE::control::enableFilter: if (write) param.VoicePar[nvoice].PFilterEnabled = value_bool; else value = param.VoicePar[nvoice].PFilterEnabled; break; case ADDVOICE::control::enableFilterEnvelope: if (write) param.VoicePar[nvoice].PFilterEnvelopeEnabled= value_bool; else value = param.VoicePar[nvoice].PFilterEnvelopeEnabled; break; case ADDVOICE::control::enableFilterLFO: if (write) param.VoicePar[nvoice].PFilterLfoEnabled= value_bool; else value = param.VoicePar[nvoice].PFilterLfoEnabled; break; case ADDVOICE::control::modulatorAmplitude: if (write) param.VoicePar[nvoice].PFMVolume = value_int; else value = param.VoicePar[nvoice].PFMVolume; break; case ADDVOICE::control::modulatorVelocitySense: if (write) param.VoicePar[nvoice].PFMVelocityScaleFunction = value_int; else value = param.VoicePar[nvoice].PFMVelocityScaleFunction; break; case ADDVOICE::control::modulatorHFdamping: if (write) param.VoicePar[nvoice].PFMVolumeDamp = value_int + 64; else value = param.VoicePar[nvoice].PFMVolumeDamp - 64; break; case ADDVOICE::control::enableModulatorAmplitudeEnvelope: if (write) param.VoicePar[nvoice].PFMAmpEnvelopeEnabled = value_bool; else value = param.VoicePar[nvoice].PFMAmpEnvelopeEnabled; break; case ADDVOICE::control::modulatorDetuneFrequency: if (write) param.VoicePar[nvoice].PFMDetune = value_int + 8192; else value = param.VoicePar[nvoice].PFMDetune - 8192; break; case ADDVOICE::control::modulatorDetuneFromBaseOsc: if (write) param.VoicePar[nvoice].PFMDetuneFromBaseOsc = value_bool; else value = param.VoicePar[nvoice].PFMDetuneFromBaseOsc; break; case ADDVOICE::control::modulatorFrequencyAs440Hz: if (write) param.VoicePar[nvoice].PFMFixedFreq = value_bool; else value = param.VoicePar[nvoice].PFMFixedFreq; break; case ADDVOICE::control::modulatorOctave: { int k; if (write) { k = value_int; if (k < 0) k += 16; param.VoicePar[nvoice].PFMCoarseDetune = k * 1024 + param.VoicePar[nvoice].PFMCoarseDetune % 1024; } else { k = param.VoicePar[nvoice].PFMCoarseDetune / 1024; if (k >= 8) k -= 16; value = k; } break; } case ADDVOICE::control::modulatorDetuneType: if (write) param.VoicePar[nvoice].PFMDetuneType = value_int; else value = param.VoicePar[nvoice].PFMDetuneType; break; case ADDVOICE::control::modulatorCoarseDetune: { int k; if (write) { int k = value_int; if (k < 0) k += 1024; param.VoicePar[nvoice].PFMCoarseDetune = k + (param.VoicePar[nvoice].PFMCoarseDetune / 1024) * 1024; } else { k = param.VoicePar[nvoice].PFMCoarseDetune % 1024; if (k >= 512) k-= 1024; value = k; } break; } case ADDVOICE::control::enableModulatorFrequencyEnvelope: if (write) param.VoicePar[nvoice].PFMFreqEnvelopeEnabled = value_int; else value = param.VoicePar[nvoice].PFMFreqEnvelopeEnabled; break; case ADDVOICE::control::modulatorOscillatorPhase: if (write) param.VoicePar[nvoice].PFMoscilphase = 64 - value_int; else value = 64 - param.VoicePar[nvoice].PFMoscilphase; break; case ADDVOICE::control::modulatorOscillatorSource: if (write) param.VoicePar[nvoice].PextFMoscil = value_int; else value = param.VoicePar[nvoice].PextFMoscil; break; case ADDVOICE::control::delay: if (write) param.VoicePar[nvoice].PDelay = value_int; else value = param.VoicePar[nvoice].PDelay; break; case ADDVOICE::control::enableVoice: if (write) param.VoicePar[nvoice].Enabled = value_bool; else value = param.VoicePar[nvoice].Enabled; break; case ADDVOICE::control::enableResonance: if (write) param.VoicePar[nvoice].Presonance = value_bool; else value = param.VoicePar[nvoice].Presonance; break; case ADDVOICE::control::voiceOscillatorPhase: if (write) param.VoicePar[nvoice].Poscilphase = 64 - value_int; else value = 64 - param.VoicePar[nvoice].Poscilphase; break; case ADDVOICE::control::voiceOscillatorSource: if (write) param.VoicePar[nvoice].Pextoscil = value_int; else value = param.VoicePar[nvoice].Pextoscil; break; case ADDVOICE::control::soundType: if (write) param.VoicePar[nvoice].Type = value_int; else value = param.VoicePar[nvoice].Type; break; } if (!write) cmd.data.value = value; } void InterChange::commandSub(CommandBlock& cmd) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar insert = cmd.data.insert & 0x1f; // ensure no stray filter bool write = (type & TOPLEVEL::type::Write) > 0; int value_int = lrint(value); char value_bool = _SYS_::F2B(value); assert(npart < NUM_MIDI_PARTS); SUBnoteParameters& param{ * synth.part[npart]->kit[kititem].subpars}; if (write) { if(control == SUBSYNTH::control::clearHarmonics) { CommandBlock undoCmd; memcpy(undoCmd.bytes, cmd.bytes, sizeof(CommandBlock)); undoCmd.data.source = 0; undoCmd.data.type &= TOPLEVEL::type::Write; undoCmd.data.insert = TOPLEVEL::insert::harmonicAmplitude; bool markerSet = false; int target = 127; // first harmonic amplitude for (int i = 0; i < MAX_SUB_HARMONICS; ++i) { int val = param.Phmag[i]; if (val != target) { undoCmd.data.value = val; undoCmd.data.control = i; noteSeen = true; undoLoopBack = false; if (!markerSet) { add2undo(undoCmd, noteSeen); markerSet = true; } else add2undo(undoCmd, noteSeen, true); if (target == 127) target = 0; } } undoCmd.data.insert = TOPLEVEL::insert::harmonicBandwidth; for (int i = 0; i < MAX_SUB_HARMONICS; ++i) { int val = param.Phrelbw[i]; undoCmd.data.control = i; noteSeen = true; undoLoopBack = false; if (val != 64) { undoCmd.data.value = val; undoCmd.data.control = i; noteSeen = true; undoLoopBack = false; if (!markerSet) { add2undo(undoCmd, noteSeen); markerSet = true; } else add2undo(undoCmd, noteSeen, true); } } for (int i = 0; i < MAX_SUB_HARMONICS; i++) { param.Phmag[i] = 0; param.Phrelbw[i] = 64; } param.Phmag[0] = 127; return; } else add2undo(cmd, noteSeen); } if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicBandwidth) { if (insert == TOPLEVEL::insert::harmonicAmplitude) { if (write) param.Phmag[control] = value; else { value = param.Phmag[control]; cmd.data.value = value; } } else { if (write) param.Phrelbw[control] = value; else { value = param.Phrelbw[control]; cmd.data.value = value; } } return; } switch (control) { case SUBSYNTH::control::volume: if (write) param.PVolume = value; else value = param.PVolume; break; case SUBSYNTH::control::velocitySense: if (write) param.PAmpVelocityScaleFunction = value; else value = param.PAmpVelocityScaleFunction; break; case SUBSYNTH::control::panning: if (write) param.setPan(value, synth.getRuntime().panLaw); else value = param.PPanning; break; case SUBSYNTH::control::enableRandomPan: if (write) param.PRandom = value_int; else value = param.PRandom; break; case SUBSYNTH::control::randomWidth: if (write) param.PWidth = value_int; else value = param.PWidth; break; case SUBSYNTH::control::bandwidth: if (write) param.Pbandwidth = value; else value = param.Pbandwidth; break; case SUBSYNTH::control::bandwidthScale: if (write) param.Pbwscale = value + 64; else value = param.Pbwscale - 64; break; case SUBSYNTH::control::enableBandwidthEnvelope: if (write) param.PBandWidthEnvelopeEnabled = value_bool; else value = param.PBandWidthEnvelopeEnabled; break; case SUBSYNTH::control::enableFrequencyLFO: if (write) param.PFreqLfoEnabled = value_bool; else value = param.PFreqLfoEnabled; break; case SUBSYNTH::control::detuneFrequency: if (write) param.PDetune = value + 8192; else value = param.PDetune - 8192; break; case SUBSYNTH::control::equalTemperVariation: if (write) param.PfixedfreqET = value; else value = param.PfixedfreqET; break; case SUBSYNTH::control::baseFrequencyAs440Hz: if (write) param.Pfixedfreq = value_bool; else value = param.Pfixedfreq; break; case SUBSYNTH::control::octave: { int k; if (write) { k = value; if (k < 0) k += 16; param.PCoarseDetune = k * 1024 + param.PCoarseDetune % 1024; } else { k = param.PCoarseDetune / 1024; if (k >= 8) k -= 16; value = k; } break; } case SUBSYNTH::control::detuneType: if (write) { if (value_int < 1) // can't be default for subsynth { cmd.data.value = 1; value_int = 1; } param.PDetuneType = value_int; } else value = param.PDetuneType; break; case SUBSYNTH::control::coarseDetune: { int k; if (write) { k = value; if (k < 0) k += 1024; param.PCoarseDetune = k + (param.PCoarseDetune / 1024) * 1024; } else { k = param.PCoarseDetune % 1024; if (k >= 512) k -= 1024; value = k; } break; } case SUBSYNTH::control::pitchBendAdjustment: if (write) param.PBendAdjust = value; else value = param.PBendAdjust; break; case SUBSYNTH::control::pitchBendOffset: if (write) param.POffsetHz = value; else value = param.POffsetHz; break; case SUBSYNTH::control::enableFrequencyEnvelope: if (write) param.PFreqEnvelopeEnabled = value_bool; else value = param.PFreqEnvelopeEnabled; break; case SUBSYNTH::control::overtoneParameter1: if (write) { param.POvertoneSpread.par1 = value; param.updateFrequencyMultipliers(); } else value = param.POvertoneSpread.par1; break; case SUBSYNTH::control::overtoneParameter2: if (write) { param.POvertoneSpread.par2 = value; param.updateFrequencyMultipliers(); } else value = param.POvertoneSpread.par2; break; case SUBSYNTH::control::overtoneForceHarmonics: if (write) { param.POvertoneSpread.par3 = value; param.updateFrequencyMultipliers(); } else value = param.POvertoneSpread.par3; break; case SUBSYNTH::control::overtonePosition: if (write) { param.POvertoneSpread.type = value_int; param.updateFrequencyMultipliers(); } else value = param.POvertoneSpread.type; break; case SUBSYNTH::control::enableFilter: if (write) param.PGlobalFilterEnabled = value_bool; else value = param.PGlobalFilterEnabled; break; case SUBSYNTH::control::filterStages: if (write) param.Pnumstages = value_int; else value = param.Pnumstages; break; case SUBSYNTH::control::magType: if (write) param.Phmagtype = value_int; else value = param.Phmagtype; break; case SUBSYNTH::control::startPosition: if (write) param.Pstart = value_int; else value = param.Pstart; break; case SUBSYNTH::control::stereo: if (write) param.Pstereo = value_bool; else value = param.Pstereo; break; } if (!write) cmd.data.value = value; } bool InterChange::commandPad(CommandBlock& cmd, PADnoteParameters& param) { uchar control = cmd.data.control; float value = cmd.data.value; int value_int = lrint(value); char value_bool = _SYS_::F2B(value); bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; if (write && control != PADSYNTH::control::applyChanges) add2undo(cmd, noteSeen); switch (control) { case PADSYNTH::control::volume: if (write) param.PVolume = value; else value = param.PVolume; break; case PADSYNTH::control::velocitySense: if (write) param.PAmpVelocityScaleFunction = value; else value = param.PAmpVelocityScaleFunction; break; case PADSYNTH::control::panning: if (write) param.setPan(value, synth.getRuntime().panLaw); else value = param.PPanning; break; case PADSYNTH::control::enableRandomPan: if (write) param.PRandom = value_int; else value = param.PRandom; break; case PADSYNTH::control::randomWidth: if (write) param.PWidth = value_int; else value = param.PWidth; break; case PADSYNTH::control::bandwidth: if (write) param.Pbandwidth = value_int; else value = param.Pbandwidth; break; case PADSYNTH::control::bandwidthScale: if (write) param.Pbwscale = value_int; else value = param.Pbwscale; break; case PADSYNTH::control::spectrumMode: if (write) param.Pmode = value_int; else value = param.Pmode; break; case PADSYNTH::control::xFadeUpdate: if (write) param.PxFadeUpdate = value_int; else value = param.PxFadeUpdate; break; case PADSYNTH::control::rebuildTrigger: if (write) param.PrebuildTrigger = value_int; else value = param.PrebuildTrigger; break; case PADSYNTH::control::randWalkDetune: if (write) { param.PrandWalkDetune = value_int; param.randWalkDetune.setSpread(value_int); } else value = param.PrandWalkDetune; break; case PADSYNTH::control::randWalkBandwidth: if (write) { param.PrandWalkBandwidth = value_int; param.randWalkBandwidth.setSpread(value_int); } else value = param.PrandWalkBandwidth; break; case PADSYNTH::control::randWalkFilterFreq: if (write) { param.PrandWalkFilterFreq = value_int; param.randWalkFilterFreq.setSpread(value_int); } else value = param.PrandWalkFilterFreq; break; case PADSYNTH::control::randWalkProfileWidth: if (write) { param.PrandWalkProfileWidth = value_int; param.randWalkProfileWidth.setSpread(value_int); } else value = param.PrandWalkProfileWidth; break; case PADSYNTH::control::randWalkProfileStretch: if (write) { param.PrandWalkProfileStretch = value_int; param.randWalkProfileStretch.setSpread(value_int); } else value = param.PrandWalkProfileStretch; break; case PADSYNTH::control::detuneFrequency: if (write) param.PDetune = value_int + 8192; else value = param.PDetune - 8192; break; case PADSYNTH::control::equalTemperVariation: if (write) param.PfixedfreqET = value_int; else value = param.PfixedfreqET; break; case PADSYNTH::control::baseFrequencyAs440Hz: if (write) param.Pfixedfreq = value_bool; else value = param.Pfixedfreq; break; case PADSYNTH::control::octave: if (write) { int tmp = value; if (tmp < 0) tmp += 16; param.PCoarseDetune = tmp * 1024 + param.PCoarseDetune % 1024; } else { int tmp = param.PCoarseDetune / 1024; if (tmp >= 8) tmp -= 16; value = tmp; } break; case PADSYNTH::control::detuneType: if (write) { if (value_int < 1) // can't be default for padsynth { cmd.data.value = 1; value_int = 1; } param.PDetuneType = value_int; } else value = param.PDetuneType; break; case PADSYNTH::control::coarseDetune: if (write) { int tmp = value; if (tmp < 0) tmp += 1024; param.PCoarseDetune = tmp + (param.PCoarseDetune / 1024) * 1024; } else { int tmp = param.PCoarseDetune % 1024; if (tmp >= 512) tmp -= 1024; value = tmp; } break; case PADSYNTH::control::pitchBendAdjustment: if (write) param.PBendAdjust = value_int; else value = param.PBendAdjust; break; case PADSYNTH::control::pitchBendOffset: if (write) param.POffsetHz = value_int; else value = param.POffsetHz; break; case PADSYNTH::control::overtoneParameter1: if (write) param.Phrpos.par1 = value_int; else value = param.Phrpos.par1; break; case PADSYNTH::control::overtoneParameter2: if (write) param.Phrpos.par2 = value_int; else value = param.Phrpos.par2; break; case PADSYNTH::control::overtoneForceHarmonics: if (write) param.Phrpos.par3 = value_int; else value = param.Phrpos.par3; break; case PADSYNTH::control::overtonePosition: if (write) param.Phrpos.type = value_int; else value = param.Phrpos.type; break; case PADSYNTH::control::baseWidth: if (write) param.PProfile.base.pwidth = value_int; else value = param.PProfile.base.pwidth; break; case PADSYNTH::control::frequencyMultiplier: if (write) param.PProfile.freqmult = value_int; else value = param.PProfile.freqmult; break; case PADSYNTH::control::modulatorStretch: if (write) param.PProfile.modulator.pstretch = value_int; else value = param.PProfile.modulator.pstretch; break; case PADSYNTH::control::modulatorFrequency: if (write) param.PProfile.modulator.freq = value_int; else value = param.PProfile.modulator.freq; break; case PADSYNTH::control::size: if (write) param.PProfile.width = value_int; else value = param.PProfile.width; break; case PADSYNTH::control::baseType: if (write) param.PProfile.base.type = value; else value = param.PProfile.base.type; break; case PADSYNTH::control::harmonicSidebands: if (write) param.PProfile.onehalf = value; else value = param.PProfile.onehalf; break; case PADSYNTH::control::spectralWidth: if (write) param.PProfile.amp.par1 = value_int; else value = param.PProfile.amp.par1; break; case PADSYNTH::control::spectralAmplitude: if (write) param.PProfile.amp.par2 = value_int; else value = param.PProfile.amp.par2; break; case PADSYNTH::control::amplitudeMultiplier: if (write) param.PProfile.amp.type = value; else value = param.PProfile.amp.type; break; case PADSYNTH::control::amplitudeMode: if (write) param.PProfile.amp.mode = value; else value = param.PProfile.amp.mode; break; case PADSYNTH::control::autoscale: if (write) param.PProfile.autoscale = value_bool; else value = param.PProfile.autoscale; break; case PADSYNTH::control::harmonicBase: if (write) param.Pquality.basenote = value_int; else value = param.Pquality.basenote; break; case PADSYNTH::control::samplesPerOctave: if (write) param.Pquality.smpoct = value_int; else value = param.Pquality.smpoct; break; case PADSYNTH::control::numberOfOctaves: if (write) param.Pquality.oct = value_int; else value = param.Pquality.oct; break; case PADSYNTH::control::sampleSize: if (write) param.Pquality.samplesize = value_int; else value = param.Pquality.samplesize; break; case PADSYNTH::control::applyChanges: if (write && value >= 0.5f) { bool blocking = (synth.getRuntime().useLegacyPadBuild() or cmd.data.parameter == 0); if (blocking) {// do the blocking build in the CMD-Dispatch background thread ("sortResultsThread") cmd.data.source = TOPLEVEL::action::lowPrio; // marker to cause dispatch in InterChange::sortResultsThread() } else {// build will run in parallel within a dedicated background thread param.buildNewWavetable(); } } else value = not param.futureBuild.isUnderway(); break; case PADSYNTH::control::stereo: if (write) param.PStereo = value_bool; else value = param.PStereo; break; case PADSYNTH::control::dePop: if (write) param.Fadein_adjustment = value_int; else value = param.Fadein_adjustment; break; case PADSYNTH::control::punchStrength: if (write) param.PPunchStrength = value_int; else value = param.PPunchStrength; break; case PADSYNTH::control::punchDuration: if (write) param.PPunchTime = value_int; else value = param.PPunchTime; break; case PADSYNTH::control::punchStretch: if (write) param.PPunchStretch = value_int; else value = param.PPunchStretch; break; case PADSYNTH::control::punchVelocity: if (write) param.PPunchVelocitySensing = value_int; else value = param.PPunchVelocitySensing; break; } bool needApply{false}; if (write) { uchar control = cmd.data.control; needApply = (control >= PADSYNTH::control::bandwidth and control < PADSYNTH::control::rebuildTrigger); cmd.data.offset = 0; } else cmd.data.value = value; return needApply; } void InterChange::commandOscillator(CommandBlock& cmd, OscilParameters *oscil) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar insert = cmd.data.insert; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); bool write = (type & TOPLEVEL::type::Write) > 0; if (write) { if (control == OSCILLATOR::control::clearHarmonics) { /*CommandBlock tempData; memcpy(tempData.bytes, cmd.bytes, sizeof(CommandBlock)); tempData.data.source = 0; tempData.data.insert = TOPLEVEL::insert::harmonicAmplitude; for (int i = 0; i < MAX_AD_HARMONICS; ++i) { tempData.data.value = oscil->Phmag[i]; tempData.data.control = i; noteSeen = true; undoLoopBack = false; if(i == 0) // first line sets marker add2undo(&tempData, noteSeen); else add2undo(&tempData, noteSeen, true); } tempData.data.insert = TOPLEVEL::insert::harmonicPhase; for (int i = 0; i < MAX_AD_HARMONICS; ++i) { tempData.data.value = oscil->Phphase[i]; tempData.data.control = i; noteSeen = true; undoLoopBack = false; add2undo(&tempData, noteSeen, true); }*/ } else if (control != OSCILLATOR::control::convertToSine && control != OSCILLATOR::control::useAsBaseFunction && control != OSCILLATOR::control::clearHarmonics) add2undo(cmd, noteSeen); } if (insert == TOPLEVEL::insert::harmonicAmplitude) { if (write) { oscil->Phmag[control] = value_int; if (value_int == 64) oscil->Phphase[control] = 64; oscil->paramsChanged(); } else cmd.data.value = oscil->Phmag[control]; return; } else if (insert == TOPLEVEL::insert::harmonicPhase) { if (write) { oscil->Phphase[control] = value_int; oscil->paramsChanged(); } else cmd.data.value = oscil->Phphase[control]; return; } switch (control) { case OSCILLATOR::control::phaseRandomness: if (write) oscil->Prand = value_int + 64; else value = oscil->Prand - 64; break; case OSCILLATOR::control::magType: if (write) oscil->Phmagtype = value_int; else value = oscil->Phmagtype; break; case OSCILLATOR::control::harmonicAmplitudeRandomness: if (write) oscil->Pamprandpower = value_int; else value = oscil->Pamprandpower; break; case OSCILLATOR::control::harmonicRandomnessType: if (write) oscil->Pamprandtype = value_int; else value = oscil->Pamprandtype; break; case OSCILLATOR::control::baseFunctionParameter: if (write) oscil->Pbasefuncpar = value_int + 64; else value = oscil->Pbasefuncpar - 64; break; case OSCILLATOR::control::baseFunctionType: if (write) oscil->Pcurrentbasefunc = value_int; else value = oscil->Pcurrentbasefunc; break; case OSCILLATOR::control::baseModulationParameter1: if (write) oscil->Pbasefuncmodulationpar1 = value_int; else value = oscil->Pbasefuncmodulationpar1; break; case OSCILLATOR::control::baseModulationParameter2: if (write) oscil->Pbasefuncmodulationpar2 = value_int; else value = oscil->Pbasefuncmodulationpar2; break; case OSCILLATOR::control::baseModulationParameter3: if (write) oscil->Pbasefuncmodulationpar3 = value_int; else value = oscil->Pbasefuncmodulationpar3; break; case OSCILLATOR::control::baseModulationType: if (write) oscil->Pbasefuncmodulation = value_int; else value = oscil->Pbasefuncmodulation; break; case OSCILLATOR::control::autoClear: // this is local to the GUI break; case OSCILLATOR::control::useAsBaseFunction: if (write) { fft::Calc fft(synth.oscilsize); OscilGen gen(fft, NULL, &synth, oscil); gen.useasbase(); if (value_bool) { for (int i = 0; i < MAX_AD_HARMONICS; ++ i) { oscil->Phmag[i] = 64; oscil->Phphase[i] = 64; } oscil->Phmag[0] = 127; oscil->Pharmonicshift = 0; oscil->Pwaveshapingfunction = 0; oscil->Pfiltertype = 0; oscil->Psatype = 0; } oscil->paramsChanged(); } break; case OSCILLATOR::control::waveshapeParameter: if (write) oscil->Pwaveshaping = value_int + 64; else value = oscil->Pwaveshaping - 64; break; case OSCILLATOR::control::waveshapeType: if (write) oscil->Pwaveshapingfunction = value_int; else value = oscil->Pwaveshapingfunction; break; case OSCILLATOR::control::filterParameter1: if (write) oscil->Pfilterpar1 = value_int; else value = oscil->Pfilterpar1; break; case OSCILLATOR::control::filterParameter2: if (write) oscil->Pfilterpar2 = value_int; else value = oscil->Pfilterpar2; break; case OSCILLATOR::control::filterBeforeWaveshape: if (write) oscil->Pfilterbeforews = value_bool; else value = oscil->Pfilterbeforews; break; case OSCILLATOR::control::filterType: if (write) oscil->Pfiltertype = value_int; else value = oscil->Pfiltertype; break; case OSCILLATOR::control::modulationParameter1: if (write) oscil->Pmodulationpar1 = value_int; else value = oscil->Pmodulationpar1; break; case OSCILLATOR::control::modulationParameter2: if (write) oscil->Pmodulationpar2 = value_int; else value = oscil->Pmodulationpar2; break; case OSCILLATOR::control::modulationParameter3: if (write) oscil->Pmodulationpar3 = value_int; else value = oscil->Pmodulationpar3; break; case OSCILLATOR::control::modulationType: if (write) oscil->Pmodulation = value_int; else value = oscil->Pmodulation; break; case OSCILLATOR::control::spectrumAdjustParameter: if (write) oscil->Psapar = value_int; else value = oscil->Psapar; break; case OSCILLATOR::control::spectrumAdjustType: if (write) oscil->Psatype = value_int; else value = oscil->Psatype; break; case OSCILLATOR::control::harmonicShift: if (write) oscil->Pharmonicshift = value_int; else value = oscil->Pharmonicshift; break; case OSCILLATOR::control::clearHarmonicShift: if (write) oscil->Pharmonicshift = 0; break; case OSCILLATOR::control::shiftBeforeWaveshapeAndFilter: if (write) oscil->Pharmonicshiftfirst = value_bool; else value = oscil->Pharmonicshiftfirst; break; case OSCILLATOR::control::adaptiveHarmonicsParameter: if (write) oscil->Padaptiveharmonicspar = value_int; else value = oscil->Padaptiveharmonicspar; break; case OSCILLATOR::control::adaptiveHarmonicsBase: if (write) oscil->Padaptiveharmonicsbasefreq = value_int; else value = oscil->Padaptiveharmonicsbasefreq; break; case OSCILLATOR::control::adaptiveHarmonicsPower: if (write) oscil->Padaptiveharmonicspower = value_int; else value = oscil->Padaptiveharmonicspower; break; case OSCILLATOR::control::adaptiveHarmonicsType: if (write) oscil->Padaptiveharmonics = value_int; else value = oscil->Padaptiveharmonics; break; case OSCILLATOR::control::clearHarmonics: if (write) { for (int i = 0; i < MAX_AD_HARMONICS; ++ i) { oscil->Phmag[i]=64; oscil->Phphase[i]=64; } oscil->Phmag[0]=127; oscil->paramsChanged(); } break; case OSCILLATOR::control::convertToSine: if (write) { fft::Calc fft(synth.oscilsize); OscilGen gen(fft, NULL, &synth, oscil); gen.convert2sine(); oscil->paramsChanged(); } break; } if (!write) cmd.data.value = value; } void InterChange::commandResonance(CommandBlock& cmd, Resonance *respar) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar insert = cmd.data.insert; uchar parameter = cmd.data.parameter; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); bool write = (type & TOPLEVEL::type::Write) > 0; if (write) { if (control == RESONANCE::control::randomType || control == RESONANCE::control::clearGraph || control == RESONANCE::control::interpolatePeaks || control == RESONANCE::control::smoothGraph) { CommandBlock undoCmd; memcpy(undoCmd.bytes, cmd.bytes, sizeof(CommandBlock)); undoCmd.data.control = RESONANCE::control::graphPoint; undoCmd.data.insert = TOPLEVEL::insert::resonanceGraphInsert; bool markerSet = false; for (int i = 0; i < MAX_RESONANCE_POINTS; ++i) { int val = respar->Prespoints[i]; undoCmd.data.value = val; undoCmd.data.parameter = i; noteSeen = true; undoLoopBack = false; if (!markerSet) { add2undo(undoCmd, noteSeen); markerSet = true; } else add2undo(undoCmd, noteSeen, true); } } else add2undo(cmd, noteSeen); } if (insert == TOPLEVEL::insert::resonanceGraphInsert) { if (write) respar->setpoint(parameter, value_int); else cmd.data.value = respar->Prespoints[parameter]; return; } switch (control) { case RESONANCE::control::maxDb: if (write) respar->PmaxdB = value; else value = respar->PmaxdB; break; case RESONANCE::control::centerFrequency: if (write) respar->Pcenterfreq = value; else value = respar->Pcenterfreq; break; case RESONANCE::control::octaves: if (write) respar->Poctavesfreq = value; else value = respar->Poctavesfreq; break; case RESONANCE::control::enableResonance: if (write) respar->Penabled = value_bool; else value = respar->Penabled; break; case RESONANCE::control::randomType: if (write) respar->randomize(value_int); break; case RESONANCE::control::interpolatePeaks: if (write) respar->interpolatepeaks(value_bool); break; case RESONANCE::control::protectFundamental: if (write) respar->Pprotectthefundamental = value_bool; else value = respar->Pprotectthefundamental; break; case RESONANCE::control::clearGraph: if (write) for (int i = 0; i < MAX_RESONANCE_POINTS; ++ i) respar->setpoint(i, 64); break; case RESONANCE::control::smoothGraph: if (write) respar->smooth(); break; } if (!write) cmd.data.value = value; } void InterChange::commandLFO(CommandBlock& cmd) { uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar insertParam = cmd.data.parameter; assert(npart < NUM_MIDI_PARTS); Part& part{*synth.part[npart]}; bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; if (write) add2undo(cmd, noteSeen); if (engine == PART::engine::addSynth) { switch (insertParam) { case TOPLEVEL::insertType::amplitude: lfoReadWrite(cmd, part.kit[kititem].adpars->GlobalPar.AmpLfo); break; case TOPLEVEL::insertType::frequency: lfoReadWrite(cmd, part.kit[kititem].adpars->GlobalPar.FreqLfo); break; case TOPLEVEL::insertType::filter: lfoReadWrite(cmd, part.kit[kititem].adpars->GlobalPar.FilterLfo); break; } } else if (engine == PART::engine::subSynth) { switch (insertParam) { case TOPLEVEL::insertType::amplitude: lfoReadWrite(cmd, part.kit[kititem].subpars->AmpLfo.get()); break; case TOPLEVEL::insertType::frequency: lfoReadWrite(cmd, part.kit[kititem].subpars->FreqLfo.get()); break; case TOPLEVEL::insertType::filter: lfoReadWrite(cmd, part.kit[kititem].subpars->GlobalFilterLfo.get()); break; } } else if (engine == PART::engine::padSynth) { switch (insertParam) { case TOPLEVEL::insertType::amplitude: lfoReadWrite(cmd, part.kit[kititem].padpars->AmpLfo.get()); break; case TOPLEVEL::insertType::frequency: lfoReadWrite(cmd, part.kit[kititem].padpars->FreqLfo.get()); break; case TOPLEVEL::insertType::filter: lfoReadWrite(cmd, part.kit[kititem].padpars->FilterLfo.get()); break; } } else if (engine >= PART::engine::addVoice1) { int nvoice = engine - PART::engine::addVoice1; switch (insertParam) { case TOPLEVEL::insertType::amplitude: lfoReadWrite(cmd, part.kit[kititem].adpars->VoicePar[nvoice].AmpLfo); break; case TOPLEVEL::insertType::frequency: lfoReadWrite(cmd, part.kit[kititem].adpars->VoicePar[nvoice].FreqLfo); break; case TOPLEVEL::insertType::filter: lfoReadWrite(cmd, part.kit[kititem].adpars->VoicePar[nvoice].FilterLfo); break; } } } void InterChange::lfoReadWrite(CommandBlock& cmd, LFOParams *pars) { bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; float val = cmd.data.value; switch (cmd.data.control) { case LFOINSERT::control::speed: if(pars->Pbpm) // set a flag so CLI can read the status cmd.data.offset = 1; if (write) pars->setPfreq(val * float(Fmul2I)); else val = float(pars->PfreqI) / float(Fmul2I); break; case LFOINSERT::control::depth: if (write) pars->setPintensity(val); else val = pars->Pintensity; break; case LFOINSERT::control::delay: if (write) pars->setPdelay(val); else val = pars->Pdelay; break; case LFOINSERT::control::start: if (write) pars->setPstartphase(val); else val = pars->Pstartphase; break; case LFOINSERT::control::amplitudeRandomness: if (write) pars->setPrandomness(val); else val = pars->Prandomness; break; case LFOINSERT::control::type: if (write) pars->setPLFOtype(lrint(val)); else val = pars->PLFOtype; break; case LFOINSERT::control::continuous: if (write) pars->setPcontinous(_SYS_::F2B(val)); else val = pars->Pcontinous; break; case LFOINSERT::control::bpm: if (write) pars->setPbpm(_SYS_::F2B(val)); else val = pars->Pbpm; break; case LFOINSERT::control::frequencyRandomness: if (write) pars->setPfreqrand(val); else val = pars->Pfreqrand; break; case LFOINSERT::control::stretch: if (write) pars->setPstretch(val); else val = pars->Pstretch; break; } if (write) pars->paramsChanged(); else cmd.data.value = val; } void InterChange::commandFilter(CommandBlock& cmd) { uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; assert(npart < NUM_MIDI_PARTS); Part& part{*(synth.part[npart])}; bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; if (write) add2undo(cmd, noteSeen); if (engine == PART::engine::addSynth) { filterReadWrite(cmd, part.kit[kititem].adpars->GlobalPar.GlobalFilter , &part.kit[kititem].adpars->GlobalPar.PFilterVelocityScale , &part.kit[kititem].adpars->GlobalPar.PFilterVelocityScaleFunction); } else if (engine == PART::engine::subSynth) { filterReadWrite(cmd, part.kit[kititem].subpars->GlobalFilter.get() , &part.kit[kititem].subpars->PGlobalFilterVelocityScale , &part.kit[kititem].subpars->PGlobalFilterVelocityScaleFunction); } else if (engine == PART::engine::padSynth) { filterReadWrite(cmd, part.kit[kititem].padpars->GlobalFilter.get() , &part.kit[kititem].padpars->PFilterVelocityScale , &part.kit[kititem].padpars->PFilterVelocityScaleFunction); } else if (engine >= PART::engine::addVoice1) { int eng = engine - PART::engine::addVoice1; filterReadWrite(cmd, part.kit[kititem].adpars->VoicePar[eng].VoiceFilter , &part.kit[kititem].adpars->VoicePar[eng].PFilterVelocityScale , &part.kit[kititem].adpars->VoicePar[eng].PFilterVelocityScaleFunction); } } void InterChange::filterReadWrite(CommandBlock& cmd, FilterParams *pars, uchar *velsnsamp, uchar *velsns) { bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; float val = cmd.data.value; int value_int = lrint(val); int nseqpos = cmd.data.parameter; int nformant = cmd.data.parameter; int nvowel = cmd.data.offset; switch (cmd.data.control) { case FILTERINSERT::control::centerFrequency: if (write) pars->Pfreq = val; else val = pars->Pfreq; break; case FILTERINSERT::control::Q: if (write) pars->Pq = val; else val = pars->Pq; break; case FILTERINSERT::control::frequencyTracking: if (write) pars->Pfreqtrack = val; else val = pars->Pfreqtrack; break; case FILTERINSERT::control::velocitySensitivity: if (velsnsamp != NULL) { if (write) *velsnsamp = value_int; else val = *velsnsamp; } break; case FILTERINSERT::control::velocityCurve: if (velsns != NULL) { if (write) *velsns = value_int; else val = *velsns; } break; case FILTERINSERT::control::gain: if (write) { pars->Pgain = val; pars->changed = true; } else val = pars->Pgain; break; case FILTERINSERT::control::stages: if (write) { pars->Pstages = value_int; pars->changed = true; } else val = pars->Pstages; break; case FILTERINSERT::control::baseType: if (write) { if (pars->Pcategory != value_int) { pars->Pgain = 64; pars->Ptype = 0; pars->changed = true; pars->Pcategory = value_int; } } else val = pars->Pcategory; break; case FILTERINSERT::control::analogType: case FILTERINSERT::control::stateVariableType: if (write) { pars->Ptype = value_int; pars->changed = true; } else val = pars->Ptype; break; case FILTERINSERT::control::frequencyTrackingRange: if (write) { pars->Pfreqtrackoffset = (value_int != 0); pars->changed = true; } else val = pars->Pfreqtrackoffset; break; case FILTERINSERT::control::formantSlowness: if (write) { pars->Pformantslowness = val; pars->changed = true; } else val = pars->Pformantslowness; break; case FILTERINSERT::control::formantClearness: if (write) { pars->Pvowelclearness = val; pars->changed = true; } else val = pars->Pvowelclearness; break; case FILTERINSERT::control::formantFrequency: if (write) { pars->Pvowels[nvowel].formants[nformant].freq = val; pars->changed = true; } else val = pars->Pvowels[nvowel].formants[nformant].freq; break; case FILTERINSERT::control::formantQ: if (write) { pars->Pvowels[nvowel].formants[nformant].q = val; pars->changed = true; } else val = pars->Pvowels[nvowel].formants[nformant].q; break; case FILTERINSERT::control::formantAmplitude: if (write) { pars->Pvowels[nvowel].formants[nformant].amp = val; pars->changed = true; } else val = pars->Pvowels[nvowel].formants[nformant].amp; break; case FILTERINSERT::control::formantStretch: if (write) { pars->Psequencestretch = val; pars->changed = true; } else val = pars->Psequencestretch; break; case FILTERINSERT::control::formantCenter: if (write) { pars->Pcenterfreq = val; pars->changed = true; } else val = pars->Pcenterfreq; break; case FILTERINSERT::control::formantOctave: if (write) { pars->Poctavesfreq = val; pars->changed = true; } else val = pars->Poctavesfreq; break; case FILTERINSERT::control::numberOfFormants: if (write) { pars->Pnumformants = value_int; pars->changed = true; } else val = pars->Pnumformants; break; case FILTERINSERT::control::vowelNumber: // this is local to the GUI break; case FILTERINSERT::control::formantNumber: // this is local to the GUI break; case FILTERINSERT::control::sequenceSize: if (write) { pars->Psequencesize = value_int; pars->changed = true; } else val = pars->Psequencesize; break; case FILTERINSERT::control::sequencePosition: /* * this appears to be just setting the GUI * reference point yet sets pars changed. * why? */ if (write) pars->changed = true; else { ; } break; case FILTERINSERT::control::vowelPositionInSequence: if (write) { pars->Psequence[nseqpos].nvowel = value_int; pars->changed = true; } else val = pars->Psequence[nseqpos].nvowel; break; case FILTERINSERT::control::negateInput: if (write) { pars->Psequencereversed = (value_int != 0); pars->changed = true; } else val = pars->Psequencereversed; break; } if (write) pars->paramsChanged(); else cmd.data.value = val; } void InterChange::commandEnvelope(CommandBlock& cmd) { uchar npart = cmd.data.part; uchar kititem = cmd.data.kit; uchar engine = cmd.data.engine; uchar insertParam = cmd.data.parameter; assert(npart < NUM_MIDI_PARTS); Part& part{*synth.part[npart]}; if (engine == PART::engine::addSynth) { switch (insertParam) { case TOPLEVEL::insertType::amplitude: envelopeReadWrite(cmd, part.kit[kititem].adpars->GlobalPar.AmpEnvelope); break; case TOPLEVEL::insertType::frequency: envelopeReadWrite(cmd, part.kit[kititem].adpars->GlobalPar.FreqEnvelope); break; case TOPLEVEL::insertType::filter: envelopeReadWrite(cmd, part.kit[kititem].adpars->GlobalPar.FilterEnvelope); break; } } else if (engine == PART::engine::subSynth) { switch (insertParam) { case TOPLEVEL::insertType::amplitude: envelopeReadWrite(cmd, part.kit[kititem].subpars->AmpEnvelope.get()); break; case TOPLEVEL::insertType::frequency: envelopeReadWrite(cmd, part.kit[kititem].subpars->FreqEnvelope.get()); break; case TOPLEVEL::insertType::filter: envelopeReadWrite(cmd, part.kit[kititem].subpars->GlobalFilterEnvelope.get()); break; case TOPLEVEL::insertType::bandwidth: envelopeReadWrite(cmd, part.kit[kititem].subpars->BandWidthEnvelope.get()); break; } } else if (engine == PART::engine::padSynth) { switch (insertParam) { case TOPLEVEL::insertType::amplitude: envelopeReadWrite(cmd, part.kit[kititem].padpars->AmpEnvelope.get()); break; case TOPLEVEL::insertType::frequency: envelopeReadWrite(cmd, part.kit[kititem].padpars->FreqEnvelope.get()); break; case TOPLEVEL::insertType::filter: envelopeReadWrite(cmd, part.kit[kititem].padpars->FilterEnvelope.get()); break; } } else if (engine >= PART::engine::addMod1) { int nvoice = engine - PART::engine::addMod1; switch (insertParam) { case TOPLEVEL::insertType::amplitude: envelopeReadWrite(cmd, part.kit[kititem].adpars->VoicePar[nvoice].FMAmpEnvelope); break; case TOPLEVEL::insertType::frequency: envelopeReadWrite(cmd, part.kit[kititem].adpars->VoicePar[nvoice].FMFreqEnvelope); break; } } else if (engine >= PART::engine::addVoice1) { int nvoice = engine - PART::engine::addVoice1; switch (insertParam) { case TOPLEVEL::insertType::amplitude: envelopeReadWrite(cmd, part.kit[kititem].adpars->VoicePar[nvoice].AmpEnvelope); break; case TOPLEVEL::insertType::frequency: envelopeReadWrite(cmd, part.kit[kititem].adpars->VoicePar[nvoice].FreqEnvelope); break; case TOPLEVEL::insertType::filter: envelopeReadWrite(cmd, part.kit[kititem].adpars->VoicePar[nvoice].FilterEnvelope); break; } } } void InterChange::envelopeReadWrite(CommandBlock& cmd, EnvelopeParams *pars) { //int val = int(cmd.data.value) & 0x7f; // redo not currently restoring correct values float val = cmd.data.value; bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; uchar insert = cmd.data.insert; uchar dt = cmd.data.offset; if (cmd.data.control == ENVELOPEINSERT::control::enableFreeMode) { if (write) { add2undo(cmd, noteSeen); pars->Pfreemode = (val != 0); } else val = pars->Pfreemode; cmd.data.value = pars->Pfreemode; return; } size_t envpoints = pars->Penvpoints; if (pars->Pfreemode) { bool doReturn = true; switch (insert) { case TOPLEVEL::insert::envelopePointAdd: envelopePointAdd(cmd, pars); break; case TOPLEVEL::insert::envelopePointDelete: envelopePointDelete(cmd, pars); break; case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: envelopePointChange(cmd, pars); break; default: { if (cmd.data.control == ENVELOPEINSERT::control::points) { if (!pars->Pfreemode) { val = UNUSED; dt = UNUSED; } else { val = envpoints; dt = envpoints; // don't really need this now } } else if (cmd.data.control == ENVELOPEINSERT::control::sustainPoint) { if (write) pars->Penvsustain = val<0? 0 : val; else val = pars->Penvsustain; } else doReturn = false; } break; } if (doReturn) // some controls are common to both { cmd.data.value = val; cmd.data.offset = dt; return; } } else if (insert != TOPLEVEL::insert::envelopeGroup) { cmd.data.value = UNUSED; cmd.data.offset = UNUSED; return; } if (write) add2undo(cmd, noteSeen); switch (cmd.data.control) { case ENVELOPEINSERT::control::attackLevel: if (write) pars->PA_val = val; else val = pars->PA_val; break; case ENVELOPEINSERT::control::attackTime: if (write) pars->PA_dt = val; else val = pars->PA_dt; break; case ENVELOPEINSERT::control::decayLevel: if (write) pars->PD_val = val; else val = pars->PD_val; break; case ENVELOPEINSERT::control::decayTime: if (write) pars->PD_dt = val; else val = pars->PD_dt; break; case ENVELOPEINSERT::control::sustainLevel: if (write) pars->PS_val = val; else val = pars->PS_val; break; case ENVELOPEINSERT::control::releaseTime: if (write) pars->PR_dt = val; else val = pars->PR_dt; break; case ENVELOPEINSERT::control::releaseLevel: if (write) pars->PR_val = val; else val = pars->PR_val; break; case ENVELOPEINSERT::control::stretch: if (write) pars->Penvstretch = val; else val = pars->Penvstretch; break; case ENVELOPEINSERT::control::forcedRelease: if (write) pars->Pforcedrelease = (val != 0); else val = pars->Pforcedrelease; break; case ENVELOPEINSERT::control::linearEnvelope: if (write) pars->Plinearenvelope = (val != 0); else val = pars->Plinearenvelope; break; case ENVELOPEINSERT::control::edit: break; default: val = UNUSED; dt = UNUSED; break; } if (write) { pars->paramsChanged(); } cmd.data.value = val; cmd.data.offset = dt; return; } void InterChange::envelopePointAdd(CommandBlock& cmd, EnvelopeParams *pars) { uchar point = cmd.data.control; uchar dt = cmd.data.offset; float val = cmd.data.value; bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; size_t envpoints = pars->Penvpoints; if (!write || point == 0 || point >= envpoints) { cmd.data.value = UNUSED; cmd.data.offset = envpoints; return; } if (cameFrom != envControl::undo) { if (envpoints < MAX_ENVELOPE_POINTS) { if (cameFrom == envControl::input) addFixed2undo(cmd); pars->Penvpoints += 1; assert (0 < point && point < envpoints); for (size_t i = envpoints; i >= point; -- i) { pars->Penvdt[i + 1] = pars->Penvdt[i]; pars->Penvval[i + 1] = pars->Penvval[i]; } if (point == 0) pars->Penvdt[1] = 64; if (point <= pars->Penvsustain) ++ pars->Penvsustain; pars->Penvdt[point] = dt; pars->Penvval[point] = val; cmd.data.value = val; cmd.data.offset = dt; pars->paramsChanged(); } else { cmd.data.value = UNUSED; } return; } if (envpoints < 4) { cmd.data.value = UNUSED; cmd.data.offset = UNUSED; return; // can't have less than 4 } else { assert (0 < point && point < envpoints); assert (3 < envpoints); envpoints -= 1; for (size_t i = point; i < envpoints; ++ i) { pars->Penvdt[i] = pars->Penvdt[i + 1]; pars->Penvval[i] = pars->Penvval[i + 1]; } if (point <= pars->Penvsustain) -- pars->Penvsustain; pars->Penvpoints = envpoints; cmd.data.value = envpoints; pars->paramsChanged(); } } void InterChange::envelopePointDelete(CommandBlock& cmd, EnvelopeParams *pars) { uchar point = cmd.data.control; uchar dt = cmd.data.offset; float val = cmd.data.value; bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; size_t envpoints = pars->Penvpoints; if (!write || point == 0 || point >= envpoints) { cmd.data.value = UNUSED; cmd.data.offset = envpoints; return; } if (cameFrom != envControl::input && cameFrom != envControl::redo) { if (envpoints < MAX_ENVELOPE_POINTS) { pars->Penvpoints += 1; for (size_t i = envpoints; i >= point; -- i) { pars->Penvdt[i + 1] = pars->Penvdt[i]; pars->Penvval[i + 1] = pars->Penvval[i]; } if (point == 0) pars->Penvdt[1] = 64; if (point <= pars->Penvsustain) ++ pars->Penvsustain; pars->Penvdt[point] = dt; pars->Penvval[point] = val; cmd.data.value = val; cmd.data.offset = dt; pars->paramsChanged(); } else { cmd.data.value = UNUSED; } return; } if (envpoints < 4) { cmd.data.value = UNUSED; cmd.data.offset = UNUSED; return; // can't have less than 4 } else { if (cameFrom == envControl::input) { cmd.data.source = 0; cmd.data.type &= TOPLEVEL::type::Write; cmd.data.offset = pars->Penvdt[point]; cmd.data.value = pars->Penvval[point]; addFixed2undo(cmd); } assert (0 < point && point < envpoints); assert (3 < envpoints); envpoints -= 1; for (size_t i = point; i < envpoints; ++ i) { pars->Penvdt[i] = pars->Penvdt[i + 1]; pars->Penvval[i] = pars->Penvval[i + 1]; } if (point <= pars->Penvsustain) -- pars->Penvsustain; pars->Penvpoints = envpoints; cmd.data.value = envpoints; pars->paramsChanged(); } } void InterChange::envelopePointChange(CommandBlock& cmd, EnvelopeParams *pars) { uchar insert = cmd.data.insert; uchar point = cmd.data.control; uchar dt = cmd.data.offset; float val = cmd.data.value; bool write = (cmd.data.type & TOPLEVEL::type::Write) > 0; size_t envpoints = pars->Penvpoints; if (point >= envpoints) { cmd.data.value = UNUSED; cmd.data.offset = UNUSED; return; } if (write) { add2undo(cmd, noteSeen); switch (insert) { case TOPLEVEL::insert::envelopePointChange: pars->Penvval[point] = val; if (point == 0) { dt = 0; } else { pars->Penvdt[point] = dt; } break; case TOPLEVEL::insert::envelopePointChangeDt: if (point == 0) { val = 0; } else { pars->Penvdt[point] = val; } break; case TOPLEVEL::insert::envelopePointChangeVal: pars->Penvval[point] = val; break; default: // Should never be anything else. assert(false); break; } pars->paramsChanged(); } else { switch (insert) { case TOPLEVEL::insert::envelopePointChange: val = pars->Penvval[point]; dt = pars->Penvdt[point]; break; case TOPLEVEL::insert::envelopePointChangeDt: val = pars->Penvdt[point]; break; case TOPLEVEL::insert::envelopePointChangeVal: val = pars->Penvval[point]; break; default: // Should never be anything else. assert(false); break; } } cmd.data.value = val; cmd.data.offset = dt; return; } void InterChange::commandSysIns(CommandBlock& cmd) { float value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar insert = cmd.data.insert; bool write = (type & TOPLEVEL::type::Write) > 0; int value_int = lrint(value); bool isSysEff = (npart == TOPLEVEL::section::systemEffects); uchar effnum = isSysEff? synth.syseffnum : synth.inseffnum; if (insert == UNUSED) { switch (control) { case EFFECT::sysIns::effectNumber: if (write) { if (isSysEff) { synth.syseffnum = value_int; cmd.data.parameter = (synth.sysefx[value_int]->geteffectpar(-1) != 0); } else { synth.inseffnum = value_int; cmd.data.parameter = (synth.insefx[value_int]->geteffectpar(-1) != 0); } synth.pushEffectUpdate(npart); cmd.data.source |= cmd.data.source |= TOPLEVEL::action::forceUpdate; // the line above is to show it's changed from preset values cmd.data.engine = value_int; } else { if (isSysEff) value = synth.syseffnum; else value = synth.inseffnum; } break; case EFFECT::sysIns::effectType: if (write) { if (isSysEff) { synth.sysefx[effnum]->changeeffect(value_int); } else { synth.insefx[effnum]->changeeffect(value_int); auto& destination = synth.Pinsparts[effnum]; if (value_int > 0 and destination == -1) {// if it was disabled before, pre-select current part as convenience destination = synth.getRuntime().currentPart; } } // push GUI update since module for effnum is currently exposed in GUI synth.pushEffectUpdate(npart); cmd.data.offset = 0; } else { if (isSysEff) value = synth.sysefx[effnum]->geteffect(); else value = synth.insefx[effnum]->geteffect(); } break; case EFFECT::sysIns::effectDestination: // insert only if (write) { synth.Pinsparts[effnum] = value_int; if (value_int == -1) synth.insefx[effnum]->cleanup(); synth.pushEffectUpdate(npart); // isInsert and currently exposed in GUI } else value = synth.Pinsparts[effnum]; break; case EFFECT::sysIns::effectEnable: // system only if (write) { bool newSwitch = _SYS_::F2B(value); bool oldSwitch = synth.syseffEnable[effnum]; synth.syseffEnable[effnum] = newSwitch; if (newSwitch != oldSwitch) { synth.sysefx[effnum]->cleanup(); synth.pushEffectUpdate(npart); // not isInsert currently exposed in GUI } } else value = synth.syseffEnable[effnum]; break; } } else // system only { if (write) { synth.setPsysefxsend(effnum, control, value); synth.pushEffectUpdate(npart); } else value = synth.Psysefxsend[effnum][control]; } if (!write) cmd.data.value = value; } void InterChange::commandEffects(CommandBlock& cmd) { float value = cmd.data.value; int value_int = int(value + 0.5f); uchar type = cmd.data.type; uchar control = cmd.data.control; uchar npart = cmd.data.part; uchar effSend = cmd.data.kit; uchar effnum = cmd.data.engine; bool write = (type & TOPLEVEL::type::Write) > 0; if (write) { cmd.data.source |= TOPLEVEL::action::forceUpdate; // the line above is to show it's changed from preset values add2undo(cmd, noteSeen); } EffectMgr *eff; if (npart == TOPLEVEL::section::systemEffects) eff = synth.sysefx[effnum]; else if (npart == TOPLEVEL::section::insertEffects) eff = synth.insefx[effnum]; else if (npart < NUM_MIDI_PARTS) eff = synth.part[npart]->partefx[effnum]; else return; // invalid part number if (effSend >= EFFECT::type::count) return; // invalid kit number auto maybeUpdateGui = [&]{ bool isPart{npart < NUM_MIDI_PARTS}; bool isInsert{npart != TOPLEVEL::section::systemEffects}; int currPartNr = synth.getRuntime().currentPart; uchar currEff = isPart? synth.part[currPartNr]->Peffnum : isInsert? synth.inseffnum : synth.syseffnum; // push update to GUI if the change affects the current effect module exposed in GUI if (effnum == currEff && (!isPart || npart == currPartNr)) synth.pushEffectUpdate(npart); }; if (control != PART::control::effectType && effSend != (eff->geteffect() + EFFECT::type::none)) // geteffect not yet converted { if ((cmd.data.source & TOPLEVEL::action::noAction) != TOPLEVEL::action::fromMIDI && control != TOPLEVEL::control::copyPaste) synth.getRuntime().Log("Not Available"); // TODO sort this better for CLI as well as MIDI cmd.data.source = TOPLEVEL::action::noAction; return; } if (eff->geteffectpar(EFFECT::control::bpm) == 1) { cmd.data.offset = 1; // mark this for reporting in Data2Text if (eff->geteffectpar(EFFECT::control::sepLRDelay) == 1) cmd.data.offset = 3; // specific for Echo effect } if (effSend == EFFECT::type::dynFilter && cmd.data.insert != UNUSED) { if (write) eff->seteffectpar(-1, true); // effect changed filterReadWrite(cmd, eff->filterpars,NULL,NULL); if (write) maybeUpdateGui(); return; } if (control == EFFECT::control::changed) { if (!write) { value = eff->geteffectpar(-1); cmd.data.value = value; } return; // specific for reading change status } if (write) { if (effSend == EFFECT::type::eq) /* * specific to EQ * Control 1 is not a normal parameter, but a band index. * Also, EQ does not have presets, and 16 is the control * for the band 1 frequency parameter */ { uchar band = cmd.data.parameter; if (control <= 1) eff->seteffectpar(control, value_int); else { if (band != UNUSED) { eff->seteffectpar(1, band); // should always be the case } else { band = eff->geteffectpar(1); cmd.data.parameter = band; } eff->seteffectpar(control + (band * 5), value_int); } } else { if (control == EFFECT::control::preset) eff->changepreset(value_int); else { eff->seteffectpar(control, value_int); if (effSend == EFFECT::type::reverb && control == 10 && value_int == 2) // bandwidth type update for GUI cmd.data.offset = eff->geteffectpar(12); } } maybeUpdateGui(); } else { if (effSend == EFFECT::type::eq && control > 1) // specific to EQ { value = eff->geteffectpar(control + (eff->geteffectpar(1) * 5)); cmd.data.parameter = eff->geteffectpar(1); } else { if (control == EFFECT::control::preset) value = eff->getpreset(); else value = eff->geteffectpar(control); } } if (!write) cmd.data.value = value; } void InterChange::addFixed2undo(CommandBlock& cmd) { redoList.clear(); // always invalidated on new entry undoList.push_back(undoMarker); undoList.push_back(cmd); } void InterChange::add2undo(CommandBlock& cmd, bool& noteSeen, bool group) { if (undoLoopBack) { undoLoopBack = false; return; // don't want to reset what we've just undone! } redoList.clear(); // always invalidated on new entry if (noteSeen || undoList.empty()) { noteSeen = false; if (!group) { undoList.push_back(undoMarker); } } else if (!group) { if (undoList.back().data.control == cmd.data.control && undoList.back().data.part == cmd.data.part && undoList.back().data.kit == cmd.data.kit && undoList.back().data.engine == cmd.data.engine && undoList.back().data.insert == cmd.data.insert && undoList.back().data.parameter == cmd.data.parameter) return; undoList.push_back(undoMarker); } /* * the following is used to read the current value of the specific * control as that is what we will want to revert to. */ CommandBlock candidate; memcpy(candidate.bytes, cmd.bytes, sizeof(CommandBlock)); candidate.data.type &= TOPLEVEL::type::Integer; candidate.data.source = 0; commandSendReal(candidate); candidate.data.source = cmd.data.source | TOPLEVEL::action::forceUpdate; candidate.data.type = cmd.data.type; undoList.push_back(candidate); } void InterChange::undoLast(CommandBlock& candidate) { std::list *source; std::list *dest; if (!setRedo) { source = &undoList; dest = &redoList; cameFrom = envControl::undo; } else { cameFrom = envControl::redo; source = &redoList; dest = &undoList; } if (source->empty()) { setUndo = false; setRedo = false; return; } if (source->back().data.part == TOPLEVEL::undoMark) { setUndo = false; setRedo = false; source->pop_back(); return; } undoLoopBack = true; CommandBlock oldCommand; memcpy(candidate.bytes, source->back().bytes, sizeof(CommandBlock)); if (undoStart) { dest->push_back(undoMarker); undoStart = false; } memcpy(oldCommand.bytes, source->back().bytes, sizeof(CommandBlock)); char tempsource = oldCommand.data.source; if(oldCommand.data.insert != TOPLEVEL::insert::envelopePointAdd && oldCommand.data.insert != TOPLEVEL::insert::envelopePointDelete) { char temptype = oldCommand.data.type; oldCommand.data.type &= TOPLEVEL::type::Integer; oldCommand.data.source = 0; commandSendReal(oldCommand); oldCommand.data.type = temptype; } oldCommand.data.source = tempsource; dest->push_back(oldCommand); source->pop_back(); if (source->empty()) { setUndo = false; setRedo = false; } else if (source->back().data.part == TOPLEVEL::undoMark) { setUndo = false; setRedo = false; source->pop_back(); } } void InterChange::manageDisplay(CommandBlock& cmd) { if (!synth.getRuntime().showGui) { synth.getRuntime().Log("Graphic display not enabled"); return; } int section = cmd.data.offset; synth.CBtest(&cmd); synth.getRuntime().Log("Found display control (in progress)"); if (section <= TOPLEVEL::section::part64) { if (!synth.partonoffRead(section)) synth.getRuntime().Log("Current part disabled"); else { synth.getRuntime().Log("Seen part "+to_string(section)); } } else { synth.getRuntime().Log("Unrecognised section"); } return; } void InterChange::undoRedoClear() { undoList.clear(); redoList.clear(); noteSeen = false; undoLoopBack = false; undoStart = false; } // tests and returns corrected values void InterChange::testLimits(CommandBlock& cmd) { float value = cmd.data.value; int control = cmd.data.control; /* * This is a special case as existing defined * midi CCs need to be checked. * I don't like special cases either :( */ if (cmd.data.part == TOPLEVEL::section::config && ( control == CONFIG::control::bankRootCC || control == CONFIG::control::bankCC || control == CONFIG::control::extendedProgramChangeCC) ) { cmd.data.miscmsg = NO_MSG; // just to be sure if (value > 119) // we don't want controllers above this return; // TODO can bank and bankroot be combined // as they now have the same options? string text; if (control == CONFIG::control::bankRootCC) { text = synth.getRuntime().masterCCtest(int(value)); if (text != "") cmd.data.miscmsg = textMsgBuffer.push(text); return; } if (control == CONFIG::control::bankCC) { if (value != 0 && value != 32) return; text = synth.getRuntime().masterCCtest(int(value)); if (text != "") cmd.data.miscmsg = textMsgBuffer.push(text); return; } text = synth.getRuntime().masterCCtest(int(value)); if (text != "") cmd.data.miscmsg = textMsgBuffer.push(text); return; } } // more work needed here :( float InterChange::returnLimits(CommandBlock& cmd) { // bit 5 set is used to denote midi learnable // bit 7 set denotes the value is used as an integer int control = int( cmd.data.control); int npart = int( cmd.data.part ); int kititem = int( cmd.data.kit ); int effSend = int( cmd.data.kit ); int engine = int( cmd.data.engine ); int insert = int( cmd.data.insert ); int parameter = int( cmd.data.parameter); int miscmsg = int( cmd.data.miscmsg); float value = cmd.data.value; cmd.data.type &= TOPLEVEL::type::Default; // clear all flags int request = cmd.data.type; // catches Adj, Min, Max, Def cmd.data.type |= TOPLEVEL::type::Integer; // default is integer & not learnable if (npart == TOPLEVEL::section::config) { std::cout << "calling config limits" << std::endl; return synth.getRuntime().getConfigLimits(&cmd); } if (npart == TOPLEVEL::section::bank) return value; if (npart == TOPLEVEL::section::main) return synth.getLimits(&cmd); if (npart == TOPLEVEL::section::scales) return synth.microtonal.getLimits(&cmd); if (npart == TOPLEVEL::section::vector) { std::cout << "calling vector limits" << std::endl; return synth.vectorcontrol.getVectorLimits(&cmd); } float min; float max; float def; if (insert == TOPLEVEL::insert::filterGroup) { filterLimit filterLimits; if (kititem == EFFECT::type::dynFilter) { /* * This is somewhat convoluted! * Only for dynFilter we need to find the preset number. * Default frequency and Q are different over the 5 presets. */ CommandBlock effectCmd; memcpy(effectCmd.bytes, cmd.bytes, sizeof(CommandBlock)); effectCmd.data.type = 0; effectCmd.data.source = 0; effectCmd.data.insert = UNUSED; cmd.data.offset = (cmd.data.offset & 15) | (int(effectCmd.data.value) >> 4); effectCmd.data.control = EFFECT::control::preset; commandEffects(effectCmd); } return filterLimits.getFilterLimits(&cmd); } // should prolly move other inserts up here if (effSend >= EFFECT::type::none and effSend < EFFECT::type::count) { LimitMgr limits; return limits.geteffectlimits(&cmd); } if (npart < NUM_MIDI_PARTS) { Part& part{* synth.part[npart]}; if (engine == PART::engine::subSynth && (insert == UNUSED || (insert >= TOPLEVEL::oscillatorGroup && insert <= TOPLEVEL::harmonicBandwidth)) && parameter == UNUSED) { SUBnoteParameters *subpars; subpars = part.kit[kititem].subpars; return subpars->getLimits(&cmd); } if (insert == TOPLEVEL::insert::partEffectSelect || (engine == UNUSED && (kititem == UNUSED || insert == TOPLEVEL::insert::kitGroup))) return part.getLimits(&cmd); if ((insert == TOPLEVEL::insert::kitGroup || insert == UNUSED) && parameter == UNUSED && miscmsg == UNUSED) { if (engine == PART::engine::addSynth || (engine >= PART::engine::addVoice1 && engine < PART::engine::addVoiceModEnd)) { ADnoteParameters* adpars{part.kit[kititem].adpars}; return adpars->getLimits(&cmd); } if (engine == PART::engine::subSynth) { SUBnoteParameters* subpars{part.kit[kititem].subpars}; return subpars->getLimits(&cmd); } if (engine == PART::engine::padSynth) { PADnoteParameters* padpars{part.kit[kititem].padpars}; return padpars->getLimits(&cmd); } // there may be other stuff min = 0; max = 127; def = 0; Log("Using engine defaults"); switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } if (insert >= TOPLEVEL::insert::oscillatorGroup && insert <= TOPLEVEL::insert::harmonicPhase) { return part.kit[0].adpars->VoicePar[0].POscil->getLimits(&cmd); // we also use this for pad limits // as oscillator values identical } if (insert == TOPLEVEL::insert::resonanceGroup || insert == TOPLEVEL::insert::resonanceGraphInsert) { ResonanceLimits resonancelimits; return resonancelimits.getLimits(&cmd); } if (insert == TOPLEVEL::insert::LFOgroup && parameter <= TOPLEVEL::insertType::filter) { LFOlimit lfolimits; return lfolimits.getLFOlimits(&cmd); } switch (insert) { case TOPLEVEL::insert::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: { envelopeLimit envelopeLimits; return envelopeLimits.getEnvelopeLimits(&cmd); } default: break; } min = 0; max = 127; def = 0; Log("Using insert defaults"); switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } // not sure where the following should really be if (npart == TOPLEVEL::section::systemEffects) { min = 0; def = 0; max = 8; switch (control) { case EFFECT::sysIns::toEffect1: case EFFECT::sysIns::toEffect2: case EFFECT::sysIns::toEffect3: max = 127; cmd.data.type |= TOPLEVEL::type::Learnable; break; case EFFECT::sysIns::effectNumber: max = 3; break; case EFFECT::sysIns::effectType: break; case EFFECT::sysIns::effectEnable: def = 1; max = 1; cmd.data.type |= TOPLEVEL::type::Learnable; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } if (npart == TOPLEVEL::section::insertEffects) { min = 0; def = 0; max = 8; switch (control) { case EFFECT::sysIns::effectNumber: max = 7; break; case EFFECT::sysIns::effectType: break; case EFFECT::sysIns::effectDestination: min = -2; def = -1; max = 63; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } if (npart == TOPLEVEL::section::midiIn) { min = 0; max = 127; switch (control) { case PART::control::volume: def = 96; break; case PART::control::midiExpression: def = 127; break; case PART::control::midiSustain: def = 0; break; case PART::control::midiPortamento: def = 0; break; case PART::control::midiFMamp: def = 127; break; default: def = 64; break; } switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } if (npart == TOPLEVEL::section::undoMark) { switch (control) { case MAIN::control::undo: case MAIN::control::redo: return value; // these have no limits! break; } } min = 0; max = 127; def = 0; Log("Unidentified Limit request: using dummy defaults"); switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Interface/InterChange.h000066400000000000000000000165711506652756400204220ustar00rootroot00000000000000/* InterChange.h - General communications Copyright 2016-2020 Will Godfrey Copyright 2021 Will Godfrey, Rainer Hans Liffers Copyright 2022-2025, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef INTERCH_H #define INTERCH_H #include "globals.h" #include "Interface/Data2Text.h" #include "Interface/RingBuffer.h" #include "Interface/GuiDataExchange.h" #include "Params/LFOParams.h" #include "Params/FilterParams.h" #include "Params/EnvelopeParams.h" #include "Params/OscilParameters.h" #include "Synth/Resonance.h" #include #include #include #include #include class DataText; class MasterUI; class SynthEngine; class PADnoteParameters; // used by main.cpp and SynthEngine.cpp extern std::string singlePath; extern int startInstance; /* compile time function log2 as per https://hbfs.wordpress.com/2016/03/22/log2-with-c-metaprogramming */ static constexpr size_t log2 (const size_t n) { return ((n < 2) ? 0 : 1 + log2 (n / 2)); } class InterChange : private DataText { private: static constexpr size_t commandBlockSize = sizeof (CommandBlock); SynthEngine& synth; #ifdef GUI_FLTK std::unique_ptr guiMaster; ///////////////////TODO 1/2024 : retract usage of direct SynthEngine* from UI friend class SynthEngine; #endif public: InterChange(SynthEngine&); ~InterChange(); // shall not be copied or moved or assigned InterChange(InterChange&&) = delete; InterChange(InterChange const&) = delete; InterChange& operator=(InterChange&&) = delete; InterChange& operator=(InterChange const&) = delete; bool Init(); #ifdef GUI_FLTK void createGuiMaster(); void shutdownGui(); #endif CommandBlock commandData; #ifndef YOSHIMI_LV2_PLUGIN RingBuffer <9, log2 (commandBlockSize)> fromCLI; #endif RingBuffer <10, log2 (commandBlockSize)> decodeLoopback; #ifdef GUI_FLTK RingBuffer <10, log2 (commandBlockSize)> fromGUI; RingBuffer <11, log2 (commandBlockSize)> toGUI; #endif RingBuffer <10, log2 (commandBlockSize)> fromMIDI; RingBuffer <10, log2 (commandBlockSize)> returnsBuffer; RingBuffer <4, log2 (commandBlockSize)> muteQueue; GuiDataExchange guiDataExchange; sem_t sortResultsThreadSemaphore; void spinSortResultsThread(); void generateSpecialInstrument(int npart, std::string name); void mediate(); void historyActionCheck(CommandBlock&); void returns(CommandBlock&); void doClearPartInstrument(int npart); bool commandSend(CommandBlock&); float readAllData(CommandBlock&); float buildWindowTitle(CommandBlock&); void resolveReplies(CommandBlock&); std::string resolveText(CommandBlock&, bool addValue); void testLimits(CommandBlock&); float returnLimits(CommandBlock&); void Log(std::string const& msg); std::atomic syncWrite; std::atomic lowPrioWrite; private: void* sortResultsThread(); static void* _sortResultsThread(void* arg); pthread_t sortResultsThreadHandle; void muteQueueWrite(CommandBlock&); void indirectTransfers(CommandBlock&, bool noForward = false); int indirectVector(CommandBlock&, uchar& newMsg, bool& guiTo, std::string& text); int indirectMidi (CommandBlock&, uchar& newMsg, bool& guiTo, std::string& text); int indirectScales(CommandBlock&, uchar& newMsg, bool& guiTo, std::string& text); int indirectMain (CommandBlock&, uchar& newMsg, bool& guiTo, std::string& text, float& valuef); int indirectBank (CommandBlock&, uchar& newMsg, bool& guiTo, std::string& text); int indirectConfig(CommandBlock&, uchar& newMsg, bool& guiTo, std::string& text); int indirectPart (CommandBlock&, uchar& newMsg, bool& guiTo, std::string& text); std::string formatScales(std::string text); std::string formatKeys(std::string text); unsigned int swapRoot1; unsigned int swapBank1; unsigned int swapInstrument1; bool processAdd(CommandBlock&, SynthEngine&); bool processVoice(CommandBlock&, SynthEngine&); bool processSub(CommandBlock&, SynthEngine&); bool processPad(CommandBlock&); void commandMidi(CommandBlock&); void vectorClear(int Nvector); void commandVector(CommandBlock&); void commandMicrotonal(CommandBlock&); void commandConfig(CommandBlock&); void commandMain(CommandBlock&); void commandBank(CommandBlock&); void commandPart(CommandBlock&); void commandControllers(CommandBlock&, bool write); void commandAdd(CommandBlock&); void commandAddVoice(CommandBlock&); void commandSub(CommandBlock&); bool commandPad(CommandBlock&, PADnoteParameters& pars); void commandOscillator(CommandBlock&, OscilParameters *oscil); void commandResonance(CommandBlock&, Resonance *respar); void commandLFO(CommandBlock&); void lfoReadWrite(CommandBlock&, LFOParams *pars); void commandFilter(CommandBlock&); void filterReadWrite(CommandBlock&, FilterParams*, uchar* velsnsamp, uchar* velsns); void commandEnvelope(CommandBlock&); void envelopeReadWrite(CommandBlock&, EnvelopeParams*); void envelopePointAdd(CommandBlock&, EnvelopeParams*); void envelopePointDelete(CommandBlock&, EnvelopeParams*); void envelopePointChange(CommandBlock&, EnvelopeParams*); void commandSysIns(CommandBlock&); void add2undo(CommandBlock&, bool& noteSeen, bool group = false); void addFixed2undo(CommandBlock&); void undoLast(CommandBlock& candidate); std::list undoList; std::list redoList; CommandBlock lastEntry; CommandBlock undoMarker; bool undoLoopBack; void manageDisplay(CommandBlock& cmd); bool setUndo; bool setRedo; bool undoStart; int cameFrom; // 0 = new command, 1 = undo, 2 = redo public: bool noteSeen; void undoRedoClear(); /* * this is made public specifically so that it can be * reached from SynthEngine by jack freewheeling NRPNs. * This avoids unnecessary (error prone) duplication. */ void commandEffects(CommandBlock&); private: bool commandSendReal(CommandBlock&); int searchInst; int searchBank; int searchRoot; std::bitset<64> partsChanged; }; #endif yoshimi-2.3.5.1/src/Interface/InterfaceAnchor.h000066400000000000000000000036411506652756400212600ustar00rootroot00000000000000/* InterfaceAnchor.h - root context and attachment point for UI communication Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef INTERFACE_ANCHOR_H #define INTERFACE_ANCHOR_H //#include "globals.h" #include "Interface/GuiDataExchange.h" //#include "Interface/RingBuffer.h" //#include "Misc/Hash.h" //#include //#include //#include class SynthEngine; /** * Anchor context to bootstrap the communication of Core and GUI. * This is a copyable data record that will be published into the GUI * through the GuiDataExchange system. Data transported up this way * allow to attach further, more fine-grained communication and provides * base information required for the GUI to connect to the core. */ struct InterfaceAnchor { unsigned int synthID{0}; SynthEngine* synth{nullptr}; ///////////////////TODO 1/2024 : retract usage of direct SynthEngine* from UI ///////////////////TODO 1/2024 : can transport further generic info up into the UI here using Tag = GuiDataExchange::RoutingTag; Tag sysEffectParam; Tag sysEffectEQ; Tag insEffectParam; Tag insEffectEQ; Tag partEffectParam; Tag partEffectEQ; //...........more connection tags here.... }; #endif /*INTERFACE_ANCHOR_H*/ yoshimi-2.3.5.1/src/Interface/MidiDecode.cpp000066400000000000000000000576031506652756400205550ustar00rootroot00000000000000/* MidiDecode.cpp Copyright 2017-2020, Will Godfrey Copyright 2021, Will Godfrey, Rainer Hans Liffers This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include "Interface/MidiDecode.h" #include "Interface/InterChange.h" #include "Misc/SynthEngine.h" #include "Misc/FormatFuncs.h" using func::asString; using func::asHexString; MidiDecode::MidiDecode(SynthEngine *_synth) : synth(_synth){ } void MidiDecode::midiProcess(uchar par0, uchar par1, uchar par2, bool in_place, bool inSync) { (void)inSync; // currently unused (may need this later) uchar channel; // , note, velocity; int ctrltype, par; channel = par0 & 0x0F; uint ev = par0 & 0xF0; par = 0; switch (ev) { case 0xA0: // key aftertouch ctrltype = MIDI::CC::keyPressure; par = par1 | (par2<< 8); setMidiController(channel, ctrltype, par, in_place); break; case 0xB0: // controller ctrltype = par1; par = par2; setMidiController(channel, ctrltype, par, in_place); break; case 0xC0: // program change ctrltype = MIDI::CC::programchange; par = par1; setMidiProgram(channel, par, in_place); break; case 0xD0: // channel aftertouch ctrltype = MIDI::CC::channelPressure; par = par1; setMidiController(channel, ctrltype, par, in_place); break; case 0xE0: // pitch bend ctrltype = MIDI::CC::pitchWheel; par = (par2 << 7) | par1; setMidiController(channel, ctrltype, par, in_place); break; default: // wot, more? if (synth->getRuntime().monitorCCin) synth->getRuntime().Log("Unsupported event: 0x" + asHexString(int(par0)), _SYS_::LogNotSerious); break; } } void MidiDecode::setMidiController(uchar ch, int ctrl, int param, bool in_place, bool inSync) { if (synth->getRuntime().monitorCCin) { std::string ctltype; switch (ctrl) { case MIDI::CC::null: ctltype = "Ignored"; break; case MIDI::CC::programchange: ctltype = "program"; break; case MIDI::CC::pitchWheel: ctltype = "Pitchwheel"; break; case MIDI::CC::channelPressure: ctltype = "Ch Press"; break; case MIDI::CC::keyPressure: ctltype = "Key Press"; break; default: ctltype = asString(ctrl); break; } synth->getRuntime().Log("Chan " + asString(((int) ch) + 1) + " CC " + ctltype + " Value " + asString(param)); } if (ctrl == synth->getRuntime().midi_bank_root) { setMidiBankOrRootDir(param, in_place, true); return; } if (ctrl == synth->getRuntime().midi_bank_C) { setMidiBankOrRootDir(param, in_place); return; } if (ctrl == synth->getRuntime().midi_upper_voice_C) { // it's really an upper set program change setMidiProgram(ch, (param & 0x1f) | 0x80, in_place); return; } if (synth->getRuntime().enable_NRPN) { if (nrpnDecode(ch, ctrl, param, in_place)) return; } uchar vecChan; if (synth->getRuntime().channelSwitchType == 1) vecChan = synth->getRuntime().channelSwitchValue; // force vectors to obey channel switcher else vecChan = ch; if (synth->getRuntime().vectordata.Enabled[vecChan] && synth->getRuntime().numAvailableParts > NUM_MIDI_CHANNELS) { // vector control is direct to parts if (nrpnRunVector(vecChan, ctrl, param, inSync)) return; } // pick up a drop-through if CC doesn't match the above if (ctrl == MIDI::CC::resetAllControllers && synth->getRuntime().ignoreResetCCs == true) { //synth->getRuntime().Log("Reset controllers ignored"); return; } /* * set / run midi learn will pass 'in_place' so entire operation * can be done in MidiLearn.cpp * return true if blocking further calls * * need to work out some kind of loop-back so optional * vector control CCs can be picked up. * * Some controller values are >= 640 so they will be ignored by * later calls, but are passed as 128+ for this call. */ { /* using std::chrono::steady_clock; using Dur = std::chrono::duration; auto start = steady_clock::now(); */ if (synth->midilearn.runMidiLearn(param, ctrl & 0xff, ch, in_place)) return; // blocking while learning /* Dur duration = steady_clock::now () - start; std::cout << "MidiLearn: Δt = " << duration.count() << "µs" << std::endl; */ } if ((ctrl == MIDI::CC::omniOn or ctrl == MIDI::CC::omniOff) and not synth->getRuntime().enableOmni) { return; } /* * This is done here instead of in 'setMidi' so MidiLearn * handles all 14 bit values the same. */ if (ctrl == MIDI::CC::pitchWheel) { param -= 8192; sendMidiCC(inSync, ch, ctrl, param); return; } // do what's left! if (ctrl < 0x80 || ctrl == MIDI::CC::channelPressure || ctrl == MIDI::CC::keyPressure) // don't want to pick up strays sendMidiCC(inSync, ch, ctrl, param); } void MidiDecode::sendMidiCC(bool inSync, uchar chan, int type, short par) { if (inSync) // no CLI or GUI updates needed { synth->SetController(chan, type, par); return; } CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.value = par; putData.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; putData.data.source = TOPLEVEL::action::toAll; putData.data.control = MIDI::control::controller; putData.data.part = TOPLEVEL::section::midiIn; putData.data.kit = chan; putData.data.engine = type; synth->midilearn.writeMidi(putData, false); } /* * nrpnDecode parameters are only ever seen by other MIDI controls * so don't need buffering. * * However nrpnProcessData is handling some 'live' data and is * buffered where needed. */ bool MidiDecode::nrpnDecode(uchar ch, int ctrl, int param, bool in_place) { int nLow; int nHigh; if (ctrl == MIDI::CC::nrpnLSB || ctrl == MIDI::CC::nrpnMSB) { if (ctrl == MIDI::CC::nrpnLSB) { nHigh = synth->getRuntime().nrpnH; nLow = param; synth->getRuntime().nrpnL = nLow; if (nHigh == 0x44 && (nLow == 0x44 || nLow == 0x45)) // shutdown controls { if (nLow == 0x45) synth->getRuntime().exitType = FORCED_EXIT; synth->getRuntime().runSynth = false; return true; // bye bye everyone } if (nHigh == 0x41 || nHigh == 0x42) // Solo controls { if (nHigh == 0x41) // type - must set this first { if (nLow > MIDI::SoloType::Channel) nLow = MIDI::SoloType::Disabled; synth->getRuntime().channelSwitchType = nLow; // row/column/loop/channel } else // CC { if (nLow < MIDI::CC::allSoundOff) synth->getRuntime().channelSwitchCC = nLow; } return true; } } else // MSB { nHigh = param; nLow = synth->getRuntime().nrpnL; synth->getRuntime().nrpnH = nHigh; //synth->getRuntime().Log("Set nrpn MSB to " + asString(nHigh)); if (nHigh >= 0x41 && nHigh <= 0x44) // set shortform { synth->getRuntime().nrpnL = 0x7f; return true; } } synth->getRuntime().dataL = 0x80; // we've changed the NRPN synth->getRuntime().dataH = 0x80; // so these are now invalid synth->getRuntime().nrpnActive = (nLow < 0x7f && nHigh < 0x7f); // synth->getRuntime().Log("Status nrpn " + asString(synth->getRuntime().nrpnActive)); return true; } if (synth->getRuntime().nrpnActive) { if (ctrl == MIDI::CC::dataINC || ctrl == MIDI::CC::dataDEC) { // translate these to MIDI::CC::dataLSB and MIDI::CC::dataMSB int dHigh = synth->getRuntime().dataH; int dLow = synth->getRuntime().dataL; bool msbPar = (param >= 0x40); param &= 0x3f; if (ctrl == MIDI::CC::dataINC) { if (msbPar) { dHigh &= 0x7f; // clear disabled state param += dHigh; ctrl = MIDI::CC::dataMSB; // change controller type } else { dLow &= 0x7f; // clear disabled state param += dLow; ctrl = MIDI::CC::dataLSB; // change controller type } if (param > 0x7f) param = 0x7f; } else { // data decrement if (msbPar) { param = dHigh - param; ctrl = MIDI::CC::dataMSB; // change controller type } else { param = dLow - param; ctrl = MIDI::CC::dataLSB; // change controller type } if (param < 0) param = 0; } } if (ctrl == MIDI::CC::dataLSB || ctrl == MIDI::CC::dataMSB) { nrpnProcessData(ch, ctrl, param, in_place); return true; } } return false; } bool MidiDecode::nrpnRunVector(uchar ch, int ctrl, int param, bool inSync) { int Xopps = synth->getRuntime().vectordata.Xfeatures[ch]; int Yopps = synth->getRuntime().vectordata.Yfeatures[ch]; int p_rev = 0x7f - param; int swap1; int swap2; uchar type; if (ctrl == synth->getRuntime().vectordata.Xaxis[ch]) { if (Xopps & 1) // fixed as volume { sendMidiCC(inSync, ch | 0x80, MIDI::CC::volume, 0x7f - (p_rev * p_rev / 0x7f)); sendMidiCC(inSync, ch | 0x90, MIDI::CC::volume, 0x7f - (param * param / 0x7f)); } if (Xopps & 2) // default is pan { type = synth->getRuntime().vectordata.Xcc2[ch]; swap1 = (Xopps & 0x10) | 0x80; swap2 = swap1 ^ 0x10; sendMidiCC(inSync, ch | swap1, type, param); sendMidiCC(inSync, ch | swap2, type, p_rev); } if (Xopps & 4) // default is 'brightness' { type = synth->getRuntime().vectordata.Xcc4[ch]; swap1 = ((Xopps >> 1) & 0x10) | 0x80; swap2 = swap1 ^ 0x10; sendMidiCC(inSync, ch | swap1, type, param); sendMidiCC(inSync, ch | swap2, type, p_rev); } if (Xopps & 8) // default is mod wheel { type = synth->getRuntime().vectordata.Xcc8[ch]; swap1 = ((Xopps >> 2) & 0x10) | 0x80; swap2 = swap1 ^ 0x10; sendMidiCC(inSync, ch | swap1, type, param); sendMidiCC(inSync, ch | swap2, type, p_rev); } return true; } else if (ctrl == synth->getRuntime().vectordata.Yaxis[ch]) { // if Y hasn't been set these commands will be ignored if (Yopps & 1) // fixed as volume { sendMidiCC(inSync, ch | 0xa0, MIDI::CC::volume, 0x7f - (p_rev * p_rev / 0x7f)); sendMidiCC(inSync, ch | 0xb0, MIDI::CC::volume, 0x7f - (param * param / 0x7f)); } if (Yopps & 2) // default is pan { type = synth->getRuntime().vectordata.Ycc2[ch]; swap1 = (Yopps & 0x10) | 0xa0; swap2 = swap1 ^ 0x10; sendMidiCC(inSync, ch | swap1, type, param); sendMidiCC(inSync, ch | swap2, type, p_rev); } if (Yopps & 4) // default is 'brightness' { type = synth->getRuntime().vectordata.Ycc4[ch]; swap1 = ((Yopps >> 1) & 0x10) | 0xa0; swap2 = swap1 ^ 0x10; sendMidiCC(inSync, ch | swap1, type, param); sendMidiCC(inSync, ch | swap2, type, p_rev); } if (Yopps & 8) // default is mod wheel { type = synth->getRuntime().vectordata.Ycc8[ch]; swap1 = ((Yopps >> 2) & 0x10) | 0xa0; swap2 = swap1 ^ 0x10; sendMidiCC(inSync, ch | swap1, type, param); sendMidiCC(inSync, ch | swap2, type, p_rev); } return true; } return false; } void MidiDecode::nrpnProcessData(uchar chan, int type, int par, bool in_place) { int nHigh = synth->getRuntime().nrpnH; int nLow = synth->getRuntime().nrpnL; bool noHigh = (synth->getRuntime().dataH > 0x7f); if (type == MIDI::CC::dataLSB) { synth->getRuntime().dataL = par; if (noHigh) return; } if (type == MIDI::CC::dataMSB) { synth->getRuntime().dataH = par; if (noHigh && synth->getRuntime().dataL <= 0x7f) par = synth->getRuntime().dataL; else return; // we're currently using MSB as parameter not a value } /* * All the above runaround performance is to deal with a data LSB * arriving either before or after the MSB and immediately after * a new NRPN has been set. After this, running data values expect * MSB sub parameter before LSB value until the next full NRPN. */ int dHigh = synth->getRuntime().dataH; // For NRPNs midi learn must come before everything else if (synth->midilearn.runMidiLearn(dHigh << 7 | par, MIDI::CC::identNRPN | (nHigh << 7) | nLow , chan, in_place)) return; // blocking while learning if (nLow < nHigh && (nHigh == 4 || nHigh == 8 )) { if (type == MIDI::CC::dataLSB) synth->getRuntime().dataL = par; else synth->getRuntime().dataH = par; if (synth->getRuntime().dataL <= 0x7f && synth->getRuntime().dataL <= 0x7f) synth->SetZynControls(in_place); return; } if (nHigh == 0x60) if (nrpnProcessHistory(nLow, dHigh, par, in_place)) return; if (nHigh != 64 && nLow < 0x7f) { synth->getRuntime().Log("Go away NRPN 0x" + asHexString(nHigh) + " " + asHexString(nLow) +" We don't know you!", _SYS_::LogNotSerious); // done this way to ensure we see both bytes even if nHigh is zero synth->getRuntime().nrpnActive = false; // we were sent a turkey! return; } if (nLow == 0) // direct part change nrpnDirectPart(dHigh, par); else if (nLow == 1) // it's vector control nrpnSetVector(dHigh, chan, par); else if (nLow == 2) // system settings synth->SetSystemValue(dHigh, par); // *** CHANGE } bool MidiDecode::nrpnProcessHistory(uchar nLow, uchar dHigh, uchar dLow, bool in_place) { if (nLow > TOPLEVEL::XML::MLearn) return false; if (dLow >= MAX_HISTORY) return true;// not an error but not wanted anyway! if (in_place) { // not done yet return true; } CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.type = TOPLEVEL::type::Integer; putData.data.source = TOPLEVEL::action::fromMIDI; putData.data.control = MAIN::control::loadFileFromList; putData.data.part = TOPLEVEL::section::main; putData.data.kit = nLow; putData.data.engine = dLow; if (nLow == TOPLEVEL::XML::Vector && dHigh < NUM_MIDI_CHANNELS) putData.data.insert = dHigh; // otherwise set by file else if (nLow == TOPLEVEL::XML::Instrument) { uchar tmp = synth->getRuntime().vectordata.Part; if (dHigh >= NUM_MIDI_PARTS && tmp < NUM_MIDI_PARTS) putData.data.insert = tmp; // last seen by part NRPN else if (dHigh < NUM_MIDI_PARTS) putData.data.insert = dHigh; else return true; // not an error but undefined } synth->interchange.fromMIDI.write(putData.bytes); return true; } void MidiDecode::nrpnDirectPart(int dHigh, int par) { CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); bool partSet = false; switch (dHigh) { case 0: // set part number to use for later calls if (par < int(synth->getRuntime().numAvailableParts)) { synth->getRuntime().dataL = par; synth->getRuntime().vectordata.Part = par; } else // It's bad. Kill it { synth->getRuntime().dataL = 0x80; synth->getRuntime().dataH = 0x80; } partSet = true; break; case 1: // Program Change setMidiProgram(synth->getRuntime().vectordata.Part | 0x80, par); partSet = true; break; case 2: // Set controller number synth->getRuntime().vectordata.Controller = par; synth->getRuntime().dataL = par; partSet = true; break; case 3: // Set controller value setMidiController(synth->getRuntime().vectordata.Part | 0x80, synth->getRuntime().vectordata.Controller, par, false); partSet = true; break; case 4: // Set part's channel number putData.data.value = par; putData.data.control = PART::control::midiChannel; break; case 5: // Set part's audio destination if (par > 0 and par < 4) { putData.data.value = par; putData.data.control = PART::control::audioDestination; //putData.data.parameter = 192; // this doesn't seem necessary } break; case 8: putData.data.control = PART::control::partToSystemEffect1; putData.data.value = par; break; case 9: putData.data.control = PART::control::partToSystemEffect2; putData.data.value = par; break; case 10: putData.data.control = PART::control::partToSystemEffect3; putData.data.value = par; break; case 11: putData.data.control = PART::control::partToSystemEffect4; putData.data.value = par; break; case 64: // key shift par -= 64; if (par < MIN_KEY_SHIFT) par = MIN_KEY_SHIFT; else if (par > MAX_KEY_SHIFT) par = MAX_KEY_SHIFT; putData.data.value = par; putData.data.control = PART::control::keyShift; break; default: return; break; } if (dHigh < 4) return; if (!partSet) putData.data.part = synth->getRuntime().vectordata.Part; putData.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; putData.data.source = TOPLEVEL::action::toAll; synth->midilearn.writeMidi(putData, false); } void MidiDecode:: nrpnSetVector(int dHigh, uchar chan, int par) { if (synth->vectorInit(dHigh, chan, par)) return; switch (dHigh) { /* * These have to go through the program change * thread otherwise they could block following * MIDI messages. */ case 4: setMidiProgram(chan | 0x80, par); break; case 5: setMidiProgram(chan | 0x90, par); break; case 6: setMidiProgram(chan | 0xa0, par); break; case 7: setMidiProgram(chan | 0xb0, par); break; default: synth->vectorSet(dHigh, chan, par); break; } } //bank change and root dir change change share the same thread //to make changes consistent void MidiDecode::setMidiBankOrRootDir(uint bank_or_root_num, bool in_place, bool setRootDir) { if (setRootDir) { if (bank_or_root_num == synth->getRuntime().currentRoot) return; // nothing to do! } else { if (bank_or_root_num == synth->getRuntime().currentBank) return; // still nothing to do! } if (in_place) { if (!setRootDir) synth->setRootBank(UNUSED, bank_or_root_num, true); else synth->setRootBank(bank_or_root_num, UNUSED, true); return; } CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.value = 0xff; putData.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; putData.data.source = TOPLEVEL::action::toAll; putData.data.control = MIDI::control::bankChange; putData.data.part = TOPLEVEL::section::midiIn; putData.data.kit = 0; putData.data.parameter = 0xc0; if (setRootDir) putData.data.insert = bank_or_root_num; else putData.data.engine = bank_or_root_num; synth->midilearn.writeMidi(putData, false); } void MidiDecode::setMidiProgram(uchar ch, int prg, bool in_place) { if (not synth->getRuntime().enableProgChange) return; uint maxparts = synth->getRuntime().numAvailableParts; if (ch >= maxparts) return; CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.value = prg; putData.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; if (in_place) { putData.data.source = TOPLEVEL::action::lowPrio; putData.data.control = MAIN::control::refreshInstrumentUI; putData.data.part = TOPLEVEL::section::main; } else { putData.data.source = TOPLEVEL::action::toAll; putData.data.control = MIDI::control::instrument; putData.data.part = TOPLEVEL::section::midiIn; } //putData.data.parameter = 0xc0; /* * This is a bit slow as we send each part individually * but it is the simplest way to ensure partonoff doesn't * get out of step. * * Changes won't normally happen while MIDI is incoming * on the same channel. */ if (ch < NUM_MIDI_CHANNELS) { for (uint npart = 0; npart < maxparts; ++ npart) { if (ch == synth->part[npart]->Prcvchn or synth->part[npart]->isOmni()) { putData.data.kit = npart; if (in_place) { synth->partonoffLock(npart, -1); synth->setProgramFromBank(putData, true); synth->interchange.decodeLoopback.write(putData.bytes); } else { synth->midilearn.writeMidi(putData, false); } } } return; } else { putData.data.kit = ch & 0x3f; if (in_place) { synth->partonoffLock(ch, -1); synth->setProgramFromBank(putData, true); synth->interchange.decodeLoopback.write(putData.bytes); } else synth->midilearn.writeMidi(putData, false); } } yoshimi-2.3.5.1/src/Interface/MidiDecode.h000066400000000000000000000036601506652756400202140ustar00rootroot00000000000000/* MidiDecode.h Copyright 2017-2020, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef MIDIDECODE_H #define MIDIDECODE_H #include "Interface/InterChange.h" #include class SynthEngine; class MidiDecode { public: ~MidiDecode() = default; MidiDecode(SynthEngine *_synth); void midiProcess(uchar par0, uchar par1, uchar par2, bool in_place, bool inSync = false); void setMidiBankOrRootDir(uint bank_or_root_num, bool in_place = false, bool setRootDir = false); void setMidiProgram(uchar ch, int prg, bool in_place = false); private: void setMidiController(uchar ch, int ctrl, int param, bool in_place = false, bool inSync = false); void sendMidiCC(bool inSync, uchar chan, int type, short par); bool nrpnDecode(uchar ch, int ctrl, int param, bool in_place); bool nrpnRunVector(uchar ch, int ctrl, int param, bool inSync); void nrpnProcessData(uchar chan, int type, int par, bool in_place); bool nrpnProcessHistory(uchar nLow, uchar dHigh, uchar dLow, bool in_place); void nrpnDirectPart(int dHigh, int par); void nrpnSetVector(int dHigh, uchar chan, int par); SynthEngine *synth; }; #endif yoshimi-2.3.5.1/src/Interface/MidiLearn.cpp000066400000000000000000001036211506652756400204230ustar00rootroot00000000000000/* MidiLearn.cpp Copyright 2016-2020, Will Godfrey Copyright 2021-2023, Will Godfrey, Rainer Hans Liffers This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "Interface/MidiLearn.h" #include "Interface/InterChange.h" #include "Interface/RingBuffer.h" #include "Misc/FileMgrFuncs.h" #include "Misc/FormatFuncs.h" #include "Misc/TextMsgBuffer.h" #include "Misc/SynthEngine.h" #include "Misc/XMLStore.h" #include #include #include #include #include #include #include using std::this_thread::sleep_for; using std::chrono_literals::operator ""us; using file::isRegularFile; using file::make_legit_filename; using file::setExtension; using func::asString; using func::asHexString; using std::cout; using std::endl; using std::to_string; using std::string; using std::vector; using std::list; enum scan : int { noList = -3, listEnd, listBlocked}; namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); const int DECODE_MODE = 1; /* * 0 = use legacy numbers * 1 = decode from text * 2 = use legacy numbers report difference * 3 = decode from text report difference */ } MidiLearn::MidiLearn(SynthEngine& synthInstance) : synth(synthInstance) , data{} , learning{false} , midi_list{} , learnedName{} , learnTransferBlock{} { } void MidiLearn::setTransferBlock(CommandBlock& cmd) { memcpy(learnTransferBlock.bytes, cmd.bytes, sizeof(learnTransferBlock)); learnedName = resolveAll(synth, cmd, false); learning = true; synth.getRuntime().Log("Learning " + learnedName); updateGui(MIDILEARN::control::sendLearnMessage); } bool MidiLearn::runMidiLearn(int intVal, ushort CC, uchar chan, bool in_place) { if (learning) { insertLine(CC, chan); return true; // block while learning } if (findSize() == 0) return false; // don't bother if there's no list! int lastpos = scan::listBlocked; LearnBlock foundEntry; bool firstLine = true; while (lastpos != scan::listEnd) { lastpos = findEntry(midi_list, lastpos, CC, chan, foundEntry, false); if (lastpos == scan::noList) return false; int status = foundEntry.status; if (status & 4) // it's muted continue; /* * Some of the following conversions seem strange but are * needed to ensure a control range that is an exact * equivalent of 0 to 127 under all conditions */ float value; // needs to be refetched each loop if (CC >= MIDI::CC::identNRPN || CC == MIDI::CC::pitchWheelAdjusted) { if (status & 16) // 7 bit NRPN value = float(intVal & 0x7f); else value = intVal / 128.999f; // convert from 14 bit } else if (CC != MIDI::CC::keyPressureAdjusted) value = float(intVal); else value = float(intVal >> 8); float minIn = foundEntry.min_in / 1.5748f; float maxIn = foundEntry.max_in / 1.5748f; if (minIn > maxIn) { value = 127 - value; std::swap(minIn, maxIn); } if (minIn == maxIn) { if (value <= minIn) value = 0; else value = 127; } else if (status & 2) // limit { if (value < minIn) value = minIn; else if (value > maxIn) value = maxIn; } else // compress value = ((maxIn - minIn) * value / 127.0f) + minIn; int minOut = foundEntry.min_out; int maxOut = foundEntry.max_out; if (maxOut - minOut != 127) // its a range change value = minOut +((maxOut - minOut) * value / 127.0f); else if (minOut != 0) // it's just a shift value += minOut; CommandBlock resultCmd; memcpy(resultCmd.bytes, foundEntry.frame.bytes, sizeof(CommandBlock)); resultCmd.data.value = value; resultCmd.data.source = TOPLEVEL::action::toAll; resultCmd.data.type = TOPLEVEL::type::Write | (foundEntry.frame.data.type & TOPLEVEL::type::Integer); // publish result command into MIDI stream with original integer / float type if (writeMidi(resultCmd, in_place)) { if (firstLine and not in_place) {// we only want to send an activity once // and it's not relevant to jack freewheeling firstLine = false; if (CC >= MIDI::CC::identNRPN) resultCmd.data.type |= 0x10; // mark as NRPN resultCmd.data.control = MIDILEARN::control::reportActivity; resultCmd.data.part = TOPLEVEL::section::midiLearn; resultCmd.data.kit = (CC & 0xff); resultCmd.data.engine = chan; writeMidi(resultCmd, in_place); } } if (lastpos == scan::listBlocked) // blocking all of this CC/chan pair return true; } return false; } bool MidiLearn::writeMidi(CommandBlock& cmd, bool in_place) { cmd.data.source |= TOPLEVEL::action::fromMIDI; uint tries{0}; bool ok{true}; if (in_place) { synth.interchange.commandSend(cmd); synth.interchange.returns(cmd); } else { do { ++ tries; ok = synth.interchange.fromMIDI.write(cmd.bytes); if (not ok) sleep_for(1us); // we can afford a short delay for buffer to clear } while (not ok and tries < 3); if (not ok) synth.getRuntime().Log("MidiLearn: congestion on MIDI->Engine"); } return ok; } /* * This will only be called by incoming midi. It is the only function that * needs to be really quick */ int MidiLearn::findEntry(list& midi_list, int lastpos, ushort CC, uchar chan, LearnBlock& block, bool show) { int newpos = 0; // 'last' comes in at listBlocked for the first call list::iterator it = midi_list.begin(); while (newpos <= lastpos && it != midi_list.end()) { ++ it; ++ newpos; } if (it == midi_list.end()) return scan::noList; while ((CC != it->CC || (it->chan != 16 && chan != it->chan)) && it != midi_list.end()) { ++ it; ++ newpos; } if (it == midi_list.end()) return scan::noList; while (CC == it->CC && it != midi_list.end()) { if ((it->chan >= 16 || chan == it->chan) && CC == it->CC) { if (show) synth.getRuntime().Log("Found line " + findName(*it) + " at " + to_string(newpos)); // a test! block.chan = it->chan; block.CC = it->CC; block.min_in = it->min_in; block.max_in = it->max_in; block.status = it->status; block.min_out = it->min_out; block.max_out = it->max_out; block.frame.data = it->frame.data; if ((it->status & 5) == 1) // blocked, not muted return scan::listBlocked; // don't allow any more of this CC and channel; return newpos; } ++ it; ++ newpos; } return scan::listEnd; } int MidiLearn::findSize() { return int(midi_list.size()); } void MidiLearn::listLine(int lineNo) { list::iterator it = midi_list.begin(); int found = 0; if (midi_list.empty()) { synth.getRuntime().Log("No learned lines"); return; } while (it != midi_list.end() && found < lineNo) { ++ it; ++ found; } if (it == midi_list.end()) { synth.getRuntime().Log("No entry for number " + to_string(lineNo + 1)); return; } else { int status = it->status; string mute = ""; if (status & 4) mute = " muted"; string limit = ""; if (status & 2) limit = " limiting"; string block = ""; if (status & 1) block = " blocking"; string nrpn = ""; if (status & 8) { nrpn = " NRPN"; if (status & 16) nrpn += " sevenBit"; } string chan = " Chan "; if ((it->chan) >= NUM_MIDI_CHANNELS) chan += "All"; else chan += to_string(int(it->chan + 1)); string CCtype; int CC = it->CC; if (CC < 0xff) CCtype = to_string(CC); else CCtype = asHexString((CC >> 7) & 0x7f) + asHexString(CC & 0x7f) + " h"; synth.getRuntime().Log("Line " + to_string(lineNo + 1) + mute + " CC " + CCtype + chan + " Min " + asString(float(it->min_in / 2.0f)) + "%" + " Max " + asString(float(it->max_in / 2.0f)) + "%" + limit + block + nrpn + " " + findName(*it)); } } void MidiLearn::listAll(list& msg_buf) { if (midi_list.empty()) { msg_buf.push_back("No learned lines"); return; } string CCtype; int CC; msg_buf.push_back("Midi learned:"); uint lineNo{0}; for (LearnBlock& block : midi_list) { CC = block.CC; if (CC < 0xff) CCtype = to_string(CC); else CCtype = asHexString((CC >> 7) & 0x7f) + asHexString(CC & 0x7f) + " h"; string chan = " Chan "; if ((block.chan) >= NUM_MIDI_CHANNELS) chan += "All"; else chan += to_string(uint(block.chan + 1)); msg_buf.push_back("Line " + to_string(lineNo + 1) + " CC " + CCtype + chan + " " + findName(block)); ++ lineNo; } } bool MidiLearn::remove(int itemNumber) { list::iterator it = midi_list.begin(); int found = 0; while (found < itemNumber && it != midi_list.end()) { ++ found; ++ it; } if (it != midi_list.end()) { midi_list.erase(it); return true; } return false; } void MidiLearn::generalOperations(CommandBlock& cmd) { int value = cmd.data.value; uchar type = cmd.data.type; uchar control = cmd.data.control; // uchar part = cmd.data.part; uint kit = cmd.data.kit; // may need to set as an NRPN uchar engine = cmd.data.engine; uchar insert = cmd.data.insert; uchar parameter = cmd.data.parameter; uchar offset = cmd.data.offset; uchar par2 = cmd.data.miscmsg; if (control == MIDILEARN::control::sendRefreshRequest) { updateGui(); return; } if (control == MIDILEARN::control::clearAll) { midi_list.clear(); updateGui(); synth.getRuntime().Log("List cleared"); return; } string name; if (control == MIDILEARN::control::loadList) { name = (textMsgBuffer.fetch(par2)); if (loadList(name)) { updateGui(); synth.getRuntime().Log("Loaded " + name); } synth.getRuntime().finishedCLI = true; return; } if (control == MIDILEARN::control::loadFromRecent) { int pos = 0; vector& listtype{synth.getHistory(TOPLEVEL::XML::MLearn)}; vector::iterator it = listtype.begin(); while (it != listtype.end() && pos != value) { ++ it; ++ pos; } if (it == listtype.end()) { synth.getRuntime().Log("No entry for number " + to_string(int(value + 1))); } else { name = *it; if (loadList(name)) synth.getRuntime().Log("Loaded " + name); updateGui(); } synth.getRuntime().finishedCLI = true; return; } if (control == MIDILEARN::control::saveList) { name = (textMsgBuffer.fetch(par2)); if (saveList(name)) synth.getRuntime().Log("Saved " + name); synth.getRuntime().finishedCLI = true; return; } if (control == MIDILEARN::control::cancelLearn) { learning = false; synth.getRuntime().finishedCLI = true; synth.getRuntime().Log("Midi Learn cancelled"); updateGui(MIDILEARN::control::cancelLearn); return; } // line controls LearnBlock entry; int lineNo = 0; list::iterator it = midi_list.begin(); it = midi_list.begin(); while (lineNo < value && it != midi_list.end()) { ++ it; ++lineNo; } string lineName; if (it == midi_list.end()) { synth.getRuntime().Log("Line " + to_string(lineNo + 1) + " not found"); return; } if (insert == UNUSED) // don't change insert = it->min_in; else lineName = "Min = " + asString(float(insert / 2.0f)) + "%"; if (parameter == UNUSED) parameter = it->max_in; else lineName = "Max = " + asString(float(parameter / 2.0f)) + "%"; if (kit == UNUSED || it->CC > 0xff) // might be an NRPN kit = it->CC; // remember NRPN has a high bit set else lineName = "CC = " + to_string(int(kit)); if (engine == UNUSED) engine = it->chan; else { if (engine == 16) lineName = "Chan = All"; else lineName = "Chan = " + to_string(int(engine) + 1); } if (control == MIDILEARN::control::CCorChannel) { bool moveLine = true; list::iterator nextit = it; list::iterator lastit = it; ++ nextit; -- lastit; if (it == midi_list.begin() && nextit->CC >= kit) { if (nextit->CC > kit || nextit->chan >= engine) moveLine = false; } else if (nextit == midi_list.end() && lastit->CC <= kit) { if (lastit->CC < kit || lastit->chan <= engine) moveLine = false; } // here be dragons :( else if (kit > it->CC) { if (nextit->CC > kit) moveLine = false; } else if (kit < it->CC) { if (lastit->CC < kit) moveLine = false; } else if (engine > it->chan) { if (nextit->CC > kit || nextit->chan >= engine) moveLine = false; } else if (engine < it->chan) { if (lastit->CC < kit || lastit->chan <= engine) moveLine = false; } if (!moveLine) control = MIDILEARN::control::ignoreMove; // change this as we're not moving the line } if (control == MIDILEARN::control::deleteLine) { remove(value); updateGui(); synth.getRuntime().Log("Removed line " + to_string(int(value + 1))); return; } if (control < MIDILEARN::control::deleteLine) { if (control > MIDILEARN::control::sevenBit) { type = it->status; synth.getRuntime().Log("Line " + to_string(lineNo + 1) + " " + lineName); } else{ uchar tempType = it->status; bool isOn = (type & 0x1f) > 0; string name; switch (control) { case MIDILEARN::control::block: type = (tempType & 0xfe) | (type & 1); name = "Block"; break; case MIDILEARN::control::limit: type = (tempType & 0xfd) | (type & 2); name = "Limit"; break; case MIDILEARN::control::mute: type = (tempType & 0xfb) | (type & 4); name = "Mute"; break; case MIDILEARN::control::sevenBit: type = (tempType & 0xef) | (type & 16); name = "7bit"; break; } if (isOn) name += " enabled"; else name += " disabled"; synth.getRuntime().Log("Line " + to_string(lineNo + 1) + " " + name); } CommandBlock response; memset(&response.bytes, 255, sizeof(response)); // need to work on this more response.data.value = value; response.data.type = type; response.data.control = MIDILEARN::control::ignoreMove; response.data.kit = kit; response.data.engine = engine; response.data.insert = insert; response.data.parameter = parameter; response.data.offset = offset; it->CC = kit; it->chan = engine; it->min_in = insert; it->max_in = parameter; it->status = type; writeToGui(response); return; } if (control == MIDILEARN::control::CCorChannel) { entry.CC = kit; entry.chan = engine; entry.min_in = insert; entry.max_in = parameter; entry.status = type; entry.min_out = it->min_out; entry.max_out = it->max_out; entry.frame.data = it->frame.data; uint CC = entry.CC; int chan = entry.chan; midi_list.erase(it); it = midi_list.begin(); int lineNo = 0; if (not midi_list.empty()) { // CC is priority while (CC > it->CC && it != midi_list.end()) { // find start of group ++it; ++lineNo; } while (CC == it->CC && chan >= it->chan && it != midi_list.end()) { // insert at end of same channel ++it; ++lineNo; } } if (it == midi_list.end()) midi_list.push_back(entry); else midi_list.insert(it, entry); synth.getRuntime().Log("Moved line to " + to_string(lineNo + 1) + " " + lineName); updateGui(); return; } // there may be more later! } string MidiLearn::findName(LearnBlock& block) { CommandBlock cmd; memcpy(cmd.bytes, block.frame.bytes, sizeof(CommandBlock)); cmd.data.value = 0; cmd.data.source = 0; return resolveAll(synth, cmd, false); } void MidiLearn::insertLine(ushort CC, uchar chan) { /* * This will eventually be part of a paging system of * 128 lines for the Gui. */ if (midi_list.size() >= MIDI_LEARN_BLOCK) { CommandBlock cmd; memset(&cmd, 0xff, sizeof(cmd)); cmd.data.value = 0; cmd.data.source = TOPLEVEL::action::toAll; cmd.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; cmd.data.control = TOPLEVEL::control::textMessage; cmd.data.part = TOPLEVEL::section::midiIn; cmd.data.parameter = 0x80; cmd.data.miscmsg = textMsgBuffer.push("Midi Learn full!"); writeMidi(cmd, false); learning = false; return; } uchar status{0}; if (CC >= MIDI::CC::channelPressureAdjusted) status |= 1; // set 'block' if (CC >= MIDI::CC::identNRPN) status |= 8; // mark as NRPN LearnBlock entry; entry.chan = chan; entry.CC = CC; entry.min_in = 0; entry.max_in = 200; entry.status = status; uchar type = learnTransferBlock.data.type & TOPLEVEL::type::Integer; learnTransferBlock.data.type = (type | TOPLEVEL::type::Limits | TOPLEVEL::type::Minimum); entry.min_out = synth.interchange.readAllData(learnTransferBlock); learnTransferBlock.data.type = (type | TOPLEVEL::type::Limits | TOPLEVEL::type::Maximum); entry.max_out = synth.interchange.readAllData(learnTransferBlock); memcpy(entry.frame.bytes, learnTransferBlock.bytes, sizeof(CommandBlock)); entry.frame.data.type = type; uchar inserts[2]; int insert_count; if (entry.frame.data.insert == TOPLEVEL::insert::envelopePointChange) { // Special case for envelope points: We need to insert both axes. The // user can decide afterwards if they want to keep both or remove one of // them. inserts[0] = TOPLEVEL::insert::envelopePointChangeDt; inserts[1] = TOPLEVEL::insert::envelopePointChangeVal; insert_count = 2; } else { inserts[0] = entry.frame.data.insert; insert_count = 1; } for (int insert = 0; insert < insert_count; insert++) { entry.frame.data.insert = inserts[insert]; list::iterator it; it = midi_list.begin(); int lineNo = 0; if (not midi_list.empty()) { // CC is priority while (CC > it->CC && it != midi_list.end()) // CC is priority { // find start of group ++it; ++lineNo; } while (CC == it->CC && chan >= it->chan && it != midi_list.end()) { // insert at end of same channel ++it; ++lineNo; } } if (it == midi_list.end()) midi_list.push_back(entry); else midi_list.insert(it, entry); uint CCh = entry.CC; string CCtype; if (CCh < 0xff) CCtype = "CC " + to_string(CCh); else CCtype = "NRPN " + asHexString((CCh >> 7) & 0x7f) + " " + asHexString(CCh & 0x7f); synth.getRuntime().Log("Learned " + CCtype + " Chan " + to_string((int)entry.chan + 1) + " " + learnedName); } updateGui(MIDILEARN::control::limit); learning = false; } void MidiLearn::writeToGui(CommandBlock& cmd) { #ifdef GUI_FLTK if (!synth.getRuntime().showGui) return; cmd.data.part = TOPLEVEL::section::midiLearn; int tries = 0; bool ok = false; do { ok = synth.interchange.toGUI.write(cmd.bytes); ++tries; if (!ok) sleep_for(100us); // we can afford a short delay for buffer to clear } while (!ok && tries < 3); if (!ok) synth.getRuntime().Log("toGui buffer full!", _SYS_::LogNotSerious | _SYS_::LogError); #endif // GUI_FLTK } void MidiLearn::updateGui(int opp) { if (!synth.getRuntime().showGui) return; CommandBlock cmd; if (opp == MIDILEARN::control::sendLearnMessage) { cmd.data.control = MIDILEARN::control::sendLearnMessage; cmd.data.miscmsg = textMsgBuffer.push("Learning " + learnedName); } else if (opp == MIDILEARN::control::cancelLearn) { cmd.data.control = MIDILEARN::control::cancelLearn; cmd.data.miscmsg = NO_MSG; } else if (opp == MIDILEARN::control::limit) { cmd.data.control = TOPLEVEL::control::textMessage; cmd.data.miscmsg = NO_MSG; } else { cmd.data.control = MIDILEARN::control::clearAll; cmd.data.miscmsg = NO_MSG; if (opp == MIDILEARN::control::hideGUI) return; } cmd.data.value = 0; writeToGui(cmd); if (opp >= MIDILEARN::control::hideGUI) // just sending back gui message return; /* using std::chrono::steady_clock; using Dur = std::chrono::duration; auto start = steady_clock::now(); */ uint lineNo{0}; for (LearnBlock& block : midi_list) { ushort newCC = (block.CC) & MIDI::CC::maxNRPN; cmd.data.value = lineNo; cmd.data.type = block.status; cmd.data.source = TOPLEVEL::action::toAll; cmd.data.control = MIDILEARN::control::CCorChannel; cmd.data.kit = (newCC & 0xff); cmd.data.engine = block.chan; cmd.data.insert = block.min_in; cmd.data.parameter = block.max_in; cmd.data.miscmsg = textMsgBuffer.push(findName(block)); writeToGui(cmd); if (block.status & 8) { // status used in case NRPN is < 0x100 cmd.data.control = MIDILEARN::control::nrpnDetected; // it's an NRPN cmd.data.engine = (newCC >> 8); writeToGui(cmd); } ++lineNo; if (lineNo & 32) sleep_for(10us); // allow message list to clear a bit } /* Dur duration = steady_clock::now () - start; std::cout << "MidiLearn->GUI: Δt = " << duration.count() << "µs" << std::endl; */ if (synth.getRuntime().showLearnedCC == true and not midi_list.empty()) {// open the gui editing window... cmd.data.control = MIDILEARN::control::sendRefreshRequest; writeToGui(cmd); } } bool MidiLearn::saveList(string const& name) { auto& logg = synth.getRuntime().getLogger(); if (name.empty()) logg("MidiLearn: no filename given."); else if (midi_list.empty()) logg("MidiLearn: nothing to save", _SYS_::LogNotSerious); else { string file = setExtension(name, EXTEN::mlearn); auto compress = synth.getRuntime().gzipCompression; XMLStore xml{TOPLEVEL::XML::MLearn}; this->insertMidiListData(xml); if (xml and xml.saveXMLfile(file, logg, compress)) { synth.addHistory(file, TOPLEVEL::XML::MLearn); return true; } else logg("MidiLearn: Failed to save data to \""+file+"\""); } return false; } /** @note when no LearnBlock are captured, * nothing will be added to the XMLStore */ void MidiLearn::insertMidiListData(XMLStore& xml) { if (midi_list.empty()) return; uint ID{0}; XMLtree xmlLearn = xml.addElm("MIDILEARN"); for (LearnBlock& block : midi_list) { XMLtree xmlLine = xmlLearn.addElm("LINE", ID); xmlLine.addPar_bool("Mute" ,(block.status & 4) > 0); xmlLine.addPar_bool("NRPN" ,(block.status & 8) > 0); xmlLine.addPar_bool("7_bit" ,(block.status & 16) > 0); xmlLine.addPar_int("Midi_Controller", block.CC & 0x7fff); /* * Clear out top bit - NRPN marker * Yoshimi NRPNs are internally stored as * integers in 'CC', not MIDI 14 bit pairs. * A high bit marker is added to identify these. * For user display they are split and shown as * MSB and LSB. */ xmlLine.addPar_int ("Midi_Channel", block.chan); xmlLine.addPar_real("Midi_Min" , block.min_in / 1.575f); xmlLine.addPar_real("Midi_Max" , block.max_in / 1.575f); xmlLine.addPar_bool("Limit" ,(block.status & 2) > 0); xmlLine.addPar_bool("Block" ,(block.status & 1) > 0); xmlLine.addPar_int ("Convert_Min" , block.min_out); xmlLine.addPar_int ("Convert_Max" , block.max_out); XMLtree xmlCmd = xmlLine.addElm("COMMAND"); xmlCmd.addPar_int("Type" , block.frame.data.type); xmlCmd.addPar_int("Control" , block.frame.data.control); xmlCmd.addPar_int("Part" , block.frame.data.part); xmlCmd.addPar_int("Kit_Item" , block.frame.data.kit); xmlCmd.addPar_int("Engine" , block.frame.data.engine); xmlCmd.addPar_int("Insert" , block.frame.data.insert); xmlCmd.addPar_int("Parameter" , block.frame.data.parameter); xmlCmd.addPar_int("Secondary_Parameter", block.frame.data.offset); xmlCmd.addPar_str("Command_Name" , findName(block)); ++ID; } } bool MidiLearn::loadList(string const& name) { auto& logg = synth.getRuntime().getLogger(); if (name.empty()) logg("MidiLearn: no filename given."); else { string file{setExtension(name, EXTEN::mlearn)}; if (not isRegularFile(file)) logg("MidiLearn: unable to find \""+file+"\""); else { XMLStore xml{file, logg}; postLoadCheck(xml,synth); if (xml and extractMidiListData(xml)) { synth.addHistory(file, TOPLEVEL::XML::MLearn); return true; } else logg("MidiLearn: failed to load XML data from \""+file+"\""); } } return false; } bool MidiLearn::extractMidiListData(XMLStore& xml) { midi_list.clear(); XMLtree xmlLearn = xml.getElm("MIDILEARN"); if (not xmlLearn) return false; // notify caller: missing data uint ID{0}; while (true) { XMLtree xmlLine = xmlLearn.getElm("LINE", ID); if (not xmlLine) break; // End-of-data detected else { uint ident{0}; uint status{0}; midi_list.emplace_back(); LearnBlock& entry = midi_list.back(); if (xmlLine.getPar_bool("Mute", 0)) status |= 4; if (xmlLine.getPar_bool("NRPN", 0)) { ident = MIDI::CC::identNRPN; // set top bit for NRPN indication status |= 8; } if (xmlLine.getPar_bool("7_bit",0)) status |= 16; entry.CC = ident | xmlLine.getPar_int("Midi_Controller", 0, 0, MIDI::CC::maxNRPN); entry.chan = xmlLine.getPar_127("Midi_Channel", 0); float midiMin = xmlLine.getPar_real("Midi_Min", 200.0f); entry.min_in = uchar(std::clamp(0.1f + (midiMin * 1.575f), 0.0f,255.0f)); //NOTE 5/2025 seems confusing.... 1.575*200 ≡ 315, which is beyond the range of uchar; added a std::clamp to make this explicit float midiMax = xmlLine.getPar_real("Midi_Max", 200.0f); entry.max_in = uchar(std::clamp(0.1f + (midiMax * 1.575f), 0.0f,255.0f)); if (xmlLine.getPar_bool("Limit",0)) status |= 2; if (xmlLine.getPar_bool("Block",0)) status |= 1; entry.min_out = xmlLine.getPar_int("Convert_Min", 0, -16384, 16383); entry.max_out = xmlLine.getPar_int("Convert_Max", 0, -16384, 16383); XMLtree xmlCmd = xmlLine.getElm("COMMAND"); entry.frame.data.type = xmlCmd.getPar_255("Type" , 0); entry.frame.data.control = xmlCmd.getPar_255("Control" , 0); entry.frame.data.part = xmlCmd.getPar_255("Part" , 0); entry.frame.data.kit = xmlCmd.getPar_255("Kit_Item" , 0); entry.frame.data.engine = xmlCmd.getPar_255("Engine" , 0); entry.frame.data.insert = xmlCmd.getPar_255("Insert" , 0); entry.frame.data.parameter = xmlCmd.getPar_255("Parameter", 0); entry.frame.data.offset = xmlCmd.getPar_255("Secondary_Parameter", 0); // completed processing element entry.status = status; ++ ID; /* -------------- decode and re-code command ------------- */ CommandBlock cmd; if (DECODE_MODE) { string cmdName = xmlCmd.getPar_str("Command_Name"); TextData::encodeAll(&synth, cmdName, cmd); } if (DECODE_MODE >= 2) { bool ok = true; if (ID == 1) cout << endl; cout << "line " << (ID-1); if (cmd.data.control != entry.frame.data.control) { ok = false; cout << " changed control Old " << int(entry.frame.data.control) << " > New " << int(cmd.data.control); } if (cmd.data.part != entry.frame.data.part) { ok = false; cout << " changed part Old " << int(entry.frame.data.part) << " > New " << int(cmd.data.part); } if (cmd.data.kit != entry.frame.data.kit) { ok = false; cout << " changed kit Old " << int(entry.frame.data.kit) << " > New " << int(cmd.data.kit); } if (cmd.data.engine != entry.frame.data.engine) { ok = false; cout << " changed engine Old " << int(entry.frame.data.engine) << " > New " << int(cmd.data.engine); } if (cmd.data.insert != entry.frame.data.insert) { ok = false; cout << " changed insert Old " << int(entry.frame.data.insert) << " > New " << int(cmd.data.insert); } if (cmd.data.parameter != entry.frame.data.parameter) { ok = false; cout << " changed parameter Old " << int(entry.frame.data.parameter) << " > New " << int(cmd.data.parameter); } if (cmd.data.offset != entry.frame.data.offset) { ok = false; cout << " changed offset Old " << int(entry.frame.data.offset) << " > " << int(cmd.data.offset); } if (ok) { cout << " OK"; } cout << endl; } if (DECODE_MODE & 1) { entry.frame.data.control = cmd.data.control; entry.frame.data.part = cmd.data.part; entry.frame.data.kit = cmd.data.kit; entry.frame.data.engine = cmd.data.engine; entry.frame.data.insert = cmd.data.insert; entry.frame.data.parameter = cmd.data.parameter; entry.frame.data.offset = cmd.data.offset; } }// } // while return true; } yoshimi-2.3.5.1/src/Interface/MidiLearn.h000066400000000000000000000057631506652756400201000ustar00rootroot00000000000000/* MidiLearn.h Copyright 2016-2020, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef MIDILEARN_H #define MIDILEARN_H #include "globals.h" #include #include #include "Interface/InterChange.h" #include "Interface/Data2Text.h" #include "Interface/Text2Data.h" class SynthEngine; class DataText; class TextData; class XMLStore; using std::string; using std::list; class MidiLearn : private DataText, TextData { SynthEngine& synth; public: ~MidiLearn() = default; MidiLearn(SynthEngine&); // shall not be copied or moved or assigned MidiLearn(MidiLearn&&) = delete; MidiLearn(MidiLearn const&) = delete; MidiLearn& operator=(MidiLearn&&) = delete; MidiLearn& operator=(MidiLearn const&) = delete; //commandData CommandBlock data; //Control data struct LearnBlock{ ushort CC{0}; uchar chan{0}; uchar min_in{0}; uchar max_in{0}; uchar status{0}; // up to here must be specified on input int min_out{0}; // defined programmatically int max_out{0}; // defined programmatically CommandBlock frame; // controller to learn }; bool learning; void setTransferBlock(CommandBlock& getData); bool runMidiLearn(int _value, ushort CC, uchar chan, bool in_place); bool writeMidi(CommandBlock& putData, bool in_place); int findSize(); void listLine(int lineNo); void listAll(list& msg_buf); bool remove(int itemNumber); void generalOperations(CommandBlock& getData); void insertMidiListData(XMLStore&); bool loadList(const string& name); bool extractMidiListData(XMLStore&); void updateGui(int opp = 0); private: list midi_list; string learnedName; CommandBlock learnTransferBlock; int findEntry(list&, int lastpos, ushort CC, uchar chan, LearnBlock& block, bool show); string findName(LearnBlock&); void insertLine(ushort CC, uchar chan); bool saveList(string const& name); void writeToGui(CommandBlock& putData); }; #endif /*MIDILEARN_H*/ yoshimi-2.3.5.1/src/Interface/RingBuffer.h000066400000000000000000000056271506652756400202640ustar00rootroot00000000000000#ifndef RINGBUFFER_H #define RINGBUFFER_H /* Ring Buffer - all buffering operations Previous (2019) design Will Godfrey Copyright (C) 2021 Rainer Hans Liffers, Carnarvon, Western Australia Email: rainer.liffers@gmail.com This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include template class RingBuffer final : private std::array { private: static constexpr size_t bytes = 1 << log2Bytes; static constexpr uint32_t mask = (1 << log2Blocks) * bytes - 1; mutable std::atomic readPoint; std::atomic writePoint; public: RingBuffer (): std::array (), readPoint (0), writePoint (0) { } inline void init () { this -> fill (0); } bool write (const char * writeData); bool read (char * readData) const; }; template bool RingBuffer ::write (const char * writeData) { bool result = false; uint32_t write = writePoint.load (std::memory_order_acquire); uint32_t read = readPoint.load (std::memory_order_relaxed); if (((read - bytes) & mask) != write) { write = (write + bytes) & mask; std::copy_n (writeData, bytes, & (* this) [write]); writePoint.store (write, std::memory_order_release); result = true; } return result; } template bool RingBuffer ::read (char * readData) const { bool result = false; uint32_t write = writePoint.load (std::memory_order_relaxed); uint32_t read = readPoint.load (std::memory_order_acquire); if ((write - read) >= bytes) { read = (read + bytes) & mask; std::copy_n (& (* this) [read], bytes, readData); readPoint.store (read, std::memory_order_release); result = true; } return result; } #endif yoshimi-2.3.5.1/src/Interface/Text2Data.cpp000066400000000000000000001443361506652756400203670ustar00rootroot00000000000000/* Text2Data.cpp - conversion of text to commandBlock entries Copyright 2023, Will Godfrey Copyright 2024, Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "Interface/Text2Data.h" #include "Interface/TextLists.h" #include "Interface/InterChange.h" #include "Misc/SynthEngine.h" #include "Misc/TextMsgBuffer.h" #include "Misc/FormatFuncs.h" #include "Misc/NumericFuncs.h" using std::string; using std::to_string; using std::cout; using std::endl; void TextData::encodeAll(SynthEngine *_synth, string &sentCommand, CommandBlock &allData) { memset(&allData.bytes, 255, sizeof(allData)); oursynth = _synth; string source = sentCommand; strip (source); if (source.empty()) { allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; log(source, "empty Command String"); return; } encodeLoop(source, allData); /* * If we later decide to be able to set and read values * this is where the code should go in order to catch * all of the subroutines. * * MIDI-learn will not use this */ /*size_t pos = source.find("Value"); if (pos != string::npos) { // done directly - we don't know 'source' is tidy source = source.substr(pos); nextWord(source); if (isdigit(source[0])) { allData.data.value = string2float(source, NULL); // need a ring buffer to write allData CommandBlock } else log (source, "no value to write given"); } else { // return the supplied allData CommandBlock // and/or the supplied string allData.data.type = 0; allData.data.value = oursynth->interchange.readAllData(&allData); sentCommand += (" Value >" + to_string(allData.data.value)); }*/ } void TextData::log(string& line, string text) { oursynth->getRuntime().Log("Error: " + text); // we may later decide to print the string before emptying it line = ""; } void TextData::strip(string& line) { size_t pos = line.find_first_not_of(" "); if (pos == string::npos) line = ""; else line = line.substr(pos); } void TextData::nextWord(string& line) { size_t pos = line.find_first_of(" "); if (pos == string::npos) { line = ""; return; } line = line.substr(pos); strip(line); } bool TextData::findCharNum(string& line, uchar& value) { if (!isdigit(line[0])) return false; value = stoi(line) - 1; nextWord(line); return true; } bool TextData::findAndStep(string& line, string text, bool step) { // now case insensitive transform(text.begin(), text.end(), text.begin(), ::tolower); string lineCopy{line}; transform(lineCopy.begin(), lineCopy.end(), lineCopy.begin(), ::tolower); size_t pos = lineCopy.find(text); if (pos != string::npos && pos < 3) // allow leading spaces { if (step) { pos += text.length(); line = line.substr(pos); nextWord(line); } return true; } return false; } int TextData::findListEntry(string& line, int step, const string list []) { int count = 0; bool found = false; string test; do { test = list [count]; size_t split = test.find(" "); if (split != string::npos) test = test.substr(0, split); found = findAndStep(line, test); if (!found) count += step; } while (!found && test != "@end"); if (count > 0) count = count / step; // gives actual list position return count; } int TextData::mapToEffectNumber(int textIndex, const int list []) { return list[textIndex]; } int TextData::findEffectFromText(string &line, int step, const string list [], const int listmap []) { return mapToEffectNumber(findListEntry(line, step, list), listmap); } void TextData::encodeLoop(string source, CommandBlock& allData) { /* NOTE * subsections must *always* come before local controls! */ if (findAndStep(source, "Main")) { encodeMain(source, allData); return; } if (findAndStep(source, "System")) { allData.data.part = (TOPLEVEL::section::systemEffects); if (findAndStep(source, "Effect")) encodeEffects(source, allData); return; } if (findAndStep(source, "Insert")) { allData.data.part = (TOPLEVEL::section::insertEffects); if (findAndStep(source, "Effect")) encodeEffects(source, allData); return; } if (findAndStep(source, "Scales")) { encodeScale(source, allData); return; } if (findAndStep(source, "Part")) { encodePart(source, allData); return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; log(source, "bad Command String"); } void TextData::encodeMain(string& source, CommandBlock& allData) { strip (source); allData.data.part = TOPLEVEL::section::main; if (findAndStep(source, "Master")) { if (findAndStep(source, "Mono/Stereo")) { allData.data.control = MAIN::control::mono; return; } } if (findAndStep(source, "Volume")) { allData.data.control = MAIN::control::volume; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "main overflow >" << source << endl; } void TextData::encodeScale(string& source, CommandBlock& allData) { strip (source); allData.data.part = TOPLEVEL::section::scales; uchar ctl = UNUSED; if (findAndStep(source, "Enable")) { if (findAndStep(source, "Microtonal")) ctl = SCALES::control::enableMicrotonal; else if (findAndStep(source, "Keyboard Mapping")) ctl = SCALES::control::enableKeyboardMap; } else if (findAndStep(source, "Ref note")) ctl = SCALES::control::refNote; else if (findAndStep(source, "Invert Keys")) ctl = SCALES::control::invertScale; else if (findAndStep(source, "Key Center")) ctl = SCALES::control::invertedScaleCenter; else if (findAndStep(source, "Scale Shift")) ctl = SCALES::control::scaleShift; else if (findAndStep(source, "Keyboard")) { if (findAndStep(source, "First Note")) ctl = SCALES::control::lowKey; else if (findAndStep(source, "Middle Note")) ctl = SCALES::control::middleKey; else if (findAndStep(source, "Last Note")) ctl = SCALES::control::highKey; } if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "scale overflow >" << source << endl; } void TextData::encodePart(string& source, CommandBlock& allData) { strip (source); uchar npart = UNUSED; if (findCharNum(source, npart)) { if (npart >= NUM_MIDI_PARTS) { log(source, "part number out of range"); return; } allData.data.part = (TOPLEVEL::section::part1 + npart); if (findAndStep(source, "Effect")) { encodeEffects(source, allData); return; } } else return; // must have a part number! uchar kitnum = UNUSED; if (findAndStep(source, "Kit")) { if (findCharNum(source, kitnum)) { if (kitnum >= NUM_KIT_ITEMS) { log(source, "kit number out of range"); return; } allData.data.kit = kitnum; } //allData.data.insert = TOPLEVEL::insert::kitGroup; uchar kitctl = UNUSED; if (findAndStep(source, "Mute")) kitctl = PART::control::kitItemMute; // we may add other controls later if (kitctl < UNUSED) { allData.data.insert = TOPLEVEL::insert::kitGroup; allData.data.control = kitctl; return; } } if (findAndStep(source, "Controller")) { encodeController(source, allData); return; } if (findAndStep(source, "MIDI")) { encodeMidi(source, allData); return; } if (findAndStep(source, "AddSynth")) { encodeAddSynth(source, allData); return; } if (findAndStep(source, "Add Voice") || findAndStep(source, "Adsynth Voice") || findAndStep(source, "addvoice")) { uchar voiceNum = UNUSED; if (findCharNum(source, voiceNum)) { if (voiceNum >= NUM_VOICES) { log(source, "voice number out of range"); return; } allData.data.engine = PART::engine::addVoice1+voiceNum; encodeAddVoice(source, allData); return; } } if (findAndStep(source, "SubSynth")) { encodeSubSynth(source, allData); return; } if (findAndStep(source, "PadSynth")) { encodePadSynth(source, allData); return; } uchar ctl = UNUSED; if (findAndStep(source, "Vel")) { if (findAndStep(source, "Sens")) ctl = PART::control::velocitySense; else if (findAndStep(source, "Offset")) ctl = PART::control::velocityOffset; } else if (findAndStep(source, "Panning")) ctl = PART::control::panning; else if (findAndStep(source, "Volume")) { ctl = PART::control::volume; } else if (findAndStep(source, "Humanise")) { if (findAndStep(source, "Pitch")) ctl = PART::control::humanise; else if (findAndStep(source, "Velocity")) ctl = PART::control::humanvelocity; else ctl = PART::control::humanise; // old single control version } else if (findAndStep(source, "Portamento Enable") || findAndStep(source, "Portamento")) ctl = PART::control::portamento; if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "part overflow >" << source << endl; } // ---------------------------- void TextData::encodeController(string& source, CommandBlock& allData) { uchar ctl = UNUSED; if (findAndStep(source,"Vol")) { if (findAndStep(source,"Range")) ctl = PART::control::volumeRange; else if (findAndStep(source,"Enable")) ctl = PART::control::volumeEnable; } else if (findAndStep(source,"Pan Width")) { ctl = PART::control::panningWidth; } else if (findAndStep(source,"Mod Wheel Range") || findAndStep(source,"Mod Wheel Depth")) { ctl = PART::control::modWheelDepth; } else if (findAndStep(source,"Exponent")) { if (findAndStep(source,"Mod Wheel")) { ctl = PART::control::exponentialModWheel; } else if (findAndStep(source,"Bandwidth")) ctl = PART::control::exponentialBandwidth; } else if (findAndStep(source,"Bandwidth Range") || findAndStep(source,"Bandwidth depth")) { ctl = PART::control::bandwidthDepth; } else if (findAndStep(source,"Expression Enable")) { ctl = PART::control::expressionEnable; } else if (findAndStep(source,"FM Amp Enable")) { ctl = PART::control::FMamplitudeEnable; } else if (findAndStep(source,"Sustain Ped Enable")) { ctl = PART::control::sustainPedalEnable; } else if (findAndStep(source,"Pitch Wheel Range")) { ctl = PART::control::pitchWheelRange; } else if (findAndStep(source,"Filter")) { if (findAndStep(source,"Q Range") || findAndStep(source,"Q Depth")) { ctl = PART::control::filterQdepth; } else if (findAndStep(source,"Cutoff Range") || findAndStep(source,"Cutoff Depth")) { ctl = PART::control::filterCutoffDepth; } } else if (findAndStep(source,"Breath Control")) { ctl = PART::control::breathControlEnable; } else if (findAndStep(source,"Res")) { if (findAndStep(source,"Cent Freq Range")) { ctl = PART::control::resonanceCenterFrequencyDepth; } else if (findAndStep(source,"Band Range") || findAndStep(source,"Band Depth")) { ctl = PART::control::resonanceBandwidthDepth; } } else if (findAndStep(source,"Time")) { if (findAndStep(source,"Stretch")) ctl = PART::control::portamentoTimeStretch; else ctl = PART::control::portamentoTime; } else if (findAndStep(source,"Portamento")) { if (findAndStep(source,"Receive")) ctl = PART::control::receivePortamento; } else if (findAndStep(source,"Threshold Gate")) { if (findAndStep(source,"Type")) ctl = PART::control::portamentoThresholdType; else ctl = PART::control::portamentoThreshold; } else if (findAndStep(source,"Prop")) { if (findAndStep(source,"Enable")) ctl = PART::control::enableProportionalPortamento; else if (findAndStep(source,"Rate")) ctl = PART::control::proportionalPortamentoRate; else if (findAndStep(source,"depth")) ctl = PART::control::proportionalPortamentoDepth; } if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "controller overflow >" << source << endl; } void TextData::encodeMidi(string& source, CommandBlock& allData) { uchar ctl = UNUSED; if (findAndStep(source,"Modulation")) ctl = PART::control::midiModWheel; else if (findAndStep(source,"Expression")) ctl = PART::control::midiExpression; else if (findAndStep(source,"Filter")) { if (findAndStep(source,"Q")) ctl = PART::control::midiFilterQ; else if (findAndStep(source,"Cutoff")) ctl = PART::control::midiFilterCutoff; } else if (findAndStep(source,"Bandwidth")) ctl = PART::control::midiBandwidth; if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "midi overflow >" << source << endl; } void TextData::encodeEffects(string& source, CommandBlock& allData) { if (findAndStep(source, "Send")) { uchar sendto = UNUSED; if (findCharNum(source, sendto)) { allData.data.control = PART::control::partToSystemEffect1 + sendto; return; } } uchar effnum = UNUSED; if (findCharNum(source, effnum)) // need to find number ranges { allData.data.engine = effnum; if (findAndStep(source, "DynFilter ~ Filter")) { allData.data.kit = EFFECT::type::dynFilter; encodeFilter(source, allData); return; } if (allData.data.part < NUM_MIDI_PARTS) { if (findAndStep(source, "Bypass") || findAndStep(source, "bypassed")) { allData.data.control = PART::control::effectBypass; allData.data.insert = TOPLEVEL::insert::partEffectSelect; return; } } if (allData.data.part == TOPLEVEL::section::systemEffects) { bool test = (source == ""); if (!test) { test = (source.find("Enable") != string::npos); if (!test) test = isdigit(source[0]); } if (test) { if (!isdigit(source[0])) nextWord(source); // a number might be a value for later allData.data.control = EFFECT::sysIns::effectEnable; return; } } uchar efftype = findListEntry(source, 1, fx_list) + EFFECT::type::none; if (efftype >= EFFECT::type::count || efftype <= EFFECT::type::none) { log(source, "effect type out of range"); return; } allData.data.kit = efftype; // now need to do actual control uchar result = UNUSED; switch (efftype) { case EFFECT::type::reverb: result = findEffectFromText(source, 2, reverblist, reverblistmap); break; case EFFECT::type::echo: result = findEffectFromText(source, 2, echolist, echolistmap); break; case EFFECT::type::chorus: result = findEffectFromText(source, 2, choruslist, choruslistmap); break; case EFFECT::type::phaser: result = findEffectFromText(source, 2, phaserlist, phaserlistmap); break; case EFFECT::type::alienWah: result = findEffectFromText(source, 2, alienwahlist, alienwahlistmap); break; case EFFECT::type::distortion: result = findEffectFromText(source, 2, distortionlist, distortionlistmap); break; case EFFECT::type::eq: if (findAndStep(source, "(Band", true)) { uchar tmp; if (findCharNum(source, tmp)) allData.data.parameter = tmp; } result = findEffectFromText(source, 2, eqlist, eqlistmap); if (result > 0) { if (findAndStep(source, "(Band", true)) { uchar tmp; if (findCharNum(source, tmp)) allData.data.parameter = tmp; } } break; case EFFECT::type::dynFilter: result = findEffectFromText(source, 2, dynfilterlist, dynfilterlistmap); break; default: log(source, "effect control out of range"); return; } //allData.data.kit = EFFECT::type:: allData.data.control = result; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "effects overflow >" << source << endl; } // ---------------------------- void TextData::encodeAddSynth(string& source, CommandBlock& allData) { if (findAndStep(source, "Enable")) { if (allData.data.kit != UNUSED) allData.data.insert = TOPLEVEL::insert::kitGroup; allData.data.control = PART::control::enableAdd; return; } allData.data.engine = PART::engine::addSynth; uchar ctl = UNUSED; if (findAndStep(source, "Resonance")) { encodeResonance(source, allData); return; } else if (findAndStep(source, "Amp Env")) { allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Amp LFO")) { allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeLFO(source, allData); return; } else if (findAndStep(source, "Filt Env")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Filt LFO")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeLFO(source, allData); return; } else if (findAndStep(source, "Filter")) { encodeFilter(source, allData); return; } else if (findAndStep(source, "Freq Env")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Freq LFO")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeLFO(source, allData); return; } findAndStep(source, "Amplitude") // we just throw this away ; if (findAndStep(source, "Volume")) ctl = ADDSYNTH::control::volume; else if (findAndStep(source, "Velocity Sense") || findAndStep(source, "Vel Sens")) ctl = ADDSYNTH::control::velocitySense; else if (findAndStep(source, "Panning")) ctl = ADDSYNTH::control::panning; else if (findAndStep(source, "Random Width")) ctl = ADDSYNTH::control::randomWidth; else if (findAndStep(source, "Stereo")) ctl = ADDSYNTH::control::stereo; else if (findAndStep(source, "De Pop")) ctl = ADDSYNTH::control::dePop; else if (findAndStep(source, "Punch")) { if (findAndStep(source, "Strength") || findAndStep(source, "Strngth")) ctl = ADDSYNTH::control::punchStrength; else if (findAndStep(source, "Time")) ctl = ADDSYNTH::control::punchDuration; else if (findAndStep(source, "Stretch") || findAndStep(source, "Strtch")) ctl = ADDSYNTH::control::punchStretch; else if (findAndStep(source, "Vel")) ctl = ADDSYNTH::control::punchVelocity; } findAndStep(source, "Frequency"); // throw this away too if (findAndStep(source, "Detune")) ctl = ADDSYNTH::control::detuneFrequency; else if (findAndStep(source, "Octave")) ctl = ADDSYNTH::control::octave; else if (findAndStep(source, "Relative Bandwidth") ||findAndStep(source, "Rel B Wdth")) ctl = ADDSYNTH::control::relativeBandwidth; if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "addsynth overflow >" << source << endl; } void TextData::encodeAddVoice(string& source, CommandBlock& allData) { uchar ctl = UNUSED; if (findAndStep(source, "Enable")) ctl = ADDVOICE::control::enableVoice; else if (findAndStep(source, "Resonance")) { encodeResonance(source, allData); return; } else if (findAndStep(source, "Oscillator", false) || findAndStep(source, "Base", false) || findAndStep(source, "Harm Mods", false) || findAndStep(source, "Harmonic", false)) { encodeWaveform(source, allData); return; } else if (findAndStep(source, "Amp Env")) { allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Amp LFO")) { allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeLFO(source, allData); return; } if (findAndStep(source, "Amp")) { if (findAndStep(source, "Enable Env")) ctl = ADDVOICE::control::enableAmplitudeEnvelope; else if (findAndStep(source, "Enable LFO")) ctl = ADDVOICE::control::enableAmplitudeLFO; } else if (findAndStep(source, "Filt Env")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Filt LFO")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeLFO(source, allData); return; } else if (findAndStep(source, "Filter")) { if (findAndStep(source, "Enable Env")) ctl = ADDVOICE::control::enableFilterEnvelope; else if (findAndStep(source, "Enable LFO")) ctl = ADDVOICE::control::enableFilterLFO; else if (findAndStep(source, "Enable")) ctl = ADDVOICE::control::enableFilter; else { encodeFilter(source, allData); return; } } else if (findAndStep(source, "Modulator")) { if (findAndStep(source, "Amp Env")) { allData.data.engine += (PART::engine::addMod1 - PART::engine::addVoice1); allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeEnvelope(source, allData); return; } if (findAndStep(source, "Freq Env")) { allData.data.engine += (PART::engine::addMod1 - PART::engine::addVoice1); allData.data.parameter = TOPLEVEL::insertType::frequency; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Amp")) { if (findAndStep(source, "Enable Env")) ctl = ADDVOICE::control::enableModulatorAmplitudeEnvelope; } // throw it away for the next three controls if (findAndStep(source, "Volume")) ctl = ADDVOICE::control::modulatorAmplitude; else if (findAndStep(source, "Vel Sense") || findAndStep(source, "V Sense")) ctl = ADDVOICE::control::modulatorVelocitySense; else if (findAndStep(source, "HF Damping") || findAndStep(source, "F Damp")) ctl = ADDVOICE::control::modulatorHFdamping; if (findAndStep(source, "Freq")) { if (findAndStep(source, "Enable Env")) ctl = ADDVOICE::control::enableModulatorFrequencyEnvelope; else ctl = ADDVOICE::control::modulatorDetuneFrequency; // old form } // throw away for next if (findAndStep(source, "Octave")) ctl = ADDVOICE::control::modulatorOctave; else if (findAndStep(source, "Detune")) ctl = ADDVOICE::control::modulatorDetuneFrequency; else if (findAndStep(source, "Osc Phase")) ctl = ADDVOICE::control::modulatorOscillatorPhase; } else if (findAndStep(source, "Freq Env")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Freq LFO")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeLFO(source, allData); return; } else if (findAndStep(source, "Freq")) { if (findAndStep(source, "Enable Env")) { ctl = ADDVOICE::control::enableFrequencyEnvelope; allData.data.control = ctl; return; } else if (findAndStep(source, "Enable LFO")) { ctl = ADDVOICE::control::enableFrequencyLFO; allData.data.control = ctl; return; } // throw away for next few } if (findAndStep(source, "Bend Adj")) ctl = ADDVOICE::control::pitchBendAdjustment; else if (findAndStep(source, "Offset Hz")) ctl = ADDVOICE::control::pitchBendOffset; else if (findAndStep(source, "Equal Temper") || findAndStep(source, "Eq T")) ctl = ADDVOICE::control::equalTemperVariation; else if (findAndStep(source, "Detune")) ctl = ADDVOICE::control::detuneFrequency; else if (findAndStep(source, "Octave")) ctl = ADDVOICE::control::octave; else if (findAndStep(source, "Unison")) { if (findAndStep(source, "Enable")) ctl = ADDVOICE::control::enableUnison; else if (findAndStep(source, "Freq Spread")) ctl = ADDVOICE::control::unisonFrequencySpread; else if (findAndStep(source, "Phase Rnd")) ctl = ADDVOICE::control::unisonPhaseRandomise; else if (findAndStep(source, "Stereo")) ctl = ADDVOICE::control::unisonStereoSpread; else if (findAndStep(source, "Vibrato")) ctl = ADDVOICE::control::unisonVibratoDepth; else if (findAndStep(source, "Vib Speed")) ctl = ADDVOICE::control::unisonVibratoSpeed; } else if (findAndStep(source, "Volume")) ctl = ADDVOICE::control::volume; else if (findAndStep(source, "Velocity Sense") || findAndStep(source, "Vel Sens")) ctl = ADDVOICE::control::velocitySense; else if (findAndStep(source, "Panning")) ctl = ADDVOICE::control::panning; else if (findAndStep(source, "Random Width")) ctl = ADDVOICE::control::randomWidth; if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "addvoice overflow >" << source << endl; } void TextData::encodeSubSynth(string& source, CommandBlock& allData) { if (findAndStep(source, "Enable")) { if (allData.data.kit != UNUSED) allData.data.insert = TOPLEVEL::insert::kitGroup; allData.data.control = PART::control::enableSub; return; } allData.data.engine = PART::engine::subSynth; uchar ctl = UNUSED; if (findAndStep(source, "Amp Env")) { allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Amp LFO")) { allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeLFO(source, allData); return; } else if (findAndStep(source, "Filt Env")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Filt LFO")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeLFO(source, allData); return; } else if (findAndStep(source, "Freq Env")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Freq LFO")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeLFO(source, allData); return; } else if (findAndStep(source, "Band Env")) { allData.data.parameter = TOPLEVEL::insertType::bandwidth; encodeEnvelope(source, allData); return; } if (findAndStep(source, "Filter")) { if (findAndStep(source, "Enable")) { ctl = SUBSYNTH::control::enableFilter; } else { encodeFilter(source, allData); return; } } else if (findAndStep(source, "Stereo")) ctl = SUBSYNTH::control::stereo; else if (findAndStep(source, "Overtones")) { if (findAndStep(source, "Par 1")) ctl = SUBSYNTH::control::overtoneParameter1; else if (findAndStep(source, "Par 2")) ctl = SUBSYNTH::control::overtoneParameter2; else if (findAndStep(source, "Force H")) ctl = SUBSYNTH::control::overtoneForceHarmonics; } else if (findAndStep(source, "Harmonic")) { // has to be before anything starting with Amplitude or Bandwidth uchar harmonicNum = UNUSED; if (!findCharNum(source, harmonicNum)) { log (source, "no harmonic number"); return; } if (findAndStep(source, "Amplitude")) { allData.data.insert = TOPLEVEL::insert::harmonicAmplitude; ctl = harmonicNum; } else if (findAndStep(source, "Bandwidth")) { allData.data.insert = TOPLEVEL::insert::harmonicBandwidth; ctl = harmonicNum; } if (ctl < UNUSED) { allData.data.control = ctl; return; } } else if (findAndStep(source, "Bandwidth")) { if (findAndStep(source, "Env Enab")) ctl = SUBSYNTH::control::enableBandwidthEnvelope; else if (findAndStep(source, "Band Scale")) ctl = SUBSYNTH::control::bandwidthScale; else ctl = SUBSYNTH::control::bandwidth; } else if (findAndStep(source, "Frequency")) { if (findAndStep(source, "Env Enab")) { ctl = SUBSYNTH::control::enableFrequencyEnvelope; allData.data.control = ctl; return; } else if (findAndStep(source, "LFO Enab")) { ctl = SUBSYNTH::control::enableFrequencyLFO; allData.data.control = ctl; return; } // throw away for the next few } else if (findAndStep(source, "Octave")) ctl = SUBSYNTH::control::octave; else if (findAndStep(source, "Bend Adj")) ctl = SUBSYNTH::control::pitchBendAdjustment; else if (findAndStep(source, "Offset Hz")) ctl = SUBSYNTH::control::pitchBendOffset; else if (findAndStep(source, "Equal Temper") || findAndStep(source, "Eq T")) ctl = SUBSYNTH::control::equalTemperVariation; else if (findAndStep(source, "Detune")) ctl = SUBSYNTH::control::detuneFrequency; findAndStep(source, "Amplitude"); // throw away for next few if (findAndStep(source, "Volume")) ctl = SUBSYNTH::control::volume; else if (findAndStep(source, "Velocity Sense") || findAndStep(source, "Vel Sens")) ctl = SUBSYNTH::control::velocitySense; else if (findAndStep(source, "Panning")) ctl = SUBSYNTH::control::panning; else if (findAndStep(source, "Random Width")) ctl = SUBSYNTH::control::randomWidth; if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "subsynth overflow >" << source << endl; } void TextData::encodePadSynth(string& source, CommandBlock& allData) { if (findAndStep(source, "Enable")) { if (allData.data.kit != UNUSED) allData.data.insert = TOPLEVEL::insert::kitGroup; allData.data.control = PART::control::enablePad; return; } allData.data.engine = PART::engine::padSynth; uchar ctl = UNUSED; if (findAndStep(source, "Resonance")) { encodeResonance(source, allData); return; } else if (findAndStep(source, "Oscillator", false) || findAndStep(source, "Base", false) || findAndStep(source, "Harm Mods", false)) { encodeWaveform(source, allData); return; } else if (findAndStep(source, "Amp Env")) { allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Amp LFO")) { allData.data.parameter = TOPLEVEL::insertType::amplitude; encodeLFO(source, allData); return; } else if (findAndStep(source, "Filt Env")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Filt LFO")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeLFO(source, allData); return; } else if (findAndStep(source, "Filter")) { encodeFilter(source, allData); return; } else if (findAndStep(source, "Freq Env")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Freq LFO")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeLFO(source, allData); return; } else if (findAndStep(source, "Harmonic Base")) { if (findAndStep(source, "Width")) ctl =PADSYNTH::control::baseWidth; else if (findAndStep(source, "Freq Mult")) ctl =PADSYNTH::control::frequencyMultiplier; else if (findAndStep(source, "Str")) ctl =PADSYNTH::control::modulatorStretch; else if (findAndStep(source, "Freq")) ctl =PADSYNTH::control::modulatorFrequency; else if (findAndStep(source, "Size")) ctl =PADSYNTH::control::size; else if (findAndStep(source, "Amp Par 1")) ctl =PADSYNTH::control::spectralWidth; else if (findAndStep(source, "Amp Par 2")) ctl =PADSYNTH::control::spectralAmplitude; } else if (findAndStep(source, "Oscillator", false) || findAndStep(source, "Base", false) || findAndStep(source, "Harm Mods", false) || findAndStep(source, "Harmonic", false)) { // must come after harmonic base encodeWaveform(source, allData); return; } else if (findAndStep(source, "Overtones")) { findAndStep(source, "Overt"); // throw it away if (findAndStep(source, "Par 1")) ctl =PADSYNTH::control::overtoneParameter1; else if (findAndStep(source, "Par 2")) ctl =PADSYNTH::control::overtoneParameter2; else if (findAndStep(source, "Force H")) ctl =PADSYNTH::control::overtoneForceHarmonics; } else if (findAndStep(source, "Bandwidth")) { if (findAndStep(source, "Scale")) ; // not yet else if(findAndStep(source, "Spectrum Mode")) // old form ; // not yet else { findAndStep(source, "Bandwidth"); //throw it away (old form) ctl =PADSYNTH::control::bandwidth; } } else if(findAndStep(source, "Spectrum Mode")) // new form ; // not yet else if(findAndStep(source, "XFade Update")) ctl =PADSYNTH::control::xFadeUpdate; else if(findAndStep(source, "BuildTrigger")) ctl =PADSYNTH::control::rebuildTrigger; else if(findAndStep(source, "RWDetune")) ctl =PADSYNTH::control::randWalkDetune; else if(findAndStep(source, "RWBandwidth")) ctl =PADSYNTH::control::randWalkBandwidth; else if(findAndStep(source, "RWFilterFreq")) ctl =PADSYNTH::control::randWalkFilterFreq; else if(findAndStep(source, "RWWidthProfile")) ctl =PADSYNTH::control::randWalkProfileWidth; else if(findAndStep(source, "RWStretchProfile")) ctl =PADSYNTH::control::randWalkProfileStretch; else if (findAndStep(source, "Changes Applied")) ctl =PADSYNTH::control::applyChanges; findAndStep(source, "Amplitude"); // throw it away for the next few if (findAndStep(source, "Volume")) ctl =PADSYNTH::control::volume; else if (findAndStep(source, "Velocity Sense") || findAndStep(source, "Vel Sens")) ctl =PADSYNTH::control::velocitySense; else if (findAndStep(source, "Panning")) ctl =PADSYNTH::control::panning; else if (findAndStep(source, "Random Pan")) ctl =PADSYNTH::control::enableRandomPan; else if (findAndStep(source, "Random Width")) ctl =PADSYNTH::control::randomWidth; else if (findAndStep(source, "Punch")) { if (findAndStep(source, "Strength") || findAndStep(source, "Strngth")) ctl =PADSYNTH::control::punchStrength; else if (findAndStep(source, "Time")) ctl =PADSYNTH::control::punchDuration; else if (findAndStep(source, "Stretch") || findAndStep(source, "Strtch")) ctl =PADSYNTH::control::punchStretch; else if (findAndStep(source, "Vel")) ctl =PADSYNTH::control::punchVelocity; } else if (findAndStep(source, "Stereo")) ctl =PADSYNTH::control::stereo; else if (findAndStep(source, "De Pop")) ctl =PADSYNTH::control::dePop; findAndStep(source, "Frequency"); // throw it away for the next few if (findAndStep(source, "Bend Adj")) ctl =PADSYNTH::control::pitchBendAdjustment; else if (findAndStep(source, "Offset Hz")) ctl =PADSYNTH::control::pitchBendOffset; else if (findAndStep(source, "440Hz")) ctl =PADSYNTH::control::baseFrequencyAs440Hz; else if (findAndStep(source, "Detune")) ctl =PADSYNTH::control::detuneFrequency; else if (findAndStep(source, "Equal Temper") || findAndStep(source, "Eq T")) ctl =PADSYNTH::control::equalTemperVariation; else if (findAndStep(source, "Octave")) ctl =PADSYNTH::control::octave; if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "padsynth overflow >" << source << endl; } // ---------------------------- void TextData::encodeWaveform(string& source, CommandBlock& allData) { uchar ctl = UNUSED; allData.data.insert = TOPLEVEL::insert::oscillatorGroup; if (findAndStep(source, "Harmonic")) { if (findCharNum(source, ctl)) allData.data.control = ctl; else { log(source, " no harmonic number"); return; } if (findAndStep(source, "Amplitude")) allData.data.insert = TOPLEVEL::insert::harmonicAmplitude; else if (findAndStep(source, "Phase")) allData.data.insert = TOPLEVEL::insert::harmonicPhase; else log(source, " no harmonic type"); } else if (findAndStep(source, "Oscillator")) { if (findAndStep(source, "Random")) ctl = OSCILLATOR::control::phaseRandomness; else if (findAndStep(source, "Harm Rnd")) ctl = OSCILLATOR::control::harmonicAmplitudeRandomness; } else if (findAndStep(source, "Harm Mods")) { if (findAndStep(source, "Adapt Param")) ctl = OSCILLATOR::control::adaptiveHarmonicsParameter; else if (findAndStep(source, "Adapt Base Freq")) ctl = OSCILLATOR::control::adaptiveHarmonicsBase; else if (findAndStep(source, "Adapt Power")) ctl = OSCILLATOR::control::adaptiveHarmonicsPower; } else if (findAndStep(source, "Base Mods")) { if (findAndStep(source, "Osc")) { if (findAndStep(source, "Filt Par 1")) ctl = OSCILLATOR::control::filterParameter1; else if (findAndStep(source, "Filt Par 2")) ctl = OSCILLATOR::control::filterParameter2; else if (findAndStep(source, "Mod Par 1")) ctl = OSCILLATOR::control::modulationParameter1; else if (findAndStep(source, "Mod Par 2")) ctl = OSCILLATOR::control::modulationParameter2; else if (findAndStep(source, "Mod Par 3")) ctl = OSCILLATOR::control::modulationParameter3; else if (findAndStep(source, "Spect Par")) ctl = OSCILLATOR::control::spectrumAdjustParameter; } else if (findAndStep(source, "Waveshape Par")) ctl = OSCILLATOR::control::waveshapeParameter; } else if (findAndStep(source, "Base Funct")) { if (findAndStep(source, "Par")) ctl = OSCILLATOR::control::baseFunctionParameter; else if (findAndStep(source, "Mod Par 1")) ctl = OSCILLATOR::control::baseModulationParameter1; else if (findAndStep(source, "Mod Par 2")) ctl = OSCILLATOR::control::baseModulationParameter2; else if (findAndStep(source, "Mod Par 3")) ctl = OSCILLATOR::control::baseModulationParameter3; } if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "waveform overflow >" << source << endl; } void TextData::encodeResonance(string& source, CommandBlock& allData) { uchar ctl = UNUSED; allData.data.insert = TOPLEVEL::insert::resonanceGroup; // this might be changed for graph inserts if (findAndStep(source, "Max dB")) ctl = RESONANCE::control::maxDb; if (findAndStep(source, "Center Freq")) ctl = RESONANCE::control::centerFrequency; if (findAndStep(source, "Octaves")) ctl = RESONANCE::control::octaves; if (findAndStep(source, "Random")) ctl = RESONANCE::control::randomType; if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "resonance overflow >" << source << endl; } // ---------------------------- void TextData::encodeLFO(string& source, CommandBlock& allData) { uchar ctl = UNUSED; allData.data.insert = TOPLEVEL::insert::LFOgroup; if (findAndStep(source, "Freq Random") ||findAndStep(source, "FreqRand")) // must be before Freq ctl = LFOINSERT::control::frequencyRandomness; else if (findAndStep(source, "Freq")) ctl = LFOINSERT::control::speed; else if (findAndStep(source, "Depth")) ctl = LFOINSERT::control::depth; else if (findAndStep(source, "Start")) ctl = LFOINSERT::control::start; else if (findAndStep(source, "Delay")) ctl = LFOINSERT::control::delay; else if (findAndStep(source, "Amp Random")||findAndStep(source, "AmpRand")) ctl = LFOINSERT::control::amplitudeRandomness; else if (findAndStep(source, "Stretch")) ctl = LFOINSERT::control::stretch; if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "lfo overflow >" << source << endl; } void TextData::encodeEnvelope(string& source, CommandBlock& allData) { uchar ctl = UNUSED; if (findAndStep(source, "Freemode Point")) { if (findCharNum(source, ctl)) { if (findAndStep(source, "X")) allData.data.insert = TOPLEVEL::insert::envelopePointChangeDt; else if (findAndStep(source, "Y")) allData.data.insert = TOPLEVEL::insert::envelopePointChangeVal; else ctl = UNUSED; } } else { allData.data.insert = TOPLEVEL::insert::envelopeGroup; if (findAndStep(source, "Attack Level") || findAndStep(source, "A val")) ctl = ENVELOPEINSERT::control::attackLevel; else if (findAndStep(source, "Attack Time") || findAndStep(source, "A dt")) ctl = ENVELOPEINSERT::control::attackTime; else if (findAndStep(source, "Decay Level") || findAndStep(source, "D val")) ctl = ENVELOPEINSERT::control::decayLevel; else if (findAndStep(source, "Decay Time") || findAndStep(source, "D dt")) ctl = ENVELOPEINSERT::control::decayTime; else if (findAndStep(source, "Sustain Level") || findAndStep(source, "S val")) ctl = ENVELOPEINSERT::control::sustainLevel; else if (findAndStep(source, "Release Level") || findAndStep(source, "R val")) ctl = ENVELOPEINSERT::control::releaseLevel; else if (findAndStep(source, "Release Time") || findAndStep(source, "R dt")) ctl =ENVELOPEINSERT::control::releaseTime; else if (findAndStep(source, "Stretch")) ctl = ENVELOPEINSERT::control::stretch; } if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "envelope overflow >" << source << endl; } void TextData::encodeFilter(string& source, CommandBlock& allData) { uchar ctl = UNUSED; allData.data.insert = TOPLEVEL::insert::filterGroup; if (findAndStep(source, "C_Freq") || findAndStep(source, "C Freq") || findAndStep(source, "Cent Freq")) ctl = FILTERINSERT::control::centerFrequency; else if (findAndStep(source, "Q")) ctl = FILTERINSERT::control::Q; else if (findAndStep(source, "VsensA") || findAndStep(source, "Velocity Sense")) ctl = FILTERINSERT::control::velocitySensitivity; else if (findAndStep(source, "Vsens") || findAndStep(source, "Velocity Sense Curve")) ctl = FILTERINSERT::control::velocityCurve; else if (findAndStep(source, "ain")) // missing G/g deliberate ctl = FILTERINSERT::control::gain; else if (findAndStep(source, "Freq Track") || findAndStep(source, "FreqTrk")) ctl = FILTERINSERT::control::frequencyTracking; else if (findAndStep(source, "Form")) { if (findAndStep(source, "Morph") || findAndStep(source, "Fr Sl")) ctl = FILTERINSERT::control::formantSlowness; else if (findAndStep(source, "Lucidity") || findAndStep(source, "Vw Cl")) ctl = FILTERINSERT::control::formantClearness; else if (findAndStep(source, "Stretch")) ctl = FILTERINSERT::control::formantStretch; else if (findAndStep(source, "Cent Freq")) ctl = FILTERINSERT::control::formantCenter; else if (findAndStep(source, "Octave")) ctl = FILTERINSERT::control::formantOctave; } else if (findAndStep(source, "Vowel")) { uchar Vnum = UNUSED - 1; // special cases uchar Fnum = UNUSED - 1; // actually have printed zeros if (findCharNum(source, Vnum)) allData.data.offset = Vnum + 1; else { log(source, "no vowel number"); return; } if (findAndStep(source, "Formant")) { if (findCharNum(source, Fnum)) allData.data.parameter = Fnum + 1; else { log(source, "no formant number"); return; } if (findAndStep(source, "Form Freq")) ctl = FILTERINSERT::control::formantFrequency; else if (findAndStep(source, "Form Q")) ctl = FILTERINSERT::control::formantQ; else if (findAndStep(source, "Form Amp")) ctl = FILTERINSERT::control::formantAmplitude; } } if (ctl < UNUSED) { allData.data.control = ctl; return; } allData.data.control = TOPLEVEL::control::unrecognised; allData.data.source = TOPLEVEL::action::noAction; cout << "filter overflow >" << source << endl; } yoshimi-2.3.5.1/src/Interface/Text2Data.h000066400000000000000000000051421506652756400200230ustar00rootroot00000000000000/* Text2Data.h - conversion of text to commandBlock entries Copyright 2021, Will Godfrey Copyright 2024, Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef TEXTDATA_H #define TEXTDATA_H #include #include "globals.h" using std::string; class SynthEngine; class TextMsgBuffer; class TextData { public: void encodeAll(SynthEngine*, string& sendCommand, CommandBlock&); private: SynthEngine* oursynth; void log(string& line, string text); void strip(string& line); void nextWord(string& line); bool findCharNum(string& line, uchar& value); bool findAndStep(string& line, string text, bool step = true); int findListEntry(string& line, int step, const string list []); int mapToEffectNumber(int textIndex, const int list []); int findEffectFromText(string& line, int step, const string list [], const int listmap []); void encodeLoop(string source, CommandBlock&); void encodeMain (string& source, CommandBlock&); void encodeScale(string& source, CommandBlock&); void encodePart (string& source, CommandBlock&); void encodeController(string& source, CommandBlock&); void encodeMidi (string& source, CommandBlock&); void encodeEffects (string& source, CommandBlock&); void encodeAddSynth (string& source, CommandBlock&); void encodeAddVoice (string& source, CommandBlock&); void encodeSubSynth (string& source, CommandBlock&); void encodePadSynth (string& source, CommandBlock&); void encodeWaveform (string& source, CommandBlock&); void encodeResonance(string& source, CommandBlock&); void encodeLFO (string& source, CommandBlock&); void encodeEnvelope (string& source, CommandBlock&); void encodeFilter (string& source, CommandBlock&); }; #endif /*TEXTDATA_H*/ yoshimi-2.3.5.1/src/Interface/TextLists.cpp000066400000000000000000001522141506652756400205240ustar00rootroot00000000000000/* TextLists.h Copyright 2019-2023, Will Godfrey Copyright 2024-2025, Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include #include /* * These are all handled bit-wise so that you can set several * at the same time. e.g. part, addSynth, resonance. * There is a function that will clear just the highest bit that * is set so you can then step back up the level tree. * It is also possible to zero it so that you immediately go to * the top level. Therefore, the sequence is important. * 21 bits are currently defined out of a possible 32. * * Top, AllFX and InsFX MUST be the first three */ std::string basics [] = { "? Help", "show commands", "List", "list current settings", "GUide", "show location of most recent HTML guide", "STop", "all sound off", "RESet [s]", "return to start-up conditions, 'ALL' clear MIDI-learn (if 'y')", "EXit [s]", "tidy up and close Yoshimi (if 'y'), 'FOrce' instant exit regardless", "RUN ", "execute named command script forcing top level start", "RUNLocal ", "execute named command script from current context level", " WAIT ", "1mS to 30,000mS delay, within script only", "..", "step back one level", "/", "step back to top level", "@end","@end" }; std::string toplist [] = { "ADD", "add paths and files", " Root ", "root path to list", " Bank ", "make new bank in current root", " YOshimi [n]", "new Yoshimi instance ID", "IMPort [s ] ", "import named directory to slot n2 of current root, (or 'Root' n1)", "EXPort [s ] ", "export bank at slot n2 of current root, (or 'Root' n1) to named directory", "REMove", "remove paths, files and entries", " Root ", "de-list root path ID", " Bank [s ]", "delete bank ID n1 (and all instruments) from current root (or 'Root' n2)", " INstrument ", "delete instrument from slot n in current bank", " YOshimi ", "close instance ID", " MLearn [n]", "delete midi learned 'ALL' whole list, or '@'(n) line", "Set/Read/MLearn", "manage all main parameters", "MINimum/MAXimum/DEFault", "find ranges", " Part [n] ...", "enter context level at part n", " VEctor [n] ...", "enter context level at vector n", " SCale ...", "enter context level", " MLearn ...", "enter editor context level", " Bank ...", "enter context level", " COnfig ...", "enter context level", " TESt ...", "launch test calculations (for developers)", " YOshimi ", "read current instance or change to n", " MONo ", "main output mono/stereo (ON = mono, {other})", " SYStem effects [n]", "enter effects context level Optionally to n.", " ", "non-destructively enables/disables the effect", " SEnd ", "send system effect to effect n1 at volume n2", " (effect) ", "the effect type", " PREset ", "set numbered effect preset to n", " -- ", "effect dependent controls", " INSert effects [n1]", "enter effects context level Optionally to n.", " SEnd /", "set where (Master, OFF or part number)", " (effect) ", "the effect type", " PREset ", "set numbered effect preset to n", " -- ", "effect dependent controls", " AVailable ", "available parts (16, 32, 64)", " PANning ", "panning type (Cut, Default, Boost)", " Volume ", "master volume", " SHift ", "master key shift semitones (0 no shift)", " BPM ", "default BPM if none from MIDI", " DEtune ", "master fine detune", " SOlo ", "channel 'solo' switch type (ROw, COlumn, LOop, TWoway, CHannel {other} off)", " SOlo CC ", "incoming 'solo' CC number (type must be set first)", " CLear ", "restore instrument on part n to default settings", "DISplay", "manage graphic display (if enabled)", " Hide", "current window", " View", "window (if enabled)", " Xposition", "window (if visible)", " Yposition", "window (if visible)", " SIze", "of window (if visible)", " SElect", "from theme list", " Copy", "selected theme", " Rename", "selected theme", " Delete", "selected theme", " Import", "external theme", " Export", "selected theme", "UNDo", "Revert last control change", "REDo", "Re-apply last control change", "@end","@end" }; std::string configlist [] = { "Oscillator ", "* Add/Pad size (power 2 256-16384)", "BUffer ", "* internal size (power 2 16-4096)", "PAdsynth [s]", "interpolation type (Linear, other = cubic)", "BUIldpad [s]", "PADSynth wavetable build mode (Muted, Background, Autoapply)", "Virtual ", "keyboard (0 = QWERTY, 1 = Dvorak, 2 = QWERTZ, 3 = AZERTY)", "Xml ", "compression (0-9)", "REports [s]", "destination (Stdout, other = console)", "SAved [s]", "saved instrument type (Legacy {.xiz}, Yoshimi {.xiy}, Both)", //"ENGine [s]", "enable instrument engines and types info (OFF, {other})", "EXPose ", "show current context level (ON, OFF, PRompt)", "STate [s]", "* autoload default at start (ON, {other})", "SIngle [s]", "* force 2nd startup to open new instance instead (ON, {other})", "Hide [s]", "non-essential reports (ON, {other})", "Warn [s]", "warn parts have changed if loading or resetting (ON, {other})", //"Display [s]", "GUI splash screen (ON, {other})", "Time [s]", "add to instrument load message (ON, {other})", "Include [s]", "XML headers on file load(Enable {other})", "Keep [s]", "include inactive data on all file saves (ON, {other})", "Gui [s]", "* run with GUI (ON, OFF)", "Cli [s]", "* run with CLI (ON, OFF)", "IDentify", "identify last bank entry fetched or added (ON, {other})", "LOCk ", "lock history of group s1 (ON, OFF)", "","INstrument, PAtchset, SCale, STate, VEctor, MLearn", "MIdi ", "* connection type (Jack, Alsa)", "AUdio ", "* connection type (Jack, Alsa)", "ALsa Type ", "* midi connection type (Fixed, Search, External)", "ALsa Midi ", "* comma separated source name list", "ALsa Audio ", "* name of hardware device", "ALsa Sample ", "* rate (0 = 192000, 1 = 96000, 2 = 48000, 3 = 44100)", "Jack Midi ", "* name of source", "Jack Server ", "* name", "Jack Auto ", "* connect jack on start (ON, {other})", "ROot [s]", "root CC (Msb, Lsb, Off)", "BAnk [s]", "bank CC (Msb, Lsb, Off)", "PRogram [s]", "program change (ON, {other})", "EXTended [n]", "CC value for extended program change >= 120 is off", "Quiet [s]", "ignore 'reset all controllers' (ON, {other})", "OMni [s]", "enable omni mode change (ON, {other})", "Nrpn [s]", "incoming NRPN (ON, {other})", "Log [s]", "incoming MIDI CCs (ON, {other})", "SHow [s]", "GUI MIDI learn editor (ON, {other})", "@end","@end" }; std::string banklist [] = { "", "set current bank to number n", " ", "or read current ID and name", "Name ", "change the name of the current bank", " ", "or read current name only", "Root ", "set current bank root number", " ", "or read current full path", "Root ID ", "change current bank root ID to n", // "Swap [n2]", "Swap current bank with bank n1, (opt. in root n2)", "INstrument Rename ", "change the name of slot n in the current bank", "INstrument SAve ", "save current part's instrument to bank slot n", "@end","@end" }; std::string displaylist [] = { "Hide", "", "Show", "", "Xposition", "horizintal position in pixels", "Yposition", "vertical position in pixels", "Width", "width in pixels", "HEight", "height in pixels", "SElect", "set the selection as the theme", // theme entries "Copy", "copy the selection to one with a new name", "Rename", "change the name of the selection", "Delete", "remove the selection from the list", "Import", "import an external theme file", "Export", "export the selection to an external theme file", "@end","@end" }; std::string partlist [] = { "", "select part number", "", "enables/disables the part", "Volume ", "volume", "Pan ", "panning position", "VElocity ", "velocity sensing sensitivity", "LEvel ", "velocity sense offset level", "MIn <[s][n]>", "minimum MIDI note value (Last seen or 0-127)", "MAx <[s][n]>", "maximum MIDI note value (Last seen or 0-127)", "FUll", "reset to full key range", "POrtamento ", "portamento (ON, {other})", "Mode ", "key mode (Poly, Mono, Legato)", "Note ", "note polyphony", "SHift ", "key shift semitones (0 no shift)", "BYpass ", "bypass part effect number n, (ON, {other})", "EFfects [n]", "enter effects context level", " (effect) ", "the effect type", " PREset ", "set numbered effect preset to n", " Send ", "send part to system effect n1 at volume n2", " -- ", "effect dependent controls", "PRogram /[s]", "loads instrument ID - Group n selects from group list", "LAtest", "Show most recent bank load or save", "NAme ", "sets the display name the part can be saved with", "TYPe ", "sets the instrument type", "COPyright ", "sets the instrument copyright message", "INFo ", "fills the comments info entry", "Humanise Pitch ", "adds a small random pitch change at note_on", "Humanise Velocity ", "adds a small random velocity change at note_on", "CLear [s]", "sets current instrument level parameters to default.", "", "ALL, resets the entire part, including controllers etc.", "CHannel ", "MIDI channel (> 32 disables, > 16 note off only)", "OMni ", "Omni mode (ON, {other})", "AFtertouch Chan [s2]", "Off, Filter (Down) + Peak (Down) + Bend (Down) + Modulation + Volume", "AFtertouch Key [s2]", "Off, Filter (Down) + Peak (Down) + Bend (Down) + Modulation", "Destination ", "jack audio destination (Main, Part, Both)", "MUlti", "set and enter kit mode. Allow item overlaps", "SIngle", "set and enter kit mode. Lowest numbered item in key range", "CRoss", "set and enter kit mode. Cross fade pairs", "kit mode entries","", "KIT", "access controls (if already enabled)", " MUlti", "change to allow item overlaps", " SIngle", "change to lowest numbered item in key range", " CRoss", "change to cross fade pairs", " QUiet ", "silence this item (OFF, {other})", " ", "select kit item number (1-16)", " ", "enables/disables the kit item", " MIn <[s][n]>", "minimum MIDI note value for this item (Last seen or 0-127)", " MAx <[s][n]>", "maximum MIDI note value for this item (Last seen or 0-127)", " FUll", "reset to full key range", " EFfect ", "select effect for this item (0-none, 1-3)", " NAme ", "set the name for this item", " DRum ", "set kit to drum mode (OFF, {other})", " NORmal", "disable kit mode", "ADDsynth ...", "enter AddSynth context", "SUBsynth ...", "enter SubSynth context", "PADsynth ...", "enter PadSynth context", "MCOntrol ...", "enter MIDI controllers context", "@end","@end" }; std::string mcontrollist [] = { "VOlume ", "enables/disables volume control (OFF {other})", "VRange ", "volume control range", "PAn ", "panning control width", "MOdwheel ", "enables/disables exponential modulation (ON {other})", "MRange ", "modulation control range", "EXpression ", "enables/disables expression control (OFF {other})", "SUstain ", "enables/disables sustain control (OFF {other})", "PWheel ", "pitch wheel control range", "BReath ", "enables/disables breath control (OFF {other})", "CUtoff ", "filter cutoff range", "Q ", "filter Q range", "BANdwidth ", "enables/disables exponential bandwidth (ON {other})", "BARange ", "bandwidth control range", "FMamplitude ", "enables/disables FM amplitude control (OFF {other})", "RCenter ", "resonance center frequency", "RBand ", "resonance bandwidth", "POrtamento ", "enables/disables portamento control (OFF {other})", "PGate ", "point when portamento starts or ends", "PForm ", "whether portamento is from or to (Start / End)", "PTime ", "portamento sweep time", "PDownup ", "portamento time stretch - down/up ratio", "PProportional ", "enables/disables proportional portamento (ON {other})", "PExtent ", "distance to double change", "PRange ", "difference from non proportional", "CLear", "set all controllers to defaults", " emulators","", "E Modulation ", "emulate modulation controller", "E Expression ", "emulate expression controller", "E BReath ", "emulate breath controller", "E Q ", "emulate filter Q controller", "E Cutoff ", "emulate filter cutoff controller", "E BAndwidth ", "emulate bandwidth controller", "@end","@end" }; std::string addsynthlist [] = { "", "enables/disables the part", "Volume ", "volume", "Pan ", "panning position", "PRandom ", "enable random panning(ON, {other})", "PWidth ", "random panning range", "VElocity ", "velocity sensing sensitivity", "STEreo ", "ON, {other}", "DEPop ", "initial attack slope", "PUnch Power ", "attack boost amplitude", "PUnch Duration ", "attack boost time", "PUnch Stretch ", "attack boost extend", "PUnch Velocity ", "attack boost velocity sensitivity", "DETune Fine ", "fine frequency", "DETune Coarse ", "coarse stepped frequency", "DETune Type ", "type of coarse stepping", "","(DEFault, L35, L10, E100, E1200)", "OCTave ", "shift octaves up or down", "BAndwidth ", "modifies relative fine detune of voices", "GRoup ", "disables harmonic amplitude randomness of voices with", "","a common oscllator (ON, {other})", "VOIce ...", "enter Addsynth voice context", "LFO ...", "enter LFO insert context", "FILter ...", "enter Filter insert context", "ENVelope ...", "enter Envelope insert context", "REsonance ...", "enter Resonance context", "@end","@end" }; std::string addvoicelist [] = { "", "select voice number", "", "enables/disables the part", "Volume ", "volume", "Pan ", "panning position", "PRandom ", "enable random panning(ON, {other})", "PWidth ", "random panning range", "VElocity ", "velocity sensing sensitivity", "BENd Adjust ", "pitch bend range", "BENd Offset ", "pitch bend shift", "DETune Fine ", "fine frequency", "DETune Coarse ", "coarse stepped frequency", "DETune Type ", "type of coarse stepping", "","(DEFault, L35, L10, E100, E1200)", "OCTave ", "shift octaves up or down", "FIXed ", "set base frequency to 440Hz (ON, {other})", "EQUal ", "equal temper variation", "Type ", "sound type (Oscillator, White noise, Pink noise, Spot noise)", "SOurce <[s]/[n]>", "voice source (Local, {voice number})", "OSCillator <[s]/[n]>", "oscillator source (Internal, {voice number})", "Phase ", "relative voice phase", "Minus ", "invert entire voice (ON, {other})", "DELay ", "delay before this voice starts", "REsonance ", "enable resonance for this voice (ON, {other})", "BYpass ", "bypass global filter for this voice (ON, {other})", "Unison ", "(ON, OFF)", "Unison Size ", "number of unison elements", "Unison Frequency ", "frequency spread of elements", "Unison Phase ", "phase randomness of elements", "Unison Width ", "stereo width", "Unison Vibrato ", "vibrato depth", "Unison Rate ", "vibrato speed", "Unison Invert ", "phase inversion type (None, Random, Half, Third, Quarter, Fifth)", "MOdulator ...", "enter modulator context", "WAveform ...", "enter the oscillator waveform context", "LFO ...", "enter LFO insert context", "FILter ...", "enter Filter insert context", "ENVelope ...", "enter Envelope insert context", "@end","@end" }; std::string addmodlist [] = { "MOdulator", "enter Modulator context", " - category - ","", "OFF", "disable modulator", "MORph","", "RINg","", "PHAse","", "FREquency","", "PULse", "pulse width", "","", "Volume ", "volume", "VElocity ", "velocity sensing sensitivity", "Damping ", "higher frequency relative damping", "DETune Fine ", "fine frequency", "DETune Coarse ", "coarse stepped frequency", "DETune Type ", "type of coarse stepping", "","(DEFault, L35, L10, E100, E1200)", "SOurce <[s]/[n]>", "oscillator source (Local, {voice number})", "OSCillator <[s]/[n]>", "modulation oscillator(Internal, {modulator number})", "FOLlow ", "use source oscillator detune (ON, {other})", "FIXed ", "set modulator frequency to 440Hz (ON, {other})", "SHift ", "oscillator relative phase", "WAveform ...", "enter the oscillator waveform context", "@end","@end" }; // need to find a way to avoid this kind of duplication std::string addmodnameslist [] = {"Off", "Morph", "Ring", "Phase", "Frequency", "Pulsewidth", "@end"}; std::string subsynthlist [] = { "", "enables/disables the part", "Volume ", "volume", "Pan ", "panning position", "PRandom ", "enable random panning(ON, {other})", "PWidth ", "random panning range", "VElocity ", "velocity sensing sensitivity", "STEreo ", "ON, {other}", "BENd Adjust ", "pitch bend range", "BENd Offset ", "pitch bend shift", "DETune Fine ", "fine frequency", "DETune Coarse ", "coarse stepped frequency", "DETune Type ", "type of coarse stepping", "","(DEFault, L35, L10, E100, E1200)", "OCTave ", "shift octaves up or down", "FIXed ", "set base frequency to 440Hz (ON, {other})", "EQUal ", "equal temper variation", "OVertone Position ", "relationship to fundamental", "","(HArmonic, SIne, POwer, SHift, UShift, LShift, UPower, LPower)", "OVertone First ", "degree of first parameter", "OVertone Second ", "degree of second parameter", "OVertone Harmonic ", "amount harmonics are forced", "HArmonic Amp ", "set harmonic n1 to n2 intensity", "HArmonic Band ", "set harmonic n1 to n2 width", "HArmonic Stages ", "number of stages", "HArmonic Mag ", "harmonics filtering type", "", "Linear, 40dB, 60dB, 80dB, 100dB", "HArmonic Position ", "start position (Zero, Random, Maximum)", "BAnd Width ", "common bandwidth", "BAnd Scale ", "bandwidth slope v frequency", "FILter ...", "enter Filter insert context", "ENVelope ...", "enter Envelope insert context", "@end","@end" }; std::string padsynthlist [] = { "", "enables/disables the SubSynth engine", "Apply", "use on 1st entry & harmonic changes", "Volume ", "volume", "Pan ", "panning position", "PRandom ", "enable random panning(ON, {other})", "PWidth ", "random panning range", "VElocity ", "velocity sensing sensitivity", "STEreo ", "ON, {other}", "DEPop ", "initial attack slope", "PUnch Power ", "attack boost amplitude", "PUnch Duration ", "attack boost time", "PUnch Stretch ", "attack boost extend", "PUnch Velocity ", "attack boost velocity sensitivity", "BENd Adjust ", "pitch bend range", "BENd Offset ", "pitch bend shift", "DETune Fine ", "fine frequency", "DETune Coarse ", "coarse stepped frequency", "DETune Type ", "type of coarse stepping", "","(DEFault, L35, L10, E100, E1200)", "OCTave ", "shift octaves up or down", "FIXed ", "set base frequency to 440Hz (ON, {other})", "EQUal ", "equal temper variation", "OVertone Position ", "relationship to fundamental", "","(HArmonic, SIne, POwer, SHift, UShift, LShift, UPower, LPower)", "OVertone First ", "degree of first parameter", "OVertone Second ", "degree of second parameter", "OVertone Harmonic ", "amount harmonics are forced", "PRofile ", "shape of harmonic profile (Gauss, Square Double exponent)", "WIdth ", "width of single peak within harmonic profile", "COunt ", "number of profile repetitions", "EXpand ", "stretch and add harmonics and change distribution", "FRequency ", "further modifies distribution (dependent on expand)", "SIze ", "scale harmonic profile as a whole", "CRoss ", "cross section of profile (Full, Upper, Lower)", "MUltiplier ", "amplitude multiplier (OFF, Gauss, Sine, Flat)", "MOde ", "amplitude mode (Sum, Mult, D1, D2)", "CEnter ", "changes the central harmonic component width", "RELative ", "changes central component relative amplitude", "AUto ", "autoscaling (ON {other})", "BASe ", "base profile distribution (C2, G2, C3, G3, C4, G4, C5, G5, G6)", "SAmples ", "samples/octave (0.5, 1, 2, 3, 4, 6, 12)", "RAnge ", "number of octaves (1 to 8)", "LEngth ", "length of one sample in k (16, 32, 64, 128, 256, 512, 1024)", "BAndwidth ", "overall bandwidth", "SCale ", "bandwidth scale (Normal, Equalhz, Quarter, Half, Threequart, Oneandhalf, Double, Inversehalf)", "SPectrum ", "spectrum mode (Bandwidth, Discrete, Continuous)", "XFadeupdate ", "cross fade (millisec) after building new wavetable", "BUildtrigger ", "re-trigger wavetable build after n millisec", "RWDetune ", "random walk spread of voice detune on re-triggered build (0:off 96 factor 2)", "RWBandwidth ", "random walk spread of line bandwidth", "RWFilterFreq ", "random walk spread of filter cutoff frequency", "RWWidthProfile ", "random walk spread of profile line width", "RWStretchProfile ", "random walk spread of profile modulation stretch", "APply", "puts latest changes into the wavetable", "XPort ", "export current sample set to named file", "WAveform ...", "enter the oscillator waveform context", "RESonance ...", "enter Resonance context", "LFO ...", "enter LFO insert context", "FILter ...", "enter Filter insert context", "ENVelope ...", "enter Envelope insert context", "@end","@end" }; std::string resonancelist [] = { "(enable) ", "activate resonance (ON, {other})", "PRotect ", "leave fundamental unchanged (ON, {other})", "Maxdb ", "maximum attenuation of points", "Random ", "set a random distribution (Coarse, Medium, Fine)", "CEnter ", "center frequency of range", "Octaves ", "number of octaves covered", "Interpolate ", "turn isolated peaks into lines or curves (Linear, Smooth)", "Smooth", "reduce range and sharpness of peaks", "CLear", "set all points to mid level", "POints [ [n2]]", "show all or set/read n1 to n2", "APply", "fix settings (only for PadSynth)", "@end","@end" }; std::string waveformlist [] = { "SINe", "basic waveforms", "TRIangle","", "PULse","", "SAW","", "POWer","", "GAUss","", "DIOde","", "ABSsine","", "PSIne","", "STRetchsine","", "CHIrp","", "ASIne","", "CHEbyshev","", "SQUare","", "SPIke","", "CIRcle","", "HYPersec","", "","", "", "set basic waveform by above list", "Harmonic Amp ", "harmonic n1 to n2 intensity", "Harmonic Phase ", "harmonic n1 to n2 phase", "Harmonic Shift ", "amount harmonics are moved", "Harmonic Before ", "shift before waveshaping and filtering (ON {other})", "COnvert", "change resultant wave to groups of sine waves", "CLear", "clear harmonic settings", "Base Par ", "basic wave parameter", "Base Mod Type ", "basic modulation type (OFF, Rev, Sine Power)", "Base Mod Par ", "parameter number n1 (1 - 3), n2 value", "Base Convert [s]", "use resultant basic wave as base shape", "","also clear modifiers and harmonics (OFF {other})", "SHape Type ", "wave shape modifier type", "","(OFF, ATAn, ASYm1, POWer, SINe, QNTs, ZIGzag, LMT, ULMt, LLMt, ILMt, CLIp, AS2, PO2, SGM)", "SHape Par ", "wave shape modifier amount", "Filter Type ","", "","(OFF, LP1, HPA1, HPB1, BP1, BS1, LP2, HP2, BP2, BS2, COS, SIN, LSH, SGM)", "Filter Par ", "filter parameters n1 (1/2), n2 value", "Filter Before ", "do filtering before waveshaping (ON {other})", "Modulation Par ", "overall modulation n1 (1 - 3), n2 value", "SPectrum Type ", "spectrum adjust type (OFF, Power, Down/Up threshold)", "SPectrum Par ", "spectrum adjust amount", "ADdaptive Type ", "adaptive harmonics (OFF, ON, SQUare, 2XSub, 2XAdd, 3XSub, 3XAdd, 4XSub, 4XAdd)", "ADdaptive Base ", "adaptive base frequency", "ADdaptive Level ", "adaptive power", "ADdaptive Par ", "adaptive parameter", "APply", "fix settings (only for PadSynth)", "@end","@end" }; std::string LFOlist [] = { " - category -","", "AMplitude", "amplitude type", "FRequency", "frequency type", "FIlter", "filter type", " - control -","", "Rate [][ ]", "frequency or BPM [1 16] to [16 1], [2 3], [3 2]", "Intensity ", "depth", "Start ", "start position in cycle", "Delay ", "time before effect", "Expand ", "rate / note pitch", "Bpm ", "sync frequency to MIDI clock (ON, {other})", "Continuous ", "(ON, {other})", "AR ", "amplitude randomness", "RR ", "frequency randomness", "Type ", "LFO oscillator shape", "","SIne, TRiangle, SQuare, RUp (ramp up), RDown (ramp down), E1down (exp. 1), E2down (exp. 1)", "","SH (sample/hold), RSU (rand square up), RSD (rand square down)", "e.g. S FI T RU", "set filter type ramp up", "@end","@end" }; // TODO need to find a way to safely (and efficiently) combine these std::string LFOtype [] = { "SIne", "TRiangle", "SQuare", "RUp (ramp up)", "RDown (ramp down)", "E1down (exp. 1)", "E2down (exp. 2)", "SH (sample/hold)", "RSU (rand square up)", "RSD (rand square dn)", "@end" }; std::string LFObpm [] = { "1/16 BPM", // space for expansion "1/16 BPM", "1/15 BPM", "1/14 BPM", "1/13 BPM", "1/12 BPM", "1/11 BPM", "1/10 BPM", "1/9 BPM", "1/8 BPM", "1/7 BPM", "1/6 BPM", "1/5 BPM", "1/4 BPM", "1/3 BPM", "1/2 BPM", "2/3 BPM", "1/1 BPM", "3/2 BPM", "2/1 BPM", "3/1 BPM", "4/1 BPM", "5/1 BPM", "6/1 BPM", "7/1 BPM", "8/1 BPM", "9/1 BPM", "10/1 BPM", "11/1 BPM", "12/1 BPM", "13/1 BPM", "14/1 BPM", "15/1 BPM", "16/1 BPM", "16/1 BPM", // space for expansion "Unknown BPM", }; std::string filterlist [] = { "CEnter ", "center frequency", "Q ", "Q factor", "Velocity ", "velocity sensitivity", "SLope ", "velocity curve", "Gain ", "overall amplitude", "TRacking ", "frequency tracking", "Range ", "extended tracking (ON, {other})", "CAtegory ", "Analog, Formant, State variable", "STages ", "filter stages (1 to 5)", "TYpe ", "category dependent - not formant", " - analog -","", "l1", "one stage low pass", "h1", "one stage high pass", "l2", "two stage low pass", "h2", "two stage high pass", "band", "two stage band pass", "stop", "two stage band stop", "peak", "two stage peak", "lshelf", "two stage low shelf", "hshelf", "two stage high shelf", " - state variable -","", "low", "low pass", "high", "high pass", "band", "band pass", "stop", "band stop", " - formant -","", "EDit ...", "enter editor context level", "@end","@end" }; std::string formantlist [] = { "","(shows V current vowel, and F current formant)", "Invert ", "invert effect of LFOs, envelopes (ON, OFF)", "CEnter ", "center frequency of sequence", "Range ", "octave range of formants", "Expand ", "stretch overall sequence time", "Lucidity ", "clarity of vowels", "Morph ", "speed of change between formants", "Size ", "number of vowels in sequence", "COunt ", "number of formants in vowels", "Vowel ", "vowel being processed", "Point ", "sequence position n1 vowel n2 value", "FOrmant ", "formant being processed", " - per formant -","", " FRequency ", "center frequency of formant", " Q ", "bandwidth of formant", " Gain ", "amplitude of formant", "@end","@end" }; std::string envelopelist [] = { " - category -","", "AMplitude", "amplitude type", "FRequency", "frequency type", "FIlter", "filter type", "BAndwidth", "bandwidth type (SubSynth only)", "","", " - common - ","", "Expand ", "envelope time on lower notes", "Force ", "force release (ON, {other})", "Linear ", "linear slopes (ON, {other})", "FMode ", "set as freemode (ON, {other})", "","", " - fixed -","", "Attack Level ", "initial attack level", "Attack Time ", "time before decay point", "Decay Level ", "initial decay level", "Decay Time ", "time before sustain point", "Sustain ", "sustain level", "Release Time ", "time to actual release", "Release Level ", "level at envelope end", "e.g. S FR D T 40", "set frequency decay time 40", "Note:", "some envelopes have limited controls", "","", " - freemode -","", "Points", "number of defined points (read only)", "Sustain ", "point number where sustain starts", "Insert ", "insert point at n1 with X increment n2, Y value n3", "Delete ", "remove point n", "Change ", "change point n1 to X increment n2, Y value n3", "@end","@end" }; std::string reverblist [] = { "LEVel ", "amount applied", "PANning ", "left-right panning", "TIMe ", "reverb time", "DELay ", "initial delay", "FEEdback ", "delay feedback", "LOW ", "low pass filter", "HIGh ", "high pass filter", "DAMp ", "feedback damping", "TYPe ", "reverb type (Random, Freeverb, Bandwidth)", "ROOm ", "room size", "BANdwidth ", "actual bandwidth (only for bandwidth type)", "@end","@end" }; int reverblistmap[] = { 0, 1, 2, 3, 4, 7, 8, 9, 10, 11, 12, -1 }; std::string echolist [] = { "LEVel ", "amount applied", "PANning ", "left-right panning", "DELay ", "initial delay, left delay only if separate", "LRDelay ", "left-right delay, right delay if separate", "CROssover ", "left-right crossover", "FEEdback ", "echo feedback", "DAMp ", "feedback damping", "SEParate ", "separate left/right delays (ON {other})", "BPM ", "delay BPM sync (ON {other})", "@end","@end" }; int echolistmap[] = { 0, 1, 2, 3, 4, 5, 6, EFFECT::control::sepLRDelay, EFFECT::control::bpm, -1 }; std::string choruslist [] = { "LEVel ", "amount applied", "PANning ", "left-right panning", "FREquency ", "LFO frequency", "RANdom ", "LFO randomness", "WAVe ", "LFO waveshape (sine, triangle)", "SHIft ", "left-right phase shift", "DEPth ", "LFO depth", "DELay ", "LFO delay", "FEEdback ", "chorus feedback", "CROssover ", "left-right routing", "SUBtract ", "invert output (ON {other})", "BPM ", "LFO BPM sync (ON {other})", "STArt ", "LFO BPM phase start", "@end","@end" }; int choruslistmap[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // 10, Pflangemode is defined in Chorus.cpp, but appears to be unused. 11, EFFECT::control::bpm, EFFECT::control::bpmStart, -1 }; std::string phaserlist [] = { "LEVel ", "amount applied", "PANning ", "left-right panning", "FREquency ", "LFO frequency", "RANdom ", "LFO randomness", "WAVe ", "LFO waveshape (sine, triangle)", "SHIft ", "left-right phase shift", "DEPth ", "LFO depth", "FEEdback ", "phaser feedback", "STAges ", "number of filter stages", "CROssover ", "left-right routing", "SUBtract ", "invert output (ON {other})", "RELative ", "relative phase", "HYPer ", "hyper sine (ON {other})", "OVErdrive ", "distortion", "ANAlog ", "analog emulation (ON {other})", "BPM ", "LFO BPM sync (ON {other})", "STArt ", "LFO BPM phase start", "@end","@end" }; int phaserlistmap[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, EFFECT::control::bpm, EFFECT::control::bpmStart, -1 }; std::string alienwahlist [] = { "LEVel ", "amount applied", "PANning ", "left-right panning", "FREquency ", "LFO frequency", "RANdom", "LFO randomness", "WAVe ", "LFO waveshape (sine, triangle)", "SHIft ", "left-right phase shift", "DEPth ", "LFO depth", "FEEdback ", "filter feedback", "DELay ", "LFO delay", "CROssover ", "left-right routing", "RELative ", "relative phase", "BPM ", "LFO BPM sync (ON {other})", "STArt ", "LFO BPM phase start", "@end","@end" }; int alienwahlistmap[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, EFFECT::control::bpm, EFFECT::control::bpmStart, -1 }; std::string distortionlist [] = { "LEVel ", "amount applied", "PANning ", "left-right panning", "MIX ", "left-right mix", "DRIve ", "input level", "OUTput ", "output balance", "WAVe ", "function waveshape", "-","(ATAn, ASYm1, POWer, SINe, QNTs, ZIGzag, LMT, ULMt, LLMt, ILMt, CLIp, AS2, PO2, SGM)", "INVert ", "subtracts from the main signal, otherwise adds (ON {other})", "LOW ", "low pass filter", "HIGh ", "high pass filter", "STEreo ", "stereo (ON {other})", "FILter ", "filter before distortion", "@end","@end" }; int distortionlistmap[] = { 0, 1, 2, 3, 4, 5, 5, // there is an extra line in the list names 6, 7, 8, 9, 10, -1 }; std::string eqlist [] = { "LEVel ", "amount applied", "EQBand ", "EQ band number for following controls", "FILter ", "filter type", "-","(LP1, HP1, LP2, HP2, NOT, PEA, LOW, HIG)", "FREquency ", "cutoff/band frequency", "GAIn ", "makeup gain", "Q ", "filter Q", "STAges ", "number of extra filter stages", "@end","@end" }; int eqlistmap[] = { 0, 1, 10, 10, // there is an extra line in the list names 11, 12, 13, 14, -1 }; std::string dynfilterlist [] = { "LEVel ", "amount applied", "PANning ", "left-right panning", "FREquency ", "LFO frequency", "RANdom ", "LFO randomness", "WAVe ", "LFO waveshape (sine, triangle)", "SHIft ", "left-right phase shift", "DEPth ", "LFO depth", "SENsitivity ", "amount amplitude changes filter", "INVert ", "reverse effect of sensitivity (ON {other})", "RATe ", "speed of filter change with amplitude", "FILter ...", "enter dynamic filter context - ? FIL for controls", "BPM ", "LFO BPM sync (ON {other})", "STArt ", "LFO BPM phase start", "@end","@end" }; int dynfilterlistmap[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, EFFECT::control::bpm, EFFECT::control::bpmStart, -1 }; std::string filtershapes [] = {"OFF" ,"ATA", "ASY", "POW", "SIN", "QNT", "ZIG", "LMT", "ULM", "LLM", "ILM", "CLI", "CLI", "AS2", "PO2", "SGM", "@end"}; std::string learnlist [] = { "", "set current line number", "MUte ", "completely ignore this line (ON, {other})", "SEven", "set incoming NRPNs as 7 bit (ON, {other})", "CC ", "set incoming controller value", "CHan ", "set incoming channel number", "MIn ", "set minimum percentage", "MAx ", "set maximum percentage", "LImit ", "limit instead of compress (ON, {other})", "BLock ", "inhibit others on this CC/Chan pair (ON, {other})", "@end","@end" }; std::string vectlist [] = { "", "set current base channel", "[X/Y] CC ", "CC n is used for X or Y axis sweep", "[X/Y] Features [s]", "sets X or Y features 1-4 (ON, Reverse, {other})", "[X] PRogram ", "X program change ID for LEFT or RIGHT part", "[Y] PRogram ", "Y program change ID for DOWN or UP part", "[X/Y] Control ", "sets n2 CC to use for X or Y feature n1 (2-4)", "OFF", "disable vector for this channel", "Name ", "text name for this complete vector", "@end","@end" }; std::string scalelist [] = { "", "enables/disables microtonal scales", "IMPort ", "Import Scala file s2 to s1 TUNing or KEYmap", "EXPort ", "Export s1 TUNing or KEYmap to Scala file s2", "FRequency ", "Reference note actual frequency", "NOte ", "Reference note number", "Invert [s]", "invert entire scale (ON, {other})", "CEnter ", "note number of key center", "SHift ", "shift entire scale up or down", "SCale [s]", "activate microtonal scale (ON, {other})", "MApping [s]", "activate keyboard mapping (ON, {other})", "FIrst ", "first note number to map", "MIddle ", "middle note number to map", "Last ", "last note number to map", "Tuning [s2]", "CSV tuning values (n1.n1 or n1/n1 , n2.n2 or n2/n2 , etc.)", "Keymap [s2]", "CSV keymap (n1, n2, n3, etc.)", "SIze ", "actual keymap size", "NAme ", "internal name for this scale", "DEscription ", "description of this scale", "CLEar", "clear all settings and revert to standard scale", "@end","@end" }; std::string scale_errors [] = { "Nothing Entered", "Value is too small", "Value is too big", "Invalid Character", "Must be numbers (like 232.59) or divisions (like 121/64)", "File not found", "Empty file", "Corrupted file", "Missing entry", "Invalid octave size", "Invalid keymap size", "Invalid note number", "Value out of range", // translated as -12 "@end" }; std::string noteslist [] = { // from 21 "(A0)", "(A#0)", "(B0)", "(C1)", "(C#1)", "(D1)", "(D#1)", "(E1)", "(F1)", "(F#1)", "(G1)", "(G#0)", "(A1)", "(A#1)", "(B1)", "(C2)", "(C#2)", "(D2)", "(D#2)", "(E2)", "(F2)", "(F#2)", "(G2)", "(G#2)", "(A2)", "(A#2)", "(B2)", "(C3)", "(C#3)", "(D3)", "(D#3)", "(E3)", "(F3)", "(F#3)", "(G3)", "(G#3)", "(A3)", "(A#3)", "(B3)", "(C4)", "(C#4)", "(D4)", "(D#4)", "(E4)", "(F4)", "(F#4)", "(G4)", "(G#4)", "(A4)", "(A#4)", "(B4)", "(C5)", "(C#5)", "(D5)", "(D#5)", "(E5)", "(F5)", "(F#5)", "(G5)", "(G#5)", "(A5)", "(A#5)", "(B5)", "(C6)" }; std::string loadlist [] = { "Instrument ", "instrument to current part from named file", "SECtion [s]", "to current copy/paste context - no name = from clipboard", "Default", "default copyright to current part", "SCale ", "scale settings from named file", "VEctor [n] ", "vector to channel n (or saved) from named file", "Patchset ", "complete set of instruments from named file", "MLearn ", "midi learned list from named file", "STate ", "all system settings and patch sets from named file", "@end","@end" }; std::string savelist [] = { "Instrument ", "current part to named file", "SECtion [s]", "from current copy/paste context - no name = to clipboard", "Default", "current part copyright as default", "SCale ", "current scale settings to named file", "VEctor ", "vector on channel n to named file", "Patchset ", "complete set of instruments to named file", "MLearn ", "midi learned list to named file", "STate ", "all system settings and patch sets to named file", "Config", "current configuration", "@end","@end" }; std::string listlist [] = { "Roots", "all available root paths", "Banks [n]", "banks in root ID or current", "Instruments [n]", "instruments in bank ID or current", "Group [s2]", "instruments by type grouping ('Location' for extra details)", "Parts [s]", "parts with instruments installed ('More' for extra details)", "Vectors", "settings for all enabled vectors", "Tuning", "microtonal scale tunings", "Keymap", "microtonal scale keyboard map", "Config", "current configuration", "MLearn [s ]", "midi learned controls ('@' n for full details on one line)", "SECtion [s]", "copy/paste section presets", "History [s]", "recent files (Patchsets, SCales, STates, Vectors, MLearn)", "Effects [s]", "effect types ('all' include preset numbers and names)", "PREsets", "all the presets for the currently selected effect", "@end","@end" }; std::string testlist [] = { "NOte [n]", "midi note to play for test", "CHannel [n]", "midi channel to use for the test note", "VElocity [n]", "velocity to use for note on/off", "DUration [n]", "overall duration for the test sound", "HOldfraction [n]", "fraction of the duration to play sound before note off", "REpetitions [n]", "number of complete test cycles to play (minimum 1)", "SCalestep [n]", "semi-tones to move up/down when repeating a test note", "AOffset [n]", "overlapping additional note with offset n, current Holdfraction", "AHold [n]", "use n as a different Holdfraction for this additional note", "SWapWave [n]", "swap wavetable of 1st PADSynth item after offset n", "BUffersize [n]", "number of samples per Synth-call < global buffsize (=default)", "TArget [s]", "target file path to write sound data (empty: /dev/null)", "EXEcute", "actually trigger the test. Stops all other sound output.", "@end","@end" }; std::string presetgroups [] = { "Pfilter", "Filter", // dynfilter "Pfiltern", "Formant Filter Vowel", // dynfilter "Peffect", "Effect", "Pfilter", "Filter", "Pfiltern", "Formant Filter Vowel", "Poscilgen", "Waveform", "Presonance", "Resonance", "Plfoamplitude", "Amplitude LFO", "Plfofrequency", "Frequency LFO", "Plfofilter", "Filter LFO", "Penvamplitude", "Amplitude Envelope", "Penvfrequency", "Frequency Envelope", "Penvfilter", "Filter Envelope", "Penvbandwidth", "Bandwidth Envelope", "Padsythn", "AddSynth Voice", "Padsyth", "AddSynth", "Psubsyth", "SubSynth", "Ppadsyth", "PadSynth", "@end","@end" }; std::string replies [] = { "OK", "Done", "Value?", "Name?", "Which Operation?", " what?", "Out of range", "Too low", "Too high", "Unrecognised", "Parameter?", "Not at this level", "Not available", "Control or section inactive", "Unable to complete", "write only", "read only", "EXIT" }; std::string fx_list [] = { "UNset", "REverb", "ECho", "CHorus", "PHaser", "ALienwah", "DIstortion", "EQ", "DYnfilter", "@end" }; std::string type_list [] = { "undefined", "Piano", "Bells and Chimes", "Chromatic Percussion", "Organ", "Guitar", "Bass", "Solo Strings", "Ensemble", "Single Voice", "Choir", "Brass", "Reed", "Pipe", "Wind (other)", "Lead Synth", "Pad Synth", "Warm Pad", "Synth Effects", "Ethnic", "Percussive", "Sound Effects", "@end" }; const int type_offset [] = {0, 1, -3, 2, 3, 4, 5, 6, 7, -6, -2, 8, 9, 10, -5, 11, 12, -4, 13, 14, 15, 16, 255}; /* * The number of the above 2 entries must match * @end and 255 are the recognised terminators * The list order is the display order * Only add negative numbers (for backward compatibility) * On old synth versions they will resolve as 'undefined' * * Note: can't use -1 as ID */ std::string fx_presets [] = { "1, off", "13, cathedral 1, cathedral 2, cathedral 3, hall 1, hall 2, room 1, room 2, basement, tunnel, echoed 1, echoed 2, very long 1, very long 2", "8, echo 1, echo 2, simple echo, canyon, panning echo 1, panning echo 2, panning echo 3, feedback echo", "10, chorus 1, chorus 2, chorus 3, celeste 1, celeste 2, flange 1, flange 2, flange 3, flange 4, flange 5", "12, phaser 1, phaser 2, phaser 3, phaser 4, phaser 5, phaser 6, aphaser 1, aphaser 2, aphaser 3, aphaser 4, aphaser 5, aphaser 6", "4, alienwah 1, alienwah 2, alienwah 3, alienwah 4", "6, overdrive 1, overdrive 2, exciter 1, exciter 2, guitar amp, quantize", "1, not available", "4, wahwah, autowah, vocal morph 1, vocal morph 2" }; // effect controls std::string effreverb [] = {"LEV", "PAN", "TIM", "DEL", "FEE", "none5", "none6", "LOW", "HIG", "DAM", "TYP", "ROO", "BAN", "@end"}; std::string effecho [] = {"LEV", "PAN", "DEL", "LRD", "CRO", "FEE", "DAM", "SEP", "none8", "none9", "none10", "none11", "none12", "none13", "none14", "none15", "none16", "BPM", "@end"}; std::string effchorus [] = {"LEV", "PAN", "FRE", "RAN", "WAV", "SHI", "DEP", "DEL", "FEE", "CRO", "none10", "SUB", "none12", "none13", "none14", "none15", "none16", "BPM", "@end"}; std::string effphaser [] = {"LEV", "PAN", "FRE", "RAN", "WAV", "SHI", "DEP", "FEE", "STA", "CRO", "SUB", "REL", "HYP", "OVE", "ANA", "none15", "none16", "BPM", "@end"}; std::string effalienwah [] = {"LEV", "PAN", "FRE", "RAN", "WAV", "SHI", "DEP", "FEE", "DEL", "CRO", "REL", "none11", "none12", "none13", "none14", "none15", "none16", "BPM", "@end"}; std::string effdistortion [] = {"LEV", "PAN", "MIX", "DRI", "OUT", "WAV", "INV", "LOW", "HIG", "STE", "FIL", "@end"}; std::string effdistypes [] = {"ATAn", "ASYm1", "POWer", "SINe", "QNTs", "ZIGzag", "LMT", "ULMt", "LLMt", "ILMt", "CLIp", "AS2", "PO2", "SGM", "@end"}; std::string effeq [] = {"LEV", "EQB", "FIL", "FRE", "GAI", "Q", "STA"}; std::string eqtypes [] = {"OFF", "LP1", "HP1", "LP2", "HP2", "BP2", "NOT", "PEAk", "LOW shelf", "HIGh shelf", "@end"}; std::string effdynamicfilter [] = {"LEV", "PAN", "FRE", "RAN", "WAV", "SHI", "DEP", "SEN", "INV", "RAT", "FIL", "none11", "none12", "none13", "none14", "none15", "none16", "BPM", "STA", "@end"}; // common controls std::string detuneType [] = {"DEFault", "L35", "L10", "E100", "E1200", "@end"}; // waveform controls std::string waveshape [] = {"Sine", "Triangle", "Pulse", "Saw", "Power", "Gauss", "Diode", "AbsSine", "PulseSine", "StretchSine", "Chirp", "AbsStretchSine", "Chebyshev", "Square", "Spike", "Circle", "HyperSec"}; std::string wavebase [] = {"SIN", "TRI", "PUL", "SAW", "POW", "GAU", "DIO", "ABS", "PSI", "SSI", "CHI", "ASI", "CHE", "SQU", "SPI", "CIR", "HYP", "@end"}; std::string basetypes [] = {"c2", "g2", "c3", "g3", "c4", "g4", "c5", "g5", "g6"}; std::string filtertype [] = {"OFF", "LP1", "HPA", "HPB", "BP1", "BS1", "LP2", "HP2", "BP2", "BS2", "COS", "SIN", "LSH", "SGM", "@end"}; std::string adaptive [] = {"OFF", "ON", "SQU", "2XS", "2XA", "3XS", "3XA", "4XS", "4XA"}; // misc controls std::string historyGroup [] = {"IN", "PA", "SC", "ST", "VE", "ML"}; std::string subMagType [] = {"Linear", "40dB", "60dB", "80dB", "100dB"}; std::string subPadPosition [] = {"harmonic", "ushift", "lshift", "upower", "lpower", "sine", "power", "shift"}; std::string unisonPhase [] = {"none", "random", "half", "third", "quarter", "fifth"}; yoshimi-2.3.5.1/src/Interface/TextLists.h000066400000000000000000000123111506652756400201620ustar00rootroot00000000000000/* TextLists.h Copyright 2019-2023, Will Godfrey Copyright 2024, Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef TEXTLISTS_H #define TEXTLISTS_H #include #include /* * These are all handled bit-wise so that you can set several * at the same time. e.g. part, addSynth, resonance. * There is a function that will clear just the highest bit that * is set so you can then step back up the level tree. * It is also possible to zero it so that you immediately go to * the top level. Therefore, the sequence is important. * 21 bits are currently defined out of a possible 32. * * Top, AllFX and InsFX MUST be the first three */ namespace LEVEL{ enum { Top = 0, // always set directly to zero as an integer to clear down AllFX = 1, // bits from here on InsFX, Part, Bank, Config, Vector, Scale, Learn, MControl, AddSynth, SubSynth, PadSynth, AddVoice, AddMod, Oscillator, Resonance, LFO, // amp/freq/filt Filter, // params only (slightly confused with env) Formant, // in the formant editor itself Envelope, // amp/freq/filt/ (Sub only) band Test, // special ops for Yoshimi-testsuite }; } namespace REPLY { enum { todo_msg = 0, done_msg, value_msg, name_msg, op_msg, what_msg, range_msg, low_msg, high_msg, unrecognised_msg, parameter_msg, level_msg, available_msg, inactive_msg, failed_msg, writeOnly_msg, readOnly_msg, exit_msg }; } namespace LISTS { enum { all = 0, syseff, inseff, eff, // effect types part, mcontrol, addsynth, subsynth, padsynth, resonance, addvoice, addmod, waveform, lfo, formant, filter, envelope, reverb, section, echo, chorus, phaser, alienwah, distortion, eq, dynfilter, vector, scale, load, save, list, bank, config, mlearn, test, }; } extern std::string basics []; extern std::string toplist []; extern std::string configlist []; extern std::string banklist []; extern std::string partlist []; extern std::string mcontrollist []; extern std::string commonlist []; extern std::string addsynthlist []; extern std::string addvoicelist []; extern std::string addmodlist []; extern std::string addmodnameslist []; extern std::string subsynthlist []; extern std::string padsynthlist []; extern std::string resonancelist []; extern std::string waveformlist []; extern std::string LFOlist []; extern std::string LFOtype []; extern std::string LFObpm []; extern std::string filterlist []; extern std::string formantlist []; extern std::string envelopelist []; extern std::string reverblist []; extern int reverblistmap[]; extern std::string echolist []; extern int echolistmap[]; extern std::string choruslist []; extern int choruslistmap[]; extern std::string phaserlist []; extern int phaserlistmap[]; extern std::string alienwahlist []; extern int alienwahlistmap[]; extern std::string distortionlist []; extern int distortionlistmap[]; extern std::string eqlist []; extern int eqlistmap[]; extern std::string dynfilterlist []; extern int dynfilterlistmap[]; extern std::string filtershapes []; extern std::string learnlist []; extern std::string vectlist []; extern std::string scalelist []; extern std::string scale_errors []; extern std::string noteslist []; extern std::string loadlist []; extern std::string savelist []; extern std::string listlist []; extern std::string testlist []; extern std::string presetgroups []; extern std::string replies []; extern std::string fx_list []; extern std::string type_list []; extern const int type_offset []; extern std::string fx_presets []; extern std::string effreverb []; extern std::string effecho []; extern std::string effchorus []; extern std::string effphaser []; extern std::string effalienwah []; extern std::string effdistortion []; extern std::string effdistypes []; extern std::string effeq []; extern std::string eqtypes []; extern std::string effdynamicfilter []; extern std::string detuneType []; extern std::string waveshape []; extern std::string wavebase []; extern std::string basetypes []; extern std::string filtertype []; extern std::string adaptive []; extern std::string historyGroup []; extern std::string subMagType []; extern std::string subPadPosition []; extern std::string unisonPhase []; #endif yoshimi-2.3.5.1/src/Interface/Vectors.cpp000066400000000000000000000312031506652756400202000ustar00rootroot00000000000000/* Vectors.cpp Copyright 2024 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "Interface/Vectors.h" #include "Misc/SynthEngine.h" #include "Misc/Config.h" #include "Misc/Part.h" #include "Misc/TextMsgBuffer.h" #include "Misc/FileMgrFuncs.h" #include "Misc/XMLStore.h" using file::isRegularFile; using file::setExtension; using file::findLeafName; using std::string; using std::to_string; namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); } Vectors::Vectors(SynthEngine* engine) : synth(*engine) { } uchar Vectors::loadVectorAndUpdate(uchar baseChan, string const& name) { uchar result = loadVector(baseChan, name, true); synth.ShutUp(); return result; } uchar Vectors::loadVector(uchar baseChan, string const& name, bool full) { std::cout << "loading vector" << std::endl; auto& logg = synth.getRuntime().getLogger(); bool a = full; full = a; // suppress warning uchar actualBase = NO_MSG; // error! if (name.empty()) logg("No filename", _SYS_::LogNotSerious); else { string file = setExtension(name, EXTEN::vector); logg("Loading Vector (base channel: "+func::asString(baseChan)+") from \""+file+"\"", _SYS_::LogNotSerious); if (not isRegularFile(file)) logg("Unable to find file \""+file+"\"", _SYS_::LogNotSerious); else { XMLStore xml{file, logg}; postLoadCheck(xml,synth); if (not xml) logg("Could not parse XML file \""+file+"\"", _SYS_::LogNotSerious); else if (XMLtree xmlVect = xml.getElm("VECTOR")) { actualBase = extractVectorData(baseChan, xmlVect, findLeafName(name)); uint lastPart = NUM_MIDI_PARTS; if (synth.getRuntime().vectordata.Yaxis[actualBase] >= 0x7f) lastPart = NUM_MIDI_CHANNELS * 2; for (uint npart = 0; npart < lastPart; npart += NUM_MIDI_CHANNELS) if (XMLtree xmlPart = xmlVect.getElm("PART", npart)) { synth.part[npart + actualBase]->getfromXML(xmlPart); synth.part[npart + actualBase]->Prcvchn = actualBase; synth.setPartMap(npart + actualBase); synth.partonoffWrite(npart + baseChan, 1); if (synth.part[npart + actualBase]->Paudiodest & 2) Config::instances().registerAudioPort(synth.getUniqueId(), npart+actualBase); } } else logg("Vector: unable to load data, no branch in \""+file+"\"", _SYS_::LogNotSerious); } } return actualBase; } uchar Vectors::extractVectorData(uchar baseChan, XMLtree& xml, string const& name) { uint lastPart = NUM_MIDI_PARTS; string newname = xml.getPar_str("name"); if (baseChan >= NUM_MIDI_CHANNELS) baseChan = xml.getPar_255("Source_channel", 0); if (newname > "!" && newname.find("No Name") != 1) synth.getRuntime().vectordata.Name[baseChan] = newname; else if (!name.empty()) synth.getRuntime().vectordata.Name[baseChan] = name; else synth.getRuntime().vectordata.Name[baseChan] = "No Name " + to_string(baseChan); uchar x_sweep = xml.getPar_255("X_sweep_CC", 0xff); if (x_sweep >= 0x0e && x_sweep < 0x7f) { synth.getRuntime().vectordata.Xaxis[baseChan] = x_sweep; synth.getRuntime().vectordata.Enabled[baseChan] = true; } else { synth.getRuntime().vectordata.Xaxis[baseChan] = 0x7f; synth.getRuntime().vectordata.Enabled[baseChan] = false; } // should exit here if not enabled uchar y_sweep = xml.getPar_255("Y_sweep_CC", 0xff); if (y_sweep >= 0x0e && y_sweep < 0x7f) synth.getRuntime().vectordata.Yaxis[baseChan] = y_sweep; else { lastPart = NUM_MIDI_CHANNELS * 2; synth.getRuntime().vectordata.Yaxis[baseChan] = 0x7f; synth.partonoffWrite(baseChan + NUM_MIDI_CHANNELS * 2, 0); synth.partonoffWrite(baseChan + NUM_MIDI_CHANNELS * 3, 0); // disable these - not in current vector definition } int x_feat = 0; int y_feat = 0; if (xml.getPar_bool("X_feature_1", false)) x_feat |= 1; if (xml.getPar_bool("X_feature_2", false)) x_feat |= 2; if (xml.getPar_bool("X_feature_2_R", false)) x_feat |= 0x10; if (xml.getPar_bool("X_feature_4", false)) x_feat |= 4; if (xml.getPar_bool("X_feature_4_R", false)) x_feat |= 0x20; if (xml.getPar_bool("X_feature_8", false)) x_feat |= 8; if (xml.getPar_bool("X_feature_8_R", false)) x_feat |= 0x40; synth.getRuntime().vectordata.Xcc2[baseChan] = xml.getPar_255("X_CCout_2", 10); synth.getRuntime().vectordata.Xcc4[baseChan] = xml.getPar_255("X_CCout_4", 74); synth.getRuntime().vectordata.Xcc8[baseChan] = xml.getPar_255("X_CCout_8", 1); if (lastPart == NUM_MIDI_PARTS) { if (xml.getPar_bool("Y_feature_1", false)) y_feat |= 1; if (xml.getPar_bool("Y_feature_2", false)) y_feat |= 2; if (xml.getPar_bool("Y_feature_2_R", false)) y_feat |= 0x10; if (xml.getPar_bool("Y_feature_4", false)) y_feat |= 4; if (xml.getPar_bool("Y_feature_4_R", false)) y_feat |= 0x20; if (xml.getPar_bool("Y_feature_8", false)) y_feat |= 8; if (xml.getPar_bool("Y_feature_8_R", false)) y_feat |= 0x40; synth.getRuntime().vectordata.Ycc2[baseChan] = xml.getPar_255("Y_CCout_2", 10); synth.getRuntime().vectordata.Ycc4[baseChan] = xml.getPar_255("Y_CCout_4", 74); synth.getRuntime().vectordata.Ycc8[baseChan] = xml.getPar_255("Y_CCout_8", 1); } synth.getRuntime().vectordata.Xfeatures[baseChan] = x_feat; synth.getRuntime().vectordata.Yfeatures[baseChan] = y_feat; if (synth.getRuntime().numAvailableParts < lastPart) synth.getRuntime().numAvailableParts = xml.getPar_255("current_midi_parts", synth.getRuntime().numAvailableParts); return baseChan; } uchar Vectors::saveVector(uchar baseChan, string const& name, bool full) { bool a = full; full = a; // suppress warning uchar result = NO_MSG; // ok if (baseChan >= NUM_MIDI_CHANNELS) return textMsgBuffer.push("Invalid channel number"); if (name.empty()) return textMsgBuffer.push("No filename"); if (synth.getRuntime().vectordata.Enabled[baseChan] == false) return textMsgBuffer.push("No vector data on this channel"); string file = setExtension(name, EXTEN::vector); XMLStore xml{TOPLEVEL::XML::Vector}; XMLtree xmlVect = xml.addElm("VECTOR"); insertVectorData(baseChan, true, xmlVect, findLeafName(file)); if (not xml.saveXMLfile(file ,synth.getRuntime().getLogger() ,synth.getRuntime().gzipCompression )) { synth.getRuntime().Log("Vectors: failed to save data to \""+file+"\"", _SYS_::LogNotSerious); result = textMsgBuffer.push("FAIL"); } return result; } bool Vectors::insertVectorData(uchar baseChan, bool full, XMLtree& xml, string const& name) { int x_feat = synth.getRuntime().vectordata.Xfeatures[baseChan]; int y_feat = synth.getRuntime().vectordata.Yfeatures[baseChan]; if (synth.getRuntime().vectordata.Name[baseChan].find("No Name") != 1) xml.addPar_str("name", synth.getRuntime().vectordata.Name[baseChan]); else xml.addPar_str("name", name); xml.addPar_int ("Source_channel", baseChan); xml.addPar_int ("X_sweep_CC" , synth.getRuntime().vectordata.Xaxis[baseChan]); xml.addPar_int ("Y_sweep_CC" , synth.getRuntime().vectordata.Yaxis[baseChan]); xml.addPar_bool("X_feature_1" , (x_feat & 1) > 0); xml.addPar_bool("X_feature_2" , (x_feat & 2) > 0); xml.addPar_bool("X_feature_2_R" , (x_feat & 0x10) > 0); xml.addPar_bool("X_feature_4" , (x_feat & 4) > 0); xml.addPar_bool("X_feature_4_R" , (x_feat & 0x20) > 0); xml.addPar_bool("X_feature_8" , (x_feat & 8) > 0); xml.addPar_bool("X_feature_8_R" , (x_feat & 0x40) > 0); xml.addPar_int ("X_CCout_2" , synth.getRuntime().vectordata.Xcc2[baseChan]); xml.addPar_int ("X_CCout_4" , synth.getRuntime().vectordata.Xcc4[baseChan]); xml.addPar_int ("X_CCout_8" , synth.getRuntime().vectordata.Xcc8[baseChan]); uint lastPart = NUM_MIDI_PARTS; if (synth.getRuntime().vectordata.Yaxis[baseChan] > 0x7f) lastPart /= 2; else { xml.addPar_bool("Y_feature_1" , (y_feat & 1) > 0); xml.addPar_bool("Y_feature_2" , (y_feat & 2) > 0); xml.addPar_bool("Y_feature_2_R", (y_feat & 0x10) > 0); xml.addPar_bool("Y_feature_4" , (y_feat & 4) > 0); xml.addPar_bool("Y_feature_4_R", (y_feat & 0x20) > 0); xml.addPar_bool("Y_feature_8" , (y_feat & 8) > 0); xml.addPar_bool("Y_feature_8_R", (y_feat & 0x40) > 0); xml.addPar_int ("Y_CCout_2" , synth.getRuntime().vectordata.Ycc2[baseChan]); xml.addPar_int ("Y_CCout_4" , synth.getRuntime().vectordata.Ycc4[baseChan]); xml.addPar_int ("Y_CCout_8" , synth.getRuntime().vectordata.Ycc8[baseChan]); } if (full) { xml.addPar_int("current_midi_parts", lastPart); for (uint npart = 0; npart < lastPart; npart += NUM_MIDI_CHANNELS) { XMLtree xmlPart = xml.addElm("PART",npart); synth.part[npart + baseChan]->add2XML_YoshimiPartSetup(xmlPart); } } return true; } float Vectors::getVectorLimits(CommandBlock* getData) { float value = getData->data.value; uchar request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; uchar type = 0; // vector defaults type |= TOPLEVEL::type::Integer; int min = 0; float def = 0; int max = 1; switch (control) { case VECTOR::control::undefined: break; case VECTOR::control::name: break; case VECTOR::control::Xcontroller: max = 119; break; case VECTOR::control::XleftInstrument: max = 159; break; case VECTOR::control::XrightInstrument: max = 159; break; case VECTOR::control::Xfeature0: break; case VECTOR::control::Xfeature1: max = 2; break; case VECTOR::control::Xfeature2: max = 2; break; case VECTOR::control::Xfeature3: max = 2; break; case VECTOR::control::Ycontroller: max = 119; break; case VECTOR::control::YupInstrument: max = 159; break; case VECTOR::control::YdownInstrument: max = 159; break; case VECTOR::control::Yfeature0: break; case VECTOR::control::Yfeature1: max = 2; break; case VECTOR::control::Yfeature2: max = 2; break; case VECTOR::control::Yfeature3: max = 2; break; case VECTOR::control::erase: break; default: // TODO type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Interface/Vectors.h000066400000000000000000000030301506652756400176420ustar00rootroot00000000000000/* Vectors.h - Vector control Copyright 2024, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef VECTORS_H #define VECTORS_H #include "globals.h" class SynthEngine; class XMLtree; using std::string; class Vectors { public: Vectors(SynthEngine*); CommandBlock data;//commandData; uchar loadVectorAndUpdate(uchar baseChan, string const& name); uchar loadVector(uchar baseChan, string const& name, bool full); uchar extractVectorData(uchar baseChan, XMLtree&, string const& name); uchar saveVector(uchar baseChan, string const& name, bool full); bool insertVectorData(uchar baseChan, bool full, XMLtree&, string const& name); float getVectorLimits(CommandBlock *getData); private: SynthEngine& synth; }; #endif /*VECTORS_H*/ yoshimi-2.3.5.1/src/LV2_Plugin/000077500000000000000000000000001506652756400160715ustar00rootroot00000000000000yoshimi-2.3.5.1/src/LV2_Plugin/CMakeLists.txt000066400000000000000000000157671506652756400206510ustar00rootroot00000000000000# # CMakeLists.txt (LV2) # # Copyright 2014, Andrew Deryabin # Copyright 2018-2023, Will Godfrey & others # Copyright 2024 Kristian Amlie # # This file is part of yoshimi, which is free software: you can # redistribute it and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation, either # version 2 of the License, or (at your option) any later version. # # yoshimi 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 yoshimi. If not, see . file (GLOB yoshimi_lv2_plugin_files YoshimiLV2Plugin.cpp YoshimiLV2Plugin.h lv2extui.h lv2extprg.h) file (GLOB yoshimi_dsp_files ../DSP/AnalogFilter.cpp ../DSP/Filter.cpp ../DSP/FormantFilter.cpp ../DSP/SVFilter.cpp ../DSP/Unison.cpp ../DSP/FFTwrapper.h ../DSP/AnalogFilter.h ../DSP/FormantFilter.h ../DSP/SVFilter.h ../DSP/Filter.h ../DSP/Unison.h) file (GLOB yoshimi_effects_files ../Effects/Alienwah.cpp ../Effects/Chorus.cpp ../Effects/Echo.cpp ../Effects/EffectLFO.cpp ../Effects/EffectMgr.cpp ../Effects/Effect.cpp ../Effects/Phaser.cpp ../Effects/Reverb.cpp ../Effects/EQ.cpp ../Effects/Distorsion.cpp ../Effects/DynamicFilter.cpp ../Effects/Alienwah.h ../Effects/Chorus.h ../Effects/Echo.h ../Effects/EffectLFO.h ../Effects/EffectMgr.h ../Effects/Effect.h ../Effects/Phaser.h ../Effects/Reverb.h ../Effects/EQ.h ../Effects/Distorsion.h ../Effects/DynamicFilter.h) file (GLOB yoshimi_misc_files ../Misc/Alloc.h ../Misc/Bank.cpp ../Misc/Bank.h ../Misc/BuildScheduler.cpp ../Misc/BuildScheduler.h ../Misc/DataBlockBuff.h ../Misc/Config.cpp ../Misc/Config.h ../Misc/ConfBuild.h ../Misc/InstanceManager.cpp ../Misc/InstanceManager.h ../Misc/Microtonal.cpp ../Misc/Microtonal.h ../Misc/MirrorData.h ../Misc/SynthEngine.cpp ../Misc/SynthEngine.h ../Misc/Part.cpp ../Misc/Part.h../Misc/TestInvoker.h ../Misc/TestSequence.h ../Misc/WavFile.cpp ../Misc/WavFile.h ../Misc/WaveShapeSamples.h ../Misc/XMLStore.cpp ../Misc/XMLStore.h) file (GLOB yoshimi_interface_files ../Interface/GuiDataExchange.cpp ../Interface/GuiDataExchange.h ../Interface/InterfaceAnchor.h ../Interface/MidiDecode.cpp ../Interface/MidiDecode.h ../Interface/Vectors.cpp ../Interface/Vectors.h ../Interface/InterChange.cpp ../Interface/InterChange.h ../Interface/Data2Text.cpp ../Interface/Data2text.h ../Interface/Text2Data.cpp ../Interface/Text2Data.h ../Interface/TextLists.cpp ../Interface/TextLists.h ../Interface/RingBuffer.h ../Interface/MidiLearn.cpp ../Interface/MidiLearn.h ../UI/MiscGui.cpp ../UI/MiscGui.h) file (GLOB yoshimi_params_files ../Params/ADnoteParameters.cpp ../Params/EnvelopeParams.cpp ../Params/FilterParams.cpp ../Params/LFOParams.cpp ../Params/SUBnoteParameters.cpp ../Params/PADnoteParameters.cpp ../Params/Controller.cpp ../Params/ParamCheck.cpp ../Params/UnifiedPresets.cpp ../Params/ADnoteParameters.h ../Params/EnvelopeParams.h ../Params/FilterParams.h ../Params/LFOParams.h ../Params/SUBnoteParameters.h ../Params/PADnoteParameters.h ../Params/PADStatus.h ../Params/RandomWalk.h ../Params/OscilParameters.cpp ../Params/OscilParameters.h ../Params/Controller.h ../Params/ParamCheck.h ../Params/UnifiedPresets.h) file (GLOB yoshimi_synth_files ../Synth/ADnote.cpp ../Synth/Envelope.cpp ../Synth/LFO.cpp ../Synth/OscilGen.cpp ../Synth/SUBnote.cpp ../Synth/Resonance.cpp ../Synth/PADnote.cpp ../Synth/ADnote.h ../Synth/Envelope.h ../Synth/LFO.h ../Synth/OscilGen.h ../Synth/SUBnote.h ../Synth/Resonance.h ../Synth/PADnote.h ../Synth/WaveInterpolator.h ../Synth/XFadeManager.h ../Synth/BodyDisposal.h) file (GLOB yoshimi_musicio_files ../MusicIO/MusicClient.cpp ../MusicIO/MusicClient.h ../MusicIO/MusicIO.cpp ../MusicIO/MusicIO.h) file (GLOB yoshimi_manifest_ttl manifest.ttl) file (GLOB yoshimi_plugin_ttl yoshimi.ttl) set (FltkUI_names "PresetsUI" "EnvelopeUI" "LFOUI" "FilterUI" "VirKeyboardUI" "ConfigUI" "SUBnoteUI" "ResonanceUI" "OscilGenUI" "ADnoteUI" "PADnoteUI" "EffUI" "BankUI" "PartUI" "MicrotonalUI" "MasterUI" "MasterMiscUI" "ParametersUI" "ConsoleUI" "VectorUI" "MidiLearnUI" ) # workaround fltk_wrap_ui breakage set (FltkUI_sources) set (FltkUI_headers) foreach(basename ${FltkUI_names}) set (fluidfile "${CMAKE_CURRENT_SOURCE_DIR}/../UI/${basename}.fl") set (sourcefile "${basename}.cpp") set (headerfile "${basename}.h") add_custom_command( OUTPUT ${sourcefile} COMMAND ${FLTK_FLUID_EXECUTABLE} ARGS -c -o .cpp ${fluidfile} DEPENDS ${fluidfile} ) set (FltkUI_sources ${FltkUI_sources} "${sourcefile}") set (FltkUI_headers ${FltkUI_headers} "${headerfile}") endforeach(basename ${FltkUI_names}) set (FltkUI_sources ${FltkUI_sources} ../UI/DynamicTooltip.cpp ../UI/WidgetPDial.cpp ../UI/WidgetMWSlider.cpp ../UI/WidgetCheckButton.cpp ../UI/WidgetSpinner.cpp ../UI/ScaleTrackedWindow.cpp ) add_definitions (-DYOSHIMI_LV2_PLUGIN=1) add_library (yoshimi_lv2 MODULE ${yoshimi_lv2_plugin_files} ${yoshimi_manifest_ttl} ${yoshimi_plugin_ttl} ${yoshimi_dsp_files} ${yoshimi_effects_files} ${yoshimi_misc_files} ${yoshimi_interface_files} ${yoshimi_params_files} ${yoshimi_synth_files} ${yoshimi_musicio_files} ${FltkUI_sources}) add_custom_target(yoshimi_lv2_ttl COMMAND test -f ${yoshimi_manifest_ttl} COMMAND test -f ${yoshimi_plugin_ttl}) SET_TARGET_PROPERTIES(yoshimi_lv2 PROPERTIES PREFIX "") include_directories (AFTER ${LV2_INCLUDE_DIRS} ${FLTK_INCLUDE_DIR} ${MXML_INCLUDE_DIRS} ${FONTCONFIG_INCLUDE_DIRS} ${FFTW3F_INC_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}) target_link_libraries(yoshimi_lv2 ${LV2_LIBRARIES} ${FLTK_LIBRARIES} ${MXML_LIBRARIES} ${LIBSNDFILE_LIBRARIES} ${FFTW3F_LIBRARIES} ${LIBCAIRO_LIBRARIES} z ${LIBDL_LINUX_LIBS} ) add_dependencies(yoshimi_lv2 yoshimi_lv2_ttl) install (TARGETS yoshimi_lv2 DESTINATION ${LV2_INSTALL_DIR}/yoshimi.lv2) install (FILES ${yoshimi_manifest_ttl} ${yoshimi_plugin_ttl} DESTINATION ${LV2_INSTALL_DIR}/yoshimi.lv2 ) set_directory_properties(PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${FltkUI_headers}") yoshimi-2.3.5.1/src/LV2_Plugin/YoshimiLV2Plugin.cpp000066400000000000000000000711141506652756400217250ustar00rootroot00000000000000/* YoshimiLV2Plugin Copyright 2014, Andrew Deryabin Copyright 2016-2024, Will Godfrey, Kristian Amlie, Ichthyostega and others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include "YoshimiLV2Plugin.h" #include "Misc/Config.h" #include "Misc/ConfBuild.h" #include "Misc/SynthEngine.h" #include "Interface/InterChange.h" #include "Interface/Data2Text.h" #include "Interface/Text2Data.h" #include "Interface/MidiDecode.h" #include "MusicIO/MusicClient.h" #ifdef GUI_FLTK #include "MasterUI.h" #endif #include #include #include using std::string; using std::make_unique; #define YOSHIMI_STATE_URI "http://yoshimi.sourceforge.net/lv2_plugin#state" #define YOSHIMI_LV2_BUF_SIZE_URI "http://lv2plug.in/ns/ext/buf-size" #define YOSHIMI_LV2_BUF_SIZE_PREFIX YOSHIMI_LV2_BUF_SIZE_URI "#" #define YOSHIMI_LV2_BUF_SIZE__maxBlockLength YOSHIMI_LV2_BUF_SIZE_PREFIX "maxBlockLength" #define YOSHIMI_LV2_BUF_SIZE__minBlockLength YOSHIMI_LV2_BUF_SIZE_PREFIX "minBlockLength" #define YOSHIMI_LV2_BUF_SIZE__nominalBlockLength YOSHIMI_LV2_BUF_SIZE_PREFIX "nominalBlockLength" #define YOSHIMI_LV2_OPTIONS_URI "http://lv2plug.in/ns/ext/options" #define YOSHIMI_LV2_OPTIONS_PREFIX YOSHIMI_LV2_OPTIONS_URI "#" #define YOSHIMI_LV2_OPTIONS__Option YOSHIMI_LV2_OPTIONS_PREFIX "Option" #define YOSHIMI_LV2_OPTIONS__options YOSHIMI_LV2_OPTIONS_PREFIX "options" #define YOSHIMI_LV2_STATE__StateChanged "http://lv2plug.in/ns/ext/state#StateChanged" typedef enum { LV2_OPTIONS_INSTANCE, LV2_OPTIONS_RESOURCE, LV2_OPTIONS_BLANK, LV2_OPTIONS_PORT } Yoshimi_LV2_Options_Context; typedef struct _Yoshimi_LV2_Options_Option { Yoshimi_LV2_Options_Context context; ///< Context (type of subject). uint32_t subject; ///< Subject. LV2_URID key; ///< Key (property). uint32_t size; ///< Size of value in bytes. LV2_URID type; ///< Type of value (datatype). const void* value; ///< Pointer to value (object). } Yoshimi_LV2_Options_Option; LV2_Descriptor yoshimi_lv2_desc = { "http://yoshimi.sourceforge.net/lv2_plugin", YoshimiLV2Plugin::instantiate, YoshimiLV2Plugin::connect_port, YoshimiLV2Plugin::activate, YoshimiLV2Plugin::run, YoshimiLV2Plugin::deactivate, YoshimiLV2Plugin::cleanup, YoshimiLV2Plugin::extension_data }; LV2_Descriptor yoshimi_lv2_multi_desc = { "http://yoshimi.sourceforge.net/lv2_plugin_multi", YoshimiLV2Plugin::instantiate, YoshimiLV2Plugin::connect_port, YoshimiLV2Plugin::activate, YoshimiLV2Plugin::run, YoshimiLV2Plugin::deactivate, YoshimiLV2Plugin::cleanup, YoshimiLV2Plugin::extension_data }; namespace { inline bool isMultiFeed(LV2_Descriptor const& desc) { return string{desc.URI} == string{yoshimi_lv2_multi_desc.URI}; } } void YoshimiLV2Plugin::process(uint32_t sample_count) { if (sample_count == 0) return; // explicitly allowed by LV2 standard /* * Our implementation of LV2 has a problem with envelopes. In general * the bigger the buffer size the shorter the envelope, and whichever * is the smallest (host size or Yoshimi size) determines the time. * * However, Yoshimi is always correct when working standalone. */ uint32_t processed = 0; BeatTracker::BeatValues beats(beatTracker->getRawBeatValues()); uint32_t beatsAt = 0; bool bpmProvided = false; float *tmpLeft [NUM_MIDI_PARTS + 1]; float *tmpRight [NUM_MIDI_PARTS + 1]; MidiEvent intMidiEvent; for (uint32_t i = 0; i < NUM_MIDI_PARTS + 1; ++i) { tmpLeft [i] = lv2Left [i]; if (tmpLeft [i] == NULL) tmpLeft [i] = zynLeft [i]; tmpRight [i] = lv2Right [i]; if (tmpRight [i] == NULL) tmpRight [i] = zynRight [i]; } LV2_ATOM_SEQUENCE_FOREACH(_midiDataPort, event) { if (event == NULL) continue; uint32_t next_frame = event->time.frames; if (next_frame >= sample_count) continue; // Avoid sample perfect alignment when not free wheeling (running // offline, as when rendering a track), because it is extremely // expensive when there are many MIDI events with just small timing // differences. It is also not real time safe, because the amount of // processing depends on the timing of the notes, not only by the number // of notes. Let the user control the granularity using buffer size // instead. uint32_t frameAlignment; if (isFreeWheel()) frameAlignment = 1; else frameAlignment = synth.buffersize; while (next_frame - processed >= frameAlignment) { float bpmInc = (float)(processed - beatsAt) * beats.bpm / (synth.samplerate_f * 60.f); synth.setBeatValues(beats.songBeat + bpmInc, beats.monotonicBeat + bpmInc, beats.bpm); int mastered_chunk = synth.MasterAudio(tmpLeft, tmpRight, next_frame - processed); for (uint32_t i = 0; i < NUM_MIDI_PARTS + 1; ++i) { tmpLeft [i] += mastered_chunk; tmpRight [i] += mastered_chunk; } processed += mastered_chunk; } if (event->body.type == _midi_event_id) { if (event->body.size > sizeof(intMidiEvent.data)) continue; //process this midi event const uint8_t *msg = (const uint8_t*)(event + 1); if (param_freeWheel) processMidiMessage(msg); } else if (event->body.type == _atom_blank || event->body.type == _atom_object) { LV2_Atom_Object *obj = (LV2_Atom_Object *)&event->body; if (obj->body.otype != _atom_position) continue; LV2_Atom *bpb = NULL; LV2_Atom *bar = NULL; LV2_Atom *barBeat = NULL; LV2_Atom *bpm = NULL; LV2_Atom *beatUnit = NULL; lv2_atom_object_get(obj, _atom_bpb, &bpb, _atom_bar, &bar, _atom_bar_beat, &barBeat, _atom_bpm, &bpm, _atom_beatUnit, &beatUnit, NULL); if (bpm && bpm->type == _atom_float) { beats.bpm = ((LV2_Atom_Float *)bpm)->body; bpmProvided = true; if (beatUnit && beatUnit->type == _atom_int) { // In DAWs, Beats Per Minute really mean Quarter Beats Per // Minute. Therefore we need to divide by four first, to // get a whole beat, and then multiply that according to // the time signature denominator. See this link for some // background: https://music.stackexchange.com/a/109743 beats.bpm = beats.bpm / 4 * ((LV2_Atom_Int *)beatUnit)->body; } } uint32_t frame = event->time.frames; float bpmInc = (float)(frame - processed) * beats.bpm / (synth.samplerate_f * 60.f); if (bpb && bpb->type == _atom_float && bar && bar->type == _atom_long && barBeat && barBeat->type == _atom_float) { // There is a global beat number in the LV2 time spec, called // "beat", but Carla doesn't seem to deliver this correctly, so // piece it together from bar and barBeat instead. float lv2Bpb = ((LV2_Atom_Float *)bpb)->body; float lv2Bar = ((LV2_Atom_Long *)bar)->body; float lv2BarBeat = ((LV2_Atom_Float *)barBeat)->body; beats.songBeat = lv2Bar * lv2Bpb + lv2BarBeat; } else beats.songBeat += bpmInc; beats.monotonicBeat += bpmInc; beatsAt = frame; } } while (processed < sample_count) { float bpmInc = (float)(processed - beatsAt) * beats.bpm / (synth.samplerate_f * 60.f); synth.setBeatValues(beats.songBeat + bpmInc, beats.monotonicBeat + bpmInc, beats.bpm); int mastered_chunk = synth.MasterAudio(tmpLeft, tmpRight, sample_count - processed); for (uint32_t i = 0; i < NUM_MIDI_PARTS + 1; ++i) { tmpLeft [i] += mastered_chunk; tmpRight [i] += mastered_chunk; } processed += mastered_chunk; } float bpmInc = (float)(sample_count - beatsAt) * beats.bpm / (synth.samplerate_f * 60.f); beats.songBeat += bpmInc; beats.monotonicBeat += bpmInc; if (!bpmProvided && lastFallbackBpm != synth.PbpmFallback) beats.bpm = synth.PbpmFallback; lastFallbackBpm = synth.PbpmFallback; beatTracker->setBeatValues(beats); LV2_Atom_Sequence *aSeq = static_cast(_notifyDataPortOut); size_t neededAtomSize = sizeof(LV2_Atom_Event) + sizeof(LV2_Atom_Object_Body); size_t paddedSize = (neededAtomSize + 7U) & (~7U); if (synth.getNeedsSaving() && _notifyDataPortOut && aSeq->atom.size >= paddedSize) //notify host about plugin's changes { synth.setNeedsSaving(false); aSeq->atom.type = _atom_type_sequence; aSeq->atom.size = sizeof(LV2_Atom_Sequence_Body); aSeq->body.unit = 0; aSeq->body.pad = 0; LV2_Atom_Event *ev = reinterpret_cast(aSeq + 1); ev->time.frames = 0; LV2_Atom_Object *aObj = reinterpret_cast(&ev->body); aObj->atom.type = _atom_object; aObj->atom.size = sizeof(LV2_Atom_Object_Body); aObj->body.id = 0; aObj->body.otype =_atom_state_changed; aSeq->atom.size += paddedSize; } else if (aSeq) { aSeq->atom.size = sizeof(LV2_Atom_Sequence_Body); } } void YoshimiLV2Plugin::processMidiMessage(const uint8_t * msg) { /*if ((msg[0] & 0xf0) == 0xC0) { int chan = (msg[0] & 15); int prog = msg[1]; std::cout << "ProgMsg " << int(prog) << " Chan " << int(chan) << std::endl; }*/ bool in_place = isFreeWheel(); handleMidi(msg[0], msg[1], msg[2], in_place); } YoshimiLV2Plugin::YoshimiLV2Plugin(SynthEngine& _synth ,double sampleRate ,const char* bundlePath ,LV2_Feature const *const *features ,LV2_Descriptor const& lv2Desc ) : MusicIO(_synth, make_unique()) , _sampleRate{static_cast(sampleRate)} , _bufferSize{0} , _bundlePath{bundlePath} , _midiDataPort{nullptr} , _notifyDataPortOut{nullptr} , _midi_event_id{0} , _bufferPos{0} , _offsetPos{0} , param_freeWheel{nullptr} , flatbankprgs{} , lastFallbackBpm{-1} , isReady{false} { _uridMap.handle = NULL; _uridMap.map = NULL; const LV2_Feature *f = NULL; const Yoshimi_LV2_Options_Option *options = NULL; while ((f = *features) != NULL) { if (strcmp(f->URI, LV2_URID__map) == 0) { _uridMap = *(static_cast(f->data)); } else if (strcmp(f->URI, YOSHIMI_LV2_OPTIONS__options) == 0) { options = static_cast(f->data); } ++features; } uint32_t nomBufSize = 0; if (_uridMap.map and options) { _midi_event_id = _uridMap.map(_uridMap.handle, LV2_MIDI__MidiEvent); _yoshimi_state_id = _uridMap.map(_uridMap.handle, YOSHIMI_STATE_URI); _atom_string_id = _uridMap.map(_uridMap.handle, LV2_ATOM__String); LV2_URID maxBufSz = _uridMap.map(_uridMap.handle, YOSHIMI_LV2_BUF_SIZE__maxBlockLength); LV2_URID minBufSz = _uridMap.map(_uridMap.handle, YOSHIMI_LV2_BUF_SIZE__minBlockLength); LV2_URID nomBufSz = _uridMap.map(_uridMap.handle, YOSHIMI_LV2_BUF_SIZE__nominalBlockLength); _atom_int = _uridMap.map(_uridMap.handle, LV2_ATOM__Int); _atom_long = _uridMap.map(_uridMap.handle, LV2_ATOM__Long); _atom_float = _uridMap.map(_uridMap.handle, LV2_ATOM__Float); _atom_type_chunk = _uridMap.map(_uridMap.handle, LV2_ATOM__Chunk); _atom_type_sequence = _uridMap.map(_uridMap.handle, LV2_ATOM__Sequence); _atom_state_changed = _uridMap.map(_uridMap.handle, YOSHIMI_LV2_STATE__StateChanged); _atom_object = _uridMap.map(_uridMap.handle, LV2_ATOM__Object); _atom_blank = _uridMap.map(_uridMap.handle, LV2_ATOM__Blank); _atom_event_transfer = _uridMap.map(_uridMap.handle, LV2_ATOM__eventTransfer); _atom_position = _uridMap.map(_uridMap.handle, LV2_TIME__Position); _atom_bpb = _uridMap.map(_uridMap.handle, LV2_TIME__beatsPerBar); _atom_bar = _uridMap.map(_uridMap.handle, LV2_TIME__bar); _atom_bar_beat = _uridMap.map(_uridMap.handle, LV2_TIME__barBeat); _atom_bpm = _uridMap.map(_uridMap.handle, LV2_TIME__beatsPerMinute); _atom_beatUnit = _uridMap.map(_uridMap.handle, LV2_TIME__beatUnit); while (options->size > 0 && options->value != NULL) { if (options->context == LV2_OPTIONS_INSTANCE) { if ((options->key == minBufSz || options->key == maxBufSz) && options->type == _atom_int) { uint32_t bufSz = *static_cast(options->value); if (_bufferSize < bufSz) _bufferSize = bufSz; } if (options->key == nomBufSz && options->type == _atom_int) nomBufSize = *static_cast(options->value); } ++options; } } //runtime().Log("Buffer size " + to_string(nomBufSize)); if (nomBufSize > 0) _bufferSize = nomBufSize; else if (_bufferSize == 0) _bufferSize = MAX_BUFFER_SIZE; // Configuration for LV2 mode... runtime().isLV2 = true; runtime().isMultiFeed = isMultiFeed(lv2Desc); synth.setBPMAccurate(true); } /** create a new distinct Yoshimi plugin instance; `activate()` will be called prior to `run()`. */ LV2_Handle YoshimiLV2Plugin::instantiate(LV2_Descriptor const* desc, double sample_rate, const char *bundle_path, LV2_Feature const *const *features) { YoshimiLV2Plugin* instance; auto instantiatePlugin = [&](SynthEngine& synth) -> MusicIO* { instance = new YoshimiLV2Plugin(synth, sample_rate, bundle_path, features, *desc); return instance; // note: will be stored/managed in MusicClient }; if (Config::instances().startPluginInstance(instantiatePlugin)) { assert(instance); instance->isReady.store(true, std::memory_order_release); // after this point, GUI-plugin may attach return static_cast(instance); } else return nullptr; } /** Initialise the plugin instance and activate it for use. */ void YoshimiLV2Plugin::activate(LV2_Handle h) { self(h).runtime().Log("Yoshimi LV2 plugin activated"); } void YoshimiLV2Plugin::run(LV2_Handle h, uint32_t sample_count) { self(h).process(sample_count); } void YoshimiLV2Plugin::deactivate(LV2_Handle h) { self(h).runtime().Log("Yoshimi LV2 plugin deactivated"); } /** called by LV2 host to destroy a plugin instance */ void YoshimiLV2Plugin::cleanup(LV2_Handle h) { auto synthID = self(h).synth.getUniqueId(); Config::instances().terminatePluginInstance(synthID); } bool YoshimiLV2Plugin::openAudio() { bool validSettings = not (_uridMap.map == NULL or _sampleRate == 0 or _bufferSize == 0 or _midi_event_id == 0 or _yoshimi_state_id == 0 or _atom_string_id == 0); return validSettings and prepBuffers(); } bool YoshimiLV2Plugin::openMidi() { return true; /*nothing to do*/ } bool YoshimiLV2Plugin::Start() { // by default do not launch UI; rather create it later, on-demand runtime().showGui = false; memset(lv2Left, 0, sizeof(float *) * (NUM_MIDI_PARTS + 1)); memset(lv2Right, 0, sizeof(float *) * (NUM_MIDI_PARTS + 1)); return true; } void YoshimiLV2Plugin::connect_port(LV2_Handle handle, uint32_t port, void* data_location) { if (port > NUM_MIDI_PARTS + 2) return; YoshimiLV2Plugin& plugin = self(handle); if (port == 0)//atom midi event port { plugin._midiDataPort = static_cast(data_location); return; } else if (port == 1) //freewheel control port { plugin.param_freeWheel = static_cast(data_location); return; } else if (port == 36 and plugin.runtime().isMultiFeed) //notify out port { plugin._notifyDataPortOut = static_cast(data_location); return; } else if (port == 4 and not plugin.runtime().isMultiFeed) //notify out port { plugin._notifyDataPortOut = static_cast(data_location); return; } port -=2; if (port == 0) //main outl port = NUM_MIDI_PARTS * 2; else if (port == 1) //main outr port = NUM_MIDI_PARTS * 2 + 1; else port -= 2; int portIndex = static_cast(floorf((float)port/2.0f)); if (port % 2 == 0) //left channel plugin.lv2Left[portIndex] = static_cast(data_location); else plugin.lv2Right[portIndex] = static_cast(data_location); } LV2_Programs_Interface yoshimi_prg_iface = { YoshimiLV2Plugin::callback_getProgram, YoshimiLV2Plugin::callback_selectProgram, YoshimiLV2Plugin::callback_selectProgramNew }; const void *YoshimiLV2Plugin::extension_data(const char *uri) { static const LV2_State_Interface state_iface = { YoshimiLV2Plugin::callback_stateSave, YoshimiLV2Plugin::callback_stateRestore }; if (!strcmp(uri, LV2_STATE__interface)) { return static_cast(&state_iface); } else if (strcmp(uri, LV2_PROGRAMSNEW__Interface) == 0) { return static_cast(&yoshimi_prg_iface); } else if (strcmp(uri, LV2_PROGRAMS__Interface) == 0) { return static_cast(&yoshimi_prg_iface); } return NULL; } LV2_State_Status YoshimiLV2Plugin::stateSave(LV2_State_Store_Function store, LV2_State_Handle handle, uint32_t flags, const LV2_Feature * const *features) { uint32_t a = flags; flags = a; const LV2_Feature * const *feat = features; features = feat; // suppress warnings - may use later char* data{nullptr}; int sz = runtime().saveSessionData(&data); store(handle, _yoshimi_state_id, data, sz, _atom_string_id, LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); free(data); return LV2_STATE_SUCCESS; } LV2_State_Status YoshimiLV2Plugin::stateRestore(LV2_State_Retrieve_Function retrieve, LV2_State_Handle handle, uint32_t flags, const LV2_Feature * const *features) { uint32_t a = flags; flags = a; const LV2_Feature * const *feat = features; features = feat; // lines above suppress warnings - may use later size_t sz = 0; LV2_URID type = 0; uint32_t new_flags; const char *data = (const char *)retrieve(handle, _yoshimi_state_id, &sz, &type, &new_flags); if (sz > 0) runtime().restoreSessionData(data, sz); return LV2_STATE_SUCCESS; } LV2_Program_Descriptor const * YoshimiLV2Plugin::getProgram(uint32_t index) { if (flatbankprgs.empty()) { for (auto& [rootID, root] : synth.bank.getRoots()) { BankEntryMap const& banks{synth.bank.getBanks(rootID)}; for (auto& [bankID,bank] : banks) { if (bankID >= 128 or bank.dirname.empty()) continue; for (auto& [instrumentID,instrument] : bank.instruments) { if (instrument.name.empty()) continue; LV2Bank entry; entry.bank = (rootID << 7) | bankID; entry.program = instrumentID; entry.display = bank.dirname + " -> " + instrument.name; entry.name = entry.display.c_str(); flatbankprgs.push_back(std::move(entry)); } } } } return index < flatbankprgs.size()? &flatbankprgs [index] : nullptr; } void YoshimiLV2Plugin::selectProgramNew(unsigned char channel, uint32_t bank, uint32_t program) { auto rootnum = bank >> 7; auto banknum = bank & 127; if (runtime().midi_bank_root != 128) synth.mididecode.setMidiBankOrRootDir(rootnum, true, true); else { if (runtime().currentRoot != rootnum) return; } if (runtime().midi_bank_C != 128) synth.mididecode.setMidiBankOrRootDir(banknum, true, false); else { if (runtime().currentBank != banknum) return; } if (runtime().enableProgChange) { //std::cout << "Prog " << int(program) << " Chan " << int(channel) << std::endl; synth.mididecode.setMidiProgram(channel, program, true); } } LV2_State_Status YoshimiLV2Plugin::callback_stateSave(LV2_Handle h, LV2_State_Store_Function store, LV2_State_Handle state, uint32_t flags, const LV2_Feature * const *features) { return self(h).stateSave(store, state, flags, features); } LV2_State_Status YoshimiLV2Plugin::callback_stateRestore(LV2_Handle h, LV2_State_Retrieve_Function retrieve, LV2_State_Handle state, uint32_t flags, const LV2_Feature * const *features) { return self(h).stateRestore(retrieve, state, flags, features); } const LV2_Program_Descriptor *YoshimiLV2Plugin::callback_getProgram(LV2_Handle h, uint32_t index) { return self(h).getProgram(index); } void YoshimiLV2Plugin::callback_selectProgramNew(LV2_Handle h, unsigned char channel, uint32_t bank, uint32_t program) { return self(h).selectProgramNew(channel, bank, program); } YoshimiLV2PluginUI::YoshimiLV2PluginUI(const char *, LV2UI_Write_Function, LV2UI_Controller controller, LV2UI_Widget* widget, LV2_Feature const *const *features) : corePlugin(nullptr) , plugin_human_id{"Yoshimi lv2 plugin"} , notify_on_GUI_close{} { // Configure callbacks for running the UI LV2_External_UI_Widget::run = YoshimiLV2PluginUI::callback_Run; LV2_External_UI_Widget::show = YoshimiLV2PluginUI::callback_Show; LV2_External_UI_Widget::hide = YoshimiLV2PluginUI::callback_Hide; while (*features) { LV2_Feature const* f = *features; if (strcmp(f->URI, LV2_INSTANCE_ACCESS_URI) == 0) { corePlugin = static_cast(f->data); } else if (strcmp(f->URI, LV2_EXTERNAL_UI__Host) == 0) { LV2_External_UI_Host& hostSpec = * static_cast(f->data); plugin_human_id = hostSpec.plugin_human_id; auto callback = hostSpec.ui_closed; notify_on_GUI_close = [callback,controller]{ callback(controller); }; } ++features; } // this object also serves as »widget« for the event callbacks *widget = static_cast(this); } YoshimiLV2PluginUI::~YoshimiLV2PluginUI() { engine().shutdownGui(); Fl::check(); // necessary to ensure screen redraw after all windows are hidden } bool YoshimiLV2PluginUI::init() { if (not corePlugin) return false; // LV2 hosts may load plugins concurrently, which in some corner cases // causes a race between SynthEngine initialisation and bootstrap of the GUI while (not corePlugin->isReady.load(std::memory_order_acquire)) std::this_thread::yield(); engine().installGuiClosedCallback([this] {// invoked by SynthEngine when FLTK GUI is closed explicitly... engine().shutdownGui(); if (notify_on_GUI_close) notify_on_GUI_close(); }); return true; } /** activated by LV2 host when preparing to launch the GUI: create a UI plugin associated with a core plugin instance */ LV2UI_Handle YoshimiLV2PluginUI::instantiate(LV2UI_Descriptor const*, const char* /*plugin_uri*/, const char* bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature * const *features) { YoshimiLV2PluginUI* uiinst = new YoshimiLV2PluginUI(bundle_path, write_function, controller, widget, features); if (uiinst->init()) { return static_cast(uiinst); } else delete uiinst; return NULL; } /** called by LV2 host to discard the plugin GUI; * alternatively the host may choose just to hide the UI */ void YoshimiLV2PluginUI::cleanup(LV2UI_Handle ui) { YoshimiLV2PluginUI *uiinst = static_cast(ui); delete uiinst; } LV2UI_Show_Interface yoshimi_lv2ui_show_interface_desc = { YoshimiLV2PluginUI::callback_ShowInterface, YoshimiLV2PluginUI::callback_HideInterface, }; LV2UI_Idle_Interface yoshimi_lv2ui_idle_interface_desc = { YoshimiLV2PluginUI::callback_IdleInterface, }; const void *YoshimiLV2PluginUI::extension_data(const char *uri) { if (strcmp(uri, LV2_UI__showInterface) == 0) { return &yoshimi_lv2ui_show_interface_desc; } else if (strcmp(uri, LV2_UI__idleInterface) == 0) { return &yoshimi_lv2ui_idle_interface_desc; } return nullptr; } /** recurring GUI event handling cycle*/ void YoshimiLV2PluginUI::run() { if (isGuiActive()) { masterUI().checkBuffer(); Fl::check(); } else if (notify_on_GUI_close) notify_on_GUI_close(); } void YoshimiLV2PluginUI::show() { if (not isGuiActive()) { initFltkLock(); Config::instances().launchGui_forPlugin(engine().getUniqueId(), plugin_human_id); } else masterUI().masterwindow->show(); } void YoshimiLV2PluginUI::hide() { if (isGuiActive()) masterUI().masterwindow->hide(); } /** * This function was introduced as an attempt to be defensive and handle FLTK locking properly. * We use the LV2 extension "http://yoshimi.sourceforge.net/lv2_plugin#ExternalUI" * and I could not find any documentation to rule out that some host may invoke the * LV2_External_UI_Widget run() function concurrently for two distinct GUI instances. * On the other hand, FLTK by default runs single threaded (as most UI toolkits to) * and has clearly stated rules how to deal with concurrency. * See https://www.fltk.org/doc-1.3/advanced.html * This function ensures thus that the Fl::lock() is set _once and initially_, * before creating the first window. */ void YoshimiLV2PluginUI::initFltkLock() { static bool firstTime{true}; if (firstTime) { Fl::lock(); firstTime = false; } } /** Entry point for the Host to discover and load the core plugin */ extern "C" const LV2_Descriptor* lv2_descriptor(uint32_t index) { switch (index) { case 0: return &yoshimi_lv2_desc; case 1: return &yoshimi_lv2_multi_desc; default: break; } return NULL; } LV2UI_Descriptor yoshimi_lv2ui_desc = { "http://yoshimi.sourceforge.net/lv2_plugin#ExternalUI", YoshimiLV2PluginUI::instantiate, YoshimiLV2PluginUI::cleanup, NULL, YoshimiLV2PluginUI::extension_data }; /** Entry point for the Host to discover and load the associated GUI plugin */ extern "C" const LV2UI_Descriptor* lv2ui_descriptor(uint32_t index) { switch (index) { case 0: return &yoshimi_lv2ui_desc; default: break; } return NULL; } yoshimi-2.3.5.1/src/LV2_Plugin/YoshimiLV2Plugin.h000066400000000000000000000176011506652756400213730ustar00rootroot00000000000000/* YoshimiLV2Plugin Copyright 2014, Andrew Deryabin Copyright 2016-2024, Will Godfrey, Kristian Amlie, Ichthyostega and others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef YOSHIMI_LV2_PLUGIN_H #define YOSHIMI_LV2_PLUGIN_H #include "lv2/lv2plug.in/ns/ext/instance-access/instance-access.h" #include "lv2/lv2plug.in/ns/ext/state/state.h" #include "lv2/lv2plug.in/ns/ext/atom/atom.h" #include "lv2/lv2plug.in/ns/ext/atom/util.h" #include "lv2/lv2plug.in/ns/ext/midi/midi.h" #include "lv2/lv2plug.in/ns/ext/state/state.h" #include "lv2/lv2plug.in/ns/ext/time/time.h" #include "lv2/lv2plug.in/ns/ext/urid/urid.h" #include "lv2/lv2plug.in/ns/extensions/ui/ui.h" #include "lv2extui.h" #include "lv2extprg.h" #include #include #include #include #include #include "Misc/SynthEngine.h" #include "Interface/InterChange.h" #include "Interface/Data2Text.h" #include "Interface/RingBuffer.h" #include "MusicIO/MusicIO.h" using std::string; class YoshimiLV2Plugin : public MusicIO { private: uint32_t _sampleRate; uint32_t _bufferSize; string _bundlePath; LV2_URID_Map _uridMap; LV2_Atom_Sequence *_midiDataPort; LV2_Atom_Sequence *_notifyDataPortOut; LV2_URID _midi_event_id; LV2_URID _yoshimi_state_id; LV2_URID _atom_string_id; LV2_URID _atom_int; LV2_URID _atom_long; LV2_URID _atom_float; LV2_URID _atom_type_chunk; LV2_URID _atom_type_sequence; LV2_URID _atom_state_changed; LV2_URID _atom_object; LV2_URID _atom_blank; LV2_URID _atom_event_transfer; LV2_URID _atom_position; LV2_URID _atom_bpb; LV2_URID _atom_bar; LV2_URID _atom_bar_beat; LV2_URID _atom_bpm; LV2_URID _atom_beatUnit; uint32_t _bufferPos; uint32_t _offsetPos; float* param_freeWheel; inline bool isFreeWheel() const { return param_freeWheel and (*param_freeWheel != 0); } struct MidiEvent { uint32_t time; char data[4]; // all events of interest are <= 4bytes }; struct LV2Bank : LV2_Program_Descriptor{ LV2Bank() = default; LV2Bank(LV2Bank &&orig) : LV2_Program_Descriptor(std::move(orig)) { display = std::move(orig.display); name = display.c_str(); } LV2Bank(const LV2Bank &orig) : LV2_Program_Descriptor(orig) { display = orig.display; name = display.c_str(); } string display; }; std::vector flatbankprgs; float lastFallbackBpm; std::atomic_bool isReady; float *lv2Left [NUM_MIDI_PARTS + 1]; float *lv2Right [NUM_MIDI_PARTS + 1]; static YoshimiLV2Plugin& self(LV2_Handle handle) { assert(handle); return * static_cast(handle); } public: // shall not be copied nor moved YoshimiLV2Plugin(YoshimiLV2Plugin&&) = delete; YoshimiLV2Plugin(YoshimiLV2Plugin const&) = delete; YoshimiLV2Plugin& operator=(YoshimiLV2Plugin&&) = delete; YoshimiLV2Plugin& operator=(YoshimiLV2Plugin const&) = delete; YoshimiLV2Plugin(SynthEngine&, double sampleRate, const char *bundlePath, LV2_Feature const *const *features, LV2_Descriptor const& desc); /* ====== MusicIO interface ======== */ bool openAudio() override ; bool openMidi() override ; bool Start() override ; void Close() override { /*ignore*/ } void registerAudioPort(int) override { /*ignore*/ } uint getSamplerate() const override { return _sampleRate; } int getBuffersize() const override { return _bufferSize; } string audioClientName() const override { return "LV2 plugin"; } int audioClientId() const override { return 0; } string midiClientName() const override { return "LV2 plugin"; } int midiClientId() const override { return 0; } //static LV2 callback functions static LV2_Handle instantiate (const LV2_Descriptor*, double sample_rate, const char* bundle_path, LV2_Feature const* const* features); static void connect_port(LV2_Handle instance, uint32_t port, void *data_location); static void activate(LV2_Handle instance); static void deactivate(LV2_Handle instance); static void run(LV2_Handle instance, uint32_t sample_count); static void cleanup(LV2_Handle instance); static const void * extension_data(const char * uri); static LV2_State_Status callback_stateSave(LV2_Handle instance, LV2_State_Store_Function store, LV2_State_Handle handle, uint32_t flags, LV2_Feature const* const* features); static LV2_State_Status callback_stateRestore(LV2_Handle instance, LV2_State_Retrieve_Function retrieve, LV2_State_Handle handle, uint32_t flags, LV2_Feature const* const* features); static const LV2_Program_Descriptor * callback_getProgram(LV2_Handle handle, uint32_t index); static void callback_selectProgramNew(LV2_Handle handle, unsigned char channel, uint32_t bank, uint32_t program); static void callback_selectProgram(LV2_Handle handle, uint32_t bank, uint32_t program) { callback_selectProgramNew(handle, 0, bank, program); } private: void process(uint32_t sample_count); void processMidiMessage(const uint8_t* msg); LV2_State_Status stateSave(LV2_State_Store_Function store, LV2_State_Handle handle, uint32_t flags, LV2_Feature const* const* features); LV2_State_Status stateRestore(LV2_State_Retrieve_Function retrieve, LV2_State_Handle handle, uint32_t flags, LV2_Feature const* const* features); LV2_Program_Descriptor const* getProgram(uint32_t index); void selectProgramNew(uchar channel, uint32_t bank, uint32_t program); friend class YoshimiLV2PluginUI; }; class YoshimiLV2PluginUI : public LV2_External_UI_Widget { YoshimiLV2Plugin *corePlugin; string plugin_human_id; std::function notify_on_GUI_close; static YoshimiLV2PluginUI& self(void* handle) { assert(handle); return * static_cast(handle); } public: YoshimiLV2PluginUI(const char*, LV2UI_Write_Function, LV2UI_Controller, LV2UI_Widget*, LV2_Feature const *const *); ~YoshimiLV2PluginUI(); bool init(); static LV2UI_Handle instantiate(const LV2UI_Descriptor *descriptor, const char *plugin_uri, const char *bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget *widget, const LV2_Feature *const *features); static void cleanup(LV2UI_Handle ui); static const void *extension_data(const char *uri); void run(); void show(); void hide(); static void callback_Run (LV2_External_UI_Widget* ui){ self(ui).run(); } static void callback_Show(LV2_External_UI_Widget* ui){ self(ui).show(); } static void callback_Hide(LV2_External_UI_Widget* ui){ self(ui).hide(); } static int callback_IdleInterface(LV2_Handle ui){ self(ui).run(); return 0; } static int callback_ShowInterface(LV2_Handle ui){ self(ui).show(); return 0; } static int callback_HideInterface(LV2_Handle ui){ self(ui).hide(); return 0; } private: SynthEngine& engine() { return corePlugin->synth; } // use friend access MasterUI& masterUI() { assert(isGuiActive()); return * engine().getGuiMaster(); } bool isGuiActive() { return bool(engine().getGuiMaster()); } void initFltkLock(); }; #endif /*YOSHIMI_LV2_PLUGIN_H*/ yoshimi-2.3.5.1/src/LV2_Plugin/lv2extprg.h000066400000000000000000000155021506652756400202020ustar00rootroot00000000000000/* LV2 Programs Extension Copyright 2012 Filipe Coelho 2014 Deryabin Andrew Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /** @file lv2extprg.h C header for the LV2 programs extension . */ #ifndef LV2_PROGRAMS_H #define LV2_PROGRAMS_H #define LV2_PROGRAMS_URI "http://kxstudio.sf.net/ns/lv2ext/programs" #define LV2_PROGRAMS_PREFIX LV2_PROGRAMS_URI "#" #define LV2_PROGRAMS__Host LV2_PROGRAMS_PREFIX "Host" #define LV2_PROGRAMS__Interface LV2_PROGRAMS_PREFIX "Interface" #define LV2_PROGRAMS__UIInterface LV2_PROGRAMS_PREFIX "UIInterface" #define LV2_PROGRAMSNEW_URI "http://yoshimi.sf.net/ns/lv2ext/programs" #define LV2_PROGRAMSNEW_PREFIX LV2_PROGRAMSNEW_URI "#" #define LV2_PROGRAMSNEW__Interface LV2_PROGRAMSNEW_PREFIX "Interface" #define LV2_PROGRAMSNEW__UIInterface LV2_PROGRAMSNEW_PREFIX "UIInterface" #ifdef __cplusplus extern "C" { #endif typedef void* LV2_Programs_Handle; typedef struct _LV2_Program_Descriptor { /** Bank number for this program. Note that this extension does not support MIDI-style separation of bank LSB and MSB values. There is no restriction on the set of available banks: the numbers do not need to be contiguous, there does not need to be a bank 0, etc. */ uint32_t bank; /** Program number (unique within its bank) for this program. There is no restriction on the set of available programs: the numbers do not need to be contiguous, there does not need to be a program 0, etc. */ uint32_t program; /** Name of the program. */ const char * name; } LV2_Program_Descriptor; /** Programs extension, plugin data. When the plugin's extension_data is called with argument LV2_PROGRAMS__Interface, the plugin MUST return an LV2_Programs_Instance structure, which remains valid for the lifetime of the plugin. */ typedef struct _LV2_Programs_Interface { /** * get_program() * * This member is a function pointer that provides a description * of a program (named preset sound) available on this plugin. * * The index argument is an index into the plugin's list of * programs, not a program number as represented by the Program * field of the LV2_Program_Descriptor. (This distinction is * needed to support plugins that use non-contiguous program or * bank numbers.) * * This function returns a LV2_Program_Descriptor pointer that is * guaranteed to be valid only until the next call to get_program * or deactivate, on the same plugin instance. This function must * return NULL if passed an index argument out of range, so that * the host can use it to query the number of programs as well as * their properties. */ const LV2_Program_Descriptor *(*get_program)(LV2_Handle handle, uint32_t index); /** * select_program() * * This member is a function pointer that selects a new program * for this plugin. The program change should take effect * immediately at the start of the next run() call. (This * means that a host providing the capability of changing programs * between any two notes on a track must vary the block size so as * to place the program change at the right place. A host that * wanted to avoid this would probably just instantiate a plugin * for each program.) * * Plugins should ignore a select_program() call with an invalid * bank or program. * * A plugin is not required to select any particular default * program on activate(): it's the host's duty to set a program * explicitly. * * A plugin is permitted to re-write the values of its input * control ports when select_program is called. The host should * re-read the input control port values and update its own * records appropriately. (This is the only circumstance in which * a LV2 plugin is allowed to modify its own control-input ports.) */ void (*select_program)(LV2_Handle handle, uint32_t bank, uint32_t program); void (*select_program_for_channel)(LV2_Handle handle, unsigned char channel, uint32_t bank, uint32_t program); } LV2_Programs_Interface; /** Programs extension, UI data. When the UI's extension_data is called with argument LV2_PROGRAMS__UIInterface, the UI MUST return an LV2_Programs_UI_Interface structure, which remains valid for the lifetime of the UI. */ typedef struct _LV2_Programs_UI_Interface { /** * select_program() * * This is exactly the same as select_program in LV2_Programs_Instance, * but this struct relates to the UI instead of the plugin. * * When called, UIs should update their state to match the selected program. */ void (*select_program)(LV2UI_Handle handle, uint32_t bank, uint32_t program); void (*select_program_for_channel)(LV2_Handle handle, unsigned char channel, uint32_t bank, uint32_t program); } LV2_Programs_UI_Interface; /** Feature data for LV2_PROGRAMS__Host. */ typedef struct _LV2_Programs_Host { /** * Opaque host data. */ LV2_Programs_Handle handle; /** * program_changed() * * Tell the host to reload a plugin's program. * Parameter handle MUST be the 'handle' member of this struct. * Parameter index is program index to change. * When index is -1, host should reload all the programs. * * The plugin MUST NEVER call this function on a RT context or during run(). * * NOTE: This call is to inform the host about a program's bank, program or name change. * It DOES NOT change the current selected program. */ void (*program_changed)(LV2_Programs_Handle handle, int32_t index); } LV2_Programs_Host; #ifdef __cplusplus } /* extern "C" */ #endif #endif /* LV2_PROGRAMS_H */ yoshimi-2.3.5.1/src/LV2_Plugin/lv2extui.h000066400000000000000000000067221506652756400200330ustar00rootroot00000000000000/* LV2 External UI extension This work is in public domain. This file 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. If you have questions, contact Filipe Coelho (aka falkTX) or ask in #lad channel, FreeNode IRC network. */ /** @file lv2_external_ui.h C header for the LV2 External UI extension . */ #ifndef LV2_EXTERNAL_UI_H #define LV2_EXTERNAL_UI_H #include "lv2/lv2plug.in/ns/extensions/ui/ui.h" #define LV2_EXTERNAL_UI_URI "http://kxstudio.sf.net/ns/lv2ext/external-ui" #define LV2_EXTERNAL_UI_PREFIX LV2_EXTERNAL_UI_URI "#" #define LV2_EXTERNAL_UI__Host LV2_EXTERNAL_UI_PREFIX "Host" #define LV2_EXTERNAL_UI__Widget LV2_EXTERNAL_UI_PREFIX "Widget" /** This extension used to be defined by a lv2plug.in URI */ #define LV2_EXTERNAL_UI_DEPRECATED_URI "http://lv2plug.in/ns/extensions/ui#external" #ifdef __cplusplus extern "C" { #endif /** * When LV2_EXTERNAL_UI__Widget UI is instantiated, the returned * LV2UI_Widget handle must be cast to pointer to LV2_External_UI_Widget. * UI is created in invisible state. */ typedef struct _LV2_External_UI_Widget { /** * Host calls this function regularly. UI library implementing the * callback may do IPC or redraw the UI. * * @param _this_ the UI context */ void (*run)(struct _LV2_External_UI_Widget * _this_); /** * Host calls this function to make the plugin UI visible. * * @param _this_ the UI context */ void (*show)(struct _LV2_External_UI_Widget * _this_); /** * Host calls this function to make the plugin UI invisible again. * * @param _this_ the UI context */ void (*hide)(struct _LV2_External_UI_Widget * _this_); } LV2_External_UI_Widget; #define LV2_EXTERNAL_UI_RUN(ptr) (ptr)->run(ptr) #define LV2_EXTERNAL_UI_SHOW(ptr) (ptr)->show(ptr) #define LV2_EXTERNAL_UI_HIDE(ptr) (ptr)->hide(ptr) /** * On UI instantiation, host must supply LV2_EXTERNAL_UI__Host feature. * LV2_Feature::data must be pointer to LV2_External_UI_Host. */ typedef struct _LV2_External_UI_Host { /** * Callback that plugin UI will call when UI (GUI window) is closed by user. * This callback will be called during execution of LV2_External_UI_Widget::run() * (i.e. not from background thread). * * After this callback is called, UI is defunct. Host must call LV2UI_Descriptor::cleanup(). * If host wants to make the UI visible again, the UI must be reinstantiated. * * @note When using the deprecated URI LV2_EXTERNAL_UI_DEPRECATED_URI, * some hosts will not call LV2UI_Descriptor::cleanup() as they should, * and may call show() again without re-initialization. * * @param controller Host context associated with plugin UI, as * supplied to LV2UI_Descriptor::instantiate(). */ void (*ui_closed)(LV2UI_Controller controller); /** * Optional (may be NULL) "user friendly" identifier which the UI * may display to allow a user to easily associate this particular * UI instance with the correct plugin instance as it is represented * by the host (e.g. "track 1" or "channel 4"). * * If supplied by host, the string will be referenced only during * LV2UI_Descriptor::instantiate() */ const char * plugin_human_id; } LV2_External_UI_Host; #ifdef __cplusplus } /* extern "C" */ #endif #endif /* LV2_EXTERNAL_UI_H */ yoshimi-2.3.5.1/src/LV2_Plugin/manifest.ttl000066400000000000000000000017201506652756400204240ustar00rootroot00000000000000@prefix lv2: . @prefix rdfs: . @prefix ui: . a lv2:Plugin, lv2:InstrumentPlugin; lv2:binary ; rdfs:seeAlso . a lv2:Plugin, lv2:InstrumentPlugin; lv2:binary ; rdfs:seeAlso . a ; ui:binary ; lv2:extensionData , ; lv2:optionalFeature ; lv2:optionalFeature ; lv2:requiredFeature . yoshimi-2.3.5.1/src/LV2_Plugin/yoshimi.ttl000066400000000000000000000237451506652756400203120ustar00rootroot00000000000000@prefix atom: . @prefix doap: . @prefix foaf: . @prefix lv2: . @prefix rdfs: . @prefix work: . @prefix opts: . @prefix ui: . @prefix state: . @prefix time: . a lv2:InstrumentPlugin, lv2:Plugin ; doap:name "Yoshimi-Multi" ; doap:maintainer [ foaf:name "Yoshimi Team" ; foaf:homepage ; foaf:mbox ; ] ; doap:license ; lv2:minorVersion 7; lv2:microVersion 2; lv2:requiredFeature , , opts:options; opts:requiredOption ; opts:supportedOptions , ; lv2:optionalFeature lv2:hardRTCapable ; opts:requiredOption ; opts:supportedOptions , ; lv2:extensionData , ; ui:ui ; lv2:port [ a lv2:InputPort, atom:AtomPort ; atom:bufferType atom:Sequence ; atom:supports , time:Position ; lv2:index 0 ; lv2:symbol "events_in" ; lv2:name "Events input" ; lv2:designation lv2:control ; ]; lv2:port [ a lv2:InputPort, lv2:ControlPort ; lv2:index 1 ; lv2:symbol "lv2_freewheel" ; lv2:name "Freewheel" ; lv2:default 0.0 ; lv2:minimum 0.0 ; lv2:maximum 1.0 ; lv2:designation ; lv2:portProperty lv2:toggled ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 2 ; lv2:symbol "outl" ; lv2:name "Main left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 3 ; lv2:symbol "outr" ; lv2:name "Main right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 4 ; lv2:symbol "track_1_l" ; lv2:name "Track 1 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 5 ; lv2:symbol "track_1_r" ; lv2:name "Track 1 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 6 ; lv2:symbol "track_2_l" ; lv2:name "Track 2 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 7 ; lv2:symbol "track_2_r" ; lv2:name "Track 2 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 8 ; lv2:symbol "track_3_l" ; lv2:name "Track 3 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 9 ; lv2:symbol "track_3_r" ; lv2:name "Track 3 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 10 ; lv2:symbol "track_4_l" ; lv2:name "Track 4 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 11 ; lv2:symbol "track_4_r" ; lv2:name "Track 4 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 12 ; lv2:symbol "track_5_l" ; lv2:name "Track 5 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 13 ; lv2:symbol "track_5_r" ; lv2:name "Track 5 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 14 ; lv2:symbol "track_6_l" ; lv2:name "Track 6 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 15 ; lv2:symbol "track_6_r" ; lv2:name "Track 6 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 16 ; lv2:symbol "track_7_l" ; lv2:name "Track 7 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 17 ; lv2:symbol "track_7_r" ; lv2:name "Track 7 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 18 ; lv2:symbol "track_8_l" ; lv2:name "Track 8 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 19 ; lv2:symbol "track_8_r" ; lv2:name "Track 8 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 20 ; lv2:symbol "track_9_l" ; lv2:name "Track 9 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 21 ; lv2:symbol "track_9_r" ; lv2:name "Track 9 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 22 ; lv2:symbol "track_10_l" ; lv2:name "Track 10 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 23 ; lv2:symbol "track_10_r" ; lv2:name "Track 10 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 24 ; lv2:symbol "track_11_l" ; lv2:name "Track 11 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 25 ; lv2:symbol "track_11_r" ; lv2:name "Track 11 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 26 ; lv2:symbol "track_12_l" ; lv2:name "Track 12 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 27 ; lv2:symbol "track_12_r" ; lv2:name "Track 12 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 28 ; lv2:symbol "track_13_l" ; lv2:name "Track 13 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 29 ; lv2:symbol "track_13_r" ; lv2:name "Track 13 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 30 ; lv2:symbol "track_14_l" ; lv2:name "Track 14 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 31 ; lv2:symbol "track_14_r" ; lv2:name "Track 14 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 32 ; lv2:symbol "track_15_l" ; lv2:name "Track 15 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 33 ; lv2:symbol "track_15_r" ; lv2:name "Track 15 right" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 34 ; lv2:symbol "track_16_l" ; lv2:name "Track 16 left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 35 ; lv2:symbol "track_16_r" ; lv2:name "Track 16 right" ; ]; lv2:port [ a lv2:OutputPort, atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 36 ; lv2:symbol "notify" ; lv2:name "Notify"; ]. a lv2:InstrumentPlugin, lv2:Plugin ; doap:name "Yoshimi"; doap:maintainer [ foaf:name "Yoshimi Team"; foaf:homepage ; foaf:mbox ; ] ; doap:license ; lv2:minorVersion 7; lv2:microVersion 2; lv2:requiredFeature , , opts:options; opts:requiredOption ; opts:supportedOptions , ; lv2:optionalFeature lv2:hardRTCapable ; opts:requiredOption ; opts:supportedOptions , ; lv2:extensionData , ; ui:ui ; lv2:port [ a lv2:InputPort, atom:AtomPort ; atom:bufferType atom:Sequence ; atom:supports , time:Position ; lv2:index 0 ; lv2:symbol "events_in" ; lv2:name "Events input" ; lv2:designation lv2:control ; ]; lv2:port [ a lv2:InputPort, lv2:ControlPort ; lv2:index 1 ; lv2:symbol "lv2_freewheel" ; lv2:name "Freewheel" ; lv2:default 0.0 ; lv2:minimum 0.0 ; lv2:maximum 1.0 ; lv2:designation ; lv2:portProperty lv2:toggled ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 2 ; lv2:symbol "outl" ; lv2:name "Main left" ; ]; lv2:port [ a lv2:OutputPort, lv2:AudioPort ; lv2:index 3 ; lv2:symbol "outr" ; lv2:name "Main right" ; ]; lv2:port [ a lv2:OutputPort, atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 4 ; lv2:symbol "notify" ; lv2:name "Notify"; ]. yoshimi-2.3.5.1/src/Misc/000077500000000000000000000000001506652756400150435ustar00rootroot00000000000000yoshimi-2.3.5.1/src/Misc/Alloc.h000066400000000000000000000056231506652756400162540ustar00rootroot00000000000000/* Alloc.h - managing size allocations Copyright 2022, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef MISC_ALLOC_H #define MISC_ALLOC_H #include /* ===== Managing Sample Buffers with unique ownership ===== */ /* Explanation: this is a "smart-handle" to manage the allocation of sample data. * - Can be used as *drop-in replacement* for a bare float* or float[] * - Can not be copied, only moved. This enforces a single owner of the allocation. * - A class holding this handle can likewise not be copied, unless explicitly coded. * - Usually, it should be created with a given size, causing appropriate allocation. * - By default the handle is created *empty*; this can be tested by bool evaluation. * - The function reset(size_t) discards the existing allocation and possibly allocates * a new buffer of the given size (or returns to empty state) * - Provides an overloaded subscript operator for array-style access; * the embedded raw pointer can be retrieved with get() * - Automatically deallocates memory when instance goes out of scope, for whatever reason. * * The implementation is based on std::unique_ptr and is thus zero-overhead in comparison * to a bare pointer, when compiled with optimisation. Note however that the buffer is * always zero initialised (the existing code used to do that after allocation anyway) */ class Samples : public std::unique_ptr { using _unique_ptr = std::unique_ptr; static float* allocate(size_t elemCnt) { return elemCnt == 0? nullptr // allow to create empty Data holder : new float[elemCnt]{0}; // NOTE: zero-init } public: Samples(size_t buffSize =0) : _unique_ptr{allocate(buffSize)} { } // can be moved, but not copied or assigned Samples(Samples&&) = default; Samples(Samples const&) = delete; Samples& operator=(Samples&&) = delete; Samples& operator=(Samples const&) = delete; explicit operator bool() const { return bool(get()); } ///< to detect an empty samples buffer /** discard existing allocation and possibly create/manage new allocation */ void reset(size_t newSize =0) { _unique_ptr::reset(allocate(newSize)); } }; #endif /*MISC_ALLOC_H*/ yoshimi-2.3.5.1/src/Misc/Bank.cpp000066400000000000000000001623341506652756400164330ustar00rootroot00000000000000/* Bank.cpp - Instrument Bank Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2014-2023, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "Misc/XMLStore.h" #include "Misc/Config.h" #include "Misc/Bank.h" #include "Misc/SynthEngine.h" #include "Misc/TextMsgBuffer.h" #include "Misc/FileMgrFuncs.h" #include "Misc/FormatFuncs.h" const int BANKS_VERSION = 11; using file::make_legit_filename; using file::isRegularFile; using file::isDirectory; using file::renameDir; using file::createDir; using file::deleteDir; using file::listDir; using file::copyDir; using file::copyFile; using file::renameFile; using file::deleteFile; using file::countDir; using file::findLeafName; using file::setExtension; using file::extendLocalPath; using file::loadText; using file::saveText; using func::asString; using func::string2int; using func::findSplitPoint; using func::isDigits; using std::map; using std::list; using std::optional; using std::to_string; using std::string; Bank::Bank(SynthEngine& _synth) : version{BANKS_VERSION} , banksInRoots{0} , instrumentsInBanks{0} , defaultInsName{} , foundLocal{file::localDir() + "/found/"} , roots{} , synth(_synth) { } string Bank::getBankFileTitle(size_t root, size_t bank) { string name = synth.makeUniqueName("Root " + asString(root) + ", Bank " + asString(bank) + " - " + getBankPath(root, bank)); return name; } string Bank::getRootFileTitle(size_t root) { return synth.makeUniqueName("Root " + asString(root) + " - " + getRootPath(root)); } int Bank::getType(uint ninstrument, size_t bank, size_t root) { if (emptyslot(root, bank, ninstrument)) return -1; return getInstrumentReference(root, bank, ninstrument).instType; } // Get the name of an instrument from the bank string Bank::getname(uint ninstrument, size_t bank, size_t root) { if (emptyslot(root, bank, ninstrument)) return defaultInsName; return getInstrumentReference(root, bank, ninstrument).name; } // Get the numbered name of an instrument from the bank string Bank::getnamenumbered(uint ninstrument, size_t bank, size_t root) { if (emptyslot(root, bank, ninstrument)) return defaultInsName; string strRet = asString(ninstrument + 1) + ". " + getname(ninstrument, bank, root); return strRet; } // Changes the instrument name in place int Bank::setInstrumentName(string const& name, int slot, size_t bank, size_t root) { string result; string slotNum = to_string(slot + 1) + ". "; bool fail = false; if (emptyslot(root, bank, slot)) { result = "No instrument on slot " + slotNum; fail = true; } else if (!moveInstrument(slot, name, slot, bank, bank, root, root)) { result = "Could not change name of slot " + slotNum; fail = true; } else result = slotNum + name; int msgID = synth.textMsgBuffer.push(result); if (fail) msgID |= 0xFF0000; return msgID; } /** * Changes the name and location of an instrument (and the filename) * If newslot==-1 then this is ignored, else it will be put on that slot. */ bool Bank::moveInstrument(uint ninstrument, string const& newname, int newslot, size_t oldBank, size_t newBank, size_t oldRoot, size_t newRoot) { if (emptyslot(oldRoot, oldBank, ninstrument)) return false; string newfilepath = getBankPath(newRoot, newBank); if (newfilepath.at(newfilepath.size() - 1) != '/') newfilepath += "/"; int slot = (newslot >= 0) ? newslot + 1 : ninstrument + 1; string filename = "0000" + asString(slot); filename = filename.substr(filename.size() - 4, 4) + "-" + newname + EXTEN::zynInst; make_legit_filename(filename); bool chk = false; bool chk2 = false; newfilepath += filename; string oldfilepath = setExtension(getFullPath(oldRoot, oldBank, ninstrument), EXTEN::zynInst); chk = renameFile(oldfilepath, newfilepath); newfilepath = setExtension(newfilepath, EXTEN::yoshInst); oldfilepath = setExtension(oldfilepath, EXTEN::yoshInst); chk2 = renameFile(oldfilepath, newfilepath); if (chk == false && chk2 == false) { synth.getRuntime().Log("failed changing " + oldfilepath + " to " + newfilepath + ": " + string(strerror(errno))); return false; } InstrumentEntry &instrRef = getInstrumentReference(oldRoot, oldBank, ninstrument); instrRef.name = newname; instrRef.filename = filename; return true; } // Check if there is no instrument on a slot from the bank bool Bank::emptyslot(size_t rootID, size_t bankID, uint ninstrument) { if (roots.count(rootID) == 0 || roots [rootID].banks.count(bankID) == 0) return true; InstrumentEntry &instr = roots [rootID].banks [bankID].instruments [ninstrument]; if (!instr.used) return true; if (instr.name.empty() || instr.filename.empty()) return true; return false; } // Removes the instrument from the bank string Bank::clearslot(uint ninstrument, size_t rootID, size_t bankID) { bool chk = true; bool chk2 = true; // to stop complaints if (emptyslot(rootID, bankID, ninstrument)) // this is not an error return (". None found at slot " + to_string(ninstrument + 1)); string tmpfile = setExtension(getFullPath(rootID, bankID, ninstrument), EXTEN::yoshInst); if (isRegularFile(tmpfile)) chk = deleteFile(tmpfile); tmpfile = setExtension(tmpfile, EXTEN::zynInst); if (isRegularFile(tmpfile)) chk2 = deleteFile(tmpfile); string instName = getname(ninstrument, bankID, rootID); string result; if (chk && chk2) { deletefrombank(rootID, bankID, ninstrument); result = "d "; } else { result = " FAILED Could not delete "; if (chk && !chk2) instName += EXTEN::zynInst; else if (!chk && chk2) instName += EXTEN::yoshInst; /* * done this way so that if only one type fails * it is identified, but if both are present and * can't be deleted it doesn't mark the extension. */ } return (result + "'" + instName + "' from slot " + to_string(ninstrument + 1)); } bool Bank::savetoslot(size_t rootID, size_t bankID, int ninstrument, int npart) { string filepath = getBankPath(rootID, bankID); string name = synth.part[npart]->Pname; if (filepath.at(filepath.size() - 1) != '/') filepath += "/"; clearslot(ninstrument, rootID, bankID); string filename = "0000" + asString(ninstrument + 1); filename = filename.substr(filename.size() - 4, 4) + "-" + name + EXTEN::zynInst; make_legit_filename(filename); string fullpath = filepath + filename; bool ok1 = true; bool ok2 = true; int saveType = synth.getRuntime().instrumentFormat; if (isRegularFile(fullpath)) { if (!deleteFile(fullpath)) { synth.getRuntime().Log("saveToSlot failed to unlink " + fullpath); return false; } } if (saveType & 1) // legacy ok2 = synth.part[npart]->saveXML(fullpath, false); fullpath = setExtension(fullpath, EXTEN::yoshInst); if (isRegularFile(fullpath)) { if (!deleteFile(fullpath)) { synth.getRuntime().Log("saveToSlot failed to unlink " + fullpath); return false; } } if (saveType & 2) // Yoshimi format ok1 = synth.part[npart]->saveXML(fullpath, true); if (!ok1 || !ok2) return false; saveText(string(YOSHIMI_VERSION), filepath + EXTEN::validBank); addtobank(rootID, bankID, ninstrument, filename, name); return true; } //Gets a bank name string Bank::getBankName(int bankID, size_t rootID) { if (rootID > 0x7f) rootID = synth.getRuntime().currentRoot; if (roots [rootID].banks.count(bankID) == 0) return ""; return string(roots [rootID].banks [bankID].dirname); } bool Bank::isDuplicateBankName(size_t rootID, string const& name) { for (int i = 0; i < MAX_BANK_ROOT_DIRS; ++i) { string check = getBankName(i,rootID); if (check > "" && check == name) return true; } return false; } // finds the number of instruments in a bank int Bank::getBankSize(int bankID, size_t rootID) { int found = 0; for (int i = 0; i < MAX_INSTRUMENTS_IN_BANK; ++ i) if (!roots [rootID].banks [bankID].instruments [i].name.empty()) found += 1; return found; } int Bank::changeBankName(size_t rootID, size_t bankID, string const& newName) { string filename = newName; string oldName = getBankName(bankID, rootID); make_legit_filename(filename); string newfilepath = getRootPath(synth.getRuntime().currentRoot) + "/" + filename; string reply = ""; bool failed = false; if (!renameDir(getBankPath(synth.getRuntime().currentRoot,bankID), newfilepath)) { reply = "Could not change bank '" + oldName + "' in root " + to_string(rootID); failed = true; } else { roots [synth.getRuntime().currentRoot].banks [bankID].dirname = newName; reply = "Changed " + oldName + " to " + newName; } int msgID = synth.textMsgBuffer.push(reply); if (failed) msgID |= 0xFF0000; return msgID; } namespace { inline void splitNumFromName(int &num, string &name) { int chk = func::findSplitPoint(name); if (chk > 0) { num = func::string2int(name.substr(0, chk)) - 1; // remove "NNNN-" from instrument name name = name.substr(chk + 1); } } } void Bank::checkbank(size_t rootID, size_t banknum) { string bankdirname = getBankPath(rootID, banknum); if (bankdirname.empty()) { return; } string chkpath; list thisBank; uint32_t found = listDir(&thisBank, bankdirname); if (found == 0xffffffff) { synth.getRuntime().Log("Failed to open bank directory " + bankdirname); thisBank.clear(); return; } if (found == 0) { roots [rootID].banks.erase(banknum); thisBank.clear(); return; } string path = getBankPath(rootID, banknum) + "/"; // clear missing/removed entries for (int pos = 0; pos < MAX_INSTRUMENTS_IN_BANK; ++pos) { if (!emptyslot(rootID, banknum, pos)) { string chkpath = path + getInstrumentReference(rootID, banknum, pos).filename; if (!isRegularFile(chkpath)) { getInstrumentReference(rootID, banknum, pos).clear(); } } } for (list::iterator it = thisBank.begin(); it != thisBank.end(); ++it) { string candidate = *it; if (candidate.size() <= EXTEN::zynInst.size()) // at least a single char filename *it = ""; else { chkpath = bankdirname + "/" + candidate; if (!isRegularFile(chkpath)) *it = ""; else { string exten = file::findExtension(chkpath); if (exten != EXTEN::yoshInst && exten != EXTEN::zynInst) *it = ""; else { string instname = candidate.substr(0, candidate.size() - exten.size()); int instnum = -1; splitNumFromName(instnum, instname); if (instnum >= 0 && !emptyslot(rootID, banknum, instnum)) // a recognised location { int othernum = -1; string othername = roots [rootID].banks [banknum].instruments [instnum].filename; othername = othername.substr(0, othername.size() - exten.size()); splitNumFromName(othernum, othername); if (instname == othername) { if (exten == EXTEN::yoshInst) // yoshiType takes priority getInstrumentReference(rootID, banknum, instnum).yoshiFormat = true; *it = ""; } } } } } } string candidate; for (list::iterator it = thisBank.begin(); it != thisBank.end(); ++it) { candidate = *it; if (!candidate.empty()) { // remove extension string exten = file::findExtension(chkpath); string instname = candidate.substr(0, candidate.size() - exten.size()); int instnum = -1; splitNumFromName(instnum, instname); addtobank(rootID, banknum, instnum, candidate, instname); } } thisBank.clear(); } // Makes current a bank directory bool Bank::loadbank(size_t rootID, size_t banknum) { string bankdirname = getBankPath(rootID, banknum); if (bankdirname.empty()) return false; roots [rootID].banks [banknum].instruments.clear(); string chkpath; string candidate; list thisBank; uint32_t found = listDir(&thisBank, bankdirname); if (found == 0xffffffff) { synth.getRuntime().Log("Failed to open bank directory " + bankdirname); return false; } if (bankdirname.at(bankdirname.size() - 1) != '/') bankdirname += '/'; for (list::iterator it = thisBank.begin(); it != thisBank.end(); ++ it) { candidate = *it; if (candidate.size() <= (EXTEN::zynInst.size())) // at least a 1 char filename! continue; chkpath = bankdirname + candidate; if (!isRegularFile(chkpath)) continue; string exten = file::findExtension(chkpath); if (exten != EXTEN::yoshInst && exten != EXTEN::zynInst) continue; if (exten == EXTEN::zynInst && isRegularFile(setExtension(chkpath, EXTEN::yoshInst))) continue; // don't want .xiz if there is .xiy // remove extension string instname = candidate.substr(0, candidate.size() - exten.size()); int instnum = -1; splitNumFromName(instnum, instname); addtobank(rootID, banknum, instnum, candidate, instname); instrumentsInBanks += 1; } thisBank.clear(); return true; } // Creates an external bank and copies in the contents of the IDd one string Bank::exportBank(string const& exportdir, size_t rootID, uint bankID) { string name = ""; string sourcedir = ""; bool ok = true; if (roots.count(rootID) == 0) { name = "Root ID " + to_string(int(rootID)) + " doesn't exist"; ok = false; } if (ok && roots [rootID].banks.count(bankID) == 0) { name = "Bank " + to_string(bankID) + " is empty"; ok = false; } else sourcedir = getRootPath(rootID) + "/" + getBankName(bankID, rootID); if (ok && isDirectory(exportdir)) { ok = false; name = "Can't overwrite existing directory"; } if (ok) { int result = createDir(exportdir); if (result != 0) { name = "Can't create external bank " + findLeafName(exportdir); ok = false; } else { uint32_t result = copyDir(sourcedir, exportdir, 0); if (result != 0) { name = "Copied out " + to_string(result & 0xffff) + " files to " + exportdir + ". "; result = result >> 16; if (result > 0) name += ("Failed to transfer" + to_string(result)); } else { name = "to transfer to " + exportdir; // failed ok = false; } } } if (ok) name = " " + name; // need the extra space else name = " FAILED " + name; return name; } // Creates a new bank and copies in the contents of the external one string Bank::importBank(string importdir, size_t rootID, uint bankID) { string name = ""; bool ok = true; bool partial = false; if (roots.count(rootID) == 0) { name = "Root ID " + to_string(int(rootID)) + " doesn't exist"; ok = false; } if (ok && roots [rootID].banks.count(bankID) != 0) { name = "Bank " + to_string(bankID) + " already contains " + getBankName(bankID, rootID); ok = false; } if (ok) { list thisBank; uint32_t found = listDir(&thisBank, importdir); if (found == 0xffffffff) { synth.getRuntime().Log("Can't find " + importdir); ok = false; } else { if (importdir.back() == '/') importdir = importdir.substr(0, importdir.length() - 1); string bankname = findLeafName(importdir); int repeats = 0; string suffix = ""; while (isDirectory(getRootPath(rootID) + "/" + bankname + suffix)) { ++repeats; suffix = "~" + to_string(repeats); } bankname += suffix; if (!newIDbank(bankname, bankID, rootID)) { name = "Can't create bank " + bankname + " in root " + getRootPath(rootID); ok = false; } else { int count = 0; int total = 0; bool missing = false; string externfile = getRootPath(rootID) + "/" + getBankName(bankID, rootID); for (list::iterator it = thisBank.begin(); it != thisBank.end(); ++ it) { string nextfile = *it; if (nextfile.rfind(EXTEN::validBank) != string::npos) continue; // new version will be generated string exten = file::findExtension(nextfile); if (exten == EXTEN::yoshInst || exten == EXTEN::zynInst) { if (copyFile(importdir + "/" + nextfile, externfile + "/" + nextfile, 0)) missing = true; // remove extension string instname = nextfile.substr(0, nextfile.size() - exten.size()); int instnum = -2; // no number prefix splitNumFromName(instnum, instname); if (instnum == -1) // we don't accept a displayed prefix of zero instnum = MAX_INSTRUMENTS_IN_BANK -1; if (!isDuplicate(rootID, bankID, instnum, nextfile)) { if (addtobank(rootID, bankID, instnum, nextfile, instname)) missing = true; } ++count; } ++total; } name = importdir; if (count == 0) { partial = true; name += " : No valid instruments found"; } else if (missing) { partial = true; name += " : Failed to copy some instruments"; } else if (count < total) { partial = true; name = name + " : Ignored " + to_string(total - count) + " unrecognised items"; } } } thisBank.clear(); } if (!ok) name = " FAILED " + name; else if (!partial) name = "ed " + name; return name; } bool Bank::isDuplicate(size_t rootID, size_t bankID, int pos, string filename) { string path = getRootPath(rootID) + "/" + getBankName(bankID, rootID) + "/" + filename; if (isRegularFile(setExtension(path, EXTEN::yoshInst)) && filename.rfind(EXTEN::zynInst) < string::npos) return 1; if (isRegularFile(setExtension(path, EXTEN::zynInst)) && filename.rfind(EXTEN::yoshInst) < string::npos) { getInstrumentReference(rootID, bankID, pos).yoshiFormat = true; return 1; } return 0; } // Makes a new bank with known ID. Does *not* make it current bool Bank::newIDbank(string const& newbankdir, uint bankID, size_t rootID) { if (rootID == UNUSED) rootID = synth.getRuntime().currentRoot; // shouldn't be needed! if (!newbankfile(newbankdir, rootID)) return false; roots [synth.getRuntime().currentRoot].banks [bankID].dirname = newbankdir; return true; } // Performs the actual file operation for new banks bool Bank::newbankfile(string const& newbankdir, size_t rootID) { if (getRootPath(synth.getRuntime().currentRoot).empty()) return false; string newbankpath = getRootPath(rootID); if (newbankpath.at(newbankpath.size() - 1) != '/') newbankpath += "/"; newbankpath += newbankdir; int result = createDir(newbankpath); if (result != 0) return false; string forcefile = newbankpath; if (forcefile.at(forcefile.size() - 1) != '/') forcefile += "/"; saveText(string(YOSHIMI_VERSION), forcefile + EXTEN::validBank); return true; } // Removes a bank and all its contents string Bank::removebank(uint bankID, size_t rootID) { if (rootID == UNUSED) rootID = synth.getRuntime().currentRoot; if (roots.count(rootID) == 0) // not an error return ("Root " + to_string(int(rootID)) + " is empty!"); string bankName = getBankPath(rootID, bankID); // ID bank and test for writeable string IDfile = bankName + "/" + EXTEN::validBank; if (!saveText(string(YOSHIMI_VERSION), IDfile)) return (" FAILED Can't delete from this location."); bool ck1 = true; bool ck2 = true; int chk = 0; string name; string failed; for (int inst = 0; inst < MAX_INSTRUMENTS_IN_BANK; ++ inst) { if (!roots [rootID].banks [bankID].instruments [inst].name.empty()) { name = setExtension(getFullPath(synth.getRuntime().currentRoot, bankID, inst), EXTEN::yoshInst); if (isRegularFile(name)) ck1 = deleteFile(name); else ck1 = true; name = setExtension(name, EXTEN::zynInst); if (isRegularFile(name)) ck2 = deleteFile(name); else ck2 = true; if (ck1 == true && ck2 == true) deletefrombank(rootID, bankID, inst); else { ++ chk; if (chk == 0) // only want to name one entry failed = (" FAILED Can't remove " + findLeafName(name) + ". Others may also still exist."); } } } if (chk > 0) return failed; // ID file only removed when bank cleared if (deleteFile(IDfile)) { chk = 1; deleteDir(bankName); } roots [rootID].banks.erase(bankID); if (rootID == synth.getRuntime().currentRoot && bankID == synth.getRuntime().currentBank) setCurrentBankID(0, false); int remainder = countDir(bankName); if (remainder > 0) return(" FAILED Bank " + bankName + " unlinked but " + to_string(remainder) + " unrecognised objects still exist."); return ("d " + bankName); } // Swaps a slot with another string Bank::swapslot(uint n1, uint n2, size_t bank1, size_t bank2, size_t root1, size_t root2) { if (n1 == n2 && bank1 == bank2 && root1 == root2) return " Can't swap with itself!"; /* * path entries will always have either .xiy or .xiz * otherwise they would not have been seen at all * however we test for, and move both if they exist */ string message = ""; bool ok = true; if (emptyslot(root1, bank1, n1) && emptyslot(root2, bank2, n2)) return " Nothing to swap!"; if (emptyslot(root1, bank1, n1) || emptyslot(root2, bank2, n2)) { // this is just a movement to an empty slot if (emptyslot(root1, bank1, n1)) // make the empty slot the destination { if (!moveInstrument(n2, getname(n2, bank2, root2), n1, bank2, bank1, root2, root1)) { ok = false; message = " Can't write to " + getname(n2, bank2, root2); } else message = to_string(n2) + " " + getname(n2, bank2, root2); getInstrumentReference(root1, bank1, n1) = getInstrumentReference(root2, bank2, n2); getInstrumentReference(root2, bank2, n2).clear(); } else { if (!moveInstrument(n1, getname(n1, bank1, root1), n2, bank1, bank2, root1, root2)) { ok = false; message = " Can't write to " + getname(n1, bank1, root1); } else message = to_string(n2) + " " + getname(n1, bank1, root1); getInstrumentReference(root2, bank2, n2) = getInstrumentReference(root1, bank1, n1); getInstrumentReference(root1, bank1, n1).clear(); } if (!ok) return (" FAILED" + message); else return (" Moved to " + message); } // if both slots are used string firstName = getname(n1, bank1, root1); string secondName = getname(n2, bank2, root2); if (firstName == secondName) return " Can't swap instruments with identical names."; InstrumentEntry &instrRef1 = getInstrumentReference(root1, bank1, n1); InstrumentEntry &instrRef2 = getInstrumentReference(root2, bank2, n2); if (!moveInstrument(n2, secondName, n1, bank2, bank1, root2, root1)) { ok = false; message = " Can't change " + secondName; } if (!moveInstrument(n1, firstName, n2, bank1, bank2, root1, root2)) { ok = false; message = " Can't change " + firstName; } else { InstrumentEntry instrTmp = instrRef1; instrRef1 = instrRef2; instrRef2 = instrTmp; } if (!ok) return (" FAILED" + message); return ("ped " + firstName + " with " + secondName); } // Intelligently moves or swaps banks preserving instrument details string Bank::swapbanks(uint firstID, uint secondID, size_t firstRoot, size_t secondRoot) { string firstname; string secondname; int moveType = 0; if (firstID == secondID && firstRoot == secondRoot) return " Can't swap with itself!"; firstname = getBankName(firstID, firstRoot); secondname = getBankName(secondID, secondRoot); if (firstname.empty() && secondname.empty()) return " Nothing to swap!"; if (firstRoot != secondRoot) { if (isDuplicateBankName(firstRoot, secondname)) return (" FAILED " + secondname + " already exists in root " + to_string(firstRoot)); if (isDuplicateBankName(secondRoot, firstname)) return (" FAILED " + firstname + " already exists in root " + to_string(secondRoot)); } if (firstRoot != secondRoot) // do physical move first { string firstBankPath = getBankPath(firstRoot, firstID); string secondBankPath = getBankPath(secondRoot, secondID); string newfirstBankPath = getRootPath(secondRoot) + "/" + firstname; string newsecondBankPath = getRootPath(firstRoot) + "/" + secondname; string tempBankPath = getRootPath(firstRoot) + "/tempfile"; if (secondBankPath == "") // move only { if (!renameDir(firstBankPath, (getRootPath(secondRoot) + "/" + firstname))) { synth.getRuntime().Log("move to " + to_string(secondRoot) + ": " + string(strerror(errno)), _SYS_::LogNotSerious); return (" FAILED Can't move from root " + to_string(firstRoot) + " to " + to_string(secondRoot)); } } else if (firstBankPath == "") // move only { if (!renameDir(secondBankPath, (getRootPath(firstRoot) + "/" + secondname))) { synth.getRuntime().Log("move to " + to_string(firstRoot) + ": " + string(strerror(errno)), _SYS_::LogNotSerious); return (" FAILED Can't move from root " + to_string(secondRoot) + " to " + to_string(firstRoot)); } } else // actual swap { // due to possible identical names we need to go via a temp file deleteDir(tempBankPath); // just to be sure if (!renameDir(firstBankPath, tempBankPath)) { synth.getRuntime().Log("failed move to temp dir", _SYS_::LogNotSerious); return(" FAILED Can't move from root " + to_string(firstRoot) + " to temp dir"); } if (!renameDir(secondBankPath,newsecondBankPath)) { synth.getRuntime().Log("failed move to " + to_string(firstRoot), _SYS_::LogNotSerious); return(" FAILED Can't move from root " + to_string(secondRoot) + " to " + to_string(firstRoot)); } if (!renameDir(tempBankPath, newfirstBankPath)) { synth.getRuntime().Log("failed move to " + to_string(secondRoot), _SYS_::LogNotSerious); return (" FAILED Can't move from temp dir to " + to_string(secondRoot)); } } } // update banks if (secondname.empty()) { moveType = 1; roots [secondRoot].banks [secondID] = roots [firstRoot].banks [firstID]; roots [firstRoot].banks.erase(firstID); } else if (firstname.empty()) { moveType = 2; roots [firstRoot].banks [firstID] = roots [secondRoot].banks [secondID]; roots [secondRoot].banks.erase(secondID); } else { roots [firstRoot].banks [firstID].dirname = secondname; roots [secondRoot].banks [secondID].dirname = firstname; for (int pos = 0; pos < MAX_INSTRUMENTS_IN_BANK; ++ pos) { InstrumentEntry &instrRef_1 = getInstrumentReference(firstRoot, firstID, pos); InstrumentEntry &instrRef_2 = getInstrumentReference(secondRoot, secondID, pos); InstrumentEntry tmp = instrRef_2; if (instrRef_1.name == "") roots [secondRoot].banks [secondID].instruments.erase(pos); else instrRef_2 = instrRef_1; if (tmp.name == "") roots [firstRoot].banks [firstID].instruments.erase(pos); else instrRef_1 = tmp; } } if (firstRoot == synth.getRuntime().currentRoot) synth.getRuntime().currentRoot = secondRoot; else if (secondRoot == synth.getRuntime().currentBank) synth.getRuntime().currentBank = firstRoot; if (firstID == synth.getRuntime().currentBank) synth.getRuntime().currentBank = secondID; else if (secondID == synth.getRuntime().currentBank) synth.getRuntime().currentBank = firstID; if (moveType == 0) return ("ped " + firstname + " with " + secondname); int destination; string type = "slot "; if (firstRoot == secondRoot) { if (moveType == 1) destination = secondID; else destination = firstID; } else { type = "root "; if (moveType == 1) destination = secondRoot; else destination = firstRoot; } if (moveType == 2) return (" Moved " + secondname + " to " + type + to_string(destination)); return (" Moved " + firstname + " to " + type + to_string(destination)); } bool Bank::isOccupiedRoot(string rootCandidate) { if(rootCandidate.empty()) return false; bool foundBank = false; list thisRoot; uint32_t count = listDir(&thisRoot, rootCandidate); if (count == 0) return false; list::iterator it = thisRoot.begin(); while (foundBank == false && it != thisRoot.end()) { std::cout << "bank " << *it << std::endl; if (isValidBank(*it)) foundBank = true; ++ it; } return foundBank; } // private affairs bool Bank::isValidBank(string chkdir) { if (!isDirectory(chkdir)) return false; // check if directory contains an instrument or EXTEN::validBank list tryBank; uint32_t tried = listDir(&tryBank, chkdir); if (tried == 0xffffffff) { synth.getRuntime().Log("Failed to open bank directory candidate " + chkdir); return false; } chkdir += "/"; for (list::iterator it_b = tryBank.begin(); it_b != tryBank.end(); ++ it_b) { string chkpath = chkdir + *it_b; if (isRegularFile(chkpath)) { string tryext = file::findExtension(chkpath); if (tryext == EXTEN::validBank || tryext == EXTEN::yoshInst || tryext == EXTEN::zynInst) return true; } } return false; } /** * Add an instrument to the bank. * If pos is -1 try to find next suitable position * @return `true` if the instrument was added */ bool Bank::addtobank(size_t rootID, size_t bankID, int pos, string filename, const string name) { if (pos < 0 or pos >= MAX_INSTRUMENTS_IN_BANK) return -1; //invalid location BankEntry &bank = roots [rootID].banks [bankID]; string exten = file::findExtension(filename); if (bank.instruments [pos].used) { string oldName = getname(pos, bankID, rootID); /* * We test the internal name. The file name could have been * changed, but if the internal one is changed it is most * likely to be a modified instrument. */ if (name == oldName) // duplicate { if (exten == EXTEN::yoshInst) // yoshiType takes priority { auto& slot = getInstrumentReference(rootID, bankID, pos); slot.yoshiFormat = true; slot.filename = setExtension(slot.filename, EXTEN::yoshInst); } return 0; // no actual insertion necessary } pos = -1; // location occupied so find a new free position } bool wanted = (pos >=0); if (pos < 0) { pos = MAX_INSTRUMENTS_IN_BANK; while (pos > 0 && !wanted) { --pos; if (emptyslot(rootID, bankID, pos)) wanted = true; else if (name == getname(pos, bankID, rootID)) { pos = -1; } } } if (!wanted) return -1; // duplicated or the bank is full string bankdirname = getBankPath(rootID, bankID) + "/"; string prefix = "0000" + to_string(pos + 1); prefix = prefix.substr(prefix.size() - 4); string newfile = prefix + "-" + name + exten; /* * If we are repositioning this file because it has the same * ID as an existing one but is in a non-writable location * we store its original filename while showing an offset ID. * If the location is writable we move the file. */ if (renameFile(bankdirname + filename, bankdirname + newfile)) filename = newfile; string file_to_evaluate = bankdirname + filename; file_to_evaluate = setExtension(file_to_evaluate, EXTEN::yoshInst); if (not isRegularFile(file_to_evaluate)) file_to_evaluate = setExtension(file_to_evaluate, EXTEN::zynInst); exten = file::findExtension(file_to_evaluate); filename = file::findLeafName(file_to_evaluate)+exten; // scan the actual file to verify type and find Add|Sub|Pad-Synth usage auto& logger{synth.getRuntime().getLogger()}; auto detectedFeatures = XMLStore::checkfileinformation(file_to_evaluate, logger); // store collected information into the Bank slot InstrumentEntry &instrRef = getInstrumentReference(rootID, bankID, pos); instrRef.used = true; instrRef.name = name; instrRef.filename = filename; instrRef.instType = detectedFeatures.instType; instrRef.yoshiFormat = detectedFeatures.yoshiFormat; instrRef.ADDsynth_used = detectedFeatures.ADDsynth_used; instrRef.SUBsynth_used = detectedFeatures.SUBsynth_used; instrRef.PADsynth_used = detectedFeatures.PADsynth_used; bool type_by_extension{exten == EXTEN::yoshInst}; if (detectedFeatures.yoshiFormat != type_by_extension) logger("Warning: file.ext does not match actual data content format: \""+file_to_evaluate+"\""); return 0; } void Bank::deletefrombank(size_t rootID, size_t bankID, uint pos) { if (pos >= MAX_INSTRUMENTS_IN_BANK) { synth.getRuntime().Log("Error, deletefrombank pos " + asString(pos) + " > MAX_INSTRUMENTS_IN_BANK" + asString(MAX_INSTRUMENTS_IN_BANK)); return; } getInstrumentReference(rootID, bankID, pos).clear(); } InstrumentEntry& Bank::getInstrumentReference(size_t rootID, size_t bankID, size_t ninstrument) { return roots[rootID].banks[bankID].instruments [ninstrument]; } void Bank::updateShare(string bankdirs[], string baseDir, string shareID) { saveText(to_string(synth.getRuntime().build_ID), shareID); string next = "/Will_Godfrey_Companion"; string destinationDir = baseDir + "yoshimi/banks/Will_Godfrey_Companion"; // currently only concerned with this one. if (!isDirectory(destinationDir)) return; if (isDirectory(bankdirs[1] + next)) checkShare(bankdirs[1] + next, destinationDir); if (isDirectory(bankdirs[2] + next)) checkShare(bankdirs[2] + next, destinationDir); } void Bank::checkShare(string sourceDir, string destinationDir) { copyDir(sourceDir, destinationDir, 0); } bool Bank::transferDefaultDirs(string bankdirs[]) { if (!isDirectory(foundLocal)) return false; bool found = false; // always want these if (isDirectory(foundLocal + "yoshimi")) found = true; else { createDir(foundLocal + "yoshimi"); createDir(foundLocal + "yoshimi/banks"); if (isDirectory(bankdirs[6])) if (transferOneDir(bankdirs, 0, 6)) found = true; if (isDirectory(bankdirs[1]) || isDirectory(bankdirs[2])) { if (transferOneDir(bankdirs, 0, 1)) found = true; if (transferOneDir(bankdirs, 0, 2)) found = true; } } //might not have these if (isDirectory(foundLocal + "zynaddsubfx")) found = true; else { if (isDirectory(bankdirs[3]) || isDirectory(bankdirs[4])) { createDir(foundLocal + "zynaddsubfx"); createDir(foundLocal + "zynaddsubfx/banks"); if (transferOneDir(bankdirs, 5, 3)) found = true; if (transferOneDir(bankdirs, 5, 4)) found = true; } } return found; } bool Bank::transferOneDir(string bankdirs[], int baseNumber, int listNumber) { bool found = false; list thisBankDir; uint32_t copyList = listDir(& thisBankDir, bankdirs[listNumber]); if (copyList > 0 && copyList < 0xffffffff) { for (list::iterator it = thisBankDir.begin(); it != thisBankDir.end(); ++ it) { string oldBank = bankdirs[listNumber] + "/" + *it; string newBank = bankdirs[baseNumber] + "/" + *it; createDir(newBank); uint32_t inside = copyDir(oldBank, newBank, 1); if (inside > 0 && inside < 0xffffffff) found = true; } thisBankDir.clear(); } return found; } void Bank::checkLocalBanks() { if (isDirectory(foundLocal + "yoshimi/banks")) // yoshi addRootDir(foundLocal + "yoshimi/banks"); if (isDirectory(foundLocal + "zynaddsubfx/banks")) addRootDir(foundLocal + "zynaddsubfx/banks"); // zyn } void Bank::addDefaultRootDirs(string bankdirs[]) { int tot = 0; int i = 0; while (bankdirs[i] != "@end") { if (isDirectory(bankdirs[i])) { addRootDir(bankdirs [i]); ++tot; } ++ i; } for (int i = tot; i > 0; --i) changeRootID(i, i * 5); } size_t Bank::generateSingleRoot(string const& newRoot, bool clear) { createDir(newRoot); // add bank string newBank = newRoot + "newBank"; createDir(newBank); string toSave = newBank + "/" + EXTEN::validBank; saveText(string(YOSHIMI_VERSION), toSave); // now generate and save an instrument int npart = 0; string instrumentName = "First Instrument"; synth.interchange.generateSpecialInstrument(npart, instrumentName); string filename = newBank + "/" + "0005-" + instrumentName + EXTEN::zynInst; synth.part[npart]->saveXML(filename, false); // set root and tidy up size_t idx = addRootDir(newRoot); if (clear) synth.part[npart]->defaultsinstrument(); synth.maybePublishEffectsToGui(); return idx; } size_t Bank::getNewRootIndex() { size_t pos = 1; if (roots.empty()) return pos; while (roots.count(pos) != 0) ++ pos; return pos; } size_t Bank::getNewBankIndex(size_t rootID) { if (roots [rootID].banks.empty()) { if (roots [rootID].bankIdStep <= 1) { return 0; } return roots [rootID].bankIdStep; } size_t idStep = 1; if (roots [rootID].bankIdStep == 0) { size_t startId = 127; size_t i; for (i = startId; i > 0; --i) { if (roots [rootID].banks.count(i) == 0) { break; } } if (i > 0) //id found { return i; } } else { idStep = roots [rootID].bankIdStep; } return idStep; } string Bank::getBankPath(size_t rootID, size_t bankID) { if (roots.count(rootID) == 0 || roots [rootID].banks.count(bankID) == 0) { return string(""); } if (roots [rootID].path.empty()) { return string(""); } string chkdir = getRootPath(rootID) + string("/") + roots [rootID].banks [bankID].dirname; if (chkdir.at(chkdir.size() - 1) == '/') { chkdir = chkdir.substr(0, chkdir.size() - 1); } return chkdir; } string Bank::getRootPath(size_t rootID) { if (roots.count(rootID) == 0 || roots [rootID].path.empty()) return string(""); string chkdir = roots [rootID].path; if (chkdir.at(chkdir.size() - 1) == '/') chkdir = chkdir.substr(0, chkdir.size() - 1); return chkdir; } string Bank::getFullPath(size_t rootID, size_t bankID, size_t ninstrument) { string bankPath = getBankPath(rootID, bankID); if (!bankPath.empty()) { string instrFname = getInstrumentReference(rootID, bankID, ninstrument).filename; return bankPath + string("/") + instrFname; } return string(""); } const BankEntryMap &Bank::getBanks(size_t rootID) { return roots [rootID].banks; } const RootEntryMap &Bank::getRoots() { return roots; } const BankEntry &Bank::getBank(size_t bankID, size_t rootID) { if (rootID == UNUSED) rootID = synth.getRuntime().currentRoot; return roots[rootID].banks[bankID]; } int Bank::engines_used(size_t rootID, size_t bankID, uint ninstrument) { auto& info = getInstrumentReference(rootID, bankID, ninstrument); int flags = info.ADDsynth_used | (info.SUBsynth_used << 1) | (info.PADsynth_used << 2) | (info.yoshiFormat << 3); return flags; } bool Bank::removeRoot(size_t rootID) { if (rootID == synth.getRuntime().currentRoot) { synth.getRuntime().currentRoot = 0; } else if (roots [rootID].path.empty()) return true; roots.erase(rootID); synth.getRuntime().currentRoot = roots.begin()->first; setCurrentRootID(synth.getRuntime().currentRoot); return false; } bool Bank::changeRootID(size_t oldID, size_t newID) { RootEntry oldRoot = roots [oldID]; roots [oldID] = roots [newID]; roots [newID] = oldRoot; setCurrentRootID(newID); RootEntryMap::iterator it = roots.begin(); while (it != roots.end()) { if (it->second.path.empty()) roots.erase(it++); else ++it; } return true; } bool Bank::setCurrentRootID(size_t newRootID) { size_t oldRoot = synth.getRuntime().currentRoot; if (roots.count(newRootID) == 0) return false; else synth.getRuntime().currentRoot = newRootID; for (size_t id = 0; id < MAX_BANKS_IN_ROOT; ++id) { if (roots [newRootID].banks.count(id) == 0) { findFirstBank(newRootID); return true; } if (roots [newRootID].banks.count(id) == 1) { if (roots [newRootID].banks [id].dirname.empty()) { findFirstBank(newRootID); return true; } } } if (synth.getRuntime().currentRoot != oldRoot) findFirstBank(newRootID); return true; } uint Bank::findFirstBank(size_t newRootID) { for (size_t i = 0; i < MAX_BANKS_IN_ROOT; ++i) { if (roots [newRootID].banks.count(i) != 0) { if (!roots [newRootID].banks [i].dirname.empty()) { synth.getRuntime().currentBank = i; break; } } } return 0; } bool Bank::setCurrentBankID(size_t newBankID, bool ignoreMissing) { if (roots [synth.getRuntime().currentRoot].banks.count(newBankID) == 0) { if (ignoreMissing) return false; else newBankID = roots [synth.getRuntime().currentRoot].banks.begin()->first; } synth.getRuntime().currentBank = newBankID; return true; } size_t Bank::addRootDir(string const& newRootDir) { // we need the size check to prevent weird behaviour if the name is just ./ if (!isDirectory(newRootDir) || newRootDir.length() < 4) return 0; size_t newIndex = getNewRootIndex(); roots [newIndex].path = newRootDir; return newIndex; } bool Bank::establishBanks(optional bankFile) { /* * This list is used in transferDefaultDirs( to find and copy * bank lists into $HOME/.local.yoshimi * This is refreshed at each startup to update existing entries * or add new ones. * * It is also used by addDefaultRootDirs( to populate the bank * roots, in the event of a missing list. * * The list is in the order the roots will appear to the user, * and the numbering in addDefaultRootDirs is the same. */ string bankdirs[] = { foundLocal + "yoshimi/banks", "/usr/share/yoshimi/banks", "/usr/local/share/yoshimi/banks", "/usr/share/zynaddsubfx/banks", "/usr/local/share/zynaddsubfx/banks", foundLocal + "zynaddsubfx/banks", extendLocalPath("/banks"), "@end" }; bool rootsFound = transferDefaultDirs(bankdirs); bool newRoots = true; roots.clear(); if (bankFile) { XMLStore xml{*bankFile, synth.getRuntime().getLogger()}; if (xml) { if (XMLtree xmlInfo = xml.getElm("INFORMATION")) version = xmlInfo.getPar_int("Banks_Version", 0, 0, 999); // mark with the stored version to force migration -- see installNewRoot() if (XMLtree xmlBankList = xml.getElm("BANKLIST")) { loadFromConfigFile(xmlBankList); newRoots = false; } } } if (newRoots) { roots.clear(); if (rootsFound) addDefaultRootDirs(bankdirs); else { string newRoot = foundLocal + "yoshimi/banks"; size_t idx = generateSingleRoot(newRoot); changeRootID(idx, 5); synth.getRuntime().currentRoot = idx; synth.getRuntime().currentBank = 5; } synth.getRuntime().currentRoot = 5; synth.getRuntime().banksChecked = true; } if (!synth.getRuntime().rootDefine.empty()) { string found = synth.getRuntime().rootDefine; synth.getRuntime().rootDefine = ""; } installRoots(); if (isDirectory(foundLocal)) { string shareID = foundLocal + "version"; if (loadText(shareID) != to_string(synth.getRuntime().build_ID)) updateShare(bankdirs, foundLocal, shareID); } return newRoots; } bool Bank::installRoots() { RootEntryMap::const_iterator it; for (it = roots.begin(); it != roots.end(); ++it) { size_t rootID = it->first; string rootdir = roots [rootID].path; // the directory has been removed since the bank root was created if (!rootdir.size() || !isDirectory(rootdir)) continue; installNewRoot(rootID, rootdir, true); } return true; } bool Bank::installNewRoot(size_t rootID, string rootdir, bool reload) { list thisRoot; uint32_t found = listDir(&thisRoot, rootdir); if (found == 0xffffffff) { // should never see this! synth.getRuntime().Log("No such directory, root bank entry " + rootdir); return false; } if (rootdir.at(rootdir.size() - 1) != '/') rootdir += '/'; // it's a completely new root if (!reload) roots [rootID].banks.clear(); map bankDirsMap; // thin out invalid directories int validBanks = 0; list::iterator r_it = thisRoot.end(); while (r_it != thisRoot.begin()) { string candidate = *--r_it; string chkdir = rootdir + candidate; if (isValidBank(chkdir)) ++validBanks; else r_it = thisRoot.erase(r_it); } bool result = true; if (validBanks >= MAX_BANKS_IN_ROOT) synth.getRuntime().Log("Warning: There are " + to_string(validBanks - MAX_BANKS_IN_ROOT) + " too many valid bank candidates"); bool banksSet[MAX_BANKS_IN_ROOT]; int banksFound = 0; for (int i = 0; i < MAX_BANKS_IN_ROOT; ++i) banksSet[i] = false; // install previously seen banks to the same references if (reload) { list::iterator b_it = thisRoot.end(); while (b_it != thisRoot.begin()) { string trybank = *--b_it; for (size_t id = 0; id < MAX_BANKS_IN_ROOT; ++id) { if (roots [rootID].banks.count(id) == 0) continue; if (roots[rootID].banks[id].dirname == trybank) { banksSet[id] = true; if (version == BANKS_VERSION) // all we need to do! { checkbank(rootID, id); instrumentsInBanks += getBankSize(id, rootID); } else { roots [rootID].banks [id].dirname = trybank; loadbank(rootID, id); } b_it = thisRoot.erase(b_it); ++banksFound; break; } } if (banksFound >= MAX_BANKS_IN_ROOT) { result = false; break; } } } banksInRoots += banksFound; size_t toFetch = thisRoot.size(); if (toFetch > 0) { synth.getRuntime().Log("Found " + to_string(toFetch) + " new banks in root " + roots [rootID].path); } if (thisRoot.size() != 0) { /* * install completely new banks * * This sequence spreads new banks as evenly as possible * through the root, avoiding collisions with possible * existing banks, and at the same time ensuring that * ID zero is the last possible entry. */ size_t idStep = 5; size_t newIndex = idStep; // try to keep new banks in a sensible order thisRoot.sort(); for (list::iterator it = thisRoot.begin(); it != thisRoot.end(); ++it) { if (banksFound >= MAX_BANKS_IN_ROOT) { result = false; break; // root is full! } while (banksSet[newIndex] == true) { newIndex += idStep; newIndex &= (MAX_BANKS_IN_ROOT - 1); } roots [rootID].banks [newIndex].dirname = *it; loadbank(rootID, newIndex); banksSet[newIndex] = true; ++ banksFound; banksInRoots += 1; // this is the total of all banks } } // remove orphans for (size_t id = 0; id < MAX_BANKS_IN_ROOT; ++id) { if (roots [rootID].banks.count(id) == 1) { if (roots [rootID].banks [id].dirname.empty()) { roots [rootID].banks.erase(id); } else if (!banksSet[id]) { synth.getRuntime().Log("Removed orphan bank " +to_string(id) + " in root " + to_string(rootID) + " " + roots [rootID].banks [id].dirname); roots [rootID].banks.erase(id); } } } if (thisRoot.size()) thisRoot.clear(); // leave it tidy return result; } void Bank::saveToConfigFile(XMLtree& xmlBankList) { version = BANKS_VERSION; // mark with current format for (size_t i = 0; i < MAX_BANK_ROOT_DIRS; i++) { if (roots.count(i) > 0 and not roots[i].path.empty()) { XMLtree xmlBankroot = xmlBankList.addElm("BANKROOT", i); xmlBankroot.addPar_str("bank_root", roots[i].path); for (auto& [bankID, bank] : roots[i].banks) { XMLtree xmlBank = xmlBankroot.addElm("bank_id", bankID); xmlBank.addPar_str("dirname", bank.dirname); for (size_t pos=0; pos < MAX_INSTRUMENTS_IN_BANK; ++pos) { if (bank.instruments[pos].used) { XMLtree xmlInst = xmlBank.addElm("instrument_id", pos); xmlInst.addPar_bool("isUsed" , bank.instruments[pos].used); xmlInst.addPar_str ("listname", bank.instruments[pos].name); xmlInst.addPar_str ("filename", bank.instruments[pos].filename); xmlInst.addPar_int ("type" , bank.instruments[pos].instType); xmlInst.addPar_bool("ADDsynth", bank.instruments[pos].ADDsynth_used); xmlInst.addPar_bool("SUBsynth", bank.instruments[pos].SUBsynth_used); xmlInst.addPar_bool("PADsynth", bank.instruments[pos].PADsynth_used); xmlInst.addPar_bool("Yoshimi" , bank.instruments[pos].yoshiFormat); } } } } } } void Bank::loadFromConfigFile(XMLtree& xmlBankList) { for (size_t i = 0; i < MAX_BANK_ROOT_DIRS; ++i) { if (XMLtree xmlBankroot = xmlBankList.getElm("BANKROOT", i)) { string dir = xmlBankroot.getPar_str("bank_root"); if (not dir.empty()) { size_t newIndex = addRootDir(dir); if (newIndex != i) { changeRootID(newIndex, i); } for (size_t bankID = 0; bankID < MAX_INSTRUMENTS_IN_BANK; bankID++) { if (XMLtree xmlBank = xmlBankroot.getElm("bank_id", bankID)) { string bankDirname = xmlBank.getPar_str("dirname"); roots[i].banks[bankID].dirname = bankDirname; BankEntry& bank = roots[i].banks[bankID]; for (size_t pos=0; pos < MAX_INSTRUMENTS_IN_BANK; ++pos) { if (XMLtree xmlInst = xmlBank.getElm("instrument_id", pos)) { bank.instruments[pos].used = xmlInst.getPar_bool("isUsed" , false); bank.instruments[pos].name = xmlInst.getPar_str ("listname"); bank.instruments[pos].filename = xmlInst.getPar_str ("filename"); bank.instruments[pos].instType = xmlInst.getPar_int ("type" , 0 ,-50,100); bank.instruments[pos].ADDsynth_used = xmlInst.getPar_bool("ADDsynth", false); bank.instruments[pos].SUBsynth_used = xmlInst.getPar_bool("SUBsynth", false); bank.instruments[pos].PADsynth_used = xmlInst.getPar_bool("PADsynth", false); bank.instruments[pos].yoshiFormat = xmlInst.getPar_bool("Yoshimi" , false); } } } } } } } } yoshimi-2.3.5.1/src/Misc/Bank.h000066400000000000000000000154161506652756400160760ustar00rootroot00000000000000/* Bank.h - Instrument Bank Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2014-2021 Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #ifndef BANK_H #define BANK_H #include "Misc/Part.h" #include "Misc/FormatFuncs.h" #include #include #include using std::string; /** Entry for one instrument in a bank, * with instrument metadata. */ struct InstrumentEntry { string name; string filename; bool used; int instType; bool yoshiFormat; bool ADDsynth_used; bool SUBsynth_used; bool PADsynth_used; InstrumentEntry() : name{} , filename{} , used{false} , instType{-1} , yoshiFormat{false} , ADDsynth_used{false} , SUBsynth_used{false} , PADsynth_used{false} { } void clear() { used = false; name.clear(); filename.clear(); PADsynth_used = false; ADDsynth_used = false; SUBsynth_used = false; yoshiFormat = false; } }; /** Maps instrument id to instrument entry. */ using InstrumentEntryMap = std::map ; /** Describes a Bank * - directory name * - instrument map for this directory */ struct BankEntry { string dirname; InstrumentEntryMap instruments; }; /** Maps bank id to bank entry. */ using BankEntryMap = std::map; /** Contains the root path and the bank map of the root. */ struct RootEntry { string path; size_t bankIdStep; BankEntryMap banks; RootEntry() : path{} , bankIdStep{1} , banks{} { } }; /** Maps root id to root entry. */ using RootEntryMap = std::map; class SynthEngine; class XMLtree; class Bank { friend class SynthEngine; public: Bank(SynthEngine&); // shall not be copied nor moved Bank(Bank&&) = delete; Bank(Bank const&) = delete; Bank& operator=(Bank&&) = delete; Bank& operator=(Bank const&) = delete; int getType(uint ninstrument, size_t bank, size_t root); string getname(uint ninstrument, size_t bank, size_t root); string getnamenumbered(uint ninstrument, size_t bank, size_t root); int setInstrumentName(string const& name, int slot, size_t bank, size_t root); bool moveInstrument(uint ninstrument, string const& newname, int newslot, size_t oldBank, size_t newBank, size_t oldRoot, size_t newRoot); int engines_used(size_t rootID, size_t bankID, uint ninstrument); bool emptyslot(size_t rootID, size_t bankID, uint ninstrument); string clearslot(uint ninstrument, size_t rootID, size_t bankID); bool savetoslot(size_t rootID, size_t bankID, int ninstrument, int npart); string swapslot(uint n1, uint n2, size_t bank1, size_t bank2, size_t root1, size_t root2); string swapbanks(uint firstID, uint secondID, size_t firstRoot, size_t secondRoot); string getBankName(int bankID, size_t rootID); bool isDuplicateBankName(size_t rootID, string const& name); int getBankSize(int bankID, size_t rootID); int changeBankName(size_t rootID, size_t bankID, string const& newName); void checkbank(size_t rootID, size_t banknum); bool loadbank(size_t rootID, size_t banknum); string exportBank(string const& exportdir, size_t rootID, uint bankID); string importBank(string importdir, size_t rootID, uint bankID); bool isDuplicate(size_t rootID, size_t bankID, int pos, string filename); bool newIDbank(string const& newbankdir, uint bankID, size_t rootID = 0xff); bool newbankfile(string const& newbankdir, size_t rootID); string removebank(uint bankID, size_t rootID = 0xff); bool removeRoot(size_t rootID); bool changeRootID(size_t oldID, size_t newID); bool setCurrentRootID(size_t newRootID); uint findFirstBank(size_t newRootID); bool setCurrentBankID(size_t newBankID, bool ignoreMissing = true); size_t addRootDir(string const& newRootDir); bool establishBanks(std::optional bankFile); bool installRoots(); bool installNewRoot(size_t rootID, string rootdir, bool reload = false); void saveToConfigFile(XMLtree&); void loadFromConfigFile(XMLtree&); string getBankPath(size_t rootID, size_t bankID); string getRootPath(size_t rootID); string getFullPath(size_t rootID, size_t bankID, size_t ninstrument); const BankEntryMap& getBanks(size_t rootID); const RootEntryMap& getRoots(); const BankEntry& getBank(size_t bankID, size_t rootID = UNUSED); string getBankFileTitle(size_t root, size_t bank); string getRootFileTitle(size_t root); void checkLocalBanks(); size_t generateSingleRoot(string const& newRoot, bool clear = true); uint getVersion() {return version; } private: uint version; uint banksInRoots; uint instrumentsInBanks; const string defaultInsName; string foundLocal; RootEntryMap roots; SynthEngine& synth; bool addtobank(size_t rootID, size_t bankID, int pos, const string filename, const string name); void deletefrombank(size_t rootID, size_t bankID, uint pos); bool isOccupiedRoot(string rootCandidate); bool isValidBank(string chkdir); InstrumentEntry& getInstrumentReference(size_t rootID, size_t bankID, size_t ninstrument); void updateShare(string bankdirs[], string baseDir, string shareID); void checkShare(string sourceDir, string destinationDir); bool transferDefaultDirs(string bankdirs[]); bool transferOneDir(string bankdirs[], int baseNumber, int listNumber); void addDefaultRootDirs(string bankdirs[]); size_t getNewRootIndex(); size_t getNewBankIndex(size_t rootID); }; #endif /*BANK_H*/ yoshimi-2.3.5.1/src/Misc/BuildScheduler.cpp000066400000000000000000000116351506652756400204530ustar00rootroot00000000000000/* BuildScheduler.cpp - implementation details of background wavetable building Copyright 2021, Ichthyostega. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include "Misc/BuildScheduler.h" #include #include #include #include namespace { // Implementation details of scheduling... /* »dirty wait delay« : when further rebuilds are requested while * a background build process is underway, an additional grace period * is added to allow for more changes to trickle in and avoid overloading * the system with lots of rescheduling tasks. */ constexpr auto RESCHEDULE_DELAY = std::chrono::milliseconds(50); /* number of threads to keep free as headroom for the Synth */ const size_t REQUIRED_HEADROOM = 2; /* factor to overload the nominally available CPUs */ const double OVERPROVISIONING = 1.5; size_t determineUsableBackgroundConcurrency() { size_t cpuCount = std::thread::hardware_concurrency(); int free = cpuCount * OVERPROVISIONING - REQUIRED_HEADROOM; return std::max(free, 1); } class TaskRunnerImpl { std::mutex mtx; using Guard = const std::lock_guard; using Task = task::RunnerBackend::Task; std::queue waitingTasks{}; static const size_t THREAD_LIMIT; size_t runningThreads = 0; public: /* Meyer's Singleton */ static TaskRunnerImpl& access() { static TaskRunnerImpl instance{}; return instance; } /* Implementation of scheduling into background thread: * pass the work task through a queue and start up to * THREAD_LIMIT workers to consume those work tasks. */ void schedule(Task&& task) { Guard lock(mtx); waitingTasks.push(move(task)); if (runningThreads < THREAD_LIMIT) launchWorker(); }; void reschedule(Task&& task) { Task delayedTask{ [workOp = move(task)] () -> void {// this code runs within a worker thread std::this_thread::sleep_for(RESCHEDULE_DELAY); workOp(); }}; schedule(move(delayedTask)); } private: void markWorker_finished() { Guard lock(mtx); if (runningThreads == 0) throw std::logic_error("BuildScheduler: worker thread management floundered"); --runningThreads; } void launchWorker() { // note: mutex locked at caller std::thread backgroundThread( [this] () -> void {// worker thread(s): consume queue contents while (Task workOp = pullFromQueue()) try { workOp(); } catch(...) {/* absorb failure in workOp */} markWorker_finished(); }); backgroundThread.detach(); assert(runningThreads < THREAD_LIMIT); ++runningThreads; } Task pullFromQueue() { Guard lock(mtx); if (waitingTasks.empty()) return Task(); // empty Task to signal end Task nextWorkOp(move(waitingTasks.front())); waitingTasks.pop(); return nextWorkOp; } }; const size_t TaskRunnerImpl::THREAD_LIMIT = determineUsableBackgroundConcurrency(); }//(End)Implementation details of scheduling. namespace task { /* === Implementation of access to the task runner === */ void RunnerBackend::schedule(Task&& task) { TaskRunnerImpl::access().schedule(move(task)); } void RunnerBackend::reschedule(Task&& task) { TaskRunnerImpl::access().reschedule(move(task)); } void dirty_wait_delay() { std::this_thread::sleep_for(RESCHEDULE_DELAY); } } yoshimi-2.3.5.1/src/Misc/BuildScheduler.h000066400000000000000000000402501506652756400201130ustar00rootroot00000000000000/* BuildScheduler.h - running wavetable building tasks in background Copyright 2021, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef BUILDSCHEDULER_H #define BUILDSCHEDULER_H #include #include #include #include #include #include #include using std::move; using std::optional; /* Workaround for a long-standing problem in C++ : std::function binding move-only values. * This problem notoriously appears when dealing with std::promise in "Task"-Functions. * The official solution is proposed for C++23 (std::move_only_function). * * Explanation: std::function requires its target to be /copyable/; whenever we bind some * target functor (e.g. a Lambda function) into a std::function capsule, the code for a * copy constructor will be generated (even if this code is never used), leading to * compilation failure, whenever the lambda captures a move-only type. * * This adapter encapsulates and forwards to the embedded type, but provides a "fake" * copy constructor. The intention is to never actually use that copy-ctor, and as a * safety feature, the implementation will terminate the program when invoked. */ template class FakeCopyAdapter { using Payload = std::decay_t; Payload payload; static Payload&& must_not_be_called() { assert(not "Copy constructor must not be invoked"); std::terminate(); } public: template FakeCopyAdapter(X&& initialiser) : payload(std::forward(initialiser)) { } operator Payload& () { return payload; } Payload& operator* () { return payload; } Payload* operator->() { return &payload;} operator Payload const& () const { return payload; } Payload const& operator*() const { return payload; } Payload const* operator->()const { return &payload;} FakeCopyAdapter() = default; FakeCopyAdapter(FakeCopyAdapter &&) = default; FakeCopyAdapter& operator=(FakeCopyAdapter&&) = default; FakeCopyAdapter& operator=(FakeCopyAdapter const&) = delete; FakeCopyAdapter(FakeCopyAdapter const&) noexcept : FakeCopyAdapter{must_not_be_called()} { } }; /* Thread-safe optional link to a data value under construction. * The data value (template Parameter TAB) is expected to be produced * by a function running in some background thread or task scheduler. * FutureBuild is the front-end to be used by Synth code to deal with * such a value, and manage re-building of that value on demand. * * Usage Rules * - On construction, actual Scheduler implementation must be supplied (as Lambda) * - Whenever a new Data element must be built, invoke requestNewBuild() (idempotent function) * - Test if a build is underway with the bool conversion (or isUnderway()) * - Test if the new value is ready and can be retrieved without blocking: isReady() * - Blocking wait for the value to become ready: call blockingWait(); * - Retrieve the value and reset all state atomically: swap(existingTab) * * Remark: while this class was designed for use by PADSynth, in fact * there is no direct dependency; it is sufficient that there is some * background operation function, which returns a (movable) TAB value. * Likewise, there is no direct dependency to the actual scheduler. */ template class FutureBuild { // Type abbreviations using FutureVal = std::future; using ResultVal = std::optional; using BuildOp = std::function; /* the managed data value under construction */ std::atomic target{nullptr}; /* request new build and abort existing one */ std::atomic dirty{false}; //--Customisation--- using ScheduleAction = std::function; using SchedulerSetup = std::function; ScheduleAction schedule; public: ~FutureBuild(); FutureBuild(SchedulerSetup setupScheduler, BuildOp backgroundAction) : schedule{setupScheduler(wireState(backgroundAction))} { } // shall not be copied or moved or assigned FutureBuild(FutureBuild&&) = delete; FutureBuild(FutureBuild const&) = delete; FutureBuild& operator=(FutureBuild&&) = delete; FutureBuild& operator=(FutureBuild const&) = delete; // state information functions bool shallRebuild() const; bool isUnderway() const; bool isReady() const; explicit operator bool() const { return isUnderway(); } // mutating operations void requestNewBuild(); void swap(TAB & dataToReplace); void blockingWait(bool publishResult =false); private: BuildOp wireState(BuildOp); FutureVal* retrieveLatestTarget(); bool installNewBuildTarget(FutureVal*); }; namespace task { /* Access point to a global generic task runner backend */ class RunnerBackend { public: using Task = std::function; static void schedule(Task&&); static void reschedule(Task&&); }; /* Add a fixed sleep period; related to the duration of a "dirty wait". * The latter is imposed when new parameter changes invalidate an ongoing * build, since typically further subsequent changes will arrive from GUI. */ void dirty_wait_delay(); /* Global facility to manage building actions as background task. * When constructing a concrete FutureBuild instance, this front-end shall be used * to wire the actual BuildOperation and turn it into a simple function to be scheduled. */ template class BuildScheduler { // Type abbreviations using FutureVal = std::future; using Promise = std::promise; using OptionalResult = optional; using BuildOperation = std::function; using ScheduleAction = std::function; private: struct PackagedBuildOperation { BuildOperation buildOp; FakeCopyAdapter promise; void operator() () {// This code will run within the scheduler/task try { OptionalResult result = buildOp(); if (result) { // Computation successful; push result into connected future promise->set_value(move(*result)); return; } } catch(...) { std::exception_ptr failure = std::current_exception(); promise->set_exception(failure); return; } // computation was marked as /aborted/ // Thus use the exiting functor and promise // to package them into a new task for rescheduling... RunnerBackend::Task followUpTask = PackagedBuildOperation{move(buildOp), move(*promise)}; RunnerBackend::reschedule(move(followUpTask)); } }; public: static ScheduleAction wireBuildFunction(BuildOperation buildOp) { return [buildOp]() {// This code will run whenever the FutureBuild wants to schedule another BuildOperation... Promise promise; FutureVal future = promise.get_future(); // pass BuildOperation to the Task-Runner backend, packaged as generic functor... RunnerBackend::schedule(PackagedBuildOperation{move(buildOp), move(promise)}); // hand-over the corresponding future to FutureBuild return future; }; } }; }//(End)namespace task /* === Implementation of FutureBuild API functions === */ /* Thread safe evaluation: was a new build / abort requested? */ template bool FutureBuild::shallRebuild() const { return dirty.load(std::memory_order_relaxed); } /* thread safe evaluation: do we currently have an active build task scheduled? */ template bool FutureBuild::isUnderway() const { // changed curly braces below to normal ones to suppress warnings (was this intended?) - Will //return bool{target.load(std::memory_order_consume)} return bool(target.load(std::memory_order_consume)) or shallRebuild(); } /* Thread safe evaluation: is there a new build result ready to be picked up, without blocking? * Note: technically, if the value is not ready yet, the current thread might be blocked and * rescheduled immediately. There is no guaranteed wait-free status check for futures. */ template bool FutureBuild::isReady() const { FutureVal* future = target.load(std::memory_order_acquire); return future and future->wait_for(std::chrono::microseconds(0)) == std::future_status::ready; } /* Internal helper: Link the backgroundAction with the internal state management. * On construction, a function to schedule background actions is passed as extension point. * This scheduler call will be setup such as to invoke the (likewise customisable) background * action, and to control and manage this background scheduling is the purpose of this class. * The thread safe internal state management however requires that the backgroundAction itself * flips the "dirty" flag in a thread-safe way whenever it starts -- which can be linked in by * wrapping the action with this helper function, thereby keeping the flag an internal detail. */ template typename FutureBuild::BuildOp FutureBuild::wireState(BuildOp backgroundAction) { return [this, buildOp = move(backgroundAction)] () -> ResultVal {// This code will run scheduled into a background thread... bool expectTrue{true}; if (not dirty.compare_exchange_strong(expectTrue, false, std::memory_order_acq_rel)) throw std::logic_error("FutureBuild state handling logic broken: dirty flag was false. " "Before a background task starts, the 'dirty' flag must be set " "and will be cleared synchronised with the start of the task."); // invoke background action... return buildOp(); }; } /* Thread-safe idempotent operation: cause a new build to be launched; * possibly terminate an existing build beforehand (by setting "dirty"). * Note: setting dirty with compare-and-swap establishes a fence, which * only one thread can pass, and thus no one can set the target pointer, * after we have loaded and found it to be NULL. */ template void FutureBuild::requestNewBuild() { bool expectFalse{false}; if (not dirty.compare_exchange_strong(expectFalse, true, std::memory_order_acq_rel)) return; // just walk away since dirty flag was set already... if (target.load(std::memory_order_acquire)) return; // already running background task will see the dirty flag, // then abort and restart itself and clear the flag // If we reach this point, we are the first ones to set the dirty flag // and we can be sure there is currently no background task underway... // Launch a new background task, which on start clears the dirty flag. if (not installNewBuildTarget(new FutureVal{move(schedule())})) throw std::logic_error("FutureBuild state handling logic broken: " "concurrent attempt to start a build, causing data corruption."); } /* internal helper: atomically install a new future to represent an ongoing build. * Returns false if no new future could be installed because there was an existing one. */ template bool FutureBuild::installNewBuildTarget(FutureVal* newBuild) { FutureVal* expectedState = nullptr; return target.compare_exchange_strong(expectedState, newBuild ,std::memory_order_release); } /* internal helper: get the latest version of the future and atomically empty the pointer. * Implemented by looping until we're able to fetch a stable pointer value and swap the * pointer to NULL. Guarantees * - if the returned pointer is NULL, target /was already NULL/ * - if the returned pointer is non-NULL, no one else can/could fetch it, and target is NULL now. */ template typename FutureBuild::FutureVal* FutureBuild::retrieveLatestTarget() { FutureVal* future = target.load(std::memory_order_acquire); while (future and not target.compare_exchange_strong(future, nullptr, std::memory_order_acq_rel)) { } // loop until we got the latest pointee and could atomically set the pointer to NULL return future; } /* Thread-safe mutator: pick up the result and exchange it with the old value. * Reset state and discard old value then. Blocks if result is not yet ready. * WARNING: FutureBuild::swap() must not be called concurrently, otherwise * the whole state handling logic can break, causing multiple builds * to be triggered at the same time and other horrible races. */ template void FutureBuild::swap(TAB & dataToReplace) { FutureVal* future = retrieveLatestTarget(); bool needReschedule = shallRebuild(); if (future) { using std::swap; TAB newData{future->get()}; // may block until value is ready swap(dataToReplace, newData); delete future; } // we do not know if the "dirty" state was set before we picked up the future, // or afterwards. In the latter case, a new build could already be underway, // but it is impossible to detect that from here without a race. Fortunately, // this discrepancy can be "absorbed" by just calling requestNewBuild(), // since there a new build will be started only when necessary and atomically. if (needReschedule and not target.load(std::memory_order_relaxed)) { // temporarily clear "dirty" flag to allow us to get into requestNewBuild(); // the fence when setting "dirty", followed by target.load() ensures atomicity. dirty.store(false, std::memory_order_release); requestNewBuild(); } } template void FutureBuild::blockingWait(bool publishResult) { // possibly wait until the actual background task was started while (dirty.load(std::memory_order_relaxed) and not target.load(std::memory_order_relaxed)) task::dirty_wait_delay(); FutureVal* future = retrieveLatestTarget(); if (future) { future->wait(); // blocks until result is ready // we alone hold the result now; attempt to publish it for the SynthEngine if (not publishResult or not installNewBuildTarget(future)) delete future; // obsolete since other background build was triggered since our wait } } template FutureBuild::~FutureBuild() { FutureVal* future = retrieveLatestTarget(); if (future and future->valid()) {// indicates active background task (result not yet reaped) future->wait(); // blocking wait until background task has finished delete future; } } #endif /*BUILDSCHEDULER_H*/ yoshimi-2.3.5.1/src/Misc/CliFuncs.h000066400000000000000000000304051506652756400167240ustar00rootroot00000000000000/* CliFuncs.h Copyright 2019, Will Godfrey. Copyright 2021, Rainer Hans Liffers This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef CLIFUNCS_H #define CLIFUNCS_H #include #include #include #include #include #include "CLI/Parser.h" #include "Interface/TextLists.h" #include "Misc/SynthEngine.h" #include "Misc/TextMsgBuffer.h" #include "Misc/NumericFuncs.h" #include "Misc/FormatFuncs.h" namespace cli { using func::bitTest; using func::bitFindHigh; using func::asString; using std::string; inline int contextToEngines(int context) { int engine = UNUSED; if (bitTest(context, LEVEL::SubSynth)) engine = PART::engine::subSynth; else if (bitTest(context, LEVEL::PadSynth)) engine = PART::engine::padSynth; else if (bitTest(context, LEVEL::AddMod)) engine = PART::engine::addMod1; else if (bitTest(context, LEVEL::AddVoice)) engine = PART::engine::addVoice1; else if (bitTest(context, LEVEL::AddSynth)) engine = PART::engine::addSynth; return engine; } inline float readControl(SynthEngine *synth, unsigned char action, unsigned char control, unsigned char part, unsigned char kit = UNUSED, unsigned char engine = UNUSED, unsigned char insert = UNUSED, unsigned char parameter = UNUSED, unsigned char offset = UNUSED, unsigned char miscmsg = NO_MSG) { CommandBlock putData; putData.data.value = 0; putData.data.type = 0; putData.data.source = action; putData.data.control = control; putData.data.part = part; putData.data.kit = kit; putData.data.engine = engine; putData.data.insert = insert; putData.data.parameter = parameter; putData.data.offset = offset; putData.data.miscmsg = miscmsg; return synth->interchange.readAllData(putData); } inline string readControlText(SynthEngine *synth, unsigned char action, unsigned char control, unsigned char part, unsigned char kit = UNUSED, unsigned char engine = UNUSED, unsigned char insert = UNUSED, unsigned char parameter = UNUSED, unsigned char offset = UNUSED) { float value; CommandBlock putData; putData.data.value = 0; putData.data.type = 0; putData.data.source = action; putData.data.control = control; putData.data.part = part; putData.data.kit = kit; putData.data.engine = engine; putData.data.insert = insert; putData.data.parameter = parameter; putData.data.offset = offset; putData.data.miscmsg = UNUSED; value = synth->interchange.readAllData(putData); return TextMsgBuffer::instance().fetch(value); } inline void readLimits(SynthEngine *synth, float value, unsigned char type, unsigned char control, unsigned char part, unsigned char kit, unsigned char engine, unsigned char insert, unsigned char parameter, unsigned char miscmsg) { CommandBlock putData; putData.data.value = value; putData.data.type = type; putData.data.control = control; putData.data.part = part; putData.data.kit = kit; putData.data.engine = engine; putData.data.insert = insert; putData.data.parameter = parameter; putData.data.miscmsg = miscmsg; value = synth->interchange.readAllData(putData); string name; switch (type & 3) { case TOPLEVEL::type::Minimum: name = "Min "; break; case TOPLEVEL::type::Maximum: name = "Max "; break; default: name = "Default "; break; } type = putData.data.type; if ((type & TOPLEVEL::type::Integer) == 0) name += std::to_string(value); else if (value < 0) name += std::to_string(int(value - 0.5f)); else name += std::to_string(int(value + 0.5f)); if (type & TOPLEVEL::type::Error) name += " - error"; else if (type & TOPLEVEL::type::Learnable) name += " - learnable"; synth->getRuntime().Log(name); } inline int sendNormal(SynthEngine *synth, unsigned char action, float value, unsigned char type, unsigned char control, unsigned char part, unsigned char kit = UNUSED, unsigned char engine = UNUSED, unsigned char insert = UNUSED, unsigned char parameter = UNUSED, unsigned char offset = UNUSED, unsigned char miscmsg = NO_MSG) { if ((type & TOPLEVEL::type::Limits) && part != TOPLEVEL::section::midiLearn) { readLimits(synth, value, type, control, part, kit, engine, insert, parameter, miscmsg); return REPLY::done_msg; } action |= TOPLEVEL::action::fromCLI; CommandBlock putData; putData.data.value = value; putData.data.type = type; putData.data.control = control; putData.data.part = part; putData.data.kit = kit; putData.data.engine = engine; putData.data.insert = insert; putData.data.parameter = parameter; putData.data.offset = offset; putData.data.miscmsg = miscmsg; /* * MIDI learn settings are synced by the audio thread * but not passed on to any of the normal controls. * The type field is used for a different purpose. */ if (part != TOPLEVEL::section::midiLearn) { putData.data.type |= TOPLEVEL::type::Limits; float newValue = synth->interchange.readAllData(putData); // adjust within limits type |= (putData.data.type & TOPLEVEL::type::Integer); // so everyone knows if it is! if (type & TOPLEVEL::type::LearnRequest) { if ((putData.data.type & TOPLEVEL::type::Learnable) == 0) { synth->getRuntime().Log("Can't learn this control"); return REPLY::failed_msg; } } else { if (putData.data.type & TOPLEVEL::type::Error) return REPLY::available_msg; if (newValue != value && (type & TOPLEVEL::type::Write)) { // checking the original type not the reported one putData.data.value = newValue; synth->getRuntime().Log("Range adjusted"); } } action |= TOPLEVEL::action::fromCLI; } putData.data.source = action; putData.data.type = type; if (synth->interchange.fromCLI.write(putData.bytes)) { synth->getRuntime().finishedCLI = false; } else { synth->getRuntime().Log("Unable to write to fromCLI buffer"); return REPLY::failed_msg; } return REPLY::done_msg; } inline int sendDirect(SynthEngine *synth, unsigned char action, float value, unsigned char type, unsigned char control, unsigned char part, unsigned char kit = UNUSED, unsigned char engine = UNUSED, unsigned char insert = UNUSED, unsigned char parameter = UNUSED, unsigned char offset = UNUSED, unsigned char miscmsg = NO_MSG, unsigned char spare1 = UNUSED, unsigned char spare0 = UNUSED, unsigned char request = UNUSED) { if (action == TOPLEVEL::action::fromMIDI && part != TOPLEVEL::section::midiLearn) request = type & TOPLEVEL::type::Default; CommandBlock putData; putData.data.value = value; putData.data.control = control; putData.data.part = part; putData.data.kit = kit; putData.data.engine = engine; putData.data.insert = insert; putData.data.parameter = parameter; putData.data.offset = offset; putData.data.miscmsg = miscmsg; putData.data.spare1 = spare1; putData.data.spare0 = spare0; if (type == TOPLEVEL::type::Default) { putData.data.type = TOPLEVEL::type::Limits; synth->interchange.readAllData(putData); if ((putData.data.type & TOPLEVEL::type::Learnable) == 0) { synth->getRuntime().Log("Can't learn this control"); return 0; } } if (part != TOPLEVEL::section::midiLearn) action |= TOPLEVEL::action::fromCLI; /* * MIDI learn is synced by the audio thread but * not passed on to any of the normal controls. * The type field is used for a different purpose. */ putData.data.source = action | TOPLEVEL::action::fromCLI; putData.data.type = type; if (request < TOPLEVEL::type::Limits) { putData.data.type = request | TOPLEVEL::type::Limits; value = synth->interchange.readAllData(putData); string name; switch (request) { case TOPLEVEL::type::Minimum: name = "Min "; break; case TOPLEVEL::type::Maximum: name = "Max "; break; default: name = "Default "; break; } type = putData.data.type; if ((type & TOPLEVEL::type::Integer) == 0) name += std::to_string(value); else if (value < 0) name += std::to_string(int(value - 0.5f)); else name += std::to_string(int(value + 0.5f)); if (type & TOPLEVEL::type::Error) name += " - error"; else if (type & TOPLEVEL::type::Learnable) name += " - learnable"; synth->getRuntime().Log(name); return 0; } if (part == TOPLEVEL::section::main && (type & TOPLEVEL::type::Write) == 0 && control >= MAIN::control::readPartPeak && control <= MAIN::control::readMainLRrms) { string name; switch (control) { case MAIN::control::readPartPeak: name = "part " + std::to_string(int(kit)); if (engine == 0) name += "L "; else name += "R "; name += "peak "; break; case MAIN::control::readMainLRpeak: name = "main "; if (kit == 0) name += "L "; else name += "R "; name += "peak "; break; case MAIN::control::readMainLRrms: name = "main "; if (kit == 0) name += "L "; else name += "R "; name += "RMS "; break; } value = synth->interchange.readAllData(putData); synth->getRuntime().Log(name + std::to_string(value)); return 0; } if (part == TOPLEVEL::section::config && putData.data.miscmsg != UNUSED && (control == CONFIG::control::bankRootCC || control == CONFIG::control::bankCC || control == CONFIG::control::extendedProgramChangeCC)) { synth->getRuntime().Log("In use by " + TextMsgBuffer::instance().fetch(putData.data.miscmsg) ); return 0; } if (parameter != UNUSED && (parameter & TOPLEVEL::action::lowPrio)) action |= (parameter & TOPLEVEL::action::muteAndLoop); // transfer low prio and loopback putData.data.source = action; if (synth->interchange.fromCLI.write(putData.bytes)) { synth->getRuntime().finishedCLI = false; } else synth->getRuntime().Log("Unable to write to fromCLI buffer"); return 0; // no function for this yet } }//(End)namespace cli #endif /*CLIFUNCS_H*/ yoshimi-2.3.5.1/src/Misc/CmdOptions.cpp000066400000000000000000000272461506652756400176410ustar00rootroot00000000000000/* CmdOptions.cpp Copyright 2021-2023, Will Godfrey and others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include #include #include #include #include #include "Misc/Config.h" #include "Misc/FileMgrFuncs.h" #include "Misc/CmdOptions.h" #include "Misc/FormatFuncs.h" using std::string; using file::setExtension; using func::string2int; namespace { // constants used in the implementation const char* PROG_DOC = "Options:" "\v" // the following is printed below the options summary... "\nYoshimi " YOSHIMI_VERSION ", a derivative of ZynAddSubFX\n" "Copyright 2002-2009 Nasca Octavian Paul and others,\n" "Copyright 2009-2011 Alan Calvert,\n" "Copyright 2012-2013 Jeremy Jongepier and others,\n" "Copyright 2014-2025 Will Godfrey and others"; string stateText = "load saved state, defaults to '$HOME/" + EXTEN::config + "/yoshimi/yoshimi-0"+EXTEN::state+"'"; const argp_option OPTION_SPEC[] = { {"alsa-audio", 'A', "", OPTION_ARG_OPTIONAL, "use alsa audio output", 0}, {"alsa-midi", 'a', "", OPTION_ARG_OPTIONAL, "use alsa midi input", 0}, {"define-root", 'D', "", 0 , "define path to new bank root", 2}, {"buffersize", 'b', "", 0 , "set internal buffer size", 2}, {"no-gui", 'i', NULL, 0 , "disable gui", 1}, {"gui", 'I', NULL, 0 , "enable gui", 1}, {"no-cmdline", 'c', NULL, 0 , "disable command line interface", 1}, {"cmdline", 'C', NULL, 0 , "enable command line interface", 1}, {"jack-audio", 'J', "", OPTION_ARG_OPTIONAL, "use jack audio output", 0}, {"jack-midi", 'j', "", OPTION_ARG_OPTIONAL, "use jack midi input", 0}, {"autostart-jack", 'k', NULL, 0 , "auto start jack server", 0}, {"auto-connect", 'K', NULL, 0 , "auto connect jack audio",0}, {"load", 'l', "", 0 , "load .xmz parameters file", 2}, {"load-instrument", 'L', "[@part]",0 , "load .xiz instrument file(no space)@n to part 'n'", 2}, {"load-midilearn", 'M', "", 0 , "load .xly midi-learn file", 2}, {"name-tag", 'N', "", 0 , "add tag to clientname", 2}, {"samplerate", 'R', "", 0 , "set alsa audio sample rate", 1}, {"oscilsize", 'o', "", 0 , "set AddSynth oscillator size", 1}, {"state", 'S', "", 0 , "load .state complete machine setup file", 2}, {"load-guitheme", 'T', "", 0 , "load .clr GUI theme file", 2}, {"null", 13, NULL, 0 , "use Null-backend without audio/midi", 0}, #if defined(JACK_SESSION) {"jack-session-uuid", 'U', "", 0 , "jack session uuid", 2}, {"jack-session-file", 'u', "", 0 , "load named jack session file", 2}, #endif { 0, 0, 0, 0, 0, 0} }; using Settings = CmdOptions::Settings; error_t handleOption (int key, char *arg, struct argp_state *state) { auto settings = [&]{ return static_cast(state->input); }; auto recordToggle = [&]{ settings()->emplace_back(char(key), ""); }; auto recordOption = [&]{ settings()->emplace_back(char(key), string{arg? arg:""}); }; if (arg && arg[0] == '=') ++ arg; switch (key) { case 'A': recordOption(); break; // ALSA audio case 'a': recordOption(); break; // ALSA MIDI case 'b': recordOption(); break; // buffer-size case 'c': recordToggle(); break; // disable CLI case 'C': recordToggle(); break; // enable CLIE case 'D': recordOption(); break; // define bank root case 'i': recordToggle(); break; // without GUI case 'I': recordToggle(); break; // with GUI case 'J': recordOption(); break; // Jack audio case 'j': recordOption(); break; // Jack MIDI case 'k': recordToggle(); break; // auto-start Jack case 'K': recordToggle(); break; // auto-connect to Jack case 'l': recordOption(); break; // load params file case 'L': recordOption(); break; // load instrument case 'M': recordOption(); break; // load MIDI-learn case 'N': recordOption(); break; // name-tag case 'o': recordOption(); break; // oscil-size case 'T': recordOption(); break; // load gui theme case 'R': recordOption(); break; // set ALSA sample rate case 'S': recordOption(); break; // load complete state file case 13: recordToggle(); break; // NULL backend (no audio and MIDI) #if defined(JACK_SESSION) case 'u': recordOption(); break; // load Jack session file case 'U': recordOption(); break; // Jack session UUID #endif case ARGP_KEY_ARG: case ARGP_KEY_END: break; default: return error_t(ARGP_ERR_UNKNOWN); } return error_t(0); } const argp PARSER_SETUP = { OPTION_SPEC, handleOption, 0, PROG_DOC, 0, 0, 0}; }//(End) local definitions for parser configuration CmdOptions::Settings CmdOptions::parseCmdline(int argc, char **argv) { Settings parsedOptions; argp_parse(&PARSER_SETUP, argc, argv, 0, 0, &parsedOptions); return parsedOptions; } void CmdOptions::applyTo (Config& config) const { for (auto const& [cmd, line] : settings) { switch (cmd) { case 'A': config.engineChanged = true; config.audioEngine = alsa_audio; if (not line.empty()) config.audioDevice = line; else config.audioDevice = config.alsaAudioDevice; break; case 'a': config.midiChanged = true; config.midiEngine = alsa_midi; if (not line.empty()) config.midiDevice = line; else config.midiDevice = string(config.alsaMidiDevice); break; case 'b': config.configChanged = true; config.bufferChanged = true; config.buffersize = string2int(line); break; case 'c': config.cliChanged = true; config.showCli = false; break; case 'C': config.cliChanged = true; config.showCli = true; break; case 'D': if (not line.empty()) config.rootDefine = line; break; case 'i': config.guiChanged = true; config.showGui = false; break; case 'I': config.guiChanged = true; config.showGui = true; break; case 'J': config.engineChanged = true; config.audioEngine = jack_audio; if (!line.empty()) config.audioDevice = line; break; case 'j': config.midiChanged = true; config.midiEngine = jack_midi; if (not line.empty()) config.midiDevice = line; else config.midiDevice = config.jackMidiDevice; break; case 'K': config.connectJackChanged = true; config.connectJackaudio = true; break; case 'k': config.startJack = true; break; case 'l': config.paramsLoad = line; break; case 'L': {// Load instrument@part uint partLoad = 0; string spec(line); size_t pos = spec.rfind("@"); if (pos != string::npos) {// this provides a way to specify which part to load to if (spec.length() - pos <= 3) { partLoad = (stoi("0" + spec.substr(pos + 1))) - 1; } if (partLoad >= 64) partLoad = 0; spec = spec.substr(0, pos); } config.load2part = partLoad; config.instrumentLoad = spec; config.configChanged = true; } break; case 'M': config.midiLearnLoad = line; break; case 'N': config.nameTag = line; break; case 'o': config.configChanged = true; config.oscilChanged = true; config.oscilsize = string2int(line); break; case 'R': if (not line.empty()) { config.configChanged = true; config.rateChanged = true; int num = (string2int(line) / 48 ) * 48; if (num < 48000 || num > 192000) num = 44100; // play safe config.samplerate = num; } break; case 'S': config.sessionStage = _SYS_::type::StartupFirst; config.configChanged = true; config.stateFile = line; break; case 'T': config.remoteGuiTheme = line; break; case 'u': config.sessionStage = _SYS_::type::JackFirst; config.configChanged = true; config.stateFile = setExtension(line, EXTEN::state); break; case 'U': Config::globalJackSessionUuid = line; break; case 13: config.configChanged = true; config.engineChanged = true; config.midiChanged = true; config.audioEngine = no_audio; config.midiEngine = no_midi; break; } } if (config.jackSessionUuid.size() and config.jackSessionFile.size()) { config.restoreJackSession = true; config.configChanged = true; } } CmdOptions::CmdOptions(int argc, char **argv) : settings{parseCmdline(argc,argv)} { } yoshimi-2.3.5.1/src/Misc/CmdOptions.h000066400000000000000000000022471506652756400173000ustar00rootroot00000000000000/* CmdOptions.h Copyright 2021, Will Godfrey. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef CMDOPTIONS_H #define CMDOPTIONS_H #include "globals.h" #include #include class Config; class CmdOptions { public: using Settings = std::vector>; CmdOptions() = default; CmdOptions(int argc, char **argv); void applyTo(Config&) const; private: Settings settings; static Settings parseCmdline(int argc, char **argv); }; #endif /*CMDOPTIONS_H*/ yoshimi-2.3.5.1/src/Misc/ConfBuild.h000066400000000000000000000000611506652756400170560ustar00rootroot00000000000000/* ConfBuild.h */ #define BUILD_NUMBER 2408 yoshimi-2.3.5.1/src/Misc/Config.cpp000066400000000000000000001756661506652756400170010ustar00rootroot00000000000000/* Config.cpp - Configuration file functions Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2013, Nikita Zlobin Copyright 2014-2024, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(JACK_SESSION) #include #endif #include "Misc/XMLStore.h" #include "Misc/SynthEngine.h" #include "Misc/Config.h" #include "Misc/FileMgrFuncs.h" #include "Misc/NumericFuncs.h" #include "Misc/FormatFuncs.h" #include "Misc/TextMsgBuffer.h" #ifdef GUI_FLTK #include "MasterUI.h" #endif #include "ConfBuild.h" using file::isRegularFile; using file::createDir; using file::copyDir; using file::isDirectory; using file::extendLocalPath; using file::setExtension; using file::renameFile; using file::loadText; using func::nearestPowerOf2; using func::asString; using func::string2int; using func::string2uint; using std::string; using std::bitset; using std::cout; using std::cerr; using std::endl; namespace { // Implementation details... const uint XML_UNCOMPRESSED{0}; TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); static std::regex VERSION_SYNTAX{R"~((\d+)(?:\.(\d+))?(?:\.(\d+))?)~", std::regex::optimize}; VerInfo parseVersion(string const& spec) { std::smatch mat; if (std::regex_search(spec, mat, VERSION_SYNTAX)) return VerInfo{ string2uint(mat[1]) ,mat[2].matched? string2uint(mat[2]) : 0 ,mat[3].matched? string2uint(mat[3]) : 0 }; else return VerInfo{0}; } } /** * Implementation: parse string with program version specification */ VerInfo::VerInfo(string const& spec) : VerInfo{parseVersion(spec)} { } uchar panLaw = 1; bool Config::showSplash{true}; bool Config::singlePath{false}; bool Config::autoInstance{false}; bitset<32> Config::activeInstances{0}; int Config::showCLIcontext{1}; string Config::globalJackSessionUuid = ""; const VerInfo Config::VER_YOSHI_CURR{YOSHIMI_VERSION}; const VerInfo Config::VER_ZYN_COMPAT{2,4,3}; Config::Config(SynthEngine& synthInstance) : synth{synthInstance} , isLV2{false} , isMultiFeed{false} , build_ID{BUILD_NUMBER} , loadedConfigVer{VER_YOSHI_CURR} , incompatibleZynFile{false} , runSynth{false} // will be set by Instance::startUp() , finishedCLI{true} , isLittleEndian{true} , virKeybLayout{0} , audioEngine{DEFAULT_AUDIO} , engineChanged{false} , midiEngine{DEFAULT_MIDI} , midiChanged{false} , alsaMidiType{1} // search , audioDevice{"default"} , midiDevice{"default"} , jackServer{"default"} , jackMidiDevice{"default"} , startJack{false} , connectJackaudio{true} , connectJackChanged{false} , alsaAudioDevice{"default"} , alsaMidiDevice{"default"} , loadDefaultState{false} , defaultStateName{} , defaultSession{} , configFile{} , paramsLoad{} , instrumentLoad{} , load2part{0} , midiLearnLoad{} , rootDefine{} , stateFile{} , guiThemeID{0} , guiTheme{} , remoteGuiTheme{} , restoreJackSession{false} , jackSessionFile{} , sessionStage{_SYS_::type::Normal} , Interpolation{0} , xmlType{0} , instrumentFormat{1} , enableProgChange{true} // default will be inverted , toConsole{false} , consoleTextSize{12} , hideErrors{false} , showTimes{false} , logXMLheaders{false} , xmlmax{false} , gzipCompression{3} , enablePartReports{false} , samplerate{48000} , rateChanged{false} , buffersize{256} , bufferChanged{false} , oscilsize{512} , oscilChanged{false} , showGui{true} , storedGui{true} , guiChanged{false} , showCli{true} , storedCli{true} , cliChanged{false} , banksChecked{false} , panLaw{1} , configChanged{false} , handlePadSynthBuild{0} , rtprio{40} , midi_bank_root{0} // 128 is used as 'disabled' , midi_bank_C{32} // 128 is used as 'disabled' , midi_upper_voice_C{128} // disabled , enableOmni{true} , enable_NRPN{true} , ignoreResetCCs{false} , monitorCCin{false} , showLearnedCC{true} , numAvailableParts{NUM_MIDI_CHANNELS} , currentPart{0} , currentBank{0} , currentRoot{0} , bankHighlight{false} , lastBankPart{UNUSED} , presetsRootID{0} , tempBank{0} , tempRoot{0} #ifdef REPORT_NOTES_ON_OFF , noteOnSent{0} , noteOnSeen{0} , noteOffSent{0} , noteOffSeen{0} #endif //REPORT_NOTES_ON_OFF , VUcount{0} , channelSwitchType{0} , channelSwitchCC{128} // disabled , channelSwitchValue{0} , nrpnL{127} // off , nrpnH{127} // off , dataL{0xff} // disabled , dataH{0x80} , nrpnActive{false} , vectordata{} , logList{} , manualFile{} , exitType{} , genTmp1{} , genTmp2{} , genTmp3{} , genTmp4{} , genMixl{} , genMixr{} , findManual_Thread{} , sigIntActive{0} , ladi1IntActive{0} , jsessionSave{0} , programcommand{"yoshimi"} , jackSessionDir{} , baseConfig{} , presetList{} , presetDir{} , logHandler{[this](string const& msg, char tostderr){ this->Log(msg,tostderr); }} { std::cerr.precision(4); } void Config::init() { /*string command = "fltk-config --api-version"; string result = ""; file::cmd2string(command, result); //std::cout << result << std::endl; if (stoi(result) >= 1.4) { set a constant here for WidgetPDial ? }*/ if (isLV2) return; //skip further setup, which is irrelevant for LV2 plugin instance. switch (audioEngine) { case alsa_audio: audioDevice = string(alsaAudioDevice); break; case jack_audio: audioDevice = string(jackServer); break; case no_audio: default: audioDevice.clear(); break; } if (audioDevice.empty()) audioDevice = "default"; switch (midiEngine) { case jack_midi: midiDevice = string(jackMidiDevice); break; case alsa_midi: midiDevice = string(alsaMidiDevice); break; case no_midi: default: midiDevice.clear(); break; } oscilsize = nearestPowerOf2(oscilsize, MIN_OSCIL_SIZE, MAX_OSCIL_SIZE); buffersize = nearestPowerOf2(buffersize, MIN_BUFFER_SIZE, MAX_BUFFER_SIZE); if (!Config::globalJackSessionUuid.empty()) jackSessionUuid = Config::globalJackSessionUuid; } /** * when starting a new instance without pre-existing instance config, * fill in some relevant base settings from the primary config. */ void Config::populateFromPrimary() { assert (0 < synth.getUniqueId()); Config& primary = instances().accessPrimaryConfig(); // The following are actually base config values, // yet unfortunately they are duplicated in each config instance, // and thus undesirable default values can sometimes spread around, // since parts of the code blindly use the values from current Synth. handlePadSynthBuild = primary.handlePadSynthBuild; gzipCompression = primary.gzipCompression; guideVersion = primary.guideVersion; manualFile = primary.manualFile; // The following are instance settings, yet still desirable to initialise // with the values from the primary engine instance in case a config is missing paramsLoad = primary.paramsLoad; instrumentLoad = primary.instrumentLoad; load2part = primary.load2part; midiLearnLoad = primary.midiLearnLoad; rootDefine = primary.rootDefine; virKeybLayout = primary.virKeybLayout; audioEngine = primary.audioEngine; midiEngine = primary.midiEngine; alsaMidiType = primary.alsaMidiType; connectJackaudio = primary.connectJackaudio; loadDefaultState = primary.loadDefaultState; Interpolation = primary.Interpolation; //presetsDirlist /////TODO shouldn't we populate these too? if yes -> use a STL container (e.g. std::array), which can be bulk copied instrumentFormat = primary.instrumentFormat; enableProgChange = primary.enableProgChange; toConsole = primary.toConsole; consoleTextSize = primary.consoleTextSize; hideErrors = primary.hideErrors; showTimes = primary.showTimes; logXMLheaders = primary.logXMLheaders; xmlmax = primary.xmlmax; samplerate = primary.samplerate; buffersize = primary.buffersize; oscilsize = primary.oscilsize; panLaw = primary.panLaw; midi_bank_root = primary.midi_bank_root; midi_bank_C = primary.midi_bank_C; midi_upper_voice_C = primary.midi_upper_voice_C; enableOmni = primary.enableOmni; enable_NRPN = primary.enable_NRPN; ignoreResetCCs = primary.ignoreResetCCs; monitorCCin = primary.monitorCCin; showLearnedCC = primary.showLearnedCC; bankHighlight = primary.bankHighlight; presetsRootID = primary.presetsRootID; channelSwitchType = primary.channelSwitchType; channelSwitchCC = primary.channelSwitchCC; channelSwitchValue = primary.channelSwitchValue; } void Config::flushLog() { for (auto& line : logList) cout << line << endl; logList.clear(); } void *Config::_findManual(void *arg) { assert(arg); static_cast(arg)->findManual(); return nullptr; } void Config::findManual() { Log("finding manual"); string currentV = string(YOSHIMI_VERSION); manualFile = findHtmlManual(); guideVersion = loadText(manualFile); size_t pos = guideVersion.find(" "); if (pos != string::npos) guideVersion = guideVersion.substr(0, pos); Log("manual found"); saveMasterConfig(); } void Config::loadConfig() { bool success = initFromPersistentConfig(); if (not success) { string message = "Problems loading config. Using default values."; TextMsgBuffer::instance().push(message); // needed for CLI Log("\n\n" + message + "\n"); } } void Config::buildConfigLocation() { string location = file::configDir(); string instanceID = isLV2? file::LV2_INSTANCE // LV2-plugin uses a fixed key for instance config : asString(synth.getUniqueId()); // standalone-instances are keyed by Synth-ID defaultStateName = location + "/" + YOSHIMI; baseConfig = location + "/" + YOSHIMI + EXTEN::config; configFile = location + "/" + YOSHIMI + "-" + instanceID + EXTEN::instance; defaultSession = location + "/" + YOSHIMI + "-" + instanceID + EXTEN::state; presetList = file::localDir() + "/presetDirs"; presetDir = file::localDir() + "/presets"; } bool Config::initFromPersistentConfig() { if (file::userHome() == "/tmp") Log ("Failed to find 'Home' directory - using tmp.\nSettings will be lost on computer shutdown."); if (file::localDir().empty()) { Log("Failed to create local yoshimi directory."); return false; } if (file::configDir().empty()) { Log("Failed to create config directory '" + file::userHome() + "'"); return false; } buildConfigLocation(); if (synth.getUniqueId() == 0 && sessionStage != _SYS_::type::RestoreConf) { if (not isDirectory(presetDir)) {// only ever want to do this once if (createDir(presetDir)) { Log("Failed to create presets directory '" + presetDir + "'"); } else { defaultPresets(); int i = 1; while (!presetsDirlist[i].empty()) { copyDir(presetsDirlist[i], presetDir, 1); ++i; } } } if (not isDirectory(file::localDir() + "/found/")) {// only ever want to do this once if (createDir(file::localDir() + "/found/")) Log("Failed to create root directory for local banks"); } // conversion for old location string newInstance0 = configFile; string oldAllConfig = defaultStateName + EXTEN::state; if (isRegularFile(baseConfig) && !isRegularFile(newInstance0), 0) { file::copyFile(baseConfig, newInstance0, 0); Log("Reorganising config files."); if (isRegularFile(oldAllConfig)) { if (not isRegularFile(defaultSession)) { renameFile(oldAllConfig, defaultSession); Log("Moving default state file."); } } } } bool success{true}; if (not isRegularFile(baseConfig)) { Log("Basic configuration " + baseConfig + " not found, will use default settings."); saveMasterConfig(); // generates a pristine "yoshimi.config" defaultPresets(); } else { // load baseConfig (always from the primary file) XMLStore xml{baseConfig, getLogger()}; verifyVersion(xml); success = not xml.empty(); if (success) success = extractBaseParameters(xml); // note: we want correct base values even in a secondary config instance else Log("Config: failed to load base config"); } if (not isRegularFile(configFile)) { if (0 < synth.getUniqueId()) { populateFromPrimary(); Log("Config: create new file \""+configFile+"\" with initial values from primary Synth instance."); } else { Log("Configuration \""+configFile+"\" not found; will use default settings."); } saveInstanceConfig(); // generates a new "yoshimi-#.instance" } else if (success) { // load instance configuration values XMLStore xml{configFile, getLogger()}; verifyVersion(xml); success = not xml.empty(); if (success) success = extractConfigData(xml); else Log("Config: failed to load instance config"); } if (sessionStage == _SYS_::type::RestoreConf) return true; if (sessionStage != _SYS_::type::Normal) { XMLStore xml{stateFile, getLogger()}; verifyVersion(xml); success = not xml.empty(); if (success) { if (sessionStage == _SYS_::type::StartupFirst) sessionStage = _SYS_::type::StartupSecond; else if (sessionStage == _SYS_::type::JackFirst) sessionStage = _SYS_::type::JackSecond; success = extractConfigData(xml); } else Log("Config: failed to load instance config"); } if (success) loadPresetsList(); if (success && synth.getUniqueId() == 0) { // find user guide bool man_ok = false; string currentV = string(YOSHIMI_VERSION); size_t pos = currentV.find(" "); if (pos != string::npos) currentV = currentV.substr(0,pos); if (currentV == guideVersion && isRegularFile(manualFile)) { man_ok = true; } if (!man_ok) { startThread(&findManual_Thread, _findManual, this, false, 0, "CFG"); } } return success; } void Config::initBaseConfig(XMLStore& xml) { if (xml.meta.type == TOPLEVEL::XML::MasterConfig) { XMLtree base = xml.addElm("BASE_PARAMETERS"); base.addPar_bool("enable_gui" , storedGui); base.addPar_bool("enable_splash" , showSplash); base.addPar_bool("enable_CLI" , storedCli); base.addPar_int ("show_CLI_context" , showCLIcontext); base.addPar_bool("enable_single_master" , singlePath); base.addPar_bool("enable_auto_instance" , autoInstance); base.addPar_uint("handle_padsynth_build", handlePadSynthBuild); base.addPar_int ("gzip_compression" , gzipCompression); base.addPar_bool("enable_part_reports" , enablePartReports); base.addPar_bool("banks_checked" , banksChecked); base.addPar_uint("active_instances" , activeInstances.to_ulong()); base.addPar_str ("guide_version" , guideVersion); base.addPar_str ("manual" , manualFile); } else if (xml.meta.type <= TOPLEVEL::XML::Scale) { XMLtree base = xml.addElm("BASE_PARAMETERS"); base.addPar_int("max_midi_parts" , NUM_MIDI_CHANNELS); base.addPar_int("max_kit_items_per_instrument" , NUM_KIT_ITEMS); base.addPar_int("max_system_effects" , NUM_SYS_EFX); base.addPar_int("max_insertion_effects" , NUM_INS_EFX); base.addPar_int("max_instrument_effects", NUM_PART_EFX); base.addPar_int("max_addsynth_voices" , NUM_VOICES); } } void Config::addConfigXML(XMLStore& xml) { XMLtree conf = xml.addElm("CONFIGURATION"); conf.addPar_int ("defaultState", loadDefaultState); conf.addPar_int ("sound_buffer_size" , buffersize); conf.addPar_int ("oscil_size" , oscilsize); conf.addPar_bool("reports_destination" , toConsole); conf.addPar_int ("console_text_size" , consoleTextSize); conf.addPar_int ("interpolation" , Interpolation); conf.addPar_int ("virtual_keyboard_layout", virKeybLayout + 1); conf.addPar_int ("saved_instrument_format", instrumentFormat); conf.addPar_bool("hide_system_errors" , hideErrors); conf.addPar_bool("report_load_times" , showTimes); conf.addPar_bool("report_XMLheaders" , logXMLheaders); conf.addPar_bool("full_parameters" , xmlmax); conf.addPar_bool("bank_highlight" , bankHighlight); conf.addPar_int ("presetsCurrentRootID" , presetsRootID); conf.addPar_int ("audio_engine" , audioEngine); conf.addPar_int ("midi_engine" , midiEngine); conf.addPar_str ("linux_jack_server" , jackServer); conf.addPar_str ("linux_jack_midi_dev" , jackMidiDevice); conf.addPar_bool("connect_jack_audio" , connectJackaudio); conf.addPar_int ("alsa_midi_type" , alsaMidiType); conf.addPar_str ("linux_alsa_audio_dev" , alsaAudioDevice); conf.addPar_str ("linux_alsa_midi_dev" , alsaMidiDevice); conf.addPar_int ("sample_rate" , samplerate); conf.addPar_int ("midi_bank_root" , midi_bank_root); conf.addPar_int ("midi_bank_C" , midi_bank_C); conf.addPar_int ("midi_upper_voice_C" , midi_upper_voice_C); conf.addPar_int ("ignore_program_change" , (not enableProgChange)); conf.addPar_int ("enable_part_on_voice_load", 1); // for backward compatibility conf.addPar_bool("enable_omni_change" , enableOmni); conf.addPar_bool("enable_incoming_NRPNs" , enable_NRPN); conf.addPar_bool("ignore_reset_all_CCs" , ignoreResetCCs); conf.addPar_bool("monitor-incoming_CCs" , monitorCCin); conf.addPar_bool("open_editor_on_learned_CC",showLearnedCC); conf.addPar_int ("root_current_ID" , synth.ReadBankRoot()); conf.addPar_int ("bank_current_ID" , synth.ReadBank()); } /** * This routine only stores settings that the user has directly changed * and not those changed via CLI startup parameters, nor changes made * by loading sessions etc. * * It loads the previously saved config into an array so it doesn't * disrupt the complete config currently in place. It then overwrites * just the parameter the user changed, and re-saves everything * including system generated entries. * * Text entries are handled via textMsgBuffer, so only a single array * type is needed, simplifying the code. * * Some assumptions are made based on the fact the parameters must be * in the correct range as they otherwise couldn't have been created. */ bool Config::updateConfig(int configKey, int value) { buildConfigLocation(); using Cfg = CONFIG::control; if (configKey <= Cfg::XMLcompressionLevel) {// handling base config int baseConfigData[Cfg::XMLcompressionLevel+1]; auto par = [&](Cfg key) -> int& { return baseConfigData[key]; }; XMLStore xml{baseConfig, getLogger()}; if (xml.empty()) Log("updateConfig: failed to load base config from \""+baseConfig+"\"."); else { XMLtree xmlBase = xml.getElm("BASE_PARAMETERS"); if (xmlBase.empty()) Log("updateConfig: no in XML file \""+baseConfig+"\"."); else { par(Cfg::enableGUI ) = xmlBase.getPar_bool("enable_gui",true); par(Cfg::showSplash ) = xmlBase.getPar_bool("enable_splash",true); par(Cfg::enableCLI ) = xmlBase.getPar_bool("enable_CLI",true); par(Cfg::exposeStatus ) = xmlBase.getPar_int ("show_CLI_context",1,0,2); par(Cfg::enableSinglePath ) = xmlBase.getPar_bool("enable_single_master",false); par(Cfg::enableAutoInstance ) = xmlBase.getPar_bool("enable_auto_instance",false); par(Cfg::handlePadSynthBuild) = xmlBase.getPar_uint("handle_padsynth_build",1,0,2); par(Cfg::XMLcompressionLevel) = xmlBase.getPar_int ("gzip_compression",3,0,9); par(Cfg::enablePartReports ) = xmlBase.getPar_bool("enable_part_reports",false); par(Cfg::banksChecked ) = xmlBase.getPar_bool("banks_checked",false); // Alter the specific config value given par(Cfg(configKey)) = value; // Write back the consolidated base config XMLStore newXml{TOPLEVEL::XML::MasterConfig}; XMLtree xmlBase = newXml.addElm("BASE_PARAMETERS"); xmlBase.addPar_bool("enable_gui" , par(Cfg::enableGUI)); xmlBase.addPar_bool("enable_splash" , par(Cfg::showSplash)); xmlBase.addPar_bool("enable_CLI" , par(Cfg::enableCLI)); xmlBase.addPar_int ("show_CLI_context" , par(Cfg::exposeStatus)); xmlBase.addPar_bool("enable_single_master" , par(Cfg::enableSinglePath)); xmlBase.addPar_bool("enable_auto_instance" , par(Cfg::enableAutoInstance)); xmlBase.addPar_uint("handle_padsynth_build", par(Cfg::handlePadSynthBuild)); xmlBase.addPar_int ("gzip_compression" , par(Cfg::XMLcompressionLevel)); xmlBase.addPar_int ("enable_part_reports" , par(Cfg::enablePartReports)); xmlBase.addPar_bool("banks_checked" , par(Cfg::banksChecked)); // the following are system defined; xmlBase.addPar_uint("active_instances", activeInstances.to_ulong()); xmlBase.addPar_str ("guide_version" , guideVersion); xmlBase.addPar_str ("manual" , manualFile); if (newXml.saveXMLfile(baseConfig, getLogger(), XML_UNCOMPRESSED)) return true; else Log("updateConfig: failed to write updated base config to \""+baseConfig+"\"."); } } } else {// handling current instance config const int offset = Cfg::defaultStateStart; const int cntSettings = Cfg::historyLock - offset; int instanceConfigData[cntSettings]; // define a lambda as shorthand notation for the following manipulations auto par = [&](Cfg key) -> int& { return instanceConfigData[key - offset]; }; XMLStore xml{configFile, getLogger()}; if (xml.empty()) Log("updateConfig: failed to load instance config from \""+configFile+"\"."); else { XMLtree xmlConf = xml.getElm("CONFIGURATION"); if (xmlConf.empty()) Log("updateConfig: no in XML file \""+configFile+"\"."); else { par(Cfg::defaultStateStart ) = xmlConf.getPar_int ("defaultState", 0, 0, 1); par(Cfg::bufferSize ) = xmlConf.getPar_int ("sound_buffer_size", 0, MIN_BUFFER_SIZE, MAX_BUFFER_SIZE); par(Cfg::oscillatorSize ) = xmlConf.getPar_int ("oscil_size", 0, MIN_OSCIL_SIZE, MAX_OSCIL_SIZE); par(Cfg::reportsDestination ) = xmlConf.getPar_bool("reports_destination", false); par(Cfg::logTextSize ) = xmlConf.getPar_int ("console_text_size", 0, 11, 100); par(Cfg::padSynthInterpolation ) = xmlConf.getPar_int ("interpolation", 0, 0, 1); par(Cfg::virtualKeyboardLayout ) = xmlConf.getPar_int ("virtual_keyboard_layout", 0, 1, 6) - 1; par(Cfg::savedInstrumentFormat ) = xmlConf.getPar_int ("saved_instrument_format",0, 1, 3); par(Cfg::hideNonFatalErrors ) = xmlConf.getPar_bool("hide_system_errors", false); par(Cfg::logInstrumentLoadTimes ) = xmlConf.getPar_bool("report_load_times", false); par(Cfg::logXMLheaders ) = xmlConf.getPar_bool("report_XMLheaders", false); par(Cfg::saveAllXMLdata ) = xmlConf.getPar_bool("full_parameters", xmlmax); par(Cfg::enableHighlight ) = xmlConf.getPar_bool("bank_highlight", bankHighlight); par(Cfg::jackMidiSource ) = textMsgBuffer.push(xmlConf.getPar_str("linux_jack_midi_dev"));// string par(Cfg::jackServer ) = textMsgBuffer.push(xmlConf.getPar_str("linux_jack_server"));// string par(Cfg::jackAutoConnectAudio ) = xmlConf.getPar_bool("connect_jack_audio", connectJackaudio); par(Cfg::alsaMidiSource ) = textMsgBuffer.push(xmlConf.getPar_str("linux_alsa_midi_dev"));// string par(Cfg::alsaMidiType ) = xmlConf.getPar_int ("alsa_midi_type", 0, 0, 2); par(Cfg::alsaAudioDevice ) = textMsgBuffer.push(xmlConf.getPar_str("linux_alsa_audio_dev"));// string par(Cfg::alsaSampleRate ) = xmlConf.getPar_int ("sample_rate", samplerate, 44100, 192000); par(Cfg::readAudio ) = audio_driver(xmlConf.getPar_int("audio_engine", 0, no_audio, alsa_audio)); par(Cfg::readMIDI ) = midi_driver(xmlConf.getPar_int("midi_engine", 0, no_midi, alsa_midi)); // par(Cfg::addPresetRootDir ) = // string NOT stored // par(Cfg::removePresetRootDir ) = // returns string NOT used par(Cfg::currentPresetRoot ) = xmlConf.getPar_int ("presetsCurrentRootID", 0, 0, MAX_PRESETS); par(Cfg::bankRootCC ) = xmlConf.getPar_int ("midi_bank_root", 0, 0, 128); par(Cfg::bankCC ) = xmlConf.getPar_int ("midi_bank_C", midi_bank_C, 0, 128); par(Cfg::extendedProgramChangeCC) = xmlConf.getPar_int ("midi_upper_voice_C", 0, 0, 128); par(Cfg::enableProgramChange ) = 1 - xmlConf.getPar_int("ignore_program_change", 0, 0, 1); // inverted for Zyn compatibility par(Cfg::ignoreResetAllCCs ) = xmlConf.getPar_bool("ignore_reset_all_CCs", ignoreResetCCs); par(Cfg::logIncomingCCs ) = xmlConf.getPar_bool("monitor-incoming_CCs", monitorCCin); par(Cfg::showLearnEditor ) = xmlConf.getPar_bool("open_editor_on_learned_CC", showLearnedCC); par(Cfg::enableOmni ) = xmlConf.getPar_bool("enable_omni_change", enableOmni); par(Cfg::enableNRPNs ) = xmlConf.getPar_bool("enable_incoming_NRPNs", enable_NRPN); // par(Cfg::saveCurrentConfig ) = // return string (dummy) // Alter the specific config value given par(Cfg(configKey)) = value; // Write back the consolidated instance config XMLStore newXml{TOPLEVEL::XML::Config}; XMLtree xmlConf = newXml.addElm("CONFIGURATION"); xmlConf.addPar_int ("defaultState" , par(Cfg::defaultStateStart)); xmlConf.addPar_int ("sound_buffer_size" , par(Cfg::bufferSize)); xmlConf.addPar_int ("oscil_size" , par(Cfg::oscillatorSize)); xmlConf.addPar_bool("reports_destination" , par(Cfg::reportsDestination)); xmlConf.addPar_int ("console_text_size" , par(Cfg::logTextSize)); xmlConf.addPar_int ("interpolation" , par(Cfg::padSynthInterpolation)); xmlConf.addPar_int ("virtual_keyboard_layout" , par(Cfg::virtualKeyboardLayout) + 1); xmlConf.addPar_int ("saved_instrument_format" , par(Cfg::savedInstrumentFormat)); xmlConf.addPar_bool("hide_system_errors" , par(Cfg::hideNonFatalErrors)); xmlConf.addPar_bool("report_load_times" , par(Cfg::logInstrumentLoadTimes)); xmlConf.addPar_bool("report_XMLheaders" , par(Cfg::logXMLheaders)); xmlConf.addPar_bool("full_parameters" , par(Cfg::saveAllXMLdata)); xmlConf.addPar_bool("bank_highlight" , par(Cfg::enableHighlight)); xmlConf.addPar_int ("presetsCurrentRootID" , par(Cfg::currentPresetRoot)); xmlConf.addPar_int ("audio_engine" , par(Cfg::readAudio)); xmlConf.addPar_int ("midi_engine" , par(Cfg::readMIDI)); xmlConf.addPar_str ("linux_jack_server" , textMsgBuffer.fetch(par(Cfg::jackServer))); xmlConf.addPar_str ("linux_jack_midi_dev" , textMsgBuffer.fetch(par(Cfg::jackMidiSource))); xmlConf.addPar_bool("connect_jack_audio" , par(Cfg::jackAutoConnectAudio)); xmlConf.addPar_int ("alsa_midi_type" , par(Cfg::alsaMidiType)); xmlConf.addPar_str ("linux_alsa_audio_dev" , textMsgBuffer.fetch(par(Cfg::alsaAudioDevice))); xmlConf.addPar_str ("linux_alsa_midi_dev" , textMsgBuffer.fetch(par(Cfg::alsaMidiSource))); xmlConf.addPar_int ("sample_rate" , par(Cfg::alsaSampleRate)); xmlConf.addPar_int ("midi_bank_root" , par(Cfg::bankRootCC)); xmlConf.addPar_int ("midi_bank_C" , par(Cfg::bankCC)); xmlConf.addPar_int ("midi_upper_voice_C" , par(Cfg::extendedProgramChangeCC)); xmlConf.addPar_int ("ignore_program_change" , (1 - par(Cfg::enableProgramChange))); xmlConf.addPar_int ("enable_part_on_voice_load", 1); // for backward compatibility xmlConf.addPar_bool("enable_omni_change" , par(Cfg::enableOmni)); xmlConf.addPar_bool("enable_incoming_NRPNs" , par(Cfg::enableNRPNs)); xmlConf.addPar_bool("ignore_reset_all_CCs" , par(Cfg::ignoreResetAllCCs)); xmlConf.addPar_bool("monitor-incoming_CCs" , par(Cfg::logIncomingCCs)); xmlConf.addPar_bool("open_editor_on_learned_CC",par(Cfg::showLearnEditor)); xmlConf.addPar_int("root_current_ID", currentRoot); // always store the current root xmlConf.addPar_int("bank_current_ID", currentBank); // always store the current bank if (newXml.saveXMLfile(configFile, getLogger(), XML_UNCOMPRESSED)) return true; else Log("updateConfig: failed to write updated instance config to \""+configFile+"\"."); } } } return false; } bool Config::extractBaseParameters(XMLStore& xml) { XMLtree basePars = xml.getElm("BASE_PARAMETERS"); if (not basePars) { Log("extractConfigData, no branch"); return false; } // the following two settings are special, since // - it is possible to override them from the cmdline (but not persistently) // - it is dangerous to disable them from the running instance (leaves half broken, running GUI) // thus we keep the persistent setting in separate state flags (storedGui, storedCli) storedGui = basePars.getPar_bool("enable_gui", showGui); if (not guiChanged) showGui = storedGui; storedCli = basePars.getPar_bool("enable_CLI", showCli); if (not cliChanged) showCli = storedCli; showSplash = basePars.getPar_bool("enable_splash", showSplash); showCLIcontext = basePars.getPar_int("show_CLI_context", 1, 0, 2); singlePath = basePars.getPar_bool("enable_single_master", singlePath); autoInstance = basePars.getPar_bool("enable_auto_instance", autoInstance); if (autoInstance) activeInstances = bitset<32>{basePars.getPar_uint("active_instances", 0)}; handlePadSynthBuild = basePars.getPar_uint("handle_padsynth_build", 1, 0, 2); // 0 = blocking/muted, 1 = background thread (=default), 2 = auto-Apply on param change gzipCompression = basePars.getPar_int("gzip_compression", gzipCompression, 0, 9); enablePartReports = basePars.getPar_bool("enable_part_reports",enablePartReports); banksChecked = basePars.getPar_bool("banks_checked", banksChecked); guideVersion = basePars.getPar_str("guide_version"); manualFile = basePars.getPar_str("manual"); migrateLegacyPresetsList(basePars); return true; } bool Config::extractConfigData(XMLStore& xml) { XMLtree conf = xml.getElm("CONFIGURATION"); if (not conf) { Log("extractConfigData, no CONFIGURATION branch"); Log("Running with defaults"); return true; } /* * default state setting must be checked first * as we need to abort then and fetch an explicit default-state instead */ if (sessionStage == _SYS_::type::Normal) { loadDefaultState = bool(conf.getPar_int("defaultState", loadDefaultState, 0, 1)); if (loadDefaultState) { configChanged = true; sessionStage = _SYS_::type::Default; stateFile = defaultSession; Log("Loading default state"); return true; } } if (sessionStage != _SYS_::type::InProgram) { if (!bufferChanged) buffersize = conf.getPar_int("sound_buffer_size" , buffersize, MIN_BUFFER_SIZE, MAX_BUFFER_SIZE); if (!oscilChanged) oscilsize = conf.getPar_int ("oscil_size" , oscilsize, MIN_OSCIL_SIZE, MAX_OSCIL_SIZE); toConsole = conf.getPar_bool("reports_destination" , toConsole); consoleTextSize=conf.getPar_int ("console_text_size" , consoleTextSize, 11, 100); Interpolation = conf.getPar_int ("interpolation" , Interpolation, 0, 1); virKeybLayout = conf.getPar_int ("virtual_keyboard_layout", virKeybLayout, 1, 6) - 1; instrumentFormat=conf.getPar_int("saved_instrument_format", instrumentFormat, 1, 3); hideErrors = conf.getPar_bool("hide_system_errors" , hideErrors); showTimes = conf.getPar_bool("report_load_times" , showTimes); logXMLheaders = conf.getPar_bool("report_XMLheaders" , logXMLheaders); xmlmax = conf.getPar_bool("full_parameters" , true); // defensive fall-back for migration bankHighlight = conf.getPar_bool("bank_highlight" , bankHighlight); presetsRootID = conf.getPar_int ("presetsCurrentRootID", presetsRootID, 0, MAX_PRESETS); // engines if (!engineChanged) audioEngine = (audio_driver)conf.getPar_int("audio_engine", audioEngine, no_audio, alsa_audio); if (!midiChanged) midiEngine = (midi_driver)conf.getPar_int("midi_engine", midiEngine, no_midi, alsa_midi); alsaMidiType = conf.getPar_int ("alsa_midi_type", 0, 0, 2); // jack settings jackServer = conf.getPar_str ("linux_jack_server"); jackMidiDevice = conf.getPar_str ("linux_jack_midi_dev"); if (!connectJackChanged) connectJackaudio = conf.getPar_bool("connect_jack_audio", connectJackaudio); // alsa settings alsaAudioDevice = conf.getPar_str ("linux_alsa_audio_dev"); alsaMidiDevice = conf.getPar_str ("linux_alsa_midi_dev"); if (!rateChanged) samplerate = conf.getPar_int ("sample_rate", samplerate, 44100, 192000); // midi options midi_bank_root = conf.getPar_int ("midi_bank_root" , midi_bank_root, 0, 128); midi_bank_C = conf.getPar_int ("midi_bank_C" , midi_bank_C, 0, 128); midi_upper_voice_C=conf.getPar_int ("midi_upper_voice_C" , midi_upper_voice_C, 0, 128); enableProgChange = not conf.getPar_int("ignore_program_change" , enableProgChange, 0, 1); // inverted for Zyn compatibility enableOmni = conf.getPar_bool("enable_omni_change" , enableOmni); enable_NRPN = conf.getPar_bool("enable_incoming_NRPNs" , enable_NRPN); ignoreResetCCs = conf.getPar_bool("ignore_reset_all_CCs" , ignoreResetCCs); monitorCCin = conf.getPar_bool("monitor-incoming_CCs" , monitorCCin); showLearnedCC = conf.getPar_bool("open_editor_on_learned_CC", showLearnedCC); } if (tempRoot == 0) tempRoot = conf.getPar_int("root_current_ID", 0, 0, 127); if (tempBank == 0) tempBank = conf.getPar_int("bank_current_ID", 0, 0, 127); return true; } namespace { string render(VerInfo const& ver) { return "v" + asString(ver.maj) + "." + asString(ver.min) + (ver.rev? "."+asString(ver.rev) : "") ; } } /** @remark to simplify invoking the version check after loading XML */ void postLoadCheck(XMLStore const& xml, SynthEngine& synth) { synth.getRuntime().verifyVersion(xml); } /** * Evaluate Metadata to ensure version compatibility. * Generate diagnostic and warnings and set compatibility flags. * @note this function should be invoked explicitly, * whenever some XML file has been loaded. */ void Config::verifyVersion(XMLStore const& xml) { if (not xml.meta.isValid()) Log("XML: no valid data format found in file.", _SYS_::LogNotSerious); else if (xml.meta.isZynCompat() and not xml.meta.yoshimiVer // file was indeed written by ZynAddSubFX and VER_ZYN_COMPAT < xml.meta.zynVer) { this->incompatibleZynFile |= true; Log("XML: found incompatible ZynAddSubFX version " +asString(xml.meta.zynVer.maj) +"." +asString(xml.meta.zynVer.min) , _SYS_::LogNotSerious); } else if (xml.meta.yoshimiVer // it's a Yoshimi config file and ( xml.meta.type == TOPLEVEL::XML::MasterConfig or xml.meta.type == TOPLEVEL::XML::Config)) { if (not is_compatible(xml.meta.yoshimiVer)) loadedConfigVer.forceReset(xml.meta.yoshimiVer); } if (logXMLheaders) { string text{"XML("}; if (not xml.meta.isValid()) text += "empty/invalid metadata)."; else { text += renderXmlType(xml.meta.type) +") "; if (xml.meta.zynVer and not xml.meta.yoshimiVer) text += "ZynAddSubFX format " + render(xml.meta.zynVer); // XML with Zyn doctype, presumably written by ZynAddSubFX else if (xml.meta.isZynCompat()) text += "ZynAddSubFX compatible " + render(xml.meta.zynVer) + " by Yoshimi " + render(xml.meta.yoshimiVer); // XML with ZynAddSubFX doctype, yet written by Yoshimi else text += "YoshimiFormat " + render(xml.meta.yoshimiVer); } Log(text); } } bool Config::is_compatible (VerInfo const& ver) { if (is_equivalent(ver, VER_YOSHI_CURR)) return true; // only revision differs => compatible if (ver.maj == VER_YOSHI_CURR.maj) return not (VER_YOSHI_CURR.min < ver.min); // same major: silently accept any lower minor else return false; // else mark any differing version as incompatible } /** * Perform migration tasks in case an incompatible configuration is detected. * @remark basically it is sufficient just to re-save the current config, * since our code for loading XML typically performs any necessary * data migration on the spot. * @warning only to be called on the primary instance, and after initialisation * and loading of config, history and banks is complete. */ void Config::maybeMigrateConfig() { if (is_compatible(loadedConfigVer)) return; if (loadedConfigVer < VER_YOSHI_CURR) {// loadedConfig is from an earlier version => safe to migrate saveMasterConfig(); saveInstanceConfig(); Log("\n" "\n+++++++++----------------------------++" "\nMigration of Config " +render(loadedConfigVer) +" --> " +render(VER_YOSHI_CURR) +"\n+++++++++----------------------------++" "\n" ); } // NOTE: never automatically re-save config written by a never version than this codebase, // since doing so may potentially discard additional settings present in the loaded config. } bool Config::saveMasterConfig() { XMLStore xml{TOPLEVEL::XML::MasterConfig}; initBaseConfig(xml); bool success = xml and xml.saveXMLfile(baseConfig, getLogger(), XML_UNCOMPRESSED); if (success) configChanged = false; else Log("Failed to save base config to \""+baseConfig+"\"", _SYS_::LogNotSerious); return success; } bool Config::saveInstanceConfig() { XMLStore xml{TOPLEVEL::XML::Config}; addConfigXML(xml); bool success = xml and xml.saveXMLfile(configFile, getLogger(), XML_UNCOMPRESSED); if (success) configChanged = false; else Log("Failed to save instance config to \""+configFile+"\"", _SYS_::LogNotSerious); return success; } /** * Extract current instance config and complete patch state from the engine, * encode it as XML and write to a _state file_ */ bool Config::saveSessionData(string sessionfile) { sessionfile = setExtension(sessionfile, EXTEN::state); XMLStore xml{TOPLEVEL::XML::State}; capturePatchState(xml); bool success = xml.saveXMLfile(sessionfile, getLogger(), gzipCompression); if (success) Log("Session data saved to \""+sessionfile+"\"", _SYS_::LogNotSerious); else Log("Failed to save session data to \""+sessionfile+"\"", _SYS_::LogNotSerious); return success; } /** Variation to extract config and patch state for LV2 */ int Config::saveSessionData(char** dataBuffer) { XMLStore xml{TOPLEVEL::XML::State}; capturePatchState(xml); *dataBuffer = xml.render(); return strlen(*dataBuffer) + 1; } void Config::capturePatchState(XMLStore& xml) { addConfigXML(xml); synth.add2XML(xml); synth.midilearn.insertMidiListData(xml); } /** * Read configuration and patch state from XML state file * and overwrite config and engine settings with these values. */ bool Config::restoreSessionData(string sessionfile) { if (sessionfile.size() && !isRegularFile(sessionfile)) sessionfile = setExtension(sessionfile, EXTEN::state); if (!sessionfile.size() || !isRegularFile(sessionfile)) Log("Session file \""+sessionfile+"\" not available", _SYS_::LogNotSerious); else { XMLStore xml{sessionfile, getLogger()}; verifyVersion(xml); if (not xml) Log("Failed to load xml file \""+sessionfile+"\"", _SYS_::LogNotSerious); else return restorePatchState(xml); } return false; } /** Variation to retrieve patch state and config from the LV2 host */ bool Config::restoreSessionData(const char* dataBuffer, int size) { (void)size; // currently unused XMLStore xml{dataBuffer}; if (not xml) Log("Unable to parse XML to restore session state."); else return restorePatchState(xml); return false; } bool Config::restorePatchState(XMLStore& xml) { if (extractConfigData(xml)) { synth.defaults(); if (synth.getfromXML(xml)) { synth.setAllPartMaps(); if (synth.midilearn.extractMidiListData(xml)) synth.midilearn.updateGui(MIDILEARN::control::hideGUI); // handles possibly undefined window return true; } } return false; } bool Config::loadPresetsList() { if (not isRegularFile(presetList)) Log("Missing preset directories file \""+presetList+"\""); else { XMLStore xml{presetList, getLogger()}; XMLtree xmlDirs = xml.getElm("PRESETDIRS"); if (not xmlDirs) Log("loadPresetsList: no branch in \""+presetList+"\""); else { for (uint idx=0; idx < MAX_PRESETS; ++idx) if (auto entry = xmlDirs.getElm("XMZ_FILE", idx)) presetsDirlist[idx] = entry.getPar_str("dir"); else break; return true; }// loaded successfully } return false; } bool Config::savePresetsList() { XMLStore xml{TOPLEVEL::XML::PresetDirs}; XMLtree xmlDirs = xml.addElm("PRESETDIRS"); { for (uint idx=0; idx < MAX_PRESETS and not presetsDirlist[idx].empty(); ++idx) { xmlDirs.addElm("XMZ_FILE", idx) .addPar_str("dir", presetsDirlist[idx]); } } bool success = xmlDirs and xml.saveXMLfile(presetList, getLogger(), gzipCompression); if (not success) Log("Failed to save preset directory list to \""+presetList+"\""); return success; } /** @remark before 2022, this was part of the global config; * with change set `fcedcc05` this is migrated into a separate file */ void Config::migrateLegacyPresetsList(XMLtree& basePars) { int count{0}; bool found{false}; if (not isRegularFile(presetList)) {// attempt to migrate legacy settings for (int i = 0; i < MAX_PRESET_DIRS; ++i) { if (XMLtree presetsRoot = basePars.getElm("PRESETSROOT", i)) { string dir = presetsRoot.getPar_str("presets_root"); if (isDirectory(dir)) { presetsDirlist[count] = dir; found = true; ++count; } } } if (not found) {// otherwise build the list anew from defaults defaultPresets(); presetsRootID = 0; } savePresetsList(); // move settings to new location } } void Config::defaultPresets() { auto presetDirsToTry = std::array{presetDir ,file::configDir()+"/presets" ,extendLocalPath("/presets") /* * TODO * We shouldn't be setting these directly */ ,string{"/usr/share/yoshimi/presets"} ,string{"/usr/local/share/yoshimi/presets"} }; int actual{0}; Log("Setup default preset directories...", _SYS_::LogNotSerious); for (string& presetDir : presetDirsToTry) if (isDirectory(presetDir)) { Log("adding: "+presetDir, _SYS_::LogNotSerious); presetsDirlist[actual++] = presetDir; } } void Config::Log(string const& msg, char tostderr) { if ((tostderr & _SYS_::LogNotSerious) && hideErrors) return; else if(!(tostderr & _SYS_::LogError)) { if (showGui && toConsole) logList.push_back(msg); else cout << msg << endl; } else cerr << msg << endl; // error log } void Config::startupReport(string const& clientName) { bool fullInfo = (synth.getUniqueId() == 0); if (fullInfo) Log("Build Number " + std::to_string(build_ID)); Log("Clientname: " + clientName); string report = "Audio: "; switch (audioEngine) { case jack_audio: report += "jack"; break; case alsa_audio: report += "alsa"; break; default: report += "nada"; break; } report += (" -> '" + audioDevice + "'"); Log(report, _SYS_::LogNotSerious); report = "Midi: "; switch (midiEngine) { case jack_midi: report += "jack"; break; case alsa_midi: report += "alsa"; break; default: report += "nada"; break; } if (!midiDevice.size()) midiDevice = "default"; report += (" -> '" + midiDevice + "'"); Log(report, _SYS_::LogNotSerious); if (fullInfo) { Log("Oscilsize: " + asString(synth.oscilsize), _SYS_::LogNotSerious); Log("Samplerate: " + asString(synth.samplerate), _SYS_::LogNotSerious); Log("Period size: " + asString(synth.buffersize), _SYS_::LogNotSerious); } } void Config::setRtprio(int prio) { if (prio < rtprio) rtprio = prio; } // general thread start service bool Config::startThread(pthread_t *pth, ThreadFun* threadFun, void *arg, bool schedfifo, char priodec, string const& name) { pthread_attr_t attr; int chk; bool outcome = false; bool retry = true; while (retry) { if (!(chk = pthread_attr_init(&attr))) { if (schedfifo) { if ((chk = pthread_attr_setschedpolicy(&attr, SCHED_FIFO))) { Log("Failed to set SCHED_FIFO policy in thread attribute " + string(strerror(errno)) + " (" + asString(chk) + ")", _SYS_::LogError); schedfifo = false; continue; } if ((chk = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED))) { Log("Failed to set inherit scheduler thread attribute " + string(strerror(errno)) + " (" + asString(chk) + ")", _SYS_::LogError); schedfifo = false; continue; } sched_param prio_params; int prio = rtprio - priodec; if (prio < 1) prio = 1; Log(name + " priority is " + std::to_string(prio), _SYS_::LogError); prio_params.sched_priority = prio; if ((chk = pthread_attr_setschedparam(&attr, &prio_params))) { Log("Failed to set thread priority attribute (" + asString(chk) + ") ", _SYS_::LogNotSerious | _SYS_::LogError); schedfifo = false; continue; } } if (!(chk = pthread_create(pth, &attr, threadFun, arg))) { outcome = true; break; } else if (schedfifo) { schedfifo = false; continue; } outcome = false; break; } else Log("Failed to initialise thread attributes " + asString(chk), _SYS_::LogError); if (schedfifo) { Log("Failed to start thread (sched_fifo) " + asString(chk) + " " + string(strerror(errno)), _SYS_::LogError); schedfifo = false; continue; } Log("Failed to start thread (sched_other) " + asString(chk) + " " + string(strerror(errno)), _SYS_::LogError); outcome = false; break; } return outcome; } void Config::signalCheck() { #if defined(JACK_SESSION) int jsev = __sync_fetch_and_add(&jsessionSave, 0); if (jsev != 0) { __sync_and_and_fetch(&jsessionSave, 0); switch (jsev) { case JackSessionSave: saveJackSession(); break; case JackSessionSaveAndQuit: saveJackSession(); runSynth.store(false, std::memory_order_release); break; case JackSessionSaveTemplate: // not implemented break; default: break; } } #endif if (ladi1IntActive) { __sync_and_and_fetch(&ladi1IntActive, 0); saveSessionData(stateFile); } if (sigIntActive) runSynth.store(false, std::memory_order_release); } void Config::setInterruptActive() { Log("Interrupt received", _SYS_::LogError); __sync_or_and_fetch(&sigIntActive, 0xFF); } void Config::setLadi1Active() { __sync_or_and_fetch(&ladi1IntActive, 0xFF); } bool Config::restoreJsession() { #if defined(JACK_SESSION) return restoreSessionData(jackSessionFile); #else return false; #endif } void Config::setJackSessionSave(int event_type, string const& session_file) { jackSessionFile = session_file; __sync_and_and_fetch(&jsessionSave, 0); __sync_or_and_fetch(&jsessionSave, event_type); } string Config::testCCvalue(int cc) { string result = ""; switch (cc) { case 1: result = "mod wheel"; break; case 11: result = "expression"; break; case 71: result = "filter Q"; break; case 74: result = "filter cutoff"; break; case 75: result = "bandwidth"; break; case 76: result = "FM amplitude"; break; case 77: result = "resonance center"; break; case 78: result = "resonance bandwidth"; break; default: result = masterCCtest(cc); break; } return result; } string Config::masterCCtest(int cc) { string result = ""; switch (cc) { case 6: result = "data msb"; break; case 7: result = "volume"; break; case 10: result = "panning"; break; case 38: result = "data lsb"; break; case 64: result = "sustain pedal"; break; case 65: result = "portamento"; break; case 96: result = "data increment"; break; case 97: result = "data decrement"; break; case 98: result = "NRPN lsb"; break; case 99: result = "NRPN msb"; break; case 120: result = "all sounds off"; break; case 121: result = "reset all controllers"; break; case 123: result = "all notes off"; break; default: if (cc < 128) // don't compare with 'disabled' state { if (cc == midi_bank_C) result = "bank change"; else if (cc == midi_bank_root) result = "bank root change"; else if (cc == midi_upper_voice_C) result = "extended program change"; else if (cc == channelSwitchCC) result = "channel switcher"; } break; } return result; } void Config::saveJackSession() { saveSessionData(jackSessionFile); jackSessionFile.clear(); } std::string Config::findHtmlManual() { string namelist = ""; string tempnames = ""; if(file::cmd2string("find /usr/share/doc/ -xdev -type f -name 'yoshimi_user_guide_version' 2>/dev/null", tempnames)) { namelist = tempnames; tempnames = ""; } if(file::cmd2string("find /usr/local/share/doc/ -xdev -type f -name 'yoshimi_user_guide_version' 2>/dev/null", tempnames)) { namelist += tempnames; tempnames = ""; } if(file::cmd2string("find $HOME/.local/share/doc/yoshimi/ -xdev -type f -name 'yoshimi_user_guide_version' 2>/dev/null", tempnames)) namelist += tempnames; //std::cout << "Manual lists\n" << namelist << std::endl; size_t next = 0; string lastversion = ""; string found = ""; string name = ""; string current = ""; while (next != string::npos) { next = namelist.find("\n"); if (next != string::npos) { name = namelist.substr(0, next); current = loadText(name); if (current >= lastversion) { lastversion = current; found = name; } namelist = namelist.substr( next +1); } } return found; } float Config::getConfigLimits(CommandBlock* getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int min = 0; int max = 1; float def{0}; uchar type{TOPLEVEL::type::Integer}; switch (control) { case CONFIG::control::oscillatorSize: min = MIN_OSCIL_SIZE; def = 1024; max = MAX_OSCIL_SIZE; break; case CONFIG::control::bufferSize: min = MIN_BUFFER_SIZE; def = 512; max = MAX_BUFFER_SIZE; break; case CONFIG::control::padSynthInterpolation: break; case CONFIG::control::handlePadSynthBuild: max = 2; break; case CONFIG::control::virtualKeyboardLayout: max = 3; break; case CONFIG::control::XMLcompressionLevel: def = 3; max = 9; break; case CONFIG::control::reportsDestination: break; case CONFIG::control::logTextSize: def = 12; min = 11; max = 100; break; case CONFIG::control::savedInstrumentFormat: max = 3; break; case CONFIG::control::defaultStateStart: break; case CONFIG::control::hideNonFatalErrors: break; case CONFIG::control::showSplash: def = 1; break; case CONFIG::control::logInstrumentLoadTimes: break; case CONFIG::control::logXMLheaders: break; case CONFIG::control::saveAllXMLdata: break; case CONFIG::control::enableGUI: def = 1; break; case CONFIG::control::enableCLI: def = 1; break; case CONFIG::control::enableAutoInstance: def = 1; break; case CONFIG::control::exposeStatus: def = 1; max = 2; break; case CONFIG::control::enableHighlight: break; case CONFIG::control::jackMidiSource: min = 3; // anything greater than max def = textMsgBuffer.push("default"); break; case CONFIG::control::jackPreferredMidi: def = 1; break; case CONFIG::control::jackServer: min = 3; def = textMsgBuffer.push("default"); break; case CONFIG::control::jackPreferredAudio: def = 1; break; case CONFIG::control::jackAutoConnectAudio: def = 1; break; case CONFIG::control::alsaMidiSource: min = 3; def = textMsgBuffer.push("default"); break; case CONFIG::control::alsaPreferredMidi: def = 1; break; case CONFIG::control::alsaAudioDevice: min = 3; def = textMsgBuffer.push("default"); break; case CONFIG::control::alsaPreferredAudio: break; case CONFIG::control::alsaSampleRate: def = 2; max = 3; break; case CONFIG::control::bankRootCC: // runtime midi checked elsewhere def = 0; max = 119; break; case CONFIG::control::bankCC: // runtime midi checked elsewhere def = 32; max = 119; break; case CONFIG::control::enableProgramChange: break; case CONFIG::control::extendedProgramChangeCC: // runtime midi checked elsewhere def = 110; max = 119; break; case CONFIG::control::ignoreResetAllCCs: break; case CONFIG::control::logIncomingCCs: break; case CONFIG::control::showLearnEditor: def = 1; break; case CONFIG::control::enableOmni: break; case CONFIG::control::enableNRPNs: def = 1; break; case CONFIG::control::saveCurrentConfig: break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Misc/Config.h000066400000000000000000000233721506652756400164300ustar00rootroot00000000000000/* Config.h - Configuration file functions Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2023, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef CONFIG_H #define CONFIG_H #include #include #include #include #include #include #include "Misc/Log.h" #include "Misc/Alloc.h" #include "Misc/VerInfo.h" #include "Misc/InstanceManager.h" #include "MusicIO/MusicClient.h" #ifdef GUI_FLTK #include "FL/Fl.H" #endif #include "globals.h" using std::atomic_bool; using std::bitset; using std::string; using std::list; class XMLtree; class XMLStore; class SynthEngine; class Config { // each Config instance is hard wired to a specific SynthEngine instance SynthEngine& synth; public: /** convenience access to the global InstanceManager */ static InstanceManager& instances() { return InstanceManager::get(); } static Config& primary() { return instances().accessPrimaryConfig(); } ~Config() = default; Config(SynthEngine&); // shall not be copied or moved or assigned Config(Config&&) = delete; Config(Config const&) = delete; Config& operator=(Config&&) = delete; Config& operator=(Config const&) = delete; void init(); void populateFromPrimary(); void startupReport(string const& clientName); void announce(); void usage(); void Log(string const& msg, char tostderr = _SYS_::LogNormal); void flushLog(); /** provide a Logger to delegate to this Config / runtime */ Logger const& getLogger(){ return logHandler; } bool loadPresetsList(); bool savePresetsList(); void loadConfig(); bool updateConfig(int control, int value); void initBaseConfig(XMLStore&); void verifyVersion(XMLStore const&); void maybeMigrateConfig(); bool saveMasterConfig(); bool saveInstanceConfig(); bool saveSessionData(string sessionfile); int saveSessionData(char** dataBuffer); bool restoreSessionData(string sessionfile); bool restoreSessionData(const char* dataBuffer, int size); bool restoreJsession(); void setJackSessionSave(int event_type, string const& session_file); float getConfigLimits(CommandBlock*); string testCCvalue(int cc); string masterCCtest(int cc); static void sigHandler(int sig); void setInterruptActive(); void setLadi1Active(); void signalCheck(); void setRtprio(int prio); using ThreadFun = void*(void*); bool startThread(pthread_t*, ThreadFun*, void* arg, bool schedfifo, char lowprio, string const& name = ""); string const& programCmd() { return programcommand; } bool isLV2; bool isMultiFeed; // can produce separate audio feeds for each part (Jack or LV2) uint build_ID; VerInfo loadedConfigVer; bool incompatibleZynFile; static const VerInfo VER_YOSHI_CURR, VER_ZYN_COMPAT; static bool is_compatible (VerInfo const&); static bool showSplash; static bool singlePath; static bool autoInstance; static bitset<32> activeInstances; static int showCLIcontext; atomic_bool runSynth; bool finishedCLI; bool isLittleEndian; int virKeybLayout; audio_driver audioEngine; bool engineChanged; midi_driver midiEngine; bool midiChanged; int alsaMidiType; string audioDevice; string midiDevice; string jackServer; string jackMidiDevice; bool startJack; bool connectJackaudio; bool connectJackChanged; string jackSessionUuid; static string globalJackSessionUuid; string alsaAudioDevice; string alsaMidiDevice; string nameTag; bool loadDefaultState; string defaultStateName; string defaultSession; string configFile; string paramsLoad; string instrumentLoad; uint load2part; string midiLearnLoad; string rootDefine; string stateFile; uint guiThemeID; string guiTheme; string remoteGuiTheme; bool restoreJackSession; string jackSessionFile; int sessionStage; int Interpolation; string presetsDirlist[MAX_PRESETS]; list lastfileseen; bool sessionSeen[TOPLEVEL::XML::ScalaMap + 1]; bool historyLock[TOPLEVEL::XML::ScalaMap + 1]; int xmlType; uchar instrumentFormat; bool enableProgChange; bool toConsole; int consoleTextSize; bool hideErrors; bool showTimes; bool logXMLheaders; bool xmlmax; uint gzipCompression; bool enablePartReports; string guideVersion; uint samplerate; bool rateChanged; uint buffersize; bool bufferChanged; uint oscilsize; bool oscilChanged; bool showGui; bool storedGui; bool guiChanged; bool showCli; bool storedCli; bool cliChanged; bool banksChecked; uchar panLaw; bool configChanged; uchar handlePadSynthBuild; bool useLegacyPadBuild() { return handlePadSynthBuild == 0; } bool usePadAutoApply() { return handlePadSynthBuild == 2; } int rtprio; int midi_bank_root; int midi_bank_C; int midi_upper_voice_C; bool enableOmni; bool enable_NRPN; bool ignoreResetCCs; bool monitorCCin; bool showLearnedCC; uint numAvailableParts; int currentPart; uint currentBank; uint currentRoot; bool bankHighlight; int lastBankPart; int presetsRootID; int tempBank; int tempRoot; #ifdef REPORT_NOTES_ON_OFF int noteOnSent; // note test int noteOnSeen; int noteOffSent; int noteOffSeen; #endif //REPORT_NOTES_ON_OFF uint VUcount; uchar channelSwitchType; uchar channelSwitchCC; uchar channelSwitchValue; uchar nrpnL; uchar nrpnH; uchar dataL; uchar dataH; bool nrpnActive; struct Vectordata{ uchar Xaxis[NUM_MIDI_CHANNELS]; uchar Yaxis[NUM_MIDI_CHANNELS]; uchar Xfeatures[NUM_MIDI_CHANNELS]; uchar Yfeatures[NUM_MIDI_CHANNELS]; uchar Xcc2[NUM_MIDI_CHANNELS]; uchar Ycc2[NUM_MIDI_CHANNELS]; uchar Xcc4[NUM_MIDI_CHANNELS]; uchar Ycc4[NUM_MIDI_CHANNELS]; uchar Xcc8[NUM_MIDI_CHANNELS]; uchar Ycc8[NUM_MIDI_CHANNELS]; string Name[NUM_MIDI_CHANNELS]; int Part; int Controller; bool Enabled[NUM_MIDI_CHANNELS]; }; Vectordata vectordata; list logList; string manualFile; int exitType; /* * These replace local memory allocations that * were being made every time an add or sub note * was processed. Now global so treat with care! */ Samples genTmp1; Samples genTmp2; Samples genTmp3; Samples genTmp4; // as above but for part and sys effect Samples genMixl; Samples genMixr; private: void findManual(); static void* _findManual(void*); pthread_t findManual_Thread; void defaultPresets(); void buildConfigLocation(); bool initFromPersistentConfig(); bool extractBaseParameters(XMLStore&); bool extractConfigData(XMLStore&); void capturePatchState(XMLStore&); bool restorePatchState(XMLStore&); void addConfigXML(XMLStore& xml); void migrateLegacyPresetsList(XMLtree&); void saveJackSession(); string findHtmlManual(); int sigIntActive; int ladi1IntActive; int jsessionSave; const string programcommand; string jackSessionDir; string baseConfig; string presetList; string presetDir; Logger logHandler; friend class YoshimiLV2Plugin; }; /** Convenience function to verify Metadata of loaded XML files */ void postLoadCheck(XMLStore const&, SynthEngine&); #endif /*CONFIG_H*/ yoshimi-2.3.5.1/src/Misc/DataBlockBuff.h000066400000000000000000000102001506652756400176340ustar00rootroot00000000000000/* DataBlockBuff.h - Service to allocate, maintain and exchange blocks of (opaque) data Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef DATA_BLOCK_BUFF_H #define DATA_BLOCK_BUFF_H #include "globals.h" #include #include #include #include using std::chrono::steady_clock; using TimePoint = std::chrono::time_point; using std::chrono_literals::operator ""ms; using std::chrono::duration_cast; using std::chrono::milliseconds; /** * Uninitialised memory block */ template class BufferBlock { alignas(size_t) std::byte buffer[siz]; public: // Standard layout, trivially constructible and copyable void* accessStorage() { return static_cast(&buffer); } template T& accessAs() { static_assert(sizeof(T) <= siz, "insufficient storage in BufferBlock"); return * std::launder (reinterpret_cast(&buffer)); } }; /** * Index entry to organise the contents of the data block ringbuffer */ template struct ItemDescriptor { TimePoint timestamp{}; TAG tag{}; }; /** * A service to manage blocks of data for exchange through a communication protocol. * @warning destructor for data blocks in the buffer will *not* be invoked */ template class DataBlockBuff { using Index = std::array, cap>; using Buffer = std::array, cap>; Index index; Buffer buffer; size_t oldest; // must not be copied nor moved DataBlockBuff(DataBlockBuff &&) =delete; DataBlockBuff(DataBlockBuff const&) =delete; DataBlockBuff& operator=(DataBlockBuff &&) =delete; DataBlockBuff& operator=(DataBlockBuff const&) =delete; public: DataBlockBuff() : index{} , oldest{0} { } size_t claimNextBuffer(TAG const& tag) { index[oldest].timestamp = steady_clock::now(); index[oldest].tag = tag; size_t curr{oldest}; oldest = incWrap(oldest); return curr; } milliseconds entryAge(size_t idx) { return duration_cast(steady_clock::now () - index[idx].timestamp); } TAG const& getRoutingTag(size_t idx) { return index[idx].tag; } template DAT& accessSlot(size_t idx) { assert(idx < cap); assert(index[idx].tag.template verifyType()); return buffer[idx].template accessAs(); } void* accessRawStorage(size_t idx) { assert(idx < cap); return buffer[idx].accessStorage(); } private: /** increment index, but wrap at array end. * @remark using the array cyclically */ size_t incWrap(size_t idx, size_t inc = 1) { return (idx + inc) % cap; } }; /* ==== Helper to calculate buffer sizes at compile time ==== */ /* a compile time sequence of types */ template struct Types{ }; /* Metafunction: find the largest size requirement over a sequence of types */ template struct MaxSize; template<> struct MaxSize> { static constexpr size_t value = 0; }; template struct MaxSize> { static constexpr size_t thisval = sizeof(TY); static constexpr size_t nextval = MaxSize>::value; static constexpr size_t value = nextval > thisval? nextval:thisval; }; #endif /*DATA_BLOCK_BUFF_H*/ yoshimi-2.3.5.1/src/Misc/FileMgrFuncs.h000066400000000000000000000573131506652756400175510ustar00rootroot00000000000000/* FileMgr.h - all file operations Copyright 2019-2024 Will Godfrey and others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef FILEMGR_H #define FILEMGR_H #include #include // this affects error reporting #include #include #include #include #include #include #include #include #include #include #include #include #include #include "globals.h" #define OUR_PATH_MAX 4096 /* * PATH_MAX is a poorly defined constant, and not very * portable. As this is only used for a simple tightly * defined purpose we set a value to replace it that * should be safe for any reasonable architecture. */ /* * If changing filesystems it may be necessary to provide * a translation of directory and file leaf separators as * well as file extension markers. * These are used as spilt points in other code areas. */ namespace EXTEN { using std::string; const string config = ".config"; const string instance = ".instance"; const string validBank = ".bankdir"; const string history = ".history"; const string zynInst = ".xiz"; const string yoshInst = ".xiy"; const string anyInst = ".xi*"; const string patchset = ".xmz"; const string state = ".state"; const string presets = ".xpz"; const string scale = ".xsz"; const string scalaTuning = ".scl"; const string scalaKeymap = ".kbm"; const string vector = ".xvy"; const string mlearn = ".xly"; const string MSwave = ".wav"; const string lists = ".list"; const string theme = ".clr"; }//(End)namespace EXTEN namespace file { using std::string; using std::stringstream; // Marker used for instance config when started as LV2 plugin const string LV2_INSTANCE = "LV2"; // make a filename legal inline void make_legit_filename(string& fname) { for (unsigned int i = 0; i < fname.size(); ++i) { char c = fname.at(i); if (!((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '-' || c == ' ' || c == '.')) fname.at(i) = '_'; } } // make a complete path extra legal inline void make_legit_pathname(string& fname) { for (unsigned int i = 0; i < fname.size(); ++i) { char c = fname.at(i); if (!((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '/' || c == '.')) fname.at(i) = '_'; } } /* * tries to find build time doc directory * currently only used to find the latest user guide */ inline string localPath() { char *tmpath; tmpath = (char*) malloc(OUR_PATH_MAX); getcwd (tmpath, OUR_PATH_MAX); string path = string(tmpath); free(tmpath); size_t found = path.rfind("/"); if (found != string::npos) path = path.substr(0, found + 1) + "doc"; else path = ""; return path; } /* * this now returns the last modified time which can * never be zero so can represent 'true' */ inline size_t isRegularFile(string const& chkpath) { struct stat st; if (!stat(chkpath.c_str(), &st)) if (S_ISREG(st.st_mode)) return st.st_mtime; return 0; } /* * this now returns the last modified time which can * never be zero so can represent 'true' */ inline size_t isDirectory(string const& chkpath) { struct stat st; if (!stat(chkpath.c_str(), &st)) { if (S_ISDIR(st.st_mode)) return st.st_mtime; } return false; } /* performs specific OS command * optionally returning a multi-line response */ inline bool cmd2string(std::string cmd) { FILE* fp = popen(cmd.c_str(), "r"); if(fp) { pclose(fp); return true; } return false; } inline bool cmd2string(std::string cmd, string& result) { bool isok = false; FILE* fp = popen(cmd.c_str(), "r"); if(fp) { std::vector buffer(OUR_PATH_MAX); std::size_t n = fread(buffer.data(), 1, buffer.size(), fp); if(n && n < buffer.size()) { buffer.data()[n] = 0; result = buffer.data(); } pclose(fp); isok = true; } return isok; } /* * This performs the actual file operations for preset management */ inline bool presetsList(string dirname, string const& type, std::vector& presets) { int presetk = 0; string ftype = "." + type + EXTEN::presets; presets.clear(); DIR *dir = opendir(dirname.c_str()); if (dir == NULL) return false; struct dirent *fn; while ((fn = readdir(dir))) { string filename = string(fn->d_name); if (filename.find(ftype) == string::npos) { continue; } if (dirname.at(dirname.size() - 1) != '/') dirname += "/"; presets.push_back(dirname + filename); presetk++; if (presetk >= MAX_PRESETS) { closedir(dir); return true; } } closedir(dir); return true; } /* * This is only intended for calls on the local filesystem * and to known locations, so buffer size should be adequate * and it avoids dependency on unreliable macros. */ inline string findFile(string const& path, string const& filename, string extension) { if (extension.at(0) != '.') extension = "." + extension; string command = "find " + path + " -name " + filename + extension + " 2>/dev/null -print -quit"; //#pragma message "Using '2>/dev/null' here suppresses *all* error messages" // it's done here to suppress warnings of invalid locations FILE *fp = popen(command.c_str(), "r"); if (fp == NULL) return ""; char line[OUR_PATH_MAX]; fscanf(fp,"%[^\n]", line); pclose(fp); string fullName(line); unsigned int name_start = fullName.rfind("/") + 1; // Extension might contain a dot, like e.g. '.pdf.gz' unsigned int name_end = fullName.length() - extension.length(); fullName = fullName.substr(name_start, name_end - name_start); if (fullName == filename) return line; return ""; } inline string findLeafName(string const& name) { unsigned int name_start; unsigned int name_end; name_start = name.rfind("/"); name_end = name.rfind("."); return name.substr(name_start + 1, name_end - name_start - 1); } inline string findExtension(string const& name) { size_t point = name.rfind('.'); if (point == string::npos) return ""; string exten = name.substr(point); if (exten.find('/') != string::npos) return ""; // not acceptable as an extension! return exten; } // adds or replaces wrong extension with the right one. inline string setExtension(string const& fname, string ext) { if (ext.at(0) != '.') ext = "." + ext; string tmp; // return value size_t ext_pos = fname.rfind('.'); // period, if any size_t slash_pos = fname.rfind('/'); // UNIX path-separator if (slash_pos == string::npos) { // There are no slashes in the string, therefore the last period, if // any, must be at the position of the extension period. ext_pos = fname.rfind('.'); if (ext_pos == string::npos || ext_pos == 0) { // There is no period, therefore there is no extension. // Append the extension. tmp = fname + ext; } else { // Replace everything after the last period. tmp = fname.substr(0, ext_pos); tmp += ext; } } else { // If the period precedes the slash, then it is not the extension. // Add the whole extension. Otherwise, replace the extension. if (slash_pos > ext_pos) tmp = fname + ext; else { tmp = fname.substr(0, ext_pos); tmp += ext; } } return tmp; } inline bool copyFile(string const& source, string const& destination, char option) { // options // 0 = only write if not already present // 1 = always write / overwrite // 2 = only write if newer if (option == 0) { if (isRegularFile(destination)) { return 0; // treated as a successful write when copying banks } } struct stat sourceInfo; stat(source.c_str(), &sourceInfo); if (option == 2) { if (isRegularFile(destination)) { struct stat destInfo; stat(destination.c_str(), &destInfo); if (sourceInfo.st_mtime <= destInfo.st_mtime) { return 0; // it's already the newest } } } std::ifstream infile (source, std::ios::in|std::ios::binary|std::ios::ate); if (!infile.is_open()) return 1; std::ofstream outfile (destination, std::ios::out|std::ios::binary); if (!outfile.is_open()) return 3; std::streampos size = infile.tellg(); char *memblock = new char [size]; infile.seekg (0, std::ios::beg); infile.read(memblock, size); infile.close(); outfile.write(memblock, size); outfile.close(); delete[] memblock; if (option == 2) { struct timespec ts[2]; ts[1].tv_sec = (sourceInfo.st_mtime % 10000000000); ts[1].tv_nsec = (sourceInfo.st_mtime / 10000000000); utimensat(0, destination.c_str(), ts, 0); } return 0; } inline uint32_t copyDir(string const& source, string const& destination, char option) { DIR *dir = opendir(source.c_str()); if (dir == NULL) return 0xffffffff; struct dirent *fn; int count = 0; int missing = 0; while ((fn = readdir(dir))) { string nextfile = string(fn->d_name); if (!isRegularFile(source + "/" + nextfile)) continue; if (nextfile == "." || nextfile == "..") continue; if (copyFile(source + "/" + nextfile, destination + "/" + nextfile, option)) ++missing; else ++count; } closedir(dir); return count | (missing << 16); } /* * this fills the given list with all contents removing the * directory management from the calling functions. */ inline int listDir(std::list* dirList, string const& dirName) { DIR *dir = opendir(dirName.c_str()); if (dir == NULL) return 0xffffffff; struct dirent *fn; int count = 0; while ((fn = readdir(dir))) { string name = fn->d_name; if (!name.empty() && name != "." && name != "..") { dirList->push_back(name); ++count; } } closedir(dir); return count; } /* * Counts all the objects within the directory. */ inline int countDir(const std::string dirName) { DIR *dir = opendir(dirName.c_str()); if (dir == NULL) return -1; struct dirent *fn; int count = 0; char dir1[2] = {'.', 0}; char dir2[3] = {'.', '.', 0}; while ((fn = readdir(dir))) { if (fn->d_type == DT_DIR) { if (strcmp(fn->d_name, dir1) !=0 && strcmp(fn->d_name, dir2) !=0) ++ count; } } closedir(dir); return count; } /* * We return the contents as sorted, sequential lists in directories * and files of the required type as a series of leaf names (as the * root directory is already known). This reduces the size of the * string to a manageable length. * Directories are prefixed to make them easier to identify. */ inline void dir2string(string &wanted, string currentDir, string exten, int opt = 0) { // options // &1 allow hidden dirs // &2 allow hidden files // &4 allow wildcards // &8 hide all subdirectories // &16 hide files (just looking for dirs) std::list build; wanted = ""; uint32_t found = listDir(&build, currentDir); if (found == 0xffffffff) return; if (build.size() > 1) build.sort(); if(currentDir.back() != '/') currentDir += '/'; string line; if (!(opt & 8)) { for (std::list::iterator it = build.begin(); it != build.end(); ++it) { // get directories if ((opt & 1) || string(*it).front() != '.') // no hidden dirs { line = *it; if (line.back() != '/') line += '/'; if (isDirectory(currentDir + line)) wanted += ("Dir: " + line + "\n"); } } } if (opt & 16) { build.clear(); return; } // int to suppress clang compiler warning bool instype = (int(exten == ".xiz") | (exten == ".xiy") | (exten == ".xi*")); string last; last.clear(); for (std::list::iterator it = build.begin(); it != build.end(); ++it) { // get files if ((opt & 2) || string(*it).front() != '.') // no hidden files { string next; line = currentDir + *it; if (isRegularFile(line)) { next.clear(); if ((opt & 4)) { next = *it; if (!next.empty()) wanted += (next + "\n"); } else { if (instype) { if (findExtension(line) == ".xiy" || findExtension(line) == ".xiz") next = *it; } else { if (findExtension(line) == exten) next = *it; } // remove the extension, the source knows what it is // and it must exist to have been found! if (!next.empty()) { size_t pos = next.rfind('.'); next = next.substr(0, pos); // also remove instrument type duplicates if (next != last) { last = next; wanted += (next + "\n"); } } } } } } build.clear(); } inline string saveGzipped(const char* data, string const& filename, int compression) { char options[10]; snprintf(options, 10, "wb%d", compression); gzFile gzfile; gzfile = gzopen(filename.c_str(), options); if (gzfile == NULL) return "gzopen() == NULL"; int res = gzputs(gzfile, data); gzclose(gzfile); return res<0? "Failure writing compressed data": ""; } inline ssize_t saveData(char *buff, size_t bytes, string const& filename) { int writefile = open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (writefile < 0) { return 0; } ssize_t written = write(writefile, buff, bytes); close (writefile); return written; } inline bool saveText(string const& text, string const& filename) { FILE *writefile = fopen(filename.c_str(), "w"); if (!writefile) return 0; fputs(text.c_str(), writefile); fclose (writefile); return 1; } inline string loadGzipped(string const& filename, string& report) { const int BUF_SIZE = 4096; stringstream readStream; gzFile gzf = gzopen(filename.c_str(), "rb"); if (not gzf) report = ("Failed to open file " + filename + " for load: " + string(strerror(errno))); else { int readFlag{1}; while (readFlag > 0) { std::array fetchBuf{0}; readFlag = gzread(gzf, fetchBuf.data(), BUF_SIZE); if (readFlag > 0) readStream << fetchBuf.data(); } if (readFlag < 0) { int errnum{0}; report = ("Read error in zlib: " + string(gzerror(gzf, &errnum))); if (errnum == Z_ERRNO) report = ("Filesystem error: " + string(strerror(errno))); } gzclose(gzf); } return readStream.str(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////TODO 4/25 : old version --> obsolete after switch to XMLStore inline char * loadGzipped_OBSOLETE_(string const& _filename, string * report) { string filename = _filename; char *data = NULL; gzFile gzf = gzopen(filename.c_str(), "rb"); if (!gzf) { *report = ("Failed to open file " + filename + " for load: " + string(strerror(errno))); return NULL; } const int bufSize = 4096; char fetchBuf[4097]; int this_read; int total_bytes = 0; stringstream readStream; for (bool quit = false; !quit;) { memset(fetchBuf, 0, sizeof(fetchBuf) * sizeof(char)); this_read = gzread(gzf, fetchBuf, bufSize); if (this_read > 0) { readStream << fetchBuf; total_bytes += this_read; } else if (this_read < 0) { int errnum; *report = ("Read error in zlib: " + string(gzerror(gzf, &errnum))); if (errnum == Z_ERRNO) *report = ("Filesystem error: " + string(strerror(errno))); quit = true; } else if (total_bytes > 0) { data = new char[total_bytes + 1]; if (data) { memset(data, 0, total_bytes + 1); memcpy(data, readStream.str().c_str(), total_bytes); } quit = true; } } gzclose(gzf); //*report = "it looks like we successfully loaded" + filename; return data; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////TODO 4/25 : old version --> obsolete after switch to XMLStore /* * This is used for text files, preserving individual lines. These can * then be split up by the receiving functions without needing a file * handle, or any knowledge of the file system. * * All leading and trailing whitespace is removed, as well as line-end * variations. Blank lines are removed, and a single newline character * is added to the end of each remaining line. */ inline string loadText(string const& filename) { FILE *readfile = fopen(filename.c_str(), "r"); if (!readfile) return ""; string text = ""; char line [OUR_PATH_MAX]; // no Yoshimi input text lines should get anywhere near this! while (!feof(readfile)) { string rawline = ""; if (fgets(line , OUR_PATH_MAX , readfile)) { rawline = string(line); while (rawline.length() > 0 && rawline[0] < '!') rawline.erase(0, 1); if(rawline.length() > 0) { while (rawline.length() > 0 && rawline[rawline.length() - 1] < ' ') { rawline.pop_back(); } text += (rawline + '\n'); } } } fclose (readfile); return text; } inline bool createEmptyFile(string const& filename) { // not currently used now std::fstream file; file.open(filename, std::ios::out); if (!file) return false; file.close(); return true; } inline bool createDir(string const& dirname) { if (isDirectory(dirname)) return false; // don't waste time. it's already here! size_t pos = 1; size_t oldPos = pos; string nextDir; bool failed = false; while (pos != string::npos && failed == false) { pos = dirname.find("/", oldPos); if (pos == string::npos) nextDir = dirname; else { nextDir = dirname.substr(0, pos).c_str(); oldPos = pos + 1; } if (!isDirectory(nextDir)) failed = mkdir(nextDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); } return failed; } /* * The following two functions are currently identical for * linux but that may not always be true nor possibly other * OSs/filers, so you should always use the correct one. */ inline bool deleteFile(string const& filename) { bool isOk = remove(filename.c_str()) == 0; return isOk; } inline bool deleteDir(string const& filename) { bool isOk = remove(filename.c_str()) == 0; return isOk; } /* * The following two functions are currently identical for * linux but that may not always be true nor possibly other * OSs/filers, so you should always use the correct one. */ inline bool renameFile(string const& oldname, string const& newname) { bool isOk = rename(oldname.c_str(), newname.c_str()) == 0; return isOk; } inline bool renameDir(string const& oldname, string const& newname) { bool isOk = rename(oldname.c_str(), newname.c_str()) == 0; return isOk; } // replace build directory with a different // one in the compilation directory inline string extendLocalPath(string const& leaf) { char* tmpath = getcwd (NULL, 0); if (tmpath == NULL) return ""; string path(tmpath); free(tmpath); size_t found = path.rfind("yoshimi"); if (found == string::npos) return ""; size_t next = path.find('/', found); if (next == string::npos) return ""; return path.substr(0, next) + leaf; } inline string userHome() { string home = string(getenv("HOME")); if (home.empty() || !isDirectory(home)) home = string("/tmp"); return home + '/'; } inline string localDir() { string local = userHome() + ".local/share/" + YOSHIMI; if (!isDirectory(local)) { if (createDir(local)) local = ""; } return local; } inline string configDir() { string config = userHome() + string(EXTEN::config) + "/" + YOSHIMI; if (!isDirectory(config)) { if (createDir(config)) config = ""; } return config; } /* * Tries to find the most relevant entry for example files. * "leafname" can include a subdirectory such as "themes/demo" * The build path is likely to be the most recent but either * of .local or the distro install path could be next. */ inline string findExampleFile(string leafname) { string dir = localPath(); string fullname = ""; if (!dir.empty()) { string tmp = dir + "/examples/" + leafname; if (isRegularFile(tmp)) fullname = tmp; } if (fullname.empty()) { dir = localDir(); if (!dir.empty()) { string tmp = dir + "/themes/" + leafname; if (isRegularFile(tmp)) fullname = tmp; } if (fullname.empty()) { string tmp = "/usr/local/share/" + string(YOSHIMI) + "/examples/" + leafname; if (isRegularFile(tmp)) fullname = tmp; } if (fullname.empty()) { string tmp = "/usr/share/" + string(YOSHIMI) + "/examples/" + leafname; if (isRegularFile(tmp)) fullname = tmp; } } return fullname; } }//(End)namespace file #endif /*FILEMGR_H*/ yoshimi-2.3.5.1/src/Misc/FormatFuncs.h000066400000000000000000000205071506652756400174470ustar00rootroot00000000000000/* FormatFuncs.h Copyright 2010, Alan Calvert Copyright 2014-2023, Will Godfrey and others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef FORMATFUNCS_H #define FORMATFUNCS_H #include #include #include #include #include #include namespace func { inline std::string asString(int n) { std::ostringstream oss; oss << n; return std::string(oss.str()); } inline std::string asString(long long n) { std::ostringstream oss; oss << n; return std::string(oss.str()); } inline std::string asString(unsigned long n) { std::ostringstream oss; oss << n; return std::string(oss.str()); } inline std::string asString(long n) { std::ostringstream oss; oss << n; return std::string(oss.str()); } inline std::string asString(uint n) { std::ostringstream oss; oss << n; return std::string(oss.str()); } inline std::string asString(uint n, uint width) { std::ostringstream oss; oss << n; std::string val = std::string(oss.str()); if (width && val.size() < width) { val = std::string("000000000") + val; return val.substr(val.size() - width); } return val; } inline std::string asString(uchar c) { std::ostringstream oss; oss.width(1); oss << c; return oss.str(); } inline std::string asString(bool yes) { return yes? "true":"false"; } inline std::string asString(float n) { std::ostringstream oss; oss.precision(3); oss.width(3); oss << n; return oss.str(); } inline std::string asLongString(float n) { std::ostringstream oss; oss.precision(9); oss.width(9); oss << n; return oss.str(); } inline std::string asCompactString(float n) { std::ostringstream oss; oss.setf(std::ios_base::fixed, std::ios_base::floatfield); oss.precision(1); oss.width(1); oss << n; return oss.str(); } inline std::string asHexString(int x) { std::ostringstream oss; oss << std::hex << x; std::string res = std::string(oss.str()); if (res.length() & 1) return "0"+res; return res; } inline std::string asHexString(unsigned int x) { std::ostringstream oss; oss << std::hex << x; std::string res = std::string(oss.str()); if (res.length() & 1) return "0"+res; return res; } inline std::string asMidiNoteString(unsigned char n) { static std::string note[] = { "C","C#","D","D#","E","F","F#","G","G#","A","B","B#" }; int octave = -1 + n/12; int key = n % 12; return "("+note[key]+asString(octave)+")"; } inline std::string asExactBitstring(float f) { union { float value; uint32_t raw32bit; } converter; converter.value = f; std::ostringstream format; format << "0x" // ensure prefix for zero, and lower case 'x' << std::hex << std::noshowbase << std::uppercase << std::setw(4*2) // need 2 hex digits per byte << std::setfill('0') << converter.raw32bit; return format.str(); } inline float bitstring2float(std::string str) { union { float value; uint32_t raw32bit; } converter; std::istringstream parser(str); uint32_t rawVal; parser >> std::hex >> rawVal; converter.raw32bit = rawVal; return converter.value; } inline float string2float(std::string str) { std::istringstream parser(str); float fval; parser >> fval; return fval; } inline double string2double(std::string str) { std::istringstream parser(str); double dval; parser >> dval; return dval; } inline double string2bool(std::string str) { if (str.length() > 0) { // ASCII and compatible to lowercase char lead = str[0] | 0x20; return lead == 't' or lead == 'y' or lead == '1'; } return false; } inline bool isDigits(std::string str) { if (str.empty()) return false; char c = str.at(0); if (c < '0' or c > '9') return false; return true; } inline int string2int(std::string str) { std::istringstream parser(str); int intval; parser >> intval; return intval; } inline uint string2uint(std::string str) { std::istringstream parser(str); uint intval; parser >> intval; return intval; } inline int64_t string2int64(std::string str) { std::istringstream parser(str); int64_t longval; parser >> longval; return longval; } inline uint32_t string2uint32(std::string str) { std::istringstream parser(str); uint32_t u32val; parser >> u32val; return u32val; } /* ensures MIDI compatible numbers without errors */ inline int string2int127(std::string str) { std::istringstream parser(str); int intval; parser >> intval; if (intval < 0) intval = 0; else if (intval > 127) intval = 127; return intval; } /* * turns the 1st count number to upper case * all the rest to lower case */ inline std::string stringCaps(std::string str, int count) { int idx = 0; char c; while (str[idx]) { c = str[idx]; if (idx < count) str.replace(idx, 1, 1, toupper(c)); else str.replace(idx, 1, 1, tolower(c)); idx ++; } return str; } /* this is not actually a file operation so we keep it here */ inline int findSplitPoint(std::string name) { unsigned int chk = 0; char ch = name.at(chk); unsigned int len = name.length() - 1; while (ch >= '0' and ch <= '9' and chk < len) { chk += 1; ch = name.at(chk); } if (chk >= len) return 0; if (ch != '-') return 0; return chk; } /* * This is principally used to format strings for the GUI * where they are fitted into windows with limited width. * However, it may be useful elsewhere. */ inline std::string formatTextLines(std::string text, size_t maxLen) { size_t totalLen = text.length(); if (totalLen < maxLen) return text; size_t pos = 0; size_t ref = 0; while (pos < totalLen) // split overlong words first { if (text.at(pos) < '!') { ++ pos; ref = pos; } if ((pos - ref) > maxLen) { text.insert(pos, 1, '\n'); ++ totalLen; ++ pos; ref = pos; } ++pos; } pos = 0; ref = 0; size_t lastSpace = 0; while (pos < text.length()) { if (text.at(pos) == '\n') // skip over existing line ends { ++ pos; ref = pos; lastSpace = 0; } else if (text.at(pos) == ' ') lastSpace = pos; if ((pos - ref) >= maxLen) { if (lastSpace == 0) pos = text.length(); else { text.at(lastSpace)= '\n'; ref = lastSpace; lastSpace = 0; } } ++ pos; } while (text.at(text.length() - 1) < '!') // tidy up text.pop_back(); return text; } inline std::string nextLine(std::string& list) // this is destructive { // currently only used in main size_t pos = list.find('\n'); std::string line = ""; if (pos == std::string::npos) { line = list; list = ""; } else { line = list.substr(0, pos); ++pos; if (pos > list.size()) list = ""; else list = list.substr(pos); } return line; } inline std::string trimEnds(std::string line) { size_t pos = line.find_first_not_of(" \t"); if (pos != std::string::npos) line.erase(0, pos); pos = line.find_last_not_of(" \t"); if (pos != std::string::npos) line.erase(pos + 1); return line; } }//(End)namespace func #endif /*FORMATFUNCS_H*/ yoshimi-2.3.5.1/src/Misc/Hash.h000066400000000000000000000052231506652756400161010ustar00rootroot00000000000000/* Hash.h - Helpers for working with hashes, type tags and object identities Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef HASH_H #define HASH_H #include #include namespace func { namespace { template= 8)> // for 64bit systems struct HashCombineImpl { static void calc(size_t& seed, size_t hash) { seed ^= hash + 0x9e3779b97f4a7c15 + (seed << 6) + (seed >> 2); } // ^^ this is the mantissa of 1/Φ (golden ratio) }; template<> struct HashCombineImpl // fallback: the classic boost impl for 32bit { static void calc(size_t& seed, size_t hash) { seed ^= hash + 0x9e3779b9 + (seed << 6) + (seed >> 2); } }; ////////TODO C++17 : once we upgrade, we could use constexpr-if instead of this template switch } /** * Combine hash values. * There is still no solution available in the C++ standard and discussions are ongoing, * because it is hard to find a balance between good quality and performance. * - See ​Peter Dimov's Answer on Reddit: https://www.reddit.com/r/cpp/comments/1225m8g/comment/jdraigr/ * - The ​»Unordered Hash Conundrum«: https://web.archive.org/web/20181003190331/https://bajamircea.github.io/coding/cpp/2017/06/09/unordered-hash.html * - Stackoverflow: ​boost::hash_combine (not) the best solution: https://stackoverflow.com/a/50978188/444796 * * This function is essentially the boost implementation of hash_combine, with a 32bit / 64bit variant * See: https://stackoverflow.com/questions/5889238/why-is-xor-the-default-way-to-combine-hashes#comment83288287_27952689 */ inline void hash_combine(size_t& seed, size_t hash) { HashCombineImpl<>::calc (seed, hash); } /** * @return a standard hash value, based on the full (mangled) C++ type name */ template inline size_t getTypeHash() { return typeid(TY).hash_code(); } }//(End)namespace func #endif /*HASH_H*/ yoshimi-2.3.5.1/src/Misc/InstanceManager.cpp000066400000000000000000000565531506652756400206240ustar00rootroot00000000000000/* InstanceManager.h - manage lifecycle of Synth-Engine instances Copyright 2024, Ichthyostega Based on existing code from main.cpp Copyright 2009-2011, Alan Calvert Copyright 2014-2021, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #include "Misc/InstanceManager.h" #include "Misc/SynthEngine.h" #include "MusicIO/MusicClient.h" #include "Misc/FormatFuncs.h" #include "Misc/Util.h" #ifndef YOSHIMI_LV2_PLUGIN #include "Misc/CmdOptions.h" #include "Misc/TestInvoker.h" #endif #ifdef GUI_FLTK #include "MasterUI.h" #endif #include #include #include #include #include #include #include #include #include #include using std::string; using std::function; using std::make_unique; using std::unique_ptr; using std::for_each; using std::move; using std::cout; using std::endl; using func::asString; using util::contains; using util::isLimited; using Guard = const std::lock_guard; namespace { // implementation details... // Maximum number of SynthEngine instances allowed. // Historically, this limit was imposed due to using a 32bit field; // theoretically this number is unlimited, yet in practice, the system's // available resources will likely impose an even stricter limit... const uint MAX_INSTANCES = 32; /** Combinations to try, in given order, when booting an instance */ auto drivers_to_probe(Config const& current) { using Scenario = std::pair; return std::array{Scenario{current.audioEngine, current.midiEngine} ,Scenario{jack_audio, alsa_midi} ,Scenario{jack_audio, jack_midi} ,Scenario{alsa_audio, alsa_midi} ,Scenario{jack_audio, no_midi} ,Scenario{alsa_audio, no_midi} ,Scenario{no_audio, alsa_midi} ,Scenario{no_audio, jack_midi} ,Scenario{no_audio, no_midi}//this one always will do the work :) }; } string display(audio_driver audio) { switch (audio) { case no_audio : return "no_audio"; case jack_audio : return "jack_audio"; case alsa_audio : return "alsa_audio"; default: throw std::logic_error("Unknown audio driver ID"); } } string display(midi_driver midi) { switch (midi) { case no_midi : return "no_midi"; case jack_midi : return "jack_midi"; case alsa_midi : return "alsa_midi"; default: throw std::logic_error("Unknown MIDI driver ID"); } } /** * Instance Lifecycle */ enum LifePhase { PENDING = 0, BOOTING, RUNNING, WANING, DEFUNCT }; } /** * An instance of the Synth-Engine, * packaged together with a MusicClient * and marked with lifecycle (#LifePhase) state. */ class InstanceManager::Instance { unique_ptr synth; unique_ptr client; LifePhase state{PENDING}; public: // can be moved and swapped, but not copied... Instance(Instance&&) = default; Instance(Instance const&) = delete; Instance& operator=(Instance&&) = delete; Instance& operator=(Instance const&) = delete; Instance(uint id); ~Instance(); bool startUp(PluginCreator =PluginCreator()); void shutDown(); void enterRunningState(); void startGUI_forApp(); SynthEngine& getSynth() { return *synth; } MusicClient& getClient() { return *client; } InterChange& interChange() { return synth->interchange; } Config& runtime() { return synth->getRuntime(); } LifePhase getState() const { return state; } uint getID() const { return synth->getUniqueId(); } bool isPrimary() const { return 0 == getID(); } void triggerPostBootHook(); void registerAudioPorts(); }; /** * A housekeeper and caretaker responsible for clear-out of droppings. * - maintains a registry of all engine instances, keyed by Synth-ID * - the dutyCycle watches and drives instance lifecycle * - operates a running state duty cycle */ class InstanceManager::SynthGroom { std::mutex mtx; using Table = std::map; Table registry; Instance* primary{nullptr}; public: // can be moved and swapped, but not copied... ~SynthGroom() = default; SynthGroom(SynthGroom &&) = default; SynthGroom(SynthGroom const&) = delete; SynthGroom& operator=(SynthGroom &&) = delete; SynthGroom& operator=(SynthGroom const&) = delete; // can be default created SynthGroom() = default; Instance& getPrimary() { assert(primary); return *primary; } uint instanceCnt() const { return registry.size(); } Instance& find(uint); Instance& createInstance(uint instanceID =0); void dutyCycle(function& handleEvents); void shutdownRunningInstances(); void persistRunningInstances(); void discardInstance(uint); void startGUI_forLV2(uint, string); private: void clearZombies(); void handleStartRequest(); uint allocateID(uint); }; InstanceManager::InstanceManager() : groom{make_unique()} { } InstanceManager::~InstanceManager() { } /** Create Synth-Engine and back-end connector for a given ID, * possibly loading an existing config for that ID. * @remark Engines are created but not yet activated */ InstanceManager::Instance::Instance(uint id) : synth{make_unique(id)} , client{make_unique(*synth)} { } /** @note unwinding of instances happens automatically by destructor. * Yet shutDown() can be invoked explicitly for secondary instances. */ InstanceManager::Instance::~Instance() { if (synth and state == RUNNING) try { shutDown(); } catch(...) {/* ignore */} } Config& InstanceManager::accessPrimaryConfig() { return groom->getPrimary().runtime(); } SynthEngine& InstanceManager::findSynthByID(uint id) { return groom->find(id).getSynth(); } InstanceManager::Instance& InstanceManager::SynthGroom::find(uint id) { auto entry = registry.find(id); if (entry != registry.end()) return entry->second; assert(primary); return *primary; } InstanceManager::Instance& InstanceManager::SynthGroom::createInstance(uint instanceID) { Guard lock(mtx); instanceID = allocateID(instanceID); Instance newEntry{instanceID}; auto& instance = registry.emplace(instanceID, move(newEntry)) .first->second; if (!primary) primary = & instance; return instance; } /** boot up this engine instance into working state. * - probe a working IO / client setup * - init the SynthEngine * - start the IO backend * @param pluginCreator (optional) a functor to attach to an external host (notably LV2). * If _not_ given (which is the default for standalone Yoshimi), then several * combinations of ALSA and Jack are probed to find a working backend. * @return `true` on success * @note after a successful boot, `state == BOOTING`, * which enables some post-boot-hooks to run, * and notably prompts the GUI to become visible; * after that, the state will transition to `RUNNING`. * However, if boot-up fails, `state == EXPIRING` and * further transitioning to `DEFUNCT` after shutdown. */ bool InstanceManager::Instance::startUp(PluginCreator pluginCreator) { cout << "\nStart-up Synth-Instance("<< getID() << ")..."<< endl; state = BOOTING; bool isLV2 = bool(pluginCreator); runtime().isLV2 = isLV2; runtime().loadConfig(); assert (not runtime().runSynth); if (isLV2) { runtime().Log("\n----Start-LV2-Plugin--ID("+asString(getID())+")----"); runtime().init(); if (client->open(pluginCreator)) runtime().runSynth = true; } else { auto configuredAudio = runtime().audioEngine; auto configuredMidi = runtime().midiEngine; for (auto [tryAudio,tryMidi] : drivers_to_probe(runtime())) { runtime().Log("\n-----Connect-attempt----("+display(tryAudio)+"/"+display(tryMidi)+")----"); runtime().audioEngine = tryAudio; runtime().midiEngine = tryMidi; runtime().init(); if (client->open(tryAudio, tryMidi)) { if (tryAudio == configuredAudio and tryMidi == configuredMidi) runtime().configChanged = true; runtime().runSynth = true; // mark as active and enable background threads runtime().Log("-----Connect-SUCCESS-------------------\n"); runtime().Log("Using "+display(tryAudio)+" for audio and "+display(tryMidi)+" for midi", _SYS_::LogError); break; } } } if (not runtime().runSynth) runtime().Log("Failed to instantiate MusicClient",_SYS_::LogError); else { if (not synth->Init(client->getSamplerate(), client->getBuffersize())) runtime().Log("SynthEngine init failed",_SYS_::LogError); else { // discover persistent bank file structure synth->installBanks(); if (isPrimary()) { synth->loadHistory(); synth->getRuntime().maybeMigrateConfig(); } // // Note: the following launches or connects to the processing threads if (not client->start()) runtime().Log("Failed to start MusicIO",_SYS_::LogError); else {// engine started successfully.... #ifdef GUI_FLTK if (runtime().showGui) synth->setWindowTitle(client->midiClientName()); else runtime().toConsole = false; #else runtime().toConsole = false; #endif runtime().startupReport(client->midiClientName()); if (isPrimary()) cout << "\nYay! We're up and running :-)\n"; else cout << "\nStarted Synth-Instance("<< getID() << ")\n"; state = BOOTING; if (isLV2) enterRunningState(); assert (runtime().runSynth); return true; } } } auto failureMsg = isLV2? string{"Failed to start Yoshimi as LV2 plugin"} : string{"Bail: Yoshimi stages a strategic retreat :-("}; runtime().Log(failureMsg, _SYS_::LogError); shutDown(); return false; } /** * ensure the instance ends active operation... * - signal all background threads to stop * - possibly disconnect from audio/MIDI (blocking!) * - mark instance for clean-up */ void InstanceManager::Instance::shutDown() { state = WANING; cout << "Stopping Synth-Instance("<< getID() << ")..."<< endl; runtime().runSynth.store(false, std::memory_order_release); // signal to synth and background threads synth->saveBanks(); client->close(); // may block until background threads terminate runtime().flushLog(); state = DEFUNCT; } /** install and start-up the primary SynthEngine and runtime */ bool InstanceManager::bootPrimary(int argc, char *argv[]) { #ifndef YOSHIMI_LV2_PLUGIN assert (0 == groom->instanceCnt()); CmdOptions baseSettings(argc,argv); Instance& primary = groom->createInstance(0); baseSettings.applyTo(primary.runtime()); return primary.startUp(); #else (void)argc; (void)argv; throw std::logic_error("Must not boot a standalone primary Synth for LV2"); #endif //(actual reason is: we do not link in CmdOptions.cpp) } /** create and manage a SynthEngine instance attached to a (LV2) plugin */ bool InstanceManager::startPluginInstance(PluginCreator buildPluginInstance) { return groom->instanceCnt() < MAX_INSTANCES and groom->createInstance(0) // choose next free ID .startUp(buildPluginInstance); } void InstanceManager::terminatePluginInstance(uint synthID) { groom->discardInstance(synthID); } void InstanceManager::SynthGroom::discardInstance(uint synthID) { auto& instance{find(synthID)}; if (instance.getID() == synthID) { instance.shutDown(); { Guard lock(mtx); clearZombies(); } } } /** * Request to allocate a new SynthEngine instance. * @return ID of the new instance or zero, if no further instance can be created * @remark the new instance will start up asynchronously, see SynthGroom::dutyCycle() * @warning this function can block for an extended time (>33ms), * since it contends with the event handling duty cycle. */ uint InstanceManager::requestNewInstance(uint desiredID) { if (groom->instanceCnt() < MAX_INSTANCES) return groom->createInstance(desiredID).getID(); groom->getPrimary().runtime().Log("[ERROR] Maximum number("+asString(MAX_INSTANCES) +") of Synth-Engine instances exceeded.", _SYS_::LogError); return 0; } /** * Initiate restoring of specific instances, as persisted in the base config. * This function must be called after the »primary« SynthEngine was started, but prior * to launching any further instances; the new allotted engines will start asynchronously */ void InstanceManager::triggerRestoreInstances() { assert (1 == groom->instanceCnt()); Config& cfg{accessPrimaryConfig()}; if (cfg.autoInstance) for (uint id=1; idcreateInstance(id); } /** * Handle an OS-signal to start a new instance. * @remark to avoid any blocking, we send this indirect through the command system; * it will handled in the background thread and from there invoke requestNewInstance() */ void InstanceManager::handleNewInstanceSignal() { assert (1 <= groom->instanceCnt()); CommandBlock triggerMsg; triggerMsg.data.control = MAIN::control::startInstance; triggerMsg.data.source = TOPLEVEL::action::lowPrio; triggerMsg.data.part = TOPLEVEL::section::main; triggerMsg.data.type = TOPLEVEL::type::Integer; triggerMsg.data.value = 0; // request next free Synth-ID // triggerMsg.data.offset = UNUSED; triggerMsg.data.kit = UNUSED; triggerMsg.data.engine = UNUSED; triggerMsg.data.insert = UNUSED; triggerMsg.data.parameter = UNUSED; triggerMsg.data.miscmsg = UNUSED; triggerMsg.data.spare0 = UNUSED; triggerMsg.data.spare1 = UNUSED; // MIDI ringbuffer is the only one always active groom->getPrimary().getSynth().interchange.fromMIDI.write(triggerMsg.bytes); } void InstanceManager::performWhileActive(function handleEvents) { while (groom->getPrimary().runtime().runSynth.load(std::memory_order_acquire)) { groom->getPrimary().runtime().signalCheck(); groom->dutyCycle(handleEvents); std::this_thread::yield(); } // tiny break allowing other threads to acquire the mutex } void InstanceManager::SynthGroom::dutyCycle(function& handleEvents) { Guard lock(mtx); // warning: concurrent modifications could corrupt instance lifecycle for (auto& [_,instance] : registry) { switch (instance.getState()) { case BOOTING: // successfully booted, make ready for use if (primary->runtime().showGui) instance.startGUI_forApp(); instance.enterRunningState(); break; case RUNNING: if (instance.runtime().runSynth.load(std::memory_order_acquire)) // perform GUI and command returns for this instance handleEvents(instance.getSynth()); else instance.shutDown(); break; default: /* do nothing */ break; } } clearZombies(); handleStartRequest(); } /** * respond to the request to start a new engine instance, if any. * @note deliberately handling only a single request, as start-up is * time consuming and risks tailback in other instances' GUI queues. */ void InstanceManager::SynthGroom::handleStartRequest() { for (auto& [_,instance] : registry) if (PENDING == instance.getState()) { bool success = instance.startUp(); if (not success) primary->runtime().Log("FAILED to launch Synth-Instance(" +asString(instance.getID())+")", _SYS_::LogError); return; }// only one per duty cycle } void InstanceManager::SynthGroom::clearZombies() { for (auto elm = registry.begin(); elm != registry.end();) { Instance& instance{elm->second}; if (instance.getState() == DEFUNCT and not instance.isPrimary()) elm = registry.erase(elm); else ++elm; } } /** * Launch the GUI at any time on-demand while Synth is already running. * @note LV2 possibly re-creates the GUI-Plugin after it has been closed; * for that reason, everything in this function must be idempotent. */ void InstanceManager::launchGui_forPlugin(uint synthID, string windowTitle) { groom->startGUI_forLV2(synthID, windowTitle); } void InstanceManager::SynthGroom::startGUI_forLV2(uint synthID, string windowTitle) { #ifdef GUI_FLTK // ensure data visibility since LV2 GUI-plugin can run in any thread and in any order Guard lock(mtx); auto& instance{find(synthID)}; assert (instance.getID() == synthID); instance.runtime().showGui = true; instance.triggerPostBootHook(); // trigger push-updates for UI state instance.getSynth().setWindowTitle(windowTitle); instance.interChange().createGuiMaster(); #endif } void InstanceManager::Instance::startGUI_forApp() { #ifdef GUI_FLTK interChange().createGuiMaster(); if (runtime().audioEngine < 1) alert(synth.get(), "Yoshimi could not connect to any sound system. Running with no Audio."); if (runtime().midiEngine < 1) alert(synth.get(), "Yoshimi could not connect to any MIDI system. Running with no MIDI."); #endif } /** invoked when leaving main-event-thread because primary synth stopped */ void InstanceManager::performShutdownActions() { groom->persistRunningInstances(); groom->getPrimary().getSynth().saveHistory(); } /** detect all instances currently running and store this information persistently */ void InstanceManager::SynthGroom::persistRunningInstances() { auto& cfg = getPrimary().runtime(); cfg.activeInstances.reset(); cfg.activeInstances.set(0); // always mark the primary for (auto& [id,instance] : registry) if (instance.getState() == RUNNING and instance.runtime().runSynth.load(std::memory_order_acquire)) cfg.activeInstances.set(id); // persist the running instances cfg.saveMasterConfig(); } /** terminate and disconnect all IO on all instances */ void InstanceManager::disconnectAll() { groom->shutdownRunningInstances(); } void InstanceManager::SynthGroom::shutdownRunningInstances() { for (auto& [_,instance] : registry) if (instance.getState() == RUNNING) instance.shutDown(); } #ifndef YOSHIMI_LV2_PLUGIN bool InstanceManager::requestedSoundTest() { return test::TestInvoker::access().activated; } void InstanceManager::launchSoundTest() { auto& soundTest{test::TestInvoker::access()}; auto& primarySynth{groom->getPrimary().getSynth()}; assert(soundTest.activated); soundTest.performSoundCalculation(primarySynth); } #endif /** * Allocate an unique Synth-ID not yet in use. * @param desiredID explicitly given desired ID; * set to zero to request allocation of next free ID * @return new ID which is not currently in use. * @note assuming that only a limited number of Synth instances is requested * @remark when called for the first time, ID = 0 will be returned, which * also marks the associated instance as »primary instance«, responsible * for coordinates some application global aspects. */ uint InstanceManager::SynthGroom::allocateID(uint desiredID) { if (desiredID >= 32 or (desiredID > 0 and contains(registry, desiredID))) desiredID = 0; // use the next free ID instead if (not desiredID) { for (auto& [id,_] : registry) if (desiredID < id) break; else ++desiredID; } assert(desiredID < MAX_INSTANCES); assert((!primary and 0==desiredID) or(primary and 0 < desiredID)); return desiredID; } void InstanceManager::Instance::enterRunningState() { triggerPostBootHook(); registerAudioPorts(); // this instance is now in fully operational state... state = RUNNING; } /** send command to invoke the SynthEngine::postBootHook() in the Synth-thread */ void InstanceManager::Instance::triggerPostBootHook() { CommandBlock triggerMsg; triggerMsg.data.type = TOPLEVEL::type::Integer | TOPLEVEL::type::Write; triggerMsg.data.control = TOPLEVEL::control::dataExchange; triggerMsg.data.part = TOPLEVEL::section::main; triggerMsg.data.source = TOPLEVEL::action::noAction; // // Important: not(action::lowPrio) since we want direct execution in Synth-thread triggerMsg.data.offset = UNUSED; triggerMsg.data.kit = UNUSED; triggerMsg.data.engine = UNUSED; triggerMsg.data.insert = UNUSED; triggerMsg.data.parameter = (state != RUNNING? 1 : 0); // initial boot-up init or later refresh for GUI triggerMsg.data.miscmsg = UNUSED; triggerMsg.data.spare0 = UNUSED; triggerMsg.data.spare1 = UNUSED; triggerMsg.data.value = 0; // MIDI ringbuffer is the only one always active synth->interchange.fromMIDI.write(triggerMsg.bytes); } void InstanceManager::Instance::registerAudioPorts() { for (uint portNum=0; portNum < NUM_MIDI_PARTS; ++portNum) if (synth->partonoffRead(portNum)) client->registerAudioPort(portNum); } void InstanceManager::registerAudioPort(uint synthID, uint portNum) { auto& instance = groom->find(synthID); if (isLimited(0u, portNum, uint(NUM_MIDI_PARTS-1))) instance.getClient().registerAudioPort(portNum); } yoshimi-2.3.5.1/src/Misc/InstanceManager.h000066400000000000000000000051161506652756400202560ustar00rootroot00000000000000/* InstanceManager.h - manage lifecycle of Synth-Engine instances Copyright 2024, Ichthyostega Based on existing code from main.cpp Copyright 2009-2011, Alan Calvert Copyright 2014-2021, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef INSTANCE_MANAGER_H #define INSTANCE_MANAGER_H #include "globals.h" #include #include #include class Config; class MusicIO; class SynthEngine; class InstanceManager { class Instance; class SynthGroom; std::unique_ptr groom; // can not be created nor copied or moved... InstanceManager(); public: ~InstanceManager(); InstanceManager(InstanceManager&&) = delete; InstanceManager(InstanceManager const&) = delete; InstanceManager& operator=(InstanceManager&&) = delete; InstanceManager& operator=(InstanceManager const&) = delete; /** Access: Meyer's Singleton */ static InstanceManager& get() { static InstanceManager singleton{}; return singleton; } bool bootPrimary(int, char*[]); uint requestNewInstance(uint); void triggerRestoreInstances(); void handleNewInstanceSignal(); using PluginCreator = std::function; bool startPluginInstance(PluginCreator); void terminatePluginInstance(uint synthID); void launchGui_forPlugin(uint synthID, std::string); /** Event handling loop during regular operation */ void performWhileActive(std::function handleEvents); void performShutdownActions(); bool requestedSoundTest(); void launchSoundTest(); void disconnectAll(); Config& accessPrimaryConfig(); SynthEngine& findSynthByID(uint); void registerAudioPort(uint synth, uint port); }; #endif /*INSTANCE_MANAGER_H*/ yoshimi-2.3.5.1/src/Misc/Log.h000066400000000000000000000053051506652756400157400ustar00rootroot00000000000000/* Log.h - Interface for logging and error messages Copyright 2025, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * NOTE: this interface is experimental as of 4/2025 * * Up to now, the "interface" for logging was SynthEngine, rsp. the "runtime" * (Config object) accessible for each instance. Which is problematic, because * - Logging as such has no relation to the task of sound synthesis, * rather it is a framework concern (cross-cutting concern). * - in many cases, the habit to log through SynthEngine is the sole reason * why a pointer or reference to the latter is wired almost everywhere. * - Yoshimi can run several instances of the SynthEngine (either stand-alone * or to accommodate several LV2 plug-in instances). In almost all cases, * a specific link to some instance is not required for logging, which * is used mostly for error messages, and at times for diagnostics. * - the way how log messages are passed from a SynthEngine- or background * thread to the GUI-Thread (the "Main-Thread") is not threadsafe. * * The intention is first to establish a generic logger interface, distinct * from the SynthEngine. As a second step the backing infrastructure * could then be consolidated (Idea: use a ringbuffer) */ #ifndef MISC_LOG_H #define MISC_LOG_H #include "globals.h" #include #include #include class Config; /** * Interface to send an information or error message. * Logger is copyable / assignable. * The actual instance can be retrieved from Config / via a Synth-instance */ class Logger { using Handler = std::function; Handler handler; Logger(Handler handlerSetup) : handler{std::move(handlerSetup)} { } // shall be created by Config / the "Synth runtime" friend class Config; public: void operator() (std::string const& msg, char toStdErr =_SYS_::LogNormal) const { handler(msg, toStdErr); } }; #endif /*MISC_LOG_H*/ yoshimi-2.3.5.1/src/Misc/Microtonal.cpp000066400000000000000000000743571506652756400176760ustar00rootroot00000000000000/* Microtonal.cpp - Tuning settings and microtonal capabilities Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #include #include #include #include #include "Misc/Config.h" #include "Misc/XMLStore.h" #include "Misc/Microtonal.h" #include "Misc/SynthEngine.h" #include "Misc/NumericFuncs.h" #include "Misc/FormatFuncs.h" #include "Misc/FileMgrFuncs.h" using func::power; using file::loadText; using file::findLeafName; using std::string; using std::to_string; namespace { // local implementation details inline void splitLine(string& page, string& line) { size_t pos = page.find('\n'); if (pos != string::npos) { line = page.substr(0, pos); page = page.substr(pos + 1, page.length()); } else { line = page; page = ""; func::trimEnds(line); } return; } inline bool validline(string line) { size_t idx = 0; bool ok = true; while (ok && idx < line.length() && line[idx] > '!') { char chr = line[idx]; if (chr != ' ' && chr != '.' && chr != '/' && (chr < '0' || chr > '9')) { ok = false; } ++ idx; } return ok; } } int Microtonal::getLineFromText(string& page, string& line) { line = ""; do { splitLine(page, line); } while (line[0] == '!'); // don't want comment lines if (line.length() < 1) return SCALES::errors::missingEntry; return 0; } string Microtonal::reformatline(string text) { string formattext = ""; char Chr; for (size_t i = 0; i < text.length(); ++i) { Chr = text[i]; if (Chr == '.' || Chr == '/' || (Chr >= '0' && Chr <= '9')) formattext += Chr; } size_t found; found = formattext.find('.'); if (found < 4) { string tmp (4 - found, '0'); // leading zeros formattext = tmp + formattext; } found = formattext.size(); if (found < 11) { string tmp (11 - found, '0'); // trailing zeros formattext += tmp; } return formattext; } void Microtonal::defaults(int type) { if (type != 2) // not map { Pinvertupdown = 0; Pinvertupdowncenter = 60; octavesize = 12; Penabled = 0; PrefNote = 69; PrefFreq = 440.0f; Pscaleshift = 64; octave[11].type = 2; octave[11].x1 = 2; octave[11].x2 = 1; Pname = string("12tET"); Pcomment = string("Default Tuning"); } if (type != 1) // not tuning { Pfirstkey = 0; Plastkey = MAX_OCTAVE_SIZE - 1; Pmiddlenote = 60; Pmapsize = 12; PformalOctaveSize = 12; Pmappingenabled = 0; for (int i = 0; i < 128; ++i) { Pmapping[i] = i; PmapComment[i] = ""; } Pcomment = string("Default Map"); } for (size_t i = 0; i < MAX_OCTAVE_SIZE; ++i) { octave[i].text = reformatline(to_string((i % octavesize + 1) * 100)+ ".0"); octave[i].tuning = power<2>((i % octavesize + 1) / 12.0); octave[i].type = 1; octave[i].x1 = (i % octavesize + 1) * 100; octave[i].x2 = 0; octave[i].comment = ""; } if (type == 0) { octave[11].type = 2; octave[11].x1 = 2; octave[11].x2 = 1; Pname = string("12tET"); Pcomment = string("Equal Temperament 12 notes per octave"); } setglobalfinedetune(64.0); // always set this } void Microtonal::setglobalfinedetune(float control) { Pglobalfinedetune = control; // compute global fine detune, -64.0 .. 63.0 cents globalfinedetunerap = (Pglobalfinedetune > 64.0f || Pglobalfinedetune < 64.0f) ? power<2>((Pglobalfinedetune - 64.0f) / 1200.0f) : 1.0f; // was float globalfinedetunerap = powf(2.0f, (Pglobalfinedetune - 64.0f) / 1200.0f); } // Get the frequency according to the note number float Microtonal::getNoteFreq(int note, int keyshift) { // in this function will appears many times things like this: // var=(a+b*100)%b // I had written this way because if I use var=a%b gives unwanted results when a<0 // This is the same with divisions. if ((Pinvertupdown != 0) && ((Pmappingenabled == 0) || (Penabled == 0))) note = Pinvertupdowncenter * 2 - note; if (!Penabled) return getFixedNoteFreq(note + keyshift) * globalfinedetunerap; int scaleshift = (Pscaleshift - 64 + octavesize * 100) % octavesize; // compute the keyshift float rap_keyshift = 1.0f; if (keyshift) { int kskey = (keyshift + octavesize * 100) % octavesize; int ksoct = (keyshift + octavesize * 100) / octavesize - 100; rap_keyshift = (!kskey) ? 1.0f : (octave[kskey - 1].tuning); rap_keyshift *= powf(octave[octavesize - 1].tuning, ksoct); } float freq; if (Pmappingenabled && Pmapsize > 0) // added check to stop crash till it's sorted properly { // Compute how many mapped keys are from middle note to reference note // and find out the proportion between the freq. of middle note and "A" note int tmp = PrefNote - Pmiddlenote; int minus = 0; if (tmp < 0) { tmp = -tmp; minus = 1; } int deltanote = 0; for (int i = 0; i < tmp; ++i) { if (Pmapping[i % Pmapsize] >= 0) deltanote++; } float rap_anote_middlenote = (deltanote == 0) ? (1.0f) : (octave[(deltanote - 1) % octavesize].tuning); if (deltanote != 0) rap_anote_middlenote *= powf(octave[octavesize - 1].tuning, (deltanote - 1) / octavesize); if (minus) rap_anote_middlenote = 1.0f / rap_anote_middlenote; // Convert from note (midi) to degree (note from the tuning) int degoct = (note - Pmiddlenote + Pmapsize * 200) / Pmapsize - 200; int degkey = (note - Pmiddlenote + Pmapsize * 100) % Pmapsize; degkey = Pmapping[degkey]; if (degkey < 0) // this key is not mapped { return -1.0f; } // invert the keyboard upside-down if it is asked for // TODO: do the right way by using Pinvertupdowncenter if (Pinvertupdown) { degkey = octavesize - degkey - 1; degoct = -degoct; } // compute the frequency of the note degkey = degkey + scaleshift; degoct += degkey / octavesize; degkey %= octavesize; freq = (degkey == 0) ? (1.0f) : octave[degkey - 1].tuning; freq *= powf(octave[octavesize - 1].tuning, degoct); freq *= PrefFreq / rap_anote_middlenote; } else // if the mapping is disabled { int nt = note - PrefNote + scaleshift; int ntkey = (nt + octavesize * 100) % octavesize; // cast octavesize to a signed type so the expression stays signed int ntoct = (nt - ntkey) / int(octavesize); float oct = octave[octavesize - 1].tuning; freq = octave[(ntkey + octavesize - 1) % octavesize].tuning * powf(oct, ntoct) * PrefFreq; if (ntkey == 0) freq /= oct; } if (scaleshift != 0) freq /= octave[scaleshift - 1].tuning; freq *= globalfinedetunerap; return freq * rap_keyshift; } // Convert a line to tunings; returns 0 if ok int Microtonal::linetotunings(uint nline, string text) { text = func::trimEnds(text); // just to be sure size_t pos = text.find_first_of(" !"); // pull out any comment first if (pos != string::npos) { if (text[pos + 1] == '!') pos += 1; // don't want 2 comment markers string last = text.substr(pos + 1, text.length()); int i = 0; while (last[i] <= '!') ++i; if (i > 0) last = last.substr(i, text.length()); octave[nline].comment = func::trimEnds(last); } else octave[nline].comment = ""; if (!validline(text)) return SCALES::errors::badNumbers; int x1 = -1, x2 = -1, type = -1; double x = -1.0; double tuning = 1.0; if (text.find('.') != string::npos) { x = stod(text); //printf(">%f\n",x); if (x < 0.000001) return SCALES::errors::valueTooSmall; type = 1; // double type(cents) x1 = int(floor(x)); double tmp = fmod(x, 1.0); x2 = int(floor(tmp * 1e6)); tuning = pow(2.0, x / 1200.0); octave[nline].text = reformatline(text); } else { x1 = func::string2int(text); if (x1 < 1) x1 = 1; size_t found = text.find('/'); if (found != string::npos && found < (text.length())) { if (text.length() > found + 1) x2 = func::string2int(text.substr(found + 1, text.length())); } else x2 = 1; if (x2 < 1) x2 = 1; type = 2; // division tuning = double(x1) / x2; } octave[nline].tuning = tuning; octave[nline].type = type; octave[nline].x1 = x1; octave[nline].x2 = x2; return 0; // ok } // Convert the text to tunings int Microtonal::texttotunings(string page) { size_t nl = 0; string line; while (!page.empty()) { size_t pos = page.find('\n'); if (pos != string::npos) { line = page.substr(0, pos); page = page.substr(pos + 1, page.length()); } else { line = page; page = ""; } int err = linetotunings(nl, line); if (err != 0) return err; // Parse error ++ nl; } if (nl > MAX_OCTAVE_SIZE) nl = MAX_OCTAVE_SIZE; if (!nl) return 0; // the input is empty octavesize = nl; synth->setAllPartMaps(); return octavesize; // ok } // Convert the text to mapping int Microtonal::texttomapping(string page) { size_t pos = page.find_last_not_of(" \t\n"); if (pos != string::npos) page.erase(pos + 1); int tx = 0; if (page[0] >= ' ' && Pmapsize > 0) { string line; while (!page.empty()) { splitLine(page, line); size_t pos = line.find('!'); if (pos != string::npos) { PmapComment[tx] = func::trimEnds(line.substr(pos + 1, line.length())); } else PmapComment[tx] = ""; if (line.empty() || line[0] < '0' || line[0] > '9') { line = 'x'; Pmapping[tx] = -1; } else Pmapping[tx] = stoi(line); ++tx; } } while (tx < Pmapsize) { Pmapping[tx] = -1; ++tx; } synth->setAllPartMaps(); return tx; } string Microtonal::keymaptotext() { string text = ""; if (Pmapsize > 0) { for (int i = 0; i < Pmapsize; ++i) { if (i > 0) text += "\n"; if (Pmapping[i] == -1) text += "x"; else text += to_string(Pmapping[i]); if (!PmapComment[i].empty()) { text += " ! "; text += PmapComment[i]; } } } return text; } // Convert tuning to text line void Microtonal::tuningtoline(uint n, string& line) { line = ""; if (n > octavesize || n > MAX_OCTAVE_SIZE) return; string text = octave[n].text; if (octave[n].type == 2) { line = (to_string(octave[n].x1) + "/" + to_string(octave[n].x2)); } else if (octave[n].type == 1) { //printf(">%f\n",octave[n].tuning); if (text > " ") line = text; else line = (to_string(octave[n].x1) + "." + to_string(octave[n].x2)); } } string Microtonal::tuningtotext() { string text; string line; for (size_t i = 0; i < octavesize; ++i) { if (i > 0) text += "\n"; tuningtoline(i, line); text += line; if (!octave[i].comment.empty()) { text += " ! "; text += octave[i].comment; } } synth->setAllPartMaps(); return text; } // Loads the tunings from a scl file int Microtonal::loadscl(string const& filename) { string text = loadText(filename); if (text == "") return SCALES::errors::noFile; string line = ""; int err = 0; int nnotes = 0; // loads the short description if (getLineFromText(text, line)) { err = SCALES::errors::emptyFile; } if (err == 0) { Pname = findLeafName(filename); Pcomment = string(line); // loads the number of the notes if (getLineFromText(text, line)) err = SCALES::errors::badFile; } if (err == 0) { nnotes = MAX_OCTAVE_SIZE; nnotes = func::string2int(line); if (size_t(nnotes) > MAX_OCTAVE_SIZE || nnotes < 2) err = SCALES::errors::badOctaveSize; } if (err == 0) { // load the tunings for (int nline = 0; nline < nnotes; ++nline) { err = getLineFromText(text, line); if (err == 0) err = linetotunings(nline, line); if (err < 0) break; } } if (err < 0) return err; octavesize = nnotes; synth->setAllPartMaps(); synth->addHistory(filename, TOPLEVEL::XML::ScalaTune); return nnotes; } // Loads the mapping from a kbm file int Microtonal::loadkbm(string const& filename) { string text = loadText(filename); if (text == "") return SCALES::errors::noFile; string line = ""; // loads the mapsize if (getLineFromText(text, line)) return SCALES::errors::badFile; int tmpMapSize = func::string2int(line); if (tmpMapSize < 0 || tmpMapSize >= MAX_OCTAVE_SIZE) return SCALES::errors::badMapSize; int tmpFirst = 0; // loads first MIDI note to retune if (getLineFromText(text, line)) return SCALES::errors::badFile; tmpFirst = func::string2int(line); if (tmpFirst < 0 || tmpFirst >= MAX_OCTAVE_SIZE) return SCALES::errors::badNoteNumber; int tmpLast; // loads last MIDI note to retune if (getLineFromText(text, line)) return SCALES::errors::badFile; tmpLast = func::string2int(line); if (tmpLast < 0 || tmpLast >= MAX_OCTAVE_SIZE) return SCALES::errors::badNoteNumber; int tmpMid; // loads the middle note where scale from scale degree=0 if (getLineFromText(text, line)) return SCALES::errors::badFile; tmpMid = func::string2int(line); if (tmpMid < 0 || tmpMid >= MAX_OCTAVE_SIZE) return SCALES::errors::badNoteNumber; int tmpRefNote; // loads the reference note if (getLineFromText(text, line)) return SCALES::errors::badFile; tmpRefNote = func::string2int(line); if (tmpRefNote < 0 || tmpRefNote >= MAX_OCTAVE_SIZE) return SCALES::errors::badNoteNumber; float tmpRefFreq; // loads the reference freq. if (getLineFromText(text, line)) return SCALES::errors::badFile; tmpRefFreq = func::string2float(line); if (tmpRefFreq < 1) return SCALES::errors::valueTooSmall; if (tmpRefFreq > 20000) return SCALES::errors::valueTooBig; Pmappingenabled = 1; Pmapsize = tmpMapSize; Pfirstkey = tmpFirst; Plastkey = tmpLast; Pmiddlenote = tmpMid; PrefNote = tmpRefNote; PrefFreq = tmpRefFreq; if (getLineFromText(text, line)) return SCALES::errors::badMapSize; PformalOctaveSize = func::string2int(line); if (tmpMapSize == 0) { synth->setAllPartMaps(); synth->addHistory(filename, TOPLEVEL::XML::ScalaMap); return 1; } // the scale degree(which is the octave) is not loaded // it is obtained by the tunings with getoctavesize() method // TODO this is wrong! int x = 0; int err = 0; for (int nline = 0; nline < tmpMapSize; ++nline) { if (getLineFromText(text, line)) // EOF { // It's permissible for source file to have fewer entries than the // map size so we fill the rest as silent. Pmapping[nline] = -1; PmapComment[nline] = ""; continue; } else { if (line[0] < '0' || line[0] > '9') // catches all possibilities! x = -1; else { x = std::stoi(line); if (x >= tmpMapSize) { err = SCALES::errors::valueTooBig; break; } } } Pmapping[nline] = x; size_t pos = line.find_first_of(" !"); if (pos != std::string::npos) { if (line[pos + 1] == '!') pos += 1; // don't want 2 comment markers PmapComment[nline] = func::trimEnds(line.substr(pos + 1, line.length())); } else { PmapComment[nline] = ""; } } if (err < 0) return err; Pmapsize = tmpMapSize; synth->setAllPartMaps(); synth->addHistory(filename, TOPLEVEL::XML::ScalaMap); return tmpMapSize; } string Microtonal::scale2scl() { string text = "! "; text += synth->microtonal.Pname; text += "\n!\n "; text += synth->microtonal.Pcomment; text += "\n "; text += to_string(synth->microtonal.octavesize); text += "\n!\n"; for (size_t i = 0; i < synth->microtonal.octavesize; ++ i) { text += " "; if (octave[i].type == 1) text += synth->microtonal.octave[i].text; else { text+= to_string(octave[i].x1); text += "/"; text+= to_string(octave[i].x2); } if (!octave[i].comment.empty()) { text += " ! "; text += octave[i].comment; } text += "\n"; } return text; } string Microtonal::map2kbm() { string text = "! Scala keymap\n"; text += "!\n"; // text += "! map size\n"; text += to_string(Pmapsize); text += "\n!\n"; // text += "! first note\n"; text += to_string(Pfirstkey); text += "\n!\n"; // text += "! last note\n"; text += to_string(Plastkey); text += "\n!\n"; // text += "! middle note\n"; text += to_string(Pmiddlenote); text += "\n!\n"; // text += "! reference note\n"; text += to_string(PrefNote); text += "\n!\n"; // text += "! reference frequency\n"; text += to_string(PrefFreq); text += "\n!\n"; // text += "! formal octave\n"; text += to_string(PformalOctaveSize); text += "\n"; if (Pmapsize != 0) { text += "!\n"; text += "! mapped notes\n"; text += keymaptotext(); text += "\n"; } return text; } void Microtonal::add2XML(XMLtree& xmlMicrotonal) { xmlMicrotonal.addPar_bool("enabled", Penabled); xmlMicrotonal.addPar_str ("name" , Pname); xmlMicrotonal.addPar_str ("comment", Pcomment); xmlMicrotonal.addPar_bool("invert_up_down", Pinvertupdown); xmlMicrotonal.addPar_int ("invert_up_down_center", Pinvertupdowncenter); xmlMicrotonal.addPar_frac("global_fine_detune", Pglobalfinedetune); xmlMicrotonal.addPar_int ("a_note", PrefNote); xmlMicrotonal.addPar_real("a_freq", PrefFreq); if (not (Penabled or synth->getRuntime().xmlmax)) return; XMLtree xmlScale = xmlMicrotonal.addElm("SCALE"); xmlScale.addPar_int("scale_shift", Pscaleshift); xmlScale.addPar_int("first_key" , Pfirstkey); xmlScale.addPar_int("last_key" , Plastkey); xmlScale.addPar_int("middle_note", Pmiddlenote); XMLtree xmlOctave = xmlScale.addElm("OCTAVE"); xmlOctave.addPar_int("octave_size", octavesize); for (uint i = 0; i < octavesize; ++i) { XMLtree xmlDegree = xmlOctave.addElm("DEGREE", i); if (octave[i].type == 1) { xmlDegree.addPar_str ("cents_text", octave[i].text); xmlDegree.addPar_real("cents" , octave[i].tuning); /* * This is downgraded to preserve compatibility * with both Zyn and older Yoshi versions */ } if (octave[i].type == 2) { xmlDegree.addPar_str("cents_text" , octave[i].text); xmlDegree.addPar_int("numerator" , octave[i].x1); xmlDegree.addPar_int("denominator", octave[i].x2);; } xmlDegree.addPar_str("comment", octave[i].comment); } XMLtree xmlKeyboard = xmlScale.addElm("KEYBOARD_MAPPING"); xmlKeyboard.addPar_int("map_size" , Pmapsize); xmlKeyboard.addPar_int("formal_octave_size", PformalOctaveSize); xmlKeyboard.addPar_int("mapping_enabled" , Pmappingenabled); for (uint i = 0; i < uint(Pmapsize); ++i) { XMLtree xmlKeymap = xmlKeyboard.addElm("KEYMAP", i); xmlKeymap.addPar_int("degree" , Pmapping[i]); xmlKeymap.addPar_str("comment", PmapComment[i]); } } int Microtonal::getfromXML(XMLtree& xmlMicrotonal) { int errorResult{0}; Penabled = xmlMicrotonal.getPar_bool("enabled", Penabled); Pname = xmlMicrotonal.getPar_str("name"); Pcomment = xmlMicrotonal.getPar_str("comment"); Pinvertupdown = xmlMicrotonal.getPar_bool("invert_up_down", Pinvertupdown); Pinvertupdowncenter = xmlMicrotonal.getPar_127 ("invert_up_down_center", Pinvertupdowncenter); setglobalfinedetune(xmlMicrotonal.getPar_frac("global_fine_detune", Pglobalfinedetune, 0, 127)); PrefNote = xmlMicrotonal.getPar_127 ("a_note", PrefNote); PrefFreq = xmlMicrotonal.getPar_real("a_freq", PrefFreq, 1.0, 10000.0); if (XMLtree xmlScale = xmlMicrotonal.getElm("SCALE")) { Pscaleshift = xmlScale.getPar_127("scale_shift", Pscaleshift); Pfirstkey = xmlScale.getPar_127("first_key", Pfirstkey); Plastkey = xmlScale.getPar_127("last_key", Plastkey); Pmiddlenote = xmlScale.getPar_127("middle_note", Pmiddlenote); if (XMLtree xmlOctave = xmlScale.getElm("OCTAVE")) { octavesize = xmlOctave.getPar_127("octave_size", octavesize); for (uint i = 0; i < octavesize; ++i) { octave[i].text = ""; if (XMLtree xmlDegree = xmlOctave.getElm("DEGREE", i)) { string spec = xmlDegree.getPar_str("cents_text"); octave[i].x2 = 0; if (spec > " ") { octave[i].text = reformatline(spec); octave[i].tuning = pow(2.0, stod(spec) / 1200.0); } else { octave[i].text = ""; octave[i].tuning = xmlDegree.getPar_real("cents", octave[i].tuning); } octave[i].x1 = xmlDegree.getPar_int("numerator", octave[i].x1, 0, INT_MAX); octave[i].x2 = xmlDegree.getPar_int("denominator", octave[i].x2, 0, INT_MAX); if (octave[i].x2 != 0u) { octave[i].text = spec; octave[i].type = 2; octave[i].tuning = double(octave[i].x1) / octave[i].x2; } else { octave[i].type = 1; //populate fields for display double x = (log(octave[i].tuning) / LOG_2) * 1200.0; octave[i].x1 = int(floor(x)); // this is a fudge to get round weird values of x2 // it's only used if we don't have the text stored double tmp = fmod(x, 1.0); if (tmp < 0.0001) octave[i].x2 = 0; else if (tmp > 0.9999) { octave[i].x2 = 0; octave[i].x1 += 1; } else octave[i].x2 = int(floor(tmp * 1e6)); //octave[i].x2 = int(floor(fmod(x, 1.0) * 1e6)); } octave[i].comment = xmlDegree.getPar_str("comment"); } //DEGREE } //for } //OCTAVE if (XMLtree xmlKeyboard = xmlScale.getElm("KEYBOARD_MAPPING")) { Pmapsize = xmlKeyboard.getPar_127("map_size", Pmapsize); PformalOctaveSize = xmlKeyboard.getPar_127("formal_octave_size", PformalOctaveSize); Pmappingenabled = xmlKeyboard.getPar_127("mapping_enabled", Pmappingenabled); for (uint i = 0; i < uint(Pmapsize); ++i) { if (XMLtree xmlKeymap = xmlKeyboard.getElm("KEYMAP", i)) { Pmapping[i] = xmlKeymap.getPar_int("degree", Pmapping[i], -1, 127); PmapComment[i] = xmlKeymap.getPar_str("comment"); if (Pmapping[i] >= Pmapsize) { errorResult = SCALES::errors::valueTooBig; break; } } } } //KEYBOARD_MAPPING } return errorResult; } bool Microtonal::saveXML(string const& filename) { bool zynCompat = true; XMLStore xml{TOPLEVEL::XML::Scale, zynCompat}; XMLtree xmlMicrotonal = xml.addElm("MICROTONAL"); this->add2XML(xmlMicrotonal); return xml.saveXMLfile(filename ,synth->getRuntime().getLogger() ,synth->getRuntime().gzipCompression); } int Microtonal::loadXML(string const& filename) { auto& logg = synth->getRuntime().getLogger(); XMLStore xml{filename, logg}; postLoadCheck(xml,*synth); if (not xml) logg("Microtonal: failed to read XML file \""+filename+"\""); else if (XMLtree xmlMicro = xml.getElm("MICROTONAL")) { int err = getfromXML(xmlMicro); if (err != 0) return err; synth->setAllPartMaps(); return 0; } else logg("Microtonal: \""+filename+"\" is not a scale file", _SYS_::LogError); return 1; } float Microtonal::getLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; // microtonal defaults int min = 0; float def = 0; int max = MAX_OCTAVE_SIZE - 1; uchar type = TOPLEVEL::type::Integer; uchar learnable = TOPLEVEL::type::Learnable; switch (control) { case SCALES::control::refFrequency: min = A_MIN; def = A_DEF; max = A_MAX; break; case SCALES::control::refNote: min = 24; def = 69; max = 84; type |= learnable; break; case SCALES::control::invertScale: max = 1; type |= learnable; break; case SCALES::control::invertedScaleCenter: def = 60; type |= learnable; break; case SCALES::control::scaleShift: min = -63; max = 64; type |= learnable; break; case SCALES::control::enableMicrotonal: max = 1; type |= learnable; break; case SCALES::control::enableKeyboardMap: max = 1; type |= learnable; break; case SCALES::control::lowKey: type |= learnable; break; case SCALES::control::middleKey: def = 60; type |= learnable; break; case SCALES::control::highKey: def = MAX_OCTAVE_SIZE - 1; type |= learnable; break; case SCALES::control::tuning: max = 1; break; case SCALES::control::keyboardMap: max = 1; break; case SCALES::control::importScl: max = 1; break; case SCALES::control::importKbm: max = 1; break; case SCALES::control::name: max = 1; break; case SCALES::control::comment: max = 1; break; case SCALES::control::clearAll: max = 1; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Misc/Microtonal.h000066400000000000000000000077531506652756400173370ustar00rootroot00000000000000/* Microtonal.h - Tuning settings and microtonal capabilities Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2016-2023, Will Godfrey and others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef MICROTONAL_H #define MICROTONAL_H #include #include #include "globals.h" #include "Misc/NumericFuncs.h" class SynthEngine; class XMLtree; using std::string; using func::power; class Microtonal { public: ~Microtonal() = default; Microtonal(SynthEngine *_synth): synth(_synth) { defaults(); } void defaults(int type = 0); float getNoteFreq(int note, int keyshift); float getFixedNoteFreq(int note); float getLimits(CommandBlock *getData); // Parameters uchar Pinvertupdown; int Pinvertupdowncenter; uchar Penabled; int PrefNote; int Pscaleshift; float PrefFreq; // first and last key (to retune) int Pfirstkey; int Plastkey; // The middle note where scale degree 0 is mapped to int Pmiddlenote; // Map size int Pmapsize; int PformalOctaveSize; //////////////TODO seems not to be actually used as of 9/2024 uchar Pmappingenabled; // Mapping ON/OFF int Pmapping[MAX_OCTAVE_SIZE]; // Mapping (keys) string PmapComment[MAX_OCTAVE_SIZE]; // comments for mapping (if they exist) float Pglobalfinedetune; float globalfinedetunerap; void setglobalfinedetune(float control); int getoctavesize(); void tuningtoline(uint n, string& line); string tuningtotext(); string keymaptotext(); int loadscl(string const& filename); // load the tunings from a .scl file int loadkbm(string const& filename); // load the mapping from .kbm file int texttotunings(string page); int texttomapping(string page); string scale2scl(); string map2kbm(); string Pname; string Pcomment; void add2XML(XMLtree&); int getfromXML(XMLtree&); bool saveXML(string const& filename); int loadXML(string const& filename); private: int getLineFromText(string& page, string& line); string reformatline(string text); int linetotunings(uint nline, string text); // extracts a line from a text file, ignoring the lines beginning with "!" public: // TODO made these public until we have better ways to transfer data to/from GUI size_t octavesize; struct Octave { uchar type; // 1 for cents or 2 for division double tuning; // the real tuning (eg. +1.05946 for one halftone) or 2.0 for one octave uint x1; // the real tuning is x1 / x2 uint x2; string text; string comment; }; Octave octave[MAX_OCTAVE_SIZE]; SynthEngine *synth; }; inline int Microtonal::getoctavesize() { return ((Penabled != 0) ? octavesize : 12); } inline float Microtonal::getFixedNoteFreq(int note) { return power<2>(float(note - PrefNote) / 12.0f) * PrefFreq; } #endif yoshimi-2.3.5.1/src/Misc/MirrorData.h000066400000000000000000000051641506652756400172660ustar00rootroot00000000000000/* MirrorData.h - Component to store and provide data for the GUI mirrored from Core Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef MIRROR_DATA_H #define MIRROR_DATA_H #include "globals.h" #include "Interface/GuiDataExchange.h" #include #include #include using RoutingTag = GuiDataExchange::RoutingTag; /** * A »data mirror« component for the GUI. * As part of the GuiDataExchange protocol, this component is attached to some * GUI window or control and will then receive data updates pushed by the Core. * Optionally a callback hook can be installed to be henceforth invoked on »push«. */ template class MirrorData : public GuiDataExchange::Subscription { DAT data; std::function updateHook{}; void pushUpdate(RoutingTag const& tag, void* buffer) override { assert(tag.verifyType()); (void)tag; assert(buffer); data.~DAT(); // copy-construct into data storage new(&data) DAT{* reinterpret_cast(buffer)}; if (updateHook) updateHook(data); } public: MirrorData() = default; MirrorData(GuiDataExchange::Connection con) : Subscription{con} , data{} { } MirrorData(GuiDataExchange& hub, RoutingTag tag) : MirrorData{GuiDataExchange::Connection{hub,tag}} { } void activate(GuiDataExchange::Connection con) { RoutingTag const& tag(con); if (not tag.verifyType()) // is the template parameter DAT correct? did you use the proper ConnectionTag? throw std::logic_error{"Connection type mismatch"}; GuiDataExchange::Subscription::activate(con); } /** install a hook to be invoked on each push update */ template void onUpdate(FUN&& callback) { updateHook = std::forward(callback); } DAT& get() { return data; } }; #endif /*MIRROR_DATA_H*/ yoshimi-2.3.5.1/src/Misc/NumericFuncs.h000066400000000000000000000300151506652756400176140ustar00rootroot00000000000000/* NumericFuncs.h Copyright 2010, Alan Calvert Copyright 2014-2021, Will Godfrey and others Copyright 2021, Hermann Vosseler This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef NUMERICFUNCS_H #define NUMERICFUNCS_H #include "globals.h" #include "Interface/TextLists.h" #include #include #include #include #include namespace func { template inline T limit(T val, T min, T max) { return val < min ? min : (val > max ? max : val); } inline void invSignal(float* sig, size_t len) { // only used by phaser effect for (size_t i = 0; i < len; ++i) sig[i] *= -1.0f; } inline int version2value() { /* * expected text string format * [text] * to * [text] * * result = nnnnnn */ char tofind[] = YOSHIMI_VERSION; std::string digits = ""; std::string num = "0"; for (size_t i = 0; i < strlen(tofind); ++i) { if (tofind[i] >= '0' && tofind[i] <= '9') { digits += tofind[i]; } else if (tofind[i] == '.' || tofind[i] == ' ') { if (digits.length() == 1) digits = '0'+ digits; num += digits; digits = ""; } } return std::stoi(num); } /* === Helper for exponential with constant base == */ /* * Yoshimi code used the generic power function powf() at various places just to compute the exponential * for a fixed (and even integral) base. This can be optimised, since b^x = exp(ln(b)·x); and in fact, * modern optimisers apply this rewriting with --fast-math. But unfortunately these rewritings differ * slightly (esp. regarding to SSE), which leads to slightly different sample (float numbers) being * computed on different Compilers/Platforms. * For sake of reproducibility / acceptance testing we thus apply this optimisation explicitly, * using inline front-end functions, and storing the precomputed logarithm of the base in a static var. */ namespace { template struct PowerFunction { static_assert(base > 0, "0^x is always zero"); static float invoke(float exponent) { return expf(LN_BASE * exponent); } static const float LN_BASE; }; template const float PowerFunction::LN_BASE = log(fraction? 1.0/base : double(base)); } /* compute base^exponent for a fixed integral base */ template inline float power(float exponent) { return PowerFunction::invoke(exponent); } /* compute 1/base^exponent for a fixed integral base */ template inline float powFrac(float exponent) { return PowerFunction::invoke(exponent); } /* Amplitude factor for volume attenuation in deciBel. * Power ~ Amplitude^2 = 10^(dB/10). sqrt(10^x) = 10^(x/2) * The template parameter "scale" defines how the function argument is mapped. * If e.g. scale = -60, then param=1 => -60dB, param=0 => 0dB, param=-0.5 => +30dB * If scale = 1, then the param is directly in decibel. */ template inline float decibel(float param) { return power<10>(float(scale)/20.0f * param); } /* convert an amplitude factor into dB (volume) */ inline float asDecibel(float amplitude) { return 20.0f * log10f(amplitude); } // no more than 32 bit please! inline unsigned int nearestPowerOf2(unsigned int x, unsigned int min, unsigned int max) { if (x <= min) return min; if (x >= max) return max; --x; x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return ++x; } inline unsigned int bitFindHigh(unsigned int value) { // return the highest bit currently set if (value == 0) return 0xff; int bit = sizeof(unsigned int) * 8 - 1; while (!(value & (1 << bit))) --bit; return bit; } inline void bitSet(unsigned int& value, unsigned int bit) { value |= (1 << bit); } inline void bitClear(unsigned int& value, unsigned int bit) { unsigned int mask = -1; mask ^= (1 << bit); value &= mask; } inline void bitClearHigh(unsigned int& value) { // clear the current highest bit bitClear(value, bitFindHigh(value)); } inline void bitClearAbove(unsigned int& value, int bitLevel) { // clear all bits above the designated one unsigned int mask = (0xffffffff << bitLevel); value = (value & ~mask); } inline bool bitTest(unsigned int value, unsigned int bit) { if (value & (1 << bit)) return true; return false; } inline void setRandomPan(float rand, float& left, float& right, unsigned char compensation, char pan, char range) { float min = float (pan - range) / 126.0f; if (min < 0) min = 0; float max = float (pan + range) / 126.0f; if (max > 1) max = 1; float t = rand * (max-min) + min; switch (compensation) { case MAIN::panningType::cut: // ZynAddSubFX - per side 0dB mono -6dB if (_SYS_::F2B(t)) { right = 0.5f; left = (1.0f - t); } else { right = t; left = 0.5f; } break; case MAIN::panningType::normal: // Yoshimi - per side + 3dB mono -3dB left = cosf(t * HALFPI); right = sinf(t * HALFPI); break; case MAIN::panningType::boost: // boost - per side + 6dB mono 0dB left = (1.0 - t); right = t; break; default: // no panning left = 0.7; right = 0.7; break; } } inline void setAllPan(float position, float& left, float& right, unsigned char compensation) { float t = ((position > 0) ? (position - 1) : 0.0f) / 126.0f; switch (compensation) { case MAIN::panningType::cut: // ZynAddSubFX - per side 0dB mono -6dB if (_SYS_::F2B(t)) { right = 0.5f; left = (1.0f - t); } else { right = t; left = 0.5f; } break; case MAIN::panningType::normal: // Yoshimi - per side + 3dB mono -3dB left = cosf(t * HALFPI); right = sinf(t * HALFPI); break; case MAIN::panningType::boost: // boost - per side + 6dB mono 0dB left = (1.0 - t); right = t; break; default: // no panning left = 0.7; right = 0.7; break; } } inline std::string bpm2text( float val) { // The text list referenced below will need to be altered if this is ever // changed. Remember that intervals need to be preserved too, not just the // total number of steps, otherwise saved instruments will get incorrect // values. static_assert(LFO_BPM_STEPS == 33, "Need to adjust LFO_BPM_STEPS table."); return LFObpm[int(roundf(val * (LFO_BPM_STEPS + 2)))]; } inline float quantizedLFOfreqBPM(float value) { // The quantizer below will need to be altered if this is ever // changed. Remember that intervals need to be preserved too, not just the // total number of steps, otherwise saved instruments will get incorrect // values. static_assert(LFO_BPM_STEPS == 33, "Need to adjust LFO_BPM_STEPS quantizer."); // We leave some room at the ends, so the full range is LFO_BPM_STEPS + 2. float tmp = roundf(value*(LFO_BPM_STEPS + 2)); if (tmp < 1) tmp = 1; else if (tmp >= LFO_BPM_STEPS + 2) tmp = LFO_BPM_STEPS + 1; return tmp / (LFO_BPM_STEPS + 2); } // The reason we return this as a fraction instead of a straight float is that // dividing by three is not possible to preserve perfectly in float, and this // can add up to quite a lot of error over many beats. inline std::pair LFOfreqBPMFraction(float value) { // The switch statement below will need to be altered if this is ever // changed. Remember that intervals need to be preserved too, not just the // total number of steps, otherwise saved instruments will get incorrect // values. static_assert(LFO_BPM_STEPS == 33, "Need to adjust LFO_BPM_STEPS table."); switch ((int)roundf(value * (LFO_BPM_STEPS + 2))) { case 0: // Some room to expand in the future. Fallthrough. case 1: return std::pair(1, 16); case 2: return std::pair(1, 15); case 3: return std::pair(1, 14); case 4: return std::pair(1, 13); case 5: return std::pair(1, 12); case 6: return std::pair(1, 11); case 7: return std::pair(1, 10); case 8: return std::pair(1, 9); case 9: return std::pair(1, 8); case 10: return std::pair(1, 7); case 11: return std::pair(1, 6); case 12: return std::pair(1, 5); case 13: return std::pair(1, 4); case 14: return std::pair(1, 3); case 15: return std::pair(1, 2); case 16: return std::pair(2, 3); case 17: return std::pair(1, 1); case 18: return std::pair(3, 2); case 19: return std::pair(2, 1); case 20: return std::pair(3, 1); case 21: return std::pair(4, 1); case 22: return std::pair(5, 1); case 23: return std::pair(6, 1); case 24: return std::pair(7, 1); case 25: return std::pair(8, 1); case 26: return std::pair(9, 1); case 27: return std::pair(10, 1); case 28: return std::pair(11, 1); case 29: return std::pair(12, 1); case 30: return std::pair(13, 1); case 31: return std::pair(14, 1); case 32: return std::pair(15, 1); case 34: // Some room to expand in the future. Fallthrough. case 33: return std::pair(16, 1); default: return std::pair(1, 1); } } // This conversion was written for CLI input. // It may be useful elsewhere. inline float BPMfractionLFOfreq(int num, int div) { static_assert(LFO_BPM_STEPS == 33, "Need to adjust LFO_BPM_STEPS table."); int res = 0; // these checks could probably be improved! if (num < 1) num = 1; else if (num > 16) num = 16; if (div < 1) div = 1; else if (div > 16) div = 16; if (num == 3 && div == 2) res = 18; else if(num == 2 && div == 3) res = 16; else if (num == 1) { if (div == 1) res = 17; else res = 17 - div; } else if (div == 1) res = 17 + num; return (res / float(LFO_BPM_STEPS + 2)); } }//(End)namespace func #endif /*NUMERICFUNCS_H*/ yoshimi-2.3.5.1/src/Misc/Part.cpp000066400000000000000000001735021506652756400164650ustar00rootroot00000000000000/* Part.cpp - Part implementation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, James Morris Copyright 2009-2011, Alan Calvert Copyright 2014-2019, Will Godfrey Copyright 2021 Kristian Amlie & others Copyright 2022-2024 Ichthyostega & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include "Params/ADnoteParameters.h" #include "Params/SUBnoteParameters.h" #include "Params/PADnoteParameters.h" #include "Synth/ADnote.h" #include "Synth/SUBnote.h" #include "Synth/PADnote.h" #include "Params/Controller.h" #include "Effects/EffectMgr.h" #include "DSP/FFTwrapper.h" #include "Misc/XMLStore.h" #include "Misc/Microtonal.h" #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Misc/FileMgrFuncs.h" #include "Misc/NumericFuncs.h" #include "Misc/FormatFuncs.h" #include "Interface/TextLists.h" #include "Synth/Resonance.h" #include "Misc/Part.h" #include using synth::velF; using file::isRegularFile; using file::setExtension; using file::findLeafName; using func::findSplitPoint; using func::setAllPan; using func::decibel; using std::string; Part::Part(uchar id, Microtonal* microtonal_, fft::Calc& fft_, SynthEngine& _synth) : ctl{new Controller(&_synth)} , partID{id} , partoutl(_synth.buffersize) , partoutr(_synth.buffersize) , tmpoutl(_synth.getRuntime().genMixl) // Note: alias to a global shared buffer , tmpoutr(_synth.getRuntime().genMixr) , microtonal{microtonal_} , fft{fft_} , prevNote{-1} , prevPos{0} , prevFreq{-1.0f} , prevLegatoMode{false} , killallnotes(false) , oldFilterState{-1} , oldFilterQstate{-1} , oldBendState{-1} , oldVolumeState{-1} , oldVolumeAdjust{-1} , oldModulationState{-1} , omniByCC{false} , synth{_synth} { for (int n = 0; n < NUM_KIT_ITEMS; ++n) { kit[n].Pname.clear(); kit[n].adpars = NULL; kit[n].subpars = NULL; kit[n].padpars = NULL; } kit[0].adpars = new ADnoteParameters(fft, synth); kit[0].subpars = new SUBnoteParameters(synth); kit[0].padpars = new PADnoteParameters(partID, 0, synth); // Part's Insertion Effects init for (int nefx = 0; nefx < NUM_PART_EFX; ++nefx) partefx[nefx] = new EffectMgr(1, synth); for (int n = 0; n < NUM_PART_EFX + 1; ++n) { partfxinputl[n].reset(synth.buffersize); partfxinputr[n].reset(synth.buffersize); Pefxbypass[n] = false; } int i, j; for (i = 0; i < POLYPHONY; ++i) { partnote[i].status = KEY_OFF; partnote[i].note = -1; partnote[i].itemsplaying = 0; for (j = 0; j < NUM_KIT_ITEMS; ++j) { partnote[i].kitItem[j].adnote = NULL; partnote[i].kitItem[j].subnote = NULL; partnote[i].kitItem[j].padnote = NULL; } partnote[i].time = 0; } cleanup(); /* * Do we actually need the following two? * defaults is called for all parts at startup by Config.cpp * and Pname is then set to the default name when defaults * calls defaultsinstrument */ Pname.clear(); defaults(0); } void Part::reset(int npart) { cleanup(); defaults(npart); synth.setPartMap(npart); synth.partonoffWrite(npart, 1); } void Part::defaults(int npart) { Penabled = 0; Pminkey = 0; Pmaxkey = 127; Pkeymode = PART_NORMAL; PchannelATchoice = 0; PkeyATchoice = 0; setVolume(96); TransVolume = 128; // ensure it always gets set Pkeyshift = 64; oldFilterState = -1; oldBendState = -1; oldVolumeState = -1; oldVolumeAdjust = 0; oldModulationState = -1; setPan(Ppanning = 64); TransPanning = 128; // ensure it always gets set Pvelsns = 64; Pveloffs = 64; Pkeylimit = PART_DEFAULT_LIMIT; Pfrand = 0; Pvelrand = 0; PbreathControl = MIDI::CC::breath; Peffnum = 0; setDestination(1); busy = false; defaultsinstrument(); ctl->resetall(); Prcvchn = npart % NUM_MIDI_CHANNELS; Pomni = false; setNoteMap(0); } void Part::setNoteMap(int keyshift) { for (int i = 0; i < MAX_OCTAVE_SIZE; ++i) { if (Pdrummode) PnoteMap[i] = microtonal->getFixedNoteFreq(i); else { PnoteMap[i] = microtonal->getNoteFreq(i, keyshift + synth.Pkeyshift - 64); } } } void Part::defaultsinstrument() { Pname = DEFAULT_NAME; Poriginal = UNTITLED; PyoshiType = false; info.Ptype = 0; info.Pauthor.clear(); info.Pcomments.clear(); Pkitmode = 0; PkitfadeType = 0; Pdrummode = 0; Pfrand = 0; Pvelrand = 0; for (int n = 0; n < NUM_KIT_ITEMS; ++n) { kit[n].Penabled = 0; kit[n].Pmuted = 0; kit[n].Pminkey = 0; kit[n].Pmaxkey = MAX_OCTAVE_SIZE - 1; kit[n].Padenabled = 0; kit[n].Psubenabled = 0; kit[n].Ppadenabled = 0; kit[n].Pname.clear(); kit[n].Psendtoparteffect = 0; if (n != 0) setkititemstatus(n, 0); } kit[0].Penabled = 1; kit[0].Padenabled = 1; kit[0].adpars->defaults(); kit[0].subpars->defaults(); kit[0].padpars->defaults(); for (int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { partefx[nefx]->defaults(); Pefxroute[nefx] = 0; // route to next effect } Peffnum = 0; } // Cleanup the part void Part::cleanup() { int enablepart = Penabled; Penabled = 0; for (int k = 0; k < POLYPHONY; ++k) KillNotePos(k); memset(partoutl.get(), 0, synth.bufferbytes); memset(partoutr.get(), 0, synth.bufferbytes); for (int nefx = 0; nefx < NUM_PART_EFX; ++nefx) partefx[nefx]->cleanup(); for (int n = 0; n < NUM_PART_EFX + 1; ++n) { memset(partfxinputl[n].get(), 0, synth.bufferbytes); memset(partfxinputr[n].get(), 0, synth.bufferbytes); } Penabled = enablepart; } Part::~Part() { cleanup(); for (int n = 0; n < NUM_KIT_ITEMS; ++n) { if (kit[n].adpars) delete kit[n].adpars; if (kit[n].subpars) delete kit[n].subpars; if (kit[n].padpars) delete kit[n].padpars; } for (int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { if (partefx[nefx]) delete partefx[nefx]; } } void Part::setChannelAT(int type, int value) { if (type & PART::aftertouchType::filterCutoff) { if (value > 0) { if (oldFilterState == -1) oldFilterState = ctl->filtercutoff.data; float adjust = oldFilterState / 127.0f; if (type & PART::aftertouchType::filterCutoffDown) ctl->setfiltercutoff(oldFilterState - (value * adjust)); else ctl->setfiltercutoff(oldFilterState + (value * adjust)); } else { ctl->setfiltercutoff(oldFilterState); oldFilterState = -1; } } if (type & PART::aftertouchType::filterQ) { if (value > 0) { if (oldFilterQstate == -1) oldFilterQstate = ctl->filterq.data; float adjust = oldFilterQstate / 127.0f; if (type & PART::aftertouchType::filterQdown) ctl->setfilterq(oldFilterQstate - (value * adjust)); else ctl->setfilterq(oldFilterQstate + (value * adjust)); } else { ctl->setfilterq(oldFilterQstate); oldFilterQstate = -1; } } if (type & PART::aftertouchType::pitchBend) { if (value > 0) { if (oldBendState == -1) oldBendState = ctl->pitchwheel.data; value *= 64.0f; if (type & PART::aftertouchType::pitchBendDown) ctl->setpitchwheel(-value); else ctl->setpitchwheel(value); } else { ctl->setpitchwheel(oldBendState); oldBendState = -1; } } if (type & PART::aftertouchType::volume) { if (value > 0) { //float adjust = 0; if (oldVolumeState == -1) { oldVolumeState = Pvolume; oldVolumeAdjust = 127 - oldVolumeState; } //adjust = 127 - oldVolumeState; setVolume(oldVolumeState + (value / 127.0f * oldVolumeAdjust)); } else { setVolume(oldVolumeState); oldVolumeState = -1; } } if (type & PART::aftertouchType::modulation) { if (value > 1) // 1 seems to foldback :( { if (oldModulationState == -1) oldModulationState = ctl->modwheel.data; ctl->setmodwheel(value); } else { ctl->setmodwheel(oldModulationState); oldModulationState = -1; } } } void Part::setKeyAT(int note, int type, int value) { if (note < Pminkey || note > Pmaxkey) return; for (int i = 0; i < POLYPHONY; ++i) { if (partnote[i].status != KEY_OFF && partnote[i].note == note) { partnote[i].keyATtype = type; partnote[i].keyATvalue = value; } } } namespace { // Helpers to handle the tree kinds of KitItemNotes uniformly... template inline void connectNewLegatoNote(NOTE*& oldNote ,NOTE*& newNote ,Note noteData) { if (oldNote) { // spawn new note as clone from previous note newNote = new NOTE(*oldNote); // instruct both notes to perform a short "legato" crossfade newNote->legatoFadeIn(noteData); oldNote->legatoFadeOut(); } } template inline void activateLegatoPortamento(NOTE*& activeNote, Note noteData) { if (activeNote) activeNote->performPortamento(noteData); } }//(End)KitItemNote helpers // Start a regular note or a new Legato chain void Part::startNewNotes(int pos, size_t item, size_t currItem, Note note, bool portamento) { if (kit[item].adpars && kit[item].Padenabled) partnote[pos].kitItem[currItem].adnote = new ADnote(*kit[item].adpars, *ctl, note, portamento); if (kit[item].subpars && kit[item].Psubenabled) partnote[pos].kitItem[currItem].subnote = new SUBnote(*kit[item].subpars, *ctl, note, portamento); if (kit[item].padpars && kit[item].Ppadenabled) partnote[pos].kitItem[currItem].padnote = new PADnote(*kit[item].padpars, *ctl, note, portamento); // Each Kit-item can send to any Part(Insert) effect, or just directly to Part-output (encoded as Psendtoparteffect==127) // The part effects in turn can send to the next one (default) or to some effect downstream or to output. // In no-Kit-Mode, Psendtoparteffect is initialised to 0 (i.e. sends to first Part(Insert) effect. partnote[pos].kitItem[currItem].sendtoparteffect = (kit[item].Psendtoparteffect < NUM_PART_EFX)? kit[item].Psendtoparteffect : NUM_PART_EFX; // direct to Part-output incrementItemsPlaying(pos,currItem); } // Initiate a Legato transition. // Spawn a new note at partnote[pos] and connect it with the previously spawned note (prevPos) void Part::startLegato(int pos, size_t item, size_t currItem, Note note) { if (kit[item].Padenabled) connectNewLegatoNote(partnote[prevPos].kitItem[currItem].adnote // oldNote ,partnote[pos] .kitItem[currItem].adnote // newNote ,note); if (kit[item].Psubenabled) connectNewLegatoNote(partnote[prevPos].kitItem[currItem].subnote // oldNote ,partnote[pos] .kitItem[currItem].subnote // newNote ,note); if (kit[item].Ppadenabled) connectNewLegatoNote(partnote[prevPos].kitItem[currItem].padnote // oldNote ,partnote[pos] .kitItem[currItem].padnote // newNote ,note); partnote[pos].kitItem[currItem].sendtoparteffect = (kit[item].Psendtoparteffect < NUM_PART_EFX)? kit[item].Psendtoparteffect : NUM_PART_EFX; // direct to Part-output partnote[prevPos].status = KEY_RELEASED; // treat legato crossfade similar to envelope-release incrementItemsPlaying(pos,currItem); } // Portamento combined with Legato: instruct the existing note(s) to transition to new note frequency void Part::startLegatoPortamento(int pos, size_t item, size_t currItem, Note note) { if (kit[item].Padenabled) activateLegatoPortamento(partnote[pos].kitItem[currItem].adnote, note); if (kit[item].Psubenabled) activateLegatoPortamento(partnote[pos].kitItem[currItem].subnote, note); if (kit[item].Ppadenabled) activateLegatoPortamento(partnote[pos].kitItem[currItem].padnote, note); incrementItemsPlaying(pos,currItem); } // After allocating a new note or activating Legato/Portamento: keep track of the kitItem-Slots actually activated void Part::incrementItemsPlaying(int pos, size_t currItem) { if ( partnote[pos].kitItem[currItem].adnote ||partnote[pos].kitItem[currItem].subnote ||partnote[pos].kitItem[currItem].padnote ) partnote[pos].itemsplaying++; } // Modified velocity for the given kit item to blend the overlap with the neighbouring item float Part::computeKitItemCrossfade(size_t item, int midiNote) { int range = 0; int position = 0; if (kit[item].Pmaxkey > kit[item + 1].Pminkey && kit[item].Pmaxkey < kit[item + 1].Pmaxkey) { if (midiNote >= kit[item + 1].Pminkey) { range = kit[item].Pmaxkey - kit[item + 1].Pminkey; position = kit[item].Pmaxkey - midiNote; } } else if (kit[item + 1].Pmaxkey > kit[item].Pminkey && kit[item + 1].Pmaxkey < kit[item].Pmaxkey ) // eliminate equal state { if (midiNote <= kit[item + 1].Pmaxkey) { range = kit[item + 1].Pmaxkey - kit[item].Pminkey; position = (midiNote - kit[item].Pminkey); } } assert(range >= 0); assert(position >= 0); if (range) return float(position) / float(range); else return -1; } // Handle "Note ON" event : create new sounding note instances void Part::NoteOn(int note, int velocity, bool renote) { if (note < Pminkey || note > Pmaxkey) return; if (microtonal->Pmappingenabled && (note < microtonal->Pfirstkey || note > microtonal->Plastkey)) return; //outside mapped range // Legato and MonoNote used vars: bool isLegatoMode = false; // legato mode is determined applicable. bool performLegato = false; // the current note actually applies legato. bool isMonoFirstNote = false; // (In Mono/Legato) true when we determined // no other notes are held down or sustained. monoNote[note].noteVolume = 1.0f; // not in use yet if (Pkeymode == PART_NORMAL) {// Polyphony is on enforcekeylimit(); monoNoteHistory.clear(); } else {// Polyphony is off -- possibly re-activate a still held/sustained previous note if (!renote) monoNoteHistory.push_back(note); // add note to the stack of held notes. monoNote[note].velocity = velocity; // store this note's velocity. if (partnote[prevPos].status != KEY_PLAYING && partnote[prevPos].status != KEY_RELEASED_AND_SUSTAINED) { isMonoFirstNote = true; // No other keys are held or sustained. } } //--Find-new-free-Note-position------ int pos = -1; for (int i = 0; i < POLYPHONY; ++i) { if (partnote[i].status == KEY_OFF) { pos = i; break; } } if (pos == -1) { synth.getRuntime().Log("Too many notes - notes > polyphony"); return; // unable to start note -- no state changed } if (Pkeymode > PART_MONO && !Pdrummode) {// Legato mode is on and applicable... isLegatoMode = true; if (!isMonoFirstNote && prevLegatoMode) { // At least one other key is held or sustained, and the // previous note was played while in valid legato mode. performLegato = true; // So we'll do a legato note. } } else if ((Pkeymode & MIDI_NOT_LEGATO) == PART_MONO) {// if the mode is 'mono' turn off all other notes for (int i = 0; i < POLYPHONY; ++i) { if (partnote[i].status == KEY_PLAYING) ReleaseNotePos(i); } ReleaseSustainedKeys(); } prevLegatoMode = isLegatoMode; {// ---start-the-note---- // compute the velocity offset float newVel = velocity; if (Pvelrand >= 1) newVel *= (1 - (synth.numRandom() * Pvelrand * 0.0104f)); float vel = velF(newVel / 127.0f, Pvelsns) + (Pveloffs - 64.0f) / 64.0f; vel = (vel < 0.0f) ? 0.0f : vel; vel = (vel > 1.0f) ? 1.0f : vel; // initialise note frequency float noteFreq; if ((noteFreq = PnoteMap[note]) < 0.0f) return; // the key is not mapped // Humanise if (!Pdrummode && Pfrand >= 1) // otherwise 'off' // this is an approximation to keep the math simple and is about 1 cent out at 50 cents noteFreq *= (1.0f + ((synth.numRandom() - 0.5f) * Pfrand * 0.00115f)); // Portamento if (prevFreq < 1.0f) // happens when first note is played prevFreq = noteFreq; // Initialise Portamento. For Mono/Legato it is disabled on first notes. // Thus, for Portamento to activate, the previous note needs to be still active or sustained, bool portamento{false}; if (Pkeymode == PART_NORMAL || not isMonoFirstNote) portamento = ctl->initportamento(prevFreq, noteFreq, performLegato); if (portamento and performLegato) // actually perform a Legato-Portamento, // thereby re-using the same note position without spawning a new note // Note: NoteOff for the old midiNote will be ignored, since we update partnote[pos].note pos = prevPos; if (portamento) ctl->portamento.noteusing = pos; // allocate or update the note position partnote[pos].status = KEY_PLAYING; partnote[pos].note = note; partnote[pos].keyATtype = PART::aftertouchType::off; partnote[pos].keyATvalue = 0; partnote[pos].itemsplaying = 0; if (performLegato) { if (Pkitmode == 0) {// non-Kit legato or legato-portamento note if (portamento) // just instruct the existing note(s) to transition to new note frequency startLegatoPortamento(pos,0,0, Note{note,noteFreq,vel}); else // spawn new note and connect it to prevPos-note startLegato(pos,0,0, Note{note,noteFreq,vel}); } else {// "kit mode" legato or legato-portamento note size_t prevItems = partnote[pos].itemsplaying; for (size_t item = 0; item < NUM_KIT_ITEMS; ++item) { if (kit[item].Pmuted) continue; if ((note < kit[item].Pminkey) || (note > kit[item].Pmaxkey)) continue; if ((prevNote < kit[item].Pminkey) || (prevNote > kit[item].Pmaxkey)) continue; // We will not perform legato across 2 key regions. size_t currItem = partnote[pos].itemsplaying; if (portamento) startLegatoPortamento(pos,item,currItem, Note{note,noteFreq,vel}); else startLegato(pos,item,currItem, Note{note,noteFreq,vel}); if (Pkitmode == 2 // "single" kit item mode && prevItems < partnote[pos].itemsplaying ) // successfully started at least one legato note break; } if (prevItems == partnote[pos].itemsplaying) // No legato notes were launched, so pretend nothing happened: monoNoteHistory.pop_back(); //...remove last note from the list. } } else {// start regular notes or a new chain of legato notes if (Pkitmode == 0) // non-Kit mode: init Add-, Sub and PAD-notes... startNewNotes(pos,0,0, Note{note,noteFreq,vel}, portamento); else {// init new notes in "kit mode" float mult = -1; for (int item = 0; item < NUM_KIT_ITEMS; ++item) { if (kit[item].Pmuted) continue; if (note < kit[item].Pminkey || note>kit[item].Pmaxkey) continue; size_t currItem = partnote[pos].itemsplaying; float itemVelocity = vel; if (PkitfadeType > 0) // expanded for future changes { if ((item & 1) == 0) { mult = computeKitItemCrossfade(item, note); } else if (mult != -1) mult = 1 - mult; // second in a pair is always the inverse if (mult >= 0) { itemVelocity *= mult; } } startNewNotes(pos,item,currItem, Note{note,noteFreq,itemVelocity}, portamento); if (Pkitmode == 2 // "single" kit item mode and 0 < partnote[pos].itemsplaying ) // successfully started at least one note break; } } } // recall note and pos for portamento and legato prevFreq = noteFreq; prevNote = note; prevPos = pos; } } // Note Off Messages void Part::NoteOff(int note) //release the key { // releasing the last key, while previous keys are still sustained... bool reactivate = Pkeymode > PART_NORMAL && !Pdrummode && (monoNoteHistory.back() == note); // This note is released, thus remove it from the list of held Mono-Note keys. monoNoteHistory.remove(note); reactivate = reactivate && !monoNoteHistory.empty(); for (int i = 0; i < POLYPHONY; ++i) { //first note in, is first out if there are same note multiple times if (partnote[i].status == KEY_PLAYING && partnote[i].note == note) { if (ctl->sustain.sustain) partnote[i].status = KEY_RELEASED_AND_SUSTAINED; else // sustain pedal is not pushed { if (reactivate) monoNoteHistoryRecall(); // re-play most recent note still held. else { ReleaseNotePos(i); break; // only release one note. } } } } } // Controllers void Part::SetController(unsigned int type, int par) { switch (type) { case MIDI::CC::pitchWheel: ctl->setpitchwheel(par); break; case MIDI::CC::expression: ctl->setexpression(par); setVolume(Pvolume); break; case MIDI::CC::portamento: ctl->setportamento(par); break; case MIDI::CC::panning: par = 64 + (par - 64) * (ctl->panning.depth / 64.0); // force float during calculation setPan(par); break; case MIDI::CC::filterCutoff: ctl->setfiltercutoff(par); break; case MIDI::CC::filterQ: ctl->setfilterq(par); break; case MIDI::CC::bandwidth: ctl->setbandwidth(par); break; case MIDI::CC::modulation: ctl->setmodwheel(par); break; case MIDI::CC::fmamp: ctl->setfmamp(par); break; case MIDI::CC::volume: if (ctl->volume.receive) setVolume(par * ctl->volume.volume); break; case MIDI::CC::sustain: ctl->setsustain(par); if (!ctl->sustain.sustain) ReleaseSustainedKeys(); break; case MIDI::CC::allSoundOff: AllNotesOff(); // Panic break; case MIDI::CC::resetAllControllers: ctl->resetall(); ReleaseSustainedKeys(); setVolume(Pvolume); setPan(Ppanning); Pkeymode &= MIDI_NOT_LEGATO; // clear temporary legato mode for (int item = 0; item < NUM_KIT_ITEMS; ++item) { if (!kit[item].adpars) continue; kit[item].adpars->GlobalPar.Reson->sendcontroller(MIDI::CC::resonanceCenter, 1.0); kit[item].adpars->GlobalPar.Reson->sendcontroller(MIDI::CC::resonanceBandwidth, 1.0); } // more update to add here if I add controllers break; case MIDI::CC::allNotesOff: ReleaseAllKeys(); break; case MIDI::CC::resonanceCenter: ctl->setresonancecenter(par); for (int item = 0; item < NUM_KIT_ITEMS; ++item) { if (!kit[item].adpars) continue; kit[item].adpars->GlobalPar.Reson->sendcontroller(MIDI::CC::resonanceCenter, ctl->resonancecenter.relcenter); } break; case MIDI::CC::resonanceBandwidth: ctl->setresonancebw(par); kit[0].adpars->GlobalPar.Reson->sendcontroller(MIDI::CC::resonanceBandwidth, ctl->resonancebandwidth.relbw); break; case MIDI::CC::omniOff: omniByCC = Omni::Disabled; break; case MIDI::CC::omniOn: omniByCC = Omni::Enabled; break; case MIDI::CC::channelPressure: setChannelAT(PchannelATchoice, par); break; case MIDI::CC::keyPressure: { int note = par & 0xff; int value = (par >> 8) & 0xff; int type = PkeyATchoice; if (value == 0) type = 0; setKeyAT(note, type, value); break; } } } // Release the sustained keys void Part::ReleaseSustainedKeys() { //in non-Polyphony mode, reactivate previous active keys when last one is released if ((Pkeymode < PART_MONO || Pkeymode > PART_LEGATO) && (!monoNoteHistory.empty())) if (monoNoteHistory.back() != prevNote) // Sustain controller manipulation would respawn same note repeatedly without this check. monoNoteHistoryRecall(); // To play most recent still held note. for (int i = 0; i < POLYPHONY; ++i) if (partnote[i].status == KEY_RELEASED_AND_SUSTAINED) ReleaseNotePos(i); } // Release all keys void Part::ReleaseAllKeys() { for (int i = 0; i < POLYPHONY; ++i) { if (partnote[i].status != KEY_RELEASED && partnote[i].status != KEY_OFF) //thanks to Frank Neumann ReleaseNotePos(i); } // Clear legato notes, if any. monoNoteHistory.clear(); } // Call NoteOn(...) with the most recent still held key as new note // (Made for Mono/Legato). void Part::monoNoteHistoryRecall() { unsigned char mmrtempnote = monoNoteHistory.back(); // Last list element. NoteOn(mmrtempnote, monoNote[mmrtempnote].velocity, true); } // Release note at position void Part::ReleaseNotePos(int pos) { for (int j = 0; j < NUM_KIT_ITEMS; ++j) { if (partnote[pos].kitItem[j].adnote) partnote[pos].kitItem[j].adnote->releasekey(); if (partnote[pos].kitItem[j].subnote) partnote[pos].kitItem[j].subnote->releasekey(); if (partnote[pos].kitItem[j].padnote) partnote[pos].kitItem[j].padnote->releasekey(); } partnote[pos].status = KEY_RELEASED; } // Kill note at position void Part::KillNotePos(int pos) { partnote[pos].status = KEY_OFF; partnote[pos].note = -1; partnote[pos].time = 0; partnote[pos].itemsplaying = 0; for (int j = 0; j < NUM_KIT_ITEMS; ++j) { if (partnote[pos].kitItem[j].adnote) { delete partnote[pos].kitItem[j].adnote; partnote[pos].kitItem[j].adnote = NULL; } if (partnote[pos].kitItem[j].subnote) { delete partnote[pos].kitItem[j].subnote; partnote[pos].kitItem[j].subnote = NULL; } if (partnote[pos].kitItem[j].padnote) { delete partnote[pos].kitItem[j].padnote; partnote[pos].kitItem[j].padnote = NULL; } } if (pos == ctl->portamento.noteusing) { ctl->portamento.noteusing = -1; ctl->portamento.used = 0; } } void Part::enforcekeylimit() { // release old keys if the number of notes>keylimit int notecount = 0; for (int i = 0; i < POLYPHONY; ++i) { if (partnote[i].status == KEY_PLAYING || partnote[i].status == KEY_RELEASED_AND_SUSTAINED) notecount++; } while (notecount > Pkeylimit) { // find out the oldest note int oldestnotepos = 0; int maxtime = 0; for (int i = 0; i < POLYPHONY; ++i) { if ((partnote[i].status == KEY_PLAYING || partnote[i].status == KEY_RELEASED_AND_SUSTAINED) && partnote[i].time > maxtime) { maxtime = partnote[i].time; oldestnotepos = i; } } ReleaseNotePos(oldestnotepos); --notecount; } } // Compute Part samples and store them in the partoutl[] and partoutr[] void Part::ComputePartSmps() { assert(tmpoutl.get() == synth.getRuntime().genMixl.get()); assert(tmpoutr.get() == synth.getRuntime().genMixr.get()); for (int nefx = 0; nefx < NUM_PART_EFX + 1; ++nefx) { memset(partfxinputl[nefx].get(), 0, synth.sent_bufferbytes); memset(partfxinputr[nefx].get(), 0, synth.sent_bufferbytes); } for (int k = 0; k < POLYPHONY; ++k) { int oldFilterState; int oldBendState; int oldModulationState; if (partnote[k].status == KEY_OFF) continue; int noteplay = 0; // 0 if there is nothing activated partnote[k].time++; int keyATtype = partnote[k].keyATtype; int keyATvalue = partnote[k].keyATvalue; if (keyATtype & PART::aftertouchType::filterCutoff) { oldFilterState = ctl->filtercutoff.data; float adjust = oldFilterState / 127.0f; if (keyATtype & PART::aftertouchType::filterCutoffDown) ctl->setfiltercutoff(oldFilterState - (keyATvalue * adjust)); else ctl->setfiltercutoff(oldFilterState + (keyATvalue * adjust)); } if (keyATtype & PART::aftertouchType::filterQ) { oldFilterQstate = ctl->filterq.data; float adjust = oldFilterQstate / 127.0f; if (keyATtype & PART::aftertouchType::filterQdown) ctl->setfilterq(oldFilterQstate - (keyATvalue * adjust)); else ctl->setfilterq(oldFilterQstate + (keyATvalue * adjust)); } if (keyATtype & PART::aftertouchType::pitchBend) { keyATvalue *= 64.0f; oldBendState = ctl->pitchwheel.data; if (keyATtype & PART::aftertouchType::pitchBendDown) ctl->setpitchwheel(-keyATvalue); else ctl->setpitchwheel(keyATvalue); } if (keyATtype & PART::aftertouchType::modulation) { oldModulationState = ctl->modwheel.data; ctl->setmodwheel(keyATvalue); } // get the sampledata of the note and kill it if it's finished for (size_t item = 0; item < partnote[k].itemsplaying; ++item) { int sendcurrenttofx = partnote[k].kitItem[item].sendtoparteffect; ADnote *adnote = partnote[k].kitItem[item].adnote; SUBnote *subnote = partnote[k].kitItem[item].subnote; PADnote *padnote = partnote[k].kitItem[item].padnote; // get from the ADnote if (adnote) { noteplay++; adnote->noteout(tmpoutl.get(), tmpoutr.get()); for (int i = 0; i < synth.sent_buffersize; ++i) { // add the ADnote to part(mix) partfxinputl[sendcurrenttofx][i] += tmpoutl[i]; partfxinputr[sendcurrenttofx][i] += tmpoutr[i]; } if (adnote->finished()) { delete partnote[k].kitItem[item].adnote; partnote[k].kitItem[item].adnote = NULL; } } // get from the SUBnote if (subnote) { noteplay++; subnote->noteout(tmpoutl.get(), tmpoutr.get()); for (int i = 0; i < synth.sent_buffersize; ++i) { // add the SUBnote to part(mix) partfxinputl[sendcurrenttofx][i] += tmpoutl[i]; partfxinputr[sendcurrenttofx][i] += tmpoutr[i]; } if (subnote->finished()) { delete partnote[k].kitItem[item].subnote; partnote[k].kitItem[item].subnote = NULL; } } // get from the PADnote if (padnote) { noteplay++; padnote->noteout(tmpoutl.get(), tmpoutr.get()); for (int i = 0 ; i < synth.sent_buffersize; ++i) { // add the PADnote to part(mix) partfxinputl[sendcurrenttofx][i] += tmpoutl[i]; partfxinputr[sendcurrenttofx][i] += tmpoutr[i]; } if (padnote->finished()) { delete partnote[k].kitItem[item].padnote; partnote[k].kitItem[item].padnote = NULL; } } } // Kill note if there is no synth on that note if (noteplay == 0) KillNotePos(k); if (keyATtype & PART::aftertouchType::filterCutoff) ctl->setfiltercutoff(oldFilterState); if (keyATtype & PART::aftertouchType::filterQ) ctl->setfilterq(oldFilterQstate); if (keyATtype & PART::aftertouchType::pitchBend) ctl->setpitchwheel(oldBendState); if (keyATtype & PART::aftertouchType::modulation) ctl->setmodwheel(oldModulationState); } // Apply part's effects and mix them for (int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { if (!Pefxbypass[nefx]) { partefx[nefx]->out(partfxinputl[nefx].get(), partfxinputr[nefx].get()); if (Pefxroute[nefx] == 2) { for (int i = 0; i < synth.sent_buffersize; ++i) { partfxinputl[nefx + 1][i] += partefx[nefx]->efxoutl[i]; partfxinputr[nefx + 1][i] += partefx[nefx]->efxoutr[i]; } } } int routeto = (Pefxroute[nefx] == 0) ? nefx + 1 : NUM_PART_EFX; for (int i = 0; i < synth.sent_buffersize; ++i) { partfxinputl[routeto][i] += partfxinputl[nefx][i]; partfxinputr[routeto][i] += partfxinputr[nefx][i]; } } memcpy(partoutl.get(), partfxinputl[NUM_PART_EFX].get(), synth.sent_bufferbytes); memcpy(partoutr.get(), partfxinputr[NUM_PART_EFX].get(), synth.sent_bufferbytes); // Kill All Notes if killallnotes true if (killallnotes) { for (int i = 0; i < synth.sent_buffersize; ++i) { float tmp = (synth.sent_buffersize - i) / synth.sent_buffersize_f; partoutl[i] *= tmp; partoutr[i] *= tmp; } for (int k = 0; k < POLYPHONY; ++k) KillNotePos(k); killallnotes = 0; for (int nefx = 0; nefx < NUM_PART_EFX; ++nefx) partefx[nefx]->cleanup(); } ctl->updateportamento(); } // Parameter control void Part::setVolume(float value) { Pvolume = value; } void Part::checkVolume(float step) { TransVolume += step; volume = decibel<-40>(1.0f - TransVolume/96.0f); if (volume < 0.01015f) // done to get a smooth cutoff at what was - 40dB volume = 0.0f; } void Part::setDestination(int value) { Paudiodest = value; } void Part::setPan(float value) { Ppanning = value; } void Part::checkPanning(float step, unsigned char panLaw) { //float t; TransPanning += step; float actualPan = ((TransPanning + 1.0f) * (126.0f / 127.0f)); // resolves min value full Left setAllPan(actualPan, pangainL,pangainR, panLaw); } // Enable or disable a kit item void Part::setkititemstatus(int kititem, int Penabled_) { if (kititem == 0 || kititem >= NUM_KIT_ITEMS) return; // nonexistent kit item and the first kit item is always enabled kit[kititem].Penabled = Penabled_; bool resetallnotes = false; if (!Penabled_) { kit[kititem].Pmuted = 0; kit[kititem].Padenabled = 0; kit[kititem].Psubenabled = 0; kit[kititem].Ppadenabled = 0; kit[kititem].Pname.clear(); kit[kititem].Psendtoparteffect = 0; if (kit[kititem].adpars) { delete kit[kititem].adpars; kit[kititem].adpars = NULL; } if (kit[kititem].subpars) { delete kit[kititem].subpars; kit[kititem].subpars = NULL; } if (kit[kititem].padpars) { delete kit[kititem].padpars; kit[kititem].padpars = NULL; resetallnotes = true; } } else { if (!kit[kititem].adpars) kit[kititem].adpars = new ADnoteParameters(fft, synth); if (!kit[kititem].subpars) kit[kititem].subpars = new SUBnoteParameters(synth); if (!kit[kititem].padpars) kit[kititem].padpars = new PADnoteParameters(partID,kititem, synth); } if (resetallnotes) for (int k = 0; k < POLYPHONY; ++k) KillNotePos(k); } /** * store the basic Instrument data * @remark this is the ZynAddSubFX compatible part, * without controllers and setup */ void Part::add2XML_InstrumentData(XMLtree& xmlInstrument) { XMLtree xmlInfo = xmlInstrument.addElm("INFO"); xmlInfo.addPar_str("name" , Poriginal); xmlInfo.addPar_str("author" , info.Pauthor); xmlInfo.addPar_str("comments", info.Pcomments); xmlInfo.addPar_int("type" , type_offset[info.Ptype]); xmlInfo.addPar_str("file" , Pname); if (Pname == DEFAULT_NAME) return; XMLtree xmlKit = xmlInstrument.addElm("INSTRUMENT_KIT"); xmlKit.addPar_int ("kit_mode" , Pkitmode); xmlKit.addPar_bool("kit_crossfade", PkitfadeType != 0); // for backward compatibility xmlKit.addPar_int ("kit_fadetype" , PkitfadeType); xmlKit.addPar_bool("drum_mode" , Pdrummode); for (uint i = 0; i < NUM_KIT_ITEMS; ++i) { XMLtree xmlKitItem = xmlKit.addElm("INSTRUMENT_KIT_ITEM", i); xmlKitItem.addPar_bool("enabled", kit[i].Penabled); if (kit[i].Penabled) { xmlKitItem.addPar_str("name", kit[i].Pname); xmlKitItem.addPar_bool("muted", kit[i].Pmuted); xmlKitItem.addPar_int ("min_key", kit[i].Pminkey); xmlKitItem.addPar_int ("max_key", kit[i].Pmaxkey); xmlKitItem.addPar_int ("send_to_instrument_effect", kit[i].Psendtoparteffect); xmlKitItem.addPar_bool("add_enabled", kit[i].Padenabled); if (kit[i].Padenabled and kit[i].adpars) { XMLtree xmlAddSynth = xmlKitItem.addElm("ADD_SYNTH_PARAMETERS"); kit[i].adpars->add2XML(xmlAddSynth); } xmlKitItem.addPar_bool("sub_enabled", kit[i].Psubenabled); if (kit[i].Psubenabled and kit[i].subpars) { XMLtree xmlSubSynth = xmlKitItem.addElm("SUB_SYNTH_PARAMETERS"); kit[i].subpars->add2XML(xmlSubSynth); } xmlKitItem.addPar_bool("pad_enabled", kit[i].Ppadenabled); if (kit[i].Ppadenabled and kit[i].padpars) { XMLtree xmlPadSynth = xmlKitItem.addElm("PAD_SYNTH_PARAMETERS"); kit[i].padpars->add2XML(xmlPadSynth); } } } XMLtree xmlEffects = xmlInstrument.addElm("INSTRUMENT_EFFECTS"); for (uint nefx = 0; nefx < NUM_PART_EFX; ++nefx) { XMLtree xmlEff = xmlEffects.addElm("INSTRUMENT_EFFECT", nefx); XMLtree xmlEffectSettings = xmlEff.addElm("EFFECT"); partefx[nefx]->add2XML(xmlEffectSettings); xmlEff.addPar_bool("bypass",Pefxbypass[nefx]); xmlEff.addPar_int ("route", Pefxroute[nefx]); } } /** store Instrument data and additional setup captured in state files and Vectors */ void Part::add2XML_YoshimiPartSetup(XMLtree& xmlPart) { // additional setup for this part... xmlPart.addPar_bool("enabled" ,(Penabled == 1)); xmlPart.addPar_int("volume" , Pvolume); xmlPart.addPar_int("panning" , Ppanning); xmlPart.addPar_int("min_key" , Pminkey); xmlPart.addPar_int("max_key" , Pmaxkey); xmlPart.addPar_int("key_shift", Pkeyshift); xmlPart.addPar_int("rcv_chn" , Prcvchn); xmlPart.addPar_bool("omni" , Pomni); xmlPart.addPar_int("velocity_sensing" , Pvelsns); xmlPart.addPar_int("velocity_offset" , Pveloffs); // the following two lines maintain backward compatibility xmlPart.addPar_bool("poly_mode" , (Pkeymode & MIDI_NOT_LEGATO) == PART_NORMAL); xmlPart.addPar_int("legato_mode" , (Pkeymode & MIDI_NOT_LEGATO) == PART_LEGATO); xmlPart.addPar_int("channel_aftertouch", PchannelATchoice); xmlPart.addPar_int("key_aftertouch" , PkeyATchoice); xmlPart.addPar_int("key_limit" , Pkeylimit); xmlPart.addPar_int("random_detune" , Pfrand); xmlPart.addPar_int("random_velocity" , Pvelrand); xmlPart.addPar_int("destination" , Paudiodest); XMLtree xmlInstrument = xmlPart.addElm("INSTRUMENT"); add2XML_InstrumentData(xmlInstrument); XMLtree xmlController = xmlPart.addElm("CONTROLLER"); ctl->add2XML(xmlController); } /** store Instrument data and additional info persisted in Yoshimi instrument format */ void Part::add2XML_YoshimiInstrument(XMLtree& xmlPart) { XMLtree xmlInstrument = xmlPart.addElm("INSTRUMENT"); add2XML_InstrumentData(xmlInstrument); // additional characteristics saved in Yoshimi instrument format.... xmlInstrument.addPar_int ("key_mode" , Pkeymode & MIDI_NOT_LEGATO); xmlInstrument.addPar_int ("channel_aftertouch", PchannelATchoice); xmlInstrument.addPar_int ("key_aftertouch" , PkeyATchoice); xmlInstrument.addPar_int ("random_detune" , Pfrand); xmlInstrument.addPar_int ("random_velocity" , Pvelrand); xmlInstrument.addPar_bool("breath_disable" , PbreathControl != MIDI::CC::breath); XMLtree xmlController = xmlPart.addElm("CONTROLLER"); ctl->add2XML(xmlController); } /** collect meta information regarding usage of Synth components. * @remark this info is retrieved from storage when creating a bank index * and the used subsequently for colouring of the instrument labels. */ void Part::add2XML_synthUsage(XMLtree& xmlInfo) { bool usesAdd{false}; bool usesSub{false}; bool usesPad{false}; for (uint i = 0; i < NUM_KIT_ITEMS; ++i) { if (kit[i].Penabled) { usesAdd |= (kit[i].Padenabled and kit[i].adpars); usesSub |= (kit[i].Psubenabled and kit[i].subpars); usesPad |= (kit[i].Ppadenabled and kit[i].padpars); } } xmlInfo.addPar_bool("ADDsynth_used", usesAdd); xmlInfo.addPar_bool("SUBsynth_used", usesSub); xmlInfo.addPar_bool("PADsynth_used", usesPad); /* * _Historical Note (Hermann)_: in 5/2025 the interface for handling XML was * reworked, including the way how meta information are checked and processed. * The original code relied on a statefull "XMLwrapper", which was _navigated_ * through the XML tree (while the new code uses DOM style with sub trees); * when some synth-component was added, also a state flag in the XMLwrapper * was set. Later, when saving to XML, as a side-effect, these three flags * were injected into the node (and if you saved the same * XMLwrapper several times, each time a new set of three params was added). * * Since this is in-memory processing and typically there are not much * kit items, it seems clearer to do a separate traversal to collect * and add this info directly; storing this info is essential * for loading roots and banks quickly on start-up. */ } bool Part::saveXML(string filename, bool yoshiFormat) { XMLStore xml{TOPLEVEL::XML::Instrument, not yoshiFormat}; if (Pname < "!") // this shouldn't be possible Pname = UNTITLED; else if ((Poriginal.empty() || Poriginal == UNTITLED) && Pname != UNTITLED) Poriginal = Pname; XMLtree xmlTop = xml.accessTop(); // setup metadata and info node XMLtree xmlInfo = xmlTop.getElm("INFORMATION"); add2XML_synthUsage(xmlInfo); if (yoshiFormat) { filename = setExtension(filename, EXTEN::yoshInst); add2XML_YoshimiInstrument(xmlTop); } else { filename = setExtension(filename, EXTEN::zynInst); XMLtree xmlInstrument = xmlTop.addElm("INSTRUMENT"); add2XML_InstrumentData(xmlInstrument); } return xml.saveXMLfile(filename ,synth.getRuntime().getLogger() ,synth.getRuntime().gzipCompression); } int Part::loadXML(string filename) { bool marked_as_Yoshi = true; filename = setExtension(filename, EXTEN::yoshInst); if (!isRegularFile(filename)) { marked_as_Yoshi = false; filename = setExtension(filename, EXTEN::zynInst); } auto& logg = synth.getRuntime().getLogger(); XMLStore xml{filename, logg}; postLoadCheck(xml,synth); if (not xml) { logg("Part: loadXML failed to load instrument file " + filename); return 0; } XMLtree xmlInstrument = xml.getElm("INSTRUMENT"); if (not xmlInstrument) { logg(filename + " is not an instrument file"); return 0; } defaultsinstrument(); PyoshiType = not xml.meta.isZynCompat(); if (PyoshiType != marked_as_Yoshi) logg("WARNING: file extension does not match Yoshimi format in file \""+filename+"\""); Pname = findLeafName(filename); int chk = findSplitPoint(Pname); if (chk > 0) Pname = Pname.substr(chk + 1, Pname.size() - chk - 1); getfromXML_InstrumentData(xmlInstrument); // possibly changed part-effect; publish to GUI if current part if (int(partID) == synth.getRuntime().currentPart) synth.pushEffectUpdate(partID); if (PyoshiType) {// Yoshimi native format stores additional information with the instrument... Pkeymode = xmlInstrument.getPar_int("key_mode", Pkeymode, PART_NORMAL, MIDI_LEGATO); Pfrand = xmlInstrument.getPar_127("random_detune", Pfrand); if (Pfrand > 50) Pfrand = 50; Pvelrand = xmlInstrument.getPar_127("random_velocity", Pvelrand); if (Pvelrand > 50) Pvelrand = 50; PbreathControl = xmlInstrument.getPar_bool("breath_disable", PbreathControl); if (PbreathControl) PbreathControl = UNUSED; // impossible CC value else PbreathControl = MIDI::CC::breath; } if (XMLtree xmlController = xml.getElm("CONTROLLER")) ctl->getfromXML(xmlController); return 1; } void Part::getfromXML_InstrumentData(XMLtree& xmlInstrument) { assert(xmlInstrument); if (XMLtree xmlInfo = xmlInstrument.getElm("INFO")) { Poriginal = xmlInfo.getPar_str("name"); // counting type numbers but checking the *contents* of type_offset() info.Pauthor = func::formatTextLines(xmlInfo.getPar_str("author"), 54); info.Pcomments = func::formatTextLines(xmlInfo.getPar_str("comments"), 54); int found = xmlInfo.getPar_int("type", 0, -20, 255); // should cover all! int type = 0; int offset = 0; while (offset != UNUSED && offset != found) { ++type; offset = type_offset[type]; } if (offset == UNUSED) type = 0; // undefined info.Ptype = type; // The following is surprisingly complex! if (Pname.empty()) Pname = xmlInfo.getPar_str("file"); if (Poriginal == DEFAULT_NAME) // it's an old one Poriginal = UNTITLED; if (Pname.empty()) // it's an older state file { if (Poriginal.empty()) Pname = UNTITLED; else Pname = Poriginal; } else if (Poriginal.empty() || Poriginal == UNTITLED) // it's one from zyn Poriginal = Pname; if (Pname.empty() && Poriginal == UNTITLED) { Pname = UNTITLED; Poriginal = UNTITLED; } } if (XMLtree xmlKit = xmlInstrument.getElm("INSTRUMENT_KIT")) { Pkitmode = xmlKit.getPar_127("kit_mode", Pkitmode); // 0=off, 1=on, 2="single": only first applicable kit item is playing bool oldfade = xmlKit.getPar_bool("kit_crossfade", false); PkitfadeType = xmlKit.getPar_127 ("kit_fadetype", 0); if (PkitfadeType == 0 and oldfade) PkitfadeType = 1; // it's an older instrument Pdrummode = xmlKit.getPar_bool("drum_mode", Pdrummode); for (int i = 0; i < NUM_KIT_ITEMS; ++i) { if (XMLtree xmlKitItem = xmlKit.getElm("INSTRUMENT_KIT_ITEM", i)) { setkititemstatus(i, xmlKitItem.getPar_bool("enabled", kit[i].Penabled)); if (kit[i].Penabled) { kit[i].Pname = xmlKitItem.getPar_str("name"); kit[i].Pmuted = xmlKitItem.getPar_bool("muted", kit[i].Pmuted); kit[i].Pminkey = xmlKitItem.getPar_127("min_key", kit[i].Pminkey); kit[i].Pmaxkey = xmlKitItem.getPar_127("max_key", kit[i].Pmaxkey); kit[i].Psendtoparteffect = xmlKitItem.getPar_127("send_to_instrument_effect" ,kit[i].Psendtoparteffect); kit[i].Padenabled = xmlKitItem.getPar_bool("add_enabled", kit[i].Padenabled); if (XMLtree xmlAddSynth = xmlKitItem.getElm("ADD_SYNTH_PARAMETERS")) { kit[i].adpars->getfromXML(xmlAddSynth); } kit[i].Psubenabled = xmlKitItem.getPar_bool("sub_enabled", kit[i].Psubenabled); if (XMLtree xmlSubSynth = xmlKitItem.getElm("SUB_SYNTH_PARAMETERS")) { kit[i].subpars->getfromXML(xmlSubSynth); } kit[i].Ppadenabled = xmlKitItem.getPar_bool("pad_enabled", kit[i].Ppadenabled); if (XMLtree xmlPadSynth = xmlKitItem.getElm("PAD_SYNTH_PARAMETERS")) { busy = true; kit[i].padpars->getfromXML(xmlPadSynth); busy = false; } } } } } else {// no defaultsinstrument(); return; } if (XMLtree xmlEffects = xmlInstrument.getElm("INSTRUMENT_EFFECTS")) { for (uint nefx = 0; nefx < NUM_PART_EFX; ++nefx) { if (XMLtree xmlEff = xmlEffects.getElm("INSTRUMENT_EFFECT", nefx)) { if (XMLtree xmlEffectSettings = xmlEff.getElm("EFFECT")) partefx[nefx]->getfromXML(xmlEffectSettings); Pefxbypass[nefx] = xmlEff.getPar_bool("bypass", Pefxbypass[nefx]); Pefxroute[nefx] = xmlEff.getPar_int("route", Pefxroute[nefx], 0, NUM_PART_EFX); partefx[nefx]->setdryonly(Pefxroute[nefx] == 2); } } } } void Part::getfromXML(XMLtree& xmlPart) { // Note: the first block (anything before the ) // is only present in Zyn-Format instruments Penabled = xmlPart.getPar_bool("enabled", Penabled); setVolume(xmlPart.getPar_127("volume" , Pvolume )); setPan (xmlPart.getPar_127("panning" , Ppanning)); Pminkey = xmlPart.getPar_127("min_key", Pminkey); Pmaxkey = xmlPart.getPar_127("max_key", Pmaxkey); Pkeyshift = xmlPart.getPar_int("key_shift", Pkeyshift, MIN_KEY_SHIFT + 64, MAX_KEY_SHIFT + 64); Prcvchn = xmlPart.getPar_127("rcv_chn", Prcvchn); Pomni = xmlPart.getPar_bool("omni", Pomni); Pvelsns = xmlPart.getPar_127("velocity_sensing", Pvelsns); Pveloffs = xmlPart.getPar_127("velocity_offset", Pveloffs); bool Ppolymode = 1; bool Plegatomode = 0; Ppolymode = xmlPart.getPar_bool("poly_mode", Ppolymode); Plegatomode = xmlPart.getPar_bool("legato_mode", Plegatomode); // older versions if (!Plegatomode) Plegatomode = xmlPart.getPar_127("legato_mode", Plegatomode); if (Plegatomode) // these lines are for backward compatibility Pkeymode = PART_LEGATO; else if (Ppolymode) Pkeymode = PART_NORMAL; else Pkeymode = PART_MONO; PchannelATchoice = xmlPart.getPar_int("channel_aftertouch", PchannelATchoice, 0, 255); PkeyATchoice = xmlPart.getPar_int("key_aftertouch", PkeyATchoice, 0, 255); Pkeylimit = xmlPart.getPar_127("key_limit", Pkeylimit); if (Pkeylimit < 1 or Pkeylimit > POLYPHONY) Pkeylimit = POLYPHONY; Pfrand = xmlPart.getPar_int("random_detune", Pfrand, 0,50); Pvelrand = xmlPart.getPar_int("random_velocity", Pvelrand, 0,50); setDestination(xmlPart.getPar_127("destination", Paudiodest)); if (XMLtree xmlInstrument = xmlPart.getElm("INSTRUMENT")) { Pname.clear(); // erase any previous name getfromXML_InstrumentData(xmlInstrument); } if (XMLtree xmlController = xmlPart.getElm("CONTROLLER")) { ctl->getfromXML(xmlController); } } float Part::getLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int npart = getData->data.part; unsigned char type = 0; // part defaults int min = 0; float def = 64; int max = 127; type |= TOPLEVEL::type::Integer; uchar learnable = TOPLEVEL::type::Learnable; if ((control >= PART::control::volumeRange && control <= PART::control::receivePortamento) || control == PART::control::resetAllControllers) return ctl->getLimits(getData); switch (control) { case PART::control::enable: if (npart == 0) def = 1; else def = 0; max = 1; break; case PART::control::enableAdd: type |= learnable; if (npart == 0) def = 1; else def = 0; max = 1; break; case PART::control::enableSub: case PART::control::enablePad: type |= learnable; def = 0; max = 1; break; case PART::control::enableKitLine: def = 0; max = 1; break; case PART::control::volume: type &= ~TOPLEVEL::type::Integer; type |= learnable; def = 96; break; case PART::control::velocitySense: case PART::control::velocityOffset: type |= learnable; break; case PART::control::panning: type &= ~TOPLEVEL::type::Integer; type |= learnable; break; case PART::control::midiChannel: min = 0; def = 0; max = (NUM_MIDI_CHANNELS * 3) - 1; /* * 0 - 15 Normal * 16 - 31 note off only * 32 - 47 disabled */ break; case PART::control::omni: min = 0; def = 0; max = 1; break; case PART::control::channelATset: case PART::control::keyATset: min = 0; def = 0; max = PART::aftertouchType::modulation * 2; break; case PART::control::keyMode: def = 0; max = 2; break; case PART::control::portamento: type |= learnable; def = 0; max = 1; break; case PART::control::kitItemMute: type |= learnable; def = 0; max = 1; break; case PART::control::minNote: def = 0; break; case PART::control::maxNote: def = 127; break; case PART::control::minToLastKey: case PART::control::maxToLastKey: case PART::control::resetMinMaxKey: def = 0; max = 0; break; case PART::control::kitEffectNum: def = 1; // may be local to GUI max = 3; break; case PART::control::maxNotes: def = 20; max = POLYPHONY; break; case PART::control::keyShift: min = -36; def = 0; max = 36; break; case PART::control::partToSystemEffect1: case PART::control::partToSystemEffect2: case PART::control::partToSystemEffect3: case PART::control::partToSystemEffect4: type |= learnable; def = 0; break; case PART::control::humanise: type |= learnable; def = 0; max = 50; break; case PART::control::humanvelocity: type |= learnable; def = 0; max = 50; break; case PART::control::drumMode: def = 0; max = 1; break; case PART::control::kitMode: def = 0; max = 3; break; case PART::control::effectNumber: max = 2; def = 0; break; case PART::control::effectType: def = 0; break; case PART::control::effectDestination: max = 2; def = 0; break; case PART::control::effectBypass: type |= learnable; max = 1; def = 0; break; case PART::control::audioDestination: min = 1; def = 1; max = 3; break; case PART::control::midiModWheel: type |= learnable; break; case PART::control::midiBreath: // not done yet break; case PART::control::midiExpression: type |= learnable; def = 127; break; case PART::control::midiSustain: // not done yet break; case PART::control::midiPortamento: // not done yet break; case PART::control::midiFilterQ: type |= learnable; break; case PART::control::midiFilterCutoff: type |= learnable; break; case PART::control::midiBandwidth: type |= learnable; break; // the following have no limits but are here so they don't // create errors when tested. case PART::control::instrumentCopyright: break; case PART::control::instrumentComments: break; case PART::control::instrumentName: break; case PART::control::instrumentType: break; case PART::control::defaultInstrumentCopyright: break; case 255: // number of parts min = 16; def = 16; max = 64; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Misc/Part.h000066400000000000000000000216051506652756400161260ustar00rootroot00000000000000/* Part.h - Part implementation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011 Alan Calvert Copyright 2014-2024, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #ifndef PART_H #define PART_H #include "globals.h" #include "DSP/FFTwrapper.h" #include "Params/ParamCheck.h" #include "Misc/Alloc.h" #include #include #include using std::string; class ADnoteParameters; class SUBnoteParameters; class PADnoteParameters; class ADnote; class SUBnote; class PADnote; class Controller; class Microtonal; class EffectMgr; class XMLtree; class SynthEngine; class Part { public: enum NoteStatus { KEY_OFF, KEY_PLAYING, KEY_RELEASED_AND_SUSTAINED, KEY_RELEASED }; enum class Omni { NotSet, Enabled, Disabled, }; ~Part(); Part(uchar id, Microtonal*, fft::Calc&, SynthEngine&); // shall not be copied or moved Part(Part&&) = delete; Part(Part const&) = delete; Part& operator=(Part&&) = delete; Part& operator=(Part const&) = delete; inline float pannedVolLeft() { return volume * pangainL; } inline float pannedVolRight() { return volume * pangainR; } void reset(int npart); void defaults(int npart); void setNoteMap(int keyshift); void defaultsinstrument(); void cleanup(); // Midi commands implemented void setChannelAT(int type, int value); void setKeyAT(int note, int type, int value); void NoteOn(int note, int velocity, bool renote = false); void NoteOff(int note); void AllNotesOff() { killallnotes = true; }; // panic, prepare all notes to be turned off void SetController(unsigned int type, int par); void ReleaseSustainedKeys(); void ReleaseAllKeys(); void ComputePartSmps(); void resetOmniCC() { omniByCC = Omni::NotSet; } bool isOmni() { return omniByCC == Omni::Enabled or (omniByCC == Omni::NotSet and Pomni); } bool saveXML(string filename, bool yoshiFormat); // result true for load ok, otherwise false int loadXML(string filename); void add2XML_YoshimiPartSetup(XMLtree&); void add2XML_YoshimiInstrument(XMLtree&); void getfromXML(XMLtree&); float getLimits(CommandBlock* getData); std::unique_ptr ctl; // part's kit struct KitItem { string Pname; uchar Penabled; uchar Pmuted; uchar Pminkey; uchar Pmaxkey; uchar Padenabled; uchar Psubenabled; uchar Ppadenabled; uchar Psendtoparteffect; ADnoteParameters *adpars; SUBnoteParameters *subpars; PADnoteParameters *padpars; }; KitItem kit[NUM_KIT_ITEMS]; // Part parameters void enforcekeylimit(); void setkititemstatus(int kititem, int Penabled_); void setVolume(float value); void checkVolume(float step); void setDestination(int value); void checkPanning(float step, uchar panLaw); bool PyoshiType; float PnoteMap[MAX_OCTAVE_SIZE]; float Pvolume; float TransVolume; float Ppanning; float TransPanning; char Penabled; // this *must* be signed uchar Pminkey; uchar Pmaxkey; uchar Pkeyshift; uchar Prcvchn; bool Pomni; uchar Pvelsns; // velocity sensing (amplitude velocity scale) uchar Pveloffs; // velocity offset uchar Pkitmode; // Part uses kit mode: 0 == off, 1 == on, 2 == "Single": only first applicable kit item can play uchar PkitfadeType; // type of cross fade, 0 off (multi) uchar Pdrummode; // if all keys are mapped and the system is 12tET (used for drums) uchar Pkeymode; // 0 = poly, 1 = mono, > 1 = legato; uint PchannelATchoice; uint PkeyATchoice; uchar Pkeylimit; // how many keys can play simultaneously, // time 0 = off, the older will be released float Pfrand; // Part random frequency content float Pvelrand; // Part random velocity content uchar PbreathControl; uchar Peffnum; int Paudiodest; // jack output routing string Pname; string Poriginal; struct Info { uchar Ptype; string Pauthor; string Pcomments; }; Info info; const uchar partID; Samples partoutl; Samples partoutr; Samples partfxinputl[NUM_PART_EFX + 1]; // Left and right signal that pass-through part effects Samples partfxinputr[NUM_PART_EFX + 1]; // [NUM_PART_EFX] is for "no effect" buffer uchar Pefxroute[NUM_PART_EFX]; // how the effect's output is // routed (to next effect/to out) bool Pefxbypass[NUM_PART_EFX + 1]; // if the effects are bypassed, // [NUM_PART_EFX] is for "no effect" buffer EffectMgr *partefx[NUM_PART_EFX]; // insertion part effects - part of the instrument float volume; // applied by MasterAudio float pangainL; float pangainR; bool busy; int getLastNote() const { return this->prevNote; } SynthEngine& getSynthEngine() const {return synth;} private: void getfromXML_InstrumentData(XMLtree&); void add2XML_InstrumentData(XMLtree&); void add2XML_synthUsage(XMLtree&); void setPan(float value); void KillNotePos(int pos); void ReleaseNotePos(int pos); void monoNoteHistoryRecall(); void startNewNotes (int pos, size_t item, size_t currItem, Note, bool portamento); void startLegato (int pos, size_t item, size_t currItem, Note); void startLegatoPortamento(int pos, size_t item, size_t currItem, Note); float computeKitItemCrossfade(size_t item, int midiNote); void incrementItemsPlaying(int pos, size_t currItem); Samples& tmpoutl; Samples& tmpoutr; Microtonal* microtonal; fft::Calc& fft; struct PartNotes { NoteStatus status; int note; // if there is no note playing, "note" = -1 int time; int keyATtype; int keyATvalue; size_t itemsplaying; struct KitItemNotes { ADnote* adnote; SUBnote* subnote; PADnote* padnote; int sendtoparteffect; }; KitItemNotes kitItem[NUM_KIT_ITEMS]; }; // Note: kitItems are "packed", not using the same Index as in KitItem-array PartNotes partnote[POLYPHONY]; int prevNote; // previous MIDI note int prevPos; // previous note pos float prevFreq; // frequency of previous note (for portamento) bool prevLegatoMode; // previous note hat legato mode activated bool killallnotes; // "panic" switch int oldFilterState; // these for channel aftertouch int oldFilterQstate; int oldBendState; float oldVolumeState; float oldVolumeAdjust; int oldModulationState; // MonoNote stuff std::list monoNoteHistory; // held notes. struct { float velocity; float noteVolume; } monoNote[256]; // 256 is to cover all possible note values. monoNote[] // is used in conjunction with the list to store the velocity value of a given note // (the list only store note values). For example: // 'monoNote[note].velocity' would be the velocity value of the note 'note'. Omni omniByCC; SynthEngine& synth; }; #endif /*PART_H*/ yoshimi-2.3.5.1/src/Misc/RandomGen.h000066400000000000000000000146731506652756400171010ustar00rootroot00000000000000/* RandomGen.h Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2018, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Created by refactoring (from SynthEngine.h) December 2018 */ #ifndef RANDOMGEN_H #define RANDOMGEN_H #include #include #include #include using std::memset; // stub implementation for test code : always returns fixed values class NorandomPRNG { public: void init(uint32_t) { } uint32_t prngval() { return INT32_MAX / 2; } float numRandom() { return 0.5f; } uint32_t randomINT(){ return INT32_MAX / 2; } // 0 < randomINT() < INT_MAX }; // Inlined copy of the Glibc 2.28 implementation of random_r() // This code behaves equivalent to Yoshimi versions (< 1.5.10) linked against GNU Glibc-2.24. // Generates 31bit random numbers based on a linear feedback shift register approach, employing trinomials. // Using 256 bytes of random state, which (according to the formula given in the comment in random_r.c of Glibc) // gives a period length of at least deg*(2^deg - 1); with deg=63 this is > 5.8e20 // // The following PRNG implementation is // Copyright (C) 1995-2018 Free Software Foundation, Inc. // It was released within GLibc under the LGPL 2.1 or any later version. // Based on code Copyright (C) 1983 Regents of the University of California. // This code was derived from the Berkeley source: // @(#)random.c 5.5 (Berkeley) 7/6/88 // It was reworked for the GNU C Library by Roland McGrath. // Rewritten to be reentrant by Ulrich Drepper, 1995 class TrinomialPRNG { uint32_t state[63]; uint32_t *fptr; /* Front pointer. */ uint32_t *rptr; /* Rear pointer. */ public: TrinomialPRNG() : fptr(NULL), rptr(NULL) { } void init(uint32_t seed) { int kc = 63; /* random generation uses this trinomial: x**63 + x + 1. */ /* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */ if (seed == 0) seed = 1; state[0] = seed; uint32_t *dst = state; int32_t word = seed; // must be signed, see below for (int i = 1; i < kc; ++i) { /* This does: state[i] = (16807 * state[i - 1]) % 2147483647; but avoids overflowing 31 bits. */ // Ichthyo 12/2018 : the above comment is only true for seed <= INT_MAX // For INT_MAX < seed <= UINT_MAX the calculation diverges from correct // modulus result, however, its values show a similar distribution pattern. // Moreover the original code used long int for 'hi' and 'lo'. // It behaves identical when using uint32_t, but not with int32_t uint32_t hi = word / 127773; uint32_t lo = word % 127773; word = 16807 * lo - 2836 * hi; if (word < 0) word += 2147483647; *++dst = word; } fptr = &state[1]; rptr = &state[0]; kc *= 10; while (--kc >= 0) prngval(); } uint32_t prngval() { uint32_t val = *fptr += *rptr; uint32_t result = val >> 1; // Chucking least random bit. // Rationale: it has a less-then optimal repetition cycle. uint32_t *end = &state[63]; ++fptr; if (fptr >= end) { fptr = state; ++rptr; } else { ++rptr; if (rptr >= end) rptr = state; } // random_result holds number 0...INT_MAX return result; } float numRandom() { return prngval() / float(INT32_MAX); } // random number in the range 0...INT_MAX uint32_t randomINT() { return prngval(); } }; // Pseudo Random Number generator based on jsf32 by Bob Jenkins // "A small noncryptographic PRNG", October 2007 // http://burtleburtle.net/bob/rand/smallprng.html // Runs fast and generates 32bit random numbers of high quality; although there is no guaranteed // minimum cycle length, practical tests yielded 2^47 numbers (128 TiB) until repetition. // We literally use the original Implementation, released by Jenkins 10/2007 into public domain. class JenkinsPRNG { // 128 bit state uint32_t a, b, c, d; public: JenkinsPRNG() : a(0),b(0),c(0),d(0) { } void init(uint32_t seed) { a = 0xf1ea5eed; b = c = d = seed; for (int i = 0; i < 20; ++i) prngval(); } uint32_t prngval() { uint32_t e = a - rot(b, 27); a = b ^ rot(c, 17); b = c + d; c = d + e; d = e + a; return d; } float numRandom() { return float(prngval() >> 1) / float(INT32_MAX); } // random number in the range 0...INT_MAX uint32_t randomINT() { return prngval() >> 1; } private: uint32_t rot(uint32_t x, uint32_t k) { return (x << k)|(x >> (32-k)); } }; /* ===== Configure the actual PRNG to use ===== */ #ifdef NORANDOM typedef NorandomPRNG RandomGen; #else // typedef JenkinsPRNG RandomGen; typedef TrinomialPRNG RandomGen; #endif /*NORANDOM*/ #endif /*RANDOMGEN_H*/ yoshimi-2.3.5.1/src/Misc/SynthEngine.cpp000066400000000000000000003145511506652756400200130ustar00rootroot00000000000000/* SynthEngine.cpp Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2009, James Morris Copyright 2014-2020, Will Godfrey & others Copyright 2022-2023, Will Godfrey, Rainer Hans Liffers Copyright 2024-2025, Will Godfrey, Ichthyostega, Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #include #include #include #include #include #include #include #include #include #include #ifdef GUI_FLTK #include "MasterUI.h" #endif #include "Misc/Alloc.h" #include "Misc/SynthEngine.h" #include "Misc/Config.h" #include "Params/Controller.h" #include "Misc/Part.h" #include "Effects/EffectMgr.h" #include "Misc/TextMsgBuffer.h" #include "Misc/FileMgrFuncs.h" #include "Misc/NumericFuncs.h" #include "Misc/FormatFuncs.h" #include "Misc/XMLStore.h" #include "Synth/OscilGen.h" #include "Params/ADnoteParameters.h" #include "Params/PADnoteParameters.h" #include "Interface/InterfaceAnchor.h" using file::isRegularFile; using file::setExtension; using file::findLeafName; using file::createEmptyFile; using file::deleteFile; using file::make_legit_filename; using func::decibel; using func::bitTest; using func::asString; using func::string2int; using std::this_thread::sleep_for; using std::chrono_literals::operator ""us; using std::chrono::steady_clock; using std::chrono::duration_cast; using std::chrono::time_point; using std::to_string; using std::ofstream; using std::ios_base; using std::string; using std::set; namespace { // Global implementation internal history data static vector InstrumentHistory; static vector ParamsHistory; static vector ScaleHistory; static vector StateHistory; static vector VectorHistory; static vector MidiLearnHistory; static vector PresetHistory; static vector PadHistory; static vector TuningHistory; static vector KeymapHistory; static vector historyLastSeen(TOPLEVEL::XML::ScalaMap + 1, ""); // don't really understand this :( } SynthEngine::SynthEngine(uint instanceID) : uniqueId{instanceID} , Runtime{*this} , bank{*this} , interchange{*this} , midilearn{*this} , mididecode{this} , vectorcontrol{this} , audioOut{} , partlock{} , legatoPart{0} , masterMono{false} // part[] , fadeAll{0} , fadeStep{0} , fadeStepShort{0} , fadeLevel{0} , samplerate{48000} , samplerate_f{float(samplerate)} , halfsamplerate_f{float(samplerate / 2)} , buffersize{512} , buffersize_f{float(buffersize)} , bufferbytes{int(buffersize*sizeof(float))} , oscilsize{1024} , oscilsize_f{float(oscilsize)} , halfoscilsize{oscilsize / 2} , halfoscilsize_f{float(halfoscilsize)} , oscil_sample_step_f{1.0} , oscil_norm_factor_pm{1.0} , oscil_norm_factor_fm{1.0} , sent_buffersize{0} , sent_bufferbytes{0} , sent_buffersize_f{0} , fixed_sample_step_f{0} , TransVolume{0} , Pvolume{0} , ControlStep{0} , Paudiodest{0} , Pkeyshift{0} , PbpmFallback{0} // Psysefxvol[][] // Psysefxsend[][] , syseffnum{0} // syseffEnable[] , inseffnum{0} // sysefx[] // insefx[] // Pinsparts[] , sysEffectUiCon{interchange.guiDataExchange.createConnection()} , insEffectUiCon{interchange.guiDataExchange.createConnection()} , partEffectUiCon{interchange.guiDataExchange.createConnection()} , sysEqGraphUiCon{interchange.guiDataExchange.createConnection()} , insEqGraphUiCon{interchange.guiDataExchange.createConnection()} , partEqGraphUiCon{interchange.guiDataExchange.createConnection()} , ctl{NULL} , microtonal{this} , fft{} , textMsgBuffer{TextMsgBuffer::instance()} , VUpeak{} , VUcopy{} , VUdata{} , VUcount{0} , VUready{false} , volume{0.0} // sysefxvol[][] // sysefxsend[][] , keyshift{0} , callbackGuiClosed{} , windowTitle{"Yoshimi" + asString(uniqueId)} , needsSaving{false} , channelTimer{0} , LFOtime{0} , songBeat{0.0} , monotonicBeat{0.0} , bpm{90} , bpmAccurate{false} { union { uint32_t u32 = 0x11223344; uint8_t arr[4]; } x; Runtime.isLittleEndian = (x.arr[0] == 0x44); ctl = new Controller(this); for (int i = 0; i < NUM_MIDI_CHANNELS; ++ i) Runtime.vectordata.Name[i] = "No Name " + std::to_string(i + 1); for (int npart = 0; npart < NUM_MIDI_PARTS; ++npart) part[npart] = NULL; for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) insefx[nefx] = NULL; for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) sysefx[nefx] = NULL; fadeAll = 0; for (int i = 0; i <= TOPLEVEL::XML::ScalaMap; ++i) Runtime.historyLock[i] = false; // seed the shared master random number generator prng.init(time(NULL)); } SynthEngine::~SynthEngine() { #ifdef GUI_FLTK shutdownGui(); #endif for (int npart = 0; npart < NUM_MIDI_PARTS; ++npart) if (part[npart]) delete part[npart]; for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) if (insefx[nefx]) delete insefx[nefx]; for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) if (sysefx[nefx]) delete sysefx[nefx]; sem_destroy(&partlock); if (ctl) delete ctl; } bool SynthEngine::Init(uint audiosrate, int audiobufsize) { Runtime.init(); audioOutStore(_SYS_::mute::Active); samplerate_f = samplerate = audiosrate; halfsamplerate_f = samplerate_f / 2; buffersize = Runtime.buffersize; if (buffersize > audiobufsize) buffersize = audiobufsize; buffersize_f = buffersize; fixed_sample_step_f = buffersize_f / samplerate_f; bufferbytes = buffersize * sizeof(float); oscilsize_f = oscilsize = Runtime.oscilsize; if (oscilsize < (buffersize / 2)) { Runtime.Log("Enforcing oscilsize to half buffersize, " + asString(oscilsize) + " -> " + asString(buffersize / 2)); oscilsize_f = oscilsize = buffersize / 2; } halfoscilsize_f = halfoscilsize = oscilsize / 2; oscil_sample_step_f = oscilsize_f / samplerate_f; // Phase and frequency modulation are calculated in terms of samples, not // angle/frequency, so modulation must be normalized to reference values of // angle/sample and time/sample. // oscilsize is one wavelength worth of samples, so // phase modulation should scale proportionally oscil_norm_factor_pm = oscilsize_f / oscilsize_ref_f; // FM also depends on samples/wavelength as well as samples/time, // so scale FM inversely with the sample rate. oscil_norm_factor_fm = oscil_norm_factor_pm * (samplerate_ref_f / samplerate_f); // distance / duration / second = distance / (duration * second) // While some might prefer to write this as the latter, when distance and // duration are constants the latter incurs two roundings while the former // brings the constants together, allowing constant-folding. -ffast-math // produces the same assembly in both cases, and we normally compile with it // enabled, but it's probably a bad habit to rely on non-IEEE float math too // much. If we were doing integer division, even -ffast-math wouldn't save // us, and the rounding behaviour would actually be important. fadeStep = 1.0f / 0.1f / samplerate_f; // 100ms for 0 to 1 fadeStepShort = 1.0f / 0.005f / samplerate_f; // 5ms for 0 to 1 ControlStep = 127.0f / 0.2f / samplerate_f; // 200ms for 0 to 127 fft.reset(new fft::Calc(oscilsize)); sem_init(&partlock, 0, 1); for (int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { part[npart] = new Part(npart, µtonal, *fft, *this); if (!part[npart]) { Runtime.Log("Failed to allocate new Part"); goto bail_out; } } // Insertion Effects init for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { if (!(insefx[nefx] = new EffectMgr(1, *this))) { Runtime.Log("Failed to allocate new Insertion EffectMgr"); goto bail_out; } } // System Effects init for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { if (!(sysefx[nefx] = new EffectMgr(0, *this))) { Runtime.Log("Failed to allocate new System Effects EffectMgr"); goto bail_out; } } /* * These replace local memory allocations that * were being made every time an add or sub note * was processed. Now global so treat with care! */ Runtime.genTmp1.reset(buffersize); Runtime.genTmp2.reset(buffersize); Runtime.genTmp3.reset(buffersize); Runtime.genTmp4.reset(buffersize); // similar to above but for parts Runtime.genMixl.reset(buffersize); Runtime.genMixr.reset(buffersize); defaults(); ClearNRPNs(); if (Runtime.sessionStage == _SYS_::type::Default || Runtime.sessionStage == _SYS_::type::StartupSecond || Runtime.sessionStage == _SYS_::type::JackSecond) Runtime.restoreSessionData(Runtime.stateFile); if (Runtime.paramsLoad.size()) { string filename = setExtension(Runtime.paramsLoad, EXTEN::patchset); ShutUp(); if (!loadXML(filename)) { Runtime.Log("Failed to load parameters " + filename); Runtime.paramsLoad = ""; } } if (Runtime.instrumentLoad.size()) { string filename = Runtime.instrumentLoad; if (part[Runtime.load2part]->loadXML(filename)) { part[Runtime.load2part]->Penabled = 1; Runtime.Log("Instrument file " + filename + " loaded"); } else { Runtime.Log("Failed to load instrument file " + filename); Runtime.instrumentLoad = ""; } } if (Runtime.midiLearnLoad.size()) { string filename = Runtime.midiLearnLoad; if (midilearn.loadList(filename)) { #ifdef GUI_FLTK midilearn.updateGui(); // does nothing if --no-gui #endif Runtime.Log("midiLearn file " + filename + " loaded"); } else { Runtime.Log("Failed to load midiLearn file " + filename); Runtime.midiLearnLoad = ""; } } /* * put here so its threads don't run until everything else is ready */ if (!interchange.Init()) { Runtime.Log("[ERROR] interChange init failed", _SYS_::LogError); goto bail_out; } // we seem to need this here only for first time startup :( bank.setCurrentBankID(Runtime.tempBank, false); return true; bail_out: fft.reset(); for (int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { if (part[npart]) delete part[npart]; part[npart] = NULL; } for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { if (insefx[nefx]) delete insefx[nefx]; insefx[nefx] = NULL; } for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { if (sysefx[nefx]) delete sysefx[nefx]; sysefx[nefx] = NULL; } return false; } /** * Prepare and wire a communication anchor, allowing the GUI to establish * data connections with this SynthEngine. This InstanceAnchor record is * pushed through the GuiDataExchange (maintained within InterChange), * and the corresponding notification is placed into the toGUI ringbuffer, * where it typically is the very first message, since this function is * invoked from SynthEngine::Init(). */ InterfaceAnchor SynthEngine::buildGuiAnchor() { InterfaceAnchor anchorRecord; anchorRecord.synth = this; anchorRecord.synthID = uniqueId; ///////////////////TODO 1/2024 : connect all routing-Tags used by embedded sub-components of the Synth anchorRecord.sysEffectParam = sysEffectUiCon; anchorRecord.sysEffectEQ = sysEqGraphUiCon; anchorRecord.insEffectParam = insEffectUiCon; anchorRecord.insEffectEQ = insEqGraphUiCon; anchorRecord.partEffectParam = partEffectUiCon; anchorRecord.partEffectEQ = partEqGraphUiCon; return anchorRecord; } /** * This callback is triggered whenever a new SynthEngine instance becomes fully operational. * If running with GUI, the GuiMaster has been created and communication via GuiDataExchange * has been primed. The LV2-plugin calls this later when the GUI is opened, with `isFirstInit==false` */ void SynthEngine::postBootHook(bool isFirstInit) { if (isFirstInit) { /* nothing special for first init to do currently */ } maybePublishEffectsToGui(); // more initial push-updates will be added here... // }// note InterChange::commandMain() will also push into GUI: (control=control::dataExchange, part=section::main) #ifdef GUI_FLTK MasterUI* SynthEngine::getGuiMaster() { return interchange.guiMaster.get(); } void SynthEngine::shutdownGui() { interchange.shutdownGui(); } #endif /*GUI_FLTK*/ void SynthEngine::signalGuiWindowClosed() { if (not Runtime.isLV2) Runtime.runSynth.store(false, std::memory_order_release); if (callbackGuiClosed) callbackGuiClosed(); // if defined, invoke it } string SynthEngine::manualname() { string manfile = "yoshimi-user-manual-"; manfile += YOSHIMI_VERSION; manfile = manfile.substr(0, manfile.find(" ")); // remove M or rc suffix int pos = 0; int count = 0; for (uint i = 0; i < manfile.length(); ++i) { if (manfile.at(i) == '.') { pos = i; ++count; } } if (count == 3) manfile = manfile.substr(0, pos); // remove bugfix number return manfile; } void SynthEngine::defaults() { for (int i = 0; i defaults(npart); VUpeak.values.parts[0] = -1.0f; VUpeak.values.partsR[0] = -1.0f; VUdata.values.parts[0] = -1.0f; VUdata.values.partsR[0] = -1.0f; VUcopy.values.parts[0]= -1.0f; VUcopy.values.partsR[0]= -1.0f; inseffnum = 0; for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { insefx[nefx]->defaults(); Pinsparts[nefx] = -1; } masterMono = false; // System Effects init syseffnum = 0; for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { syseffEnable[nefx] = true; sysefx[nefx]->defaults(); for (int npart = 0; npart < NUM_MIDI_PARTS; ++npart) setPsysefxvol(npart, nefx, 0); for (int nefxto = 0; nefxto < NUM_SYS_EFX; ++nefxto) setPsysefxsend(nefx, nefxto, 0); } // avoid direct GUI push-update from here, since it's already covered in // getfromXML() and resetAll() -- which happens to cover all relevant cases // see SynthEngine::maybePublishEffectsToGui() microtonal.defaults(); setAllPartMaps(); VUcount = 0; VUready = false; Runtime.currentPart = 0; Runtime.VUcount = 0; Runtime.channelSwitchType = MIDI::SoloType::Disabled; Runtime.channelSwitchCC = 128; Runtime.channelSwitchValue = 0; //CmdInterface.defaults(); // **** need to work out how to call this Runtime.numAvailableParts = NUM_MIDI_CHANNELS; Runtime.panLaw = MAIN::panningType::normal; ShutUp(); Runtime.lastfileseen.clear(); for (int i = 0; i <= TOPLEVEL::XML::ScalaMap; ++i) { Runtime.lastfileseen.push_back(file::userHome()); Runtime.sessionSeen[i] = false; } #ifdef REPORT_NOTES_ON_OFF Runtime.noteOnSent = 0; // note test Runtime.noteOnSeen = 0; Runtime.noteOffSent = 0; Runtime.noteOffSeen = 0; #endif partonoffLock(0, 1); // enable the first part } void SynthEngine::setPartMap(int npart) { part[npart]->setNoteMap(part[npart]->Pkeyshift - 64); } void SynthEngine::setAllPartMaps() { for (int npart = 0; npart < NUM_MIDI_PARTS; ++ npart) setPartMap(npart); } void SynthEngine::audioOutStore(uint8_t num) { audioOut.store(num); interchange.spinSortResultsThread(); } /* for automated testing: brings all existing pseudo random generators * within this SyntEngine into a reproducible state, based on given seed; * also resets long lived procedural state and rebuilds PAD wavetables */ void SynthEngine::setReproducibleState(int seed) { ShutUp(); LFOtime = 0; monotonicBeat = songBeat = 0.0f; prng.init(seed); for (int p = 0; p < NUM_MIDI_PARTS; ++p) if (part[p] and part[p]->Penabled) for (int i = 0; i < NUM_KIT_ITEMS; ++i) { Part::KitItem& kitItem = part[p]->kit[i]; if (!kitItem.Penabled) continue; // reseed only enabled items if (kitItem.adpars and kitItem.Padenabled) for (int v = 0; v < NUM_VOICES; ++v) { if (not kitItem.adpars->VoicePar[v].Enabled) continue; kitItem.adpars->VoicePar[v].OscilSmp->reseed(randomINT()); kitItem.adpars->VoicePar[v].FMSmp->reseed(randomINT()); } if (kitItem.padpars and kitItem.Ppadenabled) { kitItem.padpars->reseed(randomINT()); kitItem.padpars->oscilgen->forceUpdate(); // rebuild Spectrum // synchronously rebuild PADSynth wavetable with new randseed kitItem.padpars->buildNewWavetable(true); kitItem.padpars->activate_wavetable(); } } Runtime.Log("SynthEngine("+to_string(uniqueId)+"): reseeded with "+to_string(seed)); } namespace { // helper to support automated testing of PADSynth wavetable swap inline PADnoteParameters* findFirstPADSynth(Part *part[NUM_MIDI_PARTS]) { for (int p = 0; p < NUM_MIDI_PARTS; ++p) if (part[p] and part[p]->Penabled) for (int i = 0; i < NUM_KIT_ITEMS; ++i) { Part::KitItem& kitItem = part[p]->kit[i]; if (kitItem.padpars and kitItem.Ppadenabled) return kitItem.padpars; } return nullptr; } } /* for automated testing: stash aside the wavetable of one PADSynth and possibly swap in another. * Works together with the CLI command test/swapWave. See TestInvoker::swapPadTable() */ void SynthEngine::swapTestPADtable() { static unique_ptr testWavetable{nullptr}; // find the first enabled PADSynth to work on auto padSynth = findFirstPADSynth(part); if (not padSynth) return; if (not testWavetable) // init with empty (muted) wavetable testWavetable.reset(new PADTables{padSynth->Pquality}); using std::swap; swap(padSynth->waveTable, *testWavetable); padSynth->paramsChanged(); if (padSynth->PxFadeUpdate) {// rig a cross-fade for ongoing notes to pick up PADTables copy4fade{padSynth->Pquality}; copy4fade.cloneDataFrom(*testWavetable); padSynth->xFade.startXFade(copy4fade); } } // Note On Messages void SynthEngine::NoteOn(uchar chan, uchar note, uchar velocity) { #ifdef REPORT_NOTES_ON_OFF ++Runtime.noteOnSeen; // note test if (Runtime.noteOnSeen != Runtime.noteOnSent) Runtime.Log("Note on diff " + to_string(Runtime.noteOnSent - Runtime.noteOnSeen)); #endif #ifdef REPORT_NOTE_ON_TIME steady_clock::time_point noteTime; noteTime = steady_clock::now(); #endif for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { if (chan == part[npart]->Prcvchn or part[npart]->isOmni()) { if (partonoffRead(npart)) part[npart]->NoteOn(note, velocity); } } #ifdef REPORT_NOTE_ON_TIME if (Runtime.showTimes) { using Microsec = std::chrono::duration; auto duration = duration_cast(steady_clock::now() - noteTime); Runtime.Log("Note start time " + to_string(duration.count()) + "us"); } #endif } // Note Off Messages void SynthEngine::NoteOff(uchar chan, uchar note) { #ifdef REPORT_NOTES_ON_OFF ++Runtime.noteOffSeen; // note test if (Runtime.noteOffSeen != Runtime.noteOffSent) Runtime.Log("Note off diff " + to_string(Runtime.noteOffSent - Runtime.noteOffSeen)); #endif for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { // mask values 16 - 31 to still allow a note off if ((chan == (part[npart]->Prcvchn & 0xef) or part[npart]->isOmni()) and partonoffRead(npart)) part[npart]->NoteOff(note); } } int SynthEngine::RunChannelSwitch(uchar chan, int value) { int switchtype = Runtime.channelSwitchType; if (switchtype > MIDI::SoloType::Channel) return 2; // unknown if (switchtype >= MIDI::SoloType::Loop) { if (switchtype != MIDI::SoloType::Channel) { if (value == 0) return 0; // we ignore switch off for these /* * loop and twoway are increment counters * we assume nobody can repeat a switch press within 60mS! */ timespec now_struct; clock_gettime(CLOCK_MONOTONIC, &now_struct); int64_t now_ms = int64_t(now_struct.tv_sec) * 1000 + int64_t(now_struct.tv_nsec) / 1000000; if ((now_ms - channelTimer) > 60) channelTimer = now_ms; else return 0; // de-bounced } if (value >= 64) value = 1; else if (switchtype == MIDI::SoloType::TwoWay) value = -1; else value = 0; } if ((switchtype <= MIDI::SoloType::Column || switchtype == MIDI::SoloType::Channel) && value == Runtime.channelSwitchValue) return 0; // nothing changed switch (switchtype) { case MIDI::SoloType::Row: if (value >= NUM_MIDI_CHANNELS) return 1; // out of range break; case MIDI::SoloType::Column: { if (value >= NUM_MIDI_PARTS) return 1; // out of range int chan = value & 0xf; for (int i = chan; i < NUM_MIDI_PARTS; i += NUM_MIDI_CHANNELS) { if (i != value) part[i]->Prcvchn = chan | NUM_MIDI_CHANNELS; else part[i]->Prcvchn = chan; } Runtime.channelSwitchValue = value; return 0; // all OK break; } case MIDI::SoloType::Loop: value = (Runtime.channelSwitchValue + 1) % NUM_MIDI_CHANNELS; break; case MIDI::SoloType::TwoWay: value = (Runtime.channelSwitchValue + NUM_MIDI_CHANNELS + value) % NUM_MIDI_CHANNELS; // we add in NUM_MIDI_CHANNELS so it's always positive break; case MIDI::SoloType::Channel: // if the CC value is 64-127 Solo Parts on the Channel of the CC if (value) { for (int p = 0; p < NUM_MIDI_PARTS; ++p) { if ((part[p]->Prcvchn & (NUM_MIDI_CHANNELS - 1)) == chan) part[p]->Prcvchn &= (NUM_MIDI_CHANNELS - 1); else part[p]->Prcvchn = part[p]->Prcvchn | NUM_MIDI_CHANNELS; } } else // if the CC value is 0-63 un-Solo Parts on all Channels { for (int p = 0; p < NUM_MIDI_PARTS; ++p) { if (part[p]->Prcvchn >= NUM_MIDI_CHANNELS) part[p]->Prcvchn &= (NUM_MIDI_CHANNELS - 1); } } Runtime.channelSwitchValue = value; return 0; // all ok break; } // vvv column and channel modes never get here vvv for (int ch = 0; ch < NUM_MIDI_CHANNELS; ++ch) { Runtime.channelSwitchValue = value; bool isVector = Runtime.vectordata.Enabled[ch]; if (ch != value) { part[ch]->Prcvchn = NUM_MIDI_CHANNELS; if (isVector) { part[ch + NUM_MIDI_CHANNELS]->Prcvchn = NUM_MIDI_CHANNELS; part[ch + NUM_MIDI_CHANNELS * 2]->Prcvchn = NUM_MIDI_CHANNELS; part[ch + NUM_MIDI_CHANNELS * 3]->Prcvchn = NUM_MIDI_CHANNELS; } } else { part[ch]->Prcvchn = 0; if (isVector) { part[ch + NUM_MIDI_CHANNELS]->Prcvchn = 0; part[ch + NUM_MIDI_CHANNELS * 2]->Prcvchn = 0; part[ch + NUM_MIDI_CHANNELS * 3]->Prcvchn = 0; } } } return 0; // all OK } static inline bool isOmniCC(uchar CCtype) { // This works specifically for omni messages 124 and 125 by exploiting that // they differ only in the last bit. static_assert(MIDI::CC::omniOff == 124 and MIDI::CC::omniOn == 125); return (CCtype & 126) == 124; } // Controllers void SynthEngine::SetController(uchar chan, int CCtype, short int par) { if (CCtype == Runtime.midi_bank_C) { //shouldn't get here. Banks are set directly return; } if (CCtype <= 119 && CCtype == Runtime.channelSwitchCC) { RunChannelSwitch(chan, par); return; } if (CCtype == MIDI::CC::allSoundOff) { // cleanup insertion/system FX for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) sysefx[nefx]->cleanup(); for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) insefx[nefx]->cleanup(); return; } int minPart, maxPart; if (chan < NUM_MIDI_CHANNELS) { minPart = 0; maxPart = Runtime.numAvailableParts; } else { bool vector = (chan >= 0x80); chan &= 0x3f; if (chan >= Runtime.numAvailableParts) return; // shouldn't be possible minPart = chan; maxPart = chan + 1; if (vector) chan &= 0xf; } for (int npart = minPart; npart < maxPart; ++ npart) { // Send the controller to all enabled parts assigned to the channel, or // that have omni enabled. If the message is itself an omni message, it // only goes to the former. if ((part[npart]->Prcvchn == chan or (part[npart]->isOmni() and not isOmniCC(CCtype))) and part[npart]->Penabled == 1) { if (CCtype == part[npart]->PbreathControl) // breath { part[npart]->SetController(MIDI::CC::volume, 64 + par / 2); part[npart]->SetController(MIDI::CC::filterCutoff, par); } else if (CCtype == MIDI::CC::legato) { int mode = (ReadPartKeyMode(npart) & 3); if (par < 64) SetPartKeyMode(npart, mode & 3); // normal else SetPartKeyMode(npart, mode | 4); // temporary legato } else { part[npart]->SetController(CCtype, par); } } } } void SynthEngine::SetZynControls(bool in_place) { /* * NRPN MSB system / insertion * NRPN LSB effect number * Data MSB param to change * if | 64 LSB sets eff type * for insert effect only, | 96 LSB sets destination * for system only, &3 sets destination LSB value * * Data LSB param value */ uchar group = Runtime.nrpnH | 0x20; uchar effnum = Runtime.nrpnL; uchar parnum = Runtime.dataH; uchar value = Runtime.dataL; uchar efftype = (parnum & 0x60); Runtime.dataL = 0xff; // use once then clear it out CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.value = value; putData.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; putData.data.source = TOPLEVEL::action::fromMIDI | TOPLEVEL::action::forceUpdate; if (group == 0x24) // sys { putData.data.part = TOPLEVEL::section::systemEffects; if (efftype == 0x40) { putData.data.control = EFFECT::sysIns::effectType; } else if (efftype == 0x60) // send eff to { putData.data.control = (parnum & 3); putData.data.insert = 16; } else { putData.data.kit = EFFECT::type::none + sysefx[effnum]->geteffect(); putData.data.control = parnum; } } else // ins { putData.data.part = TOPLEVEL::section::insertEffects; if (efftype == 0x40) putData.data.control = 1; else if (efftype == 0x60) putData.data.control = 2; else { putData.data.kit = EFFECT::type::none + insefx[effnum]->geteffect(); putData.data.control = parnum; } } putData.data.engine = effnum; if (in_place) interchange.commandEffects(putData); else // TODO next line is a hack! midilearn.writeMidi(putData, false); } int SynthEngine::setRootBank(int root, int banknum, bool inplace) { ///////TODO this function should be in class Bank (makes SyntEngine needlessly complex) string name = ""; int foundRoot; int originalRoot = Runtime.currentRoot; int originalBank = Runtime.currentBank; bool ok = true; if (root < 0x80) { if (bank.setCurrentRootID(root)) { foundRoot = Runtime.currentRoot; if (foundRoot != root) { // abort and recover old settings bank.setCurrentRootID(originalRoot); bank.setCurrentBankID(originalBank); } else { originalRoot = foundRoot; originalBank = Runtime.currentBank; } name = asString(foundRoot) + " \"" + bank.getRootPath(originalRoot) + "\""; if (root != foundRoot) { ok = false; if (not inplace) name = "Cant find ID " + asString(root) + ". Current root is " + name; } else { name = "Root set to " + name; } } else { ok = false; if (not inplace) name = "No match for root ID " + asString(root); } } if (ok && (banknum < 0x80)) { if (bank.setCurrentBankID(banknum)) { if (not inplace) { if (root < UNUSED) name = "Root " + to_string(root) + ". "; name = name + "Bank set to " + asString(banknum) + " \"" + bank.roots [originalRoot].banks [banknum].dirname + "\""; } originalBank = banknum; } else { ok = false; bank.setCurrentBankID(originalBank); if (not inplace) { name = "No bank " + asString(banknum); if (root < UNUSED) name += " in root " + to_string(root) + "."; else name += " in this root."; name += " Current bank is " + asString(ReadBank()); } } } int msgID = NO_MSG; if (not inplace) msgID = textMsgBuffer.push(name); if (!ok) msgID |= 0xFF0000; return msgID; } int SynthEngine::setProgramByName(CommandBlock& cmd) { steady_clock::time_point startTime; if (Runtime.showTimes) startTime = steady_clock::now(); int msgID = NO_MSG; bool ok = true; int npart = int(cmd.data.kit); string fname{textMsgBuffer.fetch(cmd.data.miscmsg)}; fname = setExtension(fname, EXTEN::yoshInst); if (not isRegularFile(fname)) fname = setExtension(fname, EXTEN::zynInst); string name = findLeafName(fname); if (name < "!") { name = "Invalid instrument name " + name; ok = false; } if (ok and not isRegularFile(fname)) { name = "Can't find " + fname; ok = false; } if (ok) { ok = setProgram(fname, npart); if (not ok) name = "File " + name + "unrecognised or corrupted"; } if (ok and Runtime.showTimes) { using Millisec = std::chrono::duration; auto duration = duration_cast(steady_clock::now() - startTime); name += (" Time " + to_string(duration.count()) + "ms"); } msgID = textMsgBuffer.push(name); if (not ok) { msgID |= 0xFF0000; partonoffLock(npart, 2); // as it was } else { Runtime.sessionSeen[TOPLEVEL::XML::Instrument] = true; addHistory(setExtension(fname, EXTEN::zynInst), TOPLEVEL::XML::Instrument); partonoffLock(npart, 1); } return msgID; } int SynthEngine::setProgramFromBank(CommandBlock& cmd, bool inplace) { steady_clock::time_point startTime; if (not inplace and Runtime.showTimes) startTime = steady_clock::now(); int instrument = int(cmd.data.value); int banknum = cmd.data.engine; if (banknum == UNUSED) banknum = Runtime.currentBank; int npart = cmd.data.kit; int root = cmd.data.insert; if (root == UNUSED) root = Runtime.currentRoot; bool ok; string fname = bank.getFullPath(root, banknum, instrument); string name = findLeafName(fname); if (name < "!") { ok = false; if (not inplace) name = "No instrument at " + to_string(instrument + 1) + " in this bank"; } else { ok = setProgram(fname, npart); if (not inplace) { if (not ok) name = "Instrument " + name + " missing or corrupted"; } } int msgID = NO_MSG; if (not inplace) { if (ok and Runtime.showTimes) { using Millisec = std::chrono::duration; auto duration = duration_cast(steady_clock::now() - startTime); name += (" Time " + to_string(duration.count()) + "ms"); } msgID = textMsgBuffer.push(name); } if (not ok) { msgID |= 0xFF0000; partonoffLock(npart, 2); // as it was } else partonoffLock(npart, 1); return msgID; } bool SynthEngine::setProgram(string const& fname, int npart) { // switch active part (UI will do the same on returns_update) getRuntime().currentPart = npart; interchange.undoRedoClear(); bool ok = true; if (!part[npart]->loadXML(fname)) ok = false; return ok; } int SynthEngine::ReadBankRoot() { return Runtime.currentRoot; } int SynthEngine::ReadBank() { return Runtime.currentBank; } // Set part's channel number void SynthEngine::SetPartChanForVector(uchar npart, uchar nchan) { if (npart < Runtime.numAvailableParts) { /* We allow direct controls to set out of range channel numbers. * This gives us a way to disable all channel messages to a part. * Values 16 to 31 will still allow a note off but values greater * than that allow a drone to be set. * Sending a valid channel number will restore normal operation * as will using the GUI controls. */ part[npart]->Prcvchn = nchan; // Disable Omni by default for newly initialized Vectors. part[npart]->Pomni = false; } } void SynthEngine::SetPartPortamento(int npart, bool state) { part[npart]->ctl->portamento.portamento = state; } bool SynthEngine::ReadPartPortamento(int npart) { return part[npart]->ctl->portamento.portamento; } void SynthEngine::SetPartKeyMode(int npart, int mode) { part[npart]->Pkeymode = mode; } int SynthEngine::ReadPartKeyMode(int npart) { return part[npart]->Pkeymode; } /* * This should really be in MiscFuncs but it has two runtime calls * and I can't work out a way to implement that :( * We also have to fake long pages when calling via NRPNs as there * is no readline entry to set the page length. */ void SynthEngine::cliOutput(list& msg_buf, uint lines) { list::iterator it; if (Runtime.toConsole) { for (it = msg_buf.begin(); it != msg_buf.end(); ++it) Runtime.Log(*it); // we need this in case someone is working headless std::cout << "\nReports sent to console window\n\n"; } else if (msg_buf.size() < lines) // Output will fit the screen { string text = ""; for (it = msg_buf.begin(); it != msg_buf.end(); ++it) { text += *it; text += "\n"; } Runtime.Log(text); } else // Output is too long, page it { // JBS: make that a class member variable string page_filename = "/tmp/yoshimi-pager-" + asString(getpid()) + ".log"; ofstream fout(page_filename,(ios_base::out | ios_base::trunc)); for (it = msg_buf.begin(); it != msg_buf.end(); ++it) fout << *it << std::endl; fout.close(); string cmd = "less -X -i -M -PM\"q=quit /=search PgUp/PgDown=scroll (line %lt of %L)\" " + page_filename; system(cmd.c_str()); unlink(page_filename.c_str()); } msg_buf.clear(); } void SynthEngine::ListPaths(list& msg_buf) { ///////TODO this function should be in class Bank (makes SyntEngine needlessly complex) string label; string prefix; msg_buf.push_back("Root Paths"); for (uint idx = 0; idx < MAX_BANK_ROOT_DIRS; ++ idx) { if (bank.roots.count(idx) > 0 && !bank.roots [idx].path.empty()) { if (idx == Runtime.currentRoot) prefix = " *"; else prefix = " "; label = bank.roots [idx].path; if (label.at(label.size() - 1) == '/') label = label.substr(0, label.size() - 1); msg_buf.push_back(prefix + " ID " + asString(idx) + " " + label); } } } void SynthEngine::ListBanks(int rootNum, list& msg_buf) { ///////TODO this function should be in class Bank (makes SyntEngine needlessly complex) string label; string prefix; if (rootNum < 0 || rootNum >= MAX_BANK_ROOT_DIRS) rootNum = Runtime.currentRoot; if (bank.roots.count(rootNum) > 0 && !bank.roots [rootNum].path.empty()) { label = bank.roots [rootNum].path; if (label.at(label.size() - 1) == '/') label = label.substr(0, label.size() - 1); msg_buf.push_back("Banks in Root ID " + asString(rootNum)); msg_buf.push_back(" " + label); for (uint idx = 0; idx < MAX_BANKS_IN_ROOT; ++ idx) { if (bank.roots [rootNum].banks.count(idx)) { if (idx == Runtime.currentBank) prefix = " *"; else prefix = " "; msg_buf.push_back(prefix + " ID " + asString(idx) + " " + bank.roots [rootNum].banks [idx].dirname); } } } else msg_buf.push_back("No Root ID " + asString(rootNum)); } void SynthEngine::ListInstruments(int bankNum, list& msg_buf) { ///////TODO this function should be in class Bank (makes SyntEngine needlessly complex) int root = Runtime.currentRoot; string label; if (bankNum < 0 || bankNum >= MAX_BANKS_IN_ROOT) bankNum = Runtime.currentBank; if (bank.roots.count(root) > 0 && !bank.roots [root].path.empty()) { if (!bank.roots [root].banks [bankNum].instruments.empty()) { label = bank.roots [root].path; if (label.at(label.size() - 1) == '/') label = label.substr(0, label.size() - 1); msg_buf.push_back("Instruments in Root ID " + asString(root) + ", Bank ID " + asString(bankNum)); msg_buf.push_back(" " + label + "/" + bank.roots [root].banks [bankNum].dirname); for (int idx = 0; idx < MAX_INSTRUMENTS_IN_BANK; ++ idx) { if (!bank.emptyslot(root, bankNum, idx)) { string suffix = ""; if (bank.roots [root].banks [bankNum].instruments [idx].ADDsynth_used) suffix += "A"; if (bank.roots [root].banks [bankNum].instruments [idx].SUBsynth_used) suffix += "S"; if (bank.roots [root].banks [bankNum].instruments [idx].PADsynth_used) suffix += "P"; msg_buf.push_back(" ID " + asString(idx + 1) + " " + bank.roots [root].banks [bankNum].instruments [idx].name + " (" + suffix + ")"); } } } else msg_buf.push_back("No Bank ID " + asString(bankNum) + " in Root " + asString(root)); } else msg_buf.push_back("No Root ID " + asString(root)); } void SynthEngine::ListVectors(list& msg_buf) { bool found = false; for (int chan = 0; chan < NUM_MIDI_CHANNELS; ++chan) { if (SingleVector(msg_buf, chan)) found = true; } if (!found) msg_buf.push_back("No vectors enabled"); } bool SynthEngine::SingleVector(list& msg_buf, int chan) { if (!Runtime.vectordata.Enabled[chan]) return false; int Xfeatures = Runtime.vectordata.Xfeatures[chan]; string Xtext = "Features ="; if (Xfeatures == 0) Xtext = "No Features :("; else { // build a text list of the enabled 'X' features if (Xfeatures & 1) Xtext += " 1"; if (Xfeatures & 2) Xtext += " 2"; if (Xfeatures & 4) Xtext += " 3"; if (Xfeatures & 8) Xtext += " 4"; } msg_buf.push_back("Channel " + asString(chan + 1)); msg_buf.push_back(" X CC = " + asString((int) Runtime.vectordata.Xaxis[chan]) + ", " + Xtext); msg_buf.push_back(" L = " + part[chan]->Pname + ", R = " + part[chan + 16]->Pname); if (Runtime.vectordata.Yaxis[chan] > 0x7f || Runtime.numAvailableParts < NUM_MIDI_CHANNELS * 4) msg_buf.push_back(" Y axis disabled"); else { int Yfeatures = Runtime.vectordata.Yfeatures[chan]; string Ytext = "Features ="; if (Yfeatures == 0) Ytext = "No Features :("; else { // build a text list of the enabled 'Y' features if (Yfeatures & 1) Ytext += " 1"; if (Yfeatures & 2) Ytext += " 2"; if (Yfeatures & 4) Ytext += " 3"; if (Yfeatures & 8) Ytext += " 4"; } msg_buf.push_back(" Y CC = " + asString((int) Runtime.vectordata.Yaxis[chan]) + ", " + Ytext); msg_buf.push_back(" U = " + part[chan + 32]->Pname + ", D = " + part[chan + 48]->Pname); msg_buf.push_back(" Name = " + Runtime.vectordata.Name[chan]); } return true; } void SynthEngine::ListSettings(list& msg_buf) { int root; string label; msg_buf.push_back("Configuration:"); msg_buf.push_back(" Master volume " + asString((int) Pvolume)); msg_buf.push_back(" Master key shift " + asString(Pkeyshift - 64)); ///////TODO the following block should delegate to class Bank (makes SyntEngine needlessly complex) root = Runtime.currentRoot; if (bank.roots.count(root) > 0 && !bank.roots [root].path.empty()) { label = bank.roots [root].path; if (label.at(label.size() - 1) == '/') label = label.substr(0, label.size() - 1); msg_buf.push_back(" Current Root ID " + asString(root) + " " + label); msg_buf.push_back(" Current Bank ID " + asString(Runtime.currentBank) + " " + bank.roots [root].banks [Runtime.currentBank].dirname); } else msg_buf.push_back(" No paths set"); msg_buf.push_back(" Number of available parts " + asString(Runtime.numAvailableParts)); msg_buf.push_back(" Current part " + asString(Runtime.currentPart + 1)); msg_buf.push_back(" Current part's channel " + asString((int)part[Runtime.currentPart]->Prcvchn + 1)); if (Runtime.midi_bank_root > 119) msg_buf.push_back(" MIDI Root Change off"); else msg_buf.push_back(" MIDI Root CC " + asString(Runtime.midi_bank_root)); if (Runtime.midi_bank_C > 119) msg_buf.push_back(" MIDI Bank Change off"); else msg_buf.push_back(" MIDI Bank CC " + asString(Runtime.midi_bank_C)); if (Runtime.enableProgChange) msg_buf.push_back(" MIDI Program Change on"); else msg_buf.push_back(" MIDI program change off"); if (Runtime.midi_upper_voice_C > 119) msg_buf.push_back(" MIDI extended Program Change off"); else msg_buf.push_back(" MIDI extended Program Change CC " + asString(Runtime.midi_upper_voice_C)); switch (Runtime.midiEngine) { case 2: label = "ALSA"; break; case 1: label = "JACK"; break; default: label = "None"; break; } msg_buf.push_back(" Preferred MIDI " + label); switch (Runtime.audioEngine) { case 2: label = "ALSA"; break; case 1: label = "JACK"; break; default: label = "None"; break; } msg_buf.push_back(" Preferred audio " + label); switch (Runtime.alsaMidiType) { case 2: label = "External"; break; case 1: label = "Search"; break; default: label = "Fixed"; break; } msg_buf.push_back(" ALSA MIDI connection " + label); msg_buf.push_back(" ALSA MIDI source " + Runtime.alsaMidiDevice); msg_buf.push_back(" ALSA audio " + Runtime.alsaAudioDevice); msg_buf.push_back(" JACK MIDI " + Runtime.jackMidiDevice); msg_buf.push_back(" JACK server " + Runtime.jackServer); if (Runtime.connectJackaudio) label = "on"; else label = "off"; msg_buf.push_back(" JACK autoconnect " + label); if (Runtime.toConsole) { msg_buf.push_back(" Reports sent to console window"); } else msg_buf.push_back(" Reports sent to stdout"); if (Runtime.loadDefaultState) msg_buf.push_back(" Autostate on"); else msg_buf.push_back(" Autostate off"); if (Runtime.showTimes) msg_buf.push_back(" Times on"); else msg_buf.push_back(" Times off"); } /* * Provides a way of setting dynamic system variables via NRPNs */ int SynthEngine::SetSystemValue(int type, int value) { list msg; string label; label = ""; bool to_send = false; uchar action = 0; uchar cmd = UNUSED; uchar setpart; uchar parameter = UNUSED; switch (type) { case 2: // master key shift value -=64; if (value > MAX_KEY_SHIFT) value = MAX_KEY_SHIFT; else if (value < MIN_KEY_SHIFT) // 3 octaves is enough for anybody :) value = MIN_KEY_SHIFT; cmd = MAIN::control::keyShift; setpart = TOPLEVEL::section::main; action = TOPLEVEL::action::lowPrio; to_send = true; break; case 7: // master volume cmd = MAIN::control::volume; setpart = TOPLEVEL::section::main; to_send = true; break; case 64: // part key shifts case 65: case 66: case 67: case 68: case 69: case 70: case 71: case 72: case 73: case 74: case 75: case 76: case 77: case 78: case 79: { value -= 64; if (value < MIN_KEY_SHIFT) value = MIN_KEY_SHIFT; else if (value > MAX_KEY_SHIFT) value = MAX_KEY_SHIFT; CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.value = value; putData.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; putData.data.source = TOPLEVEL::action::fromCLI | TOPLEVEL::action::lowPrio; putData.data.control = PART::control::keyShift; for (uint i = 0; i < Runtime.numAvailableParts; ++ i) { if (partonoffRead(i) and (part[i]->Prcvchn == (type - 64) or part[i]->isOmni())) { putData.data.part = i; int tries = 0; bool ok = true; do { ++ tries; ok = interchange.fromMIDI.write(putData.bytes); if (!ok) sleep_for(1us); // we can afford a short delay for buffer to clear } while (!ok && tries < 3); if (!ok) { Runtime.Log("Midi buffer full!"); ok = false; } } } } return 0; break; case 80: // root CC if (value > 119) value = 128; if (value != Runtime.midi_bank_root) // don't mess about if it's the same { // this is not ideal !!! if (value == Runtime.midi_bank_C) { parameter = textMsgBuffer.push("in use by bank CC"); value = 128; } } cmd = CONFIG::control::bankRootCC; setpart = TOPLEVEL::section::config; to_send = true; break; case 81: // bank CC if (value != 0 && value != 32) value = 128; else if (value != Runtime.midi_bank_C) // not already set! { // nor this ! if (value == Runtime.midi_bank_root) { parameter = textMsgBuffer.push("in use by bank root CC"); value = 128; } } cmd = CONFIG::control::bankCC; setpart = TOPLEVEL::section::config; to_send = true; break; case 82: // enable program change value = (value > 63); cmd = CONFIG::control::enableProgramChange; setpart = TOPLEVEL::section::config; to_send = true; break; case 84: // extended program change CC if (value > 119) value = 128; else { // this is far from ideal !!! string label = Runtime.testCCvalue(value);if (label != "") { parameter = textMsgBuffer.push(label); value = 128; } cmd = CONFIG::control::extendedProgramChangeCC; setpart = TOPLEVEL::section::config; to_send = true; } break; case 85: // active parts if (value <= 16) value = 16; else if (value <= 32) value = 32; else value = 64; cmd = MAIN::control::availableParts; setpart = TOPLEVEL::section::main; to_send = true; break; case 86: // obvious! value = 0; cmd = CONFIG::control::saveCurrentConfig; setpart = TOPLEVEL::section::config; action = TOPLEVEL::action::lowPrio; to_send = true; break; } if (!to_send) return 0; /* * This is only ever called from the MIDI NRPN thread so is safe. * In fact we will probably move it there once all the routines * have been converted. * We fake a CLI message so that we get reporting and GUI update. */ CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.value = value; putData.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; putData.data.source = TOPLEVEL::action::fromCLI | action; putData.data.control = cmd; putData.data.part = setpart; putData.data.parameter = parameter; int tries = 0; bool ok = true; do { ++ tries; ok = interchange.fromMIDI.write(putData.bytes); if (!ok) sleep_for(1us); // we can afford a short delay for buffer to clear } while (!ok && tries < 3); if (!ok) { Runtime.Log("Midi buffer full!"); ok = false; } return 0; } int SynthEngine::LoadNumbered(uchar group, uchar entry) { vector const& listType{getHistory(group)}; if (size_t(entry) >= listType.size()) return (textMsgBuffer.push(" FAILED: List entry " + to_string(int(entry)) + " out of range") | 0xFF0000); string const& filename{listType.at(entry)}; return textMsgBuffer.push(filename); } bool SynthEngine::vectorInit(int dHigh, uchar chan, int par) { string name = ""; if (dHigh < 2) { string name = Runtime.masterCCtest(par); if (name != "") { name = "CC " + to_string(par) + " in use for " + name; Runtime.Log(name); return true; } uint parts = 2* NUM_MIDI_CHANNELS * (dHigh + 1); if (parts > Runtime.numAvailableParts) Runtime.numAvailableParts = parts; if (dHigh == 0) { partonoffLock(chan, 1); partonoffLock(chan + NUM_MIDI_CHANNELS, 1); } else { partonoffLock(chan + NUM_MIDI_CHANNELS * 2, 1); partonoffLock(chan + NUM_MIDI_CHANNELS * 3, 1); } } else if (!Runtime.vectordata.Enabled[chan]) { name = "Vector control must be enabled first"; return true; } if (name != "" ) Runtime.Log(name); return false; } void SynthEngine::vectorSet(int dHigh, uchar chan, int par) { string featureList = ""; if (dHigh == 2 || dHigh == 3) { if (bitTest(par, 0)) { featureList += "1 en "; } if (bitTest(par, 1)) { if (!bitTest(par, 4)) featureList += "2 en "; else featureList += "2 rev "; } if (bitTest(par, 2)) { if (!bitTest(par, 5)) featureList += "3 en "; else featureList += "3 rev "; } if (bitTest(par, 3)) { if (!bitTest(par, 6)) featureList += "4 en"; else featureList += "4 rev"; } } uchar part = 0; switch (dHigh) { case 0: Runtime.vectordata.Xaxis[chan] = par; if (!Runtime.vectordata.Enabled[chan]) { Runtime.vectordata.Enabled[chan] = true; Runtime.Log("Vector control enabled"); // enabling is only done with a valid X CC } SetPartChanForVector(chan, chan); SetPartChanForVector(chan | 16, chan); Runtime.vectordata.Xcc2[chan] = MIDI::CC::panning; Runtime.vectordata.Xcc4[chan] = MIDI::CC::filterCutoff; Runtime.vectordata.Xcc8[chan] = MIDI::CC::modulation; break; case 1: if (!Runtime.vectordata.Enabled[chan]) Runtime.Log("Vector X axis must be set before Y"); else { SetPartChanForVector(chan | 32, chan); SetPartChanForVector(chan | 48, chan); Runtime.vectordata.Yaxis[chan] = par; Runtime.vectordata.Ycc2[chan] = MIDI::CC::panning; Runtime.vectordata.Ycc4[chan] = MIDI::CC::filterCutoff; Runtime.vectordata.Ycc8[chan] = MIDI::CC::modulation; } break; case 2: Runtime.vectordata.Xfeatures[chan] = par; Runtime.Log("Set X features " + featureList); break; case 3: if (Runtime.numAvailableParts > NUM_MIDI_CHANNELS * 2) { Runtime.vectordata.Yfeatures[chan] = par; Runtime.Log("Set Y features " + featureList); } break; case 4: part = chan; break; case 5: part = chan | NUM_MIDI_CHANNELS; break; case 6: part = chan | (NUM_MIDI_CHANNELS * 2); break; case 7: part = chan | (NUM_MIDI_CHANNELS * 3); break; case 8: Runtime.vectordata.Xcc2[chan] = par; Runtime.Log("Channel " + asString((int) chan) + " X feature 2 set to " + asString(par)); break; case 9: Runtime.vectordata.Xcc4[chan] = par; Runtime.Log("Channel " + asString((int) chan) + " X feature 3 set to " + asString(par)); break; case 10: Runtime.vectordata.Xcc8[chan] = par; Runtime.Log("Channel " + asString((int) chan) + " X feature 4 set to " + asString(par)); break; case 11: Runtime.vectordata.Ycc2[chan] = par; Runtime.Log("Channel " + asString((int) chan) + " Y feature 2 set to " + asString(par)); break; case 12: Runtime.vectordata.Ycc4[chan] = par; Runtime.Log("Channel " + asString((int) chan) + " Y feature 3 set to " + asString(par)); break; case 13: Runtime.vectordata.Ycc8[chan] = par; Runtime.Log("Channel " + asString((int) chan) + " Y feature 4 set to " + asString(par)); break; default: Runtime.vectordata.Enabled[chan] = false; Runtime.vectordata.Xaxis[chan] = 0xff; Runtime.vectordata.Yaxis[chan] = 0xff; Runtime.vectordata.Xfeatures[chan] = 0; Runtime.vectordata.Yfeatures[chan] = 0; Runtime.Log("Channel " + asString(int(chan) + 1) + " Vector control disabled"); break; } if (dHigh >= 4 && dHigh <= 7) { CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.value = par; putData.data.type = TOPLEVEL::type::Write | TOPLEVEL::type::Integer; putData.data.source = TOPLEVEL::action::fromMIDI | TOPLEVEL::action::muteAndLoop; putData.data.control = 8; putData.data.part = TOPLEVEL::section::midiIn; putData.data.kit = part; midilearn.writeMidi(putData, true); } } void SynthEngine::ClearNRPNs() { Runtime.nrpnL = 127; Runtime.nrpnH = 127; Runtime.nrpnActive = false; for (int chan = 0; chan < NUM_MIDI_CHANNELS; ++chan) { Runtime.vectordata.Enabled[chan] = false; Runtime.vectordata.Xaxis[chan] = 0xff; Runtime.vectordata.Yaxis[chan] = 0xff; Runtime.vectordata.Xfeatures[chan] = 0; Runtime.vectordata.Yfeatures[chan] = 0; Runtime.vectordata.Name[chan] = "No Name " + to_string (chan + 1); } } void SynthEngine::resetAll(bool andML) { interchange.undoRedoClear(); interchange.syncWrite = false; interchange.lowPrioWrite = false; for (int npart = 0; npart < NUM_MIDI_PARTS; ++ npart) part[npart]->busy = false; defaults(); ClearNRPNs(); if (Runtime.loadDefaultState) { string filename = Runtime.defaultSession; if (isRegularFile(filename)) { Runtime.stateFile = filename; Runtime.restoreSessionData(Runtime.stateFile); } } if (andML) { CommandBlock putData; memset(&putData, 0xff, sizeof(putData)); putData.data.value = 0; putData.data.type = 0; putData.data.control = MIDILEARN::control::clearAll; putData.data.part = TOPLEVEL::section::midiLearn; midilearn.generalOperations(putData); textMsgBuffer.clear(); } // possibly push changed effect state to GUI maybePublishEffectsToGui(); } // Enable/Disable a part void SynthEngine::partonoffLock(uint npart, int what) { sem_wait(&partlock); partonoffWrite(npart, what); sem_post(&partlock); } /* * Intelligent switch for unknown part status that always * switches off and later returns original unknown state */ void SynthEngine::partonoffWrite(uint npart, int what) { if (npart >= uint(Runtime.numAvailableParts)) return; uchar original = part[npart]->Penabled; if (original > 1) original = 1; uchar tmp = original; switch (what) { case 0: // always off tmp = 0; break; case 1: // always on tmp = 1; break; case -1: // further from on tmp -= 1; break; case 2: if (tmp < 1) // nearer to on tmp += 1; break; default: return; } part[npart]->Penabled = tmp; if (tmp == 1 && original != 1) // enable if it wasn't already on { VUpeak.values.parts[npart] = 1e-9f; VUpeak.values.partsR[npart] = 1e-9f; } else if (tmp < 1 && original == 1) // disable if it wasn't already off { part[npart]->cleanup(); for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { if (Pinsparts[nefx] == int(npart)) insefx[nefx]->cleanup(); } VUpeak.values.parts[npart] = -1.0f; VUpeak.values.partsR[npart] = -1.0f; } } char SynthEngine::partonoffRead(uint npart) { return (part[npart]->Penabled == 1); } // Master audio out (the final sound) int SynthEngine::MasterAudio(float *outl [NUM_MIDI_PARTS + 1], float *outr [NUM_MIDI_PARTS + 1], int to_process) { static uint VUperiod = samplerate / 20; /* * The above line gives a VU refresh of at least 50mS * but it may be longer depending on the buffer size */ float *mainL = outl[NUM_MIDI_PARTS]; // tiny optimisation float *mainR = outr[NUM_MIDI_PARTS]; // makes code clearer Samples& tmpmixl = Runtime.genMixl; Samples& tmpmixr = Runtime.genMixr; sent_buffersize = buffersize; sent_bufferbytes = bufferbytes; sent_buffersize_f = buffersize_f; if ((to_process > 0) && (to_process < buffersize)) { sent_buffersize = to_process; sent_bufferbytes = sent_buffersize * sizeof(float); sent_buffersize_f = sent_buffersize; } memset(mainL, 0, sent_bufferbytes); memset(mainR, 0, sent_bufferbytes); uchar sound = audioOut.load(); switch (sound) { case _SYS_::mute::Pending: // set by resolver fadeLevel = 1.0f; audioOutStore(_SYS_::mute::Fading); sound = _SYS_::mute::Fading; break; case _SYS_::mute::Fading: if (fadeLevel < 0.001f) { audioOutStore(_SYS_::mute::Active); sound = _SYS_::mute::Active; fadeLevel = 0; } break; case _SYS_::mute::Active: // cleared by resolver break; case _SYS_::mute::Complete: // set by resolver and paste audioOutStore(_SYS_::mute::Idle); break; case _SYS_::mute::Request: // set by paste routine audioOutStore(_SYS_::mute::Immediate); sound = _SYS_::mute::Active; break; case _SYS_::mute::Immediate: // cleared by paste routine sound = _SYS_::mute::Active; break; default: break; } interchange.mediate(); char partLocal[NUM_MIDI_PARTS]; /* * This isolates the loop from part changes so that when a low * prio thread completes and re-enables the part, it will not * actually be seen until the start of the next period. */ for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) partLocal[npart] = partonoffRead(npart); if (sound == _SYS_::mute::Active) { for (uint npart = 0; npart < (Runtime.numAvailableParts); ++npart) { if (partLocal[npart]) { memset(outl[npart], 0, sent_bufferbytes); memset(outr[npart], 0, sent_bufferbytes); } } } /* Normally the above is unnecessary, as we later do a copy to just the parts * that have a direct output. This completely overwrites the buffers. * Only these are sent to jack, so it doesn't matter what the unused ones contain. * However, this doesn't happen when muted, so the buffers then need to be zeroed. */ else { // Compute part samples and store them ->partoutl,partoutr for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { if (partLocal[npart]) { legatoPart = npart; part[npart]->ComputePartSmps(); } } // Insertion effects int nefx; for (nefx = 0; nefx < NUM_INS_EFX; ++nefx) { if (Pinsparts[nefx] >= 0) { int efxpart = Pinsparts[nefx]; if (part[efxpart]->Penabled) insefx[nefx]->out(part[efxpart]->partoutl.get(), part[efxpart]->partoutr.get()); } } // Apply the part volumes and pannings (after insertion effects) uchar panLaw = Runtime.panLaw; for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { if (!partLocal[npart]) continue; float Step = ControlStep; for (int i = 0; i < sent_buffersize; ++i) { if (part[npart]->Ppanning - part[npart]->TransPanning > Step) part[npart]->checkPanning(Step, panLaw); else if (part[npart]->TransPanning - part[npart]->Ppanning > Step) part[npart]->checkPanning(-Step, panLaw); if (part[npart]->Pvolume - part[npart]->TransVolume > Step) part[npart]->checkVolume(Step); else if (part[npart]->TransVolume - part[npart]->Pvolume > Step) part[npart]->checkVolume(-Step); part[npart]->partoutl[i] *= (part[npart]->pannedVolLeft() * part[npart]->ctl->expression.relvolume); part[npart]->partoutr[i] *= (part[npart]->pannedVolRight() * part[npart]->ctl->expression.relvolume); } } // System effects for (nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { if (!sysefx[nefx]->geteffect()) continue; // is disabled // Clear the samples used by the system effects memset(tmpmixl.get(), 0, sent_bufferbytes); memset(tmpmixr.get(), 0, sent_bufferbytes); if (!syseffEnable[nefx]) continue; // is off // Mix the channels according to the part settings about System Effect for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { if (partLocal[npart] // it's enabled && Psysefxvol[nefx][npart] // it's sending an output && (part[npart]->Paudiodest & 1)) // it's connected to the main outs { // the output volume of each part to system effect float vol = sysefxvol[nefx][npart]; for (int i = 0; i < sent_buffersize; ++i) { tmpmixl[i] += part[npart]->partoutl[i] * vol; tmpmixr[i] += part[npart]->partoutr[i] * vol; } } } // system effect send to next ones for (int nefxfrom = 0; nefxfrom < nefx; ++nefxfrom) { if (!syseffEnable[nefxfrom]) continue; // is off if (Psysefxsend[nefxfrom][nefx]) { float v = sysefxsend[nefxfrom][nefx]; for (int i = 0; i < sent_buffersize; ++i) { tmpmixl[i] += sysefx[nefxfrom]->efxoutl[i] * v; tmpmixr[i] += sysefx[nefxfrom]->efxoutr[i] * v; } } } sysefx[nefx]->out(tmpmixl.get(), tmpmixr.get()); // Add the System Effect to sound output float outvol = sysefx[nefx]->sysefxgetvolume(); for (int i = 0; i < sent_buffersize; ++i) { mainL[i] += tmpmixl[i] * outvol; mainR[i] += tmpmixr[i] * outvol; } } for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { if (part[npart]->Paudiodest & 2){ // Copy separate parts for (int i = 0; i < sent_buffersize; ++i) { outl[npart][i] = part[npart]->partoutl[i]; outr[npart][i] = part[npart]->partoutr[i]; } } if (part[npart]->Paudiodest & 1) // Mix wanted parts to mains { for (int i = 0; i < sent_buffersize; ++i) { // the volume did not change mainL[i] += part[npart]->partoutl[i]; mainR[i] += part[npart]->partoutr[i]; } } } // Insertion effects for Master Out for (nefx = 0; nefx < NUM_INS_EFX; ++nefx) { if (Pinsparts[nefx] == -2) insefx[nefx]->out(mainL, mainR); } // Master volume, and all output fade float cStep = ControlStep; for (int idx = 0; idx < sent_buffersize; ++idx) { if (Pvolume - TransVolume > cStep) { TransVolume += cStep; volume = decibel<-40>(1.0f - TransVolume/96.0f); } else if (TransVolume - Pvolume > cStep) { TransVolume -= cStep; volume = decibel<-40>(1.0f - TransVolume/96.0f); } mainL[idx] *= volume; // apply Master Volume mainR[idx] *= volume; if (sound == _SYS_::mute::Fading) // fadeLevel must also have been set { for (uint npart = 0; npart < (Runtime.numAvailableParts); ++npart) { if (part[npart]->Paudiodest & 2) { outl[npart][idx] *= fadeLevel; outr[npart][idx] *= fadeLevel; } } mainL[idx] *= fadeLevel; mainR[idx] *= fadeLevel; fadeLevel -= fadeStep; } if (masterMono) mainL[idx] = mainR[idx] = (mainL[idx] + mainR[idx]) / 2.0; } // Peak calculation for mixed outputs float absval; for (int idx = 0; idx < sent_buffersize; ++idx) { if ((absval = fabsf(mainL[idx])) > VUpeak.values.vuOutPeakL) VUpeak.values.vuOutPeakL = absval; if ((absval = fabsf(mainR[idx])) > VUpeak.values.vuOutPeakR) VUpeak.values.vuOutPeakR = absval; // RMS Peak VUpeak.values.vuRmsPeakL += mainL[idx] * mainL[idx]; VUpeak.values.vuRmsPeakR += mainR[idx] * mainR[idx]; } // Peak computation for part vu meters for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { if (partLocal[npart]) { for (int idx = 0; idx < sent_buffersize; ++idx) { if ((absval = fabsf(part[npart]->partoutl[idx])) > VUpeak.values.parts[npart]) VUpeak.values.parts[npart] = absval; if ((absval = fabsf(part[npart]->partoutr[idx])) > VUpeak.values.partsR[npart]) VUpeak.values.partsR[npart] = absval; } } else { VUpeak.values.parts[npart] = -1.0f; VUpeak.values.partsR[npart] = -1.0f; } } VUcount += sent_buffersize; if ((VUcount >= VUperiod && !VUready) || VUcount > (samplerate << 2)) // ensure this eventually clears if VUready fails { VUpeak.values.buffersize = VUcount; VUcount = 0; memcpy(&VUcopy, &VUpeak, sizeof(VUpeak)); VUready = true; VUpeak.values.vuOutPeakL = 1e-12f; VUpeak.values.vuOutPeakR = 1e-12f; VUpeak.values.vuRmsPeakL = 1e-12f; VUpeak.values.vuRmsPeakR = 1e-12f; for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { if (partLocal[npart]) { VUpeak.values.parts[npart] = 1.0e-9f; VUpeak.values.partsR[npart] = 1.0e-9f; } else { VUpeak.values.parts[npart] = -1.0f; VUpeak.values.partsR[npart] = -1.0f; } } } LFOtime += sent_buffersize; // update the LFO's time } return sent_buffersize; } void SynthEngine::fetchMeterData() { if (!VUready) return; float fade; float root; int buffsize = VUcopy.values.buffersize; root = sqrt(VUcopy.values.vuRmsPeakL / buffsize); VUdata.values.vuRmsPeakL = ((VUdata.values.vuRmsPeakL * 7) + root) / 8; root = sqrt(VUcopy.values.vuRmsPeakR / buffsize); VUdata.values.vuRmsPeakR = ((VUdata.values.vuRmsPeakR * 7) + root) / 8; fade = VUdata.values.vuOutPeakL * 0.92f;// mult; if (fade >= 1.0f) // overload protection fade = 0.0f; if (VUcopy.values.vuOutPeakL > fade) VUdata.values.vuOutPeakL = VUcopy.values.vuOutPeakL; else VUdata.values.vuOutPeakL = fade; fade = VUdata.values.vuOutPeakR * 0.92f;// mult; if (VUcopy.values.vuOutPeakR > fade) VUdata.values.vuOutPeakR = VUcopy.values.vuOutPeakR; else VUdata.values.vuOutPeakR = fade; for (uint npart = 0; npart < Runtime.numAvailableParts; ++npart) { if (VUpeak.values.parts[npart] < 0.0) VUdata.values.parts[npart] = -1.0f; else { fade = VUdata.values.parts[npart]; if (VUcopy.values.parts[npart] > fade) VUdata.values.parts[npart] = VUcopy.values.parts[npart]; else VUdata.values.parts[npart] = fade * 0.85f; } if (VUpeak.values.partsR[npart] < 0.0) VUdata.values.partsR[npart] = -1.0f; else { fade = VUdata.values.partsR[npart]; if (VUcopy.values.partsR[npart] > fade) VUdata.values.partsR[npart] = VUcopy.values.partsR[npart]; else VUdata.values.partsR[npart] = fade * 0.85f; } } VUready = false; } // Parameter control void SynthEngine::setPvolume(float control_value) { Pvolume = control_value; } void SynthEngine::setPkeyshift(int Pkeyshift_) { Pkeyshift = Pkeyshift_; keyshift = Pkeyshift - 64; } void SynthEngine::setPaudiodest(int value) { Paudiodest = value; } void SynthEngine::setPsysefxvol(int Ppart, int Pefx, char Pvol) { Psysefxvol[Pefx][Ppart] = Pvol; sysefxvol[Pefx][Ppart] = decibel<-40>(1.0f - Pvol / 96.0f); // Pvol=0..127 => -40dB .. +12.9166dB } void SynthEngine::setPsysefxsend(int Pefxfrom, int Pefxto, char Pvol) { Psysefxsend[Pefxfrom][Pefxto] = Pvol; sysefxsend[Pefxfrom][Pefxto] = decibel<-40>(1.0f - Pvol / 96.0f); } /** * Triggered by Param change or general init; * Collect current state of complex effect data and push an update towards GUI. * The GuiDataExchange system (located in InterChange) is used to publish the * Data Transfer Objects into the GUI, activated by sending a notification through * the toGUI ringbuffer. When receiving such a push, the GUI invokes EffUI::refresh(). */ void SynthEngine::pushEffectUpdate(uchar partNum) { bool isPart{partNum < NUM_MIDI_PARTS}; bool isInsert{partNum != TOPLEVEL::section::systemEffects}; assert(isPart || partNum == TOPLEVEL::section::systemEffects || partNum == TOPLEVEL::section::insertEffects); assert(part[getRuntime().currentPart]); Part& currPart{*part[getRuntime().currentPart]}; // the "current" effect as selected / exposed in the GUI uchar effnum = isPart? currPart.Peffnum : isInsert? inseffnum : syseffnum; assert(effnum < (isPart? NUM_PART_EFX : isInsert? NUM_INS_EFX : NUM_SYS_EFX)); EffectMgr** effInstance = isPart? currPart.partefx : isInsert? insefx : sysefx; EffectDTO dto; dto.effNum = effnum; dto.effType = effInstance[effnum]->geteffect(); dto.isInsert = isInsert; dto.enabled = (0 != dto.effType && ((isPart && !currPart.Pefxbypass[effnum]) ||(isInsert && Pinsparts[effnum] != -1) ||(!isInsert && syseffEnable[effnum]))); dto.changed = effInstance[effnum]->geteffectpar(-1); dto.currPreset = effInstance[effnum]->getpreset(); dto.insertFxRouting = isPart || !isInsert? -1 : Pinsparts[effnum]; dto.partFxRouting = !isPart? +1 : currPart.Pefxroute[effnum]; dto.partFxBypass = !isPart? false : currPart.Pefxbypass[effnum]; effInstance[effnum]->getAllPar(dto.param); //////////////////////////////////////////////////TODO 2/24 as partial workaround until all further direct core accesses are addressed dto.eff_in_core_TODO_deprecated = effInstance[effnum]; if (isPart) partEffectUiCon.publish(dto); else if (isInsert) insEffectUiCon.publish(dto); else sysEffectUiCon.publish(dto); if (dto.effType == (EFFECT::type::eq - EFFECT::type::none)) {// cascading update for the embedded EQ graph EqGraphDTO graphDto; effInstance[effnum]->renderEQresponse(graphDto.response); if (isPart) partEqGraphUiCon.publish(graphDto); else if (isInsert) insEqGraphUiCon.publish(graphDto); else sysEqGraphUiCon.publish(graphDto); } } /** * Push a complete update of Effect state, in case the GUI is active. * There are three distinct EffUI modules, each receiving the state of "the current" * selected effect. Calling this function is only required when effect state changes * are _not_ propagated via InterChange::commandSysIns(), commandEffects() or commandPart(). * Especially it must be invoked after loading or pasting state, and this is covered by getfromXML(). * Init() and defaults() do not call this function; either it is covered otherwise * or because the default constructed GUI widgets do not need an initial push * Thus, the only other situation to cover is a call to SynthEngine::resetAll(). */ void SynthEngine::maybePublishEffectsToGui() { #ifdef GUI_FLTK if (not interchange.guiMaster) return; // publish only while GUI is active pushEffectUpdate(TOPLEVEL::section::systemEffects); pushEffectUpdate(TOPLEVEL::section::insertEffects); pushEffectUpdate(getRuntime().currentPart); #endif } // Panic! (Clean up all parts and effects) void SynthEngine::ShutUp() { VUpeak.values.vuOutPeakL = 1e-12f; VUpeak.values.vuOutPeakR = 1e-12f; for (int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { part[npart]->cleanup(); VUpeak.values.parts[npart] = -1.0f; VUpeak.values.partsR[npart] = -1.0f; } for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) insefx[nefx]->cleanup(); for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) sysefx[nefx]->cleanup(); } bool SynthEngine::loadStateAndUpdate(string const& filename) { interchange.undoRedoClear(); Runtime.sessionStage = _SYS_::type::InProgram; bool success = Runtime.restoreSessionData(filename); if (!success) defaults(); return success; } bool SynthEngine::saveState(string const& filename) { return Runtime.saveSessionData(filename); } bool SynthEngine::loadPatchSetAndUpdate(string fname) { interchange.undoRedoClear(); bool result; fname = setExtension(fname, EXTEN::patchset); result = loadXML(fname); // load the data if (result) setAllPartMaps(); return result; } bool SynthEngine::installBanks() { ///////TODO this function should be in class Bank (makes SyntEngine needlessly complex) string bankFile = file::configDir() + '/' + YOSHIMI + ".banks"; bool newBanks = false; if (isRegularFile(bankFile)) { newBanks = bank.establishBanks(bankFile); } else { newBanks = bank.establishBanks(std::nullopt); Runtime.currentRoot = 5; } Runtime.Log("\nFound " + asString(bank.instrumentsInBanks) + " instruments in " + asString(bank.banksInRoots) + " banks"); if (newBanks) Runtime.Log(textMsgBuffer.fetch(setRootBank(5, 5) & 0xff)); else Runtime.Log(textMsgBuffer.fetch(setRootBank(Runtime.tempRoot, Runtime.tempBank) & 0xff)); return true; } bool SynthEngine::saveBanks() { string name = file::configDir() + '/' + YOSHIMI; string bankname = name + ".banks"; XMLStore xml{TOPLEVEL::XML::Bank}; XMLtree xmlInfo = xml.accessTop().getElm("INFORMATION"); // Info-node is added automatically together with the metadata for root // for banks we store the current Bank-Version there xmlInfo.addPar_int("Banks_Version", bank.getVersion()); XMLtree xmlBankList = xml.addElm("BANKLIST"); bank.saveToConfigFile(xmlBankList); if (not xml.saveXMLfile(bankname, getRuntime().getLogger(), getRuntime().gzipCompression)) Runtime.Log("Failed to save config to " + bankname); return true; } void SynthEngine::newHistory(string name, uint group) { if (findLeafName(name) < "!") return; if (group == TOPLEVEL::XML::Instrument and name.rfind(EXTEN::yoshInst) != string::npos) name = setExtension(name, EXTEN::zynInst); getHistory(group).push_back(name); } void SynthEngine::addHistory(string const& name, uint group) { if (findLeafName(name) < "!") { return; } if (group > TOPLEVEL::XML::ScalaMap) return; // last seen not stored for these. historyLastSeen.at(group) = name; if (Runtime.historyLock[group]) { return; } vector& historyData{getHistory(group)}; auto it = historyData.begin(); historyData.erase(std::remove(it, historyData.end(), name), historyData.end()); // remove all matches historyData.insert(historyData.begin(), name); while(historyData.size() > MAX_HISTORY) historyData.pop_back(); } vector& SynthEngine::getHistory(uint group) { switch(group) { case TOPLEVEL::XML::Instrument: // 0 return InstrumentHistory; break; case TOPLEVEL::XML::Patch: // 1 return ParamsHistory; break; case TOPLEVEL::XML::Scale: // 2 return ScaleHistory; break; case TOPLEVEL::XML::State: // 3 return StateHistory; break; case TOPLEVEL::XML::Vector: // 4 return VectorHistory; break; case TOPLEVEL::XML::MLearn: // 5 return MidiLearnHistory; break; case TOPLEVEL::XML::Presets: // 6 return PresetHistory; break; case TOPLEVEL::XML::PadSample: // 7 return PadHistory; break; case TOPLEVEL::XML::ScalaTune: // 8 return TuningHistory; break; case TOPLEVEL::XML::ScalaMap: // 9 return KeymapHistory; break; default: // can't identify what is calling this. // It's connected with opening the filer on presets Runtime.Log("Unrecognised history group " + to_string(group) + "\nUsing patchset history"); return ParamsHistory; } } void SynthEngine::setHistoryLock(int group, bool status) { Runtime.historyLock[group] = status; } bool SynthEngine::getHistoryLock(int group) { return Runtime.historyLock[group]; } string SynthEngine::lastItemSeen(int group) { if (group > TOPLEVEL::XML::ScalaMap) return ""; // last seen not stored for these. if (group == TOPLEVEL::XML::Instrument && Runtime.sessionSeen[group] == false) return ""; return historyLastSeen.at(group); } bool SynthEngine::loadHistory() { string historyFile{file::localDir() + "/recent"}; if (not isRegularFile(historyFile)) { // second attempt at legacy location... historyFile = file::configDir() + '/' + YOSHIMI + ".history"; if (not isRegularFile(historyFile)) { Runtime.Log("Missing recent history file"); return false; } } XMLStore xml{historyFile, Runtime.getLogger()}; XMLtree xmlHistory = xml.getElm("HISTORY"); if (not xmlHistory) { Runtime. Log("Failed to extract history data, no branch in \""+historyFile+"\""); return false; } uint typeID; string historyKind; string fileTypeID; for (typeID = TOPLEVEL::XML::Instrument; typeID <= TOPLEVEL::XML::ScalaMap; ++typeID) { switch (typeID) { case TOPLEVEL::XML::Instrument: historyKind = "XMZ_INSTRUMENTS"; fileTypeID = "xiz_file"; break; case TOPLEVEL::XML::Patch: historyKind = "XMZ_PATCH_SETS"; fileTypeID = "xmz_file"; break; case TOPLEVEL::XML::Scale: historyKind = "XMZ_SCALE"; fileTypeID = "xsz_file"; break; case TOPLEVEL::XML::State: historyKind = "XMZ_STATE"; fileTypeID = "state_file"; break; case TOPLEVEL::XML::Vector: historyKind = "XMZ_VECTOR"; fileTypeID = "xvy_file"; break; case TOPLEVEL::XML::MLearn: historyKind = "XMZ_MIDILEARN"; fileTypeID = "xly_file"; break; case TOPLEVEL::XML::Presets: historyKind = "XMZ_PRESETS"; fileTypeID = "xpz_file"; break; case TOPLEVEL::XML::PadSample: historyKind = "XMZ_PADSAMPLE"; fileTypeID = "wav_file"; break; case TOPLEVEL::XML::ScalaTune: historyKind = "XMZ_TUNING"; fileTypeID = "scl_file"; break; case TOPLEVEL::XML::ScalaMap: historyKind = "XMZ_KEYMAP"; fileTypeID = "kbm_file"; break; } if (XMLtree xmlHistoryType = xmlHistory.getElm(historyKind)) { Runtime.historyLock[typeID] = xmlHistoryType.getPar_bool("lock_status", false); uint hist_size = xmlHistoryType.getPar_int("history_size", 0, 0, MAX_HISTORY); if (hist_size > 0) {// should never exceed max history assert (hist_size <= MAX_HISTORY); for (uint i = 0; i < hist_size; ++i) { if (XMLtree xmlFile = xmlHistoryType.getElm("XMZ_FILE", i)) { string histFileName = xmlFile.getPar_str(fileTypeID); if (fileTypeID == "xiz_file" and not isRegularFile(histFileName)) { if (histFileName.rfind(EXTEN::zynInst) != string::npos) histFileName = setExtension(histFileName, EXTEN::yoshInst); } if (not histFileName.empty() and isRegularFile(histFileName)) newHistory(histFileName, typeID); } } string tryRecent = xmlHistoryType.getPar_str("most_recent"); if (not tryRecent.empty()) historyLastSeen.at(typeID) = tryRecent; } } }// for return true; } bool SynthEngine::saveHistory() { XMLStore xml{TOPLEVEL::XML::History}; XMLtree xmlHistory = xml.addElm("HISTORY"); { uint typeID; string historyKind; string fileTypeID; for (typeID = TOPLEVEL::XML::Instrument; typeID <= TOPLEVEL::XML::ScalaMap; ++typeID) { switch (typeID) { case TOPLEVEL::XML::Instrument: historyKind = "XMZ_INSTRUMENTS"; fileTypeID = "xiz_file"; break; case TOPLEVEL::XML::Patch: historyKind = "XMZ_PATCH_SETS"; fileTypeID = "xmz_file"; break; case TOPLEVEL::XML::Scale: historyKind = "XMZ_SCALE"; fileTypeID = "xsz_file"; break; case TOPLEVEL::XML::State: historyKind = "XMZ_STATE"; fileTypeID = "state_file"; break; case TOPLEVEL::XML::Vector: historyKind = "XMZ_VECTOR"; fileTypeID = "xvy_file"; break; case TOPLEVEL::XML::MLearn: historyKind = "XMZ_MIDILEARN"; fileTypeID = "xly_file"; break; case TOPLEVEL::XML::Presets: historyKind = "XMZ_PRESETS"; fileTypeID = "xpz_file"; break; case TOPLEVEL::XML::PadSample: historyKind = "XMZ_PADSAMPLE"; fileTypeID = "wav_file"; break; case TOPLEVEL::XML::ScalaTune: historyKind = "XMZ_TUNING"; fileTypeID = "scl_file"; break; case TOPLEVEL::XML::ScalaMap: historyKind = "XMZ_KEYMAP"; fileTypeID = "kbm_file"; break; } vector const& historyData{getHistory(typeID)}; if (not historyData.empty()) { uint i{0}; XMLtree xmlHistoryType = xmlHistory.addElm(historyKind); xmlHistoryType.addPar_bool("lock_status", Runtime.historyLock[typeID]); xmlHistoryType.addPar_int ("history_size", historyData.size()); assert(historyData.size() <= MAX_HISTORY); for (auto const& historyEntry : historyData) { XMLtree xmlFile = xmlHistoryType.addElm("XMZ_FILE", i); xmlFile.addPar_str(fileTypeID, historyEntry); ++i; } xmlHistoryType.addPar_str("most_recent", historyLastSeen.at(typeID)); } }// for } string historyFile = file::localDir() + "/recent"; bool success = xml.saveXMLfile(historyFile, Runtime.getLogger(), Runtime.gzipCompression); if (not success) Runtime.Log("Failed to save history index to \""+ historyFile+"\""); return success; } void SynthEngine::add2XML(XMLStore& xml) { XMLtree xmlMaster = xml.addElm("MASTER"); xmlMaster.addPar_int ("current_midi_parts" , Runtime.numAvailableParts); xmlMaster.addPar_int ("panning_law" , Runtime.panLaw); xmlMaster.addPar_frac("volume" , Pvolume); xmlMaster.addPar_int ("key_shift" , Pkeyshift); xmlMaster.addPar_real("bpm_fallback" , PbpmFallback); xmlMaster.addPar_int ("channel_switch_type", Runtime.channelSwitchType); xmlMaster.addPar_int ("channel_switch_CC" , Runtime.channelSwitchCC); XMLtree xmlMicrotonal = xmlMaster.addElm("MICROTONAL"); microtonal.add2XML(xmlMicrotonal); for (uint npart = 0; npart < NUM_MIDI_PARTS; ++npart) { XMLtree xmlPart = xmlMaster.addElm("PART",npart); part[npart]->add2XML_YoshimiPartSetup(xmlPart); } XMLtree xmlSysEffects = xmlMaster.addElm("SYSTEM_EFFECTS"); for (uint nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { XMLtree xmlSysfx = xmlSysEffects.addElm("SYSTEM_EFFECT", nefx); XMLtree xmlEffectSetting = xmlSysfx.addElm("EFFECT"); sysefx[nefx]->add2XML(xmlEffectSetting); for (uint pefx = 0; pefx < NUM_MIDI_PARTS; ++pefx) { XMLtree xmlMixVol = xmlSysfx.addElm("VOLUME", pefx); xmlMixVol.addPar_int("vol", Psysefxvol[nefx][pefx]); } for (int tonefx = nefx + 1; tonefx < NUM_SYS_EFX; ++tonefx) { XMLtree xmlSendVol = xmlSysfx.addElm("SENDTO", tonefx); xmlSendVol.addPar_int("send_vol", Psysefxsend[nefx][tonefx]); } } XMLtree xmlInsEffects = xmlMaster.addElm("INSERTION_EFFECTS"); for (uint nefx = 0; nefx < NUM_INS_EFX; ++nefx) { XMLtree xmlInsfx = xmlInsEffects.addElm("INSERTION_EFFECT", nefx); xmlInsfx.addPar_int("part", Pinsparts[nefx]); XMLtree xmlEffectSetting = xmlInsfx.addElm("EFFECT"); insefx[nefx]->add2XML(xmlEffectSetting); } for (uint i = 0; i < NUM_MIDI_CHANNELS; ++i) if (Runtime.vectordata.Xaxis[i] < 127) { XMLtree xmlVector = xmlMaster.addElm("VECTOR", i); vectorcontrol.insertVectorData(i, false, xmlVector, ""); } } bool SynthEngine::savePatchesXML(string filename) { filename = setExtension(filename, EXTEN::patchset); XMLStore xml{TOPLEVEL::XML::Patch}; this->add2XML(xml); return xml.saveXMLfile(filename ,Runtime.getLogger() ,Runtime.gzipCompression); } bool SynthEngine::loadXML(string const& filename) { XMLStore xml{filename, Runtime.getLogger()}; postLoadCheck(xml,*this); if (not xml) return false; defaults(); bool success = getfromXML(xml); setAllPartMaps(); return success; } bool SynthEngine::getfromXML(XMLStore& xml) { XMLtree xmlMaster = xml.getElm("MASTER"); if (not xmlMaster) { Runtime.Log("SynthEngine getfromXML: no branch found in XML"); return false; } Runtime.numAvailableParts = xmlMaster.getPar_int("current_midi_parts", NUM_MIDI_CHANNELS, NUM_MIDI_CHANNELS, NUM_MIDI_PARTS); Runtime.panLaw = xmlMaster.getPar_int("panning_law", Runtime.panLaw, MAIN::panningType::cut, MAIN::panningType::boost); setPvolume(xmlMaster.getPar_frac("volume", Pvolume, 0, 127)); setPkeyshift(xmlMaster.getPar_int("key_shift", Pkeyshift, MIN_KEY_SHIFT + 64, MAX_KEY_SHIFT + 64)); PbpmFallback = xmlMaster.getPar_real("bpm_fallback", PbpmFallback, BPM_FALLBACK_MIN, BPM_FALLBACK_MAX); Runtime.channelSwitchType = xmlMaster.getPar_int("channel_switch_type", Runtime.channelSwitchType, 0, 5); Runtime.channelSwitchCC = xmlMaster.getPar_int("channel_switch_CC", Runtime.channelSwitchCC, 0, 128); Runtime.channelSwitchValue = 0; for (uint npart = 0; npart < NUM_MIDI_PARTS; ++npart) if (XMLtree xmlPart = xmlMaster.getElm("PART", npart)) { part[npart]->getfromXML(xmlPart); if (partonoffRead(npart) && (part[npart]->Paudiodest & 2)) Config::instances().registerAudioPort(getUniqueId(), npart); } if (XMLtree xmlMicrotonal = xmlMaster.getElm("MICROTONAL")) microtonal.getfromXML(xmlMicrotonal); sysefx[0]->defaults(); if (XMLtree xmlSysEffects = xmlMaster.getElm("SYSTEM_EFFECTS")) for (uint nefx = 0; nefx < NUM_SYS_EFX; ++nefx) if (XMLtree xmlSysfx = xmlSysEffects.getElm("SYSTEM_EFFECT", nefx)) { if (XMLtree xmlEffectSetting = xmlSysfx.getElm("EFFECT")) sysefx[nefx]->getfromXML(xmlEffectSetting); for (uint partefx = 0; partefx < NUM_MIDI_PARTS; ++partefx) if (XMLtree xmlMixVol = xmlSysfx.getElm("VOLUME", partefx)) setPsysefxvol(partefx, nefx, xmlMixVol.getPar_127("vol", Psysefxvol[partefx][nefx])); for (uint tonefx = nefx + 1; tonefx < NUM_SYS_EFX; ++tonefx) if (XMLtree xmlSendVol = xmlSysfx.getElm("SENDTO", tonefx)) setPsysefxsend(nefx, tonefx, xmlSendVol.getPar_127("send_vol", Psysefxsend[nefx][tonefx])); } if (XMLtree xmlInsEffects = xmlMaster.getElm("INSERTION_EFFECTS")) for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) if (XMLtree xmlInsfx = xmlInsEffects.getElm("INSERTION_EFFECT", nefx)) { Pinsparts[nefx] = xmlInsfx.getPar_int("part", Pinsparts[nefx], -2, NUM_MIDI_PARTS); if (XMLtree xmlEffectSetting = xmlInsfx.getElm("EFFECT")) insefx[nefx]->getfromXML(xmlEffectSetting); } for (uchar i = 0; i < NUM_MIDI_CHANNELS; ++i) if (XMLtree xmlVector = xmlMaster.getElm("VECTOR", i)) vectorcontrol.extractVectorData(i, xmlVector, ""); // possibly push changed effect state to GUI maybePublishEffectsToGui(); return true; } string SynthEngine::makeUniqueName(string const& name) { string result = "Yoshimi"; if (uniqueId > 0) result += ("-" + asString(uniqueId)); result += " : " + name; return result; } float SynthEngine::getLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; uchar type = 0; // defaults int min = 0; float def = 64; int max = 127; type |= TOPLEVEL::type::Integer; uchar learnable = TOPLEVEL::type::Learnable; switch (control) { case MAIN::control::volume: def = 90; type &= ~TOPLEVEL::type::Integer; type |= learnable; break; case MAIN::control::startInstance: case MAIN::control::stopInstance: min = 0; def = 1; max = 31; break; case MAIN::control::partNumber: def = 0; max = Runtime.numAvailableParts -1; break; case MAIN::control::availableParts: min = 16; def = 16; max = 64; break; case MAIN::control::panLawType: min = MAIN::panningType::cut; def = MAIN::panningType::normal; max = MAIN::panningType::boost; break; case MAIN::control::detune: type &= ~TOPLEVEL::type::Integer; break; case MAIN::control::keyShift: min = -36; def = 0; max = 36; break; case MAIN::control::bpmFallback: min = BPM_FALLBACK_MIN; def = 120; max = BPM_FALLBACK_MAX; type &= ~TOPLEVEL::type::Integer; break; case MAIN::control::mono: def = 0; // off max = 1; type |= learnable; break; case MAIN::control::soloType: def = 0; // Off max = 5; break; case MAIN::control::soloCC: min = 14; def = 115; max = 119; break; case MAIN::control::defaultPart: case MAIN::control::defaultInstrument: def = 0; max = Runtime.numAvailableParts -1; break; case MAIN::control::masterReset: case MAIN::control::masterResetAndMlearn: case MAIN::control::stopSound: def = 0; max = 0; break; case MAIN::control::loadInstrumentFromBank: return value; // this is just a workaround :( break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } void SynthEngine::CBtest(CommandBlock *candidate, bool miscmsg) // default - don't read message { std::cout << "\n value " << candidate->data.value << "\n type " << int(candidate->data.type) << "\n source " << int(candidate->data.source) << "\n cont " << int(candidate->data.control) << "\n part " << int(candidate->data.part) << "\n kit " << int(candidate->data.kit) << "\n engine " << int(candidate->data.engine) << "\n insert " << int(candidate->data.insert) << "\n parameter " << int(candidate->data.parameter) << "\n offset " << int(candidate->data.offset) << std::endl; if (miscmsg) // read this *without* deleting it std::cout << ">" << textMsgBuffer.fetch(candidate->data.miscmsg, false) << "<" << std::endl; else std::cout << " miscmsg " << int(candidate->data.miscmsg) << std::endl; } yoshimi-2.3.5.1/src/Misc/SynthEngine.h000066400000000000000000000257211506652756400174560ustar00rootroot00000000000000/* SynthEngine.h Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2025, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef SYNTHENGINE_H #define SYNTHENGINE_H #include #include #include #include #include #include #include #include #include #include #include "Misc/RandomGen.h" #include "Misc/Microtonal.h" #include "Misc/Bank.h" #include "DSP/FFTwrapper.h" #include "Interface/InterChange.h" #include "Interface/MidiLearn.h" #include "Interface/MidiDecode.h" #include "Interface/Vectors.h" #include "Misc/Config.h" #include "globals.h" class Part; class EffectMgr; struct EffectDTO; struct EqGraphDTO; class XMLStore; class Controller; class TextMsgBuffer; class InterfaceAnchor; #ifdef GUI_FLTK class MasterUI; #endif using std::string; using std::to_string; using std::unique_ptr; class SynthEngine { const uint uniqueId; Config Runtime; public: Bank bank; InterChange interchange; MidiLearn midilearn; MidiDecode mididecode; Vectors vectorcontrol; public: Config& getRuntime() {return Runtime;} uint getUniqueId() const {return uniqueId;} SynthEngine(uint instanceID); ~SynthEngine(); // shall not be copied nor moved SynthEngine(SynthEngine&&) = delete; SynthEngine(SynthEngine const&) = delete; SynthEngine& operator=(SynthEngine&&) = delete; SynthEngine& operator=(SynthEngine const&) = delete; bool Init(uint audiosrate, int audiobufsize); InterfaceAnchor buildGuiAnchor(); void postBootHook(bool); bool savePatchesXML(string filename); void add2XML(XMLStore&); string manualname(); void defaults(); bool loadXML(string const& filename); bool loadStateAndUpdate(string const& filename); bool saveState(string const& filename); bool loadPatchSetAndUpdate(string filename); bool installBanks(); bool saveBanks(); void newHistory(string name, uint group); void addHistory(string const& name, uint group); std::vector& getHistory(uint group); void setHistoryLock(int group, bool status); bool getHistoryLock(int group); string lastItemSeen(int group); bool loadHistory(); bool saveHistory(); bool getfromXML(XMLStore&); void NoteOn(uchar chan, uchar note, uchar velocity); void NoteOff(uchar chan, uchar note); int RunChannelSwitch(uchar chan, int value); void SetController(uchar chan, int CCtype, short par); void SetZynControls(bool in_place); int setRootBank(int root, int bank, bool inplace = false); int setProgramByName(CommandBlock&); int setProgramFromBank(CommandBlock&, bool inplace = false); bool setProgram(string const& fname, int npart); int ReadBankRoot(); int ReadBank(); void SetPartChanForVector(uchar npart, uchar nchan); void SetPartPortamento(int npart, bool state); bool ReadPartPortamento(int npart); void SetPartKeyMode(int npart, int mode); int ReadPartKeyMode(int npart); void cliOutput(std::list& msg_buf, uint lines); void ListPaths(std::list& msg_buf); void ListBanks(int rootNum, std::list& msg_buf); void ListInstruments(int bankNum, std::list& msg_buf); void ListVectors(std::list& msg_buf); bool SingleVector(std::list& msg_buf, int chan); void ListSettings(std::list& msg_buf); int SetSystemValue(int type, int value); int LoadNumbered(uchar group, uchar entry); bool vectorInit(int dHigh, uchar chan, int par); void vectorSet(int dHigh, uchar chan, int par); void ClearNRPNs(); void resetAll(bool andML); void ShutUp(); int MasterAudio(float *outl [NUM_MIDI_PARTS + 1], float *outr [NUM_MIDI_PARTS + 1], int to_process = 0); void partonoffLock(uint npart, int what); void partonoffWrite(uint npart, int what); char partonoffRead(uint npart); void setPartMap(int npart); void setAllPartMaps(); void audioOutStore(uint8_t num); std::atomic audioOut; sem_t partlock; uchar legatoPart; bool masterMono; float getLimits(CommandBlock *getData); float getVectorLimits(CommandBlock *getData); float getConfigLimits(CommandBlock *getData); void CBtest(CommandBlock *candidate, bool miscmsg = false); Part *part[NUM_MIDI_PARTS]; uint fadeAll; // Per sample change in gain calculated whenever samplerate changes // (which is currently only on init). fadeStep is used in SynthEngine, // while fadeStepShort is used directly by notes, currently only for legato. float fadeStep; float fadeStepShort; float fadeLevel; // parameters uint samplerate; float samplerate_f; float halfsamplerate_f; int buffersize; float buffersize_f; int bufferbytes; int oscilsize; float oscilsize_f; int halfoscilsize; float halfoscilsize_f; float oscil_sample_step_f; float oscil_norm_factor_pm; float oscil_norm_factor_fm; // Reference values used for normalization static constexpr float samplerate_ref_f = 44100.0f; static constexpr float oscilsize_ref_f = float(1024 * 256); int sent_buffersize; //used for variable length runs int sent_bufferbytes; //used for variable length runs float sent_buffersize_f; //used for variable length runs float fixed_sample_step_f; float TransVolume; float Pvolume; float ControlStep; int Paudiodest; int Pkeyshift; float PbpmFallback; uchar Psysefxvol[NUM_SYS_EFX][NUM_MIDI_PARTS]; uchar Psysefxsend[NUM_SYS_EFX][NUM_SYS_EFX]; // parameters control void setPvolume(float value); void setPkeyshift(int Pkeyshift_); void setPsysefxvol(int Ppart, int Pefx, char Pvol); void setPsysefxsend(int Pefxfrom, int Pefxto, char Pvol); void setPaudiodest(int value); // effects uchar syseffnum; bool syseffEnable[NUM_SYS_EFX]; uchar inseffnum; EffectMgr* sysefx[NUM_SYS_EFX]; // system EffectMgr* insefx[NUM_INS_EFX]; // insertion // part that's apply the insertion effect; -1 to disable int Pinsparts[NUM_INS_EFX]; // connection to the currently active effect UI GuiDataExchange::Connection sysEffectUiCon; GuiDataExchange::Connection insEffectUiCon; GuiDataExchange::Connection partEffectUiCon; GuiDataExchange::Connection sysEqGraphUiCon; GuiDataExchange::Connection insEqGraphUiCon; GuiDataExchange::Connection partEqGraphUiCon; void pushEffectUpdate(uchar partNr); void maybePublishEffectsToGui(); // others ... Controller* ctl; Microtonal microtonal; unique_ptr fft; TextMsgBuffer& textMsgBuffer; // peaks for VU-meters union VUtransfer{ struct{ float vuOutPeakL{0}; float vuOutPeakR{0}; float vuRmsPeakL{0}; float vuRmsPeakR{0}; float parts[NUM_MIDI_PARTS]; float partsR[NUM_MIDI_PARTS]; int buffersize{0}; } values; char bytes [sizeof(values)]; }; VUtransfer VUpeak, VUcopy, VUdata; uint VUcount; bool VUready; void fetchMeterData(); using CallbackGuiClosed = std::function; void installGuiClosedCallback(CallbackGuiClosed callback) { callbackGuiClosed = std::move(callback); } void signalGuiWindowClosed(); void shutdownGui(); int64_t getLFOtime() const { return LFOtime;} float getSongBeat() const { return songBeat;} float getMonotonicBeat() const { return monotonicBeat;} float getBPM() const { return bpm; } bool isBPMAccurate() const { return bpmAccurate; } void setBPMAccurate(bool value) { bpmAccurate = value; } void setBeatValues(float songBeat, float monotonicBeat, float bpm) { this->songBeat = songBeat; this->monotonicBeat = monotonicBeat; this->bpm = bpm; } string makeUniqueName(string const& name); void setWindowTitle(string const& t){ if (!t.empty()) windowTitle = t; } string getWindowTitle() { return windowTitle;} void setNeedsSaving(bool ns) { needsSaving = ns; } bool getNeedsSaving() { return needsSaving; } private: float volume; float sysefxvol[NUM_SYS_EFX][NUM_MIDI_PARTS]; float sysefxsend[NUM_SYS_EFX][NUM_SYS_EFX]; int keyshift; public: #ifdef GUI_FLTK ///////////////////TODO 1/2024 : retract direct usage of direct SynthEngine* from UI MasterUI* getGuiMaster(); #endif private: CallbackGuiClosed callbackGuiClosed; string windowTitle; bool needsSaving; int64_t channelTimer; int64_t LFOtime; // used by Pcontinous without Pbpm float songBeat; // used by Pbpm without Pcontinous float monotonicBeat; // used by Pbpm float bpm; // used by Echo Effect bool bpmAccurate; // Set to false by engines that can't provide an accurate BPM value. RandomGen prng; public: float numRandom() { return prng.numRandom(); } uint32_t randomINT(){ return prng.randomINT(); } // random number in the range 0...INT_MAX void setReproducibleState(int value); void swapTestPADtable(); }; #endif /*SYNTHENGINE_H*/ yoshimi-2.3.5.1/src/Misc/SynthHelper.h000066400000000000000000000174741506652756400174760ustar00rootroot00000000000000/* SynthHelper.h Copyright 2011, Alan Calvert Copyright 2021, Kristian Amlie Copyright 2022, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef SYNTHHELPER_H #define SYNTHHELPER_H #include #include namespace synth { // Provides a convenient way to interpolate between samples. You provide a // starting value, and each time you provide new value, it will start // interpolating between the values. It takes into account new values that // appear while an interpolation is happening. template class InterpolatedValue { static constexpr auto DEFAULT_PARAM_INTERPOLATION_LENGTH_msec{50.0}; T oldValue; T newValue; T targetValue; const int interpolationLength; int interpolationPos; public: InterpolatedValue(T startValue, size_t sampleRate) : oldValue(startValue) , newValue(startValue) , targetValue(startValue) // Round up so we are as smooth as possible. , interpolationLength(ceilf(DEFAULT_PARAM_INTERPOLATION_LENGTH_msec / 1000.0 * sampleRate)) , interpolationPos(interpolationLength) { } bool isInterpolating() const { return interpolationPos < interpolationLength; } // The value interpolated from. T getOldValue() const { return oldValue; } // The value interpolated to (not necessarily the same as the last set target point). T getNewValue() const { return newValue; } T getTargetValue() const { return targetValue; } float factor() const { return float(interpolationPos) / float(interpolationLength); } T getValue() const { return getOldValue() * (1.0f - factor()) + getNewValue() * factor(); } void setTargetValue(T value) { targetValue = value; if (!isInterpolating() && targetValue != newValue) { newValue = targetValue; interpolationPos = 0; } } // enforce clean reproducible state by immediately // pushing the interpolation to current target value void pushToTarget() { interpolationPos = interpolationLength; oldValue = newValue = targetValue; } T getAndAdvanceValue() { T v = getValue(); advanceValue(); return v; } void advanceValue() { if (interpolationPos >= interpolationLength) return; if (++interpolationPos < interpolationLength) return; oldValue = newValue; if (targetValue != newValue) { newValue = targetValue; interpolationPos = 0; } } void advanceValue(int samples) { if (interpolationPos >= interpolationLength) return; if (interpolationPos + samples < interpolationLength) { interpolationPos += samples; return; } oldValue = newValue; if (targetValue != newValue) { newValue = targetValue; interpolationPos += samples - interpolationLength; if (interpolationPos >= interpolationLength) pushToTarget(); } else interpolationPos = interpolationLength; } }; /** * Exponential S-Fade Edit-curve. * Create a soft transition without foregrounding the change. The generated value from 0.0 … 1.0 * lags first, then accelerates after 1/5 of the fade time and finally approaches 1.0 asymptotically. * Approximation is based on the differential equation for exponential decay; two functions with * different decay time are cascaded: the first one sets a moving goal for the second one * to follow up damped, at the end both converging towards 1.0 * * Differential equations | Solution * g' = q1·(1 - g) g(x) = 1 - e^-q·x * f' = q2·(g - f) f(x) = 1 - k/(k-1) · e^-q·x + 1/(k-1) · e^-k·q·x * * with Definitions: q1 = q, q2 = k·q * turning point at: w = 1/5·fadeLen * ==> f''= 0 <=> k = e^((k-1)·q·w) <=> q = 1/w·ln(k)/(k-1) */ class SFadeCurve { static constexpr float ASYM = 1.0 / 0.938; // heuristics: typically the curve reaches 0.96 after fadeLen static constexpr float K = 2.0; // higher values of K create a more linear less S-shape curve static float lnK() { return log(K) / (K-1);} static constexpr float TURN = 1/5.0; // heuristics: turning point after 1/5 of fade length const float q1; const float q2; float goal; float mix; public: SFadeCurve(size_t fadeLen) : q1{lnK() / (TURN * fadeLen)} , q2{K * q1} , goal{0} , mix{0} { } float nextStep() { goal += q1 * (ASYM - goal); mix += q2 * (goal - mix); return std::min(mix, 1.0f); } }; inline bool aboveAmplitudeThreshold(float a, float b) { float mean = (fabsf(a)+fabsf(b)) / 2; float delta = fabsf(b - a); if (mean == 0) return false; else return 1e-5f < delta / mean; } inline float interpolateAmplitude(float a, float b, int x, int size) { return a + (b - a) * (float)x / (float)size; } inline float velF(float velocity, unsigned char scaling) { if (scaling == 127 || velocity > 0.99f) return 1.0f; else return powf(velocity, (powf(8.0f, (64.0f - (float)scaling) / 64.0f))); } inline float getDetune(uchar type, ushort coarsedetune, ushort finedetune) { float det = 0.0f; float octdet = 0.0f; float cdet = 0.0f; float findet = 0.0f; int octave = coarsedetune / 1024; // get Octave if (octave >= 8) octave -= 16; octdet = octave * 1200.0f; int cdetune = coarsedetune % 1024; // coarse and fine detune if (cdetune > 512) cdetune -= 1024; int fdetune = finedetune - 8192; switch (type) { // case 1 is used for the default (see below) case 2: cdet = fabs(cdetune * 10.0f); findet = fabs(fdetune / 8192.0f) * 10.0f; break; case 3: cdet = fabsf(cdetune * 100.0f); findet = powf(10.0f, fabs(fdetune / 8192.0f) * 3.0f) / 10.0f - 0.1f; break; case 4: cdet = fabs(cdetune * 701.95500087f); // perfect fifth findet = (powf(2.0f, fabs(fdetune / 8192.0f) * 12.0f) - 1.0f) / 4095.0f * 1200.0f; break; // case ...: need to update N_DETUNE_TYPES, if you'll add more default: cdet = fabs(cdetune * 50.0f); findet = fabs(fdetune / 8192.0f) * 35.0f; // almost like "Paul's Sound Designer 2" break; } if (finedetune < 8192) findet = -findet; if (cdetune < 0) cdet = -cdet; det = octdet + cdet + findet; return det; } }//(End)namespace synth #endif /*SYNTHHELPER_H*/ yoshimi-2.3.5.1/src/Misc/TestInvoker.h000066400000000000000000000520601506652756400174740ustar00rootroot00000000000000/* TestInvoker.h - invoke sound synthesis for automated testing Copyright 2021, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef TESTINVOKER_H #define TESTINVOKER_H #include #include #include #include #include #include #include #include #include #include #include #include "Misc/TestSequence.h" #include "Misc/SynthEngine.h" #include "Misc/CliFuncs.h" #include "Misc/Alloc.h" #include "CLI/Parser.h" namespace test { using std::clamp; using std::string; using std::function; using std::ios_base; using func::asString; using func::asCompactString; using func::asMidiNoteString; using func::string2int; using func::string2int127; using func::string2float; namespace type = TOPLEVEL::type; using midiVal = unsigned char; namespace { // local implementation details class StopWatch { timespec mark; size_t nanoSum; public: StopWatch() : mark{0,0}, nanoSum{0} { } void start() { clock_gettime(CLOCK_REALTIME, &mark); } void stop() { timespec now; clock_gettime(CLOCK_REALTIME, &now); nanoSum += (now.tv_nsec - mark.tv_nsec) + (now.tv_sec - mark.tv_sec) * 1000*1000*1000; } size_t getCumulatedNanos() { return nanoSum; } }; class OutputFile { std::vector buffer; std::fstream file; public: /* disabled output; discard all data */ OutputFile() { } /* open file and allocate buffer to collect sound */ OutputFile(string targetFilename, size_t maxSamples) : buffer{}, file{targetFilename, ios_base::out | ios_base::trunc | ios_base::binary} { if (not isActive()) throw std::runtime_error(string{"Failure to open file '"}+targetFilename+"' for writing"); buffer.reserve(maxSamples); } OutputFile(OutputFile&) = delete; OutputFile(OutputFile&&) = default; OutputFile& operator=(OutputFile&) = delete; OutputFile& operator=(OutputFile&&) = delete; bool isActive() const { return file.is_open() and file.good(); } explicit operator bool() const { return isActive(); } void maybeWrite() { if (not isActive()) return; char* rawData = reinterpret_cast(buffer.data()); size_t numBytes = buffer.size() * sizeof(float); file.write(rawData, numBytes); } void interleave(size_t numSamples, float* samplesL, float* samplesR) { for (size_t i=0; i limited(int min, int max) { return [=](string s) { int rawVal = string2int(s); return clamp(rawVal,min,max); }; } inline function limited(float min, float max) { return [=](string s) { float rawVal = string2float(s); return clamp(rawVal,min,max); }; } inline string getFilename(string cliInput) { string name; for (char c : cliInput) { if (::isspace(c)) break; name += c; } if (name.length() < 4 || ".raw" != name.substr(name.length()-4, 4)) name += ".raw"; return name; } /* Bounce the resulting MIDI note when repeating a scale step up or down. * At the end of the value range, this sequence proceeds mirrored downwards: * 0..127,126..1,0..127... */ inline unsigned char bouncedNote(int note) { const int cycle = 2 * 127; assert(-100*cycle < note && note < +100*cycle); note = (note + 100*cycle) % cycle; if (note > cycle/2) note = cycle - note; assert(0 <= note && note <= 127); return note; } }//(End)implementation detail namespace /* Self-contained test invoker component to perform acceptance tests of the SynthEngine. * Used by the "test"-context within the CLI to define parameters and launch a test run. * This kind of test run will disrupt any other sound production, then synchronously * launch sound calculation with well defined initial state and finally exit Yoshimi. */ class TestInvoker { midiVal chan; // MIDI channel (1..16) midiVal pitch; // MIDI note midiVal velocity; float duration; // in seconds; overall extension of the individual test calculation float holdfraction; // fraction of the duration until sending note off int repetitions; // number of test tones in sequence int scalestep; // semi tones up/down to move for each tone float aOffset; // play additional overlapping note with given offset float aHold; // play additional overlapping note this holdfraction float swapWave; // capture secondary PAD-wavetable and swap it after that offset time(fraction) size_t chunksize; // number of samples to calculate at once. Note: < SynthEngine.buffersize string targetFilename; // RAW file to write generated samples; "" => just calculate, don't write to file size_t smpCnt; enum ParamOp{SET,GET,MAX,MIN,DEFAULT}; TestInvoker() : chan{1}, pitch{60}, // C4 velocity{64}, duration{1.0}, // 1sec holdfraction{0.8}, repetitions{4}, scalestep{4}, // move major third upwards aOffset{0.0}, aHold{0.0}, swapWave{0.0}, chunksize{0}, // 0 means: initialise to SynthEngine.buffersize targetFilename{""}, smpCnt{0} { } public: static TestInvoker& access() {// Meyer's Singleton static TestInvoker instance{}; return instance; } std::atomic_bool activated{false}; /* Delegate for the CLI-CmdInterpreter: handle the CLI instructions * to get and set parameter values for the SynthEngine test. * return: response to be printed to show command results. */ bool handleParameterChange(cli::Parser& input, unsigned char controlType, string& response, size_t bfsz) { if (!chunksize) chunksize = bfsz; // fill in default (depends on Synth) controlType &= (type::Write|type::Default| type::Maximum|type::Minimum); ParamOp operation = controlType == type::Write? SET : controlType == type::Maximum? MAX : controlType == type::Minimum? MIN : controlType == type::Default? DEFAULT : GET; //--------------------------------+cmdID--------+descriptive-name----+default+min+max--+converter-func----- return doTreatParameter(operation, this->pitch, "note", "MIDI Note", 60, 0,127, string2int127, input, response) || doTreatParameter(operation, this->chan, "channel", "MIDI Channel", 1, 1, 16, limited(1,16), input, response) || doTreatParameter(operation, this->velocity, "velocity", "MIDI Velocity", 64, 0,127, string2int127, input, response) || doTreatParameter (operation, this->duration, "duration", "Overall duration(secs)",1.0, 0, 10, limited(0.01f,10.0f),input, response) || doTreatParameter (operation, this->holdfraction, "holdfraction","Note hold (fraction)", 0.8, 0,1.0, limited(0.1f,1.0f), input, response) || doTreatParameter (operation, this->repetitions, "repetitions","Test note repetitions", 4, 1,500, limited(1,500), input, response) || doTreatParameter (operation, this->scalestep, "scalestep", "Semi tones up/down", 4,-100,100, limited(-100,+100), input, response) || doTreatParameter (operation, this->aOffset, "aoffset", "Add tone offset", 0.0, 0,0.9, limited(0.0f,0.9f), input, response) || doTreatParameter (operation, this->aHold, "ahold", "Add tone hold", 0.0, 0,0.9, limited(0.0f,0.9f), input, response) || doTreatParameter (operation, this->swapWave, "swapwave", "Swap PADtable after", 0.0, 0,0.9, limited(0.0f,0.9f), input, response) || doTreatParameter (operation, this->chunksize, "buffersize", "Smps per call", bfsz, 1,bfsz, limited(1,bfsz), input, response) || doTreatParameter (operation, this->targetFilename,"target", "Target RAW-filename", "", "","?", getFilename, input, response) ; } string showTestParams(bool compact) { auto percent = [](float frac){ return asString(100*frac)+"%"; }; if (compact) return string{" TEST: "} + (repetitions > 1? asString(repetitions)+"·":"") + asMidiNoteString(pitch) + (repetitions == 1? "" : scalestep==0? "" : " "+asString(scalestep) + (scalestep > 0? "⤴":"⤵")) + " "+(duration < 1.0? asCompactString(duration*1000)+"ms" : asCompactString(duration)+"s") + (aOffset or aHold? " +("+percent(aOffset)+"/"+percent(aHold)+")":"") + (swapWave? " swap("+percent(swapWave)+")!":"") + (0==targetFilename.length()? "":" >>\""+targetFilename+"\"") ; else return string{" TEST: exec "} + (repetitions > 1? asString(repetitions)+(aOffset or aHold? " cycles ":" notes "):"") + (repetitions > 1 && scalestep != 0? ("start "+asMidiNoteString(pitch)+" step "+asString(scalestep) + (scalestep > 0? " up":" down") +" to "+asMidiNoteString(bouncedNote(pitch+(repetitions-1)*scalestep)) ) : asMidiNoteString(pitch)) + " on Ch."+asString(int(chan)) + (velocity!=64? " vel."+asString(int(velocity)):"") + (repetitions > 1? " each ":" for ") + (duration < 1.0? asCompactString(duration*1000)+"ms" : asCompactString(duration)+"s") + (holdfraction < 1.0? " (hold"+percent(holdfraction)+")":"") + (aOffset or aHold? " +add.tone(after"+percent(aOffset)+" hold"+percent(aHold)+")":"") + (swapWave? " swap PADSynth after"+percent(swapWave):"") + " buffer="+asString(chunksize) + (0==targetFilename.length()? " [calc only]":" write \""+targetFilename+"\"") ; } /* Main test function: run the SynthEngine synchronous, possibly dump results into a file. * Note: the current audio/midi backend is not used at all. */ void performSoundCalculation(SynthEngine& synth) { if (!chunksize) chunksize = synth.buffersize; Samples buffer; OutputFile output = prepareOutput(synth.samplerate); allocate(buffer); synth.getRuntime().Log("TEST::Prepare"); synth.setReproducibleState(0); synth.getRuntime().Log("TEST::Launch"); smpCnt = 0; StopWatch timer; pullSound(synth, buffer, output, timer); size_t runtime = timer.getCumulatedNanos(); double speed = double(runtime) / smpCnt; synth.getRuntime().Log(string{"TEST::Complete"} +" runtime "+asCompactString(runtime)+" ns" +" speed "+asCompactString(speed)+" ns/Sample" +" samples "+asString(smpCnt) +" notes "+asString(repetitions) +" buffer "+asString(chunksize) +" rate "+asString(synth.samplerate) ); output.maybeWrite(); } private: template bool doTreatParameter(ParamOp operation, VAL& theParameter, string const& cmdID, string const& descriptiveName, VAL defaultVal, VAL minVal, VAL maxVal, function parseVal, cli::Parser& input, string& response); void allocate(Samples& buffer) { size_t size = 2 * (NUM_MIDI_PARTS + 1) * chunksize; buffer.reset(size); } OutputFile prepareOutput(unsigned int samplerate) { if (0 == targetFilename.size()) return OutputFile{}; // discard output size_t chunkCnt = size_t(ceil(duration * samplerate / chunksize)); size_t maxSamples = 2 * repetitions * chunkCnt * chunksize; return OutputFile{targetFilename, maxSamples}; } template void insertNote(TestSequence& testSeq, SynthEngine& synth, FUN& noteScale, float hold, float offset =0.0) { auto noteSlot = std::make_shared(0); TestSequence::Event noteOn = [&, noteSlot]() { *noteSlot = noteScale(); // draw next note from sequence synth.NoteOn(chan-1, *noteSlot, velocity); }; TestSequence::Event noteOff = [&, noteSlot]() { synth.NoteOff(chan-1, *noteSlot); }; testSeq.addNote(noteOn,noteOff, hold, offset); } /* the test will execute sequence of note events, together with the appropriate count of * compute-synth calls to yield the desired note duration; this sequence can be repeated * several times. Each further note "draws" from the noteSacle as defined by the scaleStep * (e.g. move up a major third); since the corresponding noteOn/noteOff events need to send * the same MIDI note, a shared variable is allocated on the heap and used by both events. * Depending on the test parameters, more than one note might be placed into a common * "timeline", e.g. to cover legato notes or PADSynth wavetable swapping. */ template TestSequence buildTestSequence(SynthEngine& synth, size_t turnCnt, FUN& noteScale) { TestSequence testSeq{turnCnt}; // always insert at least one test note pre cycle... insertNote(testSeq, synth, noteScale, holdfraction); if (aOffset > 0.0 or aHold > 0.0) {// insert a second overlapping note if (aHold == 0.0) aHold = holdfraction; insertNote(testSeq, synth, noteScale, aHold, aOffset); } if (swapWave > 0.0) {// insert a event to swap PADSynth wavetables (-> trigger crossfade) TestSequence::Event swap = [&](){ synth.swapTestPADtable(); }; testSeq.addEvent(swap, 0.0); // at begin of each cycle: swap in the old wavetable testSeq.addEvent(swap, swapWave); // at defined offset: swap in the new wavetable }// Note: "old" wavetable has already been build and stored on CLI command "swapWave" return testSeq; } void pullSound(SynthEngine& synth, Samples& buffer, OutputFile& output, StopWatch& timer) { float* buffL[NUM_MIDI_PARTS + 1]; float* buffR[NUM_MIDI_PARTS + 1]; for (size_t i=0; i<=NUM_MIDI_PARTS; ++i) { buffL[i] = & buffer[(2*i ) * chunksize]; buffR[i] = & buffer[(2*i+1) * chunksize]; } // find out how much buffer cycles are required to get the desired note play time size_t turnCnt = ceilf(duration * synth.samplerate / chunksize); // quantise the noteOff point to happen exactly after a buffer cycle holdfraction = ceilf(holdfraction*duration * synth.samplerate / chunksize) / turnCnt; auto noteScale = [midiNote{pitch},step{scalestep}]() mutable -> int { int curr = bouncedNote(midiNote); // bounce back when leaving value range midiNote += step; return curr; }; // calculate sound data TestSequence testSeq = buildTestSequence(synth,turnCnt,noteScale); for (int tone=0; tone inline bool TestInvoker::doTreatParameter(ParamOp operation, VAL& theParameter, string const& cmdID, string const& descriptiveName, VAL defaultVal, VAL minVal, VAL maxVal, function parseVal, cli::Parser& input, string& response) { if (input.matchnMove(2, cmdID.c_str())) { VAL resVal = defaultVal; response = descriptiveName; switch (operation) { case SET: if (input.isalnum() || '-' == input.peek() || '.' == input.peek()) { resVal = parseVal(input); input.skipChars(); } theParameter = resVal; response += " set to: "; break; case GET: resVal = theParameter; response += " is: "; break; case MAX: resVal = maxVal; response += " Max "; break; case MIN: resVal = minVal; response += " Min "; break; case DEFAULT: response += " Default "; break; } response += showTestParam(resVal); return true; } else return false; } }// namespace test #endif /*TESTINVOKER_H*/ yoshimi-2.3.5.1/src/Misc/TestSequence.h000066400000000000000000000101751506652756400176300ustar00rootroot00000000000000/* TestSequence.h - helper for automated testing of note sequences Copyright 2022, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef TEST_SEQUENCE_H #define TEST_SEQUENCE_H #include #include #include #include #include #include "globals.h" namespace test { /** * Arrangement of Test events to be carried out for a single test cycle. * This is a timeline of events, and each "tick" on the timeline corresponds * to a "calculate buffer" call into the SynthEngine. "Events" are arbitrary * functors, which are to be invoked _before_ calculating the associated number * of buffers of sound. This arrangement allows to _plan_ notes as pair of * "noteOn"/"noteOff" event, and then to retrieve the resulting operation * sequence broken down to distinct tick counts and ready for execution. */ class TestSequence { public: using Event = std::function; struct EventStep { Event event; size_t step; EventStep(Event e, size_t s) : event{move(e)} , step{s} { } }; using EventSeq = std::vector; TestSequence(size_t cntTicks) : maxTicks{cntTicks} , events{} { } void addNote(Event,Event, float hold, float offset=0); void addEvent(Event, float offset); using Iterator = EventSeq::const_iterator; Iterator begin() const { return events.begin();} Iterator end() const { return events.end(); } size_t size() const { return events.size(); } private: size_t maxTicks; EventSeq events; size_t clamped(size_t tickNo) const { return std::min(maxTicks, std::max(tickNo, size_t{0})); } size_t quantise(float fract) const { return clamped(ceilf(fract * maxTicks)); } }; /** * Base operation: Plant an arbitrary "Event" into the test timeline. */ inline void TestSequence::addEvent(Event event, float offset) { size_t preTicks = quantise(offset); Iterator it = begin(); while (it != end()) { EventStep& precursor = const_cast(*it); if (precursor.step <= preTicks) {// Event to be located beyond current EventStep preTicks -= precursor.step; ++it; continue; } // Event must be located within current EvetnStep's range assert(preTicks < precursor.step); size_t postTicks = precursor.step - preTicks; precursor.step = preTicks; // shorten precursor events.emplace(++it, event, postTicks); // insert before next return; } if (preTicks > 0) events.emplace_back([]{/*do nothing*/}, preTicks); events.emplace_back(event, maxTicks - quantise(offset)); } /** * Plant a note into the test timeline. * Start and duration are given as fraction of the (fixed) overall timeline length, * and all internal accounting is done in "ticks" (each tick corresponds to a SynthEngine compute call). * The note will be started with the onEvent and ended by the offEvent, thereby possibly filling or * separating any intervals already present in the TestSequence. */ inline void TestSequence::addNote(Event onEvent, Event offEvent, float hold, float offset) { addEvent(onEvent, offset); addEvent(offEvent, offset+hold); } }// namespace test #endif /*TEST_SEQUENCE_H*/ yoshimi-2.3.5.1/src/Misc/TextMsgBuffer.h000066400000000000000000000114751506652756400177510ustar00rootroot00000000000000/* TextMsgBuffer.h Copyright 2014-2023, Will Godfrey, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef TEXTMSGBUFFER_H #define TEXTMSGBUFFER_H //#define REPORT_MISCMSG // for testing message list leaks //#define MAX_MSG // for finding out the most we actually use #include #include #include #include #include "globals.h" /* * This singleton provides a transparent text messaging system. * Calling functions only need to recognise integers and strings. * * Pop is destructive. No two functions should ever have been given * the same 'live' ID, but if they do, the second one will get an * empty string. * * Both calls will block, but should be very quick; * * Normally a message will clear before the next one arrives so the * message numbers should remain very low even over multiple instances. * * Historical note: the miscList used to be a global variable and was * accessed through functions mixed in via the MiscFuncs baseclass. * Extracted and changed into a Meyer's Singleton by Ichthyostega 8/2019 */ class TextMsgBuffer { sem_t lock; std::list buffer; TextMsgBuffer() : lock{} , buffer{} { sem_init(&lock, 0, 1); initBuffer(); } ~TextMsgBuffer() { sem_destroy(&lock); } public: /* Meyer's Singleton */ static TextMsgBuffer& instance() { static TextMsgBuffer singleton{}; return singleton; } #ifdef MAX_MSG int count; #endif void clear(); int push(std::string text); std::string fetch(int pos, bool remove = true); private: void initBuffer(); }; inline void TextMsgBuffer::initBuffer() { for (int i = 0; i < NO_MSG; ++i) buffer.push_back(""); /* * We immediately fill the list, as we use the list position * to provide the ID for reading. Therefore once it has been * started entries can only be modified in-place not added * or removed. * We use 255 (NO_MSG) to denote an invalid entry. */ #ifdef MAX_MSG count = 0; #endif } inline void TextMsgBuffer::clear() { // catches message leaks - Shirley knot :@) #ifdef REPORT_MISCMSG std::cout << "TextMsgBuffer cleared" << std::endl; #endif std::list::iterator it = buffer.begin(); for (it = buffer.begin(); it != buffer.end(); ++it) *it = ""; #ifdef MAX_MSG count = 0; std::cout << "max " << count << std::endl; #endif } inline int TextMsgBuffer::push(std::string _text) { if (_text.empty()) return NO_MSG; sem_wait(&lock); std::string text = _text; std::list::iterator it = buffer.begin(); int idx = 0; while (it != buffer.end()) { if (*it == "") { *it = text; #ifdef REPORT_MISCMSG std::cout << "Msg In " << int(idx) << " >" << text << "<" << std::endl; #endif break; } ++ it; ++ idx; } if (it == buffer.end()) { std::cerr << "TextMsgBuffer is full :(" << std::endl; idx = -1; } int result = idx; // in case of a new entry before return sem_post(&lock); #ifdef MAX_MSG if (result > 0) // don't want background ones std::cout << "last " << result << std::endl; if (result > count) { count = result; std::cout << "max " << count << std::endl; } #endif return result; } inline std::string TextMsgBuffer::fetch(int _pos, bool remove) { if (_pos >= NO_MSG) return ""; sem_wait(&lock); int pos = _pos; std::list::iterator it = buffer.begin(); int idx = 0; while (it != buffer.end()) { if (idx == pos) { #ifdef REPORT_MISCMSG std::cout << "Msg Out " << int(idx) << " >" << *it << "<" << std::endl; #endif break; } ++ it; ++ idx; } std::string result; if (idx == pos) { if (remove) swap (result, *it); // in case of a new entry before return else result = *it; } sem_post(&lock); return result; } #endif /*TEXTMSGBUFFER_H*/ yoshimi-2.3.5.1/src/Misc/Util.h000066400000000000000000000052461506652756400161400ustar00rootroot00000000000000/* Util.h - generic helpers and abbreviations Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef UTIL_H #define UTIL_H #include #include #include namespace util { /** shortcut to save some typing when having to define const and non-const variants * of member functions or when an information function must access non-const fields */ template inline OBJ* unConst(const OBJ *o) { return const_cast(o); } template inline OBJ& unConst(OBJ const &ro) { return const_cast(ro); } template inline N1 constexpr min(N1 n1, N2 n2) { return n2 < n1 ? N1(n2) : n1; } template inline N1 constexpr max(N1 n1, N2 n2) { return n1 < n2 ? N1(n2) : n1; } /** force a numeric to be within bounds, inclusively */ template inline NUM constexpr limited(NB lowerBound, NUM val, NB upperBound) { return min(max(val, lowerBound), upperBound); } template inline bool constexpr isLimited(NB lowerBound, NUM val, NB upperBound) { return lowerBound <= val and val <= upperBound; } /** shortcut for containment test on a map */ template inline bool contains(MAP& map, typename MAP::key_type const& key) { return map.find(key) != map.end(); } /** shortcut for set value containment test */ template inline bool contains(std::set const& set, T const& val) { return set.end() != set.find(val); } /** shortcut for string value containment test */ template inline bool contains(std::string const& str, const T& val) { return str.find(val) != std::string::npos; } /** shortcut for brute-force containment test * in any sequential container */ template inline bool contains(SEQ const& cont, typename SEQ::const_reference val) { auto begin = cont.begin(); auto end = cont.end(); return end != std::find(begin, end, val); } } //(End)namespace util #endif /*UTIL_H*/ yoshimi-2.3.5.1/src/Misc/VerInfo.h000066400000000000000000000050711506652756400165670ustar00rootroot00000000000000/* VerInfo.h - Program version data Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2025, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef VER_INFO_H #define VER_INFO_H #include "globals.h" #include /** * Program Version information * Used for compatibility checks of persisted data (XML) */ struct VerInfo { const uint maj{0}; const uint min{0}; const uint rev{0}; VerInfo() = default; explicit VerInfo(uint major ,uint minor = 0 ,uint revision = 0) : maj{major}, min{minor}, rev{revision} { } /** parse dot separated version spec -> Config.cpp */ VerInfo(std::string const& spec); // standard copy operations acceptable explicit operator bool() const { return maj > 0 or min > 0; } friend bool operator==(VerInfo const& v1, VerInfo const& v2) { return v1.maj == v2.maj and v1.min == v2.min and v1.rev == v2.rev; } friend bool operator!=(VerInfo const& v1, VerInfo const& v2) { return not (v1 == v2); } friend bool operator< (VerInfo const& v1, VerInfo const& v2) { return v1.maj < v2.maj or (v1.maj == v2.maj and v1.min < v2.min) or (v1.min == v2.min and v1.rev < v2.rev); } friend bool is_equivalent (VerInfo const& v1, VerInfo const& v2) { return v1.maj == v2.maj and v1.min == v2.min; } /** forcibly replace this VersionInfo with the given other version */ void forceReset(VerInfo const& changedVersion) { new(this) VerInfo{changedVersion}; }// re-construct in-place, since const data fields can not be assigned }; #endif /*VER_INFO_H*/ yoshimi-2.3.5.1/src/Misc/WavFile.cpp000066400000000000000000000053731506652756400171140ustar00rootroot00000000000000/* Copyright (C) 2006 Nasca Octavian Paul Author: Nasca Octavian Paul Mark McCurry This program is free software; you can redistribute it and/or modify it under the terms of either version 2 of the License, or (at your option) any later version, as published by the Free Software Foundation. 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "WavFile.h" /* ######## currently none of this is used WavFile::WavFile(string filename, int samplerate, int channels) :sampleswritten(0), samplerate(samplerate), channels(channels), file(fopen(filename.c_str(), "w")) { if (file) { //making space for the header written at destruction char tmp[44]; memset(tmp, 0, 44 * sizeof(char)); fwrite(tmp, 1, 44, file); } } WavFile::~WavFile() { if (file) { unsigned int chunksize; rewind(file); fwrite("RIFF", 4, 1, file); chunksize = sampleswritten * 4 + 36; fwrite(&chunksize, 4, 1, file); fwrite("WAVEfmt ", 8, 1, file); chunksize = 16; fwrite(&chunksize, 4, 1, file); unsigned short int formattag = 1; //uncompressed wave fwrite(&formattag, 2, 1, file); unsigned short int nchannels = channels; //stereo fwrite(&nchannels, 2, 1, file); unsigned int samplerate_ = samplerate; //samplerate fwrite(&samplerate_, 4, 1, file); unsigned int bytespersec = samplerate * 2 * channels; //bytes/sec fwrite(&bytespersec, 4, 1, file); unsigned short int blockalign = 2 * channels; //2 channels * 16 bits/8 fwrite(&blockalign, 2, 1, file); unsigned short int bitspersample = 16; fwrite(&bitspersample, 2, 1, file); fwrite("data", 4, 1, file); chunksize = sampleswritten * blockalign; fwrite(&chunksize, 4, 1, file); fclose(file); file = NULL; } } bool WavFile::good() const { return file; } void WavFile::writeStereoSamples(int nsmps, short int *smps) { if (file) { fwrite(smps, nsmps, 4, file); sampleswritten += nsmps; } } void WavFile::writeMonoSamples(int nsmps, short int *smps) { if (file) { fwrite(smps, nsmps, 2, file); sampleswritten += nsmps; } } */ yoshimi-2.3.5.1/src/Misc/WavFile.h000066400000000000000000000024361506652756400165560ustar00rootroot00000000000000/* ZynAddSubFX - a software synthesizer WavFile.h - Records sound to a file Copyright (C) 2008 Nasca Octavian Paul Author: Nasca Octavian Paul Mark McCurry This program is free software; you can redistribute it and/or modify it under the terms of either version 2 of the License, or (at your option) any later version, as published by the Free Software Foundation. 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef WAVFILE_H #define WAVFILE_H #include class WavFile { public: WavFile(std::string filename, int samplerate, int channels); ~WavFile(); bool good() const; void writeMonoSamples(int nsmps, short int *smps); void writeStereoSamples(int nsmps, short int *smps); private: int sampleswritten; int samplerate; int channels; FILE *file; }; #endif yoshimi-2.3.5.1/src/Misc/WaveShapeSamples.h000066400000000000000000000143741506652756400204350ustar00rootroot00000000000000/* WaveShapeSamples.h - "AlienWah" effect Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code, modified October 2010 */ #ifndef WAVESHAPESAMPLES_H #define WAVESHAPESAMPLES_H #include #include "Misc/NumericFuncs.h" using func::power; class WaveShapeSamples { public: WaveShapeSamples() { } ~WaveShapeSamples() { } void waveShapeSmps(int n, float *smps, unsigned char type, unsigned char drive); }; // Waveshape, used by OscilGen::waveshape and Distorsion::process inline void WaveShapeSamples::waveShapeSmps(int n, float *smps, unsigned char type, unsigned char drive) { int i; float ws = drive / 127.0f; float tmpv; switch (type) { case 1: ws = powf( 10.0f, ws * ws * 3.0f) - 1.0f + 0.001f; // Arctangent for (i = 0; i < n; ++i) smps[i] = atanf(smps[i] * ws) / atanf(ws); break; case 2: ws = ws * ws * 32.0f + 0.0001f; // Asymmetric tmpv = (ws < 1.0f) ? sinf(ws) + 0.1f : 1.1f; for (i = 0; i < n; ++i) smps[i] = sinf(smps[i] * (0.1f + ws - ws * smps[i])) / tmpv; break; case 3: ws = ws * ws * ws * 20.0f + 0.0001f; // Pow for (i = 0; i < n; ++i) { smps[i] *= ws; if (fabsf(smps[i]) < 1.0f) { smps[i] = (smps[i] - powf(smps[i], 3.0f)) * 3.0f; if (ws < 1.0f) smps[i] /= ws; } else smps[i] = 0.0f; } break; case 4: ws = ws * ws * ws * 32.0f + 0.0001f; // Sine tmpv = (ws < 1.57f) ? sinf(ws) : 1.0f; for (i = 0; i < n; ++i) smps[i] = sinf(smps[i] * ws) / tmpv; break; case 5: ws = ws * ws + 0.000001f; // Quantisize for (i = 0; i < n; ++i) smps[i] = floorf(smps[i] / ws + 0.5f) * ws; break; case 6: ws = ws * ws * ws * 32.0f + 0.0001f; // Zigzag tmpv = (ws < 1.0f) ? sinf(ws) : 1.0f; for (i = 0; i < n; ++i) smps[i] = asinf(sinf(smps[i] * ws)) / tmpv; break; case 7: ws = power<2>(-ws * ws * 8.0f); // Limiter for (i = 0; i < n; ++i) { float tmp = smps[i]; if (fabsf(tmp) > ws) { smps[i] = (tmp >= 0.0f) ? 1.0f : -1.0f; } else smps[i] /= ws; } break; case 8: ws = power<2>(-ws * ws * 8.0f); // Upper Limiter for (i = 0; i < n; ++i) { float tmp = smps[i]; if (tmp > ws) smps[i] = ws; smps[i] *= 2.0f; } break; case 9: ws = power<2>(-ws * ws * 8.0f); // Lower Limiter for (i = 0; i < n; ++i) { float tmp = smps[i]; if (tmp < -ws) smps[i] = -ws; smps[i] *= 2.0f; } break; case 10: ws = (power<2>(ws * 6.0f) - 1.0f) / power<2>(6.0f); // Inverse Limiter for (i = 0; i < n; ++i) { float tmp = smps[i]; if (fabsf(tmp) > ws) { smps[i] = (tmp >= 0.0f) ? (tmp - ws) : (tmp + ws); } else smps[i] = 0.0f; } break; case 11: ws = power<5>(ws * ws * 1.0f) - 1.0f; // Clip for (i = 0; i < n; ++i) smps[i] = smps[i] * (ws + 0.5f) * 0.9999f - floorf(0.5f + smps[i] * (ws + 0.5f) * 0.9999f); break; case 12: ws = ws * ws * ws * 30.0f + 0.001f; // Asym2 tmpv = (ws < 0.3f) ? ws : 1.0f; for (i = 0; i < n; ++i) { float tmp = smps[i] * ws; if (tmp > -2.0f && tmp < 1.0f) smps[i] = tmp * (1.0f - tmp) * (tmp + 2.0f) / tmpv; else smps[i] = 0.0f; } break; case 13: ws = ws * ws * ws * 32.0f + 0.0001f; // Pow2 tmpv = (ws < 1.0f) ? (ws * (1.0f + ws) / 2.0f) : 1.0f; for (i = 0; i < n; ++i) { float tmp = smps[i] * ws; if (tmp >- 1.0 && tmp < 1.618034f) smps[i] = tmp * (1.0f - tmp) / tmpv; else if (tmp > 0.0f) smps[i] = -1.0f; else smps[i] = -2.0f; } break; case 14: ws = powf(ws, 5.0f) * 80.0f + 0.0001f; // sigmoid tmpv = (ws > 10.0f) ? 0.5f : 0.5f - 1.0f / (expf(ws) + 1.0f); for (i = 0; i < n; ++i) { float tmp = smps[i] * ws; if (tmp < -10.0f) tmp = -10.0f; else if (tmp > 10.0f) tmp = 10.0f; tmp = 0.5f - 1.0f / (expf(tmp) + 1.0f); smps[i] = tmp / tmpv; } break; // todo update to Distorsion::changepar (Ptype max) if there is added // more waveshapings functions } } #endif yoshimi-2.3.5.1/src/Misc/XMLStore.cpp000066400000000000000000000630421506652756400172310ustar00rootroot00000000000000/* XMLStore.cpp - Store structured data in XML Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2025, Will Godfrey Copyright 2025, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #include "Misc/Config.h" #include "Misc/XMLStore.h" #include "Misc/FileMgrFuncs.h" #include "Misc/FormatFuncs.h" #include #include #include #include #include #include #include using file::saveText; using file::loadGzipped; using file::saveGzipped; using file::findExtension; using func::string2int; using func::string2uint; using func::string2float; using func::asLongString; using func::asString; using std::optional; using std::string; using std::move; namespace { // internal details of MXML integration const auto XML_HEADER = "?xml version=\"1.0\" encoding=\"UTF-8\"?"; const auto ROOT_ZYN = "ZynAddSubFX-data"; const auto ROOT_YOSHI = "Yoshimi-data"; auto topElmName(XMLStore::Metadata const& meta) { return meta.isZynCompat()? ROOT_ZYN : ROOT_YOSHI; } /** @remark our XML files often start with leading whitespace * which is not tolerated by the XML parser */ const char* withoutLeadingWhitespace(const char * text) { while (isspace(*text)) ++text; return text; } const char* XMLStore_whitespace_callback(mxml_node_t* node, int where) { const char* name = mxmlGetElement(node); if (where == MXML_WS_BEFORE_OPEN && name && !strncmp(name, "?xml", 4)) return NULL; if (where == MXML_WS_BEFORE_CLOSE && name && !strncmp(name, "string", 6)) return NULL; if (where == MXML_WS_BEFORE_OPEN || where == MXML_WS_BEFORE_CLOSE) return "\n"; return NULL; } /** Helper to fit with MXML's optionally-NULL char* arguments */ class OStr { string rendered{}; public: OStr() = default; // standard copy operations acceptable OStr(string str) : rendered{move(str)} { } OStr(const char* const literal) : OStr(string(literal? literal:"")) { } template OStr(X x) : rendered{func::asString(x)} { } operator bool() const { return rendered.size(); } operator const char*() const { return rendered.size()? rendered.c_str() : nullptr; } }; /** Configuration how to adapt and use the MXML API */ struct Policy { mxml_node_t* mxmlElm() { return reinterpret_cast(this); } mxml_node_t* searchChild(OStr elmName =OStr() ,OStr attribName =OStr() ,OStr attribVal =OStr()) { return mxmlFindElement(mxmlElm(), mxmlElm(), elmName, attribName, attribVal, MXML_DESCEND_FIRST); } static mxml_node_t* parse(const char* xml) { return mxmlLoadString(NULL, xml, MXML_OPAQUE_CALLBACK); // treat all node content as »opaque« data, i.e. passed-through as-is } char* render() { mxmlSetWrapMargin(0); // disable automatic line wrapping and control whitespace per callback return mxmlSaveAllocString(mxmlElm(), XMLStore_whitespace_callback); } }; }//(End)internal details /* ==== Helper for metadata parsing and rendering ==== */ string renderXmlType(TOPLEVEL::XML type) { switch (type) { case TOPLEVEL::XML::Instrument: return "Instrument"; case TOPLEVEL::XML::Patch: return "Parameters"; case TOPLEVEL::XML::Scale: return "Scales"; case TOPLEVEL::XML::State: return "Session"; case TOPLEVEL::XML::Vector: return "Vector Control"; case TOPLEVEL::XML::MLearn: return "Midi Learn"; case TOPLEVEL::XML::MasterConfig: return "Config Base"; case TOPLEVEL::XML::Config: return "Config Instance"; case TOPLEVEL::XML::Presets: return "Presets"; case TOPLEVEL::XML::Bank: return "Roots and Banks"; case TOPLEVEL::XML::History: return "Recent Files"; case TOPLEVEL::XML::PresetDirs: return "Preset Directories"; default: return "Yoshimi Data"; } } TOPLEVEL::XML parseXMLtype(string const& spec) { if (spec == "Instrument") return TOPLEVEL::XML::Instrument; if (spec == "Parameters") return TOPLEVEL::XML::Patch; if (spec == "Scales") return TOPLEVEL::XML::Scale; if (spec == "Session") return TOPLEVEL::XML::State; if (spec == "Vector Control") return TOPLEVEL::XML::Vector; if (spec == "Midi Learn") return TOPLEVEL::XML::MLearn; if (spec == "Config Base") return TOPLEVEL::XML::MasterConfig; if (spec == "Config Instance") return TOPLEVEL::XML::Config; if (spec == "Presets") return TOPLEVEL::XML::Presets; if (spec == "Roots and Banks") return TOPLEVEL::XML::Bank; if (spec == "Recent Files") return TOPLEVEL::XML::History; if (spec == "Preset Directories") return TOPLEVEL::XML::PresetDirs; return TOPLEVEL::XML::Instrument; } /** * Abstracted access point to an MXML tree representation. * @remark the »downstream« code using the XML library stores Node* * to represent an abstracted element backed by XML, and can * access and manipulate its content through the Node interface. * Yet the pointer stored there at runtime actually points at * an internal struct defined by MXML. The translation between * both worlds is handled in the Policy baseclass; this allows * us to adapt to different MXML versions. */ struct XMLtree::Node : Policy { static Node* asNode(mxml_node_t* mxmlElm) { return reinterpret_cast(mxmlElm); } static Node* newTree() { return asNode(mxmlNewElement(MXML_NO_PARENT, XML_HEADER)); } static Node* parse(const char* xml) { assert (xml); return asNode(Policy::parse(xml)); } void addRef() { uint refCnt = mxmlRetain(mxmlElm()); assert(refCnt > 1); (void)refCnt; } void unref() { // decrement refcount -- possibly delete mxmlRelease(mxmlElm()); } Node* addChild(OStr elmName) { return asNode(mxmlNewElement(mxmlElm(), elmName)); } Node* findChild(OStr elmName, OStr id =OStr()) { OStr optIDAttrib{id? "id":nullptr}; return findChild(elmName, optIDAttrib, id); } Node* findChild(OStr elmName, OStr attribName, OStr attribVal) { return asNode(searchChild(elmName, attribName, attribVal)); } Node& setAttrib(OStr attribName, OStr val) { mxmlElementSetAttr(mxmlElm(), attribName, val); return *this; } Node& setText(OStr content) { bool leadingWhitespace{false}; mxmlNewText(mxmlElm(), leadingWhitespace, content); return *this; } const char * getAttrib(OStr attribName) { return mxmlElementGetAttr(mxmlElm(), attribName); } const char * getText() { mxml_node_t* child = mxmlGetFirstChild(mxmlElm()); if (child and MXML_OPAQUE == mxmlGetType(child)) return mxmlGetOpaque(child); else return nullptr; } }; /* ===== XMLtree implementation backend ===== */ XMLtree::~XMLtree() { if (node) node->unref(); } XMLtree::XMLtree(Node* treeLocation) : node{treeLocation} { if (node) node->addRef(); static_assert(1 == sizeof(XMLtree::Node) ,"Node acts as placeholder for a MXML datatype " "and must not define any data fields on its own." ); } XMLtree::XMLtree(XMLtree&& ref) : node{nullptr} { std::swap(node, ref.node); } /** Factory: create from XML buffer. * @remark buffer is owned by caller and will only be read * @return new XMLtree handle, which can be empty in case of parsing failure. */ XMLtree XMLtree::parse(const char* xml) { return xml? Node::parse(withoutLeadingWhitespace(xml)) : nullptr; } /** render XMLtree into new malloc() buffer * @note caller must deallocate returned buffer with `free()` */ char* XMLtree::render() { return node? node->render() : nullptr; } XMLtree XMLtree::addElm(string name) { if (!node) node = Node::newTree(); return node->addChild(name); } XMLtree XMLtree::addElm(string name, uint id) { XMLtree child = addElm(name); child.addAttrib("id", asString(id)); return child; } XMLtree XMLtree::getElm(string name) { return XMLtree{node? node->findChild(name) : nullptr}; } XMLtree XMLtree::getElm(string name, uint id) { return XMLtree{node? node->findChild(name, id) : nullptr}; } string XMLtree::getAttrib(string name) { const char* valStr = node? node->getAttrib(name) : nullptr; return valStr? string{valStr} : string{}; } uint XMLtree::getAttrib_uint(string name) { const char* valStr = node? node->getAttrib(name) : nullptr; return valStr? string2uint(valStr) : 0; } XMLtree& XMLtree::addAttrib(string name, string val) { assert(node); node->setAttrib(name,val); return *this; } /** add simple parameter element: with attribute name, value */ void XMLtree::addPar_int(string const& name, int val) { assert(node); node->addChild("par") ->setAttrib("name",name) .setAttrib("value",val); } void XMLtree::addPar_uint(string const& name, uint val) { assert(node); node->addChild("parU") ->setAttrib("name",name) .setAttrib("value",val); } /** add value both as integral number and as float persisted as exact bitstring */ void XMLtree::addPar_frac(string const& name, float val) { assert(node); node->addChild("par") ->setAttrib("name", name) .setAttrib("value", lrint(val)) // NOTE: rounded to integer .setAttrib("exact_value", func::asExactBitstring(val)); } /** add floating-point both textually in decimal-format and as exact bitstring */ void XMLtree::addPar_real(string const& name, float val) { assert(node); node->addChild("par_real") ->setAttrib("name", name) .setAttrib("value", asLongString(val)) // decimal floating-point form .setAttrib("exact_value", func::asExactBitstring(val)); } void XMLtree::addPar_bool(string const& name, bool yes) { assert(node); node->addChild("par_bool") ->setAttrib("name",name) .setAttrib("value",yes? "yes":"no"); } /** add string parameter: the name as attribute and the text as content */ void XMLtree::addPar_str(string const& name, string const& text) { assert(node); node->addChild("string") ->setAttrib("name",name) .setText(text); } /** * Retrieve numeric value from a nested parameter element. * - if present, the stored representation will be converted to an int ∈[min ... max] * - otherwise, defaultVal is returned */ int XMLtree::getPar_int(string const& name, int defaultVal, int min, int max) { if (node) { if (Node* paramElm = node->findChild("par","name",name)) { const char* valStr = paramElm->getAttrib("value"); if (valStr) return std::clamp(string2int(valStr), min, max); } } // parameter entry not retrieved return defaultVal; } /** @note performs transparent migration of values formerly stored as int `"value"` */ uint XMLtree::getPar_uint(string const& name, uint defaultVal, uint min, uint max) { if (node) { if (Node* paramElm = node->findChild("parU","name",name)) { // ^^^^ const char* valStr = paramElm->getAttrib("value"); if (valStr) return std::clamp(string2uint(valStr), min, max); } // ^^^^ else if (Node* paramElm = node->findChild("par","name",name)) { const char* valStr = paramElm->getAttrib("value"); if (valStr) return std::clamp(uint(string2int(valStr)), min, max); } // ^^^^ ^^^ } // parameter entry not retrieved return defaultVal; } /** @internal attempt to retrieve a float value, * preferably using the exact IEEE 754 bitstring stored in an attribute "exact_value"; * For legacy format, fall back to the "value" attribute, which can either be a decimal * floating-point (for ` XMLtree::readParCombi(string const& elmID, string const& name) { if (node) { Node* paramElm = node->findChild(elmID,"name",name); if (paramElm) { const char* valStr = paramElm->getAttrib("exact_value"); if (valStr) return func::bitstring2float(valStr); // fall-back to legacy format valStr = paramElm->getAttrib("value"); if (valStr) return string2float(valStr); } } // parameter entry not retrieved return std::nullopt; } /** a (former) int parameter that has been refined to allow for fractional values, * falling back to integral values when loading legacy instruments. */ float XMLtree::getPar_frac(string const& name, float defaultVal, float min, float max) { auto val = readParCombi("par",name); return std::clamp(val? *val:defaultVal, min, max); } float XMLtree::getPar_real(string const& name, float defaultVal) { auto val = readParCombi("par_real",name); return val? *val:defaultVal; } float XMLtree::getPar_real(string const& name, float defaultVal, float min, float max) { return std::clamp(getPar_real(name,defaultVal), min, max); } /** value limited to [0 ... 127] */ int XMLtree::getPar_127(string const& name, int defaultVal) { return getPar_int(name, defaultVal, 0, 127); } /** value limited to [0 ... 255] */ int XMLtree::getPar_255(string const& name, int defaultVal) { return getPar_int(name, defaultVal, 0, 255); } /** @note performs transparent migration of settings formerly stored as int `"value"` */ bool XMLtree::getPar_bool(string const& name, bool defaultVal) { if (node) { if (Node* paramElm = node->findChild("par_bool","name",name)) { const char* valStr = paramElm->getAttrib("value"); if (valStr) return func::string2bool(valStr); } else if (Node* paramElm = node->findChild("par","name",name)) { const char* valStr = paramElm->getAttrib("value"); if (valStr) return bool(string2int(valStr)); } } // parameter entry not retrieved return defaultVal; } string XMLtree::getPar_str(string const& name) { if (node) { Node* paramElm = node->findChild("string","name",name); if (paramElm) { const char* text = paramElm->getText(); if (text) return string{text}; } } // parameter entry not retrieved return string{}; } /* ===== XMLStore implementation ===== */ XMLStore::XMLStore(TOPLEVEL::XML type, bool zynCompat) : meta{type ,Config::VER_YOSHI_CURR ,zynCompat? Config::VER_ZYN_COMPAT : VerInfo() } { } XMLStore::XMLStore(string filename, Logger const& log) : root{loadFile(filename,log)} , meta{extractMetadata()} { } XMLStore::XMLStore(const char* xml) : root{XMLtree::parse(xml)} , meta{extractMetadata()} { } void XMLStore::buildXMLRoot() { if (root) return; assert (meta.isValid()); if (meta.isZynCompat()) { root.addElm("!DOCTYPE").addAttrib(topElmName(meta)); root.addElm(topElmName(meta)) .addAttrib("version-major", asString(meta.zynVer.maj)) .addAttrib("version-minor", asString(meta.zynVer.min)) .addAttrib("version-revision", asString(meta.zynVer.rev)) .addAttrib("Yoshimi-major", asString(meta.yoshimiVer.maj)) .addAttrib("Yoshimi-minor", asString(meta.yoshimiVer.min)) .addAttrib("Yoshimi-revision", asString(meta.yoshimiVer.rev)) .addAttrib("ZynAddSubFX-author","Nasca Octavian Paul") .addAttrib("Yoshimi-author", "Alan Ernest Calvert") .addElm("INFORMATION") .addPar_str("XMLtype", renderXmlType(meta.type)); ; } else {// Yoshimi native format root.addElm("!DOCTYPE").addAttrib(topElmName(meta)); root.addElm(topElmName(meta)) .addAttrib("Yoshimi-major", asString(meta.yoshimiVer.maj)) .addAttrib("Yoshimi-minor", asString(meta.yoshimiVer.min)) .addAttrib("Yoshimi-revision",asString(meta.yoshimiVer.rev)) .addAttrib("Yoshimi-author", "Alan Ernest Calvert") .addElm("INFORMATION") .addPar_str("XMLtype", renderXmlType(meta.type)); ; } assert(root); } XMLStore::Metadata XMLStore::extractMetadata() { if (XMLtree top = root.getElm(ROOT_YOSHI)) return Metadata{parseXMLtype(top.getElm("INFORMATION").getPar_str("XMLtype")) ,VerInfo{top.getAttrib_uint("Yoshimi-major") ,top.getAttrib_uint("Yoshimi-minor") ,top.getAttrib_uint("Yoshimi-revision") } ,VerInfo{} }; else if (XMLtree top = root.getElm(ROOT_ZYN)) return Metadata{parseXMLtype(top.getElm("INFORMATION").getPar_str("XMLtype")) ,VerInfo{top.getAttrib_uint("Yoshimi-major") ,top.getAttrib_uint("Yoshimi-minor") ,top.getAttrib_uint("Yoshimi-revision") } ,VerInfo{top.getAttrib_uint("version-major") ,top.getAttrib_uint("version-minor") ,top.getAttrib_uint("version-revision") } }; else return Metadata{}; // marked as invalid } XMLtree XMLStore::accessTop() { buildXMLRoot(); assert (root); return root.getElm(topElmName(meta)); } namespace{ void slowinfosearch(char* idx, XMLStore::Features&); } XMLStore::Features XMLStore::checkfileinformation(string const& filename, Logger const& log) { Features features; string report; string xml = loadGzipped(filename, report); if (not report.empty()) log(report, _SYS_::LogNotSerious); if (not xml.empty()) { char* xmldata = & xml[0]; char* first = strstr(xmldata, ""); features.yoshiFormat = bool(first); char* start = strstr(xmldata, ""); char* end = strstr(xmldata, ""); char* idx = start; uint seen = 0; if (start && end && start < end) { // Andrew: just make it simple // Will: but not too simple :) /* * the following could be in any order. We are checking for * the actual existence of the fields as well as their value. */ idx = strstr(start, "name=\"ADDsynth_used\""); if (idx != NULL) { seen |= 2; if (strstr(idx, "name=\"ADDsynth_used\" value=\"yes\"")) features.ADDsynth_used = 1; } idx = strstr(start, "name=\"SUBsynth_used\""); if (idx != NULL) { seen |= 4; if (strstr(idx, "name=\"SUBsynth_used\" value=\"yes\"")) features.SUBsynth_used = 1; } idx = strstr(start, "name=\"PADsynth_used\""); if (idx != NULL) { seen |= 1; if (strstr(idx, "name=\"PADsynth_used\" value=\"yes\"")) features.PADsynth_used = 1; } } idx = strstr(xmldata, ""); if (idx) {// search for the classification type of the instrument idx = strstr(idx, "par name=\"type\" value=\""); if (idx != NULL) features.instType = string2int(idx + 23); if (seen != 7) // at least one was missing slowinfosearch(xmldata, features); } } return features; } namespace {// local helper void slowinfosearch(char* idx, XMLStore::Features& features) { idx = strstr(idx, ""); if (idx == NULL) return; string mark; int max = NUM_KIT_ITEMS; /* * The following *must* exist, otherwise the file is corrupted. * They will always be in this order, which means we only need * to scan once through the file. * We can stop if we get to a point where ADD, SUB and PAD * have all been enabled. */ idx = strstr(idx, "name=\"kit_mode\""); if (idx == NULL) return; if (strncmp(idx + 16 , "value=\"0\"", 9) == 0) max = 1; for (int kitnum = 0; kitnum < max; ++kitnum) { mark = ""; idx = strstr(idx, mark.c_str()); if (idx == NULL) return; idx = strstr(idx, "name=\"enabled\""); if (idx == NULL) return; if (!strstr(idx, "name=\"enabled\" value=\"yes\"")) continue; if (!features.ADDsynth_used) { idx = strstr(idx, "name=\"add_enabled\""); if (idx == NULL) return; if (strncmp(idx + 26 , "yes", 3) == 0) features.ADDsynth_used = 1; } if (!features.SUBsynth_used) { idx = strstr(idx, "name=\"sub_enabled\""); if (idx == NULL) return; if (strncmp(idx + 26 , "yes", 3) == 0) features.SUBsynth_used = 1; } if (!features.PADsynth_used) { idx = strstr(idx, "name=\"pad_enabled\""); if (idx == NULL) return; if (strncmp(idx + 26 , "yes", 3) == 0) features.PADsynth_used = 1; } if (features.ADDsynth_used & features.SUBsynth_used & features.PADsynth_used) { return; } } return; } }//(End)local helper /** * Render tree contents into XML format. * @return NULL if empty, otherwise pointer to a char buffer, allocated with malloc() * @warning user must free the returned buffer */ char* XMLStore::render() { return root.render(); } /** * Render tree contents into XML format and write it into a file, * possibly gzip compressed (0 means no compression) * @return true on success */ bool XMLStore::saveXMLfile(string filename, Logger const& log, uint gzipCompressionLevel) { bool success{false}; if (not root) log("XML: empty tree -- nothing to save", _SYS_::LogNotSerious); else { char* xmldata = render(); if (not xmldata) log("XML: Failed to allocate storage for rendered XML"); else { gzipCompressionLevel = std::clamp(gzipCompressionLevel, 0u, 9u); if (gzipCompressionLevel == 0) { if (not saveText(xmldata, filename)) log("XML: Failed to save xml file \""+filename+"\"(uncompressed)", _SYS_::LogNotSerious); else success = true; } else { string result = saveGzipped(xmldata, filename, gzipCompressionLevel); if (not result.empty()) log(result, _SYS_::LogNotSerious); else success = true; } free(xmldata); } } return success; } XMLtree XMLStore::loadFile(string filename, Logger const& log) { string report{}; string xmldata = loadGzipped(filename, report); if (not report.empty()) log(report, _SYS_::LogNotSerious); XMLtree content{XMLtree::parse(xmldata.c_str())}; if (not content) log("XML: File \""+filename+"\" can not be parsed as XML", _SYS_::LogNotSerious); if (xmldata.empty()) log("XML: Could not load xml file: " + filename, _SYS_::LogNotSerious); return content; } yoshimi-2.3.5.1/src/Misc/XMLStore.h000066400000000000000000000150111506652756400166670ustar00rootroot00000000000000/* XMLStore.h - Store structured data in XML Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2025, Will Godfrey Copyright 2025, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef XML_STORE_H #define XML_STORE_H #include "globals.h" #include "VerInfo.h" #include "Log.h" #include #include #include using std::string; using std::optional; class SynthEngine; /** * Structured data subtree, * which can be loaded and stored as XML. * @note this is a smart-pointer, delegating to * MXML ref-count based memory management. */ class XMLtree { struct Node; Node* node{nullptr}; XMLtree(Node*); public: ~XMLtree(); XMLtree() = default; // shall only be moved XMLtree(XMLtree&&); XMLtree(XMLtree const&) = delete; XMLtree& operator=(XMLtree&&) = delete; XMLtree& operator=(XMLtree const&) = delete; explicit operator bool() const { return bool(node); } bool empty() const { return not bool(node); } static XMLtree parse(const char*); // Factory: create from XML buffer char* render(); // render XMLtree into new malloc() buffer XMLtree addElm(string name); XMLtree addElm(string name, uint id); XMLtree getElm(string name); XMLtree getElm(string name, uint id); XMLtree& addAttrib(string name, string val =""); string getAttrib(string name); uint getAttrib_uint(string name); void addPar_int (string const& name, int val); // add simple parameter element: with attribute name, value void addPar_uint(string const& name, uint val); // add unsigned integer parameter: name, value void addPar_frac(string const& name, float val); // add value both as integral and as float persisted as exact bitstring void addPar_real(string const& name, float val); // add floating-point both textually and as exact bitstring void addPar_bool(string const& name, bool val); void addPar_str (string const& name, string const&); // add string parameter (name and string) int getPar_int (string const& name, int defaultVal, int min, int max); int getPar_127 (string const& name, int defaultVal); // value limited to [0 ... 127] int getPar_255 (string const& name, int defaultVal); // value limited to [0 ... 255] uint getPar_uint(string const& name, uint defaultVal, uint min = 0, uint max = std::numeric_limits::max()); float getPar_frac(string const& name, float defaultVal, float min, float max); // restore exact fractional value, fall-back to integral(legacy) float getPar_real(string const& name, float defaultVal, float min, float max); float getPar_real(string const& name, float defaultVal); bool getPar_bool(string const& name, bool defaultVal); string getPar_str(string const& name); private: optional readParCombi(string const&, string const& name); }; /** * Maintain tree-structured data, * which can be stored and retrieved from XML * @remark this is a lightweight value object, * can be moved and stored in local vars. */ class XMLStore { XMLtree root; public: XMLStore(TOPLEVEL::XML type, bool zynCompat =false); // can be created empty XMLStore(string filename, Logger const& log); // can be created by loading XML XMLStore(const char* xml); // can be created from buffer with XML data // can be moved XMLStore(XMLStore&&) = default; // shall not be copied or assigned XMLStore(XMLStore const&) = delete; XMLStore& operator=(XMLStore&&) = delete; XMLStore& operator=(XMLStore const&) = delete; explicit operator bool() const { return bool(root); } bool empty() const { return not bool(root); } char* render(); // rendered XML into malloc() char buffer (NULL terminated) bool saveXMLfile(string filename, Logger const& log // render XML and store to file, possibly compressed, return true on success ,uint gzipCompressionLevel =0); XMLtree accessTop(); XMLtree addElm(string name){ return accessTop().addElm(name); } XMLtree getElm(string name){ return root? accessTop().getElm(name) : XMLtree{}; } struct Metadata { TOPLEVEL::XML type{TOPLEVEL::XML::Instrument}; VerInfo yoshimiVer{}; VerInfo zynVer{}; bool isZynCompat() const { return bool(zynVer); } bool isValid() const { return bool(zynVer) or bool(yoshimiVer); } }; Metadata meta; struct Features; // opens a file without parsing the XML; just grep some meta information static Features checkfileinformation(std::string const& filename, Logger const& log); private: void buildXMLRoot(); Metadata extractMetadata(); static XMLtree loadFile(string filename, Logger const& log); }; /** used to classify instruments * @see XMLStore::checkfileinformation() */ struct XMLStore::Features { int instType{0}; bool yoshiFormat{false}; uchar ADDsynth_used{false}; uchar SUBsynth_used{false}; uchar PADsynth_used{false}; }; /** Helper for diagnostics */ TOPLEVEL::XML parseXMLtype(string const&); string renderXmlType(TOPLEVEL::XML); #endif /*XML_STORE_H*/ yoshimi-2.3.5.1/src/MusicIO/000077500000000000000000000000001506652756400154605ustar00rootroot00000000000000yoshimi-2.3.5.1/src/MusicIO/AlsaEngine.cpp000066400000000000000000000746531506652756400202110ustar00rootroot00000000000000/* AlsaEngine.cpp Copyright 2009-2011, Alan Calvert Copyright 2014-2025, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #if defined(HAVE_ALSA) #include "Misc/Util.h" #include "Misc/Config.h" #include "Misc/SynthEngine.h" #include "Misc/FormatFuncs.h" #include "MusicIO/AlsaEngine.h" #include #include #include using Mircos = std::chrono::duration; using std::chrono::steady_clock; using std::chrono::floor; using std::string; using std::move; using func::asString; using util::unConst; // The number of nanoseconds before the MIDI clock is assumed missing. #define MIDI_CLOCK_TIMEOUT_US 1000000 AlsaEngine::AlsaEngine(SynthEngine& _synth, shared_ptr beat) : MusicIO{_synth, move(beat)} , little_endian{runtime().isLittleEndian} , card_endian{false} , card_signed{true} , card_chans{2} // got to start somewhere} , card_bits{0} , pcmWrite{nullptr} , interleaved{} , audio{} , midi{} { for (int i = 0; i < ALSA_MIDI_BPM_MEDIAN_WINDOW; i++) midi.prevBpms[i] = 120; // monotonic time scale in microseconds as signed 64bit auto now = steady_clock::now(); midi.prevClockUs = floor(now.time_since_epoch()) .count(); } bool AlsaEngine::openAudio() { audio.device = runtime().audioDevice; audio.samplerate = runtime().samplerate; audio.period_size = runtime().buffersize; audio.period_count = 2; audio.buffer_size = audio.period_size * audio.period_count; if (not alsaBad(snd_pcm_open(&audio.handle, audio.device.c_str(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NO_AUTO_CHANNELS), "failed to open alsa audio device:" + audio.device)) if (not alsaBad(snd_pcm_nonblock(audio.handle, 0), "set blocking failed")) if (prepHwparams()) if (prepSwparams()) { prepBuffers(); // Buffers for interleaved audio only used by AlsaEngine interleaved.reset(new int[getBuffersize() * card_chans]{0}); return true; } // if anything did not go well... Close(); return false; } string AlsaEngine::findMidiClients(snd_seq_t* seq) { string result; snd_seq_client_info_t* cinfo; snd_seq_port_info_t* pinfo; snd_seq_client_info_alloca(&cinfo); snd_seq_port_info_alloca(&pinfo); snd_seq_client_info_set_client(cinfo, -1); while (snd_seq_query_next_client(seq, cinfo) >= 0) { int client = snd_seq_client_info_get_client(cinfo); if (client == SND_SEQ_CLIENT_SYSTEM) continue; // don't show system timer and announce ports snd_seq_port_info_set_client(pinfo, client); snd_seq_port_info_set_port(pinfo, -1); while (snd_seq_query_next_port(seq, pinfo) >= 0) { // port must understand MIDI messages if (!(snd_seq_port_info_get_type(pinfo) & SND_SEQ_PORT_TYPE_MIDI_GENERIC)) continue; // we need both READ and SUBS_READ if ((snd_seq_port_info_get_capability(pinfo) & (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ)) != (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ)) continue; if (string{snd_seq_client_info_get_name(cinfo)} == "Midi Through") continue; // don't want midi through result = result + snd_seq_client_info_get_name(cinfo) + ":" + std::to_string(snd_seq_port_info_get_port(pinfo)) + ", "; } } return result; } bool AlsaEngine::openMidi() { synth.setBPMAccurate(false); const char* port_name = "input"; int port_num; if (snd_seq_open(&midi.handle, "default", SND_SEQ_OPEN_INPUT, SND_SEQ_NONBLOCK) != 0) { runtime().Log("Failed to open alsa midi"); Close(); return false; } snd_seq_client_info_t *seq_info; snd_seq_client_info_alloca(&seq_info); snd_seq_get_client_info(midi.handle, seq_info); midi.alsaId = snd_seq_client_info_get_client(seq_info); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_NOTEON); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_NOTEOFF); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_KEYPRESS); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_CHANPRESS); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_CONTROLLER); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_PGMCHANGE); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_PITCHBEND); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_CONTROL14); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_NONREGPARAM); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_REGPARAM); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_RESET); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_SONGPOS); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_CLOCK); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_PORT_SUBSCRIBED); snd_seq_client_info_event_filter_add(seq_info, SND_SEQ_EVENT_PORT_UNSUBSCRIBED); if (0 > snd_seq_set_client_info(midi.handle, seq_info)) runtime().Log("Failed to set midi event filtering"); snd_seq_set_client_name(midi.handle, midiClientName().c_str()); port_num = snd_seq_create_simple_port(midi.handle, port_name, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_SYNTH); if (port_num < 0) { runtime().Log("Failed to acquire alsa midi port"); Close(); return false; } string midilist; switch(runtime().alsaMidiType) { case 0: midilist = runtime().midiDevice; break; case 1: midilist = findMidiClients(midi.handle); break; default: runtime().midiDevice = ""; return true; } string found; if (midilist != "default") { while (!midilist.empty()) { string tmp; while (midilist.find(' ') == 0 || midilist.find(',') == 0) midilist.erase(0,1); // make entry clean if (midilist.empty()) break; size_t pos = midilist.find(','); if (pos == string::npos) { tmp = midilist; midilist = ""; } else { tmp = midilist.substr(0, pos); midilist = midilist.substr(pos + 1); } pos = tmp.find_last_not_of(' '); tmp = tmp.substr(0, pos + 1); midi.device = tmp; bool midiSource = false; if (snd_seq_parse_address(midi.handle,&midi.addr,midi.device.c_str()) == 0) { midiSource = (snd_seq_connect_from(midi.handle, port_num, midi.addr.client, midi.addr.port) == 0); } if (midiSource) found += (", " + tmp); } } if (found.substr(0, 2) == ", ") runtime().midiDevice = found.substr(2); else runtime().midiDevice = "No MIDI sources seen"; return true; } void AlsaEngine::Close() { if (runtime().runSynth) { runtime().runSynth = false; } if (midi.pThread != 0) //wait for midi thread to finish { void *ret = NULL; pthread_join(midi.pThread, &ret); midi.pThread = 0; } if (audio.pThread != 0) //wait for audio thread to finish { void *ret = NULL; pthread_join(audio.pThread, &ret); audio.pThread = 0; } if (audio.handle != NULL) alsaBad(snd_pcm_close(audio.handle), "close pcm failed"); audio.handle = NULL; if (NULL != midi.handle) if (snd_seq_close(midi.handle) < 0) runtime().Log("Error closing Alsa midi connection"); midi.handle = NULL; } string AlsaEngine::audioClientName() const { string name{"yoshimi"}; auto& rt = unConst(this)->runtime(); if (!rt.nameTag.empty()) name += ("-" + rt.nameTag); return name; } string AlsaEngine::midiClientName() const { string name{"yoshimi"}; auto& rt = unConst(this)->runtime(); if (!rt.nameTag.empty()) name += ("-" + rt.nameTag); //Andrew Deryabin: for multi-instance support add unique id to //instances other then default (0) uint synthUniqueId = synth.getUniqueId(); if (synthUniqueId > 0) { char sUniqueId [256]; memset(sUniqueId, 0, sizeof(sUniqueId)); snprintf(sUniqueId, sizeof(sUniqueId), "%d", synthUniqueId); name += ("-" + string{sUniqueId}); } return name; } bool AlsaEngine::prepHwparams() { /* * thanks to the jack project for which formats to support and * the basis of a simplified structure */ static struct { snd_pcm_format_t card_format; int card_bits; bool card_endian; bool card_signed; } card_formats[] = { {SND_PCM_FORMAT_S32_LE, 32, true, true}, {SND_PCM_FORMAT_S32_BE, 32, false, true}, {SND_PCM_FORMAT_S24_3LE, 24, true, true}, {SND_PCM_FORMAT_S24_3BE, 24, false, true}, {SND_PCM_FORMAT_S16_LE, 16, true, true}, {SND_PCM_FORMAT_S16_BE, 16, false, true}, {SND_PCM_FORMAT_UNKNOWN, 0, false, true} }; int formidx; string formattxt; unsigned int ask_samplerate = audio.samplerate; unsigned int ask_buffersize = audio.period_size; snd_pcm_access_t axs = SND_PCM_ACCESS_MMAP_INTERLEAVED; snd_pcm_hw_params_t *hwparams; snd_pcm_hw_params_alloca(&hwparams); if (alsaBad(snd_pcm_hw_params_any(audio.handle, hwparams), "alsa audio no playback configurations available")) return false; if (alsaBad(snd_pcm_hw_params_set_periods_integer(audio.handle, hwparams), "alsa audio cannot restrict period size to integral value")) return false; if (!alsaBad(snd_pcm_hw_params_set_access(audio.handle, hwparams, axs), "alsa audio mmap not possible")) pcmWrite = &snd_pcm_mmap_writei; else { axs = SND_PCM_ACCESS_RW_INTERLEAVED; if (alsaBad(snd_pcm_hw_params_set_access(audio.handle, hwparams, axs), "alsa audio failed to set access, both mmap and rw failed")) return false; pcmWrite = &snd_pcm_writei; } formidx = 0; while (snd_pcm_hw_params_set_format(audio.handle, hwparams, card_formats[formidx].card_format) < 0) { ++formidx; if (card_formats[formidx].card_bits == 0) { runtime().Log("alsa audio failed to find matching format"); return false; } } card_bits = card_formats[formidx].card_bits; card_endian = card_formats[formidx].card_endian; card_signed = card_formats[formidx].card_signed; if (little_endian) formattxt += "Little"; else formattxt += "Big"; runtime().Log("March is " + formattxt + " Endian", _SYS_::LogNotSerious); if (card_signed) formattxt = "Signed "; else formattxt = "Unsigned "; if (card_endian) formattxt += "Little"; else formattxt += "Big"; alsaBad(snd_pcm_hw_params_set_rate_resample(audio.handle, hwparams, 1), "alsa audio failed to set allow resample"); if (alsaBad(snd_pcm_hw_params_set_rate_near(audio.handle, hwparams, &audio.samplerate, NULL), "alsa audio failed to set sample rate (asked for " + asString(ask_samplerate) + ")")) return false; if (alsaBad(snd_pcm_hw_params_set_channels_near(audio.handle, hwparams, &card_chans), "alsa audio failed to set requested channels")) return false; if (alsaBad(snd_pcm_hw_params_set_period_size_near(audio.handle, hwparams, &audio.period_size, 0), "failed to set period size")) return false; if (alsaBad(snd_pcm_hw_params_set_periods_near(audio.handle, hwparams, &audio.period_count, 0), "failed to set number of periods")) return false; if (alsaBad(snd_pcm_hw_params_set_buffer_size_near(audio.handle, hwparams, &audio.buffer_size), "failed to set buffer size")) return false; if (alsaBad(snd_pcm_hw_params (audio.handle, hwparams), "alsa audio failed to set hardware parameters")) return false; if (alsaBad(snd_pcm_hw_params_get_buffer_size(hwparams, &audio.buffer_size), "alsa audio failed to get buffer size")) return false; if (alsaBad(snd_pcm_hw_params_get_period_size(hwparams, &audio.period_size, NULL), "failed to get period size")) return false; runtime().Log("Card Format is " + formattxt + " Endian " + asString(card_bits) +" Bit " + asString(card_chans) + " Channel" ,_SYS_::LogNotSerious); if (ask_buffersize != audio.period_size) { runtime().Log("Asked for buffersize " + asString(ask_buffersize, 2) + ", Alsa dictates " + asString((unsigned int)audio.period_size), _SYS_::LogNotSerious); runtime().buffersize = audio.period_size; // we shouldn't need to do this :( } return true; } bool AlsaEngine::prepSwparams() { snd_pcm_sw_params_t *swparams; snd_pcm_sw_params_alloca(&swparams); // allocated on stack and automatically freed when leaving this scope snd_pcm_uframes_t boundary; return (not alsaBad(snd_pcm_sw_params_current(audio.handle, swparams), "alsa audio failed to get swparams")) and (not alsaBad(snd_pcm_sw_params_get_boundary(swparams, &boundary), "alsa audio failed to get boundary")) and (not alsaBad(snd_pcm_sw_params_set_start_threshold(audio.handle ,swparams ,boundary + 1) ,"failed to set start threshold")) // explicit start, not auto start and (not alsaBad(snd_pcm_sw_params_set_stop_threshold(audio.handle ,swparams ,boundary) ,"alsa audio failed to set stop threshold")) and (not alsaBad(snd_pcm_sw_params(audio.handle, swparams) ,"alsa audio failed to set software parameters")) ; } void AlsaEngine::Interleave(int buffersize) { size_t idx = 0; bool byte_swap = (little_endian != card_endian); ushort tmp16a, tmp16b; size_t chans; uint tmp32a, tmp32b; uint shift = 0x78000000; if (card_bits == 24) shift = 0x780000; if (card_bits == 16) { chans = card_chans / 2; // because we're pairing them on a single integer for (int frame = 0; frame < buffersize; ++frame) { tmp16a = ushort(lrint( zynLeft[NUM_MIDI_PARTS][frame] * 0x7800)); tmp16b = ushort(lrint(zynRight[NUM_MIDI_PARTS][frame] * 0x7800)); if (byte_swap) { tmp16a = (short int) ((tmp16a >> 8) | (tmp16a << 8)); //TODO shouldn't that be a cast to unsigned short? IIRC, the assignment promotes to unsigned tmp16b = ((tmp16b >> 8) | (tmp16b << 8)); } interleaved[idx] = tmp16a | int(tmp16b << 16); idx += chans; } } else { chans = card_chans; for (int frame = 0; frame < buffersize; ++frame) { tmp32a = uint(lrint( zynLeft[NUM_MIDI_PARTS][frame] * shift)); tmp32b = uint(lrint(zynRight[NUM_MIDI_PARTS][frame] * shift)); // how should we do an endian swap for 24 bit, 3 byte? // is it really the same, just swapping the 'unused' byte? if (byte_swap) { tmp32a = (tmp32a >> 24) | ((tmp32a << 8) & 0x00FF0000) | ((tmp32a >> 8) & 0x0000FF00) | (tmp32a << 24); tmp32b = (tmp32b >> 24) | ((tmp32b << 8) & 0x00FF0000) | ((tmp32b >> 8) & 0x0000FF00) | (tmp32b << 24); } interleaved[idx] = int(tmp32a); interleaved[idx + 1] = int(tmp32b); idx += chans; } } } void* AlsaEngine::_AudioThread(void* arg) { return static_cast(arg)->AudioThread(); } void* AlsaEngine::AudioThread() { alsaBad(snd_pcm_start(audio.handle), "alsa audio pcm start failed"); while (runtime().runSynth.load(std::memory_order_relaxed)) // read the atomic flag as we happen to see it, without forcing any sync { BeatTracker::BeatValues beats(beatTracker->getBeatValues()); synth.setBeatValues(beats.songBeat, beats.monotonicBeat, beats.bpm); audio.pcm_state = snd_pcm_state(audio.handle); if (audio.pcm_state != SND_PCM_STATE_RUNNING) { switch (audio.pcm_state) { case SND_PCM_STATE_XRUN: case SND_PCM_STATE_SUSPENDED: if (!xrunRecover()) break; /* falls through */ case SND_PCM_STATE_SETUP: if (alsaBad(snd_pcm_prepare(audio.handle), "alsa audio pcm prepare failed")) break; /* falls through */ case SND_PCM_STATE_PREPARED: alsaBad(snd_pcm_start(audio.handle), "pcm start failed"); break; default: runtime().Log("Alsa AudioThread, weird SND_PCM_STATE: " + asString(audio.pcm_state)); break; } audio.pcm_state = snd_pcm_state(audio.handle); } if (audio.pcm_state == SND_PCM_STATE_RUNNING) { getAudio(); int alsa_buff = getBuffersize(); Interleave(alsa_buff); Write(alsa_buff); } else runtime().Log("Audio pcm still not running"); } return NULL; } void AlsaEngine::Write(snd_pcm_uframes_t towrite) { snd_pcm_sframes_t wrote = 0; int *data = interleaved.get(); while (towrite > 0) { wrote = pcmWrite(audio.handle, data, towrite); if (wrote >= 0) { if ((snd_pcm_uframes_t)wrote < towrite || wrote == -EAGAIN) snd_pcm_wait(audio.handle, 666); if (wrote > 0) { towrite -= wrote; data += wrote * card_chans; } } else // (wrote < 0) { switch (wrote) { case -EBADFD: alsaBad(-EBADFD, "alsa audio unfit for writing"); break; case -EPIPE: xrunRecover(); break; case -ESTRPIPE: Recover(wrote); break; default: alsaBad(wrote, "alsa audio, snd_pcm_writei ==> weird state"); break; } wrote = 0; } } } bool AlsaEngine::Recover(int err) { if (err > 0) err = -err; bool isgood = false; switch (err) { case -EINTR: isgood = true; // nuthin to see here break; case -ESTRPIPE: if (!alsaBad(snd_pcm_prepare(audio.handle), "Error, AlsaEngine failed to recover from suspend")) isgood = true; break; case -EPIPE: if (!alsaBad(snd_pcm_prepare(audio.handle), "Error, AlsaEngine failed to recover from underrun")) isgood = true; break; default: break; } return isgood; } bool AlsaEngine::xrunRecover() { bool isgood = false; if (audio.handle != NULL) { if (!alsaBad(snd_pcm_drop(audio.handle), "pcm drop failed")) if (!alsaBad(snd_pcm_prepare(audio.handle), "pcm prepare failed")) isgood = true; runtime().Log("Alsa xrun recovery " + (isgood? string{"good"} : string{"not good"})); } return isgood; } bool AlsaEngine::Start() { if (NULL != midi.handle && !runtime().startThread(&midi.pThread, _MidiThread, this, true, 1, "Alsa midi")) { runtime().Log("Failed to start Alsa midi thread"); goto bail_out; } if (NULL != audio.handle && !runtime().startThread(&audio.pThread, _AudioThread, this, true, 0, "Alsa audio")) { runtime().Log(" Failed to start Alsa audio thread"); goto bail_out; } return true; bail_out: runtime().Log("Bailing from AlsaEngine Start"); Close(); return false; } void *AlsaEngine::_MidiThread(void *arg) { return static_cast(arg)->MidiThread(); } /* * This next function needs a lot of work we shouldn't need * to decode then re-encode the data in a different form */ void* AlsaEngine::MidiThread() { unsigned int pollCount = snd_seq_poll_descriptors_count(midi.handle, POLLIN); struct pollfd pollfds[pollCount]; while (runtime().runSynth.load(std::memory_order_relaxed)) { snd_seq_poll_descriptors(midi.handle, pollfds, pollCount, POLLIN); // Poll with timeout. Should be long-ish for performance reasons, but // should be short enough to be smaller than MIDI_CLOCK_TIMEOUT_US, and // short enough to be able to quit relatively quickly. int pollResult = poll(pollfds, pollCount, 500); if (pollResult < 0) { if (errno == EINTR) continue; else { char errMsg[200]; snprintf(errMsg, sizeof(errMsg), "Unable to handle error in MIDI thread: %s. Shutting down MIDI.", strerror(errno)); runtime().Log(errMsg); break; } } auto now = steady_clock::now(); auto clock = floor(now.time_since_epoch()) .count(); if (pollResult > 0) handleMidiEvents(clock); if ((clock - midi.prevClockUs) >= MIDI_CLOCK_TIMEOUT_US) handleMidiClockSilence(clock); } return nullptr; } void AlsaEngine::handleMidiEvents(uint64_t clock) { snd_seq_event_t *event; unsigned int par; int chk; bool sendit; unsigned char par0, par1 = 0, par2 = 0; while ((chk = snd_seq_event_input(midi.handle, &event)) > 0) { if (!event) continue; sendit = true; par0 = event->data.control.channel; par = 0; switch (event->type) { case SND_SEQ_EVENT_NOTEON: par0 = event->data.note.channel; par0 |= 0x90; par1 = event->data.note.note; par2 = event->data.note.velocity; break; case SND_SEQ_EVENT_NOTEOFF: par0 = event->data.note.channel; par0 |= 0x80; par1 = event->data.note.note; break; case SND_SEQ_EVENT_KEYPRESS: par0 = event->data.note.channel; par0 |= 0xa0; par1 = event->data.note.note; par2 = event->data.note.velocity; break; case SND_SEQ_EVENT_CHANPRESS: par0 |= 0xd0; par1 = event->data.control.value; break; case SND_SEQ_EVENT_PGMCHANGE: par0 |= 0xc0; par1 = event->data.control.value; break; case SND_SEQ_EVENT_PITCHBEND: par0 |= 0xe0; par = event->data.control.value + 8192; par1 = par & 0x7f; par2 = par >> 7; break; case SND_SEQ_EVENT_CONTROLLER: par0 |= 0xb0; par1 = event->data.control.param; par2 = event->data.control.value; break; case SND_SEQ_EVENT_NONREGPARAM: par0 |= 0xb0; // splitting into separate CCs par = event->data.control.param; handleMidi(par0, 99, par >> 7); handleMidi(par0, 99, par & 0x7f); par = event->data.control.value; handleMidi(par0, 6, par >> 7); par1 = 38; par2 = par & 0x7f; // let last one through break; case SND_SEQ_EVENT_RESET: // reset to power-on state par0 = 0xff; break; case SND_SEQ_EVENT_PORT_SUBSCRIBED: // ports connected runtime().Log("Alsa midi port connected"); sendit = false; break; case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: // ports disconnected runtime().Log("Alsa midi port disconnected"); sendit = false; break; case SND_SEQ_EVENT_SONGPOS: handleSongPos((float)event->data.control.value / (float)MIDI_SONGPOS_BEAT_DIVISION); sendit = false; break; case SND_SEQ_EVENT_CLOCK: handleMidiClock(clock); sendit = false; break; default: sendit = false;// commented out some progs spam us :( /* runtime().Log("Other non-handled midi event, type: " + asString((int)event->type));*/ break; } if (sendit) handleMidi(par0, par1, par2); snd_seq_free_event(event); } } void AlsaEngine::handleMidiClockSilence(uint64_t clock) { // This is equivalent to receiving a clock beat every MIDI_CLOCK_TIMEOUT_US // nanoseconds, except we do not use it to calculate the BPM, but use the // fallback value instead. In between these fake "beats", the BeatTracker // interpolates the values for us, as it also does for normal MIDI clock // beats. This means it may take up to MIDI_CLOCK_TIMEOUT_US nanoseconds to // react to a change in the BPM fallback. BeatTracker::BeatValues beats { midi.lastDivSongBeat, midi.lastDivMonotonicBeat, synth.PbpmFallback, }; float diff = (clock - midi.prevClockUs) * beats.bpm / (60.0f * 1000000.0f); beats.songBeat += diff; beats.monotonicBeat += diff; midi.lastDivSongBeat = beats.songBeat; midi.lastDivMonotonicBeat = beats.monotonicBeat; beatTracker->setBeatValues(beats); midi.prevClockUs = clock; } bool AlsaEngine::alsaBad(int op_result, string err_msg) { bool isbad = (op_result < 0); if (isbad) runtime().Log("Error, alsa audio: " +err_msg + ": " + string{snd_strerror(op_result)}); return isbad; } void AlsaEngine::handleSongPos(float beat) { const float subDiv = 1.0f / float(MIDI_CLOCKS_PER_BEAT / MIDI_CLOCK_DIVISION); // The next MIDI clock should trigger this beat. midi.lastDivSongBeat = beat - subDiv; // Possibly adjust the monotonic beat backwards to avoid accumulating too // many beats when we adjust clockCount below. midi.lastDivMonotonicBeat -= (MIDI_CLOCK_DIVISION - midi.clockCount - 1) * subDiv; // Force next clock tick to be a clean beat, on zero. midi.clockCount = MIDI_CLOCK_DIVISION - 1; // Tempting to call this here, but it is actually the next MIDI clock which // signals the next beat. //beatTracker->setBeatValues(beats); } void AlsaEngine::handleMidiClock(uint64_t clock) { float bpm = 1000000.0f * 60.0f / float((clock - midi.prevClockUs) * MIDI_CLOCKS_PER_BEAT); if (++midi.prevBpmsPos >= ALSA_MIDI_BPM_MEDIAN_WINDOW) midi.prevBpmsPos = 0; midi.prevBpms[midi.prevBpmsPos] = bpm; float tmpBpms[ALSA_MIDI_BPM_MEDIAN_WINDOW]; memcpy(tmpBpms, midi.prevBpms+midi.prevBpmsPos, (ALSA_MIDI_BPM_MEDIAN_WINDOW - midi.prevBpmsPos) * sizeof(*midi.prevBpms)); memcpy(tmpBpms + ALSA_MIDI_BPM_MEDIAN_WINDOW - midi.prevBpmsPos, midi.prevBpms, midi.prevBpmsPos * sizeof(*midi.prevBpms)); // To avoid fluctuations in the BPM value due to clock inaccuracies, sort // all the most recent bpm values, and take the average of the middle part // (an average median). For this, we use Bubble sort, but we only need to // sort the half that we use. for (int i = 0; i < (ALSA_MIDI_BPM_MEDIAN_WINDOW+ALSA_MIDI_BPM_MEDIAN_AVERAGE_WINDOW)/2; i++) { for (int j = i+1; j < ALSA_MIDI_BPM_MEDIAN_WINDOW; j++) { if (tmpBpms[i] > tmpBpms[j]) { float tmp = tmpBpms[i]; tmpBpms[i] = tmpBpms[j]; tmpBpms[j] = tmp; } } } bpm = 0; for (int i = (ALSA_MIDI_BPM_MEDIAN_WINDOW - ALSA_MIDI_BPM_MEDIAN_AVERAGE_WINDOW) / 2; i < (ALSA_MIDI_BPM_MEDIAN_WINDOW + ALSA_MIDI_BPM_MEDIAN_AVERAGE_WINDOW) / 2; i++) bpm += tmpBpms[i]; bpm /= (float)ALSA_MIDI_BPM_MEDIAN_AVERAGE_WINDOW; midi.prevClockUs = clock; midi.clockCount++; float inc = midi.clockCount / (float)MIDI_CLOCKS_PER_BEAT; BeatTracker::BeatValues beats { midi.lastDivSongBeat + inc, midi.lastDivMonotonicBeat + inc, bpm }; beats = beatTracker->setBeatValues(beats); if (midi.clockCount >= MIDI_CLOCK_DIVISION) { // Possibly preserve wrapped around beat values, if we are on the start // of a clock division. midi.lastDivSongBeat = beats.songBeat; midi.lastDivMonotonicBeat = beats.monotonicBeat; midi.clockCount = 0; } } #endif /*defined(HAVE_ALSA)*/ yoshimi-2.3.5.1/src/MusicIO/AlsaEngine.h000066400000000000000000000120341506652756400176370ustar00rootroot00000000000000/* AlsaEngine.h Copyright 2009-2010, Alan Calvert Copyright 2014-2019, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . Modified May 2019 */ #if defined(HAVE_ALSA) #ifndef ALSA_ENGINE_H #define ALSA_ENGINE_H #include "MusicIO/MusicIO.h" #include #include #include using std::string; #define MIDI_CLOCKS_PER_BEAT 24 #define MIDI_CLOCK_DIVISION 3 #define MIDI_SONGPOS_BEAT_DIVISION 4 #define ALSA_MIDI_BPM_MEDIAN_WINDOW 48 #define ALSA_MIDI_BPM_MEDIAN_AVERAGE_WINDOW 20 class SynthEngine; class AlsaEngine : public MusicIO { public: // shall not be copied nor moved AlsaEngine(AlsaEngine&&) = delete; AlsaEngine(AlsaEngine const&) = delete; AlsaEngine& operator=(AlsaEngine&&) = delete; AlsaEngine& operator=(AlsaEngine const&) = delete; AlsaEngine(SynthEngine&, shared_ptr); ~AlsaEngine() { Close(); } /* ====== MusicIO interface ======== */ bool openAudio() override; bool openMidi() override; bool Start() override; void Close() override; void registerAudioPort(int) override { /*ignore*/ } uint getSamplerate() const override { return audio.samplerate; } int getBuffersize() const override { return audio.period_size; } string audioClientName() const override ; int audioClientId() const override { return audio.alsaId; } string midiClientName() const override ; int midiClientId() const override { return midi.alsaId; } private: bool prepHwparams(); bool prepSwparams(); void Interleave(int buffersize); void Write(snd_pcm_uframes_t towrite); bool Recover(int err); bool xrunRecover(); bool alsaBad(int op_result, string err_msg); void closeAudio(); void closeMidi(); string findMidiClients(snd_seq_t* seq); void* AudioThread(); static void* _AudioThread(void* arg); void *MidiThread(); static void* _MidiThread(void* arg); void handleMidiEvents(uint64_t clock); void handleMidiClockSilence(uint64_t clock); void handleSongPos(float beat); void handleMidiClock(uint64_t clock); bool little_endian; bool card_endian; bool card_signed; uint card_chans; int card_bits; using PcmOutput = snd_pcm_sframes_t(snd_pcm_t*, const void*, snd_pcm_uframes_t); PcmOutput* pcmWrite; unique_ptr interleaved; // output buffer for 16bit interleaved audio struct Audio { string device{}; snd_pcm_t* handle{nullptr}; uint period_count{0}; // re-used as number of periods uint samplerate{0}; snd_pcm_uframes_t period_size{0}; snd_pcm_uframes_t buffer_size{0}; int alsaId{-1}; snd_pcm_state_t pcm_state{SND_PCM_STATE_DISCONNECTED}; pthread_t pThread{0}; }; struct Midi { string device{}; snd_seq_t* handle{nullptr}; snd_seq_addr_t addr{0,0}; int alsaId{-1}; pthread_t pThread{0}; // When receiving MIDI clock messages, to avoid precision errors // (MIDI_CLOCKS_PER_BEAT (24) does not cleanly divide 1), store // every third (MIDI_CLOCK_DIVISION) beat here. This is reset only // every third clock ticks or on song repositioning. Note that the // value is not necessarily an exact multiple of // 1/MIDI_CLOCK_DIVISION, but we only ever add // (1/MIDI_CLOCK_DIVISION) beats to it. float lastDivSongBeat{0}; float lastDivMonotonicBeat{0}; // Reset to zero every MIDI_CLOCK_DIVISION. This is actually an // integer, but stored as float for calculation purposes. float clockCount{0}; float prevBpms[ALSA_MIDI_BPM_MEDIAN_WINDOW]; int prevBpmsPos{0}; int64_t prevClockUs{-1}; }; Audio audio; Midi midi; }; #endif /*ALSA_ENGINE_H*/ #endif /*defined(HAVE_ALSA)*/ yoshimi-2.3.5.1/src/MusicIO/JackEngine.cpp000066400000000000000000000471421506652756400201720ustar00rootroot00000000000000/* JackEngine.cpp Copyright 2009-2011, Alan Calvert Copyright 2014-2019, Will Godfrey & others Copyright 2025, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include "Misc/Config.h" #include "Misc/FormatFuncs.h" #include "MusicIO/JackEngine.h" #include #include #include #include #include #include using std::move; using std::string; using func::asString; using func::asHexString; using std::this_thread::sleep_for; using std::chrono_literals::operator ""us; JackEngine::JackEngine(SynthEngine& _synth, shared_ptr beat) : MusicIO{_synth, move(beat)} , jackClient{nullptr} , audio{} , midiPort{nullptr} , internalbuff{0} { runtime().isMultiFeed = true; audio.jackSamplerate = 0; audio.jackNframes = 0; for (int i = 0; i < (2 * NUM_MIDI_PARTS + 2); ++i) { audio.ports[i] = nullptr; audio.portBuffs[i] = nullptr; } } bool JackEngine::connectServer(string server) { for (int tries = 0; tries < 3 && !jackClient; ++tries) { if (!openJackClient(server) && tries < 2) { runtime().Log("Failed to open jack client, trying again", _SYS_::LogError); sleep_for(3333us); } } if (jackClient) { runtime().setRtprio(jack_client_max_real_time_priority(jackClient)); audio.jackSamplerate = jack_get_sample_rate(jackClient); audio.jackNframes = jack_get_buffer_size(jackClient); return true; } else { runtime().Log("Failed to open jack client on server " + server); } return false; } bool JackEngine::openJackClient(string server) { int jopts = JackNullOption; jack_status_t jstatus; string clientname{"yoshimi"}; if (not runtime().nameTag.empty()) clientname += ("-" + runtime().nameTag); //Andrew Deryabin: for multi-instance support add unique id to //instances other then default (0) unsigned int synthUniqueId = synth.getUniqueId(); if (synthUniqueId > 0) { char sUniqueId [256]; memset(sUniqueId, 0, sizeof(sUniqueId)); snprintf(sUniqueId, sizeof(sUniqueId), "%d", synthUniqueId); clientname += ("-" + string{sUniqueId}); } bool named_server = server.size() > 0 && server.compare("default") != 0; if (named_server) jopts |= JackServerName; if (!runtime().startJack) jopts |= JackNoStartServer; #if defined(JACK_SESSION) if (runtime().restoreJackSession && runtime().jackSessionUuid.size()) { jopts |= JackSessionID; if (named_server) jackClient = jack_client_open(clientname.c_str(), (jack_options_t)jopts, &jstatus, runtime().jackServer.c_str(), runtime().jackSessionUuid.c_str()); else jackClient = jack_client_open(clientname.c_str(), (jack_options_t)jopts, &jstatus, runtime().jackSessionUuid.c_str()); } else { if (named_server) jackClient = jack_client_open(clientname.c_str(), (jack_options_t)jopts, &jstatus, runtime().jackServer.c_str()); else jackClient = jack_client_open(clientname.c_str(), (jack_options_t)jopts, &jstatus); } #else if (named_server) jackClient = jack_client_open(clientname.c_str(), (jack_options_t)jopts, &jstatus, runtime().jackServer.c_str()); else jackClient = jack_client_open(clientname.c_str(), (jack_options_t)jopts, &jstatus); #endif if (jackClient) return true; else runtime().Log("Failed jack_client_open(), status: " + asHexString((int)jstatus), _SYS_::LogError); return false; } bool JackEngine::Start() { bool jackPortsRegistered = true; internalbuff = runtime().buffersize; jack_set_xrun_callback(jackClient, _xrunCallback, this); #if defined(JACK_SESSION) //if (jack_set_session_callback && if(jack_set_session_callback(jackClient, _jsessionCallback, this)) runtime().Log("Set jack session callback failed"); #endif if (jack_set_process_callback(jackClient, _processCallback, this)) { runtime().Log("JackEngine failed to set process callback"); goto bail_out; } if (!latencyPrep()) { runtime().Log("Jack latency prep failed "); goto bail_out; } if (!jack_activate(jackClient) && jackPortsRegistered) { if (!runtime().restoreJackSession && runtime().connectJackaudio && !connectJackPorts()) { runtime().Log("Failed to connect jack audio ports"); goto bail_out; } } else { runtime().Log("Failed to activate jack client"); goto bail_out; } /* * TODO fix this - now moved to where it should be. * Shows identical results but doesn't connect. * Original 1.4.1 version also fails - it used to work. */ /* pre V 1.3.0 was this: if (Runtime.midiEngine == jack_midi and jack_connect(jackClient,Runtime.midiDevice.c_str(),jack_port_name(midi.port))) Runtime.Log("Didn't find jack MIDI source '" + Runtime.midiDevice + "'"); */ // style-wise I think the next bit is the wrong place /*if (runtime().midiEngine == jack_midi && !runtime().midiDevice.empty() && runtime().midiDevice != "default") { if (jack_connect(jackClient, runtime().midiDevice.c_str(), jack_port_name(midiPort))) { runtime().Log("Didn't find jack MIDI source '" + runtime().midiDevice + "'", _SYS_::LogError); runtime().midiDevice = ""; } }*/ return true; bail_out: Close(); return false; } void JackEngine::Close() { if (runtime().runSynth) { runtime().runSynth = false; } if (nullptr != jackClient) { int chk; for (int chan = 0; chan < (2*NUM_MIDI_PARTS+2); ++chan) { if (nullptr != audio.ports[chan]) jack_port_unregister(jackClient, audio.ports[chan]); audio.ports[chan] = nullptr; } if (nullptr != midiPort) { if ((chk = jack_port_unregister(jackClient, midiPort))) runtime().Log("Failed to close jack client, status: " + asString(chk)); midiPort = nullptr; } chk = jack_deactivate(jackClient); if (chk) runtime().Log("Failed to close jack client, status: " + asString(chk)); jackClient = nullptr; } } void JackEngine::registerAudioPort(int partnum) { int portnum = partnum * 2; if (partnum >=0 && partnum < NUM_MIDI_PARTS) { if (audio.ports [portnum] != NULL) { runtime().Log("Jack port " + asString(partnum) + " already registered!", _SYS_::LogNotSerious); return; } /* This has a hack to stop all enabled parts from resistering * individual ports (at startup) if part is not configured for * direct O/P. */ string portName; if (synth.part [partnum] && synth.partonoffRead(partnum) && (synth.part [partnum]->Paudiodest > 1)) { portName = "track_" + asString(partnum + 1) + "_l"; audio.ports[portnum] = jack_port_register(jackClient, portName.c_str(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); portName = "track_" + asString(partnum + 1) + "_r"; audio.ports[portnum + 1] = jack_port_register(jackClient, portName.c_str(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); if (audio.ports [portnum]) { runtime().Log("Registered jack port " + asString(partnum + 1)); } else { runtime().Log("Error registering jack port " + asString(partnum + 1)); } } } } bool JackEngine::openAudio() { if (jackClient == 0) { if (!connectServer(runtime().audioDevice)) { return false; } } // Register mixed outputs audio.ports[2 * NUM_MIDI_PARTS] = jack_port_register(jackClient, "left", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); audio.ports[2 * NUM_MIDI_PARTS + 1] = jack_port_register(jackClient, "right", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); bool jackPortsRegistered = true; if (!audio.ports[2 * NUM_MIDI_PARTS] || !audio.ports[2 * NUM_MIDI_PARTS + 1]) jackPortsRegistered = false; if (jackPortsRegistered) return prepBuffers() && latencyPrep(); else runtime().Log("Failed to register jack audio ports"); Close(); return false; } bool JackEngine::openMidi() { synth.setBPMAccurate(true); if (jackClient == 0) { if (!connectServer(runtime().midiDevice)) { return false; } } const char *port_name = "midi in"; midiPort = jack_port_register(jackClient, port_name, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0); if (!midiPort) { runtime().Log("Failed to register jack midi port"); Close(); return false; } std::cout << "client " << jackClient<< " device " << runtime().midiDevice << " port " << jack_port_name(midiPort) << std::endl; if (jack_connect(jackClient, runtime().midiDevice.c_str(), jack_port_name(midiPort))) { runtime().Log("Didn't find jack MIDI source '" + runtime().midiDevice + "'"); //runtime().midiDevice = ""; } return true; } bool JackEngine::connectJackPorts() { const char** playback_ports = jack_get_ports(jackClient, NULL, NULL, JackPortIsPhysical|JackPortIsInput); if (!playback_ports) { runtime().Log("No physical jack playback ports found."); return false; } int ret; for (int port = 0; port < 2 && (NULL != audio.ports[port + NUM_MIDI_PARTS*2]); ++port) { const char *port_name = jack_port_name(audio.ports[port + NUM_MIDI_PARTS * 2]); if ((ret = jack_connect(jackClient, port_name, playback_ports[port]))) { if (ret == EEXIST) { runtime().Log(string{port_name} + " is already connected to jack port " + string{playback_ports[port]} + ", status " + asString(ret)); } else { runtime().Log("Cannot connect " + string{port_name} + " to jack port " + string{playback_ports[port]} + ", status " + asString(ret)); return false; } } } return true; } int JackEngine::clientId() { if (jackClient) return long(jack_client_thread_id(jackClient)); else return -1; } string JackEngine::clientName() { if (jackClient) return string{jack_get_client_name(jackClient)}; else runtime().Log("clientName() with null jackClient"); return string{"Oh, yoshimi :-("}; } int JackEngine::_processCallback(jack_nframes_t nframes, void* arg) { return static_cast(arg)->processCallback(nframes); } int JackEngine::processCallback(jack_nframes_t nframes) { bool okaudio = true; bool okmidi = true; if (midiPort) { // input exists, using jack midi handleBeatValues(nframes); okmidi = processMidi(nframes); } if (audio.ports[NUM_MIDI_PARTS * 2] && audio.ports[NUM_MIDI_PARTS * 2 + 1]) // (at least) main outputs exist, using jack audio okaudio = processAudio(nframes); return (okaudio && okmidi) ? 0 : -1; } bool JackEngine::processAudio(jack_nframes_t nframes) { // Part buffers for (int port = 0; port < 2 * NUM_MIDI_PARTS; ++port) { if (audio.ports [port]) { audio.portBuffs[port] = (float*)jack_port_get_buffer(audio.ports[port], nframes); if (!audio.portBuffs[port]) { runtime().Log("Failed to get jack audio port buffer: " + asString(port)); return false; } } } // And mixed outputs audio.portBuffs[2 * NUM_MIDI_PARTS] = (float*)jack_port_get_buffer(audio.ports[2 * NUM_MIDI_PARTS], nframes); if (!audio.portBuffs[2 * NUM_MIDI_PARTS]) { runtime().Log("Failed to get jack audio port buffer: " + asString(2 * NUM_MIDI_PARTS)); return false; } audio.portBuffs[2 * NUM_MIDI_PARTS + 1] = (float*)jack_port_get_buffer(audio.ports[2 * NUM_MIDI_PARTS + 1], nframes); if (!audio.portBuffs[2 * NUM_MIDI_PARTS + 1]) { runtime().Log("Failed to get jack audio port buffer: " + asString(2 * NUM_MIDI_PARTS + 1)); return false; } BeatTracker::BeatValues beats(beatTracker->getBeatValues()); int framesize; if (nframes <= internalbuff) { synth.setBeatValues(beats.songBeat, beats.monotonicBeat, beats.bpm); framesize = sizeof(float) * nframes; synth.MasterAudio(zynLeft, zynRight, nframes); sendAudio(framesize, 0); } else { framesize = sizeof(float) * internalbuff; for (unsigned int pos = 0; pos < nframes; pos += internalbuff) { float bpmInc = (float)pos * beats.bpm / (audio.jackSamplerate * 60.0f); synth.setBeatValues(beats.songBeat + bpmInc, beats.monotonicBeat + bpmInc, beats.bpm); synth.MasterAudio(zynLeft, zynRight, internalbuff); sendAudio(framesize, pos); } } return true; } void JackEngine::sendAudio(int framesize, uint offset) { // Part outputs int currentmax = runtime().numAvailableParts; for (int port = 0, idx = 0; idx < 2 * NUM_MIDI_PARTS; port++ , idx += 2) { if (audio.ports [idx]) { if (jack_port_connected(audio.ports[idx])) // just a few % improvement. { float *lpoint = audio.portBuffs[idx] + offset; float *rpoint = audio.portBuffs[idx + 1] + offset; if ((synth.part[port]->Paudiodest & 2) && port < currentmax) { memcpy(lpoint, zynLeft[port], framesize); memcpy(rpoint, zynRight[port], framesize); } else { memset(lpoint, 0, framesize); memset(rpoint, 0, framesize); } } } } // And mixed outputs float *Lpoint = audio.portBuffs[2 * NUM_MIDI_PARTS] + offset; float *Rpoint = audio.portBuffs[2 * NUM_MIDI_PARTS + 1] + offset; memcpy(Lpoint, zynLeft[NUM_MIDI_PARTS], framesize); memcpy(Rpoint, zynRight[NUM_MIDI_PARTS], framesize); } bool JackEngine::processMidi(jack_nframes_t nframes) { void *portBuf = jack_port_get_buffer(midiPort, nframes); if (!portBuf) { runtime().Log("Bad midi jack_port_get_buffer"); return false; } unsigned int idx; jack_midi_event_t jEvent; jack_nframes_t eventCount = jack_midi_get_event_count(portBuf); for (idx = 0; idx < eventCount; ++idx) { if (!jack_midi_event_get(&jEvent, portBuf, idx)) if (jEvent.size >= 1 && jEvent.size <= 4) // no interest in zero sized or long events handleMidi(jEvent.buffer[0], jEvent.buffer[1], jEvent.buffer[2]); } return true; } void JackEngine::handleBeatValues(jack_nframes_t nframes) { jack_position_t pos; jack_transport_state_t state = jack_transport_query(jackClient, &pos); BeatTracker::BeatValues beats(beatTracker->getRawBeatValues()); if (pos.valid & JackPositionBBT) { beats.bpm = pos.beats_per_minute; // In DAWs, Beats Per Minute really mean Quarter Beats Per // Minute. Therefore we need to divide by four first, to get a whole // beat, and then multiply that according to the time signature // denominator. See this link for some background: // https://music.stackexchange.com/a/109743 beats.bpm = beats.bpm / 4 * pos.beat_type; } else beats.bpm = synth.PbpmFallback; float bpmInc = (float)nframes * beats.bpm / ((float)audio.jackSamplerate * 60.0f); beats.monotonicBeat += bpmInc; if (!(pos.valid & JackPositionBBT) || state == JackTransportStopped) // If stopped, keep oscillating. beats.songBeat += bpmInc; else { // If rolling, sync to exact beat. beats.songBeat = (float)pos.tick / (float)pos.ticks_per_beat; beats.songBeat += pos.beat - 1; beats.songBeat += (pos.bar - 1) * pos.beats_per_bar; } beatTracker->setBeatValues(beats); } int JackEngine::_xrunCallback(void* arg) { ((JackEngine *)arg)->runtime().Log("xrun reported", _SYS_::LogNotSerious); return 0; } bool JackEngine::latencyPrep() { #if defined(JACK_LATENCY) // >= 0.120.1 API if (jack_set_latency_callback(jackClient, _latencyCallback, this)) { runtime().Log("Set latency callback failed"); return false; } return true; #else // < 0.120.1 API for (int i = 0; i < 2 * NUM_MIDI_PARTS + 2; ++i) { if (jack_port_set_latency && audio.ports[i]) jack_port_set_latency(audio.ports[i], jack_get_buffer_size(jackClient)); } if (jack_recompute_total_latencies) jack_recompute_total_latencies(jackClient); return true; #endif } #if defined(JACK_SESSION) void JackEngine::_jsessionCallback(jack_session_event_t* event, void* arg) { return static_cast(arg)->jsessionCallback(event); } void JackEngine::jsessionCallback(jack_session_event_t* event) { string uuid = string(event->client_uuid); string filename = string("yoshimi-") + uuid + string(".xml"); string filepath = string(event->session_dir) + filename; runtime().setJackSessionSave((int)event->type, filepath); string cmd = runtime().programCmd() + string(" -U ") + uuid + string(" -u ${SESSION_DIR}") + filename; event->command_line = strdup(cmd.c_str()); if (jack_session_reply(jackClient, event)) runtime().Log("Jack session reply failed"); jack_session_event_free(event); } #endif #if defined(JACK_LATENCY) void JackEngine::_latencyCallback(jack_latency_callback_mode_t mode, void* arg) { return static_cast(arg)->latencyCallback(mode); } void JackEngine::latencyCallback(jack_latency_callback_mode_t mode) { if (mode == JackCaptureLatency) { for (int i = 0; i < 2 * NUM_MIDI_PARTS + 2; ++i) { jack_latency_range_t range; if (audio.ports[i]) { jack_port_get_latency_range(audio.ports[i], mode, &range); range.min++; range.max += audio.jackNframes; jack_port_set_latency_range(audio.ports[i], JackPlaybackLatency, &range); } } } } #endif /*defined JACK_LATENCY*/ yoshimi-2.3.5.1/src/MusicIO/JackEngine.h000066400000000000000000000072351506652756400176360ustar00rootroot00000000000000/* JackEngine.h Copyright 2009-2011, Alan Calvert Copyright 2014-2019, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . Modified May 2019 */ #ifndef JACK_ENGINE_H #define JACK_ENGINE_H #include "Misc/Util.h" #include #include #if defined(JACK_SESSION) #include #endif #include "MusicIO/MusicIO.h" using std::string; using util::unConst; class SynthEngine; class JackEngine : public MusicIO { public: // shall not be copied nor moved JackEngine(JackEngine&&) = delete; JackEngine(JackEngine const&) = delete; JackEngine& operator=(JackEngine&&) = delete; JackEngine& operator=(JackEngine const&) = delete; JackEngine(SynthEngine&, shared_ptr); ~JackEngine() { Close(); } /* ====== MusicIO interface ======== */ bool openAudio() override; bool openMidi() override; bool Start() override; void Close() override; void registerAudioPort(int) override; uint getSamplerate() const override { return audio.jackSamplerate; } int getBuffersize() const override { return audio.jackNframes; } string audioClientName() const override { return unConst(this)->clientName(); } int audioClientId() const override { return unConst(this)->clientId(); } string midiClientName() const override { return unConst(this)->clientName(); } int midiClientId() const override { return unConst(this)->clientId(); } bool isConnected() { return (NULL != jackClient); } bool connectServer(string server); string clientName(); int clientId(); private: bool openJackClient(string server); bool connectJackPorts(); bool processAudio(jack_nframes_t nframes); void sendAudio(int framesize, uint offset); bool processMidi(jack_nframes_t nframes); void handleBeatValues(jack_nframes_t nframes); bool latencyPrep(); int processCallback(jack_nframes_t nframes); static int _processCallback(jack_nframes_t nframes, void* arg); static int _xrunCallback(void* arg); #if defined(JACK_SESSION) static void _jsessionCallback(jack_session_event_t* event, void* arg); void jsessionCallback(jack_session_event_t* event); #endif #if defined(JACK_LATENCY) static void _latencyCallback(jack_latency_callback_mode_t mode, void* arg); void latencyCallback(jack_latency_callback_mode_t mode); #endif struct JackAudio { unsigned int jackSamplerate; unsigned int jackNframes; jack_port_t *ports[2*NUM_MIDI_PARTS+2]; float *portBuffs[2*NUM_MIDI_PARTS+2]; }; jack_client_t *jackClient; JackAudio audio; jack_port_t *midiPort; unsigned int internalbuff; }; #endif /*JACK_ENGINE_H*/ yoshimi-2.3.5.1/src/MusicIO/MusicClient.cpp000066400000000000000000000153501506652756400204070ustar00rootroot00000000000000/* MusicClient.h Copyright 2009-2011, Alan Calvert Copyright 2016-2020, Will Godfrey, Andrew Deryabin & others Copyright 2021-2024, Will Godfrey, Ichthyostega, Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . Modified May 2019 */ #include "MusicIO/MusicClient.h" #include "Misc/SynthEngine.h" #include "MusicIO/AlsaEngine.h" #include "MusicIO/JackEngine.h" #include #include #include #include #include #include using std::string; using std::unique_ptr; using std::make_shared; using std::chrono::duration; using std::this_thread::sleep_for; Config& MusicClient::runtime() { return synth.getRuntime(); } MusicClient::MusicClient(SynthEngine& connect_to_engine) : synth{connect_to_engine} , audioIO{} , midiIO{} , timerThreadId{0} , timerWorking{false} , dummyAllocation{} , dummyL{0} , dummyR{0} { } MusicClient::~MusicClient() try { close(); } catch(std::exception& ex){ std::cerr << "Failure closing Music-IO: "< beat; if (useAudio == jack_audio && useMidi == jack_midi) beat = make_shared(); else beat = make_shared(); switch(useAudio) { #ifndef YOSHIMI_LV2_PLUGIN case jack_audio: audioIO = make_shared(synth, beat); break; #if defined(HAVE_ALSA) case alsa_audio: audioIO = make_shared(synth, beat); break; #endif /*ALSA*/ #endif /*LV2*/ default: break; } switch(useMidi) { #ifndef YOSHIMI_LV2_PLUGIN case jack_midi: if (useAudio == jack_audio) midiIO = audioIO; else midiIO = make_shared(synth, beat); break; #if defined(HAVE_ALSA) case alsa_midi: if (useAudio == alsa_audio) midiIO = audioIO; else midiIO = make_shared(synth, beat); break; #endif /*ALSA*/ #endif /*LV2*/ default: break; } assert (audioIO or useAudio == no_audio); assert (midiIO or useMidi == no_midi); } /** * Attempt to establish the given combination of audio and MIDI backends. * @return `true` if both back-ends could be opened successfully */ bool MusicClient::open(audio_driver tryAudio, midi_driver tryMidi) { createEngines(tryAudio, tryMidi); return (not audioIO or audioIO->openAudio()) and (not midiIO or midiIO->openMidi()); } /** * Attach to an external back-end or plugin-host (notably LV2), handling both audio and MIDI. * @param createBackend a functor which creates/attaches the backend to the SynthEngine */ bool MusicClient::open(InstanceManager::PluginCreator& createBackend) { audioIO.reset(createBackend(synth)); // BeatTracker assumed to be created implicitly midiIO = audioIO; bool success = audioIO->openAudio() and midiIO->openMidi(); if (not success) audioIO.reset(); return success; } bool MusicClient::start() { assert(timerThreadId == 0 && !timerWorking); bool okAudio = true; bool okMidi = true; if (audioIO) okAudio = audioIO->Start(); else okAudio = launchReplacementThread(); if (midiIO and midiIO != audioIO) okMidi = midiIO->Start(); return okAudio and okMidi; } void MusicClient::close() { if (midiIO and midiIO != audioIO) midiIO->Close(); if (audioIO) audioIO->Close(); else stopReplacementThread(); } void MusicClient::stopReplacementThread() { if (timerThreadId == 0 || timerWorking == false) return; timerWorking = false; void* ret = 0; pthread_join(timerThreadId, &ret); timerThreadId = 0; } bool MusicClient::launchReplacementThread() { return prepDummyBuffers() and runtime().startThread(&timerThreadId, MusicClient::timerThread_fn, this, false, 0, "Timer?"); } /** * Create dummy buffers, so that the »Timer-Thread« can run the SynthEngine * @note this code is copied and adapted from MusicIO */ bool MusicClient::prepDummyBuffers() { size_t buffSize = runtime().buffersize; if (buffSize == 0) return false; size_t allocSize = 2 * (NUM_MIDI_PARTS + 1) * buffSize; // All buffers allocated together // Note: std::bad_alloc is raised on failure, which kills the application... dummyAllocation.reset(allocSize); for (size_t i=0; i < (NUM_MIDI_PARTS + 1); ++i) { dummyL[i] = & dummyAllocation[(2*i ) * buffSize]; dummyR[i] = & dummyAllocation[(2*i+1) * buffSize]; } return true; } void* MusicClient::timerThread_fn(void *arg) { assert(arg); MusicClient& self = * static_cast(arg); using Seconds = duration; auto sleepInterval = Seconds(double(self.runtime().buffersize) / self.runtime().samplerate); self.timerWorking = true; while (self.timerWorking and self.runtime().runSynth.load(std::memory_order_relaxed)) { self.synth.MasterAudio(self.dummyL, self.dummyR); sleep_for(sleepInterval); } return 0; } uint MusicClient::getSamplerate() { return audioIO? audioIO->getSamplerate() : runtime().samplerate; } uint MusicClient::getBuffersize() { return audioIO? audioIO->getBuffersize() : runtime().buffersize; } string MusicClient::audioClientName() { return audioIO? audioIO->audioClientName() : "null_audio"; } string MusicClient::midiClientName() { return midiIO? midiIO->midiClientName() : "null_midi"; } int MusicClient::audioClientId() { return audioIO? audioIO->audioClientId() : 0; } int MusicClient::midiClientId() { return midiIO? midiIO->midiClientId() : 0; } void MusicClient::registerAudioPort(int portnum) { if (audioIO) audioIO->registerAudioPort(portnum); } yoshimi-2.3.5.1/src/MusicIO/MusicClient.h000066400000000000000000000047661506652756400200650ustar00rootroot00000000000000/* MusicClient.h Copyright 2009-2011, Alan Calvert Copyright 2009, James Morris Copyright 2016-2020, Will Godfrey, Andrew Deryabin & others Copyright 2021-2024, Will Godfrey, Ichthyostega, Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . Modified May 2019 */ #ifndef MUSIC_CLIENT_H #define MUSIC_CLIENT_H #include "globals.h" #include "Misc/Alloc.h" #include #include #include #include using std::shared_ptr; using std::unique_ptr; using std::string; enum audio_driver { no_audio = 0, jack_audio, alsa_audio}; enum midi_driver { no_midi = 0, jack_midi, alsa_midi}; class Config; class MusicIO; class SynthEngine; class BeatTracker; #define NMC_SRATE 44100 class MusicClient { private: SynthEngine& synth; shared_ptr audioIO; shared_ptr midiIO; pthread_t timerThreadId; static void* timerThread_fn(void*); bool timerWorking; Samples dummyAllocation; float* dummyL[NUM_MIDI_PARTS + 1]; float* dummyR[NUM_MIDI_PARTS + 1]; public: // shall not be copied nor moved MusicClient(MusicClient&&) = delete; MusicClient(MusicClient const&) = delete; MusicClient& operator=(MusicClient&&) = delete; MusicClient& operator=(MusicClient const&) = delete; MusicClient(SynthEngine&); ~MusicClient(); bool open(audio_driver, midi_driver); bool open(std::function&); bool start(); void close(); uint getSamplerate(); uint getBuffersize(); string audioClientName(); string midiClientName(); int audioClientId(); int midiClientId(); void registerAudioPort(int portnum); private: void createEngines(audio_driver, midi_driver); bool launchReplacementThread(); void stopReplacementThread(); bool prepDummyBuffers(); Config& runtime(); }; #endif yoshimi-2.3.5.1/src/MusicIO/MusicIO.cpp000066400000000000000000000176051506652756400175050ustar00rootroot00000000000000/* MusicIO.cpp Copyright 2009-2011, Alan Calvert Copyright 2014-2020, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ /* * Uncomment the following define to emulate aftertouch * To get the impression of channel aftertouch we change the * event of the specified controller number. * Change the value to suit your circumstances. */ //#define AFTERTOUCH_EMULATE 94 #include "Misc/Config.h" #include "Misc/SynthEngine.h" #include "Misc/FormatFuncs.h" #include "MusicIO/MusicIO.h" #include #include using func::asString; MusicIO::MusicIO(SynthEngine& _synth, shared_ptr&& beat) : bufferAllocation{} // Allocation happens later in prepBuffers() , zynLeft{0} , zynRight{0} , beatTracker{std::move(beat)} , synth{_synth} { } Config& MusicIO::runtime() { return synth.getRuntime(); } void MusicIO::handleMidi(uchar par0, uchar par1, uchar par2, bool in_place) { if (synth.audioOut.load() != _SYS_::mute::Idle) return; // nobody listening! bool inSync = runtime().isLV2 or (runtime().audioEngine == jack_audio and runtime().midiEngine == jack_midi); CommandBlock putData; uint event = par0 & 0xf0; uchar channel = par0 & 0xf; #ifdef AFTERTOUCH_EMULATE if (event == 0xb0 && par1 == AFTERTOUCH_EMULATE) { par0 = 0xd0 | channel; // change to channel aftertouch par1 = par2; // shift parameter across synth.mididecode.midiProcess(par0, par1, par2, in_place, inSync); return; } #endif /* * This below is a much simpler (faster) way * to do note-on and note-off * Tested on ALSA JACK and LV2 all combinations! */ if (event == 0x80 || event == 0x90) { if (par2 < 1) // zero volume note on. event = 0x80; #ifdef REPORT_NOTES_ON_OFF if (event == 0x80) // note test ++runtime().noteOffSent; else ++runtime().noteOnSent; #endif if (inSync) { if (event == 0x80) synth.NoteOff(channel, par1); else synth.NoteOn(channel, par1, par2); } else { putData.data.value = float(par2); putData.data.type = 8; putData.data.control = (event == 0x80); putData.data.part = TOPLEVEL::section::midiIn; putData.data.kit = channel; putData.data.engine = par1; synth.midilearn.writeMidi(putData, false); } if (event == 0x90) synth.interchange.noteSeen = true; return; } synth.mididecode.midiProcess(par0, par1, par2, in_place, inSync); } bool MusicIO::prepBuffers() { size_t buffSize = getBuffersize(); if (buffSize == 0) return false; size_t allocSize = 2 * (NUM_MIDI_PARTS + 1) * buffSize; // All buffers allocated together // Note: std::bad_alloc is raised on failure, which kills the application... bufferAllocation.reset(allocSize); for (size_t i=0; i < (NUM_MIDI_PARTS + 1); ++i) { zynLeft[i] = & bufferAllocation[(2*i ) * buffSize]; zynRight[i] = & bufferAllocation[(2*i+1) * buffSize]; } return true; } BeatTracker::BeatTracker() : songVsMonotonicBeatDiff{0} { } BeatTracker::~BeatTracker() { } // emit VTable here... void BeatTracker::adjustMonotonicRounding(BeatTracker::BeatValues& beats) { // Try to compensate for rounding errors in monotonic beat. If the // difference is small enough from the song beat, then we assume we have not // repositioned the transport and we derive an exact value of the monotonic // beat from the song beat, instead of adding BPM on every cycle, which // accumulates a lot of error over time. if (fabsf(beats.songBeat + songVsMonotonicBeatDiff - beats.monotonicBeat) < 0.1f) beats.monotonicBeat = beats.songBeat + songVsMonotonicBeatDiff; else songVsMonotonicBeatDiff = beats.monotonicBeat - beats.songBeat; } // to protect a critical section against concurrent access using Guard = const std::lock_guard; // monotonic time scale in microseconds as unsigned 64bit using Mircos = std::chrono::duration; using std::chrono::steady_clock; using std::chrono::floor; MultithreadedBeatTracker::MultithreadedBeatTracker() : mtx{} , lastTimeUs{} , lastSongBeat{0} , lastMonotonicBeat{0} , timeUs{} , songBeat{0} , monotonicBeat{0} , bpm{120} { auto now = steady_clock::now(); auto microTicks = floor(now.time_since_epoch()) .count(); lastTimeUs = microTicks; timeUs = microTicks; } BeatTracker::BeatValues MultithreadedBeatTracker::setBeatValues(BeatTracker::BeatValues beats) { adjustMonotonicRounding(beats); Guard lock(mtx); //--synced------------------------------ auto now = steady_clock::now(); auto microTicks = floor(now.time_since_epoch()) .count(); lastTimeUs = timeUs; timeUs = microTicks; bpm = beats.bpm; if (beats.songBeat >= LFO_BPM_LCM) { beats.songBeat -= LFO_BPM_LCM; lastSongBeat = songBeat - LFO_BPM_LCM; } else lastSongBeat = songBeat; if (beats.monotonicBeat >= LFO_BPM_LCM) { beats.monotonicBeat -= LFO_BPM_LCM; lastMonotonicBeat = monotonicBeat - LFO_BPM_LCM; } else lastMonotonicBeat = monotonicBeat; songBeat = beats.songBeat; monotonicBeat = beats.monotonicBeat; return beats; } BeatTracker::BeatValues MultithreadedBeatTracker::getBeatValues() { Guard lock(mtx); //--synced------------------------------ BeatTracker::BeatValues ret; // read current monotonic time auto now = steady_clock::now(); int64_t microTicks = floor(now.time_since_epoch()) .count(); if (timeUs == lastTimeUs) { // Can only happen on the very first iteration. Avoid division by zero. ret.songBeat = 0; ret.monotonicBeat = 0; } else { // Based on beat and clock from MIDI thread, // interpolate and find the beat for audio thread. auto ratio = float(microTicks - lastTimeUs) / (timeUs - lastTimeUs); ret.songBeat = ratio * (songBeat - lastSongBeat) + lastSongBeat; ret.monotonicBeat = ratio * (monotonicBeat - lastMonotonicBeat) + lastMonotonicBeat; } ret.bpm = bpm; return ret; } BeatTracker::BeatValues MultithreadedBeatTracker::getRawBeatValues() { Guard lock(mtx); //--synced------------------------------ BeatValues ret = { songBeat, monotonicBeat, bpm, }; return ret; } SinglethreadedBeatTracker::SinglethreadedBeatTracker() { beats.songBeat = 0; beats.monotonicBeat = 0; beats.bpm = 120; } BeatTracker::BeatValues SinglethreadedBeatTracker::setBeatValues(BeatTracker::BeatValues beats) { if (beats.songBeat >= LFO_BPM_LCM) beats.songBeat -= LFO_BPM_LCM; if (beats.monotonicBeat >= LFO_BPM_LCM) beats.monotonicBeat -= LFO_BPM_LCM; adjustMonotonicRounding(beats); this->beats = beats; return beats; } BeatTracker::BeatValues SinglethreadedBeatTracker::getBeatValues() { return beats; } BeatTracker::BeatValues SinglethreadedBeatTracker::getRawBeatValues() { return beats; } yoshimi-2.3.5.1/src/MusicIO/MusicIO.h000066400000000000000000000124051506652756400171430ustar00rootroot00000000000000/* MusicIO.h Copyright 2009-2011, Alan Calvert Copyright 2009, James Morris Copyright 2014-2019, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . Modified May 2019 */ #ifndef MUSIC_IO_H #define MUSIC_IO_H #include "globals.h" #include "Misc/Alloc.h" #include "Misc/SynthEngine.h" #include #include #include using std::unique_ptr; using std::shared_ptr; using std::string; class BeatTracker; class MusicIO { public: virtual ~MusicIO() = default; MusicIO(SynthEngine&, shared_ptr&&); // shall not be copied or moved MusicIO(MusicIO&&) = delete; MusicIO(MusicIO const&) = delete; MusicIO& operator=(MusicIO&&) = delete; MusicIO& operator=(MusicIO const&) = delete; virtual bool openAudio() = 0; virtual bool openMidi() = 0; virtual bool Start() = 0; virtual void Close() = 0; virtual void registerAudioPort(int) = 0; virtual uint getSamplerate() const = 0; virtual int getBuffersize() const = 0; virtual string audioClientName() const = 0; virtual int audioClientId() const = 0; virtual string midiClientName() const = 0; virtual int midiClientId() const = 0; protected: bool prepBuffers(); void getAudio() { synth.MasterAudio(zynLeft, zynRight); } void handleMidi(uchar par0, uchar par1, uchar par2, bool in_place = false); Samples bufferAllocation; float* zynLeft[NUM_MIDI_PARTS + 1]; float* zynRight[NUM_MIDI_PARTS + 1]; // The engine which tracks song beats (MIDI driver). shared_ptr beatTracker; SynthEngine& synth; Config& runtime(); }; class BeatTracker { public: struct BeatValues { float songBeat; float monotonicBeat; float bpm; }; public: virtual ~BeatTracker(); // this is an interface BeatTracker(); // The pair contains the song beat (relative to song beginning) and // monotonic beat (relative to time origin), respectively, and is used // by subclasses to set the current beat values. // // The setter returns the same values it's given, except that they can // wrap around. Sub classes that call this function should consider // storing the wrapped value in order to preserve precision when the // beat count gets high. The wrapped around value is guaranteed to // divide all possible LFO fractions. virtual BeatValues setBeatValues(BeatValues beats) = 0; // Gets the beat values as close as possible in time to this moment. virtual BeatValues getBeatValues() = 0; // Gets the raw beat values without any sort of time calculation. virtual BeatValues getRawBeatValues() = 0; protected: void adjustMonotonicRounding(BeatValues& beats); private: float songVsMonotonicBeatDiff; }; class MultithreadedBeatTracker : public BeatTracker { public: MultithreadedBeatTracker(); ~MultithreadedBeatTracker() = default; // shall not be copied or moved MultithreadedBeatTracker(MultithreadedBeatTracker&&) = delete; MultithreadedBeatTracker(MultithreadedBeatTracker const&) = delete; MultithreadedBeatTracker& operator=(MultithreadedBeatTracker&&) = delete; MultithreadedBeatTracker& operator=(MultithreadedBeatTracker const&) = delete; // These two functions are mutually thread safe, even though they // operate on the same data. The first is usually called from the MIDI // thread, the second from the audio thread. BeatValues setBeatValues(BeatValues beats) override; BeatValues getBeatValues() override; BeatValues getRawBeatValues() override; private: // Current and last time and beats of the MIDI clock. std::mutex mtx; uint64_t lastTimeUs; float lastSongBeat; float lastMonotonicBeat; uint64_t timeUs; float songBeat; float monotonicBeat; float bpm; }; class SinglethreadedBeatTracker : public BeatTracker { public: SinglethreadedBeatTracker(); BeatValues setBeatValues(BeatValues beats) override; BeatValues getBeatValues() override; BeatValues getRawBeatValues() override; private: BeatValues beats; }; #endif /*MUSIC_IO_H*/ yoshimi-2.3.5.1/src/Params/000077500000000000000000000000001506652756400153735ustar00rootroot00000000000000yoshimi-2.3.5.1/src/Params/ADnoteParameters.cpp000066400000000000000000001337111506652756400213030ustar00rootroot00000000000000/* ADnoteParameters.cpp - Parameters for ADnote (ADsynth) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2019 Will Godfrey Copyright 2020-2023 Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include #include #include #include "Params/ADnoteParameters.h" #include "Misc/SynthEngine.h" #include "Misc/NumericFuncs.h" #include "Misc/XMLStore.h" using func::setAllPan; using func::power; int ADnoteParameters::ADnote_unison_sizes[] = {2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 25, 30, 40, 50, 0}; ADnoteParameters::ADnoteParameters(fft::Calc& fft_, SynthEngine& _synth) : ParamBase{_synth} , fft(fft_) { GlobalPar.FreqEnvelope = new EnvelopeParams(0, 0, synth); GlobalPar.FreqEnvelope->ASRinit(64, 50, 64, 60); GlobalPar.FreqLfo = new LFOParams(70, 0, 64, 0, 0, 0, false, 0, synth); GlobalPar.AmpEnvelope = new EnvelopeParams(64, 1, synth); GlobalPar.AmpEnvelope->ADSRinit_dB(0, 40, 127, 25); GlobalPar.AmpLfo = new LFOParams(80, 0, 64, 0, 0, 0, false, 1, synth); GlobalPar.GlobalFilter = new FilterParams(2, 94, 40, 0, synth); GlobalPar.FilterEnvelope = new EnvelopeParams(0, 1, synth); GlobalPar.FilterEnvelope->ADSRinit_filter(64, 40, 64, 70, 60, 64); GlobalPar.FilterLfo = new LFOParams(80, 0, 64, 0, 0, 0, false, 2, synth); GlobalPar.Reson = new Resonance(synth); for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) enableVoice(nvoice); defaults(); } void ADnoteParameters::defaults() { // Frequency Global Parameters GlobalPar.PStereo = true; // stereo GlobalPar.PDetune = 8192; // zero GlobalPar.PCoarseDetune = 0; GlobalPar.PDetuneType = 1; GlobalPar.FreqEnvelope->defaults(); GlobalPar.FreqLfo->defaults(); GlobalPar.PBandwidth = 64; // Amplitude Global Parameters GlobalPar.PVolume = 90; setGlobalPan(GlobalPar.PPanning = 64, synth.getRuntime().panLaw); // center GlobalPar.PAmpVelocityScaleFunction = 64; GlobalPar.PRandom = false; GlobalPar.PWidth = 63; GlobalPar.AmpEnvelope->defaults(); GlobalPar.AmpLfo->defaults(); GlobalPar.Fadein_adjustment = FADEIN_ADJUSTMENT_SCALE; GlobalPar.PPunchStrength = 0; GlobalPar.PPunchTime = 60; GlobalPar.PPunchStretch = 64; GlobalPar.PPunchVelocitySensing = 72; GlobalPar.Hrandgrouping = 0; // Filter Global Parameters GlobalPar.PFilterVelocityScale = 64; GlobalPar.PFilterVelocityScaleFunction = 64; GlobalPar.GlobalFilter->defaults(); GlobalPar.FilterEnvelope->defaults(); GlobalPar.FilterLfo->defaults(); GlobalPar.Reson->defaults(); for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) defaults(nvoice); VoicePar[0].Enabled = true; } // Defaults a voice void ADnoteParameters::defaults(const uint nvoice) { VoicePar[nvoice].Enabled = false; VoicePar[nvoice].Unison_size = 1; VoicePar[nvoice].Unison_frequency_spread = 60; VoicePar[nvoice].Unison_stereo_spread = 64; VoicePar[nvoice].Unison_vibrato = 64; VoicePar[nvoice].Unison_vibrato_speed = 64; VoicePar[nvoice].Unison_invert_phase = 0; VoicePar[nvoice].Unison_phase_randomness = 127; VoicePar[nvoice].Type = 0; VoicePar[nvoice].Pfixedfreq = false; VoicePar[nvoice].PfixedfreqET = 0; VoicePar[nvoice].PBendAdjust = 88; // 64 + 24 VoicePar[nvoice].POffsetHz = 64; VoicePar[nvoice].Presonance = false; VoicePar[nvoice].Pfilterbypass = false; VoicePar[nvoice].Pextoscil = -1; VoicePar[nvoice].PextFMoscil = -1; VoicePar[nvoice].Poscilphase = 64; VoicePar[nvoice].PFMoscilphase = 64; VoicePar[nvoice].PDelay = 0; VoicePar[nvoice].PVolume = 100; VoicePar[nvoice].PVolumeminus = 0; setVoicePan(nvoice, VoicePar[nvoice].PPanning = 64, synth.getRuntime().panLaw); // center VoicePar[nvoice].PRandom = false; VoicePar[nvoice].PWidth = 63; VoicePar[nvoice].PDetune = 8192; // 8192 = 0 VoicePar[nvoice].PCoarseDetune = 0; VoicePar[nvoice].PDetuneType = 0; VoicePar[nvoice].PFreqLfoEnabled = false; VoicePar[nvoice].PFreqEnvelopeEnabled = false; VoicePar[nvoice].PAmpEnvelopeEnabled = false; VoicePar[nvoice].PAmpLfoEnabled = false; VoicePar[nvoice].PAmpVelocityScaleFunction = 127; VoicePar[nvoice].PFilterEnabled = false; VoicePar[nvoice].PFilterEnvelopeEnabled = false; VoicePar[nvoice].PFilterLfoEnabled = false; VoicePar[nvoice].PFilterVelocityScale = 0; VoicePar[nvoice].PFilterVelocityScaleFunction = 64; VoicePar[nvoice].PFMEnabled = 0; VoicePar[nvoice].PFMEnabled = 0; VoicePar[nvoice].PFMringToSide = false; VoicePar[nvoice].PFMFixedFreq = false; // I use the internal oscillator (-1) VoicePar[nvoice].PVoice = -1; VoicePar[nvoice].PFMVoice = -1; VoicePar[nvoice].PFMVolume = 90; VoicePar[nvoice].PFMVolumeDamp = 64; VoicePar[nvoice].PFMDetuneFromBaseOsc = 1; VoicePar[nvoice].PFMDetune = 8192; VoicePar[nvoice].PFMCoarseDetune = 0; VoicePar[nvoice].PFMDetuneType = 0; VoicePar[nvoice].PFMFreqEnvelopeEnabled = false; VoicePar[nvoice].PFMAmpEnvelopeEnabled = false; VoicePar[nvoice].PFMVelocityScaleFunction = 64; VoicePar[nvoice].POscil->defaults(); VoicePar[nvoice].POscilFM->defaults(); VoicePar[nvoice].AmpEnvelope->defaults(); VoicePar[nvoice].AmpLfo->defaults(); VoicePar[nvoice].FreqEnvelope->defaults(); VoicePar[nvoice].FreqLfo->defaults(); VoicePar[nvoice].VoiceFilter->defaults(); VoicePar[nvoice].FilterEnvelope->defaults(); VoicePar[nvoice].FilterLfo->defaults(); VoicePar[nvoice].FMFreqEnvelope->defaults(); VoicePar[nvoice].FMAmpEnvelope->defaults(); } // Init the voice parameters void ADnoteParameters::enableVoice(int nvoice) { VoicePar[nvoice].POscil = new OscilParameters(fft, synth); VoicePar[nvoice].POscilFM = new OscilParameters(fft, synth); VoicePar[nvoice].OscilSmp = new OscilGen(fft, GlobalPar.Reson, &synth, VoicePar[nvoice].POscil); VoicePar[nvoice].FMSmp = new OscilGen(fft, NULL, &synth, VoicePar[nvoice].POscilFM); VoicePar[nvoice].AmpEnvelope = new EnvelopeParams(64, 1, synth); VoicePar[nvoice].AmpEnvelope->ADSRinit_dB(0, 100, 127, 100); VoicePar[nvoice].AmpLfo = new LFOParams(90, 32, 64, 0, 0, 30, false, 1, synth); VoicePar[nvoice].FreqEnvelope = new EnvelopeParams(0, 0, synth); VoicePar[nvoice].FreqEnvelope->ASRinit(30, 40, 64, 60); VoicePar[nvoice].FreqLfo = new LFOParams(50, 40, 0, 0, 0, 0, false, 0, synth); VoicePar[nvoice].VoiceFilter = new FilterParams(2, 50, 60, 0, synth); VoicePar[nvoice].FilterEnvelope = new EnvelopeParams(0, 0, synth); VoicePar[nvoice].FilterEnvelope->ADSRinit_filter(90, 70, 40, 70, 10, 40); VoicePar[nvoice].FilterLfo = new LFOParams(50, 20, 64, 0, 0, 0, false, 2, synth); VoicePar[nvoice].FMFreqEnvelope = new EnvelopeParams(0, 0, synth); VoicePar[nvoice].FMFreqEnvelope->ASRinit(20, 90, 40, 80); VoicePar[nvoice].FMAmpEnvelope = new EnvelopeParams(64, 1, synth); VoicePar[nvoice].FMAmpEnvelope->ADSRinit(80, 90, 127, 100); } // Get the Multiplier of the fine detunes of the voices float ADnoteParameters::getBandwidthDetuneMultiplier() { float bw = (GlobalPar.PBandwidth - 64.0f) / 64.0f; bw = power<2>(bw * pow(fabs(bw), 0.2f) * 5.0f); return bw; } // Get the unison spread in cents for a voice float ADnoteParameters::getUnisonFrequencySpreadCents(int nvoice) { float unison_spread = VoicePar[nvoice].Unison_frequency_spread / 127.0f; unison_spread = powf(unison_spread * 2.0f, 2.0f) * 50.0f; // cents return unison_spread; } // Kill the voice void ADnoteParameters::killVoice(int nvoice) { delete VoicePar[nvoice].OscilSmp; delete VoicePar[nvoice].FMSmp; delete VoicePar[nvoice].POscil; delete VoicePar[nvoice].POscilFM; delete VoicePar[nvoice].AmpEnvelope; delete VoicePar[nvoice].AmpLfo; delete VoicePar[nvoice].FreqEnvelope; delete VoicePar[nvoice].FreqLfo; delete VoicePar[nvoice].VoiceFilter; delete VoicePar[nvoice].FilterEnvelope; delete VoicePar[nvoice].FilterLfo; delete VoicePar[nvoice].FMFreqEnvelope; delete VoicePar[nvoice].FMAmpEnvelope; } ADnoteParameters::~ADnoteParameters() { delete GlobalPar.FreqEnvelope; delete GlobalPar.FreqLfo; delete GlobalPar.AmpEnvelope; delete GlobalPar.AmpLfo; delete GlobalPar.GlobalFilter; delete GlobalPar.FilterEnvelope; delete GlobalPar.FilterLfo; delete GlobalPar.Reson; for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) killVoice(nvoice); } void ADnoteParameters::setGlobalPan(char pan, unsigned char panLaw) { GlobalPar.PPanning = pan; if (!GlobalPar.PRandom) setAllPan(GlobalPar.PPanning, GlobalPar.pangainL, GlobalPar.pangainR, panLaw); else GlobalPar.pangainL = GlobalPar.pangainR = 0.7f; } void ADnoteParameters::setVoicePan(int nvoice, char pan, unsigned char panLaw) { VoicePar[nvoice].PPanning = pan; if (!VoicePar[nvoice].PRandom) setAllPan(VoicePar[nvoice].PPanning, VoicePar[nvoice].pangainL, VoicePar[nvoice].pangainR, panLaw); else VoicePar[nvoice].pangainL = VoicePar[nvoice].pangainR = 0.7f; } void ADnoteParameters::add2XML_voice(XMLtree& xmlVoice, const uint nvoice) { if (nvoice >= NUM_VOICES) return; xmlVoice.addPar_bool("enabled", VoicePar[nvoice].Enabled); bool oscil_used_by_other_voice{false}; bool fmosc_used_by_other_voice{false}; for (uint i = 0; i < NUM_VOICES; ++i) { oscil_used_by_other_voice = (int(nvoice) == VoicePar[i].Pextoscil); fmosc_used_by_other_voice = (int(nvoice) == VoicePar[i].PextFMoscil); } if (not (VoicePar[nvoice].Enabled or oscil_used_by_other_voice or fmosc_used_by_other_voice or synth.getRuntime().xmlmax)) return; xmlVoice.addPar_int ("type", VoicePar[nvoice].Type); xmlVoice.addPar_int ("unison_size", VoicePar[nvoice].Unison_size); xmlVoice.addPar_int ("unison_frequency_spread", VoicePar[nvoice].Unison_frequency_spread); xmlVoice.addPar_int ("unison_stereo_spread", VoicePar[nvoice].Unison_stereo_spread); xmlVoice.addPar_int ("unison_vibratto", VoicePar[nvoice].Unison_vibrato); xmlVoice.addPar_int ("unison_vibratto_speed", VoicePar[nvoice].Unison_vibrato_speed); xmlVoice.addPar_int ("unison_invert_phase", VoicePar[nvoice].Unison_invert_phase); xmlVoice.addPar_int ("unison_phase_randomness", VoicePar[nvoice].Unison_phase_randomness); xmlVoice.addPar_int ("delay" , VoicePar[nvoice].PDelay); xmlVoice.addPar_bool("resonance" , VoicePar[nvoice].Presonance); xmlVoice.addPar_int ("input_voice" , VoicePar[nvoice].PVoice); xmlVoice.addPar_int ("ext_oscil" , VoicePar[nvoice].Pextoscil); xmlVoice.addPar_int ("ext_fm_oscil" , VoicePar[nvoice].PextFMoscil); xmlVoice.addPar_int ("oscil_phase" , VoicePar[nvoice].Poscilphase); xmlVoice.addPar_int ("oscil_fm_phase" , VoicePar[nvoice].PFMoscilphase); xmlVoice.addPar_bool("filter_enabled" , VoicePar[nvoice].PFilterEnabled); xmlVoice.addPar_bool("filter_bypass" , VoicePar[nvoice].Pfilterbypass); xmlVoice.addPar_int ("fm_enabled" , VoicePar[nvoice].PFMEnabled); XMLtree xmlOscil = xmlVoice.addElm("OSCIL"); VoicePar[nvoice].POscil->add2XML(xmlOscil); XMLtree xmlAmp = xmlVoice.addElm("AMPLITUDE_PARAMETERS"); // Yoshimi format for random panning xmlAmp.addPar_int ("pan_pos" , VoicePar[nvoice].PPanning); xmlAmp.addPar_bool("random_pan" , VoicePar[nvoice].PRandom); xmlAmp.addPar_int ("random_width", VoicePar[nvoice].PWidth); // support legacy format if (VoicePar[nvoice].PRandom) xmlAmp.addPar_int("panning", 0); else xmlAmp.addPar_int("panning", VoicePar[nvoice].PPanning); xmlAmp.addPar_int ("volume" , VoicePar[nvoice].PVolume); xmlAmp.addPar_bool("volume_minus" , VoicePar[nvoice].PVolumeminus); xmlAmp.addPar_int ("velocity_sensing" , VoicePar[nvoice].PAmpVelocityScaleFunction); xmlAmp.addPar_bool("amp_envelope_enabled", VoicePar[nvoice].PAmpEnvelopeEnabled); if (VoicePar[nvoice].PAmpEnvelopeEnabled or synth.getRuntime().xmlmax) { XMLtree xmlEnv = xmlAmp.addElm("AMPLITUDE_ENVELOPE"); VoicePar[nvoice].AmpEnvelope->add2XML(xmlEnv); } xmlAmp.addPar_bool("amp_lfo_enabled", VoicePar[nvoice].PAmpLfoEnabled); if (VoicePar[nvoice].PAmpLfoEnabled or synth.getRuntime().xmlmax) { XMLtree xmlLFO = xmlAmp.addElm("AMPLITUDE_LFO"); VoicePar[nvoice].AmpLfo->add2XML(xmlLFO); } XMLtree xmlFreq = xmlVoice.addElm("FREQUENCY_PARAMETERS"); xmlFreq.addPar_bool("fixed_freq" , VoicePar[nvoice].Pfixedfreq); xmlFreq.addPar_int ("fixed_freq_et", VoicePar[nvoice].PfixedfreqET); xmlFreq.addPar_int ("bend_adjust" , VoicePar[nvoice].PBendAdjust); xmlFreq.addPar_int ("offset_hz" , VoicePar[nvoice].POffsetHz); xmlFreq.addPar_int ("detune" , VoicePar[nvoice].PDetune); xmlFreq.addPar_int ("coarse_detune", VoicePar[nvoice].PCoarseDetune); xmlFreq.addPar_int ("detune_type" , VoicePar[nvoice].PDetuneType); xmlFreq.addPar_bool("freq_envelope_enabled", VoicePar[nvoice].PFreqEnvelopeEnabled); if (VoicePar[nvoice].PFreqEnvelopeEnabled or synth.getRuntime().xmlmax) { XMLtree xmlEnv = xmlFreq.addElm("FREQUENCY_ENVELOPE"); VoicePar[nvoice].FreqEnvelope->add2XML(xmlEnv); } xmlFreq.addPar_bool("freq_lfo_enabled", VoicePar[nvoice].PFreqLfoEnabled); if (VoicePar[nvoice].PFreqLfoEnabled or synth.getRuntime().xmlmax) { XMLtree xmlLFO = xmlFreq.addElm("FREQUENCY_LFO"); VoicePar[nvoice].FreqLfo->add2XML(xmlLFO); } if (VoicePar[nvoice].PFilterEnabled or synth.getRuntime().xmlmax) { XMLtree xmlFilterParams = xmlVoice.addElm("FILTER_PARAMETERS"); xmlFilterParams.addPar_int("velocity_sensing_amplitude", VoicePar[nvoice].PFilterVelocityScale); xmlFilterParams.addPar_int("velocity_sensing", VoicePar[nvoice].PFilterVelocityScaleFunction); XMLtree xmlFilter = xmlFilterParams.addElm("FILTER"); VoicePar[nvoice].VoiceFilter->add2XML(xmlFilter); xmlFilterParams.addPar_bool("filter_envelope_enabled", VoicePar[nvoice].PFilterEnvelopeEnabled); if (VoicePar[nvoice].PFilterEnvelopeEnabled or synth.getRuntime().xmlmax) { XMLtree xmlEnv = xmlFilterParams.addElm("FILTER_ENVELOPE"); VoicePar[nvoice].FilterEnvelope->add2XML(xmlEnv); } xmlFilterParams.addPar_bool("filter_lfo_enabled", VoicePar[nvoice].PFilterLfoEnabled); if (VoicePar[nvoice].PFilterLfoEnabled or synth.getRuntime().xmlmax) { XMLtree xmlLFO = xmlFilterParams.addElm("FILTER_LFO"); VoicePar[nvoice].FilterLfo->add2XML(xmlLFO); } } if (VoicePar[nvoice].PFMEnabled or fmosc_used_by_other_voice or synth.getRuntime().xmlmax) { XMLtree xmlFM = xmlVoice.addElm("FM_PARAMETERS"); xmlFM.addPar_int("input_voice" , VoicePar[nvoice].PFMVoice); xmlFM.addPar_int("volume" , VoicePar[nvoice].PFMVolume); xmlFM.addPar_int("volume_damp" , VoicePar[nvoice].PFMVolumeDamp); xmlFM.addPar_int("velocity_sensing", VoicePar[nvoice].PFMVelocityScaleFunction); xmlFM.addPar_bool("amp_envelope_enabled", VoicePar[nvoice].PFMAmpEnvelopeEnabled); if (VoicePar[nvoice].PFMAmpEnvelopeEnabled or synth.getRuntime().xmlmax) { XMLtree xmlEnv = xmlFM.addElm("AMPLITUDE_ENVELOPE"); VoicePar[nvoice].FMAmpEnvelope->add2XML(xmlEnv); } XMLtree xmlMod = xmlFM.addElm("MODULATOR"); xmlMod.addPar_bool("detune_from_base_osc", VoicePar[nvoice].PFMDetuneFromBaseOsc); xmlMod.addPar_int ("detune" , VoicePar[nvoice].PFMDetune); xmlMod.addPar_int ("coarse_detune" , VoicePar[nvoice].PFMCoarseDetune); xmlMod.addPar_int ("detune_type" , VoicePar[nvoice].PFMDetuneType); xmlMod.addPar_bool("fixed_freq" , VoicePar[nvoice].PFMFixedFreq); xmlMod.addPar_bool("freq_envelope_enabled", VoicePar[nvoice].PFMFreqEnvelopeEnabled); if (VoicePar[nvoice].PFMFreqEnvelopeEnabled or synth.getRuntime().xmlmax) { XMLtree xmlEnv = xmlMod.addElm("FREQUENCY_ENVELOPE"); VoicePar[nvoice].FMFreqEnvelope->add2XML(xmlEnv); } XMLtree xmlOscil = xmlMod.addElm("OSCIL"); VoicePar[nvoice].POscilFM->add2XML(xmlOscil); } } void ADnoteParameters::add2XML(XMLtree& xmlAddSynth) { xmlAddSynth.addPar_bool("stereo", GlobalPar.PStereo); XMLtree xmlAmp = xmlAddSynth.addElm("AMPLITUDE_PARAMETERS"); { xmlAmp.addPar_int ("volume" , GlobalPar.PVolume); // Yoshimi format for random panning xmlAmp.addPar_int ("pan_pos" , GlobalPar.PPanning); xmlAmp.addPar_bool("random_pan" , GlobalPar.PRandom); xmlAmp.addPar_int ("random_width", GlobalPar.PWidth); // support legacy format if (GlobalPar.PRandom) xmlAmp.addPar_int("panning", 0); else xmlAmp.addPar_int("panning", GlobalPar.PPanning); xmlAmp.addPar_int("velocity_sensing" , GlobalPar.PAmpVelocityScaleFunction); xmlAmp.addPar_int("fadein_adjustment" , GlobalPar.Fadein_adjustment); xmlAmp.addPar_int("punch_strength" , GlobalPar.PPunchStrength); xmlAmp.addPar_int("punch_time" , GlobalPar.PPunchTime); xmlAmp.addPar_int("punch_stretch" , GlobalPar.PPunchStretch); xmlAmp.addPar_int("punch_velocity_sensing", GlobalPar.PPunchVelocitySensing); xmlAmp.addPar_int("harmonic_randomness_grouping", GlobalPar.Hrandgrouping); XMLtree xmlEnv = xmlAmp.addElm("AMPLITUDE_ENVELOPE"); GlobalPar.AmpEnvelope->add2XML(xmlEnv); XMLtree xmlLFO = xmlAmp.addElm("AMPLITUDE_LFO"); GlobalPar.AmpLfo->add2XML(xmlLFO); } XMLtree xmlFreq = xmlAddSynth.addElm("FREQUENCY_PARAMETERS"); { xmlFreq.addPar_int("detune" , GlobalPar.PDetune); xmlFreq.addPar_int("coarse_detune", GlobalPar.PCoarseDetune); xmlFreq.addPar_int("detune_type" , GlobalPar.PDetuneType); xmlFreq.addPar_int("bandwidth" , GlobalPar.PBandwidth); XMLtree xmlEnv = xmlFreq.addElm("FREQUENCY_ENVELOPE"); GlobalPar.FreqEnvelope->add2XML(xmlEnv); XMLtree xmlLFO = xmlFreq.addElm("FREQUENCY_LFO"); GlobalPar.FreqLfo->add2XML(xmlLFO); } XMLtree xmlFilterParams = xmlAddSynth.addElm("FILTER_PARAMETERS"); { xmlFilterParams.addPar_int("velocity_sensing_amplitude", GlobalPar.PFilterVelocityScale); xmlFilterParams.addPar_int("velocity_sensing", GlobalPar.PFilterVelocityScaleFunction); XMLtree xmlFilter = xmlFilterParams.addElm("FILTER"); GlobalPar.GlobalFilter->add2XML(xmlFilter); XMLtree xmlEnv = xmlFilterParams.addElm("FILTER_ENVELOPE"); GlobalPar.FilterEnvelope->add2XML(xmlEnv); XMLtree xmlLFO = xmlFilterParams.addElm("FILTER_LFO"); GlobalPar.FilterLfo->add2XML(xmlLFO); } XMLtree xmlRes = xmlAddSynth.addElm("RESONANCE"); GlobalPar.Reson->add2XML(xmlRes); for (uint nvoice=0; nvoicegetfromXML(xmlEnv); else GlobalPar.AmpEnvelope->defaults(); if (XMLtree xmlLFO = xmlAmp.getElm("AMPLITUDE_LFO")) GlobalPar.AmpLfo->getfromXML(xmlLFO); else GlobalPar.AmpLfo->defaults(); } if (XMLtree xmlFreq = xmlAddSynth.getElm("FREQUENCY_PARAMETERS")) { GlobalPar.PDetune = xmlFreq.getPar_int("detune" , GlobalPar.PDetune, 0, 16383); GlobalPar.PCoarseDetune = xmlFreq.getPar_int("coarse_detune", GlobalPar.PCoarseDetune, 0, 16383); GlobalPar.PDetuneType = xmlFreq.getPar_127("detune_type" , GlobalPar.PDetuneType); GlobalPar.PBandwidth = xmlFreq.getPar_127("bandwidth" , GlobalPar.PBandwidth); if (XMLtree xmlEnv = xmlFreq.getElm("FREQUENCY_ENVELOPE")) GlobalPar.FreqEnvelope->getfromXML(xmlEnv); else GlobalPar.FreqEnvelope->defaults(); if (XMLtree xmlLFO = xmlFreq.getElm("FREQUENCY_LFO")) GlobalPar.FreqLfo->getfromXML(xmlLFO); else GlobalPar.FreqLfo->defaults(); } if (XMLtree xmlFilterParams = xmlAddSynth.getElm("FILTER_PARAMETERS")) { GlobalPar.PFilterVelocityScale = xmlFilterParams.getPar_127("velocity_sensing_amplitude", GlobalPar.PFilterVelocityScale); GlobalPar.PFilterVelocityScaleFunction = xmlFilterParams.getPar_127("velocity_sensing", GlobalPar.PFilterVelocityScaleFunction); if (XMLtree xmlFilter = xmlFilterParams.getElm("FILTER")) GlobalPar.GlobalFilter->getfromXML(xmlFilter); else GlobalPar.GlobalFilter->defaults(); if (XMLtree xmlEnv = xmlFilterParams.getElm("FILTER_ENVELOPE")) GlobalPar.FilterEnvelope->getfromXML(xmlEnv); else GlobalPar.FilterEnvelope->defaults(); if (XMLtree xmlLFO = xmlFilterParams.getElm("FILTER_LFO")) GlobalPar.FilterLfo->getfromXML(xmlLFO); else GlobalPar.FilterLfo->defaults(); } if (XMLtree xmlRes = xmlAddSynth.getElm("RESONANCE")) GlobalPar.Reson->getfromXML(xmlRes); else GlobalPar.Reson->defaults(); for (uint nvoice = 0; nvoice < NUM_VOICES; nvoice++) { VoicePar[nvoice].Enabled = false; if (XMLtree xmlVoice = xmlAddSynth.getElm("VOICE", nvoice)) getfromXML_voice(xmlVoice, nvoice); } } void ADnoteParameters::getfromXML_voice(XMLtree& xmlVoice, const uint nvoice) { if (nvoice >= NUM_VOICES) return; VoicePar[nvoice].Enabled = xmlVoice.getPar_bool("enabled", false); VoicePar[nvoice].Type = xmlVoice.getPar_127 ("type", VoicePar[nvoice].Type); VoicePar[nvoice].Unison_size = xmlVoice.getPar_127("unison_size" , VoicePar[nvoice].Unison_size); VoicePar[nvoice].Unison_frequency_spread = xmlVoice.getPar_127("unison_frequency_spread", VoicePar[nvoice].Unison_frequency_spread); VoicePar[nvoice].Unison_stereo_spread = xmlVoice.getPar_127("unison_stereo_spread" , VoicePar[nvoice].Unison_stereo_spread); VoicePar[nvoice].Unison_vibrato = xmlVoice.getPar_127("unison_vibratto" , VoicePar[nvoice].Unison_vibrato); VoicePar[nvoice].Unison_vibrato_speed = xmlVoice.getPar_127("unison_vibratto_speed" , VoicePar[nvoice].Unison_vibrato_speed); VoicePar[nvoice].Unison_invert_phase = xmlVoice.getPar_127("unison_invert_phase" , VoicePar[nvoice].Unison_invert_phase); VoicePar[nvoice].Unison_phase_randomness = xmlVoice.getPar_127("unison_phase_randomness", VoicePar[nvoice].Unison_phase_randomness); VoicePar[nvoice].PDelay = xmlVoice.getPar_127 ("delay" , VoicePar[nvoice].PDelay); VoicePar[nvoice].Presonance = xmlVoice.getPar_bool("resonance" , VoicePar[nvoice].Presonance); VoicePar[nvoice].PVoice = xmlVoice.getPar_int ("input_voice" , VoicePar[nvoice].PVoice, -1, nvoice - 1); VoicePar[nvoice].Pextoscil = xmlVoice.getPar_int ("ext_oscil" , -1, -1, nvoice-1); VoicePar[nvoice].PextFMoscil = xmlVoice.getPar_int ("ext_fm_oscil" , -1, -1, nvoice-1); VoicePar[nvoice].Poscilphase = xmlVoice.getPar_127 ("oscil_phase" , VoicePar[nvoice].Poscilphase); VoicePar[nvoice].PFMoscilphase = xmlVoice.getPar_127 ("oscil_fm_phase", VoicePar[nvoice].PFMoscilphase); VoicePar[nvoice].PFilterEnabled= xmlVoice.getPar_bool("filter_enabled", VoicePar[nvoice].PFilterEnabled); VoicePar[nvoice].Pfilterbypass = xmlVoice.getPar_bool("filter_bypass" , VoicePar[nvoice].Pfilterbypass); VoicePar[nvoice].PFMEnabled = xmlVoice.getPar_127 ("fm_enabled" , VoicePar[nvoice].PFMEnabled); if (XMLtree xmlOscil = xmlVoice.getElm("OSCIL")) VoicePar[nvoice].POscil->getfromXML(xmlOscil); if (XMLtree xmlAmp = xmlVoice.getElm("AMPLITUDE_PARAMETERS")) { int val = xmlAmp.getPar_127("random_width", UNUSED); if (val < 64) {// new Yoshimi format VoicePar[nvoice].PWidth = val; setVoicePan(nvoice, xmlAmp.getPar_127("pan_pos", VoicePar[nvoice].PPanning), synth.getRuntime().panLaw); VoicePar[nvoice].PRandom = xmlAmp.getPar_bool("random_pan", VoicePar[nvoice].PRandom); } else {// legacy setVoicePan(nvoice, xmlAmp.getPar_127("panning", VoicePar[nvoice].PPanning), synth.getRuntime().panLaw); if (VoicePar[nvoice].PPanning == 0) { VoicePar[nvoice].PPanning = 64; VoicePar[nvoice].PRandom = true; VoicePar[nvoice].PWidth = 63; } else VoicePar[nvoice].PRandom = false; } VoicePar[nvoice].PVolume = xmlAmp.getPar_127 ("volume" , VoicePar[nvoice].PVolume); VoicePar[nvoice].PVolumeminus = xmlAmp.getPar_bool("volume_minus", VoicePar[nvoice].PVolumeminus); VoicePar[nvoice].PAmpVelocityScaleFunction = xmlAmp.getPar_127("velocity_sensing", VoicePar[nvoice].PAmpVelocityScaleFunction); VoicePar[nvoice].PAmpEnvelopeEnabled = xmlAmp.getPar_bool("amp_envelope_enabled",VoicePar[nvoice].PAmpEnvelopeEnabled); if (XMLtree xmlEnv = xmlAmp.getElm("AMPLITUDE_ENVELOPE")) VoicePar[nvoice].AmpEnvelope->getfromXML(xmlEnv); else VoicePar[nvoice].AmpEnvelope->defaults(); VoicePar[nvoice].PAmpLfoEnabled = xmlAmp.getPar_bool("amp_lfo_enabled",VoicePar[nvoice].PAmpLfoEnabled); if (XMLtree xmlLFO = xmlAmp.getElm("AMPLITUDE_LFO")) VoicePar[nvoice].AmpLfo->getfromXML(xmlLFO); else VoicePar[nvoice].AmpLfo->defaults(); } if (XMLtree xmlFreq = xmlVoice.getElm("FREQUENCY_PARAMETERS")) { VoicePar[nvoice].Pfixedfreq = xmlFreq.getPar_bool("fixed_freq" , VoicePar[nvoice].Pfixedfreq); VoicePar[nvoice].PfixedfreqET = xmlFreq.getPar_127 ("fixed_freq_et", VoicePar[nvoice].PfixedfreqET); VoicePar[nvoice].PBendAdjust = xmlFreq.getPar_127 ("bend_adjust" , VoicePar[nvoice].PBendAdjust); VoicePar[nvoice].POffsetHz = xmlFreq.getPar_127 ("offset_hz" , VoicePar[nvoice].POffsetHz); VoicePar[nvoice].PDetune = xmlFreq.getPar_int ("detune" , VoicePar[nvoice].PDetune, 0, 16383); VoicePar[nvoice].PCoarseDetune= xmlFreq.getPar_int ("coarse_detune", VoicePar[nvoice].PCoarseDetune, 0, 16383); VoicePar[nvoice].PDetuneType = xmlFreq.getPar_127 ("detune_type" , VoicePar[nvoice].PDetuneType); VoicePar[nvoice].PFreqEnvelopeEnabled = xmlFreq.getPar_bool("freq_envelope_enabled", VoicePar[nvoice].PFreqEnvelopeEnabled); if (XMLtree xmlEnv = xmlFreq.getElm("FREQUENCY_ENVELOPE")) VoicePar[nvoice].FreqEnvelope->getfromXML(xmlEnv); else VoicePar[nvoice].FreqEnvelope->defaults(); VoicePar[nvoice].PFreqLfoEnabled = xmlFreq.getPar_bool("freq_lfo_enabled", VoicePar[nvoice].PFreqLfoEnabled); if (XMLtree xmlLFO = xmlFreq.getElm("FREQUENCY_LFO")) VoicePar[nvoice].FreqLfo->getfromXML(xmlLFO); else VoicePar[nvoice].FreqLfo->defaults(); } if (XMLtree xmlFilterParams = xmlVoice.getElm("FILTER_PARAMETERS")) { VoicePar[nvoice].PFilterVelocityScale = xmlFilterParams.getPar_127("velocity_sensing_amplitude", VoicePar[nvoice].PFilterVelocityScale); VoicePar[nvoice].PFilterVelocityScaleFunction = xmlFilterParams.getPar_127("velocity_sensing", VoicePar[nvoice].PFilterVelocityScaleFunction); if (XMLtree xmlFilter = xmlFilterParams.getElm("FILTER")) VoicePar[nvoice].VoiceFilter->getfromXML(xmlFilter); else VoicePar[nvoice].VoiceFilter->defaults(); VoicePar[nvoice].PFilterEnvelopeEnabled = xmlFilterParams.getPar_bool("filter_envelope_enabled", VoicePar[nvoice].PFilterEnvelopeEnabled); if (XMLtree xmlEnv = xmlFilterParams.getElm("FILTER_ENVELOPE")) VoicePar[nvoice].FilterEnvelope->getfromXML(xmlEnv); else VoicePar[nvoice].FilterEnvelope->defaults(); VoicePar[nvoice].PFilterLfoEnabled = xmlFilterParams.getPar_bool("filter_lfo_enabled", VoicePar[nvoice].PFilterLfoEnabled); if (XMLtree xmlLFO = xmlFilterParams.getElm("FILTER_LFO")) VoicePar[nvoice].FilterLfo->getfromXML(xmlLFO); else VoicePar[nvoice].FilterLfo->defaults(); } if (XMLtree xmlFM = xmlVoice.getElm("FM_PARAMETERS")) { VoicePar[nvoice].PFMVoice = xmlFM.getPar_int("input_voice", VoicePar[nvoice].PFMVoice, -1, nvoice - 1); VoicePar[nvoice].PFMVolume = xmlFM.getPar_127("volume" , VoicePar[nvoice].PFMVolume); VoicePar[nvoice].PFMVolumeDamp = xmlFM.getPar_127("volume_damp", VoicePar[nvoice].PFMVolumeDamp); VoicePar[nvoice].PFMVelocityScaleFunction = xmlFM.getPar_127("velocity_sensing", VoicePar[nvoice].PFMVelocityScaleFunction); VoicePar[nvoice].PFMAmpEnvelopeEnabled = xmlFM.getPar_bool("amp_envelope_enabled", VoicePar[nvoice].PFMAmpEnvelopeEnabled); if (XMLtree xmlEnv = xmlFM.getElm("AMPLITUDE_ENVELOPE")) VoicePar[nvoice].FMAmpEnvelope->getfromXML(xmlEnv); else VoicePar[nvoice].FMAmpEnvelope->defaults(); if (XMLtree xmlMod = xmlFM.getElm("MODULATOR")) { bool loadFMFreqParams = true; VoicePar[nvoice].PFMDetuneFromBaseOsc = xmlMod.getPar_bool("detune_from_base_osc", 127); if (VoicePar[nvoice].PFMDetuneFromBaseOsc == 127) { // In the past it was not possible to choose whether to include // detuning from the base oscillator. For local modulators it // was always enabled, for imported voice modulators it was // always disabled. To load old patches correctly, we apply this // old behaviour here if the XML element is missing from the // patch. New patches will always save one or the other. // // In a similar fashion, it was not possible to apply frequency // parameters to imported voice modulators in the past, however // it was possible to save them if you edited them before // switching to an imported voice. Now that frequency parameters // are respected, we need to ignore those parameters for old // instruments that saved them, but didn't use them, otherwise // the instrument will sound different. if (VoicePar[nvoice].PFMVoice >= 0) { VoicePar[nvoice].PFMDetuneFromBaseOsc = 0; loadFMFreqParams = false; // In the past the fixed frequency of the imported voice was // respected. Now, the fixed frequency of the modulator is // respected. So if we load an old patch, fetch that setting // from the imported voice. VoicePar[nvoice].PFMFixedFreq = VoicePar[VoicePar[nvoice].PFMVoice].Pfixedfreq; } else { VoicePar[nvoice].PFMDetuneFromBaseOsc = 1; } } if (loadFMFreqParams) { VoicePar[nvoice].PFMDetune = xmlMod.getPar_int("detune" , VoicePar[nvoice].PFMDetune , 0, 16383); VoicePar[nvoice].PFMCoarseDetune = xmlMod.getPar_int("coarse_detune", VoicePar[nvoice].PFMCoarseDetune, 0, 16383); VoicePar[nvoice].PFMDetuneType = xmlMod.getPar_127("detune_type" , VoicePar[nvoice].PFMDetuneType); VoicePar[nvoice].PFMFixedFreq = xmlMod.getPar_bool("fixed_freq" , VoicePar[nvoice].PFMFixedFreq); VoicePar[nvoice].PFMFreqEnvelopeEnabled = xmlMod.getPar_bool("freq_envelope_enabled", VoicePar[nvoice].PFMFreqEnvelopeEnabled); if (XMLtree xmlEnv = xmlMod.getElm("FREQUENCY_ENVELOPE")) VoicePar[nvoice].FMFreqEnvelope->getfromXML(xmlEnv); else VoicePar[nvoice].FMFreqEnvelope->defaults(); } if (XMLtree xmlOscil = xmlMod.getElm("OSCIL")) VoicePar[nvoice].POscilFM->getfromXML(xmlOscil); } } } float ADnoteParameters::getLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int engine = getData->data.engine; unsigned char type = 0; // addnote defaults int min = 0; float def = 0; int max = 127; type |= TOPLEVEL::type::Integer; unsigned char learnable = TOPLEVEL::type::Learnable; if (engine == PART::engine::addSynth) { switch (control) { case ADDSYNTH::control::volume: type |= learnable; def = 90; break; case ADDSYNTH::control::velocitySense: type |= learnable; def = 64; break; case ADDSYNTH::control::panning: type |= learnable; def = 64; break; case ADDSYNTH::control::enableRandomPan: max = 1; break; case ADDSYNTH::control::randomWidth: type |= learnable; def = 63; max = 63; break; case ADDSYNTH::control::detuneFrequency: type |= learnable; min = -8192; max = 8191; break; case ADDSYNTH::control::octave: type |= learnable; min = -8; max = 7; break; case ADDSYNTH::control::detuneType: min = 1; max = 4; break; case ADDSYNTH::control::coarseDetune: min = -64; max = 63; break; case ADDSYNTH::control::relativeBandwidth: type |= learnable; def = 64; break; case ADDSYNTH::control::stereo: type |= learnable; def = 1; max = 1; break; case ADDSYNTH::control::randomGroup: max = 1; break; case ADDSYNTH::control::dePop: type |= learnable; def = FADEIN_ADJUSTMENT_SCALE; break; case ADDSYNTH::control::punchStrength: type |= learnable; break; case ADDSYNTH::control::punchDuration: type |= learnable; def = 60; break; case ADDSYNTH::control::punchStretch: type |= learnable; def = 64; break; case ADDSYNTH::control::punchVelocity: type |= learnable; def = 72; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } switch (control) { case ADDVOICE::control::volume: type |= learnable; def = 100; break; case ADDVOICE::control::velocitySense: type |= learnable; def = 127; break; case ADDVOICE::control::panning: type |= learnable; def = 64; break; case ADDVOICE::control::enableRandomPan: max = 1; break; case ADDVOICE::control::randomWidth: def = 63; max = 63; break; case ADDVOICE::control::invertPhase: max = 1; break; case ADDVOICE::control::enableAmplitudeEnvelope: type |= learnable; max = 1; break; case ADDVOICE::control::enableAmplitudeLFO: type |= learnable; max = 1; break; case ADDVOICE::control::modulatorType: type |= learnable; max = 5; break; case ADDVOICE::control::externalModulator: min = -1; def = -1; max = 6; break; case ADDVOICE::control::externalOscillator: min = -1; def = -1; max = 6; break; case ADDVOICE::control::detuneFrequency: type |= learnable; min = -8192; max = 8191; break; case ADDVOICE::control::equalTemperVariation: type |= learnable; break; case ADDVOICE::control::baseFrequencyAs440Hz: max = 1; break; case ADDVOICE::control::octave: type |= learnable; min = -8; max = 7; break; case ADDVOICE::control::detuneType: max = 4; break; case ADDVOICE::control::coarseDetune: min = -64; max = 63; break; case ADDVOICE::control::pitchBendAdjustment: type |= learnable; def = 88; break; case ADDVOICE::control::pitchBendOffset: type |= learnable; def = 64; break; case ADDVOICE::control::enableFrequencyEnvelope: type |= learnable; max = 1; break; case ADDVOICE::control::enableFrequencyLFO: type |= learnable; max = 1; break; case ADDVOICE::control::unisonFrequencySpread: type |= learnable; def = 60; break; case ADDVOICE::control::unisonPhaseRandomise: type |= learnable; def = 127; break; case ADDVOICE::control::unisonStereoSpread: type |= learnable; def = 64; break; case ADDVOICE::control::unisonVibratoDepth: type |= learnable; def = 64; break; case ADDVOICE::control::unisonVibratoSpeed: type |= learnable; def = 64; break; case ADDVOICE::control::unisonSize: min = 2; def = 2; max = 50; break; case ADDVOICE::control::unisonPhaseInvert: max = 5; break; case ADDVOICE::control::enableUnison: type |= learnable; max = 1; break; case ADDVOICE::control::bypassGlobalFilter: max = 1; break; case ADDVOICE::control::enableFilter: type |= learnable; max = 1; break; case ADDVOICE::control::enableFilterEnvelope: type |= learnable; max = 1; break; case ADDVOICE::control::enableFilterLFO: type |= learnable; max = 1; break; case ADDVOICE::control::modulatorAmplitude: type |= learnable; def = 90; break; case ADDVOICE::control::modulatorVelocitySense: type |= learnable; def = 64; break; case ADDVOICE::control::modulatorHFdamping: type |= learnable; min = -64; max = 63; break; case ADDVOICE::control::enableModulatorAmplitudeEnvelope: type |= learnable; max = 1; break; case ADDVOICE::control::modulatorDetuneFrequency: type |= learnable; min = -8192; max = 8191; break; case ADDVOICE::control::modulatorDetuneFromBaseOsc: def = 1; max = 1; break; case ADDVOICE::control::modulatorFrequencyAs440Hz: max = 1; break; case ADDVOICE::control::modulatorOctave: type |= learnable; min = -8; max = 7; break; case ADDVOICE::control::modulatorDetuneType: max = 4; break; case ADDVOICE::control::modulatorCoarseDetune: min = -64; max = 63; break; case ADDVOICE::control::enableModulatorFrequencyEnvelope: type |= learnable; max = 1; break; case ADDVOICE::control::modulatorOscillatorPhase: type |= learnable; min = -64; max = 63; break; case ADDVOICE::control::modulatorOscillatorSource: min = -1; def = -1; max = 6; break; case ADDVOICE::control::delay: type |= learnable; break; case ADDVOICE::control::enableVoice: type |= learnable; if (engine == PART::engine::addVoice1) def = 1; max = 1; break; case ADDVOICE::control::enableResonance: def = 1; max = 1; break; case ADDVOICE::control::voiceOscillatorPhase: type |= learnable; min = -64; max = 63; break; case ADDVOICE::control::voiceOscillatorSource: min = -1; def = -1; max = 6; break; case ADDVOICE::control::soundType: max = 3; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Params/ADnoteParameters.h000066400000000000000000000210151506652756400207410ustar00rootroot00000000000000/* ADnoteParameters.h - Parameters for ADnote (ADsynth) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2018, Will Godfrey Copyright 2020-2023 Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef AD_NOTE_PARAMETERS_H #define AD_NOTE_PARAMETERS_H #include "globals.h" #include "Params/EnvelopeParams.h" #include "Params/OscilParameters.h" #include "Params/FilterParams.h" #include "Params/LFOParams.h" #include "Params/ParamCheck.h" #include "Synth/Resonance.h" #include "Synth/OscilGen.h" #include "DSP/FFTwrapper.h" enum FMTYPE { NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PW_MOD }; extern int ADnote_unison_sizes[]; class SynthEngine; class XMLtree; /*****************************************************************/ /* GLOBAL PARAMETERS */ /*****************************************************************/ struct ADnoteGlobalParam { bool PStereo; // Frequency global parameters ushort PDetune; // fine detune ushort PCoarseDetune; // coarse detune + octave uchar PDetuneType; // detune type uchar PBandwidth; // how much the relative fine detunes of the voices are changed EnvelopeParams* FreqEnvelope; // Frequency Envelope LFOParams* FreqLfo; // Frequency LFO // Amplitude global parameters char PPanning; // 1 - left, 64 - center, 127 - right bool PRandom; char PWidth; float pangainL; // derived from PPanning float pangainR; // ^ uchar PVolume; uchar PAmpVelocityScaleFunction; uchar PPunchStrength; uchar PPunchTime; uchar PPunchStretch; uchar PPunchVelocitySensing; EnvelopeParams* AmpEnvelope; LFOParams* AmpLfo; // Adjustment factor for anti-pop fadein uchar Fadein_adjustment; FilterParams* GlobalFilter; // Filter global parameters uchar PFilterVelocityScale; // Filter velocity sensing uchar PFilterVelocityScaleFunction; EnvelopeParams* FilterEnvelope; LFOParams* FilterLfo; Resonance* Reson; uchar Hrandgrouping; // how the randomness is applied to the harmonics // on more voices using the same oscillator }; struct ADnoteVoiceParam { // Voice parameters bool Enabled; uchar Unison_size; // How many subvoices are used in this voice uchar Unison_frequency_spread; // How subvoices are spread uchar Unison_phase_randomness; // How much phase randomisation uchar Unison_stereo_spread; // Stereo spread of the subvoices uchar Unison_vibrato; // Vibrato of the subvoices (which makes the unison more "natural") uchar Unison_vibrato_speed; // Medium speed of the vibrato of the subvoices uchar Unison_invert_phase; // Unison invert phase // 0 = none, 1 = random, 2 = 50%, 3 = 33%, 4 = 25% uchar Type; // Type of the voice 0 = Sound, 1 = Noise uchar PDelay; // Voice Delay bool Presonance; // this voice uses a resonance filter int Pextoscil; // What external oscil to use... int PextFMoscil; // -1 for internal POscil & POscilFM // it is not allowed that the externoscil, // externFMoscil => current voice uchar Poscilphase, PFMoscilphase; // oscillator phases bool Pfilterbypass; // filter bypass OscilParameters* POscil; OscilGen* OscilSmp; // Frequency parameters bool Pfixedfreq; // If the base frequency is fixed to 440 Hz uchar PfixedfreqET; // Equal temperate (this is used only if the // Pfixedfreq is enabled). If this parameter is 0, // the frequency is fixed (to 440 Hz); if this // parameter is 64, 1 MIDI halftone -> 1 frequency // halftone ushort PDetune; ushort PCoarseDetune; uchar PDetuneType; uchar PBendAdjust; // Pitch Bend uchar POffsetHz; bool PFreqEnvelopeEnabled; // Frequency Envelope EnvelopeParams *FreqEnvelope; bool PFreqLfoEnabled; // Frequency LFO LFOParams* FreqLfo; // Amplitude parameters uchar PPanning; // 1 - left, 64 - center, 127 - right // panning is ignored if the instrument is mono bool PRandom; char PWidth; float pangainL; // derived from PPanning float pangainR; // ^ uchar PVolume; uchar PVolumeminus; // reverse voice phase relative to others uchar PAmpVelocityScaleFunction; // Velocity sensing bool PAmpEnvelopeEnabled; // Amplitude Envelope EnvelopeParams *AmpEnvelope; bool PAmpLfoEnabled; // Amplitude LFO LFOParams* AmpLfo; // Filter parameters bool PFilterEnabled; // Voice Filter FilterParams* VoiceFilter; bool PFilterEnvelopeEnabled;// Filter Envelope EnvelopeParams* FilterEnvelope; bool PFilterLfoEnabled; // LFO Envelope LFOParams* FilterLfo; uchar PFilterVelocityScale; uchar PFilterVelocityScaleFunction; short PVoice; // Voice that I use as external oscillator. // It is -1 if I use POscil(default). // It may not be equal or bigger than current voice // Modulator parameters uchar PFMEnabled; // 0 = off, 1 = Morph, 2 = RM, 3 = PM, 4 = FM, 5 = PWM bool PFMringToSide; // allow carrier through short PFMVoice; // Voice that I use as modulator instead of POscilFM. // It is -1 if I use POscilFM(default). // It may not be equal or bigger than current voice OscilParameters* POscilFM; // Modulator oscillator OscilGen * FMSmp; uchar PFMVolume; // Modulator Volume uchar PFMVolumeDamp; // Modulator damping at higher frequencies uchar PFMVelocityScaleFunction; // Modulator Velocity Sensing uchar PFMDetuneFromBaseOsc; // Whether we inherit the base oscillator's detuning ushort PFMDetune; // Fine Detune of the Modulator ushort PFMCoarseDetune; // Coarse Detune of the Modulator uchar PFMDetuneType; // The detune type bool PFMFixedFreq; // FM base freq fixed at 440Hz bool PFMFreqEnvelopeEnabled; // Frequency Envelope of the Modulator EnvelopeParams* FMFreqEnvelope; bool PFMAmpEnvelopeEnabled; // Frequency Envelope of the Modulator EnvelopeParams* FMAmpEnvelope; }; class ADnoteParameters : public ParamBase { public: ADnoteParameters(fft::Calc&, SynthEngine&); ~ADnoteParameters() override; void defaults() override; void voiceDefaults(int n) {defaults(n);}; void add2XML(XMLtree&); void add2XML_voice(XMLtree&, const uint nvoice); void getfromXML(XMLtree&); void getfromXML_voice(XMLtree&, const uint nvoice); float getLimits(CommandBlock* getData); float getBandwidthDetuneMultiplier(); float getUnisonFrequencySpreadCents(int nvoice); void setGlobalPan(char pan, uchar panLaw); void setVoicePan(int voice, char pan, uchar panLaw); ADnoteGlobalParam GlobalPar; ADnoteVoiceParam VoicePar[NUM_VOICES]; static int ADnote_unison_sizes[15]; private: void defaults(const uint nvoice); void enableVoice(int nvoice); void killVoice(int nvoice); fft::Calc& fft; }; #endif yoshimi-2.3.5.1/src/Params/Controller.cpp000066400000000000000000000406471506652756400202350ustar00rootroot00000000000000/* Controller.cpp - (Midi) Controllers implementation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2018, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. Modified October 2018 */ #include #include #include "Misc/XMLStore.h" #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Params/Controller.h" using func::power; using func::powFrac; Controller::Controller(SynthEngine *_synth): synth(_synth) { defaults(); resetall(); } void Controller::defaults() { setpitchwheelbendrange(200); // 2 halftones expression.receive = 1; panning.depth = 64; filtercutoff.depth = 64; filterq.depth = 64; bandwidth.depth = 64; bandwidth.exponential = 0; modwheel.depth = 80; modwheel.exponential = 0; fmamp.receive = 1; volume.receive = 1; volume.data = 96; volume.volume = 96.0f/127.0f; sustain.receive = 1; portamentosetup(); resonancecenter.depth = 64; resonancebandwidth.depth = 64; initportamento(440.0f, 440.0f, false); setportamento(0); } void Controller::resetall() { setpitchwheelbendrange(200); // 2 halftones setpitchwheel(0); // center expression.receive = 1; setexpression(127); setPanDepth(64); filtercutoff.depth = 64; setfiltercutoff(64); filterq.depth = 64; setfilterq(64); bandwidth.depth = 64; bandwidth.exponential = 0; setbandwidth(64); modwheel.depth = 80; modwheel.exponential = 0; setmodwheel(64); fmamp.receive = 1; setfmamp(127); volume.receive = 1; volume.data = 96; volume.volume = 96.0f/127.0f; setvolume(96); sustain.receive = 1; setsustain(0); portamentosetup(); initportamento(440.0f, 440.0f, false); setportamento(0); resonancecenter.depth = 64; setresonancecenter(64); resonancebandwidth.depth = 64; setresonancebw(64); } void Controller::portamentosetup() { portamento.portamento = 0; portamento.used = 0; portamento.proportional = 0; portamento.propRate = 80; portamento.propDepth = 90; portamento.receive = 1; portamento.time = 64; portamento.updowntimestretch = 64; portamento.pitchthresh = 3; portamento.pitchthreshtype = 1; portamento.noteusing = -1; } void Controller::setpitchwheel(int value) { pitchwheel.data = value; float cents = value / 8192.0f; cents *= pitchwheel.bendrange; pitchwheel.relfreq = power<2>(cents / 1200.0f); // original comment //fprintf(stderr,"%ld %ld -> %.3f\n",pitchwheel.bendrange,pitchwheel.data,pitchwheel.relfreq);fflush(stderr); } void Controller::setpitchwheelbendrange(ushort value) { pitchwheel.bendrange = value; } void Controller::setexpression(int value) { expression.data = value; if (expression.receive && value >= 0 && value < 128) expression.relvolume = value / 127.0f; else expression.relvolume = 1.0f; } void Controller::setfiltercutoff(int value) { filtercutoff.data = value; filtercutoff.relfreq = (value - 64.0f) * filtercutoff.depth / 4096.0f * 3.321928f; // 3.3219.. = ln2(10) } void Controller::setfilterq(int value) { filterq.data = value; filterq.relq = power<30>((value - 64.0f) / 64.0f * (filterq.depth / 64.0f)); } void Controller::setbandwidth(int value) { bandwidth.data = value; if (!bandwidth.exponential) { float tmp = power<25>(powf(bandwidth.depth / 127.0f, 1.5f)) - 1.0f; if (value < 64 && bandwidth.depth >= 64) tmp = 1.0f; bandwidth.relbw = (value / 64.0f - 1.0f) * tmp + 1.0f; if (bandwidth.relbw < 0.01f) bandwidth.relbw = 0.01f; } else { bandwidth.relbw = power<25>((value - 64.0f) / 64.0f * (bandwidth.depth / 64.0f)); } } void Controller::setmodwheel(int value) { modwheel.data = value; if (!modwheel.exponential) { float tmp = power<25>(powf(modwheel.depth / 127.0f, 1.5f) * 2.0f) / 25.0f; if (value < 64 && modwheel.depth >= 64) tmp = 1.0f; modwheel.relmod = (value / 64.0f - 1.0f) * tmp + 1.0f; if (modwheel.relmod < 0.0f) modwheel.relmod = 0.0f; } else modwheel.relmod = power<25>((value - 64.0f) / 64.0f * (modwheel.depth / 80.0f)); } void Controller::setfmamp(int value) { fmamp.data = value; fmamp.relamp = value / 127.0f; if (fmamp.receive) fmamp.relamp = value / 127.0f; else fmamp.relamp = 1.0f; } void Controller::setvolume(int value) // range is 64 to 127 { if (value < 64) value = 96; // set invalid to default volume.data = value; volume.volume = value / 127.0f; } void Controller::setsustain(int value) { sustain.data = value; if (sustain.receive) sustain.sustain = (value < 64) ? 0 : 1; else sustain.sustain = 0; } void Controller::setportamento(int value) { portamento.data = value; if (portamento.receive) portamento.portamento = (value < 64) ? 0 : 1; } // returns true if portamento's preconditions are met bool Controller::initportamento(float oldfreq, float newfreq, bool in_progress) { portamento.x = 0.0f; if (in_progress) { // Legato in progress if (!portamento.portamento) return false; } else { // No legato, do the original if...return if (portamento.used != 0 || !portamento.portamento) return false; } float portamentotime = power<100>(portamento.time / 127.0f) / 50.0f; // portamento time in seconds if (portamento.proportional) { //If there is a min(float,float) and a max(float,float) then they //could be used here //Linear functors could also make this nicer if (oldfreq > newfreq) //2 is the center of propRate portamentotime *= powf(oldfreq / newfreq / (portamento.propRate / 127.0f * 3 + .05), (portamento.propDepth / 127.0f * 1.6f + .2)); else //1 is the center of propDepth portamentotime *= powf(newfreq / oldfreq / (portamento.propRate / 127.0f * 3 + .05), (portamento.propDepth / 127.0f * 1.6f + .2)); } if (portamento.updowntimestretch >= 64 && newfreq < oldfreq) { if (portamento.updowntimestretch == 127) return false; portamentotime *= powFrac<10>((portamento.updowntimestretch - 64) / 63.0f); } if (portamento.updowntimestretch < 64 && newfreq > oldfreq) { if (portamento.updowntimestretch == 0) return false; portamentotime *= powFrac<10>((64.0f - portamento.updowntimestretch) / 64.0f); } portamento.dx = synth->fixed_sample_step_f / portamentotime; portamento.origfreqrap = oldfreq / newfreq; float tmprap = (portamento.origfreqrap > 1.0f) ? portamento.origfreqrap : 1.0 / portamento.origfreqrap ; float thresholdrap = power<2>(portamento.pitchthresh / 12.0f); if (portamento.pitchthreshtype == 0 && (tmprap - 0.00001f) > thresholdrap) return false; if (portamento.pitchthreshtype == 1 && (tmprap + 0.00001f) < thresholdrap) return false; portamento.used = 1; portamento.freqrap = portamento.origfreqrap; return true; } void Controller::updateportamento() { if (portamento.used) { portamento.x += portamento.dx; if (portamento.x > 1.0f) { portamento.x = 1.0f; portamento.used = 0; } portamento.freqrap = (1.0f - portamento.x) * portamento.origfreqrap + portamento.x; } } void Controller::setresonancecenter(int value) { resonancecenter.data = value; resonancecenter.relcenter = power<3>((value - 64.0f) / 64.0f * (resonancecenter.depth / 64.0f)); } namespace { static const float LN_BASE1_5 = log(1.5); inline float power1_5(float exponent) { return expf(LN_BASE1_5 * exponent); } // 1.5^exponent } void Controller::setresonancebw(int value) { resonancebandwidth.data = value; resonancebandwidth.relbw = power1_5((value - 64.0f) / 64.0f * (resonancebandwidth.depth / 127.0f)); } void Controller::add2XML(XMLtree& xml) { xml.addPar_int("pitchwheel_bendrange", pitchwheel.bendrange); xml.addPar_bool("expression_receive" , expression.receive); xml.addPar_int ("panning_depth" , panning.depth); xml.addPar_int ("filter_cutoff_depth" , filtercutoff.depth); xml.addPar_int ("filter_q_depth" , filterq.depth); xml.addPar_int ("bandwidth_depth" , bandwidth.depth); xml.addPar_int ("mod_wheel_depth" , modwheel.depth); xml.addPar_bool("mod_wheel_exponential" , modwheel.exponential); xml.addPar_bool("fm_amp_receive" , fmamp.receive); xml.addPar_bool("volume_receive" , volume.receive); xml.addPar_int ("volume_range" , volume.data); xml.addPar_bool("sustain_receive" , sustain.receive); xml.addPar_bool("portamento_receive" , portamento.receive); xml.addPar_int ("portamento_time" , portamento.time); xml.addPar_int ("portamento_pitchthresh" , portamento.pitchthresh); xml.addPar_int ("portamento_pitchthreshtype" , portamento.pitchthreshtype); xml.addPar_int ("portamento_portamento" , portamento.portamento); xml.addPar_int ("portamento_updowntimestretch", portamento.updowntimestretch); xml.addPar_int ("portamento_proportional" , portamento.proportional); xml.addPar_int ("portamento_proprate" , portamento.propRate); xml.addPar_int ("portamento_propdepth" , portamento.propDepth); xml.addPar_int ("resonance_center_depth" , resonancecenter.depth); xml.addPar_int ("resonance_bandwidth_depth" , resonancebandwidth.depth); } void Controller::getfromXML(XMLtree& xml) { pitchwheel.bendrange= xml.getPar_int ("pitchwheel_bendrange",pitchwheel.bendrange,-6400,6400); expression.receive = xml.getPar_bool("expression_receive" ,expression.receive); panning.depth = xml.getPar_127 ("panning_depth" ,panning.depth); filtercutoff.depth = xml.getPar_127 ("filter_cutoff_depth" ,filtercutoff.depth); filterq.depth = xml.getPar_127 ("filter_q_depth" ,filterq.depth); bandwidth.depth = xml.getPar_127 ("bandwidth_depth" ,bandwidth.depth); modwheel.depth = xml.getPar_127 ("mod_wheel_depth" ,modwheel.depth); modwheel.exponential= xml.getPar_bool("mod_wheel_exponential",modwheel.exponential); fmamp.receive = xml.getPar_bool("fm_amp_receive" ,fmamp.receive); volume.receive = xml.getPar_bool("volume_receive" ,volume.receive); setvolume(xml.getPar_127("volume_range",volume.data)); sustain.receive = xml.getPar_bool("sustain_receive",sustain.receive); portamento.receive = xml.getPar_bool("portamento_receive" ,portamento.receive); portamento.time = xml.getPar_127("portamento_time" ,portamento.time); portamento.pitchthresh = xml.getPar_127("portamento_pitchthresh" ,portamento.pitchthresh); portamento.pitchthreshtype = xml.getPar_127("portamento_pitchthreshtype" ,portamento.pitchthreshtype); portamento.portamento = xml.getPar_127("portamento_portamento" ,portamento.portamento); portamento.updowntimestretch= xml.getPar_127("portamento_updowntimestretch",portamento.updowntimestretch); portamento.proportional = xml.getPar_127("portamento_proportional" ,portamento.proportional); portamento.propRate = xml.getPar_127("portamento_proprate" ,portamento.propRate); portamento.propDepth = xml.getPar_127("portamento_propdepth" ,portamento.propDepth); resonancecenter.depth = xml.getPar_127("resonance_center_depth" ,resonancecenter.depth); resonancebandwidth.depth = xml.getPar_127("resonance_bandwidth_depth",resonancebandwidth.depth); } float Controller::getLimits(CommandBlock *getData) { float value = getData->data.value; unsigned char type = getData->data.type; int request = type & TOPLEVEL::type::Default; int control = getData->data.control; // controller defaults int min = 0; float def = 64; int max = 127; type |= TOPLEVEL::type::Integer; unsigned char learnable = TOPLEVEL::type::Learnable; switch (control) { case PART::control::volumeRange: min = 64; def = 96; break; case PART::control::volumeEnable: def = 1; max = 1; break; case PART::control::panningWidth: type |= learnable; max = 64; break; case PART::control::modWheelDepth: def = 80; break; case PART::control::exponentialModWheel: def = 0; max = 1; break; case PART::control::bandwidthDepth: type |= learnable; break; case PART::control::exponentialBandwidth: def = 0; max = 1; break; case PART::control::expressionEnable: def = 1; max = 1; break; case PART::control::FMamplitudeEnable: def = 1; max = 1; break; case PART::control::sustainPedalEnable: def = 1; max = 1; break; case PART::control::pitchWheelRange: type |= learnable; min = -6400; def = 200; max = 6400; break; case PART::control::filterQdepth: break; case PART::control::filterCutoffDepth: break; case PART::control::breathControlEnable: max = 1; def = 1; break; case PART::control::resonanceCenterFrequencyDepth: break; case PART::control::resonanceBandwidthDepth: break; case PART::control::portamentoTime: type |= learnable; min = 0; break; case PART::control::portamentoTimeStretch: type |= learnable; break; case PART::control::portamentoThreshold: type |= learnable; def = 3; break; case PART::control::portamentoThresholdType: min = 0; max = 1; def = 1; break; case PART::control::enableProportionalPortamento: def = 0; max = 1; break; case PART::control::proportionalPortamentoRate: type |= learnable; def = 80; break; case PART::control::proportionalPortamentoDepth: type |= learnable; def = 90; break; case PART::control::receivePortamento: def = 1; max = 1; break; case PART::control::resetAllControllers: def = 0; max = 0; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Params/Controller.h000066400000000000000000000112121506652756400176640ustar00rootroot00000000000000/* Controller.h - (Midi) Controllers implementation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2017-2018, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. Modified February 2018 */ #ifndef CONTROLLER_H #define CONTROLLER_H class SynthEngine; class XMLtree; class Controller { public: ~Controller() = default; Controller(SynthEngine* _synth); void resetall(); void defaults(); void add2XML(XMLtree&); void getfromXML(XMLtree&); // Controllers functions void setpitchwheel(int value); void setpitchwheelbendrange(ushort value); void setexpression(int value); void setfiltercutoff(int value); void setfilterq(int value); void setbandwidth(int value); void setmodwheel(int value); void setfmamp(int value); void setvolume(int value); void setsustain(int value); void setportamento(int value); void portamentosetup(); void setresonancecenter(int value); void setresonancebw(int value); void setPanDepth(char par) { panning.depth = par;} bool initportamento(float oldfreq, float newfreq, bool in_progress); // returns true if portamento's preconditions are met void updateportamento(); // update portamento values float getLimits(CommandBlock* getData); // Controllers values struct { // Pitch Wheel int data; short bendrange; // bendrange is in cents float relfreq; // the relative frequency (default is 1.0) } pitchwheel; struct { // Expression int data; float relvolume; uchar receive; } expression; struct { // Panning int data; char depth; } panning; struct { // Filter cutoff int data; float relfreq; uchar depth; } filtercutoff; struct { // Filter Q int data; float relq; uchar depth; } filterq; struct { // Bandwidth int data; float relbw; uchar depth; uchar exponential; } bandwidth; struct { // Modulation Wheel int data; float relmod; uchar depth; uchar exponential; } modwheel; struct { // FM amplitude int data; float relamp; uchar receive; } fmamp; struct { // Volume int data; float volume; uchar receive; } volume; struct { // Sustain int data; int sustain; uchar receive; } sustain; struct { // Portamento // parameters int data; uchar portamento; uchar receive; uchar time; uchar proportional; uchar propRate; uchar propDepth; uchar pitchthresh; uchar pitchthreshtype; uchar updowntimestretch; float freqrap; int noteusing; int used; // internal data float x; // x is from 0.0 (start portamento) to 1.0 (finished portamento), float dx; // dx is x increment float origfreqrap; // this is used for computing oldfreq value from x } portamento; struct { // Resonance Center Frequency int data; float relcenter; uchar depth; } resonancecenter; struct { // Resonance Bandwidth int data; float relbw; uchar depth; } resonancebandwidth; private: SynthEngine* synth; }; #endif /*CONTROLLER_H*/ yoshimi-2.3.5.1/src/Params/EnvelopeParams.cpp000066400000000000000000000514321506652756400210250ustar00rootroot00000000000000/* EnvelopeParams.cpp Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2019-2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include #include #include #include #include "Params/EnvelopeParams.h" #include "Misc/NumericFuncs.h" #include "Misc/SynthEngine.h" #include "Misc/XMLStore.h" using func::power; EnvelopeParams::EnvelopeParams(uchar Penvstretch_, uchar Pforcedrelease_, SynthEngine& _synth) : ParamBase(_synth), Pfreemode{true}, Penvpoints(1), Penvsustain(1), Penvstretch(Penvstretch_), Pforcedrelease(Pforcedrelease_), Plinearenvelope(0), Envmode(PART::envelope::groupmode::amplitudeLin) { int i; PA_dt = 10; PD_dt = 10; PR_dt = 10; PA_val = 64; PD_val = 64; PS_val = 64; PR_val = 64; for (i = 0; i < MAX_ENVELOPE_POINTS; ++i) { Penvdt[i] = 32; Penvval[i] = 64; } Penvdt[0] = 0; // not used store2defaults(); } float EnvelopeParams::getdt(size_t i) { float result = (power<2>(Penvdt[i] / 127.0f * 12.0f) - 1.0f) * 10.0f; // milliseconds return result; } // ADSR/ASR... initialisations void EnvelopeParams::ADSRinit(float A_dt, float D_dt, float S_val, float R_dt) { Envmode = PART::envelope::groupmode::amplitudeLin; PA_dt = A_dt; PD_dt = D_dt; PS_val = S_val; PR_dt = R_dt; Pfreemode = false; converttofree(); store2defaults(); } void EnvelopeParams::ADSRinit_dB(float A_dt, float D_dt, float S_val, float R_dt) { Envmode = PART::envelope::groupmode::amplitudeLog; PA_dt = A_dt; PD_dt = D_dt; PS_val = S_val; PR_dt = R_dt; Pfreemode = false; converttofree(); store2defaults(); } void EnvelopeParams::ASRinit(float A_val, float A_dt, float R_val, float R_dt) { Envmode = PART::envelope::groupmode::frequency; PA_val = A_val; PA_dt = A_dt; PR_val = R_val; PR_dt = R_dt; Pfreemode = ENVSWITCH::defFreeMode; converttofree(); store2defaults(); } void EnvelopeParams::ADSRinit_filter(float A_val, float A_dt, float D_val, float D_dt, float R_dt, float R_val) { Envmode = PART::envelope::groupmode::filter; PA_val = A_val; PA_dt = A_dt; PD_val = D_val; PD_dt = D_dt; PR_dt = R_dt; PR_val = R_val; Pfreemode = ENVSWITCH::defFreeMode; converttofree(); store2defaults(); } void EnvelopeParams::ASRinit_bw(float A_val, float A_dt, float R_val, float R_dt) { Envmode = PART::envelope::groupmode::bandwidth; PA_val = A_val; PA_dt = A_dt; PR_val = R_val; PR_dt = R_dt; Pfreemode = ENVSWITCH::defFreeMode; converttofree(); store2defaults(); } // Convert the Envelope to freemode void EnvelopeParams::converttofree() { switch (Envmode) { case PART::envelope::groupmode::amplitudeLin: Penvpoints = ENVDEF::count.def; Penvsustain = ENVDEF::point.def; Penvval[0] = 0; Penvdt[1] = PA_dt; Penvval[1] = 127; Penvdt[2] = PD_dt; Penvval[2] = PS_val; Penvdt[3] = PR_dt; Penvval[3] = 0; break; case PART::envelope::groupmode::amplitudeLog: Penvpoints = ENVDEF::count.def; Penvsustain = ENVDEF::point.def; Penvval[0] = 0; Penvdt[1] = PA_dt; Penvval[1] = 127; Penvdt[2] = PD_dt; Penvval[2] = PS_val; Penvdt[3] = PR_dt; Penvval[3] = 0; break; case PART::envelope::groupmode::frequency: Penvpoints = ENVDEF::freqCount.def; Penvsustain = ENVDEF::freqPoint.def; Penvval[0] = PA_val; Penvdt[1] = PA_dt; Penvval[1] = 64; Penvdt[2] = PR_dt; Penvval[2] = PR_val; break; case PART::envelope::groupmode::filter: Penvpoints = ENVDEF::count.def; Penvsustain = ENVDEF::point.def; Penvval[0] = PA_val; Penvdt[1] = PA_dt; Penvval[1] = PD_val; Penvdt[2] = PD_dt; Penvval[2] = 64; Penvdt[3] = PR_dt; Penvval[3] = PR_val; break; case PART::envelope::groupmode::bandwidth: Penvpoints = ENVDEF::bandCount.def; Penvsustain = ENVDEF::bandPoint.def; Penvval[0] = PA_val; Penvdt[1] = PA_dt; Penvval[1] = 64; Penvdt[2] = PR_dt; Penvval[2] = PR_val; break; } } void EnvelopeParams::add2XML(XMLtree& xmlEnv) { xmlEnv.addPar_bool("free_mode" , Pfreemode); xmlEnv.addPar_int ("env_points" , Penvpoints); xmlEnv.addPar_int ("env_sustain" , Penvsustain); xmlEnv.addPar_int ("env_stretch" , Penvstretch); xmlEnv.addPar_bool("forced_release" , Pforcedrelease); xmlEnv.addPar_bool("linear_envelope", Plinearenvelope); xmlEnv.addPar_frac("A_dt" , PA_dt); xmlEnv.addPar_frac("D_dt" , PD_dt); xmlEnv.addPar_frac("R_dt" , PR_dt); xmlEnv.addPar_frac("A_val", PA_val); xmlEnv.addPar_frac("D_val", PD_val); xmlEnv.addPar_frac("S_val", PS_val); xmlEnv.addPar_frac("R_val", PR_val); if (Pfreemode or synth.getRuntime().xmlmax) { for (uint i=0; i 0) xmlPt.addPar_frac("dt",Penvdt[i]); xmlPt.addPar_frac("val", Penvval[i]); } } } void EnvelopeParams::getfromXML(XMLtree& xmlEnv) { assert(xmlEnv); Pfreemode = xmlEnv.getPar_bool("free_mode" , Pfreemode); Penvpoints = xmlEnv.getPar_127 ("env_points" , Penvpoints); Penvsustain = xmlEnv.getPar_127 ("env_sustain" , Penvsustain); Penvstretch = xmlEnv.getPar_127 ("env_stretch" , Penvstretch); Pforcedrelease = xmlEnv.getPar_bool("forced_release" , Pforcedrelease); Plinearenvelope = xmlEnv.getPar_bool("linear_envelope", Plinearenvelope); PA_dt = xmlEnv.getPar_frac("A_dt" , PA_dt , 0,127); PD_dt = xmlEnv.getPar_frac("D_dt" , PD_dt , 0,127); PR_dt = xmlEnv.getPar_frac("R_dt" , PR_dt , 0,127); PA_val = xmlEnv.getPar_frac("A_val", PA_val, 0,127); PD_val = xmlEnv.getPar_frac("D_val", PD_val, 0,127); PS_val = xmlEnv.getPar_frac("S_val", PS_val, 0,127); PR_val = xmlEnv.getPar_frac("R_val", PR_val, 0,127); for (uint i=0; i 0) Penvdt[i] = xmlPt.getPar_frac("dt" ,Penvdt[i] , 0,127); Penvval[i] = xmlPt.getPar_frac("val",Penvval[i], 0,127); } if (not Pfreemode) converttofree(); } void EnvelopeParams::defaults() { Penvstretch = Denvstretch; Pforcedrelease = Dforcedrelease; Plinearenvelope = Dlinearenvelope; PA_dt = DA_dt; PD_dt = DD_dt; PR_dt = DR_dt; PA_val = DA_val; PD_val = DD_val; PS_val = DS_val; PR_val = DR_val; Pfreemode = false; converttofree(); } void EnvelopeParams::store2defaults() { Denvstretch = Penvstretch; Dforcedrelease = Pforcedrelease; Dlinearenvelope = Plinearenvelope; DA_dt = PA_dt; DD_dt = PD_dt; DR_dt = PR_dt; DA_val = PA_val; DD_val = PD_val; DS_val = PS_val; DR_val = PR_val; } float envelopeLimit::getEnvelopeLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int engine = getData->data.engine; if (engine >= PART::engine::addMod1 && engine < PART::engine::addVoiceModEnd) engine = PART::engine::addMod1; else if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1) engine = PART::engine::addVoice1; int parameter = getData->data.parameter; int insert = getData->data.insert; unsigned char type = 0; // envelope defaults int min = 0; int max = 127; float def = 64; unsigned char learnable = TOPLEVEL::type::Learnable; type |= learnable; switch (insert) { case TOPLEVEL::insert::envelopeGroup: if (control == ENVELOPEINSERT::control::enableFreeMode || control == ENVELOPEINSERT::control::edit) { max = 1; type &= ~learnable; def = 0; } switch (parameter) { case TOPLEVEL::insertType::amplitude: { switch (control) { case ENVELOPEINSERT::control::attackTime: if (engine == PART::engine::addMod1) def = ENVDEF::modAmpAttackTime.def; else def = ENVDEF::ampAttackTime.def; break; case ENVELOPEINSERT::control::decayTime: if (engine == PART::engine::addVoice1) def = ENVDEF::voiceAmpDecayTime.def; else if (engine == PART::engine::addMod1) def = ENVDEF::modAmpDecayTime.def; else def = ENVDEF::ampDecayTime.def; break; case ENVELOPEINSERT::control::sustainLevel: def = ENVDEF::ampSustainValue.def; break; case ENVELOPEINSERT::control::releaseTime: if (engine == PART::engine::addVoice1) def = ENVDEF::voiceAmpReleaseTime.def; else if (engine == PART::engine::addMod1) def = ENVDEF::modAmpReleaseTime.def; else def = ENVDEF::ampReleaseTime.def; break; case ENVELOPEINSERT::control::stretch: def = ENVDEF::ampStretch.def; break; case ENVELOPEINSERT::control::forcedRelease: type |= TOPLEVEL::type::Integer; def = ENVSWITCH::defForce; type &= ~learnable; break; case ENVELOPEINSERT::control::linearEnvelope: type |= TOPLEVEL::type::Integer; max = 1; def = ENVSWITCH::defLinear; type &= ~learnable; break; //case ENVELOPEINSERT::control::edit: //break; case ENVELOPEINSERT::control::enableFreeMode: type |= TOPLEVEL::type::Integer; def = ENVSWITCH::defFreeMode; break; case ENVELOPEINSERT::control::points: type |= TOPLEVEL::type::Integer; def = ENVDEF::count.def; break; case ENVELOPEINSERT::control::sustainPoint: type &= ~learnable; def = ENVDEF::point.def; break; default: type |= TOPLEVEL::type::Error; break; } break; } case TOPLEVEL::insertType::frequency: { switch (control) { case ENVELOPEINSERT::control::attackLevel: if (engine == PART::engine::addMod1) def = ENVDEF::modFreqAtValue.def; else if (engine == PART::engine::addVoice1) def = ENVDEF::voiceFreqAtValue.def; else if (engine == PART::engine::subSynth) def = ENVDEF::subFreqAtValue.def; else def = ENVDEF::freqAttackValue.def; break; case ENVELOPEINSERT::control::attackTime: if (engine == PART::engine::addMod1) def = ENVDEF::modFreqAtTime.def; else if (engine == PART::engine::addVoice1) def = ENVDEF::voiceFreqAtTime.def; else def = ENVDEF::freqAttackTime.def; break; case ENVELOPEINSERT::control::releaseTime: if (engine == PART::engine::addMod1) def = ENVDEF::modFreqReleaseTime.def; else def = ENVDEF::freqReleaseTime.def; break; case ENVELOPEINSERT::control::releaseLevel: if (engine == PART::engine::addMod1) def = ENVDEF::modFreqReleaseValue.def; else def = ENVDEF::freqReleaseValue.def; break; case ENVELOPEINSERT::control::stretch: if (engine == PART::engine::subSynth) def = ENVDEF::subFreqStretch.def; else def = ENVDEF::freqStretch.def; break; case ENVELOPEINSERT::control::forcedRelease: max = 1; def = ENVSWITCH::defForceFreq; type &= ~learnable; break; //case ENVELOPEINSERT::control::edit: //break; case ENVELOPEINSERT::control::enableFreeMode: def = ENVSWITCH::defFreeMode; break; case ENVELOPEINSERT::control::points: def = ENVDEF::freqCount.def; break; case ENVELOPEINSERT::control::sustainPoint: type &= ~learnable; def = ENVDEF::freqPoint.def; break; default: type |= TOPLEVEL::type::Error; break; } break; } case TOPLEVEL::insertType::filter: { switch (control) { case ENVELOPEINSERT::control::attackLevel: if (engine == PART::engine::addVoice1) def = ENVDEF::voiceFiltAtValue.def; else def = ENVDEF::filtAttackValue.def; break; case ENVELOPEINSERT::control::attackTime: if (engine == PART::engine::addVoice1) def = ENVDEF::voiceFiltAtTime.def; else def = ENVDEF::filtAttackTime.def; break; case ENVELOPEINSERT::control::decayLevel: if (engine == PART::engine::addVoice1) def = ENVDEF::voiceFiltDeValue.def; else def = ENVDEF::filtDecayValue.def; break; case ENVELOPEINSERT::control::decayTime: def = ENVDEF::filtDecayTime.def; break; case ENVELOPEINSERT::control::releaseTime: if (engine == PART::engine::addVoice1) def = ENVDEF::voiceFiltRelTime.def; else def = ENVDEF::filtReleaseTime.def; break; case ENVELOPEINSERT::control::releaseLevel: if (engine == PART::engine::addVoice1) def = ENVDEF::voiceFiltRelValue.def; else def = ENVDEF::filtReleaseValue.def; break; case ENVELOPEINSERT::control::stretch: def = ENVDEF::filtStretch.def; break; case ENVELOPEINSERT::control::forcedRelease: max = 1; if (engine == PART::engine::addVoice1) def = ENVSWITCH::defForceVoiceFilt; else def = ENVSWITCH::defForce; type &= ~learnable; break; //case ENVELOPEINSERT::control::edit: //break; case ENVELOPEINSERT::control::enableFreeMode: def = ENVSWITCH::defFreeMode; break; case ENVELOPEINSERT::control::points: def = ENVDEF::count.def; break; case ENVELOPEINSERT::control::sustainPoint: type &= ~learnable; def = ENVDEF::point.def; break; default: type |= TOPLEVEL::type::Error; break; } break; } case TOPLEVEL::insertType::bandwidth: { if (engine != PART::engine::subSynth) { type |= TOPLEVEL::type::Error; return 1; } switch (control) { case ENVELOPEINSERT::control::attackLevel: def = ENVDEF::subBandAttackValue.def; break; case ENVELOPEINSERT::control::attackTime: def = ENVDEF::subBandAttackTime.def; break; case ENVELOPEINSERT::control::releaseTime: def = ENVDEF::subBandReleaseTime.def; break; case ENVELOPEINSERT::control::releaseLevel: def = ENVDEF::subBandReleaseValue.def; break; case ENVELOPEINSERT::control::stretch: def = ENVDEF::subBandStretch.def; break; case ENVELOPEINSERT::control::forcedRelease: max = 1; def = ENVSWITCH::defForceBand; type &= ~learnable; break; //case ENVELOPEINSERT::control::edit: //break; case ENVELOPEINSERT::control::enableFreeMode: def = ENVSWITCH::defFreeMode; break; case ENVELOPEINSERT::control::points: def = ENVDEF::bandCount.def; break; case ENVELOPEINSERT::control::sustainPoint: def = ENVDEF::bandPoint.def; break; default: type |= TOPLEVEL::type::Error; break; } break; } } break; case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: break; case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: // temporary solution :( min = 1; max = 1; def = 1; type &= ~learnable; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Params/EnvelopeParams.h000066400000000000000000000145761506652756400205020ustar00rootroot00000000000000/* EnvelopeParams.h - Parameters for Envelope Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018, 2023 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef ENVELOPE_PARAMS_H #define ENVELOPE_PARAMS_H #include "globals.h" #include "Params/ParamCheck.h" class SynthEngine; class XMLtree; class EnvelopeParams : public ParamBase { public: EnvelopeParams(uchar Penvstretch_, uchar Pforcedrelease_, SynthEngine&); void defaults() override; void ADSRinit(float A_dt, float D_dt, float S_val, float R_dt); void ADSRinit_dB(float A_dt, float D_dt, float S_val, float R_dt); void ASRinit(float A_val, float A_dt, float R_val, float R_dt); void ADSRinit_filter(float A_val, float A_dt, float D_val, float D_dt, float R_dt, float R_val); void ASRinit_bw(float A_val, float A_dt, float R_val, float R_dt); void converttofree(); void add2XML(XMLtree&); void getfromXML(XMLtree&); float getdt(size_t i); // MIDI Parameters bool Pfreemode; // arbitrary envelope allowed (false for ADSR or ASR mode) size_t Penvpoints; // stays < MAX_ENVELOPE_POINTS size_t Penvsustain; // 0 means disabled -- see Envelope::envout() float Penvdt[MAX_ENVELOPE_POINTS]; float Penvval[MAX_ENVELOPE_POINTS]; uchar Penvstretch; // 64=normal stretch (piano-like), 0=no stretch uchar Pforcedrelease; // 0 - OFF, 1 - ON uchar Plinearenvelope; // if the amplitude envelope is linear float PA_dt, PD_dt, PR_dt, PA_val, PD_val, PS_val, PR_val; int Envmode; // 1 for ADSR parameters (linear amplitude) // 2 for ADSR_dB parameters (dB amplitude) // 3 for ASR parameters (frequency LFO) // 4 for ADSR_filter parameters (filter parameters) // 5 for ASR_bw parameters (bandwidth parameters) private: void store2defaults(); // Default parameters uchar Denvstretch; uchar Dforcedrelease; uchar Dlinearenvelope; float DA_dt, DD_dt, DR_dt, DA_val, DD_val, DS_val, DR_val; }; class envelopeLimit { public: float getEnvelopeLimits(CommandBlock *getData); }; struct ENVminmax{ float min; float max; float def; bool learn; bool integer; }; namespace ENVDEF{ const ENVminmax ampAttackTime {0,127,0 ,true,false}; const ENVminmax modAmpAttackTime {0,127,80 ,true,false}; const ENVminmax ampDecayTime {0,127,40 ,true,false}; const ENVminmax voiceAmpDecayTime {0,127,100,true,false}; const ENVminmax modAmpDecayTime {0,127,90,true,false}; const ENVminmax ampSustainValue {0,127,127,true,false}; const ENVminmax ampReleaseTime {0,127,25,true,false}; const ENVminmax voiceAmpReleaseTime {0,127,100,true,false}; const ENVminmax modAmpReleaseTime {0,127,100,true,false}; const ENVminmax ampStretch {0,127,64 ,true,true}; const ENVminmax freqAttackValue {0,127,64,true,false}; const ENVminmax voiceFreqAtValue {0,127,30,true,false}; const ENVminmax modFreqAtValue {0,127,20,true,false}; const ENVminmax subFreqAtValue {0,127,30,true,false}; const ENVminmax freqAttackTime {0,127,50,true,false}; const ENVminmax voiceFreqAtTime {0,127,40,true,false}; const ENVminmax modFreqAtTime {0,127,90,true,false}; const ENVminmax freqReleaseTime {0,127,60,true,false}; const ENVminmax modFreqReleaseTime {0,127,80,true,false}; const ENVminmax freqReleaseValue {0,127,64,true,false}; const ENVminmax modFreqReleaseValue {0,127,40,true,false}; const ENVminmax freqStretch {0,127,0,true,true}; const ENVminmax subFreqStretch {0,127,64,true,true}; const ENVminmax subBandAttackValue {0,127,100,true,false}; const ENVminmax subBandAttackTime {0,127,70,true,false}; const ENVminmax subBandReleaseTime {0,127,60,true,false}; const ENVminmax subBandReleaseValue {0,127,64,true,false}; const ENVminmax subBandStretch {0,127,64,true,false}; const ENVminmax filtAttackValue {0,127,64,true,false}; const ENVminmax voiceFiltAtValue {0,127,90,true,false}; const ENVminmax filtAttackTime {0,127,40,true,false}; const ENVminmax voiceFiltAtTime {0,127,70,true,false}; const ENVminmax filtDecayValue {0,127,64,true,false}; const ENVminmax voiceFiltDeValue {0,127,40,true,false}; const ENVminmax filtDecayTime {0,127,70,true,false}; const ENVminmax filtReleaseTime {0,127,60,true,false}; const ENVminmax voiceFiltRelTime {0,127,10,true,false}; const ENVminmax filtReleaseValue {0,127,64,true,false}; const ENVminmax voiceFiltRelValue {0,127,40,true,false}; const ENVminmax filtStretch {0,127,0,true,true}; const ENVminmax point {0,MAX_ENVELOPE_POINTS-1,2,false,true}; const ENVminmax freqPoint {0,MAX_ENVELOPE_POINTS-1,1,false,true}; const ENVminmax bandPoint {0,MAX_ENVELOPE_POINTS-1,1,false,true}; const ENVminmax count {0,MAX_ENVELOPE_POINTS-1,4,false,true}; const ENVminmax freqCount {0,MAX_ENVELOPE_POINTS-1,3,false,true}; const ENVminmax bandCount {0,MAX_ENVELOPE_POINTS-1,3,false,true}; } namespace ENVSWITCH{ const bool defLinear = false; const bool defForce = true; const bool defForceVoiceFilt = false; const bool defForceFreq = false; const bool defForceBand = false; const bool defFreeMode = false; } #endif yoshimi-2.3.5.1/src/Params/FilterParams.cpp000066400000000000000000000515631506652756400205020ustar00rootroot00000000000000/* FilterParams.cpp - Parameters for filter Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2019-2023, Will Godfrey Copyringt 2024 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include "Misc/XMLStore.h" #include "Misc/SynthEngine.h" #include "Misc/NumericFuncs.h" #include "Params/FilterParams.h" using func::asDecibel; using func::power; FilterParams::FilterParams(uchar Ptype_, float Pfreq_, float Pq_, uchar Pfreqtrackoffset_, SynthEngine& _synth) : ParamBase{_synth} , changed{false} , Dtype{Ptype_} , Dfreq{Pfreq_} , Dq{Pq_} , Dfreqtrackoffset{Pfreqtrackoffset_} { defaults(); } void FilterParams::defaults() { Ptype = Dtype; Pfreq = Dfreq; Pq = Dq; Pstages = FILTDEF::stages.def; Pfreqtrack = FILTDEF::freqTrack.def; Pfreqtrackoffset = Dfreqtrackoffset; Pgain = FILTDEF::gain.def; Pcategory = FILTDEF::category.def; Pnumformants = FILTDEF::formCount.def; Pformantslowness = FILTDEF::formSpeed.def; for (int j = 0; j < FF_MAX_VOWELS; ++j) defaults(j); Psequencesize = FILTDEF::sequenceSize.def; for (int i = 0; i < FF_MAX_SEQUENCE; ++i) Psequence[i].nvowel = i % FF_MAX_VOWELS; Psequencestretch = FILTDEF::formStretch.def; Psequencereversed = FILTSWITCH::sequenceReverse; Pcenterfreq = FILTDEF::formCentre.def; // 1 kHz Poctavesfreq = FILTDEF::formOctave.def; Pvowelclearness = FILTDEF::formClear.def; } void FilterParams::defaults(int n) { int j = n; for (int i = 0; i < FF_MAX_FORMANTS; ++i) { Pvowels[j].formants[i].freq = synth.randomINT() >> 24; // some random freqs Pvowels[j].formants[i].firstF = Pvowels[j].formants[i].freq; // the only time we set this Pvowels[j].formants[i].q = FILTDEF::formQ.def; Pvowels[j].formants[i].amp = FILTDEF::formAmp.def; } } // Get the parameters from other FilterParams void FilterParams::getfromFilterParams(FilterParams *pars) { defaults(); if (pars == NULL) return; Ptype = pars->Ptype; Pfreq = pars->Pfreq; Pq = pars->Pq; Pstages = pars->Pstages; Pfreqtrack = pars->Pfreqtrack; Pgain = pars->Pgain; Pcategory = pars->Pcategory; Pnumformants = pars->Pnumformants; Pformantslowness = pars->Pformantslowness; for (int j = 0; j < FF_MAX_VOWELS; ++j) { for (int i = 0; i < FF_MAX_FORMANTS; ++i) { Pvowels[j].formants[i].freq = pars->Pvowels[j].formants[i].freq; Pvowels[j].formants[i].q = pars->Pvowels[j].formants[i].q; Pvowels[j].formants[i].amp = pars->Pvowels[j].formants[i].amp; } } Psequencesize = pars->Psequencesize; for (int i = 0; i < FF_MAX_SEQUENCE; ++i) Psequence[i].nvowel = pars->Psequence[i].nvowel; Psequencestretch = pars->Psequencestretch; Psequencereversed = pars->Psequencereversed; Pcenterfreq = pars->Pcenterfreq; Poctavesfreq = pars->Poctavesfreq; Pvowelclearness = pars->Pvowelclearness; } // Parameter control float FilterParams::getfreq() { return (Pfreq / 64.0f - 1.0f) * 5.0f; } float FilterParams::getq() { return expf(powf(Pq / 127.0f, 2.0f) * logf(1000.0f)) - 0.9f; } float FilterParams::getfreqtracking(float notefreq) { if (Pfreqtrackoffset != FILTSWITCH::trackRange) { // In this setting freq.tracking's range is: 0% to 198% // 100% for value 64 return logf(notefreq / 440.0f) * Pfreqtrack / (64.0f * LOG_2); } else { // In this original setting freq.tracking's range is: -100% to +98% // It does not reach up to 100% because the maximum value of // Pfreqtrack is 127. Pfreqtrack==128 would give 100% return logf(notefreq / 440.0f) * (Pfreqtrack - 64.0f) / (64.0f * LOG_2); } } float FilterParams::getgain() { return (Pgain / 64.0f - 1.0f) * 30.0f; // -30..30dB } // Get the center frequency of the formant's graph float FilterParams::getcenterfreq() { return 10000.0f * power<10>(-(1.0f - Pcenterfreq / FILTDEF::formCentre.max) * 2.0f); } // Get the number of octave that the formant functions applies to float FilterParams::getoctavesfreq() { return 0.25f + 10.0f * Poctavesfreq / FILTDEF::formOctave.max; } // Get the frequency from x, where x is [0..1] float FilterParams::getfreqx(float x) { if (x > 1.0f) x = 1.0f; float octf = power<2>(getoctavesfreq()); return getcenterfreq() / sqrtf(octf) * powf(octf, x); } // Get the x coordinate from frequency (used by the UI) float FilterParams::getfreqpos(float freq) { return (logf(freq) - logf(getfreqx(0.0f))) / logf(2.0f) / getoctavesfreq(); } // Get the freq. response of the formant filter void FilterParams::formantfilterH(int nvowel, int nfreqs, float *freqs) { float c[3], d[3]; float filter_freq, filter_q, filter_amp; float omega, sn, cs, alpha; for (int i = 0; i < nfreqs; ++i) freqs[i] = 0.0; // for each formant... for (int nformant = 0; nformant < Pnumformants; ++nformant) { // compute formant parameters(frequency,amplitude,etc.) filter_freq = getformantfreq(Pvowels[nvowel].formants[nformant].freq); filter_q = getformantq(Pvowels[nvowel].formants[nformant].q) * getq(); if (Pstages > 0) filter_q = (filter_q > 1.0) ? powf(filter_q, (1.0f / (Pstages + 1))) : filter_q; filter_amp = getformantamp(Pvowels[nvowel].formants[nformant].amp); if (filter_freq <= (synth.halfsamplerate_f - 100.0f)) { omega = TWOPI * filter_freq / synth.samplerate_f; sn = sinf(omega); cs = cosf(omega); alpha = sn / (2 * filter_q); float tmp = 1 + alpha; c[0] = alpha / tmp * sqrtf(filter_q + 1); c[1] = 0; c[2] = -alpha / tmp * sqrtf(filter_q + 1); d[1] = -2.0f * cs / tmp * (-1); d[2] = (1 - alpha) / tmp * (-1); } else continue; for (int i = 0; i < nfreqs; ++i) { float freq = getfreqx(i / (float)nfreqs); if (freq > synth.halfsamplerate_f) { for (int tmp = i; tmp < nfreqs; ++tmp) freqs[tmp] = 0.0f; break; } float fr = freq / synth.samplerate_f * TWOPI; float x = c[0], y = 0.0f; for (int n = 1; n < 3; ++n) { x += cosf(n * fr) * c[n]; y -= sinf(n * fr) * c[n]; } float h = x * x + y * y; x = 1.0f; y = 0.0f; for (int n = 1; n < 3; ++n) { x -= cosf(n * fr) * d[n]; y += sinf(n * fr) * d[n]; } h = h / (x * x + y * y); freqs[i] += powf(h, ((Pstages + 1.0f) / 2.0f)) * filter_amp; } } for (int i = 0; i < nfreqs; ++i) { if (freqs[i] > 0.000000001f) freqs[i] = asDecibel(freqs[i]) + getgain(); else freqs[i] = -90.0f; } } void FilterParams::add2XML(XMLtree& xmlFilter) { //filter parameters xmlFilter.addPar_int ("category" , Pcategory); xmlFilter.addPar_int ("type" , Ptype); xmlFilter.addPar_frac("freq" , Pfreq); xmlFilter.addPar_frac("q" , Pq); xmlFilter.addPar_int ("stages" , Pstages); xmlFilter.addPar_frac("freq_track" , Pfreqtrack); xmlFilter.addPar_bool("freqtrackoffset", Pfreqtrackoffset); xmlFilter.addPar_frac("gain" , Pgain); //formant filter parameters if ((Pcategory==1) or (synth.getRuntime().xmlmax)) { XMLtree xmlFormant = xmlFilter.addElm("FORMANT_FILTER"); xmlFormant.addPar_int ("num_formants" , Pnumformants); xmlFormant.addPar_frac("formant_slowness", Pformantslowness); xmlFormant.addPar_frac("vowel_clearness" , Pvowelclearness); xmlFormant.addPar_int ("center_freq" , Pcenterfreq); xmlFormant.addPar_int ("octaves_freq" , Poctavesfreq); for (uint nvowel=0; nvowel < FF_MAX_VOWELS; nvowel++) { XMLtree xmlVowel = xmlFormant.addElm("VOWEL",nvowel); add2XML_vowel(xmlVowel,nvowel); } xmlFormant.addPar_int ("sequence_size" , Psequencesize); xmlFormant.addPar_frac("sequence_stretch" , Psequencestretch); xmlFormant.addPar_bool("sequence_reversed", Psequencereversed); for (uint nseq=0; nseq < FF_MAX_SEQUENCE; nseq++) { XMLtree xmlSeq = xmlFormant.addElm("SEQUENCE_POS",nseq); xmlSeq.addPar_int ("vowel_id", Psequence[nseq].nvowel); } } } void FilterParams::add2XML_vowel(XMLtree& xmlVowel, const uint nvowel) { for (uint nformant = 0; nformant < FF_MAX_FORMANTS; ++nformant) { XMLtree xmlFormant = xmlVowel.addElm("FORMANT",nformant); xmlFormant.addPar_frac("freq", Pvowels[nvowel].formants[nformant].freq); xmlFormant.addPar_frac("amp" , Pvowels[nvowel].formants[nformant].amp); xmlFormant.addPar_frac("q" , Pvowels[nvowel].formants[nformant].q); } } void FilterParams::getfromXML(XMLtree& xmlFilter) { // filter parameters Pcategory = xmlFilter.getPar_127 ("category" ,Pcategory); Ptype = xmlFilter.getPar_127 ("type" ,Ptype); Pfreq = xmlFilter.getPar_frac("freq" ,Pfreq, FILTDEF::addFreq.min, FILTDEF::addFreq.max); Pq = xmlFilter.getPar_frac("q" ,Pq, FILTDEF::qVal.min, FILTDEF::qVal.max); Pstages = xmlFilter.getPar_127 ("stages" ,Pstages); Pfreqtrack = xmlFilter.getPar_frac("freq_track" ,Pfreqtrack,FILTDEF::freqTrack.min,FILTDEF::freqTrack.max); Pfreqtrackoffset = xmlFilter.getPar_bool("freqtrackoffset",Pfreqtrackoffset); Pgain = xmlFilter.getPar_frac("gain" ,Pgain, FILTDEF::gain.min, FILTDEF::gain.max); // formant filter parameters if (XMLtree xmlFormant = xmlFilter.getElm("FORMANT_FILTER")) { Pnumformants = xmlFormant.getPar_127 ("num_formants" ,Pnumformants); Pformantslowness = xmlFormant.getPar_frac("formant_slowness" ,Pformantslowness,FILTDEF::formSpeed.min, FILTDEF::formSpeed.max); Pvowelclearness = xmlFormant.getPar_frac("vowel_clearness" ,Pvowelclearness, FILTDEF::formClear.min, FILTDEF::formClear.max); Pcenterfreq = xmlFormant.getPar_127 ("center_freq" ,Pcenterfreq); Poctavesfreq = xmlFormant.getPar_127 ("octaves_freq" ,Poctavesfreq); for (uint nvowel = 0; nvowel < FF_MAX_VOWELS; nvowel++) if (XMLtree xmlVowel = xmlFormant.getElm("VOWEL",nvowel)) getfromXML_vowel(xmlVowel,nvowel); Psequencesize = xmlFormant.getPar_127 ("sequence_size" ,Psequencesize); Psequencestretch = xmlFormant.getPar_frac("sequence_stretch" ,Psequencestretch,FILTDEF::formStretch.min,FILTDEF::formStretch.max); Psequencereversed = xmlFormant.getPar_bool("sequence_reversed",Psequencereversed); for (uint nseq = 0; nseq < FF_MAX_SEQUENCE;nseq++) if (XMLtree xmlSeq = xmlFormant.getElm("SEQUENCE_POS",nseq)) Psequence[nseq].nvowel = xmlSeq.getPar_int("vowel_id", Psequence[nseq].nvowel, 0,FF_MAX_VOWELS-1); } } void FilterParams::getfromXML_vowel(XMLtree& xmlVowel, const uint nvowel) { for (uint nformant = 0; nformant < FF_MAX_FORMANTS; nformant++) if (XMLtree xmlFormant = xmlVowel.getElm("FORMANT",nformant)) { Pvowels[nvowel].formants[nformant].freq = xmlFormant.getPar_frac("freq",Pvowels[nvowel].formants[nformant].freq,FILTDEF::formFreq.min,FILTDEF::formFreq.max); Pvowels[nvowel].formants[nformant].firstF =Pvowels[nvowel].formants[nformant].freq; // the saved setting becomes the new pseudo default value. Pvowels[nvowel].formants[nformant].amp = xmlFormant.getPar_frac("amp",Pvowels[nvowel].formants[nformant].amp,FILTDEF::formAmp.min,FILTDEF::formAmp.max); Pvowels[nvowel].formants[nformant].q = xmlFormant.getPar_frac("q", Pvowels[nvowel].formants[nformant].q,FILTDEF::formQ.min,FILTDEF::formQ.max); } } float filterLimit::getFilterLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int effType = getData->data.kit; int engine = getData->data.engine; int offset = getData->data.offset; int dynPreset = 0; if (effType == EFFECT::type::dynFilter) { dynPreset = offset << 4; } unsigned char type = 0; // filter defaults int min = 0; int max = 127; float def = 64; unsigned char learnable = TOPLEVEL::type::Learnable; type |= learnable; switch (control) { case FILTERINSERT::control::centerFrequency: if (effType == EFFECT::type::dynFilter) { switch (dynPreset) { case 0: def = FILTDEF::dynFreq0.def; break; case 1: def = FILTDEF::dynFreq1.def; break; case 2: def = FILTDEF::dynFreq2.def; break; case 3: def = FILTDEF::dynFreq3.def; break; case 4: def = FILTDEF::dynFreq4.def; break; } } else if (engine == PART::engine::subSynth) def = FILTDEF::subFreq.def; else if (engine >= PART::engine::addVoice1) def = FILTDEF::voiceFreq.def; else def = FILTDEF::padFreq.def; type &= ~TOPLEVEL::type::Integer; break; case FILTERINSERT::control::Q: if (effType == EFFECT::type::dynFilter) { switch (dynPreset) { case 0: def = FILTDEF::dynQval0.def; break; case 1: def = FILTDEF::dynQval1.def; break; case 2: def = FILTDEF::dynQval2.def; break; case 3: def = FILTDEF::dynQval3.def; break; case 4: def = FILTDEF::dynQval4.def; break; } } else if (engine >= PART::engine::addVoice1) def = FILTDEF::voiceQval.def; else def = FILTDEF::qVal.def; type &= ~TOPLEVEL::type::Integer; break; case FILTERINSERT::control::frequencyTracking: def = FILTDEF::freqTrack.def; break; case FILTERINSERT::control::velocitySensitivity: if (engine >= PART::engine::addVoice1) def = FILTDEF::voiceVelSense.def; else def = FILTDEF::velSense.def; break; case FILTERINSERT::control::velocityCurve: def = FILTDEF::velFuncSense.def; break; case FILTERINSERT::control::gain: def = FILTDEF::gain.def; break; case FILTERINSERT::control::stages: type |= TOPLEVEL::type::Integer; if (effType == EFFECT::type::dynFilter) def = FILTDEF::dynStages.def; else def = FILTDEF::stages.def; max = FILTDEF::stages.max; type &= ~learnable; break; case FILTERINSERT::control::baseType: type |= TOPLEVEL::type::Integer; max = FILTDEF::category.max; def = FILTDEF::category.def; type &= ~learnable; break; case FILTERINSERT::control::analogType: type |= TOPLEVEL::type::Integer; max = FILTDEF::analogType.max; def = FILTDEF::analogType.def; type &= ~learnable; break; case FILTERINSERT::control::stateVariableType: type |= TOPLEVEL::type::Integer; max = FILTDEF::stVarfType.max; def = FILTDEF::stVarfType.def; type &= ~learnable; break; case FILTERINSERT::control::frequencyTrackingRange: type |= TOPLEVEL::type::Integer; max = true; def = FILTSWITCH::trackRange; type &= ~learnable; break; case FILTERINSERT::control::formantSlowness: def = FILTDEF::formSpeed.def; break; case FILTERINSERT::control::formantClearness: def = FILTDEF::formClear.def; break; case FILTERINSERT::control::formantFrequency: if (request == TOPLEVEL::type::Default) type |= TOPLEVEL::type::Error; // it's pseudo random so inhibit default *** change this! type &= ~TOPLEVEL::type::Integer; break; case FILTERINSERT::control::formantQ: def = FILTDEF::formQ.def; type &= ~TOPLEVEL::type::Integer; break; case FILTERINSERT::control::formantAmplitude: def = FILTDEF::formAmp.def; break; case FILTERINSERT::control::formantStretch: def = FILTDEF::formStretch.def; break; case FILTERINSERT::control::formantCenter: def = FILTDEF::formCentre.def; type &= ~TOPLEVEL::type::Integer; break; case FILTERINSERT::control::formantOctave: def = FILTDEF::formOctave.def; break; case FILTERINSERT::control::numberOfFormants: type |= TOPLEVEL::type::Integer; min = FILTDEF::formCount.min; max = FILTDEF::formCount.max; def = FILTDEF::formCount.def; type &= ~learnable; break; case FILTERINSERT::control::vowelNumber: type |= TOPLEVEL::type::Integer; max = FILTDEF::formVowel.max; def = FILTDEF::formVowel.def; type &= ~learnable; break; case FILTERINSERT::control::formantNumber: type |= TOPLEVEL::type::Integer; max = FILTDEF::formCount.max; def = FILTDEF::formCount.def; type &= ~learnable; break; case FILTERINSERT::control::sequenceSize: type |= TOPLEVEL::type::Integer; min = FILTDEF::sequenceSize.min; max = FILTDEF::sequenceSize.max; def = FILTDEF::sequenceSize.def; type &= ~learnable; break; case FILTERINSERT::control::sequencePosition: type |= TOPLEVEL::type::Integer; def = 0; type &= ~learnable; break; case FILTERINSERT::control::vowelPositionInSequence: type |= TOPLEVEL::type::Integer; max = 5; type &= ~learnable; break; case FILTERINSERT::control::negateInput: type |= TOPLEVEL::type::Integer; max = true; def =FILTSWITCH::sequenceReverse; type &= ~learnable; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Params/FilterParams.h000066400000000000000000000160131506652756400201360ustar00rootroot00000000000000/* FilterParams.h - Parameters for filter Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2018 - 2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #ifndef FILTER_PARAMS_H #define FILTER_PARAMS_H #include "Params/ParamCheck.h" #include "Misc/NumericFuncs.h" #include "globals.h" #include using func::power; using func::decibel; class SynthEngine; class XMLtree; class FilterParams : public ParamBase { public: FilterParams(uchar Ptype_, float Pfreq, float Pq_, uchar Pfreqtrackoffset_, SynthEngine&); void defaults() override; void add2XML(XMLtree&); void add2XML_vowel(XMLtree&, const uint nvowel); void getfromXML(XMLtree&); void getfromXML_vowel(XMLtree&, const uint nvowel); void getfromFilterParams(FilterParams *pars); float getfreq(); float getq(); float getfreqtracking(float notefreq); float getgain(); float getcenterfreq(); float getoctavesfreq(); float getfreqpos(float freq); float getfreqx(float x); void formantfilterH(int nvowel, int nfreqs, float *freqs); // used by UI float getformantfreq(float freq) // Transforms a parameter to { return getfreqx(freq / 127.0f); } // the real value float getformantamp(float amp) { return decibel<-80>(1.0f - amp / 127.0f); } float getformantq(float q) { return power<25>((q - 32.0f) / 64.0f); } uchar Pcategory; // Filter category (Analog/Formant/StVar) uchar Ptype; // Filter type (for analog lpf,hpf,bpf..) float Pfreq; // Frequency (64-central frequency) float Pq; // Q parameters (resonance or bandwidth) uchar Pstages; // filter stages+1 float Pfreqtrack; // how the filter frequency is changing // according the note frequency uchar Pfreqtrackoffset; // Shift range for freq tracking float Pgain; // filter's output gain // Formant filter parameters uchar Pnumformants; // how many formants are used uchar Pformantslowness; // how slow varies the formants uchar Pvowelclearness; // how vowels are kept clean (how much try // to avoid "mixed" vowels) uchar Pcenterfreq; // the centre frequency of the res. func. uchar Poctavesfreq; // the number of octaves struct { struct { float firstF, freq, amp, q; // frequency,amplitude,Q } formants[FF_MAX_FORMANTS]; } Pvowels[FF_MAX_VOWELS]; uchar Psequencesize; // how many vowels are in the sequence float Psequencestretch; // how the sequence is stretched (how the input from filter envelopes/LFOs/etc. is "stretched") uchar Psequencereversed; // if the input from filter envelopes/LFOs/etc. is reversed(negated) struct { uchar nvowel; // the vowel from the position } Psequence[FF_MAX_SEQUENCE]; bool changed; private: void defaults(int n); // stored default parameters uchar Dtype; float Dfreq; float Dq; uchar Dfreqtrackoffset; }; class filterLimit { public: float getFilterLimits(CommandBlock *getData); }; struct FILTminmax{ float min; float max; float def; bool learn; bool integer; }; namespace FILTDEF{ const FILTminmax addFreq {0,127,94,true,false}; const FILTminmax voiceFreq {0,127,50,true,false}; const FILTminmax subFreq {0,127,80,true,false}; const FILTminmax padFreq {0,127,94,true,false}; const FILTminmax dynFreq0 {0,127,45,true,false}; const FILTminmax dynFreq1 {0,127,72,true,false}; const FILTminmax dynFreq2 {0,127,64,true,false}; const FILTminmax dynFreq3 {0,127,50,true,false}; const FILTminmax dynFreq4 {0,127,64,true,false}; const FILTminmax qVal {0,127,40,true,false}; const FILTminmax voiceQval {0,127,60,true,false}; const FILTminmax dynQval0 {0,127,64,true,false}; const FILTminmax dynQval1 {0,127,64,true,false}; const FILTminmax dynQval2 {0,127,64,true,false}; const FILTminmax dynQval3 {0,127,70,true,false}; const FILTminmax dynQval4 {0,127,70,true,false}; const FILTminmax velSense {0,127,64,true,false}; const FILTminmax voiceVelSense {0,127,0,true,false}; const FILTminmax velFuncSense {0,127,64,true,true}; const FILTminmax gain {0,127,64,true,false}; const FILTminmax freqTrack {0,127,64,true,true}; const FILTminmax formCount {1,FF_MAX_FORMANTS,3,false,true}; const FILTminmax formSpeed {0,127,64,true,false}; const FILTminmax formClear {0,127,64,true,false}; const FILTminmax formFreq {0,127,-1,true,false}; // pseudo default value const FILTminmax formQ {0,127,64,true,false}; const FILTminmax formAmp {0,127,127,true,false}; const FILTminmax formStretch {0,127,40,true,false}; const FILTminmax formCentre {0,127,64,true,true}; const FILTminmax formOctave {0,127,64,true,true}; const FILTminmax formVowel {1,FF_MAX_SEQUENCE,1,false,true}; const FILTminmax sequenceSize{1,FF_MAX_SEQUENCE,3,false,true}; const FILTminmax stages {0,MAX_FILTER_STAGES-1,0,false,true}; const FILTminmax dynStages {0,MAX_FILTER_STAGES-1,1,false,true}; const FILTminmax category {0,2,0,false,true}; const FILTminmax analogType {0,8,2,false,true}; const FILTminmax stVarfType {0,3,0,false,true}; } struct DYNinsert{ float freq; float amp; float q; }; namespace DYNform{ const DYNinsert Preset3V0F0 {34,127,64}; const DYNinsert Preset3V0F1 {99,122,64}; const DYNinsert Preset3V0F2 {108,112,64}; const DYNinsert Preset3V1F0 {61,127,64}; const DYNinsert Preset3V1F1 {71,121,64}; const DYNinsert Preset3V1F2 {99,117,64}; const DYNinsert Preset4V0F0 {70,127,64}; const DYNinsert Preset4V0F1 {80,122,64}; const DYNinsert Preset4V1F0 {20,127,64}; const DYNinsert Preset4V1F1 {100,121,64}; } namespace FILTSWITCH{ const bool trackRange = false; const bool sequenceReverse = false; } #endif yoshimi-2.3.5.1/src/Params/LFOParams.cpp000066400000000000000000000205351506652756400176700ustar00rootroot00000000000000/* LFOParams.cpp - Parameters for LFO Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2019, Will Godfrey Copyright 2020 Kristian Amlie Copyright 2023 Will Godfrey and others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include #include #include #include "Params/LFOParams.h" #include "Misc/NumericFuncs.h" #include "Misc/XMLStore.h" using func::power; LFOParams::LFOParams(float Pfreq_, float Pintensity_, float Pstartphase_, uchar PLFOtype_, float Prandomness_, float Pdelay_, bool Pcontinous_, int fel_, SynthEngine& _synth) : ParamBase(_synth), fel(fel_), Dfreq(Pfreq_), Dintensity(Pintensity_), Dstartphase(Pstartphase_), DLFOtype(PLFOtype_), Drandomness(Prandomness_), Ddelay(Pdelay_), Dcontinous(Pcontinous_) { defaults(); paramsChanged(); } void LFOParams::defaults() { setPfreq(Dfreq << Cshift2I); Pintensity = Dintensity; Pstartphase = Dstartphase; PLFOtype = DLFOtype; Prandomness = Drandomness; Pdelay = Ddelay; Pcontinous = Dcontinous; Pbpm = LFOSWITCH::BPM; Pfreqrand = LFODEF::freqRnd.def; Pstretch = LFODEF::stretch.def; } void LFOParams::setPfreq(int32_t n) { PfreqI = n; Pfreq = (power<2>((float(n) / float(Fmul2I)) * 10.0f) - 1.0f) / 12.0f; paramsChanged(); } void LFOParams::add2XML(XMLtree& xmlLFO) { float freqF = float(PfreqI) / float(Fmul2I); if (Pbpm)// Save quantised, so that we can make the scale finer in the future, if necessary. freqF = func::quantizedLFOfreqBPM(freqF); xmlLFO.addPar_int ("freqI", freqF * float(Fmul2I)); xmlLFO.addPar_real("freq", freqF); xmlLFO.addPar_frac("intensity" , Pintensity); xmlLFO.addPar_frac("start_phase" , Pstartphase); xmlLFO.addPar_int ("lfo_type" , PLFOtype); xmlLFO.addPar_frac("randomness_amplitude", Prandomness); xmlLFO.addPar_frac("randomness_frequency", Pfreqrand); xmlLFO.addPar_frac("delay" , Pdelay); xmlLFO.addPar_frac("stretch" , Pstretch); xmlLFO.addPar_bool("continous" , Pcontinous); xmlLFO.addPar_bool("bpm" , Pbpm); } void LFOParams::getfromXML(XMLtree& xmlLFO) { assert(xmlLFO); PfreqI = xmlLFO.getPar_real("freq", Pfreq, 0.0, 1.0) * float(Fmul2I); setPfreq(PfreqI); Pintensity = xmlLFO.getPar_frac("intensity" , Pintensity ,0,127); Pstartphase = xmlLFO.getPar_frac("start_phase" , Pstartphase,0,127); PLFOtype = xmlLFO.getPar_127 ("lfo_type" , PLFOtype); Prandomness = xmlLFO.getPar_frac("randomness_amplitude", Prandomness,0,127); Pfreqrand = xmlLFO.getPar_frac("randomness_frequency", Pfreqrand ,0,127); Pdelay = xmlLFO.getPar_frac("delay" , Pdelay ,0,127); Pstretch = xmlLFO.getPar_frac("stretch" , Pstretch ,0,127); Pcontinous = xmlLFO.getPar_bool("continous" , Pcontinous); Pbpm = xmlLFO.getPar_bool("bpm" , Pbpm); paramsChanged(); } float LFOlimit::getLFOlimits(CommandBlock* getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int engine = getData->data.engine; int insertType = getData->data.parameter; uchar type = 0; // LFO defaults int min = 0; int max = 127; float def = 0; type |= TOPLEVEL::type::Integer; uchar learnable = TOPLEVEL::type::Learnable; type |= learnable; switch (control) { case LFOINSERT::control::speed: max = 1.0f; type &= ~TOPLEVEL::type::Integer; switch(insertType) { case TOPLEVEL::insertType::amplitude: if (engine >= PART::engine::addVoice1) def = LFODEF::voiceAmpFreq.def; else def = LFODEF::ampFreq.def; break; case TOPLEVEL::insertType::frequency: if (engine >= PART::engine::addVoice1) def = LFODEF::voiceFreqFreq.def; else def = LFODEF::freqFreq.def; break; case TOPLEVEL::insertType::filter: if (engine >= PART::engine::addVoice1) def = LFODEF::voiceFiltFreq.def; else def = LFODEF::filtFreq.def; break; } break; case LFOINSERT::control::depth: type &= ~TOPLEVEL::type::Integer; if (engine >= PART::engine::addVoice1) { switch(insertType) { case TOPLEVEL::insertType::amplitude: def = LFODEF::voiceAmpDepth.def; break; case TOPLEVEL::insertType::frequency: def = LFODEF::voiceFreqDepth.def; break; case TOPLEVEL::insertType::filter: def = LFODEF::voiceFiltDepth.def; break; default: def = LFODEF::depth.def; // is this ever used? break; } } break; case LFOINSERT::control::delay: type &= ~TOPLEVEL::type::Integer; if (engine >= PART::engine::addVoice1 && insertType == TOPLEVEL::insertType::amplitude) def = LFODEF::voiceAmpDelay.def; else def = LFODEF::delay.def; break; case LFOINSERT::control::start: type &= ~TOPLEVEL::type::Integer; if (engine < PART::engine::addVoice1 || insertType != TOPLEVEL::insertType::frequency) def = LFODEF::start.def; break; case LFOINSERT::control::amplitudeRandomness: type &= ~TOPLEVEL::type::Integer; def = LFODEF::ampRnd.def; break; case LFOINSERT::control::type: max = LFODEF::type.max; def = LFODEF::type.def; type &= ~learnable; break; case LFOINSERT::control::continuous: max = true; def = LFOSWITCH::continuous; type &= ~learnable; break; case LFOINSERT::control::bpm: max = true; def = LFOSWITCH::BPM; type &= ~learnable; break; case LFOINSERT::control::frequencyRandomness: type &= ~TOPLEVEL::type::Integer; def = LFODEF::freqRnd.def; break; case LFOINSERT::control::stretch: type &= ~TOPLEVEL::type::Integer; def = LFODEF::stretch.def; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Params/LFOParams.h000066400000000000000000000102071506652756400173300ustar00rootroot00000000000000/* LFOParams.h - Parameters for LFO Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2019, Will Godfrey Copyright 2020 Kristian Amlie Copyright 2023 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #ifndef LFO_PARAMS_H #define LFO_PARAMS_H #include #include "globals.h" #include "Params/ParamCheck.h" class SynthEngine; class XMLtree; class LFOParams : public ParamBase { public: LFOParams(float Pfreq_, float Pintensity_, float Pstartphase_, uchar PLFOtype_, float Prandomness_, float Pdelay_, bool Pcontinous, int fel_, SynthEngine&); void defaults() override; void add2XML(XMLtree&); void setPfreq(int32_t n); void getfromXML(XMLtree& xml); void setPintensity(float n) { Pintensity = n; paramsChanged(); } void setPstartphase(float n){ Pstartphase = n; } void setPLFOtype(uchar n) { PLFOtype = n; paramsChanged(); } void setPrandomness(float n){ Prandomness = n; paramsChanged(); } void setPfreqrand(float n) { Pfreqrand = n; paramsChanged(); } void setPdelay(float n) { Pdelay = n; } void setPbpm(bool b) { Pbpm = b; } void setPcontinous(bool b) { Pcontinous = b; paramsChanged(); } void setPstretch(float n) { Pstretch = n; paramsChanged(); } // MIDI Parameters int32_t PfreqI; float Pfreq; float Pintensity; float Pstartphase; uchar PLFOtype; float Prandomness; float Pfreqrand; float Pdelay; bool Pbpm; bool Pcontinous; float Pstretch; int fel; // kind of LFO - 0 frequency, 1 amplitude, 2 filter private: // Default parameters uchar Dfreq; uchar Dintensity; uchar Dstartphase; uchar DLFOtype; uchar Drandomness; uchar Ddelay; bool Dcontinous; }; class LFOlimit { public: float getLFOlimits(CommandBlock* getData); }; /* * This is a new replacement for limits that can be directly * accessed anywhere that includes this header. */ struct LFOminmax{ float min; float max; float def; bool learn; bool integer; }; namespace LFODEF{ const LFOminmax ampFreq {0,1,0.625,true,false}; const LFOminmax freqFreq {0,1,0.546875,true,false}; const LFOminmax filtFreq {0,1,0.625,true,false}; const LFOminmax voiceAmpFreq {0,1,0.703125,true,false}; const LFOminmax voiceFreqFreq {0,1,0.390625,true,false}; const LFOminmax voiceFiltFreq {0,1,0.390625,true,false}; const LFOminmax depth {0,127,0,true,false}; const LFOminmax voiceAmpDepth {0,127,32,true,false}; const LFOminmax voiceFreqDepth {0,127,40,true,false}; const LFOminmax voiceFiltDepth {0,127,20,true,false}; const LFOminmax start {0,127,64,true,false}; const LFOminmax voiceFreqStart {0,127,0,true,false}; const LFOminmax delay {0,127,0,true,false}; const LFOminmax voiceAmpDelay {0,127,30,true,false}; const LFOminmax ampRnd {0,127,0,true,false}; const LFOminmax freqRnd {0,127,0,true,false}; const LFOminmax stretch {0,127,64,true,false}; const LFOminmax type {0,9,0,false,true}; } namespace LFOSWITCH{ const bool BPM = false; const bool continuous = false; } #endif yoshimi-2.3.5.1/src/Params/OscilParameters.cpp000066400000000000000000000364631506652756400212100ustar00rootroot00000000000000/* OscilGen.h - Waveform generator for ADnote Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2019 Will Godfrey & others. Copyright 2019-2020 Kristian Amlie Copyright 2023 Will Godfrey and others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #include #include "Params/OscilParameters.h" #include "Misc/SynthEngine.h" #include "Misc/XMLStore.h" OscilParameters::OscilParameters(fft::Calc const& fft, SynthEngine& _synth) : ParamBase{_synth} , basefuncSpectrum{fft.spectrumSize()} { defaults(); } void OscilParameters::updatebasefuncSpectrum(fft::Spectrum const& src) { basefuncSpectrum = src; } void OscilParameters::defaults() { basefuncSpectrum.reset(); for (int i = 0; i < MAX_AD_HARMONICS; ++i) { Phmag[i] = 64; Phphase[i] = 64; } Phmag[0] = 127; Phmagtype = 0; Prand = 64; // no randomness by default Pcurrentbasefunc = OSCILLATOR::wave::sine; Pbasefuncpar = 64; Pbasefuncmodulation = 0; Pbasefuncmodulationpar1 = 64; Pbasefuncmodulationpar2 = 64; Pbasefuncmodulationpar3 = 32; Pmodulation = 0; Pmodulationpar1 = 64; Pmodulationpar2 = 64; Pmodulationpar3 = 32; Pwaveshapingfunction = 0; Pwaveshaping = 64; Pfiltertype = 0; Pfilterpar1 = 64; Pfilterpar2 = 64; Pfilterbeforews = 0; Psatype = 0; Psapar = 64; Pamprandpower = 64; Pamprandtype = 0; Pharmonicshift = 0; Pharmonicshiftfirst = 0; Padaptiveharmonics = 0; Padaptiveharmonicspower = 100; Padaptiveharmonicsbasefreq = 128; Padaptiveharmonicspar = 50; } void OscilParameters::add2XML(XMLtree& xml) { xml.addPar_int("harmonic_mag_type", Phmagtype); xml.addPar_int("base_function" , Pcurrentbasefunc); xml.addPar_int("base_function_par" , Pbasefuncpar); xml.addPar_int("base_function_modulation" , Pbasefuncmodulation); xml.addPar_int("base_function_modulation_par1", Pbasefuncmodulationpar1); xml.addPar_int("base_function_modulation_par2", Pbasefuncmodulationpar2); xml.addPar_int("base_function_modulation_par3", Pbasefuncmodulationpar3); xml.addPar_int("modulation" , Pmodulation); xml.addPar_int("modulation_par1", Pmodulationpar1); xml.addPar_int("modulation_par2", Pmodulationpar2); xml.addPar_int("modulation_par3", Pmodulationpar3); xml.addPar_int("wave_shaping" , Pwaveshaping); xml.addPar_int("wave_shaping_function" , Pwaveshapingfunction); xml.addPar_int("filter_before_wave_shaping", Pfilterbeforews); xml.addPar_int("filter_type" , Pfiltertype); xml.addPar_int("filter_par1" , Pfilterpar1); xml.addPar_int("filter_par2" , Pfilterpar2); xml.addPar_int("spectrum_adjust_type" , Psatype); xml.addPar_int("spectrum_adjust_par" , Psapar); xml.addPar_int("rand" , Prand); xml.addPar_int("amp_rand_type" , Pamprandtype); xml.addPar_int("amp_rand_power" , Pamprandpower); xml.addPar_int("harmonic_shift" , Pharmonicshift); xml.addPar_bool("harmonic_shift_first" , Pharmonicshiftfirst); xml.addPar_int("adaptive_harmonics" , Padaptiveharmonics); xml.addPar_int("adaptive_harmonics_base_frequency", Padaptiveharmonicsbasefreq); xml.addPar_int("adaptive_harmonics_power" , Padaptiveharmonicspower); xml.addPar_int("adaptive_harmonics_par" , Padaptiveharmonicspar); XMLtree xmlHarmonics = xml.addElm("HARMONICS"); for (uint n = 0; n < MAX_AD_HARMONICS; ++n) { if (Phmag[n] == 64 and Phphase[n] == 64) continue; XMLtree xmlHarm = xmlHarmonics.addElm("HARMONIC", n+1); xmlHarm.addPar_int("mag" , Phmag[n]); xmlHarm.addPar_int("phase", Phphase[n]); } if (Pcurrentbasefunc == OSCILLATOR::wave::user) { float max{0.0}; for (size_t i = 0; i < basefuncSpectrum.size(); ++i) { if (max < fabsf(basefuncSpectrum.c(i))) max = fabsf(basefuncSpectrum.c(i)); if (max < fabsf(basefuncSpectrum.s(i))) max = fabsf(basefuncSpectrum.s(i)); } if (max < 0.00000001) max = 1.0; XMLtree xmlBaseFunc = xml.addElm("BASE_FUNCTION"); for (size_t i = 1; i < basefuncSpectrum.size(); ++i) { float xc = basefuncSpectrum.c(i) / max; float xs = basefuncSpectrum.s(i) / max; if (fabsf(xs) > 0.00001 and fabsf(xs) > 0.00001) { XMLtree xmlHarm = xmlBaseFunc.addElm("BF_HARMONIC", i); xmlHarm.addPar_real("cos", xc); xmlHarm.addPar_real("sin", xs); } } } } void OscilParameters::getfromXML(XMLtree& xml) { assert(xml); Phmagtype = xml.getPar_127("harmonic_mag_type", Phmagtype); Pcurrentbasefunc = xml.getPar_127("base_function", Pcurrentbasefunc); Pbasefuncpar = xml.getPar_127("base_function_par", Pbasefuncpar); Pbasefuncmodulation = xml.getPar_127("base_function_modulation" , Pbasefuncmodulation); Pbasefuncmodulationpar1 = xml.getPar_127("base_function_modulation_par1", Pbasefuncmodulationpar1); Pbasefuncmodulationpar2 = xml.getPar_127("base_function_modulation_par2", Pbasefuncmodulationpar2); Pbasefuncmodulationpar3 = xml.getPar_127("base_function_modulation_par3", Pbasefuncmodulationpar3); Pmodulation = xml.getPar_127("modulation" , Pmodulation); Pmodulationpar1 = xml.getPar_127("modulation_par1" , Pmodulationpar1); Pmodulationpar2 = xml.getPar_127("modulation_par2" , Pmodulationpar2); Pmodulationpar3 = xml.getPar_127("modulation_par3" , Pmodulationpar3); Pwaveshaping = xml.getPar_127("wave_shaping" , Pwaveshaping); Pwaveshapingfunction = xml.getPar_127("wave_shaping_function" , Pwaveshapingfunction); Pfilterbeforews = xml.getPar_127("filter_before_wave_shaping", Pfilterbeforews); Pfiltertype = xml.getPar_127("filter_type" , Pfiltertype); Pfilterpar1 = xml.getPar_127("filter_par1" , Pfilterpar1); Pfilterpar2 = xml.getPar_127("filter_par2" , Pfilterpar2); Prand = xml.getPar_127("rand" , Prand); Pamprandtype = xml.getPar_127("amp_rand_type" , Pamprandtype); Pamprandpower = xml.getPar_127("amp_rand_power" , Pamprandpower); Psatype = xml.getPar_127("spectrum_adjust_type" , Psatype); Psapar = xml.getPar_127("spectrum_adjust_par" , Psapar); Pharmonicshift = xml.getPar_int ("harmonic_shift" , Pharmonicshift, -64, 64); Pharmonicshiftfirst = xml.getPar_bool("harmonic_shift_first" , Pharmonicshiftfirst); Padaptiveharmonics = xml.getPar_int ("adaptive_harmonics" , Padaptiveharmonics , 0, 127); Padaptiveharmonicsbasefreq=xml.getPar_int("adaptive_harmonics_base_frequency", Padaptiveharmonicsbasefreq,0,255); Padaptiveharmonicspower = xml.getPar_int("adaptive_harmonics_power", Padaptiveharmonicspower, 0, 200); Padaptiveharmonicspar = xml.getPar_int("adaptive_harmonics_par" , Padaptiveharmonicspar , 0, 100); if (XMLtree xmlHarmonics = xml.getElm("HARMONICS")) { Phmag[0] = 64; Phphase[0] = 64; for (uint n = 0; n < MAX_AD_HARMONICS; ++n) if (XMLtree xmlHarm = xmlHarmonics.getElm("HARMONIC", n+1)) { Phmag[n] = xmlHarm.getPar_127("mag" , 64); Phphase[n] = xmlHarm.getPar_127("phase", 64); } } if (XMLtree xmlBaseFunc = xml.getElm("BASE_FUNCTION")) { for (uint i = 1; i < basefuncSpectrum.size(); ++i) if (XMLtree xmlHarm = xmlBaseFunc.getElm("BF_HARMONIC", i)) { basefuncSpectrum.c(i) = xmlHarm.getPar_real("cos", 0.0); basefuncSpectrum.s(i) = xmlHarm.getPar_real("sin", 0.0); } float max = 0.0; basefuncSpectrum.c(0) = 0.0; for (size_t i = 0; i < basefuncSpectrum.size(); ++i) { if (max < fabsf(basefuncSpectrum.c(i))) max = fabsf(basefuncSpectrum.c(i)); if (max < fabsf(basefuncSpectrum.s(i))) max = fabsf(basefuncSpectrum.s(i)); } if (max < 0.00000001) max = 1.0; for (size_t i = 0; i < basefuncSpectrum.size(); ++i) { if (basefuncSpectrum.c(i)) basefuncSpectrum.c(i) /= max; if (basefuncSpectrum.s(i)) basefuncSpectrum.s(i) /= max; } } paramsChanged(); } float OscilParameters::getLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int insert = getData->data.insert; uchar type = 0; // oscillator defaults int min = 0; int max = 127; float def = 0; type |= TOPLEVEL::type::Integer; uchar learnable = TOPLEVEL::type::Learnable; type |= learnable; if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicPhase) { // do harmonics stuff if (insert == TOPLEVEL::insert::harmonicAmplitude && control == 0) def = 127; else def = 64; getData->data.type = type; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } switch (control) { case OSCILLATOR::control::phaseRandomness: break; case OSCILLATOR::control::magType: max = 4; type &= ~learnable; break; case OSCILLATOR::control::harmonicAmplitudeRandomness: def = 64; break; case OSCILLATOR::control::harmonicRandomnessType: max = 2; type &= ~learnable; break; case OSCILLATOR::control::baseFunctionParameter: min = -64; max = 63; break; case OSCILLATOR::control::baseFunctionType: max = OSCILLATOR::wave::hyperSec; type &= ~learnable; break; case OSCILLATOR::control::baseModulationParameter1: def = 64; break; case OSCILLATOR::control::baseModulationParameter2: def = 64; break; case OSCILLATOR::control::baseModulationParameter3: def = 32; break; case OSCILLATOR::control::baseModulationType: max = 3; type &= ~learnable; break; case OSCILLATOR::control::autoClear: max = 1; type &= ~learnable; break; case OSCILLATOR::control::useAsBaseFunction: max = 1; type &= ~learnable; break; case OSCILLATOR::control::waveshapeParameter: min = -64; max = 63; break; case OSCILLATOR::control::waveshapeType: max = 10; type &= ~learnable; break; case OSCILLATOR::control::filterParameter1: def = 64; break; case OSCILLATOR::control::filterParameter2: def = 64; break; case OSCILLATOR::control::filterBeforeWaveshape: max = 1; type &= ~learnable; break; case OSCILLATOR::control::filterType: max = 13; type &= ~learnable; break; case OSCILLATOR::control::modulationParameter1: def = 64; break; case OSCILLATOR::control::modulationParameter2: def = 64; break; case OSCILLATOR::control::modulationParameter3: def = 32; break; case OSCILLATOR::control::modulationType: max = 3; type &= ~learnable; break; case OSCILLATOR::control::spectrumAdjustParameter: def = 64; break; case OSCILLATOR::control::spectrumAdjustType: max = 3; type &= ~learnable; break; case OSCILLATOR::control::harmonicShift: min = -64; max = 64; break; case OSCILLATOR::control::clearHarmonicShift: max = 1; type &= ~learnable; break; case OSCILLATOR::control::shiftBeforeWaveshapeAndFilter: max = 1; type &= ~learnable; break; case OSCILLATOR::control::adaptiveHarmonicsParameter: max = 100; def = 50; break; case OSCILLATOR::control::adaptiveHarmonicsBase: max = 255; def = 128; break; case OSCILLATOR::control::adaptiveHarmonicsPower: max = 200; def = 100; break; case OSCILLATOR::control::adaptiveHarmonicsType: max = 8; type &= ~learnable; break; case OSCILLATOR::control::clearHarmonics: max = 1; type &= ~learnable; break; case OSCILLATOR::control::convertToSine: max = 1; type &= ~learnable; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Params/OscilParameters.h000066400000000000000000000101211506652756400206340ustar00rootroot00000000000000/* OscilGen.h - Waveform generator for ADnote Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2019 Will Godfrey & others. Copyright 2019 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #ifndef OSCIL_PARAMETERS_H #define OSCIL_PARAMETERS_H #include "globals.h" #include "ParamCheck.h" #include "DSP/FFTwrapper.h" class SynthEngine; class XMLtree; class OscilParameters : public ParamBase { public: OscilParameters(fft::Calc const& fft, SynthEngine&); void defaults() override; void add2XML(XMLtree&); void getfromXML(XMLtree&); float getLimits(CommandBlock *getData); void updatebasefuncSpectrum(fft::Spectrum const& src); fft::Spectrum const& getbasefuncSpectrum() const { return basefuncSpectrum; } public: /** * The hmag and hphase starts counting from 0, so the first harmonic(1) has the index 0, * 2-nd harmonic has index 1, ..the 128 harminic has index 127 */ uchar Phmag[MAX_AD_HARMONICS], Phphase[MAX_AD_HARMONICS]; // the MIDI parameters for mag. and phases uchar Phmagtype; // 0 - Linear, 1 - dB scale (-40), 2 - dB scale (-60) // 3 - dB scale (-80), 4 - dB scale (-100) uchar Pcurrentbasefunc; // The base function used - 0=sin, 1=... uchar Pbasefuncpar; // the parameter of the base function uchar Pbasefuncmodulation; // what modulation is applied to the // basefunc uchar Pbasefuncmodulationpar1; uchar Pbasefuncmodulationpar2; uchar Pbasefuncmodulationpar3; // the parameter of the base // function modulation uchar Prand; // 64 = no randomness // 63..0 - block type randomness - 0 is maximum // 65..127 - each harmonic randomness - 127 is maximum uchar Pwaveshaping, Pwaveshapingfunction; uchar Pfiltertype, Pfilterpar1, Pfilterpar2; uchar Pfilterbeforews; uchar Psatype, Psapar; // spectrum adjust uchar Pamprandpower, Pamprandtype;// amplitude randomness int Pharmonicshift; // how the harmonics are shifted int Pharmonicshiftfirst; // if the harmonic shift is done before waveshaping and filter uchar Padaptiveharmonics; // the adaptive harmonics status // (off=0,on=1,etc..) uchar Padaptiveharmonicsbasefreq; // the base frequency of the // adaptive harmonic (30..3000Hz) uchar Padaptiveharmonicspower; // the strength of the effect (0=off,100=full) uchar Padaptiveharmonicspar; // the parameters in 2,3,4.. modes of adaptive harmonics uchar Pmodulation; // what modulation is applied to the oscil uchar Pmodulationpar1; uchar Pmodulationpar2; uchar Pmodulationpar3; // the parameter of the parameters private: fft::Spectrum basefuncSpectrum; // Base Function Frequencies }; #endif // OSCIL_PARAMETERS_H yoshimi-2.3.5.1/src/Params/PADStatus.h000066400000000000000000000104561506652756400173620ustar00rootroot00000000000000/* PADStatus.h - Status of PADSynth wavetable building Copyright 2022, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef PAD_STATUS_H #define PAD_STATUS_H #include "globals.h" #include "Interface/InterChange.h" #include "Misc/FormatFuncs.h" #include #include /** * Display current wavetable build status and send status updates to the UI. * While the BuildScheduler coordinates the re-generation of Wavetables by Inverse Fast Fourier Transform, * the PADnoteUI shall display a live status indicator, so the user knows when actually to expect a sonic * change. This functionality is comprised of two parts, which can be accessed through this unified front-end. * - code within the build process generates status update messages, which are sent into the Queue "toGUI()", * which can be accessed via the InterChange instance. Note: this happens concurrently from various threads. * - the PADnoteUI receives and integrates all those status message into a single synthetic global status, * and changes the relevant embedded widgets accordingly * The PADStatus *instance* is the object located within the UI to receive and integrate status messages. */ class PADStatus { public: enum Stage { CLEAN = 0, FADING, PENDING, BUILDING, DIRTY, }; private: using HandlerFun = std::function; using HandlerTab = std::array; HandlerTab handler; const uchar partID; const uchar kitID; public: PADStatus(uchar part, uchar kit) : handler{} , partID{part} , kitID{kit} { } ~PADStatus() = default; // shall not be copied or moved or assigned PADStatus(PADStatus&&) = delete; PADStatus(PADStatus const&) = delete; PADStatus& operator=(PADStatus&&) = delete; PADStatus& operator=(PADStatus const&) = delete; // install actual handler function(s) void on(Stage stage, HandlerFun fun) { handler[stage] = fun; } // activate the transition to given new status void activateStage(Stage newStage) { if (handler[newStage]) handler[newStage](); } void handleStateMessage(CommandBlock const& stateMsg) { if (stateMsg.data.control == PADSYNTH::control::applyChanges and stateMsg.data.part == partID and stateMsg.data.kit == kitID ) activateStage(Stage(stateMsg.data.offset)); } // generate Status message within SynthEngine... static void mark(Stage newStage, InterChange&, uchar,uchar); }; /** * Cast a state message towards UI threadsafe and asynchronously. * @param interChange the access point to command message handling */ inline void PADStatus::mark(Stage newStage, InterChange& interChange, uchar partID, uchar kitID) { CommandBlock stateMsg; stateMsg.data.type = TOPLEVEL::type::Integer; stateMsg.data.control = PADSYNTH::control::applyChanges; stateMsg.data.engine = PART::engine::padSynth; stateMsg.data.source = TOPLEVEL::action::lowPrio | TOPLEVEL::action::noAction; stateMsg.data.offset = newStage; // stateMsg.data.part = partID; stateMsg.data.kit = kitID; // stateMsg.data.insert = UNUSED; stateMsg.data.parameter = UNUSED; stateMsg.data.miscmsg = UNUSED; stateMsg.data.spare0 = UNUSED; stateMsg.data.spare1 = UNUSED; stateMsg.data.value = 0; #ifdef GUI_FLTK bool success = interChange.toGUI.write(stateMsg.bytes); if (not success) interChange.Log("Failure PADStatus sending toGUI: newStage="+func::asString(newStage)); #endif } #endif /*PAD_STATUS_H*/ yoshimi-2.3.5.1/src/Params/PADnoteParameters.cpp000066400000000000000000001415331506652756400214240ustar00rootroot00000000000000/* PADnoteParameters.cpp - Parameters for PADnote (PADsynth) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2019 Will Godfrey Copyright 2020 Kristian Amlie & others Copyright 2022 Ichthyostega Copyright 2023 Will Godfrey and others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #include #include #include #include #include #include "Misc/XMLStore.h" #include "DSP/FFTwrapper.h" #include "Synth/OscilGen.h" #include "Synth/Resonance.h" #include "Params/EnvelopeParams.h" #include "Params/LFOParams.h" #include "Params/FilterParams.h" #include "Params/PADStatus.h" #include "Misc/SynthEngine.h" #include "Misc/FileMgrFuncs.h" #include "Misc/NumericFuncs.h" #include "Params/PADnoteParameters.h" #include "Misc/WavFile.h" using std::string; using std::vector; using file::saveData; using func::setAllPan; using func::power; namespace{ // Implementation helpers... // normalise the numbers in the table to 0.0 .. 1.0 inline void normaliseMax(vector& table) { double max = 0.0; for (float const& val : table) if (val > max) max = val; if (max >= 0.000001) for (float& val : table) val = float(double(val) / max); } // normalise a float array to RMS inline void normaliseSpectrumRMS(fft::Waveform& data) { auto sqr = [](double val){ return val*val; }; double rms = 0.0; for (size_t i = 0; i < data.size(); ++i) { rms += sqr(data[i]); } rms = sqrt(rms); if (rms < 0.000001) rms = 1.0; rms *= sqrt(double(1024 * 256) / data.size()) / 50.0; // TODO can we explain those magical numbers?? // (Likely due to the fact we're still pre-IFFT here) // Are those numbers exact, or just some "I don't care it seems to work" approximation? // // TODO Maybe related: http://fftw.org/fftw3_doc/Complex-DFTs.html at the bottom // "FFTW computes an unnormalized transform: computing a forward followed by a backward transform // (or vice versa) will result in the original data multiplied by the size of the transform (the product of the dimensions). // for (size_t i = 0; i < data.size(); ++i) data[i] = float(double(data[i]) / rms); } }//(End)ImplHelpers PADnoteParameters::PADnoteParameters(uchar pID, uchar kID, SynthEngine& _synth) : ParamBase(_synth) , Pmode{0} , Pquality{} , PProfile{} , Pbandwidth{500} , Pbwscale{0} , Phrpos{} , Pfixedfreq{0} , PfixedfreqET{0} , PBendAdjust{88} , POffsetHz{64} , PDetune{8192} // fine detune "zero" , PCoarseDetune{0} , PDetuneType{1} // base Waveform , fft(synth.oscilsize) , POscil{new OscilParameters(fft, synth)} , resonance{new Resonance(synth)} , oscilgen{new OscilGen(fft, resonance.get(), &synth, POscil.get())} , FreqEnvelope{new EnvelopeParams(0, 0, synth)} , FreqLfo{new LFOParams(70, 0, 64, 0, 0, 0, false, 0, synth)} // Amplitude parameters , PStereo{1} , PPanning{64} , PRandom{false} , PWidth{63} , pangainL{0.7} , pangainR{0.7} , PVolume{90} , PAmpVelocityScaleFunction{64} , AmpEnvelope{new EnvelopeParams(64, 1, synth)} , AmpLfo{new LFOParams(80, 0, 64, 0, 0, 0, false, 1, synth)} , Fadein_adjustment{FADEIN_ADJUSTMENT_SCALE} , PPunchStrength{0} , PPunchTime{60} , PPunchStretch{64} , PPunchVelocitySensing{72} // Filter Parameters , GlobalFilter{new FilterParams(2, 94, 40, 0, synth)} , PFilterVelocityScale{64} , PFilterVelocityScaleFunction{64} , FilterEnvelope{new EnvelopeParams(0, 1, synth)} , FilterLfo{new LFOParams(80, 0, 64, 0, 0, 0, false, 2, synth)} // random walk re-Trigger , PrebuildTrigger{0} , PrandWalkDetune{0} , PrandWalkBandwidth{0} , PrandWalkFilterFreq{0} , PrandWalkProfileWidth{0} , PrandWalkProfileStretch{0} , randWalkDetune{wavetablePhasePrng} , randWalkBandwidth{wavetablePhasePrng} , randWalkFilterFreq{wavetablePhasePrng} , randWalkProfileWidth{wavetablePhasePrng} , randWalkProfileStretch{wavetablePhasePrng} // Wavetable building , xFade{} , PxFadeUpdate{0} , waveTable(Pquality) , futureBuild(task::BuildScheduler::wireBuildFunction ,BuildOperation([this](){ return render_wavetable(); })) , partID{pID} , kitID{kID} , sampleTime{0} , wavetablePhasePrng{} { FreqEnvelope->ASRinit(64, 50, 64, 60); AmpEnvelope->ADSRinit_dB(0, 40, 127, 25); FilterEnvelope->ADSRinit_filter(64, 40, 64, 70, 60, 64); defaults(); } void PADnoteParameters::HarmonicProfile::defaults() { base.type = 0; base.pwidth = 80; freqmult = 0; modulator.pstretch = 0; modulator.freq = 30; width = 127; amp.type = 0; amp.mode = 0; amp.par1 = 80; amp.par2 = 64; autoscale = true; onehalf = 0; } void PADnoteParameters::HarmonicPos::defaults() { type = 0; par1 = 64; par2 = 64; par3 = 0; } void PADnoteParameters::defaults() { Pmode = 0; Pquality.resetToDefaults(); PProfile.defaults(); Phrpos.defaults(); Pbandwidth = 500; Pbwscale = 0; resonance->defaults(); oscilgen->defaults(); waveTable.reset(); // zero sound // By default set the oscil to max phase randomness. // Remark: phase randomness (and in fact oscil phase information) // is ignored altogether by PADsynth, but this default setting // can be useful in case the oscil is imported to an ADsynth // Historical Remark: in the original code base, this was // controlled by the "ADDvsPAD" setting. POscil->Prand = 127; // Frequency Global Parameters Pfixedfreq = 0; PfixedfreqET = 0; PBendAdjust = 88; // 64 + 24 POffsetHz = 64; PDetune = 8192; // zero PCoarseDetune = 0; PDetuneType = 1; FreqEnvelope->defaults(); FreqLfo->defaults(); // Amplitude Global Parameters PVolume = 90; PStereo = 1; // stereo setPan(PPanning = 64, synth.getRuntime().panLaw); // center PRandom = false; PWidth = 63; PAmpVelocityScaleFunction = 64; AmpEnvelope->defaults(); AmpLfo->defaults(); Fadein_adjustment = FADEIN_ADJUSTMENT_SCALE; PPunchStrength = 0; PPunchTime = 60; PPunchStretch = 64; PPunchVelocitySensing = 72; // Filter Global Parameters PFilterVelocityScale = 64; PFilterVelocityScaleFunction = 64; GlobalFilter->defaults(); FilterEnvelope->defaults(); FilterLfo->defaults(); PxFadeUpdate = XFADE_UPDATE_DEFAULT; // 200ms crossfade after updating wavetables PrebuildTrigger = 0; // by default not auto-self-retrigger PrandWalkDetune = 0; randWalkDetune.reset(); PrandWalkBandwidth = 0; randWalkBandwidth.reset(); PrandWalkFilterFreq = 0; randWalkFilterFreq.reset(); PrandWalkProfileWidth = 0; randWalkProfileWidth.reset(); PrandWalkProfileStretch = 0; randWalkProfileStretch.reset(); // reseed OscilGen and wavetable phase randomisation reseed(synth.randomINT()); sampleTime = 0; } void PADnoteParameters::reseed(int seed) { wavetablePhasePrng.init(seed); oscilgen->reseed(seed); } /* derive number of Wavetables for the desired octave coverage */ size_t PADTables::calcNumTables(PADQuality const& quality) { int tables = quality.oct + 1; int smpoct = quality.smpoct; if (smpoct == 5) smpoct = 6; else if (smpoct == 6) smpoct = 12; if (smpoct != 0) tables *= smpoct; else tables = tables / 2 + 1; if (tables == 0) tables = 1; return tables; } /* derive size of single wavetable for the desired quality settings */ size_t PADTables::calcTableSize(PADQuality const& quality) { return size_t(1) << (quality.samplesize + 14); } // Get the harmonic profile (i.e. the frequency distribution of a single harmonic) // returns the profile normalised to 0..1, with resolution as requested by the size. vector PADnoteParameters::buildProfile(size_t size) { vector profile(size, 0.0); // zero-init float lineWidth = power<2>(((1.0f - PProfile.base.pwidth / 127.0f) * 12.0f)); float freqmult = floorf(power<2>((PProfile.freqmult / 127.0f * 5.0f)) + 0.000001f); float modfreq = floorf(power<2>((PProfile.modulator.freq / 127.0f * 5.0f)) + 0.000001f); float modStrch = powf((PProfile.modulator.pstretch / 127.0f), 4.0f) * 5.0 / sqrtf(modfreq); float amppar1 = power<2>(powf((PProfile.amp.par1 / 127.0f), 2.0f) * 10.0f) - 0.999f; float amppar2 = (1.0f - PProfile.amp.par2 / 127.0f) * 0.998f + 0.001f; float width = powf((150.0f / (PProfile.width + 22.0f)), 2.0f); // possibly apply a random walk lineWidth *= randWalkProfileWidth.getFactor(); modStrch *= randWalkProfileStretch.getFactor(); for (size_t i = 0; i < size * PROFILE_OVERSAMPLING; ++i) { bool makezero = false; float x = i * 1.0f / (size * float(PROFILE_OVERSAMPLING)); float origx = x; // do the sizing (width) x = (x - 0.5f) * width + 0.5f; if (x < 0.0f) { x = 0.0f; makezero = true; } else { if (x >1.0f) { x = 1.0f; makezero = true; } } // compute the full profile or one half switch (PProfile.onehalf) { case 1: x = x * 0.5f + 0.5f; break; case 2: x = x * 0.5f; break; } float x_before_freq_mult = x; // do the frequency multiplier x *= freqmult; // do the modulation of the profile x += sinf(x_before_freq_mult * PI * modfreq) * modStrch; x = fmodf(x + 1000.0f, 1.0f) * 2.0f - 1.0f; // this is the base function of the profile float f; switch (PProfile.base.type) { case 1: f = expf(-(x * x) * lineWidth); if (f < 0.4f) f = 0.0f; else f = 1.0f; break; case 2: f = expf(-(fabsf(x)) * sqrtf(lineWidth)); break; default: f = expf(-(x * x) * lineWidth); break; } if (makezero) f = 0.0f; float amp = 1.0f; origx = origx * 2.0f - 1.0f; // compute the amplitude multiplier switch (PProfile.amp.type) { case 1: amp = expf(-(origx * origx) * 10.0f * amppar1); break; case 2: amp = 0.5f * (1.0f + cosf(PI * origx * sqrtf(amppar1 * 4.0f + 1.0f))); break; case 3: amp = 1.0f / (powf(origx * (amppar1 * 2.0f + 0.8f), 14.0f) + 1.0f); break; } // apply the amplitude multiplier float finalsmp = f; if (PProfile.amp.type != 0) { switch (PProfile.amp.mode) { case 0: finalsmp = amp * (1.0f - amppar2) + finalsmp * amppar2; break; case 1: finalsmp *= amp * (1.0f - amppar2) + amppar2; break; case 2: finalsmp = finalsmp / (amp + powf(amppar2, 4.0f) * 20.0f + 0.0001f); break; case 3: finalsmp = amp / (finalsmp + powf(amppar2, 4.0f) * 20.0f + 0.0001f); break; } } profile[i / PROFILE_OVERSAMPLING] += finalsmp / PROFILE_OVERSAMPLING; } // normalise the profile to 0.0 .. 1.0 normaliseMax(profile); return profile; } // calculate relative factor 0.0 ..1.0 to estimate the perceived bandwidth float PADnoteParameters::calcProfileBandwith(vector const& profile) { if (!PProfile.autoscale) return 0.5f; size_t size = profile.size(); auto sqrSlot = [&](size_t i){ return profile[i]*profile[i]; }; // compute the estimated perceptual bandwidth float sum = 0.0f; size_t i; for (i = 0; i < size / 2 - 2; ++i) { sum += sqrSlot(i) + sqrSlot(size-1 - i); if (sum >= 4.0f) break; } return 1.0 - 2.0 * i / double(size); } // Convert the bandwidth parameter into cents float PADnoteParameters::getBandwithInCent() { float currBandwidth = std::min(1000.0f, Pbandwidth * randWalkBandwidth.getFactor()); float result = powf(currBandwidth / 1000.0f, 1.1f); result = power<10>(result * 4.0f) * 0.25f; return result; } // Frequency factor for the position of each harmonic; allows for distorted non-harmonic spectra. // Input is the number of the harmonic. n=0 is the fundamental, above are the overtones. // Returns a frequency factor relative to the undistorted frequency of the fundamental. float PADnoteParameters::calcHarmonicPositionFactor(float n) { float par1 = power<10>(-(1.0f - Phrpos.par1 / 255.0f) * 3.0f); float par2 = Phrpos.par2 / 255.0f; float scale = 1.0; float thresh = 0.0; float offset = 0.0; switch (Phrpos.type) { case 1: // "ShiftU" thresh = int(par2 * par2 * 100.0f); if (n < thresh) offset = n; else offset = n + (n - thresh) * par1 * 8.0f; break; case 2: // "ShiftL" thresh = int(par2 * par2 * 100.0f); if (n < thresh) offset = n; else offset = n - (n - thresh) * par1 * 0.90f; break; case 3: // "PowerU" scale = par1 * 100.0f + 1.0f; offset = powf(n / scale, (1.0f - par2 * 0.8f)) * scale; break; case 4: // "PowerL" offset = n * (1.0f - par1) + powf(n * 0.1f, par2 * 3.0f + 1.0f) * par1 * 10.0f; break; case 5: // "Sine" offset = n + sinf(n * par2 * par2 * PI * 0.999f) * sqrtf(par1) * 2.0f; break; case 6: // "Power" scale = powf((par2 * 2.0f), 2.0f) + 0.1f; offset = n * powf(1.0f + par1 * powf(n * 0.8f, scale), scale); break; case 7: // "Shift" scale = 1.0f + Phrpos.par1 / 255.0f; offset = n / scale; break; default:// "Harmonic" // undistorted. n=0 => factor=1.0 (corresponding to the base frequency) offset = n; break; } float result = 1.0f + offset; float par3 = Phrpos.par3 / 255.0f; float iresult = floorf(result + 0.5f); float dresult = result - iresult; result = iresult + (1.0f - par3) * dresult; if (result < 0.0f) result = 0.0f; return result; } // Generates the long spectrum for Bandwidth mode (only amplitudes are generated; // phases will be random) vector PADnoteParameters::generateSpectrum_bandwidthMode(float basefreq, size_t spectrumSize, vector const& profile) { assert(spectrumSize > 1); vector spectrum(spectrumSize, 0.0f); // zero-init // get the harmonic structure from the oscillator vector harmonics(oscilgen->getSpectrumForPAD(basefreq)); normaliseMax(harmonics); // within 0.0 .. 1.0 // derive the "perceptual" bandwidth for the given profile (a value 0 .. 1) float bwadjust = calcProfileBandwith(profile); assert(harmonics.size() == fft.spectrumSize()); for (size_t nh = 0; nh+1 < fft.spectrumSize(); ++nh) { //for each harmonic float realfreq = calcHarmonicPositionFactor(nh) * basefreq; if (realfreq > synth.samplerate_f * 0.49999f) break; if (realfreq < 20.0f) break; if (harmonics[nh] < 1e-5f) continue; //compute the bandwidth of each harmonic float bw = (power<2>(getBandwithInCent() / 1200.0f) - 1.0f) * basefreq / bwadjust; float power = 1.0f; switch (Pbwscale) { case 0: power = 1.0f; break; case 1: power = 0.0f; break; case 2: power = 0.25f; break; case 3: power = 0.5f; break; case 4: power = 0.75f; break; case 5: power = 1.5f; break; case 6: power = 2.0f; break; case 7: power = -0.5; break; } bw = bw * powf(realfreq / basefreq, power); size_t ibw = 1 + size_t(bw / (synth.samplerate_f * 0.5f) * spectrumSize); float amp = harmonics[nh]; if (resonance->Penabled) amp *= resonance->getfreqresponse(realfreq); size_t profilesize = profile.size(); if (ibw > profilesize) { // if the bandwidth is larger than the profilesize float rap = sqrtf(float(profilesize) / float(ibw)); int cfreq = int(realfreq / (synth.halfsamplerate_f) * spectrumSize) - ibw / 2; for (size_t i = 0; i < ibw; ++i) { int src = int(i * rap * rap); int spfreq = i + cfreq; if (spfreq < 0) continue; if (spfreq >= int(spectrumSize)) break; spectrum[spfreq] += amp * profile[src] * rap; } } else { // if the bandwidth is smaller than the profilesize float rap = sqrtf(float(ibw) / float(profilesize)); float ibasefreq = realfreq / (synth.halfsamplerate_f) * spectrumSize; for (size_t i = 0; i < profilesize; ++i) { float idfreq = i / (float)profilesize - 0.5f; idfreq *= ibw; int spfreq = (int)(idfreq + ibasefreq); float fspfreq = fmodf(idfreq + ibasefreq, 1.0f); if (spfreq <= 0) continue; if (spfreq >= int(spectrumSize) - 1) break; spectrum[spfreq] += amp * profile[i] * rap * (1.0f - fspfreq); spectrum[spfreq + 1] += amp * profile[i] * rap * fspfreq; } } } return spectrum; } // Generates the long spectrum for non-Bandwidth modes (only amplitudes are generated; phases will be random) vector PADnoteParameters::generateSpectrum_otherModes(float basefreq, size_t spectrumSize) { assert(spectrumSize > 1); vector spectrum(spectrumSize, 0.0f); // zero-init // get the harmonic structure from the oscillator vector harmonics(oscilgen->getSpectrumForPAD(basefreq)); normaliseMax(harmonics); // within 0.0 .. 1.0 for (size_t nh = 0; nh+1 < fft.spectrumSize(); ++nh) { //for each harmonic float realfreq = calcHarmonicPositionFactor(nh) * basefreq; ///sa fac aici interpolarea si sa am grija daca frecv descresc //[Romanian, from original Author] "do the interpolation here and be careful if they decrease frequency" if (realfreq > synth.samplerate_f * 0.49999f) break; if (realfreq < 20.0f) break; float amp = harmonics[nh]; if (resonance->Penabled) amp *= resonance->getfreqresponse(realfreq); int cfreq = int(realfreq / (synth.halfsamplerate_f) * spectrumSize); spectrum[cfreq] = amp + 1e-9f; } if (Pmode != 1) {// if not "discrete", i.e. render "continuous" spectrum size_t old = 0; for (size_t k = 1; k < spectrumSize; ++k) { if ((spectrum[k] > 1e-10f) || (k == (spectrumSize - 1))) { assert(k > old); size_t delta = k - old; float val1 = spectrum[old]; float val2 = spectrum[k]; float idelta = 1.0f / delta; for (size_t i = 0; i < delta; ++i) { float x = idelta * i; spectrum[old+i] = val1 * (1.0f - x) + val2 * x; } old = k; } } } return spectrum; } void PADnoteParameters::buildNewWavetable(bool blocking) { PADStatus::mark(PADStatus::DIRTY, synth.interchange, partID,kitID); if (synth.getRuntime().useLegacyPadBuild()) mute_and_rebuild_synchronous(); else if (not blocking) futureBuild.requestNewBuild(); else { // Guarantee to invoke a new build NOW and block until it is ready... // This is tricky, since new builds can be triggered any time from the GUI // and also the SynthEngine might pick up the result concurrently. // (1) Attempt to get hold of a running build triggered earlier (with old parameters) futureBuild.blockingWait(); // (2) when we trigger now, we can be sure the current state of parameters will be used futureBuild.requestNewBuild(); // (3) again wait for this build to complete... // Note: Result will be published to SynthEngine -- unless a new build was triggered futureBuild.blockingWait(true); } } namespace { auto& NO_RESULT = std::nullopt; } // This is the heart of the PADSynth: generate a set of perfectly looped wavetables, // based on rendering a harmonic profile for each line of the base waveform spectrum. // Each table is generated by a single inverse FFT, but using a high resolution spectrum. // Note: when returning the NoResult marker, the build shall be aborted and restarted. optional PADnoteParameters::render_wavetable() { PADTables newTable(Pquality); const size_t spectrumSize = newTable.tableSize / 2; PADStatus::mark(PADStatus::BUILDING, synth.interchange, partID,kitID); // prepare storage for a very large spectrum and FFT transformer fft::Calc fft{newTable.tableSize}; fft::Spectrum fftCoeff(spectrumSize); // (in »bandwidth mode«) build harmonic profile used for each line vector profile = Pmode == 0? buildProfile(SIZE_HARMONIC_PROFILE) : vector(); // empty dummy if (futureBuild.shallRebuild()) return NO_RESULT; float baseNoteFreq = 65.406f * power<2>(Pquality.basenote / 2); if (Pquality.basenote %2 == 1) baseNoteFreq *= 1.5; float adj[newTable.numTables]; // used to compute frequency relation to the base note frequency for (size_t tabNr = 0; tabNr < newTable.numTables; ++tabNr) adj[tabNr] = (Pquality.oct + 1.0f) * (float)tabNr / newTable.numTables; for (size_t tabNr = 0; tabNr < newTable.numTables; ++tabNr) { float tmp = adj[tabNr] - adj[newTable.numTables - 1] * 0.5f; float basefreqadjust = power<2>(tmp); float basefreq = baseNoteFreq * basefreqadjust; newTable.basefreq[tabNr] = basefreq; vector spectrum = Pmode == 0? generateSpectrum_bandwidthMode(basefreq, spectrumSize, profile) : generateSpectrum_otherModes(basefreq, spectrumSize); for (size_t i = 1; i < spectrumSize; ++i) { // Note: each wavetable uses differently randomised phases float phase = wavetablePhasePrng.numRandom() * 6.29f; fftCoeff.c(i) = spectrum[i] * cosf(phase); fftCoeff.s(i) = spectrum[i] * sinf(phase); } if (futureBuild.shallRebuild()) return NO_RESULT; fft::Waveform& newsmp = newTable[tabNr]; newsmp[0] = 0.0f; ///TODO 12/2021 (why) is this necessary? Doesn't the IFFT generate a full waveform? fft.freqs2smps(fftCoeff, newsmp); // that's all; here is the only IFFT for the whole sample; no windows are used ;-) (Comment by original author) normaliseSpectrumRMS(newsmp); // prepare extra samples used by the linear or cubic interpolation newsmp.fillInterpolationBuffer(); } PADStatus::mark(PADStatus::PENDING, synth.interchange, partID,kitID); return newTable; } /* called once before each buffer compute cycle; * possibly pick up results from background wavetable build. * WARNING: while FutureBuild::isReady() is reliable and airtight, the remaining logic * within the body is not thread-safe. FutureBuild::swap() does not cover all corner cases * when re-scheduling and thus should not be called concurrently. And the ref-count in xFade * is *deliberately without thread synchronisation* (since we're on the hot audio codepath). * If we ever consider processing SynthEngine concurrently, this logic must be revised. * (comment by Ichthyo, 3/2022) */ void PADnoteParameters::activate_wavetable() { if (futureBuild.isReady() and (PxFadeUpdate == 0 or xFade.startXFade(waveTable))) { // Note: don't pick up new waveTable while fading PADStatus::mark(PADStatus::CLEAN, synth.interchange, partID,kitID); futureBuild.swap(waveTable); paramsChanged(); sampleTime = 0; } else maybeRetrigger(); } /* automatic self-retrigger: if activated, a new wavetable background build is launched * after a given amount of "sample time" has passed. Moreover, some parameters may perform * a »random walk« by applying a small random offset on each rebuild, within a given spread. */ void PADnoteParameters::maybeRetrigger() { if (PrebuildTrigger == 0 or synth.getRuntime().useLegacyPadBuild()) return; // this feature requires a background build of the wavetable. if (sampleTime < PrebuildTrigger) { sampleTime += synth.buffersize_f / synth.samplerate_f * 1000; return; } else if (not futureBuild.isUnderway()) { randWalkDetune.walkStep(); randWalkBandwidth.walkStep(); randWalkFilterFreq.walkStep(); randWalkProfileWidth.walkStep(); randWalkProfileStretch.walkStep(); futureBuild.requestNewBuild(); } } /* Legacy mode: rebuild the PAD wavetable immediately, * without any background thread scheduling. */ void PADnoteParameters::mute_and_rebuild_synchronous() { waveTable.reset(); // mute by zeroing auto result = render_wavetable(); if (result) { using std::swap; swap(waveTable, *result); paramsChanged(); sampleTime = 0; } } void PADnoteParameters::setPan(char pan, uchar panLaw) { PPanning = pan; if (!PRandom) setAllPan(PPanning, pangainL, pangainR, panLaw); else pangainL = pangainR = 0.7f; } bool PADnoteParameters::export2wav(string basefilename) { string type; if (synth.getRuntime().isLittleEndian) type = "RIFF"; // default wave format else type = "RIFX"; basefilename += "--sample-"; bool isOK = true; for (size_t tab = 0; tab < waveTable.numTables; ++tab) { char tmpstr[22]; snprintf(tmpstr, 22, "-%02zu", tab + 1); string filename = basefilename + string(tmpstr) + EXTEN::MSwave; uint block; ushort sBlock; uint buffSize = 44 + sizeof(short int) * waveTable.tableSize; // total size char* buffer = (char*) malloc (buffSize); strcpy(buffer, type.c_str()); block = waveTable.tableSize * 4 + 36; // 2 channel shorts + part header buffer[4] = block & 0xff; buffer[5] = (block >> 8) & 0xff; buffer[6] = (block >> 16) & 0xff; buffer[7] = (block >> 24) & 0xff; string temp = "WAVEfmt "; strcpy(buffer + 8, temp.c_str()); block = 16; // subchunk size memcpy(buffer + 16, &block, 4); sBlock = 1; // AudioFormat uncompressed memcpy(buffer + 20, &sBlock, 2); sBlock = 1; // NumChannels mono memcpy(buffer + 22, &sBlock, 2); block = synth.samplerate; memcpy(buffer + 24, &block, 4); block = synth.samplerate * 2; // ByteRate // (SampleRate * NumChannels * BitsPerSample) / 8 memcpy(buffer + 28, &block, 4); sBlock = 2; // BlockAlign // (bitsPerSample * channels) / 8 memcpy(buffer + 32, &sBlock, 2); sBlock = 16; // BitsPerSample memcpy(buffer + 34, &sBlock, 2); temp = "data"; strcpy(buffer + 36, temp.c_str()); block = waveTable.tableSize * 2; // data size memcpy(buffer + 40, &block, 4); for (size_t smp = 0; smp < waveTable.tableSize; ++smp) { sBlock = (waveTable[tab][smp] * 32767.0f); buffer [44 + smp * 2] = sBlock & 0xff; buffer [45 + smp * 2] = (sBlock >> 8) & 0xff; } /* * The file manager can return a negative number on error, * so the comparison in the line below must be as integers. * This is safe here as the maximum possible buffer size * is well below the size of an integer. */ isOK = (saveData(buffer, buffSize, filename) == int(buffSize)); free (buffer); } return isOK; } void PADnoteParameters::add2XML(XMLtree& xmlPadSynth) { xmlPadSynth.addPar_bool("stereo" , PStereo); xmlPadSynth.addPar_int ("mode" , Pmode); xmlPadSynth.addPar_int ("bandwidth" , Pbandwidth); xmlPadSynth.addPar_int ("bandwidth_scale", Pbwscale); xmlPadSynth.addPar_uint("xfade_update" , PxFadeUpdate); XMLtree xmlPrf = xmlPadSynth.addElm("HARMONIC_PROFILE"); xmlPrf.addPar_int ("base_type" , PProfile.base.type); xmlPrf.addPar_int ("base_par1" , PProfile.base.pwidth); xmlPrf.addPar_int ("frequency_multiplier" , PProfile.freqmult); xmlPrf.addPar_int ("modulator_par1" , PProfile.modulator.pstretch); xmlPrf.addPar_int ("modulator_frequency" , PProfile.modulator.freq); xmlPrf.addPar_int ("width" , PProfile.width); xmlPrf.addPar_int ("amplitude_multiplier_type", PProfile.amp.type); xmlPrf.addPar_int ("amplitude_multiplier_mode", PProfile.amp.mode); xmlPrf.addPar_int ("amplitude_multiplier_par1", PProfile.amp.par1); xmlPrf.addPar_int ("amplitude_multiplier_par2", PProfile.amp.par2); xmlPrf.addPar_bool("autoscale" , PProfile.autoscale); xmlPrf.addPar_int ("one_half" , PProfile.onehalf); XMLtree xmlOscil = xmlPadSynth.addElm("OSCIL"); POscil->add2XML(xmlOscil); XMLtree xmlRes = xmlPadSynth.addElm("RESONANCE"); resonance->add2XML(xmlRes); XMLtree xmlHPos = xmlPadSynth.addElm("HARMONIC_POSITION"); xmlHPos.addPar_int ("type" , Phrpos.type); xmlHPos.addPar_int ("parameter1", Phrpos.par1); xmlHPos.addPar_int ("parameter2", Phrpos.par2); xmlHPos.addPar_int ("parameter3", Phrpos.par3); XMLtree xmlQual = xmlPadSynth.addElm("SAMPLE_QUALITY"); xmlQual.addPar_int ("samplesize", Pquality.samplesize); xmlQual.addPar_int ("basenote" , Pquality.basenote); xmlQual.addPar_int ("octaves" , Pquality.oct); xmlQual.addPar_int ("samples_per_octave",Pquality.smpoct); XMLtree xmlAmp = xmlPadSynth.addElm("AMPLITUDE_PARAMETERS"); { xmlAmp.addPar_int ("volume" , PVolume); // Yoshimi format for random panning xmlAmp.addPar_int ("pan_pos" , PPanning); xmlAmp.addPar_bool("random_pan" , PRandom); xmlAmp.addPar_int ("random_width", PWidth); // support legacy format if (PRandom) xmlAmp.addPar_int ("panning", 0); else xmlAmp.addPar_int ("panning", PPanning); xmlAmp.addPar_int ("velocity_sensing" , PAmpVelocityScaleFunction); xmlAmp.addPar_int ("fadein_adjustment" , Fadein_adjustment); xmlAmp.addPar_int ("punch_strength" , PPunchStrength); xmlAmp.addPar_int ("punch_time" , PPunchTime); xmlAmp.addPar_int ("punch_stretch" , PPunchStretch); xmlAmp.addPar_int ("punch_velocity_sensing", PPunchVelocitySensing); XMLtree xmlEnv = xmlAmp.addElm("AMPLITUDE_ENVELOPE"); AmpEnvelope->add2XML(xmlEnv); XMLtree xmlLFO = xmlAmp.addElm("AMPLITUDE_LFO"); AmpLfo->add2XML(xmlLFO); } XMLtree xmlFreq = xmlPadSynth.addElm("FREQUENCY_PARAMETERS"); { xmlFreq.addPar_int("fixed_freq" , Pfixedfreq); xmlFreq.addPar_int("fixed_freq_et", PfixedfreqET); xmlFreq.addPar_int("bend_adjust" , PBendAdjust); xmlFreq.addPar_int("offset_hz" , POffsetHz); xmlFreq.addPar_int("detune" , PDetune); xmlFreq.addPar_int("coarse_detune", PCoarseDetune); xmlFreq.addPar_int("detune_type" , PDetuneType); XMLtree xmlEnv = xmlFreq.addElm("FREQUENCY_ENVELOPE"); FreqEnvelope->add2XML(xmlEnv); XMLtree xmlLFO = xmlFreq.addElm("FREQUENCY_LFO"); FreqLfo->add2XML(xmlLFO); } XMLtree xmlFilterParams = xmlPadSynth.addElm("FILTER_PARAMETERS"); { xmlFilterParams.addPar_int("velocity_sensing_amplitude", PFilterVelocityScale); xmlFilterParams.addPar_int("velocity_sensing", PFilterVelocityScaleFunction); XMLtree xmlFilt = xmlFilterParams.addElm("FILTER"); GlobalFilter->add2XML(xmlFilt); XMLtree xmlEnv = xmlFilterParams.addElm("FILTER_ENVELOPE"); FilterEnvelope->add2XML(xmlEnv); XMLtree xmlLFO = xmlFilterParams.addElm("FILTER_LFO"); FilterLfo->add2XML(xmlLFO); } XMLtree xmlRand = xmlPadSynth.addElm("RANDOM_WALK"); xmlRand.addPar_uint("rebuild_trigger" , PrebuildTrigger); xmlRand.addPar_int("rand_detune" , PrandWalkDetune); xmlRand.addPar_int("rand_bandwidth" , PrandWalkBandwidth); xmlRand.addPar_int("rand_filter_freq" , PrandWalkFilterFreq); xmlRand.addPar_int("rand_profile_width" , PrandWalkProfileWidth); xmlRand.addPar_int("rand_profile_stretch", PrandWalkProfileStretch); } void PADnoteParameters::getfromXML(XMLtree& xmlPadSynth) { assert(xmlPadSynth); Pmode = xmlPadSynth.getPar_127 ("mode" , 0); PStereo = xmlPadSynth.getPar_bool("stereo" , PStereo); Pbandwidth = xmlPadSynth.getPar_int ("bandwidth" , Pbandwidth , 0,1000); Pbwscale = xmlPadSynth.getPar_127 ("bandwidth_scale", Pbwscale); PxFadeUpdate = xmlPadSynth.getPar_uint("xfade_update" , PxFadeUpdate, 0,XFADE_UPDATE_MAX); if (XMLtree xmlPrf = xmlPadSynth.getElm("HARMONIC_PROFILE")) { PProfile.base.type = xmlPrf.getPar_127("base_type" , PProfile.base.type); PProfile.base.pwidth = xmlPrf.getPar_127("base_par1" , PProfile.base.pwidth); PProfile.freqmult = xmlPrf.getPar_127("frequency_multiplier" , PProfile.freqmult); PProfile.modulator.pstretch=xmlPrf.getPar_127("modulator_par1" , PProfile.modulator.pstretch); PProfile.modulator.freq =xmlPrf.getPar_127("modulator_frequency" , PProfile.modulator.freq); PProfile.width = xmlPrf.getPar_127("width" , PProfile.width); PProfile.amp.type = xmlPrf.getPar_127("amplitude_multiplier_type", PProfile.amp.type); PProfile.amp.mode = xmlPrf.getPar_127("amplitude_multiplier_mode", PProfile.amp.mode); PProfile.amp.par1 = xmlPrf.getPar_127("amplitude_multiplier_par1", PProfile.amp.par1); PProfile.amp.par2 = xmlPrf.getPar_127("amplitude_multiplier_par2", PProfile.amp.par2); PProfile.autoscale = xmlPrf.getPar_bool("autoscale" , PProfile.autoscale); PProfile.onehalf = xmlPrf.getPar_127("one_half" , PProfile.onehalf); } if (XMLtree xmlOscil = xmlPadSynth.getElm("OSCIL")) POscil->getfromXML(xmlOscil); else POscil->defaults(); if (XMLtree xmlRes = xmlPadSynth.getElm("RESONANCE")) resonance->getfromXML(xmlRes); else resonance->defaults(); if (XMLtree xmlHPos = xmlPadSynth.getElm("HARMONIC_POSITION")) { Phrpos.type = xmlHPos.getPar_127("type" , Phrpos.type); Phrpos.par1 = xmlHPos.getPar_int("parameter1", Phrpos.par1, 0,255); Phrpos.par2 = xmlHPos.getPar_int("parameter2", Phrpos.par2, 0,255); Phrpos.par3 = xmlHPos.getPar_int("parameter3", Phrpos.par3, 0,255); } if (XMLtree xmlQual = xmlPadSynth.getElm("SAMPLE_QUALITY")) { Pquality.samplesize = xmlQual.getPar_127("samplesize", Pquality.samplesize); Pquality.basenote = xmlQual.getPar_127("basenote" , Pquality.basenote); Pquality.oct = xmlQual.getPar_127("octaves" , Pquality.oct); Pquality.smpoct = xmlQual.getPar_127("samples_per_octave",Pquality.smpoct); } if (XMLtree xmlAmp = xmlPadSynth.getElm("AMPLITUDE_PARAMETERS")) { PVolume = xmlAmp.getPar_127("volume" , PVolume); int val = xmlAmp.getPar_127("random_width", UNUSED); if (val < 64) {// new Yoshimi format PWidth = val; setPan(xmlAmp.getPar_127("pan_pos",PPanning), synth.getRuntime().panLaw); PRandom = xmlAmp.getPar_bool("random_pan", PRandom); } else {// legacy setPan(xmlAmp.getPar_127("panning",PPanning), synth.getRuntime().panLaw); if (PPanning == 0) { PPanning = 64; PRandom = true; PWidth = 63; } else PRandom = false; } PAmpVelocityScaleFunction = xmlAmp.getPar_127("velocity_sensing" , PAmpVelocityScaleFunction); Fadein_adjustment = xmlAmp.getPar_127("fadein_adjustment" , Fadein_adjustment); PPunchStrength = xmlAmp.getPar_127("punch_strength" , PPunchStrength); PPunchTime = xmlAmp.getPar_127("punch_time" , PPunchTime); PPunchStretch = xmlAmp.getPar_127("punch_stretch" , PPunchStretch); PPunchVelocitySensing = xmlAmp.getPar_127("punch_velocity_sensing", PPunchVelocitySensing); if (XMLtree xmlEnv = xmlAmp.getElm("AMPLITUDE_ENVELOPE")) AmpEnvelope->getfromXML(xmlEnv); else AmpEnvelope->defaults(); if (XMLtree xmlLFO = xmlAmp.getElm("AMPLITUDE_LFO")) AmpLfo->getfromXML(xmlLFO); else AmpLfo->defaults(); } if (XMLtree xmlFreq = xmlPadSynth.getElm("FREQUENCY_PARAMETERS")) { Pfixedfreq = xmlFreq.getPar_127("fixed_freq" , Pfixedfreq); PfixedfreqET = xmlFreq.getPar_127("fixed_freq_et", PfixedfreqET); PBendAdjust = xmlFreq.getPar_127("bend_adjust" , PBendAdjust); POffsetHz = xmlFreq.getPar_127("offset_hz" , POffsetHz); PDetune = xmlFreq.getPar_int("detune" , PDetune , 0,16383); PCoarseDetune = xmlFreq.getPar_int("coarse_detune", PCoarseDetune, 0,16383); PDetuneType = xmlFreq.getPar_127("detune_type" , PDetuneType); if (XMLtree xmlEnv = xmlFreq.getElm("FREQUENCY_ENVELOPE")) FreqEnvelope->getfromXML(xmlEnv); if (XMLtree xmlLFO = xmlFreq.getElm("FREQUENCY_LFO")) FreqLfo->getfromXML(xmlLFO); } if (XMLtree xmlFilterParams = xmlPadSynth.getElm("FILTER_PARAMETERS")) { PFilterVelocityScale = xmlFilterParams.getPar_127("velocity_sensing_amplitude", PFilterVelocityScale); PFilterVelocityScaleFunction = xmlFilterParams.getPar_127("velocity_sensing", PFilterVelocityScaleFunction); if (XMLtree xmlFilt = xmlFilterParams.getElm("FILTER")) GlobalFilter->getfromXML(xmlFilt); else GlobalFilter->defaults(); if (XMLtree xmlEnv = xmlFilterParams.getElm("FILTER_ENVELOPE")) FilterEnvelope->getfromXML(xmlEnv); else FilterEnvelope->defaults(); if (XMLtree xmlLFO = xmlFilterParams.getElm("FILTER_LFO")) FilterLfo->getfromXML(xmlLFO); else FilterLfo->defaults(); } if (XMLtree xmlRand = xmlPadSynth.getElm("RANDOM_WALK")) { PrebuildTrigger =xmlRand.getPar_uint("rebuild_trigger" ,PrebuildTrigger, 0,REBUILDTRIGGER_MAX); PrandWalkDetune =xmlRand.getPar_127("rand_detune" ,PrandWalkDetune); PrandWalkBandwidth =xmlRand.getPar_127("rand_bandwidth" ,PrandWalkBandwidth); PrandWalkFilterFreq =xmlRand.getPar_127("rand_filter_freq" ,PrandWalkFilterFreq); PrandWalkProfileWidth =xmlRand.getPar_127("rand_profile_width" ,PrandWalkProfileWidth); PrandWalkProfileStretch=xmlRand.getPar_127("rand_profile_stretch",PrandWalkProfileStretch); randWalkDetune .setSpread(PrandWalkDetune); randWalkBandwidth .setSpread(PrandWalkBandwidth); randWalkFilterFreq .setSpread(PrandWalkFilterFreq); randWalkProfileWidth .setSpread(PrandWalkProfileWidth); randWalkProfileStretch .setSpread(PrandWalkProfileStretch); } // trigger re-build of the wavetable as background task... waveTable.reset(); // silence existing sound from previous instruments using the same part futureBuild.blockingWait(); // possibly retrieve result of ongoing build without publishing (Note: blocks consecutive instrument loads from MIDI) buildNewWavetable(); // launch rebuild of wavetables for the new instrument (background task) // result will be picked up from PADnote::noteout() when ready } float PADnoteParameters::getLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; uchar type = 0; // padnote defaults int min = 0; int def = 64; int max = 127; type |= TOPLEVEL::type::Integer; uchar learnable = TOPLEVEL::type::Learnable; switch (control) { case PADSYNTH::control::volume: type |= learnable; def = 90; break; case PADSYNTH::control::velocitySense: type |= learnable; def = 64; break; case PADSYNTH::control::panning: type |= learnable; break; case PADSYNTH::control::enableRandomPan: max = 1; break; case PADSYNTH::control::randomWidth: type |= learnable; def = 63; max = 63; break; case PADSYNTH::control::bandwidth: type |= learnable; def = 500; max = 1000; break; case PADSYNTH::control::bandwidthScale: def = 0; max = 7; break; case PADSYNTH::control::spectrumMode: def = 0; max = 2; break; case PADSYNTH::control::xFadeUpdate: type |= learnable; def = 200; max = 20000; break; case PADSYNTH::control::rebuildTrigger: type |= learnable; def = 0; max = 60000; break; case PADSYNTH::control::randWalkDetune: type |= learnable; def = 0; max = 127; break; case PADSYNTH::control::randWalkBandwidth: type |= learnable; def = 0; max = 127; break; case PADSYNTH::control::randWalkFilterFreq: type |= learnable; def = 0; max = 127; break; case PADSYNTH::control::randWalkProfileWidth: type |= learnable; def = 0; max = 127; break; case PADSYNTH::control::randWalkProfileStretch: type |= learnable; def = 0; max = 127; break; case PADSYNTH::control::detuneFrequency: type |= learnable; min = -8192; def = 0; max = 8191; break; case PADSYNTH::control::equalTemperVariation: type |= learnable; def = 0; break; case PADSYNTH::control::baseFrequencyAs440Hz: def = 0; max = 1; break; case PADSYNTH::control::octave: type |= learnable; min = -8; def = 0; max = 7; break; case PADSYNTH::control::detuneType: def = 1; max = 4; break; case PADSYNTH::control::coarseDetune: min = -64; def = 0; max = 63; break; case PADSYNTH::control::pitchBendAdjustment: type |= learnable; def = 88; break; case PADSYNTH::control::pitchBendOffset: type |= learnable; break; case PADSYNTH::control::overtoneParameter1: type |= learnable; max = 255; break; case PADSYNTH::control::overtoneParameter2: type |= learnable; max = 255; break; case PADSYNTH::control::overtoneForceHarmonics: type |= learnable; def = 0; max = 255; break; case PADSYNTH::control::overtonePosition: def = 0; max = 7; break; case PADSYNTH::control::baseWidth: type |= learnable; def = 80; break; case PADSYNTH::control::frequencyMultiplier: type |= learnable; def = 0; break; case PADSYNTH::control::modulatorStretch: type |= learnable; def = 0; break; case PADSYNTH::control::modulatorFrequency: type |= learnable; def = 30; break; case PADSYNTH::control::size: type |= learnable; def = 127; break; case PADSYNTH::control::baseType: def = 0; max = 2; break; case PADSYNTH::control::harmonicSidebands: def = 0; max = 2; break; case PADSYNTH::control::spectralWidth: type |= learnable; def = 80; break; case PADSYNTH::control::spectralAmplitude: type |= learnable; break; case PADSYNTH::control::amplitudeMultiplier: def = 0; max = 3; break; case PADSYNTH::control::amplitudeMode: def = 0; max = 3; break; case PADSYNTH::control::autoscale: def = 1; max = 1; break; case PADSYNTH::control::harmonicBase: def = 4; max = 8; break; case PADSYNTH::control::samplesPerOctave: def = 2; max = 6; break; case PADSYNTH::control::numberOfOctaves: def = 3; max = 7; break; case PADSYNTH::control::sampleSize: def = 3; max = 6; break; case PADSYNTH::control::applyChanges: def = 1; max = 1; break; case PADSYNTH::control::stereo: type |= learnable; def = 1; max = 1; break; case PADSYNTH::control::dePop: type |= learnable; def = FADEIN_ADJUSTMENT_SCALE; break; case PADSYNTH::control::punchStrength: type |= learnable; def = 0; break; case PADSYNTH::control::punchDuration: type |= learnable; def = 60; break; case PADSYNTH::control::punchStretch: type |= learnable; break; case PADSYNTH::control::punchVelocity: type |= learnable; def = 72; break; default: type |= TOPLEVEL::type::Error; // error break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Params/PADnoteParameters.h000066400000000000000000000275661506652756400211020ustar00rootroot00000000000000/* PADnoteParameters.h - Parameters for PADnote (PADsynth) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2018, Will Godfrey Copyright 2020 Kristian Amlie & others Copyright 2022 Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #ifndef PAD_NOTE_PARAMETERS_H #define PAD_NOTE_PARAMETERS_H #include "Params/ParamCheck.h" #include "Misc/RandomGen.h" #include "Misc/BuildScheduler.h" #include "Params/RandomWalk.h" #include "Synth/XFadeManager.h" #include "Synth/OscilGen.h" #include "DSP/FFTwrapper.h" #include #include #include #include #include #include using std::unique_ptr; using std::vector; class XMLtree; class OscilParameters; class EnvelopeParams; class Resonance; class LFOParams; class FilterParams; class SynthEngine; // defines quality / resolution of PADSynth wavetables struct PADQuality { uchar samplesize; uchar basenote, oct, smpoct; PADQuality() { resetToDefaults(); } void resetToDefaults() { samplesize = 3; basenote = 4; oct = 3; smpoct = 2; } }; class PADTables { public: // size parameters const size_t numTables; const size_t tableSize; unique_ptr basefreq; private: vector samples; public: // can be moved and swapped, but not copied... ~PADTables() = default; PADTables(PADTables&&) = default; PADTables(PADTables const&) = delete; PADTables& operator=(PADTables&&) = delete; PADTables& operator=(PADTables const&) = delete; PADTables(PADQuality const& quality) : numTables{calcNumTables(quality)} , tableSize{calcTableSize(quality)} , basefreq{new float[numTables]} , samples{} { assert(numTables > 0); assert(tableSize > 0); samples.reserve(numTables); for (size_t tab=0; tab < numTables; ++tab) { samples.emplace_back(tableSize); // cause allocation and zero-init of wavetable(s) basefreq[tab] = 440.0f; // fallback base frequency; makes even empty wavetable usable } } void reset() // fill existing wavetables with silence { for (size_t tab=0; tab < numTables; ++tab) samples[tab].reset(); } // Subscript: access n-th wavetable fft::Waveform& operator[](size_t tableNo) { assert(tableNo < numTables); assert(samples.size() == numTables); return samples[tableNo]; } fft::Waveform const& operator[](size_t tableNo) const { return const_cast(this)->operator[](tableNo); } void cloneDataFrom(PADTables const& org) { const_cast(numTables) = org.numTables; const_cast(tableSize) = org.tableSize; samples.clear(); // discard existing allocations (size may differ) basefreq.reset(new float[numTables]); for (size_t tab=0; tab < numTables; ++tab) { samples.emplace_back(tableSize); samples[tab] = org[tab]; // clone sample data basefreq[tab] = org.basefreq[tab]; } } // deliberately allow to swap two PADTables, // even while not being move assignable due to the const fields friend void swap(PADTables& p1, PADTables& p2) { using std::swap; swap(p1.samples, p2.samples); swap(p1.basefreq,p2.basefreq); swap(const_cast(p1.numTables), const_cast(p2.numTables)); swap(const_cast(p1.tableSize), const_cast(p2.tableSize)); } private: static size_t calcNumTables(PADQuality const&); static size_t calcTableSize(PADQuality const&); }; class PADnoteParameters : public ParamBase { static constexpr size_t SIZE_HARMONIC_PROFILE = 512; static constexpr size_t PROFILE_OVERSAMPLING = 16; public: static constexpr size_t XFADE_UPDATE_MAX = 20000; // milliseconds static constexpr size_t XFADE_UPDATE_DEFAULT = 200; static constexpr size_t REBUILDTRIGGER_MAX = 60000; // milliseconds public: PADnoteParameters(uchar pID, uchar kID, SynthEngine&); // shall not be copied or moved or assigned PADnoteParameters(PADnoteParameters&&) = delete; PADnoteParameters(PADnoteParameters const&) = delete; PADnoteParameters& operator=(PADnoteParameters&&) = delete; PADnoteParameters& operator=(PADnoteParameters const&) = delete; void defaults() override; void reseed(int value); void setPan(char pan, uchar panLaw); void add2XML(XMLtree&); void getfromXML(XMLtree&); float getLimits(CommandBlock *getData); float getBandwithInCent(); // convert Pbandwith setting into cents // (re)Building the Wavetable void buildNewWavetable(bool blocking =false); std::optional render_wavetable(); void activate_wavetable(); bool export2wav(std::string basefilename); vector buildProfile(size_t size); float calcProfileBandwith(vector const& profile); float calcHarmonicPositionFactor(float n); // position of partials, possibly non-harmonic. // Harmonic profile settings // (controls the frequency distribution of a single harmonic) struct HarmonicProfile { struct BaseFunction { uchar type; uchar pwidth; }; struct Modulator{ uchar pstretch; uchar freq; }; struct AmplitudeMultiplier { uchar mode; uchar type; uchar par1; uchar par2; }; BaseFunction base; uchar freqmult; // frequency multiplier of the distribution Modulator modulator; // the modulator of the distribution uchar width; // the width of the resulting function after the modulation AmplitudeMultiplier amp; // the amplitude multiplier of the harmonic profile bool autoscale; // if the scale of the harmonic profile is // computed automatically uchar onehalf; // what part of the base function is used to // make the distribution void defaults(); }; // Positioning of partials // on integer multiples (type=0 -> regular harmonics) // or shifted away for distorted spectrum // see calcHarmonicPositionFactor(partial) struct HarmonicPos { uchar type = 0; // harmonic,ushift,lshift,upower,lpower,sine,power,shift uchar par1 = 64; // strength of the shift uchar par2 = 64; // depending on type, defines threshold, exponent or frequency uchar par3 = 0; // forceH : increasingly shift towards next harmonic position // these params are 0..255 void defaults(); }; //----PADSynth parameters-------------- //the mode: 0 - bandwidth, 1 - discrete (bandwidth=0), 2 - continuous //the harmonic profile is used only on mode 0 uchar Pmode; PADQuality Pquality; // Quality settings; controls number and size of wavetables HarmonicProfile PProfile; unsigned int Pbandwidth; // the values are from 0 to 1000 uchar Pbwscale; // how the bandwidth is increased according to // the harmonic's frequency HarmonicPos Phrpos; // Positioning of partials (harmonic / distorted) // Frequency parameters uchar Pfixedfreq; // If the base frequency is fixed to 440 Hz // Equal temperate (this is used only if the Pfixedfreq is enabled) // If this parameter is 0, the frequency is fixed (to 440 Hz); // if this parameter is 64, 1 MIDI halftone -> 1 frequency halftone uchar PfixedfreqET; uchar PBendAdjust; // Pitch Bend uchar POffsetHz; ushort PDetune; // fine detune ushort PCoarseDetune; // coarse detune+octave uchar PDetuneType; // detune type fft::Calc fft; // private instance used by OscilGen unique_ptr POscil; unique_ptr resonance; unique_ptr oscilgen; unique_ptr FreqEnvelope; // Frequency Envelope unique_ptr FreqLfo; // Frequency LFO // Amplitude parameters uchar PStereo; uchar PPanning; // 1 left, 64 center, 127 right bool PRandom; char PWidth; float pangainL; // derived from PPanning float pangainR; // ^^ uchar PVolume; uchar PAmpVelocityScaleFunction; unique_ptr AmpEnvelope; unique_ptr AmpLfo; // Adjustment factor for anti-pop fadein uchar Fadein_adjustment; uchar PPunchStrength, PPunchTime, PPunchStretch, PPunchVelocitySensing; // Filter Parameters unique_ptr GlobalFilter; uchar PFilterVelocityScale; // filter velocity sensing uchar PFilterVelocityScaleFunction; // filter velocity sensing unique_ptr FilterEnvelope; unique_ptr FilterLfo; // re-Trigger Wavetable build with random walk uint PrebuildTrigger; uchar PrandWalkDetune; uchar PrandWalkBandwidth; uchar PrandWalkFilterFreq; uchar PrandWalkProfileWidth; uchar PrandWalkProfileStretch; RandomWalk randWalkDetune; RandomWalk randWalkBandwidth; RandomWalk randWalkFilterFreq; RandomWalk randWalkProfileWidth; RandomWalk randWalkProfileStretch; // manage secondary PADTables during a wavetable X-Fade XFadeManager xFade; uint PxFadeUpdate; // in milliseconds, XFADE_UPDATE_MAX = 20000 // current wavetable PADTables waveTable; // control for rebuilding wavetable (background action) FutureBuild futureBuild; const uchar partID; const uchar kitID; private: size_t sampleTime; RandomGen wavetablePhasePrng; vector generateSpectrum_bandwidthMode(float basefreq, size_t spectrumSize, vector const& profile); vector generateSpectrum_otherModes(float basefreq, size_t spectrumSize); void maybeRetrigger(); void mute_and_rebuild_synchronous(); // type abbreviations using FutureVal = std::future; using ResultVal = std::optional; using BuildOperation = std::function; using ScheduleAction = std::function; using SchedulerSetup = std::function; }; #endif /*PAD_NOTE_PARAMETERS_H*/ yoshimi-2.3.5.1/src/Params/ParamCheck.cpp000066400000000000000000000020461506652756400200770ustar00rootroot00000000000000/* ParamCheck.cpp - Checks control changes and updates respective parameters Copyright 2018-2023 Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #include #include #include "Misc/SynthEngine.h" #include "Params/ParamCheck.h" yoshimi-2.3.5.1/src/Params/ParamCheck.h000066400000000000000000000066711506652756400175540ustar00rootroot00000000000000/* ParamCheck.h - Checks control changes and updates respective parameters Copyright 2018-2023, Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef PARAMCHECK_H #define PARAMCHECK_H class SynthEngine; struct Note { int midi; float freq; float vel; Note(int midiNote, float freq, float velocity) : midi{midiNote} , freq{freq} , vel{limitVelocity(velocity)} { } // copyable and assignable Note withFreq(float changedFreq) { return Note{midi,changedFreq,vel}; } private: static float limitVelocity(float rawVal) { return std::max(0.0f, std::min(rawVal, 1.0f)); } }; class ParamBase { public: virtual ~ParamBase() = default; ///< this is an interface ParamBase(SynthEngine& _synth) : synth(_synth) , updatedAt(0) { } // shall not be copied nor moved ParamBase(ParamBase&&) = delete; ParamBase(ParamBase const&) = delete; ParamBase& operator=(ParamBase&&) = delete; ParamBase& operator=(ParamBase const&) = delete; SynthEngine& getSynthEngine() {return synth;} private: virtual void defaults() =0; protected: SynthEngine& synth; private: int updatedAt; // Monotonically increasing counter that tracks last // change. Users of the parameters compare their last // update to this counter. This can overflow, what's // important is that it's different. public: class ParamsUpdate { public: ParamsUpdate(ParamBase const& params_) : params(¶ms_), lastUpdated(params->updatedAt) {} // Checks if params have been updated and resets counter. bool checkUpdated() { bool result = params->updatedAt != lastUpdated; lastUpdated = params->updatedAt; return result; } void forceUpdate() { lastUpdated = params->updatedAt - 1; } void changeParams(ParamBase const& params_) { if (params != ¶ms_) { params = ¶ms_; forceUpdate(); } } private: const ParamBase *params; int lastUpdated; }; void paramsChanged() { updatedAt++; } }; #endif yoshimi-2.3.5.1/src/Params/RandomWalk.h000066400000000000000000000113751506652756400176120ustar00rootroot00000000000000/* RandomWalk.h - slow random fluctuations of parameter values Copyright 2022, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi. If not, see . */ #ifndef RANDOM_WALK_H #define RANDOM_WALK_H #include "globals.h" #include "Misc/RandomGen.h" #include "Misc/NumericFuncs.h" #include /** * Generate a sequence of random value fluctuations around an anchor point (parameter). * This value object generates a factor, which randomly walks around 1.0, with a configurable spread. * Initially the value is 1.0 and by default there is no spread and thus the value will be constant. * The random walk itself is performed on a logarithmic scale, since the result shall be delivered * as number factor; this means that e.g. factor 2 has the same probability as factor 1/2, with * 1.0 being the most likely expectation value. To control the distribution, the (single) parameter * value #setSpread can be set; this parameter operates again on a non-linear scale, with value 0 * to disable the random walk and value 96 corresponding to a span of +100%|-50% (i.e. Factor 2). * This parameter scale is focused on low spread values, while still allowing extreme randomisation. */ class RandomWalk { float pos{0}; // on a log2-scale float spread{0}; // likewise log2 (spread=1.0 ==> spread-factor 2.0) RandomGen& prng; public: RandomWalk(RandomGen& randSrc) : prng{randSrc} { } ~RandomWalk() = default; // can be moved/copied but not assigned RandomWalk(RandomWalk&&) = default; RandomWalk(RandomWalk const&) = default; RandomWalk& operator=(RandomWalk&&) = delete; RandomWalk& operator=(RandomWalk const&) = delete; // test if this RandomWalk is enabled explicit operator bool() const { return spread != 0; } void setSpread(uchar spreadParam) { spread = log2(param2spread(spreadParam)); } uchar getSpread() const { return spread2param(func::power<2>(spread)); } float getSpreadCent() const { return 1200*log2f(spread); } float getSpreadPercent() const { return 100.0f * (func::power<2>(spread) - 1.0f); } void reset() { pos = 0; spread = 0; } /** calculate the offset-factor representing the current walk position */ float getFactor() const { return pos == 0? 1.0f : pos > 0? func::power<2> (+pos) : func::powFrac<2>(-pos); } /** Perform a single random-walk step. */ void walkStep() { if (spread <= 0) reset(); else {// perform random step... float rnd = prng.numRandom(); if (0 < rnd and rnd < 1) // just stay put else {// strictly symmetrical distribution to avoid drift float offset = 2.0f * rnd - 1; // ]-1 ... +1[ assert(-1 < offset and offset < 1); pos += spread * offset; // random walk float dist = fabsf(pos/spread); if (dist > 1 and pos*offset > 0) pos /= dist; // damp excess outward trend } } } /* * p≔1 ⟹ factor 1.004 ~ 7 cent * p≔47 ⟹ factor 1.059 ~ 1 semitone root12(2) = 1.059 * p≔60 ⟹ factor 1.12 * p≔90 ⟹ factor 1.71 * p≔96 ⟹ factor 2.0 = 1 Octave * p≔110 ⟹ factor 3.24 * p≔115 ⟹ factor 3.99 ~ 2 Octaves * p≔127 ⟹ factor 6.99 */ static double param2spread(uchar param) { if (param == 0) return 0.0f; if (param >127) param = 127; // calculate 1 + (4 ^ (p/96 - 1))^4 double arg = param/96.0 - 1.0; double exp4 = exp(log(4) * arg); // 4^arg return 1 + exp4*exp4*exp4*exp4; } static uchar spread2param(double spread) { if (spread == 0.0) return 0; // s = 1 + (4 ^ (p/96 - 1))^4 // root4(s) = 1 + (4 ^ (p/96 - 1)) // p/96 - 1 = log4(root4(s) - 1) // p = 96·(log4(root4(s) - 1) + 1) double root4 = exp(log(spread)/4); double log4 = log(root4 - 1)/log(4); return uchar(96 * (log4 + 1)); } }; #endif /*RANDOM_WALK_H*/ yoshimi-2.3.5.1/src/Params/SUBnoteParameters.cpp000066400000000000000000000456151506652756400214550ustar00rootroot00000000000000/* SUBnoteParameters.cpp - Parameters for SUBnote (SUBsynth) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, Alan Calvert Copyright 2017-2019, Will Godfrey Copyright 2020-2022 Kristian Amlie & others Copyright 2023 Will Godfrey and others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #include "Misc/SynthEngine.h" #include "Params/SUBnoteParameters.h" #include "Params/LFOParams.h" #include "Misc/NumericFuncs.h" #include "Misc/XMLStore.h" using std::make_unique; using func::setAllPan; using func::power; SUBnoteParameters::SUBnoteParameters(SynthEngine& _synth) : ParamBase{_synth} { AmpEnvelope = make_unique(64, 1, synth); AmpEnvelope->ADSRinit_dB(0, 40, 127, 25); AmpLfo = make_unique(80, 0, 64, 0, 0, 0, false, 1, synth); FreqEnvelope = make_unique(64, 0, synth); FreqEnvelope->ASRinit(30, 50, 64, 60); FreqLfo = make_unique(70, 0, 64, 0, 0, 0, false, 0, synth); BandWidthEnvelope = make_unique(64, 0, synth); BandWidthEnvelope->ASRinit_bw(100, 70, 64, 60); GlobalFilter = make_unique(2, 80, 40, 0, synth); GlobalFilterEnvelope = make_unique(0, 1, synth); GlobalFilterEnvelope->ADSRinit_filter(64, 40, 64, 70, 60, 64); GlobalFilterLfo = make_unique(80, 0, 64, 0, 0, 0, false, 2, synth); defaults(); } void SUBnoteParameters::defaults() { PVolume = 96; setPan(PPanning = 64, synth.getRuntime().panLaw); PRandom = false; PWidth = 63; PAmpVelocityScaleFunction = 90; Pfixedfreq = 0; PfixedfreqET = 0; PBendAdjust = 88; // 64 + 24 POffsetHz = 64; Pnumstages = 2; Pbandwidth = 40; Phmagtype = 0; Pbwscale = 64; Pstereo = true; Pstart = 1; PDetune = 8192; PCoarseDetune = 0; PDetuneType = 1; PFreqEnvelopeEnabled = false; PFreqLfoEnabled = false; PBandWidthEnvelopeEnabled = false; POvertoneSpread.type = 0; POvertoneSpread.par1 = 0; POvertoneSpread.par2 = 0; POvertoneSpread.par3 = 0; updateFrequencyMultipliers(); for (int n = 0; n < MAX_SUB_HARMONICS; ++n) { Phmag[n] = 0; Phrelbw[n] = 64; } Phmag[0] = 127; PGlobalFilterEnabled = false; PGlobalFilterVelocityScale = 64; PGlobalFilterVelocityScaleFunction = 64; AmpEnvelope->defaults(); AmpLfo->defaults(); FreqEnvelope->defaults(); FreqLfo->defaults(); BandWidthEnvelope->defaults(); GlobalFilter->defaults(); GlobalFilterEnvelope->defaults(); GlobalFilterLfo->defaults(); } void SUBnoteParameters::setPan(char pan, unsigned char panLaw) { PPanning = pan; if (!PRandom) setAllPan(PPanning, pangainL, pangainR, panLaw); else pangainL = pangainR = 0.7f; } void SUBnoteParameters::add2XML(XMLtree& xmlSubSynth) { xmlSubSynth.addPar_int("num_stages" , Pnumstages); xmlSubSynth.addPar_int("harmonic_mag_type", Phmagtype); xmlSubSynth.addPar_int("start" , Pstart); XMLtree xmlHarmonics = xmlSubSynth.addElm("HARMONICS"); for (uint i=0; iadd2XML(xmlEnv); XMLtree xmlLfo = xmlAmp.addElm("AMPLITUDE_LFO"); AmpLfo->add2XML(xmlLfo); XMLtree xmlFreq = xmlSubSynth.addElm("FREQUENCY_PARAMETERS"); xmlFreq.addPar_bool("fixed_freq" , Pfixedfreq); xmlFreq.addPar_int ("fixed_freq_et", PfixedfreqET); xmlFreq.addPar_int ("bend_adjust" , PBendAdjust); xmlFreq.addPar_int ("offset_hz" , POffsetHz); xmlFreq.addPar_int ("detune" , PDetune); xmlFreq.addPar_int ("coarse_detune" , PCoarseDetune); xmlFreq.addPar_int ("overtone_spread_type", POvertoneSpread.type); xmlFreq.addPar_int ("overtone_spread_par1", POvertoneSpread.par1); xmlFreq.addPar_int ("overtone_spread_par2", POvertoneSpread.par2); xmlFreq.addPar_int ("overtone_spread_par3", POvertoneSpread.par3); xmlFreq.addPar_int ("detune_type" , PDetuneType); xmlFreq.addPar_int ("bandwidth" , Pbandwidth); xmlFreq.addPar_int ("bandwidth_scale" , Pbwscale); xmlFreq.addPar_bool("freq_envelope_enabled", PFreqEnvelopeEnabled); if (PFreqEnvelopeEnabled or synth.getRuntime().xmlmax) { XMLtree xmlEnv = xmlFreq.addElm("FREQUENCY_ENVELOPE"); FreqEnvelope->add2XML(xmlEnv); } xmlFreq.addPar_bool("freq_lfo_enabled", PFreqLfoEnabled); if (PFreqLfoEnabled or synth.getRuntime().xmlmax) { XMLtree xmlLfo = xmlFreq.addElm("FREQUENCY_LFO"); FreqLfo->add2XML(xmlLfo); } xmlFreq.addPar_bool("band_width_envelope_enabled", PBandWidthEnvelopeEnabled); if (PBandWidthEnvelopeEnabled or synth.getRuntime().xmlmax) { XMLtree xmlEnv = xmlFreq.addElm("BANDWIDTH_ENVELOPE"); BandWidthEnvelope->add2XML(xmlEnv); } XMLtree xmlFilterParams = xmlSubSynth.addElm("FILTER_PARAMETERS"); xmlFilterParams.addPar_bool("enabled", PGlobalFilterEnabled); if (PGlobalFilterEnabled or synth.getRuntime().xmlmax) { XMLtree xmlFilter = xmlFilterParams.addElm("FILTER"); GlobalFilter->add2XML(xmlFilter); xmlFilterParams.addPar_int("filter_velocity_sensing", PGlobalFilterVelocityScaleFunction); xmlFilterParams.addPar_int("filter_velocity_sensing_amplitude", PGlobalFilterVelocityScale); XMLtree xmlEnv = xmlFilterParams.addElm("FILTER_ENVELOPE"); GlobalFilterEnvelope->add2XML(xmlEnv); XMLtree xmlLfo = xmlFilterParams.addElm("FILTER_LFO"); GlobalFilterLfo->add2XML(xmlLfo); } } void SUBnoteParameters::updateFrequencyMultipliers() { float par1 = POvertoneSpread.par1 / 255.0f; float par1pow = power<10>(-(1.0f - POvertoneSpread.par1 / 255.0f) * 3.0f); float par2 = POvertoneSpread.par2 / 255.0f; float par3 = 1.0f - POvertoneSpread.par3 / 255.0f; float result; float tmp = 0.0f; int thresh = 0; for (int n = 0; n < MAX_SUB_HARMONICS; ++n) { float n1 = n + 1.0f; switch(POvertoneSpread.type) { case 1: thresh = (int)(100.0f * par2 * par2) + 1; if (n1 < thresh) result = n1; else result = n1 + 8.0f * (n1 - thresh) * par1pow; break; case 2: thresh = (int)(100.0f * par2 * par2) + 1; if (n1 < thresh) result = n1; else result = n1 + 0.9f * (thresh - n1) * par1pow; break; case 3: tmp = par1pow * 100.0f + 1.0f; result = powf(n / tmp, 1.0f - 0.8f * par2) * tmp + 1.0f; break; case 4: result = n * (1.0f - par1pow) + powf(0.1f * n, 3.0f * par2 + 1.0f) * 10.0f * par1pow + 1.0f; break; case 5: result = n1 + 2.0f * sinf(n * par2 * par2 * PI * 0.999f) * sqrt(par1pow); break; case 6: tmp = powf(2.0f * par2, 2.0f) + 0.1f; result = n * powf(par1 * powf(0.8f * n, tmp) + 1.0f, tmp) + 1.0f; break; case 7: result = (n1 + par1) / (par1 + 1); break; default: result = n1; break; } float iresult = floor(result + 0.5f); POvertoneFreqMult[n] = iresult + par3 * (result - iresult); } } void SUBnoteParameters::getfromXML(XMLtree& xmlSubSynth) { assert(xmlSubSynth); Pnumstages = xmlSubSynth.getPar_127("num_stages" ,Pnumstages); Phmagtype = xmlSubSynth.getPar_127("harmonic_mag_type",Phmagtype); Pstart = xmlSubSynth.getPar_127("start" ,Pstart); if (XMLtree xmlHarmonics = xmlSubSynth.getElm("HARMONICS")) { Phmag[0]=0; // default if disabled... for (uint i=0; i < MAX_SUB_HARMONICS; i++) if (XMLtree xmlHarm = xmlHarmonics.getElm("HARMONIC",i)) { Phmag[i] =xmlHarm.getPar_127("mag" ,Phmag[i]); Phrelbw[i]=xmlHarm.getPar_127("relbw",Phrelbw[i]); } } if (XMLtree xmlAmp = xmlSubSynth.getElm("AMPLITUDE_PARAMETERS")) { Pstereo = xmlAmp.getPar_bool("stereo", Pstereo); PVolume = xmlAmp.getPar_127 ("volume", PVolume); int val = xmlAmp.getPar_127 ("random_width", UNUSED); if (val < 64) {// new Yoshimi format PWidth = val; setPan(xmlAmp.getPar_127("pan_pos",PPanning), synth.getRuntime().panLaw); PRandom = xmlAmp.getPar_bool("random_pan", PRandom); } else {// legacy setPan(xmlAmp.getPar_127("panning",PPanning), synth.getRuntime().panLaw); if (PPanning == 0) { PPanning = 64; PRandom = true; PWidth = 63; } else PRandom = false; } PAmpVelocityScaleFunction=xmlAmp.getPar_127("velocity_sensing",PAmpVelocityScaleFunction); if (XMLtree xmlEnv = xmlAmp.getElm("AMPLITUDE_ENVELOPE")) AmpEnvelope->getfromXML(xmlEnv); else AmpEnvelope->defaults(); if (XMLtree xmlLfo = xmlAmp.getElm("AMPLITUDE_LFO")) AmpLfo->getfromXML(xmlLfo); else AmpLfo->defaults(); } if (XMLtree xmlFreq = xmlSubSynth.getElm("FREQUENCY_PARAMETERS")) { Pfixedfreq = xmlFreq.getPar_bool("fixed_freq" ,Pfixedfreq); PfixedfreqET = xmlFreq.getPar_127("fixed_freq_et",PfixedfreqET); PBendAdjust = xmlFreq.getPar_127("bend_adjust" ,PBendAdjust); POffsetHz = xmlFreq.getPar_127("offset_hz" ,POffsetHz); PDetune = xmlFreq.getPar_int("detune" ,PDetune, 0,16383); PCoarseDetune= xmlFreq.getPar_int("coarse_detune",PCoarseDetune,0,16383); PDetuneType = xmlFreq.getPar_127("detune_type" ,PDetuneType); Pbandwidth = xmlFreq.getPar_127("bandwidth" ,Pbandwidth); Pbwscale = xmlFreq.getPar_127("bandwidth_scale",Pbwscale); POvertoneSpread.type = xmlFreq.getPar_127("overtone_spread_type", POvertoneSpread.type); POvertoneSpread.par1 = xmlFreq.getPar_int("overtone_spread_par1", POvertoneSpread.par1, 0, 255); POvertoneSpread.par2 = xmlFreq.getPar_int("overtone_spread_par2", POvertoneSpread.par2, 0, 255); POvertoneSpread.par3 = xmlFreq.getPar_int("overtone_spread_par3", POvertoneSpread.par3, 0, 255); updateFrequencyMultipliers(); PFreqEnvelopeEnabled=xmlFreq.getPar_bool("freq_envelope_enabled",PFreqEnvelopeEnabled); if (XMLtree xmlEnv = xmlFreq.getElm("FREQUENCY_ENVELOPE")) FreqEnvelope->getfromXML(xmlEnv); else FreqEnvelope->defaults(); PFreqLfoEnabled=xmlFreq.getPar_bool("freq_lfo_enabled",PFreqLfoEnabled); if (XMLtree xmlLfo = xmlFreq.getElm("FREQUENCY_LFO")) FreqLfo->getfromXML(xmlLfo); else FreqLfo->defaults(); PBandWidthEnvelopeEnabled=xmlFreq.getPar_bool("band_width_envelope_enabled",PBandWidthEnvelopeEnabled); if (XMLtree xmlEnv = xmlFreq.getElm("BANDWIDTH_ENVELOPE")) BandWidthEnvelope->getfromXML(xmlEnv); else BandWidthEnvelope->defaults(); } if (XMLtree xmlFilterParams = xmlSubSynth.getElm("FILTER_PARAMETERS")) { PGlobalFilterEnabled = xmlFilterParams.getPar_bool("enabled",PGlobalFilterEnabled); if (XMLtree xmlFilter = xmlFilterParams.getElm("FILTER")) GlobalFilter->getfromXML(xmlFilter); PGlobalFilterVelocityScaleFunction=xmlFilterParams.getPar_127("filter_velocity_sensing",PGlobalFilterVelocityScaleFunction); PGlobalFilterVelocityScale =xmlFilterParams.getPar_127("filter_velocity_sensing_amplitude",PGlobalFilterVelocityScale); if (XMLtree xmlEnv = xmlFilterParams.getElm("FILTER_ENVELOPE")) GlobalFilterEnvelope->getfromXML(xmlEnv); else GlobalFilterEnvelope->defaults(); if (XMLtree xmlLfo = xmlFilterParams.getElm("FILTER_LFO")) GlobalFilterLfo->getfromXML(xmlLfo); else GlobalFilterLfo->defaults(); } } float SUBnoteParameters::getLimits(CommandBlock *getData) { float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int insert = getData->data.insert; unsigned char type = 0; // subsynth defaults int min = 0; int max = 127; int def = 0; type |= TOPLEVEL::type::Integer; unsigned char learnable = TOPLEVEL::type::Learnable; type |= learnable; if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicBandwidth) { // do harmonics stuff if (control >= MAX_SUB_HARMONICS) { getData->data.type = TOPLEVEL::type::Error; return 1; } if (insert == TOPLEVEL::insert::harmonicBandwidth) def = 64; else if (control == 0) def = 127; getData->data.type = type; switch (request) { case TOPLEVEL::type::Adjust: if (value < 0) value = 0; else if (value > 127) value = 127; break; case TOPLEVEL::type::Minimum: value = 0; break; case TOPLEVEL::type::Maximum: value = 127; break; } return value; } switch (control) { case SUBSYNTH::control::volume: def = 96; break; case SUBSYNTH::control::velocitySense: def = 90; break; case SUBSYNTH::control::panning: def = 64; break; case SUBSYNTH::control::enableRandomPan: max = 1; break; case SUBSYNTH::control::randomWidth: def = 63; max = 63; break; case SUBSYNTH::control::bandwidth: def = 40; break; case SUBSYNTH::control::bandwidthScale: min = -64; max = 63; break; case SUBSYNTH::control::enableBandwidthEnvelope: max = 1; break; case SUBSYNTH::control::detuneFrequency: min = -8192; max = 8191; break; case SUBSYNTH::control::equalTemperVariation: break; case SUBSYNTH::control::baseFrequencyAs440Hz: type &= ~learnable; max = 1; break; case SUBSYNTH::control::octave: min = -8; max = 7; break; case SUBSYNTH::control::detuneType: type &= ~learnable; min = 1; max = 4; break; case SUBSYNTH::control::coarseDetune: type &= ~learnable; min = -64; max = 63; break; case SUBSYNTH::control::pitchBendAdjustment: def = 88; break; case SUBSYNTH::control::pitchBendOffset: def = 64; break; case SUBSYNTH::control::enableFrequencyEnvelope: max = 1; break; case SUBSYNTH::control::overtoneParameter1: case SUBSYNTH::control::overtoneParameter2: case SUBSYNTH::control::overtoneForceHarmonics: max = 255; break; case SUBSYNTH::control::overtonePosition: type &= ~learnable; max = 7; break; case SUBSYNTH::control::enableFilter: max = 1; break; case SUBSYNTH::control::filterStages: type &= ~learnable; min = 1; def = 1; max = 5; break; case SUBSYNTH::control::magType: type &= ~learnable; max = 4; break; case SUBSYNTH::control::startPosition: type &= ~learnable; def = 1; max = 2; break; case SUBSYNTH::control::clearHarmonics: type &= ~learnable; max = 0; break; case SUBSYNTH::control::stereo: def = 1; max = 1; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Params/SUBnoteParameters.h000066400000000000000000000101651506652756400211120ustar00rootroot00000000000000/* SUBnoteParameters.h - Parameters for SUBnote (SUBsynth) Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, Alan Calvert Copyright 2017-2018, Will Godfrey Copyright 2020-2022 Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. */ #ifndef SUB_NOTE_PARAMETERS_H #define SUB_NOTE_PARAMETERS_H #include #include "Params/EnvelopeParams.h" #include "Params/LFOParams.h" #include "Params/FilterParams.h" #include "Params/ParamCheck.h" class SynthEngine; class XMLtree; class SUBnoteParameters : public ParamBase { public: SUBnoteParameters(SynthEngine&); void defaults() override; void setPan(char pan, uchar panLaw); void add2XML(XMLtree&); void getfromXML(XMLtree&); float getLimits(CommandBlock* getData); void updateFrequencyMultipliers(); // Amplitude Parametrers bool Pstereo; // true = stereo, false = mono uchar PVolume; uchar PPanning; bool PRandom; uchar PWidth; float pangainL; // derived from PPanning float pangainR; // ^^ uchar PAmpVelocityScaleFunction; std::unique_ptr AmpEnvelope; std::unique_ptr AmpLfo; // Frequency Parameters ushort PDetune; ushort PCoarseDetune; uchar PDetuneType; bool PFreqEnvelopeEnabled; std::unique_ptr FreqEnvelope; bool PFreqLfoEnabled; std::unique_ptr FreqLfo; bool PBandWidthEnvelopeEnabled; std::unique_ptr BandWidthEnvelope; uchar PBendAdjust; // Pitch Bend uchar POffsetHz; // Filter Parameters (Global) bool PGlobalFilterEnabled; std::unique_ptr GlobalFilter; uchar PGlobalFilterVelocityScale; uchar PGlobalFilterVelocityScaleFunction; std::unique_ptr GlobalFilterEnvelope; std::unique_ptr GlobalFilterLfo; // Other Parameters uchar Pfixedfreq; // If the base frequency is fixed to 440 Hz uchar PfixedfreqET; // Equal temperate (this is used only if the // Pfixedfreq is enabled) // If this parameter is 0, the frequency is // fixed (to 440 Hz) // if this parameter is 64, // 1 MIDI halftone -> 1 frequency halftone // Overtone spread parameters struct { uchar type; uchar par1; uchar par2; uchar par3; } POvertoneSpread; float POvertoneFreqMult[MAX_SUB_HARMONICS]; uchar Pnumstages; // how many times the filters are applied uchar Pbandwidth; uchar Phmagtype; // how the magnitudes are computed // 0 = linear, 1 = -60dB, 2 = -60dB uchar Phmag[MAX_SUB_HARMONICS]; // Magnitudes uchar Phrelbw[MAX_SUB_HARMONICS]; // Relative BandWidth ("64"=1.0) uchar Pbwscale; // how much the bandwidth is increased according // to lower/higher frequency; 64-default uchar Pstart; // how the harmonics start, "0" = 0, "1" = random, "2" = 1 }; #endif /*SUB_NOTE_PARAMETERS_H*/ yoshimi-2.3.5.1/src/Params/UnifiedPresets.cpp000066400000000000000000000534361506652756400210430ustar00rootroot00000000000000/* UnifiedPresets.cpp - Presets and Clipboard management Copyright 2018-2024 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "Misc/XMLStore.h" #include "Misc/SynthEngine.h" #include "Misc/TextMsgBuffer.h" #include "Misc/FileMgrFuncs.h" #include "Interface/TextLists.h" #include "Effects/EffectMgr.h" #include "Params/UnifiedPresets.h" #include "Params/ADnoteParameters.h" #include "Params/SUBnoteParameters.h" #include "Params/PADnoteParameters.h" #include "Params/FilterParams.h" #include "Params/LFOParams.h" #include "Params/EnvelopeParams.h" using std::string; using std::to_string; /** * type flags (set) * List - all entries of section type * Group - preset extension and name * Copy - from section to file * Paste - from file to section * * no name given - from/to clipboard)) */ string UnifiedPresets::handleStoreLoad() { if (type == TOPLEVEL::type::List && listFunction > 0) { string group{findPresetType()}; if (listFunction == 2) { /* here we abuse the list routines in order to find out * if there is a clipboard entry for this preset group */ string filename = file::localDir() + "/clipboard/section." + group + EXTEN::presets; if (file::isRegularFile(filename) == 0) { return ""; // no entry of this type } } /* * Skip this invocation without actual processing; * seemingly a command message is sent here redundantly...? */ return findPresetType(); // listFunction != 2 ==> use human friendly id } // when command.value == 1 ==> use the technical id from presetgroups array string name{findPresetType()}; if (name.empty()) { name = "No section presets in this context"; return name; } string dirname{synth.getRuntime().presetsDirlist[synth.getRuntime().presetsRootID]}; if (dirname.empty()) { name = "Directory empty"; return name; } if (type == TOPLEVEL::type::List) { list(dirname, name); } else { if (type & TOPLEVEL::type::Copy) { save(); name = ""; } else if (type & TOPLEVEL::type::Paste) { if (listFunction == 0) load(); else remove(); } } return name; } /** * Access the `presetgroups` array (fixed definition in TextLists.cpp) * @note uses the hidden parameter listFunction to select which column to pick * @remark if listFunction = 2 we want to get the extension not the friendly name */ string UnifiedPresets::listpos(int count) const { uint fieldOffset{listFunction == 1? 1u : 0u}; return presetgroups[count * 2 + fieldOffset]; } string UnifiedPresets::findPresetType() { string name = ""; if (npart != TOPLEVEL::section::systemEffects && npart != TOPLEVEL::section::insertEffects && npart > TOPLEVEL::section::part64) return name; if (kitItem >= EFFECT::type:: none && kitItem < EFFECT::type::count) { if (insert == TOPLEVEL::insert::filterGroup) { if (offset == UNUSED) return listpos(0);//"Pfilter"; else return listpos(1);//"Pfiltern"; } else return listpos(2);//"Peffect"; } switch (insert) { case TOPLEVEL::insert::filterGroup: { if (offset == UNUSED) name = listpos(3);//"Pfilter"; else name = listpos(4);//"Pfiltern"; } break; case TOPLEVEL::insert::oscillatorGroup: name = listpos(5);//"Poscilgen"; break; case TOPLEVEL::insert::resonanceGroup: name = listpos(6);//"Presonance"; break; case TOPLEVEL::insert::LFOgroup: switch (parameter) { case 0: name = listpos(7);//"Plfoamplitude"; break; case 1: name = listpos(8);//"Plfofrequency"; break; case 2: name = listpos(9);//"Plfofilter"; break; } break; case TOPLEVEL::insert::envelopeGroup: switch (parameter) { case 0: name = listpos(10);//"Penvamplitude"; break; case 1: name = listpos(11);//"Penvfrequency"; break; case 2: name = listpos(12);//"Penvfilter"; break; case 3: name = listpos(13);//"Penvbandwidth"; break; } break; } if (!name.empty()) return name; if (engineType >= PART::engine::addVoice1 && engineType < PART::engine::addVoiceModEnd) { return listpos(14);//"Padsythn"; // all voice and modulator level have the same extension } switch (engineType) { case PART::engine::addSynth: name = listpos(15);//"Padsyth"; break; case PART::engine::subSynth: name = listpos(16);//presetgroups[32+listFunction];//"Psubsyth"; break; case PART::engine::padSynth: name = listpos(17);//"Ppadsyth"; break; } return name; } void UnifiedPresets::list(string dirname, string& name) { string list = ""; file::presetsList(dirname, name, presetList); if(presetList.size() > 1) { sort(presetList.begin(), presetList.end()); } for (auto it = begin (presetList); it != end (presetList); ++it) { string tmp = file::findLeafName(*it); size_t pos = tmp.rfind('.'); tmp = tmp.substr(0, pos); list += (tmp + "\n"); } if (list.empty()) name = "No presets of this type found"; else name = list; return; } string UnifiedPresets::accessXML(XMLStore& xml, bool isLoad) { XMLtree xmlTop = xml.accessTop(); if (kitItem >= EFFECT::type::none and kitItem < EFFECT::type::count and not (kitItem == EFFECT::type::dynFilter and insert == TOPLEVEL::insert::filterGroup) ) // ^^^^^^^ passed on to filterGroup rather return effectXML(xmlTop, isLoad); switch (insert) { case TOPLEVEL::insert::resonanceGroup: return resonanceXML(xmlTop, isLoad); case TOPLEVEL::insert::oscillatorGroup: return oscilXML(xmlTop, isLoad); case TOPLEVEL::insert::filterGroup: return filterXML(xmlTop, isLoad); case TOPLEVEL::insert::LFOgroup: return lfoXML(xmlTop, isLoad); case TOPLEVEL::insert::envelopeGroup: return envelopeXML(xmlTop, isLoad); default: return synthXML(xmlTop, isLoad); } } string UnifiedPresets::synthXML(XMLtree& xmlTop, bool isLoad) { string name; if (engineType == PART::engine::addSynth) { name = "Padsyth"; ADnoteParameters* addPars = synth.part[npart]->kit[kitItem].adpars; if (isLoad) { addPars->defaults(); XMLtree xmlAddSynth = xmlTop.getElm(name); addPars->getfromXML(xmlAddSynth); } else { XMLtree xmlAddSynth = xmlTop.addElm(name); addPars->add2XML(xmlAddSynth); } } else if (engineType >= PART::engine::addVoice1) { name = "Padsythn"; ADnoteParameters* addPars = synth.part[npart]->kit[kitItem].adpars; size_t voice = engineType - PART::engine::addVoice1; if (isLoad) { addPars->voiceDefaults(voice); XMLtree xmlVoice = xmlTop.getElm(name); addPars->getfromXML_voice(xmlVoice, voice); } else { XMLtree xmlVoice = xmlTop.addElm(name); addPars->add2XML_voice(xmlVoice, voice); } } else if (engineType == PART::engine::subSynth) { name = "Psubsyth"; SUBnoteParameters* subPars = synth.part[npart]->kit[kitItem].subpars; if (isLoad) { subPars->defaults(); XMLtree xmlSubSynth = xmlTop.getElm(name); subPars->getfromXML(xmlSubSynth); } else { XMLtree xmlSubSynth = xmlTop.addElm(name); subPars->add2XML(xmlSubSynth); } } else if (engineType == PART::engine::padSynth) { name = "Ppadsyth"; PADnoteParameters* padPars = synth.part[npart]->kit[kitItem].padpars; if (isLoad) { padPars->defaults(); XMLtree xmlPadSynth = xmlTop.getElm(name); padPars->getfromXML(xmlPadSynth); } else { XMLtree xmlPadSynth = xmlTop.addElm(name); padPars->add2XML(xmlPadSynth); } } return name; } string UnifiedPresets::effectXML(XMLtree& xmlTop, bool isLoad) { EffectMgr* effect{nullptr}; if (npart == TOPLEVEL::section::systemEffects) { effect = synth.sysefx[engineType]; } else if (npart == TOPLEVEL::section::insertEffects) { effect = synth.insefx[engineType]; } else { effect = synth.part[npart]->partefx[engineType]; } string name{"Peffect"}; if (isLoad) { effect->defaults(); XMLtree xmlEffect = xmlTop.getElm(name); effect->getfromXML(xmlEffect); synth.pushEffectUpdate(npart); } else { XMLtree xmlEffect = xmlTop.addElm(name); effect->add2XML(xmlEffect); } return name; } string UnifiedPresets::resonanceXML(XMLtree& xmlTop, bool isLoad) { string name{"Presonance"}; Resonance* reson{nullptr}; if (engineType == PART::engine::addSynth) reson = synth.part[npart]->kit[kitItem].adpars->GlobalPar.Reson; else if (engineType == PART::engine::padSynth) reson = synth.part[npart]->kit[kitItem].padpars->resonance.get(); else return ""; if (isLoad) { XMLtree xmlRes = xmlTop.getElm(name); reson->getfromXML(xmlRes); } else { XMLtree xmlRes = xmlTop.addElm(name); reson->add2XML(xmlRes); } return name; } string UnifiedPresets::oscilXML(XMLtree& xmlTop, bool isLoad) { string name{"Poscilgen"}; OscilParameters* oscPars{nullptr}; if (engineType >= (PART::engine::addVoice1)) { uint voiceID = engineType - PART::engine::addVoice1; // engine is encoded as: addSynth, subSynth, padSynth, addVoice1...+NUM_VOICES, addMod1....+NUM_VOICES if (engineType >= PART::engine::addMod1) { voiceID -= NUM_VOICES; oscPars = synth.part[npart]->kit[kitItem].adpars->VoicePar[voiceID].POscilFM; } else { oscPars = synth.part[npart]->kit[kitItem].adpars->VoicePar[voiceID].POscil; } } else if (engineType == PART::engine::padSynth) { oscPars = synth.part[npart]->kit[kitItem].padpars->POscil.get(); } else return ""; if (isLoad) { XMLtree xmlOscil = xmlTop.getElm(name); oscPars->getfromXML(xmlOscil); } else { XMLtree xmlOscil = xmlTop.addElm(name); oscPars->add2XML(xmlOscil); } return name; } string UnifiedPresets::filterXML(XMLtree& xmlTop, bool isLoad) { FilterParams* filterPars{nullptr}; // top level if (npart == TOPLEVEL::section::systemEffects) { filterPars = synth.sysefx[0]->filterpars; } else if (npart == TOPLEVEL::section::insertEffects) { filterPars = synth.insefx[0]->filterpars; } // part level else if (kitItem == EFFECT::type::dynFilter) { filterPars = synth.part[npart]->partefx[0]->filterpars; } else if (engineType == PART::engine::addSynth) { filterPars = synth.part[npart]->kit[kitItem].adpars->GlobalPar.GlobalFilter; } else if (engineType >= PART::engine::addVoice1) { filterPars = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].VoiceFilter; } else if (engineType == PART::engine::subSynth) { filterPars = synth.part[npart]->kit[kitItem].subpars->GlobalFilter.get(); } else if (engineType == PART::engine::padSynth) { filterPars = synth.part[npart]->kit[kitItem].padpars->GlobalFilter.get(); } else return ""; string name{offset == UNUSED? "Pfilter" : "Pfiltern"}; if (isLoad) { XMLtree xmlFilter = xmlTop.getElm(name); if (offset == UNUSED) filterPars->getfromXML(xmlFilter); else filterPars->getfromXML_vowel(xmlFilter, offset); } else { XMLtree xmlFilter = xmlTop.addElm(name); if (offset == UNUSED) filterPars->add2XML(xmlFilter); else filterPars->add2XML_vowel(xmlFilter, offset); } return name; } string UnifiedPresets::lfoXML(XMLtree& xmlTop, bool isLoad) { string name; LFOParams* LFOpars{nullptr}; if (engineType == PART::engine::addSynth) { switch (parameter) { case 0: name = "Plfoamplitude"; LFOpars = synth.part[npart]->kit[kitItem].adpars->GlobalPar.AmpLfo; break; case 1: name = "Plfofrequency"; LFOpars = synth.part[npart]->kit[kitItem].adpars->GlobalPar.FreqLfo; break; case 2: name = "Plfofilter"; LFOpars = synth.part[npart]->kit[kitItem].adpars->GlobalPar.FilterLfo; break; } } else if (engineType >= PART::engine::addVoice1) { switch (parameter) { case 0: name = "Plfoamplitude"; LFOpars = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].AmpLfo; break; case 1: name = "Plfofrequency"; LFOpars = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].FreqLfo; break; case 2: name = "Plfofilter"; LFOpars = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].FilterLfo; break; } } else if (engineType == PART::engine::padSynth) { switch (parameter) { case 0: name = "Plfoamplitude"; LFOpars = synth.part[npart]->kit[kitItem].padpars->AmpLfo.get(); break; case 1: name = "Plfofrequency"; LFOpars = synth.part[npart]->kit[kitItem].padpars->FreqLfo.get(); break; case 2: name = "Plfofilter"; LFOpars = synth.part[npart]->kit[kitItem].padpars->FilterLfo.get(); break; } } if (name.empty()) return ""; if (isLoad) { XMLtree xmlLFO = xmlTop.getElm(name); LFOpars->getfromXML(xmlLFO); } else { XMLtree xmlLFO = xmlTop.addElm(name); LFOpars->add2XML(xmlLFO); } return name; } string UnifiedPresets::envelopeXML(XMLtree& xmlTop, bool isLoad) { string name; EnvelopeParams* envPars{nullptr}; if (engineType == PART::engine::addSynth) { switch (parameter) { case 0: name = "Penvamplitude"; envPars = synth.part[npart]->kit[kitItem].adpars->GlobalPar.AmpEnvelope; break; case 1: name = "Penvfrequency"; envPars = synth.part[npart]->kit[kitItem].adpars->GlobalPar.FreqEnvelope; break; case 2: name = "Penvfilter"; envPars = synth.part[npart]->kit[kitItem].adpars->GlobalPar.FilterEnvelope; break; } } else if (engineType >= PART::engine::addVoice1) { switch (parameter) { case 0: name = "Penvamplitude"; envPars = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].AmpEnvelope; break; case 1: name = "Penvfrequency"; envPars = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].FreqEnvelope; break; case 2: name = "Penvfilter"; envPars = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].FilterEnvelope; break; } } else if (engineType == PART::engine::subSynth) { switch (parameter) { case 0: name = "Penvamplitude"; envPars = synth.part[npart]->kit[kitItem].subpars->AmpEnvelope.get(); break; case 1: name = "Penvfrequency"; envPars = synth.part[npart]->kit[kitItem].subpars->FreqEnvelope.get(); break; case 2: name = "Penvfilter"; envPars = synth.part[npart]->kit[kitItem].subpars->GlobalFilterEnvelope.get(); break; case 3: name = "Penvbandwidth"; envPars = synth.part[npart]->kit[kitItem].subpars->BandWidthEnvelope.get(); break; } } else if (engineType == PART::engine::padSynth) { switch (parameter) { case 0: name = "Penvamplitude"; envPars = synth.part[npart]->kit[kitItem].padpars->AmpEnvelope.get(); break; case 1: name = "Penvfrequency"; envPars = synth.part[npart]->kit[kitItem].padpars->FreqEnvelope.get(); break; case 2: name = "Penvfilter"; envPars = synth.part[npart]->kit[kitItem].padpars->FilterEnvelope.get(); break; } } if (name.empty()) return ""; if (isLoad) { XMLtree xmlEnv = xmlTop.getElm(name); envPars->getfromXML(xmlEnv); } else { XMLtree xmlEnv = xmlTop.addElm(name); envPars->add2XML(xmlEnv); } return name; } void UnifiedPresets::save() { auto& logger{synth.getRuntime().getLogger()}; bool zynCompat = true; // for some unclear reason preset/clipboard data is marked as Zyn compatible // (this was discussed 4/2025 and we were not sure what to do about it) XMLStore xml{TOPLEVEL::XML::Presets, zynCompat}; string type = accessXML(xml, false); if (type.empty()) logger("Unrecognised preset type"); else if (not xml) logger("no data retrieved; nothing to store."); else { string filename; string dirname; string name = synth.textMsgBuffer.fetch(mesgID); if (name.empty()) { dirname = file::localDir() + "/clipboard"; if (file::createDir(dirname)) logger("Failed to open clipboard directory"); else filename = dirname + "/section." + type + EXTEN::presets; } else { dirname = synth.getRuntime().presetsDirlist[synth.getRuntime().presetsRootID]; filename = dirname + "/" + name + "." + type + EXTEN::presets; } if (not filename.empty()) xml.saveXMLfile(filename, logger, synth.getRuntime().gzipCompression); } } void UnifiedPresets::load() { string type{findPresetType()}; string name = synth.textMsgBuffer.fetch(mesgID); string dirname; string prefix; auto& logger{synth.getRuntime().getLogger()}; if (name.empty()) { dirname = file::localDir() + "/clipboard"; if (file::createDir(dirname)) { logger("Failed to open clipboard directory"); } else { prefix = dirname + "/section."; } } else { dirname = synth.getRuntime().presetsDirlist[synth.getRuntime().presetsRootID]; prefix = dirname + "/" + name + "."; } string filename = prefix + type + EXTEN::presets; if (file::isRegularFile(prefix + type + EXTEN::presets) == 0) { logger("Can't match " + filename + " here."); return; } XMLStore xml{filename, logger}; postLoadCheck(xml,synth); if (xml) accessXML(xml, true); else logger("Warning: could not read/parse preset file \""+filename+"\""); } void UnifiedPresets::remove() { listFunction = 0; // cause findPresetType() to pick the extension (not the description) string type = findPresetType(); string name = synth.textMsgBuffer.fetch(mesgID); string dirname = synth.getRuntime().presetsDirlist[synth.getRuntime().presetsRootID]; string filename = dirname + "/" + name + "." + type + EXTEN::presets; file::deleteFile(filename); } yoshimi-2.3.5.1/src/Params/UnifiedPresets.h000066400000000000000000000060361506652756400205020ustar00rootroot00000000000000/* UnifiedPresets.h - Presets and Clipboard management Copyright 2018, 2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef U_PRESETS_H #define U_PRESETS_H #include #include #include #include "globals.h" #include "Interface/TextLists.h" using std::vector; using std::string; inline string listpos(int count, int human) { return presetgroups[count * 2 + human]; } class SynthEngine; class XMLStore; class XMLtree; class UnifiedPresets { SynthEngine& synth; const uchar type; const uchar npart; const uchar kitItem; const uchar engineType; const uchar parameter; const uchar offset; const uchar insert; const uchar mesgID; int listFunction; // used to select the extension or the friendly name in listing vector presetList; public: UnifiedPresets(SynthEngine& synthInstance, CommandBlock& cmd) : synth{synthInstance} , type{cmd.data.type} , npart{cmd.data.part} , kitItem{cmd.data.kit} , engineType{cmd.data.engine} , parameter{cmd.data.parameter} , offset{cmd.data.offset} , insert{cmd.data.insert} , mesgID{cmd.data.miscmsg} , listFunction(lrint(cmd.data.value)) , presetList{} { }; // shall not be copied nor moved UnifiedPresets(UnifiedPresets&&) = delete; UnifiedPresets(UnifiedPresets const&) = delete; UnifiedPresets& operator=(UnifiedPresets&&) = delete; UnifiedPresets& operator=(UnifiedPresets const&) = delete; string handleStoreLoad(); private: void save(); void load(); void remove(); void list(string dirname, string& name); string findPresetType(); string accessXML (XMLStore&, bool isLoad); string synthXML (XMLtree&, bool isLoad); string effectXML (XMLtree&, bool isLoad); string resonanceXML(XMLtree&, bool isLoad); string oscilXML (XMLtree&, bool isLoad); string filterXML (XMLtree&, bool isLoad); string lfoXML (XMLtree&, bool isLoad); string envelopeXML (XMLtree&, bool isLoad); string listpos(int count) const; }; #endif yoshimi-2.3.5.1/src/Synth/000077500000000000000000000000001506652756400152555ustar00rootroot00000000000000yoshimi-2.3.5.1/src/Synth/ADnote.cpp000066400000000000000000003041741506652756400171440ustar00rootroot00000000000000/* ADnote.cpp - The "additive" synthesizer Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2019, Will Godfrey & others Copyright 2020-2021 Kristian Amlie & Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #include #include #include #include "Synth/Envelope.h" #include "Synth/ADnote.h" #include "Synth/LFO.h" #include "DSP/Filter.h" #include "Params/ADnoteParameters.h" #include "Params/Controller.h" #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Misc/NumericFuncs.h" #include "globals.h" using func::power; using func::decibel; using synth::velF; using synth::getDetune; using synth::interpolateAmplitude; using synth::aboveAmplitudeThreshold; using func::setRandomPan; using std::isgreater; ADnote::ADnoteGlobal::ADnoteGlobal() : detune{0.0f} , freqEnvelope{} , freqLFO{} , volume{0.0f} , randpanL{0.0f} , randpanR{0.0f} , fadeinAdjustment{0.0f} , ampEnvelope{} , ampLFO{} , punch{} , filterL{} , filterR{} , filterEnvelope{} , filterLFO{} { } ADnote::ADnoteGlobal::ADnoteGlobal(ADnoteGlobal const& o) : detune{o.detune} , freqEnvelope{} , freqLFO{} , volume{o.volume} , randpanL{o.randpanL} , randpanR{o.randpanR} , fadeinAdjustment{o.fadeinAdjustment} , ampEnvelope{} , ampLFO{} , punch{o.punch} , filterL{} , filterR{} , filterEnvelope{} , filterLFO{} { // Clone all sub components owned by this note freqEnvelope.reset(new Envelope{*o.freqEnvelope}); freqLFO .reset(new LFO{*o.freqLFO}); ampEnvelope .reset(new Envelope{*o.ampEnvelope}); ampLFO .reset(new LFO{*o.ampLFO}); filterEnvelope.reset(new Envelope{*o.filterEnvelope}); filterLFO .reset(new LFO{*o.filterLFO}); filterL.reset(new Filter{*o.filterL}); if (o.filterR) filterR.reset(new Filter{*o.filterR}); } ADnote::~ADnote() { /* all clean-up done automatically */ } // Internal: this constructor does the actual initialisation.... ADnote::ADnote(ADnoteParameters& adpars_, Controller& ctl_, Note note_, bool portamento_ ,ADnote* topVoice_, int subVoice_, int phaseOffset, float *parentFMmod_ , bool forFM_, size_t unison_total_size) : synth{adpars_.getSynthEngine()} , adpars{adpars_} , paramsUpdate{adpars} , ctl{ctl_} , note{note_} , stereo{adpars.GlobalPar.PStereo} , noteStatus{NOTE_ENABLED} , tSpot{0} , paramRNG{} , paramSeed{0} , oscposhi{} , oscposlo{} , oscfreqhi{} , oscfreqlo{} , oscposhiFM{} , oscposloFM{} , oscfreqhiFM{} , oscfreqloFM{} , unison_base_freq_rap{} , unison_freq_rap{} , unison_invert_phase{} , unison_vibrato{} , oldAmplitude{} , newAmplitude{} , fm_oldAmplitude{} , fm_newAmplitude{} , fm_oldSmp{} , fmfm_oldPhase{} , fmfm_oldPMod{} , fmfm_oldInterpPhase{} , fm_oldOscPhase{} , fm_oldOscPMod{} , fm_oldOscInterpPhase{} , forFM{forFM_} , portamento{portamento_} , subVoice{} , subFMVoice{} , subVoiceNr{subVoice_} , topVoice{topVoice_} , parentFMmod{parentFMmod_} { // Start phase for sub-Voices should be negative so that the zero phase in // the first cycle will result in a positive phase change. int phase = (topVoice==this)? 0 : synth.oscilsize - phaseOffset; for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { NoteVoicePar[nvoice].phaseOffset = phase; NoteVoicePar[nvoice].fmPhaseOffset = phase; } construct(unison_total_size); } // Public Constructor for ordinary (top-level) voices ADnote::ADnote(ADnoteParameters& adpars_, Controller& ctl_, Note note_, bool portamento_) : ADnote(adpars_ ,ctl_ ,note_ ,portamento_ , this // marker: "this is a topVoice" ,-1 // marker: "this is not a subVoice" , 0 // top voice starts without phaseOffset , nullptr // no parentFMmod , false // not forFM_ , 1 // One single top level voice ) { } // Public Constructor used to create "proxy notes" to attach to another voice within the same ADnote ADnote::ADnote(ADnote *topVoice_, float freq_, int phase_offset_, int subVoiceNumber_, float *parentFMmod_, bool forFM_, size_t unison_total_size) : ADnote(topVoice_->adpars ,topVoice_->ctl ,topVoice_->note.withFreq(freq_) ,topVoice_->portamento ,topVoice_ ,subVoiceNumber_ ,phase_offset_ ,parentFMmod_ ,forFM_ ,unison_total_size) { } namespace{ // Array-cloning helper template using VoiceUnisonArray = std::array, NUM_VOICES>; template inline void cloneArray(VoiceUnisonArray OBJ::*arrMember ,OBJ& newData, OBJ const& oldData ,size_t voice, size_t unisonSiz) { using Arr = VoiceUnisonArray; Arr const& oldArray = oldData.*arrMember; Arr& newArray = newData.*arrMember; newArray[voice].reset(new VAL[unisonSiz]); memcpy(newArray[voice].get(), oldArray[voice].get(), unisonSiz * sizeof(VAL)); } } // Copy constructor, used only used for legato (as of 4/2022) ADnote::ADnote(ADnote const& orig, ADnote *topVoice_, float *parentFMmod_) : synth{orig.synth} , adpars{orig.adpars} // Probably okay for legato? , paramsUpdate{adpars} , ctl{orig.ctl} , note{orig.note} , stereo{orig.stereo} , noteStatus{orig.noteStatus} , noteGlobal{orig.noteGlobal} , tSpot{orig.tSpot} , paramRNG{orig.paramRNG} , paramSeed{orig.paramSeed} , detuneFromParent{orig.detuneFromParent} , unisonDetuneFactorFromParent{orig.unisonDetuneFactorFromParent} , forFM{orig.forFM} , max_unison{orig.max_unison} , globaloldamplitude{orig.globaloldamplitude} , globalnewamplitude{orig.globalnewamplitude} , portamento{orig.portamento} , bandwidthDetuneMultiplier{orig.bandwidthDetuneMultiplier} , legatoFade{0.0f} // Silent by default , legatoFadeStep{0.0f} // Legato disabled , pangainL{orig.pangainL} , pangainR{orig.pangainR} , subVoice{} , subFMVoice{} , subVoiceNr{orig.subVoiceNr} , topVoice{topVoice_? topVoice_ : this} , parentFMmod{parentFMmod_} { // These are all arrays, so sizeof is correct memcpy(pinking, orig.pinking, sizeof(pinking)); memcpy(firsttick, orig.firsttick, sizeof(firsttick)); memcpy(oldAmplitude, orig.oldAmplitude, sizeof(oldAmplitude)); memcpy(newAmplitude, orig.newAmplitude, sizeof(newAmplitude)); memcpy(fm_oldAmplitude, orig.fm_oldAmplitude, sizeof(fm_oldAmplitude)); memcpy(fm_newAmplitude, orig.fm_newAmplitude, sizeof(fm_newAmplitude)); memcpy(unison_size, orig.unison_size, sizeof(unison_size)); memcpy(unison_stereo_spread, orig.unison_stereo_spread, sizeof(unison_stereo_spread)); memcpy(freqbasedmod, orig.freqbasedmod, sizeof(freqbasedmod)); allocateUnison(max_unison, synth.buffersize); for (int voice = 0; voice < NUM_VOICES; ++voice) { auto& vpar = NoteVoicePar[voice]; auto& ovpar = orig.NoteVoicePar[voice]; vpar.enabled = ovpar.enabled; vpar.fmEnabled = ovpar.fmEnabled; if (ovpar.voiceOut) { vpar.voiceOut.reset(synth.buffersize); ///TODO: is copying of output buffers contents really necessary? memcpy(vpar.voiceOut.get(), ovpar.voiceOut.get(), synth.bufferbytes); } else vpar.voiceOut.reset(); // The above vars are checked in killNote() even when the voice is // disabled, so short-circuit only after they are set if (!vpar.enabled) continue; // First, copy over everything that isn't behind a pointer vpar.voice = ovpar.voice; vpar.noiseType = ovpar.noiseType; vpar.filterBypass = ovpar.filterBypass; vpar.delayTicks = ovpar.delayTicks; vpar.phaseOffset = ovpar.phaseOffset; vpar.fixedFreq = ovpar.fixedFreq; vpar.fixedFreqET = ovpar.fixedFreqET; vpar.detune = ovpar.detune; vpar.fineDetune = ovpar.fineDetune; vpar.bendAdjust = ovpar.bendAdjust; vpar.offsetHz = ovpar.offsetHz; vpar.volume = ovpar.volume; vpar.panning = ovpar.panning; vpar.randpanL = ovpar.randpanL; vpar.randpanR = ovpar.randpanR; vpar.punch = ovpar.punch; vpar.fmFreqFixed = ovpar.fmFreqFixed; vpar.fmVoice = ovpar.fmVoice; vpar.fmPhaseOffset = ovpar.fmPhaseOffset; vpar.fmVolume = ovpar.fmVolume; vpar.fmDetuneFromBaseOsc = ovpar.fmDetuneFromBaseOsc; vpar.fmDetune = ovpar.fmDetune; // Now handle allocations if (subVoiceNr == -1) { vpar.oscilSmp.copyWaveform(ovpar.oscilSmp); vpar.fmSmp.copyWaveform(ovpar.fmSmp); } else { vpar.oscilSmp.attachReference(topVoice->NoteVoicePar[voice].oscilSmp); vpar.fmSmp.attachReference(topVoice->NoteVoicePar[voice].fmSmp); } if (ovpar.freqEnvelope) vpar.freqEnvelope.reset(new Envelope{*ovpar.freqEnvelope}); if (ovpar.freqLFO) vpar.freqLFO.reset(new LFO{*ovpar.freqLFO}); if (ovpar.ampEnvelope) vpar.ampEnvelope.reset(new Envelope{*ovpar.ampEnvelope}); if (ovpar.ampLFO) vpar.ampLFO.reset(new LFO{*ovpar.ampLFO}); if (orig.adpars.VoicePar[voice].PFilterEnabled) // (adpars is shared) { vpar.voiceFilterL.reset(new Filter{*ovpar.voiceFilterL}); vpar.voiceFilterR.reset(new Filter{*ovpar.voiceFilterR}); } else { vpar.voiceFilterL.reset(); vpar.voiceFilterR.reset(); } if (ovpar.filterEnvelope) vpar.filterEnvelope.reset(new Envelope{*ovpar.filterEnvelope}); if (ovpar.filterLFO) vpar.filterLFO.reset(new LFO{*ovpar.filterLFO}); if (ovpar.fmFreqEnvelope) vpar.fmFreqEnvelope.reset(new Envelope{*ovpar.fmFreqEnvelope}); if (ovpar.fmAmpEnvelope) vpar.fmAmpEnvelope.reset(new Envelope{*ovpar.fmAmpEnvelope}); // NoteVoicePar done int unison = unison_size[voice]; cloneArray(&ADnote::oscposhi, *this, orig, voice, unison); cloneArray(&ADnote::oscposlo, *this, orig, voice, unison); cloneArray(&ADnote::oscfreqhi, *this, orig, voice, unison); cloneArray(&ADnote::oscfreqlo, *this, orig, voice, unison); cloneArray(&ADnote::oscposhiFM, *this, orig, voice, unison); cloneArray(&ADnote::oscposloFM, *this, orig, voice, unison); cloneArray(&ADnote::oscfreqhiFM, *this, orig, voice, unison); cloneArray(&ADnote::oscfreqloFM, *this, orig, voice, unison); cloneArray(&ADnote::unison_base_freq_rap,*this, orig, voice, unison); cloneArray(&ADnote::unison_freq_rap, *this, orig, voice, unison); cloneArray(&ADnote::unison_invert_phase, *this, orig, voice, unison); unison_vibrato[voice].amplitude = orig.unison_vibrato[voice].amplitude; unison_vibrato[voice].step.reset(new float[unison]); memcpy(unison_vibrato[voice].step.get(), orig.unison_vibrato[voice].step.get(), unison * sizeof(float)); unison_vibrato[voice].position.reset(new float[unison]); memcpy(unison_vibrato[voice].position.get(), orig.unison_vibrato[voice].position.get(), unison * sizeof(float)); cloneArray(&ADnote::fm_oldSmp, *this, orig, voice, unison); if (parentFMmod != NULL) { if (NoteVoicePar[voice].fmEnabled == FREQ_MOD) { cloneArray(&ADnote::fmfm_oldPhase, *this, orig, voice, unison); cloneArray(&ADnote::fmfm_oldPMod, *this, orig, voice, unison); cloneArray(&ADnote::fmfm_oldInterpPhase, *this, orig, voice, unison); } if (forFM) { cloneArray(&ADnote::fm_oldOscPhase, *this, orig, voice, unison); cloneArray(&ADnote::fm_oldOscPMod, *this, orig, voice, unison); cloneArray(&ADnote::fm_oldOscInterpPhase, *this, orig, voice, unison); } } if (orig.subVoice[voice]) { subVoice[voice].reset(new unique_ptr[orig.unison_size[voice]]); for (size_t k = 0; k < orig.unison_size[voice]; ++k) subVoice[voice][k].reset(new ADnote(*orig.subVoice[voice][k] , topVoice , freqbasedmod[voice]? tmpmod_unison[k].get() : parentFMmod)); } if (orig.subFMVoice[voice]) { subFMVoice[voice].reset(new unique_ptr[orig.unison_size[voice]]); for (size_t k = 0; k < orig.unison_size[voice]; ++k) { subFMVoice[voice][k].reset(new ADnote(*orig.subFMVoice[voice][k] , topVoice , parentFMmod)); } } } } void ADnote::construct(size_t unison_total_size) { // Initialise some legato-specific vars legatoFade = 1.0f; // Full volume legatoFadeStep = 0.0f; // Legato disabled paramSeed = synth.randomINT(); setRandomPan(synth.numRandom(), noteGlobal.randpanL, noteGlobal.randpanR, synth.getRuntime().panLaw, adpars.GlobalPar.PPanning, adpars.GlobalPar.PWidth); noteGlobal.fadeinAdjustment = adpars.GlobalPar.Fadein_adjustment / (float)FADEIN_ADJUSTMENT_SCALE; noteGlobal.fadeinAdjustment *= noteGlobal.fadeinAdjustment; if (adpars.GlobalPar.PPunchStrength) { noteGlobal.punch.enabled = true; noteGlobal.punch.t = 1.0f; //start from 1.0 and to 0.0 noteGlobal.punch.initialvalue = ((power<10>(1.5f * adpars.GlobalPar.PPunchStrength / 127.0f) - 1.0f) * velF(note.vel, adpars.GlobalPar.PPunchVelocitySensing)); float time = power<10>(3.0f * adpars.GlobalPar.PPunchTime / 127.0f) / 10000.0f; // 0.1 .. 100 ms float stretch = powf(440.0f / note.freq, adpars.GlobalPar.PPunchStretch / 64.0f); noteGlobal.punch.dt = 1.0f / (time * synth.samplerate_f * stretch); } else noteGlobal.punch.enabled = false; detuneFromParent = 0.0; unisonDetuneFactorFromParent = 1.0; for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { for (int i = 0; i < 14; i++) pinking[nvoice][i] = 0.0; NoteVoicePar[nvoice].voiceOut.reset(); NoteVoicePar[nvoice].fmEnabled = NONE; NoteVoicePar[nvoice].fmRingToSide = false; NoteVoicePar[nvoice].fmVoice = -1; unison_size[nvoice] = 1; // If used as a sub voice, enable exactly one voice, the requested // one. If not, enable voices that are enabled in settings. if (not (adpars.VoicePar[nvoice].Enabled and (subVoiceNr == -1 or nvoice == subVoiceNr))) { NoteVoicePar[nvoice].enabled = false; continue; // the voice is disabled } NoteVoicePar[nvoice].enabled = true; int unison = adpars.VoicePar[nvoice].Unison_size; if (unison < 1) unison = 1; bool is_pwm = adpars.VoicePar[nvoice].PFMEnabled == PW_MOD; if (adpars.VoicePar[nvoice].Type != 0) { // Since noise unison of greater than two is touch goofy... if (unison > 2) unison = 2; } else if (is_pwm) { /* Pulse width mod uses pairs of subvoices. */ unison *= 2; // This many is likely to sound like noise anyhow. if (unison > 64) unison = 64; } if (subVoiceNr != -1) { // Prevent combinatorial explosion in sub voices: Limit unison count // to stay under the MAX_UNISON limit. if (unison * unison_total_size > MAX_UNISON) { unison = MAX_UNISON / unison_total_size; if (unison < 1) unison = 1; } } // compute unison unison_size[nvoice] = unison; unison_base_freq_rap[nvoice].reset(new float[unison]{0}); unison_freq_rap [nvoice].reset(new float[unison]{0}); unison_invert_phase [nvoice].reset(new bool[unison]{false}); unison_vibrato[nvoice].step .reset(new float[unison]{0}); unison_vibrato[nvoice].position.reset(new float[unison]{0}); if (unison >> is_pwm > 1) { for (int k = 0; k < unison; ++k) { unison_vibrato[nvoice].position[k] = synth.numRandom() * 1.8f - 0.9f; // Give step a random direction. The amplitude doesn't matter right // now, only the sign, which will be preserved in // computeNoteParameters(). if (synth.numRandom() < 0.5f) unison_vibrato[nvoice].step[k] = -1.0f; else unison_vibrato[nvoice].step[k] = 1.0f; if (is_pwm) { // Set the next position the same as this one. unison_vibrato[nvoice].position[k+1] = unison_vibrato[nvoice].position[k]; ++k; // Skip an iteration. // step and amplitude are handled in computeNoteParameters. } } } else // No vibrato for a single voice { if (is_pwm) { unison_vibrato[nvoice].position[1] = 0.0f; } if (is_pwm || unison == 1) { unison_vibrato[nvoice].position[0] = 0.0f; } } oscposhi[nvoice].reset(new int[unison]{0});// zero-init oscposlo[nvoice].reset(new float[unison]{0}); oscfreqhi[nvoice].reset(new int[unison]{0}); oscfreqlo[nvoice].reset(new float[unison]{0}); oscposhiFM[nvoice].reset(new int[unison]{0}); oscposloFM[nvoice].reset(new float[unison]{0}); oscfreqhiFM[nvoice].reset(new int[unison]{0}); oscfreqloFM[nvoice].reset(new float[unison]{0}); NoteVoicePar[nvoice].voice = adpars.VoicePar[nvoice].PVoice; int vc = nvoice; if (adpars.VoicePar[nvoice].Pextoscil != -1) vc = adpars.VoicePar[nvoice].Pextoscil; // prepare wavetable for the voice's oscil or external voice's oscil if (subVoiceNr == -1) { // this voice manages its own oscillator wavetable NoteVoicePar[nvoice].oscilSmp.allocateWaveform(synth.oscilsize); // Draw new seed for randomisation of harmonics // Since NoteON happens at random times, this actually injects entropy adpars.VoicePar[nvoice].OscilSmp->newrandseed(); if (!adpars.GlobalPar.Hrandgrouping) adpars.VoicePar[vc].OscilSmp->newrandseed(); // Actual OscilSmp rendering done later. } else { // If subvoice, use oscillator from original voice. NoteVoicePar[nvoice].oscilSmp.attachReference(topVoice->NoteVoicePar[nvoice].oscilSmp); } if (adpars.VoicePar[nvoice].Type != 0) NoteVoicePar[nvoice].fmEnabled = NONE; else switch (adpars.VoicePar[nvoice].PFMEnabled) { case 1: NoteVoicePar[nvoice].fmEnabled = MORPH; freqbasedmod[nvoice] = false; break; case 2: NoteVoicePar[nvoice].fmEnabled = RING_MOD; freqbasedmod[nvoice] = false; break; case 3: NoteVoicePar[nvoice].fmEnabled = PHASE_MOD; freqbasedmod[nvoice] = true; break; case 4: NoteVoicePar[nvoice].fmEnabled = FREQ_MOD; freqbasedmod[nvoice] = true; break; case 5: NoteVoicePar[nvoice].fmEnabled = PW_MOD; freqbasedmod[nvoice] = true; break; default: NoteVoicePar[nvoice].fmEnabled = NONE; freqbasedmod[nvoice] = false; break; } NoteVoicePar[nvoice].fmRingToSide = adpars.VoicePar[nvoice].PFMringToSide; NoteVoicePar[nvoice].fmVoice = adpars.VoicePar[nvoice].PFMVoice; fm_oldSmp[nvoice].reset(new float [unison]{0}); // zero init firsttick[nvoice] = 1; NoteVoicePar[nvoice].delayTicks = (int)((expf(adpars.VoicePar[nvoice].PDelay / 127.0f * logf(50.0f)) - 1.0f) / synth.fixed_sample_step_f / 10.0f); if (parentFMmod != NULL && NoteVoicePar[nvoice].fmEnabled == FREQ_MOD) { fmfm_oldPhase[nvoice].reset(new float [unison]{0}); // zero init fmfm_oldPMod [nvoice].reset(new float [unison]{0}); fmfm_oldInterpPhase[nvoice].reset(new float [unison]{0}); } if (parentFMmod != NULL && forFM) { fm_oldOscPhase[nvoice].reset(new float [unison]{0}); // zero init fm_oldOscPMod [nvoice].reset(new float [unison]{0}); fm_oldOscInterpPhase[nvoice].reset(new float [unison]{0}); } } max_unison = 1; for (size_t nvoice = 0; nvoice < NUM_VOICES; ++nvoice) if (unison_size[nvoice] > max_unison) max_unison = unison_size[nvoice]; allocateUnison(max_unison, synth.buffersize); initParameters(); initSubVoices(unison_total_size); globalnewamplitude = noteGlobal.volume * noteGlobal.ampEnvelope->envout_dB() * noteGlobal.ampLFO->amplfoout(); } void ADnote::allocateUnison(size_t unisonCnt, size_t buffSize) { tmpwave_unison.reset(new Samples[unisonCnt]); tmpmod_unison .reset(new Samples[unisonCnt]); for (size_t k = 0; k < unisonCnt; ++k) { tmpwave_unison[k].reset(buffSize); tmpmod_unison[k] .reset(buffSize); } } void ADnote::initSubVoices(size_t unison_total_size) { for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { if (!NoteVoicePar[nvoice].enabled) continue; if (NoteVoicePar[nvoice].voice != -1) { computePhaseOffsets(nvoice); subVoice[nvoice].reset(new unique_ptr[unison_size[nvoice]]); for (size_t k = 0; k < unison_size[nvoice]; ++k) { float *freqmod = freqbasedmod[nvoice] ? tmpmod_unison[k].get() : parentFMmod; subVoice[nvoice][k].reset(new ADnote(topVoice, getVoiceBaseFreq(nvoice), oscposhi[nvoice][k], NoteVoicePar[nvoice].voice, freqmod, forFM, unison_size[nvoice] * unison_total_size)); } } if (NoteVoicePar[nvoice].fmVoice != -1) { computeFMPhaseOffsets(nvoice); bool voiceForFM = NoteVoicePar[nvoice].fmEnabled == FREQ_MOD; subFMVoice[nvoice].reset(new unique_ptr[unison_size[nvoice]]); for (size_t k = 0; k < unison_size[nvoice]; ++k) { subFMVoice[nvoice][k].reset(new ADnote(topVoice, getFMVoiceBaseFreq(nvoice), oscposhiFM[nvoice][k], NoteVoicePar[nvoice].fmVoice, parentFMmod, voiceForFM, unison_size[nvoice] * unison_total_size)); } } } } // Note portamento does not recompute note parameters, since it should be a smooth change in pitch, // with no change in timbre (or at least rather a gradual one). It may be desirable to have base // frequency sensitive things like filter scaling and envelope stretching take portamento into account, // but to do this properly would require more than just recalculating based on a fixed base frequency, // and the current code is thus not able to implement that. void ADnote::performPortamento(Note note_) { portamento = true; this->note = note_; for (int i = 0; i < NUM_VOICES; ++i) { if (not NoteVoicePar[i].enabled) continue; // sub-Voices can only be attached to enabled voices if (subVoice[i]) for (size_t k = 0; k < unison_size[i]; ++k) subVoice[i][k]->performPortamento(note.withFreq(getVoiceBaseFreq(i))); if (subFMVoice[i]) for (size_t k = 0; k < unison_size[i]; ++k) subFMVoice[i][k]->performPortamento(note.withFreq(getFMVoiceBaseFreq(i))); } } void ADnote::legatoFadeIn(Note note_) { portamento = false; // portamento-legato treated separately this->note = note_; // Re-randomize harmonics if (subVoiceNr == -1) for (int i = 0; i < NUM_VOICES; ++i) { adpars.VoicePar[i].OscilSmp->newrandseed(); int extoscil = adpars.VoicePar[i].Pextoscil; if (extoscil != -1 && !adpars.GlobalPar.Hrandgrouping) adpars.VoicePar[extoscil].OscilSmp->newrandseed(); } // This recalculates stuff like harmonic phase/amplitude randomness, // not sure if desirable for legato, at least it ensures sane initialisation. // Note: to the contrary, Portamento does not re-init any of these values. computeNoteParameters(); legatoFade = 0.0f; // Start crossfade silent legatoFadeStep = synth.fadeStepShort; // Positive steps for (int i = 0; i < NUM_VOICES; ++i) { if (not NoteVoicePar[i].enabled) continue; // sub-Voices can only be attached to enabled voices if (subVoice[i]) for (size_t k = 0; k < unison_size[i]; ++k) subVoice[i][k]->legatoFadeIn(note.withFreq(getVoiceBaseFreq(i))); if (subFMVoice[i]) for (size_t k = 0; k < unison_size[i]; ++k) subFMVoice[i][k]->legatoFadeIn(note.withFreq(getFMVoiceBaseFreq(i))); } } void ADnote::legatoFadeOut() { for (int i = 0; i < NUM_VOICES; ++i) { if (not NoteVoicePar[i].enabled) continue; // sub-Voices can only be attached to enabled voices if (subVoice[i]) for (size_t k = 0; k < unison_size[i]; ++k) subVoice[i][k]->legatoFadeOut(); if (subFMVoice[i]) for (size_t k = 0; k < unison_size[i]; ++k) subFMVoice[i][k]->legatoFadeOut(); } legatoFade = 1.0f; // crossfade down from full volume legatoFadeStep = -synth.fadeStepShort; // Negative steps // transitory state similar to a released Envelope noteStatus = NOTE_LEGATOFADEOUT; } // Kill a voice of ADnote void ADnote::killVoice(int nvoice) { oscposhi[nvoice].reset(); oscposlo[nvoice].reset(); oscfreqhi[nvoice].reset(); oscfreqlo[nvoice].reset(); oscposhiFM[nvoice].reset(); oscposloFM[nvoice].reset(); oscfreqhiFM[nvoice].reset(); oscfreqloFM[nvoice].reset(); unison_base_freq_rap[nvoice].reset(); unison_freq_rap[nvoice].reset(); unison_invert_phase[nvoice].reset(); fm_oldSmp[nvoice].reset(); unison_vibrato[nvoice].step.reset(); unison_vibrato[nvoice].position.reset(); subVoice[nvoice].reset(); subFMVoice[nvoice].reset(); NoteVoicePar[nvoice].freqEnvelope.reset(); NoteVoicePar[nvoice].freqLFO.reset(); NoteVoicePar[nvoice].ampEnvelope.reset(); NoteVoicePar[nvoice].ampLFO.reset(); NoteVoicePar[nvoice].voiceFilterL.reset(); NoteVoicePar[nvoice].voiceFilterR.reset(); NoteVoicePar[nvoice].filterEnvelope.reset(); NoteVoicePar[nvoice].filterLFO.reset(); NoteVoicePar[nvoice].fmFreqEnvelope.reset(); NoteVoicePar[nvoice].fmAmpEnvelope.reset(); if (NoteVoicePar[nvoice].voiceOut) memset(NoteVoicePar[nvoice].voiceOut.get(), 0, synth.bufferbytes); // do not delete, yet: perhaps is used by another voice if (parentFMmod != NULL && NoteVoicePar[nvoice].fmEnabled == FREQ_MOD) { fmfm_oldPhase[nvoice].reset(); fmfm_oldPMod[nvoice].reset(); fmfm_oldInterpPhase[nvoice].reset(); } if (parentFMmod != NULL && forFM) { fm_oldOscPhase[nvoice].reset(); fm_oldOscPMod[nvoice].reset(); fm_oldOscInterpPhase[nvoice].reset(); } NoteVoicePar[nvoice].enabled = false; } // Kill the note void ADnote::killNote() { // Note: Storage for samples is managed automatically by SampleHolder // Subvoices and all sub-components use automatic memory management // and will be discarded by the dtor, which is invoked shortly thereafter noteStatus = NOTE_DISABLED; // causes clean-up of this note instance } // Init the parameters void ADnote::initParameters() { int nvoice, i; // Global Parameters noteGlobal.freqEnvelope.reset(new Envelope{adpars.GlobalPar.FreqEnvelope, note.freq, &synth}); noteGlobal.freqLFO .reset(new LFO{adpars.GlobalPar.FreqLfo, note.freq, &synth}); noteGlobal.ampEnvelope .reset(new Envelope{adpars.GlobalPar.AmpEnvelope, note.freq, &synth}); noteGlobal.ampLFO .reset(new LFO{adpars.GlobalPar.AmpLfo, note.freq, &synth}); noteGlobal.ampEnvelope->envout_dB(); // discard the first envelope output noteGlobal.filterEnvelope.reset(new Envelope{adpars.GlobalPar.FilterEnvelope, note.freq, &synth}); noteGlobal.filterLFO .reset(new LFO{adpars.GlobalPar.FilterLfo, note.freq, &synth}); noteGlobal.filterL.reset(new Filter{* adpars.GlobalPar.GlobalFilter, synth}); if (stereo) noteGlobal.filterR.reset(new Filter{* adpars.GlobalPar.GlobalFilter, synth}); // Forbids the Modulation Voice to be greater or equal than voice for (i = 0; i < NUM_VOICES; ++i) if (NoteVoicePar[i].fmVoice >= i) NoteVoicePar[i].fmVoice = -1; // Voice Parameter init for (nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { if (!NoteVoicePar[nvoice].enabled) continue; NoteVoicePar[nvoice].noiseType = adpars.VoicePar[nvoice].Type; setRandomPan(synth.numRandom() ,NoteVoicePar[nvoice].randpanL ,NoteVoicePar[nvoice].randpanR ,synth.getRuntime().panLaw ,adpars.VoicePar[nvoice].PPanning ,adpars.VoicePar[nvoice].PWidth); newAmplitude[nvoice] = 1.0f; if (adpars.VoicePar[nvoice].PAmpEnvelopeEnabled) { NoteVoicePar[nvoice].ampEnvelope.reset(new Envelope{adpars.VoicePar[nvoice].AmpEnvelope, note.freq, &synth}); NoteVoicePar[nvoice].ampEnvelope->envout_dB(); // discard the first envelope sample newAmplitude[nvoice] *= NoteVoicePar[nvoice].ampEnvelope->envout_dB(); } if (adpars.VoicePar[nvoice].PAmpLfoEnabled) { NoteVoicePar[nvoice].ampLFO.reset(new LFO{adpars.VoicePar[nvoice].AmpLfo, note.freq, &synth}); newAmplitude[nvoice] *= NoteVoicePar[nvoice].ampLFO->amplfoout(); } // Voice Frequency Parameters Init if (adpars.VoicePar[nvoice].PFreqEnvelopeEnabled) NoteVoicePar[nvoice].freqEnvelope.reset(new Envelope{adpars.VoicePar[nvoice].FreqEnvelope, note.freq, &synth}); if (adpars.VoicePar[nvoice].PFreqLfoEnabled) NoteVoicePar[nvoice].freqLFO.reset(new LFO{adpars.VoicePar[nvoice].FreqLfo, note.freq, &synth}); // Voice Filter Parameters Init if (adpars.VoicePar[nvoice].PFilterEnabled) { NoteVoicePar[nvoice].voiceFilterL.reset(new Filter{* adpars.VoicePar[nvoice].VoiceFilter, synth}); NoteVoicePar[nvoice].voiceFilterR.reset(new Filter{* adpars.VoicePar[nvoice].VoiceFilter, synth}); } if (adpars.VoicePar[nvoice].PFilterEnvelopeEnabled) NoteVoicePar[nvoice].filterEnvelope.reset(new Envelope{adpars.VoicePar[nvoice].FilterEnvelope, note.freq, &synth}); if (adpars.VoicePar[nvoice].PFilterLfoEnabled) NoteVoicePar[nvoice].filterLFO.reset(new LFO{adpars.VoicePar[nvoice].FilterLfo, note.freq, &synth}); int kth_start = 0; for (size_t k = 0; k < unison_size[nvoice]; ++k) { oscposhi[nvoice][k] = kth_start; // put random starting point for other subvoices kth_start = (int)(synth.numRandom() * adpars.VoicePar[nvoice].Unison_phase_randomness / 127.0f * (synth.oscilsize - 1)); } // Voice Modulation Parameters Init if (NoteVoicePar[nvoice].fmEnabled != NONE) { if (NoteVoicePar[nvoice].fmVoice < 0) { int vc = nvoice; if (adpars.VoicePar[nvoice].PextFMoscil != -1) vc = adpars.VoicePar[nvoice].PextFMoscil; if (subVoiceNr == -1) { // this voice maintains its own oscil wavetable... NoteVoicePar[nvoice].fmSmp.allocateWaveform(synth.oscilsize); adpars.VoicePar[nvoice].FMSmp->newrandseed(); if (!adpars.GlobalPar.Hrandgrouping) adpars.VoicePar[vc].FMSmp->newrandseed(); } else { // If subvoice use oscillator from original voice. NoteVoicePar[nvoice].fmSmp.attachReference(topVoice->NoteVoicePar[nvoice].fmSmp); } for (size_t k = 0; k < unison_size[nvoice]; ++k) oscposhiFM[nvoice][k] = (oscposhi[nvoice][k] + adpars.VoicePar[vc].FMSmp-> getPhase()) % synth.oscilsize; } else { for (size_t k = 0; k < unison_size[nvoice]; ++k) oscposhiFM[nvoice][k] = oscposhi[nvoice][k]; } } // Offset by oscillator phase. if (NoteVoicePar[nvoice].voice == -1) { int oscposhi_start; oscposhi_start = adpars.VoicePar[nvoice].OscilSmp->getPhase(); for (size_t k = 0; k < unison_size[nvoice]; ++k) oscposhi[nvoice][k] = (oscposhi[nvoice][k] + oscposhi_start) % synth.oscilsize; } if (adpars.VoicePar[nvoice].PFMFreqEnvelopeEnabled) NoteVoicePar[nvoice].fmFreqEnvelope.reset(new Envelope{adpars.VoicePar[nvoice].FMFreqEnvelope, note.freq, &synth}); if (adpars.VoicePar[nvoice].PFMAmpEnvelopeEnabled) NoteVoicePar[nvoice].fmAmpEnvelope.reset(new Envelope{adpars.VoicePar[nvoice].FMAmpEnvelope, note.freq, &synth}); } computeNoteParameters(); for (nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { if (!NoteVoicePar[nvoice].enabled) continue; fm_newAmplitude[nvoice] = NoteVoicePar[nvoice].fmVolume * ctl.fmamp.relamp; if (NoteVoicePar[nvoice].fmAmpEnvelope != NULL) { fm_newAmplitude[nvoice] *= NoteVoicePar[nvoice].fmAmpEnvelope->envout_dB(); } } if (subVoiceNr != -1) NoteVoicePar[subVoiceNr].voiceOut.reset(synth.buffersize); } void ADnote::computeNoteParameters() { paramRNG.init(paramSeed); noteGlobal.detune = getDetune(adpars.GlobalPar.PDetuneType, adpars.GlobalPar.PCoarseDetune, adpars.GlobalPar.PDetune); bandwidthDetuneMultiplier = adpars.getBandwidthDetuneMultiplier(); noteGlobal.volume = 4.0f // +12dB boost (similar on PADnote, while SUBnote only boosts +6dB) * decibel<-60>(1.0f - adpars.GlobalPar.PVolume / 96.0f) // -60 dB .. +19.375 dB * velF(note.vel, adpars.GlobalPar.PAmpVelocityScaleFunction); // velocity sensing for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { if (!NoteVoicePar[nvoice].enabled) continue; if (subVoiceNr == -1) { int BendAdj = adpars.VoicePar[nvoice].PBendAdjust - 64; if (BendAdj % 24 == 0) NoteVoicePar[nvoice].bendAdjust = BendAdj / 24; else NoteVoicePar[nvoice].bendAdjust = BendAdj / 24.0f; } else { // No bend adjustments for sub voices. Take from parent via // detuneFromParent. NoteVoicePar[nvoice].bendAdjust = 0.0f; } float offset_val = (adpars.VoicePar[nvoice].POffsetHz - 64)/64.0f; NoteVoicePar[nvoice].offsetHz = 15.0f*(offset_val * sqrtf(fabsf(offset_val))); NoteVoicePar[nvoice].fixedFreq = adpars.VoicePar[nvoice].Pfixedfreq; NoteVoicePar[nvoice].fixedFreqET = adpars.VoicePar[nvoice].PfixedfreqET; // use the Globalpars.detunetype if the detunetype is 0 if (adpars.VoicePar[nvoice].PDetuneType) { NoteVoicePar[nvoice].detune = getDetune(adpars.VoicePar[nvoice].PDetuneType, adpars.VoicePar[nvoice].PCoarseDetune, 8192); // coarse detune NoteVoicePar[nvoice].fineDetune = getDetune(adpars.VoicePar[nvoice].PDetuneType, 0, adpars.VoicePar[nvoice].PDetune); // fine detune } else { NoteVoicePar[nvoice].detune = getDetune(adpars.GlobalPar.PDetuneType, adpars.VoicePar[nvoice].PCoarseDetune, 8192); // coarse detune NoteVoicePar[nvoice].fineDetune = getDetune(adpars.GlobalPar.PDetuneType, 0, adpars.VoicePar[nvoice].PDetune); // fine detune } if (adpars.VoicePar[nvoice].PFMDetuneType != 0) NoteVoicePar[nvoice].fmDetune = getDetune(adpars.VoicePar[nvoice].PFMDetuneType, adpars.VoicePar[nvoice].PFMCoarseDetune, adpars.VoicePar[nvoice].PFMDetune); else NoteVoicePar[nvoice].fmDetune = getDetune(adpars.GlobalPar.PDetuneType, adpars.VoicePar[nvoice]. PFMCoarseDetune, adpars.VoicePar[nvoice].PFMDetune); NoteVoicePar[nvoice].filterBypass = adpars.VoicePar[nvoice].Pfilterbypass; NoteVoicePar[nvoice].fmDetuneFromBaseOsc = (adpars.VoicePar[nvoice].PFMDetuneFromBaseOsc != 0); NoteVoicePar[nvoice].fmFreqFixed = adpars.VoicePar[nvoice].PFMFixedFreq; if (subVoice[nvoice]) { float basefreq = getVoiceBaseFreq(nvoice); if (basefreq != subVoice[nvoice][0]->note.freq) for (size_t k = 0; k < unison_size[nvoice]; ++k) subVoice[nvoice][k]->note.freq = basefreq; } if (subFMVoice[nvoice]) { float basefreq = getFMVoiceBaseFreq(nvoice); if (basefreq != subFMVoice[nvoice][0]->note.freq) for (size_t k = 0; k < unison_size[nvoice]; ++k) subFMVoice[nvoice][k]->note.freq = basefreq; } // Compute the Voice's modulator volume (incl. damping) float fmvoldamp = powf(440.0f / getVoiceBaseFreq(nvoice), adpars.VoicePar[nvoice].PFMVolumeDamp / 64.0f - 1.0f); switch (NoteVoicePar[nvoice].fmEnabled) { case PHASE_MOD: case PW_MOD: fmvoldamp = powf(440.0f / getVoiceBaseFreq(nvoice), adpars.VoicePar[nvoice].PFMVolumeDamp / 64.0f); NoteVoicePar[nvoice].fmVolume = (expf(adpars.VoicePar[nvoice].PFMVolume / 127.0f * FM_AMP_MULTIPLIER) - 1.0f) * fmvoldamp * 4.0f; break; case FREQ_MOD: NoteVoicePar[nvoice].fmVolume = (expf(adpars.VoicePar[nvoice].PFMVolume / 127.0f * FM_AMP_MULTIPLIER) - 1.0f) * fmvoldamp * 4.0f; break; default: if (fmvoldamp > 1.0f) fmvoldamp = 1.0f; NoteVoicePar[nvoice].fmVolume = adpars.VoicePar[nvoice].PFMVolume / 127.0f * fmvoldamp; break; } // Voice's modulator velocity sensing NoteVoicePar[nvoice].fmVolume *= velF(note.vel, adpars.VoicePar[nvoice].PFMVelocityScaleFunction); // Voice Amplitude Parameters Init if (adpars.VoicePar[nvoice].PVolume == 0) NoteVoicePar[nvoice].volume = 0.0f; else NoteVoicePar[nvoice].volume = decibel<-60>(1.0f - adpars.VoicePar[nvoice].PVolume / 127.0f) // -60 dB .. 0 dB * velF(note.vel, adpars.VoicePar[nvoice].PAmpVelocityScaleFunction); // velocity if (adpars.VoicePar[nvoice].PVolumeminus) NoteVoicePar[nvoice].volume = -NoteVoicePar[nvoice].volume; int unison = unison_size[nvoice]; if (subVoiceNr == -1) { int vc = nvoice; if (adpars.VoicePar[nvoice].Pextoscil != -1) vc = adpars.VoicePar[nvoice].Pextoscil; adpars.VoicePar[vc].OscilSmp->getWave(NoteVoicePar[nvoice].oscilSmp, getVoiceBaseFreq(nvoice), adpars.VoicePar[nvoice].Presonance); // I store the first elements to the last position for speedups NoteVoicePar[nvoice].oscilSmp.fillInterpolationBuffer(); } if (NoteVoicePar[nvoice].fmEnabled != NONE && NoteVoicePar[nvoice].fmVoice < 0 && subVoiceNr == -1) { int vc = nvoice; if (adpars.VoicePar[nvoice].PextFMoscil != -1) vc = adpars.VoicePar[nvoice].PextFMoscil; float freqtmp = 1.0f; if (adpars.VoicePar[vc].POscilFM->Padaptiveharmonics != 0 || (NoteVoicePar[nvoice].fmEnabled == MORPH) || (NoteVoicePar[nvoice].fmEnabled == RING_MOD)) freqtmp = getFMVoiceBaseFreq(nvoice); adpars.VoicePar[vc].FMSmp->getWave(NoteVoicePar[nvoice].fmSmp, freqtmp); NoteVoicePar[nvoice].fmSmp.fillInterpolationBuffer(); } computePhaseOffsets(nvoice); computeFMPhaseOffsets(nvoice); bool is_pwm = NoteVoicePar[nvoice].fmEnabled == PW_MOD; unison_stereo_spread[nvoice] = adpars.VoicePar[nvoice].Unison_stereo_spread / 127.0f; float unison_spread = adpars.getUnisonFrequencySpreadCents(nvoice); float unison_real_spread = power<2>((unison_spread * 0.5f) / 1200.0f); float unison_vibrato_a = adpars.VoicePar[nvoice].Unison_vibrato / 127.0f; // 0.0 .. 1.0 int true_unison = unison >> is_pwm; switch (true_unison) { case 1: // if no unison, set the subvoice to the default note unison_base_freq_rap[nvoice][0] = 1.0f; break; case 2: // unison for 2 subvoices { unison_base_freq_rap[nvoice][0] = 1.0f / unison_real_spread; unison_base_freq_rap[nvoice][1] = unison_real_spread; } break; default: // unison for more than 2 subvoices { float unison_values[unison]; float min = -1e-6f, max = 1e-6f; for (int k = 0; k < true_unison; ++k) { float step = (k / (float) (true_unison - 1)) * 2.0f - 1.0f; //this makes the unison spread more uniform float val = step + (paramRNG.numRandom() * 2.0f - 1.0f) / (true_unison - 1); unison_values[k] = val; if (val > max) max = val; if (val < min) min = val; } float diff = max - min; for (int k = 0; k < true_unison; ++k) { unison_values[k] = (unison_values[k] - (max + min) * 0.5f) / diff; // the lowest value will be -1 and the highest will be 1 unison_base_freq_rap[nvoice][k] = power<2>((unison_spread * unison_values[k]) / 1200.0f); } } break; } if (is_pwm) for (int i = true_unison - 1; i >= 0; i--) { unison_base_freq_rap[nvoice][2*i + 1] = unison_base_freq_rap[nvoice][i]; unison_base_freq_rap[nvoice][2*i] = unison_base_freq_rap[nvoice][i]; } // unison vibratos if (true_unison > 1) { for (int k = 0; k < unison; ++k) // reduce the frequency difference // for larger vibratos unison_base_freq_rap[nvoice][k] = 1.0f + (unison_base_freq_rap[nvoice][k] - 1.0f) * (1.0f - unison_vibrato_a); unison_vibrato[nvoice].amplitude = (unison_real_spread - 1.0f) * unison_vibrato_a; float increments_per_second = 1 / synth.fixed_sample_step_f; const float vib_speed = adpars.VoicePar[nvoice].Unison_vibrato_speed / 127.0f; float vibrato_base_period = 0.25f * power<2>((1.0f - vib_speed) * 4.0f); for (int k = 0; k < unison; ++k) { // make period to vary randomly from 50% to 200% vibrato base period float vibrato_period = vibrato_base_period * power<2>(paramRNG.numRandom() * 2.0f - 1.0f); float m = 4.0f / (vibrato_period * increments_per_second); if (unison_vibrato[nvoice].step[k] < 0.0f) m = -m; unison_vibrato[nvoice].step[k] = m; if (is_pwm) { // Set the next position the same as this one. unison_vibrato[nvoice].step[k+1] = unison_vibrato[nvoice].step[k]; ++k; // Skip an iteration. } } } else // No vibrato for a single voice { unison_vibrato[nvoice].step[0] = 0.0f; unison_vibrato[nvoice].amplitude = 0.0f; if (is_pwm) { unison_vibrato[nvoice].step[1] = 0.0f; } } // phase invert for unison unison_invert_phase[nvoice][0] = false; if (unison != 1) { int inv = adpars.VoicePar[nvoice].Unison_invert_phase; switch(inv) { case 0: for (int k = 0; k < unison; ++k) unison_invert_phase[nvoice][k] = false; break; case 1: for (int k = 0; k < unison; ++k) unison_invert_phase[nvoice][k] = _SYS_::F2B(paramRNG.numRandom()); break; default: for (int k = 0; k < unison; ++k) unison_invert_phase[nvoice][k] = (k % inv == 0) ? true : false; break; } } } } void ADnote::computePhaseOffsets(int nvoice) { int new_phase_offset = (int)((adpars.VoicePar[nvoice].Poscilphase - 64.0f) / 128.0f * synth.oscilsize + synth.oscilsize * 4); int phase_offset_diff = new_phase_offset - NoteVoicePar[nvoice].phaseOffset; for (size_t k = 0; k < unison_size[nvoice]; ++k) { oscposhi[nvoice][k] = (oscposhi[nvoice][k] + phase_offset_diff) % synth.oscilsize; if (oscposhi[nvoice][k] < 0) // This is necessary, because C '%' operator does not always // return a positive result. oscposhi[nvoice][k] += synth.oscilsize; } NoteVoicePar[nvoice].phaseOffset = new_phase_offset; } void ADnote::computeFMPhaseOffsets(int nvoice) { if (NoteVoicePar[nvoice].fmEnabled != NONE) { int new_FMphase_offset = (int)((adpars.VoicePar[nvoice].PFMoscilphase - 64.0f) / 128.0f * synth.oscilsize_f + synth.oscilsize_f * 4.0f); int FMphase_offset_diff = new_FMphase_offset - NoteVoicePar[nvoice].fmPhaseOffset; for (size_t k = 0; k < unison_size[nvoice]; ++k) { oscposhiFM[nvoice][k] += FMphase_offset_diff; oscposhiFM[nvoice][k] %= synth.oscilsize; if (oscposhiFM[nvoice][k] < 0) // This is necessary, because C '%' operator does not always // return a positive result. oscposhiFM[nvoice][k] += synth.oscilsize; } NoteVoicePar[nvoice].fmPhaseOffset = new_FMphase_offset; } } // Get Voice's Modullator base frequency float ADnote::getFMVoiceBaseFreq(int nvoice) { float detune = NoteVoicePar[nvoice].fmDetune / 100.0f; float freq; if (NoteVoicePar[nvoice].fmFreqFixed) return 440.0f * power<2>(detune / 12.0f); if (NoteVoicePar[nvoice].fmDetuneFromBaseOsc) freq = getVoiceBaseFreq(nvoice); else { freq = note.freq; // To avoid applying global detuning twice: Only detune in main voice if (subVoiceNr == -1) detune += noteGlobal.detune / 100.0f; } return freq * power<2>(detune / 12.0f); } // Computes the relative frequency of each unison voice and it's vibrato // This must be called before setfreq* functions void ADnote::computeUnisonFreqRap(int nvoice) { if (unison_size[nvoice] == 1) // no unison { unison_freq_rap[nvoice][0] = 1.0f; return; } float relbw = ctl.bandwidth.relbw * bandwidthDetuneMultiplier; for (size_t k = 0; k < unison_size[nvoice]; ++k) { float pos = unison_vibrato[nvoice].position[k]; float step = unison_vibrato[nvoice].step[k]; pos += step; if (pos <= -1.0f) { pos = -1.0f; step = -step; } else if (pos >= 1.0f) { pos = 1.0f; step = -step; } float vibrato_val = (pos - 0.333333333f * pos * pos * pos) * 1.5f; // make the vibrato lfo smoother unison_freq_rap[nvoice][k] = 1.0f + ((unison_base_freq_rap[nvoice][k] - 1.0f) + vibrato_val * unison_vibrato[nvoice].amplitude) * relbw; unison_vibrato[nvoice].position[k] = pos; step = unison_vibrato[nvoice].step[k] = step; } } // Computes the frequency of an oscillator void ADnote::setfreq(int nvoice, float in_freq, float pitchdetune) { for (size_t k = 0; k < unison_size[nvoice]; ++k) { float detunefactor = unison_freq_rap[nvoice][k] * unisonDetuneFactorFromParent; float freq = fabsf(in_freq) * detunefactor; if (subVoice[nvoice]) { subVoice[nvoice][k]->setPitchDetuneFromParent(pitchdetune); subVoice[nvoice][k]->setUnisonDetuneFromParent(detunefactor); } float speed = freq * synth.oscil_sample_step_f; if (isgreater(speed, synth.oscilsize_f)) speed = synth.oscilsize_f; int skip = int(speed); oscfreqhi[nvoice][k] = skip; oscfreqlo[nvoice][k] = speed - float(skip); } } // Computes the frequency of an modulator oscillator void ADnote::setfreqFM(int nvoice, float in_freq, float pitchdetune) { for (size_t k = 0; k < unison_size[nvoice]; ++k) { float detunefactor = unisonDetuneFactorFromParent; if (NoteVoicePar[nvoice].fmDetuneFromBaseOsc) detunefactor *= unison_freq_rap[nvoice][k]; float freq = fabsf(in_freq) * detunefactor; if (subFMVoice[nvoice]) { subFMVoice[nvoice][k]->setPitchDetuneFromParent(pitchdetune); subFMVoice[nvoice][k]->setUnisonDetuneFromParent(detunefactor); } float speed = freq * synth.oscil_sample_step_f; if (isgreater(speed, synth.oscilsize_f)) speed = synth.oscilsize_f; int skip = int(speed); oscfreqhiFM[nvoice][k] = skip; oscfreqloFM[nvoice][k] = speed - float(skip); } } // Get Voice base frequency float ADnote::getVoiceBaseFreq(int nvoice) { float detune = NoteVoicePar[nvoice].detune / 100.0f + NoteVoicePar[nvoice].fineDetune / 100.0f * ctl.bandwidth.relbw * bandwidthDetuneMultiplier; // To avoid applying global detuning twice: Only detune in main voice if (subVoiceNr == -1) detune += noteGlobal.detune / 100.0f; if (not NoteVoicePar[nvoice].fixedFreq) return note.freq * power<2>(detune / 12.0f); else // fixed freq is enabled { float fixedfreq; if (subVoiceNr != -1) // Fixed frequency is not used in sub voices. // We get the base frequency from the parent. fixedfreq = note.freq; else fixedfreq = 440.0f; int fixedfreqET = NoteVoicePar[nvoice].fixedFreqET; if (fixedfreqET) { // if the frequency varies according the keyboard note float tmp = (note.midi - 69.0f) / 12.0f * (power<2>((fixedfreqET - 1) / 63.0f) - 1.0f); if (fixedfreqET <= 64) fixedfreq *= power<2>(tmp); else fixedfreq *= power<3>(tmp); } return fixedfreq * power<2>(detune / 12.0f); } } // Computes all the parameters for each tick void ADnote::computeWorkingParameters() { float filterCenterPitch = adpars.GlobalPar.GlobalFilter->getfreq() // center freq + adpars.GlobalPar.PFilterVelocityScale / 127.0f * 6.0f * (velF(note.vel, adpars.GlobalPar.PFilterVelocityScaleFunction) - 1); float filterQ = adpars.GlobalPar.GlobalFilter->getq(); float filterFreqTracking = adpars.GlobalPar.GlobalFilter->getfreqtracking(note.freq); float filterpitch, filterfreq; float globalpitch = 0.01f * (noteGlobal.freqEnvelope->envout() + noteGlobal.freqLFO->lfoout() * ctl.modwheel.relmod); globaloldamplitude = globalnewamplitude; globalnewamplitude = noteGlobal.volume * noteGlobal.ampEnvelope->envout_dB() * noteGlobal.ampLFO->amplfoout(); float globalfilterpitch = noteGlobal.filterEnvelope->envout() + noteGlobal.filterLFO->lfoout() + filterCenterPitch; float tmpfilterfreq = globalfilterpitch + ctl.filtercutoff.relfreq + filterFreqTracking; tmpfilterfreq = noteGlobal.filterL->getrealfreq(tmpfilterfreq); float globalfilterq = filterQ * ctl.filterq.relq; noteGlobal.filterL->setfreq_and_q(tmpfilterfreq, globalfilterq); if (stereo) noteGlobal.filterR->setfreq_and_q(tmpfilterfreq, globalfilterq); // compute the portamento, if it is used by this note float portamentofreqrap = 1.0f; if (portamento) // this voice use portamento { portamentofreqrap = ctl.portamento.freqrap; if (not ctl.portamento.used) // the portamento has finished portamento = false; // this note is no longer "portamented" } // compute parameters for all voices for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { if (!NoteVoicePar[nvoice].enabled) continue; NoteVoicePar[nvoice].delayTicks -= 1; if (NoteVoicePar[nvoice].delayTicks > 0) continue; computeUnisonFreqRap(nvoice); // Voice Amplitude oldAmplitude[nvoice] = newAmplitude[nvoice]; newAmplitude[nvoice] = 1.0f; if (NoteVoicePar[nvoice].ampEnvelope) newAmplitude[nvoice] *= NoteVoicePar[nvoice].ampEnvelope->envout_dB(); if (NoteVoicePar[nvoice].ampLFO) newAmplitude[nvoice] *= NoteVoicePar[nvoice].ampLFO->amplfoout(); // Voice Filter if (NoteVoicePar[nvoice].voiceFilterL) { filterpitch = adpars.VoicePar[nvoice].VoiceFilter->getfreq() + adpars.VoicePar[nvoice].PFilterVelocityScale / 127.0f * 6.0f //velocity sensing * (velF(note.vel, adpars.VoicePar[nvoice].PFilterVelocityScaleFunction) - 1); filterQ = adpars.VoicePar[nvoice].VoiceFilter->getq(); if (NoteVoicePar[nvoice].filterEnvelope) filterpitch += NoteVoicePar[nvoice].filterEnvelope->envout(); if (NoteVoicePar[nvoice].filterLFO) filterpitch += NoteVoicePar[nvoice].filterLFO->lfoout(); filterfreq = filterpitch + adpars.VoicePar[nvoice].VoiceFilter->getfreqtracking(note.freq); filterfreq = NoteVoicePar[nvoice].voiceFilterL->getrealfreq(filterfreq); NoteVoicePar[nvoice].voiceFilterL->setfreq_and_q(filterfreq, filterQ); if (stereo && NoteVoicePar[nvoice].voiceFilterR) NoteVoicePar[nvoice].voiceFilterR->setfreq_and_q(filterfreq, filterQ); } if (!NoteVoicePar[nvoice].noiseType) // voice is not noise { // Voice Frequency float basevoicepitch = 0.0f; basevoicepitch += detuneFromParent; basevoicepitch += 12.0f * NoteVoicePar[nvoice].bendAdjust * log2f(ctl.pitchwheel.relfreq); //change the frequency by the controller float voicepitch = basevoicepitch; if (NoteVoicePar[nvoice].freqLFO) { voicepitch += NoteVoicePar[nvoice].freqLFO->lfoout() / 100.0f * ctl.bandwidth.relbw; } if (NoteVoicePar[nvoice].freqEnvelope) { voicepitch += NoteVoicePar[nvoice].freqEnvelope->envout() / 100.0f; } float nonoffsetfreq = getVoiceBaseFreq(nvoice) * power<2>((voicepitch + globalpitch) / 12.0f); nonoffsetfreq *= portamentofreqrap; float voicefreq = nonoffsetfreq + NoteVoicePar[nvoice].offsetHz; voicepitch += log2f(voicefreq / nonoffsetfreq) * 12.0f; setfreq(nvoice, voicefreq, voicepitch); // Modulator if (NoteVoicePar[nvoice].fmEnabled != NONE) { float FMpitch; if (NoteVoicePar[nvoice].fmFreqFixed) FMpitch = 0.0f; else if (NoteVoicePar[nvoice].fmDetuneFromBaseOsc) FMpitch = voicepitch; else FMpitch = basevoicepitch; float FMrelativepitch = 0.0f; if (NoteVoicePar[nvoice].fmFreqEnvelope) { FMrelativepitch += NoteVoicePar[nvoice].fmFreqEnvelope->envout() / 100.0f; FMpitch += FMrelativepitch; // Do not add any more adjustments to FMpitch after // this. The rest of FMrelativepitch has already been // accounted for in our sub voices when we created them, // using getFMVoiceBaseFreq(). } float FMfreq; if (NoteVoicePar[nvoice].fmFreqFixed) { // Apply FM detuning since base frequency is 440Hz. FMrelativepitch += NoteVoicePar[nvoice].fmDetune / 100.0f; FMfreq = power<2>(FMrelativepitch / 12.0f) * 440.0f; } else if (NoteVoicePar[nvoice].fmDetuneFromBaseOsc) { // Apply FM detuning since base frequency is from main voice. FMrelativepitch += NoteVoicePar[nvoice].fmDetune / 100.0f; FMfreq = power<2>(FMrelativepitch / 12.0f) * voicefreq; } else { // No need to apply FM detuning, since getFMVoiceBaseFreq() // takes it into account. FMfreq = getFMVoiceBaseFreq(nvoice) * power<2>((basevoicepitch + globalpitch + FMrelativepitch) / 12.0f); FMfreq *= portamentofreqrap; } setfreqFM(nvoice, FMfreq, FMpitch); fm_oldAmplitude[nvoice] = fm_newAmplitude[nvoice]; fm_newAmplitude[nvoice] = NoteVoicePar[nvoice].fmVolume * ctl.fmamp.relamp; if (NoteVoicePar[nvoice].fmAmpEnvelope) fm_newAmplitude[nvoice] *= NoteVoicePar[nvoice].fmAmpEnvelope->envout_dB(); } } } } // Fadein in a way that removes clicks but keep sound "punchy" void ADnote::fadein(Samples& smps) { int zerocrossings = 0; for (int i = 1; i < synth.sent_buffersize; ++i) if (smps[i - 1] < 0.0f && smps[i] > 0.0f) zerocrossings++; // this is only the positive crossings float tmp = (synth.sent_buffersize - 1.0f) / (zerocrossings + 1) / 3.0f; if (tmp < 8.0f) tmp = 8.0f; tmp *= noteGlobal.fadeinAdjustment; int fadein = int(tmp); // how many samples is the fade-in if (fadein < 8) fadein = 8; if (fadein > synth.sent_buffersize) fadein = synth.sent_buffersize; for (int i = 0; i < fadein; ++i) // fade-in { float tmp = 0.5f - cosf((float)i / (float) fadein * PI) * 0.5f; smps[i] *= tmp; } } // ported from, zynaddubfx 2.4.4 /* * Computes the Oscillator (Without Modulation) - LinearInterpolation */ /* As the code here is a bit odd due to optimization, here is what happens * First the current position and frequency are retrieved from the running * state. These are broken up into high and low portions to indicate how many * samples are skipped in one step and how many fractional samples are skipped. * Outside of this method the fractional samples are just handled with floating * point code, but that's a bit slower than it needs to be. In this code the low * portions are known to exist between 0.0 and 1.0 and it is known that they are * stored in single precision floating point IEEE numbers. This implies that * a maximum of 24 bits are significant. The below code does your standard * linear interpolation that you'll see throughout this codebase, but by * sticking to integers for tracking the overflow of the low portion, around 15% * of the execution time was shaved off in the ADnote test. */ inline void ADnote::computeVoiceOscillatorLinearInterpolation(int nvoice) { fft::Waveform const& smps = NoteVoicePar[nvoice].oscilSmp; for (size_t k = 0; k < unison_size[nvoice]; ++k) { int poshi = oscposhi[nvoice][k]; int poslo = oscposlo[nvoice][k] * (1<<24); int freqhi = oscfreqhi[nvoice][k]; int freqlo = oscfreqlo[nvoice][k] * (1<<24); Samples& tw = tmpwave_unison[k]; assert(oscfreqlo[nvoice][k] < 1.0f); for (int i = 0; i < synth.sent_buffersize; ++i) { tw[i] = (smps[poshi] * ((1<<24) - poslo) + smps[poshi + 1] * poslo)/(1.0f*(1<<24)); poslo += freqlo; poshi += freqhi + (poslo>>24); poslo &= 0xffffff; poshi &= synth.oscilsize - 1; } oscposhi[nvoice][k] = poshi; oscposlo[nvoice][k] = poslo/(1.0f*(1<<24)); } } // end of port // Applies the Oscillator (Morphing) void ADnote::applyVoiceOscillatorMorph(int nvoice) { if (isgreater(fm_newAmplitude[nvoice], 1.0f)) fm_newAmplitude[nvoice] = 1.0f; if (isgreater(fm_oldAmplitude[nvoice], 1.0f)) fm_oldAmplitude[nvoice] = 1.0f; for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& tw = tmpwave_unison[k]; Samples& mod = tmpmod_unison[k]; for (int i = 0; i < synth.sent_buffersize; ++i) { float amp = interpolateAmplitude(fm_oldAmplitude[nvoice], fm_newAmplitude[nvoice], i, synth.sent_buffersize); tw[i] = (tw[i] * (1.0f - amp)) + amp * mod[i]; } } } // Applies the Oscillator (Ring Modulation) void ADnote::applyVoiceOscillatorRingModulation(int nvoice) { float amp; bool isSide = NoteVoicePar[nvoice].fmRingToSide; if (isgreater(fm_newAmplitude[nvoice], 1.0f)) fm_newAmplitude[nvoice] = 1.0f; if (isgreater(fm_oldAmplitude[nvoice], 1.0f)) fm_oldAmplitude[nvoice] = 1.0f; for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& tw = tmpwave_unison[k]; Samples& mod = tmpmod_unison[k]; for (int i = 0; i < synth.sent_buffersize; ++i) { amp = interpolateAmplitude(fm_oldAmplitude[nvoice], fm_newAmplitude[nvoice], i, synth.sent_buffersize); if (isSide) // sidebands tw[i] *= (mod[i] * amp * 2); else // ring tw[i] *= mod[i] * amp + (1.0f - amp); } } } // Computes the Modulator void ADnote::computeVoiceModulator(int nvoice, int FMmode) { if (subFMVoice[nvoice]) { int subVoiceNumber = NoteVoicePar[nvoice].fmVoice; for (size_t k = 0; k < unison_size[nvoice]; ++k) { // Sub voices use voiceOut, so just pass NULL. subFMVoice[nvoice][k]->noteout(NULL, NULL); Samples const& smps = subFMVoice[nvoice][k]->NoteVoicePar[subVoiceNumber].voiceOut; // For historical/compatibility reasons we do not reduce volume here // if are using stereo. See same section in computeVoiceOscillator. memcpy(tmpmod_unison[k].get(), smps.get(), synth.bufferbytes); } } else if (parentFMmod != NULL) { if (NoteVoicePar[nvoice].fmEnabled == FREQ_MOD) { computeVoiceModulatorForFMFrequencyModulation(nvoice); } else { computeVoiceModulatorFrequencyModulation(nvoice, FMmode); } } else { computeVoiceModulatorLinearInterpolation(nvoice); } if (freqbasedmod[nvoice]) { applyAmplitudeOnVoiceModulator(nvoice); normalizeVoiceModulatorFrequencyModulation(nvoice, FMmode); // Ring and morph modulation do not need normalization, and they take // amplitude into account themselves. } } void ADnote::applyAmplitudeOnVoiceModulator(int nvoice) { // Amplitude interpolation if (aboveAmplitudeThreshold(fm_oldAmplitude[nvoice], fm_newAmplitude[nvoice])) { for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& unison = tmpmod_unison[k]; for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) unison[i] *= interpolateAmplitude(fm_oldAmplitude[nvoice], fm_newAmplitude[nvoice], i, synth.sent_buffersize); } } else { for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& unison = tmpmod_unison[k]; for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) unison[i] *= fm_newAmplitude[nvoice]; } } } // Normalize the modulator for phase/frequency modulation void ADnote::normalizeVoiceModulatorFrequencyModulation(int nvoice, int FMmode) { if (FMmode == PW_MOD) { // PWM modulation for (size_t k = 1; k < unison_size[nvoice]; k += 2) { Samples& unison = tmpmod_unison[k]; for (size_t i = 1; i < size_t(synth.sent_buffersize); ++i) unison[i] = -unison[i]; } } // normalize: makes all sample-rates, oscil_sizes to produce same sound if (FMmode == FREQ_MOD) // Frequency modulation { for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& tw = tmpmod_unison[k]; float fmold = fm_oldSmp[nvoice][k]; for (int i = 0; i < synth.sent_buffersize; ++i) { fmold = fmold + tw[i] * synth.oscil_norm_factor_fm; tw[i] = fmold; } fm_oldSmp[nvoice][k] = fmold; } } else // Phase or PWM modulation { for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& tw = tmpmod_unison[k]; for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) tw[i] *= synth.oscil_norm_factor_pm; } } if (parentFMmod != NULL) { // This is a sub voice. Mix our frequency modulation with the // parent modulation. float *tmp = parentFMmod; for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& tw = tmpmod_unison[k]; for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) tw[i] += tmp[i]; } } } // Render the modulator with linear interpolation, no modulation on it void ADnote::computeVoiceModulatorLinearInterpolation(int nvoice) { fft::Waveform const& smps = NoteVoicePar[nvoice].fmSmp; // Compute the modulator and store it in tmpmod_unison[][] for (size_t k = 0; k < unison_size[nvoice]; ++k) { int poshiFM = oscposhiFM[nvoice][k]; float posloFM = oscposloFM[nvoice][k]; int freqhiFM = oscfreqhiFM[nvoice][k]; float freqloFM = oscfreqloFM[nvoice][k]; Samples& unison = tmpmod_unison[k]; for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) { unison[i] = smps[poshiFM] * (1.0f - posloFM) + smps[poshiFM+1] * posloFM; posloFM += freqloFM; if (posloFM >= 1.0f) { posloFM -= 1.0f; poshiFM++; } poshiFM += freqhiFM; poshiFM &= synth.oscilsize - 1; } oscposhiFM[nvoice][k] = poshiFM; oscposloFM[nvoice][k] = posloFM; } } // Computes the Modulator (Phase Modulation or Frequency Modulation from parent voice) void ADnote::computeVoiceModulatorFrequencyModulation(int nvoice, int FMmode) { fft::Waveform const& smps = NoteVoicePar[nvoice].fmSmp; // do the modulation using parent's modulator, onto a new modulator for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& unison = tmpmod_unison[k]; int poshiFM = oscposhiFM[nvoice][k]; float posloFM = oscposloFM[nvoice][k]; int freqhiFM = oscfreqhiFM[nvoice][k]; float freqloFM = oscfreqloFM[nvoice][k]; // When we have parent modulation, we want to maintain the same // sound. However, if the carrier and modulator are very far apart in // frequency, then the modulation will affect them very differently, // since the phase difference is linear, not logarithmic. Compensate for // this by favouring the carrier, and adjust the rate of modulation // logarithmically, relative to this. float oscVsFMratio = float(freqhiFM + freqloFM) / float(oscfreqhi[nvoice][k] + oscfreqlo[nvoice][k]); for (int i = 0; i < synth.sent_buffersize; ++i) { float pMod = parentFMmod[i] * oscVsFMratio; int FMmodfreqhi = int(pMod); float FMmodfreqlo = pMod-FMmodfreqhi; if (FMmodfreqhi < 0) ++FMmodfreqlo; // carrier, which will become the new modulator int carposhi = poshiFM + FMmodfreqhi; float carposlo = posloFM + FMmodfreqlo; if (FMmode == PW_MOD && (k & 1)) carposhi += NoteVoicePar[nvoice].phaseOffset; if (carposlo >= 1.0f) { ++carposhi; carposlo -= 1.0f; } carposhi &= (synth.oscilsize - 1); unison[i] = smps[carposhi] * (1.0f - carposlo) + smps[carposhi+1] * carposlo; posloFM += freqloFM; if (posloFM >= 1.0f) { posloFM -= 1.0f; poshiFM++; } poshiFM += freqhiFM; poshiFM &= synth.oscilsize - 1; } oscposhiFM[nvoice][k] = poshiFM; oscposloFM[nvoice][k] = posloFM; } } void ADnote::computeVoiceModulatorForFMFrequencyModulation(int nvoice) { // Here we have a tricky situation: We are generating a modulator which will // be used for FM modulation, and the modulator itself is also modulated by // a parent voice. Because FM modulation needs to be integrated (it is the // derivative function of PM modulation), we cannot modulate the modulator // in the same way as the other modulation types. Instead, we start with the // original unmodulated function, and then integrate either backwards or // forwards until we reach the phase offset from the parent modulation. To // preserve accuracy we move in exact steps of the frequency, which is what // would have happened if there was no modulation. Then we take the linear // interpolation between the two nearest samples, and use that to construct // the resulting curve. fft::Waveform const& smps = NoteVoicePar[nvoice].fmSmp; for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& unison = tmpmod_unison[k]; int poshiFM = oscposhiFM[nvoice][k]; float posloFM = oscposloFM[nvoice][k]; int freqhiFM = oscfreqhiFM[nvoice][k]; float freqloFM = oscfreqloFM[nvoice][k]; float freqFM = float(freqhiFM) + freqloFM; float oscVsFMratio = freqFM / float(oscfreqhi[nvoice][k] + oscfreqlo[nvoice][k]); float oldInterpPhase = fmfm_oldInterpPhase[nvoice][k]; float currentPhase = fmfm_oldPhase[nvoice][k]; float currentPMod = fmfm_oldPMod[nvoice][k]; for (int i = 0; i < synth.sent_buffersize; ++i) { float pMod = parentFMmod[i] * oscVsFMratio; while (currentPMod > pMod) { posloFM -= freqloFM; if (posloFM < 0.0f) { posloFM += 1.0f; poshiFM--; } poshiFM -= freqhiFM; poshiFM &= synth.oscilsize - 1; currentPMod -= freqFM; currentPhase -= smps[poshiFM] * (1.0f - posloFM) + smps[poshiFM + 1] * posloFM; } float pModBelow = pMod - freqFM; while (currentPMod < pModBelow) { currentPMod += freqFM; currentPhase += smps[poshiFM] * (1.0f - posloFM) + smps[poshiFM + 1] * posloFM; posloFM += freqloFM; if (posloFM >= 1.0f) { posloFM -= 1.0f; poshiFM++; } poshiFM += freqhiFM; poshiFM &= synth.oscilsize - 1; } float nextPhase = currentPhase + (smps[poshiFM] * (1.0f - posloFM) + smps[poshiFM + 1] * posloFM); posloFM += freqloFM; if (posloFM >= 1.0f) { posloFM -= 1.0f; poshiFM++; } poshiFM += freqhiFM; poshiFM &= synth.oscilsize - 1; float nextAmount = (pMod - currentPMod) / freqFM; float currAmount = 1.0f - nextAmount; float interpPhase = currentPhase * currAmount + nextPhase * nextAmount; unison[i] = interpPhase - oldInterpPhase; oldInterpPhase = interpPhase; currentPhase = nextPhase; } oscposhiFM[nvoice][k] = poshiFM; oscposloFM[nvoice][k] = posloFM; fmfm_oldPhase[nvoice][k] = currentPhase; fmfm_oldPMod [nvoice][k] = currentPMod; fmfm_oldInterpPhase[nvoice][k] = oldInterpPhase; } } // Computes the Oscillator (Phase Modulation or Frequency Modulation) void ADnote::computeVoiceOscillatorFrequencyModulation(int nvoice) { // do the modulation for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& unison = tmpwave_unison[k]; int poshi = oscposhi[nvoice][k]; float poslo = oscposlo[nvoice][k]; int freqhi = oscfreqhi[nvoice][k]; float freqlo = oscfreqlo[nvoice][k]; // If this ADnote has frequency based modulation, the modulator resides // in tmpmod_unison, otherwise it comes from the parent. If there is no // modulation at all this function should not be called. const float *mod = freqbasedmod[nvoice] ? tmpmod_unison[k].get() : parentFMmod; for (int i = 0; i < synth.sent_buffersize; ++i) { int FMmodfreqhi = int(mod[i]); float FMmodfreqlo = mod[i]-FMmodfreqhi; if (FMmodfreqhi < 0) FMmodfreqlo++; // carrier int carposhi = poshi + FMmodfreqhi; float carposlo = poslo + FMmodfreqlo; if (carposlo >= 1.0f) { carposhi++; carposlo -= 1.0f; } carposhi &= (synth.oscilsize - 1); unison[i] = NoteVoicePar[nvoice].oscilSmp[carposhi] * (1.0f - carposlo) + NoteVoicePar[nvoice].oscilSmp[carposhi + 1] * carposlo; poslo += freqlo; if (poslo >= 1.0f) { poslo -= 1.0f; poshi++; } poshi += freqhi; poshi &= synth.oscilsize - 1; } oscposhi[nvoice][k] = poshi; oscposlo[nvoice][k] = poslo; } } void ADnote::computeVoiceOscillatorForFMFrequencyModulation(int nvoice) { fft::Waveform const& smps = NoteVoicePar[nvoice].oscilSmp; // See computeVoiceModulatorForFMFrequencyModulation for details on how this works. for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& unison = tmpwave_unison[k]; int poshi = oscposhi[nvoice][k]; float poslo = oscposlo[nvoice][k]; int freqhi = oscfreqhi[nvoice][k]; float freqlo = oscfreqlo[nvoice][k]; float freq = (float)freqhi + freqlo; float oldInterpPhase = fm_oldOscInterpPhase[nvoice][k]; float currentPhase = fm_oldOscPhase[nvoice][k]; float currentPMod = fm_oldOscPMod[nvoice][k]; for (int i = 0; i < synth.sent_buffersize; ++i) { float pMod = parentFMmod[i]; while (currentPMod > pMod) { poslo -= freqlo; if (poslo < 0.0f) { poslo += 1.0f; poshi--; } poshi -= freqhi; poshi &= synth.oscilsize - 1; currentPMod -= freq; currentPhase -= smps[poshi] * (1.0f - poslo) + smps[poshi + 1] * poslo; } float pModBelow = pMod - freq; while (currentPMod < pModBelow) { currentPMod += freq; currentPhase += smps[poshi] * (1.0f - poslo) + smps[poshi + 1] * poslo; poslo += freqlo; if (poslo >= 1.0f) { poslo -= 1.0f; poshi++; } poshi += freqhi; poshi &= synth.oscilsize - 1; } float nextPhase = currentPhase + (smps[poshi] * (1.0f - poslo) + smps[poshi + 1] * poslo); poslo += freqlo; if (poslo >= 1.0f) { poslo -= 1.0f; poshi++; } poshi += freqhi; poshi &= synth.oscilsize - 1; float nextAmount = (pMod - currentPMod) / freq; float currentAmount= 1.0f - nextAmount; float interpPhase = currentPhase * currentAmount + nextPhase * nextAmount; unison[i] = interpPhase - oldInterpPhase; oldInterpPhase = interpPhase; currentPhase = nextPhase; } oscposhi[nvoice][k] = poshi; oscposlo[nvoice][k] = poslo; fm_oldOscPhase[nvoice][k] = currentPhase; fm_oldOscPMod[nvoice][k] = currentPMod; fm_oldOscInterpPhase[nvoice][k] = oldInterpPhase; } } // Computes the Noise void ADnote::computeVoiceNoise(int nvoice) { for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& tw = tmpwave_unison[k]; for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) tw[i] = synth.numRandom() * 2.0f - 1.0f; } } // ported from Zyn 2.5.2 void ADnote::ComputeVoicePinkNoise(int nvoice) { for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& tw = tmpwave_unison[k]; float *f = &pinking[nvoice][k > 0 ? 7 : 0]; for (int i = 0; i < synth.sent_buffersize; ++i) { float white = (synth.numRandom() - 0.5 ) / 4.0; f[0] = 0.99886*f[0]+white*0.0555179; f[1] = 0.99332*f[1]+white*0.0750759; f[2] = 0.96900*f[2]+white*0.1538520; f[3] = 0.86650*f[3]+white*0.3104856; f[4] = 0.55000*f[4]+white*0.5329522; f[5] = -0.7616*f[5]-white*0.0168980; tw[i] = f[0]+f[1]+f[2]+f[3]+f[4]+f[5]+f[6]+white*0.5362; f[6] = white*0.115926; } } } void ADnote::computeVoiceOscillator(int nvoice) { if (subVoice[nvoice]) { int subVoiceNumber = NoteVoicePar[nvoice].voice; for (size_t k = 0; k < unison_size[nvoice]; ++k) { // Sub voices use voiceOut, so just pass NULL. subVoice[nvoice][k]->noteout(NULL, NULL); Samples& smps = subVoice[nvoice][k]->NoteVoicePar[subVoiceNumber].voiceOut; Samples& unison = tmpwave_unison[k]; if (stereo) { // Reduce volume due to stereo being combined to mono. for (int i = 0; i < synth.buffersize; ++i) { unison[i] = smps[i] * 0.5f; } } else { memcpy(unison.get(), smps.get(), synth.bufferbytes); } } } else { switch (NoteVoicePar[nvoice].noiseType) { case 0: // sound // There may be frequency modulation coming from the parent, // even if this oscillator itself does not have it. if (parentFMmod != NULL && forFM) computeVoiceOscillatorForFMFrequencyModulation(nvoice); else if (parentFMmod != NULL || freqbasedmod[nvoice]) computeVoiceOscillatorFrequencyModulation(nvoice); else computeVoiceOscillatorLinearInterpolation(nvoice); break; case 1: computeVoiceNoise(nvoice); // white noise break; case 2: ComputeVoicePinkNoise(nvoice); // pink noise break; default: ComputeVoiceSpotNoise(nvoice); // spot noise break; } } // Apply non-frequency modulation onto rendered voice. switch(NoteVoicePar[nvoice].fmEnabled) { case MORPH: applyVoiceOscillatorMorph(nvoice); break; case RING_MOD: applyVoiceOscillatorRingModulation(nvoice); break; default: // No additional modulation. break; } } void ADnote::ComputeVoiceSpotNoise(int nvoice) { for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& unison = tmpwave_unison[k]; for (size_t i = 0; i < size_t(synth.sent_buffersize); ++i) { if (tSpot <= 0) { unison[i] = synth.numRandom() * 6.0f - 3.0f; tSpot = (synth.randomINT() >> 24); } else { unison[i] = 0.0f; tSpot--; } } } } // Compute the ADnote samples, returns 0 if the note is finished void ADnote::noteout(float *outl, float *outr) { Config &Runtime = synth.getRuntime(); Samples& tmpwavel = Runtime.genTmp1; Samples& tmpwaver = Runtime.genTmp2; Samples& bypassl = Runtime.genTmp3; Samples& bypassr = Runtime.genTmp4; int i, nvoice; if (outl and outr) { memset(outl, 0, synth.sent_bufferbytes); memset(outr, 0, synth.sent_bufferbytes); } if (noteStatus == NOTE_DISABLED) return; if (subVoiceNr == -1) { memset(bypassl.get(), 0, synth.sent_bufferbytes); memset(bypassr.get(), 0, synth.sent_bufferbytes); } if (paramsUpdate.checkUpdated()) computeNoteParameters(); computeWorkingParameters(); for (nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { if (!NoteVoicePar[nvoice].enabled || NoteVoicePar[nvoice].delayTicks > 0) continue; if (NoteVoicePar[nvoice].fmEnabled != NONE) computeVoiceModulator(nvoice, NoteVoicePar[nvoice].fmEnabled); computeVoiceOscillator(nvoice); // Mix subvoices into voice memset(tmpwavel.get(), 0, synth.sent_bufferbytes); if (stereo) memset(tmpwaver.get(), 0, synth.sent_bufferbytes); for (size_t k = 0; k < unison_size[nvoice]; ++k) { Samples& unison = tmpwave_unison[k]; if (stereo) { float stereo_pos = 0.0f; bool is_pwm = NoteVoicePar[nvoice].fmEnabled == PW_MOD; if (is_pwm) { if (unison_size[nvoice] > 2) stereo_pos = k/2 / (float)((unison_size[nvoice] / 2) - 1) * 2.0f - 1.0f; } else if (unison_size[nvoice] > 1) { stereo_pos = (float) k / (float)(unison_size[nvoice] - 1) * 2.0f - 1.0f; } float stereo_spread = unison_stereo_spread[nvoice] * 2.0f; // between 0 and 2.0 if (stereo_spread > 1.0f) { float stereo_pos_1 = (stereo_pos >= 0.0f) ? 1.0f : -1.0f; stereo_pos = (2.0f - stereo_spread) * stereo_pos + (stereo_spread - 1.0f) * stereo_pos_1; } else stereo_pos *= stereo_spread; if (unison_size[nvoice] == 1 || (is_pwm && unison_size[nvoice] == 2)) stereo_pos = 0.0f; float upan = (stereo_pos + 1.0f) * 0.5f; float lvol = (1.0f - upan) * 2.0f; if (lvol > 1.0f) lvol = 1.0f; float rvol = upan * 2.0f; if (rvol > 1.0f) rvol = 1.0f; if (unison_invert_phase[nvoice][k]) { lvol = -lvol; rvol = -rvol; } for (i = 0; i < synth.sent_buffersize; ++i) tmpwavel[i] += unison[i] * lvol; for (i = 0; i < synth.sent_buffersize; ++i) tmpwaver[i] += unison[i] * rvol; } else for (i = 0; i < synth.sent_buffersize; ++i) tmpwavel[i] += unison[i]; } // reduce the amplitude for large unison sizes float unison_amplitude = 1.0f / sqrtf(unison_size[nvoice]); // Amplitude float oldam = oldAmplitude[nvoice] * unison_amplitude; float newam = newAmplitude[nvoice] * unison_amplitude; if (aboveAmplitudeThreshold(oldam, newam)) { int rest = synth.sent_buffersize; // test if the amplitude if rising and the difference is high if (newam > oldam && (newam - oldam) > 0.25f) { rest = 10; if (rest > synth.sent_buffersize) rest = synth.sent_buffersize; for (int i = 0; i < synth.sent_buffersize - rest; ++i) tmpwavel[i] *= oldam; if (stereo) for (int i = 0; i < synth.sent_buffersize - rest; ++i) tmpwaver[i] *= oldam; } // Amplitude interpolation for (i = 0; i < rest; ++i) { float amp = interpolateAmplitude(oldam, newam, i, rest); tmpwavel[i + (synth.sent_buffersize - rest)] *= amp; if (stereo) tmpwaver[i + (synth.sent_buffersize - rest)] *= amp; } } else { for (i = 0; i < synth.sent_buffersize; ++i) tmpwavel[i] *= newam; if (stereo) for (i = 0; i < synth.sent_buffersize; ++i) tmpwaver[i] *= newam; } // Fade in if (firsttick[nvoice]) { fadein(tmpwavel); if (stereo) fadein(tmpwaver); firsttick[nvoice] = 0; } // Filter if (NoteVoicePar[nvoice].voiceFilterL != NULL) NoteVoicePar[nvoice].voiceFilterL->filterout(tmpwavel.get()); if (stereo && NoteVoicePar[nvoice].voiceFilterR != NULL) NoteVoicePar[nvoice].voiceFilterR->filterout(tmpwaver.get()); // check if the amplitude envelope is finished. // if yes, the voice will fadeout if (NoteVoicePar[nvoice].ampEnvelope != NULL) { if (NoteVoicePar[nvoice].ampEnvelope->finished()) { for (i = 0; i < synth.sent_buffersize; ++i) tmpwavel[i] *= 1.0f - (float)i / synth.sent_buffersize_f; if (stereo) for (i = 0; i < synth.sent_buffersize; ++i) tmpwaver[i] *= 1.0f - (float)i / synth.sent_buffersize_f; } // the voice is killed later } // Put the ADnote samples in VoiceOut (without applying Global volume, // because I wish to use this voice as a modulator) if (NoteVoicePar[nvoice].voiceOut) { if (stereo) for (i = 0; i < synth.sent_buffersize; ++i) NoteVoicePar[nvoice].voiceOut[i] = tmpwavel[i] + tmpwaver[i]; else // mono for (i = 0; i < synth.sent_buffersize; ++i) NoteVoicePar[nvoice].voiceOut[i] = tmpwavel[i]; if (NoteVoicePar[nvoice].volume == 0.0f) // If we are muted, we are done. continue; } pangainL = adpars.VoicePar[nvoice].pangainL; // assume voice not random pan pangainR = adpars.VoicePar[nvoice].pangainR; if (adpars.VoicePar[nvoice].PRandom) { pangainL = NoteVoicePar[nvoice].randpanL; pangainR = NoteVoicePar[nvoice].randpanR; } if (outl != NULL) { // Add the voice that do not bypass the filter to out. if (not NoteVoicePar[nvoice].filterBypass) // no bypass { if (stereo) { for (i = 0; i < synth.sent_buffersize; ++i) // stereo { outl[i] += tmpwavel[i] * NoteVoicePar[nvoice].volume * pangainL; outr[i] += tmpwaver[i] * NoteVoicePar[nvoice].volume * pangainR; } } else for (i = 0; i < synth.sent_buffersize; ++i) outl[i] += tmpwavel[i] * NoteVoicePar[nvoice].volume * 0.7f; // mono } else // bypass the filter { if (stereo) { for (i = 0; i < synth.sent_buffersize; ++i) // stereo { bypassl[i] += tmpwavel[i] * NoteVoicePar[nvoice].volume * pangainL; bypassr[i] += tmpwaver[i] * NoteVoicePar[nvoice].volume * pangainR; } } else for (i = 0; i < synth.sent_buffersize; ++i) bypassl[i] += tmpwavel[i] * NoteVoicePar[nvoice].volume; // mono } // check if there is necessary to process the voice longer // (if the Amplitude envelope isn't finished) if (NoteVoicePar[nvoice].ampEnvelope) if (NoteVoicePar[nvoice].ampEnvelope->finished()) killVoice(nvoice); } } if (outl != NULL) { // Processing Global parameters noteGlobal.filterL->filterout(outl); if (!stereo) // set the right channel=left channel { memcpy(outr, outl, synth.sent_bufferbytes); memcpy(bypassr.get(), bypassl.get(), synth.sent_bufferbytes); } else noteGlobal.filterR->filterout(outr); for (i = 0; i < synth.sent_buffersize; ++i) { outl[i] += bypassl[i]; outr[i] += bypassr[i]; } pangainL = adpars.GlobalPar.pangainL; // assume it's not random panning ... pangainR = adpars.GlobalPar.pangainR; if (adpars.GlobalPar.PRandom) // it is random panning { pangainL = noteGlobal.randpanL; pangainR = noteGlobal.randpanR; } if (aboveAmplitudeThreshold(globaloldamplitude, globalnewamplitude)) { // Amplitude Interpolation for (i = 0; i < synth.sent_buffersize; ++i) { float tmpvol = interpolateAmplitude(globaloldamplitude, globalnewamplitude, i, synth.sent_buffersize); outl[i] *= tmpvol * pangainL; outr[i] *= tmpvol * pangainR; } } else { for (i = 0; i < synth.sent_buffersize; ++i) { outl[i] *= globalnewamplitude * pangainL; outr[i] *= globalnewamplitude * pangainR; } } // Apply the punch if (noteGlobal.punch.enabled) { for (i = 0; i < synth.sent_buffersize; ++i) { float punchamp = noteGlobal.punch.initialvalue * noteGlobal.punch.t + 1.0f; outl[i] *= punchamp; outr[i] *= punchamp; noteGlobal.punch.t -= noteGlobal.punch.dt; if (noteGlobal.punch.t < 0.0f) { noteGlobal.punch.enabled = false; break; } } } // Apply legato fading if any if (legatoFadeStep != 0.0f) { for (int i = 0; i < synth.sent_buffersize; ++i) { legatoFade += legatoFadeStep; if (legatoFade <= 0.0f) { legatoFade = 0.0f; legatoFadeStep = 0.0f; memset(outl + i, 0, (synth.sent_buffersize - i) * sizeof(float)); memset(outr + i, 0, (synth.sent_buffersize - i) * sizeof(float)); killNote(); // NOTE_DISABLED return; } else if (legatoFade >= 1.0f) { legatoFade = 1.0f; legatoFadeStep = 0.0f; break; } outl[i] *= legatoFade; outr[i] *= legatoFade; } } } // Check if the global amplitude is finished. // If it does, disable the note if (noteGlobal.ampEnvelope->finished()) { if (outl != NULL) { for (i = 0; i < synth.sent_buffersize; ++i) // fade-out { float tmp = 1.0f - (float)i / synth.sent_buffersize_f; outl[i] *= tmp; outr[i] *= tmp; } } killNote(); return; } } // Release the key (NoteOff) void ADnote::releasekey() { if (noteStatus == NOTE_LEGATOFADEOUT) return; // keep envelopes in sustained state (thereby blocking NoteOff) int nvoice; for (nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { if (!NoteVoicePar[nvoice].enabled) continue; if (NoteVoicePar[nvoice].ampEnvelope) NoteVoicePar[nvoice].ampEnvelope->releasekey(); if (NoteVoicePar[nvoice].freqEnvelope) NoteVoicePar[nvoice].freqEnvelope->releasekey(); if (NoteVoicePar[nvoice].filterEnvelope) NoteVoicePar[nvoice].filterEnvelope->releasekey(); if (NoteVoicePar[nvoice].fmFreqEnvelope) NoteVoicePar[nvoice].fmFreqEnvelope->releasekey(); if (NoteVoicePar[nvoice].fmAmpEnvelope) NoteVoicePar[nvoice].fmAmpEnvelope->releasekey(); if (subVoice[nvoice]) for (size_t k = 0; k < unison_size[nvoice]; ++k) subVoice[nvoice][k]->releasekey(); if (subFMVoice[nvoice]) for (size_t k = 0; k < unison_size[nvoice]; ++k) subFMVoice[nvoice][k]->releasekey(); } noteGlobal.freqEnvelope->releasekey(); noteGlobal.filterEnvelope->releasekey(); noteGlobal.ampEnvelope->releasekey(); } yoshimi-2.3.5.1/src/Synth/ADnote.h000066400000000000000000000364271506652756400166140ustar00rootroot00000000000000/* ADnote.h Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2019, Will Godfrey & others Copyright 2020-2021 Kristian Amlie & Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original */ #ifndef AD_NOTE_H #define AD_NOTE_H #include "Params/ADnoteParameters.h" #include "Misc/RandomGen.h" #include "DSP/FFTwrapper.h" #include "Misc/Alloc.h" #include #include using std::unique_ptr; class ADnoteParameters; class SynthEngine; class Controller; class Envelope; class Filter; class LFO; // Globals #define FM_AMP_MULTIPLIER 14.71280603f /* Helper to either manage sample data or link to another voice's data. * This class allows to mimic the behaviour of the original code base, * while encapsulating and automatically managing the allocation. * Initially created empty, it can either allocate a buffer or attach to * existing storage managed elsewhere; Ownership is locked subsequently. * Beyond that, SampleHolder can be used like a fft::Waveform in Synth code. * Warning: beware of slicing -- use only as nested component or local object. */ class SampleHolder : public fft::Waveform { bool ownData = false; public: // by default created in empty state SampleHolder() : fft::Waveform() { } SampleHolder(SampleHolder const& r) : fft::Waveform() { if (r.size() > 0) throw std::logic_error("fully engaged SampleHolder not meant to be copied"); } SampleHolder(SampleHolder && rr) : fft::Waveform() , ownData(rr.ownData) { if (rr.size() > 0) { if (ownData) // transfer ownership swap(*this, rr); else attach(rr); } } // Assignment to existing objects not permitted SampleHolder& operator=(SampleHolder const&) =delete; SampleHolder& operator=(SampleHolder &&) =delete; /* Note: SampleHolder can be an "alias" to another SampleHolder; * and in this case we don't take ownership of the data allocation */ ~SampleHolder() { if (not ownData) detach(); // otherwise the parent dtor will automatically discard storage } void allocateWaveform(size_t tableSize) { if (size() > 0) throw std::logic_error("already engaged."); fft::Waveform allocation(tableSize); swap(*this, allocation); ownData = true; } void copyWaveform(SampleHolder const& src) { if (size() > 0) throw std::logic_error("already engaged."); if (src.size() == 0) return; allocateWaveform(src.size()); fft::Waveform::operator=(src); } void attachReference(fft::Waveform& existing) { if (size() > 0 and ownData) throw std::logic_error("SampleHolder already owns and manages a data allocation"); attach(existing); ownData = false; } }; class ADnote { ADnote(ADnoteParameters& adpars_, Controller& ctl_, Note note_, bool portamento_ ,ADnote *topVoice_, int subVoiceNr, int phaseOffset, float *parentFMmod_ ,bool forFM_, size_t unison_total_size); ADnote(ADnote *topVoice_, float freq_, int phase_offset_, int subVoiceNumber_, float *parentFMmod_, bool forFM_, size_t unison_total_size); public: ADnote(ADnoteParameters& adpars_, Controller& ctl_, Note, bool portamento_); ADnote(const ADnote &orig, ADnote *topVoice_ = NULL, float *parentFMmod_ = NULL); ~ADnote(); // shall not be moved or assigned ADnote(ADnote&&) = delete; ADnote& operator=(ADnote&&) = delete; ADnote& operator=(ADnote const&) = delete; void noteout(float *outl, float *outr); void releasekey(); bool finished() const { return noteStatus == NOTE_DISABLED; } void performPortamento(Note); void legatoFadeIn(Note); void legatoFadeOut(); private: void construct(size_t unison_total_size); void allocateUnison(size_t unisonCnt, size_t buffSize); void setfreq(int nvoice, float in_freq, float pitchdetune); void setfreqFM(int nvoice, float in_freq, float pitchdetune); void setPitchDetuneFromParent(float pitch) { detuneFromParent = pitch; } void setUnisonDetuneFromParent(float factor) { unisonDetuneFactorFromParent = factor; } void computeUnisonFreqRap(int nvoice); void computeNoteParameters(); void computeWorkingParameters(); void computePhaseOffsets(int nvoice); void computeFMPhaseOffsets(int nvoice); void initParameters(); void initSubVoices(size_t unison_total_size); void killVoice(int nvoice); void killNote(); float getVoiceBaseFreq(int nvoice); float getFMVoiceBaseFreq(int nvoice); void computeVoiceOscillatorLinearInterpolation(int nvoice); void applyVoiceOscillatorMorph(int nvoice); void applyVoiceOscillatorRingModulation(int nvoice); void computeVoiceModulator(int nvoice, int FMmode); void computeVoiceModulatorLinearInterpolation(int nvoice); void applyAmplitudeOnVoiceModulator(int nvoice); void normalizeVoiceModulatorFrequencyModulation(int nvoice, int FMmode); void computeVoiceModulatorFrequencyModulation(int nvoice, int FMmode); void computeVoiceModulatorForFMFrequencyModulation(int nvoice); void computeVoiceOscillatorFrequencyModulation(int nvoice); void computeVoiceOscillatorForFMFrequencyModulation(int nvoice); // FMmode = 0 for phase modulation, 1 for Frequency modulation // void ComputeVoiceOscillatorFrequencyModulation(int nvoice); void computeVoiceOscillatorPitchModulation(int nvoice); void computeVoiceNoise(int nvoice); void ComputeVoicePinkNoise(int nvoice); void ComputeVoiceSpotNoise(int nvoice); void computeVoiceOscillator(int nvoice); void fadein(Samples& smps); // Globals SynthEngine& synth; ADnoteParameters& adpars; ParamBase::ParamsUpdate paramsUpdate; Controller& ctl; Note note; bool stereo; enum NoteStatus { NOTE_DISABLED, NOTE_ENABLED, NOTE_LEGATOFADEOUT } noteStatus; // Global parameters struct ADnoteGlobal { //**************************** // FREQUENCY GLOBAL PARAMETERS //**************************** float detune; // in cents unique_ptr freqEnvelope; unique_ptr freqLFO; //**************************** // AMPLITUDE GLOBAL PARAMETERS //**************************** float volume; // [ 0 .. 1 ] float randpanL; // [ 0 .. 1 ] float randpanR; float fadeinAdjustment; unique_ptr ampEnvelope; unique_ptr ampLFO; struct Punch { bool enabled; float initialvalue; float dt; float t; } punch; //************************* // FILTER GLOBAL PARAMETERS //************************* unique_ptr filterL; unique_ptr filterR; unique_ptr filterEnvelope; unique_ptr filterLFO; ADnoteGlobal(); ADnoteGlobal(ADnoteGlobal const&); }; ADnoteGlobal noteGlobal; // Voice parameters struct ADnoteVoice { bool enabled; int voice; // the voice used as source. int noiseType; // (sound/noise) bool filterBypass; int delayTicks; SampleHolder oscilSmp; // Waveform of the Voice. Shared with sub voices. int phaseOffset; // PWM emulation // Frequency parameters bool fixedFreq; // if the frequency is fixed to 440 Hz int fixedFreqET; // if the "fixed" frequency varies according to the note (ET) float detune; // cents = basefreq * VoiceDetune float fineDetune; float bendAdjust; float offsetHz; unique_ptr freqEnvelope; unique_ptr freqLFO; // Amplitude parameters float volume; // -1.0 .. 1.0 float panning; // 0.0 = left, 0.5 = center, 1.0 = right float randpanL; float randpanR; unique_ptr ampEnvelope; unique_ptr ampLFO; struct Punch { int enabled; float initialvalue, dt, t; } punch; // Filter parameters unique_ptr voiceFilterL; unique_ptr voiceFilterR; unique_ptr filterEnvelope; unique_ptr filterLFO; // Modulator parameters FMTYPE fmEnabled; bool fmRingToSide; bool fmFreqFixed; int fmVoice; Samples voiceOut; // Voice Output used by other voices if use this as modulator SampleHolder fmSmp; // Wave of the Voice. Shared by sub voices. int fmPhaseOffset; float fmVolume; bool fmDetuneFromBaseOsc; // Whether we inherit the base oscillator's detuning float fmDetune; // in cents unique_ptr fmFreqEnvelope; unique_ptr fmAmpEnvelope; }; ADnoteVoice NoteVoicePar[NUM_VOICES]; // Internal values of the note and of the voices int tSpot; // spot noise noise interrupt time RandomGen paramRNG; // A preseeded random number generator, reseeded // with a known seed every time parameters are // updated. This allows parameters to be changed // smoothly. New notes will get a new seed. uint32_t paramSeed; // The seed for paramRNG. //pinking filter (Paul Kellet) float pinking[NUM_VOICES][14]; size_t unison_size[NUM_VOICES]; // the size of unison for a single voice float unison_stereo_spread[NUM_VOICES]; // stereo spread of unison subvoices (0.0=mono,1.0=max) // Array-of dynamically allocated value-Arrays [voice][unison] template using VoiceUnisonArray = std::array, NUM_VOICES>; // Wavetable reading position // *hi = skip/slot in the base wavetable // *lo = fractional part / interpolation VoiceUnisonArray oscposhi; VoiceUnisonArray oscposlo; // Frequency / Wavetable increment VoiceUnisonArray oscfreqhi; // integer part (skip) VoiceUnisonArray oscfreqlo; // fractional part (skip) // Modulator calculation pos and skip (frequency) VoiceUnisonArray oscposhiFM; VoiceUnisonArray oscposloFM; VoiceUnisonArray oscfreqhiFM; VoiceUnisonArray oscfreqloFM; VoiceUnisonArray unison_base_freq_rap;// the unison base_value VoiceUnisonArray unison_freq_rap; // how the unison subvoice's frequency is changed (1.0 for no change) VoiceUnisonArray unison_invert_phase; // which unison subvoice has phase inverted // These are set by parent voices. float detuneFromParent; // How much the voice should be detuned. float unisonDetuneFactorFromParent; // How much the voice should be detuned from unison. struct UnisonVibrato { float amplitude; // amplitude which be added to unison_freq_rap unique_ptr step; // value which increments the position unique_ptr position; // between -1.0 and 1.0 }; UnisonVibrato unison_vibrato[NUM_VOICES]; float oldAmplitude[NUM_VOICES]; // used to compute and interpolate the float newAmplitude[NUM_VOICES]; // amplitudes of voices and modulators float fm_oldAmplitude[NUM_VOICES]; float fm_newAmplitude[NUM_VOICES]; VoiceUnisonArray fm_oldSmp; // used by Frequency Modulation (for integration) VoiceUnisonArray fmfm_oldPhase; // use when rendering FM modulator with parent FM VoiceUnisonArray fmfm_oldPMod; VoiceUnisonArray fmfm_oldInterpPhase; VoiceUnisonArray fm_oldOscPhase; // rendering Oscil with parent FM that will be used for FM VoiceUnisonArray fm_oldOscPMod; VoiceUnisonArray fm_oldOscInterpPhase; bool forFM; // Whether this voice will be used for FM modulation. unique_ptr tmpwave_unison; size_t max_unison; unique_ptr tmpmod_unison; bool freqbasedmod[NUM_VOICES]; float globaloldamplitude; // interpolate the amplitudes float globalnewamplitude; char firsttick[NUM_VOICES]; // 1 - if it is the first tick. // used to fade in the sound bool portamento; // note performs portamento starting from previous note frequency float bandwidthDetuneMultiplier; // factor to increase or reduce the fine detuning // Legato vars float legatoFade; float legatoFadeStep; float pangainL; float pangainR; VoiceUnisonArray> subVoice; VoiceUnisonArray> subFMVoice; // Proxy-sub-Voice marker: -1 for ordinary (top-level) notes; // otherwise the Voice within the top-level note to attach to. // Note: in a (proxy)-sub-Voice, only the voice corresponding to the subVoiceNr is enabled, // and its oscilSmp is aliased to use the wavetable from the corresponding voice in the master int subVoiceNr; // For sub voices: The controlling top-level note that attached this sub-voice. ADnote *topVoice; // For sub voices: Pointer to the closest parent that has phase/frequency modulation. float *parentFMmod; }; #endif /*ADnote.h*/ yoshimi-2.3.5.1/src/Synth/Envelope.cpp000066400000000000000000000141711506652756400175420ustar00rootroot00000000000000/* Envelope.cpp - Envelope implementation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011 Alan Calvert Copyright 2020 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original */ #include "Synth/Envelope.h" #include "Misc/SynthEngine.h" #include "Misc/NumericFuncs.h" #include "Params/EnvelopeParams.h" using func::power; using func::decibel; using func::asDecibel; Envelope::Envelope(EnvelopeParams *envpars, float basefreq_, SynthEngine *_synth): _envpars(envpars), envUpdate(*envpars), basefreq(basefreq_), synth(_synth) { envpoints = envpars->Penvpoints; if (envpoints > MAX_ENVELOPE_POINTS) envpoints = MAX_ENVELOPE_POINTS; envsustain = envpars->Penvsustain; forcedrelase = envpars->Pforcedrelease; linearenvelope = envpars->Plinearenvelope; recomputePoints(); currentpoint = 1; // the envelope starts from 1 keyreleased = 0; t = 0.0f; envfinish = 0; envoutval = 0.0f; } // Release the key (note envelope) void Envelope::releasekey() { if (keyreleased == 1) return; keyreleased = 1; if (forcedrelase != 0) t = 0.0f; } void Envelope::recomputePoints() { if (not _envpars->Pfreemode) _envpars->converttofree(); int mode = _envpars->Envmode; // for amplitude envelopes if (mode == PART::envelope::groupmode::amplitudeLin && linearenvelope == 0) mode = PART::envelope::groupmode::amplitudeLog; // change to log envelope if (mode == PART::envelope::groupmode::amplitudeLog && linearenvelope != 0) mode = PART::envelope::groupmode::amplitudeLin; // change to linear envstretch = powf(440.0f / basefreq, _envpars->Penvstretch / 64.0f); for (int i = 0; i < MAX_ENVELOPE_POINTS; ++i) { switch (mode) { case 2: envval[i] = (1.0f - _envpars->Penvval[i] / 127.0f) * MIN_ENVELOPE_DB; break; case 3: envval[i] = (power<2>(6.0f * fabsf(_envpars->Penvval[i] - 64.0f) / 64.0f) - 1.0f) * 100.0f; if (_envpars->Penvval[i] < 64) envval[i] = -envval[i]; break; case 4: envval[i] = (_envpars->Penvval[i] - 64.0f) / 64.0f * 6.0f; // 6 octaves (filtru) break; case 5: envval[i] = (_envpars->Penvval[i] - 64.0f) / 64.0f * 10.0f; break; default: envval[i] = _envpars->Penvval[i] / 127.0f; break; } } } // Envelope Output float Envelope::envout() { if (envUpdate.checkUpdated()) recomputePoints(); float out; if (envfinish) { // if the envelope is finished envoutval = envval[envpoints - 1]; return envoutval; } if (currentpoint == envsustain + 1 && !keyreleased && (envsustain != 0)) { // if it is sustaining now envoutval = envval[envsustain]; return envoutval; } float bufferdt = synth->sent_buffersize_f / synth->samplerate_f; if (keyreleased && forcedrelase) { // do the forced release size_t tmp = (envsustain == 0) ? (envpoints - 1) : (envsustain + 1); // if there is no sustain point, use the last point for release float envdt = bufferdt * 1000.0f / (_envpars->getdt(tmp) * envstretch); if (envdt >= 1.0f) envdt = 2.0f; // any value larger than 1 if (envdt <0.00000001f) out = envval[tmp]; else out = envoutval + (envval[tmp] - envoutval) * t; t += envdt * envstretch; if (t >= 1.0f) { currentpoint = tmp + 1; forcedrelase = 0; t = 0.0f; if (currentpoint >= envpoints || envsustain == 0) envfinish = 1; } return out; } float envdt = bufferdt * 1000.0f / (_envpars->getdt(currentpoint) * envstretch); if (envdt >= 1.0f) envdt = 2.0f; // any value larger than 1 if (envdt >= 1.0f) out = envval[currentpoint]; else out = envval[currentpoint - 1] + (envval[currentpoint] - envval[currentpoint - 1]) * t; t += envdt; if (t >= 1.0f) { if (currentpoint >= envpoints - 1) envfinish = 1; else currentpoint++; t = 0.0f; } envoutval = out; return out; } // Envelope Output (dB) float Envelope::envout_dB() { if (envUpdate.checkUpdated()) recomputePoints(); float out; if (linearenvelope != 0) return envout(); if (currentpoint == 1 && (keyreleased == 0 || forcedrelase == 0)) { // first point is always linearly interpolated float v1 = decibel(envval[0]); float v2 = decibel(envval[1]); out = v1 + (v2 - v1) * t; float bufferdt = synth->sent_buffersize_f / synth->samplerate_f; float envdt = bufferdt * 1000.0f / (_envpars->getdt(1) * envstretch); if (envdt >= 1.0f) envdt = 2.0f; // any value larger than 1 t += envdt; if (t >= 1.0f) { t = 0.0f; currentpoint++; out = v2; } if (out > 0.001f) envoutval = asDecibel(out); else envoutval = MIN_ENVELOPE_DB; } else out = decibel(envout()); return out; } yoshimi-2.3.5.1/src/Synth/Envelope.h000066400000000000000000000040751506652756400172110ustar00rootroot00000000000000/* Envelope.h - Envelope implementation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011 Alan Calvert Copyright 2020 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original */ #ifndef ENVELOPE_H #define ENVELOPE_H #include "globals.h" #include "Params/ParamCheck.h" class EnvelopeParams; class SynthEngine; class Envelope { public: Envelope(EnvelopeParams *envpars, float basefreq_, SynthEngine *_synth); ~Envelope() { }; void releasekey(); float envout(); float envout_dB(); int finished() { return envfinish; }; private: EnvelopeParams *_envpars; ParamBase::ParamsUpdate envUpdate; size_t envpoints; size_t envsustain; // 0 means disabled float envval[MAX_ENVELOPE_POINTS]; // [0.0 .. 1.0] float envstretch; int linearenvelope; float basefreq; int forcedrelase; char keyreleased; // if the key was released char envfinish; size_t currentpoint; // current envelope point (starts from 1) float t; // the time from the last point float envoutval; // used to do the forced release SynthEngine *synth; void recomputePoints(); }; #endif yoshimi-2.3.5.1/src/Synth/LFO.cpp000066400000000000000000000224721506652756400164100ustar00rootroot00000000000000/* LFO.cpp - LFO implementation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2019, Will Godfrey & others Copyright 2020-2021 Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #include #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Synth/LFO.h" using func::power; using func::powFrac; LFO::LFO(LFOParams *_lfopars, float _basefreq, SynthEngine *_synth): lfopars(_lfopars), lfoUpdate(*lfopars), basefreq(_basefreq), sampandholdvalue(0.0f), issampled(0), // initialized to 0 for correct startup synth(_synth) { if (lfopars->Pstretch == 0) lfopars->Pstretch = 1; RecomputeFreq(); // need incx early if (not lfopars->Pcontinous) { // pre-init phase if (lfopars->Pstartphase == 0) startPhase = synth->numRandom(); else startPhase = fmodf(((float)((int)lfopars->Pstartphase - 64) / 127.0f + 1.0f), 1.0f); if (lfopars->Pbpm) { prevMonotonicBeat = synth->getMonotonicBeat(); prevBpmFrac = getBpmFrac(); startPhase = fmodf(startPhase - prevMonotonicBeat * prevBpmFrac.first / prevBpmFrac.second, 1.0f); if (startPhase < 0) startPhase += 1.0f; } } else if (not lfopars->Pbpm) { // pre-init phase, synced to other notes startPhase = fmodf(synth->getLFOtime() * incx, 1.0f); startPhase = fmodf((((int)lfopars->Pstartphase - 64) / 127.0f + 1.0f + startPhase), 1.0f); } else // Pcontinous and Pbpm startPhase = fmodf((((int)lfopars->Pstartphase - 64) / 127.0f + 1.0f), 1.0f); x = startPhase; lfoelapsed = 0.0f; incrnd = nextincrnd = 1.0f; Recompute(); if (lfopars->fel == 0) // this is a Frequency LFO x -= 0.25f; // change the starting phase amp1 = (1 - lfornd) + lfornd * synth->numRandom(); amp2 = (1 - lfornd) + lfornd * synth->numRandom(); computenextincrnd(); // twice because I want incrnd & nextincrnd to be random } inline void LFO::Recompute() { // mostly copied from LFO::LFO() RecomputeFreq(); lfornd = lfopars->Prandomness / 127.0f; if (lfornd < 0.0f) lfornd = 0.0f; else if (lfornd > 1.0f) lfornd = 1.0f; // (orig comment) lfofreqrnd=pow(lfopars->Pfreqrand/127.0,2.0)*2.0*4.0; lfofreqrnd = powf(lfopars->Pfreqrand / 127.0f, 2.0f) * 4.0f; switch (lfopars->fel) { case 1: lfointensity = lfopars->Pintensity / 127.0f; break; case 2: lfointensity = lfopars->Pintensity / 127.0f * 4.0f; break; // in octave default: lfointensity = power<2>(lfopars->Pintensity / 127.0f * 11.0f) - 1.0f; // in centi break; } lfotype = lfopars->PLFOtype; freqrndenabled = (lfopars->Pfreqrand != 0); computenextincrnd(); if (lfopars->Pcontinous and lfopars->Pbpm) // When we are BPM synced to the host, it's nice to have direct feedback // when changing phase. This works because we reset the phase completely // on every cycle. startPhase = fmodf((((int)lfopars->Pstartphase - 64) / 127.0f + 1.0f), 1.0f); } inline void LFO::RecomputeFreq() { float lfostretch = powf(basefreq / 440.0f, (float)((int)lfopars->Pstretch - 64) / 63.0f); // max 2x/octave float lfofreq = lfopars->Pfreq * lfostretch; incx = fabsf(lfofreq) / synth->samplerate_f; } // LFO out float LFO::lfoout() { if (lfoUpdate.checkUpdated()) Recompute(); float out; switch (lfotype) { case 1: // LFO_TRIANGLE if (x >= 0.0f && x < 0.25f) out = 4.0f * x; else if (x > 0.25f && x < 0.75f) out = 2.0f - 4.0f * x; else out = 4.0f * x - 4.0f; break; case 2: // LFO_SQUARE if (x < 0.5f) out = -1.0f; else out = 1.0f; break; case 3: // LFO_RAMPUP out = (x - 0.5f) * 2.0f; break; case 4: // LFO_RAMPDOWN out = (0.5f - x) * 2.0f; break; case 5: // LFO_EXP_DOWN 1 out = powFrac<20>(x) * 2.0f - 1.0f; break; case 6: // LFO_EXP_DOWN 2 out = powFrac<1000>(x) * 2.0f - 1.0f; break; case 7: // LFO_SAMPLE_&_HOLD if (x < 0.5f) { if (issampled == 0) { issampled = 1; sampandholdvalue = synth->numRandom(); //out = (sampandholdvalue - 0.5f) * 2.0f; } out = (sampandholdvalue - 0.5f) * 2.0f; } else { if (issampled == 1) { issampled = 0; sampandholdvalue = synth->numRandom(); //out = (sampandholdvalue - 0.5f) * 2.0f; } out = (sampandholdvalue - 0.5f) * 2.0f; } break; case 8: // LFO_RANDOM_SQUARE_UP if (x < 0.5f) { if (issampled == 1) issampled = 0; out = -1.0f; } else { if (issampled == 0) { issampled = 1; sampandholdvalue = synth->numRandom(); } out = sampandholdvalue; } break; case 9: // LFO_RANDOM_SQUARE_DOWN if (x < 0.5f) { if (issampled == 1) issampled = 0; out = 1.0f; } else { if (issampled == 0) { issampled = 1; sampandholdvalue = synth->numRandom(); } out = sampandholdvalue - 1.0f; } break; default: out = cosf(x * TWOPI); // LFO_SINE break; } if (lfotype == 0 || lfotype == 1) out *= lfointensity * (amp1 + x * (amp2 - amp1)); else out *= lfointensity * amp2; float lfodelay = lfopars->Pdelay / 127.0f * 4.0f; // 0..4 sec if (lfoelapsed >= lfodelay) { float oldx = x; if (not lfopars->Pbpm) { float incxMult = incx * synth->sent_buffersize_f; // Limit the Frequency (or else...) if (incxMult > 0.49999999f) incxMult = 0.49999999f; if (!freqrndenabled) x += incxMult; else { float tmp = (incrnd * (1.0f - x) + nextincrnd * x); tmp = (tmp > 1.0f) ? 1.0f : tmp; x += incxMult * tmp; } x = fmodf(x, 1.0f); } else {// beat sync (Pbpm) std::pair frac = getBpmFrac(); float newBeat; if (not lfopars->Pcontinous) { if (frac != prevBpmFrac) { // Since we reset the phase on every cycle, if the BPM // fraction changes we need to adapt startPhase or we will // get an abrupt phase change. startPhase = fmodf(x - prevMonotonicBeat * frac.first / frac.second, 1.0f); if (startPhase < 0) startPhase += 1.0f; prevBpmFrac = frac; } newBeat = synth->getMonotonicBeat(); prevMonotonicBeat = newBeat; } else newBeat = synth->getSongBeat(); x = fmodf(newBeat * frac.first / frac.second + startPhase, 1.0f); } if (oldx >= 0.5f && x < 0.5f) { amp1 = amp2; amp2 = (1 - lfornd) + lfornd * synth->numRandom(); computenextincrnd(); } } else lfoelapsed += synth->sent_buffersize_f / synth->samplerate_f; return out; } // LFO out (for amplitude) float LFO::amplfoout() { float out; out = 1.0f - lfointensity + lfoout(); if (out < -1.0f) out = -1.0f; else if (out > 1.0f) out = 1.0f; return out; } void LFO::computenextincrnd() { if (!freqrndenabled) return; incrnd = nextincrnd; nextincrnd = powFrac<2>(lfofreqrnd) + synth->numRandom() * (power<2>(lfofreqrnd) - 1.0f); } yoshimi-2.3.5.1/src/Synth/LFO.h000066400000000000000000000041751506652756400160550ustar00rootroot00000000000000/* LFO.h - LFO implementation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017, Will Godfrey & others Copyright 2020 Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #ifndef LFO_H #define LFO_H #include "Params/LFOParams.h" #include "Misc/NumericFuncs.h" class SynthEngine; class LFO { public: ~LFO() = default; LFO(LFOParams* _lfopars, float basefreq, SynthEngine* _synth); float lfoout(); float amplfoout(); private: std::pair getBpmFrac() { return func::LFOfreqBPMFraction((float)lfopars->PfreqI / float(Fmul2I)); } LFOParams *lfopars; ParamBase::ParamsUpdate lfoUpdate; void Recompute(); void RecomputeFreq(); void computenextincrnd(); float x; float basefreq; float incx, incrnd, nextincrnd; float amp1, amp2; // used for randomness float lfointensity; float lfornd; float lfofreqrnd; float lfoelapsed; float startPhase; char lfotype; int freqrndenabled; float sampandholdvalue; int issampled; float prevMonotonicBeat; std::pair prevBpmFrac; SynthEngine *synth; }; #endif yoshimi-2.3.5.1/src/Synth/OscilGen.cpp000066400000000000000000001231531506652756400174710ustar00rootroot00000000000000/* OscilGen.cpp - Waveform generator for ADnote Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011 Alan Calvert Copyright 2009 James Morris Copyright 2016-2019 Will Godfrey & others Copyright 2020 Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #include #include #include #include #include #include #include "Effects/Distorsion.h" #include "Misc/Config.h" #include "Misc/SynthEngine.h" #include "Misc/NumericFuncs.h" #include "Synth/OscilGen.h" using func::power; using std::vector; namespace {// Implementation helpers inline float sqr(float v) { return v*v; } constexpr float CUTOFF = 1e-10; constexpr float LOW_LIMIT = 1e-5; } OscilGen::OscilGen(fft::Calc& fft_, Resonance* res_, SynthEngine* _synth, OscilParameters* params_) : params{params_} , synth{_synth} , fft{fft_} , tmpsmps{fft_.tableSize()} , outoscilSpectrum{fft.spectrumSize()} , oscilSpectrum{fft.spectrumSize()} , oscilupdate{*params} , res{res_} , randseed{1} , basePrng{} , harmonicPrng{} { genDefaults(); } void OscilGen::changeParams(OscilParameters* params_) { params = params_; oscilupdate.changeParams(*params); } void OscilGen::defaults() { params->defaults(); genDefaults(); } void OscilGen::genDefaults() { oldbasefunc = 0; oldbasepar = 64; oldhmagtype = 0; oldwaveshapingfunction = 0; oldwaveshaping = 64; oldbasefuncmodulation = 0; oldharmonicshift = 0; oldbasefuncmodulationpar1 = 0; oldbasefuncmodulationpar2 = 0; oldbasefuncmodulationpar3 = 0; oldmodulation = 0; oldmodulationpar1 = 0; oldmodulationpar2 = 0; oldmodulationpar3 = 0; memset(hmag, 0, MAX_AD_HARMONICS * sizeof(float)); memset(hphase, 0, MAX_AD_HARMONICS * sizeof(float)); oscilSpectrum.reset(); oldfilterpars = 0; oldsapars = 0; prepare(); } void OscilGen::convert2sine() { float mag[MAX_AD_HARMONICS], phase[MAX_AD_HARMONICS]; fft::Waveform oscil(fft.tableSize()); fft::Spectrum freqs(fft.spectrumSize()); getWave(oscil, 1.0f); fft.smps2freqs(oscil, freqs); float max = 0.0f; mag[0] = 0; phase[0] = 0; assert (MAX_AD_HARMONICS < fft.spectrumSize()); for (int i = 0; i < MAX_AD_HARMONICS; ++i) { mag[i] = sqrtf(sqr(freqs.s(i+1)) + sqr(freqs.c(i+1))); phase[i] = atan2(freqs.c(i+1), freqs.s(i+1)); if (max < mag[i]) max = mag[i]; } if (max < CUTOFF) max = 1.0; defaults(); for (size_t i = 0; i < MAX_AD_HARMONICS - 1; ++i) { float newmag = mag[i] / max; float newphase = phase[i]; params->Phmag[i] = 64 + int(newmag * 64.0); params->Phphase[i] = 64 - int(64.0 * newphase / PI); if (params->Phphase[i] > 127) params->Phphase[i] = 127; if (params->Phmag[i] == 64) params->Phphase[i] = 64; } prepare(); } // Base Functions - START float OscilGen::basefunc_pulse(float x, float a) { return (fmodf(x, 1.0f) < a) ? -1.0f : 1.0f; } float OscilGen::basefunc_saw(float x, float a) { if (a < LOW_LIMIT) a = LOW_LIMIT; else if (a > 0.99999f) a = 0.99999f; x = fmodf(x, 1.0f); if (x < a) return x / a * 2.0f - 1.0f; else return (1.0f - x) / (1.0f - a) * 2.0f - 1.0f; } float OscilGen::basefunc_triangle(float x, float a) { x = fmodf(x + 0.25f, 1.0f); a = 1 - a; if (a < LOW_LIMIT) a = LOW_LIMIT; if (x < 0.5f) x = x * 4.0f - 1.0f; else x = (1.0f - x) * 4.0f - 1.0f; x /= -a; if (x < -1.0f) x = -1.0f; if (x > 1.0f) x = 1.0f; return x; } float OscilGen::basefunc_power(float x, float a) { x = fmodf(x, 1.0f); if (a < LOW_LIMIT) a = LOW_LIMIT; else if (a > 0.99999f) a = 0.99999f; return powf(x, (expf((a - 0.5f) * 10.0f))) * 2.0f - 1.0f; } float OscilGen::basefunc_gauss(float x, float a) { x = fmodf(x, 1.0f) * 2.0f - 1.0f; if (a < LOW_LIMIT) a = LOW_LIMIT; return expf(-x * x * (expf(a * 8.0f) + 5.0f)) * 2.0f - 1.0f; } float OscilGen::basefunc_diode(float x, float a) { if (a < LOW_LIMIT) a = LOW_LIMIT; else if (a > 0.99999f) a = 0.99999f; a = a * 2.0f - 1.0f; x =cosf((x + 0.5f) * TWOPI) - a; if (x < 0.0f) x = 0.0f; return x / (1.0f - a) * 2.0f - 1.0f; } float OscilGen::basefunc_abssine(float x, float a) { x = fmodf(x, 1.0f); if (a < LOW_LIMIT) a = LOW_LIMIT; else if (a > 0.99999f) a = 0.99999f; return sinf(powf(x, (expf((a - 0.5f) * 5.0f))) * PI) * 2.0f - 1.0f; } float OscilGen::basefunc_pulsesine(float x, float a) { if (a < LOW_LIMIT) a = LOW_LIMIT; x = (fmodf(x, 1.0f) - 0.5f) * expf((a - 0.5f) * logf(128.0f)); if (x < -0.5f) x = -0.5f; else if (_SYS_::F2B(x)) x = 0.5f; x = sinf(x * TWOPI); return x; } float OscilGen::basefunc_stretchsine(float x, float a) { x = fmodf(x + 0.5f, 1.0f) * 2.0f - 1.0f; a =(a - 0.5f) * 4.0f; if (a > 0.0f) a *= 2.0f; a = power<3>(a); float b = powf(fabsf(x), a); if (x < 0.0f) b = -b; return -sinf(b * PI); } float OscilGen::basefunc_chirp(float x, float a) { x = fmodf(x, 1.0f) * TWOPI; a = (a - 0.5f) * 4.0f; if (a < 0.0f) a *= 2.0f; a = power<3>(a); return sinf(x / 2.0f) * sinf(a * x * x); } float OscilGen::basefunc_absstretchsine(float x, float a) { x = fmodf(x + 0.5f, 1.0f) * 2.0f - 1.0f; a = (a - 0.5f) * 9.0f; a = power<3>(a); float b = powf(fabsf(x), a); if (x < 0.0f) b = -b; return -powf(sinf(b * PI), 2.0f); } float OscilGen::basefunc_chebyshev(float x, float a) { a = a * a * a * 30.0f + 1.0f; return cosf(acosf(x * 2.0f - 1.0f) * a); } float OscilGen::basefunc_sqr(float x, float a) { a = a * a * a * a * 160.0f + 0.001f; return -atanf(sinf(x * TWOPI) * a); } float OscilGen::basefunc_spike(float x, float a) { float b = a * 0.66666; // the width of the range: if a == 0.5, b == 0.33333 if (x < 0.5) { if (x < (0.5 - (b / 2.0))) return 0.0; else { x = (x + (b / 2) - 0.5) * (2.0 / b); // shift to zero, and expand to range from 0 to 1 return x * (2.0 / b); // this is the slope: 1 / (b / 2) } } else { if (x > (0.5 + (b / 2.0))) return 0.0; else { x = (x - 0.5) * (2.0 / b); return (1 - x) * (2.0 / b); } } } float OscilGen::basefunc_circle(float x, float a) { // a is parameter: 0 -> 0.5 -> 1 // O.5 = circle float b, y; b = 2 - (a * 2); // b goes from 2 to 0 x = x * 4; if (x < 2) { x = x - 1; // x goes from -1 to 1 if ((x < -b) || (x > b)) y = 0; else y = sqrt(1 - (pow(x, 2) / pow(b, 2))); // normally * a^2, but a stays 1 } else { x = x - 3; // x goes from -1 to 1 as well if ((x < -b) || (x > b)) y = 0; else y = -sqrt(1 - (pow(x, 2) / pow(b, 2))); } return y; } float OscilGen::basefunc_hypsec(float x, float a) { x = (fmodf(x, 1.0f) - 0.5f) * expf(1.2f * (a - 0.2f) * logf(128.0f)); return 1.0f/coshf(x * PI); } // Base Functions - END // Get the base function void OscilGen::getbasefunction(fft::Waveform& smps) { float par = (params->Pbasefuncpar + 0.5f) / 128.0f; if (params->Pbasefuncpar == 64) par = 0.5f; float basefuncmodulationpar1 = params->Pbasefuncmodulationpar1 / 127.0f; float basefuncmodulationpar2 = params->Pbasefuncmodulationpar2 / 127.0f; float basefuncmodulationpar3 = params->Pbasefuncmodulationpar3 / 127.0f; switch (params->Pbasefuncmodulation) { case 1: basefuncmodulationpar1 = (power<2>(basefuncmodulationpar1 * 5.0f) - 1.0f) / 10.0f; basefuncmodulationpar3 = floorf((power<2>(basefuncmodulationpar3 * 5.0f) - 1.0f)); if (basefuncmodulationpar3 < 0.9999f) basefuncmodulationpar3 = -1.0f; break; case 2: basefuncmodulationpar1 = (power<2>(basefuncmodulationpar1 * 5.0f) - 1.0f) / 10.0f; basefuncmodulationpar3 = 1.0f + floorf((power<2>(basefuncmodulationpar3 * 5.0f) - 1.0f)); break; case 3: basefuncmodulationpar1 = (power<2>(basefuncmodulationpar1 * 7.0f) - 1.0f) / 10.0f; basefuncmodulationpar3 = 0.01f + (power<2>(basefuncmodulationpar3 * 16.0f) - 1.0f) / 10.0f; break; default: break; } for (size_t i = 0; i < fft.tableSize(); ++i) { float t = float(i) / fft.tableSize(); switch (params->Pbasefuncmodulation) { case 1: t = t * basefuncmodulationpar3 + sinf((t + basefuncmodulationpar2) * TWOPI) * basefuncmodulationpar1; // rev break; case 2: t = t + sinf((t * basefuncmodulationpar3 + basefuncmodulationpar2) * TWOPI) * basefuncmodulationpar1; // sine break; case 3: t = t + powf(((1.0f - cosf((t + basefuncmodulationpar2) * TWOPI)) * 0.5f), basefuncmodulationpar3) * basefuncmodulationpar1; // power break; default: break; } t = t - floorf(t); switch (params->Pcurrentbasefunc) { case OSCILLATOR::wave::triangle: smps[i] = basefunc_triangle(t, par); break; case OSCILLATOR::wave::pulse: smps[i] = basefunc_pulse(t, par); break; case OSCILLATOR::wave::saw: smps[i] = basefunc_saw(t, par); break; case OSCILLATOR::wave::power: smps[i] = basefunc_power(t, par); break; case OSCILLATOR::wave::gauss: smps[i] = basefunc_gauss(t, par); break; case OSCILLATOR::wave::diode: smps[i] = basefunc_diode(t, par); break; case OSCILLATOR::wave::absSine: smps[i] = basefunc_abssine(t, par); break; case OSCILLATOR::wave::pulseSine: smps[i] = basefunc_pulsesine(t, par); break; case OSCILLATOR::wave::stretchSine: smps[i] = basefunc_stretchsine(t, par); break; case OSCILLATOR::wave::chirp: smps[i] = basefunc_chirp(t, par); break; case OSCILLATOR::wave::absStretchSine: smps[i] = basefunc_absstretchsine(t, par); break; case OSCILLATOR::wave::chebyshev: smps[i] = basefunc_chebyshev(t, par); break; case OSCILLATOR::wave::square: smps[i] = basefunc_sqr(t, par); break; case OSCILLATOR::wave::spike: smps[i] = basefunc_spike(t, par); break; case OSCILLATOR::wave::circle: smps[i] = basefunc_circle(t, par); break; case OSCILLATOR::wave::hyperSec: smps[i] = basefunc_hypsec(t, par); break; default: // sine smps[i] = -sinf(TWOPI * (i) / fft.tableSize()); break; } } } // Filter the oscillator void OscilGen::oscilfilter() { if (params->Pfiltertype == 0) return; float par = 1.0f - params->Pfilterpar1 / 128.0f; float par2 = params->Pfilterpar2 / 127.0f; float max = 0.0f; float p2; float x; size_t lenSpectrum = oscilSpectrum.size(); for (size_t i = 1; i < lenSpectrum; ++i) { float gain = 1.0f; switch (params->Pfiltertype) { case 1: { gain = powf((1.0f - par * par * par * 0.99f), i); // lp float tmp = par2 * par2 * par2 * par2 * 0.5f + 0.0001f; if (gain < tmp) gain = powf(gain, 10.0f) / powf(tmp, 9.0f); break; } case 2: { gain = 1.0f - powf((1.0f - par * par), float(i + 1)); // hp1 gain = powf(gain, (par2 * 2.0f + 0.1f)); break; } case 3: { if (par < 0.2f) par = par * 0.25f + 0.15f; gain = 1.0f - powf(1.0f - par * par * 0.999f + 0.001f, i * 0.05f * i + 1.0f); // hp1b float tmp = power<5>((par2 * 2.0f)); gain = powf(gain, tmp); break; } case 4: { gain = (i + 1) - power<2>(((1.0f - par) * 7.5f)); // bp1 gain = 1.0f / (1.0f + gain * gain / (i + 1.0f)); float tmp = power<5>((par2 * 2.0f)); gain = powf(gain, tmp); if (gain < LOW_LIMIT) gain = LOW_LIMIT; break; } case 5: { gain = i + 1 - power<2>((1.0f - par) * 7.5f); // bs1 gain = powf(atanf(gain / (i / 10.0f + 1.0f)) / 1.57f, 6.0f); gain = powf(gain, (par2 * par2 * 3.9f + 0.1f)); break; } case 6: { gain = (i + 1 > power<2>((1.0f - par) * 10.0f) ? 0.0f : 1.0f) * par2 + (1.0f - par2); // lp2 break; } case 7: { gain = (i + 1 > power<2>((1.0f - par) * 7.0f) ? 1.0f : 0.0f) * par2 + (1.0f - par2); // hp2 if (params->Pfilterpar1 == 0) gain = 1.0f; break; } case 8: { gain = (fabsf(power<2>((1.0f - par) * 7.0f) - i) > i / 2 + 1 ? 0.0f : 1.0f) * par2 + (1.0f - par2); // bp2 break; } case 9: { gain = (fabsf(power<2>((1.0f - par) * 7.0f) - i) < i / 2 + 1 ? 0.0f : 1.0f) * par2 + (1.0f - par2); // bs2 break; } case 10: { float tmp = power<5>(par2 * 2.0f - 1.0f); tmp = powf((i / 32.0f), tmp) * 32.0f; if (params->Pfilterpar2 == 64) tmp = i; gain = cosf(par * par * HALFPI * tmp); // cos gain *= gain; break; } case 11: { float tmp = power<5>(par2 * 2.0f - 1.0f); tmp = powf((i / 32.0f), tmp) * 32.0f; if (params->Pfilterpar2 == 64) tmp = i; gain = sinf(par * par * HALFPI * tmp); // sin gain *= gain; break; } case 12: { p2 = 1.0f - par + 0.2f; x = i / (64.0f * p2 * p2); x = (x > 1.0f) ? 1.0f : x; float tmp = powf(1.0f - par2, 2.0f); gain = cosf(x * PI) * (1.0f - tmp) + 1.01f + tmp; // low shelf break; } case 13: { gain = 1.0f; if (i == size_t(power<2>(((1.0f - par) * 7.2f)))) gain = power<2>(par2 * par2 * 8.0f); break; } } oscilSpectrum.s(i) *= gain; oscilSpectrum.c(i) *= gain; float tmp = sqr(oscilSpectrum.s(i)) + sqr(oscilSpectrum.c(i)); if (max < tmp) max = tmp; } max = sqrtf(max); if (max < CUTOFF) max = 1.0f; float imax = 1.0f / max; for (size_t i = 1; i < lenSpectrum; ++i) { oscilSpectrum.s(i) *= imax; oscilSpectrum.c(i) *= imax; } } /* Ensure the base function spectrum in the OscilParameters * matches the current parameter settings; possibly regenerate * this spectrum when using one of the predefined base functions. * Remarks: * - a "user base function" (generated with OscilGen::useasbase()) * will be retained as-is and possibly persisted/loaded from XML. * - this function abuses tmpsmps and oscilSpectrum as a temporary * working space; since it is only ever called from OscilGen::prepare() * the oscilSpectrium will be restored / updated immediately afterwards. */ void OscilGen::changebasefunction() { if (params->Pcurrentbasefunc != OSCILLATOR::wave::user) { if (params->Pcurrentbasefunc == OSCILLATOR::wave::sine) {// in this case basefuncSpectrum is not used oscilSpectrum.reset(); } else {// generate spectrum for predefined base function getbasefunction(tmpsmps); fft.smps2freqs(tmpsmps, oscilSpectrum); oscilSpectrum.c(0) = 0.0f; // DC offset } params->updatebasefuncSpectrum(oscilSpectrum); }// note: no update in case of "user" base function oldbasefunc = params->Pcurrentbasefunc; oldbasepar = params->Pbasefuncpar; oldbasefuncmodulation = params->Pbasefuncmodulation; oldbasefuncmodulationpar1 = params->Pbasefuncmodulationpar1; oldbasefuncmodulationpar2 = params->Pbasefuncmodulationpar2; oldbasefuncmodulationpar3 = params->Pbasefuncmodulationpar3; } // Waveshape void OscilGen::waveshape() { oldwaveshapingfunction = params->Pwaveshapingfunction; oldwaveshaping = params->Pwaveshaping; if (params->Pwaveshapingfunction == 0) return; size_t eighth_i = fft.tableSize() / 8; float eighth_f = float(fft.tableSize()) / 8.0f; size_t len = fft.spectrumSize(); oscilSpectrum.c(0) = 0.0f; // remove the DC // reduce the amplitude of the freqs near the nyquist for (size_t i = 1; i < eighth_i; ++i) { float damp = float(i) / eighth_f; oscilSpectrum.s(len - i) *= damp; oscilSpectrum.c(len - i) *= damp; } fft.freqs2smps(oscilSpectrum, tmpsmps); // Normalize float max = 0.0f; for (size_t i = 0; i < fft.tableSize(); ++i) if (max < fabsf(tmpsmps[i])) max = fabsf(tmpsmps[i]); if (max < CUTOFF) max = 1.0f; max = 1.0f / max; for (size_t i = 0; i < fft.tableSize(); ++i) tmpsmps[i] *= max; float* rawData = &tmpsmps[0]; // TODO: switch relevant buffers in SynthEngine also to fft::Waveform and automatic memory management // Do the waveshaping waveShapeSmps(fft.tableSize(), rawData, params->Pwaveshapingfunction, params->Pwaveshaping); fft.smps2freqs(tmpsmps, oscilSpectrum); // perform FFT } // Do the Frequency Modulation of the Oscil void OscilGen::modulation() { oldmodulation = params->Pmodulation; oldmodulationpar1 = params->Pmodulationpar1; oldmodulationpar2 = params->Pmodulationpar2; oldmodulationpar3 = params->Pmodulationpar3; if (params->Pmodulation == 0) return; float modulationpar1 = params->Pmodulationpar1 / 127.0f; float modulationpar2 = 0.5 - params->Pmodulationpar2 / 127.0f; float modulationpar3 = params->Pmodulationpar3 / 127.0f; switch (params->Pmodulation) { case 1: modulationpar1 = (power<2>(modulationpar1 * 7.0f) - 1.0f) / 100.0f; modulationpar3 = floorf((power<2>(modulationpar3 * 5.0f) - 1.0f)); if (modulationpar3 < 0.9999f) modulationpar3 = -1.0f; break; case 2: modulationpar1 = (power<2>(modulationpar1 * 7.0f) - 1.0f) / 100.0f; modulationpar3 = 1.0f + floorf((power<2>(modulationpar3 * 5.0f) - 1.0f)); break; case 3: modulationpar1 = (power<2>(modulationpar1 * 9.0f) - 1.0f) / 100.0f; modulationpar3 = 0.01f + (power<2>(modulationpar3 * 16.0f) - 1.0f) / 10.0f; break; } size_t eighth_i = fft.tableSize() / 8; float eighth_f = float(fft.tableSize()) / 8.0f; size_t len = fft.spectrumSize(); oscilSpectrum.c(0) = 0.0f; // remove the DC // reduce the amplitude of the freqs near the nyquist for (size_t i = 1; i < eighth_i; ++i) { float damp = float(i) / eighth_f; oscilSpectrum.s(len - i) *= damp; oscilSpectrum.c(len - i) *= damp; } fft.freqs2smps(oscilSpectrum, tmpsmps); size_t extra_points = 2; float *in = new float[fft.tableSize() + extra_points]; // Normalize float max = 0.0f; for (size_t i = 0; i < fft.tableSize(); ++i) { float absx = fabsf(tmpsmps[i]); if (max < absx) max = absx; } if (max < CUTOFF) max = 1.0f; max = 1.0f / max; for (size_t i = 0; i < fft.tableSize(); ++i) in[i] = tmpsmps[i] * max; for (size_t i = 0; i < extra_points; ++i) in[i + fft.tableSize()] = tmpsmps[i] * max; // Do the modulation for (size_t i = 0 ; i < fft.tableSize(); ++i) { float t = float(i) / float(fft.tableSize()); switch (params->Pmodulation) { case 1: t = t * modulationpar3 + sinf((t + modulationpar2) * TWOPI) * modulationpar1; // rev break; case 2: t = t + sinf((t * modulationpar3 + modulationpar2) * TWOPI) * modulationpar1; // sine break; case 3: t = t + powf(((1.0f - cosf((t + modulationpar2) * TWOPI)) * 0.5f), modulationpar3) * modulationpar1; // power break; } t = (t - floorf(t)) * float(fft.tableSize()); int poshi = int(t); float poslo = t - poshi; tmpsmps[i] = in[poshi] * (1.0f - poslo) + in[poshi + 1] * poslo; } delete [] in; fft.smps2freqs(tmpsmps, oscilSpectrum); // perform FFT } // Adjust the spectrum void OscilGen::spectrumadjust() { if (params->Psatype == 0) return; float par = params->Psapar / 127.0f; switch (params->Psatype) { case 1: par = 1.0f - par * 2.0f; if (par >= 0.0f) par = power<5>(par); else par = power<8>(par); break; case 2: par = power<10>((1.0f - par) * 3.0f) * 0.25f; break; case 3: par = power<10>((1.0f - par) * 3.0f) * 0.25f; break; } float max = 0.0f; size_t len = oscilSpectrum.size(); for (size_t i = 0; i < len; ++i) { float tmp = sqr(oscilSpectrum.c(i)) + sqr(oscilSpectrum.s(i)); if (max < tmp) max = tmp; } max = 2.0f * sqrtf(max) / fft.tableSize(); ////TODO why factor 2 here? if (max < CUTOFF) max = 1.0; for (size_t i = 0; i < len; ++i) { float mag = sqrtf(sqr(oscilSpectrum.s(i)) + sqr(oscilSpectrum.c(i))) / max; float phase = atan2f(oscilSpectrum.s(i), oscilSpectrum.c(i)); switch (params->Psatype) { case 1: mag = powf(mag, par); break; case 2: if (mag < par) mag = 0.0f; break; case 3: mag /= par; if (mag > 1.0f) mag = 1.0f; break; } oscilSpectrum.c(i) = mag * cosf(phase); oscilSpectrum.s(i) = mag * sinf(phase); } } void OscilGen::shiftharmonics() { if (params->Pharmonicshift == 0) return; float hc, hs; size_t len = oscilSpectrum.size(); int harmonicshift = -params->Pharmonicshift; if (harmonicshift > 0) { for (size_t j = len-1; j > 0; j--) { int oldh = j - harmonicshift; if (oldh < 1) hc = hs = 0.0f; else { hc = oscilSpectrum.c(oldh); hs = oscilSpectrum.s(oldh); } oscilSpectrum.c(j) = hc; oscilSpectrum.s(j) = hs; } } else { for (size_t i = 1; i < len; ++i) { size_t oldh = i + abs(harmonicshift); if (oldh >= len) hc = hs = 0.0f; else { hc = oscilSpectrum.c(oldh); hs = oscilSpectrum.s(oldh); if (fabsf(hc) < CUTOFF) hc = 0.0f; if (fabsf(hs) < CUTOFF) hs = 0.0f; } oscilSpectrum.c(i) = hc; oscilSpectrum.s(i) = hs; } } oscilSpectrum.c(0) = 0.0f; } /* Brings the pseudo random generators within this OscilGen instance into a reproducible state. * The basePrng is (re)seeded through this function, called from prepare() and thus when a new * OscilGen instance is created, or when resetting to defaults prior to loading a preset. * With each NoteON, a new randseed is drawn from this basePrng, and that local randseed is * used for each call to get() to reset the harmonicPrng. Since NoteON happens at random times, * after playing more than one note the relation between SynthEngine::prng and OscilGen::basePrng * is essentially random. * Note: reseed(int) is also used for automated testing, see SynthEngine::setReproducibleState(int) */ void OscilGen::reseed(int value) { basePrng.init(value); newrandseed(); resetHarmonicPrng(); } // Prepare the Oscillator void OscilGen::prepare() { // reseed local PRNGs from SynthEngine PRNG reseed(synth->randomINT() + INT_MAX/2); changebasefunction(); for (int i = 0; i < MAX_AD_HARMONICS; ++i) hphase[i] = (params->Phphase[i] - 64.0f) / 64.0f * PI / (i + 1); for (int i = 0; i < MAX_AD_HARMONICS; ++i) { float hmagnew = 1.0f - fabsf(params->Phmag[i] / 64.0f - 1.0f); switch (params->Phmagtype) { case 1: hmag[i] = expf(hmagnew * logf(0.01f)); break; case 2: hmag[i] = expf(hmagnew * logf(0.001f)); break; case 3: hmag[i] = expf(hmagnew * logf(0.0001f)); break; case 4: hmag[i] = expf(hmagnew * logf(0.00001f)); break; default: hmag[i] = 1.0f - hmagnew; break; } if (params->Phmag[i] < 64) hmag[i] = -hmag[i]; } // remove the harmonics where Phmag[i]==64 for (size_t i = 0; i < MAX_AD_HARMONICS; ++i) if (params->Phmag[i] == 64) hmag[i] = 0.0f; size_t len = oscilSpectrum.size(); assert (MAX_AD_HARMONICS < len); oscilSpectrum.reset(); if (params->Pcurrentbasefunc == OSCILLATOR::wave::sine) { // the sine case for (size_t i = 0; i < MAX_AD_HARMONICS; ++i) { oscilSpectrum.c(i+1) = -hmag[i] * sinf(hphase[i] * (i+1)) / 2.0f; oscilSpectrum.s(i+1) = hmag[i] * cosf(hphase[i] * (i+1)) / 2.0f; } } else { for (size_t j = 0; j < MAX_AD_HARMONICS; ++j) { if (params->Phmag[j] == 64) continue; for (size_t i = 1; i < len; ++i) { size_t k = i * (j + 1); if (k >= len) break; float a = params->getbasefuncSpectrum().c(i); float b = params->getbasefuncSpectrum().s(i); float c = hmag[j] * cosf(hphase[j] * k); float d = hmag[j] * sinf(hphase[j] * k); oscilSpectrum.c(k) += a * c - b * d; oscilSpectrum.s(k) += a * d + b * c; } } } if (params->Pharmonicshiftfirst) shiftharmonics(); if (params->Pfilterbeforews == 0) { waveshape(); oscilfilter(); } else { oscilfilter(); waveshape(); } modulation(); spectrumadjust(); if (!params->Pharmonicshiftfirst) shiftharmonics(); oscilSpectrum.c(0) = 0.0f; oldhmagtype = params->Phmagtype; oldharmonicshift = params->Pharmonicshift + params->Pharmonicshiftfirst * 256; } namespace { // Implementation details... using Accessor = std::function; inline void adaptiveharmonic(Accessor spec, size_t size, float currFreq, unsigned char bfreq, unsigned char type, unsigned char ppow, unsigned char ppar) { if (type == 0) return;// adaptive harmonics switched OFF assert(currFreq >= 1.0); assert(size > 0); std::unique_ptr inf{new float[size]}; for (size_t i = 0; i < size; ++i) { inf[i] = spec(i); spec(i) = 0.0f; } inf[0] = 0.0f; float adapted = 0.0f; float baseFreq = 30.0f * power<10>(bfreq / 128.0f); float power = (ppow + 1.0f) / 101.0f; float rap = currFreq / baseFreq; rap = powf(rap, power); bool down = false; if (rap > 1.0f) { rap = 1.0f / rap; down = true; } for (size_t i = 0; i < size - 2; ++i) { float h = i * rap; size_t high(h); float low = fmodf(h, 1.0f); if (high >= size - 2) break; if (down) { spec(high) += inf[i] * (1.0f - low); spec(high+1) += inf[i] * low; } else { adapted = inf[high] * (1.0f - low) + inf[high+1] * low; if (fabsf(adapted) < CUTOFF) adapted = 0.0f; if (i == 0) { //correct the amplitude of the first harmonic adapted *= rap; } spec(i) = adapted; } } spec(1) += spec(0); spec(0) = 0.0f; if (type <= 1) return; //-----Implant the extended spectrum onto the base spectrum------ // "Padaptiveharmonics" == type of adaptive spectrum to add // Values: 0==OFF(default), 1=ON, 2="Square", 3="2xSub", 4="2xAdd", 3xSub, 3xAdd, 4xSub, 4xAdd float fade = 1.0f - powf((1.0f - 0.01f * ppar), 1.5f); for (size_t i = 1; i < size; ++i) { inf[i] = spec(i) * fade; spec(i) = spec(i) * (1.0f - fade); } if (type == 2) { // "Square" : enforce the even partials for (size_t i = 1; i < size; ++i) if (((i-1) % 2) == 0) spec(i) += inf[i]; // i=1 corresponds to the fundamental,... } else { // handle all other modes int nh = (type - 3) / 2 + 2; int sub_vs_add = (type - 3) % 2; if (sub_vs_add == 0) { for (size_t i = 1; i < size; ++i) { if ((i % nh) == 0) { spec(i) += inf[i]; } } } else { for (size_t i = 1; i < (size-1) / nh; ++i) spec(nh*i) += inf[i]; } } } }//(End) implementation details (adaptive harmonics) // Get the oscillator function void OscilGen::getWave(fft::Waveform& smps, float freqHz, bool applyResonance, bool forGUI) { bool forPAD = false; buildSpectrum(freqHz, applyResonance, forGUI, forPAD); fft.freqs2smps(outoscilSpectrum, smps); for (size_t i = 0; i < fft.tableSize(); ++i) smps[i] *= 0.25f; // correct the amplitude } // Get the current spectrum for rendering in PADSynth (synth->halfoscilsize) // Note: Spectrum slot=0 (DC-Offset) will be discarded. // In the result, index=0 is the fundamental. // See PADnoteParameters::generatespectrum_otherModes() vector OscilGen::getSpectrumForPAD(float freqHz) { bool applyResonance = false; bool forGUI = false; bool forPAD = true; buildSpectrum(freqHz, applyResonance, forGUI, forPAD); vector harmonics(oscilSpectrum.size()); // zero-init for (size_t i = 1; i < outoscilSpectrum.size(); ++i) harmonics[i-1] = sqrtf(sqr(outoscilSpectrum.c(i)) + sqr(outoscilSpectrum.s(i))); return harmonics; } // Core implementation of OscilGen // - possibly prepare() will be called to generate the raw spectrum // - typically invoked for each buffer to generate the Wavetable // including current phase randomisation // - also used to generate the base spectrum for PADsynth void OscilGen::buildSpectrum(float freqHz, bool applyResonance, bool forGUI, bool forPAD) { assert(freqHz > 0.0); if (oldbasepar != params->Pbasefuncpar || oldbasefunc != params->Pcurrentbasefunc || oldhmagtype != params->Phmagtype || oldwaveshaping != params->Pwaveshaping || oldwaveshapingfunction != params->Pwaveshapingfunction) oscilupdate.forceUpdate(); if (oldfilterpars != params->Pfiltertype * 256 + params->Pfilterpar1 + params->Pfilterpar2 * 65536 + params->Pfilterbeforews * 16777216) { oscilupdate.forceUpdate(); oldfilterpars = params->Pfiltertype * 256 + params->Pfilterpar1 + params->Pfilterpar2 * 65536 + params->Pfilterbeforews * 16777216; } if (oldsapars != params->Psatype * 256 + params->Psapar) { oscilupdate.forceUpdate(); oldsapars = params->Psatype * 256 + params->Psapar; } if (oldbasefuncmodulation != params->Pbasefuncmodulation || oldbasefuncmodulationpar1 != params->Pbasefuncmodulationpar1 || oldbasefuncmodulationpar2 != params->Pbasefuncmodulationpar2 || oldbasefuncmodulationpar3 != params->Pbasefuncmodulationpar3) oscilupdate.forceUpdate(); if (oldmodulation != params->Pmodulation || oldmodulationpar1 != params->Pmodulationpar1 || oldmodulationpar2 != params->Pmodulationpar2 || oldmodulationpar3 != params->Pmodulationpar3) oscilupdate.forceUpdate(); if (oldharmonicshift != params->Pharmonicshift + params->Pharmonicshiftfirst * 256) oscilupdate.forceUpdate(); if (oscilupdate.checkUpdated()) prepare(); // start harmonic randomisation from local randseed, drawn in ADnote::ADnote() // see also comment at OscilGen::reseed() resetHarmonicPrng(); outoscilSpectrum.reset(); size_t specLen = outoscilSpectrum.size(); size_t nyquist = size_t(0.5f * synth->samplerate_f / freqHz) + 2; if (forPAD) nyquist = specLen; if (nyquist > specLen) nyquist = specLen; size_t realnyquist = nyquist; if (params->Padaptiveharmonics) nyquist = specLen; for (size_t i = 1; i < nyquist - 1; ++i) { outoscilSpectrum.c(i) = oscilSpectrum.c(i); outoscilSpectrum.s(i) = oscilSpectrum.s(i); } {// Generate adaptive harmonics unsigned char bfreq = params->Padaptiveharmonicsbasefreq; unsigned char type = params->Padaptiveharmonics; unsigned char ppow = params->Padaptiveharmonicspower; unsigned char ppar = params->Padaptiveharmonicspar; Accessor cosPart = [this](size_t i) -> float& { return outoscilSpectrum.c(i); }; Accessor sinPart = [this](size_t i) -> float& { return outoscilSpectrum.s(i); }; float currFreq = forGUI? 440.0f : freqHz; adaptiveharmonic(cosPart, specLen, currFreq, bfreq, type, ppow, ppar); adaptiveharmonic(sinPart, specLen, currFreq, bfreq, type, ppow, ppar); } nyquist = realnyquist; if (params->Padaptiveharmonics) { // do the antialiasing in the case of adaptive harmonics for (size_t i = nyquist; i < specLen; ++i) outoscilSpectrum.s(i) = outoscilSpectrum.c(i) = 0.0f; } // Randomness (each harmonic), the block type is computed // in ADnote by setting start position according to this setting if (params->Prand > 64 && !forGUI && !forPAD) { float rnd, angle, a, b, c, d; rnd = PI * powf((params->Prand - 64.0f) / 64.0f, 2.0f); for (size_t i = 1; i < nyquist - 1; ++i) { // to Nyquist only for AntiAliasing angle = rnd * i * harmonicPrng.numRandom(); a = outoscilSpectrum.c(i); b = outoscilSpectrum.s(i); c = cosf(angle); d = sinf(angle); outoscilSpectrum.c(i) = a * c - b * d; outoscilSpectrum.s(i) = a * d + b * c; } } // Harmonic Amplitude Randomness if (!forGUI && !forPAD) { float power = params->Pamprandpower / 127.0f; float normalize = 1.0f / (1.2f - power); switch (params->Pamprandtype) { case 1: power = power * 2.0f - 0.5f; power = func::power<15>(power); for (size_t i = 1; i < nyquist - 1; ++i) { float amp = powf(harmonicPrng.numRandom(), power) * normalize; outoscilSpectrum.c(i) *= amp; outoscilSpectrum.s(i) *= amp; } break; case 2: power = power * 2.0f - 0.5f; power = func::power<15>(power) * 2.0f; float rndfreq = TWOPI * harmonicPrng.numRandom(); for (size_t i = 1 ; i < nyquist - 1; ++i) { float amp = powf(fabsf(sinf(i * rndfreq)), power) * normalize; outoscilSpectrum.c(i) *= amp; outoscilSpectrum.s(i) *= amp; } break; } } if (applyResonance && !forGUI) res->applyres(nyquist - 1, outoscilSpectrum, freqHz); // Full RMS normalize float sum = 0; for (size_t j = 1; j < specLen; ++j) { sum += sqr(outoscilSpectrum.c(j)) + sqr(outoscilSpectrum.s(j)); } if (sum < CUTOFF) sum = 1.0f; sum = 1.0f / sqrtf(sum); for (size_t j = 1; j < specLen; ++j) { outoscilSpectrum.c(j) *= sum; outoscilSpectrum.s(j) *= sum; } } int OscilGen::getPhase() { if (params->Prand >= 64) return 0; int outpos; outpos = int(fft.tableSize() * (basePrng.numRandom() * 2.0f - 1.0f) * (params->Prand - 64.0f) / 64.0f); outpos = (outpos + 2 * fft.tableSize()) % fft.tableSize(); return outpos; } // Current base function spectrum intensities for display in the UI void OscilGen::getBasefuncSpectrumIntensities(size_t n, float *spc) { size_t specLen = outoscilSpectrum.size(); if (n > specLen) n = specLen; for (size_t i = 1; i < n; ++i) { if (params->Pcurrentbasefunc == OSCILLATOR::wave::sine) spc[i-1] = (i == 1) ? 1.0f : 0.0f; else spc[i-1] = sqrtf(sqr(params->getbasefuncSpectrum().c(i)) + sqr(params->getbasefuncSpectrum().s(i))); } } // Effective oscillator spectrum intensities for display in the UI void OscilGen::getOscilSpectrumIntensities(size_t n, float* spc) { size_t specLen = outoscilSpectrum.size(); if (n > specLen) n = specLen; for (size_t i = 1; i < n; ++i) spc[i-1] = sqrtf(sqr(oscilSpectrum.c(i)) + sqr(oscilSpectrum.s(i))); // display of full OscilGen spectrum: show also the effect of adaptive harmonics uchar bfreq = params->Padaptiveharmonicsbasefreq; uchar type = params->Padaptiveharmonics; uchar ppow = params->Padaptiveharmonicspower; uchar ppar = params->Padaptiveharmonicspar; Accessor accessLine = [spc](size_t i) -> float& { return spc[i]; }; float currFreq = 440.0; // GUI display shows adaptive harmonics with dummy "current" frequency adaptiveharmonic(accessLine, n, currFreq, bfreq, type, ppow, ppar); /////TODO: do we really need the following side-effect on the spectrum stored in the UI's OscilGen? ///// might be just a consequence of the 'tricky' way the original code calculated the adaptive harmonics assert(n <= specLen); for (size_t i = 0; i < n; ++i) outoscilSpectrum.s(i) = outoscilSpectrum.c(i) = spc[i]; for (size_t i = n; i < specLen; ++i) outoscilSpectrum.s(i) = outoscilSpectrum.c(i) = 0.0f; } // Convert the current oscillator spectrum into a // "user base function", which can then be further mixed and processed. void OscilGen::useasbase() { params->updatebasefuncSpectrum(oscilSpectrum); oldbasefunc = params->Pcurrentbasefunc = OSCILLATOR::wave::user; prepare(); } // Get the base function display for the "Osciloscope" in the UI void OscilGen::displayBasefuncForGui(fft::Waveform& smps) { if (params->Pcurrentbasefunc != OSCILLATOR::wave::sine) { fft.freqs2smps(params->getbasefuncSpectrum(), smps); } else getbasefunction(smps); // the sine case } // Get the current effective Oscillator waveform // for display in the "Osciloscope" in the UI void OscilGen::displayWaveformForGui(fft::Waveform& smps) { float dummyFreq = 1.0; bool applyResonance = false; bool forGuiDisplay = true; OscilGen::getWave(smps, dummyFreq, applyResonance, forGuiDisplay); } yoshimi-2.3.5.1/src/Synth/OscilGen.h000066400000000000000000000137531506652756400171420ustar00rootroot00000000000000/* OscilGen.h - Waveform generator for ADnote Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2017-2020 Will Godfrey & others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. */ #ifndef OSCIL_GEN_H #define OSCIL_GEN_H #include #include #include #include "DSP/FFTwrapper.h" #include "Misc/RandomGen.h" #include "Misc/WaveShapeSamples.h" #include "Params/OscilParameters.h" #include "Synth/Resonance.h" class SynthEngine; class OscilGen : private WaveShapeSamples { public: OscilGen(fft::Calc&, Resonance* res_, SynthEngine* _synth, OscilParameters* params_); ~OscilGen() = default; // shall not be copied or moved or assigned OscilGen(OscilGen&&) = delete; OscilGen(OscilGen const&) = delete; OscilGen& operator=(OscilGen&&) = delete; OscilGen& operator=(OscilGen const&) = delete; void changeParams(OscilParameters* params_); void prepare(); void getWave(fft::Waveform&, float freqHz, bool applyResonance =false, bool forGUI =false); std::vector getSpectrumForPAD(float freqHz); // Get just the phase of the oscillator. int getPhase(); void getbasefunction(fft::Waveform&); // called by UI void getOscilSpectrumIntensities(size_t, float*); void getBasefuncSpectrumIntensities(size_t, float*); void displayBasefuncForGui(fft::Waveform&); void displayWaveformForGui(fft::Waveform&); // convert the current Oscil settings into a "user base function" void useasbase(); void genDefaults(); void defaults(); void convert2sine(); // Draw a new random seed for randomisation of harmonics - called every noteon event void newrandseed() { randseed = basePrng.randomINT() + INT_MAX/2; } void resetHarmonicPrng() { harmonicPrng.init(randseed); } void reseed(int value); void forceUpdate(); private: OscilParameters *params; SynthEngine *synth; fft::Calc& fft; fft::Waveform tmpsmps; float hmag[MAX_AD_HARMONICS], hphase[MAX_AD_HARMONICS]; // the magnituides and the phases of the sine/nonsine harmonics // OscilGen core implementation: generate the current Spectrum -> outoscilSpectrum void buildSpectrum(float freqHz, bool applyResonance, bool forGUI, bool forPAD); // computes the basefunction and make the FFT; void changebasefunction(); void waveshape(); // Waveshaping (no kidding!) void oscilfilter(); // Filter the oscillator according to Pfiltertype and Pfilterpar void spectrumadjust(); // Adjust the spectrum void shiftharmonics(); // Shift the harmonics void modulation(); // Do the oscil modulation stuff // Basic/base functions (Functiile De Baza) float basefunc_pulse(float x, float a); float basefunc_saw(float x, float a); float basefunc_triangle(float x, float a); float basefunc_power(float x, float a); float basefunc_gauss(float x, float a); float basefunc_diode(float x, float a); float basefunc_abssine(float x, float a); float basefunc_pulsesine(float x, float a); float basefunc_stretchsine(float x, float a); float basefunc_chirp(float x, float a); float basefunc_absstretchsine(float x, float a); float basefunc_chebyshev(float x, float a); float basefunc_sqr(float x, float a); float basefunc_spike(float x, float a); float basefunc_circle(float x, float a); float basefunc_hypsec(float x, float a); // Internal Data unsigned char oldbasefunc, oldbasepar, oldhmagtype, oldwaveshapingfunction, oldwaveshaping; int oldfilterpars, oldsapars, oldbasefuncmodulation, oldbasefuncmodulationpar1, oldbasefuncmodulationpar2, oldbasefuncmodulationpar3, oldharmonicshift; int oldmodulation, oldmodulationpar1, oldmodulationpar2, oldmodulationpar3; fft::Spectrum outoscilSpectrum; fft::Spectrum oscilSpectrum; // Oscillator Frequencies - this is different // than the hamonics set-up by the user, it may // contain time-domain data if the antialiasing // is turned off ParamBase::ParamsUpdate oscilupdate;// whether the oscil is prepared, if // not prepared we need to call // ::prepare() before ::get() Resonance *res; uint32_t randseed; RandomGen basePrng; RandomGen harmonicPrng; }; // allow to mark this OscilGen as "dirty" to force recalculation of spectrum // (as of 4/22 only relevant for automated testing, see SynthEngine::setReproducibleState() inline void OscilGen::forceUpdate() { oscilupdate.forceUpdate(); } #endif yoshimi-2.3.5.1/src/Synth/PADnote.cpp000066400000000000000000000426101506652756400172560ustar00rootroot00000000000000/* PADnote.cpp Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011 Alan Calvert Copyright 2017-2019 Will Godfrey & others Copyright 2020 Kristian Amlie Copyright 2022 Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #include "Misc/Config.h" #include "Params/PADnoteParameters.h" #include "Params/PADStatus.h" #include "Params/Controller.h" #include "Synth/WaveInterpolator.h" #include "Synth/PADnote.h" #include "Synth/Envelope.h" #include "Synth/LFO.h" #include "DSP/Filter.h" #include "DSP/FFTwrapper.h" #include "Params/Controller.h" #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Misc/NumericFuncs.h" #include #include #include using func::decibel; using func::power; using synth::velF; using synth::getDetune; using synth::interpolateAmplitude; using synth::aboveAmplitudeThreshold; using func::setRandomPan; using std::unique_ptr; PADnote::~PADnote() { } PADnote::PADnote(PADnoteParameters& parameters, Controller& ctl_, Note note_, bool portamento_) : synth{parameters.getSynthEngine()} , pars{parameters} , padSynthUpdate{parameters} , ctl{ctl_} , noteStatus{NOTE_ENABLED} , waveInterpolator{} // will be installed in computeNoteParameters() , note{note_} , realfreq{note.freq} , BendAdjust{1} , OffsetHz{0} , firsttime{true} , released{false} , portamento{portamento_} , globaloldamplitude{0} , globalnewamplitude{0} , randpanL{0.7} , randpanR{0.7} , legatoFade{1.0f} // Full volume , legatoFadeStep{0.0f} // Legato disabled { setupBaseFreq(); setRandomPan(synth.numRandom(), randpanL, randpanR, synth.getRuntime().panLaw, pars.PPanning, pars.PWidth); noteGlobal.fadeinAdjustment = pars.Fadein_adjustment / (float)FADEIN_ADJUSTMENT_SCALE; noteGlobal.fadeinAdjustment *= noteGlobal.fadeinAdjustment; if (pars.PPunchStrength != 0) { noteGlobal.punch.enabled = true; noteGlobal.punch.t = 1.0f; // start from 1.0 and to 0.0 noteGlobal.punch.initialvalue = (power<10>(1.5f * pars.PPunchStrength / 127.0f) - 1.0f) * velF(note.vel, pars.PPunchVelocitySensing); float time = power<10>(3.0f * pars.PPunchTime / 127.0f) / 10000.0f; // 0.1 .. 100 ms float stretch = powf(440.0f / note.freq, pars.PPunchStretch / 64.0f); noteGlobal.punch.dt = 1.0f / (time * synth.samplerate_f * stretch); } else noteGlobal.punch.enabled = false; noteGlobal.freqEnvelope.reset(new Envelope{pars.FreqEnvelope.get(), note.freq, &synth}); noteGlobal.freqLFO .reset(new LFO{pars.FreqLfo.get(), note.freq, &synth}); noteGlobal.ampEnvelope .reset(new Envelope{pars.AmpEnvelope.get(), note.freq, &synth}); noteGlobal.ampLFO .reset(new LFO{pars.AmpLfo.get(), note.freq, &synth}); noteGlobal.ampEnvelope->envout_dB(); // discard the first envelope output noteGlobal.filterL.reset(new Filter{*pars.GlobalFilter.get(), synth}); noteGlobal.filterR.reset(new Filter{*pars.GlobalFilter.get(), synth}); noteGlobal.filterEnvelope.reset(new Envelope{pars.FilterEnvelope.get(), note.freq, &synth}); noteGlobal.filterLFO .reset(new LFO{pars.FilterLfo.get(), note.freq, &synth}); // cause invocation of computeNoteParameter() with next noteout() in Synth-thread (to avoid races) padSynthUpdate.forceUpdate(); } // Copy constructor, used only used for legato (as of 4/2022) PADnote::PADnote(const PADnote &orig) : synth{orig.synth} , pars{orig.pars} , padSynthUpdate{pars} , ctl{orig.ctl} , noteStatus{orig.noteStatus} , waveInterpolator{WaveInterpolator::clone(orig.waveInterpolator)} // use wavetable and reading position from orig , note{orig.note} , realfreq{orig.realfreq} , BendAdjust{orig.BendAdjust} , OffsetHz{orig.OffsetHz} , firsttime{orig.firsttime} , released{orig.released} , portamento{orig.portamento} , globaloldamplitude{orig.globaloldamplitude} , globalnewamplitude{orig.globalnewamplitude} , randpanL{orig.randpanL} , randpanR{orig.randpanR} , legatoFade{0.0f} // initially silent.. , legatoFadeStep{0.0f} // Legato disabled { auto& gpar = noteGlobal; auto& opar = orig.noteGlobal; gpar.detune = opar.detune; gpar.volume = opar.volume; gpar.panning = opar.panning; gpar.fadeinAdjustment = opar.fadeinAdjustment; gpar.punch = opar.punch; // Clone all sub components owned by this note gpar.freqEnvelope.reset(new Envelope{*opar.freqEnvelope}); gpar.freqLFO .reset(new LFO{*opar.freqLFO}); gpar.ampEnvelope .reset(new Envelope{*opar.ampEnvelope}); gpar.ampLFO .reset(new LFO{*opar.ampLFO}); gpar.filterL.reset(new Filter{*opar.filterL}); gpar.filterR.reset(new Filter{*opar.filterR}); gpar.filterEnvelope.reset(new Envelope{*opar.filterEnvelope}); gpar.filterLFO .reset(new LFO{*opar.filterLFO}); } void PADnote::legatoFadeIn(Note note_) { portamento = false; // portamento-legato treated separately this->note = note_; setupBaseFreq(); // cause invocation of computeNoteParameter() with next noteout() // in Synth-thread (deliberately not called directly, to avoid races) padSynthUpdate.forceUpdate(); legatoFade = 0.0f; // Start crossfade up from volume zero legatoFadeStep = synth.fadeStepShort; // Positive steps } void PADnote::legatoFadeOut() { legatoFade = 1.0f; // crossfade down from full volume legatoFadeStep = -synth.fadeStepShort; // Negative steps // transitory state similar to a released Envelope noteStatus = NOTE_LEGATOFADEOUT; } void PADnote::performPortamento(Note note_) { portamento = true; this->note = note_; setupBaseFreq(); // carry on all other parameters unaltered } void PADnote::setupBaseFreq() { if (pars.Pfixedfreq) { note.freq = 440.0f; int fixedfreqET = pars.PfixedfreqET; if (fixedfreqET != 0) { // if the frequency varies according the keyboard note float exponent = (note.midi - 69.0f) / 12.0f * (power<2>((fixedfreqET - 1) / 63.0f) - 1.0f); note.freq *= (fixedfreqET <= 64)? power<2>(exponent) : power<3>(exponent); } } } inline void PADnote::fadein(float *smps) { int zerocrossings = 0; for (int i = 1; i < synth.sent_buffersize; ++i) if (smps[i - 1] < 0.0 && smps[i] > 0.0) zerocrossings++; // this is only the positive crossings float tmp = (synth.sent_buffersize_f - 1.0) / (zerocrossings + 1) / 3.0; if (tmp < 8.0) tmp = 8.0; tmp *= noteGlobal.fadeinAdjustment; int n = int(tmp); // how many samples is the fade-in if (n > synth.sent_buffersize) n = synth.sent_buffersize; for (int i = 0; i < n; ++i) { // fade-in float tmp = 0.5 - cosf((float)i / (float) n * PI) * 0.5f; smps[i] *= tmp; } } bool PADnote::isWavetableChanged(size_t tableNr) { return not(waveInterpolator and waveInterpolator->matches(pars.waveTable[tableNr])); } WaveInterpolator* PADnote::buildInterpolator(size_t tableNr) { bool useCubicInterpolation = synth.getRuntime().Interpolation; float startPhase = waveInterpolator? waveInterpolator->getCurrentPhase() : synth.numRandom(); return WaveInterpolator::create(useCubicInterpolation ,startPhase ,pars.PStereo ,pars.waveTable[tableNr] ,pars.waveTable.basefreq[tableNr]); } WaveInterpolator* PADnote::setupCrossFade(WaveInterpolator* newInterpolator) { if (waveInterpolator and newInterpolator) {// typically called from the Synth-thread from an already playing note (=single-threaded) auto attachCrossFade = [&]() {// Warning: not thread-safe! pars.xFade.attachFader(); PADStatus::mark(PADStatus::FADING, synth.interchange, pars.partID,pars.kitID); }; auto detachCrossFade = [&]() {// Warning: not thread-safe! pars.xFade.detachFader(); if (not pars.xFade) PADStatus::mark(PADStatus::CLEAN, synth.interchange, pars.partID,pars.kitID); }; auto switchInterpolator = [&](WaveInterpolator* followUpInterpolator) { waveInterpolator.reset(followUpInterpolator); }; static_assert(PADnoteParameters::XFADE_UPDATE_MAX/1000 * 96000 < std::numeric_limits::max(), "cross-fade sample count represented as size_t"); size_t crossFadeLengthSmps = pars.PxFadeUpdate * synth.samplerate / 1000; // param given in ms return WaveInterpolator::createXFader(attachCrossFade ,detachCrossFade ,switchInterpolator ,unique_ptr{waveInterpolator.release()} ,unique_ptr{newInterpolator} ,crossFadeLengthSmps ,synth.buffersize); } else // fallback: no existing Interpolator ==> just install given new one return newInterpolator; // relevant for NoteOn after wavetable rebuild (no waveInterpolator yet) } // Setup basic parameters and wavetable for this note instance. // Warning: should only be called from Synth-thread (not concurrently) // to avoid races with wavetable rebuilding and crossfades. void PADnote::computeNoteParameters() { setupBaseFreq(); int BendAdj = pars.PBendAdjust - 64; if (BendAdj % 24 == 0) BendAdjust = BendAdj / 24; else BendAdjust = BendAdj / 24.0f; float offset_val = (pars.POffsetHz - 64)/64.0f; OffsetHz = 15.0f*(offset_val * sqrtf(fabsf(offset_val))); noteGlobal.detune = getDetune(pars.PDetuneType, pars.PCoarseDetune, pars.PDetune); // find wavetable closest to current note frequency float logfreq = logf(note.freq * power<2>(noteGlobal.detune / 1200.0f)); float mindist = fabsf(logfreq - logf(pars.waveTable.basefreq[0] + 0.0001f)); size_t tableNr = 0; // Note: even when empty(silent), tableNr.0 has always a usable basefreq for (size_t tab = 1; tab < pars.waveTable.numTables; ++tab) { float dist = fabsf(logfreq - logf(pars.waveTable.basefreq[tab] + 0.0001f)); if (dist < mindist) { tableNr = tab; mindist = dist; } } if (isWavetableChanged(tableNr)) { if (pars.xFade and not isLegatoFading()) waveInterpolator.reset(setupCrossFade(buildInterpolator(tableNr))); else waveInterpolator.reset(buildInterpolator(tableNr)); } noteGlobal.volume = 4.0f // +12dB boost (similar on ADDnote, while SUBnote only boosts +6dB) * decibel<-60>(1.0f - pars.PVolume / 96.0f) // -60 dB .. +19.375 dB * velF(note.vel, pars.PAmpVelocityScaleFunction); // velocity sensing } void PADnote::computecurrentparameters() { float globalpitch = 0.01 * (noteGlobal.freqEnvelope->envout() + noteGlobal.freqLFO->lfoout() * ctl.modwheel.relmod + noteGlobal.detune); globaloldamplitude = globalnewamplitude; globalnewamplitude = noteGlobal.volume * noteGlobal.ampEnvelope->envout_dB() * noteGlobal.ampLFO->amplfoout(); float filterCenterPitch = pars.GlobalFilter->getfreq() + // center freq pars.PFilterVelocityScale / 127.0 * 6.0 * (velF(note.vel, pars.PFilterVelocityScaleFunction) - 1); // velocity sensing float filterQ = pars.GlobalFilter->getq(); float filterFreqTracking = pars.GlobalFilter->getfreqtracking(note.freq); float globalfilterpitch = noteGlobal.filterEnvelope->envout() + noteGlobal.filterLFO->lfoout() + filterCenterPitch; float tmpfilterfreq = globalfilterpitch + ctl.filtercutoff.relfreq + filterFreqTracking; tmpfilterfreq = noteGlobal.filterL->getrealfreq(tmpfilterfreq); float globalfilterq = filterQ * ctl.filterq.relq; globalfilterq *= pars.randWalkFilterFreq.getFactor(); noteGlobal.filterL->setfreq_and_q(tmpfilterfreq,globalfilterq); noteGlobal.filterR->setfreq_and_q(tmpfilterfreq,globalfilterq); // compute the portamento, if it is used by this note float portamentofreqrap = 1.0; if (portamento) { // this voice use portamento portamentofreqrap = ctl.portamento.freqrap; if (ctl.portamento.used == 0) { // the portamento has finished portamento = false; // this note is no longer "portamented" } } realfreq = note.freq * portamentofreqrap * power<2>(globalpitch / 12.0) * powf(ctl.pitchwheel.relfreq, BendAdjust) + OffsetHz; realfreq *= pars.randWalkDetune.getFactor(); } void PADnote::noteout(float *outl,float *outr) { pars.activate_wavetable(); if (padSynthUpdate.checkUpdated()) computeNoteParameters(); computecurrentparameters(); if (not waveInterpolator or noteStatus == NOTE_DISABLED) return; waveInterpolator->caculateSamples(outl,outr, realfreq, synth.sent_buffersize); if (firsttime) { fadein(outl); fadein(outr); globaloldamplitude = globalnewamplitude; // avoid triggering amplitude interpolation at first buffer cycle firsttime = false; } noteGlobal.filterL->filterout(outl); noteGlobal.filterR->filterout(outr); // Apply the punch if (noteGlobal.punch.enabled) { for (int i = 0; i < synth.sent_buffersize; ++i) { float punchamp = noteGlobal.punch.initialvalue * noteGlobal.punch.t + 1.0; outl[i] *= punchamp; outr[i] *= punchamp; noteGlobal.punch.t -= noteGlobal.punch.dt; if (noteGlobal.punch.t < 0.0) { noteGlobal.punch.enabled = false; break; } } } float pangainL = pars.pangainL; // assume non random pan float pangainR = pars.pangainR; if (pars.PRandom) { pangainL = randpanL; pangainR = randpanR; } if (aboveAmplitudeThreshold(globaloldamplitude,globalnewamplitude)) {// interpolate amplitude change for (int i = 0; i < synth.sent_buffersize; ++i) { float fade = interpolateAmplitude(globaloldamplitude, globalnewamplitude, i, synth.sent_buffersize); outl[i] *= fade * pangainL; outr[i] *= fade * pangainR; } } else { for (int i = 0; i < synth.sent_buffersize; ++i) { outl[i] *= globalnewamplitude * pangainL; outr[i] *= globalnewamplitude * pangainR; } } if (isLegatoFading()) {// apply legato fade to computed samples... for (int i = 0; i < synth.sent_buffersize; ++i) { legatoFade += legatoFadeStep; if (legatoFade <= 0.0f) { legatoFade = 0.0f; legatoFadeStep = 0.0f; memset(outl + i, 0, (synth.sent_buffersize - i) * sizeof(float)); memset(outr + i, 0, (synth.sent_buffersize - i) * sizeof(float)); noteStatus = NOTE_DISABLED; // causes clean-up of this note instance return; } else if (legatoFade >= 1.0f) { legatoFade = 1.0f; legatoFadeStep = 0.0f; break; } outl[i] *= legatoFade; outr[i] *= legatoFade; } } // Check global envelope and discard this note when finished. if (noteGlobal.ampEnvelope->finished() != 0) { for (int i = 0 ; i < synth.sent_buffersize; ++i) { // fade-out float tmp = 1.0f - (float)i / synth.sent_buffersize_f; outl[i] *= tmp; outr[i] *= tmp; } noteStatus = NOTE_DISABLED; // causes clean-up of this note instance return; } } void PADnote::releasekey() { if (noteStatus == NOTE_LEGATOFADEOUT) return; // keep envelopes in sustained state (thereby blocking NoteOff) noteGlobal.freqEnvelope->releasekey(); noteGlobal.filterEnvelope->releasekey(); noteGlobal.ampEnvelope->releasekey(); } yoshimi-2.3.5.1/src/Synth/PADnote.h000066400000000000000000000103671506652756400167270ustar00rootroot00000000000000/* PADnote.h - The "pad" synthesizer Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010 Alan Calvert Copyright 2017 Will Godfrey & others Copyright 2020 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original */ #ifndef PAD_NOTE_H #define PAD_NOTE_H #include using std::unique_ptr; class PADnoteParameters; class WaveInterpolator; class Controller; class Envelope; class LFO; class Filter; class Controller; class SynthEngine; class PADnote { public: PADnote(PADnoteParameters& parameters, Controller& ctl_, Note, bool portamento_); PADnote(const PADnote &orig); ~PADnote(); // shall not be moved or assigned PADnote(PADnote&&) = delete; PADnote& operator=(PADnote&&) = delete; PADnote& operator=(PADnote const&) = delete; void performPortamento(Note); void legatoFadeIn(Note); void legatoFadeOut(); void noteout(float* outl, float* outr); bool finished() const { return noteStatus == NOTE_DISABLED; } void releasekey(); private: void fadein(float* smps); bool isWavetableChanged(size_t tableNr); WaveInterpolator* buildInterpolator(size_t tableNr); WaveInterpolator* setupCrossFade(WaveInterpolator*); void computeNoteParameters(); void computecurrentparameters(); void setupBaseFreq(); bool isLegatoFading() const { return legatoFadeStep != 0.0f; }; SynthEngine& synth; PADnoteParameters& pars; ParamBase::ParamsUpdate padSynthUpdate; Controller& ctl; enum NoteStatus { NOTE_DISABLED, NOTE_ENABLED, NOTE_LEGATOFADEOUT } noteStatus; unique_ptr waveInterpolator; Note note; float realfreq; float BendAdjust; float OffsetHz; bool firsttime; bool released; bool portamento; int Compute_Linear(float* outl, float* outr, int freqhi, float freqlo); int Compute_Cubic (float* outl, float* outr, int freqhi, float freqlo); struct PADnoteGlobal { //**************************** // FREQUENCY GLOBAL PARAMETERS //**************************** float detune; // in cents unique_ptr freqEnvelope; unique_ptr freqLFO; //**************************** // AMPLITUDE GLOBAL PARAMETERS //**************************** float volume; // [ 0 .. 1 ] float panning; // [ 0 .. 1 ] float fadeinAdjustment; unique_ptr ampEnvelope; unique_ptr ampLFO; struct Punch { bool enabled; float initialvalue; float dt; float t; } punch; //************************* // FILTER GLOBAL PARAMETERS //************************* unique_ptr filterL; unique_ptr filterR; unique_ptr filterEnvelope; unique_ptr filterLFO; }; PADnoteGlobal noteGlobal; float globaloldamplitude; float globalnewamplitude; float randpanL; float randpanR; // Legato vars float legatoFade; float legatoFadeStep; }; #endif /*PADnote.h*/ yoshimi-2.3.5.1/src/Synth/Resonance.cpp000066400000000000000000000250041506652756400176770ustar00rootroot00000000000000/* Resonance.cpp - Resonance Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2018-2023 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original */ #include #include #include #include "Synth/Resonance.h" #include "Misc/SynthEngine.h" #include "Misc/NumericFuncs.h" #include "Misc/XMLStore.h" using func::power; Resonance::Resonance(SynthEngine& _synth) : ParamBase{_synth} { defaults(); } void Resonance::defaults() { Penabled = false; PmaxdB = 20; Pcenterfreq = 64; // 1 kHz Poctavesfreq = 64; Pprotectthefundamental = 0; ctlcenter = 1.0; ctlbw = 1.0; for (int i = 0; i < MAX_RESONANCE_POINTS; ++i) Prespoints[i] = 64; } // Set a point of resonance function with a value void Resonance::setpoint(int n, uchar p) { if (n < 0 || n >= MAX_RESONANCE_POINTS) return; Prespoints[n] = p; } // Apply the resonance to FFT data void Resonance::applyres(int n, fft::Spectrum& fftdata, float freq) { if (not Penabled) return; // resonance is disabled float sum = 0.0; float l1 = logf(getfreqx(0.0) * ctlcenter); float l2 = logf(2.0f) * getoctavesfreq() * ctlbw; for (int i = 0; i < MAX_RESONANCE_POINTS; ++i) if (sum < Prespoints[i]) sum = Prespoints[i]; if (sum < 1.0) sum = 1.0; for (int i = 1; i < n; ++i) { // compute where the n-th hamonics fits to the graph float x = (logf(freq * i) - l1) / l2; if (x < 0.0) x = 0.0; x *= MAX_RESONANCE_POINTS; float dx = x - floorf(x); x = floorf(x); int kx1 = (int)x; if (kx1 >= MAX_RESONANCE_POINTS) kx1 = MAX_RESONANCE_POINTS -1; int kx2 = kx1 + 1; if (kx2 >= MAX_RESONANCE_POINTS) kx2 = MAX_RESONANCE_POINTS - 1; float y = (Prespoints[kx1] * (1.0 - dx) + Prespoints[kx2] * dx) / 127.0 - sum / 127.0; y = power<10>(y * PmaxdB / 20.0); if (Pprotectthefundamental != 0 && i == 1) y = 1.0; fftdata.c(i) *= y; fftdata.s(i) *= y; } } // Gets the response at the frequency "freq" float Resonance::getfreqresponse(float freq) { float l1 = logf(getfreqx(0.0) * ctlcenter); float l2 = logf(2.0f) * getoctavesfreq() * ctlbw, sum = 0.0; for (int i = 0; i < MAX_RESONANCE_POINTS; ++i) if (sum < Prespoints[i]) sum = Prespoints[i]; if (sum < 1.0) sum = 1.0; // compute where the n-th hamonics fits to the graph float x = (logf(freq) - l1) / l2; if (x < 0.0) x = 0.0; x *= MAX_RESONANCE_POINTS; float dx = x - floorf(x); x = floorf(x); int kx1 = (int)x; if (kx1 >= MAX_RESONANCE_POINTS) kx1 = MAX_RESONANCE_POINTS - 1; int kx2 = kx1 + 1; if (kx2 >= MAX_RESONANCE_POINTS) kx2 = MAX_RESONANCE_POINTS - 1; float result = (Prespoints[kx1] * (1.0 - dx) + Prespoints[kx2] * dx) / 127.0 - sum / 127.0; result = power<10>(result * PmaxdB / 20.0); return result; } // Smooth the resonance function void Resonance::smooth() { float old = Prespoints[0]; for (int i = 0; i < MAX_RESONANCE_POINTS; ++i) { old = old * 0.4 + Prespoints[i] * 0.6; Prespoints[i] = (int) old; } old = Prespoints[MAX_RESONANCE_POINTS - 1]; for (int i = MAX_RESONANCE_POINTS - 1; i > 0; i--) { old = old * 0.4 + Prespoints[i] * 0.6; Prespoints[i] = (int) old + 1; if (Prespoints[i] > 127) Prespoints[i] = 127; } } // Randomize the resonance function void Resonance::randomize(int type) { uint32_t r = synth.randomINT() >> 24; for (int i = 0; i < MAX_RESONANCE_POINTS; ++i) { Prespoints[i] = r; if (type == 0 && synth.numRandom() < 0.1f) // draw new random only for 10% of all slots r = synth.randomINT() >> 24; if (type == 1 && synth.numRandom() < 0.3f) // ...only for 30% of all slots r = synth.randomINT() >> 24; if (type == 2) r = synth.randomINT() >> 24; } smooth(); } // Interpolate the peaks void Resonance::interpolatepeaks(int type) { int x1 = 0, y1 = Prespoints[0]; for (int i = 1; i < MAX_RESONANCE_POINTS; ++i) { if (Prespoints[i] != 64 || (i + 1) == MAX_RESONANCE_POINTS) { int y2 = Prespoints[i]; for (int k = 0; k < i - x1; ++k) { float x = (float) k / (i - x1); if (type == 0) x = (1 - cosf(x * PI)) * 0.5; Prespoints[x1 + k] = (int)(y1 * (1.0 - x) + y2 * x); } x1 = i; y1 = y2; } } } // Get the frequency from x, where x is [0..1]; x is the x coordinate float Resonance::getfreqx(float x) { if (x > 1.0) x = 1.0; float octf = power<2>(getoctavesfreq()); return (getcenterfreq() / sqrtf(octf) * powf(octf, x)); } // Get the x coordinate from frequency (used by the UI) float Resonance::getfreqpos(float freq) { return (logf(freq) - logf(getfreqx(0.0))) / logf(2.0f) / getoctavesfreq(); } // Get the center frequency of the resonance graph float Resonance::getcenterfreq() { return 10000.0 * power<10>(-(1.0f - Pcenterfreq / 127.0f) * 2.0f); } // Get the number of octave that the resonance functions applies to float Resonance::getoctavesfreq() { return 0.25 + 10.0 * Poctavesfreq / 127.0; } void Resonance::sendcontroller(ushort ctl, float par) { if (ctl == MIDI::CC::resonanceCenter) ctlcenter = par; else ctlbw = par; } void Resonance::add2XML(XMLtree& xmlRes) { xmlRes.addPar_bool("enabled",Penabled); if (not (Penabled or synth.getRuntime().xmlmax)) return; // omit storing resonance curve when disabled xmlRes.addPar_frac("max_db" , PmaxdB); xmlRes.addPar_frac("center_freq" , Pcenterfreq); xmlRes.addPar_frac("octaves_freq", Poctavesfreq); xmlRes.addPar_bool("protect_fundamental_frequency",Pprotectthefundamental); xmlRes.addPar_int ("resonance_points", MAX_RESONANCE_POINTS); for (uint i=0; idata.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int insert = getData->data.insert; uchar type = 0; type |= TOPLEVEL::type::Integer; // resonance defaults int min = 0; int max = 1; int def = 0; uchar learnable = TOPLEVEL::type::Learnable; if (insert == TOPLEVEL::insert::resonanceGraphInsert) { min = 1; max = 127; def = 64; getData->data.type = type; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } switch (control) { case RESONANCE::control::maxDb: type |= learnable; type &= ~TOPLEVEL::type::Integer; min = 1; max = 90; def = 20; break; case RESONANCE::control::centerFrequency: type |= learnable; type &= ~TOPLEVEL::type::Integer; max = 127; def = 64; break; case RESONANCE::control::octaves: type |= learnable; type &= ~TOPLEVEL::type::Integer; max = 127; def = 64; break; case RESONANCE::control::enableResonance: type |= learnable; break; case RESONANCE::control::randomType: type |= learnable; max = 2; break; case RESONANCE::control::interpolatePeaks: break; case RESONANCE::control::protectFundamental: type |= learnable; break; case RESONANCE::control::clearGraph: max = 0; break; case RESONANCE::control::smoothGraph: max = 0; break; default: type |= TOPLEVEL::type::Error; break; } getData->data.type = type; if (type & TOPLEVEL::type::Error) return 1; switch (request) { case TOPLEVEL::type::Adjust: if (value < min) value = min; else if (value > max) value = max; break; case TOPLEVEL::type::Minimum: value = min; break; case TOPLEVEL::type::Maximum: value = max; break; case TOPLEVEL::type::Default: value = def; break; } return value; } yoshimi-2.3.5.1/src/Synth/Resonance.h000066400000000000000000000050161506652756400173450ustar00rootroot00000000000000/* Resonance.h - Resonance Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2018-2023 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original */ #ifndef RESONANCE_H #define RESONANCE_H #include "globals.h" #include "DSP/FFTwrapper.h" #include "Params/ParamCheck.h" class SynthEngine; class XMLtree; class Resonance : public ParamBase { public: Resonance(SynthEngine&); void defaults() override; void setpoint(int n, uchar p); void applyres(int n, fft::Spectrum& fftdata, float freq); void smooth(); void interpolatepeaks(int type); void randomize(int type); void add2XML(XMLtree&); void getfromXML(XMLtree&); float getfreqpos(float freq); float getfreqx(float x); float getfreqresponse(float freq); float getcenterfreq(); float getoctavesfreq(); void sendcontroller(ushort ctl, float par); // parameters bool Penabled; // if the resonance is enabled uchar Prespoints[MAX_RESONANCE_POINTS]; // how many points define the resonance function float PmaxdB; // how many dB the signal may be amplified float Pcenterfreq,Poctavesfreq; // the center frequency of the res. func., and the number of octaves uchar Pprotectthefundamental; // the fundamental (1-st harmonic) is not damped, even it resonance function is low // controllers float ctlcenter; // center frequency(relative) float ctlbw; // bandwidth(relative) }; class ResonanceLimits { public: float getLimits(CommandBlock *getData); }; #endif yoshimi-2.3.5.1/src/Synth/SUBnote.cpp000066400000000000000000000625211506652756400173060ustar00rootroot00000000000000/* SUBnote.cpp - The "subtractive" synthesizer Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2019, Will Godfrey & others Copyright 2020 Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code */ #include #include #include "Params/SUBnoteParameters.h" #include "Params/Controller.h" #include "Synth/SUBnote.h" #include "Synth/Envelope.h" #include "Synth/LFO.h" #include "DSP/Filter.h" #include "Misc/SynthEngine.h" #include "Misc/SynthHelper.h" #include "Misc/NumericFuncs.h" using func::power; using func::powFrac; using func::decibel; using synth::velF; using synth::getDetune; using synth::interpolateAmplitude; using synth::aboveAmplitudeThreshold; using func::setRandomPan; SUBnote::SUBnote(SUBnoteParameters& parameters, Controller& ctl_, Note note_, bool portamento_) : synth{parameters.getSynthEngine()} , pars{parameters} , subNoteChange{parameters} , ctl{ctl_} , note{note_} , stereo{pars.Pstereo} , realfreq{computeRealFreq()} , portamento{portamento_} , numstages{pars.Pnumstages} , numharmonics{0} , start{pars.Pstart} , pos{0} , bendAdjust{0} , offsetHz{0} , ampEnvelope{} , freqEnvelope{} , bandWidthEnvelope{} , globalFilterEnvelope{} , globalFilterL{} , globalFilterR{} , noteStatus{NOTE_ENABLED} , firsttick{1} , lfilter{} , rfilter{} , tmpsmp{synth.getRuntime().genTmp1} , tmprnd{synth.getRuntime().genTmp2} , oldpitchwheel{0} , oldbandwidth{64} , legatoFade{1.0f} // Full volume , legatoFadeStep{0.0f} // Legato disabled , filterStep(0) { // Initialise some legato-specific vars setRandomPan(synth.numRandom(), randpanL, randpanR, synth.getRuntime().panLaw, pars.PPanning, pars.PWidth); if (pars.Pfixedfreq == 0) initparameters(realfreq); else initparameters(realfreq / 440.0f * note.freq); computeNoteParameters(); computecurrentparameters(); oldamplitude = newamplitude; } // Copy constructor, used only used for legato (as of 4/2022) SUBnote::SUBnote(SUBnote const& orig) : synth{orig.synth} , pars{orig.pars} , subNoteChange{pars} , ctl{orig.ctl} , note{orig.note} , stereo{orig.stereo} , realfreq{orig.realfreq} , portamento{orig.portamento} , numstages{orig.numstages} , numharmonics{orig.numharmonics} , start{orig.start} // pos , bendAdjust{orig.bendAdjust} , offsetHz{orig.offsetHz} , randpanL{orig.randpanL} , randpanR{orig.randpanR} , ampEnvelope{} , freqEnvelope{} , bandWidthEnvelope{} , globalFilterEnvelope{} , globalFilterL{} , globalFilterR{} , noteStatus{orig.noteStatus} , firsttick{orig.firsttick} , volume{orig.volume} , oldamplitude{orig.oldamplitude} , newamplitude{orig.newamplitude} , lfilter{} , rfilter{} , tmpsmp{orig.synth.getRuntime().genTmp1} , tmprnd{orig.synth.getRuntime().genTmp2} , oldpitchwheel{orig.oldpitchwheel} , oldbandwidth{orig.oldbandwidth} , legatoFade{0.0f} // Silent by default , legatoFadeStep{0.0f} // Legato disabled , filterStep{orig.filterStep} { memcpy(pos, orig.pos, MAX_SUB_HARMONICS * sizeof(int)); memcpy(overtone_rolloff, orig.overtone_rolloff, numharmonics * sizeof(float)); memcpy(overtone_freq, orig.overtone_freq, numharmonics * sizeof(float)); ampEnvelope.reset(new Envelope{*orig.ampEnvelope}); ampLFO.reset(new LFO{*orig.ampLFO}); if (orig.freqEnvelope) freqEnvelope.reset(new Envelope{*orig.freqEnvelope}); if (orig.freqLFO) freqLFO.reset(new LFO{*orig.freqLFO}); if (orig.bandWidthEnvelope) bandWidthEnvelope.reset(new Envelope{*orig.bandWidthEnvelope}); if (pars.PGlobalFilterEnabled) { globalFilterL.reset(new Filter{*orig.globalFilterL}); globalFilterR.reset(new Filter{*orig.globalFilterR}); globalFilterEnvelope.reset(new Envelope{*orig.globalFilterEnvelope}); globalFilterLFO.reset(new LFO{*orig.globalFilterLFO}); } if (orig.lfilter) { lfilter.reset(new bpfilter[numstages * numharmonics]); memcpy(lfilter.get(), orig.lfilter.get(), numstages * numharmonics * sizeof(bpfilter)); } if (orig.rfilter) { rfilter.reset(new bpfilter[numstages * numharmonics]); memcpy(rfilter.get(), orig.rfilter.get(), numstages * numharmonics * sizeof(bpfilter)); } } void SUBnote::performPortamento(Note note_) { portamento = true; this->note = note_; realfreq = computeRealFreq(); // carry on all other parameters unaltered computeNoteParameters(); } void SUBnote::legatoFadeIn(Note note_) { portamento = false; // portamento-legato treated separately this->note = note_; realfreq = computeRealFreq(); computeNoteParameters(); legatoFade = 0.0f; // Start crossfade silent legatoFadeStep = synth.fadeStepShort; // Positive steps } void SUBnote::legatoFadeOut() { legatoFade = 1.0f; // crossfade down from full volume legatoFadeStep = -synth.fadeStepShort; // Negative steps // transitory state similar to a released Envelope noteStatus = NOTE_LEGATOFADEOUT; } SUBnote::~SUBnote() { killNote(); } // Kill the note void SUBnote::killNote() { if (noteStatus != NOTE_DISABLED) { lfilter.reset(); rfilter.reset(); ampEnvelope.reset(); freqEnvelope.reset(); bandWidthEnvelope.reset(); globalFilterEnvelope.reset(); noteStatus = NOTE_DISABLED; } } int SUBnote::createNewFilters() { bool alreadyEnabled[MAX_SUB_HARMONICS]; memset(alreadyEnabled, 0, sizeof(alreadyEnabled)); for (int p = 0; p < numharmonics; ++p) alreadyEnabled[pos[p]] = true; // select only harmonics that desire to compute int origNumHarmonics = numharmonics; for (int n = 0; n < MAX_SUB_HARMONICS; ++n) { if (pars.Phmag[n] == 0 || alreadyEnabled[n]) continue; if (n * realfreq > synth.halfsamplerate_f) break; // remove the freqs above the Nyquist freq pos[numharmonics++] = n; alreadyEnabled[n] = true; } if (numharmonics == origNumHarmonics) return 0; bpfilter *newFilter = new bpfilter[numstages * numharmonics]; if (lfilter) memcpy(newFilter, lfilter.get(), numstages * origNumHarmonics * sizeof(bpfilter)); lfilter.reset(newFilter); if (stereo) { newFilter = new bpfilter[numstages * numharmonics]; if (rfilter) memcpy(newFilter, rfilter.get(), numstages * origNumHarmonics * sizeof(bpfilter)); rfilter.reset(newFilter); } return numharmonics - origNumHarmonics; } float SUBnote::computeRealFreq() { float freq = note.freq; if (pars.Pfixedfreq) { freq = 440.0f; int fixedfreqET = pars.PfixedfreqET; if (fixedfreqET) {// if the frequency varies according the keyboard note float exponent = (note.midi - 69.0f) / 12.0f * power<2>((((fixedfreqET - 1) / 63.0f) - 1.0f)); freq *= (fixedfreqET <= 64)? power<2>(exponent) : power<3>(exponent); } } float detune = getDetune(pars.PDetuneType, pars.PCoarseDetune, pars.PDetune); freq *= power<2>(detune / 1200.0f); // detune return freq; } void SUBnote::computeNoteParameters() { volume = 2.0f // +6dB boost (note ADDnote and PADnote apply a +12dB boost) * decibel<-60>(1.0f - pars.PVolume / 96.0f) // -60 dB .. +19.375 dB * velF(note.vel, pars.PAmpVelocityScaleFunction); int BendAdj = pars.PBendAdjust - 64; if (BendAdj % 24 == 0) bendAdjust = BendAdj / 24; else bendAdjust = BendAdj / 24.0f; float offset_val = (pars.POffsetHz - 64)/64.0f; offsetHz = 15.0f*(offset_val * sqrtf(fabsf(offset_val))); updatefilterbank(); } // Compute the filters coefficients void SUBnote::computefiltercoefs(bpfilter &filter, float freq, float bw, float gain) { if (freq > synth.halfsamplerate_f - 200.0f) { freq = synth.halfsamplerate_f - 200.0f; } float omega = TWOPI * freq / synth.samplerate_f; float sn = sinf(omega); float cs = cosf(omega); float alpha = sn * sinhf(LOG_2 / 2.0f * bw * omega / sn); if (alpha > 1) alpha = 1; if (alpha > bw) alpha = bw; filter.b0 = alpha / (1.0f + alpha) * filter.amp * gain; filter.b2 = -alpha / (1.0f + alpha) * filter.amp * gain; filter.a1 = -2.0f * cs / (1.0f + alpha); filter.a2 = (1.0f - alpha) / (1.0f + alpha); } // Initialise the filters void SUBnote::initfilters(int startIndex) { for (int n = startIndex; n < numharmonics; ++n) { float hgain = getHgain(n); for (int nph = 0; nph < numstages; ++nph) { initfilter(lfilter[nph + n * numstages], hgain); if (stereo) initfilter(rfilter[nph + n * numstages], hgain); } } } void SUBnote::initfilter(bpfilter &filter, float mag) { filter.xn1 = 0.0f; filter.xn2 = 0.0f; if (start == 0) { filter.yn1 = 0.0f; filter.yn2 = 0.0f; } else { float a = 0.1f * mag; // empirically float p = synth.numRandom() * TWOPI; if (start == 1) a *= synth.numRandom(); filter.yn1 = a * cosf(p); filter.yn2 = a * cosf(p + filter.freq * TWOPI / synth.samplerate_f); // correct the error of computation the start amplitude // at very high frequencies if (filter.freq > synth.samplerate_f * 0.96f) { filter.yn1 = 0.0f; filter.yn2 = 0.0f; } } } // Do the filtering inline void SubFilterA(const float coeff[4], float &src, float work[4]) { work[3] = src*coeff[0]+work[1]*coeff[1]+work[2]*coeff[2]+work[3]*coeff[3]; work[1] = src; src = work[3]; } inline void SubFilterB(const float coeff[4], float &src, float work[4]) { work[2] = src*coeff[0]+work[0]*coeff[1]+work[3]*coeff[2]+work[2]*coeff[3]; work[0] = src; src = work[2]; } // ported from zynaddsubfx V 2.4.4 //This dance is designed to minimize unneeded memory operations which can result //in quite a bit of wasted time void SUBnote::filter(bpfilter &filter, float *smps) { if (synth.getRuntime().isLV2){ filterVarRun(filter, smps); return; } int remainder = synth.sent_buffersize % 8; int blocksize = synth.sent_buffersize - remainder; float coeff[4] = {filter.b0, filter.b2, -filter.a1, -filter.a2}; float work[4] = {filter.xn1, filter.xn2, filter.yn1, filter.yn2}; for (int i = 0; i < blocksize; i += 8) { SubFilterA(coeff, smps[i + 0], work); SubFilterB(coeff, smps[i + 1], work); SubFilterA(coeff, smps[i + 2], work); SubFilterB(coeff, smps[i + 3], work); SubFilterA(coeff, smps[i + 4], work); SubFilterB(coeff, smps[i + 5], work); SubFilterA(coeff, smps[i + 6], work); SubFilterB(coeff, smps[i + 7], work); } if (remainder > 0) { for (int i = blocksize; i < blocksize + remainder ; i += 2) { SubFilterA(coeff, smps[i + 0], work); SubFilterB(coeff, smps[i + 1], work); } } filter.xn1 = work[0]; filter.xn2 = work[1]; filter.yn1 = work[2]; filter.yn2 = work[3]; } //Andrew Deryabin: support for variable-length runs //currently only for lv2 plugin void SUBnote::filterVarRun(SUBnote::bpfilter &filter, float *smps) { float tmpout; int runLength = synth.sent_buffersize; int i = 0; if (runLength >= 8){ float coeff[4] = {filter.b0, filter.b2, -filter.a1, -filter.a2}; float work[4] = {filter.xn1, filter.xn2, filter.yn1, filter.yn2}; while (runLength >= 8){ SubFilterA(coeff, smps[i + 0], work); SubFilterB(coeff, smps[i + 1], work); SubFilterA(coeff, smps[i + 2], work); SubFilterB(coeff, smps[i + 3], work); SubFilterA(coeff, smps[i + 4], work); SubFilterB(coeff, smps[i + 5], work); SubFilterA(coeff, smps[i + 6], work); SubFilterB(coeff, smps[i + 7], work); i += 8; runLength -= 8; } filter.xn1 = work[0]; filter.xn2 = work[1]; filter.yn1 = work[2]; filter.yn2 = work[3]; } for (; i < synth.sent_buffersize; ++i){ tmpout=smps[i] * filter.b0 + filter.b2 * filter.xn2 -filter.a1 * filter.yn1 - filter.a2 * filter.yn2; filter.xn2=filter.xn1; filter.xn1=smps[i]; filter.yn2=filter.yn1; filter.yn1=tmpout; smps[i]=tmpout; } } // Init Parameters void SUBnote::initparameters(float freq) { ampEnvelope.reset(new Envelope{pars.AmpEnvelope.get(), freq, &synth}); ampLFO.reset(new LFO{pars.AmpLfo.get(), freq, &synth}); if (pars.PFreqEnvelopeEnabled) freqEnvelope.reset(new Envelope{pars.FreqEnvelope.get(), freq, &synth}); if (pars.PFreqLfoEnabled) freqLFO.reset(new LFO{pars.FreqLfo.get(), freq, &synth}); if (pars.PBandWidthEnvelopeEnabled) bandWidthEnvelope.reset(new Envelope{pars.BandWidthEnvelope.get(), freq, &synth}); if (pars.PGlobalFilterEnabled) { globalFilterL.reset(new Filter{*pars.GlobalFilter.get(), synth}); /* TODO * Sort this properly it is a temporary fix to stop a segfault * with the following very specific settings: * Part Mode set to Legato * Subsynth enabled * Subsynth Filter enabled * Subsynth Stereo disabled */ //if (stereo) globalFilterR.reset(new Filter{*pars.GlobalFilter.get(), synth}); globalFilterEnvelope.reset(new Envelope{pars.GlobalFilterEnvelope.get(), freq, &synth}); globalFilterLFO.reset(new LFO{pars.GlobalFilterLfo.get(), freq, &synth}); } } // Compute how much to reduce amplitude near nyquist or subaudible frequencies. float SUBnote::computerolloff(float freq) { const float lower_limit = 10.0f; const float lower_width = 10.0f; const float upper_width = 200.0f; float upper_limit = synth.samplerate / 2.0f; if (freq > lower_limit + lower_width && freq < upper_limit - upper_width) return 1.0f; if (freq <= lower_limit || freq >= upper_limit) return 0.0f; if (freq <= lower_limit + lower_width) return (1.0f - cosf(PI * (freq - lower_limit) / lower_width)) / 2.0f; return (1.0f - cosf(PI * (freq - upper_limit) / upper_width)) / 2.0f; } void SUBnote::computeallfiltercoefs() { float envfreq = 0.0f; float envbw = 1.0f; float gain = 1.0f; if (freqEnvelope != NULL) { envfreq = freqEnvelope->envout() / 1200; } if (freqLFO != NULL) { envfreq += freqLFO->lfoout() / 1200 * ctl.modwheel.relmod; } envfreq = power<2>(envfreq); envfreq *= powf(ctl.pitchwheel.relfreq, bendAdjust); // pitch wheel if (portamento) { envfreq *= ctl.portamento.freqrap; if (ctl.portamento.used == 0) { // the portamento has finished portamento = false; // this note is no longer "portamented" } } if (bandWidthEnvelope != NULL) { envbw = bandWidthEnvelope->envout(); envbw = power<2>(envbw); } envbw *= ctl.bandwidth.relbw; // bandwidth controller float tmpgain = 1.0f / sqrtf(envbw * envfreq); for (int n = 0; n < numharmonics; ++n) { for (int nph = 0; nph < numstages; ++nph) { if (nph == 0) gain = tmpgain; else gain = 1.0f; computefiltercoefs(lfilter[nph + n * numstages], lfilter[nph + n *numstages].freq * envfreq, lfilter[nph + n * numstages].bw * envbw, gain); } } if (stereo) for (int n = 0; n < numharmonics; ++n) { for (int nph = 0; nph < numstages; ++nph) { if (nph == 0) gain = tmpgain; else gain = 1.0f; computefiltercoefs(rfilter[nph + n * numstages], rfilter[nph + n * numstages].freq * envfreq, rfilter[nph + n * numstages].bw * envbw, gain); } } oldbandwidth = ctl.bandwidth.data; oldpitchwheel = ctl.pitchwheel.data; } // Compute Parameters of SUBnote for each tick void SUBnote::computecurrentparameters() { if (freqEnvelope != NULL || freqLFO != NULL || bandWidthEnvelope != NULL || oldpitchwheel != ctl.pitchwheel.data || oldbandwidth != ctl.bandwidth.data || portamento) computeallfiltercoefs(); // Envelope newamplitude = volume * ampEnvelope->envout_dB() * ampLFO->amplfoout(); // Filter if (globalFilterL != NULL) { float filterCenterPitch = pars.GlobalFilter->getfreq() + // center freq (pars.PGlobalFilterVelocityScale / 127.0f * 6.0f) * // velocity sensing (velF(note.vel, pars.PGlobalFilterVelocityScaleFunction) - 1); float filtercenterq = pars.GlobalFilter->getq(); float filterFreqTracking = pars.GlobalFilter->getfreqtracking(note.freq); float globalfilterpitch = filterCenterPitch + globalFilterEnvelope->envout() + globalFilterLFO->lfoout(); float filterfreq = globalfilterpitch + ctl.filtercutoff.relfreq + filterFreqTracking; filterfreq = globalFilterL->getrealfreq(filterfreq); globalFilterL->setfreq_and_q(filterfreq, filtercenterq * ctl.filterq.relq); if (globalFilterR != NULL) globalFilterR->setfreq_and_q(filterfreq, filtercenterq * ctl.filterq.relq); } } // Note Output void SUBnote::noteout(float *outl, float *outr) { assert(tmpsmp.get() == synth.getRuntime().genTmp1.get()); assert(tmprnd.get() == synth.getRuntime().genTmp2.get()); memset(outl, 0, synth.sent_bufferbytes); memset(outr, 0, synth.sent_bufferbytes); if (noteStatus == NOTE_DISABLED) return; if (subNoteChange.checkUpdated()) { realfreq = computeRealFreq(); computeNoteParameters(); } // left channel for (int i = 0; i < synth.sent_buffersize; ++i) tmprnd[i] = synth.numRandom() * 2.0f - 1.0f; for (int n = 0; n < numharmonics; ++n) { float rolloff = overtone_rolloff[n]; memcpy(tmpsmp.get(), tmprnd.get(), synth.sent_bufferbytes); for (int nph = 0; nph < numstages; ++nph) filter(lfilter[nph + n * numstages], tmpsmp.get()); for (int i = 0; i < synth.sent_buffersize; ++i) outl[i] += tmpsmp[i] * rolloff; } if (globalFilterL != NULL) globalFilterL->filterout(outl); // right channel if (stereo) { for (int i = 0; i < synth.sent_buffersize; ++i) tmprnd[i] = synth.numRandom() * 2.0f - 1.0f; for (int n = 0; n < numharmonics; ++n) { float rolloff = overtone_rolloff[n]; memcpy(tmpsmp.get(), tmprnd.get(), synth.sent_bufferbytes); for (int nph = 0; nph < numstages; ++nph) filter(rfilter[nph + n * numstages], tmpsmp.get()); for (int i = 0; i < synth.sent_buffersize; ++i) outr[i] += tmpsmp[i] * rolloff; } if (globalFilterR != NULL) globalFilterR->filterout(outr); } else memcpy(outr, outl, synth.sent_bufferbytes); if (firsttick) { int n = 10; if (n > synth.sent_buffersize) n = synth.sent_buffersize; for (int i = 0; i < n; ++i) { float ampfadein = 0.5f - 0.5f * cosf((float)i / (float)n * PI); outl[i] *= ampfadein; outr[i] *= ampfadein; } firsttick = 0; } float pangainL = pars.pangainL; // assume non random pan float pangainR = pars.pangainR; if (pars.PRandom) { pangainL = randpanL; pangainR = randpanR; } if (aboveAmplitudeThreshold(oldamplitude, newamplitude)) { // Amplitude interpolation for (int i = 0; i < synth.sent_buffersize; ++i) { float tmpvol = interpolateAmplitude(oldamplitude, newamplitude, i, synth.sent_buffersize); outl[i] *= tmpvol * pangainL; outr[i] *= tmpvol * pangainR; } } else { for (int i = 0; i < synth.sent_buffersize; ++i) { outl[i] *= newamplitude * pangainL; outr[i] *= newamplitude * pangainR; } } oldamplitude = newamplitude; computecurrentparameters(); // Apply legato fading if any if (legatoFadeStep != 0.0f) { for (int i = 0; i < synth.sent_buffersize; ++i) { legatoFade += legatoFadeStep; if (legatoFade <= 0.0f) { legatoFade = 0.0f; legatoFadeStep = 0.0f; memset(outl + i, 0, (synth.sent_buffersize - i) * sizeof(float)); memset(outr + i, 0, (synth.sent_buffersize - i) * sizeof(float)); killNote(); // NOTE_DISABLED return; } else if (legatoFade >= 1.0f) { legatoFade = 1.0f; legatoFadeStep = 0.0f; break; } outl[i] *= legatoFade; outr[i] *= legatoFade; } } // Check if the note needs to be computed more if (ampEnvelope->finished() != 0) { for (int i = 0; i < synth.sent_buffersize; ++i) { // fade-out float tmp = 1.0f - (float)i / synth.sent_buffersize_f; outl[i] *= tmp; outr[i] *= tmp; } killNote(); return; } } // Release Key (Note Off) void SUBnote::releasekey() { if (noteStatus == NOTE_LEGATOFADEOUT) return; // keep envelopes in sustained state (thereby blocking NoteOff) ampEnvelope->releasekey(); if (freqEnvelope) freqEnvelope->releasekey(); if (bandWidthEnvelope) bandWidthEnvelope->releasekey(); if (globalFilterEnvelope) globalFilterEnvelope->releasekey(); } float SUBnote::getHgain(int harmonic) { if (pars.Phmag[pos[harmonic]] == 0) return 0.0f; float hmagnew = 1.0f - pars.Phmag[pos[harmonic]] / 127.0f; float hgain; switch (pars.Phmagtype) { case 1: hgain = powFrac<100>(hmagnew); break; case 2: hgain = powFrac<1000>(hmagnew); break; case 3: hgain = powFrac<10000>(hmagnew); break; case 4: hgain = powFrac<100000>(hmagnew); break; default: hgain = 1.0f - hmagnew; break; } return hgain; } void SUBnote::updatefilterbank() { int createdFilters = createNewFilters(); // moved from noteon // how much the amplitude is normalised (because the harmonics) float reduceamp = 0.0; for (int n = 0; n < numharmonics; ++n) { float freq = realfreq * pars.POvertoneFreqMult[pos[n]]; overtone_freq[n] = freq; overtone_rolloff[n] = computerolloff(freq); // the bandwidth is not absolute(Hz); it is relative to frequency float bw = power<10>((pars.Pbandwidth - 127.0f) / 127.0f * 4.0f) * numstages; // Bandwidth Scale bw *= powf(1000.0f / freq, (pars.Pbwscale - 64.0f) / 64.0f * 3.0f); // Relative BandWidth bw *= power<100>((pars.Phrelbw[pos[n]] - 64.0f) / 64.0f); if (bw > 25.0f) bw = 25.0f; // try to keep same amplitude on all freqs and bw. (empirically) float gain = sqrtf(1500.0f / (bw * freq)); float hgain = getHgain(n); gain *= hgain; reduceamp += hgain; for (int nph = 0; nph < numstages; ++nph) { float amp = 1.0f; if (nph == 0) amp = gain; bpfilter *filter = &lfilter[nph + n * numstages]; filter->amp = amp; filter->freq = freq + offsetHz; filter->bw = bw; if (stereo) { filter = &rfilter[nph + n * numstages]; filter->amp = amp; filter->freq = freq + offsetHz; filter->bw = bw; } } } initfilters(numharmonics - createdFilters); computeallfiltercoefs(); if (reduceamp < 0.001f) reduceamp = 1.0f; volume /= reduceamp; } yoshimi-2.3.5.1/src/Synth/SUBnote.h000066400000000000000000000113101506652756400167410ustar00rootroot00000000000000/* SUBnote.h - The subtractive synthesizer Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010 Alan Calvert Copyright 2014-2017 Will Godfrey & others Copyright 2020 Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original */ #ifndef SUB_NOTE_H #define SUB_NOTE_H #include "globals.h" #include "Misc/Alloc.h" #include "Params/ParamCheck.h" #include using std::unique_ptr; class SUBnoteParameters; class Controller; class Envelope; class LFO; class Filter; class SynthEngine; class SUBnote { public: SUBnote(SUBnoteParameters& parameters, Controller& ctl_, Note, bool portamento_); SUBnote(SUBnote const&); ~SUBnote(); // shall not be moved or assigned SUBnote(SUBnote&&) = delete; SUBnote& operator=(SUBnote&&) = delete; SUBnote& operator=(SUBnote const&) = delete; void performPortamento(Note); void legatoFadeIn(Note); void legatoFadeOut(); void noteout(float* outl, float* outr); void releasekey(); bool finished() const { return noteStatus == NOTE_DISABLED; } private: void computecurrentparameters(); void initparameters(float freq); void killNote(); void updatefilterbank(); SynthEngine& synth; SUBnoteParameters& pars; ParamBase::ParamsUpdate subNoteChange; Controller& ctl; Note note; bool stereo; float realfreq; bool portamento; int numstages; // number of stages of filters int numharmonics; // number of harmonics (after the too higher harmonics are removed) int start; // how the harmonics start int pos[MAX_SUB_HARMONICS]; // chart of non-zero harmonic locations float bendAdjust; float offsetHz; float randpanL; float randpanR; unique_ptr ampEnvelope; unique_ptr ampLFO; unique_ptr freqEnvelope; unique_ptr freqLFO; unique_ptr bandWidthEnvelope; unique_ptr globalFilterEnvelope; unique_ptr globalFilterLFO; unique_ptr globalFilterL; unique_ptr globalFilterR; // internal values enum NoteStatus { NOTE_DISABLED, NOTE_ENABLED, NOTE_LEGATOFADEOUT } noteStatus; int firsttick; float volume; float oldamplitude; float newamplitude; struct bpfilter { float freq; float bw; float amp; // filter parameters float a1; float a2; float b0; float b2; // filter coefs. b1=0 float xn1; float xn2; float yn1; float yn2; // filter internal values }; // Returns the number of new filters created int createNewFilters(); void initfilters(int startIndex); void initfilter(bpfilter &filter, float mag); float computerolloff(float freq); void computeallfiltercoefs(); void computefiltercoefs(bpfilter &filter, float freq, float bw, float gain); void computeNoteParameters(); float computeRealFreq(); void filter(bpfilter &filter, float *smps); void filterVarRun(bpfilter &filter, float *smps); float getHgain(int harmonic); unique_ptr lfilter; unique_ptr rfilter; float overtone_rolloff[MAX_SUB_HARMONICS]; float overtone_freq[MAX_SUB_HARMONICS]; Samples& tmpsmp; Samples& tmprnd; // this is filled with random numbers int oldpitchwheel; int oldbandwidth; // Legato vars float legatoFade; float legatoFadeStep; int filterStep; }; #endif /*SUB_NOTE_H*/ yoshimi-2.3.5.1/src/Synth/WaveInterpolator.h000066400000000000000000000347521506652756400207460ustar00rootroot00000000000000/* WaveInterpolator.h - component for wavetable interpolation Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2022, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of a ZynAddSubFX original. */ #ifndef WAVE_INTERPOLATOR_H #define WAVE_INTERPOLATOR_H #include "DSP/FFTwrapper.h" #include "Misc/Alloc.h" #include "Misc/SynthHelper.h" #include #include using std::unique_ptr; using std::function; using synth::interpolateAmplitude; /** Interface for wavetable interpolation */ class WaveInterpolator { protected: WaveInterpolator() = default; // "virtual copy" pattern virtual WaveInterpolator* buildClone() const =0; public: // can be copy/move constructed, but not assigned... WaveInterpolator(WaveInterpolator&&) = default; WaveInterpolator(WaveInterpolator const&) = default; WaveInterpolator& operator=(WaveInterpolator&&) = delete; WaveInterpolator& operator=(WaveInterpolator const&) = delete; virtual ~WaveInterpolator() = default; // this is an interface virtual bool matches(fft::Waveform const&) const =0; virtual float getCurrentPhase() const =0; virtual void caculateSamples(float*,float*, float freq,size_t cnt) =0; /* build a concrete interpolator instance for stereo interpolation either cubic or linear */ static WaveInterpolator* create(bool cubic, float phase, bool stereo, fft::Waveform const& wave, float tableFreq); static WaveInterpolator* clone(unique_ptr const&); static WaveInterpolator* clone(WaveInterpolator const& orig); /* create a delegate for Cross-Fadeing WaveInterpolator */ static WaveInterpolator* createXFader(function attachXFader ,function detachXFader ,function switchInterpolator ,unique_ptr oldInterpolator ,unique_ptr newInterpolator ,size_t crossFadeLengthSmps ,size_t bufferSize); }; /** * Abstract Base Class : two channel interpolation * with common phase and fixed 180° channel offset */ class StereoInterpolatorBase : public WaveInterpolator { protected: fft::Waveform const& table; const float baseFreq; const size_t size; size_t posHiL; size_t posHiR; float posLo; public: using WaveInterpolator::WaveInterpolator; StereoInterpolatorBase(fft::Waveform const& wave, float freq) : table{wave} , baseFreq{freq} , size{wave.size()} , posHiL{0} , posHiR{0} , posLo{0} { } bool matches(fft::Waveform const& otherTable) const override { return &table == &otherTable; } float getCurrentPhase() const override { return (posHiL + posLo) / float(size); } WaveInterpolator* setStartPos(float phase, bool stereo) { phase = fmodf(phase, 1.0f); float offset = phase * size; posHiL = size_t(offset); posHiR = stereo? (posHiL + size/2) % size : posHiL; posLo = offset - posHiL; assert (posHiL < size); assert (posHiR < size); assert (posLo < 1.0); return this; } }; class LinearInterpolator : public StereoInterpolatorBase { void caculateSamples(float *smpL, float *smpR, float freq, size_t cntSmp) override { float speedFactor = freq / baseFreq; size_t incHi = size_t(floorf(speedFactor)); float incLo = speedFactor - incHi; for (size_t i = 0; i < cntSmp; ++i) { posHiL += incHi; posHiR += incHi; posLo += incLo; if (posLo >= 1.0) { posHiL += 1; posHiR += 1; posLo -= 1.0; } if (posHiL >= size) posHiL %= size; if (posHiR >= size) posHiR %= size; smpL[i] = table[posHiL] * (1.0 - posLo) + table[posHiL + 1] * posLo; smpR[i] = table[posHiR] * (1.0 - posLo) + table[posHiR + 1] * posLo; } } WaveInterpolator* buildClone() const override { return new LinearInterpolator(*this); } public: using StereoInterpolatorBase::StereoInterpolatorBase; }; class CubicInterpolator : public StereoInterpolatorBase { void caculateSamples(float *smpL, float *smpR, float freq, size_t cntSmp) override { float speedFactor = freq / baseFreq; size_t incHi = size_t(floorf(speedFactor)); float incLo = speedFactor - incHi; float xm1, x0, x1, x2, a, b, c; for (size_t i = 0; i < cntSmp; ++i) { posHiL += incHi; posHiR += incHi; posLo += incLo; if (posLo >= 1.0) { posHiL += 1; posHiR += 1; posLo -= 1.0; } if (posHiL >= size) posHiL %= size; if (posHiR >= size) posHiR %= size; // left xm1 = table[posHiL]; x0 = table[posHiL + 1]; x1 = table[posHiL + 2]; x2 = table[posHiL + 3]; a = (3.0 * (x0 - x1) - xm1 + x2) * 0.5; b = 2.0 * x1 + xm1 - (5.0 * x0 + x2) * 0.5; c = (x1 - xm1) * 0.5; smpL[i] = (((a * posLo) + b) * posLo + c) * posLo + x0; // right xm1 = table[posHiR]; x0 = table[posHiR + 1]; x1 = table[posHiR + 2]; x2 = table[posHiR + 3]; a = (3.0 * (x0 - x1) - xm1 + x2) * 0.5; b = 2.0 * x1 + xm1 - (5.0 * x0 + x2) * 0.5; c = (x1 - xm1) * 0.5; smpR[i] = (((a * posLo) + b) * posLo + c) * posLo + x0; } } WaveInterpolator* buildClone() const override { return new CubicInterpolator(*this); } public: using StereoInterpolatorBase::StereoInterpolatorBase; }; /** * Specially rigged wavetable interpolator which actually calculates two * delegate interpolators and then cross-fades the generated samples. * When the cross-fade is complete, a given clean-up-Functor is invoked, * which typically discards this delegate and installs the the target * interpolator instead for ongoing regular operation. * @note since the interpolator base implementation just assigns new samples into the * given buffer (which is good for performance reasons in the standard case), * unfortunately we need to allocate a secondary working buffer */ class XFadeDelegate : public WaveInterpolator { unique_ptr oldInterpolator; unique_ptr newInterpolator; function attach_instance; function detach_instance; function install_followup; const size_t fadeLengthSmps; const size_t bufferSize; synth::SFadeCurve mixCurve; Samples tmpL,tmpR; size_t progress, mixStep; float mixIn,mixOut, mixInPrev,mixOutPrev; private: bool matches(fft::Waveform const& otherTable) const override { return newInterpolator->matches(otherTable); } float getCurrentPhase() const override { return newInterpolator->getCurrentPhase(); } /** Delegate to both attached interpolators and then calculate cross-faded samples. */ void caculateSamples(float *smpL, float *smpR, float noteFreq, size_t cntSmp) override { oldInterpolator->caculateSamples(tmpL.get(),tmpR.get(), noteFreq, cntSmp); newInterpolator->caculateSamples(smpL,smpR, noteFreq, cntSmp); static_assert(1.0 / (PADnoteParameters::XFADE_UPDATE_MAX/1000 * 96000) > std::numeric_limits::epsilon(), "mixing step resolution represented as float"); // step = 20000ms/1000ms/s * 96kHz ≈ 1.92e6 < 2^-23 ==> 1-1/step can be represented as float for (size_t i = 0; i < cntSmp and progress < fadeLengthSmps; ++i, ++progress) { if (progress % bufferSize == 0) {// k-Step : start linear fade sub-segment mixInPrev = mixIn; mixOutPrev = mixOut; mixIn = mixCurve.nextStep(); // S-shaped exponential mix curve mixOut = sqrtf(1 - mixIn*mixIn); // Equal-Power mix, since waveform typically not correlated mixStep = progress; // recall progress value at start of (linear) interpolation segment } size_t offset = progress - mixStep; float volOut = interpolateAmplitude(mixOutPrev,mixOut, offset, bufferSize); float volIn = interpolateAmplitude(mixInPrev, mixIn, offset, bufferSize); smpL[i] = tmpL[i] * volOut + smpL[i] * volIn; smpR[i] = tmpR[i] * volOut + smpR[i] * volIn; } // When fadeLengthSmps is reached in the middle of a buffer, remainder was filled from otherInterpolator. // Use given clean-up functor to detach and discard this instance and install otherInterpolator instead. if (progress >= fadeLengthSmps) install_followup( newInterpolator.release()); } // Note: since cloning is only used for Legato notes (as of 3/2022), which are then cross-faded // it is pointless to clone an ongoing wavetable crossfade, and moreover this could lead to // whole tree of crossfade delegates, when playing several Legato notes during an extended // x-fade. Thus "cloning" only the new target wavetable interpolator, to preserve phase info. WaveInterpolator* buildClone() const override { return WaveInterpolator::clone(newInterpolator); } public: XFadeDelegate(function attachXFader ,function detachXFader ,function switchInterpolator ,unique_ptr oldInterpolator ,unique_ptr newInterpolator ,size_t fadeLen, size_t buffSiz) : oldInterpolator{move(oldInterpolator)} , newInterpolator{move(newInterpolator)} , attach_instance{attachXFader} , detach_instance{detachXFader} , install_followup{switchInterpolator} , fadeLengthSmps{fadeLen} , bufferSize{buffSiz} , mixCurve{fadeLen/buffSiz} , tmpL{bufferSize} , tmpR{bufferSize} , progress{0} , mixStep{0} , mixIn{0} , mixOut{1} , mixInPrev{0} , mixOutPrev{0} { attach_instance(); // ensure old wavetable stays alive } ~XFadeDelegate() { detach_instance(); // one user less } }; /* === Factory functions === */ inline WaveInterpolator* WaveInterpolator::create(bool cubic ,float phase ,bool stereo ,fft::Waveform const& wave ,float tableFreq) { StereoInterpolatorBase* ipo; if (cubic) ipo = new CubicInterpolator(wave,tableFreq); else ipo = new LinearInterpolator(wave,tableFreq); return ipo->setStartPos(phase,stereo); } inline WaveInterpolator* WaveInterpolator::createXFader(function attachXFader ,function detachXFader ,function switchInterpolator ,unique_ptr oldInterpolator ,unique_ptr newInterpolator ,size_t fadeLen, size_t buffSiz) // Note: wrapped into unique_ptr to prevent memory leaks on error { if (oldInterpolator and newInterpolator and fadeLen > 0) return new XFadeDelegate(attachXFader ,detachXFader ,switchInterpolator ,move(oldInterpolator) ,move(newInterpolator) ,fadeLen ,buffSiz); else return newInterpolator.release(); } inline WaveInterpolator* WaveInterpolator::clone(WaveInterpolator const& orig) { return orig.buildClone(); } inline WaveInterpolator* WaveInterpolator::clone(unique_ptr const& orig) { return orig? clone(*orig) : nullptr; } #endif /*WAVE_INTERPOLATOR_H*/ yoshimi-2.3.5.1/src/Synth/XFadeManager.h000066400000000000000000000064261506652756400177200ustar00rootroot00000000000000/* XFadeManager.h - support for cross-fading wavetables Copyright 2022, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef X_FADE_MANAGER_H #define X_FADE_MANAGER_H #include #include #include /** * Manage an ongoing crossfade. * During XFade, the WaveInterpolators within each active PADnote will be * replaced by a cross-fading variant, which also refers to the previously existing * wavetable(s) -- so this component serves to... * - indicate that there is an ongoing XFade * - prevent/delay the next XFade until the current is done * - manage the storage of the old wavetable during XFade * @note for this to work, actual cross-fading calculations must detect the fact of * an ongoing crossfade and then #attachFader() and #detachFader() when done. * @warning the ref-count in this class is deliberately *not thread-safe* (to avoid * thread synchronisation overhead). If we ever start processing the SynthEngine * concurrently, this whole logic will break and needs to be revised! * @tparam WAV actual data type of the wavetable to be managed * @see PADnote::computeNoteParameters() */ template class XFadeManager { std::unique_ptr oldTable{}; int useCnt{0}; public: XFadeManager() = default; ~XFadeManager() = default; // shall not be copied or moved or assigned XFadeManager(XFadeManager&&) = delete; XFadeManager(XFadeManager const&) = delete; XFadeManager& operator=(XFadeManager&&) = delete; XFadeManager& operator=(XFadeManager const&) = delete; /** is there an active ongoing crossfade? */ explicit operator bool() const { return bool(oldTable); } /** Take ownership of the old Wavetable, * unless there is already an ongoing crossfade. * @return `true` if given wavetable was moved and a crossfade shall start */ bool startXFade(WAV& existingOldTable) { if (oldTable and useCnt > 0) return false; oldTable.reset(new WAV{std::move(existingOldTable)}); useCnt = 0; return true; } void attachFader() { ++useCnt; } void detachFader() { --useCnt; checkUsage(); } void checkUsage() { if (oldTable and useCnt <= 0) { oldTable.reset(); useCnt = 0; } } }; #endif /*X_FADE_MANAGER_H*/ yoshimi-2.3.5.1/src/UI/000077500000000000000000000000001506652756400144655ustar00rootroot00000000000000yoshimi-2.3.5.1/src/UI/ADnoteUI.fl000066400000000000000000004250241506652756400164270ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {ADNoteUI.h} {not_in_source in_header } comment {ADNoteUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2024, Will Godfrey, Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. } {selected in_source in_header } decl {\#include \#include \#include "Params/ADnoteParameters.h" \#include "Misc/SynthEngine.h" \#include "DSP/FFTwrapper.h" \#include "UI/MiscGui.h" \#include "UI/WidgetPDial.h" \#include "UI/WidgetMWSlider.h" \#include "UI/WidgetCheckButton.h" \#include "UI/WidgetSpinner.h" \#include "UI/ScaleTrackedWindow.h" \#include "FilterUI.h" \#include "PresetsUI.h"} {public global } decl {\#include \#include "ResonanceUI.h" \#include "EnvelopeUI.h" \#include "LFOUI.h" \#include "OscilGenUI.h"} {public global } decl {\#include "MasterUI.h"} {private global } decl {\#include "Misc/SynthHelper.h" using synth::getDetune;} {private local } decl {\#include "Misc/FormatFuncs.h" using func::asString;} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } class ADvoiceUI {: {public Fl_Group} } { Function {make_window()} {} { Fl_Window ADnoteVoiceParameters { label Voice xywh {486 185 805 615} type Double box NO_BOX hide resizable class Fl_Group } { Fl_Box {} { xywh {10 69 275 66} box PLASTIC_UP_BOX color 223 labelcolor 64 } Fl_Check_Button voiceonbutton { label On callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::enableVoice, o->value(), TOPLEVEL::type::Integer); ;} xywh {12 41 50 20} down_box DOWN_BOX color 7 selection_color 64 labelfont 3 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableVoice, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Group voiceparametersgroup { xywh {0 0 805 615} box THIN_UP_FRAME color 48 code0 {if (voiceonbutton->value() == 0) o->deactivate();} } { Fl_Group voicemodegroup { xywh {0 0 805 615} } { Fl_Group voiceFMparametersgroup { label MODULATOR xywh {575 5 230 565} box THIN_UP_FRAME color 48 labelfont 1 labelsize 12 labelcolor 64 align 17 } { Fl_Group modfrequency { label {Mod FREQUENCY} xywh {580 204 220 161} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Group voiceFMfreqenvgroup { label {Yoshimi : AddSynth Modulator - Frequency Envelope} xywh {585 290 210 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->VoicePar[nvoice].FMFreqEnvelope, npart, kititem, nvoice + PART::engine::addMod1, 1);} code1 {if(collect_readData(synth,0,ADDVOICE::control::enableModulatorFrequencyEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice) == 0) o->deactivate();} class EnvelopeUI } {} Fl_Check_Button ModFreqEn { label On callback {// if (o->value() == 0) voiceFMfreqenvgroup->deactivate(); else voiceFMfreqenvgroup->activate(); o->redraw(); send_data(0, ADDVOICE::control::enableModulatorFrequencyEnvelope, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Frequency Envelope} xywh {590 295 38 14} down_box DOWN_BOX color 7 selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableModulatorFrequencyEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Counter ModCoarseDetune { label {Coarse Det.} callback {// send_data(0, ADDVOICE::control::modulatorCoarseDetune, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Coarse Detune} xywh {723 270 73 13} selection_color 64 labelsize 10 labelcolor 64 align 1 minimum -64 maximum 63 step 1 textfont 1 textsize 11 textcolor 64 code0 {int k = int(collect_readData(synth,0,ADDVOICE::control::modulatorCoarseDetune, npart, kititem, PART::engine::addVoice1 + nvoice)) % 1024;} code1 {if (k >= 512) k-= 1024;} code2 {o->value(k);} code3 {o->lstep(10);} } Fl_Text_Display modoctavetext { label Octave xywh {669 270 50 11} box NO_BOX labelfont 3 labelsize 10 labelcolor 226 } Fl_Counter ModOctave { callback {// send_data(0, ADDVOICE::control::modulatorOctave, o->value(), TOPLEVEL::type::Integer); ;} tooltip Octave xywh {665 270 54 13} type Simple selection_color 49 labelfont 3 labelsize 10 align 1 minimum -8 maximum 7 step 1 textfont 1 textsize 11 textcolor 64 code0 {int k = int(collect_readData(synth,0,ADDVOICE::control::modulatorOctave, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {if (k >= 8) k -= 16;} code2 {o->value(k);} } Fl_Slider ModDetune { callback {// o->selection_color(setSlider(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::modulatorDetuneFrequency, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Fine Detune (cents)} xywh {623 239 168 13} type {Horz Knob} box THIN_DOWN_BOX labelcolor 64 minimum -8192 maximum 8191 step 1 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorDetuneFrequency, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Choice ModDetuneType { label {Detune Type} callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::modulatorDetuneType, o->value(), TOPLEVEL::type::Integer); ;} xywh {585 270 75 13} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 10 textcolor 64 code0 {o->add("Default");o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} code1 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorDetuneType, npart, kititem, PART::engine::addVoice1 + nvoice));} } {} Fl_Value_Output fmdetunevalueoutput { label Detune callback {// o->value(getDetune((ModDetuneType->value() < 1) ? (collect_readData(synth, 0, ADDSYNTH::detuneType, npart, kititem, PART::engine::addSynth)) : (ModDetuneType->value()), 0, ModDetune->value()+8192)); ;} xywh {587 239 36 13} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 5 minimum -5000 maximum 5000 textfont 1 textsize 10 textcolor 64 code0 {o->step(0.01, 1);} code1 {o->value(getDetune((ModDetuneType->value() < 1) ? (collect_readData(synth, 0, ADDSYNTH::detuneType, npart, kititem, PART::engine::addSynth)) : (ModDetuneType->value()), 0, ModDetune->value()+8192));} } Fl_Check_Button Mod440 { label 440Hz callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::modulatorFrequencyAs440Hz, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Set the modulator base frequency to 440Hz} xywh {726 220 55 15} down_box DOWN_BOX selection_color 64 labelfont 1 labelsize 11 labelcolor 64 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorFrequencyAs440Hz, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Check_Button detuneFromBaseOsc { label {Follow voice} callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::modulatorDetuneFromBaseOsc, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Apply all detuning in the voice oscillator to the modulator as well.} xywh {630 220 95 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorDetuneFromBaseOsc, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {if (Mod440->value() != 0) o->deactivate();} class Fl_Check_Button2 } } Fl_Group Modampgrp { label {Mod AMPLITUDE} xywh {580 55 220 149} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Value_Slider ModVolume { label Vol callback {// o->selection_color(setSlider(o->value(),90)); send_data(0, ADDVOICE::control::modulatorAmplitude, o->value(), TOPLEVEL::type::Integer); ;} tooltip Volume xywh {585 70 160 15} type {Horz Knob} box THIN_DOWN_BOX labelsize 11 align 8 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorAmplitude, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setSlider(o->value(),90));} class mwheel_val_slider_rev } Fl_Value_Slider ModVsense { label {V.Sns} callback {// o->selection_color(setSlider(o->value(),64)); send_data(0, ADDVOICE::control::modulatorVelocitySense, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Velocity Sensing Function - rightmost/max to disable)} xywh {585 90 160 15} type {Horz Knob} box THIN_DOWN_BOX labelsize 11 align 8 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorVelocitySense, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setSlider(o->value(),64));} class mwheel_val_slider_rev } Fl_Group voiceFMampenvgroup { label {Yoshimi : AddSynth Modulator - Amplitude Envelope} xywh {585 129 210 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->VoicePar[nvoice].FMAmpEnvelope, npart, kititem, nvoice + PART::engine::addMod1, 0);} code1 {if (collect_readData(synth,0,ADDVOICE::control::enableModulatorAmplitudeEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice) == 0) o->deactivate();} class EnvelopeUI } {} Fl_Check_Button ModAmpEn { label On callback {// if (o->value() == 0) voiceFMampenvgroup->deactivate(); else voiceFMampenvgroup->activate(); o->redraw(); send_data(0, ADDVOICE::control::enableModulatorAmplitudeEnvelope, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Amplitude Envelope} xywh {590 134 38 14} down_box DOWN_BOX color 7 selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableModulatorAmplitudeEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Value_Slider ModFdamp { label {F.Damp} callback {// o->selection_color(setSlider(o->value(),0)); send_data(0, ADDVOICE::control::modulatorHFdamping, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Modulator Damp at Higher frequency} xywh {585 110 160 15} type {Horz Knob} box THIN_DOWN_BOX labelsize 11 align 8 minimum -64 maximum 63 step 1 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorHFdamping, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setSlider(o->value(),0));} class mwheel_val_slider_rev } } Fl_Group modOscDisplay { xywh {580 365 220 200} labelcolor 64 } { Fl_Group modoscil { label { } xywh {580 365 220 200} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Text_Display ModLocalOsc { label {Local Oscillator} xywh {598 385 95 2} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 } Fl_Choice ExtModOsc { label Use callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::modulatorOscillatorSource, o->value() - 1, TOPLEVEL::type::Integer); ;} tooltip {Use an earlier oscillator for this modulator. Only the base oscillator is used, not other voice parameters.} xywh {607 402 75 14} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 1 textfont 1 textsize 10 textcolor 64 code0 {o->add("Internal");} code1 {char tmp[50]; for (int i = 0; i < nvoice; ++i) {sprintf(tmp, "Mod.%2d", i + 1); o->add(tmp);};} code3 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorOscillatorSource, npart, kititem, PART::engine::addVoice1 + nvoice) + 1);} } {} Fl_Button changeFMoscilbutton { label Waveform callback {// if (oscedit) delete oscedit; lastWaveW = 0; int nv = nvoice; int extMod = ExtModOsc->value() - 1; if (extMod >= 0) nv = extMod; oscedit = new OscilEditor(pars->VoicePar[nv].POscilFM, modOscDisplay, NULL, NULL, synth, npart, kititem, nvoice + PART::engine::addMod1); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->adnoteui->ADnoteVoice->hide(); ;} xywh {712 370 72 18} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 10 labelcolor 64 code0 {if (ExtModOsc->value() > 0) o->labelcolor(alt_warn_tex);} } Fl_Slider ModPhase { label Phase callback {// o->selection_color(setSlider(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::modulatorOscillatorPhase, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Phase offset} xywh {708 402 80 14} type {Horz Knob} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 1 minimum -64 maximum 63 step 1 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorOscillatorPhase, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->setValueType(VC_PhaseOffset); o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Group fmoscil { xywh {580 425 220 140} box THIN_DOWN_BOX color 57 labelcolor 179 code0 {oscFM = new Oscilloscope(o->x(),o->y(),o->w(),o->h(), 125,"");} code1 {update_fmoscil();} } {} } Fl_Box modvoicelabel { label Voice callback {// update_modvoicelabel(); ;} xywh {600 470 190 65} labelfont 1 labelsize 40 labelcolor 7 code0 {update_modvoicelabel();} } } Fl_Choice ExtMod { label Source callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::externalModulator, o->value() - 1, TOPLEVEL::type::Integer); ;} tooltip {Use an earlier voice as modulator. All parameters from the imported voice remain in effect, except for volume, panning, base frequency and pitch bend scaling factor. The voice is also converted to mono. Parameters in the current voice will then tweak the modulator further.} xywh {692 32 104 17} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 align 9 textfont 1 textcolor 64 code0 {o->add("Local");} code1 {char tmp[50]; for (int i = 0; i < nvoice; ++i) {sprintf(tmp, "Voice %2d", i + 1); o->add(tmp);};} code2 {o->value(collect_readData(synth,0,ADDVOICE::control::externalModulator, npart, kititem, PART::engine::addVoice1 + nvoice) + 1);} code3 {if (lrint(o->value())) {modoscil->deactivate();}} } {} } Fl_Text_Display modtypetext { label {Type:} xywh {572 32 50 8} box NO_BOX selection_color 49 labelfont 3 labelsize 11 labelcolor 226 } Fl_Choice ModType { callback {// if (o->value() == 0) voiceFMparametersgroup->deactivate(); else voiceFMparametersgroup->activate(); o->redraw(); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::modulatorType, o->value(), TOPLEVEL::type::Integer); ;} xywh {580 32 90 17} box NO_BOX down_box BORDER_BOX selection_color 49 labelfont 3 labelsize 11 align 5 textfont 1 textsize 11 textcolor 64 code0 {o->add("Off");o->add("Morph");o->add("Ring");o->add("PM");o->add("FM");o->add("PWM");} code1 {o->value(collect_readData(synth,0,ADDVOICE::control::modulatorType, npart, kititem, PART::engine::addVoice1 + nvoice));} code2 {if (o->value() == 0) voiceFMparametersgroup->deactivate();} } {} Fl_Group freqencygrp { label FREQUENCY xywh {5 280 570 120} box THIN_UP_FRAME labelfont 1 labelsize 12 labelcolor 64 align 17 } { Fl_Group voicefreqenvgroup { label {Yoshimi : AddSynth Voice - Frequency Envelope} xywh {9 325 205 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->VoicePar[nvoice].FreqEnvelope, npart, kititem, nvoice + PART::engine::addVoice1, 1);} code1 {if (collect_readData(synth,0,ADDVOICE::control::enableFrequencyEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice)==0) o->deactivate();} class EnvelopeUI } {} Fl_Check_Button FreqEn { label On callback {// if (o->value() == 0) voicefreqenvgroup->deactivate(); else voicefreqenvgroup->activate(); o->redraw(); send_data(0, ADDVOICE::control::enableFrequencyEnvelope, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Frequency Envelope} xywh {14 330 38 14} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableFrequencyEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Group voicefreqlfogroup { label {Frequency LFO } xywh {215 325 275 70} box FLAT_BOX color 47 align 144 code0 {o->init(synth, npart, kititem, PART::engine::addVoice1 + nvoice, TOPLEVEL::insertType::frequency);} code1 {if (collect_readData(synth,0,ADDVOICE::control::enableFrequencyLFO, npart, kititem, PART::engine::addVoice1 + nvoice)==0) o->deactivate();} class LFOUI } {} Fl_Check_Button FreqLfoEn { label On callback {// bool enab = _SYS_::F2B(o->value()); if (enab) { voicefreqlfogroup->activate(); synth->getGuiMaster()->partui->adnoteui->voicelistitem[nvoice]->voicelistvibratto->activate(); } else { voicefreqlfogroup->deactivate(); synth->getGuiMaster()->partui->adnoteui->voicelistitem[nvoice]->voicelistvibratto->deactivate(); } o->redraw(); send_data(0, ADDVOICE::control::enableFrequencyLFO, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Frequency LFO} xywh {220 330 38 14} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableFrequencyLFO, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Text_Display voiceoctavetext { label Octave xywh {507 306 50 11} box NO_BOX labelfont 3 labelsize 10 labelcolor 226 } Fl_Counter Octave { callback {// send_data(0, ADDVOICE::control::octave, o->value(), TOPLEVEL::type::Integer); ;} tooltip Octave xywh {504 306 58 13} type Simple selection_color 49 labelfont 3 labelsize 10 align 1 minimum -8 maximum 7 step 1 value 4 textfont 1 textsize 11 textcolor 64 code0 {int k = int(collect_readData(synth,0,ADDVOICE::control::octave, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {if (k >= 8) k -= 16;} code2 {o->value(k);} } Fl_Counter CoarseDetune { label {Coarse Det.} callback {// send_data(0, ADDVOICE::control::coarseDetune, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Coarse Detune} xywh {493 375 78 13} selection_color 64 labelsize 10 labelcolor 64 align 1 minimum -64 maximum 63 step 1 textfont 1 textsize 11 textcolor 64 code0 {int k = collect_readData(synth,0,ADDVOICE::control::coarseDetune, npart, kititem, PART::engine::addVoice1 + nvoice);} code1 {o->value(k);} code2 {o->lstep(10);} } Fl_Choice FreqDetunetype { label {Detune Type} callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::detuneType, o->value(), TOPLEVEL::type::Integer); ;} xywh {495 340 75 13} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 10 textcolor 64 code0 {o->add("Default");o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} code1 {o->value(collect_readData(synth, 0, ADDVOICE::control::detuneType, npart, kititem, PART::engine::addVoice1 + nvoice));} } {} Fl_Slider Detune { callback {// int detune = lrint(o->value()); o->selection_color(setSlider(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::detuneFrequency, detune, TOPLEVEL::type::Integer); ;} tooltip {Fine Detune (cents)} xywh {62 306 428 14} type {Horz Knob} box THIN_DOWN_BOX minimum -8192 maximum 8191 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::detuneFrequency, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Value_Output detunevalueoutput { label Detune callback {// o->value(getDetune((FreqDetunetype->value()<1)?(collect_readData(synth, 0, ADDSYNTH::detuneType, npart, kititem, PART::engine::addSynth)) : (FreqDetunetype->value()),0,Detune->value()+8192)*collect_readData(synth, 0, ADDSYNTH::control::bandwidthMultiplier, npart, kititem, PART::engine::addSynth)); ;} xywh {9 306 53 14} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 5 minimum -5000 maximum 5000 step 0.01 textfont 1 textsize 10 textcolor 64 code0 {o->step(0.01, 1);} code1 {o->value(getDetune((FreqDetunetype->value()<1)?(collect_readData(synth, 0, ADDSYNTH::detuneType, npart, kititem, PART::engine::addSynth)) : (FreqDetunetype->value()),0,Detune->value()+8192)*collect_readData(synth, 0, ADDSYNTH::control::bandwidthMultiplier, npart, kititem, PART::engine::addSynth));} } Fl_Dial bend { label Bend callback {// o->selection_color(setKnob(o->value(),88)); send_data(0, ADDVOICE::control::pitchBendAdjustment, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Pitch bend scaling for this voice} xywh {70 284 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::pitchBendAdjustment, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->setValueType(VC_PitchBend);} code2 {o->selection_color(setKnob(o->value(),88));} class WidgetPDial } Fl_Check_Button Freq440 { label 440Hz callback {// int x = lrint(o->value()); if (x == 0 && Mod440->value() == 0) fixedfreqetdial->deactivate(); else fixedfreqetdial->activate(); send_data(0, ADDVOICE::control::baseFrequencyAs440Hz, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Set the voice base frequency to 440Hz} xywh {400 286 55 15} down_box DOWN_BOX selection_color 64 labelfont 1 labelsize 11 labelcolor 64 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::baseFrequencyAs440Hz, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Dial fixedfreqetdial { label {Eq.T.} callback {// o->selection_color(setKnob(o->value(),0)); send_data(0, ADDVOICE::control::equalTemperVariation, o->value(), TOPLEVEL::type::Integer); ;} tooltip {How the frequency varies according to the keyboard (leftmost for fixed frequency)} xywh {460 284 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::equalTemperVariation, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {if (Freq440->value() ==0) o->deactivate();} code2 {o->setValueType(VC_FixedFreqET);} code3 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Dial offset { label Offset callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, ADDVOICE::control::pitchBendOffset, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Offset of the frequency in Hz.} xywh {130 284 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::pitchBendOffset, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->setValueType(VC_FreqOffsetHz);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } } Fl_Group oscDisplay { xywh {5 462 570 145} } { Fl_Group oscGroup { xywh {5 462 570 145} labelfont 1 labelsize 13 align 17 code0 {if (collect_readData(synth, 0, ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nvoice) >= 0) o->deactivate();} } { Fl_Group oscParamBox { label {Local Oscillator} xywh {5 478 80 128} box THIN_UP_FRAME labelfont 1 labelsize 12 labelcolor 64 align 17 } { Fl_Choice UseOsc { label Use callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::voiceOscillatorSource, o->value() - 1, TOPLEVEL::type::Integer); ;} tooltip {Use an earlier oscillator for this voice. Only the base oscillator is used, not other voice parameters.} xywh {9 526 72 18} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 1 textfont 1 textsize 10 textcolor 64 code0 {o->add("Internal");} code1 {char tmp[50]; for (int i = 0; i < nvoice; ++i) {sprintf(tmp, "Osc. %2d", i + 1); o->add(tmp);};} code3 {o->value(collect_readData(synth, 0, ADDVOICE::control::voiceOscillatorSource, npart, kititem, PART::engine::addVoice1 + nvoice) + 1);} } {} Fl_Button changevoiceoscilbutton { label Waveform callback {// if (oscedit) delete oscedit; lastWaveW = 0; int nv = nvoice; if (UseOsc->value() > 0) nv = UseOsc->value() - 1; oscedit = new OscilEditor(pars->VoicePar[nv].POscil, oscDisplay, NULL, NULL, synth, npart, kititem, nvoice + PART::engine::addVoice1); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->adnoteui->ADnoteVoice->hide(); ;} xywh {9 548 72 22} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 11 labelcolor 64 code0 {if (UseOsc->value() > 0) o->labelcolor(alt_warn_tex);} } Fl_Slider VoiceOscPhase { label Phase callback {// o->selection_color(setSlider(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::voiceOscillatorPhase, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Phase offset} xywh {9 586 72 16} type {Horz Knob} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 1 minimum -64 maximum 63 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::voiceOscillatorPhase, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->setValueType(VC_PhaseOffset); o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } } Fl_Group voiceoscil { xywh {88 462 485 145} box THIN_DOWN_BOX color 57 labelcolor 49 code0 {osc = new Oscilloscope(o->x(),o->y(),o->w(),o->h(), 130, "");} code1 {update_voiceoscil();} } {} } Fl_Box osclabel { label Osc callback {// update_osclabels(); ;} xywh {135 502 400 65} labelfont 1 labelsize 50 labelcolor 7 } } Fl_Box {} { xywh {205 35 85 33} box THIN_UP_FRAME } Fl_Check_Button ResonanceEn { label Resonance callback {// bool enab = _SYS_::F2B(o->value()); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::enableResonance, enab, TOPLEVEL::type::Integer); ;} tooltip {Resonance On/Off} xywh {238 49 17 19} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::enableResonance, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Group unisongroup { xywh {88 402 484 56} box PLASTIC_UP_BOX color 223 deactivate code0 {int tmp = collect_readData(synth, 0, ADDVOICE::control::unisonSize, npart, kititem, PART::engine::addVoice1 + nvoice); if (tmp > 1) o->activate();} } { Fl_Spinner unisonsize { label Size callback {// send_data(0, ADDVOICE::control::unisonSize, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Number of unison sub-voices} xywh {98 434 40 16} box THIN_UP_BOX color 29 labelsize 10 align 1 minimum 2 maximum 50 value 2 textsize 11 textcolor 64 code0 {int tmp = collect_readData(synth, 0, ADDVOICE::control::unisonSize, npart, kititem, PART::engine::addVoice1 + nvoice);} code1 {if (tmp < 2) tmp = 2;} code2 {o->value(tmp);} class WidgetSpinner } Fl_Dial UnisonStereo { label Stereo callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, ADDVOICE::control::unisonStereoSpread, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Stereo Spread} xywh {356 422 28 28} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::unisonStereoSpread, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial UnisonVib { label {Vib.} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, ADDVOICE::control::unisonVibratoDepth, o->value(), TOPLEVEL::type::Integer); ;} tooltip Vibratto xywh {396 422 28 28} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::unisonVibratoDepth, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Choice UnisonInvert { label Invert callback {// send_data(0, ADDVOICE::control::unisonPhaseInvert, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Phase Invert} xywh {484 426 78 18} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 1 textfont 1 textsize 11 textcolor 64 code0 {o->add("None");o->add("Random");o->add("50%");o->add("33%");o->add("25%");o->add("20%");} code1 {o->value(collect_readData(synth, 0, ADDVOICE::control::unisonPhaseInvert, npart, kititem, PART::engine::addVoice1 + nvoice));} } {} Fl_Slider UnisonFreqSpread { label {Frequency Spread} callback {// o->selection_color(setSlider(o->value(),60)); unisonspreadoutput->do_callback(); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::unisonFrequencySpread, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Frequency Spread of the Unison} xywh {181 434 120 16} type {Horz Knob} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 value 64 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::unisonFrequencySpread, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setSlider(o->value(),60));} class mwheel_slider_rev } Fl_Value_Output unisonspreadoutput { label {(cents)} callback {// o->value(collect_readData(synth, 0, ADDVOICE::control::unisonSpreadCents, npart, kititem, PART::engine::addVoice1 + nvoice)); ;} xywh {145 434 38 16} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 5 maximum 1000 textsize 10 textcolor 64 code0 {o->step(0.1, 1);} code1 {o->value(collect_readData(synth, 0, ADDVOICE::control::unisonSpreadCents, npart, kititem, PART::engine::addVoice1 + nvoice));} } Fl_Dial UnisonVspeed { label {V.speed} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, ADDVOICE::control::unisonVibratoSpeed, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Vibratto Average Speed} xywh {436 422 28 28} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::unisonVibratoSpeed, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial UnisonPhRnd { label {Ph.rnd} callback {// o->selection_color(setKnob(o->value(),127)); send_data(0, ADDVOICE::control::unisonPhaseRandomise, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Phase randomness} xywh {316 422 28 28} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::unisonPhaseRandomise, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setKnob(o->value(),127));} class WidgetPDial } Fl_Box unisName { label UNISON xywh {186 402 73 25} labelfont 1 labelsize 12 labelcolor 64 } } Fl_Check_Button UnisonEn { label On callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::enableUnison, o->value(), TOPLEVEL::type::Integer); ;} xywh {94 408 38 14} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::enableUnison, npart, kititem, PART::engine::addVoice1 + nvoice) > 1);} class Fl_Check_Button2 } } Fl_Group amplitudegroup { xywh {5 68 285 212} box UP_FRAME labelfont 1 labelsize 12 labelcolor 64 align 17 } { Fl_Dial voicevolume { label Volume callback {// int vol = lrint(o->value()); o->selection_color(setKnob(vol,100)); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::volume, vol, TOPLEVEL::type::Integer); ;} tooltip Volume xywh {30 86 33 33} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_ADDVoiceVolume);} code1 {o->value(collect_readData(synth,0,ADDVOICE::control::volume, npart, kititem, PART::engine::addVoice1 + nvoice));} code2 {o->selection_color(setKnob(o->value(),100));} class WidgetPDial } Fl_Dial voicevsns { label {Vel Sens} callback {// o->selection_color(setKnob(o->value(),127)); send_data(0, ADDVOICE::control::velocitySense, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Velocity Sensing Function - rightmost/max disables)} xywh {86 87 33 33} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::velocitySense, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->setValueType(VC_AmpVelocitySense);} code2 {o->selection_color(setKnob(o->value(),127));} class WidgetPDial } Fl_Dial voicepan { label Pan callback {// int pan = lrint(o->value()); o->selection_color(setKnob(pan,64)); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::panning, pan, TOPLEVEL::type::Integer); ;} tooltip {Voice panning} xywh {160 86 33 33} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 6 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} code1 {o->value(collect_readData(synth,0,ADDVOICE::control::panning, npart, kititem, PART::engine::addVoice1 + nvoice));} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial voicewidth { label Width callback {// o->selection_color(setKnob(o->value(),63)); send_data(0, ADDVOICE::control::randomWidth, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Voice random width} xywh {235 86 33 33} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 63 step 1 value 63 code0 {o->setValueType(VC_PanningRandom);} code1 {o->value(collect_readData(synth,0,ADDVOICE::control::randomWidth, npart, kititem, PART::engine::addVoice1 + nvoice));} code2 {o->selection_color(setKnob(o->value(),63));} class WidgetPDial } Fl_Check_Button voicerandompan { label Rand callback {// int tmp = o->value(); if (tmp == 0) voicewidth->deactivate(); else voicewidth->activate(); send_data(0, ADDVOICE::control::enableRandomPan, tmp, TOPLEVEL::type::Integer); ;} tooltip {Enable random panning} xywh {205 94 15 15} down_box DOWN_BOX color 48 selection_color 64 labelsize 11 labelcolor 64 align 1 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableRandomPan, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {if (o->value() == 0) voicewidth->deactivate(); else voicewidth->activate();} class Fl_Check_Button2 } Fl_Group voiceampenvgroup { label {Yoshimi : AddSynth Voice - Amplitude Envelope} xywh {10 135 275 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->VoicePar[nvoice].AmpEnvelope, npart, kititem, nvoice + PART::engine::addVoice1, 0);} code1 {if (collect_readData(synth,0,ADDVOICE::control::enableAmplitudeEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice) == 0) o->deactivate();} class EnvelopeUI } {} Fl_Check_Button AmpEnvEn { label On callback {// if (o->value() == 0) voiceampenvgroup->deactivate(); else voiceampenvgroup->activate(); o->redraw(); send_data(0, ADDVOICE::control::enableAmplitudeEnvelope, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Amplitude Envelope} xywh {14 139 38 14} down_box DOWN_BOX color 7 selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableAmplitudeEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Group voiceamplfogroup { label {Amplitude LFO } xywh {10 205 275 70} box FLAT_BOX color 47 align 144 code0 {o->init(synth, npart, kititem, PART::engine::addVoice1 + nvoice, TOPLEVEL::insertType::amplitude);} code1 {if (collect_readData(synth,0,ADDVOICE::control::enableAmplitudeLFO, npart, kititem, PART::engine::addVoice1 + nvoice) == 0) o->deactivate();} class LFOUI } {} Fl_Check_Button AmpLfoEn { label On callback {// if (o->value() == 0) voiceamplfogroup->deactivate(); else voiceamplfogroup->activate(); o->redraw(); send_data(0, ADDVOICE::control::enableAmplitudeLFO, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Amplitude LFO} xywh {14 210 38 14} down_box DOWN_BOX color 7 selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableAmplitudeLFO, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Check_Button VolumeMinus { label Minus callback {// send_data(0, ADDVOICE::control::invertPhase, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Reverse phase relative to other voices} xywh {12 75 50 10} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::invertPhase, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Box {} { xywh {140 88 4 40} box THIN_DOWN_FRAME } Fl_Box ampVoiceLabel { label AMPLITUDE xywh {128 72 35 17} labelfont 1 labelsize 10 labelcolor 64 } } Fl_Group voicefiltergroup { label {FILTER } xywh {290 35 285 245} box UP_FRAME labelfont 1 labelsize 12 labelcolor 64 align 17 code0 {if (collect_readData(synth, 0, ADDVOICE::control::enableFilter, npart, kititem, PART::engine::addVoice1 + nvoice) == 0) o->deactivate();} } { Fl_Group voicefilter { label {ADsynth Voice - Filter} xywh {295 60 275 75} box FLAT_BOX color 50 align 144 code0 {o->init(pars->VoicePar[nvoice].VoiceFilter,&pars->VoicePar[nvoice].PFilterVelocityScale, &pars->VoicePar[nvoice].PFilterVelocityScaleFunction, npart, kititem, PART::engine::addVoice1 + nvoice);} class FilterUI } {} Fl_Group voicefilterenvgroup { label {Yoshimi : AddSynth Voice - Filter Envelope} xywh {295 135 275 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->VoicePar[nvoice].FilterEnvelope, npart, kititem, nvoice + PART::engine::addVoice1, 2);} code1 {if (collect_readData(synth, 0, ADDVOICE::control::enableFilterEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice)==0) o->deactivate();} class EnvelopeUI } {} Fl_Check_Button FilterEnvEn { label On callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::enableFilterEnvelope, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Filter Envelope} xywh {300 140 38 14} down_box DOWN_BOX color 7 selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::enableFilterEnvelope, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Group voicefilterlfogroup { label {Filter LFO } xywh {295 205 275 70} box FLAT_BOX color 47 align 144 code0 {o->init(synth, npart, kititem, PART::engine::addVoice1 + nvoice, TOPLEVEL::insertType::filter);} code1 {if (collect_readData(synth, 0, ADDVOICE::control::enableFilterLFO, npart, kititem, PART::engine::addVoice1 + nvoice)==0) o->deactivate();} class LFOUI } {} Fl_Check_Button FilterLfoEn { label On callback {// send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::enableFilterLFO, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Filter LFO} xywh {300 210 38 14} down_box DOWN_BOX color 7 selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::enableFilterLFO, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } } Fl_Box {} { xywh {5 35 64 33} box THIN_UP_FRAME } Fl_Group {} { xywh {69 35 136 33} box THIN_UP_FRAME } { Fl_Value_Slider Delay { label Delay callback {// o->selection_color(setSlider(o->value(),0)); send_data(0, ADDVOICE::control::delay, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Time before the voice activates} xywh {76 50 124 12} type {Horz Knob} box THIN_DOWN_BOX labelsize 11 labelcolor 64 align 1 maximum 127 step 1 textcolor 64 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::delay, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->setValueType(VC_ADDVoiceDelay);o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } } Fl_Check_Button bypassfiltercheckbutton { label {Bypass Global} callback {// send_data(0, ADDVOICE::control::bypassGlobalFilter, o->value(), TOPLEVEL::type::Integer); ;} xywh {450 41 14 14} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 8 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::bypassGlobalFilter, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Check_Button FilterEn { label On callback {// bypassfiltercheckbutton->redraw(); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::enableFilter, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Enable Filter} xywh {294 41 38 14} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::enableFilter, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Group extvoicegroup { label Voice xywh {5 400 80 76} box THIN_UP_FRAME labelfont 1 labelsize 12 labelcolor 49 align 17 } { Fl_Choice ExtOsc { label Source callback {// if (nvoice == 0) o->deactivate(); if (o->value() != 0) { oscGroup->deactivate(); SoundType->deactivate(); } else { oscGroup->activate(); SoundType->activate(); } send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::soundType, 0, TOPLEVEL::type::Integer); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::externalOscillator, o->value() - 1, TOPLEVEL::type::Integer); ;} tooltip {Use an earlier voice as input to this voice. All parameters from the imported voice remain in effect, except for volume, panning, base frequency and pitch bend scaling factor. The voice is also converted to mono. Parameters in the current voice will then tweak the signal further.} xywh {8 430 74 18} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 10 textcolor 64 code0 {o->add("Local");} code1 {char tmp[50]; for (int i = 0; i < nvoice; ++i) {sprintf(tmp, "Voice %2d", i + 1); o->add(tmp);};} code2 {o->value(collect_readData(synth,0,ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nvoice) + 1);} code3 {if (nvoice == 0) o->deactivate();} } {} Fl_Choice SoundType { callback {// int x = int(o->value()); send_data(TOPLEVEL::action::forceUpdate, ADDVOICE::control::soundType, x, TOPLEVEL::type::Integer); ;} tooltip {Oscillator Type (sound/noise)} xywh {8 454 74 18} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 when 6 textfont 1 textsize 10 textcolor 64 code0 {o->add("Sound");o->add("Whit Ns");o->add("Pink Ns");o->add("Spot Ns");} code1 {o->value(collect_readData(synth,0,ADDVOICE::control::soundType,npart,kititem,PART::engine::addVoice1 + nvoice));} code2 {if (o->value()!=0) voicemodegroup->deactivate();} code3 {if (ExtOsc->value() > 0) o->deactivate();} } {} } Fl_Box noiselabel { label Noise callback {// update_osclabels(); ;} xywh {130 500 400 65} labelfont 1 labelsize 50 labelcolor 7 code0 {update_osclabels();} } } Fl_Group Vname { label VOICE xywh {476 10 63 16} labelfont 1 labelcolor 64 align 0 } {} } } Function {ADvoiceUI(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// nvoice = 0; pars = NULL; oscedit = NULL; lastWaveW = 0; ;} {} } Function {send_data(int action, int control, float value, int type)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, nvoice + PART::engine::addVoice1); ;} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char voice = getData->data.engine; //std::cout << "voice " << int(voice) << " nvoice " << int(nvoice) << std::endl; if (voice >= PART::engine::addMod1) voice -= PART::engine::addMod1; else if (voice >= PART::engine::addVoice1) voice -= PART::engine::addVoice1; int tmp; bool val_bool = _SYS_::F2B(value); if (control != ADDVOICE::control::enableVoice && voice != nvoice) return; switch(control) { case ADDVOICE::control::volume: voicevolume->value(value); voicevolume->selection_color(setKnob(value,100)); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voicevolume->value(value); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voicevolume->selection_color(setSlider(value,100)); break; case ADDVOICE::control::velocitySense: voicevsns->value(value); voicevsns->selection_color(setKnob(value,127)); break; case ADDVOICE::control::panning: voicepan->value(value); voicepan->selection_color(setKnob(value,64)); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voicepanning->value(value); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voicepanning->selection_color(setKnob(value,64)); break; case ADDVOICE::control::enableRandomPan: voicerandompan->value(val_bool); if (val_bool) voicewidth->activate(); else voicewidth->deactivate(); break; case ADDVOICE::control::randomWidth: voicewidth->value(value); voicewidth->selection_color(setKnob(value,63)); break; case ADDVOICE::control::invertPhase: VolumeMinus->value(val_bool); break; case ADDVOICE::control::enableAmplitudeEnvelope: AmpEnvEn->value(val_bool); if (val_bool == 0) voiceampenvgroup->deactivate(); else voiceampenvgroup->activate(); break; case ADDVOICE::control::enableAmplitudeLFO: AmpLfoEn->value(val_bool); if (val_bool == 0) voiceamplfogroup->deactivate(); else voiceamplfogroup->activate(); break; case ADDVOICE::control::modulatorType: ModType->value((int)value); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->update_modlabel(); if (value == 0) voiceFMparametersgroup->deactivate(); else voiceFMparametersgroup->activate(); break; case ADDVOICE::control::externalModulator: tmp = (int) value; ExtMod->value(tmp + 1); if (tmp >= 0) { modoscil->deactivate(); } else { modoscil->activate(); } voiceFMparametersgroup->redraw(); update_fmoscil(); oscFM->redraw(); modoscil->redraw(); modvoicelabel->do_callback(); break; case ADDVOICE::control::detuneFrequency: if (voice == nvoice) { Detune->value(value); Detune->selection_color(setSlider(value,0)); detunevalueoutput->do_callback(); } synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voicedetune->value(value); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voicedetune->selection_color(setSlider(value,0)); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->detunevalueoutput->do_callback(); break; case ADDVOICE::control::equalTemperVariation: fixedfreqetdial->value(value); fixedfreqetdial->selection_color(setKnob(value,0)); break; case ADDVOICE::control::baseFrequencyAs440Hz: Freq440->value(val_bool); if (value == 0 && Mod440->value() == 0) fixedfreqetdial->deactivate(); else fixedfreqetdial->activate(); break; case ADDVOICE::control::octave: Octave->value((int) value); break; case ADDVOICE::control::detuneType: FreqDetunetype->value((int) value); detunevalueoutput->do_callback(); break; case ADDVOICE::control::coarseDetune: CoarseDetune->value((int) value); break; case ADDVOICE::control::pitchBendAdjustment: bend->value(value); bend->selection_color(setKnob(value,88)); break; case ADDVOICE::control::pitchBendOffset: offset->value(value); offset->selection_color(setKnob(value,64)); break; case ADDVOICE::control::enableFrequencyEnvelope: FreqEn->value(val_bool); if (val_bool == 0) voicefreqenvgroup->deactivate(); else voicefreqenvgroup->activate(); break; case ADDVOICE::control::enableFrequencyLFO: FreqLfoEn->value(val_bool); if (val_bool == 0) voicefreqlfogroup->deactivate(); else voicefreqlfogroup->activate(); break; case ADDVOICE::control::unisonFrequencySpread: UnisonFreqSpread->value(value); UnisonFreqSpread->selection_color(setSlider(value,60)); unisonspreadoutput->do_callback(); break; case ADDVOICE::control::unisonPhaseRandomise: UnisonPhRnd->value(value); UnisonPhRnd->selection_color(setKnob(value,127)); break; case ADDVOICE::control::unisonStereoSpread: UnisonStereo->value(value); UnisonStereo->selection_color(setKnob(value,64)); break; case ADDVOICE::control::unisonVibratoDepth: UnisonVib->value(value); UnisonVib->selection_color(setKnob(value,64)); break; case ADDVOICE::control::unisonVibratoSpeed: UnisonVspeed->value(value); UnisonVspeed->selection_color(setKnob(value,64)); break; case ADDVOICE::control::unisonSize: { tmp = int(value); unisonsize->value(tmp); unisongroup->redraw(); UnisonEn->redraw(); } break; case ADDVOICE::control::unisonPhaseInvert: UnisonInvert->value(value); break; case ADDVOICE::control::enableUnison: UnisonEn->value(val_bool); if (val_bool == 0) { unisonsize->value(2); unisongroup->deactivate(); } else { unisongroup->activate(); unisongroup->redraw(); UnisonEn->redraw(); } break; case ADDVOICE::control::enableFilter: FilterEn->value(val_bool); if (val_bool) voicefiltergroup->activate(); else voicefiltergroup->deactivate(); bypassfiltercheckbutton->redraw(); // yes it's needed! break; case ADDVOICE::control::bypassGlobalFilter: bypassfiltercheckbutton->value(val_bool); break; case ADDVOICE::control::enableFilterEnvelope: FilterEnvEn->value(val_bool); if (val_bool) voicefilterenvgroup->activate(); else voicefilterenvgroup->deactivate(); FilterEnvEn->redraw(); // yes it's needed! break; case ADDVOICE::control::enableFilterLFO: FilterLfoEn->value(val_bool); if (val_bool) voicefilterlfogroup->activate(); else voicefilterlfogroup->deactivate(); FilterLfoEn->redraw(); // yes it's needed! break; case ADDVOICE::control::modulatorAmplitude: ModVolume->value(value); ModVolume->selection_color(setSlider(ModVolume->value(),90)); break; case ADDVOICE::control::modulatorVelocitySense: ModVsense->value(value); ModVsense->selection_color(setSlider(ModVsense->value(),64)); break; case ADDVOICE::control::modulatorHFdamping: ModFdamp->value(value); ModFdamp->selection_color(setSlider(ModFdamp->value(),0)); break; case ADDVOICE::control::enableModulatorAmplitudeEnvelope: ModAmpEn->value(val_bool); if (val_bool) voiceFMampenvgroup->activate(); else voiceFMampenvgroup->deactivate(); break; case ADDVOICE::control::modulatorDetuneFrequency: ModDetune->value(value); ModDetune->selection_color(setSlider(value,0)); fmdetunevalueoutput->do_callback(); break; case ADDVOICE::control::modulatorDetuneFromBaseOsc: detuneFromBaseOsc->value(value); break; case ADDVOICE::control::modulatorFrequencyAs440Hz: tmp = (val_bool); Mod440->value(tmp); if (tmp == 0 && lrint(Freq440->value() == 0)) fixedfreqetdial->deactivate(); else fixedfreqetdial->activate(); if (tmp != 0) detuneFromBaseOsc->deactivate(); else detuneFromBaseOsc->activate(); break; case ADDVOICE::control::modulatorOctave: ModOctave->value((int) value); break; case ADDVOICE::control::modulatorDetuneType: ModDetuneType->value((int) value); fmdetunevalueoutput->do_callback(); break; case ADDVOICE::control::modulatorCoarseDetune: ModCoarseDetune->value((int) value); break; case ADDVOICE::control::enableModulatorFrequencyEnvelope: ModFreqEn->value(val_bool); if (val_bool == 0) voiceFMfreqenvgroup->deactivate(); else voiceFMfreqenvgroup->activate(); break; case ADDVOICE::control::modulatorOscillatorPhase: ModPhase->value(value); oscFM->phase = 64 - lrint(value); ModPhase->selection_color(setSlider(ModPhase->value(),0)); update_fmoscil(); oscFM->redraw(); modoscil->redraw(); modvoicelabel->do_callback(); break; case ADDVOICE::control::modulatorOscillatorSource: tmp = int(value); ExtModOsc->value(tmp + 1); if (tmp < 0) { tmp = voice; changeFMoscilbutton->labelcolor(gen_text); } else changeFMoscilbutton->labelcolor(alt_warn_tex); update_fmoscil(); voiceFMparametersgroup->redraw(); oscFM->redraw(); modoscil->redraw(); modvoicelabel->do_callback(); break; case ADDVOICE::control::delay: Delay->value(value); Delay->selection_color(setSlider(Delay->value(),0)); break; case ADDVOICE::control::enableVoice: tmp = (val_bool); voiceonbutton->value(tmp); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voiceenabled->value(tmp); synth->getGuiMaster()->partui->adnoteui->setVoiceTabs(voice, false); synth->getGuiMaster()->partui->adnoteui->setTabColour(voice); if (tmp) { nvoice = voice; voiceparametersgroup->activate(); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voicelistitemgroup->activate(); } else { voiceparametersgroup->deactivate(); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voicelistitemgroup->deactivate(); } voiceonbutton->redraw(); synth->getGuiMaster()->partui->adnoteui->voiceTabBar->redraw(); break; case ADDVOICE::control::enableResonance: tmp = (val_bool); if (voice == nvoice) ResonanceEn->value(tmp); synth->getGuiMaster()->partui->adnoteui->voicelistitem[voice]->voiceresonanceenabled->value(tmp); break; case ADDVOICE::control::voiceOscillatorPhase: tmp = (int)value; VoiceOscPhase->value(tmp); osc->phase = 64 - tmp; VoiceOscPhase->selection_color(setSlider(VoiceOscPhase->value(),0)); update_voiceoscil(); voiceoscil->redraw(); osclabel->redraw(); break; case ADDVOICE::control::voiceOscillatorSource: tmp = int(value); UseOsc->value(tmp + 1); if (tmp < 0) { tmp = voice; changevoiceoscilbutton->labelcolor(gen_text); } else changevoiceoscilbutton->labelcolor(alt_warn_tex); changevoiceoscilbutton->redraw(); update_voiceoscil(); voiceoscil->redraw(); update_osclabels(); break; case ADDVOICE::control::soundType: tmp = lrint(value); SoundType->value(tmp); if (tmp) voicemodegroup->deactivate(); else voicemodegroup->activate(); update_voiceoscil(); update_osclabels(); synth->getGuiMaster()->partui->adnoteui->voicelistitem[nvoice]->refreshlist(nvoice); break; case ADDVOICE::control::externalOscillator: tmp = int(value); ExtOsc->value(tmp + 1); update_voiceoscil(); update_osclabels(); voiceoscil->redraw(); break; } ;} {} } Function {paste()} {} { code {// if (oscedit->osceditUI->visible()) { oscedit->refresh(); } ;} {} } Function {update_osclabels()} {} { code {// int soundType = SoundType->value(); char useOsc = UseOsc->value(); char extOsc = ExtOsc->value(); if (extOsc > 0) { char str[15]; snprintf(str, sizeof(str), "Voice %d", extOsc); osclabel->copy_label(str); osclabel->labelcolor(ext_voice); osclabel->show(); noiselabel->hide(); } else if (soundType == 0 && useOsc > 0) { char str[15]; snprintf(str, sizeof(str), "Osc. %d", useOsc); osclabel->copy_label(str); osclabel->labelcolor(ext_osc); osclabel->show(); noiselabel->hide(); } else if (soundType == 1) { noiselabel->copy_label("White Noise"); noiselabel->labelcolor(7); noiselabel->show(); osclabel->hide(); } else if (soundType == 2) { noiselabel->copy_label("Pink Noise"); noiselabel->labelcolor(5); noiselabel->show(); osclabel->hide(); } else if (soundType == 3) { noiselabel->copy_label("Spot Noise"); noiselabel->labelcolor(6); noiselabel->show(); osclabel->hide(); } else { noiselabel->hide(); osclabel->hide(); } ;} {} } Function {update_modvoicelabel()} {} { code {// int fmVoice = collect_readData(synth,0,ADDVOICE::control::externalModulator, npart, kititem, PART::engine::addVoice1 + nvoice); int fmExtOsc = collect_readData(synth,0,ADDVOICE::control::modulatorOscillatorSource, npart, kititem, PART::engine::addVoice1 + nvoice); if (fmVoice >= 0) { char str[15]; snprintf(str, sizeof(str), "Voice %d",char(fmVoice) + 1); modvoicelabel->copy_label(str); modvoicelabel->labelcolor(ext_voice); modvoicelabel->show(); } else if (fmExtOsc >= 0) { char str[15]; snprintf(str, sizeof(str), "Mod. %d", char(fmExtOsc) + 1); modvoicelabel->copy_label(str); modvoicelabel->labelcolor(ext_osc); modvoicelabel->show(); } else { modvoicelabel->hide(); } ;} {} } Function {update_voiceoscil()} {} { code {// updating int nvs = nvoice; int nvp = nvoice; voiceOscUpdate(synth, npart, kititem, nvoice, nvs, nvp); // we still need 'pars->' here :( oscil->changeParams(pars->VoicePar[nvs].POscil); osc->init(oscil,0,64-collect_readData(synth,0,ADDVOICE::control::voiceOscillatorPhase, npart, kititem, PART::engine::addVoice1 + nvoice),synth); if (collect_readData(synth,0,ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nvoice) >= 0 || collect_readData(synth,0,ADDVOICE::control::soundType, npart, kititem, PART::engine::addVoice1 + nvoice) > 0) voiceoscil->deactivate(); else voiceoscil->activate(); ;} {} } Function {update_fmoscil()} {} { code {// int nv=nvoice; int fmVoice = collect_readData(synth,0,ADDVOICE::control::externalModulator, npart, kititem, PART::engine::addVoice1 + nvoice); int fmExtOsc = collect_readData(synth,0,ADDVOICE::control::modulatorOscillatorSource, npart, kititem, PART::engine::addVoice1 + nvoice); if (fmVoice >= 0) { nv = fmVoice; while (collect_readData(synth,0,ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nv) >= 0) { nv = collect_readData(synth,0,ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nv); } oscilFM->changeParams(pars->VoicePar[nv].POscil); oscFM->init(oscilFM,0,pars->VoicePar[nv].Poscilphase, synth); } else { if (fmExtOsc >= 0) { nv = fmExtOsc; } oscilFM->changeParams(pars->VoicePar[nv].POscilFM); oscFM->init(oscilFM,0,pars->VoicePar[nvoice].PFMoscilphase, synth); } ;} {} } Function {voiceRtext(float dScale)} {} { code {// if (oscedit) { if (oscedit->osceditUI->visible() && lastWaveW != oscedit->osceditUI->w()) { lastWaveW = oscedit->osceditUI->w(); oscedit->waveRtext(); } } voiceampenvgroup->wincheck(); voicefilterenvgroup->wincheck(); voicefreqenvgroup->wincheck(); voiceFMampenvgroup->wincheck(); voiceFMfreqenvgroup->wincheck(); if (!ADnoteVoiceParameters->visible()) return; if (dScale == lastdScale) return; voiceamplfogroup->lfoRtext(dScale); voiceampenvgroup->envRtext(dScale); voicefilterlfogroup->lfoRtext(dScale); voicefilterenvgroup->envRtext(dScale); voicefreqlfogroup->lfoRtext(dScale); voicefreqenvgroup->envRtext(dScale); voicefilter->filterRtext(dScale); lastdScale = dScale; int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); int size14 = int(14 * dScale); voiceonbutton->labelsize(size14); Vname->labelsize(size14); ResonanceEn->labelsize(size11); ampVoiceLabel->labelsize(size); voicevolume->labelsize(size); voicevsns->labelsize(size); voicepan->labelsize(size); voicewidth->labelsize(size); voicerandompan->labelsize(size11); AmpEnvEn->labelsize(size); AmpLfoEn->labelsize(size); VolumeMinus->labelsize(size); voicefiltergroup->labelsize(size12); FilterEnvEn->labelsize(size); FilterLfoEn->labelsize(size); Delay->labelsize(size11); bypassfiltercheckbutton->labelsize(size12); FilterEn->labelsize(size); freqencygrp->labelsize(size12); FreqEn->labelsize(size); FreqLfoEn->labelsize(size); voiceoctavetext->labelsize(size); Octave->textsize(size11); CoarseDetune->labelsize(size); CoarseDetune->textsize(size11); detunevalueoutput->labelsize(size); detunevalueoutput->textsize(size); FreqDetunetype->labelsize(size); FreqDetunetype->textsize(size11); bend->labelsize(size); Freq440->labelsize(size11); fixedfreqetdial->labelsize(size); offset->labelsize(size); unisonsize->labelsize(size); unisonsize->textsize(size11); UnisonStereo->labelsize(size); UnisonVib->labelsize(size); UnisonFreqSpread->labelsize(size); unisonspreadoutput->labelsize(size); unisonspreadoutput->textsize(size11); UnisonVspeed->labelsize(size); UnisonPhRnd->labelsize(size); UnisonInvert->labelsize(size); UnisonInvert->textsize(size11); UnisonEn->labelsize(size); unisName->labelsize(size12); extvoicegroup->labelsize(size12); ExtOsc->labelsize(size); ExtOsc->textsize(size); SoundType->labelsize(size); SoundType->textsize(size); oscParamBox->labelsize(size12); UseOsc->labelsize(size); UseOsc->textsize(size); changevoiceoscilbutton->labelsize(size); VoiceOscPhase->labelsize(size); noiselabel->labelsize(int(50 * dScale)); osclabel->labelsize(int(50 * dScale)); voiceFMparametersgroup->labelsize(size12); voiceFMampenvgroup->envRtext(dScale); voiceFMfreqenvgroup->envRtext(dScale); ExtMod->labelsize(size11); ExtMod->textsize(size14); Modampgrp->labelsize(size11); ModVolume->labelsize(size11); ModVolume->textsize(size); ModVsense->labelsize(size11); ModVsense->textsize(size); ModFdamp->labelsize(size11); ModFdamp->textsize(size); ModAmpEn->labelsize(size); modfrequency->labelsize(size11); ModCoarseDetune->labelsize(size); ModCoarseDetune->textsize(size); modoctavetext->labelsize(size); ModOctave->textsize(size); fmdetunevalueoutput->labelsize(size); fmdetunevalueoutput->textsize(size); detuneFromBaseOsc->labelsize(size11); Mod440->labelsize(size11); ModDetuneType->labelsize(size); ModDetuneType->textsize(size11); ModFreqEn->labelsize(size); modtypetext->labelsize(size11); ModType->textsize(size14); ModLocalOsc->labelsize(size12); changeFMoscilbutton->labelsize(size); ModPhase->labelsize(size); ExtModOsc->labelsize(size); ExtModOsc->textsize(size); modvoicelabel->labelsize(int(40 * dScale)); ADnoteVoiceParameters->redraw();} {} } Function {voicetheme()} {} { code {// if (oscedit) { if (oscedit->osceditUI->visible()) { oscedit->waveRtext(); } } voiceampenvgroup->theme(); voicefreqenvgroup->theme(); voicefilterenvgroup->theme(); voicefilter->theme(); voiceFMampenvgroup->theme(); voiceFMfreqenvgroup->theme(); ;} {} } Function {init(ADnoteParameters *parameters,int npart_, int kititem_, int nvoice_)} {} { code {// synth = & parameters->getSynthEngine(); pars = parameters; npart = npart_; kititem = kititem_; nvoice = nvoice_; lastdScale = 0; fft = new fft::Calc(synth->oscilsize); oscil = new OscilGen(*fft, NULL, synth, parameters->VoicePar[nvoice].POscil); oscilFM = new OscilGen(*fft, NULL, synth, parameters->VoicePar[nvoice].POscilFM); make_window(); end(); if (nvoice == 0) { UseOsc->deactivate(); ExtMod->deactivate(); ExtModOsc->deactivate(); } ADnoteVoiceParameters->show(); ;} {} } Function {~ADvoiceUI()} {} { code {// ADnoteVoiceParameters->hide(); hide(); if (oscedit) delete oscedit; delete oscil; delete oscilFM; delete fft; ;} {} } decl {int nvoice;} {public local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {ADnoteParameters *pars;} {private local } decl {OscilEditor *oscedit;} {public local } decl {fft::Calc *fft;} {private local } decl {OscilGen *oscil;} {public local } decl {OscilGen *oscilFM;} {public local } decl {Oscilloscope *osc;} {private local } decl {Oscilloscope *oscFM;} {private local } decl {SynthEngine *synth;} {private local } decl {float lastdScale;} {private local } decl {int lastWaveW;} {private local } } class ADvoicelistitem {: {public Fl_Group} } { Function {make_window()} {} { Fl_Window ADnoteVoiceListItem { xywh {705 176 635 30} type Double box GTK_THIN_UP_BOX labelcolor 64 hide class Fl_Group } { Fl_Group enabledpatch { label 1 xywh {4 4 34 18} box UP_BOX labelfont 2 labelcolor 226 align 20 code0 {char tmp[12]; snprintf(tmp, 12, "%d", nvoice + 1); o->label(strdup(tmp));} } {} Fl_Check_Button voiceenabled { callback {// bool enab = _SYS_::F2B(o->value()); collect_writeData(synth, enab, TOPLEVEL::action::forceUpdate, (TOPLEVEL::type::Integer | TOPLEVEL::type::Write), ADDVOICE::control::enableVoice, npart, kititem, PART::engine::addVoice1 + nvoice); ;} xywh {18 7 15 15} down_box DOWN_BOX selection_color 64 labeltype EMBOSSED_LABEL labelcolor 64 code1 {o->value(collect_readData(synth,0,ADDVOICE::control::enableVoice, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Group voicelistitemgroup { xywh {38 1 593 25} box FLAT_BOX labelcolor 64 code0 {if (voiceenabled->value() == 0) o->deactivate();} } { Fl_Value_Slider voicevolume { callback {// int vol = lrint(o->value()); o->selection_color(setSlider(vol,100)); collect_writeData(synth, vol, TOPLEVEL::action::forceUpdate, (TOPLEVEL::type::Write | TOPLEVEL::type::Integer), ADDVOICE::control::volume, npart, kititem, PART::engine::addVoice1 + nvoice); ;} tooltip Volume xywh {155 4 122 20} type {Horz Knob} box THIN_DOWN_BOX labelsize 8 labelcolor 64 maximum 127 step 1 textcolor 64 code0 {o->value(collect_readData(synth,0,ADDVOICE::control::volume, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setSlider(o->value(),100));} code2 {o->setValueType(VC_ADDVoiceVolume);o->useCustomTip(true);} class mwheel_slider_rev } Fl_Check_Button voiceresonanceenabled { callback {// bool enab = _SYS_::F2B(o->value()); synth->getGuiMaster()->partui->adnoteui->advoice->ResonanceEn->value(enab); collect_writeData(synth, enab, 0, (TOPLEVEL::type::Write | TOPLEVEL::type::Integer), ADDVOICE::control::enableResonance, npart, kititem, PART::engine::addVoice1 + nvoice); ;} tooltip {Resonance On/Off} xywh {305 5 15 17} down_box DOWN_BOX selection_color 64 labeltype EMBOSSED_LABEL labelfont 1 labelsize 11 labelcolor 64 align 4 code0 {o->value(collect_readData(synth,0, ADDVOICE::control::enableResonance, npart, kititem, PART::engine::addVoice1 + nvoice));} class Fl_Check_Button2 } Fl_Value_Slider voicelistvibratto { callback {// int lfodepth = lrint(o->value()); o->selection_color(setSlider(lfodepth,40)); collect_writeData(synth, lfodepth, TOPLEVEL::action::forceUpdate, (TOPLEVEL::type::Write | TOPLEVEL::type::Integer), 1, npart, kititem, PART::engine::addVoice1 + nvoice, 0, 1); ;} tooltip {Frequency LFO amount} xywh {535 4 95 20} type {Horz Knob} box THIN_DOWN_BOX labelsize 8 labelcolor 64 align 5 maximum 127 step 1 textcolor 64 deactivate code0 {o->value(collect_readData(synth, 0, LFOINSERT::control::depth, npart, kititem, PART::engine::addVoice1 + nvoice, 0, 1));} code1 {o->setValueType(VC_LFOdepthFreq);o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),40));} class mwheel_slider_rev } Fl_Dial voicepanning { callback {// int panning = lrint(o->value()); o->selection_color(setKnob(panning,64)); collect_writeData(synth, panning, TOPLEVEL::action::forceUpdate, (TOPLEVEL::type::Write | TOPLEVEL::type::Integer), ADDVOICE::control::panning, npart, kititem, PART::engine::addVoice1 + nvoice); ;} tooltip {Voice panning} xywh {282 4 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 4 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} code1 {o->value(collect_readData(synth, 0,ADDVOICE::control::panning, npart, kititem, PART::engine::addVoice1 + nvoice));} code2 {o->selection_color(setSlider(o->value(),64));} class WidgetPDial } Fl_Group voiceoscil { callback {// update_voiceoscil(); ;} xywh {88 4 30 20} box THIN_DOWN_FRAME color 32 labelcolor 49 code0 {osc = new Oscilloscope(o->x(), o->y(), o->w(), o->h(), 20, "");} code1 {update_voiceoscil();} } {} Fl_Box noiselabel { label N callback {// int tmp = collect_readData(synth,0,ADDVOICE::control::soundType,npart,kititem,PART::engine::addVoice1 + nvoice); update_noiselabel(); if (tmp == 0) { voiceresonanceenabled->activate(); detunevalueoutput->activate(); voicedetune->activate(); return; } voiceresonanceenabled->deactivate(); detunevalueoutput->deactivate(); voicedetune->deactivate(); ;} xywh {93 5 20 20} labelfont 1 labelsize 13 labelcolor 7 } Fl_Group modoscil { callback {// update_modoscil(); ;} xywh {122 4 30 20} box THIN_DOWN_FRAME color 32 labelcolor 49 code0 {modosc = new Oscilloscope(o->x(), o->y(), o->w(), o->h(), 20, "");} code1 {update_modoscil();} } {} Fl_Box modlabel { label N callback {// update_modlabel(); ;} xywh {127 5 20 20} labelfont 1 labelsize 13 labelcolor 7 } Fl_Slider voicedetune { callback {// int detune = lrint(o->value()); o->selection_color(setSlider(detune,0)); collect_writeData(synth, detune, TOPLEVEL::action::forceUpdate, TOPLEVEL::type::Write, ADDVOICE::control::detuneFrequency, npart, kititem, PART::engine::addVoice1 + nvoice); ;} tooltip {Fine Detune (cents)} xywh {365 4 164 20} type {Horz Knob} box THIN_DOWN_BOX labelcolor 64 minimum -8192 maximum 8191 step 1 code0 {o->value(collect_readData(synth, 0, ADDVOICE::control::detuneFrequency, npart, kititem, PART::engine::addVoice1 + nvoice));} code1 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Value_Output detunevalueoutput { callback {// int detType = collect_readData(synth, 0, ADDVOICE::control::detuneType, npart, kititem, PART::engine::addVoice1 + nvoice); o->value(getDetune((detType == 0) ? (collect_readData(synth, 0, ADDSYNTH::detuneType, npart, kititem, PART::engine::addSynth)) : (detType), 0, collect_readData(synth, 0, ADDVOICE::control::detuneFrequency, npart, kititem, PART::engine::addVoice1 + nvoice) + 8192) * collect_readData(synth, 0, ADDSYNTH::control::bandwidthMultiplier, npart, kititem, PART::engine::addSynth)); ;} xywh {326 4 40 20} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 0 when 3 minimum -5000 maximum 5000 textsize 11 textcolor 64 code0 {o->step(0.01, 1);} } Fl_Button itemedit { label Edit callback {// synth->getGuiMaster()->partui->adnoteui->setVoiceTabs(nvoice); synth->getGuiMaster()->partui->adnoteui->set_voice(true); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->adnoteui->ADnoteVoiceList->hide(); ;} tooltip {Right click: also close this} xywh {42 4 40 20} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } } } } Function {ADvoicelistitem(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// nvoice = 0; pars = NULL; ;} {} } Function {init(ADnoteParameters *parameters, int npart_, int kititem_, int nvoice_)} {} { code {// synth = & parameters->getSynthEngine(); pars = parameters; npart = npart_; kititem = kititem_; nvoice = nvoice_; fft = new fft::Calc(synth->oscilsize); oscil = new OscilGen(*fft, NULL, synth, parameters->VoicePar[nvoice].POscil); oscilFM = new OscilGen(*fft, NULL, synth, parameters->VoicePar[nvoice].POscilFM); make_window(); if (collect_readData(synth,0,ADDVOICE::control::enableFrequencyLFO, npart, kititem, PART::engine::addVoice1 + nvoice) > 0) voicelistvibratto->activate(); else voicelistvibratto->deactivate(); ADnoteVoiceListItem->show(); end(); ;} {} } Function {refreshlist(int nvoice)} {} { code {// // a lot missing from here :( voiceenabled->value(collect_readData(synth,0,ADDVOICE::control::enableVoice, npart, kititem, PART::engine::addVoice1 + nvoice)); voiceresonanceenabled->value(collect_readData(synth,0,ADDVOICE::control::enableResonance, npart, kititem, PART::engine::addVoice1 + nvoice)); voicevolume->value(collect_readData(synth,0,ADDVOICE::control::volume, npart, kititem, PART::engine::addVoice1 + nvoice)); voicevolume->selection_color(setSlider(voicevolume->value(),100)); voicedetune->value(collect_readData(synth,0,ADDVOICE::control::detuneFrequency, npart, kititem, PART::engine::addVoice1 + nvoice)); voicedetune->selection_color(setSlider(voicedetune->value(),0)); voicepanning->value(collect_readData(synth,0,ADDVOICE::control::panning, npart, kititem, PART::engine::addVoice1 + nvoice)); voicepanning->selection_color(setKnob(voicepanning->value(),64)); if (collect_readData(synth,0,ADDVOICE::control::enableFrequencyLFO, npart, kititem, PART::engine::addVoice1 + nvoice)==0) voicelistvibratto->deactivate(); else voicelistvibratto->activate(); // this line dips into the LFO code. needs to be handled differently. voicelistvibratto->value(pars->VoicePar[nvoice].FreqLfo->Pintensity); voicelistvibratto->selection_color(setKnob(voicelistvibratto->value(),40)); synth->getGuiMaster()->partui->adnoteui->advoice->update_voiceoscil(); if (voiceenabled->value() == 0) { voicelistitemgroup->deactivate(); } else { voicelistitemgroup->activate(); } detunevalueoutput->do_callback(); voiceoscil->do_callback(); noiselabel->do_callback(); modoscil->do_callback(); modlabel->do_callback(); ADnoteVoiceListItem->redraw(); ;} {} } Function {update_voiceoscil()} {} { code {// this is identical to code in // updating int nvs = nvoice; int nvp = nvoice; voiceOscUpdate(synth, npart, kititem, nvoice, nvs, nvp); // we still need 'pars->' here :( oscil->changeParams(pars->VoicePar[nvs].POscil); osc->init(oscil,0,64-collect_readData(synth,0,ADDVOICE::control::voiceOscillatorPhase, npart, kititem, PART::engine::addVoice1 + nvoice),synth); if (collect_readData(synth,0,ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nvoice) >= 0 || collect_readData(synth,0,ADDVOICE::control::soundType, npart, kititem, PART::engine::addVoice1 + nvoice) > 0) voiceoscil->deactivate(); else voiceoscil->activate(); ;} {} } Function {update_noiselabel()} {} { code {// int extVoice = collect_readData(synth, 0, ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nvoice); int extOsc = collect_readData(synth, 0, ADDVOICE::control::voiceOscillatorSource, npart, kititem, PART::engine::addVoice1 + nvoice); int type = collect_readData(synth, 0, ADDVOICE::control::soundType, npart, kititem, PART::engine::addVoice1 + nvoice); bool showNoise = true; if (extVoice >= 0) { char str[15]; snprintf(str, sizeof(str), "V%d", extVoice + 1); noiselabel->copy_label(str); noiselabel->labelcolor(ext_voice); } else if (extOsc >= 0) { char str[15]; snprintf(str, sizeof(str), "O%d", extOsc + 1); noiselabel->copy_label(str); noiselabel->labelcolor(ext_osc); } else { noiselabel->copy_label("N"); switch (type) { case 1: noiselabel->labelcolor(7); break; case 2: noiselabel->labelcolor(5); break; case 3: noiselabel->labelcolor(6); break; default: showNoise = false; } } if (showNoise) noiselabel->show(); else noiselabel->hide(); ;} {} } Function {update_modoscil()} {} { code {// this is identical to code in // updating int nvs = nvoice; int nvp = nvoice; voiceOscUpdate(synth, npart, kititem, nvoice, nvs, nvp); // we still need 'pars->' here :( oscilFM->changeParams(pars->VoicePar[nvs].POscil); modosc->init(oscilFM,0,64-collect_readData(synth,0,ADDVOICE::control::modulatorOscillatorPhase, npart, kititem, PART::engine::addVoice1 + nvoice),synth); if (collect_readData(synth,0,ADDVOICE::control::modulatorType, npart, kititem, PART::engine::addVoice1 + nvoice) == NONE || collect_readData(synth,0,ADDVOICE::control::externalModulator, npart, kititem, PART::engine::addVoice1 + nvoice) >= 0) modoscil->deactivate(); else modoscil->activate(); ;} {} } Function {update_modlabel()} {} { code {// if (collect_readData(synth,0,ADDVOICE::control::modulatorType, npart, kititem, PART::engine::addVoice1 + nvoice) == NONE) { modlabel->copy_label("OFF"); modlabel->labelcolor(41); modlabel->deactivate(); modlabel->show(); } else { modlabel->activate(); int voice = collect_readData(synth,0,ADDVOICE::control::externalModulator, npart, kititem, PART::engine::addVoice1 + nvoice); int osc = collect_readData(synth,0,ADDVOICE::control::modulatorOscillatorSource, npart, kititem, PART::engine::addVoice1 + nvoice); if (voice >= 0) { char str[15]; snprintf(str, sizeof(str), "V%d", voice + 1); modlabel->copy_label(str); modlabel->labelcolor(ext_voice); modlabel->show(); } else if (osc >= 0) { char str[15]; snprintf(str, sizeof(str), "M%d", osc + 1); modlabel->copy_label(str); modlabel->labelcolor(ext_osc); modlabel->show(); } else { modlabel->hide(); } } ;} {} } Function {itemRtext(float dScale)} {} { code {// int size11 = int(11 * dScale); int size12 = int(12 * dScale); int size14 = int(14 * dScale); voiceresonanceenabled->labelsize(size11); voiceoscil->labelsize(size14); noiselabel->labelsize(size14); modoscil->labelsize(size14); modlabel->labelsize(size14); detunevalueoutput->textsize(size11); itemedit->labelsize(size12); voiceenabled->labelsize(size12); enabledpatch->size(34 * dScale, 18 * dScale); enabledpatch->labelsize(size14); ;} {} } Function {~ADvoicelistitem()} {} { code {// ADnoteVoiceListItem->hide(); delete oscil; delete oscilFM; delete fft; ;} {} } decl {ADnoteParameters *pars;} {private local } decl {int nvoice;} {public local } decl {fft::Calc *fft;} {private local } decl {OscilGen *oscil;} {private local } decl {OscilGen *oscilFM;} {private local } decl {Oscilloscope *osc;} {private local } decl {Oscilloscope *modosc;} {private local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } } class ADnoteUI {: {public PresetsUI_} } { Function {make_window()} {private } { comment {globalrandompan MUST be after globalwidth} {in_source in_header } Fl_Window ADnoteGlobalParameters { label {ADsynth Global Parameters of the Instrument} callback {// saveWin(synth, ADnoteGlobalParameters->w(), ADnoteGlobalParameters->h(), ADnoteGlobalParameters->x(), ADnoteGlobalParameters->y(), false, "AddSynth"); globalSeen = false; resui->resonancewindow->hide(); o->hide(); ;} xywh {447 196 580 405} type Double hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("AddSynth Global"), npart, TOPLEVEL::windowTitle, kititem)).c_str());} code1 {addDW = 580; addDH = 405;} code2 {o->size_range(addDW, addDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Group globalfreq { label FREQUENCY xywh {5 255 570 115} box THIN_UP_BOX labelfont 1 labelsize 12 labelcolor 64 align 17 } { Fl_Group freqenv { label {Yoshimi : AddSynth Global - Frequency Envelope} xywh {10 295 205 70} box FLAT_BOX color 51 labelsize 12 align 144 code0 {o->init(pars->GlobalPar.FreqEnvelope, npart, kititem, PART::engine::addSynth, 1);} class EnvelopeUI } {} Fl_Text_Display octavetext { label Octave xywh {493 275 50 8} box NO_BOX labelfont 3 labelsize 10 labelcolor 226 } Fl_Counter octave { callback {// send_data(0, ADDSYNTH::control::octave, o->value(), TOPLEVEL::type::Integer); ;} tooltip Octave xywh {495 275 47 13} type Simple selection_color 49 labelfont 3 labelsize 10 align 1 minimum -8 maximum 7 step 1 textfont 1 textsize 11 textcolor 64 code0 {int k = collect_readData(synth,0,ADDSYNTH::control::octave, npart, kititem, PART::engine::addSynth) / 1024; if (k >= 8) k -= 16;} code2 {o->value(k);} } Fl_Counter coarsedet { label {Coarse det.} callback {// send_data(0, ADDSYNTH::control::coarseDetune, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Coarse Detune} xywh {495 346 77 13} selection_color 64 labelsize 10 labelcolor 64 align 5 minimum -64 maximum 63 step 1 textfont 1 textsize 11 textcolor 64 code0 {int k = collect_readData(synth, 0, ADDSYNTH::control::coarseDetune, npart, kititem, PART::engine::addSynth);} code1 {o->value(k);} code2 {o->lstep(10);} } Fl_Group freqlfo { label {Frequency LFO} xywh {215 295 275 70} box FLAT_BOX color 47 labelsize 12 align 144 code0 {o->init(synth, npart, kititem, PART::engine::addSynth, TOPLEVEL::insertType::frequency);} class LFOUI } {} Fl_Slider freq { callback {// o->selection_color(setSlider(o->value(),0)); detunevalueoutput->do_callback(); send_data(0, ADDSYNTH::control::detuneFrequency, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Fine Detune (cents)} xywh {57 275 433 13} type {Horz Knob} box THIN_DOWN_BOX labelcolor 64 minimum -8192 maximum 8191 step 1 code0 {o->value(collect_readData(synth, 0, ADDSYNTH::detuneFrequency, npart, kititem, PART::engine::addSynth));} code1 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Choice detunetype { label {Detune Type} callback {// send_data(0, ADDSYNTH::control::detuneType, o->value() + 1, TOPLEVEL::type::Integer); ;} xywh {494 313 78 14} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 11 textcolor 64 code0 {o->add("L35 cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} code1 {o->value(collect_readData(synth, 0, ADDSYNTH::detuneType, npart, kititem, PART::engine::addSynth)-1);} } {} Fl_Value_Output detunevalueoutput { label Detune callback {// o->value(getDetune(detunetype->value()+1,0, freq->value()+8192)); ;} xywh {12 275 45 13} labelsize 10 labelcolor 64 align 5 minimum -5000 maximum 5000 textfont 1 textsize 10 textcolor 64 code0 {o->step(0.01, 1);} code1 {o->value(getDetune(detunetype->value()+1, 0, freq->value()+8192));} } Fl_Dial relBwidth { label relBW callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, ADDSYNTH::control::relativeBandwidth, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Bandwidth - modify the relative fine detune of the voices} xywh {545 270 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::relativeBandwidth, npart, kititem, PART::engine::addSynth));} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } } Fl_Box {} { xywh {10 7 275 68} box PLASTIC_UP_BOX color 223 } Fl_Group amplitudegrp { xywh {5 5 285 250} box THIN_UP_FRAME labelfont 1 labelsize 12 labelcolor 64 align 17 } { Fl_Dial globalvolume { label Volume callback {// o->selection_color(setKnob(o->value(),90)); send_data(0, ADDSYNTH::control::volume, o->value(), TOPLEVEL::type::Integer); ;} tooltip Volume xywh {30 23 35 35} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_InstrumentVolume);} code1 {o->value(collect_readData(synth,0,ADDSYNTH::control::volume, npart, kititem, PART::engine::addSynth));} code2 {o->selection_color(setKnob(o->value(),90));} class WidgetPDial } Fl_Dial vsns { label {Vel Sens} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, ADDSYNTH::control::velocitySense, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Velocity Sensing Function - rightmost/max to disable} xywh {85 23 35 35} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::velocitySense, npart, kititem, PART::engine::addSynth));} code1 {o->selection_color(setKnob(o->value(),64));} code2 {o->setValueType(VC_AmpVelocitySense);} class WidgetPDial } Fl_Dial globalpan { label Pan callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, ADDSYNTH::control::panning, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Global panning} xywh {155 23 35 35} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} code1 {o->value(collect_readData(synth,0,ADDSYNTH::control::panning, npart, kititem, PART::engine::addSynth));} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial globalwidth { label Width callback {// o->selection_color(setKnob(o->value(),63)); send_data(0, ADDSYNTH::control::randomWidth, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Global random width} xywh {235 23 35 35} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 63 step 1 value 63 code0 {o->setValueType(VC_PanningRandom);} code1 {o->value(collect_readData(synth,0,ADDSYNTH::control::randomWidth, npart, kititem, PART::engine::addSynth));} code2 {o->selection_color(setKnob(o->value(),63));} class WidgetPDial } Fl_Check_Button globalrandompan { label Rand callback {// int tmp = o->value(); if (tmp == 0) globalwidth->deactivate(); else globalwidth->activate(); send_data(0, ADDSYNTH::control::enableRandomPan, tmp, TOPLEVEL::type::Integer); ;} tooltip {Enable random panning} xywh {205 32 15 15} down_box DOWN_BOX color 48 selection_color 64 labelsize 11 labelcolor 64 align 1 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::enableRandomPan, npart, kititem, PART::engine::addSynth));} code1 {if (o->value() == 0) globalwidth->deactivate(); else globalwidth->activate();} class Fl_Check_Button2 } Fl_Dial depop { label {D.Pop} callback {// o->selection_color(setKnob(o->value(),20)); send_data(0, ADDSYNTH::control::dePop, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Pop Suppression} xywh {130 227 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::dePop, npart, kititem, PART::engine::addSynth));} code1 {o->selection_color(setKnob(o->value(),20));} class WidgetPDial } Fl_Dial pstr { label {P.Str.} callback {// o->selection_color(setKnob(o->value(),0)); send_data(0, ADDSYNTH::control::punchStrength, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Punch Strength} xywh {170 227 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::punchStrength, npart, kititem, PART::engine::addSynth));} code1 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Dial pt { label {P.t.} callback {// o->selection_color(setKnob(o->value(),60)); send_data(0, ADDSYNTH::control::punchDuration, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Punch Time (duration)} xywh {200 227 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::punchDuration, npart, kititem, PART::engine::addSynth));} code1 {o->selection_color(setKnob(o->value(),60));} class WidgetPDial } Fl_Dial pstc { label {P.Stc.} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, ADDSYNTH::control::punchStretch, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Punch Stretch} xywh {230 227 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::punchStretch, npart, kititem, PART::engine::addSynth));} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial pvel { label {P.Vel.} callback {// o->selection_color(setKnob(o->value(),72)); send_data(0, ADDSYNTH::control::punchVelocity, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Punch Velocity Sensing} xywh {260 227 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::punchVelocity, npart, kititem, PART::engine::addSynth));} code1 {o->selection_color(setKnob(o->value(),72));} class WidgetPDial } Fl_Group ampenv { label {Yoshimi : AddSynth Global - Amplitude Envelope} xywh {10 75 275 70} box FLAT_BOX color 51 labelsize 12 align 144 code0 {o->init(pars->GlobalPar.AmpEnvelope, npart, kititem, PART::engine::addSynth, 0);} class EnvelopeUI } {} Fl_Group amplfo { label {Amplitude LFO} xywh {10 145 275 70} box FLAT_BOX color 47 labelsize 12 align 144 code0 {o->init(synth, npart, kititem, PART::engine::addSynth, TOPLEVEL::insertType::amplitude);} class LFOUI } {} Fl_Check_Button rndgrp { label {Rnd Grp} callback {// send_data(0, ADDSYNTH::control::randomGroup, o->value(), TOPLEVEL::type::Integer); ;} tooltip {Disable individual Harmonic Amplitude randomisation for voices that use the same oscillator} xywh {8 234 63 18} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::randomGroup, npart, kititem, PART::engine::addSynth));} class Fl_Check_Button2 } Fl_Box {} { xywh {135 24 4 44} box THIN_DOWN_FRAME } Fl_Box amplitudelabel { label AMPLITUDE xywh {128 12 35 8} labelfont 1 labelsize 12 labelcolor 64 } } Fl_Group filtergrp { label FILTER xywh {290 5 285 250} box THIN_UP_BOX labelfont 1 labelsize 12 labelcolor 64 align 17 } { Fl_Group filterenv { label {Yoshimi : AddSynth Global - Filter Envelope} xywh {295 110 275 70} box FLAT_BOX color 51 labelsize 12 align 144 code0 {o->init(pars->GlobalPar.FilterEnvelope, npart, kititem, PART::engine::addSynth, 2);} class EnvelopeUI } {} Fl_Group filterlfo { label {Filter LFO} xywh {295 180 275 70} box FLAT_BOX color 47 labelsize 12 align 144 code0 {o->init(synth, npart, kititem, PART::engine::addSynth, TOPLEVEL::insertType::filter);} class LFOUI } {} Fl_Group filterui { label {Yoshimi : AddSynth Global - Filter} xywh {295 35 275 75} box FLAT_BOX color 50 labelsize 12 align 144 code0 {o->init(pars->GlobalPar.GlobalFilter, &pars->GlobalPar.PFilterVelocityScale, &pars->GlobalPar.PFilterVelocityScaleFunction, npart, kititem, PART::engine::addSynth);} class FilterUI } {} } Fl_Check_Button stereo { label { Stereo} callback {// send_data(0, ADDSYNTH::control::stereo, o->value(), TOPLEVEL::type::Integer); ;} xywh {8 220 61 15} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 11 labelcolor 226 code0 {o->value(collect_readData(synth,0,ADDSYNTH::control::stereo, npart, kititem, PART::engine::addSynth));} class Fl_Check_Button2 } Fl_Button showvoicelist { label {Show Voice List} callback {// for (int i = 0; i < NUM_VOICES; ++i) voicelistitem[i]->refreshlist(i); int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "AddSynth-list"); if (fetchW < listDW || fetchH < listDH) { fetchW = listDW; fetchH = listDH; } checkSane(fetchX, fetchY,fetchW, fetchH, listDW, listDH); ADnoteVoiceList->resize(fetchX, fetchY,fetchW, fetchH); lastlistW = 0; ADnoteVoiceList->show(); listSeen = true; if (Fl::event_button() == 3) ADnoteGlobalParameters->hide(); ;} tooltip {Right click: also close this} xywh {191 375 121 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button showvoicepars { label {Show Voice Parameters} callback {// set_voice(false); if ((Fl::event_button() == 3)) ADnoteGlobalParameters->hide(); ;} tooltip {Right click: also close this} xywh {5 375 180 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button globalclose { label {&Close} callback {// saveWin(synth, ADnoteGlobalParameters->w(), ADnoteGlobalParameters->h(), ADnoteGlobalParameters->x(), ADnoteGlobalParameters->y(), false, "AddSynth"); globalSeen = false; resui->resonancewindow->hide(); ADnoteGlobalParameters->hide(); if (Fl::event_button() == 3) { if (synth->getGuiMaster()->partui->partKitOn) synth->getGuiMaster()->partui->instrumentkitlist->show(); else synth->getGuiMaster()->partui->instrumenteditwindow->show(); } ;} tooltip {Right click: also reopen previous} xywh {517 375 54 25} box THIN_UP_BOX color 196 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button resonance { label Resonance callback {// resui->resonancewindow->redraw(); resui->Show(); if ((Fl::event_button() == 3)) ADnoteGlobalParameters->hide(); ;} tooltip {Resonance. Right click: also close this} xywh {318 375 90 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button globalcopy { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, PART::engine::addSynth); ;} xywh {455 380 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button globalpaste { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, PART::engine::addSynth); ;} xywh {485 380 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } } Fl_Window ADnoteVoice { label {ADsynth Voice Parameters} callback {// saveWin(synth, o->w(), o->h(), o->x(), o->y(), false,"AddSynth-voice"); o->hide();} xywh {460 96 805 610} type Double hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("AddSynth Voice"), npart, TOPLEVEL::windowTitle, kititem)).c_str());} code1 {voiceDW = int(760 * 9 / 10); voiceDH = int(610 * 9 / 10);} code2 {o->size_range(voiceDW, voiceDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Group advoice { xywh {0 0 809 615} box BORDER_BOX code0 {o->init(pars, npart, kititem, nvoice);} code1 {o->show();} class ADvoiceUI } {} Fl_Button Vclose { label Close callback {// ADnoteVoice->hide(); saveWin(synth, ADnoteVoice->w(), ADnoteVoice->h(), ADnoteVoice->x(), ADnoteVoice->y(), false, "AddSynth-voice"); voiceSeen = false; if (Fl::event_button() == 3) { if (fromVoiceList) ADnoteVoiceList->show(); else ShowGlobal(); }} tooltip {Right click: also reopen previous} xywh {695 575 90 25} box THIN_UP_BOX color 196 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button Vcopy { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, nvoice + PART::engine::addVoice1);} xywh {600 580 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button Vpaste { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, nvoice + PART::engine::addVoice1);} xywh {630 580 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button g1 { label 1 callback {// setVoiceTabs(0, !o->value());} xywh {8 3 50 32} box PLASTIC_THIN_UP_BOX down_box PLASTIC_THIN_UP_BOX selection_color 223 labelfont 1 labelcolor 64 code0 {o->value(1);} } Fl_Button g2 { label 2 callback {// setVoiceTabs(1, !o->value());} xywh {60 3 50 32} box PLASTIC_THIN_UP_BOX down_box PLASTIC_THIN_UP_BOX selection_color 223 labelfont 1 labelcolor 64 code0 {o->value(0);} } Fl_Button g3 { label 3 callback {// setVoiceTabs(2, !o->value());} xywh {112 3 50 32} box PLASTIC_THIN_UP_BOX down_box PLASTIC_THIN_UP_BOX selection_color 223 labelfont 1 labelcolor 64 code0 {o->value(0);} } Fl_Button g4 { label {4 } callback {// setVoiceTabs(3, !o->value());} xywh {164 3 50 32} box PLASTIC_THIN_UP_BOX down_box PLASTIC_THIN_UP_BOX selection_color 223 labelfont 1 labelcolor 64 code0 {o->value(0);} } Fl_Button g5 { label 5 callback {// setVoiceTabs(4, !o->value());} xywh {216 3 50 32} box PLASTIC_THIN_UP_BOX down_box PLASTIC_THIN_UP_BOX selection_color 223 labelfont 1 labelcolor 64 code0 {o->value(0);} } Fl_Button g6 { label 6 callback {// setVoiceTabs(5, !o->value());} xywh {268 3 50 32} box PLASTIC_THIN_UP_BOX down_box PLASTIC_THIN_UP_BOX selection_color 223 labelfont 1 labelcolor 64 code0 {o->value(0);} } Fl_Button g7 { label 7 callback {// setVoiceTabs(6, !o->value());} xywh {320 3 50 32} box PLASTIC_THIN_UP_BOX down_box PLASTIC_THIN_UP_BOX selection_color 223 labelfont 1 labelcolor 64 code0 {o->value(0);} } Fl_Button g8 { label 8 callback {// setVoiceTabs(7, !o->value());} xywh {372 3 50 32} box PLASTIC_THIN_UP_BOX down_box PLASTIC_THIN_UP_BOX selection_color 223 labelfont 1 labelcolor 64 code0 {o->value(0);} } Fl_Group voiceTabBar { xywh {4 30 524 5} box PLASTIC_THIN_DOWN_BOX color 223 } {} } Fl_Window ADnoteVoiceList { label {ADsynth Voices list} callback {// if (listSeen) saveWin(synth, o->w(), o->h(), o->x(), o->y(), false,"AddSynth-list"); listSeen = false; o->hide();} xywh {101 233 705 260} type Double labelcolor 64 hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("AddSynth Voice List"), npart, TOPLEVEL::windowTitle, kititem)).c_str());} code1 {listDW = 705; listDH = 260;} code2 {o->size_range(listDW,listDH,0,0,0,0,1);} class ScaleTrackedWindow } { Fl_Text_Display listNo { label {No.} xywh {24 15 30 10} box NO_BOX selection_color 64 labelfont 1 labelsize 11 labelcolor 64 textcolor 64 } Fl_Text_Display listVolume { label Volume xywh {230 15 30 10} box NO_BOX selection_color 64 labelfont 1 labelsize 11 labelcolor 64 textcolor 64 } Fl_Text_Display listDetune { label Detune xywh {458 15 25 10} box NO_BOX selection_color 64 labelfont 1 labelsize 11 labelcolor 64 textcolor 64 } Fl_Text_Display listPan { label Pan xywh {298 15 30 10} box NO_BOX selection_color 64 labelfont 1 labelsize 11 labelcolor 64 textcolor 64 } Fl_Text_Display listVibrato { label {Vibrato Depth} xywh {618 15 30 10} box NO_BOX selection_color 64 labelfont 1 labelsize 11 labelcolor 64 textcolor 64 } Fl_Text_Display listResonance { label Res xywh {329 15 25 10} box NO_BOX selection_color 64 labelfont 1 labelsize 11 labelcolor 64 textcolor 64 } Fl_Button listClose { label Close callback {// ADnoteVoiceList->hide(); listSeen = false; saveWin(synth, ADnoteVoiceList->w(), ADnoteVoiceList->h(), ADnoteVoiceList->x(), ADnoteVoiceList->y(), false, "AddSynth-list"); if (Fl::event_button() == 3) ShowGlobal(); ;} tooltip {Right click: also reopen previous} xywh {582 235 62 20} color 196 labelfont 1 labelsize 12 labelcolor 64 } Fl_Group {} { xywh {5 15 695 214} box THIN_UP_BOX labelcolor 64 } { Fl_Group {} { xywh {17 27 668 200} code0 {// for (int i = 0; i < NUM_VOICES; ++i) { voicelistitem[i] = new ADvoicelistitem(4, 8, 620, 25, ""); voicelistitem[i]->init(pars, npart, kititem, i); }} } {} } Fl_Text_Display listWave { label Wave xywh {105 15 30 10} box NO_BOX labelfont 1 labelsize 11 labelcolor 64 textcolor 64 } Fl_Text_Display listModulator { label Mod xywh {145 15 30 10} box NO_BOX labelfont 1 labelsize 11 labelcolor 64 textcolor 64 } } } Function {setVoiceTabs(int num, bool edit = true)} {} { code {// g1->value(0); g2->value(0); g3->value(0); g4->value(0); g5->value(0); g6->value(0); g7->value(0); g8->value(0); switch (num) { case 0: g1->value(1); if (edit) editVoice(0); break; case 1: g2->value(1); if (edit) editVoice(1); break; case 2: g3->value(1); if (edit) editVoice(2); break; case 3: g4->value(1); if (edit) editVoice(3); break; case 4: g5->value(1); if (edit) editVoice(4); break; case 5: g6->value(1); if (edit) editVoice(5); break; case 6: g7->value(1); if (edit) editVoice(6); break; case 7: g8->value(1); if (edit) editVoice(7); break; } ;} {} } Function {setTabColour(int nvoice)} {} { code {// int set = voice_off; if (collect_readData(synth,0,ADDVOICE::control::enableVoice, npart, kititem, PART::engine::addVoice1 + nvoice)) set = gen_text; switch (nvoice) // there should be a better way to do this { case 0: g1->labelcolor(set); break; case 1: g2->labelcolor(set); break; case 2: g3->labelcolor(set); break; case 3: g4->labelcolor(set); break; case 4: g5->labelcolor(set); break; case 5: g6->labelcolor(set); break; case 6: g7->labelcolor(set); break; case 7: g8->labelcolor(set); break; } ;} {} } Function {send_data(int action, int control, float value, int type)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, PART::engine::addSynth); ;} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; bool val_bool = _SYS_::F2B(value); switch(control) { case ADDSYNTH::control::volume: globalvolume->value(value); globalvolume->selection_color(setKnob(value,90)); break; case ADDSYNTH::control::velocitySense: vsns->value(value); vsns->selection_color(setKnob(value,64)); break; case ADDSYNTH::control::panning: globalpan->value(value); globalpan->selection_color(setKnob(value,64)); amplitudegrp->changed(); break; case ADDSYNTH::control::enableRandomPan: globalrandompan->value(val_bool); if (val_bool) globalwidth->activate(); else globalwidth->deactivate(); amplitudegrp->changed(); break; case ADDSYNTH::control::randomWidth: globalwidth->value(value); globalwidth->selection_color(setKnob(value,63)); amplitudegrp->changed(); break; case ADDSYNTH::control::detuneFrequency: freq->value(value); freq->selection_color(setSlider(value,0)); detunevalueoutput->do_callback(); break; case ADDSYNTH::control::octave: octave->value((int) value); break; case ADDSYNTH::control::detuneType: detunetype->value(int(value) -1); break; case ADDSYNTH::control::coarseDetune: coarsedet->value((int) value); break; case ADDSYNTH::control::relativeBandwidth: relBwidth->value(value); relBwidth->selection_color(setKnob(value,64)); break; case ADDSYNTH::control::stereo: stereo->value(val_bool); break; case ADDSYNTH::control::randomGroup: rndgrp->value(val_bool); break; case ADDSYNTH::control::dePop: depop->value(value); depop->selection_color(setKnob(value,20)); break; case ADDSYNTH::control::punchStrength: pstr->value(value); pstr->selection_color(setKnob(value,0)); break; case ADDSYNTH::control::punchDuration: pt->value(value); pt->selection_color(setKnob(value,60)); break; case ADDSYNTH::control::punchStretch: pstc->value(value); pstc->selection_color(setKnob(value,64)); break; case ADDSYNTH::control::punchVelocity: pvel->value(value); pvel->selection_color(setKnob(value,72)); break; } ;} {} } Function {paste(CommandBlock *getData)} {} { code {// switch (getData->data.insert) { case TOPLEVEL::insert::resonanceGroup: { if (resui) resui->refresh(); break; } } ;} {} } Function {ADnoteUI(ADnoteParameters *parameters, int npart_, int kititem_)} {} { code {// synth = & parameters->getSynthEngine(); pars = parameters; npart = npart_; kititem = kititem_; globalSeen = false; lastglobalW = 0; voiceSeen = false; lastvoiceW = 0; nvoice = 0; resui = new ResonanceUI(pars->GlobalPar.Reson, npart, kititem, PART::engine::addSynth); lastlistW = 0; listSeen = false; lastResuiW = 0; make_window(); for (int i = 0; i < NUM_VOICES; ++i) { setTabColour(i); } ;} {} } Function {~ADnoteUI()} {return_type virtual } { code {// if(listSeen) saveWin(synth, ADnoteVoiceList->w(), ADnoteVoiceList->h(), ADnoteVoiceList->x(), ADnoteVoiceList->y(), listSeen, "AddSynth-list"); ADnoteVoiceList->hide(); listSeen = false; if (globalSeen) saveWin(synth, ADnoteGlobalParameters->w(), ADnoteGlobalParameters->h(), ADnoteGlobalParameters->x(), ADnoteGlobalParameters->y(), globalSeen, "AddSynth"); ADnoteGlobalParameters->hide(); globalSeen = false; if (voiceSeen) saveWin(synth, ADnoteVoice->w(), ADnoteVoice->h(), ADnoteVoice->x(), ADnoteVoice->y(), voiceSeen, "AddSynth-voice"); voiceSeen = false; ADnoteVoice->hide(); resui->resonancewindow->hide(); delete ADnoteVoiceList; delete ADnoteGlobalParameters; delete ADnoteVoice; delete resui; ;} {} } Function {refresh()} {} { code {// globalvolume->value(collect_readData(synth, 0, ADDSYNTH::volume, npart, kititem, PART::engine::addSynth)); globalvolume->selection_color(setKnob(globalvolume->value(),90)); vsns->value(collect_readData(synth, 0, ADDSYNTH::velocitySense, npart, kititem, PART::engine::addSynth)); vsns->selection_color(setKnob(vsns->value(),64)); globalpan->value(collect_readData(synth, 0, ADDSYNTH::panning, npart, kititem, PART::engine::addSynth)); globalpan->selection_color(setKnob(globalpan->value(),64)); globalwidth->value(collect_readData(synth, 0, ADDSYNTH::randomWidth, npart, kititem, PART::engine::addSynth)); globalwidth->selection_color(setKnob(globalwidth->value(),63)); relBwidth->value(collect_readData(synth, 0, ADDSYNTH::relativeBandwidth, npart, kititem, PART::engine::addSynth)); relBwidth->selection_color(setKnob(relBwidth->value(),64)); stereo->value(collect_readData(synth, 0, ADDSYNTH::stereo, npart, kititem, PART::engine::addSynth)); rndgrp->value(collect_readData(synth, 0, ADDSYNTH::randomGroup, npart, kititem, PART::engine::addSynth)); pstr->value(collect_readData(synth, 0, ADDSYNTH::punchStrength, npart, kititem, PART::engine::addSynth)); pstr->selection_color(setKnob(pstr->value(),0)); depop->value(collect_readData(synth, 0, ADDSYNTH::dePop, npart, kititem, PART::engine::addSynth)); depop->selection_color(setKnob(depop->value(),20)); pt->value(collect_readData(synth, 0, ADDSYNTH::punchDuration, npart, kititem, PART::engine::addSynth)); pt->selection_color(setKnob(pt->value(),60)); pstc->value(collect_readData(synth, 0, ADDSYNTH::punchStretch, npart, kititem, PART::engine::addSynth)); pstc->selection_color(setKnob(pstc->value(),64)); pvel->value(collect_readData(synth, 0,ADDSYNTH::punchVelocity, npart, kititem, PART::engine::addSynth)); pvel->selection_color(setKnob(pvel->value(),72)); int detFreq = collect_readData(synth, 0, ADDSYNTH::detuneFrequency, npart, kititem, PART::engine::addSynth); freq->value(detFreq); freq->selection_color(setSlider(freq->value(), 0)); int k = collect_readData(synth, 0, ADDSYNTH::coarseDetune, npart, kititem, PART::engine::addSynth) / 1024; if (k >= 8) k -= 16; octave->value(k); int detType = collect_readData(synth, 0, ADDSYNTH::detuneType, npart, kititem, PART::engine::addSynth); detunetype->value(detType - 1); k = collect_readData(synth,0,ADDSYNTH::control::octave, npart, kititem, PART::engine::addSynth); if (k >= 512) k -= 1024; coarsedet->value(k); detunevalueoutput->value(getDetune(detType, 0, detFreq + 8192)); amplfo->refresh(); freqlfo->refresh(); filterlfo->refresh(); ampenv->refresh(); freqenv->refresh(); filterenv->refresh(); filterui->refresh(); editVoice(nvoice); for (int i = 0; i < NUM_VOICES; ++i) { setTabColour(i); voicelistitem[i]->refreshlist(i); } resui->refresh(); ;} {} } Function {ShowGlobal()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "AddSynth"); if (fetchW < addDW || fetchH < addDH) { fetchW = addDW; fetchH = addDH; } checkSane(fetchX, fetchY, fetchW, fetchH, addDW, addDH); lastglobalW = 0; ADnoteGlobalParameters->resize(fetchX, fetchY, fetchW, fetchH); ADnoteGlobalParameters->show(); globalSeen = true; ;} {} } Function {set_voice(bool type)} {} { code {// voicelistitem[nvoice]->refreshlist(nvoice); int fetchW, fetchH, fetchX, fetchY, fetchO; if (!voiceSeen) { loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "AddSynth-voice"); if (fetchW < voiceDW || fetchH < voiceDH) { fetchW = voiceDW; fetchH = voiceDH; } checkSane(fetchX, fetchY, fetchW, fetchH, voiceDW, voiceDH); ADnoteVoice->resize(fetchX, fetchY, fetchW, fetchH); } ADnoteVoice->redraw(); ADnoteVoice->show(); lastvoiceW = 0; voiceSeen = true; fromVoiceList = type; ;} {} } Function {wincheck()} {} { code {// addRtext(); addVoiceRtext(); if (ADnoteVoiceList->visible()) addVoiceListRtext(); if (resui->resonancewindow->visible() && lastResuiW != resui->resonancewindow->w()) { resui->resonanceRtext(); lastResuiW = resui->resonancewindow->w(); } if (ampenv) ampenv->wincheck(); if (filterenv) filterenv->wincheck(); if (freqenv) freqenv->wincheck(); ;} {} } Function {theme()} {} { code {// if(ADnoteGlobalParameters->visible()) { lastglobalW = 0; addRtext(); } if (ADnoteVoiceList->visible()) { lastlistW = 0; addVoiceListRtext(); } if (resui->resonancewindow->visible()) { lastResuiW = 0; resui->resonanceRtext(); } ampenv->theme(); freqenv->theme(); filterenv->theme(); filterui->theme(); lastvoiceW = 0; addVoiceRtext(); advoice->voicetheme(); ;} {} } Function {addRtext()} {} { code {// ampenv->wincheck(); freqenv->wincheck(); filterenv->wincheck(); if (lastglobalW < 3) { ++lastglobalW; return; // in case it is called before completely redrawn } if (lastglobalW == ADnoteGlobalParameters->w()) return; lastglobalW = ADnoteGlobalParameters->w(); float dScale = ADnoteGlobalParameters->w() / float(addDW); if (dScale < 0.2f) dScale = 0.2f; amplfo->lfoRtext(dScale); ampenv->envRtext(dScale); freqlfo->lfoRtext(dScale); freqenv->envRtext(dScale); filterlfo->lfoRtext(dScale); filterenv->envRtext(dScale); filterui->filterRtext(dScale); int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); amplitudelabel->labelsize(size12); globalvolume->labelsize(size); vsns->labelsize(size); globalpan->labelsize(size); globalwidth->labelsize(size); globalrandompan->labelsize(size); depop->labelsize(size); pstr->labelsize(size); pt->labelsize(size); pstc->labelsize(size); pvel->labelsize(size); rndgrp->labelsize(size); stereo->labelsize(size11); filtergrp->labelsize(size12); globalfreq->labelsize(size12); detunevalueoutput->labelsize(size); detunevalueoutput->textsize(size); octavetext->labelsize(size); octave->textsize(size11); octave->redraw(); relBwidth->labelsize(size); detunetype->labelsize(size); detunetype->textsize(size11); coarsedet->labelsize(size); coarsedet->textsize(size11); showvoicepars->labelsize(size12); showvoicelist->labelsize(size12); resonance->labelsize(size12); globalcopy->labelsize(size11); globalpaste->labelsize(size11); globalclose->labelsize(size11); ADnoteGlobalParameters->redraw(); ;} {} } Function {addVoiceRtext()} {} { code {// this is just for the outer skin float dScale = ADnoteVoice->w() / float(voiceDW); if (dScale < 0.2f) dScale = 0.2f; advoice->voiceRtext(dScale); // must be entered (for waveform) if (!ADnoteVoice->visible()) return; if (lastvoiceW < 2) // extra time to settle { ++lastvoiceW; return; } if (ADnoteVoice->w() == lastvoiceW) return; lastvoiceW = ADnoteVoice->w(); Vclose->labelsize(int(12 * dScale)); Vcopy->labelsize(int(11 * dScale)); Vpaste->labelsize(int(11 * dScale)); /* * scaling of tabs is in near tab size jumps so we * have to try to get the best overall size/position */ int size = int((12 * dScale) + (1.85f * dScale * dScale)); g1->labelsize(size); g2->labelsize(size); g3->labelsize(size); g4->labelsize(size); g5->labelsize(size); g6->labelsize(size); g7->labelsize(size); g8->labelsize(size); ADnoteVoice->redraw(); ;} {} } Function {addVoiceListRtext()} {} { code {// if (lastlistW < 3) { ++lastlistW; return; } if (lastlistW == ADnoteVoiceList->w()) return; lastlistW = ADnoteVoiceList->w(); float dScale = ADnoteVoiceList->w() / float(listDW); if (dScale < 0.2f) dScale = 0.2f; for (int i = 0; i < NUM_VOICES; ++i) { voicelistitem[i]->resize(15 * dScale, (27 + (25 * i)) * dScale, 670 * dScale, 25 * dScale); voicelistitem[i]->itemRtext(dScale); } int size11 = int(11 * dScale); listNo->labelsize(size11); listVolume->labelsize(size11); listDetune->labelsize(size11); listPan->labelsize(size11); listVibrato->labelsize(size11); listResonance->labelsize(size11); listWave->labelsize(size11); listModulator->labelsize(size11); listClose->labelsize(int(14 * dScale)); ADnoteVoiceList->redraw(); ;} {} } Function {editVoice(int nvoice_)} {return_type void } { code {// nvoice = nvoice_; int adW = advoice->ADnoteVoiceParameters->w(); int adH = advoice->ADnoteVoiceParameters->h(); bool lastVoiceState = advoice->voiceonbutton->value(); advoice->hide(); ADnoteVoice->remove(advoice); delete advoice; advoice = new ADvoiceUI(0, 0, adW, adH); ADnoteVoice->add(advoice); advoice->init(pars, npart, kititem, nvoice); /* This is only needed to update the tab when a voice has been pasted, but duplicates the action every time a different voice is selected. Needs improvement! */ if (advoice->voiceonbutton->value() != lastVoiceState) { setTabColour(nvoice); } voicelistitem[nvoice]->refreshlist(nvoice); advoice->ADnoteVoiceParameters->size(adW, adH); advoice->show(); addVoiceRtext(); ;} {} } decl {ADnoteParameters *pars;} {private local } decl {int addDW;} {private local } decl {int addDH;} {private local } decl {int lastglobalW;} {private local } decl {bool globalSeen;} {private local } decl {int voiceDW;} {private local } decl {int voiceDH;} {private local } decl {int lastvoiceW;} {private local } decl {bool voiceSeen;} {public local } decl {int listDW;} {private local } decl {int listDH;} {private local } decl {int lastlistW;} {private local } decl {bool listSeen;} {public local } decl {ResonanceUI *resui;} {public local } decl {int lastResuiW;} {private local } decl {int nvoice;} {public local } decl {ADvoicelistitem *voicelistitem[NUM_VOICES];} {public local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {bool fromVoiceList;} {public local } } yoshimi-2.3.5.1/src/UI/BankUI.fl000066400000000000000000001671471506652756400161410ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {BankUI.h} {not_in_source in_header } comment {BankUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2014-2025, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of original ZynAddSubFX code. } {selected in_source in_header } decl {\#include } {public local } decl {\#include } {public local } decl {\#include using std::string;} {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include "UI/WidgetSpinner.h"} {public global } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } decl {\#include "Misc/Bank.h"} {public local } decl {\#include "Misc/Config.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {public local } decl {\#include "Interface/TextLists.h"} {public local } decl {\#include "MasterUI.h"} {private local } decl {\#include "UI/Themes.h"} {private local } decl {\#include "Misc/FormatFuncs.h" using func::string2int; using func::asString;} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {using std::to_string;} {private global } class BankProcess_ {} { Function {process()} {return_type {virtual void} } { code {;} {} } decl {Bank *bank;} {public local } } class BankSlot {: {public Fl_Button, BankProcess_} } { Function {BankSlot(int x,int y, int w, int h, const char *label=0):Fl_Button(x,y,w,h,label)} {} { code {// what = NULL; whatslot = NULL; nslot = 0; nselected = NULL;} {} } Function {handle(int event)} {return_type int } { code {// if (what == NULL) return 0; if (Fl::event_inside(this)) { *what = 0; *whatslot = nslot; if (event == FL_RELEASE) *what = Fl::event_button(); if (event == FL_PUSH) highlight = 1; } else highlight = 0; int tmp = Fl_Button::handle(event); if (*what != 0 && Fl::event_inside(this)) (bp->*fnc)(); return tmp;} {} } Function {init(int nslot_, int *what_, int *whatslot_, void (BankProcess_:: *fnc_)(void), BankProcess_ *bp_, Bank *bank_, int *nselected_)} {} { code {// nslot = nslot_; what = what_; whatslot = whatslot_; fnc = fnc_; bp = bp_; bank = bank_; nselected = nselected_; box(FL_THIN_UP_FRAME); labelfont(0); labelsize(13); labelcolor(gen_text); align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP); highlight = 0;} {} } Function {refresh(int bk, int rt, int last)} {} { code {// string instrName = bank->getnamenumbered(nslot, bk, rt); copy_label(instrName.c_str()); rootID = rt; bankID = bk; lastSeen = last; if (bank->engines_used(rt, bk, nslot) & 8) labelcolor(yoshi_ins_typ); // Slot marked as Yoshimi-format instrument in the banks-file; else labelcolor(bank_text);} {} } decl {int *what, *whatslot, nslot, highlight, *nselected;} {private local } decl {void (BankProcess_:: *fnc)(void);} {private local } decl {BankProcess_ *bp;} {private local } Function {draw()} { comment {overrides button's draw()} protected } { code {// if (type() == FL_HIDDEN_BUTTON) return; int acol, scol, pcol; int wid = w() * 0.334; int engine = bank->engines_used(rootID, bankID, nslot); if (engine > 0) { acol = bank_back_used; // occupied background scol = bank_back_used; pcol = bank_back_used; } else { acol = bank_back; // normal background scol = bank_back; pcol = bank_back; } if (*nselected == nslot) { acol = bank_swap_back; // selected item background scol = bank_swap_back; pcol = bank_swap_back; } else { if (engine & 1) acol = add_back; if (engine & 2) scol = sub_back; if (engine & 4) pcol = pad_back; if ((lastSeen & 0x7f) == rootID && ((lastSeen >> 8) & 0x7f) == bankID && ((lastSeen >> 15) == nslot)) labelfont(1); else labelfont(0); } draw_box(FL_FLAT_BOX, x(), y(), wid, h(), (Fl_Color) acol); draw_box(FL_FLAT_BOX, x() + wid, y(), wid, h(), (Fl_Color) scol); draw_box(FL_FLAT_BOX, x() + wid * 2, y(), wid, h(), (Fl_Color) pcol); //frame for label draw_box(value() ? (down_box() ? down_box() : fl_down(box())) : box(), x(), y(), w(), h(), Fl_Color(17)); labelcolor(bank_text); draw_label(); if (engine & 8) // Slot marked as Yoshimi-format instrument in the banks-file labelcolor(yoshi_ins_typ); else labelcolor(bank_text); draw_label(); if (Fl::focus() == this) draw_focus();} {} } decl {int rootID;} {private local } decl {int bankID;} {private local } decl {int lastSeen;} {public local } } class RootProcess_ {} { Function {rootprocess()} {return_type {virtual void} } { code {;} {} } decl {Bank *root;} {public local } } class RootSlot {: {public Fl_Button, RootProcess_} } { Function {RootSlot(int x,int y, int w, int h, const char *label=0):Fl_Button(x,y,w,h,label)} {} { code {// what = NULL; whatslot = NULL; nslot = 0; nselected = NULL;} {} } Function {handle(int event)} {return_type int } { code {// if (what == NULL) return 0; if (Fl::event_inside(this)) { *what = 0; *whatslot = nslot; if (event == FL_RELEASE) *what = Fl::event_button(); if (event == FL_PUSH) highlight = 1; } else highlight = 0; int tmp = Fl_Button::handle(event); if (*what != 0 && Fl::event_inside(this)) (rp->*fnr)(); return tmp;} {} } Function {init(int nslot_, int *what_, int *whatslot_, void (RootProcess_:: *fnr_)(void), RootProcess_ *rp_, Bank *root_, int *rselected_)} {} { code {// nslot = nslot_; what = what_; whatslot = whatslot_; fnr = fnr_; rp = rp_; root = root_; rselected = rselected_; box(FL_THIN_UP_BOX); labelfont(0); labelcolor(gen_text); labelsize(13); align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP); highlight = 0;} {} } Function {rootrefresh(unsigned int currentBank, unsigned int rootID)} {} { code {// string bankName = root->getBankName(nslot, rootID); if (bankName.empty()) color(bank_back); else { bankName = std::to_string(nslot) + ". " + bankName; if ((unsigned int) nslot == currentBank) color(bank_highlight); else color(bank_back_used); if (*rselected == nslot) color(bank_swap_back); } labelcolor(bank_text); copy_label(bankName.c_str());} {} } decl {int *what, *whatslot, nslot, highlight, *nselected, *rselected;} {private local } decl {void (RootProcess_:: *fnr)(void);} {private local } decl {RootProcess_ *rp;} {private local } } class BankUI {: {public BankProcess_, RootProcess_} } { Function {make_window()} {} { Fl_Window instrumentuiwindow { label Bank callback {Hide(0);} xywh {687 245 780 570} type Double labelsize 12 labelcolor 64 hide resizable class ScaleTrackedWindow code0 {instDW = o->w(), instDH = o->h();} code1 {o->size_range((instDW * 8 / 10), (instDH * 8 / 10), 0,0,0,0,1);} } { Fl_Choice banklist { callback {// int n = o->value(); if (n < 0) return; const Fl_Menu_Item &item = o->menu()[n]; int nbank = reinterpret_cast(item.user_data()); send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::selectBank, nbank, TOPLEVEL::type::Integer, TOPLEVEL::section::bank);} xywh {5 8 199 20} down_box BORDER_BOX selection_color 7 labelfont 1 labelsize 12 labelcolor 64 align 0 textsize 12 textcolor 64 } {} Fl_Button B_search { label Search callback {// ShowSearch();} tooltip {Select instrument from list, by type} xywh {230 5 93 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 align 128 } Fl_Button insRoots { label Roots callback {// ShowRoot(); if ((Fl::event_button() == 3)) { rootFrom = 3; Hide(0); setVisible(synth, false, "Bank-instrument"); } instFrom = 0;} tooltip {Show root paths. Right click: also close this} xywh {364 5 93 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 align 128 } Fl_Button insBanks { label Banks callback {// Showbank(); if ((Fl::event_button() == 3)) { bankFrom = 3; Hide(0); setVisible(synth, false, "Bank-instrument"); } instFrom = 0;} tooltip {Show banks in current root. Right click: also close this} xywh {496 5 93 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 align 128 } Fl_Text_Display insT1 { label {This column uses MIDI} xywh {624 17 136 3} box NO_BOX labelsize 12 labelcolor 64 align 33 } Fl_Text_Display insT2 { label {Extended Program Change} xywh {610 30 162 3} box NO_BOX labelsize 12 labelcolor 64 align 33 } Fl_Group insgroup { xywh {1 31 779 494} labelsize 12 } { Fl_Group insframe1 { xywh {4 31 158 494} labelsize 12 code0 {o->box(FL_NO_BOX);} code1 {for (int i = 0; i < 32; ++i) { bs[i] = new BankSlot (0, 0, o->w(), 15, " "); bs[i]->init(i, &what, &slot, &BankProcess_::process, (BankProcess_ *)this, bank, &nselected); }} } {} Fl_Group insframe2 { xywh {161 31 152 494} labelsize 12 code0 {o->box(FL_NO_BOX);} code1 {for (int i = 32; i < 64; ++i) { bs[i] = new BankSlot (0, 0, o->w(), 15, " "); bs[i]->init(i, &what, &slot, &BankProcess_::process, (BankProcess_ *)this, bank, &nselected); }} } {} Fl_Group insframe3 { xywh {316 31 150 494} labelsize 12 code0 {o->box(FL_NO_BOX);} code1 {for (int i = 64; i < 96; ++i) { bs[i] = new BankSlot (0, 0, o->w(), 15, " "); bs[i]->init(i, &what, &slot, &BankProcess_::process, (BankProcess_ *)this, bank, &nselected); }} } {} Fl_Group insframe4 { xywh {469 31 150 494} labelsize 12 code0 {o->box(FL_NO_BOX);} code1 {for (int i = 96; i < 128; ++i) { bs[i] = new BankSlot (0, 0, o->w(), 15, " "); bs[i]->init(i, &what, &slot, &BankProcess_::process, (BankProcess_ *)this, bank, &nselected); }} } {} Fl_Group insframe5 { xywh {622 31 156 494} color 48 labelsize 12 code0 {o->box(FL_NO_BOX);} code1 {for (int i = 128; i < 160; ++i) { bs[i] = new BankSlot (0, 0, o->w(), 15, " "); bs[i]->init(i, &what, &slot, &BankProcess_::process, (BankProcess_ *)this, bank, &nselected); }} } {} } Fl_Group modeselect { xywh {5 528 458 42} box GTK_THIN_UP_BOX labelsize 12 } { Fl_Box selectPatch { xywh {11 555 83 9} box RFLAT_BOX color 103 labelcolor 49 } Fl_Button readbutton { label SELECT callback {// setHighlight(1); removeselection();} xywh {10 534 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box renamePatch { xywh {100 555 83 9} box RFLAT_BOX color 208 labelcolor 49 } Fl_Button renamebutton { label RENAME callback {// setHighlight(5); removeselection();} xywh {100 534 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box savePatch { xywh {190 555 83 9} box RFLAT_BOX color 173 labelcolor 49 } Fl_Button writebutton { label SAVE callback {// setHighlight(2); removeselection();} xywh {190 534 85 24} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box deletPatch { xywh {280 555 83 9} box RFLAT_BOX color 88 labelcolor 49 } Fl_Button clearbutton { label DELETE callback {// setHighlight(3); removeselection();} xywh {280 534 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box swapPatch { xywh {370 555 83 9} box RFLAT_BOX color 176 labelcolor 49 } Fl_Button swapbutton { label SWAP callback {// setHighlight(4); removeselection();} xywh {370 534 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } } Fl_Text_Display insT3 { label {Engine Types Used} xywh {495 546 96 3} box NO_BOX labelsize 12 labelcolor 64 align 33 textsize 12 } Fl_Button insClose { label Close callback {// if (Fl::event_button() == 3) { if (instFrom == 2) { bankFrom = 3; Showbank(); } else if (instFrom == 4) { ; // todo open mixer panel } } instFrom = 0; // to avoid later confusion! Hide(0); saveWin(synth, instrumentuiwindow->w(), instrumentuiwindow->h(), instrumentuiwindow->x(), instrumentuiwindow->y(), false, "Bank-instrument");} tooltip {Right click: also reopen previous} xywh {665 539 70 24} box THIN_UP_BOX color 196 labelsize 12 labelcolor 64 } Fl_Group {} { xywh {468 528 151 42} box ENGRAVED_FRAME labelsize 12 labelcolor 64 } { Fl_Box addpatch { label Add xywh {475 550 46 16} box FLAT_BOX labelsize 12 labelcolor 64 align 32 code0 {o->color(add_back);} } Fl_Box subpatch { label Sub xywh {520 550 47 16} box FLAT_BOX labelsize 12 labelcolor 64 align 32 code0 {o->color(sub_back);} } Fl_Box padpatch { label Pad xywh {567 550 46 16} box FLAT_BOX color 29 labelsize 12 labelcolor 64 align 32 code0 {o->color(pad_back);} } Fl_Button {} { xywh {474 549 139 17} box THIN_UP_FRAME labelsize 12 labelcolor 64 } } } Fl_Window searchwin { label {Yoshimi : Bank Search} callback {Hide(3);} xywh {1044 153 305 485} type Double box PLASTIC_THIN_UP_BOX color 22 labelsize 12 hide resizable class ScaleTrackedWindow code0 {searchDW = o->w(); searchDH = o->h();} code1 {searchwin->size_range(searchDW, searchDH, 0, 0, 0, 0, 1);} } { Fl_Browser searchbrowse { callback {// if (!o->value()) return; int result = o->value(); if (result < 0) return; if (synth->getGuiMaster()->instrumentSingleWarning(synth->getGuiMaster()->npart, "Overwrite")) { return; } string line = string(o->text(result)); int root = string2int(line.substr(0, 3)); int bank = string2int(line.substr(5, 3)); int inst = (string2int(line.substr(10, 3))) - 1; send_data(TOPLEVEL::action::forceUpdate, MAIN::control::loadInstrumentFromBank, inst, TOPLEVEL::type::Integer, TOPLEVEL::section::main, synth->getGuiMaster()->npart, bank, root);} xywh {12 65 282 374} type Select labelsize 12 labelcolor 64 textsize 12 textcolor 64 } Fl_Button searchClose { label Close callback {// Hide(3);} xywh {228 451 65 24} color 196 labelsize 12 labelcolor 64 align 192 } Fl_Button searchT { label {Root Bank Instrument} xywh {12 40 282 4} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 6 } Fl_Text_Display noEntries { label {No Entries} xywh {70 195 177 0} labelfont 1 labelsize 30 labelcolor 129 textsize 12 hide deactivate } Fl_Group {} { xywh {25 1 210 35} labelsize 12 } { Fl_Choice searchType { label {Type:} callback {// searchbrowse->clear(); int result = o->value(); if (result >= 0) { fillBrowser(result); noEntries->hide(); } else noEntries->show();} xywh {70 15 159 20} down_box BORDER_BOX labelfont 1 labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {fillSearchChoice();} } {} } } Fl_Window bankuiwindow { label Root callback {Hide(1);} xywh {794 24 780 570} type Double labelsize 12 labelcolor 64 hide resizable class ScaleTrackedWindow code0 {o->copy_label(bank->getRootFileTitle(fetchData(0, BANK::control::selectRoot, TOPLEVEL::section::bank)).c_str());} code1 {bankDW = o->w();bankDH = o->h();} code2 {o->size_range((instDW * 8 / 10), (instDH * 8 / 10), 0,0,0,0,1);} } { Fl_Button bankroot { label Roots callback {// ShowRoot(); if ((Fl::event_button() == 3)) { rootFrom = 2; Hide(1); } else rootFrom = 0;} tooltip {Show root paths. Right click: also close this} xywh {248 5 93 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 align 128 } Fl_Button bankcurrent { label {current bank} tooltip {Show instruments in current bank} xywh {394 10 178 15} box THIN_UP_BOX down_box THIN_UP_BOX color 252 selection_color 252 labelsize 12 labelcolor 64 align 128 } Fl_Button bankinst { label Instruments callback {// instFrom = 2; ShowInst(); if (Fl::event_button() == 3) { Hide(1);}} tooltip {Show instruments in current bank. Right click: also close this} xywh {627 5 93 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 align 128 } Fl_Group bankgroup { xywh {2 30 776 499} labelsize 12 } { Fl_Group {} { xywh {4 30 192 496} labelsize 12 code0 {o->box(FL_NO_BOX);} code1 {// for (int i = 0; i < 32; ++i) { rs[i] = new RootSlot (0, 0, o->w(), 15, " "); rs[i]->init(i, &what, &slot, &RootProcess_::rootprocess, (RootProcess_ *)this, bank, &rselected); }} } {} Fl_Group {} { xywh {200 31 189 496} labelsize 12 code0 {o->box(FL_NO_BOX);} code1 {// for (int i = 32; i < 64; ++i) { rs[i] = new RootSlot (0, 0, o->w(), 15, " "); rs[i]->init(i, &what, &slot, &RootProcess_::rootprocess, (RootProcess_ *)this, bank, &rselected); }} } {} Fl_Group {} { xywh {390 30 189 496} labelsize 12 labelcolor 64 code0 {o->box(FL_NO_BOX);} code1 {// for (int i = 64; i < 96; ++i) { rs[i] = new RootSlot (0, 0, o->w(), 15, " "); rs[i]->init(i, &what, &slot, &RootProcess_::rootprocess, (RootProcess_ *)this, bank, &rselected); }} } {} Fl_Group {} { xywh {580 30 196 496} labelsize 12 code0 {o->box(FL_NO_BOX);} code1 {// for (int i = 96; i < 128; ++i) { rs[i] = new RootSlot (0, 0, o->w(), 15, " "); rs[i]->init(i, &what, &slot, &RootProcess_::rootprocess, (RootProcess_ *)this, bank, &rselected); }} } {} } Fl_Group rootmodeselect { xywh {5 528 635 42} box GTK_THIN_UP_BOX labelsize 12 } { Fl_Box rootSelectPatch { xywh {11 555 83 9} box RFLAT_BOX color 103 labelcolor 49 } Fl_Button rootreadbutton { label SELECT callback {// setRootHighlight(1); removeRootselection();} xywh {10 534 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box rootRenamePatch { xywh {100 555 83 9} box RFLAT_BOX color 208 labelcolor 49 } Fl_Button rootrenamebutton { label RENAME callback {// setRootHighlight(5); removeRootselection();} xywh {100 534 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box rootSavePatch { xywh {190 555 83 9} box RFLAT_BOX color 173 labelcolor 49 } Fl_Button rootwritebutton { label ADD callback {// setRootHighlight(2); removeRootselection();} xywh {190 534 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box rootDeletPatch { xywh {280 555 83 9} box RFLAT_BOX color 88 labelcolor 49 } Fl_Button rootclearbutton { label DELETE callback {// setRootHighlight(3); removeRootselection();} xywh {280 534 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box rootSwapPatch { xywh {370 555 83 9} box RFLAT_BOX color 176 labelcolor 49 } Fl_Button rootswapbutton { label SWAP callback {// setRootHighlight(4); removeRootselection();} xywh {370 534 85 24} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box rootImportPatch { xywh {460 555 83 9} box RFLAT_BOX color 93 labelcolor 49 } Fl_Button rootimportbutton { label IMPORT callback {// setRootHighlight(6); removeRootselection();} xywh {460 533 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } Fl_Box rootExportPatch { xywh {550 555 83 9} box RFLAT_BOX color 78 labelcolor 49 } Fl_Button rootexportbutton { label EXPORT callback {// setRootHighlight(7); removeRootselection();} xywh {550 533 85 25} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 labelfont 9 labelsize 12 labelcolor 64 } } Fl_Button bankClose { label Close callback {// Hide(1); if (Fl::event_button() == 3) { if (bankFrom == 1) { rootFrom = 2; ShowRoot(); } else if (bankFrom == 3) { instFrom = 2; ShowInst(); } } else bankFrom = 0;} tooltip {Right click: also reopen previous} xywh {672 538 70 24} box THIN_UP_BOX color 196 labelsize 12 labelcolor 64 } } Fl_Window rootuiwindow { label {Bank Root Paths} callback {Hide(2);} xywh {88 54 460 270} type Double labelsize 12 hide resizable class ScaleTrackedWindow code0 {readbankcfg();} code1 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Bank Root Paths"), UNUSED, TOPLEVEL::windowTitle)).c_str());} code2 {rootDW = o->w(); rootDH = o->h();} code3 {o->size_range(rootDW, rootDH, 0,0,0,0,1);} } { Fl_Browser rootsbrowse { callback {int tmp = o->value(); activatebutton_rootdir(tmp!=0); if (tmp) { selectedRootID = reinterpret_cast(o->data(tmp)); } changeIDbutton->value(recoverID()); oldrootID = changeIDbutton->value(); Pend->hide();} xywh {10 10 445 200} type Hold labelsize 12 labelcolor 64 textsize 12 textcolor 64 } Fl_Button addrootdirbutton { label {Add root directory...} callback {// // using 'false' here as we want to test for it // rather than automatically create it. string dirname = setfiler(synth,"Path to Bank Root dirs", "", false, TOPLEVEL::XML::Dir); if (dirname.length() < 3) return; int newdef = UNUSED; if (!collect_readData(synth, 0, BANK::isOccupiedRoot, TOPLEVEL::section::bank, 255, 255, 255, 255, 255, textMsgBuffer.push(dirname))) { if (choice(synth, "", "Yes", "No", "Directory is missing, or doesn't have at least \\n one bank with at least one instrument. \\nCreate missing entries?") != 2) return; newdef = 0; } send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::addNamedRoot, 0, TOPLEVEL::type::Write, TOPLEVEL::section::bank, newdef, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(dirname)); Pend->hide();} xywh {10 225 75 35} box GTK_THIN_UP_BOX color 198 labelsize 12 labelcolor 64 align 128 } Fl_Button removerootdirbutton { label {Remove root dir...} callback {// if (selectedRootID >= 0) { synth->bank.removeRoot(selectedRootID); synth->saveBanks(); readbankcfg(); } activatebutton_rootdir(false); rescan_for_banks(); Pend->hide();} xywh {94 225 75 35} box PLASTIC_UP_BOX color 228 labelsize 12 labelcolor 64 align 128 deactivate code0 {o->deactivate();} } Fl_Button makedefaultrootdirbutton { label {Make current} callback {// if (selectedRootID >= 0) { send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::selectRoot, selectedRootID, TOPLEVEL::type::Integer, TOPLEVEL::section::bank); banklist->value(0); } activatebutton_rootdir(false); Pend->hide();} xywh {178 225 75 35} box PLASTIC_UP_BOX color 228 labelsize 12 labelcolor 64 align 128 deactivate code0 {o->deactivate();} } Fl_Button showdefaultrootdirbutton { label {Open current} callback {// Showbank(); if (Fl::event_button() == 3) { bankFrom = 1; Hide(2); } else rootFrom = 0;} tooltip {Right click: also close this} xywh {262 225 75 35} box GTK_THIN_UP_BOX color 198 labelsize 12 labelcolor 64 align 128 } Fl_Spinner changeIDbutton { label {New ID} callback {Pend->show();} xywh {344 240 45 19} selection_color 64 labelsize 12 labelcolor 64 align 5 minimum 0 maximum 126 textsize 12 textcolor 64 deactivate code0 {oldrootID = o->value();} class WidgetSpinner } Fl_Button Pend { label Pending callback {// int tmp = changeIDbutton->value(); if (tmp == oldrootID) { o->hide(); return; } if (selectedRootID >= 0) { send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::changeRootId, tmp, TOPLEVEL::type::Integer, TOPLEVEL::section::bank, UNUSED, selectedRootID); } oldrootID = tmp; activatebutton_rootdir(false); o->hide();} tooltip {Click to set} xywh {340 220 56 18} box PLASTIC_UP_BOX color 90 labelsize 10 labelcolor 64 hide } Fl_Button rootClose { label Close callback {// if (Fl::event_button() == 3) { if (rootFrom == 2) Showbank(); } else rootFrom = 0; Hide(2);} tooltip {Right click: also reopen previous} xywh {402 225 51 35} box THIN_UP_BOX color 196 labelsize 12 labelcolor 64 } } } Function {setHighlight(int button)} {} { code {// mode = button; selectPatch->hide(); renamePatch->hide(); savePatch->hide(); deletPatch->hide(); swapPatch->hide(); switch(button) { case 1: selectPatch->show(); break; case 5: renamePatch->show(); break; case 2: savePatch->show(); break; case 3: deletPatch->show(); break; case 4: swapPatch->show(); break; }} {} } Function {setRootHighlight(int button)} {} { code {// r_mode = button; rootSelectPatch->hide(); rootRenamePatch->hide(); rootSavePatch->hide(); rootDeletPatch->hide(); rootSwapPatch->hide(); rootImportPatch->hide(); rootExportPatch->hide(); switch(button) { case 1: rootSelectPatch->show(); break; case 5: rootRenamePatch->show(); break; case 2: rootSavePatch->show(); break; case 3: rootDeletPatch->show(); break; case 4: rootSwapPatch->show(); break; case 6: rootImportPatch->show(); break; case 7: rootExportPatch->show(); break; }} {} } Function {fillSearchChoice()} {} { code {// int i = 0; string entry = type_list[i]; while (entry != "@end") { searchType->add(entry.c_str()); ++ i; entry = type_list[i]; }} {} } Function {fillBrowser(int group)} {} { code {// string line; do { line = textMsgBuffer.fetch(fetchData(0, BANK::control::findInstrumentName, TOPLEVEL::section::bank, UNUSED, UNUSED, UNUSED, group)); if (line !="@end") searchbrowse->add(line.c_str()); } while (line != "@end");} {} } Function {send_data(int action, int control, float value, int type, int part = UNUSED, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int miscmsg = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, part, kititem, engine, insert, parameter, UNUSED, miscmsg);} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED, int request = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg, request);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// //int value_int = getData->data.value; unsigned char control = getData->data.control; unsigned char kititem = getData->data.kit; //unsigned char engine= getData->data.engine; unsigned char insert = getData->data.insert; int source = getData->data.source & TOPLEVEL::action::noAction; string message = textMsgBuffer.fetch(getData->data.miscmsg); switch(control) { case BANK::control::exportBank: if (source == TOPLEVEL::action::fromGUI) alert(synth, message); break; case BANK::control::renameInstrument: if (message.find("FAILED") != string::npos) { if (source == TOPLEVEL::action::fromGUI) alert(synth, message); } else bs[insert]->copy_label(message.c_str()); break; case BANK::control::saveInstrument: if (message.find("FAILED") != string::npos) { if (source == TOPLEVEL::action::fromGUI) alert(synth, message); } else refreshinstrumentwindow(); break; case BANK::control::deleteInstrument: if (message.find("FAILED") != string::npos) { if (source == TOPLEVEL::action::fromGUI) alert(synth, message); } else rescan_for_banks(); break; case BANK::control::selectFirstInstrumentToSwap: break; case BANK::control::selectSecondInstrumentAndSwap: if (message.find("FAILED") != string::npos) if (source == TOPLEVEL::action::fromGUI) alert(synth, message); rescan_for_banks(); break; case BANK::control::selectBank: rescan_for_banks(); break; case BANK::control::renameBank: if (message.find("FAILED") != string::npos) if (source == TOPLEVEL::action::fromGUI) alert(synth, message); rescan_for_banks(); break; case BANK::control::createBank: if (message.find("FAILED") != string::npos) if (source == TOPLEVEL::action::fromGUI) alert(synth, message); readbankcfg(); rescan_for_banks(); break; case BANK::control::selectFirstBankToSwap: break; case BANK::control::selectSecondBankAndSwap: if (message.find("FAILED") != string::npos) if (source == TOPLEVEL::action::fromGUI) alert(synth, message); rescan_for_banks(); break; case BANK::control::selectRoot: readbankcfg(); rescan_for_banks(); break; case BANK::control::changeRootId: readbankcfg(); rescan_for_banks(); break; case BANK::control::addNamedRoot: readbankcfg(); rescan_for_banks(); if (kititem != UNUSED) synth->getGuiMaster()->updatepart(); break; case BANK::control::deselectRoot: readbankcfg(); rescan_for_banks(); break; case BANK::control::refreshDefaults: readbankcfg(); break; }} {} } Function {BankUI(SynthEngine *_synth)} {} { code {// synth = _synth; fnr = &RootProcess_::rootprocess; root = & synth->bank; fnc = &BankProcess_::process; bank = & synth->bank; what = 0; nselected = -1; rselected = -1; instrumentSeen = false; bankSeen = false; rootSeen = false; searchSeen = false; make_window(); r_mode = 1; mode = 1; bankS = 0; rootFrom = 0; bankFrom = 0; instFrom = 0; setHighlight(mode); setRootHighlight(r_mode);} {} } Function {~BankUI()} {return_type virtual } { code {// if (instrumentSeen) saveWin(synth, instrumentuiwindow->w(), instrumentuiwindow->h(), instrumentuiwindow->x(), instrumentuiwindow->y(), true, "Bank-instrument"); instrumentuiwindow->hide(); delete instrumentuiwindow; if (bankSeen) saveWin(synth, bankuiwindow->w(), bankuiwindow->h(), bankuiwindow->x(), bankuiwindow->y(), true, "Bank-bank"); bankuiwindow->hide(); delete bankuiwindow; if (rootSeen) saveWin(synth,rootuiwindow->w(), rootuiwindow->h(), rootuiwindow->x(), rootuiwindow->y(), true, "Bank-root"); rootuiwindow->hide(); if (searchSeen) saveWin(synth,searchwin->w(), searchwin->h(), searchwin->x(), searchwin->y(), true, "Bank-search"); searchwin->hide(); delete searchwin; delete rootuiwindow;} {} } Function {Show()} {} { code {// called from part UI rescan_for_banks(); set_bank_slot(); ShowInst(); mode = 1; removeselection(); setHighlight(mode); refreshmainwindow();} {} } Function {ShowInst()} {} { code {// int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Bank-instrument"); if (W < instDW || H < instDH) { W = instDW; H = instDH; } checkSane(X, Y, W, H, instDW, instDH); instrumentuiwindow->resize(X, Y, W, H); lastinstrumentW = 0; instrumentuiwindow->show(); instrumentSeen = true;} {} } Function {Showbank()} {} { code {// int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Bank-bank"); if (W < bankDW || H < bankDH) { W = bankDW; H = bankDH; } checkSane(X, Y, W, H, bankDW, bankDH); bankuiwindow->resize(X, Y, W, H); lastbankW = 0; bankuiwindow->show(); bankSeen = true;} {} } Function {ShowRoot()} {} { code {// int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Bank-root"); if (W < rootDW || H < rootDH) { W = rootDW; H = rootDH; } checkSane(X, Y, W, H, rootDW, rootDH); rootuiwindow->resize(X, Y, W, H); lastrootW = 0; rootuiwindow->show(); rootSeen = true;} {} } Function {ShowSearch()} {} { code {// int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Bank-search"); if (W < searchDW || H < searchDH) { W = searchDW; H = searchDH; } checkSane(X, Y, W, H, searchDW, searchDH); searchwin->resize(X, Y, W, H); if (unsearched) { fillBrowser(1); unsearched = false; } lastsearchW = 0; searchwin->show(); searchSeen = true;} {} } Function {Hide(int type = 0)} {} { code {// also called from master UI switch (type) { case 0: saveWin(synth,instrumentuiwindow->w(), instrumentuiwindow->h(), instrumentuiwindow->x(), instrumentuiwindow->y(), false, "Bank-instrument"); instrumentuiwindow->hide(); lastinstrumentW = 0; instrumentSeen = false; break; case 1: saveWin(synth, bankuiwindow->w(), bankuiwindow->h(), bankuiwindow->x(), bankuiwindow->y(), false, "Bank-bank"); bankuiwindow->hide(); lastbankW = 0; bankSeen = false; break; case 2: saveWin(synth,rootuiwindow->w(), rootuiwindow->h(), rootuiwindow->x(), rootuiwindow->y(), false, "Bank-root"); rootuiwindow->hide(); lastrootW = 0; rootSeen = false; break; case 3: saveWin(synth,searchwin->w(), searchwin->h(), searchwin->x(), searchwin->y(), false, "Bank-search"); searchwin->hide(); lastsearchW = 0; searchSeen = false; break; default: break; }} {} } Function {init(Fl_Spinner *cbwig_)} {} { code {// cbwig = cbwig_; rescan_for_banks(); unsearched = true; searchType->value(1); lastinstrumentW = 0; lastbankW = 0; lastrootW = 0; lastsearchW = 0;} {} } Function {process()} {return_type void } { code {// int slot = this->slot; int curPart = collect_readData(synth, 0, MAIN::control::partNumber, TOPLEVEL::main); // make sure it's the right one! string thisname = textMsgBuffer.fetch(fetchData(0, BANK::control::readInstrumentName, TOPLEVEL::section::bank, UNUSED, UNUSED, UNUSED, slot)); bool slotFilled = (thisname > "!"); if ((what == 1 || what == 3) && mode == 1 && slotFilled) { if (synth->getGuiMaster()->instrumentSingleWarning(synth->getGuiMaster()->npart, "Overwrite")) { return; } send_data(TOPLEVEL::action::forceUpdate, MAIN::control::loadInstrumentFromBank, slot, TOPLEVEL::type::Integer, TOPLEVEL::section::main, synth->getGuiMaster()->npart); // Reads from slot if (synth->getGuiMaster()->virkeyboard->virkeyboardwindow->visible()) synth->getGuiMaster()->virkeyboard->virkeys->take_focus(); if (what == 3) Hide(0); return; } if (mode == 5) { // Rename slot if (slotFilled) { string newname = input_text(synth, "Instrument name:", thisname); if (newname == DEFAULT_NAME) alert(synth, "Can't use name of default sound"); else if (newname != thisname) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::renameInstrument, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::bank, UNUSED, UNUSED, slot, UNUSED, synth->textMsgBuffer.push(newname)); } mode = 1; } if (mode == 2) { // save(write) to slot (choices reversed for 'No' priority) bool doit = true; if (synth->part[curPart]->Pname == DEFAULT_NAME) { alert(synth, "Can't store instrument with default name"); mode = 1; doit = false; } else if (synth->part[curPart]->info.Ptype == 0) { if (choice(synth, "", "Save", "Cancel", "Please set instrument type before saving.\\nCopyright info also recommended.") != 2) doit = false; } else if (slotFilled) { if (choice(synth, "", "Yes", "No", "Overwrite the slot no." + to_string(slot + 1) + "?") < 2) { mode = 1; doit = false; } } if (doit) { send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::saveInstrument, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::bank, UNUSED, UNUSED, slot); mode = 1; } } if (mode == 3) { // Clears the slot (choices reversed for 'No' priority) if (slotFilled) { if (choice(synth, "", "Yes", "No", "Clear the slot no. " + to_string(slot + 1) + "?") > 1) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::deleteInstrument, slot, TOPLEVEL::type::Write, TOPLEVEL::section::bank); } mode = 1; } if (mode == 4) { // swap bool done = false; if (what == 1 && nselected >= 0) { send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::selectSecondInstrumentAndSwap, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::bank, UNUSED, UNUSED, slot); nselected = -1; mode = 1; done = true; } if ((nselected < 0 || what == 2) && !done) { send_data(TOPLEVEL::action::lowPrio, BANK::control::selectFirstInstrumentToSwap, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::bank, UNUSED, UNUSED, slot); nselected = slot; } } setHighlight(mode); if (mode != 4) refreshinstrumentwindow();} {} } Function {rootprocess()} {return_type void } { code {// unsigned int slot = this->slot; int rt = fetchData(0, BANK::control::selectRoot, TOPLEVEL::section::bank); int bt = fetchData(0, BANK::control::selectBank, TOPLEVEL::section::bank); string thisname = bank->getBankName(slot, rt); if ((what == 1 || what == 3) && r_mode == 1 && !thisname.empty()) { // Selects from slot send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::selectBank, slot, TOPLEVEL::type::Integer, TOPLEVEL::section::bank); instFrom = 2; if (what == 3) Hide(1); cbwig->do_callback(); // what does this do? ShowInst(); set_bank_slot(); // needed by 'old' menu selector refreshinstrumentwindow(); return; } if (r_mode == 7) { string dirname = setfiler(synth,"Path for Bank Export", thisname, true, TOPLEVEL::XML::Bank); if (dirname.length() > 2) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::exportBank, slot, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string(dirname))); r_mode = 1; } if (r_mode == 6) { string dirname = setfiler(synth,"Bank to Import", "", false, TOPLEVEL::XML::Bank); if (dirname.length() > 2) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::importBank, slot, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string(dirname))); r_mode = 1; } if (r_mode == 5 && !thisname.empty()) { // Rename bank string tmp = input_text(synth, "Bank name:", thisname); if (tmp != thisname) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::renameBank, slot, TOPLEVEL::type::Integer, TOPLEVEL::section::bank, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(tmp)); r_mode = 1; } if (r_mode == 2) { // Create new bank and save to file if (!thisname.empty()) { r_mode = 1; alert(synth, "Bank " + to_string(slot) + " already in use for " + thisname); return; } string dirname; dirname = input_text(synth, "New empty Bank:", ""); if (!dirname.empty()) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::createBank, slot, TOPLEVEL::type::Integer | TOPLEVEL::type::Write, TOPLEVEL::section::bank, slot, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(dirname)); r_mode = 1; refreshmainwindow(); } if (r_mode == 3) { if(!thisname.empty()) { if (choice(synth, "", "Yes", "No", "Completely clear " + thisname + "?") > 1) { int clearit = true; int count = bank->getBankSize(slot, rt); if (count > 1) clearit = choice(synth, "Yes", "", "STOP!", "There are " + to_string(count) + " instruments in this bank\\nThey will be permanently deleted") == 3; if (clearit) { send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::deleteBank, slot, TOPLEVEL::type::Integer, TOPLEVEL::section::main); } } } refreshmainwindow(); r_mode = 1; } if (r_mode == 4) { // Swap banks bool done = false; if (what == 1 && rselected >= 0) { send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::selectSecondBankAndSwap, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::bank, slot); rselected = -1; rescan_for_banks(); r_mode = 1; done = true; } if ((rselected < 0 || what == 2) && !done) { send_data(TOPLEVEL::action::lowPrio, BANK::control::selectFirstBankToSwap, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::bank, slot); rselected = slot; rs[slot]->rootrefresh(bt, rt); } } setRootHighlight(r_mode);} {} } Function {refreshmainwindow()} {} { code {// int bk = fetchData(0, BANK::control::selectBank, TOPLEVEL::section::bank); int rt = fetchData(0, BANK::control::selectRoot, TOPLEVEL::section::bank); int last = fetchData(0, BANK::control::lastSeenInBank, TOPLEVEL::section::bank); instrumentuiwindow->copy_label(bank->getBankFileTitle(rt, bk).c_str()); bankuiwindow->copy_label(bank->getRootFileTitle(rt).c_str()); for (int i = 0; i < MAX_INSTRUMENTS_IN_BANK; ++i) bs[i]->refresh(bk, rt, last); for (int i = 0; i < MAX_BANKS_IN_ROOT; ++i) rs[i]->rootrefresh(bk, rt);} {} } Function {refreshinstrumentwindow()} {} { code {// int bk = fetchData(0, BANK::control::selectBank, TOPLEVEL::section::bank); int rt = fetchData(0, BANK::control::selectRoot, TOPLEVEL::section::bank); int last = fetchData(0, BANK::control::lastSeenInBank, TOPLEVEL::section::bank); //std::cout << "here ins " << int(last >> 15) << " bank " << int((last >> 8) & 0x7f) << " root " << int(last & 0x7f) << std::endl; for (int i = 0; i < MAX_INSTRUMENTS_IN_BANK; ++i) { bs[i]->refresh(bk, rt, last); }} {} } Function {theme()} {} { code {// if (instrumentSeen) { if(instrumentuiwindow->visible()) { lastinstrumentW = 0; instrumentRtext(); } } if (searchSeen) { if(searchwin->visible()) { lastsearchW = 0; searchRtext(); } } if (bankSeen) { if(bankuiwindow->visible()) { lastbankW = 0; bankRtext(); } } if (rootSeen) { if(rootuiwindow->visible()) { lastrootW = 0; rootRtext(); } } ;} {} } Function {wincheck()} {} { code {// if (instrumentSeen) instrumentRtext(); if (searchSeen) searchRtext(); if (bankSeen) bankRtext(); if (rootSeen) rootRtext();} {} } Function {instrumentRtext()} {} { code {// if (lastinstrumentW == instrumentuiwindow->w()) return; lastinstrumentW = instrumentuiwindow->w(); float dScale = instrumentuiwindow->w() / float(instDW); if (dScale < 0.2f) dScale = 0.2f; int size = int(12 * dScale); B_search->labelsize(size); insRoots->labelsize(size); insBanks->labelsize(size); insT1->labelsize(size); insT2->labelsize(size); writebutton->labelsize(size); readbutton->labelsize(size); clearbutton->labelsize(size); swapbutton->labelsize(size); renamebutton->labelsize(size); insT3->labelsize(size); addpatch->labelsize(size); subpatch->labelsize(size); padpatch->labelsize(size); insClose->labelsize(size); banklist->textsize(size); int lineX; int lineY; for (int i = 0; i < MAX_INSTRUMENTS_IN_BANK; ++i) { if (i < 32) { lineX = int(5 * dScale); } else if (i < 64) { lineX = int(160 * dScale); } else if (i < 96) { lineX = int(315 * dScale); } else if (i < 128) { lineX = int(470 * dScale); } else { lineX = int(625 * dScale); } lineY = int((((i & 31) * 15.4f) + 33) * dScale); bs[i]->resize(lineX, lineY , int(152 * dScale), 15 * dScale); bs[i]->labelsize(int(13 * dScale)); } instrumentuiwindow->redraw();} {} } Function {searchRtext()} {} { code {// if (lastsearchW == searchwin->w()) return; lastsearchW = searchwin->w(); float dScale = searchwin->w() / float(searchDW); if (dScale < 0.2f) dScale = 0.2f; int size = int(13 * dScale); searchT->labelsize(size); searchClose->labelsize(size); searchType->labelsize(size); searchType->textsize(size); searchbrowse->textsize(size); noEntries->labelsize(int(30 * dScale)); searchwin->redraw();} {} } Function {bankRtext()} {} { code {// if (lastbankW == bankuiwindow->w()) return; lastbankW = bankuiwindow->w(); float dScale = bankuiwindow->w() / float(bankDW); if (dScale < 0.2f) dScale = 0.2f; int size = int(12 * dScale); bankroot->labelsize(size); bankinst->labelsize(size); bankcurrent->labelsize(size); rootwritebutton->labelsize(size); rootreadbutton->labelsize(size); rootclearbutton->labelsize(size); rootswapbutton->labelsize(size); rootrenamebutton->labelsize(size); rootimportbutton->labelsize(size); rootexportbutton->labelsize(size); bankClose->labelsize(size); int lineX; int lineY; for (int i = 0; i < MAX_BANKS_IN_ROOT; ++i) { if (i < 32) { lineX = int(6 * dScale); } else if (i < 64) { lineX = int(200 * dScale); } else if (i < 96) { lineX = int(393 * dScale); } else { lineX = int(586 * dScale); } lineY = int((((i & 31) * 15.4f) + 33) * dScale); rs[i]->resize(lineX, lineY , int(188 * dScale), 15 * dScale); rs[i]->labelsize(int(13 * dScale) - 1); } bankuiwindow->redraw();} {} } Function {rootRtext()} {} { code {// if (lastrootW == rootuiwindow->w()) return; lastrootW = rootuiwindow->w(); float dScale = rootuiwindow->w() / float(rootDW); if (dScale < 0.2f) dScale = 0.2f; int size = int(12 * dScale); addrootdirbutton->labelsize(size); removerootdirbutton->labelsize(size); makedefaultrootdirbutton->labelsize(size); showdefaultrootdirbutton->labelsize(size); Pend->labelsize(int(10 * dScale)); changeIDbutton->labelsize(size); changeIDbutton->textsize(size); changeIDbutton->redraw(); rootClose->labelsize(size); rootsbrowse->textsize(size); rootuiwindow->redraw();} {} } Function {refreshbankslot(int ins, int bk, int rt, int last)} {} { code {// bs[ins]->refresh(bk, rt, last);} {} } Function {removeselection()} {} { code {// if (nselected >= 0) { int ns = nselected; nselected = -1; bs[ns]->refresh(fetchData(0, BANK::control::selectBank, TOPLEVEL::section::bank), fetchData(0, BANK::control::selectRoot, TOPLEVEL::section::bank), fetchData(0, BANK::control::lastSeenInBank, TOPLEVEL::section::bank)); }} {} } Function {removeRootselection()} {} { code {// if (rselected >= 0) { int rsel = rselected; rselected = -1; rs[rsel]->rootrefresh(fetchData(0, BANK::control::selectBank, TOPLEVEL::section::bank), fetchData(0, BANK::control::selectRoot, TOPLEVEL::section::bank)); }} {} } Function {rescan_for_banks()} {} { code {// banklist->clear(); const BankEntryMap &banks = bank->getBanks(fetchData(0, BANK::control::selectRoot, TOPLEVEL::section::bank)); BankEntryMap::const_iterator it; for (it = banks.begin(); it != banks.end(); ++it) { if (!it->second.dirname.empty()) { int n = banklist->add((asString(it->first) + ". " + it->second.dirname).c_str(), (const char *)0, (Fl_Callback*)0, reinterpret_cast(it->first)); if (it->first == fetchData(0, BANK::control::selectBank, TOPLEVEL::section::bank)) { banklist->value(n); // ensure correct bank in list } } } refreshmainwindow();} {} } Function {set_bank_slot()} {} { code {// size_t curID = fetchData(0, BANK::control::selectBank, TOPLEVEL::section::bank); const Fl_Menu_Item *curItem = 0; for (int i = 0; i < banklist->size(); i++) { const Fl_Menu_Item *item = banklist->menu() + i; if (item->label()) { if (curID == reinterpret_cast(item->user_data())) { curItem = item; } } } if (curItem) { banklist->value(curItem); } else { banklist->value(0); }} {} } Function {activatebutton_rootdir(bool active)} {} { code {// if (active) { removerootdirbutton->activate(); makedefaultrootdirbutton->activate(); changeIDbutton->activate(); } else { removerootdirbutton->deactivate(); makedefaultrootdirbutton->deactivate(); changeIDbutton->deactivate(); Pend->hide(); }} {} } Function {readbankcfg()} {} { code {// string tmp; rootsbrowse->clear(); const RootEntryMap &roots = synth->bank.getRoots(); RootEntryMap::const_iterator it; for (it = roots.begin(); it != roots.end(); ++it) { if (!it->second.path.empty()) { tmp = asString(it->first) + ". " + it->second.path; if (it->first == fetchData(0, BANK::control::selectRoot, TOPLEVEL::section::bank)) { tmp += " *"; } rootsbrowse->add(tmp.c_str(), reinterpret_cast(static_cast(it->first))); } }} {} } Function {recoverID()} {return_type int } { code {// if (selectedRootID >= 0) { return selectedRootID; } return 0;} {} } decl {BankSlot *bs[MAX_INSTRUMENTS_IN_BANK];} {private local } decl {RootSlot *rs[MAX_BANKS_IN_ROOT];} {private local } decl {int slot, what; // "what" = what button is pressed} {private local } decl {int mode, r_mode, nselected, rselected;} {private local } decl {void (BankProcess_::* fnc)(void);} {private local } decl {void (RootProcess_::* fnr)(void);} {private local } decl {Fl_Spinner *cbwig;} {public local } decl {SynthEngine *synth;} {private local } decl {int bankS;} {private local } decl {long selectedRootID;} {private local } decl {int oldrootID;} {private local } decl {string rootuiwindowlabel;} {private local } decl {int rootFrom;} {private local } decl {bool rootSeen;} {private local } decl {int rootDW;} {private local } decl {int lastrootW;} {private local } decl {int rootDH;} {private local } decl {int bankFrom;} {private local } decl {int lastbankW;} {private local } decl {int bankDW;} {private local } decl {int bankDH;} {private local } decl {bool bankSeen;} {private local } decl {int instFrom;} {private local } decl {int instDW;} {private local } decl {int instDH;} {private local } decl {int lastinstrumentW;} {private local } decl {bool instrumentSeen;} {private local } decl {bool unsearched;} {public local } decl {int searchDW;} {private local } decl {int searchDH;} {private local } decl {int lastsearchW;} {private local } decl {bool searchSeen;} {private local } } yoshimi-2.3.5.1/src/UI/ConfigUI.fl000066400000000000000000002641321506652756400164630ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0403 header_name {.h} code_name {.cpp} decl {\#include } {public local } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014 -2024, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. } {selected in_source in_header } decl {\#include } {public local } decl {\#include "Misc/Config.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {private local } decl {\#include "UI/WidgetCheckButton.h"} {public global } decl {\#include "UI/WidgetSpinner.h"} {public global } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } decl {\#include "Misc/Bank.h"} {private local } decl {\#include "MasterUI.h"} {private local } decl {\#include "Misc/FileMgrFuncs.h"} {private local } decl {\#include "Misc/NumericFuncs.h"} {private local } decl {\#include "Misc/FormatFuncs.h"} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } class ConfigUI {} { Function {isLV2()} {return_type bool } { code {return synth->getRuntime().isLV2;} {} } Function {make_window()} {} { Fl_Window configwindow { label {Yoshimi Settings} callback {close->do_callback();} xywh {578 67 390 330} type Double hide resizable class ScaleTrackedWindow code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Settings"), UNUSED, TOPLEVEL::windowTitle)).c_str());} code1 {if (isLV2()){jackTab->deactivate();alsaTab->deactivate();}} code2 {confDW = o->w();confDH = o->h();} code3 {o->size_range(confDW, confDH, 0, 0, 0, 0, 1);} } { Fl_Button Tab1 { label {&Main Settings} callback {mainTab->show(); patch1->show(); patch2->hide(); patch3->hide(); patch4->hide(); patch5->hide(); patch6->hide(); switchesTab->hide(); jackTab->hide(); alsaTab->hide(); midiTab->hide(); themeTab->hide();} xywh {5 5 91 22} box THIN_UP_FRAME selection_color 47 labelsize 12 labelcolor 64 } Fl_Button Tab2 { label {&Switches} callback {switchesTab->show(); patch2->show(); patch1->hide(); patch3->hide(); patch4->hide(); patch5->hide(); patch6->hide(); mainTab->hide(); jackTab->hide(); alsaTab->hide(); midiTab->hide(); themeTab->hide();} xywh {98 5 66 22} box THIN_UP_FRAME selection_color 47 labelsize 12 labelcolor 64 } Fl_Button Tab3 { label {&Jack} callback {jackTab->show(); patch3->show(); patch1->hide(); patch2->hide(); patch4->hide(); patch5->hide(); patch6->hide(); mainTab->hide(); switchesTab->hide(); alsaTab->hide(); midiTab->hide(); themeTab->hide();} xywh {166 5 38 22} box THIN_UP_FRAME selection_color 47 labelsize 12 labelcolor 64 } Fl_Button Tab4 { label {&Alsa} callback {alsaTab->show(); patch4->show(); patch1->hide(); patch2->hide(); patch3->hide(); patch5->hide(); patch6->hide(); mainTab->hide(); switchesTab->hide(); jackTab->hide(); midiTab->hide(); themeTab->hide();} xywh {206 5 38 22} box THIN_UP_FRAME selection_color 47 labelsize 12 labelcolor 64 } Fl_Button Tab5 { label {MIDI &CCs} callback {midiTab->show(); patch5->show(); patch1->hide(); patch2->hide(); patch3->hide(); patch4->hide(); patch6->hide(); mainTab->hide(); switchesTab->hide(); jackTab->hide(); alsaTab->hide(); themeTab->hide();} xywh {246 5 58 22} box THIN_UP_FRAME selection_color 47 labelsize 12 labelcolor 64 } Fl_Button Tab6 { label {&Theme} callback {themeTab->show(); patch6->show(); patch1->hide(); patch2->hide(); patch3->hide(); patch4->hide(); patch5->hide(); mainTab->hide(); switchesTab->hide(); jackTab->hide(); alsaTab->hide(); midiTab->hide(); fillThemes(); ;} xywh {305 5 58 22} box THIN_UP_FRAME selection_color 47 labelsize 12 labelcolor 64 } Fl_Group configTabs { xywh {5 5 385 298} labelcolor 64 } { Fl_Group mainTab {open xywh {5 25 382 277} box THIN_UP_BOX labelsize 12 labelcolor 64 hide } { Fl_Choice buff_size { label {* Internal Buffer Size} callback {// send_data(0, CONFIG::control::bufferSize, 16 << o->value(), TOPLEVEL::type::Integer);} tooltip {Number of samples. Smaller has more accurate internal timings but this may change some sounds.} xywh {245 34 105 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("16");o->add("32");o->add("64");o->add("128");o->add("256");o->add("512");o->add("1024");o->add("2048");o->add("4096");o->add("8192");} code1 {o->value(func::bitFindHigh(synth->getRuntime().buffersize) - 4);} code2 {//if (isLV2()) o->deactivate();} } {} Fl_Choice osc_size { label {* AddSynth Oscillator Size} callback {// send_data(0, CONFIG::control::oscillatorSize, 256 << o->value(), TOPLEVEL::type::Integer);} tooltip {ADSynth Oscillator Size (samples)} xywh {245 58 105 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("256");o->add("512");o->add("1024");o->add("2048");o->add("4096");o->add("8192");o->add("16384");} code1 {o->value(func::bitFindHigh(synth->getRuntime().oscilsize) - 8);} } {} Fl_Choice pad_interpol { label {PadSynth Interpolation} callback {// send_data(0, CONFIG::control::padSynthInterpolation, o->value(), TOPLEVEL::type::Integer);} xywh {245 82 105 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("Linear(fast)");o->add("Cubic(slow)");} code1 {o->value(synth->getRuntime().Interpolation);} } {} Fl_Choice handlePadSynthBuild { label {PadSynth Wavetable Build Mode} callback {// send_data(0, CONFIG::control::handlePadSynthBuild, o->value(), TOPLEVEL::type::Integer);} tooltip {How to rebuild wavetable after changes: Trigger manually and mute part (legacy), build in background and activate when ready, or automatically trigger background build on each parameter change (expensive)} xywh {245 106 105 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("Muted");o->add("Background");o->add("Auto-Apply");} code1 {o->value(synth->getRuntime().handlePadSynthBuild);} } {} Fl_Choice v_keyboard { label {Virtual Keyboard Layout} callback {// send_data(0, CONFIG::control::virtualKeyboardLayout, o->value(), TOPLEVEL::type::Integer);} xywh {245 130 105 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("QWERTY");o->add("Dvorak");o->add("QWERTZ");o->add("AZERTY");} code1 {o->value(synth->getRuntime().virKeybLayout);} } {} Fl_Choice reports { label {Send reports to:} callback {// send_data(TOPLEVEL::action::forceUpdate, CONFIG::control::reportsDestination, o->value(), TOPLEVEL::type::Integer);} tooltip {Some system errors always go to stdout} xywh {200 178 150 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("stdout");o->add("Console Window");} code1 {o->value(synth->getRuntime().toConsole);} } {} Fl_Counter logText { label {Console text Size} callback {// send_data(0, CONFIG::control::logTextSize, o->value(), TOPLEVEL::type::Integer); synth->getGuiMaster()->yoshiLog->setLogText(o->value());} tooltip {Console Font Size} xywh {260 202 90 20} type Simple labelsize 12 labelcolor 64 align 4 minimum 11 maximum 100 step 1 value 12 textfont 1 textsize 12 textcolor 64 code1 {o->value(synth->getRuntime().consoleTextSize);} code2 {if (synth->getRuntime().toConsole) o->activate(); else o->deactivate();} } Fl_Counter compression { label {XML Compression Level} callback {// send_data(0, CONFIG::control::XMLcompressionLevel, o->value(), TOPLEVEL::type::Integer);} tooltip {gzip compression level (0 - uncompressed)} xywh {260 154 90 20} type Simple labelsize 12 labelcolor 64 align 4 minimum 0 maximum 9 step 1 textfont 1 textsize 12 textcolor 64 code0 {o->value(synth->getRuntime().gzipCompression);} code1 {if (current_ID != 0) o->hide();} } Fl_Choice instrument { label {Saved Instrument Format} callback {// send_data(0, CONFIG::control::savedInstrumentFormat, o->value() + 1, TOPLEVEL::type::Integer);} tooltip {Yoshimi format includes Controllers and Humanise} xywh {200 226 150 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("Legacy");o->add("Yoshimi");o->add("Both");} code1 {o->value(synth->getRuntime().instrumentFormat - 1);} } {} Fl_Choice PanelLayout { label {Mixer Panel Layout} callback {// int style = 2 - int(o->value()); synth->getGuiMaster()->changepanelstyle(style, true);} tooltip {Select single row or compact format} xywh {200 250 150 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("2 row x 8 entries");o->add("1 row x 16 entries");} } {} Fl_Box settingsNote { label {* Changing these settings requires a restart} xywh {38 276 306 17} labelfont 1 labelsize 12 labelcolor 64 align 128 code0 {if (current_ID != 0) o->hide();} } } Fl_Group switchesTab { xywh {5 25 382 277} box THIN_UP_BOX labelsize 12 labelcolor 64 } { Fl_Check_Button bankHighlight { label {Enable Bank Highlight} callback {// send_data(0, CONFIG::control::enableHighlight, o->value(), TOPLEVEL::type::Integer);} tooltip {Show the last patch fetched from or saved to a bank} xywh {190 40 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().bankHighlight);} class Fl_Check_Button2 } Fl_Check_Button partReports { label {Enable Part Reports} callback {// send_data(0, CONFIG::control::enablePartReports, o->value(), TOPLEVEL::type::Integer);} tooltip {Warn if any instrument could be accidentally changed} xywh {220 40 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 8 code0 {o->value(synth->getRuntime().enablePartReports);} class Fl_Check_Button2 } Fl_Check_Button nonFatal { label {Hide Non-essential Reports} callback {// send_data(0, CONFIG::control::hideNonFatalErrors, o->value(), TOPLEVEL::type::Integer);} xywh {190 60 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().hideErrors);} code1 {if (isLV2()) o->deactivate();} class Fl_Check_Button2 } Fl_Check_Button showSplash { label {Show Splash Screen} callback {// send_data(0, CONFIG::control::showSplash, o->value(), TOPLEVEL::type::Integer);} xywh {190 80 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().showSplash);} code1 {if (current_ID != 0) o->hide(); else if (isLV2()) o->deactivate();} class Fl_Check_Button2 } Fl_Check_Button logXML { label {Log XML Headers} callback {// send_data(0, CONFIG::control::logXMLheaders, o->value(), TOPLEVEL::type::Integer);} xywh {190 100 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().logXMLheaders);} code1 {if (isLV2()) o->deactivate();} class Fl_Check_Button2 } Fl_Check_Button logTimes { label {Log Load times} callback {// send_data(0, CONFIG::control::logInstrumentLoadTimes, o->value(), TOPLEVEL::type::Integer);} xywh {190 120 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().showTimes);} class Fl_Check_Button2 } Fl_Check_Button saveAllXML { label {Retain all Data} callback {// send_data(0, CONFIG::control::saveAllXMLdata, o->value(), TOPLEVEL::type::Integer);} tooltip {Include all data in XML files, even inactive settings} xywh {190 140 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().xmlmax);} class Fl_Check_Button2 } Fl_Check_Button enableGUI { label {* Enable GUI} callback {// int tmp = o->value(); int doit = true; if (tmp == 0) doit = choice(synth, "", "Yes", "No", "Are you sure you want to disable the GUI?\\nThis can only be restored via the command line.") > 1; if (doit) send_data(0, CONFIG::control::enableGUI, o->value(), TOPLEVEL::type::Integer); else o->value(1);} tooltip {Enable starting with this graphical interface} xywh {190 160 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().storedGui);} code1 {if (current_ID != 0) o->hide(); else if (isLV2()) o->deactivate();} class Fl_Check_Button2 } Fl_Check_Button enableCLI { label {* Enable CLI} callback {// send_data(0, CONFIG::control::enableCLI, o->value(), TOPLEVEL::type::Integer);} tooltip {Enable starting with interactive command line interface} xywh {190 180 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().storedCli);} code1 {if (current_ID != 0) o->hide(); else if (isLV2()) o->deactivate();} class Fl_Check_Button2 } Fl_Check_Button enableAuto { label {Enable Auto Instance} callback {// send_data(0, CONFIG::control::enableAutoInstance, o->value(), TOPLEVEL::type::Integer);} tooltip {Allow main instance to start all those open when last closed.} xywh {190 200 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().autoInstance);} code1 {if (current_ID != 0) o->hide(); else if (isLV2()) o->deactivate();} class Fl_Check_Button2 } Fl_Check_Button singleMaster { label {* Enable Single Master} callback {// send_data(0, CONFIG::control::enableSinglePath, o->value(), TOPLEVEL::type::Integer);} tooltip {Redirect new start from desktop to create new instance instead.} xywh {190 220 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(fetchData(0, CONFIG::control::enableSinglePath, TOPLEVEL::section::config));} code1 {if (current_ID != 0) o->hide(); else if (isLV2()) o->deactivate();} class Fl_Check_Button2 } Fl_Check_Button setDefaultState { label {* Start With Default State} callback {// send_data(0, CONFIG::control::defaultStateStart, o->value(), TOPLEVEL::type::Integer);} tooltip {If you change this you must re-save the default state or when that loads it will revert to the previous value} xywh {190 250 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().loadDefaultState);} code1 {if (isLV2()) o->deactivate();} class Fl_Check_Button2 } Fl_Group {} { tooltip {When locked new entries will not not be added or change the list order} xywh {230 70 130 180} box EMBOSSED_FRAME } { Fl_Text_Display historyLocks { label {History Locks} xywh {278 110 50 1} box NO_BOX labelsize 12 labelcolor 64 align 129 textsize 12 textcolor 64 } Fl_Check_Button H_instrument { label Instrument callback {// send_data(TOPLEVEL::action::lowPrio, CONFIG::control::historyLock, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::config,TOPLEVEL::XML::Instrument);} xywh {240 120 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 8 code0 {o->value(_SYS_::F2B(fetchData(0, CONFIG::control::historyLock, TOPLEVEL::section::config, TOPLEVEL::XML::Instrument, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, TOPLEVEL::action::lowPrio)));} class Fl_Check_Button2 } Fl_Check_Button H_patchset { label {Patch Set} callback {// send_data(TOPLEVEL::action::lowPrio, CONFIG::control::historyLock, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::config,TOPLEVEL::XML::Patch);} xywh {240 140 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 8 code0 {o->value(_SYS_::F2B(fetchData(0, CONFIG::control::historyLock, TOPLEVEL::section::config, TOPLEVEL::XML::Patch, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, TOPLEVEL::action::lowPrio)));} class Fl_Check_Button2 } Fl_Check_Button H_scale { label Scale callback {// send_data(TOPLEVEL::action::lowPrio, CONFIG::control::historyLock, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::config,TOPLEVEL::XML::Scale);} xywh {240 160 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 8 code0 {o->value(_SYS_::F2B(fetchData(0, CONFIG::control::historyLock, TOPLEVEL::section::config, TOPLEVEL::XML::Scale, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, TOPLEVEL::action::lowPrio)));} class Fl_Check_Button2 } Fl_Check_Button H_state { label State callback {// send_data(TOPLEVEL::action::lowPrio, CONFIG::control::historyLock, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::config,TOPLEVEL::XML::State);} xywh {240 180 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 8 code0 {o->value(_SYS_::F2B(fetchData(0, CONFIG::control::historyLock, TOPLEVEL::section::config, TOPLEVEL::XML::State, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, TOPLEVEL::action::lowPrio)));} class Fl_Check_Button2 } Fl_Check_Button H_vector { label Vector callback {// send_data(TOPLEVEL::action::lowPrio, CONFIG::control::historyLock, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::config,TOPLEVEL::XML::Vector);} xywh {240 200 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 8 code0 {o->value(_SYS_::F2B(fetchData(0, CONFIG::control::historyLock, TOPLEVEL::section::config, TOPLEVEL::XML::Vector, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, TOPLEVEL::action::lowPrio)));} class Fl_Check_Button2 } Fl_Check_Button H_mlearn { label {Midi Learn} callback {// send_data(TOPLEVEL::action::lowPrio, CONFIG::control::historyLock, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::config,TOPLEVEL::XML::MLearn);} xywh {240 220 27 25} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 8 code0 {o->value(_SYS_::F2B(fetchData(0, CONFIG::control::historyLock, TOPLEVEL::section::config, TOPLEVEL::XML::MLearn, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, TOPLEVEL::action::lowPrio)));} class Fl_Check_Button2 } } Fl_Box switchesNote { label {* Changing these settings requires a restart} xywh {38 276 306 17} labelfont 1 labelsize 12 labelcolor 64 align 128 } } Fl_Group jackTab { xywh {5 25 382 277} box THIN_UP_BOX labelsize 12 labelcolor 64 hide } { Fl_Input jackSource { label {Jack MIDI Source} callback {// string tmp = string(o->value()); send_data(TOPLEVEL::action::lowPrio, CONFIG::control::jackMidiSource, 0, TOPLEVEL::type::Integer, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(tmp));} tooltip {Device Jack tries to connect to for input.} xywh {195 62 120 22} labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->value(synth->getRuntime().jackMidiDevice.c_str());} } Fl_Check_Button jackMidi { label {Set as preferred MIDI} callback {// send_data(TOPLEVEL::action::forceUpdate, CONFIG::control::jackPreferredMidi, o->value(), TOPLEVEL::type::Integer);} xywh {195 88 37 26} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {if (synth->getRuntime().midiEngine == jack_midi) o->value(1);} class Fl_Check_Button2 } Fl_Input jackServer { label {Jack Server} callback {// string tmp = string(o->value()); send_data(TOPLEVEL::action::lowPrio, CONFIG::control::jackServer, 0, TOPLEVEL::type::Integer, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(tmp));} tooltip {Name of the jack server to connect to - default, ...} xywh {195 182 120 22} labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->value(synth->getRuntime().jackServer.c_str());} } Fl_Check_Button jackAudio { label {Set as preferred audio} callback {// send_data(TOPLEVEL::action::forceUpdate, CONFIG::control::jackPreferredAudio, o->value(), TOPLEVEL::type::Integer);} xywh {195 209 37 26} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {if (synth->getRuntime().audioEngine == jack_audio) o->value(1);} class Fl_Check_Button2 } Fl_Check_Button connectJackAudio { label {Autoconnect audio} callback {// send_data(0, CONFIG::control::jackAutoConnectAudio, o->value(), TOPLEVEL::type::Integer);} xywh {195 233 37 26} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().connectJackaudio);} class Fl_Check_Button2 } Fl_Box jackNote { label {Changing settings requires a restart} xywh {60 276 267 17} labelfont 1 labelsize 12 labelcolor 64 align 128 } } Fl_Group alsaTab { xywh {5 25 382 277} box THIN_UP_BOX labelsize 12 labelcolor 64 hide } { Fl_Choice alsaType { label {Alsa Connection Type} callback {if (o->value() == 0) // fixed alsaSource->activate(); else alsaSource->deactivate(); send_data (0, CONFIG::control::alsaMidiType, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::config);} xywh {195 45 120 22} box DOWN_BOX down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("Fixed");o->add("Search");o->add("External");} } {} Fl_Input alsaSource { label {Alsa MIDI Source} callback {// string tmp = string(o->value()); send_data(TOPLEVEL::action::lowPrio, CONFIG::control::alsaMidiSource, 0, TOPLEVEL::type::Integer, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(tmp));} tooltip {Device Alsa tries to connect to for input.} xywh {195 80 120 22} labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->value(synth->getRuntime().alsaMidiDevice.c_str());} } Fl_Check_Button alsaMidi { label {Set as preferred MIDI} callback {// send_data(TOPLEVEL::action::forceUpdate, CONFIG::control::alsaPreferredMidi, o->value(), TOPLEVEL::type::Integer);} xywh {195 110 37 26} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {if (synth->getRuntime().midiEngine == alsa_midi) o->value(1);} class Fl_Check_Button2 } Fl_Input alsaDevice { label {Alsa Audio Device} callback {// string tmp = string(o->value()); send_data(TOPLEVEL::action::lowPrio, CONFIG::control::alsaAudioDevice, 0, TOPLEVEL::type::Integer, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(tmp));} tooltip {Alsa audio device - default, hw:0, ...} xywh {195 143 120 22} labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->value(synth->getRuntime().alsaAudioDevice.c_str());} } Fl_Choice alsaSamplerate { label {Sample Rate} callback {// send_data(0, CONFIG::control::alsaSampleRate, o->value(), TOPLEVEL::type::Integer);} xywh {195 199 80 22} down_box BORDER_BOX labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("192000");o->add("96000");o->add("48000");o->add("44100");} code1 {o->value(convertSrate(synth->getRuntime().samplerate));} } {} Fl_Check_Button alsaAudio { label {Set as preferred audio} callback {// send_data(TOPLEVEL::action::forceUpdate, CONFIG::control::alsaPreferredAudio, o->value(), TOPLEVEL::type::Integer);} xywh {195 169 37 26} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {if (synth->getRuntime().audioEngine == alsa_audio) o->value(1);} class Fl_Check_Button2 } Fl_Box alsaNote { label {Changing settings requires a restart} xywh {60 276 267 17} labelfont 1 labelsize 12 labelcolor 64 align 128 } } Fl_Group midiTab { callback {// EPCvalue = synth->getRuntime().midi_upper_voice_C; if (EPCvalue >= 128) { EPCspinner->value(110); EPCspinner->deactivate(); } else { EPCspinner->value(EPCvalue); EPCspinner->activate(); } /*BankRootvalue = synth->getRuntime().midi_bank_root; if (BankRootvalue >= 128) { BankRoot->value(0); BankRoot->deactivate(); } else { BankRoot->value(BankRootvalue); BankRoot->activate(); }*/} tooltip {MIDI CC preferences} xywh {5 25 382 277} box THIN_UP_BOX labelsize 12 hide code0 {EPCvalue = synth->getRuntime().midi_upper_voice_C;} code1 {BankRootvalue = synth->getRuntime().midi_bank_root;} } { Fl_Choice bankrootchange { label {Bank Root Change} callback {// int candidate; switch (o->value()) { case 0: candidate = 32; break; case 1: candidate = 0; break; default: candidate = 128; break; } string name = testCC(candidate, CONFIG::control::bankRootCC); if (!name.empty()) { o->value(oldBank); o->redraw(); switch(oldBank) { case 0: candidate = 32; break; case 1: candidate = 0; break; default: candidate = 128; break; } alert(synth, "In use for " + name); } send_data(0, CONFIG::control::bankRootCC, candidate, TOPLEVEL::type::Integer);} tooltip {CC0 = msb, CC32 = lsb} xywh {234 57 53 18} down_box BORDER_BOX labelsize 12 labelcolor 64 align 132 textfont 1 textsize 12 textcolor 64 code0 {o->add("LSB");o->add("MSB");o->add("Off");} code1 {int bankRoot = synth->getRuntime().midi_bank_root;} code2 {if (bankRoot == 32) o->value(0); else if (bankRoot == 0) o->value(1); else o->value(2);} code3 {oldBank = o->value();} } {} Fl_Choice bankchange { label {Bank Change} callback {// int candidate; switch (o->value()) { case 0: candidate = 32; break; case 1: candidate = 0; break; default: candidate = 128; break; } string name = testCC(candidate, CONFIG::control::bankCC); if (!name.empty()) { o->value(oldBank); o->redraw(); switch(oldBank) { case 0: candidate = 32; break; case 1: candidate = 0; break; default: candidate = 128; break; } alert(synth, "In use for " + name); } send_data(0, CONFIG::control::bankCC, candidate, TOPLEVEL::type::Integer);} tooltip {CC0 = msb, CC32 = lsb} xywh {235 80 53 18} down_box BORDER_BOX labelsize 12 labelcolor 64 align 132 textfont 1 textsize 12 textcolor 64 code0 {o->add("LSB");o->add("MSB");o->add("Off");} code1 {if (synth->getRuntime().midi_bank_C == 32) o->value(0); else if (synth->getRuntime().midi_bank_C == 0) o->value(1); else o->value(2);} code2 {oldBank = o->value();} } {} Fl_Check_Button progenable { label {Enable Program Change} callback {// send_data(0, CONFIG::control::enableProgramChange, o->value(), TOPLEVEL::type::Integer);} tooltip {MIDI program change enable/disable.} xywh {234 110 18 18} down_box DOWN_BOX value 1 selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().enableProgChange);} class Fl_Check_Button2 } Fl_Spinner EPCspinner { label {Extended Program Change CC} callback {// Epend->show();} xywh {235 150 50 18} labelsize 12 labelcolor 64 minimum 0 maximum 119 value 110 textfont 1 textsize 12 textcolor 64 code0 {EPCvalue = synth->getRuntime().midi_upper_voice_C;} code1 {if (EPCvalue < 128) o->value(EPCvalue); else o->value(110);} class WidgetSpinner } Fl_Button Epend { label Pending callback {// int candidate = EPCspinner->value(); if (candidate == EPCvalue) { o->hide(); return; } string name = testCC(candidate, CONFIG::control::extendedProgramChangeCC); if (!name.empty()) { alert(synth, "In use for " + name); if (EPCvalue < 128) { EPCspinner->value(EPCvalue); EPCspinner->redraw(); } return; } EPCvalue = candidate; o->hide(); send_data(0, CONFIG::control::extendedProgramChangeCC, EPCvalue, TOPLEVEL::type::Integer);} tooltip {Click to set} xywh {300 150 70 20} box PLASTIC_UP_BOX color 90 labelsize 12 labelcolor 64 hide } Fl_Check_Button Epcheck { label {Enable Extended Program Change} callback {// for some weird reason this *must* be the last item in the group if (o->value() == 0) { EPCspinner->value(110); EPCspinner->deactivate(); Epend->hide(); send_data(0, CONFIG::control::extendedProgramChangeCC, 128, TOPLEVEL::type::Integer); } else { EPCspinner->activate(); Epend->show(); EPCspinner->value(110); EPCvalue = 128; } EPCspinner->redraw();} xywh {234 130 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value((synth->getRuntime().midi_upper_voice_C < 128));} code1 {if (o->value() == 0) EPCspinner->deactivate();} class Fl_Check_Button2 } Fl_Check_Button enableOmniChange { label {Enable Omni Mode Change} callback {// send_data(0, CONFIG::control::enableOmni, o->value(), TOPLEVEL::type::Integer);} tooltip {Enable receipt of Omni Mode change messages on CC 124 (Off) and CC 125 (On).} xywh {234 180 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().enableOmni);} class Fl_Check_Button2 } Fl_Check_Button enableNRPN { label {Enable Incoming NRPNs} callback {// send_data(0, CONFIG::control::enableNRPNs, o->value(), TOPLEVEL::type::Integer);} xywh {234 210 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().enable_NRPN);} class Fl_Check_Button2 } Fl_Check_Button ignoreReset { label {Ignore Reset all CCs} callback {// send_data(0, CONFIG::control::ignoreResetAllCCs, o->value(), TOPLEVEL::type::Integer);} xywh {234 230 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().ignoreResetCCs);} class Fl_Check_Button2 } Fl_Check_Button midiMon { label {Log Incoming Events} callback {// send_data(0, CONFIG::control::logIncomingCCs, o->value(), TOPLEVEL::type::Integer);} xywh {234 250 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().monitorCCin);} class Fl_Check_Button2 } Fl_Check_Button midiLearned { label {Show Learn Editor} callback {// send_data(0, CONFIG::control::showLearnEditor, o->value(), TOPLEVEL::type::Integer);} tooltip {Open the MIDI learn window for editing when a new CC has been learned} xywh {234 270 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(synth->getRuntime().showLearnedCC);} class Fl_Check_Button2 } } Fl_Group themeTab { callback {//} xywh {5 25 382 277} box THIN_UP_BOX hide } { Fl_Browser theme_browser { label Themes callback {// if (!o->value()) return; int result = o->value(); if (result < 0) return; string line = string(o->text(result)); if (line == "classic") { setClassicTable(); } else { string fileName = file::localDir()+ "/themes/" + line + EXTEN::theme; int errLine = setUserTable(fileName); if (errLine != -1) themeError(errLine); //synth->getRuntime().remoteGuiTheme = file::localDir()+ "/themes/" + line + ".clr"; } selectedTheme->copy_label(line.c_str()); currentTheme = line; while (defaultTheme.at(defaultTheme.length() - 1) < '!') // tidy up defaultTheme.pop_back(); // deals with spurious trailing whitespace if (line == defaultTheme) { nuTheme->deactivate(); } else { nuTheme->activate(); } synth->getGuiMaster()->themeTrigger = true; //send_data(TOPLEVEL::action::muteAndLoop | TOPLEVEL::action::forceUpdate, MAIN::control::masterResetAndMlearn, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main);} xywh {40 50 190 215} type Select labelcolor 64 align 1 textcolor 64 } Fl_Button themeImport { label {Import Theme} callback {// string filename = setfiler(synth,"", "", false, TOPLEVEL::XML::Themes); if (filename.empty()) { //synth->getRuntime().Log("Can't find " + filename); return; } filename += EXTEN::theme; string newfile = file::localDir() + "/themes/" + file::findLeafName(filename) + EXTEN::theme; int result = file::copyFile(filename, newfile,1); if (result == 0) { fillThemes(); } else { synth->getRuntime().Log("Failed to install " + filename); }} xywh {255 51 100 20} box GTK_THIN_UP_BOX color 198 labelsize 12 labelcolor 64 } Fl_Button themeExport { label {Export Theme} callback {// string source = file::localDir() + "/themes/" + currentTheme + EXTEN::theme; string filename = setfiler(synth,"", currentTheme, true, TOPLEVEL::XML::Themes); size_t found = filename.find(file::localDir()); if (found!=std::string::npos) { alert(synth, "Can't export on top of internal themes"); return; } if (filename.empty()) { //synth->getRuntime().Log("Nothing to export " + filename); return; } filename += EXTEN::theme; if (file::copyFile(source, filename, 0)) { synth->getRuntime().Log("Failed to export " + filename); } ;} xywh {255 89 100 20} box GTK_THIN_UP_BOX color 198 labelsize 12 labelcolor 64 } Fl_Box storedLabel { label {Default Theme} xywh {288 115 35 17} labelsize 12 labelcolor 64 } Fl_Button storedTheme { label {Default Theme} xywh {255 132 100 20} box THIN_DOWN_BOX color 7 selection_color 64 labelsize 12 labelcolor 64 align 64 } Fl_Group nuTheme { xywh {242 158 123 86} deactivate } { Fl_Box currentLabel { label {Current Theme} xywh {288 168 35 17} labelsize 12 labelcolor 64 } Fl_Button setAsStored { label {Make Default} callback {// string name = currentTheme + EXTEN::theme; string file = file::localDir() + "/themes/ID/current.txt"; file::saveText(name, file); defaultTheme = currentTheme; storedTheme->copy_label(defaultTheme.c_str()); nuTheme->deactivate(); ;} xywh {255 220 100 20} box PLASTIC_THIN_UP_BOX color 228 labelsize 12 labelcolor 64 } Fl_Button selectedTheme { label {Current Theme} xywh {255 187 100 20} box THIN_DOWN_BOX color 7 selection_color 7 labelsize 12 labelcolor 64 align 64 } } Fl_Check_Button monochrome { label Monochrome callback {// monoChrome = o->value(); if (currentTheme == "classic") { setClassicTable(); } else { string fileName = file::localDir()+ "/themes/" + currentTheme + EXTEN::theme; int errLine = setUserTable(fileName); if (errLine != -1) themeError(errLine); //synth->getRuntime().remoteGuiTheme = file::localDir()+ "/themes/" + line + ".clr"; } o->parent()->parent()->parent()->damage(1); o->parent()->parent()->parent()->redraw(); synth->getGuiMaster()->themeTrigger = true; ;} xywh {256 250 102 20} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 code0 {o->value(0);} } } Fl_Box patch1 { xywh {6 24 89 3} box FLAT_BOX labelcolor 64 } Fl_Box patch2 { xywh {98 24 65 3} box FLAT_BOX labelcolor 64 } Fl_Box patch3 { xywh {166 24 37 3} box FLAT_BOX labelcolor 64 } Fl_Box patch4 { xywh {206 24 37 3} box FLAT_BOX labelcolor 64 } Fl_Box patch5 { xywh {246 24 57 3} box FLAT_BOX labelcolor 64 } Fl_Box patch6 { xywh {305 24 57 3} box FLAT_BOX labelcolor 64 } } Fl_Button close { label Close callback {// configwindow->hide(); configSeen = false; saveWin(synth, configwindow->w(), configwindow->h(),configwindow->x(), configwindow->y(), false, "Config")} xywh {300 306 60 20} box THIN_UP_BOX color 196 labelsize 12 labelcolor 64 } } Fl_Window presets { label Presets callback {pClose->do_callback();} xywh {6 437 460 270} type Double hide resizable class ScaleTrackedWindow code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Presets"), UNUSED, TOPLEVEL::windowTitle)).c_str());} code1 {preDW = o->w();preDH = o->h();} code2 {o->size_range(preDW, preDH, 0, 0, 0, 0, 1);} } { Fl_Browser presetbrowse { callback {// activatebutton_presetdir(o->value() != 0);} tooltip {Click on an entry to make it the readable one.} xywh {5 5 450 200} type Hold labelsize 12 labelcolor 64 textsize 12 textcolor 64 } Fl_Button addpreset { label {Add preset directory...} callback {// string dirname = setfiler(synth,"Path for Presets dir", "", false, TOPLEVEL::XML::Dir); if (dirname.length() < 3) return; send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate,CONFIG::control::addPresetRootDir, 0, TOPLEVEL::type::Integer, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(dirname)); if (presetbrowse->size() >= MAX_PRESET_DIRS) o->deactivate();} xywh {10 220 85 35} box GTK_THIN_UP_BOX color 198 labelsize 12 labelcolor 64 align 128 } Fl_Button removepresetbutton { label {Remove preset dir...} callback {// if (presetbrowse->value() != 0) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate,CONFIG::control::removePresetRootDir, presetbrowse->value() - 1, TOPLEVEL::type::Integer);} xywh {115 220 85 35} box PLASTIC_UP_BOX color 228 labelsize 12 labelcolor 64 align 128 code0 {o->deactivate();} } Fl_Button makedefaultpresetbutton { label {Make Current} callback {// send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate,CONFIG::control::currentPresetRoot, presetbrowse->value() - 1, TOPLEVEL::type::Integer);} xywh {220 220 85 35} box PLASTIC_UP_BOX color 228 labelsize 12 labelcolor 64 align 128 code0 {o->deactivate();} } Fl_Button pClose { label Close callback {// saveWin(synth, presets->w(), presets->h(), presets->x(), presets->y(), false, "Config-presets"); presetsSeen = false; presets->hide();} xywh {362 220 85 35} box THIN_UP_BOX color 196 labelsize 12 labelcolor 64 } } } Function {send_data(int action, int control, float value, int type, int part = UNUSED, int kit = UNUSED, int engine = UNUSED, int insert = UNUSED, int par = UNUSED, int miscmsg = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; if (part == UNUSED) part = TOPLEVEL::section::config; collect_writeData(synth, value, action, type, control, part, kit, engine, insert, par, UNUSED, miscmsg);} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED, int request = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg, request);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// int value_int = lrint(getData->data.value); bool wasFromHere = ((getData->data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromGUI); unsigned char control = getData->data.control; unsigned char kititem = getData->data.kit; unsigned char miscmsg = getData->data.miscmsg; string msg = textMsgBuffer.fetch(miscmsg); bool value_bool = value_int > 0; int tmp; string name; switch (control) { case CONFIG::control::oscillatorSize: tmp = 0; while (value_int > 256) { value_int = value_int >> 1; ++ tmp; // count the bits for switch number } osc_size->value(tmp); break; case CONFIG::control::bufferSize: tmp = CONFIG::control::bufferSize; while (value_int > 16) { value_int = value_int >> 1; ++ tmp; // count the bits for switch number } buff_size->value(tmp - 1); break; case CONFIG::control::padSynthInterpolation: pad_interpol->value(value_int); break; case CONFIG::control::virtualKeyboardLayout: v_keyboard->value(value_int); break; case CONFIG::control::XMLcompressionLevel: compression->value(value_int); break; case CONFIG::control::reportsDestination: if(!wasFromHere) reports->value(value_bool); synth->getGuiMaster()->setLogging(value_bool); if (value_bool) logText->activate(); else logText->deactivate(); break; case CONFIG::control::logTextSize: logText->value(value_int); //synth->getGuiMaster()->yoshiLog->logConsole->setLogText(value_int); break; case CONFIG::control::savedInstrumentFormat: instrument->value(value_int - 1); break; case CONFIG::control::defaultStateStart: setDefaultState->value(value_bool); break; case CONFIG::control::handlePadSynthBuild: handlePadSynthBuild->value(value_int); break; case CONFIG::control::hideNonFatalErrors: nonFatal->value(value_bool); break; case CONFIG::control::showSplash: showSplash->value(value_bool); break; case CONFIG::control::logInstrumentLoadTimes: logTimes->value(value_bool); break; case CONFIG::control::logXMLheaders: logXML->value(value_bool); break; case CONFIG::control::saveAllXMLdata: saveAllXML->value(value_bool); break; case CONFIG::control::enableGUI: enableGUI->value(value_bool); break; case CONFIG::control::enableCLI: enableCLI->value(value_bool); break; case CONFIG::control::enableAutoInstance: enableAuto->value(value_bool); break; case CONFIG::control::enableSinglePath: singleMaster->value(value_bool); break; case CONFIG::control::enableHighlight: bankHighlight->value(value_bool); break; case CONFIG::control::enablePartReports: partReports->value(value_bool); break; case CONFIG::control::historyLock: if (!wasFromHere) { switch (kititem) { case TOPLEVEL::XML::Instrument: H_instrument->value(value_int); break; case TOPLEVEL::XML::Patch: H_patchset->value(value_int); break; case TOPLEVEL::XML::Scale: H_scale->value(value_int); break; case TOPLEVEL::XML::State: H_state->value(value_int); break; case TOPLEVEL::XML::Vector: H_vector->value(value_int); break; case TOPLEVEL::XML::MLearn: H_mlearn->value(value_int); break; default: break; } } break; case CONFIG::control::jackMidiSource: jackSource->value(msg.c_str()); break; case CONFIG::control::jackPreferredMidi: jackMidi->value(value_bool); alsaMidi->value(!value_bool); break; case CONFIG::control::jackServer: jackServer->value(msg.c_str()); break; case CONFIG::control::jackPreferredAudio: jackAudio->value(value_bool); alsaAudio->value(!value_bool); break; case CONFIG::control::jackAutoConnectAudio: connectJackAudio->value(value_bool); break; case CONFIG::control::alsaMidiSource: alsaSource->value(msg.c_str()); break; case CONFIG::control::alsaPreferredMidi: alsaMidi->value(value_bool); jackMidi->value(!value_bool); break; case CONFIG::control::alsaMidiType: alsaType->value(value_int); if (value_int == 0) // fixed alsaSource->activate(); else alsaSource->deactivate(); break; case CONFIG::control::alsaAudioDevice: alsaDevice->value(msg.c_str()); break; case CONFIG::control::alsaPreferredAudio: alsaAudio->value(value_bool); jackAudio->value(!value_bool); break; case CONFIG::control::alsaSampleRate: alsaSamplerate->value(convertSrate(value_int)); break; case CONFIG::control::addPresetRootDir: case CONFIG::control::removePresetRootDir: case CONFIG::control::currentPresetRoot: { if (msg.find("FAILED") == 1) { if (wasFromHere) alert(synth, msg); } else readpresetcfg(); break; } case CONFIG::control::bankRootCC: switch (value_int) { case 0: bankrootchange->value(1); break; case 32: bankrootchange->value(0); break; default: bankrootchange->value(2); break; } break; case CONFIG::control::bankCC: switch (value_int) { case 0: bankchange->value(1); break; case 32: bankchange->value(0); break; default: bankchange->value(2); break; } break; case CONFIG::control::enableProgramChange: progenable->value(value_bool); break; case CONFIG::control::extendedProgramChangeCC: if (value_int > 119) { EPCspinner->value(110); EPCspinner->deactivate(); Epcheck->value(0); } else { EPCspinner->value(value_int); EPCspinner->activate(); Epcheck->value(1); } break; case CONFIG::control::ignoreResetAllCCs: ignoreReset->value(value_bool); break; case CONFIG::control::logIncomingCCs: midiMon->value(value_bool); break; case CONFIG::control::showLearnEditor: midiLearned->value(value_bool); break; case CONFIG::control::enableOmni: enableOmniChange->value(value_bool); break; case CONFIG::control::enableNRPNs: enableNRPN->value(value_bool); break; case CONFIG::control::saveCurrentConfig: name = msg; if (wasFromHere && name.find("FAILED") == 1) alert(synth, name); break; }} {} } Function {ConfigUI(SynthEngine *_synth, int _current_ID)} {} { code {// synth = _synth; current_ID = _current_ID; manageThemes(); make_window(); readpresetcfg(); configSeen = false; presetsSeen = false; selectedRootID = -1; Tab1->do_callback(); string themeDir = file::localDir() + "/themes/"; string name = file::loadText(themeDir + "ID/current.txt"); string fullName = themeDir + name; while (fullName.at(fullName.length() - 1) < '!') // tidy up fullName.pop_back(); // deals with spurious trailing whitespace themeTime = file::isRegularFile(fullName); if (themeTime == 0) { defaultTheme = "classic"; currentTheme = defaultTheme; themeDirTime = 1; } else { size_t pos = name.rfind('.'); defaultTheme = name.substr(0, pos); currentTheme = defaultTheme; } monoChrome = 0; themeDirTime = 1;} {} } Function {~ConfigUI()} {} { code {// if (presetsSeen) saveWin(synth, presets->w(), presets->h(), presets->x(), presets->y(), true, "Config-presets"); presets->hide(); delete presets; if (configSeen) saveWin(synth, configwindow->w(), configwindow->h(),configwindow->x(), configwindow->y(), true, "Config"); configwindow->hide(); delete configwindow;} {} } Function {halfSecTimer()} {} { code {// if (themeTab->visible()) { string themeDir = file::localDir() + "/themes/"; bool changed = false; if (currentTheme != "classic") { string fileName = themeDir + currentTheme +".clr"; size_t testTime = file::isRegularFile(fileName); if (testTime != themeTime) { //std::cout << "test " << testTime << " theme " << themeTime << std::endl; setUserTable(fileName); synth->getGuiMaster()->theme(); changed = true; themeTime = testTime; } } if (!changed) // we don't want to rebuild the menu if it's just a theme change { size_t testDirTime = file::isDirectory(themeDir); if (testDirTime != themeDirTime) { //std::cout << "test " << testDirTime << " theme dir " << themeDirTime << std::endl; fillThemes(); themeDirTime = testDirTime; } } }} {} } Function {fillNative()} {} { code {// for (int i = 0; i < 256; ++i) { getNativeLine(i); } ;} {} } Function {getNativeLine(int line)} {} { code {// unsigned char rt, gt, bt; Fl::get_color(line, rt, gt, bt); nativeTable[line] = int(rt); nativeTable[line + 256] = int(gt); nativeTable[line + 512] = int(bt); ;} {} } Function {fillThemes()} {return_type int } { code {// string sourceDir = file::localDir() + "/themes/"; std::list themes; int count = file::listDir(&themes, sourceDir); if (count == 0) return 0; themes.sort(); theme_browser->clear(); std::list::iterator itr = themes.begin(); while (itr != themes.end()) { string text = file::findExtension(*itr); if (text == ".clr") { text = *itr; size_t pos = text.find(".clr"); text = text.substr(0, pos); theme_browser->add(text.c_str()); } ++itr; } storedTheme->copy_label(defaultTheme.c_str()); selectedTheme->copy_label(currentTheme.c_str()); return count; ;} {} } Function {manageThemes()} {} { code {// static bool seen = false; if (!seen) { fillNative(); seen = true; if (!file::isRegularFile(file::localDir() + "/themes/demo.clr")) { string demo = file::findExampleFile("themes/demo.clr"); if (!demo.empty()) file::copyFile(demo, file::localDir() + "/themes/demo.clr", 1); } } /* * Note: Fluid screws up text with control values and @ * so we enter them as char(n) */ // prints the native colour table /*unsigned char RR,GG,BB; for (int i = 0; i < 256; ++i) { Fl::get_color(i, RR, GG, BB); std::cout << '"'<< int(RR) << "," << int(GG) << "," << int(BB) << '"' << "," << std::endl; }*/ int colour2find = 0; if (colour2find > 0) // for testing { unsigned char rt,gt,bt; Fl::get_color(colour2find, rt, gt, bt); std::cout << "r " << int(rt) << " g " << int(gt) << " b " << int(bt) << std::endl; } if (!checkVersions()) { setClassicTable(); themeTime = 1; return; } if (findRemote()) // externally CLI sourced return; string themeDir = file::localDir() + "/themes/"; string selectedTheme = file::loadText(themeDir+"ID/current.txt"); while (selectedTheme.at(selectedTheme.length() - 1) < '!') // tidy up selectedTheme.pop_back(); // deals with spurious trailing whitespace if (selectedTheme != "classic.clr") { string fileName = themeDir+ selectedTheme; themeTime = file::isRegularFile(fileName); if (themeTime != 0) { int errLine = setUserTable(fileName); if (errLine != -1) themeError(errLine); return; } } setClassicTable(); //Fl::set_color(196, 127, 145, 191); // for testing ;} {} } Function {checkVersions()} {return_type bool } { code {// string themeDir = file::localDir() + "/themes/"; file::createDir(themeDir); file::createDir(themeDir + "ID"); int build_ID = synth->getRuntime().build_ID; int theme_ID = 0; string defaultName = "classic.clr"; bool ok = true; if (!file::isRegularFile(themeDir + defaultName)) ok = false; if (ok) { if(!file::isRegularFile(themeDir +"ID/version")) ok = false; else theme_ID = func::string2int(file::loadText(themeDir + "ID/version")); } if (ok) { if (build_ID > theme_ID) ok = false; } if (ok) { string filename = themeDir +"ID/" + "current.txt"; if(!file::isRegularFile(filename)) ok = false; } if (ok) return true; file::saveText(to_string(build_ID), themeDir + "ID/version"); string res = themeDir + "ID/version"; //std::cout << "version>" << res << std::endl; string colourText; int info = 0; do { colourText += (colourPreamble[info] + char(10)); ++info; if (info > 100) { std::cout << "failed preamble" << std::endl; } } while(colourPreamble[info] != "END"); int data = 0; do { colourText += (colourData[data] + char(10)); ++data; if (data > 200) { std::cout << "failed data" << std::endl; } } while(colourData[data] != "END"); file::saveText(defaultName + char(10), themeDir + "ID/current.txt"); file::saveText(colourText, themeDir + defaultName); return false;} {} } Function {findRemote()} {return_type bool } { code {// bool ok = true; string selectedTheme = synth->getRuntime().remoteGuiTheme; if ((!file::isRegularFile(selectedTheme))) { return false; } if (!selectedTheme.empty()) { int errLine = setUserTable(selectedTheme); if (errLine != -1) { themeError(errLine); ok = false; } } return ok;} {} } Function {setNativeTable()} {} { code {// for (int i = 0; i < 256; ++i) setNativeLine(i); ;} {} } Function {setNativeLine(int line)} {} { code {//; unsigned char R, G, B; R = nativeTable[line]; G = nativeTable[line + 256]; B = nativeTable[line + 512]; Fl::set_color(line, R, G, B); ;} {} } Function {setClassicTable()} {return_type bool } { code {// setGreyScale(colourData[0]); for (int lineCount = 0; lineCount < COLOURLIST; ++ lineCount) { if (setColourLine(colourData[lineCount + 1], lineCount) != 0) // we don't want the greyscale line! { synth->getRuntime().Log("Corrupted Classic theme data."); return false; } } return true;} {} } Function {setUserTable(string table)} {return_type int } { code {// string colourText = file::loadText(table); themeTime = file::isRegularFile(table); std::size_t nextPos; // strip out preamble text string text = ""; int lineCount = 0; int totalCount = 1; while (text.substr(0, 7) != "-------") { nextPos = colourText.find(char(10)); if (nextPos == std::string::npos) { return -2; } text = colourText.substr(0, nextPos); colourText = colourText.substr(nextPos + 1); ++lineCount; ++totalCount; } if (text.substr(0, 7) != "-------") { return -2; } int dataStart = totalCount; if (colourText.at(0) == char(64)) // all native colour table { setNativeTable(); return -1; // doesn't matter if there's no more to the file } nextPos = colourText.find(char(10)); int scaletype = setGreyScale(colourText.substr(0, nextPos)); if (scaletype == 0) { return totalCount; } ++totalCount; // allow for greyscale line colourText = colourText.substr(nextPos + 1); lineCount = 0; int test = 0; do { if ((totalCount - dataStart) > COLOURLIST && colourText.substr(0, 7) != "=======") { return -3; // missing marker } nextPos = colourText.find(char(10)); if (nextPos == std::string::npos) { return -4; // too short } text = colourText.substr(0, nextPos); if (text.at(0) == char(64)) { int actual_line = colourNumbers[lineCount]; setNativeLine(actual_line); } else { string lineText = colourText.substr(0, nextPos); if (lineText.find("RESERVED") != std::string::npos) { // use actual default value, stepping over greyscale line test = setColourLine(colourData[lineCount + 1], lineCount); } else test = setColourLine(lineText, lineCount); } if (test == -1) { if (colourText.substr(0, 7) == "-------") return -4; // old style too short return totalCount; } ++lineCount; ++totalCount; colourText = colourText.substr(nextPos + 1); } while(colourText.substr(0, 7) != "======="); //std::cout << "lines " << lineCount << std::endl; if ((totalCount - dataStart) <= COLOURLIST) { return -4; // too short } return -1; ;} {} } Function {setGreyTint(string text, float &R, float &G, float &B)} {return_type bool } { code {// float r,g,b; if (!isdigit(text.at(0))) { return false; } size_t nextPos = text.find(","); r = string2int(text.substr(0, nextPos)); if (r > 255 || r < 0) return false; r = (r-127) / 511.0f; text = text.substr(nextPos + 1); nextPos = text.find(","); if (nextPos == std::string::npos) { return false; } if (!isdigit(text.at(0))) { return false; } g = string2int(text.substr(0, nextPos)); if (g > 255 || g < 0) return false; g = (g-127) / 511.0f; text = text.substr(nextPos + 1); nextPos = text.find(","); if (nextPos == std::string::npos) { return false; } if (!isdigit(text.at(0))) { return false; } b = string2int(text.substr(0, nextPos)); if (b > 255 || b < 0) return false; b = (b-127) / 511.0; float offset = (r+g+b) / 3; R = 1+r - offset; if (R < 0) R = 0; G = 1+g - offset; if (G < 0) G = 0; B = 1+b - offset; if (B < 0) B = 0; return true;} {} } Function {setGreyScale(string text)} {return_type int } { code {// size_t nextPos = text.find(","); if (nextPos == std::string::npos) { return 0; } if (!isdigit(text.at(0))) { return 0; } int min = string2int(text.substr(0, nextPos)); if (min < 0 || min > 255) { return 0; } text = text.substr(nextPos + 1); nextPos = text.find(","); if (nextPos == std::string::npos) { return 0; } if (!isdigit(text.at(0))) { return 0; } int max = string2int(text.substr(0, nextPos)); if (max < 0 || max > 255) { return 0; } if (min == 127 && max == 127) return 2; // this sets a totally grey colourmap // useful for testing contrast float Rmult, Gmult, Bmult = 1; bool useTint = false; if(!monoChrome) { text = text.substr(nextPos + 1); if(isdigit(text.at(0))) { if (setGreyTint(text,Rmult,Gmult,Bmult)) useTint = true; else synth->getRuntime().Log("Invalid grey tint"); } } float greyRange; if (max > min) { greyRange = (max - min) / 23; for (int i = 0; i < 24; ++i) { int diff = (min + int(i * greyRange)) + 1; if (useTint) { int r = diff*Rmult; if (r > 255) r = 255; else if (r < 0) r = 0; int g = diff*Gmult; if (g > 255) g = 255; else if (g < 0) g = 0; int b = diff*Bmult; if (b > 255) b = 255; else if (b < 0) b = 0; Fl::set_color(i + 32, r, g, b); } else Fl::set_color(i + 32, diff, diff, diff); } } else { greyRange = (min - max) / 23; for (int i = 0; i < 24; ++i) { int diff = (min - int(i * greyRange)) - 1 ; if (useTint) { int r = diff*Rmult; if (r > 255) r = 255; else if (r < 0) r = 0; int g = diff*Gmult; if (g > 255) g = 255; else if (g < 0) g = 0; int b = diff*Bmult; if (b > 255) b = 255; else if (b < 0) b = 0; Fl::set_color(i + 32, r, g, b); } else Fl::set_color(i + 32, diff, diff, diff); } } return 1; ;} {} } Function {setColourLine(string text, int item)} {return_type int } { code {// size_t nextPos = text.find(","); if (nextPos == std::string::npos) return -1; if (text.at(0) == char(35)) { text = text.substr(1,nextPos); unsigned int hexNumber; sscanf(text.c_str(), "%x", &hexNumber); Fl::set_color(colourNumbers[item],hexNumber * 256); return 0; } if (!isdigit(text.at(0))) return -1; int red = string2int(text.substr(0, nextPos)); if (red < 0 || red > 255) return -1; text = text.substr(nextPos + 1); nextPos = text.find(","); if (nextPos == std::string::npos) return -1; if (!isdigit(text.at(0))) return -1; int green = string2int(text.substr(0, nextPos)); if (green < 0 || green > 255) return -1; text = text.substr(nextPos + 1); if (!isdigit(text.at(0))) return -1; int blue = string2int(text); // don't need comma test here if (blue < 0 || blue > 255) return -1; if (monoChrome == 1) { int allGrey = (red+green+blue)/3; red = green = blue = allGrey; } Fl::set_color(colourNumbers[item], red, green, blue); return 0; ;} {} } Function {activatebutton_presetdir(bool active)} {} { code {// if (active) { removepresetbutton->activate(); makedefaultpresetbutton->activate(); } else { removepresetbutton->deactivate(); makedefaultpresetbutton->deactivate(); }} {} } Function {themeError(int errLine)} {} { code {// themeTime = 1; if (errLine == -2) synth->getRuntime().Log("Theme: Missing data start marker"); else if (errLine == -3) synth->getRuntime().Log("Theme: Missing data end marker"); else if (errLine == -4) synth->getRuntime().Log("Theme: Short file"); else synth->getRuntime().Log("Theme: Failed at line " + std::to_string(errLine)); ;} {} } Function {recoverID()} {return_type int } { code {// No longer using this. Why not? if (selectedRootID >= 0) { return selectedRootID; } return 0;} {} } Function {readpresetcfg()} {} { code {// presetbrowse->clear(); for (int i = 0; i < MAX_PRESET_DIRS; ++i) if (synth->getRuntime().presetsDirlist[i].size()) { string name; if (i == synth->getRuntime().presetsRootID) name = "* "; else name = " "; name += synth->getRuntime().presetsDirlist[i]; presetbrowse->add(name.c_str()); }} {} } Function {convertSrate(int source)} {return_type int } { code {// int result = 2; switch (source) { case 0: result = 192000; break; case 1: result = 96000; break; case 2: result = 48000; break; case 3: result = 44100; break; case 192000: result = 0; break; case 96000: result = 1; break; case 48000: result = 2; break; case 44100: result = 3; break; } return result;} {} } Function {update_config(int tabnumber)} {} { code {// int tmp; switch (tabnumber) { case 1 : // Main osc_size->value( (int)(logf(synth->getRuntime().oscilsize / 256.0f - 1.0f) / logf(2.0f)) + 1); buff_size->value( (int)(logf(synth->getRuntime().buffersize / 16.0f - 1.0f) / logf(2.0f)) + 1); pad_interpol->value(synth->getRuntime().Interpolation); v_keyboard->value(synth->getRuntime().virKeybLayout); compression->value(synth->getRuntime().gzipCompression); reports->value(synth->getRuntime().toConsole); instrument->value(synth->getRuntime().instrumentFormat - 1); break; case 2 : // Jack jackSource->value(synth->getRuntime().jackMidiDevice.c_str()); if (synth->getRuntime().midiEngine == jack_midi) { jackMidi->value(1); alsaMidi->value(0); } jackServer->value(synth->getRuntime().jackServer.c_str()); if (synth->getRuntime().audioEngine == jack_audio) { jackAudio->value(1); alsaAudio->value(0); } break; case 3 : // Alsa { alsaSource->value(synth->getRuntime().alsaMidiDevice.c_str()); if (synth->getRuntime().midiEngine == alsa_midi) { alsaMidi->value(1); jackMidi->value(0); } alsaDevice->value(synth->getRuntime().alsaAudioDevice.c_str()); if (synth->getRuntime().audioEngine == alsa_audio) { alsaAudio->value(1); jackAudio->value(0); } alsaSamplerate->value(convertSrate(synth->getRuntime().samplerate)); } break; case 4 : // MIDI switch (synth->getRuntime().midi_bank_root) { case 32: bankrootchange->value(0); break; case 0: bankrootchange->value(1); break; default: bankrootchange->value(2); break; } switch (synth->getRuntime().midi_bank_C) { case 32: bankchange->value(0); break; case 0: bankchange->value(1); break; default: bankchange->value(2); break; } progenable->value(synth->getRuntime().enableProgChange); tmp = synth->getRuntime().midi_upper_voice_C; if (tmp == 128) { EPCspinner->value(110); EPCspinner->deactivate(); Epcheck->value(0); } else { EPCspinner->value(tmp); EPCspinner->activate(); Epcheck->value(1); } Epend->hide(); enableOmniChange->value(synth->getRuntime().enableOmni); enableNRPN->value(synth->getRuntime().enable_NRPN); ignoreReset->value(synth->getRuntime().ignoreResetCCs); midiMon->value(synth->getRuntime().monitorCCin); midiLearned->value(synth->getRuntime().showLearnedCC); break; case 5 : // Switches handlePadSynthBuild->value(synth->getRuntime().handlePadSynthBuild); setDefaultState->value(synth->getRuntime().loadDefaultState > 0); nonFatal->value(synth->getRuntime().hideErrors); showSplash->value(synth->getRuntime().showSplash); logTimes->value(synth->getRuntime().showTimes); logXML->value(synth->getRuntime().logXMLheaders); saveAllXML->value(synth->getRuntime().xmlmax); enableGUI->value(synth->getRuntime().storedGui); enableCLI->value(synth->getRuntime().storedCli); break; }} {} } Function {Show(SynthEngine *synth)} {} { code {// if (isLV2() == false && synth->getUniqueId() == 0) singleMaster->show(); int tmp = fetchData (0, CONFIG::control::alsaMidiType,TOPLEVEL::section::config); alsaType->value(tmp); if (tmp == 0) alsaSource->activate(); else alsaSource->deactivate(); int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Config"); if (fetchW < confDW || fetchH < confDH) { fetchW = confDW; fetchH = confDH; } checkSane(fetchX, fetchY, fetchW, fetchH, confDW, confDH); configwindow->resize(fetchX, fetchY, fetchW, fetchH); lastconfigW = 0; configSeen = true; configwindow->show();} {} } Function {Showpresets(SynthEngine *synth)} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Config-presets"); if (fetchW < preDW || fetchH < preDH) { fetchW = preDW; fetchH = preDH; } presets->resize(fetchX, fetchY, fetchW, fetchH); presets->resizable(); lastpresetW = 0; presetsSeen = true; presets->show();} {} } Function {configRtext()} {} { code {// if (lastconfigW == configwindow->w()) return; lastconfigW = configwindow->w(); float dScale = configwindow->w() / confDW; int size = int(dScale * 12); Tab1->labelsize(size); osc_size->labelsize(size); osc_size->textsize(size); buff_size->labelsize(size); buff_size->textsize(size); pad_interpol->labelsize(size); pad_interpol->textsize(size); handlePadSynthBuild->labelsize(size); handlePadSynthBuild->textsize(size); v_keyboard->labelsize(size); v_keyboard->textsize(size); compression->labelsize(size); compression->textsize(size); reports->labelsize(size); reports->textsize(size); logText->labelsize(size); logText->textsize(size); instrument->labelsize(size); instrument->textsize(size); PanelLayout->labelsize(size); PanelLayout->textsize(size); settingsNote->labelsize(size); // Tab2->labelsize(size); handlePadSynthBuild->labelsize(size); bankHighlight->labelsize(size); partReports->labelsize(size); setDefaultState->labelsize(size); nonFatal->labelsize(size); showSplash->labelsize(size); logTimes->labelsize(size); logXML->labelsize(size); saveAllXML->labelsize(size); enableGUI->labelsize(size); enableCLI->labelsize(size); enableAuto->labelsize(size); singleMaster->labelsize(size); historyLocks->labelsize(size); H_instrument->labelsize(size); H_patchset->labelsize(size); H_scale->labelsize(size); H_state->labelsize(size); H_vector->labelsize(size); H_mlearn->labelsize(size); switchesNote->labelsize(size); // Tab3->labelsize(size); jackSource->labelsize(size); jackSource->textsize(size); jackMidi->labelsize(size); jackServer->labelsize(size); jackServer->textsize(size); jackAudio->labelsize(size); connectJackAudio->labelsize(size); jackNote->labelsize(size); // Tab4->labelsize(size); alsaType->labelsize(size); alsaType->textsize(size); alsaSource->labelsize(size); alsaSource->textsize(size); alsaMidi->labelsize(size); alsaDevice->labelsize(size); alsaDevice->textsize(size); alsaAudio->labelsize(size); alsaSamplerate->labelsize(size); alsaSamplerate->textsize(size); alsaNote->labelsize(size); // Tab5->labelsize(size); bankrootchange->labelsize(size); bankrootchange->textsize(size); bankchange->labelsize(size); bankchange->textsize(size); progenable->labelsize(size); EPCspinner->labelsize(size); EPCspinner->textsize(size); Epend->labelsize(size); Epcheck->labelsize(size); enableOmniChange->labelsize(size); enableNRPN->labelsize(size); ignoreReset->labelsize(size); midiMon->labelsize(size); midiLearned->labelsize(size); // Tab6->labelsize(size); themeImport->labelsize(size); themeExport->labelsize(size); theme_browser->labelsize(size); theme_browser->textsize(size); themeImport->labelsize(size); storedLabel->labelsize(size); storedTheme->labelsize(size); currentLabel->labelsize(size); selectedTheme->labelsize(size); setAsStored->labelsize(size); monochrome->labelsize(size); // close->labelsize(size); configwindow->redraw();} {} } Function {presetsRtext()} {} { code {// if (lastpresetW == presets->w()) return; lastpresetW = presets->w(); float dScale = presets->w() / preDW; int size = int(12 * dScale); addpreset->labelsize(size); removepresetbutton->labelsize(size); makedefaultpresetbutton->labelsize(size); pClose->labelsize(size); presetbrowse->textsize(size); presets->redraw();} {} } Function {testCC(int value, int control)} {return_type string } { code {// CommandBlock getData; getData.data.value = value; getData.data.control = control; getData.data.part = 248; synth->interchange.testLimits(getData); return textMsgBuffer.fetch(getData.data.miscmsg);} {} } decl {SynthEngine *synth;} {private local } decl {int current_ID;} {private local } decl {long selectedRootID;} {private local } decl {int EPCvalue;} {private local } decl {int BankRootvalue;} {private local } decl {int oldBank;} {private local } decl {float confDW;} {private local } decl {float confDH;} {private local } decl {float preDW;} {private local } decl {float preDH;} {private local } decl {int lastconfigW;} {private local } decl {int lastpresetW;} {public local } decl {bool configSeen;} {private local } decl {bool presetsSeen;} {private local } decl {string defaultTheme;} {private local } decl {string currentTheme;} {private local } decl {int nativeTable[768];} {private local } decl {int monoChrome;} {private local } decl {size_t themeTime;} {private local } decl {size_t themeDirTime;} {private local } } yoshimi-2.3.5.1/src/UI/ConsoleUI.fl000066400000000000000000000122531506652756400166530ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {Copyright 2011, Alan Calvert Copyright 2015-2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . } {selected in_source in_header } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "FL/Fl_Text_Display.H"} {public local } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "Misc/Config.h"} {private global } decl {\#include "MasterUI.h"} {private global } class ConsoleTextDisplay {: {public Fl_Text_Display} } { Function {ConsoleTextDisplay(int x, int y, int w, int h, char* l = 0) : Fl_Text_Display(x,y,w,h,l)} {} { code {// empty //} {} } Function {scroll_to_last_line()} {return_type void } { code {// if (mVScrollBar->visible() && mVScrollBar->value() > mNBufferLines - mNVisibleLines) { insert_position(mBuffer->length()); show_insert_position(); }} {} } } class ConsoleUI {} { Function {make_window()} {} { Fl_Window logConsole { label {yoshimi console} callback {// o->hide();} xywh {397 70 385 185} type Double color 54 selection_color 36 labelsize 13 align 0 when 1 hide resizable code0 {logDW = 385;logDH = 185;} code1 {o->size_range(logDW,logDH);} } { Fl_Text_Display logText { xywh {0 0 385 185} color 7 selection_color 64 labeltype NO_LABEL labelsize 13 labelcolor 64 when 1 textfont 4 textsize 12 textcolor 64 resizable class ConsoleTextDisplay } } } Function {ConsoleUI(SynthEngine *_synth)} {} { code {// synth = _synth; bufsize = 8192; make_window(); txtbuf = new Fl_Text_Buffer(bufsize); lastlogW = 0; textSize = 12; logText->buffer(txtbuf); setLogText(synth->getRuntime().consoleTextSize);} {} } Function {~ConsoleUI()} {} { code {// if (logConsole->visible()) { saveWin(synth, logConsole->w(), logConsole->h(), logConsole->x(), logConsole->y(), 1, "System-log"); } else { int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "System-log"); saveWin(synth, fetchW, fetchH, fetchX, fetchY, 0, "System-log"); } logConsole->hide(); delete logConsole;} {} } Function {log(string msg)} {} { code {// msg += "\\n"; txtbuf->append(msg.c_str()); //Scroll to show last line unless manually scrolled elsewhere before logText->scroll_to_last_line(); if (txtbuf->length() > (bufsize - 256)) txtbuf->remove(0, txtbuf->line_end(256));} {} } Function {Show(SynthEngine *synth)} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "System-log"); if (fetchW < logDW || fetchH < logDH) { fetchW = logDW; fetchH = logDH; } // can't use checkSane() here w/h are independent int maxW = Fl::w() - 5; // wiggle room int maxH = Fl::h() - 30; // space for minimal titlebar if ((fetchX + fetchW) > maxW) // position fetchX = maxW / 2; if ((fetchY + fetchH) > maxH) fetchY = maxH / 2; if(fetchW > maxW) fetchW = maxW; if(fetchH > maxH / 2) // sensible max height fetchH = maxH / 2; logConsole->resize(fetchX, fetchY, fetchW, fetchH); lastlogW = 0; logConsole->show();} {} } Function {Hide(SynthEngine *synth)} {} { code {// if (logConsole->visible()) { saveWin(synth, logConsole->w(), logConsole->h(), logConsole->x(), logConsole->y(), 0, "System-log"); } else { int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "System-log"); saveWin(synth, fetchW, fetchH, fetchX, fetchY, 0, "System-log"); } logConsole->hide();} {} } Function {setLogText(int size)} {} { code {// lastlogW = 0; textSize = size;} {} } Function {consoleRtext()} {} { code {// if (lastlogW == logConsole->w()) return; lastlogW = logConsole->w(); saveWin(synth, logConsole->w(), logConsole->h(), logConsole->x(), logConsole->y(), 1, "System-log"); logText->textsize(textSize); logConsole->redraw();} {} } decl {Fl_Text_Buffer *txtbuf;} {private local } decl {int bufsize;} {private local } decl {float logDW;} {private local } decl {float logDH;} {private local } decl {SynthEngine *synth;} {private local } decl {int lastlogW;} {public local } decl {int textSize;} {private local } } yoshimi-2.3.5.1/src/UI/DynamicTooltip.cpp000066400000000000000000000167311506652756400201400ustar00rootroot00000000000000/* DynamicTooltip.cpp Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2016 Will Godfrey Copyright 2017 Jesper Lloyd Copyright 2018-2024 Will Godfrey and others Idea originally derived from work by Greg Ercolano (http://seriss.com/people/erco/fltk/) This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. */ #include "DynamicTooltip.h" #include #include #include #include "ScaleTrackedWindow.h" #define MAX_TEXT_WIDTH 280 // Whether or not a dynamic tooltip was shown recently static bool _recent; /* Delayed display of tooltip - callbackk*/ static void delayedShow(void* dyntip){ if (DynTooltip* tip = (DynTooltip*) dyntip) tip->dynshow(0); } static void resetRecent(void*){ _recent = false; } DynTooltip::DynTooltip():Fl_Menu_Window(1,1) { tipText.clear(); valueText.clear(); valueType = VC_plainValue; graphicsType = VC_plainValue; onlyValue = false; positioned = false; yoffs = 20; xoffs = 0; tipTextW = tipTextH = 0; valTextW = valTextH = 0; graphW = graphH = 0; set_override(); // place window on top end(); hide(); } DynTooltip::~DynTooltip(){ Fl::remove_timeout(delayedShow); Fl::remove_timeout(resetRecent); } /* Overrides standard hide/show from Fl_Widget to update flags and set tooltip position */ void DynTooltip::hide() { positioned = false; Fl_Menu_Window::hide(); } void DynTooltip::dynshow(float timeout) { if (timeout <= 0){ // Recalculate tooltip text dimensions if the tooltip text size has changed if (textSize != Fl_Tooltip::size()) { setTooltipText(tipText); } Fl::remove_timeout(delayedShow, this); _recent = true; reposition(); update(); Fl_Menu_Window::show(); } else { Fl::add_timeout(timeout, delayedShow, this); } } /* Sets the value to be formatted and shown in the tooltip */ void DynTooltip::setValue(float val) { if (val != currentValue) { currentValue = val; if (positioned) update(); } } /* Calling with true causes only the formatted value and the associated graphics to be shown in the tooltip. */ void DynTooltip::setOnlyValue(bool onlyval) { if (onlyValue != onlyval) { onlyValue = onlyval; if (positioned) update(); } } /* Sets the description of the dynamic value. Calling setOnlyValue(false) will prevent this from being displayed. */ void DynTooltip::setTooltipText(const string& tt_text) { tipText = tt_text; tipTextW = MAX_TEXT_WIDTH; tipTextH = 0; textSize = Fl_Tooltip::size(); /* Calculate & set dimensions of the tooltip text */ fl_font(Fl_Tooltip::font(), textSize); fl_measure(tipText.c_str(), tipTextW, tipTextH, 0); if (positioned) update(); } /* Set the type of the formatted value */ void DynTooltip::setValueType(ValueType vt) { valueType = vt; if (positioned) update(); } /* Set the graphics used alongside the formatted value, if any. Note: The graphicstype should probably always be the same as the valuetype, and this field may be removed in the future. */ void DynTooltip::setGraphicsType(ValueType gvt) { graphicsType = gvt; custom_graph_dimensions(graphicsType, graphW, graphH); if (positioned) update(); } /* Set the position of the tooltip relative to the position of the mouse when the tooltip is shown. */ void DynTooltip::setOffset(int x, int y) { xoffs = x; yoffs = y; } /* Change the position of the tooltip unless it is already visible. */ inline void DynTooltip::reposition() { if (!positioned) { const int cursor_y = Fl::event_y_root(); // Check if tooltip would extend below screen // (in practice it is more lenient, but better to be safe than to have an invisible tooltip) if (cursor_y + yoffs + h() > Fl::h()) { position(Fl::event_x_root() + xoffs, cursor_y - yoffs - h()); } else { position(Fl::event_x_root() + xoffs, cursor_y + yoffs); } positioned = true; } } /* For readability - trust the optimizer */ inline int max(int a, int b) { return a >= b ? a : b; } /* Update the size parameters and message strings. */ void DynTooltip::update() { /* Update formatted value */ valueText = convert_value(valueType, currentValue); /* Calculate size bounds for the formatted value string */ valTextW = MAX_TEXT_WIDTH; valTextH = 0; fl_font(Fl_Tooltip::font(), Fl_Tooltip::size()); fl_measure(valueText.c_str(), valTextW, valTextH, 0); int _w = max(valTextW, graphW); int _h = valTextH + graphH; if (!onlyValue) { _w = max(_w, tipTextW); _h += tipTextH; } /* Add standard tooltip margins and set size*/ _w += 6;//Fl_Tooltip::margin_width() * 2; _h += 6;//Fl_Tooltip::margin_height() * 2; size(_w, _h); redraw(); } /* Use static style parameters for regular tooltips to draw the custom ones */ void DynTooltip::draw() { const int mw = 3;//Fl_Tooltip::margin_width(); const int mh = 3;//Fl_Tooltip::margin_height(); int x = mw, y = mh; int _w = w() - mw * 2; draw_box(FL_BORDER_BOX, 0, 0, w(), h(), Fl_Tooltip::color()); fl_color(Fl_Tooltip::textcolor()); fl_font(Fl_Tooltip::font(), Fl_Tooltip::size()); /* Draw tooltip text */ if (!onlyValue) { fl_draw(tipText.c_str(), x, y, _w, tipTextH, Fl_Align((tipTextW < valTextW || tipTextW < graphW ? FL_ALIGN_CENTER : FL_ALIGN_LEFT)| FL_ALIGN_WRAP)); y += tipTextH; } /* Draw formatted tooltip value */ fl_draw(valueText.c_str(), x, y, _w, valTextH, Fl_Align(FL_ALIGN_CENTER | FL_ALIGN_WRAP)); /* Draw additional graphics */ if (graphicsType != VC_plainValue) custom_graphics(graphicsType, currentValue, w(), h() - mh); } /* Standard tooltip behaviour */ void DynTooltip::tipHandle(int event) { switch(event) { case FL_ENTER: Fl::remove_timeout(resetRecent); setOnlyValue(false); dynshow(_recent ? Fl_Tooltip::hoverdelay() : Fl_Tooltip::delay()); break; case FL_PUSH: case FL_DRAG: case FL_MOUSEWHEEL: Fl::remove_timeout(delayedShow); Fl::remove_timeout(resetRecent); setOnlyValue(true); dynshow(0); break; case FL_LEAVE: case FL_RELEASE: case FL_HIDE: Fl::remove_timeout(delayedShow); Fl::add_timeout(Fl_Tooltip::hoverdelay(),resetRecent); hide(); break; } } yoshimi-2.3.5.1/src/UI/DynamicTooltip.h000066400000000000000000000043021506652756400175740ustar00rootroot00000000000000/* DynamicTooltip.h Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2016 Will Godfrey Copyright 2017 Jesper Lloyd Copyright 2018 Will Godfrey and others Idea originally derived from work by Greg Ercolano (http://seriss.com/people/erco/fltk/) This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. */ #ifndef DynamicTooltip_h #define DynamicTooltip_h #include #include "UI/MiscGui.h" /* Tooltip window used for dynamic, formatted messages for valuator widgets (dials, sliders, etc.) */ class DynTooltip : private Fl_Menu_Window { public: DynTooltip(); ~DynTooltip(); void setValue(float); void setValueType(ValueType vt); void setGraphicsType(ValueType gv_); void setTooltipText(const string& tt_text); void setOnlyValue(bool onlyval); void hide(); void dynshow(float timeout=0); void setOffset(int x, int y); void draw(); void tipHandle(int event); private: void reposition(); void update(); float currentValue; string tipText; string valueText; ValueType valueType; ValueType graphicsType; /* tooltip font size when this tooltip was last shown */ int textSize; bool onlyValue; bool positioned; int tipTextW, tipTextH; int valTextW, valTextH; int graphW, graphH; /* relative tooltip position */ int xoffs, yoffs; // static bool _recent; }; #endif yoshimi-2.3.5.1/src/UI/EffUI.fl000066400000000000000000003253241506652756400157570ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0403 header_name {.h} code_name {.cc} comment {EffUI.h} {not_in_source in_header } comment {EffUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2016-2025, Will Godfrey, Kristian Amlie & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original } {selected in_source in_header } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetPDial.h"} {public local } decl {\#include "EnvelopeUI.h"} {public local } decl {\#include "FilterUI.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {public local } decl {\#include "Misc/NumericFuncs.h" using func::power;} {private local } decl {\#include "Effects/EffectMgr.h"} {public local } decl {\#include "Misc/MirrorData.h"} {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {using std::to_string;} {private global } class EQGraph {: {public Fl_Box} } { Function {EQGraph(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {//} {} } Function {init(SynthEngine* synth, RoutingTag conEQ)} {} { code {// graph.activate(GuiDataExchange::Connection{synth->interchange.guiDataExchange, conEQ});} {} } Function {draw_freq_line(float freq, bool major = false)} {} { code {// fl_color(EQ_grid); float xFac = EQ::xScaleFac(freq); if (major) { if (active_r()) fl_color(EQ_major_grid); else fl_color(EQ_grid); } if (0.0 < xFac && xFac < 1.0) fl_line(x() + int(xFac * w()), y(), x() + int(xFac * w()), y() + h());} {} } Function {draw()} {} { code {// int ox = x(), oy = y(); fl_line_style(0, int(1 * w() / 190.0f)); if (active_r()) fl_color(EQ_back); else fl_color(EQ_back_off); fl_rectf(ox, oy, w(), h()); // draw the lines fl_color(EQ_grid); fl_line(ox + 2, oy + h() / 2, ox + w() - 2, oy + h() / 2); float xFac = EQ::xScaleFac(1000.0); if (0.0 < xFac && xFac < 1.0) fl_line(ox + int(xFac * w()), oy, ox + int(xFac * w()), oy + h()); for (int i = 1; i < 10; ++i) if (i == 1) { draw_freq_line(i * 100.0, true); draw_freq_line(i * 1000.0, true); } else { draw_freq_line(i * 10.0, i==5); draw_freq_line(i * 100.0, i==5); draw_freq_line(i * 1000.0, i==5); } draw_freq_line(10000.0, true); draw_freq_line(20000.0, false); const int gridY = 6; if (h() >= 3 * gridY) for (int i = 1; i < gridY; ++i) { int level = oy + int( i * float(h()) / gridY); fl_line(ox+2, level, ox-2 + w(), level); } fl_line_style(0, int(2 * w() / 190.0f)); // draw the frequency response //if (active_r()) fl_color(EQ_line); //else //fl_color(EQ_line_off); int oix = 0; int oiy( h() * lookupResponse(0.0)); for (int i = 1; i < w(); ++i) { float scalePos = float(i) / w(); auto iy = int( h() * lookupResponse(scalePos)); if (oiy >= 0 && oiy < h() && iy >= 0 && iy < h()) fl_line(ox + oix, oy+h() - oiy ,ox + i, oy+h() - iy); oix = i; oiy = iy; } fl_line_style(0, 1);} {} } Function {lookupResponse(float scaleFac)} {return_type float } { code {return graph.get().lookup(scaleFac);} {} } decl {MirrorData graph;} {private local } } class EffUI {: {public Fl_Group,public PresetsUI_} } { Function {EffUI(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// filterwindow = NULL; fwin_filterui = NULL;} {} } Function {~EffUI()} {} { code {// effnullwindow->hide(); // delete (effnullwindow); effreverbwindow->hide(); // delete (effreverbwindow); effechowindow->hide(); // delete (effechowindow); effchoruswindow->hide(); // delete (effchoruswindow); effphaserwindow->hide(); // delete (effphaserwindow); effalienwahwindow->hide(); // delete (effalienwahwindow); effdistortionwindow->hide(); // delete (effdistortionwindow); effeqwindow->hide(); // delete (effeqwindow); effdynamicfilterwindow->hide(); // delete (effdynamicfilterwindow); if (filterwindow != NULL) { if (filterwindow->visible()) saveWin(synth, filterwindow->w(), filterwindow->h(), filterwindow->x(), filterwindow->y(), true, "xFilter-dynamic " + to_string(npart)); filterwindow->hide(); delete(filterwindow); }} {} } Function {make_null_window()} {} { Fl_Window effnullwindow { xywh {912 927 380 95} type Double box PLASTIC_THIN_UP_BOX color 223 hide class Fl_Group } { Fl_Text_Display noeffect { label {No Effects Applied} xywh {120 35 10 20} box NO_BOX labelfont 1 labelcolor 64 align 8 textcolor 64 } } } Function {make_reverb_window()} {} { Fl_Window effreverbwindow { xywh {839 53 380 95} type Double box PLASTIC_UP_BOX color 223 labelsize 12 labelcolor 64 align 33 hide class Fl_Group } { Fl_Text_Display revname { label {Reverb } xywh {10 10 0 20} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 8 textcolor 64 } Fl_Choice revp { label Preset callback {// send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {115 13 90 15} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 textfont 1 textsize 10 textcolor 188 code0 {o->add("Cathedral 1");o->add("Cathedral 2");o->add("Cathedral 3");o->add("Hall 1");o->add("Hall 2");o->add("Room 1");o->add("Room 2");o->add("Basement");o->add("Tunnel");o->add("Echoed 1");o->add("Echoed 2");o->add("Very Long 1");o->add("Very Long 2");} } {} Fl_Choice revp10 { label Type callback {// send_data(TOPLEVEL::action::forceUpdate, 10, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {240 13 75 15} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 textfont 1 textsize 10 textcolor 188 code0 {o->add("Random");o->add("Freeverb");o->add("Bandwidth");} } {} Fl_Dial revp0 { label Vol callback {// int butt = 0; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; if (isInsert()) // D/W { value = value / 2; } } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {10 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code1 {o->setValueType(VC_FXReverbVol);} class WidgetPDial } Fl_Dial revp1 { label Pan callback {// int butt = 1; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {45 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code1 {o->setValueType(VC_PanningStd);} class WidgetPDial } Fl_Dial revp2 { label Time callback {// int butt = 2; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Duration of effect} xywh {80 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code1 {o->setValueType(VC_FXReverbTime);} class WidgetPDial } Fl_Dial revp3 { label {I.del} callback {// int butt = 3;; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Initial delay} xywh {120 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 code0 {o->setValueType(VC_FXReverbIDelay);} class WidgetPDial } Fl_Dial revp4 { label {I.delfb} callback {// int butt = 4; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Initial delay feedback} xywh {155 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_percent128);} class WidgetPDial } Fl_Dial revp12 { label BW callback {// int butt = 12; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {200 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 deactivate code0 {if (effParam(10)==2) o->activate();} code1 {o->setValueType(VC_FXReverbBandwidth);} class WidgetPDial } Fl_Dial revp6 { label {E/R} callback {// int butt = 6; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {235 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 deactivate class WidgetPDial } Fl_Dial revp7 { label LPF callback {// int butt = 7; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Low pass filter} xywh {270 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FXReverbLowPass);} class WidgetPDial } Fl_Dial revp8 { label HPF callback {// int butt = 8; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {High pass filter} xywh {305 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FXReverbHighPass);} class WidgetPDial } Fl_Dial revp9 { label Damp callback {// int butt = 9; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip Dampening xywh {340 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 minimum 64 maximum 127 step 1 code0 {o->setValueType(VC_percent64_127);} class WidgetPDial } Fl_Dial revp11 { label {R.S.} callback {// int butt = 11; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = reverbPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip RoomSize xywh {342 8 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 4 minimum 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } } } Function {make_echo_window()} {} { Fl_Window effechowindow { xywh {782 171 380 95} type Double box PLASTIC_UP_BOX color 223 labelfont 1 labelsize 12 hide class Fl_Group } { Fl_Text_Display echoname { label Echo xywh {10 10 0 20} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 8 textcolor 64 } Fl_Choice echop { label Preset callback {// send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} xywh {102 13 96 15} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 textfont 1 textsize 10 textcolor 188 code0 {o->add("Echo 1");o->add("Echo 2");o->add("Echo 3");o->add("Echo 4");o->add("Simple Echo");o->add("Canyon");o->add("Panning Echo 1");o->add("Panning Echo 2");o->add("Feedback Echo 3");} } {} Fl_Dial echop0 { label Vol callback {// int butt = 0; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = echoPresets[presetNum][butt]; if (isInsert()) // D/W { value = value / 2; } } send_data(0, butt, value, (EFFECT::type::echo), TOPLEVEL::type::Integer); // send_data(0, 0, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {10 45 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_FXEchoVol);} class WidgetPDial } Fl_Dial echop1 { label Pan callback {// int butt = 1; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = echoPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::echo), TOPLEVEL::type::Integer);} xywh {64 45 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial } Fl_Dial echop2 { label Delay callback {// int butt = 2; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = echoPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::echo), TOPLEVEL::type::Integer);} xywh {118 45 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(isBeatSync() ? VC_FXlfofreqBPM : VC_FXEchoDelay);} code1 {o->label(isSepDelay() ? "L.Delay" : "Delay");} class WidgetPDial } Fl_Dial echop3 { label {LRdl.} callback {// int butt = 3; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = echoPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {If Sep is disabled: Delay between L/R If Sep is enabled: Right Delay} xywh {172 45 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(isSepDelay() ? (isBeatSync() ? VC_FXlfofreqBPM : VC_FXEchoDelay) : VC_FXEchoLRdel);} code1 {o->label(isSepDelay() ? "R.Delay" : "LRdl.");} class WidgetPDial } Fl_Dial echop4 { label {LRc.} callback {// int butt = 4; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = echoPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {L/R crossover} xywh {226 45 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial echop5 { label {Fb.} callback {// int butt = 5; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = echoPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip Feedback xywh {280 45 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial echop6 { label Damp callback {// int butt = 6; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = echoPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip Dampening xywh {334 45 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Check_Button echop7 { label Separate callback {// send_data(0, EFFECT::control::sepLRDelay, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {Separate Left / Right Delay} xywh {153 44 15 15} down_box DOWN_BOX labelsize 11 align 1 } Fl_Check_Button echop17 { label BPM callback {// send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM. Note that the delay is capped at 5 seconds, even if the tempo is slower than this.} xywh {325 15 15 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 } } } Function {make_chorus_window()} {} { Fl_Window effchoruswindow { xywh {712 188 380 95} type Double box PLASTIC_UP_BOX color 223 labelfont 1 hide class Fl_Group } { Fl_Text_Display chorusname { label Chorus xywh {10 10 0 20} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 8 textcolor 64 } Fl_Choice chorusp { label Preset callback {// send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {121 13 96 16} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 textfont 1 textsize 10 textcolor 188 code0 {o->add("Chorus 1");o->add("Chorus 2");o->add("Chorus 3");o->add("Celeste 1");o->add("Celeste 2");o->add("Flange 1");o->add("Flange 2");o->add("Flange 3");o->add("Flange 4");o->add("Flange 5");} } {} Fl_Choice chorusp4 { label {LFO type} callback {// send_data(0, 4, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {189 65 43 15} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 2 textfont 1 textsize 9 textcolor 188 code0 {o->add("Sine");o->add("Tri");} } {} Fl_Dial chorusp0 { label Vol callback {// int butt = 0; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {10 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FXdefaultVol);} class WidgetPDial } Fl_Dial chorusp1 { label Pan callback {// int butt = 1; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {45 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial } Fl_Dial chorusp2 { label Freq callback {// int butt = 2; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {LFO frequency} xywh {85 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(isBeatSync() ? VC_FXlfofreqBPM : VC_FXlfofreq);} class WidgetPDial } Fl_Dial chorusp18 { label Start callback {// int value = lrint(o->value()); if (Fl::event_button() == 3) { value = 0; } send_data(0, EFFECT::control::bpmStart, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {Start of LFO phase relative to start of beat. This has no effect unless you are syncing to a song position, using MIDI or a plugin host.} xywh {120 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 code0 {o->setValueType(VC_PhaseOffset);} code1 {if (isBeatSync()) o->activate(); else o->deactivate();} class WidgetPDial } Fl_Dial chorusp3 { label Rnd callback {// int butt = 3; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {LFO randomness} xywh {155 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial chorusp5 { label {St.df} callback {// int butt = 5; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {L/R phase shift} xywh {237 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FXlfoStereo);} class WidgetPDial } Fl_Dial chorusp6 { label Dpth callback {// int butt = 6; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {LFO depth} xywh {272 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FXChorusDepth);} class WidgetPDial } Fl_Dial chorusp7 { label Delay callback {// int butt = 7; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {307 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FXChorusDelay);} class WidgetPDial } Fl_Dial chorusp8 { label Fb callback {// int butt = 8; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip Feedback xywh {342 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FXdefaultFb);} class WidgetPDial } Fl_Dial chorusp9 { label {L/R} callback {// int butt = 9; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = chorusPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {Channel routing} xywh {254 15 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 align 1 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Check_Button chorusflange { label Flange callback {// send_data(0, 10, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {120 10 55 20} box THIN_UP_BOX down_box DOWN_BOX color 223 selection_color 64 labelfont 1 labelsize 10 labelcolor 64 hide deactivate code0 {o->value(effParam(10));} class Fl_Check_Button2 } Fl_Check_Button chorusp11 { label Subtract callback {// send_data(0, 11, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {Inverts the output} xywh {300 19 70 16} down_box DOWN_BOX color 223 selection_color 64 labelsize 11 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button chorusp17 { label BPM callback {// send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM.} xywh {190 45 50 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 } } } Function {make_phaser_window()} {} { Fl_Window effphaserwindow { xywh {1121 411 380 95} type Double box PLASTIC_UP_BOX color 223 labelsize 11 hide class Fl_Group } { Fl_Text_Display phasername { label Phaser xywh {10 10 0 20} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 8 textcolor 64 } Fl_Choice phaserp { label Preset callback {// send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} xywh {65 21 82 15} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 align 1 textfont 1 textsize 10 textcolor 188 code0 {o->add("Phaser 1");o->add("Phaser 2");o->add("Phaser 3");o->add("Phaser 4");o->add("Phaser 5");o->add("Phaser 6");o->add("APhaser 1");o->add("APhaser 2");o->add("APhaser 3");o->add("APhaser 4");o->add("APhaser 5");o->add("APhaser 6");} } {} Fl_Choice phaserp4 { label {LFO Type} callback {// send_data(0, 4, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {199 65 43 15} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 2 textfont 1 textsize 9 textcolor 188 code0 {o->add("Sine");o->add("Tri");} } {} Fl_Dial phaserp0 { label Vol callback {// int butt = 0; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {8 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_FXdefaultVol);} class WidgetPDial } Fl_Dial phaserp1 { label Pan callback {// int butt = 1; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} xywh {46 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial } Fl_Dial phaserp2 { label Freq callback {// int butt = 2; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {LFO frequency} xywh {84 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(isBeatSync() ? VC_FXlfofreqBPM : VC_FXlfofreq);} class WidgetPDial } Fl_Dial phaserp18 { label Start callback {// int butt = 18; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = 0; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Start of LFO phase relative to start of beat. This has no effect unless you are syncing to a song position, using MIDI or a plugin host.} xywh {125 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(VC_PhaseOffset);} code1 {if (isBeatSync()) o->activate(); else o->deactivate();} class WidgetPDial } Fl_Dial phaserp3 { label Rnd callback {// int butt = 3; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {LFO randomness} xywh {165 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Check_Button phaserp17 { label BPM callback {// send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM.} xywh {200 47 17 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 align 8 code0 {o->value(isBeatSync());} class Fl_Check_Button2 } Fl_Dial phaserp5 { label {St.df} callback {// int butt = 5; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Left/Right channel phase shift} xywh {248 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_FXlfoStereo);} class WidgetPDial } Fl_Dial phaserp6 { label Depth callback {// int butt = 6; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {LFO depth} xywh {191 15 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial phaserp7 { label Fb callback {// int butt = 7; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip Feedback xywh {286 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_FXdefaultFb);} class WidgetPDial } Fl_Counter phaserp8 { label Stages callback {// send_data(0, 8, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} xywh {326 63 45 15} type Simple labelsize 11 labelcolor 64 minimum 1 maximum 12 step 1 textfont 1 textsize 11 textcolor 64 } Fl_Dial phaserp9 { label {L/R} callback {// int butt = 9; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Channel routing} xywh {229 15 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Check_Button phaserp10 { label {Sub.} callback {// send_data(0, 10, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Inverts the output} xywh {356 42 17 16} down_box DOWN_BOX color 223 selection_color 64 labelsize 11 labelcolor 64 align 4 class Fl_Check_Button2 } Fl_Dial phaserp11 { label Phase callback {// int butt = 11; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} xywh {150 15 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Check_Button phaserp12 { label Hyper callback {// send_data(0, 12, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Hyper-sine} xywh {356 26 17 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 align 4 deactivate class Fl_Check_Button2 } Fl_Dial phaserp13 { label Dist callback {// int butt = 13; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = phaserPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip Distortion xywh {267 15 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 align 1 maximum 127 step 1 deactivate code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Check_Button phaserp14 { label Analog callback {// send_data(TOPLEVEL::action::forceUpdate, 14, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Emulates FET} xywh {356 10 17 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 align 4 class Fl_Check_Button2 } } } Function {make_alienwah_window()} {} { Fl_Window effalienwahwindow { xywh {877 543 380 95} type Double box PLASTIC_UP_BOX color 223 labelfont 1 hide class Fl_Group } { Fl_Text_Display alienname { label AlienWah xywh {10 10 0 20} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 8 textcolor 64 } Fl_Choice awp { label Preset callback {// send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {135 13 96 15} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 textfont 1 textsize 10 textcolor 188 code0 {o->add("Alienwah 1");o->add("Alienwah 2");o->add("Alienwah 3");o->add("Alienwah 4");} } {} Fl_Choice awp4 { label {LFO type} callback {// send_data(0, 4, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {185 65 43 15} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 2 textfont 1 textsize 9 textcolor 188 code0 {o->add("Sine");o->add("Tri");} } {} Fl_Dial awp0 { label Vol callback {// int butt = 0; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; if (isInsert()) // D/W { value = value / 2; } } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {5 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial awp1 { label Pan callback {// int butt = 1; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {40 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial awp2 { label Freq callback {// int butt = 2; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {LFO frequency} xywh {80 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(isBeatSync() ? VC_FXlfofreqBPM : VC_FXlfofreq);} class WidgetPDial } Fl_Dial awp3 { label Rnd callback {// int butt = 3; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {LFO randomness} xywh {150 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial awp18 { label Start callback {// int butt = 18; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = 0; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {Start of LFO phase relative to start of beat. This has no effect unless you are syncing to a song position, using MIDI or a plugin host.} xywh {115 50 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(VC_PhaseOffset);} code1 {if (isBeatSync()) o->activate(); else o->deactivate();} class WidgetPDial } Fl_Dial awp5 { label {St.df} callback {// int butt = 5; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {Left/Right channel phase shift} xywh {231 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial awp6 { label Dpth callback {// int butt = 6; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip Depth xywh {266 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial awp7 { label Fb callback {// int butt = 7; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip Feedback xywh {301 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial awp9 { label {L/R} callback {// int butt = 9; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {285 15 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 align 1 maximum 127 step 1 class WidgetPDial } Fl_Dial awp10 { label Phase callback {// int butt = 10; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = alienPresets[presetNum][butt]; } send_data(0, butt, value, (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {245 15 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 align 1 maximum 127 step 1 class WidgetPDial } Fl_Counter awp8 { label Delay callback {// send_data(0, 8, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {338 64 35 15} type Simple labelsize 11 labelcolor 64 minimum 0 maximum 100 step 1 textsize 11 textcolor 64 } Fl_Check_Button awp17 { label BPM callback {// send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM.} xywh {185 45 45 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 code0 {o->value(isBeatSync());} } } } Function {make_distortion_window()} {} { Fl_Window effdistortionwindow { xywh {879 667 380 95} type Double box PLASTIC_UP_BOX color 223 labelfont 1 hide class Fl_Group } { Fl_Text_Display distname { label Distortion xywh {10 10 0 20} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 8 textcolor 64 } Fl_Choice distp { label Preset callback {// send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} xywh {139 13 96 16} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 textfont 1 textsize 10 textcolor 188 code0 {o->add("Overdrive 1");o->add("Overdrive 2");o->add("Exciter 1");o->add("Exciter 2");o->add("Guitar Amp");o->add("Quantize");} } {} Fl_Choice distp5 { label Type callback {// send_data(0, 5, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} xywh {192 56 60 15} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 2 textfont 1 textsize 9 textcolor 188 code0 {o->add("Atan");o->add("Asym 1");o->add("Power1");o->add("Sine");o->add("Quants");o->add("Zigzag");o->add("Limit");o->add("LimtiU");o->add("LimitL");o->add("ILimit");o->add("Clip");o->add("Asym 2");o->add("Power2");o->add("Sigm");} } {} Fl_Dial distp0 { label Vol callback {// int butt = 0; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = distPresets[presetNum][butt]; if (isInsert()) // D/W { value = value / 2; } } send_data(0, butt, value, EFFECT::type::distortion, TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {10 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_FXDistVol);} class WidgetPDial } Fl_Dial distp1 { label Pan callback {// int butt = 1; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = distPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::distortion, TOPLEVEL::type::Integer);} xywh {45 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial } Fl_Dial distp2 { label {LRc.} callback {// int butt = 2; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = distPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::distortion, TOPLEVEL::type::Integer);} tooltip {L/R mix} xywh {80 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial distp3 { label Drive callback {// int butt = 3; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = distPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::distortion, TOPLEVEL::type::Integer);} tooltip {Input amplification} xywh {120 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial distp4 { label Level callback {// int butt = 4; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = distPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::distortion, TOPLEVEL::type::Integer);} tooltip {Output amplification} xywh {155 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_FXDistLevel);} class WidgetPDial } Fl_Dial distp7 { label LPF callback {// int butt = 7; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = distPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::distortion, TOPLEVEL::type::Integer);} tooltip {Low pass filter} xywh {285 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_FXDistLowPass);} class WidgetPDial } Fl_Dial distp8 { label HPF callback {// int butt = 8; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = distPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::distortion, TOPLEVEL::type::Integer);} tooltip {High pass filter} xywh {320 40 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_FXDistHighPass);} class WidgetPDial } Fl_Check_Button distp6 { label {Neg.} callback {// send_data(0, 6, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} xywh {260 55 15 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 align 2 class Fl_Check_Button2 } Fl_Check_Button distp9 { label {St.} callback {// send_data(0, 9, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip Stereo xywh {357 55 15 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 align 2 class Fl_Check_Button2 } Fl_Check_Button distp10 { label PF callback {// send_data(0, 10, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip {Applies the filters(before or after) the distortion} xywh {357 38 15 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 align 1 class Fl_Check_Button2 } } } Function {make_eq_window()} {} { Fl_Window effeqwindow { xywh {753 685 380 95} type Double box PLASTIC_UP_BOX color 223 labelfont 1 hide class Fl_Group } { Fl_Text_Display eqname { label EQ xywh {10 10 0 20} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 8 textcolor 64 } Fl_Dial eqp0 { label Gain callback {// int butt = 0; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = EQmaster_def; } send_data(TOPLEVEL::action::forceUpdate, butt, value, (EFFECT::type::eq), TOPLEVEL::type::Integer);} xywh {10 41 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FXEQgain);} class WidgetPDial } Fl_Counter bandcounter { label Band callback {// send_data(TOPLEVEL::action::forceUpdate, 1, o->value() - 1, (EFFECT::type::eq), TOPLEVEL::type::Integer);} tooltip {Band no.} xywh {263 20 45 15} type Simple labelsize 11 labelcolor 64 align 1 minimum 0 maximum 1 step 1 value 1 textsize 11 textcolor 64 code0 {o->bounds(1,MAX_EQ_BANDS);} } Fl_Choice typechoice { label Type callback {// send_data(TOPLEVEL::action::forceUpdate, 10, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} tooltip Type xywh {323 20 40 15} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 align 1 when 6 textfont 1 textsize 9 textcolor 188 code0 {o->add("Off");o->add("Lp1");o->add("Hp1");o->add("Lp2");o->add("Hp2");o->add("Bp2");o->add("N2");o->add("Pk");o->add("LSh");o->add("HSh");} } {} Fl_Group bandgroup { xywh {241 40 134 45} box ENGRAVED_FRAME deactivate } { Fl_Dial freqdial { label Freq callback {// int butt = 11; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = EQfreq_def; } send_data(TOPLEVEL::action::forceUpdate, butt, value, (EFFECT::type::eq), TOPLEVEL::type::Integer);} xywh {247 45 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 when 3 maximum 127 code0 {o->setValueType(VC_FXEQfreq);} class WidgetPDial } Fl_Dial gaindial { label Gain callback {// int butt = 12; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = EQgain_def; } send_data(TOPLEVEL::action::forceUpdate, butt, value, (EFFECT::type::eq), TOPLEVEL::type::Integer);} xywh {277 45 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 when 3 maximum 127 step 1 code0 {o->setValueType(VC_FXEQfilterGain);} class WidgetPDial } Fl_Dial qdial { label Q callback {// int butt = 13; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = EQq_def; } send_data(TOPLEVEL::action::forceUpdate, butt, value, (EFFECT::type::eq), TOPLEVEL::type::Integer);} tooltip {Resonance/Bandwidth} xywh {307 45 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 when 3 maximum 127 code0 {o->setValueType(VC_FXEQq);} class WidgetPDial } Fl_Counter stagescounter { label Stages callback {// send_data(TOPLEVEL::action::forceUpdate, 14, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} tooltip {Additional filter stages} xywh {337 55 30 15} type Simple labelsize 10 labelcolor 64 minimum 1 maximum 127 step 1 value 1 textfont 1 textsize 11 textcolor 64 code0 {o->bounds(0,MAX_FILTER_STAGES - 1);} } Fl_Text_Display extra { label Extra xywh {334 55 35 0} labelsize 11 labelcolor 64 textsize 9 textcolor 64 } } Fl_Box eqgraph { xywh {45 10 190 75} box BORDER_BOX class EQGraph } } } Function {make_dynamicfilter_window()} {} { Fl_Window effdynamicfilterwindow { xywh {877 915 380 95} type Double box PLASTIC_UP_BOX color 223 labelfont 1 hide class Fl_Group } { Fl_Text_Display dfname { label DynFilter xywh {10 10 0 20} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 8 textcolor 64 } Fl_Choice dfp { label Preset callback {// send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} xywh {132 13 90 16} down_box BORDER_BOX selection_color 49 labelsize 11 labelcolor 64 textfont 1 textsize 10 textcolor 188 code0 {o->add("WahWah");o->add("AutoWah");o->add("Sweep");o->add("VocalMorph1");o->add("VocalMorph2");} } {} Fl_Choice dfp4 { label {LFO type} callback {// send_data(0, 4, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {190 60 43 15} down_box BORDER_BOX selection_color 49 labelsize 10 labelcolor 64 align 2 textfont 1 textsize 9 textcolor 188 code0 {o->add("Sine");o->add("Tri");} } {} Fl_Dial dfp0 { label Vol callback {// int butt = 0; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = dynPresets[presetNum][butt]; if (not isInsert()) // D/W - yes this one is reversed! { value = value / 2; } } send_data(0, 0, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {6 44 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial dfp1 { label Pan callback {// int butt = 1; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = dynPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} xywh {42 44 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial dfp2 { label Freq callback {// int butt = 2; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = dynPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} tooltip {LFO frequency} xywh {80 44 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(isBeatSync() ? VC_FXlfofreqBPM : VC_FXlfofreq);} class WidgetPDial } Fl_Dial dfp3 { label Rnd callback {// int butt = 3; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = dynPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} tooltip {LFO randomness} xywh {155 44 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial dfp18 { label Start callback {// int butt = 18; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = 0; } send_data(0, butt, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} tooltip {Start of LFO phase relative to start of beat. This has no effect unless you are syncing to a song position, using MIDI or a plugin host.} xywh {118 44 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 when 4 maximum 127 step 1 code0 {o->setValueType(VC_PhaseOffset);} code1 {if (isBeatSync()) o->activate(); else o->deactivate();} class WidgetPDial } Fl_Dial dfp5 { label {St.df} callback {// int butt = 5; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = dynPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} tooltip {Left/Right channel phase shift} xywh {240 49 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial dfp6 { label LfoD callback {// int butt = 6; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = dynPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} tooltip {LFO depth} xywh {240 8 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 align 8 maximum 127 step 1 class WidgetPDial } Fl_Button filter { label Filter callback {// Showfilt();} xywh {325 12 37 16} box GTK_THIN_UP_BOX color 221 labelsize 11 labelcolor 64 } Fl_Group {} { xywh {277 37 99 53} box EMBOSSED_BOX color 181 } { Fl_Dial dfp7 { label {A.S.} callback {// int butt = 7; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = dynPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} tooltip {Filter vs amplitude} xywh {282 44 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial dfp9 { label {A.M} callback {// int butt = 9; int value = lrint(o->value()); if (Fl::event_button() == 3) { value = dynPresets[presetNum][butt]; } send_data(0, butt, value, EFFECT::type::dynFilter, TOPLEVEL::type::Integer);} tooltip {Rate that amplitude changes the filter} xywh {318 44 30 30} box ROUND_UP_BOX labelsize 11 labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Check_Button dfp8 { label {Inv.} callback {// send_data(0, 8, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Enable for filter frequency to lower with higher input amplitude} xywh {353 58 15 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 align 2 class Fl_Check_Button2 } } Fl_Check_Button dfp17 { label BPM callback {// send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM.} xywh {191 41 45 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 code0 {o->value(isBeatSync());} } } } Function {make_filter_window()} {} { Fl_Window filterwindow { label {Yoshimi : Filter Parameters for DynFilter Effect} callback {filterclose->do_callback();} xywh {1109 779 285 110} type Double hide resizable class ScaleTrackedWindow code0 {filtDW = o->w(); filtDH = o->h();} code1 {o->size_range(filtDW, filtDH, 0, 0, 0, 0, 1);} code2 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("DynFilter"), npart, TOPLEVEL::windowTitle,UNUSED, effNum())).c_str());} } { Fl_Group fwin_filterui { label {DynFilter effect - Filter} xywh {5 5 275 75} box FLAT_BOX color 50 labelsize 12 align 144 code0 {o->init(effect.get().eff_in_core_TODO_deprecated->filterpars,NULL,NULL, npart, (EFFECT::type::dynFilter), effNum());} class FilterUI } {} Fl_Button filterclose { label Close callback {// saveWin(synth, filterwindow->w(), filterwindow->h(), filterwindow->x(), filterwindow->y(), false, "xFilter-dynamic " + to_string(npart)); filterwindow->hide();} xywh {124 86 46 20} box THIN_UP_BOX color 196 labelsize 12 labelcolor 64 } } } Function {isInsert()} {return_type bool } { code {return effect.get().isInsert;} {} } Function {isBeatSync()} {return_type bool } { code {return effect.get().param[EFFECT::control::bpm];} {} } Function {isSepDelay()} {return_type bool } { code {return effect.get().param[EFFECT::control::sepLRDelay];} {} } Function {isEnabled()} {return_type bool } { code {return effect.get().enabled;} {} } Function {isChanged()} {return_type bool } { code {return effect.get().changed;} {} } Function {effNum()} {return_type uchar } { code {return effect.get().effNum;} {} } Function {effType()} {return_type int } { code {return effect.get().effType;} {} } Function {effParam(uint paramNum)} {return_type uchar } { code {return effect.get().param[paramNum];} {} } Function {effPreset()} {return_type uchar } { code {return effect.get().currPreset;} {} } Function {getInsertFxRouting()} {return_type int } { code {return effect.get().insertFxRouting;} {} } Function {getPartFxRouting()} {return_type uchar } { code {return effect.get().partFxRouting;} {} } Function {getPartFxBypass()} {return_type bool } { code {return effect.get().partFxBypass;} {} } Function {send_data(int action, int control, float value, int group, int type)} {} { code {// type |= TOPLEVEL::type::Write; int parameter = UNUSED; if (group == EFFECT::type::eq) { parameter = bandcounter->value() - 1; } int offset = UNUSED; if (group == EFFECT::type::dynFilter) { offset = dfp->value(); } collect_writeData(synth, value, action, type, control, npart, group, effNum(), UNUSED, parameter, offset);} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED, int request = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg, request);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; int value_int = int(value + 0.5f); unsigned char control = getData->data.control; unsigned char efftype = getData->data.kit; unsigned char effnum = getData->data.engine; bool isdynfilter = (effnum == (EFFECT::type::dynFilter)); unsigned char eqband = getData->data.parameter; unsigned char secondary = getData->data.offset; if (efftype != EFFECT::type::eq) presetNum = effPreset(); int textCol = eff_preset; if (isChanged()) textCol = eff_preset_changed; auto __setColor = [this,value](auto& widget, auto& preset, uint paramIdx) {widget->selection_color(setKnob(value,preset[presetNum][paramIdx]));}; switch(efftype) { case EFFECT::type::none: break; case EFFECT::type::reverb: switch (control) { case EFFECT::control::level: revp0->value(value); if (isInsert()) // D/W revp0->selection_color(setKnob(value,int(reverbPresets[presetNum][0])/2)); else __setColor(revp0,reverbPresets,0); break; case EFFECT::control::panning: revp1->value(value); __setColor(revp1,reverbPresets,1); break; case EFFECT::control::frequency: // time here revp2->value(value); __setColor(revp2,reverbPresets,2); break; case 3: revp3->value(value); __setColor(revp3,reverbPresets,3); break; case 4: revp4->value(value); __setColor(revp4,reverbPresets,4); break; case 6: revp6->value(value); __setColor(revp6,reverbPresets,6); break; case 7: revp7->value(value); __setColor(revp7,reverbPresets,7); break; case 8: revp8->value(value); __setColor(revp8,reverbPresets,8); break; case 9: revp9->value(value); __setColor(revp9,reverbPresets,9); break; case 10: revp10->value(value_int); if (value_int == 2) { revp12->activate(); revp12->value(secondary); } else revp12->deactivate(); break; case 11: revp11->value(value); __setColor(revp11,reverbPresets,11); break; case 12: revp12->value(value); __setColor(revp12,reverbPresets,12); break; case EFFECT::control::preset: refresh(); break; } revp->textcolor(textCol); revp->redraw(); break; case EFFECT::type::echo: switch (control) { case EFFECT::control::level: echop0->value(value); if (isInsert()) // D/W echop0->selection_color(setKnob(value,int(echoPresets[presetNum][0])/2)); else __setColor(echop0,echoPresets,0); break; case EFFECT::control::panning: echop1->value(value); __setColor(echop1,echoPresets,1); break; case EFFECT::control::frequency: // delay here echop2->value(value); __setColor(echop2,echoPresets,2); break; case 3: echop3->value(value); __setColor(echop3,echoPresets,3); break; case 4: echop4->value(value); __setColor(echop4,echoPresets,4); break; case 5: echop5->value(value); __setColor(echop5,echoPresets,5); break; case 6: echop6->value(value); __setColor(echop6,echoPresets,6); break; case EFFECT::control::sepLRDelay: echop7->value(value); if (value) { echop2->label("L.Delay"); echop3->label("R.Delay"); if (isBeatSync()) { echop3->setValueType(VC_FXlfofreqBPM); } else { echop3->setValueType(VC_FXEchoDelay); } } else { echop2->label("Delay"); echop3->label("LRdl."); echop3->setValueType(VC_FXEchoLRdel); } // This is needed because the labels do not draw cleanly on // top of each other. effechowindow->redraw(); break; case EFFECT::control::bpm: echop17->value(value); if (value) echop2->setValueType(VC_FXlfofreqBPM); else echop2->setValueType(VC_FXEchoDelay); if (isSepDelay()) { if (value) { echop3->setValueType(VC_FXlfofreqBPM); } else { echop3->setValueType(VC_FXEchoDelay); } } break; case EFFECT::control::preset: refresh(); break; } echop->textcolor(textCol); echop->redraw(); break; case EFFECT::type::chorus: switch (control) { case EFFECT::control::level: chorusp0->value(value); __setColor(chorusp0,chorusPresets,0); break; case EFFECT::control::panning: chorusp1->value(value); __setColor(chorusp1,chorusPresets,1); break; case EFFECT::control::frequency: chorusp2->value(value); __setColor(chorusp2,chorusPresets,2); break; case 3: chorusp3->value(value); __setColor(chorusp3,chorusPresets,3); break; case 5: chorusp5->value(value); __setColor(chorusp5,chorusPresets,5); break; case 6: chorusp6->value(value_int); __setColor(chorusp6,chorusPresets,6); break; case 7: chorusp7->value(value); __setColor(chorusp7,chorusPresets,7); break; case 8: chorusp8->value(value); __setColor(chorusp8,chorusPresets,8); break; case 9: chorusp9->value(value); __setColor(chorusp9,chorusPresets,9); break; case 11: chorusp11->value(value_int); break; case EFFECT::control::bpm: chorusp17->value(value); if (value) { chorusp2->setValueType(VC_FXlfofreqBPM); chorusp18->activate(); } else { chorusp2->setValueType(VC_FXlfofreq); chorusp18->deactivate(); } break; case EFFECT::control::bpmStart: chorusp18->value(value); chorusp18->selection_color(setKnob(value,0)); break; case EFFECT::control::preset: refresh(); break; } chorusp->textcolor(textCol); chorusp->redraw(); break; case EFFECT::type::phaser: switch (control) { case EFFECT::control::level: phaserp0->value(value); __setColor(phaserp0,phaserPresets,0); break; case EFFECT::control::panning: phaserp1->value(value); __setColor(phaserp1,phaserPresets,1); break; case EFFECT::control::frequency: phaserp2->value(value); __setColor(phaserp2,phaserPresets,2); break; case 3: phaserp3->value(value); __setColor(phaserp3,phaserPresets,3); break; case 4: phaserp4->value(value_int); break; case 5: phaserp5->value(value); __setColor(phaserp5,phaserPresets,5); break; case 6: phaserp6->value(value); __setColor(phaserp6,phaserPresets,6); break; case 7: phaserp7->value(value); __setColor(phaserp7,phaserPresets,7); break; case 8: phaserp8->value(value_int); break; case 9: phaserp9->value(value); __setColor(phaserp9,phaserPresets,9); break; case 10: phaserp10->value(value_int); break; case 11: phaserp11->value(value); __setColor(phaserp11,phaserPresets,11); break; case 12: phaserp12->value(value_int); break; case 13: phaserp13->value(value); __setColor(phaserp13,phaserPresets,13); break; case 14: phaserp14->value(value_int); if (value_int != 0) { phaserp9->deactivate(); phaserp7->deactivate(); phaserp12->activate(); phaserp13->activate(); } else { phaserp9->activate(); phaserp7->activate(); phaserp12->deactivate(); phaserp13->deactivate(); } break; case EFFECT::control::bpm: phaserp17->value(value); if (value) { phaserp2->setValueType(VC_FXlfofreqBPM); phaserp18->activate(); } else { phaserp2->setValueType(VC_FXlfofreq); phaserp18->deactivate(); } break; case EFFECT::control::bpmStart: phaserp18->value(value); phaserp18->selection_color(setKnob(value,0)); break; case EFFECT::control::preset: refresh(); break; } phaserp->textcolor(textCol); phaserp->redraw(); break; case EFFECT::type::alienWah: switch (control) { case EFFECT::control::level: awp0->value(value); echop0->value(value); if (isInsert()) // D/W awp0->selection_color(setKnob(value,int(alienPresets[presetNum][0])/2)); else __setColor(awp0,alienPresets,0); break; case EFFECT::control::panning: awp1->value(value); __setColor(awp1,alienPresets,1); break; case EFFECT::control::frequency: awp2->value(value); __setColor(awp2,alienPresets,2); break; case 3: awp3->value(value); __setColor(awp3,alienPresets,3); break; case 4: awp4->value(value_int); break; case 5: awp5->value(value); __setColor(awp5,alienPresets,5); break; case 6: awp6->value(value); __setColor(awp6,alienPresets,6); break; case 7: awp7->value(value); __setColor(awp7,alienPresets,7); break; case 8: awp8->value(value_int); break; case 9: awp9->value(value); __setColor(awp9,alienPresets,9); break; case 10: awp10->value(value); __setColor(awp10,alienPresets,10); break; case EFFECT::control::bpm: awp17->value(value); if (value) { awp2->setValueType(VC_FXlfofreqBPM); awp18->activate(); } else { awp2->setValueType(VC_FXlfofreq); awp18->deactivate(); } break; case EFFECT::control::bpmStart: awp18->value(value); awp18->selection_color(setKnob(value,0)); break; case EFFECT::control::preset: refresh(); break; } awp->textcolor(textCol); awp->redraw(); break; case EFFECT::type::distortion: switch (control) { case EFFECT::control::level: distp0->value(value); if (isInsert()) // D/W distp0->selection_color(setKnob(value,int(distPresets[presetNum][0])/2)); else __setColor(distp0,distPresets,0); break; case EFFECT::control::panning: distp1->value(value); __setColor(distp1,distPresets,1); break; case EFFECT::control::frequency: // LR-mix here distp2->value(value); __setColor(distp2,distPresets,2); break; case 3: distp3->value(value); __setColor(distp3,distPresets,3); break; case 4: distp4->value(value); __setColor(distp4,distPresets,4); break; case 5: distp5->value(value_int); break; case 6: distp6->value(value_int); break; case 7: distp7->value(value); __setColor(distp7,distPresets,7); break; case 8: distp8->value(value); __setColor(distp8,distPresets,8); break; case 9: distp9->value(value_int); break; case 10: distp10->value(value_int); break; case EFFECT::control::preset: refresh(); break; } distp->textcolor(textCol); distp->redraw(); break; case EFFECT::type::eq: if (control == EFFECT::control::level) { eqp0->value(value); eqp0->selection_color(setKnob(value,EQmaster_def)); } else if (control == EFFECT::control::panning) // band number here! { eqband = value_int; bandcounter->value(eqband + 1); EQbandUpdate(eqband); } else if (bandcounter->value() == eqband + 1) { switch (control) { case 10: typechoice->value(value_int); if (value_int == 0) bandgroup->deactivate(); else bandgroup->activate(); if (value_int > 2) qdial->activate(); else qdial->deactivate(); if (value_int > 6) gaindial->activate(); else gaindial->deactivate(); break; case 11: freqdial->value(value); freqdial->selection_color(setKnob(value,EQfreq_def)); break; case 12: gaindial->value(value); gaindial->selection_color(setKnob(value,EQgain_def)); break; case 13: qdial->value(value); qdial->selection_color(setKnob(value,EQq_def)); break; case 14: stagescounter->value(value_int); } } effeqwindow->redraw(); break; case EFFECT::type::dynFilter: if (isdynfilter) { // shouldn't get here return; } switch (control) { case EFFECT::control::level: dfp0->value(value); if (not isInsert()) // D/W (reversed) dfp0->selection_color(setKnob(value,int(dynPresets[presetNum][0])/2)); else __setColor(dfp0,dynPresets,0); break; case EFFECT::control::panning: dfp1->value(value); __setColor(dfp1,dynPresets,1); break; case EFFECT::control::frequency: dfp2->value(value); __setColor(dfp2,dynPresets,2); break; case 3: dfp3->value(value); __setColor(dfp3,dynPresets,3); break; case 4: dfp4->value(value_int); __setColor(dfp4,dynPresets,4); break; case 5: dfp5->value(value); __setColor(dfp5,dynPresets,5); break; case 6: dfp6->value(value); __setColor(dfp6,dynPresets,6); break; case 7: dfp7->value(value); __setColor(dfp7,dynPresets,7); break; case 8: dfp8->value(value_int); break; case 9: dfp9->value(value); __setColor(dfp9,dynPresets,9); break; case EFFECT::control::bpm: dfp17->value(value); if (value) { dfp2->setValueType(VC_FXlfofreqBPM); dfp18->activate(); } else { dfp2->setValueType(VC_FXlfofreq); dfp18->deactivate(); } break; case EFFECT::control::bpmStart: dfp18->value(value); dfp18->selection_color(setKnob(value,0)); break; case EFFECT::control::preset: refresh(); break; } dfp->textcolor(textCol); dfp->redraw(); break; };} {} } Function {init(SynthEngine* synth_, RoutingTag conEffect, RoutingTag conEQ, int npart_)} {} { code {// synth = synth_; effect.activate(GuiDataExchange::Connection{synth->interchange.guiDataExchange, conEffect}); npart = npart_; make_null_window(); make_reverb_window(); make_echo_window(); make_chorus_window(); make_phaser_window(); make_alienwah_window(); make_distortion_window(); make_dynamicfilter_window(); make_eq_window(); eqgraph->init(synth, conEQ); int px=this->parent()->x(); int py=this->parent()->y(); lastEff = -1; presetNum = 0; effnullwindow->position(px,py); effreverbwindow->position(px,py); effechowindow->position(px,py); effchoruswindow->position(px,py); effphaserwindow->position(px,py); effalienwahwindow->position(px,py); effdistortionwindow->position(px,py); effeqwindow->position(px,py); effdynamicfilterwindow->position(px,py); refresh();} {} } Function {refresh(int npart_)} {} { code {// npart = npart_; this->hide(); effnullwindow->hide(); effreverbwindow->hide(); effechowindow->hide(); effchoruswindow->hide(); effphaserwindow->hide(); effalienwahwindow->hide(); effdistortionwindow->hide(); effeqwindow->hide(); effdynamicfilterwindow->hide(); eqband=0; if (filterwindow != NULL) { filterwindow->hide(); delete(filterwindow); filterwindow=NULL; } int nextEff = effect.get().effType + EFFECT::type::none; // get effect not yet converted if (lastEff != nextEff) { presetNum = 0; } auto __setColor = [this](auto& widget, auto& preset, uint paramIdx) {widget->selection_color(setKnob(widget->value(),preset[presetNum][paramIdx]));}; switch(nextEff) { case EFFECT::type::reverb: revp->value(effPreset()); revp0->value(effParam(0)); if (isInsert()) // D/W revp0->selection_color(setKnob(revp0->value(),int(reverbPresets[presetNum][0] / 2))); else __setColor(revp0,reverbPresets,0); if (isInsert()) { revp0->label("D/W"); revp0->setValueType(VC_FXReverbDW); } revp1->value(effParam(1)); __setColor(revp1,reverbPresets,1); revp2->value(effParam(2)); __setColor(revp2,reverbPresets,2); revp3->value(effParam(3)); __setColor(revp3,reverbPresets,3); revp4->value(effParam(4)); __setColor(revp4,reverbPresets,4); revp6->value(effParam(6)); __setColor(revp6,reverbPresets,6); revp7->value(effParam(7)); __setColor(revp7,reverbPresets,7); revp8->value(effParam(8)); __setColor(revp8,reverbPresets,8); revp9->value(effParam(9)); __setColor(revp9,reverbPresets,9); revp10->value(effParam(10)); revp11->value(effParam(11)); __setColor(revp11,reverbPresets,11); revp12->value(effParam(12)); __setColor(revp12,reverbPresets,12); effreverbwindow->show(); break; case EFFECT::type::echo: echop->value(effPreset()); echop0->value(effParam(0)); if (isInsert()) { echop0->label("D/W"); echop0->setValueType(VC_FXEchoDW); echop0->selection_color(setKnob(echop0->value(),int(echoPresets[presetNum][0])/2)); } else __setColor(echop0,echoPresets,0); echop1->value(effParam(1)); __setColor(echop1,echoPresets,1); echop2->value(effParam(2)); __setColor(echop2,echoPresets,2); echop3->value(effParam(3)); __setColor(echop3,echoPresets,3); echop4->value(effParam(4)); __setColor(echop4,echoPresets,4); echop5->value(effParam(5)); __setColor(echop5,echoPresets,5); echop6->value(effParam(6)); __setColor(echop6,echoPresets,6); echop7->value(isSepDelay()); if (isSepDelay()) { echop2->label("L.Delay"); echop3->label("R.Delay"); if (isBeatSync()) { echop3->setValueType(VC_FXlfofreqBPM); } else { echop3->setValueType(VC_FXEchoDelay); } } else { echop2->label("Delay"); echop3->label("LRdl."); echop3->setValueType(VC_FXEchoLRdel); } echop17->value(effParam(EFFECT::control::bpm)); effechowindow->show(); break; case EFFECT::type::chorus: chorusp->value(effPreset()); chorusp0->value(effParam(0)); __setColor(chorusp0,chorusPresets,0); if (isInsert()) { chorusp0->label("D/W"); chorusp0->setValueType(VC_FXdefaultDW); } chorusp1->value(effParam(1)); __setColor(chorusp1,chorusPresets,1); chorusp2->value(effParam(2)); __setColor(chorusp2,chorusPresets,2); chorusp3->value(effParam(3)); __setColor(chorusp3,chorusPresets,3); chorusp4->value(effParam(4)); __setColor(chorusp4,chorusPresets,4); chorusp5->value(effParam(5)); __setColor(chorusp5,chorusPresets,5); chorusp6->value(effParam(6)); __setColor(chorusp6,chorusPresets,6); chorusp7->value(effParam(7)); __setColor(chorusp7,chorusPresets,7); chorusp8->value(effParam(8)); __setColor(chorusp8,chorusPresets,8); chorusp9->value(effParam(9)); __setColor(chorusp9,chorusPresets,9); chorusp11->value(effParam(11)); chorusp17->value(effParam(EFFECT::control::bpm)); if (chorusp17->value()) { chorusp2->setValueType(VC_FXlfofreqBPM); chorusp18->activate(); } else { chorusp2->setValueType(VC_FXlfofreq); chorusp18->deactivate(); } chorusp18->value(effParam(EFFECT::control::bpmStart)); chorusp18->selection_color(setKnob(chorusp18->value(),0)); effchoruswindow->show(); break; case EFFECT::type::phaser: phaserp->value(effPreset()); phaserp0->value(effParam(0)); __setColor(phaserp0,phaserPresets,0); if (isInsert()) { phaserp0->label("D/W"); phaserp0->setValueType(VC_FXdefaultDW); } phaserp1->value(effParam(1)); __setColor(phaserp1,phaserPresets,1); phaserp2->value(effParam(2)); __setColor(phaserp2,phaserPresets,2); phaserp3->value(effParam(3)); __setColor(phaserp3,phaserPresets,3); phaserp4->value(effParam(4)); phaserp5->value(effParam(5)); __setColor(phaserp5,phaserPresets,5); phaserp6->value(effParam(6)); __setColor(phaserp6,phaserPresets,6); phaserp7->value(effParam(7)); __setColor(phaserp7,phaserPresets,7); phaserp8->value(effParam(8)); phaserp9->value(effParam(9)); __setColor(phaserp9,phaserPresets,9); phaserp10->value(effParam(10)); phaserp11->value(effParam(11)); __setColor(phaserp11,phaserPresets,11); phaserp12->value(effParam(12)); phaserp13->value(effParam(13)); __setColor(phaserp13,phaserPresets,13); phaserp14->value(effParam(14)); if (phaserp14->value() != 0) { phaserp9->deactivate(); //phaserp11->deactivate(); phaserp12->activate(); phaserp13->activate(); } else { phaserp9->activate(); //phaserp11->activate(); phaserp12->deactivate(); phaserp13->deactivate(); } phaserp17->value(effParam(EFFECT::control::bpm)); if (phaserp17->value()) { phaserp2->setValueType(VC_FXlfofreqBPM); phaserp18->activate(); } else { phaserp2->setValueType(VC_FXlfofreq); phaserp18->deactivate(); } phaserp18->value(effParam(EFFECT::control::bpmStart)); phaserp18->selection_color(setKnob(phaserp18->value(),0)); effphaserwindow->show(); break; case EFFECT::type::alienWah: awp->value(effPreset()); awp0->value(effParam(0)); if (isInsert()) { awp0->label("D/W"); awp0->selection_color(setKnob(awp0->value(),int(alienPresets[presetNum][0])/2)); } else __setColor(awp0,alienPresets,0); awp1->value(effParam(1)); __setColor(awp1,alienPresets,1); awp2->value(effParam(2)); __setColor(awp2,alienPresets,2); awp3->value(effParam(3)); __setColor(awp3,alienPresets,3); awp4->value(effParam(4)); awp5->value(effParam(5)); __setColor(awp5,alienPresets,5); awp6->value(effParam(6)); __setColor(awp6,alienPresets,6); awp7->value(effParam(7)); __setColor(awp7,alienPresets,7); awp8->value(effParam(8)); awp9->value(effParam(9)); __setColor(awp9,alienPresets,9); awp10->value(effParam(10)); __setColor(awp10,alienPresets,10); awp17->value(effParam(EFFECT::control::bpm)); if (awp17->value()) { awp2->setValueType(VC_FXlfofreqBPM); awp18->activate(); } else { awp2->setValueType(VC_FXlfofreq); awp18->deactivate(); } awp18->value(effParam(EFFECT::control::bpmStart)); awp18->selection_color(setKnob(awp18->value(),0)); effalienwahwindow->show(); break; case EFFECT::type::distortion: distp->value(effPreset()); distp0->value(effParam(0)); __setColor(distp0,distPresets,0); if (isInsert()) { distp0->label("D/W"); distp0->setValueType(VC_FXdefaultDW); } distp1->value(effParam(1)); __setColor(distp1,distPresets,1); distp2->value(effParam(2)); __setColor(distp2,distPresets,2); distp3->value(effParam(3)); __setColor(distp3,distPresets,3); distp4->value(effParam(4)); __setColor(distp4,distPresets,4); distp5->value(effParam(5)); __setColor(distp5,distPresets,5); distp6->value(effParam(6)); __setColor(distp6,distPresets,6); distp7->value(effParam(7)); __setColor(distp7,distPresets,7); distp8->value(effParam(8)); __setColor(distp8,distPresets,8); distp9->value(effParam(9)); __setColor(distp9,distPresets,9); distp10->value(effParam(10)); __setColor(distp10,distPresets,10); effdistortionwindow->show(); break; case EFFECT::type::eq: { eqband = 0; int type = effParam(10); if (type > 0) bandgroup->activate(); else bandgroup->activate(); eqp0->value(effParam(0)); eqp0->selection_color(setKnob(eqp0->value(),EQmaster_def)); bandcounter->value(eqband + 1); typechoice->value(type); freqdial->value(effParam(11)); freqdial->selection_color(setKnob(freqdial->value(),EQfreq_def)); gaindial->value(effParam(12)); gaindial->selection_color(setKnob(gaindial->value(),EQgain_def)); qdial->value(effParam(13)); qdial->selection_color(setKnob(qdial->value(),EQq_def)); if (type < 3) qdial->deactivate(); if (type < 6) gaindial->deactivate(); stagescounter->value(effParam(14)); eqgraph->damage(1); eqgraph->redraw(); effeqwindow->show(); break; } case EFFECT::type::dynFilter: make_filter_window(); dfp->value(effPreset()); dfp0->value(effParam(0)); if (isInsert()) { dfp0->label("D/W"); dfp0->selection_color(setKnob(dfp0->value(),int(dynPresets[presetNum][0])/2)); } else __setColor(dfp0,dynPresets,0); dfp1->value(effParam(1)); __setColor(dfp1,dynPresets,1); dfp2->value(effParam(2)); __setColor(dfp2,dynPresets,2); dfp3->value(effParam(3)); __setColor(dfp3,dynPresets,3); dfp4->value(effParam(4)); __setColor(dfp4,dynPresets,4); dfp5->value(effParam(5)); __setColor(dfp5,dynPresets,5); dfp6->value(effParam(6)); __setColor(dfp6,dynPresets,6); dfp7->value(effParam(7)); __setColor(dfp7,dynPresets,7); dfp8->value(effParam(8)); dfp9->value(effParam(9)); __setColor(dfp9,dynPresets,9); dfp17->value(effParam(EFFECT::control::bpm)); if (dfp17->value()) { dfp2->setValueType(VC_FXlfofreqBPM); dfp18->activate(); } else { dfp2->setValueType(VC_FXlfofreq); dfp18->deactivate(); } dfp18->value(effParam(EFFECT::control::bpmStart)); dfp18->selection_color(setKnob(dfp1->value(),0)); effdynamicfilterwindow->show(); break; default: effnullwindow->show(); break; } lastEff = nextEff; this->show();} {} } Function {refresh()} {} { code {refresh(npart);} {} } Function {UpdatePresetColour(int changed, int efftype)} {} { code {// int textCol = eff_preset; if (changed) textCol = eff_preset_changed; switch (efftype + EFFECT::type::none) { case EFFECT::type::reverb: revp->textcolor(textCol); revp->redraw(); break; case EFFECT::type::echo: echop->textcolor(textCol); echop->redraw(); break; case EFFECT::type::chorus: chorusp->textcolor(textCol); chorusp->redraw(); break; case EFFECT::type::phaser: phaserp->textcolor(textCol); phaserp->redraw(); break; case EFFECT::type::alienWah: awp->textcolor(textCol); awp->redraw(); break; case EFFECT::type::distortion: distp->textcolor(textCol); distp->redraw(); break; case EFFECT::type::eq: break; case EFFECT::type::dynFilter: dfp->textcolor(textCol); dfp->redraw(); break; } //} {} } Function {effRtext(float dScale, int efftype)} {} { code {// int size9 = int(9 * dScale); int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); switch (efftype) { case 0: noeffect->labelsize(14 * dScale); break; case 1: // reverb revname->labelsize(size12); revp->labelsize(size11); revp->textsize(size); revp10->labelsize(size11); revp10->textsize(size); revp0->labelsize(size11); revp1->labelsize(size11); revp2->labelsize(size11); revp3->labelsize(size11); revp4->labelsize(size11); revp12->labelsize(size11); revp6->labelsize(size11); revp7->labelsize(size11); revp8->labelsize(size11); revp9->labelsize(size11); revp11->labelsize(size11); break; case 2: // echo echoname->labelsize(size12); echop->labelsize(size11); echop->textsize(size); echop0->labelsize(size11); echop1->labelsize(size11); echop2->labelsize(size11); echop3->labelsize(size11); echop4->labelsize(size11); echop5->labelsize(size11); echop6->labelsize(size11); echop7->labelsize(size11); echop17->labelsize(size11); break; case 3: // chorus chorusname->labelsize(size12); chorusp->labelsize(size11); chorusp->textsize(size); chorusp4->labelsize(size); chorusp4->textsize(size9); chorusp0->labelsize(size11); chorusp1->labelsize(size11); chorusp2->labelsize(size11); chorusp3->labelsize(size11); chorusp5->labelsize(size11); chorusp6->labelsize(size11); chorusp7->labelsize(size11); chorusp8->labelsize(size11); chorusp9->labelsize(size11); chorusflange->labelsize(size); chorusp11->labelsize(size11); chorusp17->labelsize(size11); chorusp18->labelsize(size11); break; case 4: // phaser phasername->labelsize(size12); phaserp->labelsize(size11); phaserp->textsize(size); phaserp4->labelsize(size); phaserp4->textsize(size9); phaserp0->labelsize(size11); phaserp1->labelsize(size11); phaserp2->labelsize(size11); phaserp3->labelsize(size11); phaserp5->labelsize(size11); phaserp6->labelsize(size11); phaserp7->labelsize(size11); phaserp8->labelsize(size11); phaserp8->textsize(size11); phaserp9->labelsize(size11); phaserp10->labelsize(size11); phaserp11->labelsize(size11); phaserp12->labelsize(size11); phaserp13->labelsize(size11); phaserp14->labelsize(size11); phaserp17->labelsize(size11); phaserp18->labelsize(size11); break; case 5: // alienwah alienname->labelsize(size12); awp->labelsize(size11); awp->textsize(size); awp4->labelsize(size); awp4->textsize(size9); awp0->labelsize(size11); awp1->labelsize(size11); awp2->labelsize(size11); awp3->labelsize(size11); awp5->labelsize(size11); awp6->labelsize(size11); awp7->labelsize(size11); awp9->labelsize(size11); awp10->labelsize(size11); awp8->labelsize(size11); awp8->textsize(size11); awp17->labelsize(size11); awp18->labelsize(size11); break; case 6: // distortion distname->labelsize(size12); distp->labelsize(size11); distp->textsize(size); distp5->labelsize(size); distp5->textsize(size9); distp0->labelsize(size11); distp1->labelsize(size11); distp2->labelsize(size11); distp3->labelsize(size11); distp4->labelsize(size11); distp7->labelsize(size11); distp8->labelsize(size11); distp6->labelsize(size11); distp9->labelsize(size11); distp10->labelsize(size11); break; case 7: // EQ eqname->labelsize(size12); eqp0->labelsize(size11); bandcounter->labelsize(size11); bandcounter->textsize(size11); freqdial->labelsize(size11); gaindial->labelsize(size11); qdial->labelsize(size11); stagescounter->labelsize(size); stagescounter->textsize(size11); extra->labelsize(size); typechoice->labelsize(size11); typechoice->textsize(size9); effeqwindow->redraw(); break; case 8: // dynfilter dfname->labelsize(size12); dfp->labelsize(size11); dfp->textsize(size); dfp4->labelsize(size); dfp4->textsize(size9); dfp0->labelsize(size11); dfp1->labelsize(size11); dfp2->labelsize(size11); dfp3->labelsize(size11); dfp5->labelsize(size11); dfp6->labelsize(size11); filter->labelsize(size11); dfp7->labelsize(size11); dfp8->labelsize(size11); dfp9->labelsize(size11); dfp17->labelsize(size11); dfp18->labelsize(size11); filterclose->labelsize(size12); break; default: break; }} {} } Function {Showfilt()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "xFilter-dynamic " + to_string(npart)); if (fetchW < filtDW || fetchH < filtDH) { fetchW = filtDW; fetchH = filtDH; } checkSane(fetchX, fetchY, fetchW, fetchH, filtDW, filtDH); filterwindow->resize(fetchX, fetchY, fetchW, fetchH); filtRtext(); filterwindow->show();} {} } Function {filtRtext()} {} { code {// float dScale = filterwindow->w() / filtDW; if (dScale < 1.0f) dScale = 1.0f; filterclose->labelsize(12 * dScale); fwin_filterui->filterRtext(dScale); filterwindow->redraw();} {} } Function {EQbandUpdate(int eqband)} {} { code {// int npb = (eqband) * 5 + 10; int type = effParam(npb); typechoice->value(type); if (type == 0) bandgroup->deactivate(); else bandgroup->activate(); if (type > 2) qdial->activate(); else qdial->deactivate(); if (type > 6) gaindial->activate(); else gaindial->deactivate(); int freq = effParam(npb + 1); freqdial->value(freq); int gain = effParam(npb + 2); gaindial->value(gain); int q = effParam(npb + 3); qdial->value(q); int dbl = effParam(npb + 4); stagescounter->value(dbl);} {} } decl {SynthEngine *synth;} {private local } decl {MirrorData effect;} {private local } decl {int eqband;} {private local } decl {int npart;} {private local } decl {float filtDW;} {private local } decl {float filtDH;} {private local } decl {int lastEff;} {private local } decl {int presetNum;} {private local } } yoshimi-2.3.5.1/src/UI/EnvelopeUI.fl000066400000000000000000001731151506652756400170330ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {Envelope.h} {not_in_source in_header } comment {Envelope.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, Alan Calvert Copyright 2016-2024 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. } {selected in_source in_header } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } decl {\#include "UI/WidgetPDial.h"} {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "Params/EnvelopeParams.h"} {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {public global } decl {\#include "MasterUI.h"} {private global } decl {using std::to_string;} {private global } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } class EnvelopeFreeEdit {: {public Fl_Box} } { Function {EnvelopeFreeEdit(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {env=NULL; pair=NULL;} {} } Function {send_data(int action, int control, int offset, float value, int type)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, engine, TOPLEVEL::insert::envelopePointChange, group, offset);} {} } Function {init(EnvelopeParams *env_, int npart_, int kititem_, int engine_, int group_)} {} { code {// env = env_; oldx = -1; currentpoint = -1; cpx = 0; lastpoint = -1; synth = & env->getSynthEngine(); npart = npart_; kititem = kititem_; engine = engine_; group = group_;} {} } Function {setpair(Fl_Box *pair_)} {} { code {pair = pair_;} {} } Function {getpointx(size_t n)} {return_type int } { code {// int lx = w()-10; size_t npoints = env->Penvpoints; float sum=0; for (size_t i = 1; i < npoints; i++) sum += (env->getdt(i) + 1); float sumbefore = 0; // the sum of all points before the computed point for (size_t i = 1; i <= n; i++) sumbefore += (env->getdt(i) + 1); return((int) (sumbefore / (float) sum * lx));} {} } Function {getpointy(int n)} {return_type int } { code {int ly = h() - 10; return((int) ((1.0 - env->Penvval[n] / 127.0) * ly));} {} } Function {getnearest(int x,int y)} {return_type size_t } { code {// x -= 5; y -= 5; size_t nearestpoint = 0; size_t nearestval = 1000000; // a big value for (size_t i = 0; i < env->Penvpoints; i++) { size_t distance = abs(x - getpointx(i)) + abs(y - getpointy(i)); if (distance < nearestval) { nearestpoint = i; nearestval = distance; }; }; return(nearestpoint);} {} } Function {draw()} {private } { code {// int ox = x(); int oy = y(); int lx = w(); float scale = lx / 500.0f; fl_line_style(0, int(1 * scale)); int ly = h(); if (not env->Pfreemode) env->converttofree(); size_t npoints=env->Penvpoints; if (active_r()) fl_color(graph_back); else fl_color(41); if (!active_r()) currentpoint=-1; fl_rectf(ox,oy,lx,ly); ox += 5; oy += 5; lx -= 10; ly -= 10; //draw the lines fl_color(env_line);//graph_resonance_grid); fl_line(ox + 2, oy + ly / 2, ox + lx - 2, oy + ly / 2); //draws the envelope points and lines fl_line_style(0, int(2 *scale)); int oldxx = 0; int xx = 0; int oldyy = 0; int yy = getpointy(0); fl_color(env_ctl); fl_rectf(ox - 3, oy + yy - 3, 6, 6); for (size_t i = 1; i < npoints; i++) { oldxx = xx; oldyy = yy; xx = getpointx(i); yy = getpointy(i); if (int(i) == currentpoint) fl_color(env_line_sel); else fl_color(env_line); fl_line(ox + oldxx, oy + oldyy, ox + xx, oy + yy); fl_color(env_ctl); fl_rectf(ox+xx-3,oy+yy-3,6,6); }; //draw the last moved point point (if exists) fl_line_style(0, int(1 * scale)); if (lastpoint>=0) { fl_color(env_ctl_sel); fl_rectf(ox+getpointx(lastpoint)-5,oy+getpointy(lastpoint)-5,10,10); }; //draw the sustain position fl_line_style(0, int(2.5 *scale)); if (env->Penvsustain>0) { fl_color(env_sus); xx = getpointx(env->Penvsustain); fl_line(ox + xx, oy + 0, ox + xx, oy + ly); }; //Show the envelope duration and the current line duration fl_font(FL_HELVETICA|FL_BOLD,10 * scale); float time = 0.0; if (currentpoint <= 0) { fl_color(env_ctl); for (size_t i = 1; i < npoints; i++) time += env->getdt(i); } else { fl_color(env_line_sel); time = env->getdt(currentpoint); }; char tmpstr[40]; if (time<1000.0) snprintf((char *)&tmpstr, 40, "%.1fms", time); else snprintf((char *)&tmpstr, 40, "%.2fs", time / 1000.0); fl_draw(tmpstr, ox + lx - 20 * scale, oy + ly - 10 * scale, 20 * scale, 10 * scale, FL_ALIGN_RIGHT, NULL, 0); //Draw formatted point value in the top right corner when dragging points if (currentpoint >= 0) { string valDesc; float val = (float) env->Penvval[currentpoint]; switch(env->Envmode){ case PART::envelope::groupmode::amplitudeLin: //linear amplitude case PART::envelope::groupmode::amplitudeLog: //db amplitude if (env->Plinearenvelope) valDesc = convert_value(VC_EnvelopeLinAmpSusVal, val); else valDesc = convert_value(VC_EnvelopeAmpSusVal, val); break; case PART::envelope::groupmode::frequency: //frequency offset valDesc = convert_value(VC_EnvelopeFreqVal, val); break; case PART::envelope::groupmode::filter: //filter frequency offset valDesc = convert_value(VC_EnvelopeFilterVal, val); break; case PART::envelope::groupmode::bandwidth: //bandwidth offset (unformatted) valDesc = convert_value(VC_EnvelopeBandwidthVal, val); break; default: valDesc = "unknown env. type"; } strcpy(tmpstr, valDesc.c_str()); fl_color(env_ctl_sel); fl_draw(tmpstr, ox + lx - 30, oy, 30, 25, FL_ALIGN_RIGHT, NULL, 0); } fl_line_style(0,1);} {} } Function {handle(int event)} {return_type int } { code {// int x_ = Fl::event_x() - x(); int y_ = Fl::event_y() - y(); if (event == FL_PUSH) { currentpoint = getnearest(x_, y_); cpx = x_; cpdt = env->Penvdt[currentpoint]; lastpoint = currentpoint; redraw(); if (pair != NULL) { pair->redraw(); return(1); } } if (event == FL_RELEASE) { currentpoint = -1; } if ((event == FL_DRAG) && (currentpoint >= 0)) { int ny = 127 - (int) (y_ * 127.0 / h()); if (ny < 0) ny = 0; if (ny> 127) ny = 127; int dx = (int)((x_- cpx) * 0.1); int newdt = cpdt + dx; if (newdt < 0) newdt = 0; if (newdt > 127) newdt = 127; send_data(TOPLEVEL::action::forceUpdate, currentpoint, newdt, ny, TOPLEVEL::type::Write); } return(1);} {} } decl {Fl_Box *pair;} {private local } decl {EnvelopeParams *env;} {private local } decl {int oldx;} {private local } decl {int currentpoint,cpx,cpdt;} {private local } decl {int lastpoint;} {public local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int engine;} {private local } decl {int group;} {private local } } class EnvelopeUI {: {public Fl_Group,PresetsUI_} } { Function {EnvelopeUI(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// synth = NULL; env=NULL; freemodeeditwindow=NULL; envADSR=NULL; envASR=NULL; envADSRfilter=NULL; envASRbw=NULL; envfree=NULL;} {} } Function {~EnvelopeUI()} {} { code {// if (freemodeeditwindow->x() > 4) saveWin(synth, freemodeeditwindow->w(), freemodeeditwindow->h(), freemodeeditwindow->x(), freemodeeditwindow->y(),freemodeeditwindow->visible(), "xEnvelope-free " + to_string(engine) + " " + to_string(group)); freemodeeditwindow->hide(); delete (freemodeeditwindow); envwindow->hide(); hide();} {} } Function {make_freemode_edit_window()} {} { Fl_Window freemodeeditwindow { label Envelope callback {freeClose->do_callback();} xywh {1088 97 575 180} type Double hide resizable class ScaleTrackedWindow code0 {freeDW = o->w(); freeDH = o->h();} code1 {o->size_range(freeDW, freeDH, 0, 0, 0, 0, 1);} } { Fl_Box freeedit { label Envelope xywh {5 5 565 145} box FLAT_BOX color 57 labelcolor 64 code0 {o->init(env, npart, kititem, engine, group);} class EnvelopeFreeEdit } Fl_Check_Button freemodebutton { label FreeMode callback {// if (env->Pfreemode) { bool answer = choice(synth, "", "Yes", "No", "Disable the free mode of the Envelope?") > 1; if (!answer) { o->value(1); // back as it was return; } } send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::enableFreeMode, o->value(), TOPLEVEL::type::Write);} tooltip {Enable or disable the freemode} xywh {10 157 93 17} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Button addpoint { label {Add point} callback {// int curpoint = freeedit->lastpoint; if (curpoint<0) return; if (env->Penvpoints >= MAX_ENVELOPE_POINTS) return; int value = env->Penvval[curpoint]; int offset = env->Penvdt[curpoint]; send_data(TOPLEVEL::action::forceUpdate, group, curpoint, value, TOPLEVEL::type::Write, TOPLEVEL::insert::envelopePointAdd, offset);} xywh {112 155 80 20} box PLASTIC_THIN_UP_BOX color 228 labelsize 11 labelcolor 64 code0 {if (not env->Pfreemode) o->hide();} } Fl_Button deletepoint { label {Delete point} callback {// int curpoint = freeedit->lastpoint; if (curpoint < 1) return; if (curpoint >= int(env->Penvpoints-1)) return; if (env->Penvpoints <= 3) return; send_data(TOPLEVEL::action::forceUpdate, group, curpoint, 0, TOPLEVEL::type::Write, TOPLEVEL::insert::envelopePointDelete);} xywh {200 155 80 20} box PLASTIC_THIN_UP_BOX color 228 labelsize 11 labelcolor 64 code0 {if (not env->Pfreemode) o->hide();} } Fl_Counter sustaincounter { label Sust callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::sustainPoint, o->value(), TOPLEVEL::type::Write);} tooltip {Sustain (0 is disabled)} xywh {315 158 40 15} type Simple selection_color 64 labelsize 11 labelcolor 64 align 4 minimum 0 maximum 127 step 1 textfont 1 textsize 12 textcolor 64 code0 {o->value(env->Penvsustain);} code1 {if (not env->Pfreemode) o->hide();} code2 {o->maximum(env->Penvpoints-2);} } Fl_Dial envstretchdial { label {Str.} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::stretch, lrint(o->value()), TOPLEVEL::type::Write);} tooltip {Envelope stretch (on lower notes make the envelope longer)} xywh {380 153 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 4 maximum 127 step 1 code0 {o->value(env->Penvstretch);} code1 {if (not env->Pfreemode) o->hide();} code2 {o->setValueType(VC_EnvStretch);} class WidgetPDial } Fl_Check_Button linearenvelopecheck { label L callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::linearEnvelope, o->value(), TOPLEVEL::type::Write);} tooltip {Linear Envelope} xywh {415 151 30 15} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(env->Plinearenvelope);} code1 {if ((not env->Pfreemode) or (env->Envmode>2)) o->hide();} class Fl_Check_Button2 } Fl_Check_Button forcedreleasecheck { label frcR callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::forcedRelease, o->value(), TOPLEVEL::type::Write);} tooltip {Forced Release} xywh {415 165 40 15} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(env->Pforcedrelease);} code1 {if (not env->Pfreemode) o->hide();} class Fl_Check_Button2 } Fl_Button freecopy { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {465 158 16 16} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Button freepaste { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {486 158 16 16} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Button freeClose { label Close callback {freemodeeditwindow->hide(); saveWin(synth, freemodeeditwindow->w(), freemodeeditwindow->h(), freemodeeditwindow->x(), freemodeeditwindow->y(), false, "xEnvelope-free " + to_string(engine) + " " + to_string(group));} xywh {519 155 44 20} box THIN_UP_BOX color 196 selection_color 64 labelsize 12 labelcolor 64 } } } Function {make_ADSR_window()} {} { Fl_Window envADSR { xywh {1185 87 205 70} type Double color 50 labelfont 1 labelcolor 64 hide class Fl_Group } { Fl_Group e1name { label {Amplitude Env} xywh {0 0 205 70} box PLASTIC_UP_BOX color 223 labelfont 1 labelsize 10 labelcolor 64 align 17 } { Fl_Dial e1adt { label {A.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::attackTime, o->value(), TOPLEVEL::type::Write);} tooltip {Attack time} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PA_dt);} class WidgetPDial } Fl_Dial e1ddt { label {D.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::decayTime, o->value(), TOPLEVEL::type::Write);} tooltip {Decay time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PD_dt);} class WidgetPDial } Fl_Dial e1rdt { label {R.dt } callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::releaseTime, o->value(), TOPLEVEL::type::Write);} tooltip {Release time} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PR_dt);} class WidgetPDial } Fl_Dial e1sval { label {S.val} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::sustainLevel, o->value(), TOPLEVEL::type::Write);} tooltip {Sustain value} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeAmpSusVal);} code1 {o->value(env->PS_val);} class WidgetPDial } Fl_Check_Button e1forcedrelease { label frcR callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::forcedRelease, o->value(), TOPLEVEL::type::Write);} tooltip {Forced Release} xywh {180 35 20 15} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 6 code0 {o->value(env->Pforcedrelease);} class Fl_Check_Button2 } Fl_Dial e1envstretch { label Stretch callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::stretch, lrint(o->value()), TOPLEVEL::type::Write);} tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {145 25 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(env->Penvstretch);} code1 {o->setValueType(VC_EnvStretch);} class WidgetPDial } Fl_Button e1E { label E callback {// showfree(); send_data(0, group, ENVELOPEINSERT::control::edit, o->value(), TOPLEVEL::type::Write);} tooltip {Envelope window} xywh {185 5 15 15} box GTK_THIN_UP_BOX color 221 labelfont 1 labelsize 10 labelcolor 64 } Fl_Check_Button e1linearenvelope { label L callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::linearEnvelope, o->value(), TOPLEVEL::type::Write);} tooltip {The envelope is linear} xywh {180 20 15 15} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 8 code0 {o->value(env->Plinearenvelope);} class Fl_Check_Button2 } Fl_Button e1C { label C callback {// // synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {150 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Button e1P { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {167 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } } } } Function {make_ASR_window()} {} { Fl_Window envASR {open xywh {1183 190 210 70} type Double labelcolor 64 hide class Fl_Group } { Fl_Group e2name { label {Frequency Env} xywh {0 0 210 70} box PLASTIC_UP_BOX color 223 labelfont 1 labelsize 10 labelcolor 64 align 17 } { Fl_Dial e2aval { label {A.val} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::attackLevel, o->value(), TOPLEVEL::type::Write);} tooltip {Starting value} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(VC_EnvelopeFreqVal);} code1 {o->value(env->PA_val);} class WidgetPDial } Fl_Dial e2adt { label {A.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::attackTime, o->value(), TOPLEVEL::type::Write);} tooltip {Attack time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PA_dt);} class WidgetPDial } Fl_Dial e2rval { label {R.val } callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::releaseLevel, o->value(), TOPLEVEL::type::Write);} tooltip {Release value} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(VC_EnvelopeFreqVal);} code1 {o->value(env->PR_val);} class WidgetPDial } Fl_Dial e2rdt { label {R.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::releaseTime, o->value(), TOPLEVEL::type::Write);} tooltip {Release time} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PR_dt);} class WidgetPDial } Fl_Dial e2envstretch { label { Stretch} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::stretch, lrint(o->value()), TOPLEVEL::type::Write);} tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {145 25 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->value(env->Penvstretch);} code1 {o->setValueType(VC_EnvStretch);} class WidgetPDial } Fl_Check_Button e2forcedrelease { label frcR callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::forcedRelease, o->value(), TOPLEVEL::type::Write);} tooltip {Forced release} xywh {185 25 15 25} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 6 code0 {o->value(env->Pforcedrelease);} class Fl_Check_Button2 } Fl_Button e2C { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {155 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Button e2P { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {172 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } } Fl_Button e2E { label E callback {// showfree(); send_data(0, group, ENVELOPEINSERT::control::edit, o->value(), TOPLEVEL::type::Write);} tooltip {Envelope window} xywh {190 5 15 15} box GTK_THIN_UP_BOX color 221 labelfont 1 labelsize 10 labelcolor 64 } } } Function {make_ADSRfilter_window()} {} { Fl_Window envADSRfilter { xywh {1121 294 275 70} type Double color 50 labelfont 1 labelcolor 64 hide class Fl_Group } { Fl_Group e3name { label {Filter Envelope} xywh {0 0 275 70} box PLASTIC_UP_BOX color 223 labelfont 1 labelsize 10 labelcolor 64 align 17 } { Fl_Dial e3aval { label {A.val} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::attackLevel, o->value(), TOPLEVEL::type::Write);} tooltip {Starting value} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeFilterVal);} code1 {o->value(env->PA_val);} class WidgetPDial } Fl_Dial e3adt { label {A.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::attackTime, o->value(), TOPLEVEL::type::Write);} tooltip {Attack time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PA_dt);} class WidgetPDial } Fl_Dial e3dval { label {D.val} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::decayLevel, o->value(), TOPLEVEL::type::Write);} tooltip {decay value} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeFilterVal);} code1 {o->value(env->PD_val);} class WidgetPDial } Fl_Dial e3ddt { label {D.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::decayTime, o->value(), TOPLEVEL::type::Write);} tooltip {decay time} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PD_dt);} class WidgetPDial } Fl_Dial e3rdt { label {R.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::releaseTime, o->value(), TOPLEVEL::type::Write);} tooltip {Release time} xywh {145 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PR_dt);} class WidgetPDial } Fl_Dial e3rval { label {R.val } callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::releaseLevel, o->value(), TOPLEVEL::type::Write);} tooltip {Release value} xywh {180 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeFilterVal);} code1 {o->value(env->PR_val);} class WidgetPDial } Fl_Dial e3envstretch { label { Stretch} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::stretch, lrint(o->value()), TOPLEVEL::type::Write);} tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {215 25 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(env->Penvstretch);} code1 {o->setValueType(VC_EnvStretch);} class WidgetPDial } Fl_Check_Button e3forcedrelease { label frcR callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::forcedRelease, o->value(), TOPLEVEL::type::Write);} tooltip {Forced Release} xywh {250 30 15 20} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 6 code0 {o->value(env->Pforcedrelease);} class Fl_Check_Button2 } Fl_Button e3E { label E callback {// showfree(); send_data(0, group, ENVELOPEINSERT::control::edit, o->value(), TOPLEVEL::type::Write);} xywh {255 5 15 15} box GTK_THIN_UP_BOX color 221 labelfont 1 labelsize 10 labelcolor 64 } Fl_Button e3C { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {220 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Button e3P { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {237 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } } } } Function {make_ASRbw_window()} {} { Fl_Window envASRbw { xywh {1209 649 210 70} type Double labelcolor 64 hide class Fl_Group } { Fl_Group e4name { label {BandWidth Env} xywh {0 0 210 70} box PLASTIC_UP_BOX color 223 labelfont 1 labelsize 10 labelcolor 64 align 17 } { Fl_Dial e4aval { label {A.val} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::attackLevel, o->value(), TOPLEVEL::type::Write);} tooltip {Bandwidth multiplier, start} xywh {8 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(env->PA_val);} code1 {o->setValueType(VC_EnvelopeBandwidthVal);} class WidgetPDial } Fl_Dial e4adt { label {A.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::attackTime, o->value(), TOPLEVEL::type::Write);} tooltip {Attack time} xywh {43 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PA_dt);} class WidgetPDial } Fl_Dial e4rval { label {R.val} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::releaseLevel, o->value(), TOPLEVEL::type::Write);} tooltip {Bandwidth multiplier, release} xywh {113 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(env->PR_val);} code1 {o->setValueType(VC_EnvelopeBandwidthVal);} class WidgetPDial } Fl_Dial e4rdt { label {R.dt} callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::releaseTime, o->value(), TOPLEVEL::type::Write);} tooltip {Release time} xywh {78 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_EnvelopeDT);} code1 {o->value(env->PR_dt);} class WidgetPDial } Fl_Dial e4envstretch { label Stretch callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::stretch, lrint(o->value()), TOPLEVEL::type::Write);} tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {148 25 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(env->Penvstretch);} code1 {o->setValueType(VC_EnvStretch);} class WidgetPDial } Fl_Check_Button e4forcedrelease { label frcR callback {// send_data(TOPLEVEL::action::forceUpdate, group, ENVELOPEINSERT::control::forcedRelease, o->value(), TOPLEVEL::type::Write);} tooltip {Forced release} xywh {185 25 15 25} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 6 code0 {o->value(env->Pforcedrelease);} class Fl_Check_Button2 } Fl_Button e4C { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {155 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Button e4P { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {172 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } } Fl_Button e4E { label E callback {// showfree(); send_data(0, group, ENVELOPEINSERT::control::edit, o->value(), TOPLEVEL::type::Write);} xywh {190 5 15 15} box GTK_THIN_UP_BOX color 221 labelfont 1 labelsize 10 labelcolor 64 } } } Function {make_free_window()} {} { Fl_Window envfree { xywh {874 240 205 70} type Double color 50 labelfont 1 labelcolor 64 hide resizable class Fl_Group } { Fl_Group envfreegroup { label {Amplitude Env} xywh {0 0 205 70} box PLASTIC_UP_BOX color 223 labelfont 1 labelsize 10 labelcolor 64 align 17 resizable } { Fl_Box freeeditsmall { label Envelope callback {envfree->redraw();} xywh {5 20 195 45} box FLAT_BOX color 57 labelcolor 64 resizable code0 {o->init(env, npart, kititem, engine, group);} class EnvelopeFreeEdit } } Fl_Button efC { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {150 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7 } Fl_Button efP { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::envelopeGroup, group); ;} xywh {168 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7 } Fl_Button efE { label E callback {// showfree(); send_data(0, group, ENVELOPEINSERT::control::edit, o->value(), TOPLEVEL::type::Write);} xywh {185 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10 labelcolor 64 } } } Function {send_data(int action, int group, int control, float value, int type, int insert = TOPLEVEL::insert::envelopeGroup, int offset = UNUSED)} {} { code {// collect_writeData(synth, value, action, type, control, npart, kititem, engine, insert, group, offset);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char part = getData->data.part; unsigned char eng = getData->data.engine; unsigned char insert = getData->data.insert; unsigned char param = getData->data.parameter; unsigned char offset = getData->data.offset; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); bool isFreemode = _SYS_::F2B(freemodebutton->value()); bool isVoice = (eng >= PART::engine::addVoice1 && eng < PART::engine::addMod1); bool isMod = (eng >= PART::engine::addMod1); bool isSub = (eng == PART::engine::subSynth); if (part != npart || (isVoice && eng != engine)) return; //synth->CBtest(getData); switch (insert) { case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: switch (insert) { case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: freeedit->lastpoint = control; // adjust point break; default: if (offset > 127) // delete point freeedit->lastpoint -= 1; else // add point freeedit->lastpoint += 1; break; } freeedit->redraw(); envfree->redraw(); sustaincounter->value(env->Penvsustain); sustaincounter->maximum(env->Penvpoints-2); return; default: break; } bool change = true; switch(control) { case ENVELOPEINSERT::control::attackLevel: { switch (param) { case TOPLEVEL::insertType::frequency: e2aval->value(value); if (isVoice) e2aval->selection_color(setKnob(value,ENVDEF::voiceFreqAtValue.def)); else if (isMod) e2aval->selection_color(setKnob(value,ENVDEF::modFreqAtValue.def)); else if (isSub) e2aval->selection_color(setKnob(value,ENVDEF::subFreqAtValue.def)); else e2aval->selection_color(setKnob(value,ENVDEF::freqAttackValue.def)); break; case TOPLEVEL::insertType::filter: e3aval->value(value); if (isVoice) e3aval->selection_color(setKnob(value,ENVDEF::voiceFiltAtValue.def)); else e3aval->selection_color(setKnob(value,ENVDEF::filtAttackValue.def)); break; case TOPLEVEL::insertType::bandwidth: e4aval->value(value); e4aval->selection_color(setKnob(value,ENVDEF::subBandAttackValue.def)); break; } } break; case ENVELOPEINSERT::control::attackTime: { switch (param) { case TOPLEVEL::insertType::amplitude: e1adt->value(value); if (isMod) e1adt->selection_color(setKnob(value,ENVDEF::modAmpAttackTime.def)); else e1adt->selection_color(setKnob(value,ENVDEF::ampAttackTime.def)); break; case TOPLEVEL::insertType::frequency: e2adt->value(value); if (isMod) e2adt->selection_color(setKnob(value,ENVDEF::modFreqAtTime.def)); else if (isVoice) e2adt->selection_color(setKnob(value,ENVDEF::voiceFreqAtTime.def)); else e2adt->selection_color(setKnob(value,ENVDEF::freqAttackTime.def)); break; case TOPLEVEL::insertType::filter: e3adt->value(value); if (isVoice) e3adt->selection_color(setKnob(value,ENVDEF::voiceFiltAtTime.def)); else e3adt->selection_color(setKnob(value,ENVDEF::filtAttackTime.def)); break; case TOPLEVEL::insertType::bandwidth: e4adt->value(value); e4adt->selection_color(setKnob(value,ENVDEF::subBandAttackTime.def)); break; } } break; case ENVELOPEINSERT::control::decayLevel: if (param == TOPLEVEL::insertType::filter) { e3dval->value(value); if (isVoice) e3dval->selection_color(setKnob(value,ENVDEF::voiceFiltDeValue.def)); else e3dval->selection_color(setKnob(value,ENVDEF::filtDecayValue.def)); } break; case ENVELOPEINSERT::control::decayTime: { switch (param) { case TOPLEVEL::insertType::amplitude: e1ddt->value(value); if (isMod) e1ddt->selection_color(setKnob(value,ENVDEF::modAmpDecayTime.def)); else if (isVoice) e1ddt->selection_color(setKnob(value,ENVDEF::voiceAmpDecayTime.def)); else e1ddt->selection_color(setKnob(value,ENVDEF::ampDecayTime.def)); break; case TOPLEVEL::insertType::filter: e3ddt->value(value); e3ddt->selection_color(setKnob(value,ENVDEF::filtDecayTime.def)); break; } } break; case ENVELOPEINSERT::control::sustainLevel: if (param == TOPLEVEL::insertType::amplitude) { e1sval->value(value); e1sval->selection_color(setKnob(value,ENVDEF::ampSustainValue.def)); } break; case ENVELOPEINSERT::control::releaseTime: { switch (param) { case TOPLEVEL::insertType::amplitude: e1rdt->value(value); if (isMod) e1rdt->selection_color(setKnob(value,ENVDEF::modAmpReleaseTime.def)); else if (isVoice) e1rdt->selection_color(setKnob(value,ENVDEF::voiceAmpReleaseTime.def)); else e1rdt->selection_color(setKnob(value,ENVDEF::ampReleaseTime.def)); break; case TOPLEVEL::insertType::frequency: e2rdt->value(value); if (isMod) e2rdt->selection_color(setKnob(value,ENVDEF::modFreqReleaseTime.def)); else e2rdt->selection_color(setKnob(value,ENVDEF::freqReleaseTime.def)); break; case TOPLEVEL::insertType::filter: e3rdt->value(value); if (isVoice) e3rdt->selection_color(setKnob(value,ENVDEF::voiceFiltRelTime.def)); else e3rdt->selection_color(setKnob(value,ENVDEF::filtReleaseTime.def)); break; case TOPLEVEL::insertType::bandwidth: e4rdt->value(value); e4rdt->selection_color(setKnob(value,ENVDEF::subBandReleaseTime.def)); break; } } break; case ENVELOPEINSERT::control::releaseLevel: { switch (param) { case TOPLEVEL::insertType::frequency: e2rval->value(value); if (isMod) e2rval->selection_color(setKnob(value,ENVDEF::modFreqReleaseValue.def)); else e2rval->selection_color(setKnob(value,ENVDEF::freqReleaseValue.def)); break; case TOPLEVEL::insertType::filter: e3rval->value(value); if (isVoice) e3rval->selection_color(setKnob(value,ENVDEF::voiceFiltRelValue.def)); else e3rval->selection_color(setKnob(value,ENVDEF::filtReleaseValue.def)); break; case TOPLEVEL::insertType::bandwidth: e4rval->value(value); e4rval->selection_color(setKnob(value,ENVDEF::subBandReleaseValue.def)); break; } } break; case ENVELOPEINSERT::control::stretch: { int stretchType = -1; switch (param) { case TOPLEVEL::insertType::amplitude: e1envstretch->value(value_int); stretchType = ENVDEF::ampStretch.def; e1envstretch->selection_color(setKnob(value,stretchType)); break; case TOPLEVEL::insertType::frequency: e2envstretch->value(value); if (isSub) { stretchType = ENVDEF::subFreqStretch.def; e2envstretch->selection_color(setKnob(value,stretchType)); } else { stretchType = ENVDEF::freqStretch.def; e2envstretch->selection_color(setKnob(value,stretchType)); } break; case TOPLEVEL::insertType::filter: stretchType = ENVDEF::filtStretch.def; e3envstretch->value(value); e3envstretch->selection_color(setKnob(value,stretchType)); break; case TOPLEVEL::insertType::bandwidth: stretchType = ENVDEF::subBandStretch.def; e4envstretch->value(value); e4envstretch->selection_color(setKnob(value,stretchType)); break; } envstretchdial->value(value); // for freemode if (stretchType > -1) envstretchdial->selection_color(setKnob(value,stretchType)); change = false; break; } case ENVELOPEINSERT::control::forcedRelease: switch (param) { case TOPLEVEL::insertType::amplitude: e1forcedrelease->value(value_bool); break; case TOPLEVEL::insertType::frequency: e2forcedrelease->value(value_bool); break; case TOPLEVEL::insertType::filter: e3forcedrelease->value(value_bool); break; case TOPLEVEL::insertType::bandwidth: e4forcedrelease->value(value_bool); break; } forcedreleasecheck->value(value_bool); change = false; break; case ENVELOPEINSERT::control::linearEnvelope: if (param == TOPLEVEL::insertType::amplitude) { e1linearenvelope->value(value_bool); linearenvelopecheck->value(value_bool); } change = false; break; case ENVELOPEINSERT::control::enableFreeMode: reinitcore(value_bool); break; case ENVELOPEINSERT::control::sustainPoint: if (isFreemode) sustaincounter->value(value_int); break; } if (change) freeedit->redraw();} {} } Function {init(EnvelopeParams *env_, int npart_, int kititem_, int engine_, int group_)} {} { code {// env=env_; synth = & env->getSynthEngine(); npart = npart_; kititem = kititem_; engine = engine_; group = group_; lastfreeX = lastfreeY = lastfreeW = 0xffff; make_ADSR_window(); make_ASR_window(); make_ADSRfilter_window(); make_ASRbw_window(); make_free_window(); make_freemode_edit_window(); envwindow=NULL; if (env->Envmode == PART::envelope::groupmode::frequency) envfreegroup->label("Frequency Env"); if (env->Envmode == PART::envelope::groupmode::filter) envfreegroup->label("Filter Envelope"); if (env->Envmode == PART::envelope::groupmode::bandwidth) envfreegroup->label("Bandwidth Env"); freemodeeditwindow->label(this->label()); freemodeeditwindow->hide(); freeeditsmall->setpair(freeedit); freeedit->setpair(freeeditsmall); refresh();} {} } Function {reinitcore(bool freemode)} {} { code {// if (freemode) freemodebutton->value(1); else freemodebutton->value(0); hide(); envwindow->hide(); Fl_Group *parent = envwindow->parent(); parent->hide(); refresh(); envwindow->show(); parent->redraw(); parent->show(); show(); if (freemode) { freemodebutton->value(1); addpoint->show(); deletepoint->show(); forcedreleasecheck->show(); } else { freemodebutton->value(0); addpoint->hide(); deletepoint->hide(); forcedreleasecheck->hide(); }} {} } Function {refresh()} {} { code {// freemodebutton->value(env->Pfreemode); sustaincounter->value(env->Penvsustain); if (not env->Pfreemode) sustaincounter->hide(); else sustaincounter->show(); sustaincounter->maximum(env->Penvpoints-2); envstretchdial->value(env->Penvstretch); if (not env->Pfreemode) envstretchdial->hide(); else envstretchdial->show(); linearenvelopecheck->value(env->Plinearenvelope); if ((not env->Pfreemode) or (env->Envmode>2)) linearenvelopecheck->hide(); else linearenvelopecheck->show(); forcedreleasecheck->value(env->Pforcedrelease); if (not env->Pfreemode) forcedreleasecheck->hide(); freeedit->redraw(); if (not env->Pfreemode) { switch(env->Envmode) { case(PART::envelope::groupmode::amplitudeLin): case(PART::envelope::groupmode::amplitudeLog): { e1adt->value(env->PA_dt); if (engine >= PART::addMod1) e1adt->selection_color(setKnob(e1adt->value(),ENVDEF::modAmpAttackTime.def)); else e1adt->selection_color(setKnob(e1adt->value(),ENVDEF::ampAttackTime.def)); e1ddt->value(env->PD_dt); if (engine >= PART::addMod1) e1ddt->selection_color(setKnob(e1ddt->value(),ENVDEF::modAmpDecayTime.def)); else if (engine >= PART::addVoice1) e1ddt->selection_color(setKnob(e1ddt->value(),ENVDEF::voiceAmpDecayTime.def)); else e1ddt->selection_color(setKnob(e1ddt->value(),ENVDEF::ampDecayTime.def)); e1sval->value(env->PS_val); e1sval->selection_color(setKnob(e1sval->value(),ENVDEF::ampSustainValue.def)); setAmpSusVType(env->Plinearenvelope); e1rdt->value(env->PR_dt); if (engine >= PART::addMod1) e1rdt->selection_color(setKnob(e1rdt->value(),ENVDEF::modAmpReleaseTime.def)); else if (engine >= PART::addVoice1) e1rdt->selection_color(setKnob(e1rdt->value(),ENVDEF::voiceAmpReleaseTime.def)); else e1rdt->selection_color(setKnob(e1rdt->value(),ENVDEF::ampReleaseTime.def)); e1envstretch->value(env->Penvstretch); e1envstretch->selection_color(setKnob(e1envstretch->value(),ENVDEF::ampStretch.def)); e1linearenvelope->value(env->Plinearenvelope); e1forcedrelease->value(env->Pforcedrelease); break; } case(PART::envelope::groupmode::frequency): { e2aval->value(env->PA_val); if (engine >= PART::addMod1) e2aval->selection_color(setKnob(e2aval->value(),ENVDEF::modFreqAtValue.def)); else if (engine >= PART::addVoice1) e2aval->selection_color(setKnob(e2aval->value(),ENVDEF::voiceFreqAtValue.def)); else if (engine == PART::subSynth) e2aval->selection_color(setKnob(e2aval->value(),ENVDEF::subFreqAtValue.def)); else e2aval->selection_color(setKnob(int(e2aval->value()),ENVDEF::freqAttackValue.def)); e2adt->value(env->PA_dt); if (engine >= PART::addMod1) e2adt->selection_color(setKnob(e2adt->value(),ENVDEF::modFreqAtTime.def)); else if (engine >= PART::addVoice1) e2adt->selection_color(setKnob(e2adt->value(),ENVDEF::voiceFreqAtTime.def)); else e2adt->selection_color(setKnob(e2adt->value(),ENVDEF::freqAttackTime.def)); e2rdt->value(env->PR_dt); if (engine >= PART::addMod1) e2rdt->selection_color(setKnob(e2rdt->value(),ENVDEF::modFreqReleaseTime.def)); else e2rdt->selection_color(setKnob(e2rdt->value(),ENVDEF::freqReleaseTime.def)); e2rval->value(env->PR_val); if (engine >= PART::addMod1) e2rval->selection_color(setKnob(e2rval->value(),ENVDEF::modFreqReleaseValue.def)); else e2rval->selection_color(setKnob(e2rval->value(),ENVDEF::freqReleaseValue.def)); e2envstretch->value(env->Penvstretch); if (engine == PART::subSynth) e2envstretch->selection_color(setKnob(e2envstretch->value(),ENVDEF::subFreqStretch.def)); else e2envstretch->selection_color(setKnob(e2envstretch->value(),ENVDEF::freqStretch.def)); e2forcedrelease->value(env->Pforcedrelease); break; } case(PART::envelope::groupmode::filter): { e3aval->value(env->PA_val); if (engine >= PART::addVoice1 && engine < PART::addMod1) e3aval->selection_color(setKnob(e3aval->value(),ENVDEF::voiceFiltAtValue.def)); else e3aval->selection_color(setKnob(e3aval->value(),ENVDEF::filtAttackValue.def)); e3adt->value(env->PA_dt); if (engine >= PART::addVoice1) e3adt->selection_color(setKnob(e3adt->value(),ENVDEF::voiceFiltAtTime.def)); else e3adt->selection_color(setKnob(e3adt->value(),ENVDEF::filtAttackTime.def)); e3dval->value(env->PD_val); if (engine >= PART::addVoice1 && engine < PART::addMod1) e3dval->selection_color(setKnob(e3dval->value(),ENVDEF::voiceFiltDeValue.def)); else e3dval->selection_color(setKnob(e3dval->value(),ENVDEF::filtDecayValue.def)); e3ddt->value(env->PD_dt); e3ddt->selection_color(setKnob(e3ddt->value(),ENVDEF::filtDecayTime.def)); e3rdt->value(env->PR_dt); if (engine >= PART::addVoice1 && engine < PART::addMod1) e3rdt->selection_color(setKnob(e3rdt->value(),ENVDEF::voiceFiltRelTime.def)); else e3rdt->selection_color(setKnob(e3rdt->value(),ENVDEF::filtReleaseTime.def)); e3rval->value(env->PR_val); if (engine >= PART::addVoice1 && engine < PART::addMod1) e3rval->selection_color(setKnob(e3rval->value(),ENVDEF::voiceFiltRelValue.def)); else e3rval->selection_color(setKnob(e3rval->value(),ENVDEF::filtReleaseValue.def)); e3envstretch->value(env->Penvstretch); e3envstretch->selection_color(setKnob(e3envstretch->value(),ENVDEF::filtStretch.def)); e3forcedrelease->value(env->Pforcedrelease); break; } case(PART::envelope::groupmode::bandwidth): { e4aval->value(env->PA_val); e4aval->selection_color(setKnob(e4aval->value(),ENVDEF::subBandAttackValue.def)); e4adt->value(env->PA_dt); e4adt->selection_color(setKnob(e4adt->value(),ENVDEF::subBandAttackTime.def)); e4rdt->value(env->PR_dt); e4rdt->selection_color(setKnob(e4rdt->value(),ENVDEF::subBandReleaseTime.def)); e4rval->value(env->PR_val); e4rval->selection_color(setKnob(e4rval->value(),ENVDEF::subBandReleaseValue.def)); e4envstretch->value(env->Penvstretch); e4envstretch->selection_color(setKnob(e4envstretch->value(),ENVDEF::subBandStretch.def)); e4forcedrelease->value(env->Pforcedrelease); break; } default: break; } } else envfree->redraw(); envADSR->hide(); envASR->hide(); envADSRfilter->hide(); envASRbw->hide(); envfree->hide(); /* We now always initialise and position related groups as well as the freemode one This is to ensure that resizing will have the correct starting size and position even if a part was loaded specifying the freemode form. */ //if (not env->Pfreemode) { switch(env->Envmode) { case(PART::envelope::groupmode::amplitudeLin): case(PART::envelope::groupmode::amplitudeLog): envwindow=envADSR; break; case(PART::envelope::groupmode::frequency): envwindow=envASR; break; case(PART::envelope::groupmode::filter): envwindow=envADSRfilter; break; case(PART::envelope::groupmode::bandwidth): envwindow=envASRbw; break; default: break; } envwindow->resize(this->x(),this->y(),this->w(),this->h()); } //else if (env->Pfreemode) { envwindow=envfree; envwindow->resize(this->x(),this->y(),this->w(),this->h()); } //envwindow->resize(this->x(),this->y(),this->w(),this->h()); envwindow->show();} {} } Function {theme()} {} { code {// if (freeedit) { if (freeedit->visible()) { lastfreeW = 0; envfreeRtext(); } }} {} } Function {showfree()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "xEnvelope-free " + to_string(engine) + " " + to_string(group)); if (fetchW < freeDW || fetchH < freeDH) { fetchW = freeDW; fetchH = freeDH; } checkSane(fetchX, fetchY, fetchW, fetchH, freeDW, freeDH); freemodeeditwindow->resize(fetchX, fetchY, fetchW, fetchH); freemodeeditwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Envelope"), npart, TOPLEVEL::windowTitle, kititem, engine, TOPLEVEL::insert::envelopeGroup, group)).c_str()); freemodeeditwindow->show(); envfreeRtext();} {} } Function {wincheck()} {} { code {// if (!freemodeeditwindow->visible()) return; if (freemodeeditwindow->x() == lastfreeX && freemodeeditwindow->y() == lastfreeY && freemodeeditwindow->w() == lastfreeW) return; envfreeRtext(); lastfreeX = freemodeeditwindow->x(); lastfreeY = freemodeeditwindow->y(); lastfreeW = freemodeeditwindow->w();} {} } Function {envfreeRtext()} {} { code {// int w = freemodeeditwindow->w(); int h = freemodeeditwindow->h(); float defW = 575; float defH = 180; float dW = w / defW; float dH = h / defH; float dScale; if (dW < dH) dScale = dW; else dScale = dH; if (dScale < 0.2f) dScale = 0.2f; int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); int size14 = int(14 * dScale); freemodebutton->labelsize(size14); addpoint->labelsize(size11); deletepoint->labelsize(size11); sustaincounter->labelsize(size11); sustaincounter->textsize(size12); envstretchdial->labelsize(size); linearenvelopecheck->labelsize(size); forcedreleasecheck->labelsize(size); freecopy->labelsize(size); freepaste->labelsize(size); freeClose->labelsize(size12);} {} } Function {envRtext(float dScale)} {} { code {// int X = this->x(); int Y = this->y(); int W = this->w(); int H = this->h(); int size = int(dScale * 10); e1name->labelsize(size); e1adt->labelsize(size); e1ddt->labelsize(size); e1rdt->labelsize(size); e1sval->labelsize(size); e1forcedrelease->labelsize(size); e1envstretch->labelsize(size); e1E->labelsize(size); e1linearenvelope->labelsize(size); e1C->labelsize(size); e1P->labelsize(size); e2name->labelsize(size); e2aval->labelsize(size); e2adt->labelsize(size); e2rval->labelsize(size); e2rdt->labelsize(size); e2envstretch->labelsize(size); e2forcedrelease->labelsize(size); e2C->labelsize(size); e2P->labelsize(size); e2E->labelsize(size); e3name->labelsize(size); e3aval->labelsize(size); e3adt->labelsize(size); e3dval->labelsize(size); e3ddt->labelsize(size); e3rval->labelsize(size); e3rdt->labelsize(size); e3envstretch->labelsize(size); e3forcedrelease->labelsize(size); e3C->labelsize(size); e3P->labelsize(size); e3E->labelsize(size); e4name->labelsize(size); e4aval->labelsize(size); e4adt->labelsize(size); e4rval->labelsize(size); e4rdt->labelsize(size); e4envstretch->labelsize(size); e4forcedrelease->labelsize(size); e4C->labelsize(size); e4P->labelsize(size); e4E->labelsize(size); envfreegroup->labelsize(size); efC->labelsize(size); efP->labelsize(size); efE->labelsize(size); envfree->resize(X, Y, W, H); freemodeeditwindow->redraw(); freeeditsmall->resize(int(X + 5*dScale), int(Y + 20*dScale), int(W - 9*dScale), int(H - 25*dScale));} {} } Function {setAmpSusVType(bool linear)} {return_type void } { code {// if (linear) e1sval->setValueType(VC_EnvelopeLinAmpSusVal); else e1sval->setValueType(VC_EnvelopeAmpSusVal);} {} } decl {EnvelopeParams *env;} {private local } decl {Fl_Group *envwindow;} {private local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int engine;} {private local } decl {int group;} {private local } decl {int lastfreeX;} {private local } decl {int lastfreeY;} {private local } decl {int lastfreeW;} {private local } decl {int freeDW;} {private local } decl {int freeDH;} {private local } } yoshimi-2.3.5.1/src/UI/FilterUI.fl000066400000000000000000001703471506652756400165070ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0403 header_name {.h} code_name {.cc} comment {FilterUI.h} {not_in_source in_header } comment {FilterUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2016-2025 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code } {selected in_source in_header } decl {\#include } {public local } decl {\#include "globals.h"} {public local } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include "UI/WidgetPDial.h"} {public local } decl {\#include "UI/WidgetMWSlider.h"} {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "Params/FilterParams.h"} {public local } decl {\#include } {private global } decl {\#include } {private global } decl {\#include "MasterUI.h"} {private global } decl {\#include "Misc/SynthEngine.h"} {public global } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } decl {class FilterUI;} {public global } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include "Misc/FormatFuncs.h" using func::asString;} {private local } decl {\#include "Misc/NumericFuncs.h" using func::asDecibel; using func::limit;} {private local } class FormantFilterGraph {: {public Fl_Box} } { Function {FormantFilterGraph(int x, int y, int w, int h, FilterUI& parent_, FilterParams *pars_, int *nvowel_, int *nformant_): Fl_Box(x,y,w,h), parent(parent_), pars(pars_), nvowel(nvowel_), nformant(nformant_)} {} { code {// selectedFormant = -1; hoverFormant = -1; qMode = false; graphpoints = new float [w];} {} } Function {draw_freq_line(float freq)} {} { code {// float freqx = pars->getfreqpos(freq); if (freqx > 0.0 && freqx < 1.0) fl_line(x() + int(freqx * w()), y(), x() + int(freqx * w()), y() + h());} {} } Function {draw()} {} { code {// int maxdB = 30; int ox = x(), oy = y(), lx = w(), ly = h(), i, oiy; float freqx; int points = 475; float scale = lx / float(points); fl_line_style(0, 1 * scale); // part of new resizable code fl_color(graph_back); fl_rectf(ox, oy, lx, ly); //draw the lines fl_color(FL_GRAY); freqx = pars->getfreqpos(1000.0); if (freqx > 0.0 && freqx < 1.0) fl_line(ox + int(freqx * lx), oy, ox + int(freqx * lx), oy + ly); for (i = 1; i < 10; ++i) { if (i == 1) { draw_freq_line(i * 100.0); draw_freq_line(i * 1000.0); } else if (i == 5) { draw_freq_line(i * 100.0); draw_freq_line(i * 1000.0); } else { draw_freq_line(i * 100.0); draw_freq_line(i * 1000.0); } } draw_freq_line(10000.0); draw_freq_line(20000.0); int GY = 10; if (ly < GY * 3 ) GY = -1; for (i = 1; i < GY; ++i) { int tmp = int(ly / (float)GY * i); fl_line(ox + 2, oy + tmp, ox + lx - 2, oy + tmp); } fl_line_style(0, 2 * scale); fl_color(formant_marker); fl_font(FL_HELVETICA, 10 * scale); if (*nformant < pars->Pnumformants) { draw_freq_line(pars->getformantfreq(pars->Pvowels[*nvowel].formants[*nformant].freq)); //show some information (like current formant frequency,amplitude) string tmpstr = asString((float) (pars->getformantfreq(pars->Pvowels[*nvowel].formants[*nformant].freq) / 1000.0)) + " kHz"; fl_draw(tmpstr.c_str(), ox + 2 * scale, oy + 2 * scale, 40 * scale, 12 * scale, FL_ALIGN_LEFT, NULL, 0); tmpstr = asString(int (asDecibel(1e-9 + pars->getformantamp(pars->Pvowels[*nvowel].formants[*nformant].amp)) + pars->getgain())) + " dB"; fl_draw(tmpstr.c_str(), ox + 2 * scale, oy + 15 * scale, 40 * scale, 12 * scale, FL_ALIGN_LEFT, NULL, 0); } if (hoverFormant >= 0 && hoverFormant != *nformant) { fl_color(formant_ghost_marker); draw_freq_line(pars->getformantfreq(pars->Pvowels[*nvowel].formants[hoverFormant].freq)); } // draw the data fl_color(formant_graph_line); pars->formantfilterH(*nvowel, points, graphpoints); int lastpos = ox; oiy = int((graphpoints[0] / maxdB + 1.0) * ly / 2.0); for (i = 1; i < points; ++i) { int nextpos = ox + int(i * scale); int iy = int((graphpoints[i] / maxdB + 1.0) * ly / 2.0); if (iy >= 0 && oiy >= 0 && iy < ly && oiy < lx) fl_line(lastpos, oy + ly - oiy, nextpos, oy + ly - iy); oiy = iy; lastpos = nextpos; } parent.formantRtext(); fl_line_style(0,1); ;} {} } Function {~FormantFilterGraph()} {} { code {delete [] graphpoints;} {} } decl {FilterUI& parent;} {private local } decl {FilterParams *pars;} {private local } decl {int const *nvowel, *nformant;} {private local } decl {float *graphpoints;} {private local } decl {int selectedFormant, hoverFormant, yRef, xRef, qRef, ampRef, freqRef, cFreqRef;} {private local } decl {bool qMode;} {private local } Function {handle(int event)} {return_type int } { code {// switch(event) { case FL_ENTER: // enable keyboard and drag events Fl::focus(this); Fl::belowmouse(this); fl_cursor(FL_CURSOR_HAND); return 1; case FL_MOVE: // find formant closest to cursor { int minDiff = INT_MAX; int relPos = int(127.0f * ((float) Fl::event_x() / w())); for (int i = 0; i < pars->Pnumformants; ++i) { int diff = abs(pars->Pvowels[*nvowel].formants[i].freq - relPos); if (diff < minDiff) { minDiff = diff; hoverFormant = i; } } redraw(); return 1; } case FL_PUSH: if (Fl::event_key() > FL_Button + FL_RIGHT_MOUSE) { handle(FL_KEYDOWN); // Non-LMB/MMB/RMB button - check for forward/backward return 0; } Fl::pushed(this); // select formant closest to cursor if (selectedFormant < 0 && Fl::event_button() != FL_MIDDLE_MOUSE) { selectedFormant = hoverFormant; delegate(parent.formantnumber, hoverFormant); hoverFormant = -1; } //Activate w. RMB, retain state when using MMB /* * right mouse button is now universally used for MIDI-learn * so we use the shift key instead. * * qMode = Fl::event_button() == FL_RIGHT_MOUSE * || (Fl::event_button() == FL_MIDDLE_MOUSE && qMode); */ qMode = Fl::event_key(FL_Shift_L) || Fl::event_key(FL_Shift_R); update_refs(); return 1; case FL_DRAG: // change frequency/amplitude/q for selected formant { int hDiff = 127 * (xRef - Fl::event_x()) / w(); int vDiff = 127 * (yRef - Fl::event_y()) / h(); if (Fl::event_button2()) // Always prioritize center frequency changes { fl_cursor(FL_CURSOR_WE); delegate(parent.cfknob, limit(cFreqRef + hDiff, 0, 127)); } else { fl_cursor(FL_CURSOR_MOVE); delegate(parent.formant_freq_dial, limit(freqRef - hDiff, 0, 127)); if (qMode) delegate(parent.formant_q_dial, limit(qRef + vDiff, 0, 127)); else delegate(parent.formant_amp_dial, limit(ampRef + vDiff, 0, 127)); } return 1; } case FL_KEYDOWN: // changes active vowel with left/right , x/z, or forward/back mouse buttons if (Fl::event_key(FL_Left) || Fl::event_key(122) || Fl::event_key() == FL_Button + 8) { delegate(parent.vowelnumber, (FF_MAX_VOWELS + ((*nvowel) - 1)) % FF_MAX_VOWELS); hoverFormant = -1; } else if (Fl::event_key(FL_Right) || Fl::event_key(120) || Fl::event_key() == FL_Button + 9) { delegate(parent.vowelnumber, ((*nvowel) + 1) % FF_MAX_VOWELS); hoverFormant = -1; } return 1; case FL_MOUSEWHEEL: { /* * These two had stopped working due to some unknown change * elsewhere, hence the more convulated code. * Original has been kept but commented out. */ float tmp; int offset = Fl::event_dy() * (Fl::event_ctrl() ? 1 : 4); if (Fl::event_shift()) { tmp = (parent.cfknob->value() + offset) / 5; if (tmp > 127) tmp = 127; else if (tmp < 0) tmp = 0; parent.send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantCenter, tmp, TOPLEVEL::type::Write); //delegate(parent.cfknob, limit(pars->Pcenterfreq + offset, 0, 127)); } else { tmp = (parent.octknob->value() + offset) / 5; if (tmp > 127) tmp = 127; else if (tmp < 0) tmp = 0; parent.send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantOctave, tmp, TOPLEVEL::type::Write); //delegate(parent.octknob, limit(pars->Poctavesfreq + offset, 0, 127)); } return 1; } case FL_RELEASE: if (Fl::event_inside(this)) fl_cursor(FL_CURSOR_HAND); if (Fl::event_button() == FL_RIGHT_MOUSE) qMode = false; else if (Fl::event_button() == FL_LEFT_MOUSE) qMode = true; if (!Fl::event_button1() && !Fl::event_button3()) { selectedFormant = -1; return 1; } else { update_refs(); } Fl::pushed(this); return 1; case FL_LEAVE: if (!Fl::event_inside(this)) // Cover for some strange events when clicking { hoverFormant = -1; qMode = false; redraw(); fl_cursor(FL_CURSOR_DEFAULT); } return 1; } return Fl_Box::handle(event);} {} } Function {delegate(Fl_Valuator* w, int value)} {private return_type void } { code {// If widget value has changed, update and perform manual callback if (w->value() != value + 1) { w->value(value + 1); w->do_callback(); }} {} } Function {update_refs()} {private return_type {inline void} } { code {// yRef = Fl::event_y(); xRef = Fl::event_x(); ampRef = pars->Pvowels[*nvowel].formants[selectedFormant].amp; freqRef = pars->Pvowels[*nvowel].formants[selectedFormant].freq; qRef = pars->Pvowels[*nvowel].formants[selectedFormant].q; cFreqRef = pars->Pcenterfreq;} {} } } class FilterUI {: {public Fl_Group,PresetsUI_} } { Function {FilterUI(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// synth = NULL; pars=NULL; velsnsamp=NULL; velsns=NULL; nvowel = 0; nformant = 0; nseqpos = 0; nseqsize = 3; nVoCount = 0; nFoCount = 0; formFreqDef = -1;} {} } Function {~FilterUI()} {} { code {filterui->hide(); formantparswindow->hide(); hide(); delete (formantparswindow);} {} } Function {make_window()} {} { Fl_Window filterui { xywh {460 79 275 75} type Double color 50 labelfont 1 labelsize 12 hide class Fl_Group } { Fl_Group filterparamswindow { xywh {0 0 275 75} box PLASTIC_UP_BOX color 223 labelfont 1 labelsize 10 labelcolor 64 align 17 } { Fl_Choice analogfiltertypechoice { label FilterType callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::analogType, o->value(), TOPLEVEL::type::Write);} tooltip {The Filter type} xywh {5 43 58 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 6 textfont 1 textsize 10 textcolor 64 code1 {o->value(pars->Ptype);} code2 {o->add("Low1");o->add("High1");o->add("Low2");o->add("High2");o->add("Band2");o->add("Stop2");o->add("Peak2");o->add("LShelf2");o->add("HShelf2");} } {} Fl_Choice svfiltertypechoice { label FilterType callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::stateVariableType, o->value(), TOPLEVEL::type::Write);} tooltip {The Filter type} xywh {5 43 58 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 6 textfont 1 textsize 10 textcolor 64 code1 {o->value(pars->Ptype);} code2 {o->add("Low");o->add("High");o->add("Band");o->add("Stop");} } {} Fl_Choice filtertype { label Category callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::baseType, o->value(), TOPLEVEL::type::Write);} tooltip {The Category of the Filter (Analog/Formantic/etc.)} xywh {5 10 66 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 6 textfont 1 textsize 10 textcolor 64 code0 {o->value(pars->Pcategory);} code1 {o->add("analog");o->add("formant");o->add("StVarF");} } {} Fl_Dial cfreqdial { label { C.Freq} callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::centerFrequency, o->value(), TOPLEVEL::type::Write);} tooltip {Center Frequency of the Filter or the base position in the vowel's sequence} xywh {65 28 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->value(pars->Pfreq);} code1 {o->setValueType(getFilterFreqType(filtertype->value()));} class WidgetPDial } Fl_Dial qdial { label Q callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::Q, o->value(), TOPLEVEL::type::Write);} tooltip {Filter resonance or bandwidth} xywh {100 28 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 deactivate class WidgetPDial } Fl_Dial freqtrdial { label {Freq.tr.} callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::frequencyTracking, o->value(), TOPLEVEL::type::Write);} tooltip {Filter frequency tracking} xywh {240 28 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code1 {o->value(pars->Pfreqtrack);} class WidgetPDial } Fl_Dial vsnsadial { label {V.Sns.} callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::velocitySensitivity, o->value(), TOPLEVEL::type::Write);} tooltip {Velocity sensing amount of the Filter} xywh {135 28 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FilterVelocityAmp);} class WidgetPDial } Fl_Dial vsnsdial { label { VF.Sns.} callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::velocityCurve, o->value(), TOPLEVEL::type::Write);} tooltip {Velocity Sensing Function of the Filter} xywh {170 28 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(VC_FilterVelocitySense);} code1 {o->setGraphicsType(VC_FilterVelocitySense);} class WidgetPDial } Fl_Dial gaindial { label Gain callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::gain, o->value(), TOPLEVEL::type::Write);} tooltip {Filter output gain/damp} xywh {205 28 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->value(pars->Pgain);} code1 {o->setValueType(VC_FilterGain);} class WidgetPDial } Fl_Counter stcounter { label {St.} callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::stages, o->value() - 1, TOPLEVEL::type::Write);} tooltip {Filter stages (in order to increase dB/oct. value and the order of the filter)} xywh {73 10 41 15} type Simple selection_color 64 labelsize 10 labelcolor 64 align 8 minimum 1 maximum 5 step 1 value 1 textfont 1 textsize 10 textcolor 64 } } Fl_Text_Display filterparamslabel { label Parameters xywh {135 14 50 4} box NO_BOX labelfont 1 labelsize 10 labelcolor 64 } Fl_Button editbutton { label Edit callback {// int X, Y, W, H, O; int type = engine; if (type > 2) type = 3; //std::cout << "type open " << type << std::endl; formantparswindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Formant Editor"), npart, TOPLEVEL::windowTitle, kititem, engine)).c_str()); loadWin(synth, W, H, X, Y, O, "xFilter-formant " + std::to_string(type)); if (W < formantDW || H < formantDH) { W = formantDW; H = formantDH; } checkSane(X, Y, W, H , formantDW, formantDH); formantparswindow->resize(X, Y, W, H); lastformantX = 0; lastformantY = 0; lastformantW = 0; formantSeen = true; formantRtext(); formantparswindow->show();} xywh {5 40 52 26} box GTK_THIN_UP_BOX selection_color 221 labelfont 1 labelsize 11 labelcolor 64 } Fl_Button filtC { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::filterGroup); ;} xywh {202 8 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Button filtP { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::filterGroup); ;} xywh {220 8 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Check_Button freqtrackoffset { callback {// int tmp = (o->value() != 0); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::frequencyTrackingRange, tmp, TOPLEVEL::type::Write);} tooltip {Set frequency tracking range to 0%-200%} xywh {236 10 16 16} down_box DOWN_BOX selection_color 64 labelcolor 64 align 24 class Fl_Check_Button2 } Fl_Text_Display freqtracknormal { label {- /+} xywh {242 24 44 4} box NO_BOX selection_color 64 labelsize 10 labelcolor 64 textsize 10 textcolor 64 } Fl_Text_Display freqtrackchecked { label {0/+} xywh {242 24 44 4} box NO_BOX selection_color 64 labelsize 10 labelcolor 64 textsize 10 textcolor 64 hide } } } Function {make_formant_window()} {} { Fl_Window formantparswindow { label {Formant Filter Parameters} callback {formClose->do_callback();} xywh {186 150 700 205} type Double labelfont 1 labelsize 12 hide resizable class ScaleTrackedWindow code0 {formantDW = o->w(); formantDH = o->h();} code1 {o->size_range(formantDW, formantDH, 0, 0, 0, 0, 1);} } { Fl_Group {} { xywh {1 1 698 203} box ENGRAVED_FRAME } { Fl_Group {} { xywh {485 47 105 113} box THIN_UP_FRAME } { Fl_Counter formantnumber { label {Formant } callback {// nformant = int(o->value()) - 1; if (nformant >= nFoCount) { nformant = nFoCount - 1; o->value(nformant + 1); } update_formant_window(); formantfiltergraph->redraw(); //send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantNumber, o->value(), TOPLEVEL::type::Write);} xywh {545 80 40 15} type Simple selection_color 64 labelfont 1 labelsize 10 labelcolor 64 align 4 minimum 1 maximum 127 step 1 value 1 textsize 10 textcolor 64 code0 {o->bounds(1,FF_MAX_FORMANTS);} code1 {o->value(nformant + 1);} } Fl_Counter vowelnumber { callback {// nvowel = int(o->value() - 1); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::vowelNumber, nvowel, TOPLEVEL::type::Write);} xywh {545 55 40 20} type Simple selection_color 64 labelfont 1 labelsize 10 labelcolor 64 align 4 minimum 1 maximum 127 step 1 value 1 textfont 1 textsize 11 textcolor 64 code0 {o->bounds(1,FF_MAX_VOWELS);} code1 {o->value(nvowel + 1);} } Fl_Box vowelpatch { label {Vowel no.} xywh {487 56 56 18} box FLAT_BOX labelfont 1 labelsize 10 labelcolor 64 } Fl_Group formantparsgroup { xywh {490 105 95 50} box ENGRAVED_FRAME } { Fl_Dial formant_freq_dial { label Freq callback {// float val = findDynDef(0);//formFreqDef; if (Fl::event_button() == 3) { o->value(val); } o->selection_color(setKnob(o->value(),val)); // has pseudo default send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantFrequency, o->value(), TOPLEVEL::type::Write, nformant, nvowel);} tooltip {Formant frequency} xywh {495 115 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 class WidgetPDial } Fl_Dial formant_q_dial { label Q callback {// float val = o->value(); if (Fl::event_button() == 3) { val = FILTDEF::formQ.def; o->value(val); } o->selection_color(setKnob(val,FILTDEF::formQ.def)); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantQ, val, TOPLEVEL::type::Write, nformant, nvowel);} tooltip {Formant's Q} xywh {525 115 24 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 class WidgetPDial } Fl_Dial formant_amp_dial { label Amp callback {// float val = findDynDef(2); if (Fl::event_button() == 3) o->value(val); o->selection_color(setKnob(o->value(),val)); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantAmplitude, o->value(), TOPLEVEL::type::Write, nformant, nvowel);} tooltip {Formant amplitude} xywh {555 115 24 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 class WidgetPDial } } } Fl_Group {} { xywh {590 47 104 113} box THIN_UP_BOX } { Fl_Counter seqsize { label {Seq.Size} callback {// nseqsize = o->value(); if (nseqpos > nseqsize) { nseqpos = nseqsize; seqpos->value(nseqpos); } send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::sequenceSize, nseqsize, TOPLEVEL::type::Write);} xywh {614 62 54 18} type Simple selection_color 64 labelfont 1 labelsize 10 labelcolor 64 align 5 minimum 1 maximum 127 step 1 value 1 textfont 1 textsize 11 textcolor 64 code0 {o->bounds(1,FF_MAX_SEQUENCE);} code1 {o->value(nseqsize);} } Fl_Counter seqpos { label {S.Pos.} callback {// nseqpos = int(o->value() - 1); if (nseqpos >= nseqsize) { nseqpos = nseqsize - 1; o->value(nseqpos + 1); } send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::sequencePosition, nseqpos, TOPLEVEL::type::Write);} tooltip {Current position in the sequence} xywh {596 98 40 15} type Simple selection_color 64 labelfont 1 labelsize 10 labelcolor 64 align 9 minimum 1 maximum 127 step 1 value 1 textsize 10 textcolor 64 code0 {o->bounds(1,FF_MAX_SEQUENCE);} code1 {o->value(nseqpos + 1);} } Fl_Counter vowel_counter { label Vowel callback {// nVoCount = o->value() - 1; send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::vowelPositionInSequence, nVoCount, TOPLEVEL::type::Write, nseqpos);} tooltip {Vowel number at the sequence position} xywh {648 98 40 15} type Simple selection_color 64 labelsize 10 labelcolor 64 align 1 minimum 1 maximum 127 step 1 value 1 textsize 10 textcolor 64 code0 {o->bounds(1,FF_MAX_VOWELS);} } Fl_Check_Button neginput { label {Neg.Input} callback {// send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::negateInput, o->value(), TOPLEVEL::type::Write);} tooltip {Negate the input from LFO/envelopes/etc.} xywh {628 132 60 20} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(pars->Psequencereversed);} class Fl_Check_Button2 } Fl_Dial strchdial { label Stretch callback {// float val = o->value(); if (Fl::event_button() == 3) { val = FILTDEF::formStretch.def; o->value(val); } o->selection_color(setKnob(val,FILTDEF::formStretch.def)); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantStretch,val, TOPLEVEL::type::Write);} tooltip {Sequence Stretch} xywh {595 130 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 5 maximum 127 code0 {o->value(pars->Psequencestretch);} code1 {o->setValueType(VC_FormFilterStretch);} class WidgetPDial } } Fl_Counter formantcount { label Formants callback {// nFoCount = o->value(); if (nformant >= nFoCount) { nformant = nFoCount -1; formantnumber->value(nformant + 1); } send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::numberOfFormants,nFoCount, TOPLEVEL::type::Write);} xywh {485 19 65 20} type Simple selection_color 64 labelsize 12 labelcolor 64 align 1 minimum 1 maximum 127 step 1 value 1 textsize 12 textcolor 64 code0 {o->bounds(1,FF_MAX_FORMANTS);} } Fl_Dial frsldial { label {Fr.Sl.} callback {// float val = o->value(); if (Fl::event_button() == 3) { val = FILTDEF::formSpeed.def; o->value(val); } o->selection_color(setKnob(val,FILTDEF::formSpeed.def)); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantSlowness, val, TOPLEVEL::type::Write);} tooltip {Formant's Slowness (Morphing)} xywh {565 15 25 25} box ROUND_UP_BOX labelfont 1 labelsize 10 labelcolor 64 align 1 maximum 127 code0 {o->value(pars->Pformantslowness);} code1 {o->setValueType(VC_FormFilterSlowness);} class WidgetPDial } Fl_Value_Output centerfreqvo { label {C.f.} callback {o->value(pars->getcenterfreq()/1000.0);} tooltip {Center Frequency (kHz)} xywh {512 164 35 16} box THIN_DOWN_BOX labelsize 12 labelcolor 64 when 3 minimum 1 maximum 127 step 0.1 value 64 textfont 1 textsize 11 textcolor 64 code0 {o->step(0.01, 1);} code1 {o->value(pars->getcenterfreq()/1000.0);} } Fl_Value_Output octavesfreqvo { label {Oct.} callback {o->value(lrintf(pars->getoctavesfreq()));} tooltip {No. of octaves} xywh {512 185 35 16} box THIN_DOWN_BOX labelsize 12 labelcolor 64 when 3 minimum 1 maximum 127 step 1 value 5 textfont 1 textsize 11 textcolor 64 code0 {o->step(1, 1);} code1 {o->value(pars->getoctavesfreq());} } Fl_Slider cfknob { callback {// if (Fl::event_button() == 3) o->value(FILTDEF::formCentre.def*5); o->selection_color(setSlider(o->value(),FILTDEF::formCentre.def*5)); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantCenter, o->value()/5, TOPLEVEL::type::Write);} xywh {547 164 89 16} type {Horz Knob} box THIN_DOWN_BOX labelcolor 64 maximum 635 step 1 value 1 code0 {o->value(pars->Pcenterfreq*5);} code1 {o->selection_color(setSlider(pars->Pcenterfreq,FILTDEF::formCentre.def));} class mwheel_slider_rev } Fl_Slider octknob { callback {// if (Fl::event_button() == 3) o->value(FILTDEF::formOctave.def*5); o->selection_color(setSlider(o->value(),FILTDEF::formOctave.def*5)); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantOctave, o->value()/5, TOPLEVEL::type::Write);} xywh {547 185 90 16} type {Horz Knob} box THIN_DOWN_BOX labelcolor 64 maximum 635 step 1 value 5 code0 {o->value(pars->Poctavesfreq*5);} code1 {o->selection_color(setSlider(pars->Poctavesfreq,FILTDEF::formOctave.def));} class mwheel_slider_rev } Fl_Dial wvknob { label {Vw.Cl.} callback {// float val = findDynClearDef(); if (Fl::event_button() == 3) { o->value(val); } o->selection_color(setKnob(o->value(),val)); send_data(TOPLEVEL::action::forceUpdate, FILTERINSERT::control::formantClearness, o->value(), TOPLEVEL::type::Write);} tooltip {Vowel "clearness" (transition between vowels)} xywh {600 15 25 25} box ROUND_UP_BOX labelfont 1 labelsize 10 labelcolor 64 align 1 maximum 127 code0 {o->value(pars->Pvowelclearness);} code1 {o->setValueType(VC_FormFilterClearness);} code2 {o->setGraphicsType(VC_FormFilterClearness);} class WidgetPDial } Fl_Button formClose { label Close callback {// int type = engine; if (engine > 2) type = 3; //std::cout << "type close " << type << std::endl; if (formantSeen) saveWin(synth, formantparswindow->w(), formantparswindow->h(), formantparswindow->x(), formantparswindow->y(), false, "xFilter-formant " +std::to_string(type)); formantSeen = false, formantparswindow->hide(); lastformantW = 0;} xywh {643 170 50 25} box THIN_UP_BOX color 196 labelcolor 64 } Fl_Button formCopy { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::filterGroup,0, nvowel); // dummy parameter always stores all possible formants ;} xywh {635 25 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button formPaste { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::filterGroup,0, nvowel); // dummy parameter always stores all possible formants ;} xywh {665 25 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Box formvowel { label Vowel xywh {635 8 55 15} labelcolor 64 } Fl_Box {} { xywh {630 4 64 40} box EMBOSSED_FRAME } } } code {// Formant graph { FormantFilterGraph* o = formantfiltergraph = new FormantFilterGraph(5, 5, 475, 195, *this, pars, &nvowel, &nformant); formantfiltergraph->box(FL_BORDER_BOX); formantparswindow->add(o); } // FormantFilterGraph* formantfiltergraph} {} } Function {update_formant_window()} {} { code {// formFreqDef = pars->Pvowels[nvowel].formants[nformant].firstF; formant_freq_dial->value(pars->Pvowels[nvowel].formants[nformant].freq); formant_freq_dial->selection_color(setKnob(formant_freq_dial->value(),findDynDef(0))); formant_q_dial->value(pars->Pvowels[nvowel].formants[nformant].q); formant_q_dial->selection_color(setKnob( formant_q_dial->value(),FILTDEF::formQ.def)); formant_amp_dial->value(pars->Pvowels[nvowel].formants[nformant].amp); formant_amp_dial->selection_color(setKnob( formant_amp_dial->value(),findDynDef(2))); nseqsize = pars->Psequencesize; seqsize->value(nseqsize); nFoCount = fetchData(0, FILTERINSERT::control::numberOfFormants, npart, kititem, engine, TOPLEVEL::insert::filterGroup); formantcount->value(nFoCount); nVoCount = fetchData(0, FILTERINSERT::control::vowelPositionInSequence, npart, kititem, engine, TOPLEVEL::insert::filterGroup, nseqpos); vowel_counter->value(nVoCount + 1);} {} } Function {check_vowel()} {} { code {// bool vowelseen = false; for (int i = 0; i < nseqsize; ++i) { if ((nvowel) == fetchData(0, FILTERINSERT::control::vowelPositionInSequence, npart, kititem, engine, TOPLEVEL::insert::filterGroup, i)) vowelseen = true; } if (vowelseen) vowelpatch->color(FL_BACKGROUND_COLOR); else vowelpatch->color(warning_background); vowelpatch->redraw();} {} } Function {refresh()} {} { code {// int categ = pars->Pcategory; int parstype = pars->Ptype; filtertype->value(categ); cfreqdial->value(pars->Pfreq); freqtrackoffset->value(pars->Pfreqtrackoffset); freqtrdial->setValueType(getFilterFreqTrackType(freqtrackoffset->value())); qdial->value(pars->Pq); freqtrdial->value(pars->Pfreqtrack); gaindial->value(pars->Pgain); qdial->activate(); switch (categ) { case 0: { analogfiltertypechoice->value(parstype); analogfiltertypechoice->show(); svfiltertypechoice->hide(); editbutton->hide(); formantparswindow->hide(); cfreqdial->label("C.freq"); if (parstype < 2) qdial->deactivate(); break; } case 1: { analogfiltertypechoice->hide(); svfiltertypechoice->hide(); editbutton->show(); update_formant_window(); check_vowel(); formantfiltergraph->redraw(); cfreqdial->label("BS.pos"); break; } case 2: { svfiltertypechoice->value(parstype); svfiltertypechoice->show(); analogfiltertypechoice->hide(); editbutton->hide(); formantparswindow->hide(); stcounter->value(fetchData(0, FILTERINSERT::control::stages, npart, kititem, engine, TOPLEVEL::insert::filterGroup) + 1); cfreqdial->label("C.freq"); break; } } if (kititem == EFFECT::type::dynFilter) { dynFilt = true; dynPreset = fetchData(0, EFFECT::control::preset, npart, kititem, engine); switch (dynPreset) { case 0: { cfreqdial->selection_color(setKnob(cfreqdial->value(),FILTDEF::dynFreq0.def)); qdial->selection_color(setKnob(qdial->value(),FILTDEF::dynQval0.def)); break; } case 1: { cfreqdial->selection_color(setKnob(cfreqdial->value(),FILTDEF::dynFreq1.def)); qdial->selection_color(setKnob(qdial->value(),FILTDEF::dynQval1.def)); break; } case 2: { cfreqdial->selection_color(setKnob(cfreqdial->value(),FILTDEF::dynFreq2.def)); qdial->selection_color(setKnob(qdial->value(),FILTDEF::dynQval2.def)); break; } case 3: { cfreqdial->selection_color(setKnob(cfreqdial->value(),FILTDEF::dynFreq3.def)); qdial->selection_color(setKnob(qdial->value(),FILTDEF::dynQval3.def)); break; } case 4: { cfreqdial->selection_color(setKnob(cfreqdial->value(),FILTDEF::dynFreq4.def)); qdial->selection_color(setKnob(qdial->value(),FILTDEF::dynQval4.def)); break; } } } else { if (engine == PART::engine::addSynth ||engine == PART::engine::padSynth ) cfreqdial->selection_color(setKnob(cfreqdial->value(),FILTDEF::addFreq.def)); else if (engine == PART::engine::subSynth) cfreqdial->selection_color(setKnob(cfreqdial->value(),FILTDEF::subFreq.def)); if (engine >= PART::engine::addVoice1) { cfreqdial->selection_color(setKnob(cfreqdial->value(),FILTDEF::voiceFreq.def)); qdial->selection_color(setKnob(qdial->value(),FILTDEF::voiceQval.def)); } else qdial->selection_color(setKnob(qdial->value(),FILTDEF::qVal.def)); } if (categ == 0) { if (parstype < 2) qdial->deactivate(); else qdial->activate(); } updateVCforQ(); freqtrdial->selection_color(setKnob(freqtrdial->value(),FILTDEF::freqTrack.def)); if (engine >= PART::engine::addVoice1 && engine < PART::addVoiceModEnd) vsnsadial->selection_color(setKnob(vsnsadial->value(),FILTDEF::voiceVelSense.def)); else vsnsadial->selection_color(setKnob(vsnsadial->value(),FILTDEF::velSense.def)); vsnsdial->selection_color(setKnob(vsnsdial->value(),FILTDEF::velFuncSense.def)); gaindial->selection_color(setKnob(gaindial->value(),FILTDEF::gain.def)); frsldial->selection_color(setKnob(frsldial->value(),FILTDEF::formSpeed.def)); wvknob->selection_color(setKnob(wvknob->value(),findDynClearDef())); formant_freq_dial->selection_color(setKnob(formant_freq_dial->value(),findDynDef(0))); formant_q_dial->selection_color(setKnob(formant_q_dial->value(),FILTDEF::formQ.def)); formant_amp_dial->selection_color(setKnob(formant_amp_dial->value(),findDynDef(2))); strchdial->selection_color(setKnob(strchdial->value(),FILTDEF::formStretch.def)); filterparamswindow->redraw();} {} } Function {filterRtext(float dScale)} {} { code {// int size = int(dScale * 10); filterparamslabel->labelsize(size); cfreqdial->labelsize(size); qdial->labelsize(size); freqtrdial->labelsize(size); vsnsadial->labelsize(size); vsnsdial->labelsize(size); gaindial->labelsize(size); filtertype->labelsize(size); filtertype->textsize(size); stcounter->labelsize(size); stcounter->textsize(size); analogfiltertypechoice->labelsize(size); analogfiltertypechoice->textsize(size); svfiltertypechoice->labelsize(size); svfiltertypechoice->textsize(size); editbutton->labelsize(size); filtC->labelsize(size); filtP->labelsize(size); freqtrackoffset->labelsize(size); freqtracknormal->labelsize(size); freqtrackchecked->labelsize(size);} {} } Function {theme()} {} { code {// if(formantparswindow) { if(formantparswindow->visible()) { lastformantX = 0; formantRtext(); formantparswindow->redraw(); } } ;} {} } Function {formantRtext()} {} { code {// /* * This is very different from other windows because it is called * via the draw method, not the usual chain. */ if (lastformantX == formantparswindow->x() && lastformantY == formantparswindow->y() &&lastformantW == formantparswindow->w()) return; lastformantX = formantparswindow->x(); lastformantY = formantparswindow->y(); lastformantW = formantparswindow->w(); //std::cout << "formant seen" << std::endl; float dScale = formantparswindow->w() / float(formantDW); int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); int size14 = int(14 * dScale); formantnumber->labelsize(size); formantnumber->textsize(size); vowelpatch->labelsize(size); vowelnumber->textsize(size11); formant_freq_dial->labelsize(size); formant_q_dial->labelsize(size); formant_amp_dial->labelsize(size); seqsize->labelsize(size); seqsize->textsize(size11); seqpos->labelsize(size); seqpos->textsize(size); vowel_counter->labelsize(size); vowel_counter->textsize(size); neginput->labelsize(size); strchdial->labelsize(size); formantcount->labelsize(size12); formantcount->textsize(size12); frsldial->labelsize(size); centerfreqvo->labelsize(size12); centerfreqvo->textsize(size11); octavesfreqvo->labelsize(size12); octavesfreqvo->textsize(size11); wvknob->labelsize(size); formClose->labelsize(size14); formvowel->labelsize(size14); formCopy->labelsize(size11); formPaste->labelsize(size11);} {} } Function {send_data(int action, int control, float value, int type, int parameter = UNUSED, int offset = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, engine, TOPLEVEL::insert::filterGroup, parameter, offset);} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED, int request = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg, request);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char part = getData->data.part; unsigned char kititem = getData->data.kit; unsigned char eng = getData->data.engine; unsigned char param = getData->data.parameter; unsigned char offset = getData->data.offset; bool isCurrent = (param == nformant && offset == nvowel); int value_int = lrintf(value); bool fromUs = ((getData->data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromGUI); dynFilt = (kititem == EFFECT::type::dynFilter); if (part != npart || (!dynFilt && eng != engine)) return; if (dynFilt) { //std::cout << "is dyn " << value << std::endl; dynPreset = fetchData(0, EFFECT::control::preset, npart, kititem, engine); if (part == TOPLEVEL::section::systemEffects) synth->getGuiMaster()->syseffectui->UpdatePresetColour(1, EFFECT::type::dynFilter - EFFECT::type::none); else if (part == TOPLEVEL::section::insertEffects) synth->getGuiMaster()->inseffectui->UpdatePresetColour(1, EFFECT::type::dynFilter - EFFECT::type::none); else synth->getGuiMaster()->partui->inseffectui->UpdatePresetColour(1, EFFECT::type::dynFilter - EFFECT::type::none); // normal part effect } bool isAdd = (eng == PART::engine::addSynth); bool isVoice = (eng >= PART::engine::addVoice1); bool isSub = (eng == PART::engine::subSynth); bool isPad = (eng == PART::engine::padSynth); switch(control) { case FILTERINSERT::control::centerFrequency: { cfreqdial->value(value); if (dynFilt) { switch (dynPreset) { case 0: cfreqdial->selection_color(setKnob(value,FILTDEF::dynFreq0.def)); break; case 1: cfreqdial->selection_color(setKnob(value,FILTDEF::dynFreq1.def)); break; case 2: cfreqdial->selection_color(setKnob(value,FILTDEF::dynFreq2.def)); break; case 3: cfreqdial->selection_color(setKnob(value,FILTDEF::dynFreq3.def)); break; case 4: cfreqdial->selection_color(setKnob(value,FILTDEF::dynFreq4.def)); break; } formantfiltergraph->redraw(); } else if(isAdd) cfreqdial->selection_color(setKnob(value,FILTDEF::addFreq.def)); else if(isVoice) cfreqdial->selection_color(setKnob(value,FILTDEF::voiceFreq.def)); else if (isSub) cfreqdial->selection_color(setKnob(value,FILTDEF::subFreq.def)); else if(isPad) cfreqdial->selection_color(setKnob(value,FILTDEF::padFreq.def)); break; } case FILTERINSERT::control::Q: { qdial->value(value); if (dynFilt) { switch (dynPreset) { case 0: qdial->selection_color(setKnob(value,FILTDEF::dynQval0.def)); break; case 1: qdial->selection_color(setKnob(value,FILTDEF::dynQval1.def)); break; case 2: qdial->selection_color(setKnob(value,FILTDEF::dynQval2.def)); break; case 3: qdial->selection_color(setKnob(value,FILTDEF::dynQval3.def)); break; case 4: qdial->selection_color(setKnob(value,FILTDEF::dynQval4.def)); break; } formantfiltergraph->redraw(); } else if (isVoice) qdial->selection_color(setKnob(value,FILTDEF::voiceQval.def)); else qdial->selection_color(setKnob(value,FILTDEF::qVal.def)); if (filtertype->value() == 1) formantfiltergraph->redraw(); break; } case FILTERINSERT::control::frequencyTracking: freqtrdial->value(value); freqtrdial->selection_color(setKnob(value,FILTDEF::freqTrack.def)); break; case FILTERINSERT::control::velocitySensitivity: { vsnsadial->value(value); if (isVoice) vsnsadial->selection_color(setKnob(value,FILTDEF::voiceVelSense.def)); else vsnsadial->selection_color(setKnob(value,FILTDEF::velSense.def)); if (velsnsamp != NULL) *velsnsamp = value; break; } case FILTERINSERT::control::velocityCurve: vsnsdial->value(value); vsnsdial->selection_color(setKnob(value,FILTDEF::velFuncSense.def)); if (velsns != NULL) *velsns = value; break; case FILTERINSERT::control::gain: gaindial->value(value); gaindial->selection_color(setKnob(value,FILTDEF::gain.def)); formantfiltergraph->redraw(); break; case FILTERINSERT::control::stages: if (!fromUs) stcounter->value(value_int + 1); formantfiltergraph->redraw(); break; case FILTERINSERT::control::baseType: filtertype->value(value_int); cfreqdial->setValueType(getFilterFreqType(value)); refresh(); break; case FILTERINSERT::control::analogType: analogfiltertypechoice->value(value_int); if (value_int < 2) qdial->deactivate(); else qdial->activate(); updateVCforQ(); break; case FILTERINSERT::control::stateVariableType: svfiltertypechoice->value(value_int); break; case FILTERINSERT::control::frequencyTrackingRange: freqtrackoffset->value(value_int); freqtrdial->setValueType(getFilterFreqTrackType(value)); if (value_int) { freqtracknormal->hide(); freqtrackchecked->show(); } else { freqtracknormal->show(); freqtrackchecked->hide(); } break; case FILTERINSERT::control::formantSlowness: if (!fromUs) { frsldial->value(value); frsldial->selection_color(setKnob(value,FILTDEF::formSpeed.def)); } break; case FILTERINSERT::control::formantClearness: if (!fromUs) { wvknob->value(value); wvknob->selection_color(setKnob(value,findDynClearDef())); } break; case FILTERINSERT::control::formantFrequency: if (isCurrent) { if (!fromUs) { formant_freq_dial->value(value); formant_freq_dial->selection_color(setKnob(value,findDynDef(0))); // has pseudo default } formantfiltergraph->redraw(); } break; case FILTERINSERT::control::formantQ: if (isCurrent) { if (!fromUs) { formant_q_dial->value(value); formant_q_dial->selection_color(setKnob(value,FILTDEF::formQ.def)); } formantfiltergraph->redraw(); } break; case FILTERINSERT::control::formantAmplitude: if (isCurrent) { if (!fromUs) { formant_amp_dial->value(value); formant_amp_dial->selection_color(setKnob(value,FILTDEF::formAmp.def)); } formantfiltergraph->redraw(); } break; case FILTERINSERT::control::formantStretch: if (!fromUs) { strchdial->value(value); strchdial->selection_color(setKnob(value,FILTDEF::formStretch.def)); } break; case FILTERINSERT::control::formantCenter: cfknob->value(value*5); cfknob->selection_color(setSlider(value,64)); centerfreqvo->do_callback(); formantfiltergraph->redraw(); break; case FILTERINSERT::control::formantOctave: octknob->value(value*5); octknob->selection_color(setSlider(value,64)); octavesfreqvo->do_callback(); formantfiltergraph->redraw(); break; case FILTERINSERT::control::numberOfFormants: formantcount->value(value_int); update_formant_window(); formantfiltergraph->redraw(); break; case FILTERINSERT::control::vowelNumber: nvowel = value_int; update_formant_window(); check_vowel(); formantfiltergraph->redraw(); break; case FILTERINSERT::control::formantNumber: nformant = value_int; update_formant_window(); formantfiltergraph->redraw(); break; case FILTERINSERT::control::sequenceSize: seqsize->value(value_int); update_formant_window(); check_vowel(); formantfiltergraph->redraw(); break; case FILTERINSERT::control::sequencePosition: update_formant_window(); check_vowel(); break; case FILTERINSERT::control::vowelPositionInSequence: vowel_counter->value(value_int); update_formant_window(); check_vowel(); formantfiltergraph->redraw(); break; case FILTERINSERT::control::negateInput: neginput->value(value != 0); break; }} {} } Function {findDynDef(int type)} {return_type float } { code {// types freq 0, q 1, amp 2 float val; if (type == 0) val = formFreqDef; // standard default; else val = FILTDEF::formAmp.def; // standard default if (dynFilt) { //std::cout << "is dyn" << std::endl; if (dynPreset == 3) { if (nvowel == 0) { switch (nformant) { case 0: if (type == 0) val = DYNform::Preset3V0F0.freq; else val = DYNform::Preset3V0F0.amp; break; case 1: if (type == 0) val = DYNform::Preset3V0F1.freq; else val = DYNform::Preset3V0F1.amp; break; case 2: if (type == 0) val = DYNform::Preset3V0F2.freq; else val = DYNform::Preset3V0F2.amp; break; } } else if (nvowel == 1) { switch (nformant) { case 0: if (type == 0) val = DYNform::Preset3V1F0.freq; else val = DYNform::Preset3V1F0.amp; break; case 1: if (type == 0) val = DYNform::Preset3V1F1.freq; else val = DYNform::Preset3V1F1.amp; break; case 2: if (type == 0) val = DYNform::Preset3V1F2.freq; else val = DYNform::Preset3V1F2.amp; break; } } } else if (dynPreset == 4) { if (nvowel == 0) { switch (nformant) { case 0: if (type == 0) val = DYNform::Preset4V0F0.freq; else val = DYNform::Preset4V0F0.amp; break; case 1: if (type == 0) val = DYNform::Preset4V0F1.freq; else val = DYNform::Preset4V0F1.amp; break; } } else if (nvowel == 1) { switch (nformant) { case 0: if (type == 0) val = DYNform::Preset4V1F0.freq; else val = DYNform::Preset4V1F0.amp; break; case 1: if (type == 0) val = DYNform::Preset4V1F1.freq; else val = DYNform::Preset4V1F1.amp; break; } } } } return val; ;} {} } Function {findDynClearDef()} {return_type float } { code {// if (dynFilt && dynPreset == 4) return 0; return FILTDEF::formClear.def;; ;} {} } Function {init(FilterParams *filterpars_,unsigned char *velsnsamp_,unsigned char *velsns_, int npart_, int kititem_, int engine_)} {} { code {// pars=filterpars_; synth = & pars->getSynthEngine(); velsnsamp = velsnsamp_; velsns = velsns_; npart = npart_; kititem = kititem_; engine = engine_; dynFilt = false; dynPreset = 0; lastformantX = 0; lastformantY = 0; lastformantW = 0; formantSeen = false; make_window(); end(); make_formant_window(); filterui->resize(this->x(), this->y(), this->w(), this->h()); if (velsnsamp == NULL) { vsnsadial->deactivate(); vsnsadial->value(127); } else vsnsadial->value(*velsnsamp); if (velsns == NULL) { vsnsdial->deactivate(); vsnsdial->value(127); } else vsnsdial->value(*velsns); cfreqdial->setValueType(getFilterFreqType(pars->Pcategory)); analogfiltertypechoice->value(0); svfiltertypechoice->value(0); stcounter->value(fetchData(0, FILTERINSERT::control::stages, npart, kititem, engine, TOPLEVEL::insert::filterGroup) + 1); formantparswindow->label(this->label()); refresh();} {} } Function {updateVCforQ()} {return_type void } { code {// switch (filtertype->value()) { case 0: if (analogfiltertypechoice->value() < 2) qdial->setValueType(VC_FilterQAnalogUnused); else qdial->setValueType(VC_FilterQ); break; case 1: case 2: qdial->setValueType(VC_FilterQ); break; }} {} } decl {FormantFilterGraph *formantfiltergraph;} {public local } decl {FilterParams *pars;} {private local } decl {unsigned char *velsnsamp,*velsns;} {private local } decl {int nvowel,nformant,nseqpos, nseqsize, nVoCount, nFoCount;} {private local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int engine;} {private local } decl {bool dynFilt;} {private local } decl {int dynPreset;} {private local } decl {int formantDW;} {private local } decl {int formantDH;} {private local } decl {int lastformantX;} {private local } decl {int lastformantY;} {private local } decl {int lastformantW;} {private local } decl {bool formantSeen;} {private local } decl {float formFreqDef;} {private local } } yoshimi-2.3.5.1/src/UI/LFOUI.fl000066400000000000000000000452001506652756400156670ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {LFOUI.h} {not_in_source in_header } comment {LFOUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, Alan Calvert Copyright 2017-2023, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original } {selected in_source in_header } decl {\#include } {public local } decl {\#include "UI/WidgetPDial.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "Params/LFOParams.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {public global } decl {\#include "MasterUI.h"} {private global } class LFOUI {: {public Fl_Group, PresetsUI_} } { Function {LFOUI(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// synth = NULL; pars=NULL;} {} } Function {~LFOUI()} {} { code {// lfoui->hide(); hide();} {} } Function {make_window()} {} { Fl_Window lfoui { xywh {916 422 275 70} type Double color 50 labelfont 1 labelsize 12 labelcolor 64 hide resizable class Fl_Group } { Fl_Group lfoparamswindow { label LFO xywh {0 0 275 70} box PLASTIC_UP_BOX color 223 labelfont 1 labelsize 10 labelcolor 64 align 17 } { Fl_Check_Button bpm { label BPM callback {// send_data(0, group, LFOINSERT::control::bpm, o->value(), TOPLEVEL::type::Integer); updateLFOFreqType(); updateBpmControls();} tooltip {Lock LFO frequency to a multiple of the BPM.} xywh {230 5 45 15} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button continous { label {Cont.} callback {// send_data(0, group, LFOINSERT::control::continuous, o->value(), TOPLEVEL::type::Integer);} tooltip {Continuous LFO Run the LFO continuously even when the sound is not playing. If BPM is on, then the LFO phase will be locked to the song position.} xywh {230 20 15 15} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 class Fl_Check_Button2 } Fl_Dial freq { label {Freq.} callback {// send_data(TOPLEVEL::action::forceUpdate, group, LFOINSERT::control::speed, o->value(), 0);} tooltip {LFO Frequency} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 step 1e-05 class WidgetPDial } Fl_Dial intensity { label Depth callback {// float depth = o->value(); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1 && group == 1) // special case to sync voice list vibrato { synth->getGuiMaster()->partui->adnoteui->voicelistitem[engine - PART::engine::addVoice1]->voicelistvibratto->value(depth); synth->getGuiMaster()->partui->adnoteui->voicelistitem[engine - PART::engine::addVoice1]->voicelistvibratto->selection_color(setSlider(depth,40)); }; send_data(TOPLEVEL::action::forceUpdate, group, LFOINSERT::control::depth, depth, 0);} tooltip {LFO Amount} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(getLFOdepthType(group));} class WidgetPDial } Fl_Dial delay { label Delay callback {// send_data(TOPLEVEL::action::forceUpdate, group, LFOINSERT::control::delay, o->value(), 0);} tooltip {LFO delay} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(VC_LFOdelay);} class WidgetPDial } Fl_Dial startphase { label Start callback {// send_data(TOPLEVEL::action::forceUpdate, group, LFOINSERT::control::start, o->value(), 0);} tooltip {LFO Startphase (leftmost is Random)} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code0 {collect_readData(synth, 0, LFOINSERT::control::bpm, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group);} code1 {o->setValueType(bpm ? VC_LFOstartphase : VC_LFOstartphaseRand);} class WidgetPDial } Fl_Choice LFOtype { label Type callback {// send_data(0, group, LFOINSERT::control::type, o->value(), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {220 50 50 15} down_box BORDER_BOX labelsize 9 labelcolor 64 align 1 textfont 1 textsize 10 textcolor 64 code0 {o->add("Sine");o->add("Tri");o->add("Squr");o->add("R.up");o->add("R.dn");o->add("E1dn");o->add("E2dn");o->add("S&&H");o->add("RSqU");o->add("RSqD");} } {} Fl_Dial randomness { label {Amp. } callback {// send_data(TOPLEVEL::action::forceUpdate, group, LFOINSERT::control::amplitudeRandomness, o->value(), 0);} tooltip {LFO Amplitude Randomness} xywh {145 30 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 code1 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial freqrand { label { Freq.} callback {// send_data(TOPLEVEL::action::forceUpdate, group, LFOINSERT::control::frequencyRandomness, o->value(), 0);} tooltip {LFO Frequency Randomness} xywh {170 30 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 code1 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial stretch { label {Str.} callback {// send_data(TOPLEVEL::action::forceUpdate, group, LFOINSERT::control::stretch, o->value(), 0);} tooltip {LFO frequency stretch} xywh {200 30 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 code1 {o->setValueType(VC_LFOStretch);} class WidgetPDial } Fl_Button lfoC { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); ;} xywh {195 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Button lfoP { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); ;} xywh {212 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 197 } Fl_Group randgroup { label {Rand.} xywh {140 49 55 15} labelsize 11 labelcolor 64 align 16 } {} } } } Function {refresh()} {} { code {// //std::cout << "group " << int(group) << std::endl; float value; value = collect_readData(synth, 0, LFOINSERT::control::speed, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); freq->value(value); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1) { switch (group) { case 0: freq->selection_color(setKnob(value,LFODEF::voiceAmpFreq.def)); break; case 1: freq->selection_color(setKnob(value,LFODEF::voiceFreqFreq.def)); break; case 2: freq->selection_color(setKnob(value,LFODEF::voiceFiltFreq.def)); break; } } else { switch (group) { case 0: freq->selection_color(setKnob(value,LFODEF::ampFreq.def)); break; case 1: freq->selection_color(setKnob(value,LFODEF::freqFreq.def)); break; case 2: freq->selection_color(setKnob(value,LFODEF::filtFreq.def)); break; } } value = collect_readData(synth, 0, LFOINSERT::control::depth, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); intensity->value(value); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1) { switch (group) // all of these are different! { case 0: intensity->selection_color(setKnob(value,LFODEF::voiceAmpDepth.def)); break; case 1: // rather special to sync voice list vibrato intensity->selection_color(setKnob(value,LFODEF::voiceFreqDepth.def)); // not currently able to directly set voice list entry break; case 2: intensity->selection_color(setKnob(value,LFODEF::voiceFiltDepth.def)); break; } } else intensity->selection_color(setKnob(value,LFODEF::depth.def)); value = collect_readData(synth, 0, LFOINSERT::control::start, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); startphase->value(value); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1 && group == 1) startphase->selection_color(setKnob(value,LFODEF::voiceFreqStart.def)); else startphase->selection_color(setKnob(value,LFODEF::start.def)); value = collect_readData(synth, 0, LFOINSERT::control::delay, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); delay->value(value); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1 && group == 0) delay->selection_color(setKnob(value,LFODEF::voiceAmpDelay.def)); else delay->selection_color(setKnob(value,LFODEF::delay.def)); continous->value(collect_readData(synth, 0, LFOINSERT::control::continuous, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group)); bpm->value(collect_readData(synth, 0, LFOINSERT::control::bpm, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group)); value = collect_readData(synth, 0, LFOINSERT::control::stretch, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); stretch->value(value); stretch->selection_color(setKnob(value,LFODEF::stretch.def)); value = collect_readData(synth, 0, LFOINSERT::control::amplitudeRandomness, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); randomness->value(value); randomness->selection_color(setKnob(value,LFODEF::ampRnd.def)); value = collect_readData(synth, 0, LFOINSERT::control::frequencyRandomness, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group); freqrand->value(value); freqrand->selection_color(setKnob(value,LFODEF::freqRnd.def)); LFOtype->value(collect_readData(synth, 0, LFOINSERT::control::type, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group)); updateLFOFreqType(); updateBpmControls(); ;} {} } Function {lfoRtext(float dScale)} {} { code {// int size = int(dScale * 10); lfoparamswindow->labelsize(size); freq->labelsize(size); intensity->labelsize(size); delay->labelsize(size); startphase->labelsize(size); randomness->labelsize(size); freqrand->labelsize(size); stretch->labelsize(size); randgroup->labelsize(size); LFOtype->labelsize(int(9 * dScale)); LFOtype->textsize(size); lfoC->labelsize(size); lfoP->labelsize(size); continous->labelsize(size); bpm->labelsize(size); lfoui->redraw(); ;} {} } Function {send_data(int action, int group, int control, float value, int type)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, engine, TOPLEVEL::insert::LFOgroup, group);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char part = getData->data.part; unsigned char eng = getData->data.engine; unsigned char par = getData->data.parameter; if (part != npart || (eng >= PART::engine::addVoice1 && eng != engine)) return; switch(control) { case LFOINSERT::control::speed: { freq->value(value); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1) { switch (par) { case 0: freq->selection_color(setKnob(value,LFODEF::voiceAmpFreq.def)); break; case 1: freq->selection_color(setKnob(value,LFODEF::voiceFreqFreq.def)); break; case 2: freq->selection_color(setKnob(value,LFODEF::voiceFiltFreq.def)); break; } } else { switch (par) { case 0: freq->selection_color(setKnob(value,LFODEF::ampFreq.def)); break; case 1: freq->selection_color(setKnob(value,LFODEF::freqFreq.def)); break; case 2: freq->selection_color(setKnob(value,LFODEF::filtFreq.def)); break; } } break; } case LFOINSERT::control::depth: { intensity->value(value); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1) { switch (par) // all of these are different! { case 0: intensity->selection_color(setKnob(value,LFODEF::voiceAmpDepth.def)); break; case 1: // rather special to sync voice list vibrato intensity->selection_color(setKnob(value,LFODEF::voiceFreqDepth.def)); synth->getGuiMaster()->partui->adnoteui->voicelistitem[engine - PART::engine::addVoice1]->voicelistvibratto->value(value); synth->getGuiMaster()->partui->adnoteui->voicelistitem[engine - PART::engine::addVoice1]->voicelistvibratto->selection_color(setSlider(value,LFODEF::voiceFreqDepth.def)); break; case 2: intensity->selection_color(setKnob(value,LFODEF::voiceFiltDepth.def)); break; } } else intensity->selection_color(setKnob(value,LFODEF::depth.def)); break; } case LFOINSERT::control::start: { startphase->value(value); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1 && par == 1) startphase->selection_color(setKnob(value,LFODEF::voiceFreqStart.def)); else startphase->selection_color(setKnob(value,LFODEF::start.def)); break; } case LFOINSERT::control::delay: { delay->value(value); if (engine >= PART::engine::addVoice1 && engine < PART::engine::addMod1 && par == 0) delay->selection_color(setKnob(value,LFODEF::voiceAmpDelay.def)); else delay->selection_color(setKnob(value,LFODEF::delay.def)); break; } case LFOINSERT::control::amplitudeRandomness: randomness->value(value); randomness->selection_color(setKnob(value,LFODEF::ampRnd.def)); break; case LFOINSERT::control::frequencyRandomness: freqrand->value(value); freqrand->selection_color(setKnob(value,LFODEF::freqRnd.def)); break; case LFOINSERT::control::stretch: stretch->value(value); stretch->selection_color(setKnob(value,LFODEF::stretch.def)); break; case LFOINSERT::control::type: LFOtype->value((int)value); break; case LFOINSERT::control::continuous: continous->value(value != 0); break; case LFOINSERT::control::bpm: bpm->value(value != 0); updateLFOFreqType(); updateBpmControls(); break; } ;} {} } Function {init(SynthEngine *synth_, int npart_, int kititem_, int engine_, int group_)} {} { code {// synth = synth_; npart = npart_; kititem = kititem_; engine = engine_; group = group_; make_window(); end(); refresh(); lfoui->resize(this->x(),this->y(),this->w(),this->h()); lfoparamswindow->label(this->label()); ;} {} } Function {updateLFOFreqType()} {return_type void } { code {freq->setValueType(getLFOFreqType(bpm->value()));} {} } Function {updateBpmControls()} {return_type void } { code {// if (bpm->value() == 0) { freqrand->activate(); stretch->activate(); startphase->setValueType(VC_LFOstartphaseRand); } else { freqrand->deactivate(); stretch->deactivate(); startphase->setValueType(VC_LFOstartphase); } ;} {} } decl {LFOParams *pars;} {private local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int group;} {private local } decl {int engine;} {private local } } yoshimi-2.3.5.1/src/UI/MasterMiscUI.fl000066400000000000000000000556321506652756400173300ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0403 header_name {.h} code_name {.cc} comment {MasterUI.h} {not_in_source in_header } comment {MasterUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2025, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. } {selected in_source in_header } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include "ADnoteUI.h"} {public local } decl {\#include "SUBnoteUI.h"} {public local } decl {\#include "EffUI.h"} {public local } decl {\#include "VirKeyboardUI.h"} {public local } decl {\#include "ConfigUI.h"} {public local } decl {\#include "BankUI.h"} {public local } decl {\#include "PartUI.h"} {public local } decl {\#include "MicrotonalUI.h"} {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "ParametersUI.h"} {public local } decl {\#include "ConsoleUI.h"} {public local } decl {\#include "MasterUI.h"} {private global } decl {\#include "UI/WidgetMWSlider.h"} {private global } decl {\#include "Misc/SynthEngine.h"} {public local } decl {\#include } {public global } decl {\#include } {private global } decl {\#define MIN_DB -48.0} {public local } decl {\#define NO_DB -68.0} {public local } decl {\#include "Misc/NumericFuncs.h" using func::asDecibel;} {private local } decl {\#include "Misc/FormatFuncs.h" using func::asString;} {private local } class VUMeter {: {public Fl_Box} } { Function {VUMeter(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {npart=-1;} {} } Function {init(int part_, SynthEngine *_synth)} {} { code {// the "part_" parameters sets the part (if it is >=0), else it sets the master synth = _synth; label(NULL); tick500 = 0; npart = part_; oldpeakl = 0; oldpeakr = 0; oldrmsdbl = 0.0; oldrmsdbr = 0.0; maxdbl = NO_DB; maxdbr = NO_DB; clipped = 0; plgroup = &synth->getGuiMaster()->panelgroup; for (int i = 0; i < NUM_MIDI_PARTS; i++) { panelpart.oldpeak[i] = 0; panelpart.oldpeakR[i] = 0; panelpart.clip[i] = false; panelpart.clipR[i] = false; }} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg);} {} } Function {draw_master()} {} { code {// int ox = x(); int oy = y(); int lx = w(); int ly = h(); float dbl = asDecibel(fetchData(0, MAIN::control::readMainLRpeak, TOPLEVEL::section::main, 0)); float dbr = asDecibel(fetchData(0, MAIN::control::readMainLRpeak, TOPLEVEL::section::main, 1)); float rmsdbl = asDecibel(fetchData(0, MAIN::control::readMainLRrms, TOPLEVEL::section::main, 0)); float rmsdbr = asDecibel(fetchData(0, MAIN::control::readMainLRrms, TOPLEVEL::section::main, 1)); clipped = clipped | (dbl > 0) | ((dbr > 0) << 1); if (dbl > 0.5f) dbl = 0.5f; if (dbr > 0.5f) dbr = 0.5f; if (dbl > maxdbl) maxdbl = dbl; if (dbr > maxdbr) maxdbr = dbr; dbl = (MIN_DB - dbl) / MIN_DB; if (dbl < 0.0) dbl = 0.0; else if (dbl > 1.0) dbl = 1.0; dbr = (MIN_DB - dbr) / MIN_DB; if (dbr < 0.0) dbr = 0.0; else if (dbr > 1.0) dbr = 1.0; \# define VULENX (lx-35) \# define VULENY (ly/2-3) dbl *= VULENX; dbr *= VULENX; oldpeakl = (int)dbl; oldpeakr = (int)dbr; // compute RMS - start rmsdbl = ((MIN_DB - rmsdbl) / MIN_DB); if (rmsdbl < 0.0) rmsdbl = 0.0; else if (rmsdbl > 1.0) rmsdbl = 1.0; rmsdbr = ((MIN_DB - rmsdbr) / MIN_DB); if (rmsdbr < 0.0) rmsdbr = 0.0; else if (rmsdbr >1.0) rmsdbr = 1.0; int irmsdbl = rmsdbl * VULENX; int irmsdbr = rmsdbr * VULENX; // compute RMS - end // draw db level fl_color(VU_level); fl_rectf(ox, oy, oldpeakl, VULENY); fl_rectf(ox, oy + ly / 2, oldpeakr, VULENY); // fill with black fl_rectf(ox + oldpeakl, oy, VULENX - oldpeakl, VULENY, graph_back); fl_rectf(ox + oldpeakr, oy + ly / 2, VULENX - oldpeakr, VULENY, graph_back); // draw scale float tmp = VULENX * 1.0 / MIN_DB; for (int i = 1; i < 1 - MIN_DB; ++i) { int tx = VULENX + (int)(tmp * i); fl_color(VU_bar_1dB); fl_rectf(ox + tx, oy, 1, VULENY + ly / 2); if (i % 5 == 0) { fl_color(VU_bar_5dB); fl_rectf(ox + tx, oy, 1, VULENY + ly / 2); } if (i % 10 == 0) fl_rectf(ox + tx - 1, oy, 2, VULENY + ly / 2, VU_bar_10dB); } // mellow yellow rms indicator if (irmsdbl) fl_rectf(ox + irmsdbl - 1, oy, 3, VULENY, VU_rms); if (irmsdbr) fl_rectf(ox + irmsdbr - 1, oy + ly / 2, 3, VULENY, VU_rms); // see red if clipped if (clipped & 1) fl_rectf(ox + VULENX + 2, oy, lx - VULENX - 3, ly / 2 - 3, VU_over); else fl_rectf(ox + VULENX + 2, oy, lx - VULENX - 3, ly / 2 - 3, graph_back); if (clipped & 2) fl_rectf(ox + VULENX + 2, oy + ly / 2, lx - VULENX - 3, (ly - 2) / 2 - 2, VU_over); else fl_rectf(ox + VULENX + 2, oy + ly / 2, lx - VULENX - 3, (ly - 2) / 2 - 2, graph_back); // show maxdB static char tmpstr[8]; const char *dbtag = "dB"; if ((maxdbl > NO_DB)) { fl_font(FL_HELVETICA | FL_BOLD, 9); fl_color(VU_text); snprintf(tmpstr, 7, "%+3.f%s", maxdbl + 0.5f, dbtag); fl_draw(tmpstr, ox + VULENX + 1, oy + 1, lx - VULENX - 4, VULENY - 2, FL_ALIGN_RIGHT, NULL, 0); } if ((maxdbr > NO_DB)) { fl_font(FL_HELVETICA | FL_BOLD, 9); fl_color(VU_text); snprintf(tmpstr, 7, "%+3.f%s", maxdbr + 0.5f, dbtag); fl_draw(tmpstr, ox + VULENX + 1, oy + ly / 2 + 1, lx - VULENX - 4, VULENY, FL_ALIGN_RIGHT, NULL, 0); }} {} } Function {draw_part()} {} { code {// int ox = x()+2; int oy = y()+2; int lx = w()-4; int ly = h()-4; int mid = (w() / 2) - 2; int actualpart = npart + *plgroup; float Vpeak = fetchData(0, MAIN::control::readPartPeak, TOPLEVEL::section::main, actualpart); if (panelpart.oldpeak[actualpart] > 0) panelpart.oldpeak[actualpart] = 0; if (Vpeak < 0) // its inactive { fl_color(45); fl_rectf(ox, oy, lx, ly); } else { // draw LH VU if (Vpeak > 1.0f) { panelpart.clip[actualpart] = true; if (Vpeak > 1.5f) Vpeak = 1.0f; } // draw the vu lines float db = asDecibel(Vpeak); db = (MIN_DB - db) / MIN_DB; db = (db > 1.0) ? 1.0 : db; db = db * ly - 2; panelpart.oldpeak[actualpart] = int(db); fl_rectf(ox, oy, mid, ly, graph_back); fl_color(VU_level); if (panelpart.oldpeak[actualpart] > 0) fl_rectf(ox, oy + ly - panelpart.oldpeak[actualpart], mid, panelpart.oldpeak[actualpart]); if (panelpart.clip[actualpart]) fl_rectf(ox, oy, mid, 4, VU_over); // draw RH VU Vpeak = fetchData(0, MAIN::control::readPartPeak, TOPLEVEL::section::main, actualpart, 1); if (Vpeak > 1.0) panelpart.clipR[actualpart] = true; // draw the vu lines db = asDecibel(Vpeak); db = (MIN_DB - db) / MIN_DB; db = (db > 1.0) ? 1.0 : db; db = db * ly - 2; panelpart.oldpeakR[actualpart] = int(db); fl_rectf(ox + mid, oy, lx - mid, ly, graph_back); fl_color(VU_level); if (panelpart.oldpeakR[actualpart] > 0) fl_rectf(ox + mid, oy + ly - panelpart.oldpeakR[actualpart], lx - mid, panelpart.oldpeakR[actualpart]); if (panelpart.clipR[actualpart]) fl_rectf(ox + mid, oy, lx - mid, 4, VU_over); // draw the scales float tmp = ly * 1.0 / MIN_DB; for (int i = 1; i < 1 - MIN_DB; ++i) { int ty = ly + int(tmp * i); if (i % 5 == 0) { fl_color(VU_bar_1dB); // actually 5dB here fl_rectf(ox, oy + ly - ty, lx, 1); } if (i % 10 == 0) { fl_color(VU_bar_10dB); fl_rectf(ox, oy + ly - ty, lx, 1); } } fl_rectf(x() + mid, oy, 4, ly, FL_GRAY); } fl_color(42); fl_rectf(x() + mid, oy, 4, ly);} {} } Function {draw()} {} { code {// if (npart >= 0) draw_part(); else { draw_master(); ++tick500; if (!(tick500 & 15)) // approx 500mS delay { synth->getGuiMaster()->configui->halfSecTimer(); } }} {} } Function {tickdraw(VUMeter *o)} {return_type {static void} } { code {o->redraw();} {} } Function {tick(void *v)} {return_type {static void} } { code {// tickdraw((VUMeter *) v); Fl::add_timeout(0.033333333, tick, v); // 1.0 / 30.0 => 30 fps} {} } Function {handle(int event)} {return_type int } { code {// switch(event) { case FL_SHOW: tick(this); return 1; case FL_HIDE: Fl::remove_timeout(tick, this); return 1; case FL_PUSH: if (npart < 0) { maxdbl = NO_DB; maxdbr = NO_DB; clipped = 0; MasterUI *masterUI = synth->getGuiMaster(); if (masterUI) masterUI->resetPartsClip(); } return 1; } return 0;} {} } decl {int tick500;} {private local } decl {int npart;} {private local } decl {float oldrmsdbl;} {private local } decl {float oldrmsdbr;} {private local } decl {float maxdbl;} {private local } decl {float maxdbr;} {private local } decl {int oldpeakl;} {private local } decl {int oldpeakr;} {private local } decl {int clipped;} {private local } decl {int *plgroup;} {public local } decl {SynthEngine *synth;} {private local } decl {struct{ int oldpeak[NUM_MIDI_PARTS]; int oldpeakR[NUM_MIDI_PARTS]; bool clip[NUM_MIDI_PARTS]; bool clipR[NUM_MIDI_PARTS]; } panelpart;} {public local } Function {resetPart(bool clipOnly = false)} {} { code {// for (int i = 0; i < NUM_MIDI_PARTS; i++) { panelpart.clip[i] = false; panelpart.clipR[i] = false; if (!clipOnly) { panelpart.oldpeak[i] = 0; panelpart.oldpeakR[i] = 0; } }} {} } } class SysEffSend {: {public WidgetPDial} } { Function {SysEffSend(int x,int y, int w, int h, const char *label=0):WidgetPDial(x,y,w,h,label)} {} { code {neff1=0; neff2=0;} {} } Function {init(int neff1_, int neff2_, SynthEngine *_synth)} {} { code {// synth = _synth; neff1 = neff1_; neff2 = neff2_; minimum(0); maximum(127); step(1); labelfont(0); labelsize(11); align(FL_ALIGN_TOP); value(synth->Psysefxsend[neff1][neff2]); copy_label((asString(neff1 + 1) + "->" + asString(neff2 + 1)).c_str());} {} } Function {~SysEffSend()} {} { code {hide();} {} } Function {handle(int event)} {return_type int } { code {// if (event == FL_PUSH || event == FL_DRAG || event == FL_MOUSEWHEEL) collect_writeData(synth, value(), 0, (TOPLEVEL::type::Write | TOPLEVEL::type::Integer), neff2, TOPLEVEL::section::systemEffects, UNUSED, neff1, TOPLEVEL::insert::systemEffectSend); return WidgetPDial::handle(event);} {} } decl {int neff1;} {private local } decl {int neff2;} {private local } decl {SynthEngine *synth;} {private local } } class Panellistitem {: {public Fl_Group} } { Function {make_window()} {} { Fl_Window panellistitem { xywh {648 54 65 270} type Double hide class Fl_Group } { Fl_Group panellistitemgroup { xywh {0 -5 65 279} box PLASTIC_THIN_UP_BOX code0 {if (not synth->partonoffRead(npart + *plgroup)) o->deactivate();} code1 {if (not synth->getRuntime().isMultiFeed) audiosend->deactivate();} } { Fl_Group {} { xywh {30 64 26 112} box ENGRAVED_FRAME } { Fl_Box partVUMeter { label {V U} xywh {30 65 26 110} box FLAT_BOX labelcolor 55 align 128 code0 {partVUMeter->init(npart, synth);} class VUMeter } Fl_Button {} { callback {// for (int i = 0; i < NUM_MIDI_PARTS; i += NUM_MIDI_CHANNELS) { partVUMeter->panelpart.clip[npart + i] = false; partVUMeter->panelpart.clipR[npart + i] = false; }} tooltip {Click here to clear overload warning.} xywh {30 64 26 111} box NO_BOX labelcolor 64 } } Fl_Button partEdit { label Edit callback {// int newpart = npart | synth->getGuiMaster()->panelgroup; if (Fl::event() == FL_RELEASE && Fl::event_button() == FL_RIGHT_MOUSE) synth->getGuiMaster()->partui->Showedit(); if ((int)bankui->cbwig->value() != (newpart + 1)) { bankui->cbwig->value(newpart + 1); bankui->cbwig->do_callback(); }} tooltip {Left mouse button: Part select Right mouse button: Instrument edit} xywh {12 248 40 20} box PLASTIC_UP_BOX labelfont 9 labelsize 10 labelcolor 64 } Fl_Box partadd { xywh {5 20 17 40} box FLAT_BOX } Fl_Box partsub { xywh {22 20 18 40} box FLAT_BOX } Fl_Box partpad { xywh {40 20 17 40} box FLAT_BOX } Fl_Button partname { label { } xywh {4 20 55 40} box THIN_DOWN_FRAME labelsize 10 labelcolor 64 align 208 } Fl_Button buttontop { label { } callback {// bankui->cbwig->value(npart + 1 + *plgroup); bankui->cbwig->do_callback(); bankui->Show();} xywh {4 20 55 40} box THIN_DOWN_FRAME labeltype NO_LABEL labelfont 9 labelsize 10 labelcolor 64 align 208 } Fl_Slider partvolume { callback {// float realvalue; if (Fl::event_button() == 3) { realvalue = 96; o->value(realvalue); o->redraw(); } else realvalue = o->value(); o->selection_color(setSlider(realvalue,96)); // synth->getGuiMaster()->partVol->value(realvalue); send_data(TOPLEVEL::action::forceUpdate, PART::control::volume, realvalue, 0);} xywh {9 65 20 110} type {Vert Knob} box THIN_DOWN_BOX labelcolor 49 minimum 127 maximum 0 step 1 code0 {o->value(synth->part[npart + *plgroup]->Pvolume);} code1 {o->setValueType(VC_PartVolume); o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),96));} class mwheel_slider } Fl_Dial partpanning { callback {// float realvalue; // must be float, otherwise fine control only goes negative! if (Fl::event_button() == 3) { realvalue = 64; o->value(realvalue); } else realvalue = o->value(); o->selection_color(setKnob(realvalue,64)); send_data(TOPLEVEL::action::forceUpdate, PART::control::panning, realvalue, 0);} xywh {17 180 30 30} maximum 127 step 1 code0 {o->value(synth->part[npart + *plgroup]->Ppanning);} code1 {o->setValueType(VC_PanningStd);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Choice partrcv { callback {// int tmp = o->value() & 0xf; o->textcolor(gen_text); send_data(TOPLEVEL::action::forceUpdate, PART::control::midiChannel, tmp, TOPLEVEL::type::Integer);} tooltip {receive from MIDI channel} xywh {8 210 50 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 9 textsize 10 textcolor 64 code0 {for (int i = 0; i < NUM_MIDI_CHANNELS; i++) { if (i == 9) o->add("Dr10"); else o->add(string("Ch" + asString(i + 1)).c_str()); }} code1 {o->value(synth->part[npart + *plgroup]->Prcvchn);} } {} Fl_Choice audiosend { callback {// send_data(TOPLEVEL::action::muteAndLoop, PART::control::audioDestination, o->value() + 1, TOPLEVEL::type::Integer);} tooltip {Set Audio Destination} xywh {8 229 50 15} box BORDER_BOX down_box BORDER_BOX selection_color 64 labelsize 9 labelcolor 64 textfont 9 textsize 9 textcolor 64 code0 {o->add("Main");o->add("Part");o->add("Both");} code1 {if (synth->part[npart + *plgroup]->Paudiodest == 2) o->value(1); else if (synth->part[npart + *plgroup]->Paudiodest == 3) o->value(2); else o->value(0);} } {} } Fl_Check_Button partenabled { label 01 callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::enable, o->value(), TOPLEVEL::type::Integer);} xywh {10 0 45 20} down_box DOWN_BOX selection_color 64 labeltype EMBOSSED_LABEL labelsize 15 labelcolor 64 align 24 code0 {o->value(synth->partonoffRead(npart + *plgroup));} class Fl_Check_Button2 } } } Function {send_data(int action, int control, float value, int type, int parameter = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart + *plgroup, UNUSED, UNUSED, UNUSED, parameter);} {} } Function {Panellistitem(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// npart = 0; bankui = NULL;} {} } Function {init(int npart_, BankUI *bankui_, SynthEngine *_synth)} {} { code {// synth = _synth; npart=npart_; bankui = bankui_; plgroup = &synth->getGuiMaster()->panelgroup; make_window(); panellistitem->show(); end();} {} } Function {refresh()} {} { code {// int setpart = npart | *plgroup; // assumes *plgroup always power of 2 partenabled->value(synth->partonoffRead(setpart)); partvolume->value(synth->part[setpart]->Pvolume); partvolume->selection_color(setSlider(partvolume->value(),96)); partpanning->value(synth->part[setpart]->Ppanning); partpanning->selection_color(setKnob(partpanning->value(),64)); int tmpch = synth->part[setpart]->Prcvchn; if (tmpch < NUM_MIDI_CHANNELS) { partrcv->value(tmpch); int type = collect_readData(synth, 0, MAIN::control::soloType, TOPLEVEL::section::main); if (type == MIDI::SoloType::Row || type == MIDI::SoloType::Loop || type == MIDI::SoloType::TwoWay) partrcv->textcolor(solo_select); else partrcv->textcolor(gen_text); } else partrcv->textcolor(midi_solo_release); int tmp = synth->part[setpart]->Paudiodest - 1; if (tmp < 0 or tmp > 3) tmp = 0; audiosend->value(tmp); if ((int)bankui->cbwig->value() != (setpart + 1)) panellistitemgroup->color(FL_BACKGROUND_COLOR); else panellistitemgroup->color(panels); panellistitemgroup->redraw(); string num = asString(setpart + 1); partenabled->copy_label(num.c_str()); setPartLabel(setpart); if (synth->partonoffRead(setpart)) panellistitemgroup->activate(); else panellistitemgroup->deactivate();} {} } Function {setPartLabel(int npart)} {} { code {// int engine = findengines(npart); if (engine & 1) partadd->color(add_back); else partadd->color(bank_back_used); if (engine & 2) partsub->color(sub_back); else partsub->color(bank_back_used); if (engine & 4) partpad->color(pad_back); else partpad->color(bank_back_used); if (synth->part[npart | *plgroup]->PyoshiType) partname->labelcolor(yoshi_ins_typ); else partname->labelcolor(gen_text); partname->copy_label(synth->part[npart | *plgroup]->Pname.c_str()); ;} {} } Function {findengines(int npart)} {return_type {unsigned int} } { code {// unsigned int engine = 0; for (int i = 0; i < NUM_KIT_ITEMS; ++i) { if (synth->part[npart]->kit[i].Padenabled) engine |= 1; if (synth->part[npart]->kit[i].Psubenabled) engine |= 2; if (synth->part[npart]->kit[i].Ppadenabled) engine |= 4; } return engine;} {} } Function {~Panellistitem()} {} { code {panellistitem->hide();} {} } decl {int npart;} {private local } decl {BankUI *bankui;} {private local } decl {SynthEngine *synth;} {private local } decl {int *plgroup;} {public local } Function {itemRtext(float dScale)} {} { code {// int size = int(10 * dScale); int size14 = int(14 * dScale); partEdit->labelsize(size); partname->labelsize(size); partvolume->labelsize(size14); partpanning->labelsize(size14); partrcv->labelsize(size); partrcv->textsize(size); audiosend->labelsize(size); audiosend->textsize(size); partenabled->labelsize(int(15 * dScale));} {} } } yoshimi-2.3.5.1/src/UI/MasterUI.fl000066400000000000000000005247461506652756400165230ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0403 header_name {.h} code_name {.cc} comment {MasterUI.h} {not_in_source in_header } comment {MasterUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2025, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original.} {selected in_source in_header } decl {\#define PANEL_SINGLE_X 1040} {public local } decl {\#define PANEL_SINGLE_Y 320} {public local } decl {\#define PANEL_DUAL_X 530} {public local } decl {\#define PANEL_DUAL_Y 600} {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include "UI/WidgetSpinner.h"} {public local } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } decl {\#include "ADnoteUI.h"} {public local } decl {\#include "SUBnoteUI.h"} {public local } decl {\#include "EffUI.h"} {public local } decl {\#include "VirKeyboardUI.h"} {public local } decl {\#include "ConfigUI.h"} {public local } decl {\#include "BankUI.h"} {public local } decl {\#include "PartUI.h"} {public local } decl {\#include "MicrotonalUI.h"} {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "ParametersUI.h"} {public local } decl {\#include "VectorUI.h"} {public local } decl {\#include "ConsoleUI.h"} {public local } decl {\#include "MasterMiscUI.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {public local } decl {\#include "Interface/InterChange.h"} {public local } decl {\#include "Interface/InterfaceAnchor.h" using RoutingTag = GuiDataExchange::RoutingTag;} {public local } decl {\#include "MidiLearnUI.h"} {public local } decl {\#include "Misc/FileMgrFuncs.h" using file::isRegularFile; using file::findLeafName;} {private local } decl {\#include "Misc/FormatFuncs.h" using func::string2uint; using func::asString;} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {using std::to_string;} {private global } decl {int lineitem;} {public local } class FilerLine {: {public Fl_Group} } { Function {make_window()} {} { Fl_Window filerlist { xywh {522 305 440 20} type Double color 7 hide class Fl_Group } { Fl_Group fileIcon { xywh {0 0 23 30} box FLAT_BOX color 7 } { Fl_Box outer_box { xywh {3 0 16 20} box GTK_THIN_UP_BOX color 174 labeltype NO_LABEL } Fl_Box inner_box { xywh {5 2 12 16} box GTK_THIN_DOWN_BOX color 174 labeltype NO_LABEL } Fl_Box line1 { xywh {7 5 8 2} box FLAT_BOX color 124 } Fl_Box line2 { xywh {7 9 8 2} box FLAT_BOX color 124 } Fl_Box type { label xiz xywh {4 6 15 17} labelsize 4 } } Fl_Group dirIcon { xywh {0 0 21 20} box FLAT_BOX color 7 hide } { Fl_Box {} { xywh {1 1 18 15} box PLASTIC_THIN_UP_BOX color 183 } Fl_Box {} { xywh {3 4 18 16} box PLASTIC_THIN_UP_BOX color 183 } Fl_Box {} { xywh {5 7 14 1} box DOWN_BOX } } Fl_Button name { xywh {25 0 415 21} box NO_BOX color 7 labelsize 12 labelcolor 64 align 20 } Fl_Button nametop { callback {// lineitem = n;} xywh {0 1 420 18} box NO_BOX labelcolor 64 } } } Function {FilerLine(int x, int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {n = 0;} {} } decl {FilerLine(FilerLine const&) =delete;} {public local } decl {FilerLine(FilerLine&&) =delete;} {public local } decl {FilerLine& operator=(FilerLine const&) =delete;} {public local } decl {FilerLine& operator=(FilerLine&&) =delete;} {public local } Function {init(SynthEngine *synth_, int n_, bool isDir_, string typeName_, string title_)} {} { code {// synth = synth_; n = n_; isDir = isDir_; typeName = typeName_; title = title_; make_window(); if (isDir) { dirIcon->show(); fileIcon->hide(); } else { dirIcon->hide(); fileIcon->show(); type->copy_label(typeName.c_str()); name->copy_label(title.c_str()); } show(); end();} {} } decl {int n;} {private local } decl {bool isDir;} {private local } decl {string typeName;} {private local } decl {string title;} {private local } decl {SynthEngine *synth;} {private local } Function {~FilerLine()} {} { code {// filerlist->hide(); delete (filerlist);} {} } } class KeyHandle {: {public Fl_Box} } { Function {KeyHandle(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {} {} } Function {init(SynthEngine *_synth)} {} { code {// synth = _synth;} {} } Function {handle(int event)} {return_type int } { code {// int ev = 0; if (event == FL_FOCUS) ev = 1; else if (event == FL_UNFOCUS) ev = 1; else if (event == FL_SHORTCUT) { auto key = Fl::event_key(); if (key == FL_Escape) ev = 1; else if (key == 'z') { if (Fl::event_state() == 327680) //ctrl + shift { synth->getGuiMaster()->redo->do_callback(); ev = 1; } else if (Fl::event_ctrl()) { synth->getGuiMaster()->undo->do_callback(); ev = 1; } } /*else if (Fl::event_alt()) // apparently not needed! { switch (key) { case 'r': { synth->getGuiMaster()->redo->do_callback(); ev = 1; break; } case 'u': { synth->getGuiMaster()->undo->do_callback(); ev = 1; break; } } }*/ } return ev;} {} } decl {SynthEngine *synth;} {private local } } class MasterUI {: {public GuiUpdates} } { Function {MasterUI(InterChange& _interChange, InterfaceAnchor connectionData) : GuiUpdates{_interChange, std::move(connectionData)}} {} { code {// synth = nullptr; presetsui = nullptr; npart = 0; panelgroup = 0; panelScale = 1; microtonalui = nullptr; bankui = nullptr; virkeyboard = nullptr; configui = nullptr; presetsui = nullptr; paramsui = nullptr; syseffectui = nullptr; inseffectui = nullptr; yoshiLog = nullptr; queryDW = 0; lastmainW = -1; lastpanelW = 0; lastmsgW = 0; lasttextW = 0; lastsyseffW = 0; lastvirtW = 0; lastaboutW = 0; oldH = 0; filerpath.clear(); lastfilerW = 0;} {} } Function {~MasterUI()} {} { code {// aboutwindow->hide(); delete aboutwindow; syseffsendwindow->hide(); if (syseffSeen) saveWin(synth, syseffsendwindow->w(), syseffsendwindow->h(), syseffsendwindow->x(), syseffsendwindow->y(), true, "Master-systemeffectsend"); delete syseffsendwindow; if (panelType < 4) saveWin(synth, panelwindow->w(), panelwindow->h(), panelwindow->x(), panelwindow->y(), panelType, "Mixer"); panelwindow->hide(); delete panelwindow; message->hide(); delete message; if (microtonalui) delete microtonalui; if (bankui) delete bankui; if (virkeyboard) delete virkeyboard; if (configui) delete configui; if (presetsui) delete presetsui; if (paramsui) delete paramsui; if (vectorui) delete vectorui; if (midilearnui) delete midilearnui; if (yoshiLog) delete yoshiLog; if (querywindow) { querywindow->hide(); delete querywindow; } if (filerwindow) { filerlist.clear(); if (filerwindow->visible()) saveWin(synth, filerwindow->w(), filerwindow->h(), filerwindow->x(), filerwindow->y(), true, "Master-filer"); filerwindow->hide(); delete filerwindow; } saveWin(synth, masterwindow->w(), masterwindow->h(), masterwindow->x(), masterwindow->y(), true, "Master"); masterwindow->hide(); delete masterwindow;} {} } Function {Init()} {} { code {// current_ID = anchor.synthID; synth = anchor.synth; assert(synth); file::createDir(file::configDir() + "/windows"); panelType = 5; msgSeen = false; syseffSeen = false; partmax = collect_readData(synth, 0, MAIN::control::availableParts, TOPLEVEL::main); microtonalui = new MicrotonalUI(&synth->microtonal, synth); bankui = new BankUI(synth); virkeyboard = new VirKeyboard(synth); configui = new ConfigUI(synth, current_ID); presetsui = new PresetsUI(synth); paramsui = new ParametersUI(synth); vectorui = new VectorUI(synth, bankui, paramsui); midilearnui = new MidiLearnUI(synth); yoshiLog = new ConsoleUI(synth); Fl_Tooltip::color(tooltip_back); Fl_Tooltip::textcolor(tooltip_text); make_window(); partui->checkEngines(); themeTrigger = 0; bool foundWindows = Showmaster(); if (current_ID > 0) foundWindows = true; // not relevant for later windows loadWindowData(); string starterror = ""; if (synth->getRuntime().isLV2) { masterwindow->label(synth->getWindowTitle().c_str()); } else { starterror = textMsgBuffer.fetch(0); setMasterLabel(synth->getRuntime().paramsLoad); } if (starterror.find("Could not") != std::string::npos) query("", "", "", starterror); microtonalui->microtonaluiwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Scales"), UNUSED, TOPLEVEL::windowTitle)).c_str()); yoshiLog->logConsole->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Console"), UNUSED, TOPLEVEL::windowTitle)).c_str()); logenable = fetchData(0, CONFIG::control::reportsDestination, TOPLEVEL::section::config); if (!foundWindows) { // fake previously seen. saveWin(synth, 0, 0, masterwindow->x() + masterwindow->w() + 16, masterwindow->y(), true, "Midi-virtualkeyboard"); virkeyboard->ShowKbd(); panelwindow->resize(masterwindow->x(), masterwindow->y(), PANEL_SINGLE_X, PANEL_SINGLE_Y); saveWin(synth, panelwindow->w(), panelwindow->h(), panelwindow->x(), panelwindow->y(), panelType, "Mixer"); string msg = "As this is a first time start, please check 'Yoshimi->Settings'. More information can be found in the manual."; setmessage(UNUSED, true, msg, "Close"); } else if (not Config::is_compatible(synth->getRuntime().loadedConfigVer)) { auto& newVer = synth->getRuntime().loadedConfigVer; auto& currVer = Config::VER_YOSHI_CURR; string msg{"Existing config from v" + asString(newVer.maj) + "." + asString(newVer.min) + (newVer < currVer? " < v":" > v") + asString(currVer.maj) + "." + asString(currVer.min) + (currVer < newVer? "\\nWARNING: if you change and thus save this config, some newer settings may be lost." : "\\nImported settings were auto-saved, please check config.") }; setmessage(UNUSED, true, msg, "Close"); } else { if (current_ID == 0 && fetchData(0, BANK::control::refreshDefaults, TOPLEVEL::section::bank) == false) { string msg = "Default banks have been copied to {user}.local/share/yoshimi/found \\nAdd these to the bank roots window?"; setmessage(TOPLEVEL::msgResponse::refreshBankDefaults, true, msg, "Ask Later", "No", "Yes"); ;} ;} {}} {} } Function {Showmaster()} {return_type bool } { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Master"); if (fetchW < mainDW || fetchH < mainDH) { fetchW = mainDW; fetchH = mainDH; } checkSane(fetchX, fetchY, fetchW, fetchH, mainDW, mainDH); masterwindow->resize(fetchX, fetchY, fetchW, fetchH); masterwindow->show(); lastmainW = 0; mainRtext(); return (fetchO != 0);} {} } Function {refreshInit()} {} { code {// update to current state and refresh sub-UIs and config refresh_master_ui(1); resetPartsClip(); bankui->readbankcfg(); bankui->rescan_for_banks(); //} {} } Function {make_window()} {} { Fl_Window masterwindow { label {Yoshimi meets ZynAddSubFX} callback {// if (instrumentsWarning("Still exit")) { return; } bool close = true; bool force = Fl::event_state(FL_CTRL); if (close) { if (force) Config::primary().exitType = FORCED_EXIT; /* * The above line shouldn't be necessary! * It works fine on jack but fails on ALSA. * My best guess is that ALSA shuts down so quickly * that one of the ringbuffers carrying the command * is deleted before it can be read. */ //send_data(0, TOPLEVEL::control::forceExit, 0, UNUSED); synth->signalGuiWindowClosed(); }} xywh {411 233 385 525} type Double labelfont 13 labelsize 12 hide resizable code0 {mainDW = 385; mainDH = 470;} code1 {masterwindow->size_range(394, 500, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Box keyHandle { label keyhandler xywh {0 0 385 500} box FLAT_BOX code0 {o->init(synth);} class KeyHandle } Fl_Tabs sysinsgroup { label {System/Insert} callback {// if (o->value() == SystemEffectsGrp) showSysEfxUI(); else if (o->value() == InsertionEffectsGrp) showInsEfxUI(); ;} xywh {3 148 379 68} box PLASTIC_UP_BOX color 44 selection_color 223 labeltype NO_LABEL labelsize 12 labelcolor 64 align 5 } { Fl_Group SystemEffectsGrp { label { System Effects } xywh {3 176 379 40} color 223 selection_color 31 labelfont 1 labelsize 12 labelcolor 64 align 4 } { Fl_Spinner syseffnocounter { label Effect callback {// int effNum = o->value() - 1; send_data(TOPLEVEL::action::forceUpdate, EFFECT::sysIns::effectNumber, effNum, TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects, effNum);} xywh {40 186 44 20} labeltype NO_LABEL labelsize 11 labelcolor 64 align 0 maximum 4 textfont 1 textsize 11 textcolor 64 code0 {o->range(1, NUM_SYS_EFX);} code1 {o->value(1);} class WidgetSpinner } Fl_Choice sysefftype { label Type callback {// uchar effType = o->value(); uchar effNum = syseffectui->effNum(); send_data(TOPLEVEL::action::forceUpdate, EFFECT::sysIns::effectType, effType, TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects, effNum); // update sys-effect enabled checkbox as immediate feedback // the next push-update will then set it so to reflect the actual activation state in the core SysEffOn->value(effType != 0);} xywh {120 186 96 20} down_box BORDER_BOX labeltype NO_LABEL labelsize 11 labelcolor 64 align 16 textfont 1 textsize 11 textcolor 64 code0 {o->add("No Effect");o->add("Reverb");o->add("Echo");o->add("Chorus");o->add("Phaser");o->add("AlienWah");o->add("Distortion");o->add("EQ");o->add("DynFilter");} code1 {o->value(0); // initially disabled -- enabled only when effect slot is occupied} } {} Fl_Check_Button SysEffOn { label On callback {// /*if (o->value()) { sysCopy->activate(); sysPaste->activate(); } else { // note: the effect-type select box remains enabled sysCopy->deactivate(); sysPaste->deactivate(); }*/ uchar effNum = syseffectui->effNum(); send_data(0, EFFECT::sysIns::effectEnable, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects, effNum);} xywh {247 186 20 20} down_box DOWN_BOX value 1 selection_color 64 labelfont 3 labelcolor 226 align 4 class Fl_Check_Button2 } Fl_Button sysEffSend { label {Send to} callback {showSysEffSends();} xywh {275 186 62 20} box GTK_THIN_UP_BOX color 221 labelfont 1 labelsize 11 labelcolor 64 } Fl_Button sysCopy { label C callback {// uchar effNum = syseffectui->effNum(); synth->getGuiMaster()->getPresetsUi()->Ucopy(TOPLEVEL::section::systemEffects, 16, effNum);} xywh {350 182 25 14} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button sysPaste { label P callback {// uchar effNum = syseffectui->effNum(); synth->getGuiMaster()->getPresetsUi()->Upaste(TOPLEVEL::section::systemEffects, 16, effNum);} xywh {350 197 25 14} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } } Fl_Group InsertionEffectsGrp { label { Insertion Effects } xywh {3 176 379 40} color 223 selection_color 31 labelfont 1 labelsize 12 labelcolor 64 align 4 hide } { Fl_Spinner inseffnocounter { label Effect callback {// int effNum = o->value() - 1; send_data(TOPLEVEL::action::forceUpdate, EFFECT::sysIns::effectNumber, effNum, TOPLEVEL::type::Integer, TOPLEVEL::section::insertEffects, effNum);} xywh {40 186 36 20} labeltype NO_LABEL labelsize 11 labelcolor 64 align 20 maximum 8 textfont 1 textsize 11 textcolor 64 code0 {o->range(1, NUM_INS_EFX);} code1 {o->value(1);} class WidgetSpinner } Fl_Choice insefftype { label Type callback {// uchar effType = o->value(); uchar effNum = inseffectui->effNum(); send_data(TOPLEVEL::action::forceUpdate, EFFECT::sysIns::effectType, effType, TOPLEVEL::type::Integer, TOPLEVEL::section::insertEffects, effNum); // note: when processing this in InterChange, an insertion destination is automatically pre-selected} xywh {120 186 96 20} down_box BORDER_BOX labeltype NO_LABEL labelsize 11 labelcolor 64 align 0 textfont 1 textsize 11 textcolor 64 code0 {o->add("No Effect");o->add("Reverb");o->add("Echo");o->add("Chorus");o->add("Phaser");o->add("AlienWah");o->add("Distortion");o->add("EQ");o->add("DynFilter");} code1 {o->value(0);} code2 {o->activate(); // not disabled; user may activate this slot by picking some effect type} } {} Fl_Choice inseffpart { label {To } callback {// int routing = o->value() - 2; uchar effNum = inseffectui->effNum(); send_data(TOPLEVEL::action::forceUpdate, EFFECT::sysIns::effectDestination, routing, TOPLEVEL::type::Integer, TOPLEVEL::section::insertEffects, effNum);} xywh {242 186 96 20} down_box BORDER_BOX labelfont 1 labelsize 11 labelcolor 64 textfont 1 textsize 11 textcolor 64 code0 {setinspartlist();} code3 {o->value(1); // initially deactivated} } {} Fl_Button insCopy { label C callback {// uchar effNum = inseffectui->effNum(); synth->getGuiMaster()->getPresetsUi()->Ucopy(TOPLEVEL::section::insertEffects, 16, effNum);} xywh {350 182 25 14} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button insPaste { label P callback {// uchar effNum = inseffectui->effNum(); synth->getGuiMaster()->getPresetsUi()->Upaste(TOPLEVEL::section::insertEffects, 16, effNum);} xywh {350 197 25 14} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } } } Fl_Menu_Bar mastermenu { callback {// int found = o->value(); //std::cout << "switch found " << found << std::endl; switch (found) { case 1: // about { int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Master-about"); if (W < aboutDW || H < aboutDH) { W = aboutDW; H = aboutDH; } checkSane(X, Y, W, H, aboutDW, aboutDH); aboutwindow->resize(X, Y, W, H); aboutwindow->show(); } break; case 2: // new instance if (synth->getRuntime().isLV2) { query("", "", "", "Start new instances from host"); return; } if (current_ID != 0) { query("", "", "", "Only main instance can start others"); return; } startInstance(); break; case 3: // settings configui->Show(synth); break; case 4: // reports if (logenable) yoshiLog->Show(synth); else alert(synth, "Logging configured for std::cout"); break; case 5: // manual send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::openManual, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main); break; case 6: // exit masterwindow->do_callback(); break; case 7: // section instruments break; case 8: // section instruments break; case 9: // show bankui->Show(); break; case 10: // load { if (instrumentSingleWarning(npart, "Overwrite")) { return; } string filename = setfiler("", "", false, TOPLEVEL::XML::Instrument); if (!filename.empty()) do_load_instrument(filename); } break; case 11: // save { /* * Instruments are an exception for saving as we always want * to offer the INTERNAL name first rather than a possibly * confusing external filename. */ string newname = synth->part[npart]->Pname; if (newname == DEFAULT_NAME) { query("", "", "", "Nothing to save!"); return; } if (synth->part[npart]->info.Ptype == 0) { if (choice(synth, "", "Save", "Cancel", "Please set instrument type before saving.\\nCopyright info also recommended.") != 2) return; } string filename = setfiler("", newname, true, TOPLEVEL::XML::Instrument); if (!filename.empty()) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::saveNamedInstrument, npart, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string(filename))); } break; case 12: // recent { if (instrumentSingleWarning(npart, "Overwrite")) { return; } int xpos = masterwindow->x() + (masterwindow->w() * 0.15f); if (xpos + paramsui->Recent->w() > masterwindow->x() + masterwindow->w()) xpos = masterwindow->x() + masterwindow->w() - paramsui->Recent->w(); paramsui->Recent->position(xpos,masterwindow->y()+20); paramsui->Show(TOPLEVEL::XML::Instrument); } break; case 13: // clear if (!fetchData(0, PART::control::enable, npart)) { alert(synth, "Active part disabled"); return; } partui->instrumentReset->do_callback(); break; case 14: // search if (instrumentSingleWarning(npart, "Overwrite")) { return; } if (!fetchData(0, PART::control::enable, npart)) { alert(synth, "Active part disabled"); return; } bankui->ShowSearch(); break; case 15: // section parameters break; case 16: // section parameters break; case 17: // show bankui->Showbank(); break; case 18: // load if (instrumentsWarning("Overwrite")) { return; } do_load_master(""); break; case 19: // save { bool valid = false; for (int npart = 0; npart < NUM_MIDI_PARTS; npart ++) if (synth->part[npart]->Pname != DEFAULT_NAME) { valid = true; npart = NUM_MIDI_PARTS; } if (valid) do_save_master(); else query("", "", "", "Nothing to save!"); } break; case 20: // recent { if (instrumentsWarning("Overwrite")) { return; } int xpos = masterwindow->x() + (masterwindow->w() * 0.35f); if (xpos + paramsui->Recent->w() > masterwindow->x() + masterwindow->w()) xpos = masterwindow->x() + masterwindow->w() - paramsui->Recent->w(); paramsui->Recent->position(xpos,masterwindow->y()+20); paramsui->Show(TOPLEVEL::XML::Patch); } break; case 21: // section paths break; case 22: // section paths break; case 23: // root dir bankui->ShowRoot(); break; case 24: // preset dir configui->Showpresets(synth); break; case 25: // section state break; case 26: // section state break; case 27: // load { if (instrumentsWarning("Overwrite")) { return; } // for Alessandro string filename = setfiler("", "", false, TOPLEVEL::XML::State); if (!filename.empty()) { setState(filename); } else refresh_master_ui(0x80 | (textMsgBuffer.push(" ") << 8)); } break; case 28: // save { // for Alessandro string filename = setfiler("", "", true, TOPLEVEL::XML::State); if (!filename.empty()) { send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::saveNamedState, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(filename)); } } break; case 29: // default { string name = synth->getRuntime().defaultSession; send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::saveNamedState, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(name)); } break; case 30: // recent { if (instrumentsWarning("Overwrite")) return; int xpos = masterwindow->x() + (masterwindow->w() * 0.616f); if (xpos + paramsui->Recent->w() > masterwindow->x() + masterwindow->w()) xpos = masterwindow->x() + masterwindow->w() - paramsui->Recent->w(); paramsui->Recent->position(xpos,masterwindow->y()+20); paramsui->Show(TOPLEVEL::XML::State); } break; case 31: // section scales break; case 32: // section scales break; case 33: // show microtonalui->showScales(); break; case 34: // load { filename = setfiler("", "", false, TOPLEVEL::XML::Scale); if (!filename.empty()) do_load_scale(string(filename)); } break; case 35: // save { string filename = setfiler("", "", true, TOPLEVEL::XML::Scale); if (!filename.empty()) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::saveNamedScale, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(filename)); } break; case 36: // recent paramsui->Recent->position(masterwindow->x() + masterwindow->w() - paramsui->Recent->w(), masterwindow->y()+20); paramsui->Show(TOPLEVEL::XML::Scale); break; case 37: // clear if (query("", "Yes", "No", "Set scales to the defaults?") > 1) { synth->microtonal.defaults(); synth->setAllPartMaps(); if (NULL != microtonalui) delete microtonalui; microtonalui = new MicrotonalUI(&synth->microtonal, synth); send_data(TOPLEVEL::action::forceUpdate, SCALES::control::clearAll, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::scales); } break; }} tooltip {Click to open menus} xywh {-7 0 395 25} labelsize 12 labelcolor 64 textsize 12 textcolor 64 code0 {// o->add("&Yoshimi /&About..."); o->add("&Yoshimi /&New Instance"); o->add("&Yoshimi /&Settings..."); o->add("&Yoshimi /&Reports"); o->add("&Yoshimi /&View Manual"); o->add("&Yoshimi /&Exit"); o->add("&Instrument /S&how Stored..."); o->add("&Instrument /&Load External..."); o->add("&Instrument /&Save External..."); o->add("&Instrument /&Recent Instruments..."); o->add("&Instrument /&Clear"); o->add("&Instrument /S&earch..."); o->add("&PatchSet /&S&how Patch Banks..."); o->add("&PatchSet /&Load External..."); o->add("&PatchSet /&Save External..."); o->add("&PatchSet /&Recent sets..."); o->add("P&ath /&Bank Root Dirs..."); o->add("P&ath /&Preset Dirs..."); o->add("&State /&Load..."); o->add("&State /&Save..."); o->add("&State /Save As &default"); o->add("&State /&Recent States"); o->add("Sca&le/S&how Settings..."); o->add("S&cale/&Load..."); o->add("S&cale/&Save..."); o->add("S&cale/&Recent Scales...");} } {} Fl_Group MasterControls { label {Master } xywh {3 24 380 148} labeltype NO_LABEL labelsize 11 labelcolor 96 align 22 } { Fl_Button mainreset { label Reset callback {// bool wasCtrl = (Fl::event_state(FL_CTRL) != 0); if (query("", "Yes", "No", "Set *ALL* dynamic values to their defaults?") > 1) { if (instrumentsWarning("Still reset")) return; if (wasCtrl || (Fl::event_state(FL_CTRL) != 0)) send_data(TOPLEVEL::action::muteAndLoop | TOPLEVEL::action::forceUpdate, MAIN::control::masterResetAndMlearn, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main); else send_data(TOPLEVEL::action::muteAndLoop | TOPLEVEL::action::forceUpdate, MAIN::control::masterReset, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main);}} tooltip {Clear all dynamic settings (+Ctrl includes MIDI-learn)} xywh {7 60 66 24} box PLASTIC_UP_BOX color 228 labelfont 1 labelsize 11 labelcolor 64 align 16 } Fl_Button mainstop { label {Stop!} callback {// send_data(TOPLEVEL::action::muteAndLoop, MAIN::control::stopSound, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main);} tooltip {Cease all sound immediately!} xywh {7 30 66 24} box PLASTIC_UP_BOX color 89 labelfont 1 labelsize 11 labelcolor 64 align 16 } Fl_Button mainvirtkeyb { label {Virtual Key&board} callback {// virkeyboard->ShowKbd();} tooltip {Virtual Keyboard} xywh {81 60 106 24} box GTK_THIN_UP_BOX color 198 labelsize 11 labelcolor 64 } Fl_Button mixerpanel { label {Mixer &Panel} callback {// if(panelwindow->visible()) return; panelType &= 3; changepanelstyle(panelType); updatepanel(); ;} tooltip {Mixer Panel Window} xywh {81 30 106 24} box GTK_THIN_UP_BOX color 198 labelsize 11 labelcolor 64 } Fl_Button mainmidilearn { label {&Midi Learn} callback {// midilearnui->showLearn();} tooltip {Message Log} xywh {81 90 106 24} box GTK_THIN_UP_BOX color 198 labelsize 11 labelcolor 64 } Fl_Button vectors { label {&Vectors} callback {// vectorui->Show(synth);} tooltip {Vector Setup Window} xywh {195 30 66 24} box GTK_THIN_UP_BOX color 198 labelsize 11 labelcolor 64 } Fl_Button undo { label {&Undo} callback {// send_data(0, MAIN::control::undo, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::undoMark);} tooltip {Revert last change} xywh {195 60 66 24} box PLASTIC_UP_BOX color 228 labelsize 11 labelcolor 64 } Fl_Button redo { label {&Redo} callback {// send_data(0, MAIN::control::redo, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::undoMark);} tooltip {Re-apply last change} xywh {195 91 66 24} box PLASTIC_UP_BOX color 228 labelsize 11 labelcolor 64 } Fl_Box topcontrols1 { xywh {267 30 114 142} box ENGRAVED_FRAME } Fl_Dial globalfinedetune { label Detune callback {// o->selection_color(setKnob(o->value(),64)); send_data(TOPLEVEL::action::lowPrio, MAIN::control::detune, o->value(), 0, TOPLEVEL::section::main);} tooltip {Global Fine Detune} xywh {278 42 40 40} box ROUND_UP_BOX color 29 labelsize 10 labelcolor 64 maximum 127 value 64 code0 {o->setValueType(VC_GlobalFineDetune);} code1 {o->value(synth->microtonal.Pglobalfinedetune);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial mastervolumedial { label Volume callback {// o->selection_color(setKnob(o->value(),90)); send_data(0, MAIN::control::volume, o->value(), 0, TOPLEVEL::section::main);} tooltip {Master Volume} xywh {330 42 40 40} box ROUND_UP_BOX color 29 labelsize 10 labelcolor 64 maximum 127 code0 {o->setValueType(VC_MasterVolume);} code1 {o->value(synth->Pvolume);} code2 {o->selection_color(setKnob(o->value(),90));} class WidgetPDial } Fl_Spinner masterkeyshift { label {Key Shift} callback {// send_data(TOPLEVEL::action::lowPrio, MAIN::control::keyShift, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::main);} tooltip {Shift pitch +/- N semitones} xywh {328 108 44 20} labelsize 10 labelcolor 64 minimum -36 maximum 36 textfont 1 textsize 12 textcolor 64 code0 {o->range(MIN_KEY_SHIFT, MAX_KEY_SHIFT);o->step(1.0);} code1 {o->value(synth->Pkeyshift - 64);} class WidgetSpinner } Fl_Spinner bpmfallback { label {F. BPM} callback {// send_data(TOPLEVEL::action::forceUpdate, MAIN::control::bpmFallback, o->value(), 0, TOPLEVEL::section::main);} tooltip {Fallback BPM (Beats Per Minute). This is only used if the MIDI driver does not provide its own BPM information.} xywh {316 142 56 20} labelsize 10 labelcolor 64 minimum 0 maximum 0 value 120 textfont 1 textsize 12 textcolor 64 code0 {o->range(BPM_FALLBACK_MIN, BPM_FALLBACK_MAX);} code1 {o->step(1.0); o->type(FL_FLOAT_INPUT);} code2 {setBpmFallbackValue(synth->PbpmFallback);} class WidgetSpinner } } Fl_Group syseffectuigroup { xywh {3 218 379 95} box FLAT_BOX color 48 labeltype NO_LABEL labelcolor 64 code0 {o->show();} } { Fl_Group syseffectui { xywh {3 218 379 95} labeltype NO_LABEL labelcolor 64 code0 {o->init(synth, anchor.sysEffectParam, anchor.sysEffectEQ, TOPLEVEL::section::systemEffects); o->activate(); o->show();} class EffUI } {} } Fl_Group inseffectuigroup { xywh {3 218 379 95} box FLAT_BOX color 48 labelcolor 64 code0 {o->hide();} } { Fl_Group inseffectui { xywh {3 218 379 95} color 52 labelcolor 64 code0 {o->init(synth, anchor.insEffectParam, anchor.insEffectEQ, TOPLEVEL::section::insertEffects); o->hide();} code1 {o->deactivate(); // initially deactivated} class EffUI } {} } Fl_Group partuigroup { xywh {3 315 379 178} box ENGRAVED_FRAME } { Fl_Group partui { xywh {3 315 379 172} color 47 code0 {partui->init(synth->part[npart], npart, bankui);} class PartUI } {} Fl_Group partControls { xywh {3 315 378 175} } { Fl_Dial partVol { label Volume callback {// if (npart >= panelgroup && npart < (panelgroup + NUM_MIDI_CHANNELS)) o->selection_color(setKnob(o->value(),96)); setPanelPartVolWidget(npart % NUM_MIDI_CHANNELS, o->value()); send_data(0, PART::control::volume, o->value(), TOPLEVEL::type::Integer, npart);} xywh {340 356 32 32} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(fetchData(0, PART::control::volume, npart));} code1 {o->setValueType(VC_PartVolume);} code2 {o->selection_color(setKnob(o->value(),96));} class WidgetPDial } Fl_Dial partPan { label Panning callback {// o->selection_color(setKnob(o->value(),64)); send_data(TOPLEVEL::action::forceUpdate, PART::control::panning, o->value(), TOPLEVEL::type::Integer, npart);} xywh {292 356 32 32} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(fetchData(0, PART::control::panning, npart));} code1 {o->setValueType(VC_PanningStd);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial partVelOffset { label {Vel.Offs} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::velocityOffset, o->value(), TOPLEVEL::type::Integer, npart);} xywh {244 356 32 32} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(fetchData(0, PART::control::velocityOffset, npart));} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial partVelSense { label {Vel.Sense} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::velocitySense, o->value(), TOPLEVEL::type::Integer, npart);} xywh {196 356 32 32} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(fetchData(0, PART::control::velocitySense, npart));} code1 {o->setValueType(VC_AmpVelocitySense);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Group instrumentGroup { xywh {136 320 195 25} box GTK_THIN_UP_BOX color 198 } { Fl_Box instrumentaddbox { xywh {140 325 60 15} box FLAT_BOX } Fl_Box instrumentsubbox { xywh {200 325 65 15} box FLAT_BOX } Fl_Box instrumentpadbox { xywh {264 325 63 15} box FLAT_BOX } Fl_Box instrumentlabel { label {Simple Sound} xywh {139 324 187 16} selection_color 64 labelfont 1 labelsize 12 labelcolor 64 align 16 } Fl_Box instrumentFrame { xywh {140 325 187 15} box THIN_DOWN_FRAME labelcolor 49 } Fl_Button buttontop { callback {// int event = Fl::event_button(); if (event == FL_LEFT_MOUSE) { bankui->Show(); } else if (event == FL_RIGHT_MOUSE) { string name = input_text(synth, "Instrument name:", synth->part[npart]->Pname); if (name == DEFAULT_NAME) alert(synth, "Can't use name of default sound"); else if (name != synth->part[npart]->Pname) { unsigned char id = textMsgBuffer.push(name); send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, PART::control::instrumentName, 0, TOPLEVEL::type::Integer, npart, UNUSED, UNUSED, UNUSED, id); } }} tooltip {Left mouse button: choose/save/.. from/to bank, Right button: instrument name} xywh {136 320 195 25} box NO_BOX selection_color 64 labeltype NO_LABEL labelsize 12 labelcolor 64 align 16 } } Fl_Spinner partMidiCh { label Midi callback {// int tmp = int(o->value()) -1; if (tmp >= NUM_MIDI_CHANNELS) { tmp &= (NUM_MIDI_CHANNELS - 1); o->value(tmp +1); } o->textcolor(gen_text); if (npart >= panelgroup && npart < (panelgroup + NUM_MIDI_CHANNELS)) setPanelPartMidiWidget(npart % NUM_MIDI_CHANNELS, tmp); send_data(0, PART::control::midiChannel, tmp, TOPLEVEL::type::Integer, npart); ;} tooltip {MIDI channel for this part} xywh {35 381 40 19} color 7 labelsize 12 labelcolor 64 maximum 16 textsize 11 textcolor 64 code0 {int num = fetchData(0, PART::control::midiChannel, npart); o->value(num + 1); if (num < NUM_MIDI_CHANNELS) o->textcolor(gen_text); else o->textcolor(gen_opp_text);} class WidgetSpinner } Fl_Button partEdit { label {&Edit} callback {// /* bool divert = true; if (lastkey >= 49 && lastkey <= 56) { // not working yet :( int voiceNum = lastkey - 49; if (Fl::event_button() == 3) { send_data(0, PART::control::enable, 1, TOPLEVEL::type::Integer, UNUSED, 0); adsynenabledcheck->value(1); send_data(TOPLEVEL::action::forceUpdate, PART::control::volumeEnable, voiceNum, TOPLEVEL::type::Integer); //synth->getGuiMaster()->partui->adnoteui->advoice->nvoice = voiceNum; //synth->getGuiMaster()->partui->adnoteui->advoice->voiceonbutton->value(1); } if (adsynenabledcheck->value() == 1) { ; } lastkey = -1; } switch(lastkey) { case 97: // a if (Fl::event_button() == 3) { send_data(0, PART::control::enableAdd, 1, TOPLEVEL::type::Integer, UNUSED, 0); adsynenabledcheck->value(1); } lastkey = -1; if (adsynenabledcheck->value() == 1) { showparameters(0,0); partui->checkEngines(); seteditname(); } else divert = false; break; case 115: // s if (Fl::event_button() == 3) { send_data(0, PART::control::enableSub, 1, TOPLEVEL::type::Integer, UNUSED, 1); subsynenabledcheck->value(1); } lastkey = -1; if (subsynenabledcheck->value() == 1) { showparameters(0,1); partui->checkEngines(); seteditname(); } else divert = false; break; case 100: // d case 112: // p if (Fl::event_button() == 3) { send_data(0, PART::control::enablePad, 1, TOPLEVEL::type::Integer, UNUSED, 2); padsynenabledcheck->value(1); } lastkey = -1; if (padsynenabledcheck->value() == 1) { showparameters(0,2); partui->checkEngines(); seteditname(); lastkey = -1; } else divert = false; break; case 107: // k lastkey = -1; Showkit(); break; case 101: // e lastkey = -1; Showefx(); break; default: divert = false; break; } */ //if (!divert) //{ //lastkey = -1; partui->Showedit(); // }} tooltip {View/change instrument sound and details} xywh {334 320 42 25} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button partControllers { label {Con&trollers} callback {// partui->Showctl();} tooltip {MIDI Controller range settings} xywh {72 405 81 20} box GTK_THIN_UP_BOX color 198 labelsize 12 labelcolor 64 } Fl_Button partMidiCCs { label {Mi&di CCs} callback {// partui->Showctlmidi();} tooltip {Emulates common MIDI CCs} xywh {164 405 64 20} box GTK_THIN_UP_BOX color 198 labelsize 12 labelcolor 64 } Fl_Box modepatch { label Mode xywh {141 357 32 16} box FLAT_BOX labelsize 11 labelcolor 64 } Fl_Choice partKeymode { callback {// updateModepatch(o->value() > 1 && partui->drumMode->value() != 0); send_data(0, PART::control::keyMode, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Poly, Mono or Legato mode} xywh {65 355 72 19} down_box BORDER_BOX labelsize 11 labelcolor 64 textfont 1 textsize 11 textcolor 64 code0 {o->add("Poly");o->add("Mono");o->add("Legato");} code1 {int tmp = synth->ReadPartKeyMode(npart); if (tmp > 1) o->value(2); else o->value(tmp);} code3 {o->value(fetchData(0, PART::control::keyMode, npart));} } {} Fl_Check_Button partPortamento { label Portamento callback {// send_data(0, PART::control::portamento, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Enable/Disable the portamento} xywh {83 381 20 20} down_box DOWN_BOX labelfont 3 labelsize 11 labelcolor 226 align 8 code0 {o->value(fetchData(0, PART::control::portamento, npart));} class Fl_Check_Button2 } Fl_Spinner minKeyCount { label {Min Note} callback {// int tmp = o->value(); int other = maxKeyCount->value(); if (tmp > other) { tmp = other; o->value(tmp); } send_data(0, PART::control::minNote, tmp, TOPLEVEL::type::Integer, npart);} tooltip {Minimum note the part receives} xywh {59 431 41 20} labelsize 10 labelcolor 64 minimum 0 maximum 127 textsize 11 textcolor 64 code0 {o->value(fetchData(0, PART::control::minNote, npart));} class WidgetSpinner } Fl_Spinner maxKeyCount { label {Max Note} callback {// int tmp = o->value(); int other = minKeyCount->value(); if (tmp < other) { tmp = other; o->value(tmp); } send_data(0, PART::control::maxNote, tmp, TOPLEVEL::type::Integer, npart);} tooltip {Maximum note the part receives} xywh {59 463 41 20} labelsize 10 labelcolor 64 minimum 0 maximum 127 textsize 11 textcolor 64 code0 {o->value(fetchData(0, PART::control::maxNote, npart));} class WidgetSpinner } Fl_Button setMinToLast { label Set callback {// int lastnote = synth->part[npart]->getLastNote(); if (lastnote >= 0) { minKeyCount->value(lastnote); send_data(0, PART::control::minToLastKey, 1, TOPLEVEL::type::Integer, npart); }} tooltip {Set minimum note to the last note played} xywh {105 432 30 16} box PLASTIC_UP_BOX color 228 labelsize 10 labelcolor 64 } Fl_Button setNormal { label R callback {// minKeyCount->value(0); maxKeyCount->value(127); send_data(0, PART::control::resetMinMaxKey, 1, TOPLEVEL::type::Integer, npart);} tooltip {Reset the minimum key to 0 and maximum key to 127} xywh {105 450 30 16} box PLASTIC_UP_BOX color 228 labelfont 1 labelsize 11 labelcolor 64 } Fl_Button setMaxToLast { label Set callback {// int lastnote = synth->part[npart]->getLastNote(); if (lastnote >= 0) { maxKeyCount->value(lastnote); send_data(0, PART::control::maxToLastKey, 1, TOPLEVEL::type::Integer, npart); }} tooltip {Set maximum note to the last note played} xywh {105 468 30 16} box PLASTIC_UP_BOX color 228 labelsize 10 labelcolor 64 } Fl_Spinner partKeyShift { label {Key Shift} callback {// send_data(TOPLEVEL::action::lowPrio, PART::control::keyShift, o->value(), TOPLEVEL::type::Integer, npart);} xywh {192 432 38 20} labelsize 10 labelcolor 64 minimum -36 maximum 36 textsize 11 textcolor 64 code0 {o->range(MIN_KEY_SHIFT, MAX_KEY_SHIFT);} code1 {o->value(fetchData(0, PART::control::keyShift, npart));} class WidgetSpinner } Fl_Spinner partKeyLimit { label {Key Limit} callback {// send_data(0, PART::control::maxNotes, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Maximum keys for this part} xywh {192 464 38 20} labelsize 10 labelcolor 64 value 20 textsize 11 textcolor 64 code0 {o->range(1, POLYPHONY); // enough for one part!} code1 {o->value(fetchData(0, PART::control::maxNotes, npart));} class WidgetSpinner } Fl_Group sysEffBox { xywh {236 412 139 73} box ENGRAVED_FRAME labelcolor 64 } { Fl_Text_Display sysEffName { label {Send to System Effect} xywh {255 463 103 1} box NO_BOX selection_color 64 labelsize 11 labelcolor 64 align 2 textcolor 64 } Fl_Dial sysEff1 { label 1 callback {// o->selection_color(setKnob(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, PART::partToSystemEffect1, o->value(), TOPLEVEL::type::Integer, npart);} xywh {243 434 25 25} labelfont 1 labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(fetchData(0, PART::control::partToSystemEffect1, npart));} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Dial sysEff2 { label 2 callback {// o->selection_color(setKnob(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, PART::partToSystemEffect2, o->value(), TOPLEVEL::type::Integer, npart);} xywh {276 434 25 25} labelfont 1 labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(fetchData(0, PART::control::partToSystemEffect2, npart));} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Dial sysEff3 { label 3 callback {// o->selection_color(setKnob(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, PART::partToSystemEffect3, o->value(), TOPLEVEL::type::Integer, npart);} xywh {309 434 25 25} labelfont 1 labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(fetchData(0, PART::control::partToSystemEffect3, npart));} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Dial sysEff4 { label 4 callback {// o->selection_color(setKnob(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, PART::partToSystemEffect4, o->value(), TOPLEVEL::type::Integer, npart);} xywh {342 434 25 25} labelfont 1 labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(fetchData(0, PART::control::partToSystemEffect4, npart));} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } } Fl_Check_Button partOmniEnable { label Omni callback {//; send_data(0, PART::control::omni, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Enable part to listen on all MIDI channels. If Omni Mode Change is enabled in configuration, then a MIDI message of that type overrides this setting. Toggle this setting to reset it after such a MIDI message.} xywh {46 406 15 20} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 4 code0 {o->value(fetchData(0, PART::control::omni, npart));} class Fl_Check_Button2 } } Fl_Check_Button partEnable { label On callback {//; if (o->value() != 1) partControls->deactivate(); else partControls->activate(); if (npart >= panelgroup && npart < (panelgroup + NUM_MIDI_CHANNELS)) { panellistitem[npart % NUM_MIDI_CHANNELS]->partenabled->value(o->value()); if (o->value() != 1) panellistitem[npart % NUM_MIDI_CHANNELS]->panellistitemgroup->deactivate(); else panellistitem[npart % NUM_MIDI_CHANNELS]->panellistitemgroup->activate(); } send_data(0, PART::control::enable, o->value(), TOPLEVEL::type::Integer, npart);} xywh {35 355 20 20} down_box DOWN_BOX selection_color 64 labelcolor 64 align 4 code0 {o->value(fetchData(0, PART::control::enable, npart));} class Fl_Check_Button2 } } Fl_Group {} { xywh {3 490 379 35} box DOWN_BOX color 43 labelsize 12 } { Fl_Box vumeter { label {VU-Meter} xywh {3 491 379 34} color 48 code0 {o->init(-1, synth);} class VUMeter } Fl_Button {} { callback {vumeter->init(-1, synth);} tooltip {Click here to clear VU peak reading and overload warning.} xywh {5 493 376 30} box NO_BOX labelcolor 64 } } Fl_Button mastermono { label Stereo callback {// int tmp = 1 - o->value(); o->value(tmp); if (tmp == 0) o->label("Stereo"); else o->label("Mono"); send_data(0, MAIN::control::mono, tmp, TOPLEVEL::type::Integer, TOPLEVEL::section::main);} tooltip {Master Mono/Stereo switch} xywh {7 90 66 24} box PLASTIC_UP_BOX down_box PLASTIC_UP_BOX color 228 selection_color 89 labelfont 3 labelsize 11 labelcolor 226 code0 {o->value(synth->masterMono);} } Fl_Spinner maxparts { label of callback {// int tmp = o->value(); if (tmp == 48) // must be 16,32,64 { if (partmax == 32) // rolling upwards tmp = 64; else tmp = 32; } send_data(TOPLEVEL::action::forceUpdate, MAIN::control::availableParts, tmp, TOPLEVEL::type::Integer, TOPLEVEL::section::main);} tooltip {Set the number of available parts} xywh {93 322 40 20} labelsize 11 labelcolor 64 minimum 16 maximum 64 step 16 value 16 textsize 11 textcolor 64 code0 {o->value(partmax);} class WidgetSpinner } Fl_Spinner npartcounter { label Part callback {// npart = o->value() - 1; send_data(TOPLEVEL::action::forceUpdate, MAIN::control::partNumber, npart, TOPLEVEL::type::Integer, TOPLEVEL::section::main);} xywh {36 322 40 20} labelsize 11 labelcolor 64 when 6 minimum 0 maximum 64 textsize 11 textcolor 64 code0 {o->value(collect_readData(synth, 0, MAIN::control::partNumber, TOPLEVEL::main) + 1);} code1 {bankui->init(o);} class WidgetSpinner } Fl_Choice panning_law { label {Pan Law } callback {// send_data(0, MAIN::control::panLawType, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::main);} tooltip {Relative values when panned to extremes: Per side, Equivalent Mono} xywh {84 122 164 20} down_box BORDER_BOX labelsize 11 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("Cut: 0dB, -6dB");o->add("Default: +3dB, -3dB");o->add("Boost: +6dB, 0dB");} code1 {o->value(fetchData(0, MAIN::control::panLawType, TOPLEVEL::section::main));} } {} Fl_Group setInstance { xywh {82 57 193 60} box PLASTIC_UP_BOX color 223 hide } { Fl_Button {} { xywh {84 59 188 57} box NO_BOX } Fl_Text_Display InstBlurb { label {Accept next, or enter Instance from 1 to 31} xywh {95 89 163 6} box NO_BOX labelsize 12 } Fl_Button {} { callback {//} xywh {162 91 35 22} box FLAT_BOX down_box FLAT_BOX labelfont 1 labelsize 11 } Fl_Button cancelInst { label Cancel callback {//} xywh {209 90 56 22} box PLASTIC_UP_BOX labelfont 1 labelsize 11 } Fl_Button nextInst { label Next callback {//} xywh {93 90 56 22} box PLASTIC_UP_BOX labelfont 1 labelsize 11 } Fl_Input valueInst { callback {//} xywh {162 90 37 22} textsize 11 } } Fl_Box divider { xywh {18 350 350 2} box THIN_DOWN_FRAME } } comment {line spaces in boxes below are critical} {in_source in_header } Fl_Window aboutwindow { label {Yoshimi : About} xywh {46 64 365 290} type Double color 7 labelfont 13 labelsize 13 labelcolor 64 when 0 hide resizable code0 {aboutDW = 365; aboutDH = 290;} code1 {o->size_range(aboutDW,aboutDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Group aboutFirst { xywh {0 0 365 290} color 7 labelcolor 64 } { Fl_Box about1 { label {Yoshimi meets ZynAddSubFX} xywh {10 15 345 70} labelfont 9 labelsize 18 labelcolor 216 align 16 when 0 } Fl_Box about2 { label {Copyright 2002-2009, Nasca O. Paul and others Copyright 2009-2011, Alan Calvert Copyright 2012-2013, Jeremy Jongepier and others Copyright 2014-2024, Will Godfrey and others LV2 plugin Copyright 2014, Andrew Deryabin Splash Image Copyright 2017, Jesper Lloyd} xywh {25 90 315 91} labelfont 13 labelsize 11 labelcolor 64 } Fl_Box about3 { label {This is free software, and comes with ABSOLUTELY NO WARRANTY; you may redistribute it and/or modify it under the terms of GPL version 2, or (at your option) any later version.} xywh {10 190 340 53} labelsize 11 labelcolor 64 } Fl_Box about4 { label { version} xywh {61 254 240 20} labelfont 1 labelsize 12 labelcolor 224 code0 {// o->copy_label((string("Yoshimi version ") + string(YOSHIMI_VERSION)).c_str());} } Fl_Button about5 { label more callback {// contributors->show(); aboutFirst->hide();} tooltip {Yoshimi's little band of helpers} xywh {15 253 43 22} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 11 labelcolor 64 } } Fl_Group contributors { xywh {5 5 355 280} box FLAT_BOX color 7 labelcolor 64 hide } { Fl_Box cont1 { label {Some people who have helped Yoshimi in various ways since Alan Calvert started the project} xywh {12 8 340 57} labelfont 9 labelsize 15 labelcolor 224 } Fl_Box cont2 { label { Chris Ahlstrom Kristian Amlie Jonathan Brickman Jeanette Claassen Rob Couto Andrew Deryabin Jörn Eichler Csaba Erdei James Fraser Will Godfrey Alexander Hirsch Jeremy Jongepier Iain King-Speir Tobias Kortkamp } xywh {25 70 155 200} labelsize 12 labelcolor 64 } Fl_Box cont3 { label { Tito Latini Rainer Liffers Jesper Lloyd Lars Luthman Holger Marzen Lieven Moors Harry Nakos Iurie Nistor Stephen Parry Lorenzo Sutton Hermann Voßeler Nikita Zlobin } xywh {194 70 155 200} labelsize 12 labelcolor 64 } } Fl_Button aboutClose { label Close callback {// aboutFirst->show(); contributors->hide(); aboutwindow->hide();} xywh {305 253 43 22} box THIN_UP_BOX color 196 labelfont 1 labelsize 11 labelcolor 64 } } Fl_Window syseffsendwindow { label {Yoshimi : Sys Send} callback {syseffClose->do_callback();} xywh {534 25 120 245} type Double labelfont 13 labelsize 13 hide resizable code0 {syseffDW = 120; syseffDH = 245;} code1 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Sends"), UNUSED, TOPLEVEL::windowTitle)).c_str());} code2 {o->size_range(syseffDW, syseffDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Button syseffClose { label Close callback {// saveWin(synth, syseffsendwindow->w(), syseffsendwindow->h(), syseffsendwindow->x(), syseffsendwindow->y(), false, "Master-systemeffectsend"); syseffsendwindow->hide(); syseffSeen = false;} xywh {20 216 80 25} box THIN_UP_BOX color 196 labelcolor 64 } Fl_Box syseffname { label {Send output of system effect to other system effects} xywh {5 5 110 35} labelsize 10 labelcolor 64 align 192 } Fl_Dial syseff01 { callback {// int val = lrint(o->value()); if (Fl::event_button() == 3) { val = 0; o->value(val); } o->selection_color(setKnob(val,0)); send_data(TOPLEVEL::action:: forceUpdate, 1, val, TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects,0,TOPLEVEL::insert::systemEffectSend);} xywh {9 65 30 30} labelsize 10 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial syseff02 { callback {// int val = lrint(o->value()); if (Fl::event_button() == 3) { val = 0; o->value(val); } o->selection_color(setKnob(val,0)); send_data(TOPLEVEL::action:: forceUpdate, 2, val, TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects,0,TOPLEVEL::insert::systemEffectSend);} xywh {45 65 30 30} labelsize 10 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial syseff03 { callback {// int val = lrint(o->value()); if (Fl::event_button() == 3) { val = 0; o->value(val); } o->selection_color(setKnob(val,0)); send_data(TOPLEVEL::action:: forceUpdate, 3, val, TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects,0,TOPLEVEL::insert::systemEffectSend);} xywh {83 65 30 30} labelsize 10 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial syseff12 { callback {// int val = lrint(o->value()); if (Fl::event_button() == 3) { val = 0; o->value(val); } o->selection_color(setKnob(val,0)); send_data(TOPLEVEL::action:: forceUpdate, 2, val, TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects,1,TOPLEVEL::insert::systemEffectSend);} xywh {45 118 30 30} labelsize 10 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial syseff13 { callback {// int val = lrint(o->value()); if (Fl::event_button() == 3) { val = 0; o->value(val); } o->selection_color(setKnob(val,0)); send_data(TOPLEVEL::action:: forceUpdate, 3, val, TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects,1,TOPLEVEL::insert::systemEffectSend);} xywh {83 118 30 30} labelsize 10 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Dial syseff23 { callback {// int val = lrint(o->value()); if (Fl::event_button() == 3) { val = 0; o->value(val); } o->selection_color(setKnob(val,0)); send_data(TOPLEVEL::action:: forceUpdate, 3, val, TOPLEVEL::type::Integer, TOPLEVEL::section::systemEffects,2,TOPLEVEL::insert::systemEffectSend);} xywh {83 171 30 30} labelsize 10 align 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial } Fl_Box sys01txt { label {1->2} xywh {7 50 35 17} labelsize 10 labelcolor 64 } Fl_Box sys02txt { label {1->3} xywh {43 50 35 17} labelsize 10 labelcolor 64 } Fl_Box sys03txt { label {1->4} xywh {80 50 35 17} labelsize 10 labelcolor 64 } Fl_Box sys12txt { label {2->3} xywh {44 103 35 17} labelsize 10 labelcolor 64 } Fl_Box sys13txt { label {2->4} xywh {82 103 35 17} labelsize 10 labelcolor 64 } Fl_Box sys23txt { label {3->4} xywh {82 156 35 17} labelsize 10 labelcolor 64 } } Fl_Window panelwindow { label {Yoshimi : Mixer Panel} callback {Panelclose->do_callback();} xywh {421 26 1040 320} type Double labelfont 13 labelsize 13 hide resizable code1 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Mixer Panel"), UNUSED, TOPLEVEL::windowTitle)).c_str());} class ScaleTrackedWindow } { Fl_Group Panelframe { xywh {2 2 1036 286} box ENGRAVED_FRAME code0 {// for (int i = 0; i < 16; i++) { panellistitem[i] = new Panellistitem(0, 0, 64, 270, ""); panellistitem[i]->init(i, bankui, synth); }} } {} Fl_Button towide { label {Change to 1 x 16} callback {// changepanelstyle(1, true);} xywh {360 290 130 25} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 } Fl_Button todeep { label {Change to 2 x 8} callback {// changepanelstyle(2, true);} xywh {831 290 120 25} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 } Fl_Choice Panelgroups { label {Part Group} callback {// panelgroup = o->value() * NUM_MIDI_CHANNELS; for (int i = 0; i < NUM_MIDI_CHANNELS; ++i) panellistitem[i]->refresh();} xywh {5 300 86 18} down_box BORDER_BOX labelsize 12 labelcolor 64 align 1 textsize 12 textcolor 64 code0 {o->add("1 to 16");o->add("17 to 32");o->add("33 to 48");o->add("49 to 64");} code1 {o->value(panelgroup / NUM_MIDI_CHANNELS);} } {} Fl_Choice Panelsmallgroups { label {Part Group} callback {// panelgroup = o->value() * NUM_MIDI_CHANNELS; for (int i = 0; i < NUM_MIDI_CHANNELS; ++i) panellistitem[i]->refresh();} xywh {5 300 86 18} down_box BORDER_BOX labelsize 12 labelcolor 64 align 1 textsize 12 code0 {o->add("1 to 16");o->add("17 to 32");} code1 {o->value(panelgroup / NUM_MIDI_CHANNELS);} } {} Fl_Spinner CSspinner { label CC callback {// CSpend->show();} xywh {209 300 50 18} labelsize 12 labelcolor 64 align 1 minimum 0 maximum 127 value 115 textsize 12 textcolor 64 code0 {CS_CC = collect_readData(synth, 0, MAIN::control::soloCC, TOPLEVEL::section::main);} code1 {if (CS_CC < 128) o->value(CS_CC); else o->value(115);} class WidgetSpinner } Fl_Button CSpend { label Pending callback {// CS_CC = collect_readData(synth, 0, MAIN::control::soloType, TOPLEVEL::section::main); int candidate = CSspinner->value(); if (candidate == CS_CC) { o->hide(); return; } string name = textMsgBuffer.fetch(collect_readData(synth, candidate, MAIN::knownCCtest, TOPLEVEL::main)); if (!name.empty()) { query("", "", "", "In use for " + name); if (CS_CC < 128) { CSspinner->value(CS_CC); CSspinner->redraw(); } } else { send_data(TOPLEVEL::action::forceUpdate, MAIN::control::soloCC, CSspinner->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::main); }} tooltip {Click to set} xywh {276 290 70 25} box PLASTIC_UP_BOX color 90 labelsize 12 labelcolor 64 hide } Fl_Choice channelswitch { label Solo callback {// send_data(TOPLEVEL::action::forceUpdate, MAIN::control::soloType, o->value(), TOPLEVEL::type::Integer, TOPLEVEL::section::main);} tooltip {Assign groups of parts to Ch 1, singly enabled by MIDI} xywh {114 300 74 18} down_box BORDER_BOX labelsize 12 labelcolor 64 align 1 textsize 12 textcolor 64 code0 {o->add("Off");o->add("Row");o->add("Column");o->add("Loop");o->add("TwoWay");o->add("Channel");} code1 {o->value(collect_readData(synth, 0, MAIN::control::soloType, TOPLEVEL::section::main));} code2 {if (o->value() == 0) CSspinner->hide(); else CSspinner->show();} code3 {CS_CC = o->value();} } {} Fl_Button Panelclose { label {&Close} callback {// panelType |= 4; saveWin(synth, panelwindow->w(), panelwindow->h(), panelwindow->x(), panelwindow->y(), panelType, "Mixer"); panelwindow->hide();} xywh {975 290 60 25} box THIN_UP_BOX color 196 labelfont 1 labelcolor 64 } } Fl_Window message { label Yoshimi xywh {58 81 290 85} type Double labelsize 12 labelcolor 64 hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push(""), UNUSED, TOPLEVEL::windowTitle)).c_str());} code1 {msgDW = o->w(); msgDH = o->h();} code2 {o->size_range(290, 85, 0, 0, 0, 0, 1);} } { Fl_Box words { label {?} xywh {5 9 280 45} color 55 selection_color 55 labelfont 1 labelsize 12 labelcolor 64 align 149 } Fl_Button yesdoit { label Yes callback {// send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, BANK::control::refreshDefaults, 1, TOPLEVEL::type::Integer, TOPLEVEL::section::bank); closebutton->do_callback();} xywh {49 60 70 20} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 hide } Fl_Button cancel { label Cancel callback {// if (msgGroup == TOPLEVEL::msgResponse::refreshBankDefaults) send_data(TOPLEVEL::action::lowPrio, BANK::control::refreshDefaults, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::bank); else send_data(0, MIDILEARN::control::cancelLearn, 0, 3, TOPLEVEL::section::midiLearn); closebutton->do_callback();} xywh {130 60 70 20} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 hide } Fl_Button closebutton { label Close callback {// yesdoit->hide(); cancel->hide(); message->hide(); msgSeen = false;} xywh {211 60 70 20} color 196 labelcolor 64 } } Fl_Window querywindow { label Yoshimi user_data_type {void *} callback {cancelQ->do_callback();} xywh {5 207 420 105} type Double hide resizable code0 {queryDW = 420; queryDH = 105;} code1 {o->size_range(queryDW, queryDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow modal } { Fl_Button yesQ { label Yes callback {// querywindow->hide();} xywh {205 80 60 20} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 code0 {o->value(0);} } Fl_Button noQ { label No callback {// querywindow->hide();} xywh {276 80 60 20} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 code0 {o->value(0);} } Fl_Button cancelQ { label Cancel callback {// querywindow->hide();} xywh {348 80 66 20} color 196 labelfont 1 labelcolor 64 code0 {o->value(0);} } Fl_Box typeQ { label {?} xywh {8 26 45 45} box THIN_DOWN_BOX color 191 labelfont 9 labelsize 40 labelcolor 218 } Fl_Box textQ { label {text goes here} xywh {65 11 345 63} labelcolor 64 align 128 } } Fl_Window textwindow { label Yoshimi callback {// saveWin(synth, o->w(), o->h(), o->x(), o->y(), false, "Master-textin"); o->hide();} xywh {222 50 270 60} type Double labelcolor 64 hide resizable code0 {textinDW = o->w(); textinDH = o->h();} code1 {o->size_range(textinDW, textinDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow modal } { Fl_Input textLine { label {input:} xywh {20 23 230 25} labelcolor 64 align 1 textcolor 64 } } Fl_Window filerwindow { label {Yoshimi : Filer} callback {// filerclose->do_callback();} xywh {236 77 550 350} type Double hide resizable code0 {filerDW = o->w(); filerDH = o->h();} code1 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("File Manager"), UNUSED, TOPLEVEL::windowTitle)).c_str());} code2 {o->size_range(filerDW, filerDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow modal } { Fl_Input fileroldpath { label {file paths} callback {// if (Fl::event_key() == FL_Enter) { filernewname->value(""); string name = string(o->value()); if (name.back() != '/') name += "/"; if(!file::isDirectory(name)) { if (!dosave && extension != TOPLEVEL::XML::Dir && extension != TOPLEVEL::XML::Bank) { alert(synth, "Not a valid path to load from."); return; } if (choice(synth, "", "Yes", "No", "Add to path?") < 2) return; if (file::createDir(name)) { alert(synth, "Unable to change a path here."); return; } } filerpath = name; o->value(name.c_str()); fillfiler(type_name); }} tooltip {Current path to use(editable)} xywh {10 20 448 25} labelfont 1 labelsize 12 labelcolor 64 align 1 textfont 1 textsize 12 textcolor 64 } Fl_Button filerback { label Up callback {// if (filerpath == "/") return; filernewname->value(""); size_t pos = filerpath.rfind('/', filerpath.length() - 2); filerpath = filerpath.substr(0, pos +1); if (filerpath.empty()) filerpath = "/"; fileroldpath->value(filerpath.c_str()); fillfiler(type_name);} tooltip {Go up one directory in path} xywh {463 21 78 24} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } Fl_Group faveGroup { label Favourites xywh {458 116 85 60} box ENGRAVED_FRAME labelcolor 64 } { Fl_Button filerfave { label {Show List} callback {// setfavourites();} tooltip {Examine, re-order or delete entries} xywh {463 123 75 20} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button faveadd { label Add callback {// string name = string(fileroldpath->value()); if (name.back() != '/') name += "/"; if (!file::isDirectory(name)) { alert(synth, "Not a valid path"); return; } fileroldpath->value(name.c_str()); filerpath = name; favebrowse->add(name.c_str()); setfavourites();} tooltip {Add the current path to the favourites list} xywh {463 150 75 20} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } } Fl_Button filerclose { label Close callback {// if (favourites->visible()) favecancel->do_callback(); filerfound.clear(); filerdone = true; filernewname->value("Exit"); saveWin(synth, filerwindow->w(), filerwindow->h(), filerwindow->x(), filerwindow->y(), false, "Master-filer");} xywh {463 320 78 20} color 196 labelfont 1 labelsize 12 labelcolor 64 } Fl_Group filernamegroup { label Name xywh {10 50 533 26} box ENGRAVED_FRAME labelfont 1 labelsize 12 labelcolor 64 align 2 } { Fl_Input filernewname { callback {// if (Fl::event_key() == FL_Enter) fileruse->do_callback();} tooltip {Name of file item to load or save} xywh {14 53 444 20} labelsize 12 labelcolor 64 align 2 textfont 1 textsize 12 textcolor 64 } } Fl_Button fileruse { label {< Use} callback {// filerpath = string(fileroldpath->value()); if (filerpath.back() != '/') { filerpath += '/'; fileroldpath->value(filerpath.c_str()); } string leaf = string(filernewname->value()); if (!dosave || !leaf.empty()) filerfound = filerpath + leaf; // error picked up in main loop filerdone = true;} tooltip {Apply this name to the path and load/save} xywh {464 53 74 20} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } Fl_Check_Button filerOpt8 { label {Hide Dirs} callback {// if (o->value() != 0) filerOpt1->deactivate(); else filerOpt1->activate(); fillfiler(type_name);} tooltip {Hide sub directories so that files are easier to see} xywh {490 204 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 1 class Fl_Check_Button2 } Fl_Check_Button filerOpt1 { label {. (dot) Dirs} callback {// fillfiler(type_name);} tooltip {Show hidden paths} xywh {490 244 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 1 class Fl_Check_Button2 } Fl_Check_Button filerOpt2 { label {. (dot) Files} callback {// fillfiler(type_name);} tooltip {Show hidden files} xywh {490 284 18 18} down_box DOWN_BOX labelsize 12 labelcolor 64 align 1 class Fl_Check_Button2 } Fl_Check_Button filerOpt16 { label {Hide Files} callback {// ;} xywh {490 130 18 18} down_box DOWN_BOX selection_color 64 labelsize 12 labelcolor 64 align 1 hide class Fl_Check_Button2 } Fl_Group filerframe { xywh {4 4 542 88} box ENGRAVED_FRAME labelcolor 64 } {} Fl_Group filershort { xywh {4 4 542 74} box ENGRAVED_FRAME labelcolor 64 } {} Fl_Group favourites { xywh {4 49 542 265} box FLAT_BOX labelcolor 64 hide } { Fl_Group favename { xywh {4 49 542 42} box ENGRAVED_FRAME labelcolor 64 } {} Fl_Browser favebrowse { callback {// if (!favebrowse->value()) return; int result = favebrowse->value(); if (result < 1) return; if (Fl::event_clicks()) { Fl::event_clicks(0); faveset->do_callback(); } clearfavelist(); setfavecolour(result);} xywh {5 91 540 220} type Select box FLAT_BOX color 206 labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 } Fl_Button favecancel { label Back callback {// fileroldpath->activate(); filernewname->activate(); fileruse->activate(); filerback->activate(); filerfave->activate(); filerscroll->show(); faveGroup->show(); favourites->hide();} tooltip {Cancel any selection and return to filer window} xywh {455 61 70 20} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button favedefault { label {Make Default} callback {// size_t pos = favebrowse->value(); if (pos > 0) favebrowse->move(1, pos);} tooltip {Set selected entry as the default (move to top)} xywh {287 61 110 20} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button favedelete { label Delete callback {// clearfavelist(); size_t pos = favebrowse->value(); setfavecolour(1); if (pos > 0) favebrowse->remove(pos);} tooltip {Remove selected entry} xywh {156 61 70 20} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button faveset { label Set callback {// size_t pos = favebrowse->value(); if (pos > 0) filerpath = clearfavecolour(pos); else filerpath = clearfavecolour(1); if (filerpath.back() != '/') filerpath += '/'; fileroldpath->value(filerpath.c_str()); fillfiler(type_name); favecancel->do_callback();} tooltip {Set the current path to the selected entry and exit} xywh {20 61 70 20} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } } Fl_Scroll filerscroll { xywh {10 96 444 244} type VERTICAL color 7 labelcolor 64 } {} } } Function {setfiler(string title, string name, bool save, int exten)} {return_type string } { code {// dosave = save; extension = exten; loadfavourites(); string lastname = textMsgBuffer.fetch(fetchData(extension, MAIN::control::readLastSeen, TOPLEVEL::section::main)); string path; type_name = ""; size_t pos = string::npos; fileruseX = 464; fileruse->copy_label("< New Dir"); filernamegroup->show(); filerframe ->show(); filershort->hide(); string currentfave = string(favebrowse->text(1)).substr(4); if (extension == TOPLEVEL::XML::Dir) { if (!dosave) { fileruseX = 234; fileruse->copy_label("^ From"); filernamegroup->hide(); filerframe ->hide(); filershort->show(); } path = currentfave; filernewname->value(""); filerOpt16->value(1); filerOpt8->hide(); filerOpt2->hide(); } else if(extension == TOPLEVEL::XML::Bank) { if(!dosave) { fileruseX = 234; fileruse->copy_label("^ Import"); path = currentfave + name; filernewname->value(""); filernamegroup->hide(); filerframe ->hide(); filershort->show(); } else { fileruse->copy_label("< Export"); path = currentfave; filernewname->value(name.c_str()); } filerOpt16->value(1); // hide files filerOpt8->hide(); // hide dirs filerOpt2->hide(); // dot files } else { if (extension == TOPLEVEL::XML::ScalaTune || extension == TOPLEVEL::XML::ScalaMap || extension == TOPLEVEL::XML::Themes) { if (dosave) fileruse->copy_label("< Export"); else fileruse->copy_label("< Import"); } else if (dosave) fileruse->copy_label("< Save"); else fileruse->copy_label("< Load"); if (lastname.empty()) { path = currentfave; filernewname->value(""); } else { pos = lastname.rfind('/'); path = lastname.substr(0, pos); } if (name.empty() && pos != string::npos) { name = lastname.substr(pos + 1); } filerOpt16->value(0); filerOpt8->show(); filerOpt2->show(); if (!name.empty()) { pos = name.find('.'); if (pos != string::npos) name = name.substr(0, pos); filernewname->value(name.c_str()); } switch(extension) { case TOPLEVEL::XML::Instrument: filerext = EXTEN::zynInst; fileroldpath->copy_label("Path to Instruments"); type_name = "xiz"; break; case TOPLEVEL::XML::Patch: filerext = EXTEN::patchset; fileroldpath->copy_label("Path to Patch Sets"); type_name = "xmz"; break; case TOPLEVEL::XML::Presets: filerext = EXTEN::presets; fileroldpath->copy_label("Path to Presets"); type_name = "xpz"; break; case TOPLEVEL::XML::Scale: filerext = EXTEN::scale; fileroldpath->copy_label("Path to Scales"); type_name = "xsz"; break; case TOPLEVEL::XML::State: filerext = EXTEN::state; fileroldpath->copy_label("Path to States"); type_name = "state"; break; case TOPLEVEL::XML::Vector: filerext = EXTEN::vector; fileroldpath->copy_label("Path to Vectors"); type_name = "xvy"; break; case TOPLEVEL::XML::MLearn: filerext = EXTEN::mlearn; fileroldpath->copy_label("Path to Midi-Learn files"); type_name = "xly"; break; case TOPLEVEL::XML::PadSample: filerext = EXTEN::MSwave; fileroldpath->copy_label("Path to PadSynth samples"); type_name = "wav"; break; case TOPLEVEL::XML::ScalaTune: filerext = EXTEN::scalaTuning; fileroldpath->copy_label("Path to Scala tunings"); type_name = "scl"; break; case TOPLEVEL::XML::ScalaMap: filerext = EXTEN::scalaKeymap; fileroldpath->copy_label("Path to Scala keymaps"); type_name = "kbm"; break; case TOPLEVEL::XML::Bank: fileroldpath->copy_label("Path to Instrument Banks"); break; case TOPLEVEL::XML::Themes: filerext = EXTEN::theme; fileroldpath->copy_label("Path to UI themes"); type_name = "clr"; break; } } if (!title.empty()) fileroldpath->copy_label(title.c_str()); if (path.back() != '/') path += '/'; filerpath = path; fileroldpath->value(path.c_str()); fillfiler(type_name); int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Master-filer"); if (W < filerDW || H < filerDH) { W = filerDW; H = filerDH; } checkSane(X, Y, W, H, filerDW, filerDH); filerwindow->resize(X, Y, W, H); lastfilerW = 0; filerdone = false; filerwindow->show(); lineitem = -1; while (true) { if (lastfilerW != filerwindow->w()) { filerRtext(); lastfilerW = filerwindow->w(); } Fl::wait(); if (lineitem > -1) { filerselect(lineitem); lineitem = -1; } if (filerdone && (extension == TOPLEVEL::XML::Dir || extension == TOPLEVEL::XML::Bank)) { if (dosave && string(filernewname->value()).empty()) { filerdone = false; query("", "", "", "Nothing given to use!"); } else break; } else if (filerdone && string(filernewname->value()).empty()) { filerdone = false; query("", "", "", "Nothing given to use!"); } else if (filerdone) break; } filerwindow->hide(); if (extension == TOPLEVEL::XML::Dir || extension == TOPLEVEL::XML::Bank) { if (dosave) { if (string(filernewname->value()).length() < 3) filerfound.clear(); } else { if (filerfound.back() != '/') filerfound += '/'; } } else if (dosave) { if (extension == TOPLEVEL::XML::Instrument) { // try to cover all possibilities! int type = fetchData(0, CONFIG::control::savedInstrumentFormat,TOPLEVEL::section::config); if ((type == 3 || type == 1) && isRegularFile(filerfound + EXTEN::zynInst)) { if (query("", "Yes", "No", "The file exists. \\nOverwrite it?") < 2) filerfound.clear(); } else if ((type == 3 || type == 2) && isRegularFile(filerfound + EXTEN::yoshInst)) { if (query("", "Yes", "No", "The file exists. \\nOverwrite it?") < 2) filerfound.clear(); } } else if (isRegularFile(filerfound + filerext)) { if (query("", "Yes", "No", "The file exists. \\nOverwrite it?") < 2) { filerfound.clear(); } } } savefavourites(); return filerfound;} {} } Function {fillfiler(string type_name)} {} { code {// string tofetch; int options = filerOpt1->value(); if (filerOpt2->value() > 0) options |= 2; if (filerOpt8->value() > 0) options |= 8; if (filerOpt16->value() > 0) options |= 16; file::dir2string(tofetch, filerpath, filerext, options); filerlist.clear(); // Note: must come first; dtor of FL_Group automatically filerscroll->clear(); // detaches child widgets from the FL_Scroll lineno = 0; //std::cout << "*** list start ***" << std::endl; //std::cout << "ext " << filerext << std::endl; while(!tofetch.empty()) { size_t pos = tofetch.find("\\n"); string next = tofetch.substr(0, pos); bool isDir = false; filerlist.emplace_back(0, 0, 390, 20); if (next.find("Dir:") != std::string::npos) { next = next.substr(5); isDir = true; } filerlist.back().init(synth,lineno, isDir, type_name, next); //std::cout << "name >" << next << "<" << std::endl; filerlist.back().name->copy_label(next.c_str()); filerscroll->add(&filerlist.back()); ++lineno; tofetch = tofetch.substr(pos + 1); } filerscroll->end(); filerscroll->scroll_to(-10,-10); filerRtext(); //std::cout << "list end " << lineno << std::endl; ;} {} } Function {filerselect(int item)} {} { code {// string line = string(filerlist[item].name->label()); if (filerlist[item].dirIcon->visible()) { //std::cout << "in dir" << std::endl; if (line.back() !='/') line += '/'; if (Fl::event_clicks()) { Fl::event_clicks(0); filerpath = filerpath + line; fileroldpath->value(filerpath.c_str()); fillfiler(type_name); } return; } //std::cout << "files" << std::endl; filernewname->value(line.c_str()); if (Fl::event_clicks()) { Fl::event_clicks(0); fileruse->do_callback(); }} {} } Function {setfavourites()} {} { code {// fileroldpath->deactivate(); filernewname->deactivate(); fileruse->deactivate(); filerback->deactivate(); filerfave->deactivate(); filerscroll->hide(); faveGroup->hide(); favourites->show();} {} } Function {loadfavourites()} {} { code {// string favetext = file::loadText(file::configDir() + "/yoshimi-favourites"); if (favetext.empty()) favetext = file::userHome(); favebrowse->clear(); string cr = "\\n"; for (int count = 0; count < 20; ++count) { size_t pos = favetext.find(cr); string next = favetext.substr(0, pos); favebrowse->add(next.c_str()); favetext = favetext.substr(pos + 1); if (pos == string::npos) break; } setfavecolour(1);} {} } Function {savefavourites()} {} { code {// clearfavelist(); string favetext; string cr = "\\n"; for (int i = 1; i <= favebrowse->size(); ++ i) { string line = string(favebrowse->text(i)); favetext += (line + cr); } file::saveText(favetext, file::configDir() + "/yoshimi-favourites");} {} } Function {clearfavelist()} {} { code {// for (int i = 1; i <= favebrowse->size(); ++ i) { string line = string(favebrowse->text(i)); if (line.substr(0, 4) == "@C4 ") { line = line.substr(4); favebrowse->text(i, line.c_str()); } }} {} } Function {setfavecolour(int num)} {} { code {// string line = "@C4 " + string(favebrowse->text(num)); favebrowse->text(num, line.c_str());} {} } Function {clearfavecolour(int num)} {return_type string } { code {// string line = string(favebrowse->text(num)); if (line.substr(0, 4) == "@C4 ") line = line.substr(4); return line;} {} } Function {filerRtext()} {} { code {// float dScale = filerwindow->w() / float(filerDW); int size12 = int(12 * dScale); int size14 = int(14 * dScale); fileroldpath->labelsize(size12); fileroldpath->textsize(size12); filernamegroup->labelsize(size12); filernewname->textsize(size12); faveGroup->labelsize(size14); fileruse->position(fileruseX * dScale, 53 * dScale); fileruse->labelsize(size12); filerback->labelsize(size12); faveadd->labelsize(size12); filerfave->labelsize(size12); filerOpt8->labelsize(size12); filerOpt1->labelsize(size12); filerOpt2->labelsize(size12); filerclose->labelsize(size12); favename->labelsize(size14); favebrowse->textsize(size12); favecancel->labelsize(size12); favedefault->labelsize(size12); favedelete->labelsize(size12); faveset->labelsize(size12); for (int i = 0; i < lineno; ++i) { filerlist[i].resize(int(10 * dScale), int(((i * 20) + 96) * dScale), int(440 * dScale), int(20 * dScale)); filerlist[i].name->labelsize(size12); filerlist[i].type->labelsize(int(4 * dScale)); } filerwindow->redraw();} {} } Function {startInstance()} {} { code {// cancelInst->value(0); nextInst->value(0); valueInst->value(""); setInstance->show(); while (setInstance->visible()) { if (cancelInst->value()) { setInstance->hide(); break; } if (nextInst->value()) { send_data(TOPLEVEL::action::lowPrio, MAIN::control::startInstance, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main); setInstance->hide(); break; } if (Fl::get_key(FL_Enter)) { string testval = valueInst->value(); if (!testval.empty()) { if (func::isDigits(testval)) { int result = stoi(testval); if (result > 0 && result < 32) { send_data(TOPLEVEL::action::lowPrio, MAIN::control::startInstance, result, TOPLEVEL::type::Integer, TOPLEVEL::section::main); setInstance->hide(); break; } } } } Fl::wait(); };} {} } Function {send_data(int action, int control, float value, int type, int part = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int miscmsg = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; /* The following variations are due to the way the section was built up over time. It really needs the whole lot expanding for the calls to natively include all parameters. */ if (control == MAIN::control::loadInstrumentByName && part == TOPLEVEL::section::main && miscmsg < NO_MSG) { collect_writeData(synth, 0, action, type, control, part, engine, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); return; } if (control <= MAIN::control::soloType) type |= Fl::event_button(); if (parameter == 0) { collect_writeData(synth, 0, action, type, control, part, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, miscmsg); return; } collect_writeData(synth, value, action, type, control, part, UNUSED, engine, insert, parameter, UNUSED, miscmsg);} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED, int request = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg, request);} {} } Function {part_group_returns(CommandBlock *getData)} {return_type bool } { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char npart = getData->data.part; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); int panelpart = 0; bool panelVisible = ((npart / NUM_MIDI_CHANNELS) == (panelgroup / NUM_MIDI_CHANNELS)); if (panelVisible) panelpart = npart % NUM_MIDI_CHANNELS; bool seen = false;; switch (control) { case PART::control::enable: { { partEnable->value(value); if (value) partControls->activate(); else partControls->deactivate(); } if (panelVisible) { panellistitem[panelpart]->partenabled->value(value); if (value) panellistitem[panelpart]->panellistitemgroup->activate(); else panellistitem[panelpart]->panellistitemgroup->deactivate(); } seen = true; break; } case PART::control::volume: partVol->value(value); partVol->selection_color(setKnob(value,96)); if (panelVisible) { panellistitem[panelpart]->partvolume->value(value); panellistitem[panelpart]->partvolume->selection_color(setSlider(value,96)); } seen = true; break; case PART::control::panning: partPan->value(value); partPan->selection_color(setKnob(value,64)); if (panelVisible) { panellistitem[panelpart]->partpanning->value(value); panellistitem[panelpart]->partpanning->selection_color(setKnob(value,64)); } seen = true; break; case PART::control::velocityOffset: partVelOffset->value(value); partVelOffset->selection_color(setKnob(value,64)); seen = true; break; case PART::control::velocitySense: partVelSense->value(value); partVelSense->selection_color(setKnob(value,64)); seen = true; break; case PART::control::midiChannel: { int tmp = value_int; int textCol = gen_text; if (tmp >= NUM_MIDI_CHANNELS) { if (tmp >= NUM_MIDI_CHANNELS * 2) textCol = midi_ignored; else textCol = gen_text; tmp = (tmp % NUM_MIDI_CHANNELS); } partMidiCh->textcolor(textCol); partMidiCh->value(tmp + 1); if (panelVisible) { panellistitem[panelpart]->partrcv->textcolor(textCol); panellistitem[panelpart]->partrcv->value(tmp); } seen = true; break; } case PART::control::omni: partOmniEnable->value(value); seen = true; break; case PART::control::keyMode: partKeymode->value(value_int); updateModepatch(value_int > 1 && partui->part->Pdrummode != 0); seen = true; break; case PART::control::drumMode: // we allow this to cayry on to PartUI updateModepatch(value_bool != 0 && partKeymode->value() > 1); break; case PART::control::portamento: partPortamento->value(value_bool); break; case PART::control::instrumentName: partui->checkEngines(); synth->getGuiMaster()->instrumentlabel->copy_label(synth->part[npart]->Pname.c_str()); seen = true; break; case PART::control::minNote: case PART::control::minToLastKey: // this will have been modified for last key press minKeyCount->value(value_int); seen = true; break; case PART::control::maxNote: case PART::control::maxToLastKey: // this will have been modified for last key press maxKeyCount->value(value_int); seen = true; break; case PART::control::resetMinMaxKey: minKeyCount->value(0); maxKeyCount->value(127); seen = true; break; case PART::control::keyShift: partKeyShift->value(value_int); seen = true; break; case PART::control::maxNotes: partKeyLimit->value(value_int); seen = true; break; case PART::partToSystemEffect1: sysEff1->value(value); sysEff1->selection_color(setKnob(value,0)); seen = true; break; case PART::partToSystemEffect2: sysEff2->value(value); sysEff2->selection_color(setKnob(value,0)); seen = true; break; case PART::partToSystemEffect3: sysEff3->value(value); sysEff3->selection_color(setKnob(value,0)); seen = true; break; case PART::partToSystemEffect4: sysEff4->value(value); sysEff4->selection_color(setKnob(value,0)); seen = true; break; case PART::control::audioDestination: int send = value_int - 1; if (send < 0 or send > 2) send = 0; if (panelVisible) panellistitem[panelpart]->audiosend->value(send); seen = true; break; } return seen;} {} } Function {returns_update(CommandBlock *getData)} {return_type bool } { code {// float value = getData->data.value; bool wasFromHere = ((getData->data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromGUI); unsigned char control = getData->data.control; unsigned char newpart = getData->data.part; unsigned char kititem = getData->data.kit; unsigned char engine = getData->data.engine; unsigned char insert = getData->data.insert; unsigned char parameter = getData->data.parameter; unsigned char miscmsg = getData->data.miscmsg; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); int chan = kititem & 0x3f; bool isSingle = kititem >= 0x40; int mask = NUM_MIDI_CHANNELS - 1; string name; if (miscmsg != NO_MSG) name = textMsgBuffer.fetch(miscmsg); if (newpart == TOPLEVEL::section::midiIn) { if (engine == MIDI::CC::volume && partui->part->ctl->volume.receive == 0) return false; // disabled if (engine == MIDI::CC::expression && partui->part->ctl->expression.receive == 0) return false; // disabled float vol = (value * synth->part[npart]->ctl->volume.data) / 127; if (control == MIDI::control::controller) { // MIDI panel entries only for (int i = 0; i < NUM_MIDI_CHANNELS; ++i) { if (panellistitem[i]->partenabled->value() != 0) { if ((isSingle && i == (chan & mask) && panellistitem[i]->partrcv->value() == (chan & mask) && (chan / NUM_MIDI_CHANNELS) == (panelgroup / NUM_MIDI_CHANNELS)) || (!isSingle && panellistitem[i]->partrcv->value() == (chan & mask))) { if (engine == MIDI::CC::volume) { panellistitem[i]->partvolume->value(vol); panellistitem[i]->partvolume->selection_color(setSlider(vol,96)); } else if (engine == MIDI::CC::panning) { panellistitem[i]->partpanning->value(value); panellistitem[i]->partpanning->selection_color(setKnob(value,64)); } } } } } bool isForUs = (isSingle && chan == npart) || (!isSingle && (partMidiCh->value() == (chan & mask) + 1)); switch(control) { case MIDI::control::noteOn: case MIDI::control::noteOff: break; case MIDI::control::controller: if (engine <= 119 && fetchData(0, MAIN::control::soloCC, TOPLEVEL::section::main)) { // it's a valid channel switch int newch = partMidiCh->value() - 1; int switchType = collect_readData(synth, 0, MAIN::control::soloType, TOPLEVEL::section::main); switch (switchType) { case MIDI::SoloType::Row: if (npart < NUM_MIDI_CHANNELS) { if (npart != value_int) newch = NUM_MIDI_CHANNELS; else newch = 0; } break; case MIDI::SoloType::Column: if (value_int == npart) newch = (value_int & mask); else if ((value_int & mask) == (npart & mask)) newch = (value_int & mask) + NUM_MIDI_CHANNELS; break; case MIDI::SoloType::Loop: case MIDI::SoloType::TwoWay: if (npart < NUM_MIDI_CHANNELS) { if (npart == collect_readData(synth, 0, MAIN::control::soloType, TOPLEVEL::section::main)) newch = 0; else if (value_int > 0) newch = NUM_MIDI_CHANNELS; } break; case MIDI::SoloType::Channel: //int ch = value_int % NUM_MIDI_CHANNELS; if (newch == chan || newch == chan + NUM_MIDI_CHANNELS) newch = chan; else newch = newch + NUM_MIDI_CHANNELS; break; } partMidiCh->value(newch + 1); //if (newch < NUM_MIDI_CHANNELS) partMidiCh->textcolor(gen_text); //else //partMidiCh->textcolor(midi_solo_release); updatepanel(); } else if (isForUs) { switch(engine) { case MIDI::CC::modulation: partui->modulation->value(value); partui->modulation->selection_color(setKnob(value,64)); break; case MIDI::CC::volume: partVol->value(vol); partVol->selection_color(setKnob(vol,96)); break; case MIDI::CC::panning: partPan->value(value); partPan->selection_color(setKnob(value,64)); break; case MIDI::CC::expression: partui->expression->value(value); partui->expression->selection_color(setKnob(value,127)); break; case MIDI::CC::legato: { int mode = synth->ReadPartKeyMode(npart); if (mode > 1) partKeymode->value(2); else partKeymode->value(mode); updateModepatch(mode > 1 && partui->drumMode->value() != 0); break; } case MIDI::CC::filterQ: partui->filterq->value(value); partui->filterq->selection_color(setKnob(value,64)); break; case MIDI::CC::filterCutoff: partui->filtercutoff->value(value); partui->filtercutoff->selection_color(setKnob(value,64)); break; case MIDI::CC::bandwidth: partui->masterbandwidth->value(value); partui->masterbandwidth->selection_color(setKnob(value,64)); break; } } break; case MIDI::control::bankChange: if (engine != UNUSED) bankui->readbankcfg(); bankui->rescan_for_banks(); break; } return false; } if (newpart == TOPLEVEL::section::systemEffects) { if (insert == TOPLEVEL::insert::systemEffectSend && !wasFromHere) { switch (engine) { case 0: if(control == 1) { syseff01->value(value_int); syseff01->selection_color(setKnob(value_int,0)); } else if(control == 2) { syseff02->value(value_int); syseff02->selection_color(setKnob(value_int,0)); } else if(control == 3) { syseff03->value(value_int); syseff03->selection_color(setKnob(value_int,0)); } break; case 1: if(control == 2) { syseff12->value(value_int); syseff12->selection_color(setKnob(value_int,0)); } else if(control == 3) { syseff13->value(value_int); syseff13->selection_color(setKnob(value_int,0)); } break; case 2: if(control == 3) { syseff23->value(value_int); syseff23->selection_color(setKnob(value_int,0)); } break; } } else { if (control == EFFECT::sysIns::effectNumber) { //note: using local settings from the last push-update into MirrorData syseffnocounter->value(syseffectui->effNum() + 1); sysefftype->value(syseffectui->effType()); syseffectui->refresh(); syseffectui->UpdatePresetColour(parameter, sysefftype->value()); SysEffOn->value(syseffectui->isEnabled()); // note: effect type selection not disabled/enabled } else if (control == EFFECT::sysIns::effectType) { syseffnocounter->value(syseffectui->effNum() + 1); sysefftype->value(syseffectui->effType()); syseffectui->refresh(); syseffectui->UpdatePresetColour(0, sysefftype->value()); // changing effect type always sets default values if (sysinsgroup->value() == SystemEffectsGrp) { showSysEfxUI(); syseffectui->effRtext(mainScale, sysefftype->value()); } } else if (control == EFFECT::sysIns::effectEnable) { SysEffOn->value(value_bool); if (value_bool) sysefftype->activate(); else sysefftype->deactivate(); } } return false; } else if (newpart == TOPLEVEL::section::insertEffects) { if (control == EFFECT::sysIns::effectNumber) { refreshInsEffUI(); if (sysinsgroup->value() == InsertionEffectsGrp) showInsEfxUI(); inseffectui->UpdatePresetColour(parameter, insefftype->value()); } else if (control == EFFECT::sysIns::effectType) { refreshInsEffUI(); inseffectui->UpdatePresetColour(0, insefftype->value()); // changing effect type always sets default values if (sysinsgroup->value() == InsertionEffectsGrp) { showInsEfxUI(); inseffectui->effRtext(mainScale, insefftype->value()); } } else if (control == EFFECT::sysIns::effectDestination) { inseffpart->value(value_int + 2); if (value_int != -1) { // note: effect type selection is never disabled refreshInsEffUI(); if (sysinsgroup->value() == InsertionEffectsGrp) showInsEfxUI(); } } return false; } switch(control) { case MAIN::control::volume: mastervolumedial->value(value); mastervolumedial->selection_color(setKnob(value,90)); break; case MAIN::control::partNumber: partSwitch(value_int); updatepanel(); break; case MAIN::control::availableParts: partmax = value_int; updatepart(); updatepanel(); setinspartlist(); vectorui->checkParts(value_int); break; case MAIN::control::panLawType: panning_law->value(value_int); break; case MAIN::control::detune: globalfinedetune->value(value); globalfinedetune->selection_color(setKnob(value,64)); break; case MAIN::control::keyShift: masterkeyshift->value(value_int); break; case MAIN::control::bpmFallback: setBpmFallbackValue(value); break; case MAIN::control::mono: mastermono->value(value_int); if (value_int) mastermono->label("Mono"); else mastermono->label("Stereo"); break; case MAIN::control::soloType: channelswitch->value(value_int); if (value_int == 0) { CS_CC = 128; CSspinner->value(115); // default CSspinner->hide(); CSpend->hide(); for (int i = 0; i < NUM_MIDI_CHANNELS; ++i) setPanelPartMidiWidget(i, i); } else { CS_CC = 115; CSspinner->value(115); CSpend->show(); CSspinner->show(); for (int i = 1; i < NUM_MIDI_CHANNELS; ++i) { if (value_int == 2) setPanelPartMidiWidget(i, i); else setPanelPartMidiWidget(i, 16); } } panelwindow->changed(); break; case MAIN::control::soloCC: updatepanel(); break; case MAIN::control::exportBank: if (wasFromHere) query("", "", "", name); break; case MAIN::control::importBank: // import bank if (wasFromHere) { if (name.find("FAILED") == 1) query("", "", "", name); else { unsigned int other = name.find(" : "); if (other < 1024) // a bit of a hack :( { name = name.substr(other + 3); query("", "", "", name); } } } bankui->rescan_for_banks(); break; case MAIN::control::deleteBank: // delete bank and contents if (name.find("FAILED") == 1) { if (wasFromHere) query("", "", "", name); } bankui->rescan_for_banks(); bankui->set_bank_slot(); break; case MAIN::control::loadInstrumentFromBank: case MAIN::control::refreshInstrumentUI: bankui->refreshinstrumentwindow(); updatepartprogram(kititem); break; case MAIN::control::loadInstrumentByName: updatepartprogram(kititem); break; case MAIN::control::saveNamedInstrument: // save instrument if (name.find("FAILED") == 1) { if (wasFromHere) query("", "", "", name); } else { partui->setinstrumentlabel(); panellistitem[newpart % NUM_MIDI_CHANNELS]->refresh(); //RecentInstruments->activate(); } break; case MAIN::control::loadNamedPatchset: // load patchset if (name.find("FAILED") == 1) { if (wasFromHere) query("", "", "", name); } else { vectorui->RefreshChans(); //RecentParams->activate(); setMasterLabel(findLeafName(name)); refresh_master_ui(2); } lastsyseffeqW = 0; lastsysDynFiltW = 0; lastinsDynFiltW = 0; break; case MAIN::control::saveNamedPatchset: // save patch set if (name.find("FAILED") == 1) { if (wasFromHere) query("", "", "", name); } else { setMasterLabel(findLeafName(name)); //RecentParams->activate(); } break; case MAIN::control::loadNamedVector: // load vector if (name.find("FAILED") == 1) { if (wasFromHere) query("", "", "", name); } else { vectorui->setLoadLabelRemote(insert, synth->getRuntime().vectordata.Name[insert]); setMasterLabel(findLeafName(name) + " - Vector " + to_string(int(insert) + 1)); vectorui->setRecent(true); refresh_master_ui(5); } break; case MAIN::control::saveNamedVector: // save vector if (name.find("FAILED") == 1) { if (wasFromHere) query("", "", "", name); } else { setMasterLabel(findLeafName(name) + " - Vector " + to_string(int(insert) + 1)); vectorui->setRecent(true); } break; case MAIN::control::loadNamedScale: // load scales if (name.find("FAILED") == 1) { if (wasFromHere) query("", "", "", name); } else { //RecentScale->activate(); microtonalui->microtonaluiwindow->hide(); microtonalui->make_window(); microtonalui->showScales(); } break; case MAIN::control::saveNamedScale: // save scales if (wasFromHere && name.find("FAILED") == 1) query("", "", "", name); //else //RecentScale->activate(); break; case MAIN::control::loadNamedState: // load state if (wasFromHere && name.find("FAILED") == 1) { query("", "", "", name); refresh_master_ui(1); } else { setMasterLabel(findLeafName(name) + " - State"); refresh_master_ui(0x14); } break; case MAIN::control::saveNamedState: // save state if (wasFromHere && name.find("FAILED") == 1) query("", "", "", name); else setMasterLabel(findLeafName(name) + " - State"); break; case MAIN::control::defaultPart: case MAIN::control::defaultInstrument: partSwitch(npart); updatepanel(); break; case MAIN::control::masterReset: if (newpart == TOPLEVEL::section::main) { refresh_master_ui(1); vumeter->init(-1, synth); resetPartsClip(); } else if (newpart < NUM_MIDI_PARTS) partSwitch(newpart); setMasterLabel(""); break; case MAIN::control::masterResetAndMlearn: refresh_master_ui(1); resetPartsClip(); if (midilearnui) midilearnui->midilearnwindow->hide();//Hide(); setMasterLabel(""); break; case MAIN::control::openManual: message->hide(); if (miscmsg != NO_MSG) query("", "", "", textMsgBuffer.fetch(miscmsg)); break; case MAIN::control::startInstance: // new instance (do nothing here) break; case MAIN::control::stopSound: virkeyboard->relaseallkeys(); vumeter->init(-1, synth); resetPartsClip(); break; } return false;} {} } Function {paste(CommandBlock *getData)} {} { code {// if (getData->data.part == TOPLEVEL::section::systemEffects) { sysinsgroup->value(SystemEffectsGrp); sysefftype->value(syseffectui->effType()); syseffnocounter->value(syseffectui->effNum() + 1); syseffectui->refresh(); syseffectui->UpdatePresetColour(0, sysefftype->value()); showSysEfxUI(); } else { sysinsgroup->value(InsertionEffectsGrp); refreshInsEffUI(); inseffectui->UpdatePresetColour(0, insefftype->value()); showInsEfxUI(); }} {} } Function {query(string one, string two, string three, string text)} {return_type int } { code {// if (one.empty()) yesQ->hide(); else { if(one == "!") { yesQ->copy_label("Yes"); } else { yesQ->copy_label(one.c_str()); } yesQ->show(); } if (two.empty()) noQ->hide(); else { if (two == "!") { noQ->copy_label("No"); } else { noQ->copy_label(two.c_str()); } noQ->show(); } if (three.empty()) { cancelQ->copy_label("Close"); typeQ->copy_label("!"); } else { if (three == "!") { cancelQ->copy_label("Cancel"); } else { cancelQ->copy_label(three.c_str()); } typeQ->copy_label("?"); } textQ->copy_label(text.c_str()); int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Master-query"); if (W < queryDW || H < queryDH) { W = queryDW; H = queryDH; } checkSane(X, Y, W, H, queryDW, queryDH); querywindow->resize(Fl::event_x_root() + 16, Fl::event_y_root(), W, H); querywindow->show(); int result = 0; while(querywindow->shown()) { querywindow->show(); // keep it on top queryRtext(); if (yesQ->value()) result = 3; else if (noQ->value()) result = 2; else if (cancelQ->value()) result = 1; Fl::wait(); } saveWin(synth, querywindow->w(),querywindow->h(), querywindow->x(), querywindow->y(), false, "Master-query"); return result;} {} } Function {setmessage(int group, bool fixedPos, string text, string B1 = "Close", string B2 = "", string B3 = "")} {} { code {// msgGroup = group; if (B3.empty()) yesdoit->hide(); else { yesdoit->copy_label(B3.c_str()); yesdoit->show(); } if (B2.empty()) cancel->hide(); else { cancel->copy_label(B2.c_str()); cancel->show(); } closebutton->copy_label(B1.c_str()); int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Master-message"); if(W < msgDW || H < msgDW) { W = msgDW; H = msgDH; } checkSane(X, Y, W, H, msgDW, msgDH); if (fixedPos) message->resize(masterwindow->x() + masterwindow->w() / 2 - message->w() / 2, masterwindow->y() + masterwindow->h() / 2 - message->h() / 2, W, H); else message->resize(Fl::event_x_root() + 16, Fl::event_y_root(), W, H); words->copy_label(text.c_str()); message->show();} {} } Function {setinput(string label, string oldLine)} {return_type string } { code {// textLine->copy_label(label.c_str()); textLine->value(oldLine.c_str()); int X, Y, W, H, O; loadWin(synth, W, H, X, Y, O, "Master-textin"); X = Fl::event_x_root(); // always want these relative to parent Y = Fl::event_y_root(); if(W < textinDW || H < textinDH) { W = textinDW; H = textinDH; } checkSane(X, Y, W, H, textinDW, textinDH, true); textwindow->size(W, H); textwindow->show(); string text; string oldline = textLine->value(); size_t pos = 1; while (textwindow->shown()) { textwindow->show(); // keep it on top textinRtext(); text = string(textLine->value()); Fl::wait(); pos = text.find_last_not_of(' '); if (pos != string::npos) pos -= text.find_first_not_of(' '); if (Fl::event_key() == FL_Enter) { if (pos == 0 || pos > 1) textwindow->hide(); else textLine->copy_label("Must be at least 3 letters or none"); } } saveWin(synth, textwindow->w(), textwindow->h(), textwindow->x(), textwindow->y(), false, "Master-textin"); if (pos == 0 || pos == string::npos) return oldline; return text;} {} } Function {updatesendwindow()} {} { code {// ;} {} } Function {updatelistitem(int part)} {} { code {// int tmp = part % NUM_MIDI_CHANNELS; panellistitem[tmp]->refresh();} {} } Function {changepanelstyle(int type, bool force = false)} {} { code {// if (type == 0) type = 1; panelwindow->hide(); if (type == 1) { panelwindow->reset(PANEL_SINGLE_X, PANEL_SINGLE_Y); if (force) panelwindow->size(PANEL_SINGLE_X, PANEL_SINGLE_Y); panelwindow->size_range((PANEL_SINGLE_X * 9) / 10, (PANEL_SINGLE_Y * 9) / 10, 0, 0, 0, 0, 1); towide->hide(); todeep->show(); if (force) Panelclose->position(975, 290); } else if (type == 2) { panelwindow->reset(PANEL_DUAL_X, PANEL_DUAL_Y); if (force) panelwindow->size(PANEL_DUAL_X, PANEL_DUAL_Y); panelwindow->size_range((PANEL_DUAL_X * 4) / 5, (PANEL_DUAL_Y * 4) / 5, 0, 0, 0, 0, 1); towide->show(); todeep->hide(); } panelwindow->show(); panelType = type; configui->PanelLayout->value(2 - type); if (configui->configwindow->visible()) configui->configwindow->redraw(); panelRtext();} {} } Function {Showpanel()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Mixer"); //std::cout << "fetch " << fetchO << std::endl; if (fetchO == 0) fetchO = 1; // it's never been seen so set the default int tmp = fetchO & 3; // find default sizes int defW = (PANEL_SINGLE_X * 9) / 10; int defH = (PANEL_SINGLE_Y * 9) / 10; if (tmp == 2) { defW = (PANEL_DUAL_X * 4) / 5; defH = (PANEL_DUAL_Y * 4) / 5; } panelwindow->reset(defW, defH); if (fetchW < defW || fetchH < defH) { fetchW = defW; // it's messed up so force default fetchH = defH; } configui->PanelLayout->value(2 - tmp); panelwindow->size_range(defW, defH, 0, 0, 0, 0, 1); checkSane(fetchX, fetchY, fetchW, fetchH, defW, defH); panelwindow->resize(fetchX, fetchY, fetchW, fetchH); if (fetchO < 4) { changepanelstyle(tmp); updatepanel(); } else { panelType = fetchO; panelwindow->hide(); }} {} } Function {updatepanel(bool full = false)} {} { code {// if (partmax == (NUM_MIDI_CHANNELS * 4)) { Panelgroups->show(); Panelgroups->value(panelgroup / NUM_MIDI_CHANNELS); } else Panelgroups->hide(); if (partmax == (NUM_MIDI_CHANNELS * 2)) { Panelsmallgroups->show(); Panelsmallgroups->value(panelgroup / NUM_MIDI_CHANNELS); } else Panelsmallgroups->hide(); for (int part = 0; part < NUM_MIDI_CHANNELS; ++part) { panellistitem[part]->refresh(); } if (vectorui->vectorwindow->visible()) // should this really be here? { for (int part = 0; part < partmax; ++part) { vectorui->setInstrumentLabel(part); } } int oldswitch = channelswitch->value(); int nextValue = collect_readData(synth, 0, MAIN::control::soloType, TOPLEVEL::section::main); channelswitch->value(nextValue); if (full) { oldswitch = channelswitch->value(); // disables 'pending' CS_CC = nextValue; } if (nextValue > MIDI::SoloType::Disabled) { if (oldswitch == MIDI::SoloType::Disabled) { CSspinner->value(115); CSpend->show(); } else { CSspinner->value(fetchData(0, MAIN::control::soloCC, TOPLEVEL::section::main)); CSpend->hide(); } CSspinner->show(); } else { synth->getRuntime().channelSwitchCC = 128; // TODO why does the following fail? //send_data(TOPLEVEL::action::forceUpdate, MAIN::control::soloCC, 128, TOPLEVEL::type::Integer, TOPLEVEL::section::main); CSspinner->hide(); CSpend->hide(); } panelwindow->changed(); ;} {} } Function {partSwitch(int next)} {} { code {// if (npart != next) { npartcounter->value(next + 1); npartcounter->redraw(); updatelistitem(npart); // deselect old one npart = next; } updatelistitem(next); // select and/or modify partui->rebuild(npart); partEnable->value(synth->part[npart]->Penabled == 1); if (partEnable->value() == 1) partControls->activate(); else partControls->deactivate(); refreshControls(npart); masterwindow->redraw();} {} } Function {updateEngines(int engine, string instrumentName)} {} { code {// if (engine & 1) // addsynth instrumentaddbox->color(add_back); else instrumentaddbox->color(bank_back_used); if (engine & 2) // subsynth instrumentsubbox->color(sub_back); else instrumentsubbox->color(bank_back_used); if (engine & 4) // padsynth instrumentpadbox->color(pad_back); else instrumentpadbox->color(bank_back_used); instrumentlabel->copy_label(instrumentName.c_str()); if (npart >= panelgroup && npart < (panelgroup + NUM_MIDI_CHANNELS)) { int num = npart % NUM_MIDI_CHANNELS; panellistitem[num]->refresh(); }} {} } Function {updateModepatch(bool inactive)} {} { code {// if (inactive) modepatch->color(warning_background); else modepatch->color(FL_BACKGROUND_COLOR); modepatch->redraw();} {} } Function {updatepart()} {} { code {// if (checkmaxparts()) { if (npart >= partmax) { npart %= NUM_MIDI_CHANNELS; npart += (partmax - NUM_MIDI_CHANNELS); npartcounter->value(npart + 1); npartcounter->do_callback(); } maxparts->value(partmax); maxparts->redraw(); return; } partEnable->value(synth->partonoffRead(npart)); maxparts->value(partmax); maxparts->redraw(); npartcounter->value(npart + 1); npartcounter->redraw(); refreshControls(npart);} {} } Function {refreshControls(int npart)} {} { code {// partVol->value(synth->part[npart]->Pvolume); partVol->selection_color(setKnob(partVol->value(),96)); partPan->value(synth->part[npart]->Ppanning); partPan->selection_color(setKnob(partPan->value(),64)); partVelOffset->value(synth->part[npart]->Pveloffs); partVelOffset->selection_color(setKnob(partVelOffset->value(),64)); partVelSense->value(synth->part[npart]->Pvelsns); partVelSense->selection_color(setKnob(partVelSense->value(),64)); partui->setinstrumentlabel(); partMidiCh->value(synth->part[npart]->Prcvchn + 1); partOmniEnable->value(synth->part[npart]->Pomni); partKeyLimit->value(synth->part[npart]->Pkeylimit); partKeyShift->value(synth->part[npart]->Pkeyshift - 64); minKeyCount->value(synth->part[npart]->Pminkey); maxKeyCount->value(synth->part[npart]->Pmaxkey); partPortamento->value(synth->part[npart]->ctl->portamento.portamento); sysEff1->value(synth->Psysefxvol[0][npart]); sysEff1->selection_color(setKnob(sysEff1->value(),0)); sysEff2->value(synth->Psysefxvol[1][npart]); sysEff2->selection_color(setKnob(sysEff2->value(),0)); sysEff3->value(synth->Psysefxvol[2][npart]); sysEff3->selection_color(setKnob(sysEff3->value(),0)); sysEff4->value(synth->Psysefxvol[3][npart]); sysEff4->selection_color(setKnob(sysEff4->value(),0)); int tmp = synth->ReadPartKeyMode(npart); if (tmp > PART_MONO) partKeymode->value(PART_LEGATO); else partKeymode->value(tmp); updateModepatch(tmp > PART_MONO && synth->part[npart]->Pdrummode != 0); partui->checkEngines();} {} } Function {updatepartprogram(int next)} {} { code {// if (vectorui) vectorui->setInstrumentLabel(next); if (partui->part->Prcvchn < NUM_MIDI_CHANNELS) { partMidiCh->value(partui->part->Prcvchn + 1); partMidiCh->textcolor(gen_text); } else { //partMidiCh->textcolor(midi_solo_release); partMidiCh->textcolor(gen_text); partMidiCh->redraw(); } partSwitch(next);} {} } Function {setMasterLabel(string name)} {} { code {// string spacer = ""; if (!name.empty()) spacer = " - "; masterwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push(name), UNUSED, TOPLEVEL::windowTitle)).c_str()); panelwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Mixer Panel" + spacer + name), UNUSED, TOPLEVEL::windowTitle)).c_str()); masterwindow->changed();} {} } Function {do_load_scale(string fname)} {} { code {// send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::loadNamedScale, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(fname));} {} } Function {do_load_instrument(string fname)} {} { code {// int npart = partui->npart; if ((npart & 0x30) == (panelgroup & 0x30)) { int displaypart = npart & 0x0f; panellistitem[displaypart]->partenabled->value(0); panellistitem[displaypart]->panellistitemgroup->deactivate(); } partEnable->value(0); send_data(TOPLEVEL::action::forceUpdate, MAIN::control::loadInstrumentByName, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, npart, UNUSED, UNUSED, textMsgBuffer.push(fname));} {} } Function {do_load_master(string filename)} {} { code {// if (filename.empty()) { filename = setfiler("", "", false, TOPLEVEL::XML::Patch); if (filename.empty()) return; } send_data(TOPLEVEL::action::muteAndLoop | TOPLEVEL::action::forceUpdate, MAIN::control::loadNamedPatchset, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(filename));} {} } Function {do_save_master()} {} { code {// string filename = setfiler("", "", true, TOPLEVEL::XML::Patch); if (filename.empty()) return; send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, MAIN::control::saveNamedPatchset, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(filename));} {} } Function {refresh_master_ui(int type)} {} { code {// if (microtonalui) // not taking chances! delete microtonalui; partmax = collect_readData(synth, 0, MAIN::control::availableParts, TOPLEVEL::main); maxparts->value(partmax); maxparts->redraw(); checkmaxparts(); panning_law->value(fetchData(0, MAIN::control::panLawType, TOPLEVEL::section::main)); int next = collect_readData(synth, 0, MAIN::control::partNumber, TOPLEVEL::main); // make sure it's the right one! npartcounter->value(next + 1); partSwitch(next); // resync to effect data from last push-update syseffnocounter->value(syseffectui->effNum() + 1); sysefftype->value(syseffectui->effType()); syseffectui->refresh(); refreshInsEffUI(); sysinsgroup->value(SystemEffectsGrp); bool isDirty; SysEffOn->value(syseffectui->isEnabled()); // note: effect type selection is never disabled if (syseffectui->effType() > 0) { isDirty = syseffectui->isChanged(); syseffectui->UpdatePresetColour(isDirty, sysefftype->value()); } if (inseffectui->effType() > 0) { isDirty = inseffectui->isChanged(); inseffectui->UpdatePresetColour(isDirty, insefftype->value()); } showSysEfxUI(); masterkeyshift->value(synth->Pkeyshift - 64); setBpmFallbackValue(synth->PbpmFallback); mastervolumedial->value(synth->Pvolume); mastervolumedial->selection_color(setKnob(synth->Pvolume,90)); globalfinedetune->value(synth->microtonal.Pglobalfinedetune); globalfinedetune->selection_color(setKnob(synth->microtonal.Pglobalfinedetune,64)); microtonalui = new MicrotonalUI(&synth->microtonal, synth); if (type & 0x80) setMasterLabel(textMsgBuffer.fetch((type >> 8) & UNUSED)); updatesendwindow(); updatepanel(type > 0); if (type != 5) vectorui->RefreshChans(); mastermono->value(0); mastermono->label("Stereo"); if (type == 0x14) { for (int i = 1; i < 6; ++i) configui->update_config(i); }} {} } Function {checkmaxparts()} {return_type bool } { code {// bool changed = false; if (panelgroup >= partmax) { panelgroup = 0; Panelgroups->value(0); Panelsmallgroups->value(0); changed = true; } npartcounter->range(1, maxparts->value()); if (npart >= maxparts->value()) { npartcounter->value(1); changed = true; } return changed;} {} } Function {strategicRetreat()} {} { code {query("", "", "", "Bad things happened,\\nYoshimi strategically retreats.");} {} } Function {Log(string msg)} {} { code {yoshiLog->log(msg);} {} } Function {showSysEfxUI()} {private } { code {// inseffectui->hide(); inseffectui->deactivate(); inseffectuigroup->hide(); inseffectuigroup->deactivate(); syseffectui->activate(); syseffectui->show(); syseffectuigroup->activate(); syseffectuigroup->show(); lastmainW = 0;} {} } Function {showInsEfxUI()} {private } { code {// syseffectui->hide(); syseffectui->deactivate(); syseffectuigroup->hide(); syseffectuigroup->deactivate(); inseffectui->activate(); inseffectui->show(); inseffectuigroup->activate(); inseffectuigroup->show(); lastmainW = 0;} {} } Function {showSysEffSends()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Master-systemeffectsend"); if(fetchW < syseffDW || fetchH < syseffDH) { fetchW = syseffDW; fetchH = syseffDH; } checkSane(fetchX, fetchY, fetchW, fetchH, syseffDW, syseffDH); syseffsendwindow->resize(fetchX, fetchY, fetchW, fetchH); syseffsendwindow->redraw(); syseffsendwindow->show(); syseffSeen = true;} {} } Function {setinspartlist()} {} { code {// inseffpart->clear(); inseffpart->add("Master Out"); // 0 inseffpart->add("Off"); // 1 for (int i = 0; i < partmax; ++i) { string num = string("00") + asString(i + 1); inseffpart->add((string("Part ") + asString(i + 1)).c_str()); } int current = inseffectui? inseffectui->getInsertFxRouting() : 2; assert(current < partmax); inseffpart->value(current + 2);} {} } Function {getPresetsUi()} {return_type {PresetsUI *} } { code {// return presetsui;} {} } Function {resetPartsClip()} {} { code {// for (int i = 0; i < NUM_MIDI_CHANNELS; i++) { if (panellistitem[i] && panellistitem[i]->partVUMeter) { panellistitem[i]->partVUMeter->resetPart(true); } }} {} } Function {refreshInsEffUI()} {} { code {// insefftype->value(inseffectui->effType()); inseffnocounter->value(inseffectui->effNum() + 1); int routing = inseffectui->getInsertFxRouting(); inseffpart->value(routing + 2); // offset since -2 ≙ master-out and -1 ≙ disabled inseffectui->refresh(); if (routing != -1) { inseffectui->activate(); inseffectuigroup->activate(); } else { // note: effect type selection is never disabled inseffectui->deactivate(); inseffectuigroup->deactivate(); }} {} } Function {setState(string filename)} {} { code {// send_data(TOPLEVEL::action::muteAndLoop | TOPLEVEL::action::forceUpdate, MAIN::control::loadNamedState, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(filename));} {} } Function {setPartActive(int _npart, bool active)} {} { code {// if (_npart == npart) { partEnable->value(active); }} {} } Function {setPanelPartVolWidget(int _npart, float _value)} {} { code {// panellistitem[_npart]->partvolume->value(_value); panellistitem[_npart]->partvolume->selection_color(setSlider(_value,96));} {} } Function {setPanelPartPanWidget(int _npart, float _value)} {} { code {// panellistitem[_npart]->partpanning->value(_value); panellistitem[_npart]->partpanning->selection_color(setKnob(_value,64));} {} } Function {setPartMidiWidget(int _npart, unsigned char _value)} {} { code {// if (_npart == npart) partMidiCh->value(_value); partMidiCh->textcolor(gen_text);} {} } Function {setPanelPartMidiWidget(int _npart, unsigned char _value)} {} { code {// panellistitem[_npart]->partrcv->value(_value); panellistitem[_npart]->partrcv->textcolor(gen_text); panellistitem[_npart]->partrcv->redraw();} {} } Function {setLogging(bool isConsole)} {} { code {// logenable = isConsole; if (logenable) yoshiLog->Show(synth); else if (yoshiLog->logConsole->visible()) yoshiLog->Hide(synth);} {} } Function {setBpmFallbackValue(float value)} {return_type void } { code {bpmfallback->value(value); // Force format to include up to two decimal spaces, but only if // they are non-zero. char tmp[50]; snprintf(tmp, sizeof(tmp), "%.2f", value); size_t len = strlen(tmp); // Use const char references, since Fl_Spinner does not make an // internal copy. const char *format = "%.2f"; if (tmp[len-1] == '0') { format = "%.1f"; if (tmp[len-2] == '0') format = "%.0f"; } bpmfallback->format(format);} {} } Function {updateBankRootDirs()} {} { code {bankui->readbankcfg();} {} } Function {updatepaths(int type)} {} { code {// if (type == 0) { bankui->readbankcfg(); bankui-> rescan_for_banks(); }} {} } Function {getSynth()} {return_type {SynthEngine *} } { code {return synth;} {} } Function {loadWindowData()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; if (lastSeen(synth, "Mixer") & 3) Showpanel(); if (lastSeen(synth, "Bank-instrument")) bankui->ShowInst(); loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Bank-bank"); bankui->bankuiwindow->position(fetchX, fetchY); if (fetchO) bankui->Showbank(); else bankui->bankuiwindow->hide(); loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Bank-root"); bankui->rootuiwindow->position(fetchX, fetchY); if (fetchO) bankui->ShowRoot(); else bankui->rootuiwindow->hide(); if (lastSeen(synth, "Midi-virtualkeyboard")) virkeyboard->ShowKbd(); else virkeyboard->virkeyboardwindow->hide(); if (lastSeen(synth, "Scales")) microtonalui->showScales(); else microtonalui->microtonaluiwindow->hide(); if (lastSeen(synth, "Midi-learn")) midilearnui->showLearn(); else midilearnui->midilearnwindow->hide(); if (lastSeen(synth, "Config")) configui->Show(synth); // this does some initialising else configui->configwindow->hide(); if (lastSeen(synth, "System-log") & 1) yoshiLog->Show(synth); else if (yoshiLog->logConsole->visible()) yoshiLog->Hide(synth); if (lastSeen(synth, "Vector")) vectorui->Show(synth); else vectorui->vectorwindow->hide(); if (lastSeen(synth, "Part-effects")) partui->Showefx(); else partui->partfx->hide(); if (lastSeen(synth, "Part-controllers")) partui->Showctl(); else partui->ctlwindow->hide(); if (lastSeen(synth, "Part-aftertouch")) partui->ShowAT(); else partui->aftertouchcontrol->hide(); if (lastSeen(synth, "Part-ctlmidi")) partui->Showctlmidi(); else partui->ctlmidi->hide(); if (lastSeen(synth, "Part-kit")) partui->Showkit(); else partui->instrumentkitlist->hide(); if (lastSeen(synth, "Part-edit")) partui->Showedit(); else partui->instrumenteditwindow->hide();} {} } Function {checkBuffer()} {} { code {// if (lastmainW < 0) // not ready yet! return; read_updates(synth); wincheck();} {} } Function {rescaleMain()} {} { code {// if (lastmainW < 0) // not ready yet! return; float ratio = Fl::w() / float(1024); // reference width if (ratio < 1.0f) ratio = 1.0f; int x, y, w, h; if (syseffSeen) { x = syseffsendwindow->x(); y = syseffsendwindow->y(); w = syseffDW * ratio; h = syseffDH * ratio; if ((x + w) > Fl::w()) x = Fl::w() - w; if ((y + h) > Fl::h()) y = Fl::h() - h; syseffsendwindow->resize(x, y, w, h); } // we always check the main window last x = masterwindow->x(); y = masterwindow->y(); w = mainDW * ratio; h = mainDH * ratio; if ((x + w) > Fl::w()) x = Fl::w() - w; if ((y + h) > Fl::h()) y = Fl::h() - h; masterwindow->resize(x, y, w, h); //std::cout << "Screen ratio " << ratio << std::endl; ;} {} } Function {instrumentsWarning(string message)} {return_type bool } { code {// bool result = false; int count = 0; string changed = ""; for (int i = 0; i < 64; ++i) { bool set = collect_readData(synth, 0, MAIN::control::partsChanged, TOPLEVEL::main, i); if (set) { ++count; changed = (changed + " " + to_string(i + 1)); } } if (count) { if (count == 1) changed = ("Instrument in part " + changed + " has been edited. "); else changed = ("Instruments in parts " + changed + " have been edited. "); changed = changed + message; result = (query("", "Yes", "No", changed) < 2); } return result; ;} {} } Function {instrumentSingleWarning(int npart, string message)} {return_type bool } { code {// bool result = false; string changed = ""; bool set = collect_readData(synth, 0, MAIN::control::partsChanged, TOPLEVEL::main, npart); if (set) { changed = (changed + " " + to_string(npart + 1)); changed = ("Instrument in part " + changed + " has been edited. "); changed = changed + message; result = (query("", "Yes", "No", changed) < 2); } return result; ;} {} } Function {wincheck()} {} { code {// /* * Below is a pragmatic method of making tooltips * fairly readable at all screen resolutions. * 768 is the reference height. */ if (oldH != Fl::h()) { int setsize = int((11.0f / 768.0f) * Fl::h()); Fl_Tooltip::size(setsize); oldH = Fl::h(); //std::cout << "tipset " << setsize << " actual " << Fl_Tooltip::size() << std::endl; if (masterwindow->x() >= Fl::w() || masterwindow->y() >= Fl::h()) Showmaster(); // ensure it's always visible } if (themeTrigger) { theme(); themeTrigger = false; } if (masterwindow->w() != lastmainW) { mainRtext(); if (lastmainW < 3) ++lastmainW; else lastmainW = masterwindow->w(); } if (yoshiLog->logConsole->visible()) yoshiLog->consoleRtext(); if (panelwindow->visible()) { if (panelwindow->w() != lastpanelW) { panelRtext(); lastpanelW = panelwindow->w(); } } if (message->visible() && message->w() != lastmsgW) { msgRtext(); lastmsgW = message->w(); msgSeen = true; } if (syseffectui->visible()) { int efftype = EFFECT::type::eq - EFFECT::type::none; if(sysefftype->value() == efftype) { if (lastsyseffeqW < 0.15f) { lastsyseffeqW += 0.01f; } else if (lastsyseffeqW != mainScale) { syseffectui->effRtext(mainScale, efftype); lastsyseffeqW = mainScale; } } } if (syseffectui != NULL) { if (syseffectui->filterwindow != NULL) { if (syseffectui->filterwindow->visible()) { if (lastsysDynFiltW != syseffectui->filterwindow->w()) { syseffectui->filtRtext(); lastsysDynFiltW = syseffectui->filterwindow->w(); } } } } if (inseffectui != NULL) { if(inseffectui->filterwindow != NULL) { if (inseffectui->filterwindow->visible()) { if (lastinsDynFiltW != inseffectui->filterwindow->w()) { inseffectui->filtRtext(); lastinsDynFiltW = inseffectui->filterwindow->w(); } } } } if (syseffsendwindow->visible() && syseffsendwindow->w() != lastsyseffW) { syseffRtext(); lastsyseffW = syseffsendwindow->w(); } if (vectorui->vectorwindow->visible()) vectorui->vectorRtext(); if (microtonalui->microtonaluiwindow->visible()) microtonalui->scaleRtext(); if (midilearnui->midilearnwindow->visible()) midilearnui->learnRtext(); if (virkeyboard->virkeyboardwindow->visible() && lastvirtW != virkeyboard->virkeyboardwindow->w()) { virkeyboard->virtRtext(); lastvirtW = virkeyboard->virkeyboardwindow->w(); } if (aboutwindow->visible() && lastaboutW != aboutwindow->w()) { aboutRtext(); lastaboutW = aboutwindow->w(); } if (paramsui->Recent->visible()) paramsui->paramRtext(); if (configui->configwindow->visible()) configui->configRtext(); if (configui->presets->visible()) configui->presetsRtext(); presetsui->UpresetsRtext(); bankui->wincheck(); partui->wincheck();} {} } Function {mainRtext()} {} { code {// mainScale = float(masterwindow->w() / mainDW); int size = int(10 * mainScale); int size11 = int(11 * mainScale); int size12 = int(12 * mainScale); int size14 = int(14 * mainScale); mastermenu->textsize(size12); // part insert controls partVol->labelsize(size); partPan->labelsize(size); partVelOffset->labelsize(size); partVelSense->labelsize(size); instrumentlabel->labelsize(size12); partEdit->labelsize(size12); partControllers->labelsize(size12); partMidiCCs->labelsize(size12); partMidiCh->labelsize(size11); partMidiCh->textsize(size11); partOmniEnable->labelsize(size11); partKeymode->textsize(size11); modepatch->labelsize(size11); partPortamento->labelsize(size11); minKeyCount->labelsize(size); minKeyCount->textsize(size11); maxKeyCount->labelsize(size); maxKeyCount->textsize(size11); setMinToLast->labelsize(size); setNormal->labelsize(size11); setMaxToLast->labelsize(size); partKeyShift->labelsize(size); partKeyShift->textsize(size11); partKeyLimit->labelsize(size); partKeyLimit->textsize(size11); sysEff1->labelsize(size); sysEff2->labelsize(size); sysEff3->labelsize(size); sysEff4->labelsize(size); sysEffName->labelsize(size); partEnable->labelsize(size14); mainreset->labelsize(size11); mainstop->labelsize(size11); mainvirtkeyb->labelsize(size11); mixerpanel->labelsize(size11); mainmidilearn->labelsize(size11); vectors->labelsize(size11); globalfinedetune->labelsize(size); mastervolumedial->labelsize(size); mastermono->labelsize(size11); masterkeyshift->labelsize(size); masterkeyshift->textsize(size12); bpmfallback->labelsize(size); bpmfallback->textsize(size12); InstBlurb->labelsize(size11); nextInst->labelsize(size11); valueInst->textsize(size11); cancelInst->labelsize(size11); SystemEffectsGrp->labelsize(size12); InsertionEffectsGrp->labelsize(size12); if (syseffectui->visible()) {; syseffnocounter->labelsize(size11); syseffnocounter->textsize(size11); sysefftype->labelsize(size11); sysefftype->textsize(size11); SysEffOn->labelsize(size14); sysEffSend->labelsize(size11); sysCopy->labelsize(size11); sysPaste->labelsize(size11); syseffectui->effRtext(mainScale, sysefftype->value()); } else { inseffnocounter->labelsize(size11); inseffnocounter->textsize(size11); insefftype->labelsize(size11); insefftype->textsize(size11); inseffpart->labelsize(size11); inseffpart->textsize(size11); insCopy->labelsize(size11); insPaste->labelsize(size11); inseffectui->effRtext(mainScale, insefftype->value()); } npartcounter->labelsize(size11); npartcounter->textsize(size11); maxparts->labelsize(size11); maxparts->textsize(size11); panning_law->labelsize(size12); panning_law->textsize(size12); undo->labelsize(size11); redo->labelsize(size11); masterwindow->redraw();} {} } Function {panelRtext()} {} { code {// int w = panelwindow->w(); int h = panelwindow->h(); float dW; float dH; if (panelType == 1) { dW = w / float(PANEL_SINGLE_X); dH = h / float(PANEL_SINGLE_Y); } else { dW = w / float(PANEL_DUAL_X); dH = h / float(PANEL_DUAL_Y); } float dScale; if (dW < dH) dScale = dW; else dScale = dH; if (dScale < 0.2f) dScale = 0.2f; panelScale = dScale; if (panelType == 1) { for (int i = 0; i < 16; ++ i) { panellistitem[i]->resize((8 + (i * 64)) * dW, 12 * dH, 63 * dW, 268 * dH); panellistitem[i]->itemRtext(dScale); } } else { for (int i = 0; i < 8; ++ i) { panellistitem[i]->resize((8 + (i * 64)) * dW, 12 * dH, 63 * dW, 268 * dH); panellistitem[i]->itemRtext(dScale); } for (int i = 8; i < 16; ++ i) { panellistitem[i]->resize((8 + ((i - 8) * 64)) * dW, 290 * dH, 63 * dW, 268 * dH); panellistitem[i]->itemRtext(dScale); } towide->resize(335 * dW, (PANEL_DUAL_Y - 30) * dH, 130 * dW, 25 * dH); Panelsmallgroups->resize(5 * dW, (PANEL_DUAL_Y - 23) * dH, 86 * dW, 18 * dH); Panelgroups->resize(5 * dW, (PANEL_DUAL_Y - 23) * dH, 86 * dW, 18 * dH); CSspinner->resize(173 * dW, (PANEL_DUAL_Y - 23) * dH, 50 * dW, 18 * dH); CSpend->resize(227 * dW, (PANEL_DUAL_Y - 30) * dH, 74 * dW, 25 * dH); channelswitch->resize(95 * dW, (PANEL_DUAL_Y -23) * dH, 74 * dW, 18 * dH); Panelclose->resize((PANEL_DUAL_X - 55) * dW, (PANEL_DUAL_Y - 30) * dH, 50 * dW, 25 * dH); } int size12 = int(12 * dScale); int size14 = int(14 * dScale); towide->labelsize(size14); todeep->labelsize(size14); Panelgroups->labelsize(size12); Panelgroups->textsize(size12); Panelsmallgroups->labelsize(size12); Panelsmallgroups->textsize(size12); CSspinner->labelsize(size12); CSspinner->textsize(size12); CSpend->labelsize(size12); channelswitch->labelsize(size12); channelswitch->textsize(size12); Panelclose->labelsize(size14); panelwindow->redraw();} {} } Function {aboutRtext()} {} { code {// float dScale = aboutwindow->w() / float(aboutDW); int size11 = int(11 * dScale); int size12 = int(12 * dScale); about2->labelsize(size11); about3->labelsize(size11); about4->labelsize(size12); about5->labelsize(size11); cont2->labelsize(size12); cont3->labelsize(size12); aboutClose->labelsize(size11); about1->labelsize(int(18 * dScale)); cont1->labelsize(int(15 * dScale)); aboutwindow->redraw(); saveWin(synth, aboutwindow->w(), aboutwindow->h(), aboutwindow->x(), aboutwindow->y(), true, "Master-about");} {} } Function {syseffRtext()} {} { code {// float dScale = syseffsendwindow->w() / float(syseffDW); int size = int(10 * dScale); syseffname->labelsize(size); syseffClose->labelsize(int(14 * dScale)); sys01txt->labelsize(size); sys02txt->labelsize(size); sys03txt->labelsize(size); sys12txt->labelsize(size); sys13txt->labelsize(size); sys23txt->labelsize(size); syseffsendwindow->redraw();} {} } Function {queryRtext()} {} { code {// if (lastqueryW == querywindow->w()) return; lastqueryW = querywindow->w(); float dScale = querywindow->w() / float(queryDW); int size14 = int(14 * dScale); yesQ->labelsize(size14); noQ->labelsize(size14); cancelQ->labelsize(size14); textQ->labelsize(size14); typeQ->labelsize(int(40 * dScale)); querywindow->redraw();} {} } Function {msgRtext()} {} { code {// float dScale = message->w() / float(msgDW); int size14 = int(14 * dScale); words->labelsize(12 * dScale); yesdoit->labelsize(size14); cancel->labelsize(size14); closebutton->labelsize(size14); message->redraw(); saveWin(synth, message->w(), message->h(), message->x(), message->y(), true, "Master-message");} {} } Function {textinRtext()} {} { code {// if (lasttextW == textwindow->w()) return; lasttextW = textwindow->w(); float dScale = textwindow->w() / float(textinDW); int size14 = int(14 * dScale); textLine->labelsize(size14); textLine->textsize(size14); textwindow->redraw();} {} } Function {theme()} {} { code {// lastmainW = 0; if (yoshiLog->logConsole->visible()) { yoshiLog->lastlogW = 0; yoshiLog->consoleRtext(); } if (panelwindow->visible()) { panelRtext(); } if (message->visible()) { lastmsgW = 0; msgRtext(); } if (syseffsendwindow->visible()) { syseffRtext(); } if (syseffectui != NULL) { if (syseffectui->filterwindow != NULL) { if (syseffectui->filterwindow->visible()) { lastsysDynFiltW = 0; syseffectui->filtRtext(); } if(syseffectui->fwin_filterui) syseffectui->fwin_filterui->theme(); } } if (inseffectui != NULL) { if (inseffectui->filterwindow != NULL) { if (inseffectui->filterwindow->visible()) { lastinsDynFiltW = 0; inseffectui->filtRtext(); } if(inseffectui->fwin_filterui) inseffectui->fwin_filterui->theme(); } } if (vectorui->vectorwindow->visible()) { vectorui->lastvectorW = 0; vectorui->vectorRtext(); } if (microtonalui->microtonaluiwindow->visible()) { microtonalui->lastscaleW = 0; microtonalui->scaleRtext(); } if (midilearnui->midilearnwindow->visible()) { midilearnui->learnW = 0; midilearnui->learnRtext(); } if (virkeyboard->virkeyboardwindow->visible()) { virkeyboard->lastvirtW = 0; virkeyboard->virtRtext(); } if (aboutwindow->visible()) { aboutRtext(); } if (paramsui->Recent->visible()) { paramsui->lastParamW = 0; paramsui->paramRtext(); } if (configui->configwindow->visible()) { configui->configRtext(); } if (configui->presets->visible()) { configui->lastpresetW = 0; configui->presetsRtext(); } bankui->theme(); partui->theme(); ;} {} } decl {SynthEngine *synth;} {public local } decl {ConfigUI *configui;} {public local } decl {ParametersUI *paramsui;} {public local } decl {VectorUI *vectorui;} {public local } decl {MidiLearnUI *midilearnui;} {public local } decl {BankUI *bankui;} {public local } decl {MicrotonalUI *microtonalui;} {public local } decl {VirKeyboard *virkeyboard;} {public local } decl {bool themeTrigger;} {public local } decl {int npart;} {public local } decl {int partmax;} { comment {This is only public for vector control} public local } decl {Panellistitem *panellistitem[NUM_MIDI_PARTS];} {public local } decl {ConsoleUI *yoshiLog;} {public local } decl {PresetsUI *presetsui;} {private local } decl {string panelwindowlabel} {private local } decl {int current_ID;} {private local } decl {int panelgroup;} {public local } decl {int CS_CC;} {private local } decl {string filename;} {private local } decl {int msgGroup;} {private local } decl {float mainDW;} {private local } decl {float mainDH;} {private local } decl {float mainScale;} {private local } decl {int panelType;} {private local } decl {float msgDW;} {private local } decl {float msgDH;} {private local } decl {bool msgSeen;} {private local } decl {float syseffDW;} {private local } decl {float syseffDH;} {private local } decl {bool syseffSeen;} {private local } decl {float panelScale;} {private local } decl {bool logenable;} {private local } decl {int aboutDW;} {private local } decl {int aboutDH;} {private local } decl {int queryDW;} {private local } decl {int queryDH;} {private local } decl {int lastqueryW;} {private local } decl {int textinDW;} {private local } decl {int textinDH;} {private local } decl {int lasttextW;} {private local } decl {string filerpath;} {private local } decl {string filerext;} {private local } decl {string filerfound;} {private local } decl {bool dosave;} {private local } decl {int extension;} {private local } decl {bool filerdone;} {private local } decl {int filerDW;} {private local } decl {int filerDH;} {private local } decl {int lastfilerW;} {private local } decl {int lastmainW} {private local } decl {int lastpanelW} {private local } decl {int lastmsgW} {private local } decl {int lastsyseffW} {private local } decl {float lastsyseffeqW} {private local } decl {int lastsysDynFiltW} {private local } decl {int lastinsDynFiltW} {private local } decl {int lastvirtW} {private local } decl {int lastaboutW} {private local } decl {int oldH} {private local } decl {int fileruseX;} {private local } decl {std::deque filerlist;} {private local } decl {int lineno;} {private local } decl {string type_name;} {private local } } yoshimi-2.3.5.1/src/UI/MicrotonalUI.fl000066400000000000000000000707021506652756400173630ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {MicrotonalUI.h} {not_in_source in_header } comment {Microtonal.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009, Alan Calvert Copyright 2016-2024, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. } {selected in_source in_header } decl {\#include } {public local } decl {\#include "Misc/Microtonal.h"} {public local } decl {\#include "UI/MiscGui.h" \#include "EffUI.h" \#include "BankUI.h" \#include "ADnoteUI.h" \#include "SUBnoteUI.h" \#include "PADnoteUI.h" \#include "UI/WidgetMWSlider.h" \#include "UI/WidgetCheckButton.h" \#include "Interface/TextLists.h" \#include "Params/Controller.h"} {public local } decl {\#include "UI/WidgetSpinner.h"} {public local } decl {\#include "Misc/FileMgrFuncs.h"} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } class MicrotonalUI {} { Function {make_window()} {} { Fl_Window microtonaluiwindow { label Scales callback {scaleClose->do_callback();} xywh {460 128 410 485} type Double hide resizable class ScaleTrackedWindow code0 {scaleDW = o->w(); scaleDH = o->h();} code1 {o->size_range(scaleDW, scaleDH, 0, 0, 0, 0, 1);} } { Fl_Group {} { tooltip {Center where the note's freqs. are inverted (not when keymapped)} xywh {248 2 157 48} box ENGRAVED_FRAME } { Fl_Text_Display invertlabel { label Invert xywh {273 7 5 24} box NO_BOX selection_color 64 labelfont 3 labelsize 12 labelcolor 226 align 136 textsize 11 textcolor 64 } Fl_Text_Display keyslabel { label keys xywh {273 18 5 30} box NO_BOX labelfont 3 labelsize 12 labelcolor 226 align 136 textsize 11 textcolor 64 } Fl_Check_Button invertKeys { callback {// send_data(TOPLEVEL::action::forceUpdate, SCALES::control::invertScale, o->value(), TOPLEVEL::type::Integer);} tooltip {Turn upside-down the note frequencies} xywh {256 16 19 19} down_box DOWN_BOX color 50 selection_color 64 labelfont 1 labelcolor 64 align 8 code0 {o->value(microtonal->Pinvertupdown);} class Fl_Check_Button2 } Fl_Text_Display centerlabel { label Center xywh {336 17 50 8} box NO_BOX labelfont 3 labelsize 11 labelcolor 226 } Fl_Spinner centerinvertcounter { callback {// send_data(0, SCALES::control::invertedScaleCenter, o->value(), TOPLEVEL::type::Integer);} xywh {339 20 47 22} labelsize 11 labelcolor 64 align 1 minimum -0 maximum 127 value 0 textfont 1 textsize 12 textcolor 64 code0 {o->value(microtonal->Pinvertupdowncenter);} code1 {if (microtonal->Pinvertupdown==0) o->deactivate();} code2 {o->step(1.0);} class WidgetSpinner } } Fl_Group {} { xywh {108 2 141 48} box ENGRAVED_FRAME } { Fl_Text_Display reflabel { label {Ref.} xywh {155 20 50 8} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 } Fl_Text_Display notelabel { label Note xywh {191 20 50 6} box NO_BOX labelfont 3 labelsize 11 labelcolor 226 textcolor 64 } Fl_Spinner anotecounter { callback {// send_data(0, SCALES::control::refNote, o->value(), TOPLEVEL::type::Integer);} tooltip {Midi note range: 24 (C1) to 84 (C6)} xywh {192 23 44 20} labelsize 11 labelcolor 64 align 1 minimum 24 maximum 84 value 69 textfont 1 textsize 11 textcolor 64 code0 {o->value(microtonal->PrefNote);} class WidgetSpinner } Fl_Value_Input afreqinput { label {Freq.} callback {// refFreq = o->value(); afreqset->show(); AsetBack->show();} tooltip {The frequency of the reference note -'return' to apply (default: A4=440.0)} xywh {114 20 55 20} labelsize 11 labelcolor 64 align 1 minimum 30 maximum 1100 value 440 textfont 1 textsize 10 textcolor 64 code0 {o->step(0.001, 1);} code1 {refFreq = microtonal->PrefFreq;} code2 {o->value(refFreq);} } Fl_Button AsetBack { callback {// if (refFreq < A_MIN) { refFreq = A_MIN; afreqinput->value(refFreq); } else if (refFreq > A_MAX) { refFreq = A_MAX; afreqinput->value(refFreq); } afreqset->hide(); o->hide(); send_data(0, SCALES::control::refFrequency, refFreq, 0);} xywh {171 22 14 17} box THIN_DOWN_BOX color 45 labelcolor 64 hide } Fl_Return_Button afreqset { callback {// if (refFreq < A_MIN) { refFreq = A_MIN; afreqinput->value(refFreq); } else if (refFreq > A_MAX) { refFreq = A_MAX; afreqinput->value(refFreq); } AsetBack->hide(); o->hide(); send_data(0, SCALES::control::refFrequency, refFreq, 0);} xywh {166 20 14 18} box NO_BOX labelcolor 64 hide } } Fl_Group microtonalgroup { xywh {3 49 402 485} box ENGRAVED_FRAME code0 {if (microtonal->Penabled==0) o->deactivate();} } { Fl_Input nameinput { label {Name:} callback {// send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, SCALES::control::name, 0, TOPLEVEL::type::Integer, UNUSED, textMsgBuffer.push(string(o->value())));} xywh {7 64 285 25} labelfont 1 labelsize 11 labelcolor 64 align 5 textcolor 64 code0 {o->value(microtonal->Pname.c_str());} } Fl_Input commentinput { label {Description:} callback {// send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, SCALES::control::comment, 0, TOPLEVEL::type::Integer, UNUSED, textMsgBuffer.push(string(o->value())));} xywh {7 104 394 25} labelfont 1 labelsize 11 labelcolor 64 align 5 textcolor 64 code0 {o->value(microtonal->Pcomment.c_str());} } Fl_Text_Display shiftlabel { label Shift xywh {318 65 50 8} box NO_BOX labelfont 3 labelsize 11 labelcolor 226 } Fl_Spinner scaleShift { callback {// send_data(0, SCALES::control::scaleShift, o->value(), TOPLEVEL::type::Integer);} tooltip {Octave base offset} xywh {320 68 47 22} labelsize 11 labelcolor 64 align 1 minimum -63 maximum 64 value 0 textfont 1 textsize 12 textcolor 64 code0 {o->value(microtonal->Pscaleshift-64);} code1 {o->step(1.0);} class WidgetSpinner } Fl_Group Tuning { label {Tunings:} xywh {7 144 190 300} box ENGRAVED_FRAME labelfont 1 labelsize 11 labelcolor 64 align 5 } { Fl_Input tuningsinput { tooltip {You must retune if you change this.} xywh {10 147 182 250} type Multiline labelfont 1 labelsize 11 labelcolor 64 align 5 when 2 textcolor 64 code0 {updateTuningsInput();} } Fl_Value_Output octavesizeoutput { label {Notes / oct.} callback {// o->value(microtonal->getoctavesize());} tooltip {Notes/Octave} xywh {17 415 45 20} labelsize 10 labelcolor 64 align 5 maximum 500 step 1 value 12 textfont 1 textcolor 64 code0 {o->value(microtonal->getoctavesize());} } Fl_Button importscl { label {Import .scl file} callback {// string filename = setfiler(synth,"", "", false, TOPLEVEL::XML::ScalaTune); if (filename.empty()) return; send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, SCALES::control::importScl, 0, TOPLEVEL::type::Integer, UNUSED, textMsgBuffer.push(filename)); ;} tooltip {Import Scala .scl file (tunnings)} xywh {85 401 100 18} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 10 labelcolor 64 } Fl_Button exportscl { label {Export .scl file} callback {// int value = microtonal->texttotunings(tuningsinput->value()); if (value < 1) { errors(value, true); return; } string filename = setfiler(synth,"", "", true, TOPLEVEL::XML::ScalaTune); if (filename.empty()) return; send_data(TOPLEVEL::action::lowPrio, SCALES::control::exportScl, 0, TOPLEVEL::type::Integer, UNUSED, textMsgBuffer.push(filename));} tooltip {Export Scala .scl file (tunnings)} xywh {85 422 100 18} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 10 labelcolor 64 } } Fl_Group Keymap { label {Keyboard Map:} open xywh {196 144 205 300} box ENGRAVED_FRAME labelfont 1 labelsize 11 labelcolor 64 } { Fl_Input mappinginput { tooltip {You must retune if you change this.} xywh {251 147 146 250} type Multiline labelfont 1 labelsize 11 labelcolor 64 align 5 when 2 textcolor 64 code0 {updateMappingInput();} } Fl_Box first1 { label First xywh {197 204 50 8} labelfont 3 labelsize 11 labelcolor 226 } Fl_Box first2 { label note xywh {198 214 50 8} labelfont 3 labelsize 11 labelcolor 226 } Fl_Spinner firstnotecounter { callback {// int tmp = int (o->value()); int max = middlenotecounter->value(); if (tmp > max) tmp = 0; else if (tmp < 0) tmp = max; o->value(tmp); send_data(0, SCALES::control::lowKey, tmp, TOPLEVEL::type::Integer);} tooltip {First MIDI note number} xywh {203 228 44 20} selection_color 64 labelsize 11 labelcolor 64 align 1 minimum -1 maximum 128 textfont 1 textsize 11 textcolor 64 code0 {o->value(microtonal->Pfirstkey);} code1 {o->step(1.0);} class WidgetSpinner } Fl_Box middle1 { label Middle xywh {197 269 50 8} labelfont 3 labelsize 11 labelcolor 226 } Fl_Box middle2 { label note xywh {198 279 50 8} labelfont 3 labelsize 11 labelcolor 226 } Fl_Spinner middlenotecounter { callback {// int tmp = int(o->value()); int min = firstnotecounter->value(); int max = lastnotecounter->value(); if (tmp < min) tmp = max; else if (tmp > max) tmp = min; o->value(tmp); send_data(0, SCALES::control::middleKey, o->value(), TOPLEVEL::type::Integer);} tooltip {Middle note (where scale degree 0 is mapped to)} xywh {203 293 44 20} labelsize 11 labelcolor 64 align 1 minimum -1 maximum 128 value 60 textfont 1 textsize 11 textcolor 64 code0 {o->value(microtonal->Pmiddlenote);} class WidgetSpinner } Fl_Box last1 { label Last xywh {197 334 50 8} labelfont 3 labelsize 11 labelcolor 226 } Fl_Box last2 { label note xywh {198 344 50 8} labelfont 3 labelsize 11 labelcolor 226 } Fl_Spinner lastnotecounter { callback {// int tmp = int(o->value()); int min = middlenotecounter->value(); if (tmp < min) tmp = 127; else if (tmp > 127) tmp = min; o->value(tmp); send_data(0, SCALES::control::highKey, tmp, TOPLEVEL::type::Integer);} tooltip {Last MIDI note number} xywh {203 357 44 20} labelsize 11 labelcolor 64 align 1 minimum 0 maximum 128 value 127 textfont 1 textsize 11 textcolor 64 code0 {o->value(microtonal->Plastkey);} class WidgetSpinner } Fl_Spinner mapsizecounter { label {Map Size} tooltip {The actual kemap size. This can be greater or smaller than the number of entries in the map} xywh {203 415 42 22} labelsize 11 labelcolor 64 align 1 minimum 0 maximum 127 value 0 textfont 1 textsize 11 textcolor 64 code0 {o->value(microtonal->Pmapsize);} class WidgetSpinner } Fl_Button exportkbm { label {Export .kbm file} callback {// string filename = setfiler(synth,"", "", true, TOPLEVEL::XML::ScalaMap); if (filename.empty()) return; retune(); send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, SCALES::control::exportKbm, 0, TOPLEVEL::type::Integer, UNUSED, textMsgBuffer.push(filename));} tooltip {Export Scala .kbm file (keyboard mapping)} xywh {273 422 104 18} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 10 labelcolor 64 } } Fl_Check_Button mappingenabledbutton { label ON callback {// o->show(); send_data(TOPLEVEL::action::forceUpdate, SCALES::control::enableKeyboardMap, o->value(), TOPLEVEL::type::Integer);} tooltip {Enable the Mapping (otherwise the mapping is linear)} xywh {212 166 20 21} down_box DOWN_BOX color 50 selection_color 64 labelfont 3 labelcolor 226 align 33 code0 {o->value(microtonal->Pmappingenabled);} code1 {if (microtonal->Pmappingenabled==0) Keymap->deactivate();} class Fl_Check_Button2 } Fl_Button retunebutton { label Retune callback {// retune(); send_data(0, SCALES::control::tuning, 1, TOPLEVEL::type::Integer); send_data(0, SCALES::control::keyboardMap, 1, TOPLEVEL::type::Integer); ;} tooltip {Retune the synth according to the inputs from "Tunnings" and "Keyboard Mapping"} xywh {169 448 107 28} box PLASTIC_UP_BOX color 228 labeltype EMBOSSED_LABEL labelfont 1 labelcolor 64 } Fl_Button clearbutton { label {Clear All} callback {// send_data(TOPLEVEL::action::forceUpdate, SCALES::control::clearAll, 0, TOPLEVEL::type::Integer);} tooltip {Return to default scale settings} xywh {25 448 107 28} box PLASTIC_UP_BOX color 89 labelfont 1 labelcolor 64 } Fl_Button importkbm { label {Import .kbm file} callback {// string filename = setfiler(synth,"", "", false, TOPLEVEL::XML::ScalaMap); if (filename.empty()) return; send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, SCALES::control::importKbm, 0, TOPLEVEL::type::Integer, UNUSED, textMsgBuffer.push(filename)); ;} tooltip {Import Scala .kbm file (keyboard mapping)} xywh {273 401 104 18} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 10 labelcolor 64 } } Fl_Text_Display enablelabel { label Enable xywh {27 24 50 8} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 } Fl_Text_Display microtonallabel { label Microtonal xywh {40 40 50 8} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 } Fl_Check_Button enableMicrotonal { callback {// send_data(TOPLEVEL::action::forceUpdate, SCALES::control::enableMicrotonal, o->value(), TOPLEVEL::type::Integer);} xywh {4 13 21 22} down_box DOWN_BOX color 50 selection_color 64 labelfont 1 labelcolor 64 align 4 code0 {o->value(microtonal->Penabled);} class Fl_Check_Button2 } Fl_Button scaleClose { label Close callback {// saveWin(synth, microtonaluiwindow->w(), microtonaluiwindow->h(), microtonaluiwindow->x(), microtonaluiwindow->y(), false, "Scales"); microtonaluiwindow->hide(); lastscaleSeen = false;} xywh {315 448 67 28} box THIN_UP_BOX down_box THIN_DOWN_BOX color 196 labelcolor 64 } } } Function {send_data(int action, int control, float value, int type, int par = UNUSED, int miscmsg = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, TOPLEVEL::section::scales, UNUSED, UNUSED, UNUSED, par, UNUSED, miscmsg);} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED, int request = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg, request);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; bool wasFromUs = ((getData->data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromGUI); unsigned char control = getData->data.control; unsigned char parameter = getData->data.parameter; unsigned char miscmsg = getData->data.miscmsg; int value_int = lrint(value); bool value_bool = _SYS_::F2B(value); string msg; switch (control) { case SCALES::control::refFrequency: afreqinput->value(value); break; case SCALES::control::refNote: anotecounter->value(value_int); break; case SCALES::control::invertScale: invertKeys->value(value_bool); checkInvert(); break; case SCALES::control::invertedScaleCenter: centerinvertcounter->value(value_int); break; case SCALES::control::scaleShift: scaleShift->value(value_int); break; case SCALES::control::enableMicrotonal: enableMicrotonal->value(value_bool); mappingenabledbutton->value(false); Keymap->deactivate(); checkInvert(); if (value_bool) { microtonalgroup->activate(); } else { microtonalgroup->deactivate(); } break; case SCALES::control::enableKeyboardMap: mappingenabledbutton->value(value_bool); checkInvert(); if (value_bool) Keymap->activate(); else Keymap->deactivate(); break; case SCALES::control::lowKey: firstnotecounter->value(value_int); break; case SCALES::control::middleKey: middlenotecounter->value(value_int); break; case SCALES::control::highKey: lastnotecounter->value(value_int); break; case SCALES::control::tuning: case SCALES::control::importScl: msg = (textMsgBuffer.fetch(miscmsg)); if (value_int > 0) { tuningsinput->value(msg.c_str()); } else if (wasFromUs) errors(value_int, true); break; case SCALES::control::keyboardMap: { // this only uses the mapped notes msg = (textMsgBuffer.fetch(miscmsg)); mappinginput->value(msg.c_str()); } break; case SCALES::control::keymapSize: { // the map size only mapsizecounter->value(value_int); } break; case SCALES::control::importKbm: if (value_int > 0) { // this sets ALL mapping entries mappingenabledbutton->value(true); checkInvert(); Keymap->activate(); msg = (textMsgBuffer.fetch(parameter)); int mapsize = func::string2int(splitline(msg)); mapsizecounter->value(mapsize); firstnotecounter->value(func::string2int(splitline(msg))); lastnotecounter->value(func::string2int(splitline(msg))); middlenotecounter->value(func::string2int(splitline(msg))); anotecounter->value(func::string2int(splitline(msg))); afreqinput->value(func::string2float(splitline(msg))); //octavesizeoutput->value(func::string2float(splitline(msg))); // temporarily disabled //int formalOctave = func::string2float(splitline(msg)); // temporarily disabled string map; for (int i = 0; i < mapsize; ++i) map += (splitline(msg) + char(10)); mappinginput->value(map.c_str()); } else if (wasFromUs) errors(value_int, false); break; case SCALES::control::name: nameinput->value(textMsgBuffer.fetch(miscmsg).c_str()); break; case SCALES::control::comment: commentinput->value(textMsgBuffer.fetch(miscmsg).c_str()); break; case SCALES::control::clearAll: microtonaluiwindow->hide(); make_window(); showScales(); break; }} {} } Function {updateTuningsInput()} {} { code {// char *tmpbuf = new char[100]; tuningsinput->cut(0, tuningsinput->maximum_size()); for (int i = 0; i < microtonal->getoctavesize(); ++i) { string line = ""; microtonal->tuningtoline(i, line); if (!microtonal->octave[i].comment.empty()) { line += " ! "; line += microtonal->octave[i].comment; } line += "\\n"; snprintf(tmpbuf, 100, "%s", line.c_str()); tuningsinput->insert(tmpbuf); } delete [] tmpbuf;} {} } Function {updateMappingInput()} {} { code {// char *tmpbuf = new char[100]; mappinginput->cut(0, tuningsinput->maximum_size()); for (int i = 0; i < microtonal->Pmapsize; ++i) { string line = ""; if ((microtonal->Pmapping[i]) == -1) line = 'x'; else line = to_string(microtonal->Pmapping[i]); if (!microtonal->PmapComment[i].empty()) { line += " ! "; line += microtonal->PmapComment[i]; } line += "\\n"; snprintf(tmpbuf, 100, "%s", line.c_str()); mappinginput->insert(tmpbuf); } delete [] tmpbuf;} {} } Function {splitline(string& page)} {return_type string } { code {// const char ch = 10; string line = ""; do{ size_t pos = page.find(ch); if (pos != string::npos) { line = page.substr(0, pos); page = page.substr(pos + 1, page.length()); } else { line = page; page = ""; func::trimEnds(line); } } while (line[0] == '!'); // don't want comment lines return line;} {} } Function {MicrotonalUI(Microtonal *microtonal_, SynthEngine *synth_)} {} { code {// synth = synth_; microtonal=microtonal_; lastscaleW = 0; lastscaleSeen = false; make_window();} {} } Function {~MicrotonalUI()} {} { code {// if (lastscaleSeen) saveWin(synth, microtonaluiwindow->w(), microtonaluiwindow->h(), microtonaluiwindow->x(), microtonaluiwindow->y(), true, "Scales"); microtonaluiwindow->hide(); delete tuningsinput; delete mappinginput; delete microtonaluiwindow;} {} } Function {showScales()} {} { code {// int fetchX, fetchY, fetchW, fetchH, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Scales"); if (fetchW < scaleDW || fetchH < scaleDH) { fetchW = scaleDW; fetchH = scaleDH; } checkSane(fetchX, fetchY, fetchW, fetchH, scaleDW, scaleDH); microtonaluiwindow->resize(fetchX, fetchY, fetchW, fetchH); lastscaleW = 0; lastscaleSeen = true; microtonaluiwindow->show();} {} } Function {scaleRtext()} {} { code {// if (lastscaleW == microtonaluiwindow->w()) return; lastscaleW = microtonaluiwindow->w(); float dScale = microtonaluiwindow->w() / float(scaleDW); int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); int size14 = int(14 * dScale); invertlabel->labelsize(size12); keyslabel->labelsize(size12); invertKeys->labelsize(size14); centerlabel->labelsize(size11); centerinvertcounter->labelsize(size11); centerinvertcounter->textsize(size12); reflabel->labelsize(size12); notelabel->labelsize(size11); anotecounter->labelsize(size11); anotecounter->textsize(size11); afreqinput->labelsize(size11); afreqinput->textsize(size); AsetBack->labelsize(size14); afreqset->labelsize(size14); nameinput->labelsize(size11); nameinput->textsize(size14); commentinput->labelsize(size11); commentinput->textsize(size14); shiftlabel->labelsize(size11); scaleShift->labelsize(size11); scaleShift->textsize(size12); Tuning->labelsize(size11); tuningsinput->textsize(size14); octavesizeoutput->textsize(size14); importscl->labelsize(size); exportscl->labelsize(size); Keymap->labelsize(size11); mappinginput->textsize(size14); first1->labelsize(size11); first2->labelsize(size11); firstnotecounter->labelsize(size11); firstnotecounter->textsize(size11); middle1->labelsize(size11); middle2->labelsize(size11); middlenotecounter->labelsize(size11); middlenotecounter->textsize(size11); last1->labelsize(size11); last2->labelsize(size11); lastnotecounter->labelsize(size11); lastnotecounter->textsize(size11); mapsizecounter->labelsize(size11); mapsizecounter->textsize(size11); importkbm->labelsize(size); exportkbm->labelsize(size); mappingenabledbutton->labelsize(size14); retunebutton->labelsize(size14); clearbutton->labelsize(size14); enablelabel->labelsize(size12); microtonallabel->labelsize(size12); enableMicrotonal->labelsize(size14); scaleClose->labelsize(size14); microtonaluiwindow->redraw();} {} } Function {retune()} {} { code {// int value = microtonal->texttotunings(tuningsinput->value()); if (value < 1) { errors(value, true); return; } octavesizeoutput->do_callback(); send_data(TOPLEVEL::action::lowPrio, SCALES::control::keymapSize, mapsizecounter->value(), TOPLEVEL::type::Integer); value = microtonal->texttomapping(mappinginput->value()); if (value < 0) { errors(value, false); return; } anotecounter->do_callback();} {} } Function {checkInvert()} {} { code {// if (!invertKeys->value()) centerinvertcounter->deactivate(); else centerinvertcounter->activate();} {} } Function {errors(int value, bool type)} {} { code {// string message; if (type) message = "Tuning: "; else message = "Keymap: "; /* TODO sort this! * no response to 'type' always Tuning" we always see this: "Must be numbers (like 232.59) or divisions (like 121/64)" Keymap should see this "Invalid characters" */ // incoming negative values inverted for text list alert(synth, message + scale_errors[0 - value]);} {} } decl {Microtonal *microtonal;} {private local } decl {string winlabel;} {private local } decl {SynthEngine *synth;} {private local } decl {float refFreq;} {private local } decl {int scaleDW;} {private local } decl {int scaleDH;} {private local } decl {int lastscaleW;} {public local } decl {bool lastscaleSeen;} {private local } } yoshimi-2.3.5.1/src/UI/MidiLearnUI.fl000066400000000000000000000577561506652756400171360ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {MidiLearnUI.h} {not_in_source in_header } comment {MidiLearnUI.cc} {in_source not_in_header } comment {Copyright (C) 2016-2024, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. } {selected in_source in_header } decl {\#include \#include "Misc/Config.h" \#include "Misc/SynthEngine.h"} {private global } decl {\#include "MasterUI.h"} {private global } decl {\#include "Misc/SynthEngine.h"} {private local } decl {\#include "UI/MiscGui.h" \#include "EffUI.h" \#include "BankUI.h" \#include "ADnoteUI.h" \#include "SUBnoteUI.h" \#include "PADnoteUI.h" \#include "UI/WidgetMWSlider.h" \#include "UI/WidgetSpinner.h" \#include "UI/WidgetCheckButton.h" \#include "UI/ScaleTrackedWindow.h" \#include "Params/Controller.h"} {public global } decl {\#include \#include using std::vector; using std::to_string;} {private global } decl {\#include "Misc/FileMgrFuncs.h" using file::findLeafName;} {private local } decl {\#include "Misc/FormatFuncs.h" using func::asHexString;} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } class MidiLearnKitItem {: {public Fl_Group} } { Function {make_window()} {} { Fl_Window midilearnkititem { xywh {357 541 825 20} type Double hide class Fl_Group } { Fl_Group midilearnkititemgroup { xywh {56 -4 745 23} box FLAT_BOX } { Fl_Spinner CCcounter { callback {send_data(0, MIDILEARN::control::CCorChannel);} tooltip {Continuous Controller to recognise} xywh {80 0 43 15} labelsize 12 minimum 0 maximum 129 value 14 textsize 12 textcolor 64 class WidgetSpinner } Fl_Button {} { callback {// does nothing - hides CC arrows} xywh {112 0 15 16} box FLAT_BOX down_box FLAT_BOX } Fl_Button nrpn { label {8888 h} tooltip {NRPN value} xywh {76 0 49 15} box THIN_DOWN_BOX down_box THIN_DOWN_BOX color 247 selection_color 7 labelsize 12 labelcolor 64 hide } Fl_Button sevenbit { callback {// if (o->value() != 0) o->value(0); else o->value(1); send_data(0, MIDILEARN::control::sevenBit);} tooltip {Set for 7bit NRPN} xywh {61 1 10 13} box DOWN_BOX color 44 selection_color 91 labelcolor 64 hide } Fl_Choice channelchoice { callback {send_data(0, 48);} tooltip {Incoming channel} xywh {137 0 39 15} down_box BORDER_BOX selection_color 49 labelsize 12 labelcolor 64 textsize 12 textcolor 64 } { MenuItem chan1 { label 1 xywh {0 0 26 15} labelsize 11 } MenuItem chan2 { label 2 xywh {10 10 26 15} labelsize 11 } MenuItem chan3 { label 3 xywh {20 20 26 15} labelsize 11 } MenuItem chan4 { label 4 xywh {30 30 26 15} labelsize 11 } MenuItem chan5 { label 5 xywh {40 40 26 15} labelsize 11 } MenuItem chan6 { label 6 xywh {50 50 26 15} labelsize 11 } MenuItem chan7 { label 7 xywh {60 60 26 15} labelsize 11 } MenuItem chan8 { label 8 xywh {70 70 26 15} labelsize 11 } MenuItem chan9 { label 9 xywh {80 80 26 15} labelsize 11 } MenuItem chan10 { label 10 xywh {90 90 26 15} labelsize 11 } MenuItem chan11 { label 11 xywh {100 100 26 15} labelsize 11 } MenuItem chan12 { label 12 xywh {110 110 26 15} labelsize 11 } MenuItem chan13 { label 13 xywh {120 120 26 15} labelsize 11 } MenuItem chan14 { label 14 xywh {130 130 26 15} labelsize 11 } MenuItem chan15 { label 15 xywh {140 140 26 15} labelsize 11 } MenuItem chan16 { label 16 xywh {150 150 26 15} labelsize 11 } MenuItem chanAll { label All xywh {160 160 26 15} labelsize 11 } } Fl_Check_Button compresscheck { callback {// send_data(0, MIDILEARN::control::limit);} tooltip {Limit or compress incoming value} xywh {324 0 15 15} down_box DOWN_BOX selection_color 64 labelfont 1 labelcolor 64 align 4 class Fl_Check_Button2 } Fl_Check_Button blockcheck { callback {// send_data(0, MIDILEARN::control::block);} tooltip {Stop any later lines (or system controls) responding to this CC/Channel pair} xywh {360 0 20 15} down_box DOWN_BOX selection_color 64 labelfont 1 labelcolor 64 align 4 class Fl_Check_Button2 } Fl_Button activity { callback {// if (o->value() != 0) o->value(0); else o->value(1);} tooltip {MIDI incoming} xywh {181 1 10 13} box DOWN_BOX color 44 selection_color 79 } Fl_Spinner minval { callback {send_data(0, MIDILEARN::control::minimum);} tooltip {Minimum % to pass on} xywh {197 0 52 15} type Float labelsize 12 minimum 0 step 0.5 value 0 textsize 12 textcolor 64 class WidgetSpinner } Fl_Button {} { callback {// does nothing - hides Min arrows} xywh {238 0 15 16} box FLAT_BOX down_box FLAT_BOX } Fl_Spinner maxval { callback {// send_data(0, MIDILEARN::control::maximum);} tooltip {Maximum % to pass on} xywh {261 0 52 15} type Float labelsize 12 minimum 0 step 0.5 value 100 textsize 12 textcolor 64 class WidgetSpinner } Fl_Button {} { callback {// does nothing - hides Max arrows} xywh {302 0 15 16} box FLAT_BOX down_box FLAT_BOX } Fl_Button commandName { label text callback {// send_data(0, MIDILEARN::control::deleteLine);} tooltip {To delete, hold CTRL and click here.} xywh {395 0 400 15} box THIN_DOWN_BOX color 247 selection_color 247 labelfont 1 labelsize 10 labelcolor 64 align 64 } } Fl_Check_Button mutecheck { callback {// if (o->value()) midilearnkititemgroup->deactivate(); else midilearnkititemgroup->activate(); send_data(0, MIDILEARN::control::mute);} tooltip {Completely ignore this line} xywh {39 0 21 15} down_box DOWN_BOX selection_color 64 labelfont 1 labelcolor 64 align 4 code0 {o->copy_label(to_string(n + 1).c_str());} class Fl_Check_Button2 } } } Function {send_data(int action, int control)} {} { code {// bool doit = true; int type = 0; int CC = UNUSED; int chan = UNUSED; int min = UNUSED; int max = UNUSED; switch (control) { case MIDILEARN::control::block: if (blockcheck->value() != 0) type = 1; break; case MIDILEARN::control::limit: if (compresscheck->value() != 0) type = 2; break; case MIDILEARN::control::mute: if (mutecheck->value() != 0) type = 4; break; case MIDILEARN::control::sevenBit: if (sevenbit->value() != 0) type = 16; break; case MIDILEARN::control::minimum: min = lrint(minval->value() * 2.0f); break; case MIDILEARN::control::maximum: max = lrint(maxval->value() * 2.0f); break; case MIDILEARN::control::deleteLine: doit = (Fl::event_state(FL_CTRL) != 0); if (doit) doit = (choice(synth, "", "Yes", "No", "Remove line " + to_string( n + 1) + " " + commandName->label() + "?") > 1); break; case MIDILEARN::control::CCorChannel: CC = lrint(CCcounter->value()); break; case 48: chan = lrint(channelchoice->value()); control = MIDILEARN::control::CCorChannel; break; } if (doit) collect_writeData(synth, n, action, type, control, TOPLEVEL::section::midiLearn, CC, chan, min, max, UNUSED, 0);} {} } Function {MidiLearnKitItem(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {n=0;} {} } Function {~MidiLearnKitItem()} {} { code {// midilearnkititem->hide(); delete(midilearnkititem);} {} } Function {init(SynthEngine *synth_, int n_)} {} { code {// synth = synth_; n = n_; make_window(); show(); end();} {} } decl {int n;} {private local } decl {SynthEngine *synth;} {private local } decl {unsigned char stat;} {public local } Function {kitRscale(float dScale)} {} { code {// int size11 = int(11 * dScale); int size12 = int(12 * dScale); int size14 = int(14 * dScale); chan1->labelsize(size11); chan2->labelsize(size11); chan3->labelsize(size11); chan4->labelsize(size11); chan5->labelsize(size11); chan6->labelsize(size11); chan7->labelsize(size11); chan8->labelsize(size11); chan9->labelsize(size11); chan10->labelsize(size11); chan11->labelsize(size11); chan12->labelsize(size11); chan13->labelsize(size11); chan14->labelsize(size11); chan15->labelsize(size11); chan16->labelsize(size11); chanAll->labelsize(size11); CCcounter->labelsize(size12); CCcounter->textsize(size12); nrpn->labelsize(size12); sevenbit->labelsize(size14); channelchoice->labelsize(size12); channelchoice->textsize(size12); compresscheck->labelsize(size14); blockcheck->labelsize(size14); activity->labelsize(size14); minval->labelsize(size12); minval->textsize(size12); maxval->labelsize(size12); maxval->textsize(size12); mutecheck->labelsize(size14); commandName->labelsize(int(10 * dScale)); midilearnkititem->redraw();} {} } } class MidiLearnUI {} { Function {make_window()} {} { Fl_Window midilearnwindow { label {Midi Learn} callback {close->do_callback();} tooltip {Editor for all learned controllers. CTRL-right click on any knob/slider/button to learn. Note: Adding/deleting entries or changing CC/Chan will renumber the lines.} xywh {976 497 820 285} type Double hide resizable code0 {send_data(TOPLEVEL::action::lowPrio, MIDILEARN::control::sendRefreshRequest, 0, 3);} code1 {learnDW = o->w(); learnDH = o->h();} code2 {o->size_range(learnDW, learnDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Scroll kitlist { tooltip {Editor for all learned controllers. CTRL-Right click on any knob/slider/button to learn. Note: Adding/deleting entries or changing CC/Chan will renumber the lines.} xywh {0 15 818 245} type VERTICAL box DOWN_FRAME } {} Fl_Box none { label {No Entries} xywh {290 131 206 44} labelsize 32 labelcolor 64 } Fl_Box mutebox { label Mute xywh {18 0 41 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box ccbox { label CC xywh {80 0 40 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box chanbox { label Chan xywh {139 0 40 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box blockbox { label Block xywh {355 0 50 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box limitbox { label Limit xywh {310 0 48 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box controlbox { label {Control Function} xywh {530 0 130 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box minbox { label {Min %} xywh {200 0 40 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box maxbox { label {Max %} xywh {263 0 40 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Button close { label &Close callback {// saveWin(synth, midilearnwindow->w(), midilearnwindow->h(), midilearnwindow->x(), midilearnwindow->y(), false, "Midi-learn"); midilearnwindow->hide(); learnSeen = false;} xywh {730 262 63 20} box THIN_UP_BOX color 196 labelcolor 64 } Fl_Button load { label Load callback {// string filename = setfiler(synth,"", "", false, TOPLEVEL::XML::MLearn); if (filename.empty()) return; loadMidi(filename);} tooltip {Load complete learned list} xywh {30 264 70 18} box GTK_THIN_UP_BOX down_box DOWN_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button save { label Save callback {// string filename = setfiler(synth,"", "", true, TOPLEVEL::XML::MLearn); if (filename.empty()) return; send_data(0, MIDILEARN::control::saveList, 0, 0, 0, 0, 0, 0, textMsgBuffer.push((string) filename)); recent->activate(); setWindowTitle(findLeafName(filename));} tooltip {Save complete learned list} xywh {130 264 70 18} box GTK_THIN_UP_BOX down_box DOWN_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 deactivate } Fl_Button clear { label Clear callback {// if (choice(synth, "", "Yes", "No", "Remove all entries") < 2) return; send_data(0, MIDILEARN::control::clearAll,0,0); o->deactivate(); setWindowTitle();} tooltip {Remove all entries} xywh {330 264 70 19} box PLASTIC_THIN_UP_BOX down_box DOWN_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 deactivate } Fl_Button recent { label Recent callback {// synth->getGuiMaster()->paramsui->Recent->position(midilearnwindow->x() + recent->x() - 80, midilearnwindow->y() + recent->y() - 187); synth->getGuiMaster()->paramsui->Show(TOPLEVEL::XML::MLearn);} tooltip {Load from recently seen list} xywh {230 264 70 18} box GTK_THIN_UP_BOX down_box DOWN_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 code0 {if (synth->getHistory(TOPLEVEL::XML::MLearn).empty()) o->deactivate(); else o->activate();} } } } Function {showLearn()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Midi-learn"); if (fetchW < learnDW || fetchH < learnDH) { fetchW = learnDW; fetchH = learnDH; } checkSane(fetchX, fetchY, fetchW, fetchH, learnDW, learnDH); midilearnwindow->resize(fetchX, fetchY, fetchW, fetchH); midilearnwindow->show(); learnW = 0; learnSeen = true;} {} } Function {send_data(int action, int control, float value, int type, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int miscmsg = UNUSED)} {} { code {// collect_writeData(synth, value, action, type, control, TOPLEVEL::section::midiLearn, kititem, engine, insert, parameter, UNUSED, miscmsg);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// int value = lrint(getData->data.value); unsigned char type = getData->data.type; unsigned char control = getData->data.control; unsigned char kititem = getData->data.kit; unsigned char engine = getData->data.engine; unsigned char insert = getData->data.insert; unsigned char parameter = getData->data.parameter; unsigned char miscmsg = getData->data.miscmsg; string hex; int nrpnTot; unsigned int IDold; unsigned int IDnew; switch(control) { case MIDILEARN::control::block: break; case MIDILEARN::control::ignoreMove: if (type != UNUSED) // edit line in place { midilearnkititem[value]->blockcheck->value((type & 1) != 0); midilearnkititem[value]->compresscheck->value((type & 2) != 0); midilearnkititem[value]->mutecheck->value((type & 4) != 0); midilearnkititem[value]->sevenbit->value((type & 16) != 0); if (type & 4) // it's muted midilearnkititem[value]->midilearnkititemgroup->deactivate(); else midilearnkititem[value]->midilearnkititemgroup->activate(); } if (kititem != UNUSED) midilearnkititem[value]->CCcounter->value(kititem); if (engine != UNUSED) midilearnkititem[value]->channelchoice->value(engine); if (insert != UNUSED) midilearnkititem[value]->minval->value(insert / 2.0f); if (parameter != UNUSED) midilearnkititem[value]->maxval->value(parameter / 2.0f); break; case MIDILEARN::control::nrpnDetected: // set NRPN fixed value in place nrpnTot = (int(engine) << 8) + (int(kititem)); /* These were stored 8 bit values so must be joined then * split as two 7 bit values to give NRPN msb and lsb */ hex = (asHexString(nrpnTot >> 7)) + " " + (asHexString(nrpnTot & 0x7f)); midilearnkititem[value]->stat |= 0x10; midilearnkititem[value]->nrpn->copy_label(hex.c_str()); midilearnkititem[value]->CCcounter->hide(); midilearnkititem[value]->nrpn->show(); midilearnkititem[value]->sevenbit->show(); break; case MIDILEARN::control::CCorChannel: addLine(getData); break; case MIDILEARN::control::findSize: // not using this yet break; case MIDILEARN::control::sendLearnMessage: synth->getGuiMaster()->setmessage(UNUSED, false, textMsgBuffer.fetch(miscmsg), "Cancel"); break; case MIDILEARN::control::sendRefreshRequest: //midilearnwindow->show(); showLearn(); break; case MIDILEARN::control::reportActivity: // flash LED IDold = kititem | (engine << 8); for (int i = 0; i < MIDI_LEARN_BLOCK; ++ i) { if (midilearnkititem[i] != NULL && midilearnkititem[i]->mutecheck->value() == 0) { unsigned char newchan = midilearnkititem[i]->channelchoice->value(); if (newchan == NUM_MIDI_CHANNELS) // all of them newchan = engine; // force it to match IDnew = (unsigned int)midilearnkititem[i]->CCcounter->value() | (newchan << 8); if (IDold == IDnew && (type & 0x10) == (midilearnkititem[i]->stat & 0x10)) { midilearnkititem[i]->activity->do_callback(); if (midilearnkititem[i]->blockcheck->value() != 0) IDold = 0xffffff; // block following lines } } } break; case MIDILEARN::control::clearAll: clearAll(value == 0); break; case MIDILEARN::control::cancelLearn: synth->getGuiMaster()->setmessage(UNUSED, false, "Learn cancelled", "Close"); break; }} {} } Function {addLine(CommandBlock *getData)} {} { code {// int lineNo = ((int)getData->data.value); int status = getData->data.type; string name = textMsgBuffer.fetch(getData->data.miscmsg); none->hide(); clear->activate(); save->activate(); midilearnkititem[lineNo] = new MidiLearnKitItem(0, 0,818,20,""); midilearnkititem[lineNo]->init(synth, lineNo); kitlist->add(midilearnkititem[lineNo]); midilearnkititem[lineNo]->position(2, 21 + lineNo*20); midilearnkititem[lineNo]->stat = (status & 0x10); midilearnkititem[lineNo]->mutecheck->value(status & 4); midilearnkititem[lineNo]->CCcounter->value(getData->data.kit); midilearnkititem[lineNo]->channelchoice->value(getData->data.engine); midilearnkititem[lineNo]->minval->value(getData->data.insert / 2.0f); midilearnkititem[lineNo]->maxval->value(getData->data.parameter / 2.0f); midilearnkititem[lineNo]->compresscheck->value(status & 2); midilearnkititem[lineNo]->blockcheck->value(status & 1); midilearnkititem[lineNo]->commandName->copy_label(name.c_str()); if (status & 4) midilearnkititem[lineNo]->midilearnkititemgroup->deactivate(); learnW = 0; midilearnwindow->redraw();} {} } Function {MidiLearnUI(SynthEngine *_synth)} {} { code {// synth = _synth; for (int i = 0; i < MIDI_LEARN_BLOCK; ++i) midilearnkititem[i] = NULL; make_window(); setWindowTitle(); learnW = 0; learnSeen = false;} {} } Function {~MidiLearnUI()} {} { code {// if (learnSeen) saveWin(synth, midilearnwindow->w(), midilearnwindow->h(), midilearnwindow->x(), midilearnwindow->y(), true, "Midi-learn"); midilearnwindow->hide(); delete midilearnwindow;} {} } Function {clearAll(bool empty)} {} { code {// kitlist->clear(); for (int i = 0; i < MIDI_LEARN_BLOCK; ++i) midilearnkititem[i] = NULL; if (empty) { none->show(); clear->deactivate(); save->deactivate(); } kitlist->redraw(); kitlist->show();} {} } Function {loadMidi(string file)} {} { code {// send_data(TOPLEVEL::action::forceUpdate, MIDILEARN::control::loadList, 0, 0, 0, 0, 0, 0, textMsgBuffer.push((string) file)); recent->activate(); setWindowTitle(findLeafName(file));} {} } Function {setWindowTitle(string name = "")} {} { code {// if (name > "") name = " - " + name; midilearnwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("MIDI Learn" + name), UNUSED, TOPLEVEL::windowTitle)).c_str());} {} } Function {learnRtext()} {} { code {// if (learnW == midilearnwindow->w()) return; learnW = midilearnwindow->w(); float dScale = midilearnwindow->w() / float(learnDW); int size11 = int(11 * dScale); int size12 = int(12 * dScale); close->labelsize(size12); load->labelsize(size12); save->labelsize(size12); clear->labelsize(size12); recent->labelsize(size12); mutebox->labelsize(size11); ccbox->labelsize(size11); chanbox->labelsize(size11); blockbox->labelsize(size11); limitbox->labelsize(size11); controlbox->labelsize(size11); minbox->labelsize(size11); maxbox->labelsize(size11); none->labelsize(int(32 * dScale)); for (int i = 0; i < MIDI_LEARN_BLOCK; ++i) { if (midilearnkititem[i] == NULL) continue; midilearnkititem[i]->kitRscale(dScale); midilearnkititem[i]->resize(2 * dScale, (21 + i * 20) * dScale, 818 * dScale, 20 * dScale); } midilearnwindow->redraw();} {} } decl {int lastkititem;} {public local } decl {SynthEngine *synth;} {private local } decl {MidiLearnKitItem *midilearnkititem[MIDI_LEARN_BLOCK];} {private local } decl {int learnDW;} {private local } decl {int learnDH;} {private local } decl {int learnW;} {public local } decl {bool learnSeen;} {private local } } yoshimi-2.3.5.1/src/UI/MiscGui.cpp000066400000000000000000001600551506652756400165400ustar00rootroot00000000000000/* MiscGui.cpp - common link between GUI and synth Copyright 2016-2023 Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "Misc/SynthEngine.h" #include "Misc/TextMsgBuffer.h" #include "Misc/NumericFuncs.h" #include "Params/RandomWalk.h" #include "MiscGui.h" #include "MasterUI.h" #include #include #include #include #include #include using std::to_string; using std::ostringstream; using func::bpm2text; using func::power; namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); } float collect_readData(SynthEngine *synth, float value, unsigned char control, unsigned char part, unsigned char kititem, unsigned char engine, unsigned char insert, unsigned char parameter, unsigned char offset, unsigned char miscmsg, unsigned char request) { unsigned char type = 0; unsigned char action = TOPLEVEL::action::fromGUI; if (request < TOPLEVEL::type::Limits) type = request | TOPLEVEL::type::Limits; // its a limit test else if (request != UNUSED) action |= request; CommandBlock putData; putData.data.value = value; putData.data.type = type; putData.data.source = action; putData.data.control = control; putData.data.part = part; putData.data.kit = kititem; putData.data.engine = engine; putData.data.insert = insert; putData.data.parameter = parameter; putData.data.offset = offset; putData.data.miscmsg = miscmsg; float result = synth->interchange.readAllData(putData); if (miscmsg != NO_MSG) // outgoing value - we want to read this text result = putData.data.miscmsg; // returned message ID return result; } void collect_writeData(SynthEngine *synth, float value, unsigned char action, unsigned char type, unsigned char control, unsigned char part, unsigned char kititem, unsigned char engine, unsigned char insert, unsigned char parameter, unsigned char offset, unsigned char miscmsg) { if (part < NUM_MIDI_PARTS && engine == PART::engine::padSynth) { if (collect_readData(synth, 0, TOPLEVEL::control::partBusy, part)) { alert(synth, "Part " + to_string(part + 1) + " is busy"); return; } } CommandBlock putData; putData.data.value = value; putData.data.control = control; putData.data.part = part; putData.data.kit = kititem; putData.data.engine = engine; putData.data.insert = insert; putData.data.parameter = parameter; putData.data.offset = offset; putData.data.miscmsg = miscmsg; if (action == TOPLEVEL::action::fromMIDI) type = type | 1; // faking MIDI from virtual keyboard else { if (part != TOPLEVEL::section::midiLearn) { // midilearn UI must pass though un-modified unsigned char typetop = type & (TOPLEVEL::type::Write | TOPLEVEL::type::Integer); unsigned char buttons = Fl::event_button(); if (part == TOPLEVEL::section::main && (control != MAIN::control::volume && control != MAIN::control::detune)) type = 1; if (buttons == 3 && Fl::event_is_click()) { // check range & if learnable float newValue; putData.data.type = 3 | TOPLEVEL::type::Limits; newValue = synth->interchange.readAllData(putData); if (Fl::event_state(FL_CTRL) != 0) { if (putData.data.type & TOPLEVEL::type::Learnable) { // identifying this for button 3 as MIDI learn type = TOPLEVEL::type::LearnRequest; } else { alert(synth, "Can't learn this control"); synth->getRuntime().Log("Can't MIDI-learn this control"); type = TOPLEVEL::type::Learnable; } } else if (insert != TOPLEVEL::insert::filterGroup || parameter == UNUSED) { putData.data.value = newValue; type = TOPLEVEL::type::Write; action |= TOPLEVEL::action::forceUpdate; // has to be write as it's 'set default' } } else if (buttons > 2) type = 1; // change scroll wheel to button 1 type |= typetop; action |= TOPLEVEL::action::fromGUI; } } putData.data.type = type; putData.data.source = action; if (!synth->interchange.fromGUI.write(putData.bytes)) synth->getRuntime().Log("Unable to write to fromGUI buffer."); } void alert(SynthEngine *synth, string message) { synth->getGuiMaster()->query("", "", "", message); } int choice(SynthEngine *synth, string one, string two, string three, string message) { return synth->getGuiMaster()->query(one, two, three, message); } string setfiler(SynthEngine *synth, string title, string name, bool save, int extension) { return synth->getGuiMaster()->setfiler(title, name, save, extension); } string input_text(SynthEngine *synth, string label, string text) { return synth->getGuiMaster()->setinput(label, text); } GuiUpdates::GuiUpdates(InterChange& _interChange, InterfaceAnchor&& connectionData) : interChange{_interChange} , anchor{std::move(connectionData)} { } void GuiUpdates::read_updates(SynthEngine *synth) { CommandBlock getData; while (synth->interchange.toGUI.read(getData.bytes)) { decode_updates(synth, &getData); } // test refresh time /* static int count = 0; static int toggle = false; ++count; if (count > 30) { count = 0; toggle = !toggle; if (toggle) synth->getRuntime().Log("Tick"); else synth->getRuntime().Log("tock"); } */ // and pull up to 5 entries from log for (int i = 0; !synth->getRuntime().logList.empty() && i < 5; ++i) { synth->getGuiMaster()->Log(synth->getRuntime().logList.front()); synth->getRuntime().logList.pop_front(); } } void GuiUpdates::decode_envelope(SynthEngine *synth, CommandBlock *getData) { unsigned char engine = getData->data.engine; unsigned char parameter = getData->data.parameter; if (engine >= PART::engine::addMod1) { switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->adnoteui->advoice->voiceFMampenvgroup) synth->getGuiMaster()->partui->adnoteui->advoice->voiceFMampenvgroup->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->adnoteui->advoice->voiceFMfreqenvgroup) synth->getGuiMaster()->partui->adnoteui->advoice->voiceFMfreqenvgroup->returns_update(getData); break; } } else { switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->adnoteui->advoice->voiceampenvgroup) synth->getGuiMaster()->partui->adnoteui->advoice->voiceampenvgroup->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->adnoteui->advoice->voicefreqenvgroup) synth->getGuiMaster()->partui->adnoteui->advoice->voicefreqenvgroup->returns_update(getData); break; case TOPLEVEL::insertType::filter: if (synth->getGuiMaster()->partui->adnoteui->advoice->voicefilterenvgroup) synth->getGuiMaster()->partui->adnoteui->advoice->voicefilterenvgroup->returns_update(getData); break; } } } void GuiUpdates::decode_updates(SynthEngine *synth, CommandBlock *getData) { uchar control = getData->data.control; uchar npart = getData->data.part; uchar kititem = getData->data.kit; uchar engine = getData->data.engine; uchar insert = getData->data.insert; uchar parameter = getData->data.parameter; uchar miscmsg = getData->data.miscmsg; if (control == TOPLEVEL::control::dataExchange) { if (npart == TOPLEVEL::section::message) {// push data messages via GuiDataExchange -> deliver directly to MirrorData receivers synth->interchange.guiDataExchange.dispatchUpdates(*getData); return; } else if (npart == TOPLEVEL::section::main) {// Global refresh when SynthEngine becomes ready synth->getGuiMaster()->refreshInit(); } } if (control == TOPLEVEL::control::copyPaste) { if (getData->data.type == TOPLEVEL::type::Adjust) return; // just looking if (npart == TOPLEVEL::section::systemEffects || npart == TOPLEVEL::section::insertEffects) { synth->getGuiMaster()->paste(getData); return; } else if (npart <= TOPLEVEL::section::part64) { synth->getGuiMaster()->partui->paste(getData); return; } else { std::cout << "no copy/paste valid" << std::endl; return; } } if (control == TOPLEVEL::control::textMessage) // just show a non-modal message { string name = textMsgBuffer.fetch(miscmsg); if (name.empty()) synth->getGuiMaster()->message->hide(); else synth->getGuiMaster()->setmessage(UNUSED, true, name, "Close"); return; } if (npart == TOPLEVEL::section::scales) { synth->getGuiMaster()->microtonalui->returns_update(getData); return; } if (npart == TOPLEVEL::section::vector) { synth->getGuiMaster()->vectorui->returns_update(getData); return; } if (npart == TOPLEVEL::section::midiLearn && synth->getGuiMaster()->midilearnui != NULL) { synth->getGuiMaster()->midilearnui->returns_update(getData); return; } if (npart == TOPLEVEL::section::midiIn) // catch this early { synth->getGuiMaster()->returns_update(getData); return; } if (npart == TOPLEVEL::section::bank) { synth->getGuiMaster()->bankui->returns_update(getData); return; } bool allowPartUpdate = false; int GUIpart = synth->getGuiMaster()->npartcounter->value() -1; if (GUIpart == npart) { allowPartUpdate = true; } if (npart != TOPLEVEL::section::main && kititem >= EFFECT::type::none && kititem < EFFECT::type::count) // effects { // maybe we should go to main first? if (npart == TOPLEVEL::section::systemEffects) { // note: prior to processing the returns, a push-update has been sent to the effect-UI if (engine != synth->getGuiMaster()->syseffectui->effNum()) return; if (insert == TOPLEVEL::insert::filterGroup) // dynefilter filter insert synth->getGuiMaster()->syseffectui->fwin_filterui->returns_update(getData); else synth->getGuiMaster()->syseffectui->returns_update(getData); } else if (npart == TOPLEVEL::section::insertEffects) { if (engine != synth->getGuiMaster()->inseffectui->effNum()) return; if (insert == TOPLEVEL::insert::filterGroup) // dynefilter filter insert synth->getGuiMaster()->inseffectui->fwin_filterui->returns_update(getData); else synth->getGuiMaster()->inseffectui->returns_update(getData); } else if (npart < NUM_MIDI_PARTS && allowPartUpdate) { if (engine != synth->getGuiMaster()->partui->inseffectui->effNum()) return; if (insert == TOPLEVEL::insert::filterGroup) // dynefilter filter insert synth->getGuiMaster()->partui->inseffectui->fwin_filterui->returns_update(getData); else synth->getGuiMaster()->partui->inseffectui->returns_update(getData); } return; } if (npart == TOPLEVEL::section::config) { synth->getGuiMaster()->configui->returns_update(getData); return; } if (npart == TOPLEVEL::section::main && control == MAIN::control::exportPadSynthSamples) // special case { npart = parameter & 0x3f; getData->data.part = npart; } if (npart >= TOPLEVEL::section::main) // main / sys / ins { synth->getGuiMaster()->returns_update(getData); return; } /* * we are managing some part-related controls from here */ if (npart < NUM_MIDI_PARTS && (kititem & engine & insert) == UNUSED && allowPartUpdate) { if (synth->getGuiMaster()->part_group_returns(getData)) return; } if (npart >= NUM_MIDI_PARTS || !allowPartUpdate) return; // invalid part number if (kititem >= NUM_KIT_ITEMS && kititem != UNUSED) return; // invalid kit number if (insert != UNUSED || (control != PART::control::enable && control != PART::control::instrumentName)) { if (synth->getGuiMaster()->partui->partname == DEFAULT_NAME) synth->getGuiMaster()->partui->checkEngines(UNTITLED); } if (kititem == UNUSED || insert == TOPLEVEL::insert::kitGroup) // part { Part *part = synth->part[npart]; if (control != PART::control::kitMode && kititem != UNUSED && part->Pkitmode == 0) return; // invalid access synth->getGuiMaster()->partui->returns_update(getData); return; } if (kititem != synth->getGuiMaster()->partui->lastkititem) return; // not for us! if (engine == PART::engine::padSynth) // padsynth { if (synth->getGuiMaster()->partui->padnoteui) { switch (insert) { case UNUSED: synth->getGuiMaster()->partui->padnoteui->returns_update(getData); break; case TOPLEVEL::insert::LFOgroup: switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->padnoteui->amplfo) synth->getGuiMaster()->partui->padnoteui->amplfo->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->padnoteui->freqlfo) synth->getGuiMaster()->partui->padnoteui->freqlfo->returns_update(getData); break; case TOPLEVEL::insertType::filter: if (synth->getGuiMaster()->partui->padnoteui->filterlfo) synth->getGuiMaster()->partui->padnoteui->filterlfo->returns_update(getData); break; } break; case TOPLEVEL::insert::filterGroup: if (synth->getGuiMaster()->partui->padnoteui->filterui) synth->getGuiMaster()->partui->padnoteui->filterui->returns_update(getData); break; case TOPLEVEL::insert::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->padnoteui->ampenv) synth->getGuiMaster()->partui->padnoteui->ampenv->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->padnoteui->freqenv) synth->getGuiMaster()->partui->padnoteui->freqenv->returns_update(getData); break; case TOPLEVEL::insertType::filter: if (synth->getGuiMaster()->partui->padnoteui->filterenv) synth->getGuiMaster()->partui->padnoteui->filterenv->returns_update(getData); break; } break; case TOPLEVEL::insert::oscillatorGroup: case TOPLEVEL::insert::harmonicAmplitude: case TOPLEVEL::insert::harmonicPhase: if (synth->getGuiMaster()->partui->padnoteui->oscui) synth->getGuiMaster()->partui->padnoteui->oscui->returns_update(getData); break; case TOPLEVEL::insert::resonanceGroup: case TOPLEVEL::insert::resonanceGraphInsert: if (synth->getGuiMaster()->partui->padnoteui->resui) synth->getGuiMaster()->partui->padnoteui->resui->returns_update(getData); break; } } else if (miscmsg != NO_MSG) { textMsgBuffer.fetch(miscmsg); // clear any text out. } return; } if (engine == PART::engine::subSynth) // subsynth { if (synth->getGuiMaster()->partui->subnoteui) switch (insert) { case TOPLEVEL::insert::filterGroup: if (synth->getGuiMaster()->partui->subnoteui->filterui) synth->getGuiMaster()->partui->subnoteui->filterui->returns_update(getData); break; case TOPLEVEL::insert::LFOgroup: switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->subnoteui->amplfo) synth->getGuiMaster()->partui->subnoteui->amplfo->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->subnoteui->freqlfogroup) synth->getGuiMaster()->partui->subnoteui->freqlfogroup->returns_update(getData); break; case TOPLEVEL::insertType::filter: if (synth->getGuiMaster()->partui->subnoteui->filterlfo) synth->getGuiMaster()->partui->subnoteui->filterlfo->returns_update(getData); break; } break; case TOPLEVEL::insert::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->subnoteui->ampenv) synth->getGuiMaster()->partui->subnoteui->ampenv->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->subnoteui->freqenvelopegroup) synth->getGuiMaster()->partui->subnoteui->freqenvelopegroup->returns_update(getData); break; case TOPLEVEL::insertType::filter: if (synth->getGuiMaster()->partui->subnoteui->filterenv) synth->getGuiMaster()->partui->subnoteui->filterenv->returns_update(getData); break; case TOPLEVEL::insertType::bandwidth: if (synth->getGuiMaster()->partui->subnoteui->bandwidthenvelopegroup) synth->getGuiMaster()->partui->subnoteui->bandwidthenvelopegroup->returns_update(getData); break; } break; case UNUSED: case TOPLEVEL::insert::harmonicAmplitude: case TOPLEVEL::insert::harmonicBandwidth: synth->getGuiMaster()->partui->subnoteui->returns_update(getData); break; } return; } if (engine >= PART::engine::addVoice1) // addsynth voice / modulator { if (synth->getGuiMaster()->partui->adnoteui) { if (synth->getGuiMaster()->partui->adnoteui->advoice) { switch (insert) { case UNUSED: synth->getGuiMaster()->partui->adnoteui->advoice->returns_update(getData); break; case TOPLEVEL::insert::LFOgroup: switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->adnoteui->advoice->voiceamplfogroup) synth->getGuiMaster()->partui->adnoteui->advoice->voiceamplfogroup->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->adnoteui->advoice->voicefreqlfogroup) synth->getGuiMaster()->partui->adnoteui->advoice->voicefreqlfogroup->returns_update(getData); break; case TOPLEVEL::insertType::filter: if (synth->getGuiMaster()->partui->adnoteui->advoice->voicefilterlfogroup) synth->getGuiMaster()->partui->adnoteui->advoice->voicefilterlfogroup->returns_update(getData); break; } break; case TOPLEVEL::insert::filterGroup: if (synth->getGuiMaster()->partui->adnoteui->advoice->voicefilter) synth->getGuiMaster()->partui->adnoteui->advoice->voicefilter->returns_update(getData); break; case TOPLEVEL::insert::envelopeGroup: decode_envelope(synth, getData); break; case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: decode_envelope(synth, getData); break; case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: decode_envelope(synth, getData); break; case TOPLEVEL::insert::oscillatorGroup: case TOPLEVEL::insert::harmonicAmplitude: case TOPLEVEL::insert::harmonicPhase: if (synth->getGuiMaster()->partui->adnoteui->advoice->oscedit) synth->getGuiMaster()->partui->adnoteui->advoice->oscedit->returns_update(getData); break; } } } return; } if (engine == PART::engine::addSynth) // addsynth base { if (synth->getGuiMaster()->partui->adnoteui) switch (insert) { case UNUSED: synth->getGuiMaster()->partui->adnoteui->returns_update(getData); break; case TOPLEVEL::insert::LFOgroup: switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->adnoteui->amplfo) synth->getGuiMaster()->partui->adnoteui->amplfo->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->adnoteui->freqlfo) synth->getGuiMaster()->partui->adnoteui->freqlfo->returns_update(getData); break; case TOPLEVEL::insertType::filter: if (synth->getGuiMaster()->partui->adnoteui->filterlfo) synth->getGuiMaster()->partui->adnoteui->filterlfo->returns_update(getData); break; } break; case TOPLEVEL::insert::filterGroup: if (synth->getGuiMaster()->partui->adnoteui->filterui) synth->getGuiMaster()->partui->adnoteui->filterui->returns_update(getData); break; case TOPLEVEL::insert::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: case TOPLEVEL::insert::envelopePointChangeDt: case TOPLEVEL::insert::envelopePointChangeVal: switch(parameter) { case TOPLEVEL::insertType::amplitude: if (synth->getGuiMaster()->partui->adnoteui->ampenv) synth->getGuiMaster()->partui->adnoteui->ampenv->returns_update(getData); break; case TOPLEVEL::insertType::frequency: if (synth->getGuiMaster()->partui->adnoteui->freqenv) synth->getGuiMaster()->partui->adnoteui->freqenv->returns_update(getData); break; case TOPLEVEL::insertType::filter: if (synth->getGuiMaster()->partui->adnoteui->filterenv) synth->getGuiMaster()->partui->adnoteui->filterenv->returns_update(getData); break; } break; case TOPLEVEL::insert::resonanceGroup: case TOPLEVEL::insert::resonanceGraphInsert: if (synth->getGuiMaster()->partui->adnoteui->resui) synth->getGuiMaster()->partui->adnoteui->resui->returns_update(getData); break; } return; } } // for setting slider peg colour int setSlider(float current, float normal) { if (lrint(current) == lrint(normal)) return slider_peg_default; else return slider_peg_changed; } // for setting knob pointer colour int setKnob(float current, float normal) { if ((current - normal) < 0.0005 && (normal - current) < 0.0005) return knob_point; else return knob_point_change; } string convert_value(ValueType type, float val) { float f; int i; string s; switch(type) { case VC_plainReverse: return(custom_value_units(127.0f - val,"",1)); case VC_pitchWheel: return(custom_value_units(-val,"",1)); case VC_percent127: // removed offset to get zero W.G. return(custom_value_units(val / 127.0f * 100.0f,"%",1)); case VC_percent128: return(custom_value_units(val / 128.0f * 100.0f+0.05f,"%",1)); case VC_percent255: return(custom_value_units(val / 255.0f * 100.0f+0.05f,"%",1)); case VC_percent64_127: return(custom_value_units((val-64) / 63.0f * 100.0f+0.05f,"%",1)); case VC_PhaseOffset: return(custom_value_units(val / 64.0f * 90.0f,"°",1)); case VC_WaveHarmonicMagnitude: { const string unit = val > 0 ? "% (inverted)" : "%"; const int denom = val >= 0 ? 64 : -63; return(custom_value_units(val / denom * 100.0f,unit,1)); } case VC_GlobalFineDetune: return(custom_value_units((val-64),"cents",1)); case VC_MasterVolume: return(custom_value_units((val-96.0f)/96.0f*40.0f,"dB",1)); case VC_LFOfreq: f = (power<2>(val * 10.0f) - 1.0f) / 12.0f; return variable_prec_units(f, "Hz", 3); case VC_LFOfreqBPM: return bpm2text(val); case VC_LFOdepthFreq: // frequency LFO f=power<2>((int)val/127.0f*11.0f)-1.0f; return variable_prec_units(f, "cents", 2); case VC_LFOdepthAmp: // amplitude LFO return(custom_value_units(val / 127.0f * 200.0f,"%",1)); case VC_LFOdepthFilter: // filter LFO val = (int)val / 127.0f * 4.0f; // 4 octaves f = val * 1200.0f; // cents return variable_prec_units(f, "cents", 2) + "\n(" + custom_value_units(val, "base pos. offset)", 2); case VC_LFOdelay: f = ((int)val) / 127.0f * 4.0f + 0.005f; return(custom_value_units(f,"s",2)); case VC_LFOstartphaseRand: if ((int)val == 0) return("random"); // fallthrough case VC_LFOstartphase: return(custom_value_units(((int)val - 64.0f) / 127.0f * 360.0f, "°")); case VC_EnvelopeDT: // unfortunately converttofree() is not called in time for us to // be able to use env->getdt(), so we have to compute ourselves f = (power<2>(((int)val) / 127.0f * 12.0f) - 1.0f) * 10.0f; if (f >= 1000) return variable_prec_units(f/1000.0f, "s", 2); else return variable_prec_units(f, "ms", 2); case VC_EnvelopeFreqVal: f=(power<2>(6.0f * fabsf((int)val - 64.0f) / 64.0f) -1.0f) * 100.0f; if ((int)val<64) f = -f; return variable_prec_units(f, "cents", 2); case VC_EnvelopeFilterVal: val = ((int)val - 64.0f) / 64.0f; f = val * 7200.0f; // 6 octaves return variable_prec_units(f, "cents", 2) + "\n(" + custom_value_units(val * 6.0f,"base pos. offset)",2); case VC_EnvelopeAmpSusVal: return(custom_value_units((1.0f - (int)val / 127.0f) * MIN_ENVELOPE_DB, "dB", 1)); case VC_EnvelopeLinAmpSusVal: f = 20.0f * log10f((int)val / 127.0f); return variable_prec_units(f, "dB", 2); case VC_EnvelopeBandwidthVal: f = power<2>(10.0f * ((int)val - 64) / 64.0f); return variable_prec_units(f, "x", 4); case VC_FilterFreq0: // AnalogFilter f=power<2>((val / 64.0f - 1.0f) * 5.0f + 9.96578428f); if (f >= 1000.0f) return variable_prec_units(f/1000.0f, "kHz", 2); else return variable_prec_units(f, "Hz", 2); case VC_FilterFreq2: // SVFilter f=power<2>((val / 64.0f - 1.0f) * 5.0f + 9.96578428f); // We have to adjust the freq because of this line // in method SVFilter::computefiltercoefs() (file SVFilter.cpp) // // par.f = freq / synth->samplerate_f * 4.0f; // // Using factor 4.0 instead of the usual 2.0*PI leads to a // different effective cut-off freq, which we will be showing f *= 4.0 / TWOPI; if (f >= 1000.0f) return variable_prec_units(f/1000.0f, "kHz", 2); else return variable_prec_units(f, "Hz", 2); case VC_FilterFreq1: // Formant filter - base position in vowel sequence return(custom_value_units((val / 64.0f - 1.0f) * 5.0f,"x stretch (modulo 1)",2)); case VC_FilterQ: case VC_FilterQAnalogUnused: s.clear(); s += "Q = "; f = expf(powf((int)val / 127.0f, 2.0f) * logf(1000.0f)) - 0.9f; s += variable_prec_units(f, "", 4, true); if (type == VC_FilterQAnalogUnused) s += "(This filter does not use Q)"; return(s); case VC_FilterVelocityAmp: val = (int)val / 127.0 * -6.0; // formant offset value f = power<2>(val + log(1000.0f)/log(2.0f)); // getrealfreq f = log(f/1000.0f)/log(power<2>(1.0f/12.0f))*100.0f; // in cents return custom_value_units(f-0.5, "cents") + "\n(Formant offset: " + custom_value_units(val, "x stretch)",2); case VC_FilterFreqTrack0: s.clear(); s += "standard range is -100 .. +98%\n"; f = (val - 64.0f) / 64.0f * 100.0f; s += custom_value_units(f, "%", 1); return(s); case VC_FilterFreqTrack1: s.clear(); s += "0/+ checked: range is 0 .. 198%\n"; f = val /64.0f * 100.0f; s += custom_value_units(f, "%", 1); return(s); case VC_FormFilterClearness: f = power<10>((val - 32.0f) / 48.0f); return custom_value_units(f, " switch rate",2); case VC_FormFilterSlowness: f = powf(1.0f - (val / 128.0f), 3.0f); return custom_value_units(f, " morph rate",4); case VC_FormFilterStretch: f = powf(0.1f, (val - 32.0f) / 48.0f); return custom_value_units(f, " seq. scale factor",3); case VC_InstrumentVolume: return(custom_value_units(-60.0f*(1.0f-(int)val/96.0f),"dB",1)); case VC_ADDVoiceVolume: if (val < 1) return "-inf dB"; else return(custom_value_units(-60.0f*(1.0f-lrint(val)/127.0f),"dB",1)); case VC_ADDVoiceDelay: if ((int) val == 0) return "No delay"; f = (expf((val/127.0f) * logf(50.0f)) - 1) / 10; if (f >= 1) return variable_prec_units(f, "s", 2, true); else return variable_prec_units(f * 1000, "ms", 1); case VC_PitchBend: if ((int) val == 64) return "Off - no pitch bend"; f = (val - 64) / 24; s = string(f > 0 ? "" : "\n(reversed)"); f = fabsf(f); return custom_value_units(f, "x bend range " + s, 2) + "\n(default: +/- " + custom_value_units(200 * f, "cents )"); case VC_PartVolume: if (val < 0.2f) return "-inf dB"; else return(custom_value_units((val-96.0f)/96.0f*40.0f,"dB",1)); case VC_PartHumaniseDetune: s = "Detune: "; i = (int) val; if (i == 0) return s + "disabled"; else return s + "between 0 and " + to_string(i) + " cents"; case VC_PartHumaniseVelocity: s = "Attenuation: "; i = (int) val; if (i == 0) return s + "disabled"; else return s + "between 0 and " + to_string(i) + "%"; case VC_PanningRandom: return(custom_value_units(val / 63.0f * 100.0f,"%")); case VC_PanningStd: i = lrint(val); if (i==64) return("centered"); else if (i<64) return(custom_value_units((64.0f - i) / 64.0f * 100.0f,"% left")); else return(custom_value_units((i - 64.0f)/63.0f*100.0f,"% right")); case VC_EnvStretch: s.clear(); f = power<2>((int)val/64.0f); s += custom_value_units((int)val/127.0f*100.0f+0.05f,"%",1); if ((int)val!=0) { s += ", ( x"; s += custom_value_units(f+0.005f,"/octave down)",2); } return s; case VC_LFOStretch: s.clear(); i = val; i = (i == 0) ? 1 : (i); // val == 0 is not allowed f = power<2>((i-64.0)/63.0f); s += custom_value_units((i-64.0f)/63.0f*100.0f,"%"); if (i != 64) { s += ", ( x"; s += custom_value_units(f+((f<0) ? (-0.005f) : (0.005f)), "/octave up)",2); } return s; case VC_FreqOffsetHz: f = ((int)val-64.0f)/64.0f; f = 15.0f*(f * sqrtf(fabsf(f))); return(custom_value_units(f+((f<0) ? (-0.005f) : (0.005f)),"Hz",2)); case VC_FixedFreqET: f = power<2>((lrint(val) - 1) / 63.0f) - 1.0f; if (lrint(val) <= 1) /* 0 and 1 are both fixed */ return "Fixed"; else if (lrint(val) <= 64) return custom_value_units(power<2>(f),"x /octave up",2); else return custom_value_units(power<3>(f),"x /octave up",2); case VC_FilterGain: f = ((int)val / 64.0f -1.0f) * 30.0f; // -30..30dB f += (f<0) ? -0.05 : 0.05; return(custom_value_units(f, "dB", 1)); case VC_AmpVelocitySense: i = val; s.clear(); if (i==127) { s += "Velocity sensing disabled."; return(s); } f = power<8>((64.0f - (float)i) / 64.0f); // Max dB range for vel=1 compared to vel=127 s += "Velocity Dynamic Range "; f = -20.0f * logf(powf((1.0f / 127.0f), f)) / log(10.0f); s += variable_prec_units(f, "dB", 2); s += "\nVelocity/2 = "; s += variable_prec_units(f/(-1 * std::log2(127)), "dB", 2); return(s); case VC_BandWidth: f = powf((int)val / 1000.0f, 1.1f); f = power<10>(f * 4.0f) * 0.25f; return variable_prec_units(f, "cents", 2); case VC_SubBandwidth: /* This is only an approximation based on observation. Considering the variability of the synthesis depending on number of filter stages, it seems accurate enough. */ f = power<10>((val - 127.0f) / 127.0f * 4.0f) * 4800; return variable_prec_units(f, "cents", 3); case VC_SubBandwidthRel: f = power<100>(val / 64.0f); return variable_prec_units(f, "x", 3); case VC_SubHarmonicMagnitude: return custom_value_units(val / 127.0f * 100.0f, "%", 1); case VC_SubBandwidthScale: if ((int)val == 0) return "Constant"; f = val / 64.0f * 3.0f; return "Factor (100,10k): " + variable_prec_units(power<10>(f), "", 4) + ", " + variable_prec_units(powf(0.1,f), "x", 4); case VC_XFadeUpdate: { unsigned int millisec = logDial2millisec(val); if (millisec > 1000) return variable_prec_units(float(millisec) / 1000, "sec", 1); if (millisec > 0) return variable_prec_units(float(millisec), "ms", 0); else return "off"; break; } case VC_Retrigger: { if (val > 0) val += 2300; // in the UI we remove a socket of 200ms from the dial setting, // to prevent the user from choosing overly fast retriggering // 200ms correspond to the log10 setting of 2300 return convert_value(VC_XFadeUpdate, val); break; } case VC_RandWalkSpread: { double spread = RandomWalk::param2spread(val); if (spread > 1) return variable_prec_units((spread - 1) * 100.0, "%", 1); else return "no random walk."; break; } case VC_FilterVelocitySense: // this is also shown graphically if ((int)val==127) return("off"); else return(custom_value_units(val,"")); break; case VC_FXSysSend: if ((int)val==0) return("-inf dB"); else return(custom_value_units((val-96.0f)/96.0f*40.0f,"dB",1)); case VC_FXEchoVol: // initial volume is set in Echo::setvolume like this f = powf(0.01f, (1.0f - (int)val / 127.0f)) * 4.0f; // in Echo::out this is multiplied by a panning value // which is 0.707 for centered and by 2.0 // in EffectMgr::out it is multiplied by 2.0 once more // so in the end we get f *= 2.828f; // 0.707 * 4 f = 20.0f * logf(f) / logf(10.0f); // Here we are finally return(custom_value_units(f,"dB",1)); case VC_FXEchoDelay: // delay is 0 .. 1.5 sec f = (int)val / 127.0f * 1.5f; return(custom_value_units(f+0.005f,"s",2)); case VC_FXEchoLRdel: s.clear(); // ToDo: It would be nice to calculate the ratio between left // and right. We would need to know the delay time however... f = (power<2>(fabsf((int)val-64.0f)/64.0f*9.0f)-1.0); // ms if ((int)val < 64) { s+="left +"+custom_value_units(f+0.05,"ms",1)+" / "; s+=custom_value_units(-f-0.05,"ms",1)+" right"; } else { s+="left "+custom_value_units(-f-0.05,"ms",1)+" / "; s+="+"+custom_value_units(f+0.05,"ms",1)+" right"; } return(s); case VC_FXEchoDW: s.clear(); f = (int)val / 127.0f; if (f < 0.5f) { f = f * 2.0f; f *= f; // for Reverb and Echo f *= 1.414; // see VC_FXEchoVol for 0.707 * 2.0 f = 20.0f * logf(f) / logf(10.0f); s += "Dry: -0 dB, Wet: " +custom_value_units(f,"dB",1); } else { f = (1.0f - f) * 2.0f; f = 20.0f * logf(f) / logf(10.0f); s += "Dry: " +custom_value_units(f,"dB",1)+", Wet: +3.0 dB"; } return(s); case VC_FXReverbVol: f = powf(0.01f, (1.0f - (int)val / 127.0f)) * 4.0f; f = 20.0f * logf(f) / logf(10.0f); return(custom_value_units(f,"dB",1)); case VC_FXReverbTime: f = power<60>((int)val / 127.0f) - 0.97f; // s return variable_prec_units(f, "s", 2, true); case VC_FXReverbIDelay: f = powf(50.0f * (int)val / 127.0f, 2.0f) - 1.0f; // ms if ((int)f > 0) { if (f<1000.0f) return(custom_value_units(f+0.5f,"ms")); else return(custom_value_units(f/1000.0+0.005f,"s",2)); } else return("0 ms"); case VC_FXReverbHighPass: f = expf(powf((int)val / 127.0f, 0.5f) * logf(10000.0f)) + 20.0f; if ((int)val == 0) return("no high pass"); else if (f<1000.0f) return(custom_value_units(f+0.5f,"Hz")); else return(custom_value_units(f/1000.0f+0.005f,"kHz",2)); case VC_FXReverbLowPass: f = expf(powf((int)val / 127.0f, 0.5f) * logf(25000.0f)) + 40.0f; if ((int)val == 127) return("no low pass"); else if (f<1000.0f) return(custom_value_units(f+0.5f,"Hz")); else return(custom_value_units(f/1000.0f+0.005f,"kHz",2)); case VC_FXReverbDW: s.clear(); f = (int)val / 127.0f; if (f < 0.5f) { f = f * 2.0f; f *= f; // for Reverb and Echo f = 20.0f * logf(f) / logf(10.0f); s += "Dry: -0 dB, Wet: " +custom_value_units(f,"dB",1); } else { f = (1.0f - f) * 2.0f; f = 20.0f * logf(f) / logf(10.0f); s += "Dry: " +custom_value_units(f,"dB",1)+", Wet: -0 dB"; } return(s); case VC_FXReverbBandwidth: f = powf((int)val / 127.0f, 2.0f) * 200.0f; // cents return variable_prec_units(f, "cents", 2, true); case VC_FXdefaultVol: f = ((int)val / 127.0f)*1.414f; f = 20.0f * logf(f) / logf(10.0f); return(custom_value_units(f,"dB",1)); case VC_FXlfofreq: f = (power<2>((int)val / 127.0f * 10.0f) - 1.0f) * 0.03f; return variable_prec_units(f, "Hz", 3); case VC_FXlfofreqBPM: return bpm2text(val / 127.0f); case VC_FXChorusDepth: f = power<8>(((int)val / 127.0f) * 2.0f) -1.0f; //ms return variable_prec_units(f, "ms", 2, true); case VC_FXChorusDelay: f = power<10>(((int)val / 127.0f) * 2.0f) -1.0f; //ms return variable_prec_units(f, "ms", 2, true); case VC_FXdefaultFb: f = (((int)val - 64.0f) / 64.1f) * 100.0f; return(custom_value_units(f,"%")); case VC_FXlfoStereo: f = ((int)val - 64.0f) / 127.0 * 360.0f; if ((int)val == 64) return("equal"); else if (f < 0.0f) return("left +"+custom_value_units(-f,"°")); else return("right +"+custom_value_units(f,"°")); case VC_FXdefaultDW: s.clear(); f = (int)val / 127.0f; if (f < 0.5f) { f = f * 2.0f; f = 20.0f * logf(f) / logf(10.0f); s += "Dry: -0 dB, Wet: " +custom_value_units(f,"dB",1); } else { f = (1.0f - f) * 2.0f; f = 20.0f * logf(f) / logf(10.0f); s += "Dry: " +custom_value_units(f,"dB",1)+", Wet: -0 dB"; } return(s); case VC_FXEQfreq: f = 600.0f * power<30>(((int)val - 64.0f) / 64.0f); if (f >= 1000) return variable_prec_units(f/1000.f, "kHz", 2); else return variable_prec_units(f, "Hz", 2, true); case VC_FXEQq: f = power<30>(((int)val - 64.0f) / 64.0f); return variable_prec_units(f, "", 3, true); case VC_FXEQgain: f = 20.0f - 46.02f*(1.0f - ((int)val / 127.0f)); // simplification of // powf(0.005f, (1.0f - Pvolume / 127.0f)) * 10.0f; // by approximating 0.005^x ~= 10^(-2.301*x) | log10(200)=2.301 // Max. error is below 0.01 which is less than displayed precision return(custom_value_units(f,"dB",1)); case VC_FXEQfilterGain: f = 30.0f * ((int)val - 64.0f) / 64.0f; return(custom_value_units(f,"dB",1)); case VC_plainValue: { /* Avoid trailing space */ ostringstream oss; oss.setf(std::ios_base::fixed); oss.precision(0); oss << val; return string(oss.str()); } case VC_FXDistVol: f = -40.0f * (1.0f - ((int)val / 127.0f)) + 15.05f; return(custom_value_units(f,"dB",1)); case VC_FXDistLevel: f = 60.0f * (int)val / 127.0f - 40.0f; return(custom_value_units(f,"dB",1)); case VC_FXDistLowPass: f = expf(powf((int)val / 127.0f, 0.5f) * logf(25000.0f)) + 40.0f; if (f<1000.0f) return(custom_value_units(f+0.5f,"Hz")); else return(custom_value_units(f/1000.0f+0.005f,"kHz",2)); case VC_FXDistHighPass: f = expf(powf((int)val / 127.0f, 0.5f) * logf(25000.0f)) + 20.0f; if (f<1000.0f) return(custom_value_units(f+0.5f,"Hz")); else return(custom_value_units(f/1000.0f+0.005f,"kHz",2)); } // avoid compiler warning return(custom_value_units(val,"")); } void custom_graph_dimensions(ValueType vt, int& w, int& h) { switch(vt) { case VC_FilterVelocitySense: w = 128; h = 64; break; case VC_SubBandwidthScale: w = 256; h = 128; break; case VC_FormFilterClearness: w = 128; h = 128; break; default: w = 0; h = 0; break; } } inline void grid(int x, int y, int w, int h, int sections) { fl_color(tooltip_grid); int j = 1; int gDist = h / sections; for (; j < sections; j++) /* Vertical */ { fl_line(x, y - gDist * j, x + w, y - gDist * j); } gDist = w / sections; for (j = 1; j < sections; j++) /* Horizontal */ { fl_line(x + gDist * j, y, x + gDist * j, y - h); } } void custom_graphics(ValueType vt, float val,int W,int H) { int x0,y0,i; int _w, _h; float x,y,p; custom_graph_dimensions(vt, _w, _h); x0 = W / 2 - (_w / 2); y0 = H; switch(vt) { case VC_FilterVelocitySense: { p = power<8>((64.0f-(int)val)/64.0f); /* Grid */ grid(x0,y0,_w,_h, 4); /*Function curve*/ fl_color(tooltip_curve); if ((int)val == 127) { // in this case velF will always return 1.0 y = y0 - _h; fl_line(x0, y, x0 + _w, y); } else { fl_begin_line(); for (i = 0; i < _w; i++) { x = (float)i / (float)_w; y = powf(x,p) * _h; fl_vertex((float)x0 + i, (float)y0 - y); } fl_end_line(); } break; } case VC_FormFilterClearness: { p = power<10>((val - 32.0f) / 48.0f); //clearness param grid(x0,y0,_w,_h,10); fl_color(tooltip_curve); fl_begin_line(); x = 0; float frac = 1.0f / (float)_w; for (i = 0; i < _w; i++) { y = (atanf((x * 2.0f - 1.0f) * p) / atanf(p) + 1.0f) * 0.5f * _h; fl_vertex((float)x0 + i, (float)y0 - y); x += frac; } fl_end_line(); break; } case VC_SubBandwidthScale: { /* The scale centers around the factor 1 vertically and is logarithmic in both dimensions. */ int margin = 28; _h -= margin; _w -= margin * 2; x0 += margin * 1.25; y0 -= margin * 0.75; float cy = y0 - _h / 2; int j = 1; const float lg1020 = log10(20); /* Lower bound = 20hz*/ const float rx = _w / (log10(20000) - lg1020); /* log. width ratio */ const float ry = (_h / 2) / log10(100000); string hzMarkers[] = {"20", "100", "1k", "10k"}; string xMarkers[] = {"x10","x100","x1k","x10k","10%","1%","0.1%","0.01%"}; /* Scale lines */ fl_font(fl_font(),8); for (i = 0; i < 4; i++) /* 10x / 10%, 100x / 1% ... */ { y = ry * (i + 1); fl_color(tooltip_grid); fl_line(x0, cy - y, x0 + _w, cy - y); fl_line(x0, cy + y, x0 + _w, cy + y); fl_color(tooltip_faint_text); fl_draw(xMarkers[i].c_str(), x0 - 28, (cy - y - 4), 24, 12, Fl_Align(FL_ALIGN_RIGHT)); fl_draw(xMarkers[i + 4].c_str(), x0 - 28, (cy + y - 4), 24, 12, Fl_Align(FL_ALIGN_RIGHT)); } /* Hz lines */ fl_color(tooltip_grid); /* Lighter inner lines*/ for (i = 10;i != 0; i *= 10) { for (j = 2; j < 10; j++) { x = x0 + rx * (log10(i * j) - lg1020) + 1; fl_line(x, y0, x, y0 - _h); if (i * j >= 20000) { i = 0; break; } } } fl_font(fl_font(),10); for (i = 0; i < 4; i++) /* 20, 100, 1k, 10k */ { x = x0 + (i == 0 ? 0 : ((float)i + 1 - lg1020) * rx); fl_color(tooltip_major_grid); /* Darker boundary lines */ fl_line(x, y0, x, y0 - _h); fl_color(tooltip_text); fl_draw(hzMarkers[i].c_str(), x - 20, y0 + 4, 40, 12, Fl_Align(FL_ALIGN_CENTER)); } /* Unit marker at the lower right of the graph */ fl_draw("Hz", x0 + _w, y0 + 4, 20, 12, Fl_Align(FL_ALIGN_LEFT)); /* Vertical center line */ fl_color(38); fl_line(x0 - margin, cy, x0 + _w, cy); /* Function curve */ fl_color(tooltip_curve); if ((int)val == 0) { fl_line(x0, cy, x0 + _w, cy); } else { const float p = ((int)val / 64.0f) * 3.0; /* Cairo not necessary, but makes it easier to read the graph */ cairo_t *cr; cairo_surface_t* Xsurface = cairo_xlib_surface_create (fl_display, fl_window, fl_visual->visual, Fl_Window::current()->w(), Fl_Window::current()->h()); cr = cairo_create (Xsurface); cairo_set_source_rgb(cr, 1, 0, 0); cairo_set_line_width(cr, 1.5); cairo_move_to(cr, x0, cy - ry * log10(power<50>(p))); cairo_line_to(cr, x0 + _w, cy - ry * log10(powf(0.05, p))); cairo_stroke(cr); cairo_surface_destroy(Xsurface); cairo_destroy(cr); } break; } default: break; } } string variable_prec_units(float v, const string& u, int maxPrec, bool roundup) { int digits = 0, lim = (int) pow(10,maxPrec); float _v = fabsf(v); while (maxPrec > digits) { if (_v >= lim) break; digits++; lim /= 10; } if (roundup) { v += 5 * power<10>(-(digits + 1)); } return custom_value_units(v, u, digits); } string custom_value_units(float v, const string& u, int prec) { ostringstream oss; oss.setf(std::ios_base::fixed); oss.precision(prec); oss << v << " " << u; return(oss.str()); } ValueType getLFOdepthType(int group) { switch(group) { case TOPLEVEL::insertType::amplitude: return(VC_LFOdepthAmp); case TOPLEVEL::insertType::frequency: return(VC_LFOdepthFreq); case TOPLEVEL::insertType::filter: return(VC_LFOdepthFilter); } return(VC_plainValue); } ValueType getLFOFreqType(int bpmEnabled) { return (bpmEnabled == 0) ? VC_LFOfreq : VC_LFOfreqBPM; } ValueType getFilterFreqType(int type) { switch(type) { case 0: return(VC_FilterFreq0); case 1: return(VC_FilterFreq1); case 2: return(VC_FilterFreq2); } return(VC_plainValue); } ValueType getFilterFreqTrackType(int offset) { switch(offset) { case 0: return(VC_FilterFreqTrack0); default: return(VC_FilterFreqTrack1); } } /** convert a milliseconds value to a logarithmic dial setting */ int millisec2logDial(unsigned int ms) { return ms==0? -1 : log10f(float(ms)) * 1000; } /** convert setting from a logarithmic dial back to milliseconds */ unsigned int logDial2millisec(int dial) { return dial<0? 0 : power<10>(dial / 1000.0f) + 0.5; } yoshimi-2.3.5.1/src/UI/MiscGui.h000066400000000000000000000251651506652756400162070ustar00rootroot00000000000000/* MiscGui.h - common link between GUI and synth Copyright 2016-2023 Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef MISCGUI_H #define MISCGUI_H #include #include "Misc/SynthEngine.h" #include "Misc/FileMgrFuncs.h" #include "Misc/FormatFuncs.h" #include "Misc/MirrorData.h" #include "UI/Themes.h" #include "Interface/InterfaceAnchor.h" using RoutingTag = GuiDataExchange::RoutingTag; using file::saveText; using file::loadText; using func::string2int; enum ValueType { VC_plainValue, VC_plainReverse, VC_pitchWheel, VC_percent127, VC_percent128, VC_percent255, VC_percent64_127, VC_PhaseOffset, VC_WaveHarmonicMagnitude, VC_GlobalFineDetune, VC_MasterVolume, VC_LFOfreq, VC_LFOfreqBPM, VC_LFOdepthFreq, VC_LFOdepthAmp, VC_LFOdepthFilter, VC_LFOdelay, VC_LFOstartphase, VC_LFOstartphaseRand, VC_EnvelopeDT, VC_EnvelopeFreqVal, VC_EnvelopeFilterVal, VC_EnvelopeAmpSusVal, VC_EnvelopeLinAmpSusVal, VC_EnvelopeBandwidthVal, VC_FilterFreq0, // Analog VC_FilterFreq1, // Formant VC_FilterFreq2, // StateVar VC_FilterFreqTrack0, VC_FilterFreqTrack1, VC_FilterQ, VC_FilterVelocityAmp, VC_FilterVelocitySense, VC_FormFilterClearness, VC_FormFilterSlowness, VC_FormFilterStretch, VC_InstrumentVolume, VC_ADDVoiceVolume, VC_ADDVoiceDelay, VC_PitchBend, VC_PartVolume, VC_PartHumaniseDetune, VC_PartHumaniseVelocity, VC_PanningRandom, VC_PanningStd, VC_EnvStretch, VC_LFOStretch, VC_FreqOffsetHz, VC_FixedFreqET, VC_FilterGain, VC_AmpVelocitySense, VC_FilterQAnalogUnused, VC_BandWidth, VC_SubBandwidth, VC_SubBandwidthScale, VC_SubBandwidthRel, VC_SubHarmonicMagnitude, VC_FXSysSend, VC_FXEchoVol, VC_FXEchoDelay, VC_FXEchoLRdel, VC_FXEchoDW, VC_FXReverbVol, VC_FXReverbTime, VC_FXReverbIDelay, VC_FXReverbHighPass, VC_FXReverbLowPass, VC_FXReverbDW, VC_FXReverbBandwidth, VC_FXdefaultVol, VC_FXdefaultFb, VC_FXChorusDepth, VC_FXChorusDelay, VC_FXlfoStereo, VC_FXlfofreq, VC_FXlfofreqBPM, VC_FXdefaultDW, VC_FXEQfreq, VC_FXEQq, VC_FXEQgain, VC_FXEQfilterGain, VC_FXDistVol, VC_FXDistLevel, VC_FXDistLowPass, VC_FXDistHighPass, VC_XFadeUpdate, VC_Retrigger, VC_RandWalkSpread, }; float collect_readData(SynthEngine *synth, float value, unsigned char control, unsigned char part, unsigned char kititem = UNUSED, unsigned char engine = UNUSED, unsigned char insert = UNUSED, unsigned char parameter = UNUSED, unsigned char offset = UNUSED, unsigned char miscmsg = UNUSED, unsigned char request = UNUSED); void collect_writeData(SynthEngine *synth, float value, unsigned char action, unsigned char type, unsigned char control, unsigned char part, unsigned char kititem = UNUSED, unsigned char engine = UNUSED, unsigned char insert = UNUSED, unsigned char parameter = UNUSED, unsigned char offset = UNUSED, unsigned char miscmsg = UNUSED); void alert(SynthEngine *synth, string message); int choice(SynthEngine *synth, string one, string two, string three, string message); string setfiler(SynthEngine *synth, string title, string name, bool save, int extension); string input_text(SynthEngine *synth, string label, string text); int setSlider(float current, float normal); int setKnob(float current, float normal); string convert_value(ValueType type, float val); string variable_prec_units(float v, const string& u, int maxPrec, bool roundup = false); string custom_value_units(float v, const string& u, int prec=0); void custom_graph_dimensions(ValueType vt, int& w, int& h); void custom_graphics(ValueType vt, float val,int W,int H); ValueType getLFOdepthType(int group); ValueType getLFOFreqType(int bpmEnabled); ValueType getFilterFreqType(int type); ValueType getFilterFreqTrackType(int offset); int millisec2logDial(unsigned int); unsigned int logDial2millisec(int); /** * Base class mixed into MasterUI, which is the root of the Yoshimi FLTK UI. * Provides functions to establish communication with the Core. */ class GuiUpdates { protected: GuiUpdates(InterChange&, InterfaceAnchor&&); // must not be copied nor moved GuiUpdates(GuiUpdates &&) =delete; GuiUpdates(GuiUpdates const&) =delete; GuiUpdates& operator=(GuiUpdates &&) =delete; GuiUpdates& operator=(GuiUpdates const&) =delete; void read_updates(SynthEngine *synth); public: InterChange& interChange; InterfaceAnchor anchor; auto connectSysEffect() { return GuiDataExchange::Connection(interChange.guiDataExchange, anchor.sysEffectParam); } auto connectInsEffect() { return GuiDataExchange::Connection(interChange.guiDataExchange, anchor.insEffectParam); } auto connectPartEffect(){ return GuiDataExchange::Connection(interChange.guiDataExchange, anchor.partEffectParam);} private: void decode_envelope(SynthEngine *synth, CommandBlock *getData); void decode_updates(SynthEngine *synth, CommandBlock *getData); }; inline void saveWin(SynthEngine *synth, int w, int h, int x, int y, int o, std::string filename) { std::string ID = std::to_string(synth->getUniqueId()) + "-"; std::string values = std::to_string(x) + " " + std::to_string(y) + " " + std::to_string(w) + " " + std::to_string(h) + " " + std::to_string(o); saveText(values, file::configDir() + "/windows/" + ID + filename); } inline void loadWin(SynthEngine *synth, int& w, int& h, int& x, int& y, int& o, std::string filename) { std::string ID = std::to_string(synth->getUniqueId()) + "-"; std::string values = loadText(file::configDir() + "/windows/" + ID + filename); w = h = o = 0; if (values == "") { x = y = 80; } else { size_t pos = values.find(' '); if (pos == string::npos) { x = y = 80; } else { x = string2int(values.substr(0, pos)); if (x < 4) x = 4; y = string2int(values.substr(pos)); if (y < 10) y = 10; pos = values.find(' ', pos + 1); if (pos == string::npos) return; w = string2int(values.substr(pos)); pos = values.find(' ', pos + 1); if (pos == string::npos) return; h = string2int(values.substr(pos)); pos = values.find(' ', pos + 1); if (pos == string::npos) return; o = string2int(values.substr(pos)); } } } inline int lastSeen(SynthEngine *synth, std::string filename) { std::string ID = std::to_string(synth->getUniqueId()) + "-"; std::string values = loadText(file::configDir() + "/windows/" + ID + filename); size_t pos = values.rfind(' '); if (pos == string::npos) return false; ++pos; return string2int(values.substr(pos)); } inline void setVisible(SynthEngine *synth, bool v, std::string filename) { std::string ID = std::to_string(synth->getUniqueId()) + "-"; std::string values = loadText(file::configDir() + "/windows/" + ID + filename); size_t pos = values.rfind(' '); if (pos == string::npos) return; ++ pos; bool vis = string2int(values.substr(pos)); if (vis == v) return; values.replace(pos, 1, std::to_string(v)); saveText(values, file::configDir() + "/windows/" + ID + filename); } inline void checkSane(int& x, int& y, int& w, int& h, int defW, int defH, bool halfsize = false) { int minX, minY, maxW, maxH; Fl::screen_xywh(minX, minY, maxW, maxH, x, y, w, h); // Pretend that this is the center screen, which makes calculations easier. // We will reverse this at the bottom. x -= minX; y -= minY; maxW -= 5; // wiggle room maxH -= 30; // space for minimal titlebar if ((w / defW) != (h / defH)) // ratio w = h / defH * defW; // doesn't matter which one we pick! int adjustW; int adjustH; if(halfsize) { adjustW = maxW / 2; adjustH = maxH / 2; } else { adjustW = maxW; adjustH = maxH; } if (w > maxW || h > maxH) // size { h = adjustH; w = adjustW; if (h / defH > w / defW) { h = w / defW * defH; } else { w = h / defH * defW; } } if ((x + w) > maxW) // position { x = maxW - w; if (x < 5) x = 5; } if ((y + h) > maxH) { y = maxH - h; if (y < 30) y = 30; } // Restore position relative to screen position. x += minX; y += minY; } inline void voiceOscUpdate(SynthEngine *synth_, int npart, int kititem, int nvoice, int &nvs, int &nvp) { SynthEngine *synth = synth_; int extOsc= collect_readData(synth,0,ADDVOICE::control::voiceOscillatorSource, npart, kititem, PART::engine::addVoice1 + nvoice); if (collect_readData(synth,0,ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nvoice) >= 0) { while (collect_readData(synth,0,ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nvs) >= 0) nvp = nvs = collect_readData(synth,0,ADDVOICE::control::externalOscillator, npart, kititem, PART::engine::addVoice1 + nvs); } else if (extOsc >= 0) nvs = extOsc; return; // the original code /*if (pars->VoicePar[nvoice].PVoice >= 0) { while (pars->VoicePar[nvs].PVoice >= 0) nvp = nvs = pars->VoicePar[nvs].PVoice; } else if (pars->VoicePar[nvoice].Pextoscil >= 0) nvs = pars->VoicePar[nvoice].Pextoscil; oscil->changeParams(pars->VoicePar[nvs].POscil); osc->init(oscil,0,pars->VoicePar[nvp].Poscilphase, synth); */ } #endif /*MISCGUI_H*/ yoshimi-2.3.5.1/src/UI/OscilGenUI.fl000066400000000000000000001470411506652756400167600ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {OscilgenUI.h} {not_in_source in_header } comment {OscilgenUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2016-2023 Will Godfrey and others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. } {selected in_source in_header } decl {\#include "ResonanceUI.h"} {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {private local } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include "UI/WidgetPDial.h"} {public local } decl {\#include "UI/WidgetMWSlider.h"} {public local } decl {\#include "UI/ScaleTrackedWindow.h"} {public local } decl {\#include "EnvelopeUI.h"} {public local } decl {\#include "LFOUI.h"} {public local } decl {\#include "FilterUI.h"} {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "Synth/OscilGen.h"} {public local } decl {\#include "Misc/Config.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {public local } decl {\#include "MasterUI.h"} {private global } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include "Misc/NumericFuncs.h" using func::decibel; using func::asDecibel;} {private local } decl {using std::to_string;} {private global } class OscilSpectrum {: {public Fl_Box} } { Function {OscilSpectrum(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {oscilSmp=NULL;} {} } Function {init(OscilGen *oscilSmp_,int oscbase_, SynthEngine *_synth)} {} { code {// synth = _synth; oscilSmp = oscilSmp_; oscbase = oscbase_;} {} } Function {draw()} {} { code {// int ox = x(); int oy = y(); int lx = w(); int ly = h(); const int maxdb = 60; // must be multiple of 10 int GX = 2; int n = lx / GX - 1; if (n > synth->halfoscilsize) n = synth->halfoscilsize; float x; float* spc = new float[n]; for (int i = 0; i < n; ++i) spc[i] = 0.0; if (oscbase == 0) oscilSmp->getOscilSpectrumIntensities(n, spc); else oscilSmp->getBasefuncSpectrumIntensities(n, spc); // normalize float max = 0; for (int i = 0; i < n; ++i) { x = fabsf(spc[i]); if (max < x) max = x; } if (max < 0.000001) max = 1.0; max = max * 1.05; // draw fl_color(graph_Harmonics_grid); /*if (this->active_r()) fl_color(this->parent()->selection_color()); else // never seen this inactive! fl_color(this->parent()->color());*/ for (int i = 1; i < maxdb / 10; ++i) { int ky = int((float)i * ly * 10.0 / maxdb) / 2; ky *= 2; fl_line(ox, oy + ky - 1, ox + lx - 2, oy + ky - 1); } for (int i = 2; i < n; ++i) { int tmp = i * GX - 2; fl_line(ox + tmp, oy + 2, ox + tmp, oy + ly - 2); } if (this->active_r()) fl_color(this->parent()->labelcolor()); else fl_color(this->parent()->color()); // draws the spectrum fl_color(spectrum_line); for (int i = 0; i < n; ++i) { int tmp = i * GX + 2; x = spc[i] / max; if (x > decibel(-maxdb)) x = asDecibel(x) / maxdb + 1; else x = 0; int val = int((ly - 2) * x); if (val > 0) fl_line(ox + tmp, oy + ly - 2 - val, ox + tmp, oy + ly - 2); } delete [] spc;} {} } decl {OscilGen *oscilSmp;} {private local } decl {int oscbase;} {private local } decl {SynthEngine *synth;} {private local } } class PSlider {: {public mwheel_slider} } { Function {PSlider(int x,int y, int w, int h, const char *label=0):mwheel_slider(x,y,w,h,label)} {} { code {;} {} } Function {update_selection_color(int new_value)} {return_type void } { code {const int default_val = 0; // Turn into member variable if needed selection_color(new_value == default_val ? 0 : 222);} {} } Function {value()} {return_type double } { code {return mwheel_slider::value();} {} } Function {value(double val)} {return_type int } { code {update_selection_color((int) val); return mwheel_slider::value(val);} {} } Function {handle(int event)} {return_type int } { code {int X=x(),Y=y(),W=w(),H=h(); int rval = 0; if ((!Fl::event_buttons())|| (event==0)||(Fl::event_shift()==0)) rval = mwheel_slider::handle(event); else if (!Fl::event_inside(X,Y,W,H)) { if (event==FL_DRAG) { mwheel_slider::handle(FL_RELEASE); mwheel_slider::handle(FL_LEAVE); deactivate(); activate(); rval = 1; } else { rval = mwheel_slider::handle(event); } } else { rval = mwheel_slider::handle(FL_PUSH); } update_selection_color((int) value()); return rval;} {} } } class Oscilloscope {: {public Fl_Box} } { Function {Oscilloscope(int x,int y, int w, int h, int frame_, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {// oscilSmp=NULL; phase=64; oscbase=0; frame = frame_;} {} } Function {init(OscilGen *oscilSmp_, SynthEngine *_synth)} {} { code {// synth = _synth; oscilSmp=oscilSmp_;} {} } Function {init(OscilGen *oscilSmp_,int oscbase_, SynthEngine *_synth)} {} { code {// synth = _synth; oscilSmp=oscilSmp_; oscbase=oscbase_;} {} } Function {init(OscilGen *oscilSmp_,int oscbase_,int phase_, SynthEngine *_synth)} {} { code {// synth = _synth; oscilSmp=oscilSmp_; oscbase=oscbase_; phase=phase_;} {} } Function {draw()} {} { code {// int ox = x(); int oy = y(); int lx = w(); int ly = h() - 1; fl_line_style(0, int(1 * ly / float(frame))); fft::Waveform smps(synth->oscilsize); if (oscbase == 0) oscilSmp->displayWaveformForGui(smps); else oscilSmp->displayBasefuncForGui(smps); if (damage() != 1) { fl_color(graph_back); fl_rectf(ox, oy, lx, ly); } // normalize float max = 0; for (int o = 0; o < synth->oscilsize; ++o) { if (max < fabsf(smps[o])) max = fabsf(smps[o]); } if (max < 0.00001) max = 1.0; max = -max * 1.05; // draw if (frame > 20) { if (this->active_r()) fl_color(graph_grid);//fl_color(this->parent()->labelcolor()); else fl_color(graph_back);//fl_color(this->parent()->color()); int GX = 16; if (lx < GX * 3) GX = -1; for (int i = 1; i < GX; i++) { int tmp = int(lx / (float)GX * i); fl_line(ox + tmp, oy + 2, ox + tmp, oy + ly - 2); } int GY = 8; if (ly < GY * 3) GY = -1; for (int i = 1; i < GY; i++) { int tmp = int(ly / (float)GY * i); fl_line(ox + 2, oy + tmp, ox + lx - 2, oy + tmp); } } fl_line_style(0, int(2 * ly / float(frame))); // draw the function fl_line(ox + 2, oy + ly / 2, ox + lx - 2, oy + ly / 2); if (this->active_r()) fl_color(graph_line); else fl_color(graph_grid);//fl_color(this->parent()->labelcolor()); int ph = int((phase - 64.0) / 128.0 * synth->oscilsize_f + synth->oscilsize_f); int lastx, lasty, nextx, nexty; for (int i = 1; i < lx; ++i) { int k = int(synth->oscilsize_f * (i - 1) / lx) + ph; float y = smps[k % synth->oscilsize] / max; nextx = i + ox; nexty = int(y * ly / 2.0) + oy + ly / 2; if (i == 1) fl_line(nextx - 1, int(y * ly / 2.0) + oy + ly / 2, nextx, nexty); else fl_line(lastx, lasty, nextx, nexty); lastx = nextx; lasty = nexty; } fl_line_style(0, 1);} {} } decl {OscilGen *oscilSmp;} {private local } decl {int oscbase;} {private local } decl {int phase;} {public local } decl {int frame;} {public local } decl {SynthEngine *synth;} {private local } } class Oscilharmonic {: {public Fl_Group} } { Function {make_window()} {private } { Fl_Window harmonic { private xywh {329 192 25 225} type Double box NO_BOX labelsize 10 hide class Fl_Group } { Fl_Slider mag { callback {// int x = 64; if (Fl::event_button3()) { if (n == 0) x = 127; o->value(64 - x); } else x = 64 - (int)o->value(); if (n == 0) o->selection_color(setSlider(o->value(),-63)); else o->selection_color(setSlider(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, TOPLEVEL::insert::harmonicAmplitude, n, x, TOPLEVEL::type::Integer);} xywh {0 1 15 122} type {Vert Knob} box FLAT_BOX minimum -63 maximum 64 step 1 code0 {o->value(64 - oscil->Phmag[n]);} code1 {o->setValueType(VC_WaveHarmonicMagnitude); o->useCustomTip(true);} code2 {if (n == 0) o->selection_color(setSlider(o->value(),-63)); else o->selection_color(setSlider(o->value(),0));} class mwheel_slider } Fl_Slider phase { callback {// int x = 64; if (Fl::event_button3()) o->value(0); else x = 64 - (int)o->value(); o->selection_color(setSlider(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, TOPLEVEL::insert::harmonicPhase, n, x, TOPLEVEL::type::Integer);} xywh {0 140 15 82} type {Vert Knob} box FLAT_BOX minimum 64 maximum -63 step 1 code0 {o->value(64 - oscil->Phphase[n]);} code1 {o->setValueType(VC_PhaseOffset); o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider } Fl_Box magblock { xywh {15 60 5 5} box FLAT_BOX color 39 } Fl_Box phaseblock { xywh {15 178 5 5} box FLAT_BOX color 39 } Fl_Box number { xywh {-4 124 36 15} labelfont 1 labelsize 12 align 20 code0 {if (n < 99 || (n & 1) == 0) {char tmp[12]; snprintf(tmp, 12, "%d", n + 1); o->label(strdup(tmp));}} } } } Function {Oscilharmonic(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// n=0; oscil=NULL; display=NULL; applybutton=NULL; cbwidget=NULL;} {} } Function {send_data(int action, int insert, int control, float value, int type)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, engine, insert);} {} } Function {init(OscilParameters *oscil_,int n_,Fl_Group *display_,Fl_Widget *oldosc_,Fl_Widget *cbwidget_,Fl_Widget *applybutton_, SynthEngine *_synth, int npart_, int kititem_, int engine_)} {} { code {// synth = _synth; oscil=oscil_; n=n_; npart = npart_; kititem = kititem_; engine = engine_; display=display_; oldosc=oldosc_; cbwidget=cbwidget_; applybutton=applybutton_; make_window(); end(); harmonic->show();} {} } Function {refresh(int def = 0)} {} { code {// mag->value(64 - oscil->Phmag[n]); mag->selection_color(setSlider(mag->value(),def)); phase->value(64 - oscil->Phphase[n]); phase->selection_color(setSlider(phase->value(),0)); ;} {} } Function {~Oscilharmonic()} {} { code {// harmonic->hide();} {} } decl {OscilParameters *oscil;} {private local } decl {Fl_Group *display;} {private local } decl {int n;} {private local } decl {Fl_Widget *oldosc,*cbwidget,*applybutton;} {private local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int engine;} {private local } } class OscilEditor {: {public PresetsUI_} } { Function {make_window()} {} { Fl_Window osceditUI { label {ADsynth Oscillator Editor} callback {saveWin(synth, osceditUI->w(), osceditUI->h(), osceditUI->x(), osceditUI->y(), false, "Waveform " + to_string(waveType)); OSCseen = false; o->hide();} xywh {188 91 735 595} type Double labelsize 12 hide resizable code0 {string tname;} code1 {setWindowTitle();} code2 {waveDW = o->w() * 9 / 10; waveDH = o->h() * 9 / 10;} code3 {o->size_range(waveDW, waveDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Button applybutton { label Apply callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::applyChanges, 1, TOPLEVEL::type::Integer);} tooltip {Rebuild PADSynth wavetable to pick up changes} xywh {301 281 58 18} box GTK_THIN_UP_BOX color 82 labelfont 1 labelsize 12 labelcolor 64 code0 {if (!forPAD) o->hide();} } Fl_Group oscildisplaygroup { xywh {5 5 360 300} box ENGRAVED_FRAME } { Fl_Group waveformgroup { xywh {10 85 350 190} box THIN_DOWN_BOX color 57 labelcolor 49 code0 {Oscilloscope *osc=new Oscilloscope(o->x(),o->y(),o->w(),o->h(), 170,"");} code1 {osc->init(oscilSmp, synth);} } {} Fl_Group harmonicgroup { xywh {10 30 350 50} box THIN_DOWN_BOX color 57 labelcolor 49 code0 {OscilSpectrum *spc=new OscilSpectrum(o->x(),o->y(),o->w(),o->h(),"");} code1 {spc->init(oscilSmp,0, synth);} } {} Fl_Group {} { xywh {246 277 115 25} box ENGRAVED_BOX code0 {if (forPAD) o->hide();} } { Fl_Choice hrndtype { label {H.rnd} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::harmonicRandomnessType, o->value(), TOPLEVEL::type::Integer);} tooltip {Harmonic Amplitude Randomness} xywh {281 282 50 15} down_box BORDER_BOX labelsize 10 textfont 1 textsize 10 code0 {o->add("None");o->add("Powr");o->add("Sine");} } {} Fl_Dial hrnddial { callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, OSCILLATOR::control::harmonicAmplitudeRandomness, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's harmonic randomness parameter} xywh {338 280 18 18} maximum 127 step 1 code0 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } } } Fl_Box oscilname { label Oscillator xywh {120 10 110 20} labelfont 1 labelsize 12 labelcolor 64 } Fl_Value_Slider rndslider { label {Phase Randomness} callback {// if (Fl::event_button() == 3) o->value(0); o->selection_color(setSlider(o->value(),0)); send_data(0, OSCILLATOR::control::phaseRandomness, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator Phase Randomness: smaller than 0 is "group", larger than 0 is for each harmonic} xywh {140 287 100 14} type {Horz Knob} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 1 minimum -64 maximum 63 step 1 textfont 1 textsize 11 textcolor 64 code0 {if (forPAD) o->hide();} class mwheel_val_slider_rev } Fl_Group basefuncdisplaygroup { xywh {365 5 360 300} box ENGRAVED_FRAME labelcolor 64 } { Fl_Group basewave { xywh {370 85 350 190} box THIN_DOWN_BOX color 57 labelcolor 49 code0 {Oscilloscope *osc=new Oscilloscope(o->x(),o->y(),o->w(),o->h(), 170,"");} code1 {osc->init(oscilSmp,1, synth);} } {} Fl_Dial bfknob { callback {// o->selection_color(setKnob(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::baseFunctionParameter, o->value(), TOPLEVEL::type::Integer);} tooltip {Base Function Parameter} xywh {520 280 20 20} labelcolor 64 minimum -64 maximum 63 step 1 code0 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Choice bftype { label {Base Function} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::baseFunctionType, o->value(), TOPLEVEL::type::Integer);} xywh {370 285 90 15} down_box BORDER_BOX labelsize 10 labelcolor 64 align 1 textfont 1 textsize 11 textcolor 64 code0 {o->add("Sine");o->add("Triangle");o->add("Pulse");o->add("Saw");o->add("Power");o->add("Gauss");o->add("Diode");o->add("AbsSine");o->add("PulseSine");o->add("StrchSine");o->add("Chirp");o->add("AbsStrSine");o->add("Chebyshev");o->add("Square");o->add("Spike");o->add("Circle");o->add("HyperSec");o->add("User");} } {} Fl_Box basename { label {Base Function} xywh {480 10 110 20} box FLAT_BOX labelfont 1 labelsize 12 labelcolor 64 } Fl_Group baseharm { xywh {370 30 350 50} box THIN_DOWN_BOX color 57 labelcolor 49 code0 {OscilSpectrum *spc=new OscilSpectrum (o->x(),o->y(),o->w(),o->h(),"");} code1 {spc->init(oscilSmp,1, synth);} } {} Fl_Box parname { label {Par.} xywh {460 285 30 16} box FLAT_BOX labelsize 11 labelcolor 64 } Fl_Value_Output bfparval { xywh {490 285 28 15} labelsize 12 labelcolor 64 align 20 minimum -63 maximum 63 step 1 textfont 1 textsize 12 textcolor 64 } Fl_Group basefuncmodulation { xywh {550 276 169 25} box ENGRAVED_BOX labelcolor 64 code0 {if ((oscil->Pcurrentbasefunc == OSCILLATOR::wave::sine)||(oscil->Pcurrentbasefunc > OSCILLATOR::wave::hyperSec)) basefuncmodulation->deactivate();} } { Fl_Group baseFuncPars { xywh {652 278 66 21} } { Fl_Dial bfmodpar1 { callback {// o->selection_color(setKnob(o->value(),64)); send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::baseModulationParameter1, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's modulation parameter 1} xywh {654 280 17 17} maximum 127 step 1 code0 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial bfmodpar2 { callback {// o->selection_color(setKnob(o->value(),64)); send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::baseModulationParameter2, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's modulation parameter 2} xywh {676 280 17 17} maximum 127 step 1 code0 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial bfmodpar3 { callback {// o->selection_color(setKnob(o->value(),32)); send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::baseModulationParameter3, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's modulation parameter 3} xywh {698 280 17 17} maximum 127 step 1 code0 {o->selection_color(setKnob(o->value(),32));} class WidgetPDial } } Fl_Choice bfmodtype { label {B.F.Mod.} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::baseModulationType, o->value(), TOPLEVEL::type::Integer);} tooltip {Base function modulation} xywh {599 281 50 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 textfont 1 textsize 10 textcolor 64 code0 {o->add("None");o->add("Rev");o->add("Sine");o->add("Powr");} } {} } } Fl_Output Warning { xywh {224 8 248 20} box FLAT_BOX color 49 align 32 textfont 1 textcolor 129 } Fl_Choice magtype { label {Mag.Type} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::magType, o->value(), TOPLEVEL::type::Integer);} xywh {70 280 65 20} down_box BORDER_BOX selection_color 64 labelsize 11 labelcolor 64 textfont 1 textsize 11 textcolor 64 code0 {o->add("Linear");o->add("-40dB");o->add("-60dB");o->add("-80dB");o->add("-100dB");} } {} Fl_Button useasbase { label {Use as base} callback {// if (choice(synth, "", "Yes", "No", "Make this a base function?\\nThis action is not easily reversed and may cause strange Undo/Redo behaviour.") < 2) return; send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::useAsBaseFunction, autoclearbutton->value() > 0, TOPLEVEL::type::Integer);} tooltip {Use this Oscillator as base function} xywh {5 313 85 20} box THIN_UP_BOX labelfont 1 labelsize 11 labelcolor 64 } Fl_Button oscilClose { label Close callback {// saveWin(synth, osceditUI->w(), osceditUI->h(), osceditUI->x(), osceditUI->y(), false, "Waveform " + to_string(waveType)); OSCseen = false; osceditUI->hide(); if ((Fl::event_button() == 3)) { if (forPAD) synth->getGuiMaster()->partui->padnoteui->padnotewindow->show(); else synth->getGuiMaster()->partui->adnoteui->ADnoteVoice->show(); }} tooltip {Right click: also reopen previous} xywh {668 565 62 25} box THIN_UP_BOX color 196 labelcolor 64 } Fl_Button clearHarm { label Clear callback {// if (choice(synth, "", "Yes", "No", "Clear the harmonics settings?\\n This action can't be reversed and may cause strange Undo/Redo behaviour.") < 2) return; send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::clearHarmonics, o->value(), TOPLEVEL::type::Integer);} xywh {670 503 55 18} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 11 labelcolor 64 } Fl_Group {} { xywh {135 308 150 30} box ENGRAVED_BOX labelcolor 64 } { Fl_Choice wshbutton { label {Wsh.} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::waveshapeType, o->value(), TOPLEVEL::type::Integer);} tooltip {Waveshaping function} xywh {165 313 55 20} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 textfont 1 textsize 10 textcolor 64 code0 {o->add("None");o->add("Atan");o->add("Asym1");o->add("Powr");o->add("Sine");o->add("Qnts");o->add("Zigzg");o->add("Limt");o->add("LimtU");o->add("");o->add("ILimt");o->add("Clip");o->add("Asym2");o->add("Powr2");o->add("Sgm");} } {} Fl_Dial wshpar { callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::waveshapeParameter, o->value(), TOPLEVEL::type::Integer);} tooltip {Waveshaping Parameter} xywh {260 313 20 20} labelcolor 64 minimum -64 maximum 63 step 1 class WidgetPDial } Fl_Value_Output wsparval { xywh {228 316 25 15} labelsize 12 labelcolor 64 minimum -63 maximum 63 step 1 textcolor 64 } } Fl_Light_Button autoclearbutton { label {Clr.} callback {// not used directly now (void) o; // suppress warning //send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::autoClear, o->value(), TOPLEVEL::type::Integer);} tooltip {Auto clear when using the oscillator as base function} xywh {95 313 35 20} box THIN_UP_BOX value 1 labelfont 1 labelsize 10 labelcolor 64 } Fl_Group filterGroup { xywh {285 308 155 30} box ENGRAVED_BOX labelcolor 64 } { Fl_Dial filtervalue1 { callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::filterParameter1, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's filter parameter1} xywh {367 313 20 20} maximum 127 step 1 class WidgetPDial } Fl_Check_Button filterpref { label F callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::filterBeforeWaveshape, o->value(), TOPLEVEL::type::Integer);} tooltip {Apply the filter before the waveshaping} xywh {415 313 20 20} down_box DOWN_BOX labelsize 10 align 24 class Fl_Check_Button2 } Fl_Dial filtervalue2 { callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::filterParameter2, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's filter parameter2} xywh {392 313 20 20} maximum 127 step 1 class WidgetPDial } } Fl_Choice fltbutton { label Filter callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::filterType, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's filter type} xywh {315 313 50 20} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 textfont 1 textsize 10 textcolor 64 code0 {o->add("None");o->add("LP1");o->add("HP1a");o->add("HP1b");o->add("BP1");o->add("BS1");o->add("LP2");o->add("HP2");o->add("BP2");o->add("BS2");o->add("Cosn");o->add("Sine");o->add("LSh");o->add("S");} } {} Fl_Group {} { xywh {594 308 136 30} box ENGRAVED_BOX } { Fl_Choice sabutton { label {Sp.adj.} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::spectrumAdjustType, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's spectrum adjust} xywh {634 313 60 20} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 textfont 1 textsize 10 textcolor 64 code0 {o->add("None");o->add("Pow");o->add("ThrsD");o->add("ThrsU");} } {} Fl_Dial sadjpar { callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::spectrumAdjustParameter, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's spectrum adjust parameter} xywh {699 313 20 20} maximum 127 step 1 class WidgetPDial } } Fl_Group {} { xywh {665 340 65 65} box ENGRAVED_BOX labelcolor 64 } { Fl_Counter harmonicshiftcounter { label {Harmonic Shift} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::harmonicShift, o->value(), TOPLEVEL::type::Integer);} xywh {670 365 55 15} type Simple selection_color 64 labelsize 10 labelcolor 64 align 129 minimum -64 maximum 64 step 1 textfont 1 textsize 10 textcolor 64 } Fl_Check_Button harmonicshiftpre { label {Shift 1st} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::shiftBeforeWaveshapeAndFilter, o->value(), TOPLEVEL::type::Integer);} tooltip {Apply the harmonic shift before the waveshaping and filtering} xywh {668 383 56 20} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 24 class Fl_Check_Button2 } } Fl_Group adaptiveGroup { xywh {665 410 65 90} box ENGRAVED_FRAME labelcolor 64 } { Fl_Dial adhrpow { label pow callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::adaptiveHarmonicsPower, o->value(), TOPLEVEL::type::Integer);} tooltip {Adaptive harmonics power} xywh {700 460 25 25} labelsize 10 labelcolor 64 maximum 200 step 1 class WidgetPDial } Fl_Dial adhrbf { label baseF callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::adaptiveHarmonicsBase, o->value(), TOPLEVEL::type::Integer);} tooltip {Adaptive harmonics base frequency} xywh {670 460 25 25} labelsize 10 labelcolor 64 maximum 255 step 1 class WidgetPDial } Fl_Slider adhrpar { callback {// if (Fl::event_button() == 3) o->value(50); o->selection_color(setSlider(o->value(),50)); send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::adaptiveHarmonicsParameter, o->value(), TOPLEVEL::type::Integer);} tooltip {Adaptive harmonics parameter} xywh {667 444 60 13} type {Horz Knob} box THIN_DOWN_BOX labelcolor 64 maximum 100 step 1 value 50 code0 {o->selection_color(setSlider(o->value(),50));} class mwheel_slider_rev } } Fl_Choice adhrtype { label {Adpt.Harm.} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::adaptiveHarmonicsType, o->value(), TOPLEVEL::type::Integer);} tooltip {The type of the adaptive harmonics} xywh {670 425 55 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 129 when 6 textfont 1 textsize 10 textcolor 64 code0 {o->add("OFF");o->add("ON");o->add("Square");o->add("2xSub");o->add("2xAdd");o->add("3xSub");o->add("3xAdd");o->add("4xSub");o->add("4xAdd");} } {} Fl_Group modulationGroup { xywh {440 308 154 30} box ENGRAVED_BOX labelcolor 64 } { Fl_Dial modpar1 { callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::modulationParameter1, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's modulation parameter 1} xywh {524 314 18 18} labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial modpar2 { callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::modulationParameter2, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's modulation parameter 2} xywh {546 314 18 18} labelcolor 64 maximum 127 step 1 class WidgetPDial } Fl_Dial modpar3 { callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::modulationParameter3, o->value(), TOPLEVEL::type::Integer);} tooltip {Oscillator's modulation parameter 3} xywh {569 314 18 18} labelcolor 64 maximum 127 step 1 class WidgetPDial } } Fl_Choice modtype { label {Mod.} callback {// send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::modulationType, o->value(), TOPLEVEL::type::Integer);} tooltip modulation xywh {470 315 50 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 textfont 1 textsize 10 textcolor 64 code0 {o->add("None");o->add("Rev");o->add("Sine");o->add("Powr");} } {} Fl_Button tosine { label Sine callback {// if (choice(synth, "", "Yes", "No", "Convert to SINE?\\nThis action can't be reversed and may cause strange Undo/Redo behaviour.") < 2) return; send_data(TOPLEVEL::action::forceUpdate, OSCILLATOR::control::convertToSine, o->value(), TOPLEVEL::type::Integer);} xywh {670 524 55 18} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 11 labelcolor 64 } Fl_Button oscilC { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::oscillatorGroup);} xywh {670 545 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button oscilP { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::oscillatorGroup);} xywh {700 545 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Scroll frame { xywh {5 340 660 250} type HORIZONTAL box ENGRAVED_FRAME } { Fl_Pack harmonics { xywh {10 345 650 225} type HORIZONTAL code0 {for (int i=0; ih(),"");h[i]->init(oscil,i,oscildisplaygroup,oldosc,cbwidget,applybutton, synth, npart, kititem, engine);}} } {} } } } Function {send_data(int action, int control, float value, int type)} {} { code {// int insert = TOPLEVEL::insert::oscillatorGroup; if (control == PADSYNTH::control::applyChanges) insert = UNUSED; type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, engine, insert);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; //unsigned char eng = getData->data.engine; unsigned char insert = getData->data.insert; //if (eng != engine) //return; int tmp; bool set = true; bool baseSet = false; int value_int = int(value); if (insert == TOPLEVEL::insert::harmonicAmplitude) { int temp = 64; if (control == 0) temp = 127; h[control]->mag->value(64 - value_int); h[control]->mag->selection_color(setSlider(value_int,temp)); } else if (insert == TOPLEVEL::insert::harmonicPhase) { h[control]->phase->value(64 - value_int); h[control]->phase->selection_color(setSlider(64 - value_int,64)); } else { switch (control) { case OSCILLATOR::control::phaseRandomness: rndslider->value(value); rndslider->selection_color(setSlider(value,0)); break; case OSCILLATOR::control::magType: magtype->value(value); break; case OSCILLATOR::control::harmonicAmplitudeRandomness: hrnddial->value(value); hrnddial->selection_color(setKnob(value,64)); break; case OSCILLATOR::control::harmonicRandomnessType: hrndtype->value(value); if (value < 0.5f) hrnddial->deactivate(); else hrnddial->activate(); break; case OSCILLATOR::control::baseFunctionParameter: bfknob->value(value); bfknob->selection_color(setKnob(value,0)); bfparval->value(value); baseSet = true; break; case OSCILLATOR::control::baseFunctionType: bftype->value(value); if (value < OSCILLATOR::wave::triangle || oscil->Pcurrentbasefunc > OSCILLATOR::wave::hyperSec) { bfknob->deactivate(); basefuncmodulation->deactivate(); } else { bfknob->activate(); basefuncmodulation->activate(); } baseSet = true; break; case OSCILLATOR::control::baseModulationParameter1: bfmodpar1->value(value); bfmodpar1->selection_color(setKnob(value,64)); baseSet = true; redrawoscil(); break; case OSCILLATOR::control::baseModulationParameter2: bfmodpar2->value(value); bfmodpar2->selection_color(setKnob(value,64)); baseSet = true; redrawoscil(); break; case OSCILLATOR::control::baseModulationParameter3: bfmodpar3->value(value); bfmodpar3->selection_color(setKnob(value,32)); baseSet = true; redrawoscil(); break; case OSCILLATOR::control::baseModulationType: bfmodtype->value(value); if (value< 0.5f) baseFuncPars->deactivate(); else baseFuncPars->activate(); baseSet = true; redrawoscil(); break; case OSCILLATOR::control::useAsBaseFunction: bftype->value(OSCILLATOR::wave::hyperSec + 1); tmp = (value != 0); autoclearbutton->value(tmp); if (tmp) { for (int i = 0; imag->value(0); h[i]->mag->selection_color(setSlider(0,0)); // we can fake these h[i]->phase->value(0); h[i]->phase->selection_color(setSlider(0,0)); } h[0]->mag->value(-63); harmonicshiftcounter->value(0); wshbutton->value(0); fltbutton->value(0); sabutton->value(0); } baseSet = true; set = false; break; case OSCILLATOR::control::waveshapeParameter: wshpar->value(value); wshpar->selection_color(setKnob(value,0)); wsparval->value(value); break; case OSCILLATOR::control::waveshapeType: wshbutton->value(value); if (value < 0.5f) wshpar->deactivate(); else wshpar->activate(); break; case OSCILLATOR::control::filterParameter1: filtervalue1->value(value); filtervalue1->selection_color(setKnob(value,64)); break; case OSCILLATOR::control::filterParameter2: filtervalue2->value(value); filtervalue2->selection_color(setKnob(value,64)); break; case OSCILLATOR::control::filterBeforeWaveshape: filterpref->value(value != 0); break; case OSCILLATOR::control::filterType: fltbutton->value((int)value); if (value < 0.5f) filterGroup->deactivate(); else filterGroup->activate(); break; case OSCILLATOR::control::modulationParameter1: modpar1->value(value); modpar1->selection_color(setKnob(value,64)); break; case OSCILLATOR::control::modulationParameter2: modpar2->value(value); modpar2->selection_color(setKnob(value,64)); break; case OSCILLATOR::control::modulationParameter3: modpar3->value(value); modpar3->selection_color(setKnob(value,32)); break; case OSCILLATOR::control::modulationType: modtype->value((int)value); if (value < 0.5f) modulationGroup->deactivate(); else modulationGroup->activate(); break; case OSCILLATOR::control::spectrumAdjustParameter: sadjpar->value(value); sadjpar->selection_color(setKnob(value,64)); break; case OSCILLATOR::control::spectrumAdjustType: sabutton->value((int)value); if (value < 0.5f) sadjpar->deactivate(); else sadjpar->activate(); break; case OSCILLATOR::control::harmonicShift: harmonicshiftcounter->value((int)value); break; case OSCILLATOR::control::clearHarmonicShift: harmonicshiftcounter->value(127); break; case OSCILLATOR::control::shiftBeforeWaveshapeAndFilter: harmonicshiftpre->value(value != 0); break; case OSCILLATOR::control::adaptiveHarmonicsParameter: adhrpar->value(value); adhrpar->selection_color(setSlider(value,50)); break; case OSCILLATOR::control::adaptiveHarmonicsBase: adhrbf->value(value); adhrbf->selection_color(setKnob(value,128)); break; case OSCILLATOR::control::adaptiveHarmonicsPower: adhrpow->value(value); adhrpow->selection_color(setKnob(value,100)); break; case OSCILLATOR::control::adaptiveHarmonicsType: adhrtype->value((int)value); if (value < 0.5f) adaptiveGroup->deactivate(); else adaptiveGroup->activate(); break; case OSCILLATOR::control::clearHarmonics: for (int i = 0; i < MAX_AD_HARMONICS; ++i) { h[i]->mag->value(0); h[i]->mag->selection_color(setSlider(0,0)); // we can fake these h[i]->phase->value(0); h[i]->phase->selection_color(setSlider(0,0)); } h[0]->mag->value(-63); // This is somewhat counter-intuitive. // The sliders don't behave the same way as the code! break; case OSCILLATOR::control::convertToSine: bftype->value(0); h[0]->refresh(-63); for (int i = 1; i < MAX_AD_HARMONICS; ++i) h[i]->refresh(); baseSet = true; set = false; break; default: set = false; } } if (baseSet) { basewave->redraw(); baseharm->redraw(); } if (set) { waveformgroup->redraw(); harmonicgroup->redraw(); oldosc->redraw(); }} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED, int request = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg, request);} {} } Function {OscilEditor(OscilParameters *oscil_, Fl_Widget *oldosc_, Fl_Widget *cbwidget_, Fl_Widget *cbapplywidget_, SynthEngine *_synth, int npart_, int kititem_, int engine_, bool forPAD_ =false)} {} { code {// synth = _synth; npart = npart_; kititem = kititem_; engine = engine_; forPAD = forPAD_; oscil = oscil_; fft = new fft::Calc(synth->oscilsize); oscilSmp = new OscilGen(*fft, NULL, synth, oscil); oldosc = oldosc_; cbwidget = cbwidget_; cbapplywidget=cbapplywidget_; make_window(); refresh(); if (engine == PART::engine::padSynth) waveType = 2; else waveType = 0; int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Waveform " + to_string(waveType)); if (fetchW < waveDW || fetchH < waveDH) { fetchW = waveDW; fetchH = waveDH; } checkSane(fetchX, fetchY, fetchW, fetchH, waveDW, waveDH); osceditUI->resize(fetchX, fetchY, fetchW, fetchH); osceditUI->show(); OSCseen = true;} {} } Function {~OscilEditor()} {return_type virtual } { code {// if (OSCseen) saveWin(synth, osceditUI->w(), osceditUI->h(), osceditUI->x(), osceditUI->y(), true, "Waveform " + to_string(waveType)); osceditUI->hide(); delete (osceditUI); delete oscilSmp; delete fft;} {} } Function {refresh()} {} { code {// // std::cout << "in oscedit" << std::endl; magtype->value(oscil->Phmagtype); rndslider->value(oscil->Prand-64); rndslider->selection_color(setSlider(rndslider->value(),0)); hrndtype->value(oscil->Pamprandtype); if (hrndtype->value() == 0) hrnddial->deactivate(); else hrnddial->activate(); hrnddial->value(oscil->Pamprandpower); hrnddial->selection_color(setKnob(hrnddial->value(),64)); if (oscil->Pcurrentbasefunc > OSCILLATOR::wave::hyperSec) bftype->value(OSCILLATOR::wave::user); else bftype->value(oscil->Pcurrentbasefunc); if (bftype->value() == OSCILLATOR::wave::sine) bfknob->deactivate(); else bfknob->activate(); bfparval->value(oscil->Pbasefuncpar-64); bfknob->value(oscil->Pbasefuncpar-64); bfknob->selection_color(setKnob(bfknob->value(),0)); bfmodtype->value(oscil->Pbasefuncmodulation); if (bfmodtype->value() == 0) baseFuncPars->deactivate(); else baseFuncPars->activate(); bfmodpar1->value(oscil->Pbasefuncmodulationpar1); bfmodpar1->selection_color(setKnob(bfmodpar1->value(),64)); bfmodpar2->value(oscil->Pbasefuncmodulationpar2); bfmodpar2->selection_color(setKnob(bfmodpar2->value(),64)); bfmodpar3->value(oscil->Pbasefuncmodulationpar3); bfmodpar3->selection_color(setKnob(bfmodpar3->value(),32)); wshbutton->value(oscil->Pwaveshapingfunction); if (wshbutton->value() == 0) wshpar->deactivate(); else wshpar->activate(); wsparval->value(oscil->Pwaveshaping-64); wshpar->value(oscil->Pwaveshaping-64); wshpar->selection_color(setKnob(wshpar->value(),0)); fltbutton->value(oscil->Pfiltertype); if (fltbutton->value() == 0) filterGroup->deactivate(); else filterGroup->activate(); filtervalue1->value(oscil->Pfilterpar1); filtervalue1->selection_color(setKnob(filtervalue1->value(),64)); filtervalue2->value(oscil->Pfilterpar2); filtervalue2->selection_color(setKnob(filtervalue2->value(),64)); filterpref->value(oscil->Pfilterbeforews); modtype->value(oscil->Pmodulation); if (modtype->value() == 0) modulationGroup->deactivate(); else modulationGroup->activate(); modpar1->value(oscil->Pmodulationpar1); modpar1->selection_color(setKnob(modpar1->value(),64)); modpar2->value(oscil->Pmodulationpar2); modpar2->selection_color(setKnob(modpar2->value(),64)); modpar3->value(oscil->Pmodulationpar3); modpar3->selection_color(setKnob(modpar3->value(),32)); sabutton->value(oscil->Psatype); if (sabutton->value() == 0) sadjpar->deactivate(); else sadjpar->activate(); sadjpar->value(oscil->Psapar); sadjpar->selection_color(setKnob(sadjpar->value(),64)); harmonicshiftcounter->value(oscil->Pharmonicshift); harmonicshiftpre->value(oscil->Pharmonicshiftfirst); adhrtype->value(oscil->Padaptiveharmonics); if (adhrtype->value() == 0) adaptiveGroup->deactivate(); else adaptiveGroup->activate(); adhrbf->value(oscil->Padaptiveharmonicsbasefreq); adhrbf->selection_color(setKnob(adhrbf->value(),128)); adhrpow->value(oscil->Padaptiveharmonicspower); adhrpow->selection_color(setKnob(adhrpow->value(),100)); adhrpar->value(oscil->Padaptiveharmonicspar); adhrpar->selection_color(setSlider(adhrpar->value(),50)); h[0]->refresh(-63); for (int i=1;irefresh(); oscilSmp->prepare(); basewave->redraw(); baseharm->redraw(); redrawoscil();} {} } Function {setWindowTitle()} {} { code {// string warnType = ""; if (engine == 2) { Warning->hide(); } else { int sourceEngine = -1; if (engine < PART::engine::addMod1) { sourceEngine = fetchData(0, ADDVOICE::control::voiceOscillatorSource,npart,kititem, engine); warnType = "Voice " + to_string(sourceEngine + 1); } else { if (fetchData(0, ADDVOICE::control::externalModulator,npart,kititem, engine) == -1) { sourceEngine = fetchData(0, ADDVOICE::control::modulatorOscillatorSource,npart,kititem, engine); warnType = "Modulator " + to_string(sourceEngine + 1); }; } Warning->redraw(); if (sourceEngine > -1) { Warning->show(); warnType = "WARNING: Editing " + warnType; Warning->value(warnType.c_str()); } else Warning->hide(); } osceditUI->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Oscillator"), npart, TOPLEVEL::windowTitle, kititem, engine)).c_str());} {} } Function {redrawoscil()} {} { code {// waveformgroup->redraw(); harmonicgroup->redraw(); oldosc->redraw(); if (cbwidget!=NULL) { cbwidget->do_callback(); }} {} } Function {waveRtext()} {} { code {// float dScale = osceditUI->w() / float(waveDW * 10 / 9); // waveDW factor adjusted because we allow the // window to be smaller than designed int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); int size14 = int(14 * dScale); applybutton->labelsize(size12); hrndtype->labelsize(size); hrndtype->textsize(size); oscilname->labelsize(size12); rndslider->labelsize(size); rndslider->textsize(size11); bftype->labelsize(size); bftype->textsize(size11); basename->labelsize(size12); parname->labelsize(size11); bfparval->textsize(size12); bfmodtype->labelsize(size); bfmodtype->textsize(size); Warning->textsize(size14); magtype->labelsize(size11); magtype->textsize(size11); useasbase->labelsize(size11); oscilClose->labelsize(size14); clearHarm->labelsize(size11); wshbutton->labelsize(size); wshbutton->textsize(size); wsparval->textsize(size12); autoclearbutton->labelsize(size); filterpref->labelsize(size); fltbutton->labelsize(size); fltbutton->textsize(size); sabutton->labelsize(size); sabutton->textsize(size); harmonicshiftcounter->labelsize(size); harmonicshiftcounter->textsize(size); harmonicshiftpre->labelsize(size); adhrpow->labelsize(size); adhrbf->labelsize(size); adhrpar->textsize(size); adhrtype->labelsize(size); adhrtype->textsize(size); modtype->labelsize(size); modtype->textsize(size); tosine->labelsize(size11); oscilC->labelsize(size); oscilP->labelsize(size); frame->scroll_to(0, 0); frame->scrollbar_size(12 * dScale); harmonics->size(650 * dScale, 235 * dScale); for (int i= 0; i < MAX_AD_HARMONICS; i++) { h[i]->size(20 * dScale, 225 * dScale); h[i]->number->labelsize(size11); } osceditUI->redraw();} {} } decl {OscilParameters *oscil;} {private local } decl {fft::Calc *fft;} {private local } decl {OscilGen *oscilSmp;} {private local } decl {Fl_Widget *oldosc,*cbwidget,*cbapplywidget;} {private local } decl {Oscilharmonic *h[MAX_AD_HARMONICS];} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int engine;} {private local } decl {int waveDW;} {private local } decl {int waveDH;} {private local } decl {int waveType;} {private local } decl {bool OSCseen;} {private local } decl {SynthEngine *synth;} {private local } decl {bool forPAD;} {private local } } yoshimi-2.3.5.1/src/UI/PADnoteUI.fl000066400000000000000000002300041506652756400165370ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0403 header_name {.h} code_name {.cc} comment {PADNoteUI.h} {not_in_source in_header } comment {PADNoteUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2015-2021, Will Godfrey Copyright 2022-2024, Ichthyostega, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code } {selected in_source in_header } decl {\#include \#include \#include \#include "Params/PADnoteParameters.h" \#include "UI/MiscGui.h" \#include "PresetsUI.h" \#include "UI/WidgetPDial.h" \#include "UI/WidgetCheckButton.h" \#include "EnvelopeUI.h" \#include "LFOUI.h" \#include "FilterUI.h"} {private global } decl {\#include "ResonanceUI.h" \#include "OscilGenUI.h"} {public global } decl {\#include using std::unique_ptr; class PADStatus;} {public global } decl {\#include "MasterUI.h"} {private global } decl {\#include "Params/PADStatus.h"} {private local } decl {\#include "Misc/SynthHelper.h" using synth::getDetune;} {private local } decl {\#include "Misc/NumericFuncs.h" using func::decibel; using func::asDecibel; using func::power;} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include "Interface/TextLists.h"} {public local } class PADnoteHarmonicProfile {: {public Fl_Box} } { Function {PADnoteHarmonicProfile(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {pars=NULL;} {} } Function {init(PADnoteParameters *pars)} {} { code {this->pars=pars;} {} } Function {draw()} {} { code {// int ox = x(), oy = y(), lx =w (), ly = h() - 1; if (!visible()) return; std::vector profile = pars->buildProfile(lx); float realbw = pars->calcProfileBandwith(profile); bool active = active_r(); float scale = lx / 430.0f; int rbw = int(realbw * (lx - 1.0) / 2.0); fl_color(pad_equiv_back); //draw the equivalent bandwidth if (active) { fl_line_style(0, int(1 * scale)); for (int i = lx / 2 - rbw; i < (lx / 2 + rbw); i++) fl_line(ox+i, oy, ox+i, oy + ly - 1); } else fl_rectf(ox, oy, lx, ly); fl_color(pad_grid); for (int i = 1; i < 10; i++) { int kx = (int)(lx / 10.0 * i); fl_line(ox + kx, oy, ox + kx, oy + ly - 1); } for (int i = 1; i < 5; i++) { int ky = (int)(ly / 5.0 * i); fl_line(ox, oy + ly - ky, ox + lx, oy + ly - ky - 1); } int step = 2 * scale; fl_line_style(0, step); fl_color(pad_grid_centre); fl_line(ox + lx / 2, oy, ox + lx / 2, oy + ly); //draw the graph if (active) { for (int i = 0; i < lx; i += step) { int val = int((ly - 2) * profile[i]); fl_color(pad_prof_fill); if (val != 0) fl_line(ox + i, oy + ly, ox + i, oy + ly - val); } } int oi = 0; float ov = 0; for (int i = 0; i < lx; i++) { int ni = ox + i; float nv = (ly - 2) * profile[i]; if (active) fl_color(pad_prof_line); else fl_color(pad_prof_inactive); if (i > 0) fl_line(oi, oy + ly - ov, ni, oy + ly - nv); oi = ni; ov = nv; } if (active) fl_color(pad_prof_band); else fl_color(pad_prof_inactive); fl_line(ox + lx / 2 - rbw, oy, ox + lx / 2 - rbw, oy + ly - 1); fl_line(ox + lx / 2 + rbw, oy, ox + lx / 2 + rbw, oy + ly - 1); fl_line_style(0, 1);} {} } decl {PADnoteParameters *pars;} {public local } } class PADnoteOvertonePosition {: {public Fl_Box} } { Function {PADnoteOvertonePosition(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {pars=NULL;} {} } Function {init(PADnoteParameters *pars)} {} { code {synth = & pars->getSynthEngine(); this->pars=pars;} {} } Function {draw()} {} { code {// if (!visible()) return; const int maxdb = 60; int ox = x(), oy = y(), lx = w(), ly = h(); const int maxharmonic = 64; float scale = lx / 525; fl_line_style(0, 1 * scale); for (int i = 1; i < maxharmonic; i++) { fl_color(pad_grid); if (i % 10 == 0) fl_color(46); int kx = (int)(lx / (float)maxharmonic * i); fl_line(ox + kx, oy, ox + kx, oy + ly); } int n = synth->halfoscilsize; float spc[n]; for (int i = 0; i < n; i++) spc[i] = 0.0; pars->oscilgen->getOscilSpectrumIntensities(n, spc); //normalize float max = 0; for (int i = 0; i < n; i++) { float x = fabsf(spc[i]); if (max < x) max=x; } if (max < 0.000001) max = 1.0; max = max * 1.05; float spectrum[lx]; for (int i = 0; i < lx; i++) spectrum[i] = 0; for (int i = 0; i+1 < n; i++) { float nhr = pars->calcHarmonicPositionFactor(i); int kx = (int)(lx / (float)maxharmonic * nhr); if (kx < 0 || kx >= lx) continue; spectrum[kx] = spc[i] / max + 1e-9; } fl_color(pad_harmonic_line); if (pars->Pmode == 2) { int old = 0; for (int i = 1; i < lx; i++) { if ((spectrum[i] > 1e-10) || (i == (lx - 1))) { int delta = i - old; float val1 = spectrum[old]; float val2 = spectrum[i]; float idelta = 1.0 / delta; for (int j = 0; j < delta; j++) { float x = idelta * j; spectrum[old + j] = val1 * (1.0 - x) + val2 * x; } old = i; } } } fl_line_style(0, 2 * scale); for (int i = 0; i < lx; i++) { float x = spectrum[i]; if (x > decibel(-maxdb)) x = asDecibel(x) / maxdb + 1; else continue; int yy = (int)(x * ly); fl_line(ox+i,oy+ly-1-yy,ox+i,oy+ly-1); } fl_line_style(0, 1);} {} } decl {PADnoteParameters *pars;} {public local } decl {SynthEngine *synth;} {private local } } class PADnoteUI {: {public PresetsUI_} } { Function {make_window()} {} { comment {randompan MUST be after panwidth} {in_source in_header } Fl_Window padnotewindow { label {PAD synth Parameters} callback {padClose->do_callback();} xywh {464 151 580 440} type Double hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("PadSynth"), npart, TOPLEVEL::windowTitle, kititem)).c_str());} code1 {padDW = o->w(); padDH = o->h();} code2 {padnotewindow->size_range(padDW, padDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Tabs {} { callback {// if (o->value() != harmonicstructuregroup) { applybutton->hide(); } else { applybutton->show();}} xywh {0 0 580 405} labelcolor 64 } { Fl_Group harmonicstructuregroup { label {Harmonic &Structure} xywh {0 20 580 385} box ENGRAVED_FRAME labelsize 12 labelcolor 64 } { Fl_Group bwprofilegroup { xywh {5 25 90 270} box ENGRAVED_FRAME labelcolor 64 code0 {if (pars->Pmode!=0) o->deactivate();} } { Fl_Choice hpbasetype { label {Base Type} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::baseType, o->value(), TOPLEVEL::type::Integer);} tooltip {Base shape used to widen and spread each harmonic.} xywh {15 42 75 15} down_box BORDER_BOX labelsize 10 labelcolor 64 align 1 textfont 1 textsize 10 textcolor 64 code0 {o->add("Gauss");o->add("Square");o->add("DoubleExp");} code1 {o->value(pars->PProfile.base.type);} } {} Fl_Dial hpbasepar1 { label Width callback {// o->selection_color(setKnob(o->value(),80)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::baseWidth, o->value(), TOPLEVEL::type::Integer);} tooltip {Spread of a single peak within the profile.} xywh {20 72 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PProfile.base.pwidth);} code1 {o->selection_color(setKnob(o->value(),80));} class WidgetPDial } Fl_Dial hpfreqmult { label Repeat callback {// o->selection_color(setKnob(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::frequencyMultiplier, o->value(), TOPLEVEL::type::Integer);} tooltip {Repeat the same base shape multiple times in the generated profile.} xywh {55 72 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PProfile.freqmult);} code1 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Dial hpmpar1 { label Str callback {// o->selection_color(setKnob(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::modulatorStretch, o->value(), TOPLEVEL::type::Integer);} tooltip {Modulate and spread the base shape} xywh {15 112 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PProfile.modulator.pstretch);} code1 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Dial hpmfreq { label Freq callback {// o->selection_color(setKnob(o->value(),30)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::modulatorFrequency, o->value(), TOPLEVEL::type::Integer);} tooltip {Frequency of peaks within modulation of base shape.} xywh {40 112 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PProfile.modulator.freq);} code1 {o->selection_color(setKnob(o->value(),30));} class WidgetPDial } Fl_Dial hpwidth { label Scale callback {// o->selection_color(setKnob(o->value(),127)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::size, o->value(), TOPLEVEL::type::Integer);} tooltip {Squeeze or stretch the profile as a whole. Note: effective only when Autoscale is off} xywh {65 112 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PProfile.width);} code1 {o->selection_color(setKnob(o->value(),127));} class WidgetPDial } Fl_Choice hponehalf { label Profile callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::harmonicSidebands, o->value(), TOPLEVEL::type::Integer);} tooltip {Which part of the profile to use: Full, or only the upper or lower half.} xywh {10 147 80 15} down_box BORDER_BOX labelsize 10 labelcolor 64 align 1 textfont 1 textsize 10 textcolor 64 code0 {o->add("Full");o->add("Upper Half");o->add("Lower Half");} code1 {o->value(pars->PProfile.onehalf);} } {} Fl_Group ampgroup { xywh {10 164 80 105} box BORDER_BOX labelcolor 64 } { Fl_Choice hpampmode { label AmpMode callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::amplitudeMode, o->value(), TOPLEVEL::type::Integer);} tooltip {How to combine secondary modulation with the profile: Sum: XFade, Mult: Filter, Div1: profile/modulator, Div2: modulator/profile} xywh {15 209 70 15} down_box BORDER_BOX labelsize 10 labelcolor 64 align 1 textfont 1 textsize 10 textcolor 64 code0 {o->add("Sum");o->add("Mult");o->add("Div1");o->add("Div2");} code1 {o->value(pars->PProfile.amp.mode);} } {} Fl_Dial hpamppar1 { label Par1 callback {// o->selection_color(setKnob(o->value(),80)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::spectralWidth, o->value(), TOPLEVEL::type::Integer);} tooltip {Squeeze or spread the secondary modulating shape.} xywh {15 239 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PProfile.amp.par1);} code1 {o->selection_color(setKnob(o->value(),80));} class WidgetPDial } Fl_Dial hpamppar2 { label Par2 callback {// o->selection_color(setKnob(o->value(),64)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::spectralAmplitude, o->value(), TOPLEVEL::type::Integer);} tooltip {Degree to fade or combine secondary modulation with the harmonic profile.} xywh {55 239 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PProfile.amp.par2);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } } Fl_Choice hpamptype { label AmpMultiplier callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::amplitudeMultiplier, o->value(), TOPLEVEL::type::Integer);} tooltip {Apply a secondary amplitude modulation on top of the profile built thus far.} xywh {15 179 70 15} down_box BORDER_BOX labelsize 10 labelcolor 64 align 5 textfont 1 textsize 10 textcolor 64 code0 {o->add("Off");o->add("Gauss");o->add("Sine");o->add("Flat");} code1 {o->value(pars->PProfile.amp.type);} code2 {if (_SYS_::F2B(o->value())) ampgroup->activate(); else ampgroup->deactivate();} } {} Fl_Check_Button hpautoscale { label Autoscale callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::autoscale, o->value(), TOPLEVEL::type::Integer);} tooltip {Automatically stretch the profile, so that all shapes yield the same perceptual blurring effect.} xywh {10 274 74 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 code0 {o->value(pars->PProfile.autoscale);} class Fl_Check_Button2 } } Fl_Group {} { xywh {100 155 315 135} box THIN_DOWN_BOX color 57 labelcolor 49 align 6 code0 {osc=new Oscilloscope(o->x(),o->y(),o->w(),o->h(), 130,"");} code1 {osc->init(pars->oscilgen.get(), synth);} } {} Fl_Box cbwidget { label {Harmonic Content} callback {// overtonepos->redraw();} xywh {125 135 205 20} labelsize 12 labelcolor 64 align 16 } Fl_Button resonance { label Resonance callback {// resui->resonancewindow->redraw(); resui->Show(); resui->applybutton->show(); if ((Fl::event_button() == 3)) padnotewindow->hide();} xywh {451 246 85 20} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button waveform { label Waveform callback {// if (oscui!=NULL) delete (oscui); lastWaveW = 0; bool forPAD = true; oscui = new OscilEditor(pars->POscil.get(), osc, cbwidget, applybutton, synth, npart, kititem, PART::engine::padSynth, forPAD); if ((Fl::event_button() == 3)) padnotewindow->hide();} tooltip {Right click: also close this} xywh {451 272 85 20} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Dial bwdial { label BandWidth callback {// o->selection_color(setKnob(o->value(),500)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::bandwidth, o->value(), TOPLEVEL::type::Integer);} tooltip {Effective Bandwidth of the harmonic profile in cents: Transition from the precise waveform to a sonic cloud.} xywh {20 307 35 35} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 1000 step 1 code0 {o->value(pars->Pbandwidth);} code1 {if (pars->Pmode!=0) o->deactivate();} code2 {o->setValueType(VC_BandWidth);} code3 {o->selection_color(setKnob(o->value(),500));} class WidgetPDial } Fl_Value_Output bwcents { label cents xywh {60 320 55 15} labelsize 10 labelcolor 64 align 5 maximum 10000 textsize 11 textcolor 64 code0 {o->step(0.1, 1);} code1 {o->value(pars->getBandwithInCent());} code2 {if (pars->Pmode!=0) o->deactivate();} } Fl_Choice bwscale { label {Bandwidth Scale} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::bandwidthScale, o->value(), TOPLEVEL::type::Integer);} tooltip {Adjust Bandwidth with the increasing frequency of each harmonic. Normal: proportional, EqualHz: constant, InvHalf: reversed decreasing...} xywh {125 315 80 20} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 11 textcolor 64 code0 {o->add("Normal");o->add("EqualHz");o->add("Quarter");o->add("Half");o->add("75%");o->add("150%");o->add("Double");o->add("Inv.Half");} code1 {o->value(pars->Pbwscale);} code2 {if (pars->Pmode!=0) o->deactivate();} } {} Fl_Choice spectrummode { label {Spectrum Mode} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::spectrumMode, o->value(), TOPLEVEL::type::Integer);} tooltip {How to generate the spectrum: Bandwidth: widen each harmonic by a profile, Discrete: no blurring, similar to AddSynth, Continuous: connect outline of all harmonics into a continuous noisy distribution.} xywh {265 315 90 20} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 11 textcolor 64 code0 {o->add("Bandwidth");o->add("Discrete");o->add("Continuous");} code1 {o->value(pars->Pmode);} } {} Fl_Group hrgroup { xywh {360 296 215 50} box ENGRAVED_FRAME } { Fl_Dial hrpospar1 { label Par1 callback {// o->selection_color(setKnob(o->value(),64)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::overtoneParameter1, o->value(), TOPLEVEL::type::Integer);} tooltip {Spread upper harmonics according to the 'OvertonesPosition' type.} xywh {470 315 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 255 step 1 deactivate code0 {o->value(pars->Phrpos.par1);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial hrpospar2 { label Par2 callback {// o->selection_color(setKnob(o->value(),64)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::overtoneParameter2, o->value(), TOPLEVEL::type::Integer);} tooltip {Further variation on the harmonics spread: threshold (ShiftU/L), exponent (Power), frequency (Sine).} xywh {505 315 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 255 step 1 deactivate code0 {o->value(pars->Phrpos.par2);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial hrpospar3 { label ForceH callback {// o->selection_color(setKnob(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::overtoneForceHarmonics, o->value(), TOPLEVEL::type::Integer);} tooltip {Increasingly force each partial towards the next regular harmonic position, reduce the noisiness.} xywh {540 315 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 255 step 1 deactivate code0 {o->value(pars->Phrpos.par3);} code1 {o->setValueType(VC_percent255);} code2 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } } Fl_Choice hrpostype { label OvertonesPosition callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::overtonePosition, o->value(), TOPLEVEL::type::Integer);} tooltip {Shift overtones to non-harmonic positions, to create metallic and noisy flavours.} xywh {370 315 85 20} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 11 textcolor 64 code0 {o->add("Harmonic");o->add("ShiftU");o->add("ShiftL");o->add("PowerU");o->add("PowerL");o->add("Sine");o->add("Power");o->add("Shift");} code1 {o->value(pars->Phrpos.type);} code2 {if (int(o->value() > 0) && int(o->value() < 7)) hrpospar2->activate(); else hrpospar2->deactivate();} } {} Fl_Group overtonepos { xywh {5 350 570 45} box FLAT_BOX color 254 labelcolor 49 code0 {PADnoteOvertonePosition *opui=new PADnoteOvertonePosition(o->x(),o->y(),o->w(),o->h(),"");} code1 {opui->init(pars);} } {} Fl_Choice qbasenote { label base callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::harmonicBase, o->value(), TOPLEVEL::type::Integer);} tooltip {Note value for the lowest wavetable generated.} xywh {419 155 48 20} down_box BORDER_BOX selection_color 64 labelsize 11 labelcolor 64 align 5 textfont 1 textsize 12 textcolor 64 code0 {o->add("C-2");o->add("G-2");o->add("C-3");o->add("G-3");o->add("C-4");o->add("G-4");o->add("C-5");o->add("G-5");o->add("G-6");} code1 {o->value(pars->Pquality.basenote);} } {} Fl_Choice qsmpoct { label {smp/oct} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::samplesPerOctave, o->value(), TOPLEVEL::type::Integer);} tooltip {Number of wavetables generated within each octave.} xywh {472 155 48 20} down_box BORDER_BOX selection_color 64 labelsize 11 labelcolor 64 align 5 textfont 1 textsize 12 textcolor 64 code0 {o->add("0.5");o->add("1");o->add("2");o->add("3");o->add("4");o->add("6");o->add("12");} code1 {o->value(pars->Pquality.smpoct);} } {} Fl_Choice qoct { label {no.oct} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::numberOfOctaves, o->value(), TOPLEVEL::type::Integer);} tooltip {Number of octaves to cover with dedicated wavetables; other note values will sample up/down.} xywh {525 155 50 20} down_box BORDER_BOX selection_color 64 labelsize 11 labelcolor 64 align 5 textfont 1 textsize 12 textcolor 64 code0 {o->add("1");o->add("2");o->add("3");o->add("4");o->add("5");o->add("6");o->add("7");o->add("8");} code1 {o->value(pars->Pquality.oct);} } {} Fl_Box sampleFrame { xywh {418 178 157 64} box EMBOSSED_FRAME labelcolor 64 } Fl_Choice qsamplesize { label {Sample Size} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::sampleSize, o->value(), TOPLEVEL::type::Integer);} tooltip {Size/Resolution of the generated wavetable(s). 128k -> 2.6sec, 1M -> 21sec until repetition of patterns.} xywh {425 193 94 20} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 11 textcolor 64 code0 {o->add("16k (Tiny)");o->add("32k");o->add("64k (Small)");o->add("128k");o->add("256k");o->add("512k");o->add("1M (Big)");} code1 {o->value(pars->Pquality.samplesize);} } {} Fl_Dial xFadeDial { label Crossfade callback {// o->selection_color(setKnob(int(o->value()),2301)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::xFadeUpdate, logDial2millisec(o->value()), TOPLEVEL::type::Integer);} tooltip {cross fade after building new Wavetable} xywh {530 201 32 32} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 minimum -1 maximum 4301 step 1 code0 {int dialSetting = millisec2logDial(pars->PxFadeUpdate); o->value(dialSetting);} code1 {o->selection_color(setKnob(o->value(),2301));} code2 {o->setValueType(VC_XFadeUpdate);} class WidgetPDial } Fl_Button randWalkUI { label Retrigger callback {// show_randWalk(); if ((Fl::event_button() == 3)) padnotewindow->hide();} xywh {425 217 94 20} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 } Fl_Group hprofile { xywh {100 45 475 90} box FLAT_BOX color 254 selection_color 218 labelcolor 63 code0 {PADnoteHarmonicProfile *hpui=new PADnoteHarmonicProfile(o->x(),o->y(),o->w(),o->h(),"");} code1 {hpui->init(pars);} code2 {if (pars->Pmode!=0) { o->deactivate(); o->color(48);};} } {} Fl_Box harmonicprofile { label {Profile of One Harmonic (Frequency Distribution)} xywh {160 25 315 20} labelsize 12 labelcolor 64 } } Fl_Group envelopes { label {Envelopes and &LFOs} xywh {0 20 580 385} box GTK_THIN_UP_BOX labelsize 12 labelcolor 64 hide } { Fl_Box {} { xywh {10 27 275 68} box PLASTIC_UP_BOX color 223 labelcolor 64 } Fl_Group ampgrp { xywh {5 25 285 250} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Dial volume { label Volume callback {// o->selection_color(setKnob(o->value(),90)); send_data(0, PADSYNTH::control::volume, o->value(), TOPLEVEL::type::Integer);} tooltip Volume xywh {30 43 34 34} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_InstrumentVolume);} code1 {o->value(pars->PVolume);} code2 {o->selection_color(setKnob(o->value(),90));} class WidgetPDial } Fl_Dial vsns { label {Vel Sens} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PADSYNTH::control::velocitySense, o->value(), TOPLEVEL::type::Integer);} tooltip {Velocity Sensing Function (rightmost to disable)} xywh {85 43 34 34} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(pars->PAmpVelocityScaleFunction);} code1 {o->setValueType(VC_AmpVelocitySense);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial pan { label Pan callback {// o->selection_color(setKnob(o->value(),64)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::panning, o->value(), TOPLEVEL::type::Integer);} tooltip Panning xywh {155 43 34 34} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} code1 {o->value(pars->PPanning);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial panwidth { label Width callback {// o->selection_color(setKnob(o->value(),63)); send_data(0, PADSYNTH::control::randomWidth, o->value(), TOPLEVEL::type::Integer);} tooltip {Random width} xywh {235 43 35 35} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 63 step 1 value 63 code0 {o->setValueType(VC_PanningRandom);} code1 {o->value(pars->PWidth);} code2 {o->selection_color(setKnob(o->value(),63));} class WidgetPDial } Fl_Check_Button randompan { label Rand callback {// int tmp = o->value(); if (tmp == 0) panwidth->deactivate(); else panwidth->activate(); send_data(0, PADSYNTH::control::enableRandomPan, tmp, TOPLEVEL::type::Integer);} tooltip {Enable random panning} xywh {205 53 15 15} down_box DOWN_BOX color 48 selection_color 64 labelsize 11 labelcolor 64 align 1 code0 {o->value(pars->PRandom);} code1 {if (o->value() == 0) panwidth->deactivate(); else panwidth->activate();} class Fl_Check_Button2 } Fl_Check_Button stereo { label { Stereo} callback {// pars->PStereo =(o->value()) ? true : false; hprofile->redraw(); send_data(0, PADSYNTH::control::stereo, o->value(), TOPLEVEL::type::Integer);} xywh {16 249 61 15} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 11 labelcolor 226 code0 {o->value(pars->PStereo);} class Fl_Check_Button2 } Fl_Dial dpop { label {D.Pop} callback {// o->selection_color(setKnob(o->value(),20)); send_data(0, PADSYNTH::control::dePop, o->value(), TOPLEVEL::type::Integer);} tooltip {Pop Suppression} xywh {130 247 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->Fadein_adjustment);} code1 {o->selection_color(setKnob(o->value(),20));} class WidgetPDial } Fl_Dial pstr { label {P.Str.} callback {// o->selection_color(setKnob(o->value(),0)); send_data(0, PADSYNTH::control::punchStrength, o->value(), TOPLEVEL::type::Integer);} tooltip {Punch Strength} xywh {170 247 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PPunchStrength);} code1 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Dial pt { label {P.t.} callback {// o->selection_color(setKnob(o->value(),60)); send_data(0, PADSYNTH::control::punchDuration, o->value(), TOPLEVEL::type::Integer);} tooltip {Punch Time (duration)} xywh {200 247 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PPunchTime);} code1 {o->selection_color(setKnob(o->value(),60));} class WidgetPDial } Fl_Dial pstc { label {P.Stc.} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PADSYNTH::control::punchStretch, o->value(), TOPLEVEL::type::Integer);} tooltip {Punch Stretch} xywh {230 247 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PPunchStretch);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial pvel { label {P.Vel.} callback {// o->selection_color(setKnob(o->value(),72)); send_data(0, PADSYNTH::control::punchVelocity, o->value(), TOPLEVEL::type::Integer);} tooltip {Punch Velocity Sensing} xywh {260 247 25 25} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PPunchVelocitySensing);} code1 {o->selection_color(setKnob(o->value(),72));} class WidgetPDial } Fl_Group ampenv { label {Yoshimi : PadSynth - Amplitude Envelope} xywh {10 95 275 70} box FLAT_BOX color 51 labelsize 12 align 144 code0 {o->init(pars->AmpEnvelope.get(), npart, kititem, PART::engine::padSynth, 0);} class EnvelopeUI } {} Fl_Group amplfo { label {Amplitude LFO } xywh {10 165 275 70} box FLAT_BOX color 47 labelfont 1 labelsize 12 align 144 code0 {o->init(synth, npart, kititem, PART::engine::padSynth, TOPLEVEL::insertType::amplitude);} class LFOUI } {} Fl_Box {} { xywh {135 42 4 46} box THIN_DOWN_FRAME } Fl_Box amplabel { label AMPLITUDE xywh {124 28 35 17} labelfont 1 labelsize 11 labelcolor 64 } } Fl_Group filtergrp { xywh {290 25 285 250} box THIN_UP_BOX labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Group filterenv { label {Yoshimi : PadSynth - Filter Envelope} xywh {295 130 275 70} box FLAT_BOX color 51 labelsize 12 align 144 code0 {o->init(pars->FilterEnvelope.get(), npart, kititem, PART::engine::padSynth, 2);} class EnvelopeUI } {} Fl_Group filterlfo { label {Filter LFO } xywh {295 200 275 70} box FLAT_BOX color 47 labelfont 1 labelsize 12 align 144 code0 {o->init(synth, npart, kititem, PART::engine::padSynth, TOPLEVEL::insertType::filter);} class LFOUI } {} Fl_Group filterui { label {Yoshimi : PadSynth - Filter} xywh {295 55 275 75} box FLAT_BOX color 50 labelsize 12 align 144 code0 {o->init(pars->GlobalFilter.get(), &pars->PFilterVelocityScale,&pars->PFilterVelocityScaleFunction, npart, kititem, PART::engine::padSynth);} class FilterUI } {} Fl_Box filterlabel { label FILTER xywh {416 29 35 17} labelfont 1 labelsize 11 } } Fl_Group frequencygrp { label FREQUENCY xywh {5 275 570 125} box THIN_UP_BOX labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Group freqenv { label {Yoshimi : PadSynth - Frequency Envelope} xywh {10 325 205 70} box FLAT_BOX color 51 labelsize 12 align 144 code0 {o->init(pars->FreqEnvelope.get(), npart, kititem, PART::engine::padSynth, 1);} class EnvelopeUI } {} Fl_Group freqlfo { label {Frequency LFO } xywh {215 325 275 70} box FLAT_BOX color 47 labelsize 12 align 144 code0 {o->init(synth, npart, kititem, PART::engine::padSynth, TOPLEVEL::insertType::frequency);} class LFOUI } {} Fl_Dial bend { label Bend callback {// o->selection_color(setKnob(o->value(),88)); send_data(0, PADSYNTH::control::pitchBendAdjustment, o->value(), TOPLEVEL::type::Integer);} tooltip {Pitch bend range scaling} xywh {80 280 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->value(pars->PBendAdjust);} code1 {o->setValueType(VC_PitchBend);} code2 {o->selection_color(setKnob(o->value(),88));} class WidgetPDial } Fl_Dial offset { label Offset callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PADSYNTH::control::pitchBendOffset, o->value(), TOPLEVEL::type::Integer);} tooltip {Offset of the frequency in Hz.} xywh {140 280 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->value(pars->POffsetHz);} code1 {o->setValueType(VC_FreqOffsetHz);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Check_Button hz440 { label 440Hz callback {// int x = (int) o->value(); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::baseFrequencyAs440Hz, x, TOPLEVEL::type::Integer);} tooltip {set the base frequency to 440Hz} xywh {410 284 50 15} down_box DOWN_BOX selection_color 64 labelfont 1 labelsize 10 labelcolor 64 code0 {o->value(pars->Pfixedfreq);} class Fl_Check_Button2 } Fl_Dial fixedfreqetdial { label {Eq.T.} callback {// o->selection_color(setKnob(o->value(),0)); send_data(0, PADSYNTH::control::equalTemperVariation, o->value(), TOPLEVEL::type::Integer);} tooltip {How the frequency varies according to the keyboard (leftmost for fixed frequency)} xywh {465 280 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->value(pars->PfixedfreqET);} code1 {if (pars->Pfixedfreq==0) o->deactivate();} code2 {o->setValueType(VC_FixedFreqET);} code3 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Slider detune { callback {// o->selection_color(setSlider(o->value(),0)); send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::detuneFrequency, o->value(), TOPLEVEL::type::Integer);} tooltip {Fine Detune (cents)} xywh {57 305 433 15} type {Horz Knob} box THIN_DOWN_BOX labelcolor 64 minimum -8192 maximum 8191 step 1 code0 {o->value(pars->PDetune-8192);} code1 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Value_Output detunevalueoutput { label Detune callback {o->value(getDetune(pars->PDetuneType,0,pars->PDetune));} xywh {12 305 45 15} labelsize 10 labelcolor 64 align 5 minimum -5000 maximum 5000 textfont 1 textsize 10 textcolor 64 code0 {o->step(0.01, 1);} code1 {o->value(getDetune(pars->PDetuneType,0,pars->PDetune));} } Fl_Text_Display octavetext { label Octave xywh {511 305 50 11} box NO_BOX labelfont 3 labelsize 10 labelcolor 226 } Fl_Counter octave { callback {// send_data(0, PADSYNTH::control::octave, o->value(), TOPLEVEL::type::Integer);} tooltip Octave xywh {504 305 62 15} type Simple selection_color 49 labelsize 10 labelcolor 64 align 1 minimum -8 maximum 7 step 1 textfont 1 textsize 11 textcolor 64 code0 {int k=pars->PCoarseDetune/1024;} code1 {if (k>=8) k-=16;} code2 {o->value(k);} } Fl_Choice detunetype { label {Detune Type} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::detuneType, o->value() + 1, TOPLEVEL::type::Integer);} xywh {495 342 75 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 10 textcolor 64 code0 {o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} code1 {o->value(pars->PDetuneType - 1);} } {} Fl_Counter coarsedet { label {Coarse det.} callback {// send_data(0, PADSYNTH::control::coarseDetune, o->value(), TOPLEVEL::type::Integer);} tooltip {Coarse Detune} xywh {495 375 76 15} selection_color 64 labelsize 10 labelcolor 64 align 5 minimum -64 maximum 63 step 1 textfont 1 textsize 11 textcolor 64 code0 {int k=pars->PCoarseDetune%1024;} code1 {if (k>=512) k-=1024;} code2 {o->value(k);} code3 {o->lstep(10);} } } } } Fl_Button padExport { label Export callback {// string filename = setfiler(synth,"", "PadSynth", true, TOPLEVEL::XML::PadSample); if (filename.empty()) return; send_data(TOPLEVEL::action::forceUpdate, MAIN::control::exportPadSynthSamples, 0, TOPLEVEL::type::Integer, npart, textMsgBuffer.push(filename));} tooltip {Export samples as wav file} xywh {15 410 123 24} box GTK_THIN_UP_BOX color 198 labelfont 1 labelsize 12 labelcolor 64 align 128 } Fl_Button applybutton { label {Apply Changes} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::applyChanges, 1, TOPLEVEL::type::Integer);} tooltip {Rebuild wavetable to render the currently defined spectrum and line shape; also re-randomise phases} xywh {242 412 128 22} box GTK_THIN_UP_BOX color 82 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button padCopy { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, PART::engine::padSynth);} xywh {415 414 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button padPaste { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, PART::engine::padSynth);} xywh {449 414 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button padClose { label {&Close} callback {// saveWin(synth, padnotewindow->w(), padnotewindow->h(), padnotewindow->x(), padnotewindow->y(), false, "PadSynth"); padSeen = false; resui->resonancewindow->hide(); if (randWalkWindow) randWalkWindow->hide(); padnotewindow->hide(); if ((Fl::event_button() == 3)) { if (synth->getGuiMaster()->partui->partKitOn) synth->getGuiMaster()->partui->instrumentkitlist->show(); else synth->getGuiMaster()->partui->instrumenteditwindow->show(); }} tooltip {Right click: also reopen previous} xywh {505 410 61 24} box THIN_UP_BOX color 196 labelfont 1 labelsize 12 labelcolor 64 } } } Function {make_randWalkWindow()} {} { Fl_Window randWalkWindow { label {Yoshimi : PadSynth - Random Walk} xywh {858 154 240 155} type Double hide resizable code0 {randDW = o->w(); randDH = o->h();} code1 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Random Walk"), npart, TOPLEVEL::windowTitle, kititem)).c_str());} code2 {o->size_range(randDW, randDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Group randomProp { xywh {0 0 240 154} } { Fl_Box plinth { xywh {6 6 58 58} box UP_BOX color 48 } Fl_Dial rebuildTrigger { label Retrigger callback {// int dialSetting = o->value(); if (dialSetting >= 0) dialSetting += 2300; // remove a socket of 200ms from the dial setting, i.e. the editable time in the UI starts > 200ms // smaller values would be pointless and overload the system. (60sec = 4779, 200ms = 2300, thus max = 4779-2300 = 2479) send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::rebuildTrigger, logDial2millisec(dialSetting), TOPLEVEL::type::Integer);} tooltip {Trigger rebuild of PAD Wavetable after generating this amount of sample time; possibly randomise the other parameters on each rebuild. WARNING: expensive!} xywh {20 25 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 minimum -1 maximum 2479 step 1 code0 {// int dialSetting = millisec2logDial(pars->PrebuildTrigger); if (dialSetting >= 2300) dialSetting -= 2300; else dialSetting = -1; o->value(dialSetting);} code2 {o->setValueType(VC_Retrigger);} class WidgetPDial } Fl_Dial randWalkDetune { label Detune callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::randWalkDetune, o->value(), TOPLEVEL::type::Integer);} tooltip {Let the voice detuning perform a random walk on each wavetable rebuild, within this spread..} xywh {100 25 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PrandWalkDetune);} code2 {o->setValueType(VC_RandWalkSpread);} class WidgetPDial } Fl_Dial randWalkFilterFreq { label {Filter Freq} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::randWalkFilterFreq, o->value(), TOPLEVEL::type::Integer);} tooltip {Filter cutoff freq random walk on wavetable rebuild, within this spread..} xywh {180 25 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PrandWalkFilterFreq);} code2 {o->setValueType(VC_RandWalkSpread);} class WidgetPDial } Fl_Dial randWalkBandwidth { label Bandwidth callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::randWalkBandwidth, o->value(), TOPLEVEL::type::Integer);} tooltip {Bandwidth random walk on wavetable rebuild, within this spread..} xywh {20 85 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PrandWalkBandwidth);} code2 {o->setValueType(VC_RandWalkSpread);} class WidgetPDial } Fl_Dial randWalkProfileWidth { label {Line Width} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::randWalkProfileWidth, o->value(), TOPLEVEL::type::Integer);} tooltip {Profile width parameter random walk on wavetable rebuild, within this spread..} xywh {100 85 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PrandWalkProfileWidth);} code2 {o->setValueType(VC_RandWalkSpread);} class WidgetPDial } Fl_Dial randWalkProfileStretch { label {Profile Stretch} callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::randWalkProfileStretch, o->value(), TOPLEVEL::type::Integer);} tooltip {Profile stretch parameter random walk on wavetable rebuild, within this spread..} xywh {180 85 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 code0 {o->value(pars->PrandWalkProfileStretch);} code2 {o->setValueType(VC_RandWalkSpread);} class WidgetPDial } Fl_Button randClose { label Close callback {// if (randSeen) saveWin(synth, randWalkWindow->w(), randWalkWindow->h(), randWalkWindow->x(), randWalkWindow->y(), false, string("padRandWalk")); randWalkWindow->hide(); randSeen = false; if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->padnoteui->padnotewindow->show();} xywh {175 124 50 20} box THIN_UP_BOX color 196 labelsize 12 labelcolor 64 } } } } Function {show_randWalk()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, string("padRandWalk")); if (fetchW < randDW || fetchH < randDH) { fetchW = randDW; fetchH = randDH; } checkSane(fetchX, fetchY, fetchW, fetchH, randDW, randDH); randWalkWindow->resize(fetchX, fetchY, fetchW, fetchH); randWalkWindow->show(); randRtext(); randSeen = true;} {} } Function {randRtext()} {} { code {// int w = randWalkWindow->w(); int h = randWalkWindow->h(); float dW = w / float(randDW); float dH = h / float(randDH); float dScale; if (dW < dH) dScale = dW; else dScale = dH; if (dScale < 0.2f) dScale = 0.2f; int size10 = int(10 * dScale); // int size11 = int(11 * dScale); int size12 = int(12 * dScale); rebuildTrigger->labelsize(size10); randWalkDetune->labelsize(size10); randWalkBandwidth->labelsize(size10); randWalkFilterFreq->labelsize(size10); randWalkProfileWidth->labelsize(size10); randWalkProfileStretch->labelsize(size10); randClose->labelsize(size12); randWalkWindow->redraw();} {} } Function {Showpad()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "PadSynth"); if (fetchW < padDW || fetchH < padDH) { fetchW = padDW; fetchH = padDH; } checkSane(fetchX, fetchY, fetchW, fetchH, padDW, padDH); padnotewindow->resize(fetchX, fetchY, fetchW, fetchH); padnotewindow->show(); lastpadW = 0; padSeen = true;} {} } Function {padRtext()} {} { code {// if (oscui) { if (oscui->osceditUI->visible() && lastWaveW != oscui->osceditUI->w()) { lastWaveW = oscui->osceditUI->w(); oscui->waveRtext(); } } if (randWalkWindow->visible() && lastRandW != randWalkWindow->w()) { randRtext(); lastRandW = randWalkWindow->w(); } if (resui->resonancewindow->visible() && lastResuiW != resui->resonancewindow->w()) { resui->resonanceRtext(); lastResuiW = resui->resonancewindow->w(); } ampenv->wincheck(); freqenv->wincheck(); filterenv->wincheck(); if (padnotewindow->w() == lastpadW) return; lastpadW = padnotewindow->w(); float dScale = padnotewindow->w() / float(padDW); if (dScale < 0.2f) dScale = 0.2f; int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); amplfo->lfoRtext(dScale); freqlfo->lfoRtext(dScale); filterlfo->lfoRtext(dScale); ampenv->envRtext(dScale); freqenv->envRtext(dScale); filterenv->envRtext(dScale); filterui->filterRtext(dScale); harmonicstructuregroup->labelsize(size12); harmonicprofile->labelsize(size12); hpbasetype->labelsize(size); hpbasetype->textsize(size); hpbasepar1->labelsize(size); hpfreqmult->labelsize(size); hpmpar1->labelsize(size); hpmfreq->labelsize(size); hpwidth->labelsize(size); hponehalf->labelsize(size); hponehalf->textsize(size); hpampmode->labelsize(size); hpampmode->textsize(size); hpamppar1->labelsize(size); hpamppar2->labelsize(size); hpamptype->labelsize(size); hpamptype->textsize(size); hpautoscale->labelsize(size11); bwdial->labelsize(size); bwcents->labelsize(size); bwcents->textsize(size11); bwscale->labelsize(size); bwscale->textsize(size); spectrummode->labelsize(size); spectrummode->textsize(size); hrpospar1->labelsize(size); hrpospar2->labelsize(size); hrpospar3->labelsize(size); hrpostype->labelsize(size); hrpostype->textsize(size11); qbasenote->labelsize(size11); qbasenote->textsize(size12); qsmpoct->labelsize(size11); qsmpoct->textsize(size12); qoct->labelsize(size11); qoct->textsize(size12); qsamplesize->labelsize(size); qsamplesize->textsize(size11); xFadeDial->labelsize(size); randWalkUI->labelsize(size12); resonance->labelsize(size12); waveform->labelsize(size12); filterlabel->labelsize(size11); envelopes->labelsize(size12); amplabel->labelsize(size11); volume->labelsize(size); vsns->labelsize(size); pan->labelsize(size); panwidth->labelsize(size); randompan->labelsize(size11); stereo->labelsize(size11); dpop->labelsize(size); pstr->labelsize(size); pt->labelsize(size); pstc->labelsize(size); pvel->labelsize(size); frequencygrp->labelsize(size11); bend->labelsize(size); offset->labelsize(size); hz440->labelsize(size); fixedfreqetdial->labelsize(size); detune->labelsize(size); detunevalueoutput->labelsize(size); detunevalueoutput->textsize(size); octavetext->labelsize(size); octave->textsize(size11); detunetype->labelsize(size); detunetype->textsize(size); coarsedet->labelsize(size); coarsedet->textsize(size11); padExport->labelsize(size12); applybutton->labelsize(size12); padCopy->labelsize(size11); padPaste->labelsize(size11); padClose->labelsize(size12); padnotewindow->redraw();} {} } Function {theme()} {} { code {// if (padnotewindow->visible()) { lastpadW = 0; padRtext(); } if (randWalkWindow) { if (randWalkWindow->visible()) { randRtext(); } } if (oscui) { if (oscui->osceditUI->visible()) { lastWaveW = 0; oscui->waveRtext(); } } if (resui->resonancewindow->visible()) { lastResuiW = 0; resui->resonanceRtext(); } ampenv->theme(); freqenv->theme(); filterenv->theme(); filterui->theme(); ;} {} } Function {send_data(int action, int control, float value, int type, int insert = UNUSED, int miscmsg = UNUSED)} {} { code {// unsigned char partnum = npart; if (miscmsg != UNUSED) { partnum = TOPLEVEL::section::main; action = TOPLEVEL::action::lowPrio; } type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, partnum, kititem, PART::engine::padSynth, insert, UNUSED, UNUSED, miscmsg);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; bool value_bool = _SYS_::F2B(value); bool wasFromHere = ((getData->data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromGUI); unsigned char control = getData->data.control; unsigned char miscmsg = getData->data.miscmsg; float result; string name; switch(control) { case PADSYNTH::control::volume: volume->value(value); volume->selection_color(setKnob(value,90)); break; case PADSYNTH::control::velocitySense: vsns->value(value); vsns->selection_color(setKnob(value,64)); break; case PADSYNTH::control::panning: pan->value(value); pan->selection_color(setKnob(value,64)); break; case PADSYNTH::control::enableRandomPan: randompan->value(value_bool); if (value_bool) panwidth->activate(); else panwidth->deactivate(); break; case PADSYNTH::control::randomWidth: panwidth->value(value); panwidth->selection_color(setKnob(value,63)); break; case PADSYNTH::control::bandwidth: bwdial->value(value); bwdial->selection_color(setKnob(lrint(value),500)); result = powf(value / 1000.0f, 1.1f); result = power<10>(result * 4.0f) * 0.25f; bwcents->value(result); cbwidget->do_callback(); break; case PADSYNTH::control::bandwidthScale: bwscale->value(lrint(value)); cbwidget->do_callback(); break; case PADSYNTH::control::spectrumMode: spectrummode->value(lrint(value)); if (pars->Pmode == 0) { bwprofilegroup->activate(); bwdial->activate(); bwcents->activate(); hprofile->activate(); hprofile->color(254); bwscale->activate(); } else { bwprofilegroup->deactivate(); bwdial->deactivate(); bwcents->deactivate(); hprofile->deactivate(); hprofile->color(48); bwscale->deactivate(); } cbwidget->do_callback(); break; case PADSYNTH::control::xFadeUpdate: { int dialSetting = millisec2logDial(value); xFadeDial->value(dialSetting); xFadeDial->selection_color(setKnob(dialSetting,2301)); cbwidget->do_callback(); } break; case PADSYNTH::control::rebuildTrigger: { int dialSetting = millisec2logDial(value); // remove a socket of 200ms from the dial setting, editable time in the UI starts > 200ms if (dialSetting >= 2300) dialSetting -= 2300; else dialSetting = -1; rebuildTrigger->value(dialSetting); rebuildTrigger->selection_color(setKnob(dialSetting,-1)); cbwidget->do_callback(); } break; case PADSYNTH::control::detuneFrequency: detune->value(lrint(value)); detune->selection_color(setSlider(lrint(value),0)); detunevalueoutput->do_callback(); break; case PADSYNTH::control::equalTemperVariation: fixedfreqetdial->value(lrint(value)); fixedfreqetdial->selection_color(setKnob(lrint(value),0)); break; case PADSYNTH::control::baseFrequencyAs440Hz: hz440->value(value_bool); if (value_bool) fixedfreqetdial->activate(); else fixedfreqetdial->deactivate(); break; case PADSYNTH::control::octave: octave->value(lrint(value)); break; case PADSYNTH::control::detuneType: detunetype->value(lrint(value) - 1); break; case PADSYNTH::control::coarseDetune: coarsedet->value(lrint(value)); break; case PADSYNTH::control::pitchBendAdjustment: bend->value(lrint(value)); bend->selection_color(setKnob(lrint(value),88)); break; case PADSYNTH::control::pitchBendOffset: offset->value(lrint(value)); offset->selection_color(setKnob(lrint(value),64)); break; case PADSYNTH::control::overtoneParameter1: hrpospar1->value(lrint(value)); hrpospar1->selection_color(setKnob(lrint(value),64)); overtonepos->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::overtoneParameter2: hrpospar2->value(lrint(value)); hrpospar2->selection_color(setKnob(lrint(value),64)); overtonepos->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::overtoneForceHarmonics: hrpospar3->value(lrint(value)); hrpospar3->selection_color(setKnob(lrint(value),0)); overtonepos->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::overtonePosition: hrpostype->value(lrint(value)); if (hrpostype->value() > 0) { hrpospar1->activate(); hrpospar3->activate(); if (hrpostype->value() == 7) hrpospar2->deactivate(); else hrpospar2->activate(); } else { hrpospar1->deactivate(); hrpospar2->deactivate(); hrpospar3->deactivate(); } overtonepos->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::baseWidth: hpbasepar1->value(lrint(value)); hpbasepar1->selection_color(setKnob(lrint(value),80)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::frequencyMultiplier: hpfreqmult->value(lrint(value)); hpfreqmult->selection_color(setKnob(lrint(value),0)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::modulatorStretch: hpmpar1->value(lrint(value)); hpmpar1->selection_color(setKnob(lrint(value),0)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::modulatorFrequency: hpmfreq->value(lrint(value)); hpmfreq->selection_color(setKnob(lrint(value),30)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::size: hpwidth->value(lrint(value)); hpwidth->selection_color(setKnob(lrint(value),127)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::baseType: hpbasetype->value(lrint(value)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::harmonicSidebands: hponehalf->value(lrint(value)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::spectralWidth: hpamppar1->value(value); hpamppar1->selection_color(setKnob(value,80)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::spectralAmplitude: hpamppar2->value(value); hpamppar2->selection_color(setKnob(value,64)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::amplitudeMultiplier: hpamptype->value(lrint(value)); if (value_bool) ampgroup->activate(); else ampgroup->deactivate(); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::amplitudeMode: hpampmode->value(lrint(value)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::autoscale: hpautoscale->value(lrint(value)); hprofile->redraw(); cbwidget->do_callback(); break; case PADSYNTH::control::harmonicBase: qbasenote->value(lrint(value)); cbwidget->do_callback(); break; case PADSYNTH::control::samplesPerOctave: qsmpoct->value(lrint(value)); cbwidget->do_callback(); break; case PADSYNTH::control::numberOfOctaves: qoct->value(lrint(value)); cbwidget->do_callback(); break; case PADSYNTH::control::sampleSize: qsamplesize->value(lrint(value)); cbwidget->do_callback(); break; case MAIN::control::exportPadSynthSamples: name = textMsgBuffer.fetch(miscmsg); if (name.find("FAILED") == 1) { if (wasFromHere) alert(synth, "Some samples have failed."); } padStatus->activateStage(PADStatus::CLEAN); break; case PADSYNTH::control::stereo: stereo->value(value_bool); break; case PADSYNTH::control::dePop: dpop->value(value); dpop->selection_color(setKnob(value,20)); break; case PADSYNTH::control::punchStrength: pstr->value(value); pstr->selection_color(setKnob(value,0)); break; case PADSYNTH::control::punchDuration: pt->value(value); pt->selection_color(setKnob(value,60)); break; case PADSYNTH::control::punchStretch: pstc->value(value); pstc->selection_color(setKnob(value,64)); break; case PADSYNTH::control::punchVelocity: pvel->value(value); pvel->selection_color(setKnob(value,72)); break; case PADSYNTH::control::randWalkDetune: randWalkDetune->value(value); randWalkDetune->selection_color(setKnob(value,0)); break; case PADSYNTH::control::randWalkBandwidth: randWalkBandwidth->value(value); randWalkBandwidth->selection_color(setKnob(value,0)); break; case PADSYNTH::control::randWalkFilterFreq: randWalkFilterFreq->value(value); randWalkFilterFreq->selection_color(setKnob(value,0)); break; case PADSYNTH::control::randWalkProfileWidth: randWalkProfileWidth->value(value); randWalkProfileWidth->selection_color(setKnob(value,0)); break; case PADSYNTH::control::randWalkProfileStretch: randWalkProfileStretch->value(value); randWalkProfileStretch->selection_color(setKnob(value,0)); break; case PADSYNTH::control::applyChanges: if (lrint(value) == 0 and getData->data.offset != UNUSED) padStatus->handleStateMessage(*getData); break; }} {} } Function {paste(CommandBlock *getData)} {} { code {// switch (getData->data.insert) { case TOPLEVEL::insert::resonanceGroup: { if (resui) resui->refresh(); break; } } //std::cout << "in paddsynth" << std::endl; ;} {} } Function {applyButton(Fl_Color colour, const char *const text)} {} { code {// applybutton->color(colour); applybutton->label(text); applybutton->redraw(); if (oscui) { oscui->applybutton->color(colour); // not changing text due to limited space oscui->applybutton->redraw(); } if (resui) { resui->applybutton->color(colour); resui->applybutton->redraw(); }} {} } Function {PADnoteUI(PADnoteParameters *parameters)} {} { code {// synth = & parameters->getSynthEngine(); pars = parameters; npart = parameters->partID; kititem = parameters->kitID; padSeen = false; randSeen = false; lastWaveW = 0; lastRandW = 0; lastpadW = 0; oscui = NULL; lastResuiW = 0; resui = new ResonanceUI(pars->resonance.get(), npart, kititem, PART::engine::padSynth); make_randWalkWindow(); make_window(); padStatus.reset(new PADStatus(npart,kititem)); // setup handler to indicate PADSynth wavetable build status padStatus->on(PADStatus::CLEAN, [&]() { applyButton(pad_built, "Rebuilt Wave"); }); padStatus->on(PADStatus::FADING, [&]() { applyButton(pad_fading, "fading..."); }); padStatus->on(PADStatus::PENDING, [&]() { applyButton(pad_pending, "pending Wave"); }); padStatus->on(PADStatus::BUILDING,[&]() { applyButton(pad_building, "rebuilding..."); }); padStatus->on(PADStatus::DIRTY, [&]() { applyButton(pad_apply, "Apply Changes"); });} {} } Function {refresh()} {} { code {// volume->value(pars->PVolume); volume->selection_color(setKnob(volume->value(), 90)); vsns->value(pars->PAmpVelocityScaleFunction); vsns->selection_color(setKnob(vsns->value(), 64)); pan->value(pars->PPanning); pan->selection_color(setKnob(pan->value(), 64)); stereo->value((pars->PStereo) ? 1 : 0); pstr->value(pars->PPunchStrength); pstr->selection_color(setKnob(pstr->value(), 0)); pt->value(pars->PPunchTime); pt->selection_color(setKnob(pt->value(), 60)); pstc->value(pars->PPunchStretch); pstc->selection_color(setKnob(pstc->value(), 64)); pvel->value(pars->PPunchVelocitySensing); pvel->selection_color(setKnob(pan->value(), 72)); detunevalueoutput->value(getDetune(pars->PDetuneType,0,pars->PDetune)); detune->value(pars->PDetune-8192); detune->selection_color(setSlider(detune->value(), 0)); int k=pars->PCoarseDetune/1024;if (k>=8) k-=16; octave->value(k); detunetype->value(pars->PDetuneType-1); k=pars->PCoarseDetune%1024;if (k>=512) k-=1024; coarsedet->value(k); hz440->value(pars->Pfixedfreq); fixedfreqetdial->value(pars->PfixedfreqET); fixedfreqetdial->selection_color(setKnob(fixedfreqetdial->value(), 0)); amplfo->refresh(); freqlfo->refresh(); filterlfo->refresh(); ampenv->refresh(); freqenv->refresh(); filterenv->refresh(); filterui->refresh(); /* harmonic structure parameters */ resui->refresh(); if (oscui!=NULL) oscui->refresh(); hpbasetype->value(pars->PProfile.base.type); hpbasepar1->value(pars->PProfile.base.pwidth); hpbasepar1->selection_color(setKnob(hpbasepar1->value(), 80)); hpfreqmult->value(pars->PProfile.freqmult); hpfreqmult->selection_color(setKnob(hpfreqmult->value(), 0)); hpmpar1->value(pars->PProfile.modulator.pstretch); hpmpar1->selection_color(setKnob(hpmpar1->value(), 0)); hpmfreq->value(pars->PProfile.modulator.freq); hpmfreq->selection_color(setKnob(hpmfreq->value(), 30)); hpwidth->value(pars->PProfile.width); hpwidth->selection_color(setKnob(hpwidth->value(), 127)); hponehalf->value(pars->PProfile.onehalf); hpamptype->value(pars->PProfile.amp.type); hpampmode->value(pars->PProfile.amp.mode); hpamppar1->value(pars->PProfile.amp.par1); hpamppar1->selection_color(setKnob(hpamppar1->value(), 80)); hpamppar2->value(pars->PProfile.amp.par2); hpamppar2->selection_color(setKnob(hpamppar2->value(), 64)); hpautoscale->value(pars->PProfile.autoscale); bwdial->value(pars->Pbandwidth); bwdial->selection_color(setKnob(bwdial->value(), 500)); if (pars->Pmode==0) { bwprofilegroup->activate(); bwdial->activate(); bwcents->activate(); hprofile->activate(); hprofile->color(54); bwscale->activate(); } else { bwprofilegroup->deactivate(); bwdial->deactivate(); bwcents->deactivate(); hprofile->deactivate(); hprofile->color(48); bwscale->activate(); } spectrummode->value(pars->Pmode); qbasenote->value(pars->Pquality.basenote); qsmpoct->value(pars->Pquality.smpoct); qoct->value(pars->Pquality.oct); qsamplesize->value(pars->Pquality.samplesize); hrpostype->value(pars->Phrpos.type); if (hrpostype->value() > 0) { hrpospar1->activate(); hrpospar3->activate(); if (hrpostype->value() == 7) hrpospar2->deactivate(); else hrpospar2->activate(); } else { hrpospar1->deactivate(); hrpospar2->deactivate(); hrpospar3->deactivate(); } hrpospar1->value(pars->Phrpos.par1); hrpospar1->selection_color(setKnob(hrpospar1->value(), 64)); hrpospar2->value(pars->Phrpos.par2); hrpospar2->selection_color(setKnob(hrpospar2->value(), 64)); hrpospar3->value(pars->Phrpos.par3); hrpospar3->selection_color(setKnob(hrpospar3->value(), 0)); hprofile->redraw(); overtonepos->redraw(); xFadeDial->value(millisec2logDial(pars->PxFadeUpdate)); xFadeDial->selection_color(setKnob(xFadeDial->value(),2301)); int dialSetting = millisec2logDial(pars->PrebuildTrigger); if (dialSetting >= 2300) dialSetting -= 2300; else dialSetting = -1; rebuildTrigger->value(dialSetting); rebuildTrigger->selection_color(setKnob(rebuildTrigger->value(),-1)); randWalkDetune->value(pars->PrandWalkDetune); randWalkDetune->selection_color(setKnob(randWalkDetune->value(),0)); randWalkFilterFreq->value(pars->PrandWalkFilterFreq); randWalkFilterFreq->selection_color(setKnob(randWalkFilterFreq->value(),0)); randWalkBandwidth->value(pars->PrandWalkBandwidth); randWalkBandwidth->selection_color(setKnob(randWalkBandwidth->value(),0)); randWalkProfileWidth->value(pars->PrandWalkProfileWidth); randWalkProfileWidth->selection_color(setKnob(randWalkProfileWidth->value(),0)); randWalkProfileStretch->value(pars->PrandWalkProfileStretch); randWalkProfileStretch->selection_color(setKnob(randWalkProfileStretch->value(),0)); osc->redraw(); //pars->applyparameters(false); //applybutton->color(FL_GRAY); //applybutton->parent()->redraw();} {} } Function {~PADnoteUI()} {return_type virtual } { code {// if (oscui) delete(oscui); if (resui) delete(resui); if (randWalkWindow) { if (randSeen) saveWin(synth, randWalkWindow->w(), randWalkWindow->h(), randWalkWindow->x(), randWalkWindow->y(),randWalkWindow->visible(), string("padRandWalk")); randWalkWindow->hide(); delete (randWalkWindow); } if (padSeen) saveWin(synth, padnotewindow->w(), padnotewindow->h(), padnotewindow->x(), padnotewindow->y(), padSeen, "PadSynth"); padnotewindow->hide(); delete(padnotewindow);} {} } decl {PADnoteParameters *pars;} {public local } decl {OscilEditor *oscui;} {public local } decl {Oscilloscope *osc;} {public local } decl {ResonanceUI *resui;} {public local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {float padDW;} {private local } decl {float padDH;} {private local } decl {float randDW;} {private local } decl {float randDH;} {private local } decl {int lastpadW;} {private local } decl {bool padSeen;} {private local } decl {bool randSeen;} {private local } decl {int lastWaveW;} {private local } decl {int lastRandW;} {private local } decl {int lastResuiW;} {private local } decl {unique_ptr padStatus;} {private local } } yoshimi-2.3.5.1/src/UI/ParametersUI.fl000066400000000000000000000154301506652756400173540ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {Copyright 2011, Alan Calvert Copyright 2014 - 2024, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . } {selected in_source in_header } decl {\#include } {public local } decl {\#include "Misc/Config.h"} {private global } decl {\#include "MasterUI.h"} {private global } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include "Misc/SynthEngine.h"} {public global } decl {using std::vector;} {private global } class ParametersUI {} { Function {make_window()} {} { Fl_Window Recent { label {Yoshimi : Parameters} callback {CloseRecent->do_callback();} xywh {900 700 250 180} type Double labelfont 13 labelsize 12 align 0 hide resizable class ScaleTrackedWindow code0 {paramDW = o->w(); paramDH = o->h();} code1 {o->size_range(paramDW, paramDH, 0, 0, 0, 0, 1);} } { Fl_Browser BrowseRecent { callback {// if (o->value() == 0) return; CloseRecent->hide(); Loading->show(); if (H_type <= TOPLEVEL::XML::MLearn) { vector const& listType{synth->getHistory(H_type)}; string const& file{listType.at(o->value()-1)}; switch(H_type) { case TOPLEVEL::XML::Instrument: synth->getGuiMaster()->do_load_instrument(file); break; case TOPLEVEL::XML::Patch: synth->getGuiMaster()->do_load_master(file); break; case TOPLEVEL::XML::Presets: break; // not from here case TOPLEVEL::XML::Scale: synth->getGuiMaster()->do_load_scale(file); break; case TOPLEVEL::XML::State: synth->getGuiMaster()->setState(file); CloseRecent->hide(); Loading->show(); break; case TOPLEVEL::XML::Vector: synth->getGuiMaster()->vectorui->loadVector(file); break; case TOPLEVEL::XML::MLearn: synth->getGuiMaster()->midilearnui->loadMidi(file); break; } } Recent->hide();} xywh {0 0 250 157} type Select labeltype NO_LABEL labelfont 13 labelsize 12 labelcolor 64 align 0 textsize 12 textcolor 64 code0 {const int colwidths[] = { 150, 330, 0 }; o->column_widths(colwidths); o->column_char(' ');} } Fl_Button Loading { label Loading xywh {83 159 57 20} box THIN_DOWN_BOX color 22 labelfont 1 labelsize 11 labelcolor 64 } Fl_Button CloseRecent { label Close callback {// saveWin(synth, Recent->w(), Recent->h(), Recent->x(), Recent->y(), false, "Master-recent"); Recent->hide();} xywh {83 159 57 20} color 196 labelfont 13 labelsize 12 labelcolor 64 } Fl_Text_Display emptytext { label {No Entries} xywh {35 122 160 11} box NO_BOX labelsize 38 labelcolor 64 align 161 textfont 1 textcolor 64 } } } Function {ParametersUI(SynthEngine *_synth)} {} { code {// synth = _synth; lastParamW = 0; make_window();} {} } Function {Show(int _type)} {} { code {// H_type = _type; unsigned int name_start; unsigned int name_end; string name = "Unknown"; int partNo = UNUSED; switch (H_type) { case TOPLEVEL::XML::Instrument: name = + "Instruments"; partNo = synth->getGuiMaster()->npart; // TODO find a better way! break; case TOPLEVEL::XML::Scale: name = "Scales"; break; case TOPLEVEL::XML::MLearn: name = "Learn Lists"; break; case TOPLEVEL::XML::Vector: name = "Vectors"; break; case TOPLEVEL::XML::State: name = "States"; break; case TOPLEVEL::XML::Patch: name = "Patch Sets"; break; } name = textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push(name), partNo, TOPLEVEL::windowTitle)); Recent->copy_label(name.c_str()); vector const& listType{synth->getHistory(H_type)}; BrowseRecent->clear(); const int colwidths[] = { 64, 128, 0 }; BrowseRecent->column_widths(colwidths); BrowseRecent->column_char(' '); if (listType.empty()) emptytext->show(); else { emptytext->hide(); for (auto const& historyEntry : listType) { name = historyEntry; name_start = name.rfind("/"); name_end = name.rfind("."); name = name.substr(name_start + 1, name_end - name_start - 1); BrowseRecent->add(name.c_str()); } BrowseRecent->set_changed(); } int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Master-recent"); if (fetchW < paramDW || fetchH < paramDH) { fetchW = paramDW; fetchH = paramDH; } checkSane(fetchX, fetchY,fetchW, fetchH, paramDW, paramDH); Recent->size(fetchW, fetchH); Recent->show(); Loading->hide(); CloseRecent->show();} {} } Function {Hide()} {} { code {// Recent->hide();} {} } Function {~ParametersUI()} {} { code {// CloseRecent->do_callback();} {} } Function {paramRtext()} {} { code {// if (lastParamW == Recent->w()) return; lastParamW = Recent->w(); float dScale = Recent->w() / float(paramDW); int size12 = int(12 * dScale); BrowseRecent->textsize(size12); Loading->labelsize(size12); CloseRecent->labelsize(size12); emptytext->labelsize(int(38 * dScale)); Recent->redraw();} {} } decl {SynthEngine *synth;} {private local } decl {int H_type;} {private local } decl {int paramDW;} {private local } decl {int paramDH;} {private local } decl {int lastParamW;} {public local } } yoshimi-2.3.5.1/src/UI/PartUI.fl000066400000000000000000003236711506652756400161700ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0403 header_name {.h} code_name {.cc} comment {PartUI.h} {not_in_source in_header } comment {PartUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2014-2023, Will Godfrey Copyright 2024-2025 Kristian Amlie, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code. } {selected in_source in_header } decl {\#include \#include \#include "Misc/Config.h" \#include "Misc/SynthEngine.h"} {private global } decl {\#include "UI/MiscGui.h" \#include "EffUI.h" \#include "BankUI.h" \#include "ADnoteUI.h" \#include "SUBnoteUI.h" \#include "PADnoteUI.h" \#include "UI/WidgetMWSlider.h" \#include "UI/WidgetSpinner.h" \#include "UI/WidgetCheckButton.h" \#include "Params/Controller.h"} {public global } decl {\#include "Misc/Part.h" \#define MAX_INFO_TEXT_SIZE 256} {public local } decl {\#include "MasterUI.h"} {private global } decl {\#include "Misc/FormatFuncs.h" using func::asString;} {private local } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include "Interface/TextLists.h"} {public local } class PartUI_ {} { Function {showparameters(int /* kititem */,int /* engine */)} {return_type virtual } { code {;} {} } } class PartKitItem {: {public Fl_Group} } { Function {make_window()} {} { Fl_Window partkititem { xywh {141 95 670 20} type Double box NO_BOX hide class Fl_Group } { Fl_Group partkititemgroup { xywh {55 4 605 20} code0 {if (part->kit[n].Penabled == 0) o->deactivate();} } { Fl_Check_Button mutedcheck { callback {// send_data(0, PART::control::kitItemMute, o->value(), TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} xywh {60 4 15 15} down_box DOWN_BOX color 7 selection_color 64 labelfont 1 labelsize 11 labelcolor 64 code0 {o->value(part->kit[n].Pmuted);} class Fl_Check_Button2 } Fl_Button labelbutton { label {Bass Drum} callback {// string tmp = input_text(synth, "Kit item name:", part->kit[n].Pname); if (tmp != "" && tmp != part->kit[n].Pname) { send_data(TOPLEVEL::action::lowPrio, PART::control::instrumentName, 0, TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup, UNUSED, textMsgBuffer.push(tmp)); o->copy_label(tmp.c_str()); }} xywh {90 4 130 14} box THIN_DOWN_BOX down_box FLAT_BOX color 7 labelfont 1 labelsize 10 labelcolor 64 align 20 code0 {o->copy_label(part->kit[n].Pname.c_str());} } Fl_Counter minkcounter { callback {// int tmp = o->value(); int other = maxkcounter->value(); if (tmp >= other) { tmp = other; o->value(tmp); } send_data(0, PART::control::minNote, tmp, TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} xywh {225 4 70 14} type Simple labelcolor 64 minimum 0 maximum 127 step 1 textfont 1 textsize 12 textcolor 64 code0 {o->value(part->kit[n].Pminkey);} } Fl_Button setmin { label m callback {// int last = part->getLastNote(); if (last <= 0) return; int tmp; int other = maxkcounter->value(); if (last >= other) tmp = other; else tmp = last; minkcounter->value(tmp); send_data(0, PART::control::minToLastKey, tmp, TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} tooltip {set the minimum key to the last pressed key} xywh {300 5 15 12} box THIN_UP_BOX labelsize 10 labelcolor 64 } Fl_Button setmax { label M callback {// int last = part->getLastNote(); if (last <= 0) return; int tmp; int other = minkcounter->value(); if (last <= other) tmp = other; else tmp = last; maxkcounter->value(tmp); send_data(0, PART::control::maxToLastKey, tmp, TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} tooltip {set the maximum key to the last pressed key} xywh {330 5 15 12} box THIN_UP_BOX labelsize 10 labelcolor 64 } Fl_Button setfull { label R callback {// minkcounter->value(0); maxkcounter->value(127); send_data(0, PART::control::resetMinMaxKey, o->value(), TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} tooltip {reset the minimum key to 0 and maximum key to 127} xywh {315 5 15 12} box THIN_UP_BOX labelfont 1 labelsize 10 labelcolor 64 } Fl_Counter maxkcounter { callback {// int tmp = o->value(); int other = minkcounter->value(); if (tmp <= other) { tmp = other; o->value(tmp); } send_data(0, PART::control::maxNote, tmp, TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} xywh {350 4 70 14} type Simple labelcolor 64 minimum 0 maximum 127 step 1 textfont 1 textsize 12 textcolor 64 code0 {o->value(part->kit[n].Pmaxkey);} } Fl_Button adeditbutton { label edit callback {// partui->showparameters(n,PART::engine::addSynth); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->instrumentkitlist->hide();} xywh {442 4 40 15} box GTK_THIN_UP_BOX color 198 labelsize 11 labelcolor 64 code0 {if (part->kit[n].Padenabled==0) o->deactivate();} } Fl_Check_Button adcheck { callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::enableAdd, o->value(), TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} xywh {426 4 15 15} down_box DOWN_BOX color 7 selection_color 64 labelfont 1 labelsize 11 labelcolor 64 code0 {o->value(part->kit[n].Padenabled);} class Fl_Check_Button2 } Fl_Button subeditbutton { label edit callback {// partui->showparameters(n,PART::engine::subSynth); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->instrumentkitlist->hide();} xywh {507 4 40 15} box GTK_THIN_UP_BOX color 198 labelsize 11 labelcolor 64 code0 {if (part->kit[n].Psubenabled==0) o->deactivate();} } Fl_Check_Button subcheck { callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::enableSub, o->value(), TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} xywh {491 4 15 15} down_box DOWN_BOX color 7 selection_color 64 labelfont 1 labelsize 11 labelcolor 64 code0 {o->value(part->kit[n].Psubenabled);} class Fl_Check_Button2 } Fl_Button padeditbutton { label edit callback {// partui->showparameters(n,PART::engine::padSynth); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->instrumentkitlist->hide();} xywh {570 4 40 15} box GTK_THIN_UP_BOX color 198 labelsize 11 labelcolor 64 code0 {if (part->kit[n].Ppadenabled==0) o->deactivate();} } Fl_Check_Button padcheck { callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::enablePad, o->value(), TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} xywh {555 4 15 15} down_box DOWN_BOX color 7 selection_color 64 labelfont 1 labelsize 11 labelcolor 64 code0 {o->value(part->kit[n].Ppadenabled);} class Fl_Check_Button2 } Fl_Choice sendtoeffect { callback {// send_data(0, PART::control::kitEffectNum, o->value(), TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} xywh {615 4 45 15} down_box BORDER_BOX labelsize 10 labelcolor 64 align 5 textfont 1 textsize 10 textcolor 64 code0 {o->add("OFF"); char nrstr[10]; for (int i = 0; i < NUM_PART_EFX; i++) {sprintf(nrstr,"FX%d",i+1);o->add(nrstr);};} code1 {o->value(part->kit[n].Psendtoparteffect+1);if (part->kit[n].Psendtoparteffect==127) o->value(0);} } {} } Fl_Check_Button enabledcheck { label 01 callback {// int answer = 1; if (o->value() == 0) answer = (choice(synth, "", "Yes", "No", "Delete the item?\\nThis action can't be reversed and will erase the 'undo' list.") > 1); if (answer != 0) { if (o->value() == 0) clearLine(); else partkititemgroup->activate(); o->redraw(); partui->showparameters(n, -1); // use to delete the ui, if it is not to item 0 } else o->value(1); send_data(0, PART::control::enableKitLine, o->value(), TOPLEVEL::type::Integer, n, UNUSED, TOPLEVEL::insert::kitGroup);} xywh {30 4 20 15} down_box DOWN_BOX selection_color 64 labeltype EMBOSSED_LABEL labelfont 1 labelsize 12 labelcolor 64 align 4 code0 {snprintf(label,10,"%d",(n&15)+1);o->label(label);} code1 {o->value(part->kit[n].Penabled);} code2 {if (n==0) o->hide();} code3 {if (o->value() == 0) labelbutton->color(gen_text_back);} class Fl_Check_Button2 } } } Function {send_data(int action, int control, float value, int type, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int miscmsg = UNUSED)} {} { code {// int partToUse = collect_readData(synth, 0, MAIN::control::partNumber, TOPLEVEL::main, kititem); // make sure it's the right one! type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, partToUse, kititem, engine, insert, parameter, UNUSED, miscmsg); ;} {} } Function {PartKitItem(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// n=0;part=NULL;} {} } Function {clearLine()} {} { code {// partkititemgroup->deactivate(); mutedcheck->value(0); labelbutton->copy_label(""); minkcounter->value(0); maxkcounter->value(127); adcheck->value(0); adeditbutton->deactivate(); subcheck->value(0); subeditbutton->deactivate(); padcheck->value(0); padeditbutton->deactivate(); sendtoeffect->value(1);} {} } Function {init(Part *part_, int n_, int npart_, PartUI_ *partui_)} {} { code {// synth = & part_->getSynthEngine(); part = part_; n = n_; npart = npart_; partui = partui_; make_window(); end();} {} } Function {itemRtext(float dScale)} {} { code {// int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); enabledcheck->labelsize(size12); mutedcheck->labelsize(size11); labelbutton->labelsize(size); minkcounter->textsize(size12); setmin->labelsize(size); setmax->labelsize(size); setfull->labelsize(size); maxkcounter->textsize(size12); adeditbutton->labelsize(size11); adcheck->labelsize(size11); subeditbutton->labelsize(size11); subcheck->labelsize(size11); padeditbutton->labelsize(size11); padcheck->labelsize(size11); sendtoeffect->labelsize(size); sendtoeffect->textsize(size);} {} } Function {~PartKitItem()} {} { code {// partkititem->hide();} {} } decl {Part *part;} {public local } decl {int n;} {private local } decl {int npart;} {private local } decl {char label[10];} {private local } decl {PartUI_ *partui;} {private local } decl {SynthEngine *synth;} {private local } } class PartUI {: {public Fl_Group, PartUI_} } { Function {make_window()} {} { Fl_Window instrumenteditwindow { label {Instrument Edit} callback {editClose->do_callback();} xywh {1051 172 395 385} type Double hide resizable code0 {seteditname();} code1 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Edit"), npart, TOPLEVEL::windowTitle)).c_str());} code2 {editDW = 395; editDH = 385;} code3 {o->size_range(editDW, editDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Group {} { xywh {0 222 395 162} box GTK_THIN_UP_BOX } { Fl_Group ADD { label ADDsynth xywh {5 246 94 72} box ENGRAVED_FRAME labelfont 1 labelcolor 64 } { Fl_Check_Button adsynenabledcheck { label Enabled callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::enableAdd, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {enable/disable ADsynth} xywh {12 252 80 24} box PLASTIC_UP_BOX down_box DOWN_BOX color 228 selection_color 64 labelfont 3 labelsize 11 labelcolor 226 code1 {o->value(part->kit[0].Padenabled);} class Fl_Check_Button2 } Fl_Box addbox { xywh {8 226 84 18} box FLAT_BOX code1 {if (adsynenabledcheck->value() != 0 && engine != 0) o->color(add_back); else o->color(FL_BACKGROUND_COLOR);} } Fl_Button adeditbutton { label {Edit &Add} callback {// showparameters(0,PART::engine::addSynth); //checkEngines(); seteditname(); if ((Fl::event_button() == 3)) { instrumenteditwindow->hide();}} tooltip {Right click: also close this} xywh {12 280 80 32} box GTK_THIN_UP_BOX color 198 selection_color 64 labelfont 1 labelcolor 64 align 128 code0 {if (part->kit[0].Padenabled==0) o->deactivate();} } } Fl_Group SUB { label SUBsynth xywh {100 246 94 72} box ENGRAVED_FRAME labelfont 1 labelcolor 64 } { Fl_Check_Button subsynenabledcheck { label Enabled callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::enableSub, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {enable/disable SUBsynth} xywh {107 252 80 24} box PLASTIC_UP_BOX down_box DOWN_BOX color 228 selection_color 64 labelfont 3 labelsize 11 labelcolor 226 code1 {o->value(part->kit[0].Psubenabled);} class Fl_Check_Button2 } Fl_Box subbox { xywh {103 226 84 18} box FLAT_BOX code1 {if (subsynenabledcheck->value() != 0 && engine != 0) o->color(sub_back); else o->color(FL_BACKGROUND_COLOR);} } Fl_Button subeditbutton { label {Edit &Sub} callback {// showparameters(0,PART::engine::subSynth); //checkEngines(); seteditname(); if ((Fl::event_button() == 3)) { instrumenteditwindow->hide();}} tooltip {Right click: also close this} xywh {107 280 80 32} box GTK_THIN_UP_BOX color 198 selection_color 64 labelfont 1 labelcolor 64 align 128 code0 {if (part->kit[0].Psubenabled==0) o->deactivate();} } } Fl_Group PAD { label PADsynth xywh {195 246 94 72} box ENGRAVED_FRAME labelfont 1 labelcolor 64 } { Fl_Check_Button padsynenabledcheck { label Enabled callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::enablePad, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {enable/disable PADsynth} xywh {202 252 80 24} box PLASTIC_UP_BOX down_box DOWN_BOX color 228 selection_color 64 labelfont 3 labelsize 11 labelcolor 226 code1 {o->value(part->kit[0].Ppadenabled);} class Fl_Check_Button2 } Fl_Box padbox { xywh {198 226 84 18} box FLAT_BOX code1 {if (padsynenabledcheck->value() != 0 && engine != 0) o->color(pad_back); else o->color(FL_BACKGROUND_COLOR);} } Fl_Button padeditbutton { label {Edit &Pad} callback {// showparameters(0,PART::engine::padSynth); //checkEngines(); seteditname(); if ((Fl::event_button() == 3)) { instrumenteditwindow->hide();}} tooltip {Right click: also close this} xywh {202 280 80 32} box GTK_THIN_UP_BOX color 198 selection_color 64 labelfont 1 labelcolor 64 align 128 code0 {if (part->kit[0].Ppadenabled==0) o->deactivate();} } } Fl_Button kitedit { label {&Kit Edit} callback {// Showkit(); if ((Fl::event_button() == 3)) { instrumenteditwindow->hide();}} tooltip {Right click: also close this} xywh {295 227 94 28} box GTK_THIN_UP_BOX color 198 selection_color 64 labelfont 1 labelcolor 64 align 128 } Fl_Button effects { label {&Effects} callback {// Showefx(); if ((Fl::event_button() == 3)) { instrumenteditwindow->hide();}} tooltip {Right click: also close this} xywh {295 258 94 28} box GTK_THIN_UP_BOX color 198 labelfont 1 labelcolor 64 } Fl_Button editAT { label {After&touch} callback {// ShowAT(); atSeen = 2; if ((Fl::event_button() == 3)) instrumenteditwindow->hide();} xywh {295 290 94 28} box GTK_THIN_UP_BOX color 198 labelfont 1 labelcolor 64 } Fl_Button instrumentReset { label {&Reset} callback {// if (!fetchData(0, PART::control::enable, npart)) { alert(synth, "Selected part is disabled"); return; } bool fullClear = false; if (Fl::event_state(FL_CTRL)) { if (choice(synth, "", "Yes", "No", "Set entire part " + std::to_string(npart + 1) + " controls to default values ?") > 1) fullClear = true; } if (synth->getGuiMaster()->instrumentSingleWarning(npart, "Still clear")) { return; } if (fullClear) send_data(TOPLEVEL::action::forceUpdate, MAIN::control::defaultPart, npart, TOPLEVEL::type::Integer, TOPLEVEL::section::main); else send_data(TOPLEVEL::action::forceUpdate, MAIN::control::defaultInstrument, npart, TOPLEVEL::type::Integer, TOPLEVEL::section::main); ;} tooltip {Revert to default instrument +Ctrl, clear entire part} xywh {283 327 100 26} box PLASTIC_UP_BOX color 89 labelfont 1 labelcolor 64 } Fl_Button editClose { label {&Close} callback {// saveWin(synth, instrumenteditwindow->w(), instrumenteditwindow->h(), instrumenteditwindow->x(),instrumenteditwindow->y(), false, "Part-edit"); editSeen = false; lasteditW = 0; instrumenteditwindow->hide(); o->parent()->show();} xywh {283 357 100 24} box THIN_UP_BOX color 196 labelfont 1 labelcolor 64 } } Fl_Group {} { xywh {0 2 395 216} box ENGRAVED_FRAME labelcolor 64 } { Fl_Text_Display A_C_display { label {Author and Copyright} xywh {171 44 148 4} box NO_BOX labelsize 12 labelcolor 64 } Fl_Button A_C_default { label Default callback {// int param = 0; if (Fl::event_state(FL_CTRL)) param = 1; send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, PART::control::defaultInstrumentCopyright, 0, TOPLEVEL::type::Integer, npart, UNUSED, UNUSED, UNUSED, param);} tooltip {Load default author & copyright + Ctrl: save current text as default} xywh {327 25 63 20} labelsize 12 labelcolor 64 } Fl_Input copyright { callback {// send_data(TOPLEVEL::action::lowPrio, PART::control::instrumentCopyright, 0, TOPLEVEL::type::Integer, npart, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string(o->value())));} xywh {5 49 385 55} type Multiline color 182 labelsize 12 labelcolor 64 align 9 textcolor 64 code0 {o->maximum_size(MAX_INFO_TEXT_SIZE);} code1 {o->value(part->info.Pauthor.c_str());} } Fl_Input commentField { label Comments callback {// send_data(TOPLEVEL::action::lowPrio, PART::control::instrumentComments, 0, TOPLEVEL::type::Integer, npart, UNUSED, UNUSED, UNUSED, UNUSED, textMsgBuffer.push(string(o->value())));} xywh {5 123 385 91} type Multiline color 182 labelsize 12 labelcolor 64 align 5 textcolor 64 code0 {o->maximum_size(MAX_INFO_TEXT_SIZE);} code1 {o->value(part->info.Pcomments.c_str());} } Fl_Choice instrumentType { label {Type:} callback {// send_data(TOPLEVEL::action::lowPrio, PART::control::instrumentType, o->value(), TOPLEVEL::type::Integer, npart);} xywh {5 25 155 20} down_box BORDER_BOX labelfont 1 labelsize 11 labelcolor 64 align 5 textfont 1 textsize 11 textcolor 64 code0 {fillInstrumentType();} code1 {o->value(part->info.Ptype);} } {} } Fl_Box humaniseBox { xywh {0 324 272 58} box ENGRAVED_FRAME labelfont 1 align 8 } Fl_Text_Display humanise_display { label Humanise xywh {102 342 78 7} box NO_BOX labelfont 1 labelcolor 64 } Fl_Value_Slider humanise { label Detune callback {// o->selection_color(setSlider(o->value(),0)); send_data(0, PART::control::humanise, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Random detune of whole part in cents} xywh {12 342 202 16} type {Horz Knob} box THIN_DOWN_BOX labelsize 12 labelcolor 64 align 8 maximum 50 step 1 textcolor 64 code1 {o->setValueType(VC_PartHumaniseDetune);o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Value_Slider velocityhumanise { label Velocity callback {// o->selection_color(setSlider(o->value(),0)); send_data(0, PART::control::humanvelocity, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Random velocity attenuation of whole part} xywh {12 362 202 16} type {Horz Knob} box THIN_DOWN_BOX labelsize 12 labelcolor 64 align 8 maximum 50 step 1 textcolor 64 code1 {o->setValueType(VC_PartHumaniseVelocity);o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Text_Display originalname { label {Derived From} xywh {200 108 1 15} box NO_BOX labelfont 1 labelsize 12 labelcolor 64 align 4 textsize 11 textcolor 64 hide } Fl_Text_Display originaltext { label text xywh {198 108 1 15} box NO_BOX labelfont 1 labelsize 12 labelcolor 225 align 8 textsize 11 hide } } Fl_Window instrumentkitlist { label {Instrument Kit} callback {// saveWin(synth, instrumentkitlist->w(), instrumentkitlist->h(), instrumentkitlist->x(), instrumentkitlist->y(), false, "Part-kit"); instrumentkitlist->hide(); kitSeen = false;} xywh {373 285 670 370} type Double hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Kit List"), npart, TOPLEVEL::windowTitle)).c_str());} code2 {kitDW = o->w(); kitDH = o->h();} code3 {o->size_range(kitDW, kitDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Group kitlist { xywh {4 20 662 324} box THIN_UP_FRAME } { Fl_Pack kitpack { xywh {0 21 670 322} code0 {for (int i=0;iinit(part, i, npart, this);}} } {} } Fl_Box kitnum { label {No.} xywh {10 0 25 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box kitmute { label Mute xywh {56 15 22 8} labelfont 3 labelsize 11 labelcolor 226 align 1 } Fl_Box kitID { label Name xywh {137 0 40 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box kitminkey { label {Min key} xywh {236 0 40 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box kitmaxkey { label {Max key} xywh {364 0 40 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Text_Display addON { label On xywh {423 15 22 8} box NO_BOX labelfont 3 labelsize 11 labelcolor 226 } Fl_Box kitadd { label ADD xywh {446 0 34 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Text_Display subON { label On xywh {489 15 22 9} box NO_BOX labelfont 3 labelsize 11 labelcolor 226 } Fl_Box kitsub { label SUB xywh {507 0 40 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Text_Display padON { label On xywh {554 15 22 10} box NO_BOX labelfont 3 labelsize 11 labelcolor 226 } Fl_Box kitpad { label PAD xywh {572 0 37 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Box kitfxnum { label {FX.r.} xywh {620 0 30 15} labelfont 1 labelsize 11 labelcolor 64 align 18 } Fl_Choice kitMode { label Mode callback {// int tmp = o->value(); partKitOn = tmp > 0; if (partKitOn) kitlist->activate(); else kitlist->deactivate(); send_data(0, PART::control::kitMode, tmp, TOPLEVEL::type::Integer, npart);} tooltip {Single = only 1st item in defined note range sounds} xywh {41 348 88 19} down_box BORDER_BOX labelsize 11 labelcolor 64 textfont 1 textsize 11 textcolor 64 code0 {o->add("Off");o->add("Multi");o->add("Single");o->add("Crossfade");} code1 {if (part->PkitfadeType == 1) {o->value(3);} else {o->value(part->Pkitmode);}} code2 {partKitOn = o->value() > 0;} code3 {if (!partKitOn) kitlist->deactivate();} } {} Fl_Check_Button drumMode { label {Drum mode} callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::drumMode, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Disables microtonal tuning} xywh {285 350 15 15} down_box DOWN_BOX selection_color 64 labelsize 11 labelcolor 64 code0 {o->value(part->Pdrummode);} class Fl_Check_Button2 } Fl_Button kitClose { label {&Close} callback {// saveWin(synth, instrumentkitlist->w(), instrumentkitlist->h(), instrumentkitlist->x(), instrumentkitlist->y(), false, "Part-kit"); instrumentkitlist->hide(); kitSeen = false; if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->instrumenteditwindow->show();} tooltip {Right click: also reopen previous} xywh {569 348 63 20} box THIN_UP_BOX color 196 labelcolor 64 } } Fl_Window partfx { label {Part's Insert Effects} callback {// saveWin(synth, partfx->w(), partfx->h(), partfx->x(), partfx->y(), false, "Part-effects"); partfx->hide();} xywh {520 67 385 160} type Double hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Effects"), npart, TOPLEVEL::windowTitle)).c_str());} code1 {fxDW = o->w(); fxDH = o->h();} code2 {o->size_range(fxDW, fxDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Spinner inseffnocounter { callback {// int effNum = o->value() - 1; send_data(TOPLEVEL::action::forceUpdate, PART::control::effectNumber, effNum, TOPLEVEL::type::Integer, npart, UNUSED, effNum, TOPLEVEL::insert::partEffectSelect);} tooltip {Effect No.} xywh {20 8 35 22} labelsize 12 labelcolor 64 maximum 3 textsize 12 textcolor 64 code0 {o->range(1, NUM_PART_EFX);} code1 {o->value(1);} class WidgetSpinner } Fl_Choice insefftype { callback {// uchar effNum = inseffectui->effNum(); uchar effType = o->value(); send_data(TOPLEVEL::action::forceUpdate, PART::control::effectType, effType, TOPLEVEL::type::Integer, npart, UNUSED, effNum, TOPLEVEL::insert::partEffectSelect);} tooltip {Effect Type} xywh {86 8 92 22} down_box BORDER_BOX labelsize 11 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("No Effect");o->add("Reverb");o->add("Echo");o->add("Chorus");o->add("Phaser");o->add("AlienWah");o->add("Distortion");o->add("EQ");o->add("DynFilter");} code1 {o->value(0); // initially "No Effect"} } {} Fl_Group inseffectuigroup { xywh {3 37 380 96} box FLAT_BOX color 48 } { Fl_Group inseffectui { xywh {5 38 379 95} code0 {InterfaceAnchor& anchor = synth->getGuiMaster()->anchor; o->init(synth, anchor.partEffectParam, anchor.partEffectEQ, npart);} class EffUI } {} } Fl_Choice sendtochoice { label To callback {// uchar effNum = inseffectui->effNum(); send_data(TOPLEVEL::action::forceUpdate, PART::control::effectDestination, o->value(), TOPLEVEL::type::Integer, npart, UNUSED, effNum, TOPLEVEL::insert::partEffectSelect);} xywh {225 8 102 22} down_box BORDER_BOX labelfont 1 labelsize 12 labelcolor 64 textfont 1 textsize 12 textcolor 64 code0 {o->add("Next Effect");o->add("Part Out");o->add("Dry Out");} code1 {o->value(0);} } {} Fl_Button effCopy { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, 16, inseffnocounter->value()-1); ;} xywh {346 3 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button effPaste { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, 16, inseffnocounter->value()-1); ;} xywh {346 19 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Check_Button bypasseff { label Bypass callback {// uchar effNum = inseffectui->effNum(); send_data(TOPLEVEL::action::forceUpdate, PART::control::effectBypass, o->value(), TOPLEVEL::type::Integer, npart, UNUSED, effNum, TOPLEVEL::insert::partEffectSelect);} tooltip {if the effect is not used (is bypassed)} xywh {20 135 63 21} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 12 labelcolor 226 code0 {o->value(false);} class Fl_Check_Button2 } Fl_Button effClose { label {&Close} callback {// saveWin(synth, partfx->w(), partfx->h(), partfx->x(), partfx->y(), false, "Part-effects"); if(inseffectui->filterwindow != NULL) inseffectui->filterwindow->hide(); fxSeen = false; partfx->hide(); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->instrumenteditwindow->show();} tooltip {Right click: also reopen previous} xywh {307 136 60 20} box THIN_UP_BOX color 196 labelcolor 64 } } comment {ctlmidi, ctlwindow, aftertouch control MUST be that order} {in_source in_header } Fl_Window ctlmidi { label {MIDI Controls} xywh {591 324 365 60} type Double hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("MIDI Controls"), npart, TOPLEVEL::windowTitle)).c_str());} code1 {midiDW = o->w(); midiDH = o->h();} code2 {o->size_range(midiDW, midiDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Dial modulation { label Modulation callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::midiModWheel, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Modulation Wheel} xywh {20 10 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->modwheel.data);} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial expression { label Expression callback {// o->selection_color(setKnob(o->value(),127)); send_data(0, PART::control::midiExpression, o->value(), TOPLEVEL::type::Integer, npart);} tooltip Expression xywh {80 10 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->expression.data);} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),127));} class WidgetPDial } Fl_Dial filterq { label {Filter Q} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::midiFilterQ, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Filter Q} xywh {140 10 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->filterq.data);} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial filtercutoff { label {Filter Cutoff} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::midiFilterCutoff, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Filter Cutoff} xywh {200 10 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->filtercutoff.data);} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial masterbandwidth { label Bandwidth callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::midiBandwidth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Master Bandwidth} xywh {260 10 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->bandwidth.data);} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Button ctlmidiclose { label {&Close} callback {// saveWin(synth, ctlmidi->w(), ctlmidi->h(), ctlmidi->x(), ctlmidi->y(), false, "Part-ctlmidi"); ctlmidiSeen = false; ctlmidi->hide();} xywh {309 35 50 20} box THIN_UP_BOX color 196 labelcolor 64 } } Fl_Window ctlwindow { label Controllers callback {ctlclose->do_callback();} xywh {418 167 505 130} type Double hide resizable class ScaleTrackedWindow code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Controllers"), npart, TOPLEVEL::windowTitle)).c_str());} code1 {ctlDW = o->w(); ctlDH = o->h();} code2 {o->size_range(ctlDW, ctlDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Dial volrng { label {Vol Rng} callback {// o->selection_color(setKnob(o->value(),96)); send_data(0, PART::control::volumeRange, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Volume Range} xywh {132 55 30 30} labelsize 10 labelcolor 64 minimum 64 maximum 127 step 1 code0 {o->value(part->ctl->volume.data);} code1 {o->selection_color(setKnob(o->value(),96));} class WidgetPDial } Fl_Check_Button vol { label Vol callback {// send_data(0, PART::control::volumeEnable, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Volume enable} xywh {175 81 45 18} box THIN_UP_BOX down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(part->ctl->volume.receive);} class Fl_Check_Button2 } Fl_Dial panwidth { label PanWdth callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::panningWidth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Panning Width} xywh {10 55 30 30} labelsize 10 labelcolor 64 maximum 64 step 1 code0 {o->value(part->ctl->panning.depth);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial modwh { label ModWh callback {// o->selection_color(setKnob(o->value(),80)); send_data(0, PART::control::modWheelDepth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Modulation Wheel depth} xywh {50 10 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->modwheel.depth);} code1 {o->selection_color(setKnob(o->value(),80));} class WidgetPDial } Fl_Check_Button expmwh { label {Exp MWh} callback {// send_data(0, PART::control::exponentialModWheel, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Exponential modulation wheel} xywh {10 15 40 25} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 148 code0 {o->value(part->ctl->modwheel.exponential);} class Fl_Check_Button2 } Fl_Dial bwdpth { label BwDpth callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::bandwidthDepth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {BandWidth depth} xywh {132 10 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->bandwidth.depth);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Check_Button expbw { label {Exp BW} callback {// send_data(0, 134, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Exponential BandWidth Controller} xywh {92 15 35 25} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 148 code0 {o->value(part->ctl->bandwidth.exponential);} class Fl_Check_Button2 } Fl_Check_Button expr { label Expr callback {// send_data(0, 135, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Expression enable} xywh {175 59 45 18} box THIN_UP_BOX down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(part->ctl->expression.receive);} class Fl_Check_Button2 } Fl_Check_Button fmamp { label FMamp callback {// send_data(0, PART::control::FMamplitudeEnable, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {FM amplitude enable} xywh {225 59 60 18} box THIN_UP_BOX down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(part->ctl->fmamp.receive);} class Fl_Check_Button2 } Fl_Check_Button sustain { label Sustain callback {// send_data(0, PART::control::sustainPedalEnable, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Sustain pedal enable} xywh {225 81 60 18} box THIN_UP_BOX down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(part->ctl->sustain.receive);} class Fl_Check_Button2 } Fl_Check_Button breath { label Breath callback {// send_data(0, 141, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Breath Control enable} xywh {225 38 60 18} box THIN_UP_BOX down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(part->PbreathControl == MIDI::CC::breath);} class Fl_Check_Button2 } Fl_Box pwheelrnglabel { label {PWheel Rng (cents)} xywh {170 1 117 16} labelfont 3 labelsize 10 labelcolor 226 } Fl_Counter pwheelbrng { callback {// send_data(0, PART::control::pitchWheelRange, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Pitch Wheel Bend Range (cents)} xywh {168 16 119 18} labelcolor 64 align 1 minimum -6400 maximum 6400 step 1 textcolor 64 code0 {o->value(part->ctl->pitchwheel.bendrange);} code1 {o->lstep(100);} } Fl_Dial filtq { label FltQ callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::filterQdepth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Filter Q depth} xywh {50 55 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->filterq.depth);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial fltcut { label FltCut callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::filterCutoffDepth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Filter Cutoff depth} xywh {90 55 30 30} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->filtercutoff.depth);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Group ctlresonance { label Resonance xywh {290 15 45 85} box GTK_THIN_UP_BOX labelfont 1 labelsize 10 labelcolor 64 align 5 } { Fl_Dial cfdpth { label CFdpth callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::resonanceCenterFrequencyDepth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Center Frequency controller Depth} xywh {300 20 25 25} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->resonancecenter.depth);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial rbwdpth { label BWdpth callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::resonanceBandwidthDepth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {BandWidth controller depth} xywh {300 60 25 25} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->resonancebandwidth.depth);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } } Fl_Box threshlabel { label Thresh xywh {400 36 48 14} labelfont 3 labelsize 10 labelcolor 226 } Fl_Group ctlportamento { label Portamento xywh {340 15 160 85} box ENGRAVED_FRAME labelfont 1 labelsize 10 labelcolor 64 } { Fl_Box ctlx100 { label {x100 cnt.} xywh {400 47 55 15} labelfont 3 labelsize 10 labelcolor 226 align 16 } Fl_Dial prtime { label time callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::portamentoTime, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Portamento time} xywh {345 60 25 25} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->portamento.time);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Dial timedu { label {t.dn/up} callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, PART::control::portamentoTimeStretch, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Portamento time stretch (up/down)} xywh {375 60 25 25} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->portamento.updowntimestretch);} code1 {o->selection_color(setKnob(o->value(),64));} class WidgetPDial } Fl_Counter thresh { callback {// send_data(0, PART::control::portamentoThreshold, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Minimum or max. difference of the notes in order to do the portamento (x 100 cents)} xywh {388 20 72 16} type Simple labelcolor 64 minimum 0 maximum 127 step 1 code0 {o->value(part->ctl->portamento.pitchthresh);} } Fl_Check_Button thtype { label {th.type} callback {// send_data(0, PART::control::portamentoThresholdType, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Threshold type (min/max)} xywh {425 68 15 15} down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 align 2 code0 {o->value(part->ctl->portamento.pitchthreshtype);} class Fl_Check_Button2 } Fl_Dial propta { label {Prp.Rate} callback {// o->selection_color(setKnob(o->value(),80)); send_data(0, PART::control::proportionalPortamentoRate, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Distance required to double change from nonpropotinal portamento time} xywh {463 20 25 25} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->portamento.propRate);} code1 {o->selection_color(setKnob(o->value(),80));} class WidgetPDial } Fl_Dial proptb { label {Prp.Dpth} callback {// o->selection_color(setKnob(o->value(),90)); send_data(0, PART::control::proportionalPortamentoDepth, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {The difference from nonproportinal portamento} xywh {463 60 25 25} labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->value(part->ctl->portamento.propDepth);} code1 {o->selection_color(setKnob(o->value(),90));} class WidgetPDial } Fl_Check_Button rcv { label Rcv callback {// send_data(0, PART::control::receivePortamento, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Receive Portamento Controllers} xywh {345 20 40 18} box THIN_UP_BOX down_box DOWN_BOX selection_color 64 labelsize 10 labelcolor 64 code0 {o->value(part->ctl->portamento.receive);} class Fl_Check_Button2 } Fl_Check_Button proprt { label {Proprt.} callback {// if (o->value()) { propta->activate(); proptb->activate(); } else { propta->deactivate(); proptb->deactivate(); } send_data(0, PART::control::enableProportionalPortamento, o->value(), TOPLEVEL::type::Integer, npart);} tooltip {Enable Proportional Portamento (over fixed Portamento)} xywh {345 40 50 18} box THIN_UP_BOX down_box DOWN_BOX selection_color 64 labelsize 9 labelcolor 64 code0 {o->value(part->ctl->portamento.proportional);} code1 {if (o->value()){propta->activate();proptb->activate();}} code2 {else {propta->deactivate();proptb->deactivate();}} class Fl_Check_Button2 } } Fl_Button resetallctl { label {&Reset all controllers} callback {// send_data(TOPLEVEL::action::forceUpdate, PART::control::resetAllControllers, o->value(), TOPLEVEL::type::Integer, npart);} xywh {5 105 210 20} box PLASTIC_UP_BOX color 228 labelcolor 64 } Fl_Button aftertouch { label {&Aftertouch} callback {//; ShowAT(); atSeen = 1; if ((Fl::event_button() == 3)) ctlwindow->hide();} xywh {245 105 130 20} box GTK_THIN_UP_BOX color 198 labelcolor 64 } Fl_Button ctlclose { label {&Close} callback {//; saveWin(synth, ctlwindow->w(), ctlwindow->h(), ctlwindow->x(), ctlwindow->y(), false, "Part-controllers"); ctlSeen = false; lastctlW = 0; ctlwindow->hide();} xywh {405 105 95 20} box THIN_UP_BOX color 196 labelcolor 64 } } Fl_Window aftertouchcontrol { label Aftertouch callback {// saveWin(synth, aftertouchcontrol->w(), aftertouchcontrol->h(), aftertouchcontrol->x(), aftertouchcontrol->y(), false, "Part-aftertouch"); aftertouchcontrol->hide();} xywh {569 115 485 180} type Double hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Aftertouch"), npart, TOPLEVEL::windowTitle)).c_str());} code1 {atDW = o->w(); atDH = o->h();} code2 {o->size_range(atDW, atDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Box {} { xywh {9 5 228 171} box ENGRAVED_FRAME } Fl_Box {} { xywh {241 5 234 143} box ENGRAVED_FRAME } Fl_Box ATchan { label Channel xywh {95 13 35 17} labelfont 1 labelcolor 64 } Fl_Button channeloff { label Off callback {// channelfiltercutoff->value(0); channelfilterCminus->value(0); channelfilterCminus->deactivate(); channelfilterQ->value(0); channelfilterQminus->value(0); channelfilterQminus->deactivate(); channelpitchbend->value(0); channelpitchBminus->value(0); channelpitchBminus->deactivate(); channelmodulation->value(0); channelvolume->value(0); setATchannel(PART::aftertouchType::off, true);} xywh {55 40 48 20} box PLASTIC_UP_BOX color 228 labelcolor 64 } Fl_Check_Button channelfiltercutoff { label {Filter Cutoff} callback {// if (o->value()) channelfilterCminus->activate(); else { channelfilterCminus->value(0); channelfilterCminus->deactivate(); } setATchannel(PART::aftertouchType::filterCutoff, o->value());} tooltip {Between current MIDI setting and max.} xywh {25 65 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button channelfilterCminus { label Down callback {// setATchannel(PART::aftertouchType::filterCutoffDown, o->value());} tooltip {Between current MIDI setting and zero} xywh {150 65 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 deactivate class Fl_Check_Button2 } Fl_Check_Button channelfilterQ { label {Filter Q} callback {// if (o->value()) channelfilterQminus->activate(); else { channelfilterQminus->value(0); channelfilterQminus->deactivate(); } setATchannel(PART::aftertouchType::filterQ, o->value());} tooltip {Between current MIDI setting and max.} xywh {25 85 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button channelfilterQminus { label Down callback {// setATchannel(PART::aftertouchType::filterQdown, o->value());} tooltip {Between current MIDI setting and zero} xywh {150 85 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 deactivate class Fl_Check_Button2 } Fl_Check_Button channelpitchbend { label {Pitch Bend} callback {// if (o->value()) channelpitchBminus->activate(); else { channelpitchBminus->value(0); channelpitchBminus->deactivate(); } setATchannel(PART::aftertouchType::pitchBend, o->value());} tooltip {Between current pitch wheel position and max.} xywh {25 105 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button channelpitchBminus { label Down callback {// setATchannel(PART::aftertouchType::pitchBendDown, o->value());} tooltip {Between current pitch wheel position and min.} xywh {150 105 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 deactivate class Fl_Check_Button2 } Fl_Check_Button channelmodulation { label Modulation callback {// setATchannel(PART::aftertouchType::modulation, o->value());} tooltip {Between zero and Add/Pad frequency LFO depth} xywh {25 125 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button channelvolume { label Volume callback {// setATchannel(PART::aftertouchType::volume, o->value());} tooltip {Between current part volume and max.} xywh {25 145 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Box ATkey { label Key xywh {328 13 35 17} labelfont 1 labelcolor 64 } Fl_Button polyoff { label Off callback {// polyfiltercutoff->value(0); polyfilterCminus->value(0); polyfilterCminus->deactivate(); polyfilterQ->value(0); polyfilterQminus->value(0); polyfilterQminus->deactivate(); polypitchbend->value(0); polypitchBminus->value(0); polypitchBminus->deactivate(); polymodulation->value(0); setATkey(PART::aftertouchType::off, true);} xywh {300 40 48 20} box PLASTIC_UP_BOX color 228 labelcolor 64 } Fl_Check_Button polyfiltercutoff { label {Filter Cutoff} callback {// if (o->value()) polyfilterCminus->activate(); else { polyfilterCminus->value(0); polyfilterCminus->deactivate(); } setATkey(PART::aftertouchType::filterCutoff, o->value());} tooltip {Between current MIDI setting and max.} xywh {270 65 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button polyfilterCminus { label Down callback {// setATkey(PART::aftertouchType::filterCutoffDown, o->value());} tooltip {Between current MIDI setting and zero} xywh {395 65 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 deactivate class Fl_Check_Button2 } Fl_Check_Button polyfilterQ { label {Filter Q} callback {// if (o->value()) polyfilterQminus->activate(); else { polyfilterQminus->value(0); polyfilterQminus->deactivate(); } setATkey(PART::aftertouchType::filterQ, o->value());} tooltip {Between current MIDI setting and max.} xywh {270 85 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button polyfilterQminus { label Down callback {// setATkey(PART::aftertouchType::filterQdown, o->value());} tooltip {Between current MIDI setting and zero} xywh {395 85 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 deactivate class Fl_Check_Button2 } Fl_Check_Button polypitchbend { label {Pitch Bend} callback {// if (o->value()) polypitchBminus->activate(); else { polypitchBminus->value(0); polypitchBminus->deactivate(); } setATkey(PART::aftertouchType::pitchBend, o->value());} tooltip {Between current pitch wheel position and max.} xywh {270 105 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Check_Button polypitchBminus { label Down callback {// setATkey(PART::aftertouchType::pitchBendDown, o->value());} tooltip {Between current pitch wheel position and min.} xywh {395 105 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 deactivate class Fl_Check_Button2 } Fl_Check_Button polymodulation { label Modulation callback {// setATkey(PART::aftertouchType::modulation, o->value());} tooltip {Between zero and Add/Pad frequency LFO depth} xywh {270 125 70 15} down_box DOWN_BOX selection_color 64 labelcolor 64 class Fl_Check_Button2 } Fl_Button atClose { label {&Close} callback {// saveWin(synth, aftertouchcontrol->w(), aftertouchcontrol->h(), aftertouchcontrol->x(), aftertouchcontrol->y(), false, "Part-aftertouch"); if ((Fl::event_button() == 3)) { if (atSeen > 1) instrumenteditwindow->show(); else ctlwindow->show(); } atSeen = 0; aftertouchcontrol->hide();} xywh {420 154 50 20} box THIN_UP_BOX color 196 labelcolor 64 } } } Function {send_data(int action, int control, float value, int type, int npart, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int miscmsg = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, engine, insert, parameter, UNUSED, miscmsg);} {} } Function {fetchData(float value, int control, int part, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED, int request = UNUSED)} {return_type float } { code {// return collect_readData(synth, value, control, part, kititem, engine, insert, parameter, offset, miscmsg, request);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char newpart = getData->data.part; unsigned char kititem = getData->data.kit; unsigned char engine = getData->data.engine; unsigned char insert = getData->data.insert; unsigned char parameter = getData->data.parameter; unsigned char miscmsg = getData->data.miscmsg; bool valBool = _SYS_::F2B(value); int valInt = lrint(value); string text; if (miscmsg != NO_MSG) text = textMsgBuffer.fetch(miscmsg); if (npart != newpart) return; bool forCurrentEff = (engine == inseffectui->effNum()); bool kitType = (insert == TOPLEVEL::insert::kitGroup); if (!kitType) kititem = 0; switch(control) { case PART::control::enableAdd: partkititem[kititem]->adcheck->value(valBool); if (valBool) { partkititem[kititem]->adeditbutton->activate(); if (kititem == 0) { adsynenabledcheck->value(1); adeditbutton->activate(); } } else { partkititem[kititem]->adeditbutton->deactivate(); if (kititem == 0) { adsynenabledcheck->value(0); adeditbutton->deactivate(); } } break; case PART::control::enableSub: partkititem[kititem]->subcheck->value(valBool); if (valBool) { partkititem[kititem]->subeditbutton->activate(); if (kititem == 0) { subsynenabledcheck->value(1); subeditbutton->activate(); } } else { partkititem[kititem]->subeditbutton->deactivate(); if (kititem == 0) { subsynenabledcheck->value(0); subeditbutton->deactivate(); } } break; case PART::control::enablePad: partkititem[kititem]->padcheck->value(valBool); if (valBool) { partkititem[kititem]->padeditbutton->activate(); if (kititem ==0) { padsynenabledcheck->value(1); padeditbutton->activate(); } } else { partkititem[kititem]->padeditbutton->deactivate(); if (kititem ==0) { padsynenabledcheck->value(0); padeditbutton->deactivate(); } } break; case PART::control::enableKitLine: partkititem[kititem]->enabledcheck->value(valBool); if (valBool) partkititem[kititem]->partkititemgroup->activate(); else partkititem[kititem]->clearLine(); break; case PART::control::channelATset: channelATselection = valInt; fetchChannel(); if (parameter != UNUSED) { keyATselection = parameter; fetchKey(); } break; case PART::control::keyATset: keyATselection = valInt; fetchKey(); if (parameter != UNUSED) { channelATselection = parameter; fetchChannel(); } break; case PART::control::kitItemMute: partkititem[kititem]->mutedcheck->value(valBool); break; case PART::control::minNote: case PART::control::minToLastKey: // this will have been modified for last key press partkititem[kititem]->minkcounter->value(valInt); break; case PART::control::maxNote: case PART::control::maxToLastKey: // this will have been modified for last key press partkititem[kititem]->maxkcounter->value(valInt); break; case PART::control::resetMinMaxKey: partkititem[kititem]->minkcounter->value(0); partkititem[kititem]->maxkcounter->value(127); break; case PART::control::kitEffectNum: partkititem[kititem]->sendtoeffect->value(valInt); break; case PART::control::humanise: humanise->value(valInt); humanise->selection_color(setSlider(humanise->value(),0)); break; case PART::control::humanvelocity: velocityhumanise->value(valInt); velocityhumanise->selection_color(setSlider(velocityhumanise->value(),0)); break; case PART::control::drumMode: drumMode->value(valBool); break; case PART::control::kitMode: if (part->PkitfadeType == 1) { kitMode->value(3); } else { kitMode->value(valInt); } partKitOn = (kitMode->value() > 0); if (partKitOn > 0) kitlist->activate(); else kitlist->deactivate(); break; case PART::control::effectNumber: refreshEffUI(); if (forCurrentEff) inseffectui->UpdatePresetColour(parameter, insefftype->value()); else { lastfxW = 0; lastDynFiltW = 0; } break; case PART::control::effectType: if (forCurrentEff) { // changing effect type always sets default values refreshEffUI(); inseffectui->UpdatePresetColour(0, insefftype->value()); fxRtext(); } break; case PART::control::effectDestination: if (forCurrentEff) sendtochoice->value(inseffectui->getPartFxRouting()); break; case PART::control::effectBypass: if (forCurrentEff) bypasseff->value(inseffectui->getPartFxBypass()); break; // controllers case PART::control::volumeRange: volrng->value(valInt); volrng->selection_color(setKnob(valInt,96)); break; case PART::control::volumeEnable: vol->value(valInt); break; case PART::control::panningWidth: panwidth->value(valInt); panwidth->selection_color(setKnob(valInt,64)); break; case PART::control::modWheelDepth: modwh->value(valInt); modwh->selection_color(setKnob(valInt,80)); break; case PART::control::exponentialModWheel: expmwh->value(valInt); break; case PART::control::bandwidthDepth: bwdpth->value(valInt); bwdpth->selection_color(setKnob(valInt,64)); break; case PART::control::exponentialBandwidth: expbw->value(valInt); break; case PART::control::expressionEnable: expr->value(valInt); break; case PART::control::FMamplitudeEnable: fmamp->value(valInt); break; case PART::control::sustainPedalEnable: sustain->value(valInt); break; case PART::control::pitchWheelRange: pwheelbrng->value(valInt); break; case PART::control::filterQdepth: filtq->value(valInt); filtq->selection_color(setKnob(valInt,64)); break; case PART::control::filterCutoffDepth: fltcut->value(valInt); fltcut->selection_color(setKnob(valInt,64)); break; case PART::control::breathControlEnable: breath->value(valBool); break; case PART::control::resonanceCenterFrequencyDepth: cfdpth->value(valInt); cfdpth->selection_color(setKnob(valInt,64)); break; case PART::control::resonanceBandwidthDepth: rbwdpth->value(valInt); rbwdpth->selection_color(setKnob(valInt,64)); break; case PART::control::portamentoTime: prtime->value(valInt); prtime->selection_color(setKnob(valInt,64)); break; case PART::control::portamentoTimeStretch: timedu->value(valInt); timedu->selection_color(setKnob(valInt,64)); break; case PART::control::portamentoThreshold: thresh->value(valInt); break; case PART::control::portamentoThresholdType: thtype->value(valInt); break; case PART::control::enableProportionalPortamento: proprt->value(valInt); if (value != 0) { propta->activate(); proptb->activate(); } else { propta->deactivate(); proptb->deactivate(); } break; case PART::control::proportionalPortamentoRate: propta->value(valInt); propta->selection_color(setKnob(valInt,80)); break; case PART::control::proportionalPortamentoDepth: proptb->value(valInt); proptb->selection_color(setKnob(valInt,90)); break; case PART::control::receivePortamento: rcv->value(valInt); break; case PART::control::midiModWheel: modulation->value(value); modulation->selection_color(setKnob(value,64)); break; case PART::control::midiExpression: expression->value(value); expression->selection_color(setKnob(value,127)); break; case PART::control::midiFilterQ: filterq->value(value); filterq->selection_color(setKnob(value,64)); break; case PART::control::midiFilterCutoff: filtercutoff->value(value); filtercutoff->selection_color(setKnob(value,64)); break; case PART::control::midiBandwidth: masterbandwidth->value(value); masterbandwidth->selection_color(setKnob(value,64)); break; case PART::control::instrumentCopyright: copyright->value(text.c_str()); break; case PART::control::instrumentComments: commentField->value(text.c_str()); break; case PART::control::instrumentName: partkititem[kititem]->labelbutton->copy_label(text.c_str()); break; case PART::control::instrumentType: instrumentType->value(value); break; case PART::control::defaultInstrumentCopyright: if (parameter == 0) copyright->value(text.c_str()); break; case PART::control::resetAllControllers: controllersrefresh(); break; default: break; } if (control == PART::control::enableAdd || control == PART::control::enableSub || control == PART::control::enablePad) checkEngines(); ;} {} } Function {paste(CommandBlock *getData)} {} { code {// int kititem = getData->data.kit; int engine = getData->data.engine; int insert = getData->data.insert; if (kititem >= EFFECT::type::none && kititem < EFFECT::type::count) { bool show = partfx->visible() && engine == inseffectui->effNum(); effectsrefresh(); if (show) partfx->show(); return; } if (kititem != lastkititem) return; // only update engines if current kititem; if (engine >= PART::engine::addVoice1 && engine < PART::engine::addVoiceModEnd) { int voiceNum = (engine - PART::engine::addVoice1); //std::cout << "voice " << voiceNum << std::endl; if (insert == TOPLEVEL::insert::oscillatorGroup) { adnoteui->advoice->paste(); return; } if (voiceNum == adnoteui->nvoice) { if(adnoteui->ADnoteVoice->visible()) { adnoteui->editVoice(voiceNum); } } return; } if (engine == PART::engine::addSynth) { if (getData->data.insert == TOPLEVEL::insert::resonanceGroup) { //std::cout << "in Resonance" << std::endl; if (adnoteui) adnoteui->paste(getData); return; } //std::cout << "add top level " << engine << std::endl; if (adnoteui != NULL) { if (adnoteui->ADnoteGlobalParameters->visible()) adnoteui ->refresh(); } return; } //std::cout << "Next section" << std::endl; if (engine == PART::engine::subSynth) { //std::cout << "sub top level" << std::endl; if (subnoteui != NULL) { if (subnoteui->SUBparameters->visible()) subnoteui->refresh(); } return; } if (engine == PART::engine::padSynth) { if (getData->data.insert == TOPLEVEL::insert::resonanceGroup) { if (padnoteui) padnoteui->paste(getData); return; } //std::cout << "pad top level" << std::endl; if (padnoteui != NULL) { if(padnoteui->padnotewindow->visible()) padnoteui->refresh(); } return; } std::cout << "invalid paste" << std::endl;} {} } Function {PartUI(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {// part = NULL; adnoteui = NULL; subnoteui = NULL; padnoteui = NULL; editSeen = false; fxSeen = false; kitSeen = false; ctlSeen = false; ctlmidiSeen = false; atSeen = false; lastfxW = 0; lastDynFiltW = 0; lastkitW = 0; lastmidiW = 0; lastatW = 0; lastkititem = -1;} {} } Function {rebuild(int npart_)} {} { code {// if (adnoteui != NULL) { delete adnoteui; adnoteui = NULL; } if (subnoteui != NULL) { delete subnoteui; subnoteui = NULL; } if (padnoteui != NULL) { delete padnoteui; padnoteui = NULL; } npart = npart_; part = synth->part[npart]; lastkey = -1; if (part->kit[0].adpars) adnoteui = new ADnoteUI(part->kit[0].adpars, npart, 0); if (part->kit[0].subpars) subnoteui = new SUBnoteUI(part->kit[0].subpars, npart, 0); if (part->kit[0].padpars) padnoteui = new PADnoteUI(part->kit[0].padpars); checkEngines(); editrefresh(); effectsrefresh(); kitrefresh(); controllersrefresh(); ctlmidirefresh(); ATrefresh();} {} } Function {fillInstrumentType()} {} { code {// int i = 0; string entry = type_list[i]; while (entry != "@end") { instrumentType->add(entry.c_str()); ++ i; entry = type_list[i]; }} {} } Function {editrefresh()} {} { code {// instrumenteditwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Edit"), npart, TOPLEVEL::windowTitle)).c_str()); setinstrumentlabel(); instrumenteditwindow->redraw(); fillInstrumentType(); copyright->value(part->info.Pauthor.c_str()); commentField->value(part->info.Pcomments.c_str()); string name = part->Poriginal; if (!name.empty() && name != UNTITLED && part->Pname != name) { originaltext->copy_label(name.c_str()); originalname->show(); originaltext->show(); } else { originalname->hide(); originaltext->hide(); } instrumentType->value(part->info.Ptype); humanise->value(fetchData(0, PART::control::humanise, npart)); humanise->selection_color(setSlider(humanise->value(),0)); velocityhumanise->value(fetchData(0, PART::control::humanvelocity, npart)); velocityhumanise->selection_color(setSlider(velocityhumanise->value(),0));} {} } Function {effectsrefresh()} {} { code {// partfx->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Effects"), npart, TOPLEVEL::windowTitle)).c_str()); refreshEffUI(); bool isChanged = inseffectui->isChanged(); inseffectui->UpdatePresetColour(isChanged, insefftype->value()); lastfxW = 0; lastDynFiltW = 0;} {} } Function {kitrefresh()} {} { code {// instrumentkitlist->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Kit List"), npart, TOPLEVEL::windowTitle)).c_str()); drumMode->value(part->Pdrummode); if (part->PkitfadeType == 1) { kitMode->value(3); } else { kitMode->value(part->Pkitmode); } if (kitMode->value()) { partKitOn = true; kitlist->activate(); } else { partKitOn = false; kitlist->deactivate(); } lastkititem = -1; for (int i = 0; i < NUM_KIT_ITEMS; ++i) { if (part->kit[i].Penabled) { partkititem[i]->enabledcheck->value(1); partkititem[i]->partkititemgroup->activate(); partkititem[i]->mutedcheck->value(!part->kit[i].Penabled); partkititem[i]->adcheck->value(part->kit[i].Padenabled); if (partkititem[i]->adcheck->value()) partkititem[i]->adeditbutton->activate(); else partkititem[i]->adeditbutton->deactivate(); partkititem[i]->subcheck->value(part->kit[i].Psubenabled); if (partkititem[i]->subcheck->value()) partkititem[i]->subeditbutton->activate(); else partkititem[i]->subeditbutton->deactivate(); partkititem[i]->padcheck->value(part->kit[i].Ppadenabled); if (partkititem[i]->padcheck->value()) partkititem[i]->padeditbutton->activate(); else partkititem[i]->padeditbutton->deactivate(); } else { partkititem[i]->enabledcheck->value(0); partkititem[i]->partkititemgroup->deactivate(); partkititem[i]->mutedcheck->value(0); partkititem[i]->adcheck->value(0); partkititem[i]->adeditbutton->deactivate(); partkititem[i]->subcheck->value(0); partkititem[i]->subeditbutton->deactivate(); partkititem[i]->padcheck->value(0); partkititem[i]->padeditbutton->deactivate(); } partkititem[i]->labelbutton->copy_label(part->kit[i].Pname.c_str()); partkititem[i]->minkcounter->value(part->kit[i].Pminkey); partkititem[i]->maxkcounter->value(part->kit[i].Pmaxkey); int effnum = part->kit[i].Psendtoparteffect + 1; if (effnum > 3) effnum = 0; partkititem[i]->sendtoeffect->value(effnum); }} {} } Function {controllersrefresh()} {} { code {// ctlwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Controllers"), npart, TOPLEVEL::windowTitle)).c_str()); expmwh->value(part->ctl->modwheel.exponential); modwh->value(part->ctl->modwheel.depth); modwh->selection_color(setKnob(modwh->value(),80)); expbw->value(part->ctl->bandwidth.exponential); bwdpth->value(part->ctl->bandwidth.depth); bwdpth->selection_color(setKnob(bwdpth->value(),64)); pwheelbrng->value(part->ctl->pitchwheel.bendrange); panwidth->value(part->ctl->panning.depth); panwidth->selection_color(setKnob(panwidth->value(),64)); filtq->value(part->ctl->filterq.depth); filtq->selection_color(setKnob(filtq->value(),64)); fltcut->value(part->ctl->filtercutoff.depth); fltcut->selection_color(setKnob(fltcut->value(),64)); volrng->value(part->ctl->volume.data); volrng->selection_color(setKnob(volrng->value(),96)); expr->value(part->ctl->expression.receive); fmamp->value(part->ctl->fmamp.receive); vol->value(part->ctl->volume.receive); sustain->value(part->ctl->sustain.receive); breath->value(part->PbreathControl == MIDI::CC::breath); cfdpth->value(part->ctl->resonancecenter.depth); cfdpth->selection_color(setKnob(cfdpth->value(),64)); rbwdpth->value(part->ctl->resonancebandwidth.depth); rbwdpth->selection_color(setKnob(rbwdpth->value(),64)); rcv->value(part->ctl->portamento.receive); thresh->value(part->ctl->portamento.pitchthresh); propta->value(part->ctl->portamento.propRate); propta->selection_color(setKnob(propta->value(),80)); proprt->value(part->ctl->portamento.proportional); if (proprt->value()) { propta->activate(); proptb->activate(); } else { propta->deactivate(); proptb->deactivate(); } prtime->value(part->ctl->portamento.time); prtime->selection_color(setKnob(prtime->value(),64)); timedu->value(part->ctl->portamento.updowntimestretch); timedu->selection_color(setKnob(timedu->value(),64)); thtype->value(part->ctl->portamento.pitchthreshtype); proptb->value(part->ctl->portamento.propDepth); proptb->selection_color(setKnob(proptb->value(),90));} {} } Function {ctlmidirefresh()} {} { code {// ctlmidi->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("MIDI Controls"), npart, TOPLEVEL::windowTitle)).c_str()); modulation->value(part->ctl->modwheel.data); modulation->selection_color(setKnob(modulation->value(),64)); expression->value(part->ctl->expression.data); expression->selection_color(setKnob(expression->value(),127)); filterq->value(part->ctl->filterq.data); filterq->selection_color(setKnob(filterq->value(),64)); filtercutoff->value(part->ctl->filtercutoff.data); filtercutoff->selection_color(setKnob(filtercutoff->value(),64)); masterbandwidth->value(part->ctl->bandwidth.data); masterbandwidth->selection_color(setKnob(masterbandwidth->value(),64));} {} } Function {ATrefresh()} {} { code {// aftertouchcontrol->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Aftertouch"), npart, TOPLEVEL::windowTitle)).c_str()); channelATselection = int(fetchData(0, PART::control::channelATset, npart)); fetchChannel(); keyATselection = int(fetchData(0, PART::control::keyATset, npart)); fetchKey();} {} } Function {fetchChannel()} {} { code {// channelfiltercutoff->value(0); // clear settings first channelfilterCminus->value(0); channelfilterCminus->deactivate(); channelfilterQ->value(0); channelfilterQminus->value(0); channelfilterQminus->deactivate(); channelpitchbend->value(0); channelpitchBminus->value(0); channelpitchBminus->deactivate(); channelmodulation->value(0); channelvolume->value(0); if (channelATselection & PART::aftertouchType::filterCutoff) { channelfiltercutoff->value(1); channelfilterCminus->activate(); if (channelATselection & PART::aftertouchType::filterCutoffDown) channelfilterCminus->value(1); } if (channelATselection & PART::aftertouchType::filterQ) { channelfilterQ->value(1); channelfilterQminus->activate(); if (channelATselection & PART::aftertouchType::filterQdown) channelfilterQminus->value(1); } if (channelATselection & PART::aftertouchType::pitchBend) { channelpitchbend->value(1); channelpitchBminus->activate(); if (channelATselection & PART::aftertouchType::pitchBendDown) channelpitchBminus->value(1); } if (channelATselection & PART::aftertouchType::modulation) channelmodulation->value(1); if (channelATselection & PART::aftertouchType::volume) channelvolume->value(1);} {} } Function {fetchKey()} {} { code {// polyfiltercutoff->value(0); // clear settings first polyfilterCminus->value(0); polyfilterCminus->deactivate(); polyfilterQ->value(0); polyfilterQminus->value(0); polyfilterQminus->deactivate(); polypitchbend->value(0); polypitchBminus->value(0); polypitchBminus->deactivate(); polymodulation->value(0); if (keyATselection & PART::aftertouchType::filterCutoff) { polyfiltercutoff->value(1); polyfilterCminus->activate(); if (keyATselection & PART::aftertouchType::filterCutoffDown) polyfilterCminus->value(1); } if (keyATselection & PART::aftertouchType::filterQ) { polyfilterQ->value(1); polyfilterQminus->activate(); if (keyATselection & PART::aftertouchType::filterQdown) polyfilterQminus->value(1); } if (keyATselection & PART::aftertouchType::pitchBend) { polypitchbend->value(1); polypitchBminus->activate(); if (keyATselection & PART::aftertouchType::pitchBendDown) polypitchBminus->value(1); } if (keyATselection & PART::aftertouchType::modulation) polymodulation->value(1);} {} } Function {setATchannel(int type, int state)} {} { code {// if (type == PART::aftertouchType::off) channelATselection = 0; else { if (state > 0) { channelATselection |= type; if (keyATselection & type) { keyATselection &= ~type; fetchKey(); } } else { channelATselection &= ~type; if (type == PART::aftertouchType::filterCutoff) channelATselection &= ~PART::aftertouchType::filterCutoffDown; else if (type == PART::aftertouchType::filterQ) channelATselection &= ~PART::aftertouchType::filterQdown; else if (type == PART::aftertouchType::pitchBend) channelATselection &= ~PART::aftertouchType::pitchBendDown; } } send_data(0, PART::channelATset, channelATselection, TOPLEVEL::type::Integer, npart);} {} } Function {setATkey(int type, int state)} {} { code {// if (type == PART::aftertouchType::off) keyATselection = 0; else { if (state > 0) { keyATselection |= type; if (channelATselection & type) { channelATselection &= ~type; fetchChannel(); } } else { keyATselection &= ~type; if (type == PART::aftertouchType::filterCutoff) keyATselection &= ~PART::aftertouchType::filterCutoffDown; else if (type == PART::aftertouchType::filterQ) keyATselection &= ~PART::aftertouchType::filterQdown; else if (type == PART::aftertouchType::pitchBend) keyATselection &= ~PART::aftertouchType::pitchBendDown; } } send_data(0, PART::keyATset, keyATselection, TOPLEVEL::type::Integer, npart);} {} } Function {init(Part *part_,int npart_,BankUI *bankui_)} {} { code {// synth = & part_->getSynthEngine(); bankui = bankui_; part = part_; npart = npart_; plgroup = &synth->getGuiMaster()->panelgroup; make_window(); end();} {} } Function {checkEngines(string instrumentName = "")} {} { code {// engine = 0; if (instrumentName == "") instrumentName = part->Pname; partname = instrumentName; if (part->kit[0].Padenabled) { engine |= 1; adsynenabledcheck->value(1); adeditbutton->activate(); addbox->color(add_back); } else { adsynenabledcheck->value(0); adeditbutton->deactivate(); addbox->color(FL_BACKGROUND_COLOR); } if (part->kit[0].Psubenabled) { engine |= 2; subsynenabledcheck->value(1); subeditbutton->activate(); subbox->color(sub_back); } else { subsynenabledcheck->value(0); subeditbutton->deactivate(); subbox->color(FL_BACKGROUND_COLOR); } if (part->kit[0].Ppadenabled) { engine |= 4; padsynenabledcheck->value(1); padeditbutton->activate(); padbox->color(pad_back); } else { padsynenabledcheck->value(0); padeditbutton->deactivate(); padbox->color(FL_BACKGROUND_COLOR); } engine = collect_readData(synth, 0, PART::control::instrumentEngines, npart); synth->getGuiMaster()->updateEngines(engine, instrumentName);} {} } Function {showparameters(int kititem, int engine)} {} { code {// kitname = part->kit[kititem].Pname; if (engine == -1) { // this is used if I want to clear the engine from the part if (kititem == lastkititem) kititem = -1; else kititem = lastkititem; } checkEngines(); if (kititem != lastkititem) { if (adnoteui != NULL) delete adnoteui; if (subnoteui != NULL) delete subnoteui; if (padnoteui != NULL) delete padnoteui; adnoteui = NULL; subnoteui = NULL; padnoteui = NULL; lastkititem = kititem; if (kititem >= NUM_KIT_ITEMS) return; // bad kit item if (kititem < 0) return; if (part->kit[kititem].adpars) adnoteui = new ADnoteUI(part->kit[kititem].adpars, npart, lastkititem); if (part->kit[kititem].subpars) subnoteui = new SUBnoteUI(part->kit[kititem].subpars, npart, lastkititem); if (part->kit[kititem].padpars) padnoteui = new PADnoteUI(part->kit[kititem].padpars); } if (engine == 0 && adnoteui != NULL) adnoteui->ShowGlobal(); if (engine == 1 && subnoteui != NULL) subnoteui->Showsub(); if (engine == 2 && padnoteui != NULL) padnoteui->Showpad();} {} } Function {setinstrumentlabel(string text = "")} {} { code {// engine = 0; for (int i = 0; i < NUM_KIT_ITEMS; ++i) { if (part->kit[i].Padenabled) engine |= 1; if (part->kit[i].Psubenabled) engine |= 2; if (part->kit[i].Ppadenabled) engine |= 4; } if (engine & 1) synth->getGuiMaster()->instrumentaddbox->color(add_back); else synth->getGuiMaster()->instrumentaddbox->color(bank_back_used); if (engine & 2) synth->getGuiMaster()->instrumentsubbox->color(sub_back); else synth->getGuiMaster()->instrumentsubbox->color(bank_back_used); if (engine & 4) synth->getGuiMaster()->instrumentpadbox->color(pad_back); else synth->getGuiMaster()->instrumentpadbox->color(bank_back_used); if (part->PyoshiType) synth->getGuiMaster()->instrumentlabel->labelcolor(yoshi_ins_typ); else synth->getGuiMaster()->instrumentlabel->labelcolor(gen_text); if (text == "") text = part->Pname.c_str(); partname = text; synth->getGuiMaster()->instrumentlabel->copy_label(text.c_str());} {} } Function {refreshEffUI()} {} { code {// insefftype->value(inseffectui->effType()); inseffnocounter->value(inseffectui->effNum() + 1); inseffectui->refresh(npart); bypasseff->value(inseffectui->getPartFxBypass()); sendtochoice->value(inseffectui->getPartFxRouting());} {} } Function {seteditname()} {} { code {// instrumenteditwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Edit"), npart, TOPLEVEL::windowTitle)).c_str());} {} } Function {Showedit()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Part-edit"); if (fetchW < editDW || fetchH < editDH) { fetchW = editDW; fetchH = editDH; } checkSane(fetchX, fetchY, fetchW, fetchH, editDW, editDH); instrumenteditwindow->resize(fetchX, fetchY, fetchW, fetchH); lasteditW = 0; instrumenteditwindow->show(); editSeen = true;} {} } Function {Showctl()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Part-controllers"); if (fetchW < ctlDW || fetchH < ctlDH) { fetchW = ctlDW; fetchH = ctlDH; } checkSane(fetchX, fetchY, fetchW, fetchH, ctlDW, ctlDH); ctlwindow->resize(fetchX, fetchY, fetchW, fetchH); lastctlW = 0; ctlwindow->show(); ctlSeen = true;} {} } Function {ShowAT()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Part-aftertouch"); if (fetchW < atDW || fetchH < atDH) { fetchW = atDW; fetchH = atDH; } checkSane(fetchX, fetchY, fetchW, fetchH, atDW, atDH); aftertouchcontrol->resize(fetchX, fetchY, fetchW, fetchH); aftertouchcontrol->show();} {} } Function {Showctlmidi()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Part-ctlmidi"); if (fetchW < midiDW || fetchH < midiDH) { fetchW = midiDW; fetchH = midiDH; } checkSane(fetchX, fetchY, fetchW, fetchH, midiDW, midiDH, true); ctlmidi->resize(fetchX, fetchY, fetchW, fetchH); ctlmidi->show(); ctlmidiSeen = true;} {} } Function {Showefx()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Part-effects"); if (fetchW < fxDW || fetchH < fxDH) { fetchW = fxDW; fetchH = fxDH; } checkSane(fetchX, fetchY, fetchW, fetchH, fxDW, fxDH); partfx->resize(fetchX, fetchY, fetchW, fetchH); partfx->show(); fxSeen = true;} {} } Function {Showkit()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Part-kit"); if (fetchW < kitDW || fetchH < kitDH) { fetchW = kitDW; fetchH = kitDH; } checkSane(fetchX, fetchY, fetchW, fetchH, kitDW, kitDH); instrumentkitlist->resize(fetchX, fetchY, fetchW, fetchH); instrumentkitlist->show(); kitSeen = true;} {} } Function {wincheck()} {} { code {// if (instrumenteditwindow->visible()) editRtext(); if (partfx->visible()) { if (insefftype->value() == (EFFECT::type::dynFilter - EFFECT::type::none)) { if(inseffectui->filterwindow != NULL) { if(inseffectui->filterwindow->visible()) { if (lastDynFiltW != inseffectui->filterwindow->w()) { inseffectui->filtRtext(); lastDynFiltW = inseffectui->filterwindow->w(); } } } } fxRtext(); } if (instrumentkitlist->visible() && instrumentkitlist->w() != lastkitW) { kitRtext(); lastkitW = instrumentkitlist->w(); } if (ctlwindow->visible()) ctlRtext(); if (ctlmidi->visible() && ctlmidi->w() != lastmidiW) { ctlmidiRtext(); lastmidiW = ctlmidi->w(); } if (aftertouchcontrol->visible() && aftertouchcontrol->w() != lastatW) { ATRtext(); lastatW = aftertouchcontrol->w(); } if (adnoteui) adnoteui->wincheck(); if (subnoteui) subnoteui->subRtext(); if (padnoteui) padnoteui->padRtext();} {} } Function {theme()} {} { code {// if (instrumenteditwindow->visible()) { lasteditW=0; editRtext(); } if (partfx->visible()) { lastfxW = 0; fxRtext(); if (insefftype->value() == (EFFECT::type::dynFilter - EFFECT::type::none)) { if(inseffectui->filterwindow != NULL) { if(inseffectui->filterwindow->visible()) { inseffectui->filterwindow->redraw(); } if(inseffectui->fwin_filterui) inseffectui->fwin_filterui->theme(); } } } if (instrumentkitlist->visible()) { kitRtext(); } if (ctlwindow->visible()) { lastctlW = 0; ctlRtext(); } if (ctlmidi->visible()) { lastmidiW = 0; ctlmidiRtext(); } if (aftertouchcontrol->visible()) { ATRtext(); } if (adnoteui) adnoteui->theme(); if (subnoteui) subnoteui->theme(); if (padnoteui) padnoteui->theme(); ;} {} } Function {editRtext()} {} { code {// if (lasteditW == instrumenteditwindow->w()) return; lasteditW = instrumenteditwindow->w(); float dScale = instrumenteditwindow->w() / float(editDW); if (dScale < 0.2f) dScale = 0.2f; int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); int size14 = int(14 * dScale); int boxY = int(227 * dScale); int boxWidth = int(89 * dScale); int boxHeight = int(18 * dScale); ADD->labelsize(size14); addbox->resize(int(8 * dScale), boxY, boxWidth, boxHeight); adsynenabledcheck->labelsize(size11); adeditbutton->labelsize(size14); SUB->labelsize(size14); subbox->resize(int(103 * dScale), boxY, boxWidth, boxHeight); subsynenabledcheck->labelsize(size11); subeditbutton->labelsize(size14); PAD->labelsize(size14); padbox->resize(int(198 * dScale), boxY, boxWidth, boxHeight); padsynenabledcheck->labelsize(size11); padeditbutton->labelsize(size14); kitedit->labelsize(size14); effects->labelsize(size14); editAT->labelsize(size14); A_C_display->labelsize(size12); A_C_default->labelsize(size12); copyright->labelsize(size12); copyright->textsize(size14); commentField->labelsize(size12); commentField->textsize(size14); originalname->labelsize(size12); originaltext->labelsize(size12); instrumentType->labelsize(size11); instrumentType->textsize(size11); humanise->labelsize(size12); humanise->textsize(size); velocityhumanise->labelsize(size12); velocityhumanise->textsize(size); instrumentReset->labelsize(size14); editClose->labelsize(size14); ; humanise_display->labelsize(size14); instrumenteditwindow->redraw();} {} } Function {ctlRtext()} {} { code {// if (lastctlW == ctlwindow->w()) return; lastctlW = ctlwindow->w(); float dScale = ctlwindow->w() / float(ctlDW); if (dScale < 0.2f) dScale = 0.2f; int size = int(dScale * 10); int size14 = int(dScale * 14); volrng->labelsize(size); vol->labelsize(size); panwidth->labelsize(size); modwh->labelsize(size); expmwh->labelsize(size); bwdpth->labelsize(size); expbw->labelsize(size); expr->labelsize(size); fmamp->labelsize(size); sustain->labelsize(size); breath->labelsize(size); pwheelrnglabel->labelsize(size); pwheelbrng->textsize(size14); filtq->labelsize(size); fltcut->labelsize(size); ctlresonance->labelsize(size); cfdpth->labelsize(size); rbwdpth->labelsize(size); ctlportamento->labelsize(size); ctlx100->labelsize(size); prtime->labelsize(size); timedu->labelsize(size); threshlabel->labelsize(size); thresh->textsize(size14); thtype->labelsize(size); propta->labelsize(size); proptb->labelsize(size); rcv->labelsize(size); proprt->labelsize(size); resetallctl->labelsize(size14); aftertouch->labelsize(size14); ctlclose->labelsize(size14); ctlwindow->redraw();} {} } Function {ATRtext()} {} { code {// float dScale = aftertouchcontrol->w() / float(atDW); if (dScale < 0.2f) dScale = 0.2f; int size14 = int(dScale * 14); ATchan->labelsize(size14); channeloff->labelsize(size14); channelfiltercutoff->labelsize(size14); channelfilterCminus->labelsize(size14); channelfilterQ->labelsize(size14); channelfilterQminus->labelsize(size14); channelpitchbend->labelsize(size14); channelpitchBminus->labelsize(size14); channelmodulation->labelsize(size14); channelvolume->labelsize(size14); ATkey->labelsize(size14); polyoff->labelsize(size14); polyfiltercutoff->labelsize(size14); polyfilterCminus->labelsize(size14); polyfilterQ->labelsize(size14); polyfilterQminus->labelsize(size14); polypitchbend->labelsize(size14); polypitchBminus->labelsize(size14); polymodulation->labelsize(size14); atClose->labelsize(size14); aftertouchcontrol->redraw();} {} } Function {ctlmidiRtext()} {} { code {// float dScale = ctlmidi->w() / float(midiDW); if (dScale < 0.2f) dScale = 0.2f; int size = int(dScale * 10); modulation->labelsize(size); expression->labelsize(size); filterq->labelsize(size); filtercutoff->labelsize(size); masterbandwidth->labelsize(size); ctlmidiclose->labelsize(int(dScale * 14)-1); ctlmidi->redraw();} {} } Function {fxRtext()} {} { code {// /*if (lastfxW < 6) { ++lastfxW; return; }*/ if (lastfxW == partfx->w()) return; lastfxW = partfx->w(); float dScale = lastfxW / float(fxDW); if (dScale < 0.2f) dScale = 0.2f; int size12 = int(12 * dScale); inseffnocounter->labelsize(size12); inseffnocounter->textsize(size12); insefftype->labelsize(size12); insefftype->textsize(size12); sendtochoice->labelsize(size12); sendtochoice->textsize(size12); effCopy->labelsize(size12); effPaste->labelsize(size12); bypasseff->labelsize(size12); effClose->labelsize(int(14 * dScale)); inseffectui->effRtext(dScale, insefftype->value()); partfx->redraw();} {} } Function {kitRtext(bool force = false)} {} { code {// if (force) { int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Part-kit"); instrumentkitlist->resize(fetchX, fetchY, fetchW, fetchH); //kitSeen = true; }; float dW = instrumentkitlist->w() / float(kitDW); float dH = instrumentkitlist->h() / float(kitDH); float dScale = dW; if (dScale < 0.2f) dScale = 0.2f; int size11 = int(11 * dScale); kitnum->labelsize(size11); kitmute->labelsize(size11); kitID->labelsize(size11); kitminkey->labelsize(size11); kitmaxkey->labelsize(size11); addON->labelsize(size11); kitadd->labelsize(size11); subON->labelsize(size11); kitsub->labelsize(size11); padON->labelsize(size11); kitpad->labelsize(size11); kitfxnum->labelsize(size11); kitMode->labelsize(size11); kitMode->textsize(size11); drumMode->labelsize(size11); kitClose->labelsize(int(12 * dScale)); kitpack->resize(0, int(21.0f * dH), int(670.0f * dW), int(322.0f * dH)); for (int i = 0; i < NUM_KIT_ITEMS; ++i) { partkititem[i]->size(int(670.0f * dW), int(20.0f * dH)); partkititem[i]->partkititemgroup->size(int(605.0f * dW), int(20.0f * dH)); partkititem[i]->itemRtext(dScale); } instrumentkitlist->redraw();} {} } Function {~PartUI()} {} { code {// if (adnoteui) { adnoteui->ADnoteGlobalParameters->hide(); delete adnoteui; } if (subnoteui) { //subnoteui->hide(); delete subnoteui; } if (padnoteui) { //padnoteui->hide(); delete padnoteui; } if (atSeen > 0) saveWin(synth, aftertouchcontrol->w(), aftertouchcontrol->h(), aftertouchcontrol->x(), aftertouchcontrol->y(), true, "Part-aftertouch"); aftertouchcontrol->hide(); delete aftertouchcontrol; if (ctlSeen) saveWin(synth, ctlwindow->w(), ctlwindow->h(), ctlwindow->x(), ctlwindow->y(), true, "Part-controllers"); ctlwindow->hide(); delete ctlwindow; if (ctlmidiSeen) saveWin(synth, ctlmidi->w(), ctlmidi->h(), ctlmidi->x(), ctlmidi->y(), ctlmidi->visible(), "Part-ctlmidi"); ctlmidi->hide(); lastctlW = 0; delete ctlmidi; if (kitSeen) saveWin(synth, instrumentkitlist->w(), instrumentkitlist->h(), instrumentkitlist->x(), instrumentkitlist->y(), true, "Part-kit"); instrumentkitlist->hide(); delete instrumentkitlist; if (fxSeen) saveWin(synth, partfx->w(), partfx->h(), partfx->x(), partfx->y(), partfx->visible(), "Part-effects"); partfx->hide(); delete partfx; if (editSeen) saveWin(synth, instrumenteditwindow->w(), instrumenteditwindow->h(), instrumenteditwindow->x(),instrumenteditwindow->y(), true, "Part-edit"); instrumenteditwindow->hide(); lasteditW = 0; delete instrumenteditwindow;} {} } decl {Part *part;} {public local } decl {BankUI *bankui;} {private local } decl {ADnoteUI *adnoteui;} {public local } decl {SUBnoteUI *subnoteui;} {public local } decl {PADnoteUI *padnoteui;} {public local } decl {int npart;} {public local } decl {int lastkititem;} {public local } decl {string partname;} {public local } decl {string kitname;} {public local } decl {PartKitItem *partkititem[NUM_KIT_ITEMS];} {public local } decl {SynthEngine *synth;} {private local } decl {int *plgroup;} {private local } decl {int engine;} {private local } decl {bool partKitOn;} {public local } decl {int lastkey;} {private local } decl {int channelATselection;} {private local } decl {int keyATselection;} {private local } decl {float midiDW;} {public local } decl {float midiDH;} {public local } decl {bool ctlmidiSeen;} {private local } decl {float atDW;} {public local } decl {float atDH;} {public local } decl {int atSeen;} {private local } decl {float ctlDW;} {public local } decl {float ctlDH;} {public local } decl {int lastctlW;} {private local } decl {bool ctlSeen;} {private local } decl {float fxDW;} {public local } decl {float fxDH;} {public local } decl {bool fxSeen;} {private local } decl {float editDW;} {public local } decl {float editDH;} {public local } decl {int lasteditW;} {private local } decl {bool editSeen;} {private local } decl {float kitDW;} {public local } decl {float kitDH;} {public local } decl {bool kitSeen;} {private local } decl {int lastfxW;} {private local } decl {int lastDynFiltW;} {private local } decl {int lastkitW;} {private local } decl {int lastmidiW;} {private local } decl {int lastatW;} {private local } } yoshimi-2.3.5.1/src/UI/PresetsUI.fl000066400000000000000000000333601506652756400167000ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {PresetsUI.h} {not_in_source in_header } comment {PresetsUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2017-2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. } {selected in_source in_header } decl {\#include } {public local } decl {\#include } {public global } decl {\#include } {public global } decl {\#include } {public global } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include "Misc/SynthEngine.h"} {public global } decl {\#include "MasterUI.h"} {private global } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } class PresetsUI_ {} { Function {refresh()} {return_type {virtual void} } { code {//} {} } Function {~PresetsUI_()} {} { code {// ;} {} } } class PresetsUI {} { Function {PresetsUI(SynthEngine *_synth)} {} { code {// synth = _synth; make_window(); UcopyW = 0; UpasteW = 0; presetsDW = 265; // these are shared between both presetsDH = 430;} {} } Function {~PresetsUI()} {} { code {// if (Upastewin->visible()) saveWin(synth, Upastewin->w(), Upastewin->h(), Upastewin->x(), Upastewin->y(), false,"PresetWin"); else if (Ucopywin->visible()) saveWin(synth, Ucopywin->w(), Ucopywin->h(), Ucopywin->x(), Ucopywin->y(), false,"PresetWin"); Ucopywin->hide(); delete(Ucopywin); Upastewin->hide(); delete(Upastewin); ;} {} } Function {make_window()} {} { Fl_Window Ucopywin { label {Yoshimi : Copy to} callback {saveWin(synth, o->w(), o->h(), o->x(), o->y(), false,"PresetWin"); o->hide();} xywh {200 183 265 430} type Double box PLASTIC_THIN_UP_BOX color 7 hide resizable code1 {o->size_range(265, 430, 0, 0, 0, 0, 1);} modal class ScaleTrackedWindow } { Fl_Browser Ucopybrowse { callback {// int result = o->value(); Upresetname->cut(0, 25); Upresetname->insert(o->text(result)); Upresetname->position(0);} xywh {10 25 245 320} type Select labelcolor 64 textcolor 64 } Fl_Button UcopyPresbutton { label {Copy to Preset} callback {// to file string name = string(Upresetname->value()); int miscMsg = textMsgBuffer.push(name); send_data(0, TOPLEVEL::action::lowPrio, TOPLEVEL::type::Copy, TOPLEVEL::control::copyPaste, npart, kititem, engine, insert, parameter, offset, miscMsg); Ucopywin->hide();} xywh {145 355 110 24} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 } Fl_Button UcopyClipbutton { label {Copy to Clipboard} callback {// to clipboard send_data(0, TOPLEVEL::action::forceUpdate | TOPLEVEL::action::lowPrio, TOPLEVEL::type::Copy, TOPLEVEL::control::copyPaste, npart, kititem, engine, insert, parameter, offset, UNUSED); Ucopywin->hide();} xywh {25 385 90 35} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 align 192 } Fl_Button Ucopycancel { label Cancel callback {// Ucopywin->hide(); saveWin(synth, Ucopywin->w(), Ucopywin->h(), Ucopywin->x(), Ucopywin->y(), false,"PresetWin");} xywh {160 385 80 35} box THIN_UP_BOX color 196 labelcolor 64 align 192 } Fl_Box Ucopytype { label {Type:} xywh {10 5 40 15} labelsize 11 labelcolor 64 align 20 } Fl_Box Ucopytypetext { xywh {50 5 205 15} box FLAT_BOX color 7 labelfont 1 labelsize 11 labelcolor 64 align 20 code0 {o->label(groupName.c_str());} } Fl_Input Upresetname { callback {// const char *tmp = o->value(); if (tmp == NULL) tmp = ""; if (strlen(tmp) > 0) { UcopyPresbutton->activate(); } else { UcopyPresbutton->deactivate(); }} xywh {10 355 130 24} labelcolor 64 when 1 textcolor 64 code0 {o->maximum_size(25);} } } Fl_Window Upastewin { label Yoshimi callback {saveWin(synth, o->w(), o->h(), o->x(), o->y(), false,"PresetWin"); o->hide();} xywh {223 91 265 430} type Double box PLASTIC_THIN_UP_BOX color 7 hide resizable code1 {o->size_range(265, 430, 0, 0, 0, 0, 1);} modal class ScaleTrackedWindow } { Fl_Browser Upastebrowse { callback {// if (o->value()) { int result = o->value(); if (result > 0) { UpastePresbutton->activate(); Udeletepbutton->activate(); } } else { UpastePresbutton->deactivate(); Udeletepbutton->deactivate(); }} xywh {10 25 245 320} type Hold labelcolor 64 textcolor 64 } Fl_Button UpastePresbutton { label {Paste from Preset} callback {// from preset if (Upastebrowse->value() <= 0) return; string name = Upastebrowse->text(Upastebrowse->value()); int miscMsg = textMsgBuffer.push(name); send_data(0, TOPLEVEL::action::forceUpdate | TOPLEVEL::action::lowPrio, TOPLEVEL::type::Paste, TOPLEVEL::control::copyPaste, npart, kititem, engine, insert, parameter, offset, miscMsg); Upastewin->hide();} xywh {10 355 160 24} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 } Fl_Button UpasteClipbutton { label {Paste from Clipboard} callback {// from clipboard send_data(0, TOPLEVEL::action::forceUpdate | TOPLEVEL::action::lowPrio, TOPLEVEL::type::Paste, TOPLEVEL::control::copyPaste, npart, kititem, engine, insert, parameter, offset, UNUSED); Upastewin->hide();} xywh {25 385 90 35} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 align 192 } Fl_Button Upastecancel { label Cancel callback {// Upastewin->hide(); saveWin(synth, Upastewin->w(), Upastewin->h(), Upastewin->x(), Upastewin->y(), false,"PresetWin");} xywh {160 385 80 35} box THIN_UP_BOX color 196 labelcolor 64 align 192 } Fl_Box Upastetypetext { xywh {55 5 200 15} box FLAT_BOX color 7 labelfont 1 labelsize 11 labelcolor 64 align 20 code0 {o->label(groupName.c_str());} } Fl_Box Upastetype { label {Type:} xywh {15 5 40 15} labelsize 11 labelcolor 64 align 20 } Fl_Button Udeletepbutton { label Delete callback {// string name = Upastebrowse->text(Upastebrowse->value()); int miscMsg = textMsgBuffer.push(name); send_data(1, TOPLEVEL::action::lowPrio, TOPLEVEL::type::Paste, TOPLEVEL::control::copyPaste, npart, kititem, engine, insert, parameter, offset, miscMsg); Upastewin->hide();} xywh {180 355 75 24} box PLASTIC_THIN_UP_BOX color 228 labelcolor 64 } } } Function {setExten()} {return_type string } { code {// string text = ""; if (npart == TOPLEVEL::systemEffects) text = "system"; else if (npart == TOPLEVEL::insertEffects) text = "insert"; else text = "part " + std::to_string(npart + 1); return text;} {} } Function {Ucopy(int _npart, int _kititem, int _engine = UNUSED, int _insert = UNUSED, int _parameter = UNUSED, int _offset = UNUSED)} {} { code {// npart = _npart; kititem = _kititem; engine = _engine; insert = _insert; parameter = _parameter; offset = _offset; Ucopywin->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Copy from - " + setExten()), UNUSED, TOPLEVEL::windowTitle)).c_str()); string names = Ufetch(); if (names.empty()) return; size_t pos = 0; unsigned char ch = 10; Ucopybrowse->clear(); UcopyPresbutton->deactivate(); Ucopytypetext->label(groupName.c_str()); do { pos = names.find(ch); if (pos != string::npos) { string line = names.substr(0, pos); names = names.substr(pos + 1, names.length()); Ucopybrowse->add(line.c_str()); } else Ucopybrowse->add(names.c_str()); } while(pos != string::npos); Ucopywin->show();} {} } Function {Upaste(int _npart, int _kititem, int _engine = UNUSED, int _insert = UNUSED, int _parameter = UNUSED, int _offset = UNUSED)} {} { code {// npart = _npart; kititem = _kititem; engine = _engine; insert = _insert; parameter = _parameter; offset = _offset; Upastewin->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Paste to - " + setExten()), UNUSED, TOPLEVEL::windowTitle)).c_str()); string names = Ufetch(); if (names.empty()) return; size_t pos = 0; unsigned char ch = 10; Upastebrowse->clear(); UpastePresbutton->deactivate(); UpasteClipbutton->activate(); Udeletepbutton->deactivate(); Upastetypetext->label(groupName.c_str()); do { pos = names.find(ch); if (pos != string::npos) { string line = names.substr(0, pos); names = names.substr(pos + 1, names.length()); Upastebrowse->add(line.c_str()); } else Upastebrowse->add(names.c_str()); } while(pos != string::npos); if (Ufetch(2).empty()) UpasteClipbutton->deactivate(); else UpasteClipbutton->activate(); Upastewin->show();} {} } Function {Ufetch(int sent = 0)} {return_type string } { code {// int W, H, X, Y, O; loadWin(synth, W, H, X, Y, O, "PresetWin"); if (W < presetsDW || H < presetsDH) { W = presetsDW; H = presetsDH; } checkSane(X, Y, W, H, presetsDW, presetsDH, true); Ucopywin->resize(X, Y, W, H); Upastewin->resize(X, Y, W, H); UpresetsRtext(); CommandBlock putData; putData.data.value = sent; putData.data.type = TOPLEVEL::type::List; putData.data.source = TOPLEVEL::action::lowPrio; putData.data.control = TOPLEVEL::control::copyPaste; putData.data.part = npart; putData.data.kit = kititem; putData.data.engine = engine; putData.data.insert = insert; putData.data.parameter = parameter; putData.data.offset = offset; putData.data.miscmsg = UNUSED; //synth->CBtest(&putData); int value = synth->interchange.readAllData(putData); if (sent == 2) { return textMsgBuffer.fetch(value); } putData.data.value = 1; int Ugroup = synth->interchange.readAllData(putData); groupName = textMsgBuffer.fetch(Ugroup); //std::cout << "In GUI >" << groupName << std::endl; return textMsgBuffer.fetch(value);} {} } Function {send_data(float value, int action, int type, int control, int part = UNUSED, int kititem = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int offset = UNUSED, int miscmsg = UNUSED)} {} { code {// collect_writeData(synth, value, action, type, control, part, kititem, engine, insert, parameter, offset, miscmsg);} {} } Function {UpresetsRtext()} {} { code {// if (Ucopywin->visible()) { if (UcopyW != Ucopywin->w()) { UcopyW = Ucopywin->w(); UpasteW = 0; float dScale = Ucopywin->w() / float(presetsDW); int size14 = int(14 * dScale); int size11 = int(11 * dScale); Ucopybrowse->textsize(size14); UcopyPresbutton->labelsize(size14); UcopyClipbutton->labelsize(size14); Ucopycancel->labelsize(size14); Upresetname->textsize(size14); Ucopytype->labelsize(size11); Ucopytypetext->labelsize(size11); Ucopywin->redraw(); } } else if (Upastewin->visible()) { if (UpasteW != Upastewin->w()) { UpasteW = Upastewin->w(); UcopyW = 0; float dScale = Upastewin->w() / float(presetsDW); int size14 = int(14 * dScale); int size11 = int(11 * dScale); Upastebrowse->textsize(size14); UpastePresbutton->labelsize(size14); UpasteClipbutton->labelsize(size14); Upastecancel->labelsize(size14); Udeletepbutton->labelsize(size14); Upastetype->labelsize(size11); Upastetypetext->labelsize(size11); Upastewin->redraw(); } } {}} {} } decl {SynthEngine *synth;} {private local } decl {int presetsDW;} {private local } decl {int presetsDH;} {private local } decl {int UcopyW;} {private local } decl {int UpasteW;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int engine;} {private local } decl {int insert;} {private local } decl {int offset;} {private local } decl {int parameter;} {private local } decl {string groupName;} {private local } } yoshimi-2.3.5.1/src/UI/ResonanceUI.fl000066400000000000000000000564751506652756400172040ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {ResonanceUI.h} {not_in_source in_header } comment {ResonanceUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2015-2023, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original } {selected in_source in_header } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include "UI/ScaleTrackedWindow.h"} {public global } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetPDial.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include "UI/WidgetMWSlider.h"} {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "Synth/Resonance.h"} {public local } decl {\#include "MasterUI.h"} {private global } decl {\#include "Misc/SynthEngine.h"} {public global } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include "Misc/NumericFuncs.h" using func::power;} {private local } decl {using std::to_string;} {private global } class ResonanceGraph {: {public Fl_Box} } { Function {ResonanceGraph(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {// respar=NULL; cbwidget=NULL; applybutton=NULL;} {} } Function {send_data(int action, int control, float value, int type)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, RESONANCE::control::graphPoint, npart, kititem, engine, TOPLEVEL::insert::resonanceGraphInsert, control);} {} } Function {init(Resonance *respar_, Fl_Value_Output *khzvalue_, Fl_Value_Output *dbvalue_, int npart_, int kititem_, int engine_)} {} { code {// respar = respar_; synth = & respar->getSynthEngine(); npart = npart_; kititem = kititem_; engine = engine_; khzvalue=khzvalue_; dbvalue=dbvalue_; oldx=-1; khzval=-1;} {} } Function {draw_freq_line(float freq)} {} { code {// float freqx = respar->getfreqpos(freq); if ((freqx>0.0) && (freqx<1.0)) fl_line(x() + (int) (freqx * w()), y(), x() + (int) (freqx*w()), y() + h());} {} } Function {draw()} {} { code {// int ox=x(); int oy=y(); int lx=w(); int ly=h(); int i; float freqx; fl_line_style(0, int(1 * ly/256)); fl_color(graph_back); fl_rectf(ox,oy,lx,ly); //draw the lines fl_color(graph_resonance_grid); fl_line(ox+2,oy+ly/2,ox+lx-2,oy+ly/2); freqx=respar->getfreqpos(1000.0); if ((freqx>0.0)&&(freqx<1.0)) fl_line(ox+(int) (freqx*lx),oy, ox+(int) (freqx*lx),oy+ly); for (i=1;i<10;i++) { if (i==1) { draw_freq_line(i*100.0); draw_freq_line(i*1000.0); } else if (i==5) { draw_freq_line(i*100.0); draw_freq_line(i*1000.0); } else { draw_freq_line(i*100.0); draw_freq_line(i*1000.0); } } draw_freq_line(10000.0); draw_freq_line(20000.0); int GY=10; if (lyPrespoints[0] / dy); for (i = 1; i < MAX_RESONANCE_POINTS; i++) { ix += dx; iy = ny - int(respar->Prespoints[i] / dy); fl_line(oix, oiy, ix, iy); oix = ix; oiy = iy; } fl_line_style(0, 1);} {} } Function {handle(int event)} {return_type int } { code {// int x_ = Fl::event_x() - x(); int y_ = Fl::event_y() - y(); bool inFrame = false; if ((x_ >= 0) && (x_ < w()) && (y_ >= 0) && (y_ < h())) { khzvalue->value(respar->getfreqx(x_ * 1.0 / w()) / 1000.0); dbvalue->value((1.0 - y_ * 2.0 / h()) * respar->PmaxdB); inFrame = true; } if ((event == FL_PUSH) || (event == FL_DRAG)) { unsigned char action = 0; if (event != FL_DRAG) action = TOPLEVEL::action::forceUpdate; int leftbutton = 1; if (Fl::event_button() == FL_RIGHT_MOUSE) leftbutton = 0; if (x_ < 0) x_ = 0; if (y_ < 0) y_ = 0; if (x_ >= w()) x_ = w(); if (y_ >= h() -1) y_ = h() -1; if ((oldx < 0) || (oldx == x_)) { int sn = (int)(x_ * 1.0 / w() * MAX_RESONANCE_POINTS); int sp=127 - (int)(y_ * 1.0 / h() * 127); if (_SYS_::F2B(leftbutton)) { send_data(action, sn, sp, TOPLEVEL::type::Integer); } else { send_data(action, sn, 64, TOPLEVEL::type::Integer); } } else { int x1 = oldx; int x2 = x_; int y1 = oldy; int y2 = y_; if (oldx > x_) { x1 = x_; y1 = y_; x2 = oldx; y2 = oldy; } for (int i = 0; i < x2 - x1; i++) { int sn = (int)((i + x1) * 1.0 / w() * MAX_RESONANCE_POINTS); float yy = (y2 - y1) * 1.0 / (x2 - x1) * i; int sp = 127 - (int)((y1 + yy) / h() * 127); if (leftbutton!=0) { send_data(action, sn, sp, TOPLEVEL::type::Integer); } else { send_data(action, sn, 64, TOPLEVEL::type::Integer); } } } oldx = x_; oldy = y_; redraw(); } if (event == FL_RELEASE) { oldx = -1; if (cbwidget != NULL) { cbwidget->do_callback(); } } if (!inFrame) return 0; return(1);} {} } decl {Fl_Value_Output *khzvalue;} {private local } decl {Fl_Value_Output *dbvalue;} {private local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int engine;} {private local } decl {Resonance *respar;} {private local } decl {int oldx,oldy;} {private local } decl {float khzval;} {public local } decl {Fl_Widget *cbwidget,*applybutton;} {private local } } class ResonanceUI {: PresetsUI_ } { Function {make_window()} {} { Fl_Window resonancewindow { label Resonance callback {resClose->do_callback();} xywh {355 40 780 305} type Double hide resizable class ScaleTrackedWindow code0 {resDW = o->w();resDH = o->h();} code1 {resonancewindow->size_range(resDW, resDH, 0, 0, 0, 0, 1);} } { Fl_Group editor { xywh {0 0 777 305} } { Fl_Value_Output khzvalue { label kHz xywh {435 264 40 18} labelsize 12 labelcolor 64 align 8 minimum 0.001 maximum 48 textfont 1 textsize 12 textcolor 64 code0 {o->step(0.01, 1);} code1 {//this widget must be before the calling widgets} } Fl_Value_Output dbvalue { label dB xywh {435 283 40 18} labelsize 12 labelcolor 64 align 8 minimum -150 maximum 150 textfont 1 textsize 12 textcolor 64 code0 {o->step(0.1, 1);} code1 {//this widget must be before the calling widgets} } Fl_Group frame { xywh {6 5 768 256} box BORDER_BOX code0 {rg=new ResonanceGraph(o->x(),o->y(),o->w(),o->h(),"");} code1 {rg->init(respar, khzvalue, dbvalue, npart, kititem, engine);} code2 {rg->show();} } {} Fl_Slider maxdb { callback {// if (Fl::event_button() == 3) o->value(2000); maxdbvo->do_callback(); o->selection_color(setSlider(o->value(),2000)); send_data(0, RESONANCE::control::maxDb, o->value()/100, 0);} tooltip {The volume range} xywh {77 283 98 18} type {Horz Knob} box THIN_DOWN_BOX labelsize 11 labelcolor 64 align 8 minimum 1 maximum 9000 step 1 value 2000 code0 {o->value(respar->PmaxdB*100);} code1 {o->selection_color(setSlider(respar->PmaxdB,20));} class mwheel_slider_rev } Fl_Value_Output maxdbvo { label {Max dB} callback {// o->value(maxdb->value()/100);} tooltip {The Maximum amplitude (dB)} xywh {55 282 22 18} box THIN_DOWN_BOX labelsize 12 labelcolor 64 minimum 1 maximum 127 step 1 value 20 textfont 1 textsize 12 textcolor 64 code0 {o->value(maxdb->value()/100);} } Fl_Slider centerfreq { callback {// if (Fl::event_button() == 3) o->value(6400); centerfreqvo->do_callback(); o->selection_color(setSlider(o->value(),6400)); rg->redraw(); send_data(0, RESONANCE::control::centerFrequency, o->value()/100, 0);} tooltip {Shift the center frequency} xywh {243 264 110 18} type {Horz Knob} box THIN_DOWN_BOX labelsize 11 labelcolor 64 align 8 maximum 12700 step 1 code0 {o->value(respar->Pcenterfreq*100);} code1 {o->selection_color(setSlider(respar->Pcenterfreq,64));} class mwheel_slider_rev } Fl_Value_Output centerfreqvo { label {C.f.} callback {o->value(10.0 * power<10>(- (1.0f - centerfreq->value()/12700.0f) * 2.0f));} tooltip {Center Frequency (kHz)} xywh {210 264 33 18} labelsize 12 labelcolor 64 when 3 minimum 1 maximum 10 value 1 textfont 1 textsize 12 textcolor 64 code0 {o->step(0.01, 1);} code1 {o->value(10.0 * power<10>(- (1.0f - centerfreq->value()/12700.0f) * 2.0f));} } Fl_Slider octavesfreq { callback {// if (Fl::event_button() == 3) o->value(6400); octavesfreqvo->do_callback(); o->selection_color(setSlider(o->value(),6400)); rg->redraw(); send_data(0, RESONANCE::control::octaves, o->value()/100, 0);} tooltip {Expand the frequency range} xywh {243 283 110 18} type {Horz Knob} box THIN_DOWN_BOX labelsize 11 labelcolor 64 align 8 maximum 12700 step 1 code0 {o->value(respar->Poctavesfreq*100);} code1 {o->selection_color(setSlider(respar->Poctavesfreq,64));} class mwheel_slider_rev } Fl_Value_Output octavesfreqvo { label {Oct.} callback {o->value(0.25 + 10.0 *octavesfreq->value()/12700.0);} tooltip {No. of octaves} xywh {210 282 33 18} labelsize 12 labelcolor 64 when 3 minimum 1 maximum 127 step 1 value 5 textfont 1 textsize 12 textcolor 64 code0 {o->value(0.25 + 10.0 *octavesfreq->value()/12700.0);} } Fl_Button clearbutton { label Clear callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::clearGraph, o->value(), TOPLEVEL::type::Integer);} tooltip {Clear the resonance function} xywh {507 264 66 15} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button smoothbutton { label Smooth callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::smoothGraph, o->value(), TOPLEVEL::type::Integer);} tooltip {Smooth the resonance function} xywh {507 283 66 18} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button rnd1 { label Rnd1 callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::randomType, 0, TOPLEVEL::type::Integer);} tooltip {Randomize the resonance function} xywh {583 264 42 11} box PLASTIC_THIN_UP_BOX color 228 labelfont 3 labelsize 10 labelcolor 226 } Fl_Button rnd2 { label Rnd2 callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::randomType, 1, TOPLEVEL::type::Integer);} tooltip {Randomize the resonance function} xywh {583 277 42 11} box PLASTIC_THIN_UP_BOX color 228 labelfont 3 labelsize 10 labelcolor 226 } Fl_Button rnd3 { label Rnd3 callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::randomType, 2, TOPLEVEL::type::Integer);} tooltip {Randomize the resonance function} xywh {583 290 42 11} box PLASTIC_THIN_UP_BOX color 228 labelfont 3 labelsize 10 labelcolor 226 } Fl_Check_Button p1st { label { Prot.1st} callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::protectFundamental, o->value(), TOPLEVEL::type::Integer);} tooltip {Protect the fundamental frequency (do not damp the first harmonic)} xywh {106 265 45 15} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 12 labelcolor 226 code0 {o->value(respar->Pprotectthefundamental);} class Fl_Check_Button2 } Fl_Text_Display interpk { label InterpPk xywh {364 280 62 0} box NO_BOX labelsize 12 labelcolor 64 align 33 textsize 12 } Fl_Box {} { tooltip {Interpolate the peaks (left button smooth, right button linear)} xywh {359 264 72 37} box THIN_DOWN_FRAME } Fl_Button sbutton { label S callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::interpolatePeaks, 0, TOPLEVEL::type::Integer);} tooltip {Smooth interpolation} xywh {365 282 28 14} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button lbutton { label L callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::interpolatePeaks, 1, TOPLEVEL::type::Integer);} tooltip {Linear interpolation} xywh {398 282 28 14} box PLASTIC_THIN_UP_BOX color 228 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button cbutton { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, engine, TOPLEVEL::insert::resonanceGroup); ;} xywh {704 264 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button pbutton { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, engine, TOPLEVEL::insert::resonanceGroup); ;} xywh {747 264 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } } Fl_Check_Button enabled { label { Enable} callback {// send_data(TOPLEVEL::action::forceUpdate, RESONANCE::control::enableResonance, o->value(), TOPLEVEL::type::Integer);} xywh {6 265 78 15} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 12 labelcolor 226 code0 {o->value(respar->Penabled);} class Fl_Check_Button2 } Fl_Button applybutton { label Apply callback {// send_data(TOPLEVEL::action::forceUpdate, PADSYNTH::control::applyChanges, 1, TOPLEVEL::type::Integer);} tooltip {Rebuild PADSynth wavetable to pick up changes} xywh {630 264 68 37} box GTK_THIN_UP_BOX down_box THIN_DOWN_BOX color 82 labelfont 1 labelsize 12 labelcolor 64 } Fl_Button resClose { label Close callback {// if (resSeen) saveWin(synth, resonancewindow->w(), resonancewindow->h(), resonancewindow->x(), resonancewindow->y(), false, "Resonance " + to_string(engine)); resonancewindow->hide(); resSeen = false; if ((Fl::event_button() == 3)) { if (engine == PART::engine::addSynth) synth->getGuiMaster()->partui->adnoteui->ADnoteGlobalParameters->show(); else synth->getGuiMaster()->partui->padnoteui->padnotewindow->show(); }} tooltip {Right click: also reopen previous} xywh {704 283 69 18} box THIN_UP_BOX color 196 labelsize 12 labelcolor 64 } } } Function {send_data(int action, int control, float value, int type)} {} { code {// int insert; if (control == PADSYNTH::control::applyChanges) insert = UNUSED; else insert = TOPLEVEL::insert::resonanceGroup; type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, engine, insert);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char eng = getData->data.engine; unsigned char insert = getData->data.insert; if (eng != engine) return; if (insert == TOPLEVEL::insert::resonanceGraphInsert) { rg->draw(); rg->redraw(); } else { switch(control) { case RESONANCE::control::maxDb: maxdb->value(value*100); maxdb->selection_color(setSlider(value,20)); maxdbvo->do_callback(); break; case RESONANCE::control::centerFrequency: centerfreq->value(value*100); centerfreq->selection_color(setSlider(value,64)); centerfreqvo->do_callback(); rg->redraw(); break; case RESONANCE::control::octaves: octavesfreq->value(value*100); octavesfreq->selection_color(setSlider(value,64)); octavesfreqvo->do_callback(); rg->redraw(); break; case RESONANCE::control::enableResonance: if (_SYS_::F2B(value)) { enabled->value(1); editor->activate(); } else { enabled->value(0); editor->deactivate(); } break; case RESONANCE::control::randomType: resonancewindow->redraw(); break; case RESONANCE::control::interpolatePeaks: resonancewindow->redraw(); break; case RESONANCE::control::protectFundamental: p1st->value(_SYS_::F2B(value)); break; case RESONANCE::control::clearGraph: resonancewindow->redraw(); break; case RESONANCE::control::smoothGraph: resonancewindow->redraw(); break; } }} {} } Function {ResonanceUI(Resonance *respar_, int npart_, int kititem_, int engine_)} {} { code {// respar = respar_; synth = & respar->getSynthEngine(); npart = npart_; kititem = kititem_; engine = engine_; make_window(); resSeen = false; applybutton->hide(); refresh(); ;} {} } Function {~ResonanceUI()} {return_type virtual } { code {// if (resSeen) saveWin(synth, resonancewindow->w(), resonancewindow->h(), resonancewindow->x(), resonancewindow->y(), true, "Resonance " + to_string(engine)); resSeen = false; resonancewindow->hide();} {} } Function {refresh()} {} { code {// if (respar->Penabled) { enabled->value(1); editor->activate(); } else { enabled->value(0); editor->deactivate(); } maxdb->value(respar->PmaxdB * 100); maxdb->selection_color(setSlider(respar->PmaxdB,20)); maxdbvo->do_callback(); centerfreq->value(respar->Pcenterfreq * 100); centerfreq->selection_color(setSlider(respar->Pcenterfreq,64)); centerfreqvo->do_callback(); octavesfreq->value(respar->Poctavesfreq * 100); octavesfreq->selection_color(setSlider(respar->Poctavesfreq,64)); octavesfreqvo->do_callback(); p1st->value(respar->Pprotectthefundamental); rg->redraw();} {} } Function {Show()} {} { code {// string tname; if (engine == PART::engine::addSynth) tname = "AddSynth Resonance"; else tname = "PadSynth Resonance "; resonancewindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Resonance"), npart, TOPLEVEL::windowTitle, kititem, engine)).c_str()); int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Resonance " + to_string(engine)); if(fetchW < resDW || fetchH < resDH) { fetchW = resDW; fetchH = resDH; } checkSane(fetchX, fetchY, fetchW, fetchH, resDW, resDH); resonancewindow->resize(fetchX, fetchY, fetchW, fetchH); resonancewindow->show(); resonanceRtext(); resSeen = true;} {} } Function {resonanceRtext()} {} { code {// float dScale = resonancewindow->w() / resDW; if (dScale < 0.2f) dScale = 0.2f; int size = int(10 * dScale); int size11 = int(11 * dScale); int size12 = int(12 * dScale); khzvalue->labelsize(size12); khzvalue->textsize(size12); dbvalue->labelsize(size12); dbvalue->textsize(size12); clearbutton->labelsize(size12); smoothbutton->labelsize(size12); maxdb->labelsize(size11); maxdbvo->textsize(size12); centerfreqvo->labelsize(size11); centerfreqvo->textsize(size12); octavesfreqvo->labelsize(size12); octavesfreqvo->textsize(size11); rnd1->labelsize(size); rnd2->labelsize(size); rnd3->labelsize(size); p1st->labelsize(size12); interpk->labelsize(size12); sbutton->labelsize(size12); lbutton->labelsize(size12); cbutton->labelsize(size11); pbutton->labelsize(size11); enabled->labelsize(size12); applybutton->labelsize(size12); resClose->labelsize(size12); resonancewindow->redraw();} {} } decl {Resonance *respar;} {public local } decl {ResonanceGraph *rg;} {private local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {int engine;} {private local } decl {bool resSeen;} {private local } decl {float resDW;} {private local } decl {float resDH;} {private local } } yoshimi-2.3.5.1/src/UI/SUBnoteUI.fl000066400000000000000000001223431506652756400165720ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0403 header_name {.h} code_name {.cc} snap { ver 1 current_suite FLTK current_preset 2 } comment {SubNoteUI.h} {not_in_source in_header } comment {SubNoteUI.cc} {in_source not_in_header } comment {Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert Copyright 2015-2025, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derivative of ZynAddSubFX original code } {selected in_source in_header } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetPDial.h"} {public local } decl {\#include "UI/WidgetCheckButton.h"} {public local } decl {\#include "UI/WidgetMWSlider.h"} {public local } decl {\#include "UI/ScaleTrackedWindow.h"} {public local } decl {\#include "EnvelopeUI.h"} {public local } decl {\#include "FilterUI.h"} {public local } decl {\#include "LFOUI.h"} {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "Params/SUBnoteParameters.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {public global } decl {\#include "MasterUI.h"} {private global } decl {\#include "Misc/SynthHelper.h" using synth::getDetune;} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } class SUBnoteharmonic {: {public Fl_Group} } { Function {make_window()} {} { Fl_Window harmonic { xywh {800 500 50 300} type Double box NO_BOX hide resizable class Fl_Group } { Fl_Slider mag { callback {// int x = 0; if (Fl::event_button() != 3) x = lrint(o->value()); else { if (n == 0) x = 127; o->value(x); } if (n == 0) o->selection_color(setSlider(o->value(),127)); else o->selection_color(setSlider(o->value(),0)); send_data(0, TOPLEVEL::insert::harmonicAmplitude, n, x, TOPLEVEL::type::Integer);} tooltip {Harmonic's magnitude} xywh {0 2 15 131} type {Vert Knob} box FLAT_BOX labelcolor 64 minimum 127 maximum 0 step 1 value 127 code0 {o->setValueType(VC_SubHarmonicMagnitude); o->useCustomTip(true);} class mwheel_slider } Fl_Slider bw { callback {// int x = 64; if (Fl::event_button() != 3) x = 64 + lrint(o->value()); else o->value(0); o->selection_color(setSlider(o->value(),0)); send_data(0, TOPLEVEL::insert::harmonicBandwidth, n, x, TOPLEVEL::type::Integer);} tooltip {Harmonic's bandwidth multiplier} xywh {0 166 15 128} type {Vert Knob} box FLAT_BOX labelcolor 64 minimum 63 maximum -64 step 1 code0 {o->setValueType(VC_SubBandwidthRel);} code1 {o->useCustomTip(true);} class mwheel_slider } Fl_Box h_dash { xywh {16 227 10 3} box FLAT_BOX color 39 code0 {if (n+1==MAX_SUB_HARMONICS) o->hide();} } Fl_Box h_num { label 01 xywh {0 142 15 15} labelfont 1 labelsize 12 labelcolor 64 align 16 code0 {char tmp[12];snprintf(tmp,12,"%d",n+1);o->label(strdup(tmp));} } } } Function {SUBnoteharmonic(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} { code {n=0;} {} } Function {send_data(int action, int insert, int control, float value, int type)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, PART::engine::subSynth, insert);} {} } Function {init(SUBnoteParameters *pars_, int n_, int npart_, int kititem_)} {} { code {// pars=pars_; synth = & pars->getSynthEngine(); n=n_; npart = npart_; kititem = kititem_; make_window(); refresh(); harmonic->show(); end();} {} } Function {refresh()} {} { code {// unsigned char magVal = collect_readData(synth, 0, n, npart, kititem, PART::engine::subSynth, TOPLEVEL::insert::harmonicAmplitude); mag->value(magVal); if (n == 0) mag->selection_color(setSlider(magVal,127)); else mag->selection_color(setSlider(magVal,0)); unsigned char bwVal = collect_readData(synth, 0, n, npart, kititem, PART::engine::subSynth, TOPLEVEL::insert::harmonicBandwidth) - 64; bw->value(bwVal); bw->selection_color(setSlider(bwVal,0)); ;} {} } Function {~SUBnoteharmonic()} {} { code {// harmonic->hide(); hide();} {} } decl {SUBnoteParameters *pars;} {private local } decl {SynthEngine *synth;} {private local } decl {int n;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } } class SUBnoteUI {: {public PresetsUI_} } { Function {make_window()} {} { comment {randompan MUST be placed after panwidth} {in_source in_header } Fl_Window SUBparameters { label {SUBsynth Parameters} callback {// if (subSeen) saveWin(synth,o->w(), SUBparameters->h(),o->x(), o->y(), false, "SubSynth"); subSeen = false; o->hide();} xywh {142 127 805 551} type Double labelcolor 64 hide resizable code0 {o->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("SubSynth"), npart, TOPLEVEL::windowTitle, kititem)).c_str());} code1 {subDW = o->w();subDH=o->h();} code2 {SUBparameters->size_range(subDW, subDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Scroll frame { xywh {4 221 506 326} type HORIZONTAL box THIN_UP_BOX when 1 } { Fl_Pack harmonics { xywh {4 229 505 290} type HORIZONTAL resizable code0 {new Fl_Box(0,0,9,o->h());} code1 {for (int i=0;ih(),"");h[i]->init(pars, i, npart, kititem);}} code2 {new Fl_Box(0,0,3,o->h());} } {} } Fl_Group ampgrp { xywh {4 5 285 215} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Group ampenv { label {Yoshimi : SubSynth - Amplitude Envelope} xywh {9 67 275 70} box FLAT_BOX color 51 labelcolor 64 align 144 code0 {o->init(pars->AmpEnvelope.get(), npart, kititem, PART::engine::subSynth, 0);} class EnvelopeUI } {} Fl_Box {} { xywh {9 6 275 63} box PLASTIC_UP_BOX color 223 } Fl_Dial vol { label Volume callback {// o->selection_color(setKnob(o->value(),96)); send_data (0, SUBSYNTH::control::volume, o->value(), TOPLEVEL::type::Integer);} tooltip Volume xywh {25 22 29 29} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 10 maximum 127 step 1 code0 {o->setValueType(VC_InstrumentVolume);} class WidgetPDial } Fl_Dial vsns { label {Vel Sens} callback {// o->selection_color(setKnob(o->value(),90)); send_data (0, SUBSYNTH::control::velocitySense, o->value(), TOPLEVEL::type::Integer);} tooltip {Velocity sensing} xywh {90 22 29 29} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_AmpVelocitySense);} class WidgetPDial } Fl_Dial pan { label Pan callback {// o->selection_color(setKnob(o->value(),64)); send_data (0, SUBSYNTH::control::panning, o->value(), TOPLEVEL::type::Integer);} tooltip Panning xywh {165 22 29 29} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial } Fl_Dial panwidth { label Width callback {// o->selection_color(setKnob(o->value(),63)); send_data (0, SUBSYNTH::control::randomWidth, o->value(), TOPLEVEL::type::Integer);} tooltip {Random Width} xywh {240 22 29 29} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 63 step 1 value 63 code0 {o->setValueType(VC_PanningRandom);} class WidgetPDial } Fl_Check_Button randompan { label Rand callback {// int tmp = o->value(); if (tmp == 0) panwidth->deactivate(); else panwidth->activate(); send_data(0, SUBSYNTH::control::enableRandomPan, tmp, TOPLEVEL::type::Integer);} tooltip {Enable random panning} xywh {210 28 15 15} down_box DOWN_BOX color 48 selection_color 64 labelsize 11 labelcolor 64 align 1 class Fl_Check_Button2 } Fl_Group amplfo { label {Amplitude LFO} xywh {9 140 275 75} box FLAT_BOX color 51 labelcolor 64 align 144 code0 {o->init(synth, npart, kititem, PART::engine::subSynth, TOPLEVEL::insertType::amplitude);} class LFOUI } {} Fl_Box {} { xywh {140 22 4 38} box THIN_DOWN_FRAME } Fl_Box ampLabel { label AMPLITUDE xywh {135 10 20 12} labelfont 1 labelsize 11 labelcolor 64 } } Fl_Group freqsettingsui { label FREQUENCY xywh {510 5 293 215} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Group freqenvelopegroup { label {Yoshimi : SubSynth - Frequency Envelope} xywh {515 67 205 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->FreqEnvelope.get(), npart, kititem, PART::engine::subSynth, 1);} code1 {if (collect_readData(synth, 0, SUBSYNTH::control::enableFrequencyEnvelope, npart, kititem, PART::engine::subSynth) == 0) o->deactivate();} class EnvelopeUI } {} Fl_Group freqlfogroup { label {Frequency LFO} xywh {515 140 280 75} box FLAT_BOX color 51 align 144 deactivate code0 {o->init(synth, npart, kititem, PART::engine::subSynth, TOPLEVEL::insertType::frequency);} class LFOUI } {} Fl_Check_Button freqee { label On callback {// if (o->value() == 0) freqenvelopegroup->deactivate(); else freqenvelopegroup->activate(); o->show(); freqsettingsui->redraw(); send_data (0, SUBSYNTH::control::enableFrequencyEnvelope, o->value(), TOPLEVEL::type::Integer);} xywh {515 69 34 12} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 class Fl_Check_Button2 } Fl_Check_Button freqlfo { label On callback {// if (o->value() == 0) freqlfogroup->deactivate(); else freqlfogroup->activate(); o->show(); freqsettingsui->redraw(); send_data (0, SUBSYNTH::control::enableFrequencyLFO, o->value(), TOPLEVEL::type::Integer);} xywh {520 144 36 13} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 class Fl_Check_Button2 } Fl_Text_Display octavetext { label Octave xywh {516 19 50 7} box NO_BOX labelfont 3 labelsize 10 labelcolor 226 } Fl_Counter octave { callback {// send_data (0, SUBSYNTH::control::octave, o->value(), TOPLEVEL::type::Integer);} tooltip Octave xywh {515 18 52 15} type Simple selection_color 49 labelfont 3 labelsize 10 labelcolor 64 align 1 minimum -8 maximum 7 step 1 textfont 1 textsize 11 textcolor 64 } Fl_Dial bend { label Bend callback {// o->selection_color(setKnob(o->value(),88)); send_data(0, SUBSYNTH::control::pitchBendAdjustment, o->value(), TOPLEVEL::type::Integer);} tooltip {Pitch bend range scaling} xywh {570 21 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->setValueType(VC_PitchBend);} class WidgetPDial } Fl_Dial offset { label Offset callback {// o->selection_color(setKnob(o->value(),64)); send_data(0, SUBSYNTH::control::pitchBendOffset, o->value(), TOPLEVEL::type::Integer);} tooltip {Offset of the frequency in Hz.} xywh {628 21 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->setValueType(VC_FreqOffsetHz);} class WidgetPDial } Fl_Check_Button hz440 { label 440Hz callback {// int x = (int) o->value(); if (x == 0) fixedfreqetdial->deactivate(); else fixedfreqetdial->activate(); send_data (0, SUBSYNTH::control::baseFrequencyAs440Hz, x, TOPLEVEL::type::Integer);} tooltip {set the base frequency to 440Hz} xywh {693 24 48 15} down_box DOWN_BOX selection_color 64 labelfont 1 labelsize 10 labelcolor 64 align 24 code0 {o->value(collect_readData(synth, 0, SUBSYNTH::control::baseFrequencyAs440Hz, npart, kititem, PART::engine::subSynth));} class Fl_Check_Button2 } Fl_Dial fixedfreqetdial { label {Eq.T.} callback {// o->selection_color(setKnob(o->value(),0)); send_data (0, SUBSYNTH::control::equalTemperVariation, o->value(), TOPLEVEL::type::Integer);} tooltip {How the frequency varies according to the keyboard (leftmost for fixed frequency)} xywh {750 21 20 20} box ROUND_UP_BOX labelsize 10 labelcolor 64 align 8 maximum 127 step 1 code0 {o->setValueType(VC_FixedFreqET);} class WidgetPDial } Fl_Slider detune { callback {// o->selection_color(setSlider(o->value(),0)); send_data (TOPLEVEL::action::forceUpdate, SUBSYNTH::control::detuneFrequency, o->value(), TOPLEVEL::type::Integer);} tooltip {Fine Detune (cents)} xywh {561 47 236 15} type {Horz Knob} box THIN_DOWN_BOX labelcolor 64 minimum -8192 maximum 8191 step 1 code0 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider_rev } Fl_Choice detunetype { label {Detune Type} callback {// send_data (TOPLEVEL::action::forceUpdate, SUBSYNTH::control::detuneType, o->value() + 1, TOPLEVEL::type::Integer);} xywh {725 78 73 15} down_box BORDER_BOX selection_color 64 labelsize 10 labelcolor 64 align 5 textfont 1 textsize 10 textcolor 64 code0 {o->add("L35cents");o->add("L10cents");o->add("E100cents");o->add("E1200cents");} } {} Fl_Counter coarsedet { label {Coarse Det.} callback {// int k = (int) o->value(); if (k < 0) k += 1024; send_data (0, SUBSYNTH::control::coarseDetune, k, TOPLEVEL::type::Integer);} tooltip {Coarse Detune} xywh {724 111 74 15} selection_color 64 labelsize 10 labelcolor 64 align 1 minimum -64 maximum 63 step 1 textfont 1 textsize 11 textcolor 64 code0 {o->lstep(10);} } } Fl_Value_Output detunevalueoutput { label Detune callback {// o->value(getDetune(detunetype->value()+1,0, detune->value()+8192)); ;} xywh {515 47 45 15} labelsize 10 labelcolor 64 align 5 minimum -5000 maximum 5000 textfont 1 textsize 10 textcolor 64 code0 {o->step(0.01, 1);} } Fl_Box {} { xywh {510 486 65 35} box THIN_UP_FRAME } Fl_Group bandwidthsettingsui { label BANDWIDTH xywh {290 5 220 135} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Group bandwidthenvelopegroup { label {Yoshimi : SubSynth - BandWidth Envelope} xywh {295 67 210 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->BandWidthEnvelope.get(), npart, kititem, PART::engine::subSynth, 3);} code1 {if (collect_readData(synth, 0, SUBSYNTH::control::enableBandwidthEnvelope, npart, kititem, PART::engine::subSynth)==0) o->deactivate();} class EnvelopeUI } {} Fl_Check_Button bwee { label On callback {// if (o->value() == 0) bandwidthenvelopegroup->deactivate(); else bandwidthenvelopegroup->activate(); o->show(); bandwidthsettingsui->redraw(); send_data (0, SUBSYNTH::control::enableBandwidthEnvelope, o->value(), TOPLEVEL::type::Integer);} xywh {295 69 34 12} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 class Fl_Check_Button2 } Fl_Value_Slider bandwidth { label Bandwidth callback {// o->selection_color(setSlider(o->value(),40)); send_data (0, SUBSYNTH::control::bandwidth, o->value(), TOPLEVEL::type::Integer);} tooltip {Base bandwidth, approximate} xywh {295 40 115 15} type {Horz Knob} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 1 maximum 127 step 1 textcolor 64 code0 {o->setValueType(VC_SubBandwidth);} code1 {o->useCustomTip(true);} class mwheel_slider_rev } Fl_Value_Slider bwidthscale { label {Bandwidth Scale} callback {// o->selection_color(setSlider(o->value(),0)); send_data (0, SUBSYNTH::control::bandwidthScale, o->value(), TOPLEVEL::type::Integer);} tooltip {Freq-dep. bw. scaling} xywh {414 40 90 15} type {Horz Knob} box THIN_DOWN_BOX labelsize 10 labelcolor 64 align 1 minimum -64 maximum 63 step 1 textcolor 64 code0 {o->setValueType(VC_SubBandwidthScale); o->setGraphicsType(VC_SubBandwidthScale);} code1 {o->useCustomTip(true);} class mwheel_slider_rev } } Fl_Group spreadGroup { label OVERTONES xywh {290 140 220 80} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Dial spreadpar1 { label Par1 callback {// o->selection_color(setKnob(o->value(),0)); send_data (TOPLEVEL::action::forceUpdate, SUBSYNTH::control::overtoneParameter1, o->value(), TOPLEVEL::type::Integer);} xywh {401 166 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 255 step 1 class WidgetPDial } Fl_Dial spreadpar2 { label Par2 callback {// o->selection_color(setKnob(o->value(),0)); send_data (0, SUBSYNTH::control::overtoneParameter2, o->value(), TOPLEVEL::type::Integer);} xywh {437 166 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 255 step 1 class WidgetPDial } Fl_Dial spreadpar3 { label ForceH callback {// o->selection_color(setKnob(o->value(),0)); send_data (0, SUBSYNTH::control::overtoneForceHarmonics, o->value(), TOPLEVEL::type::Integer);} tooltip {Move towards closest harmonic} xywh {473 166 30 30} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 255 step 1 code0 {o->setValueType(VC_percent255);} class WidgetPDial } } Fl_Choice spreadtype { label {Overtone Positions} callback {// send_data (TOPLEVEL::action::forceUpdate, SUBSYNTH::control::overtonePosition, o->value(), TOPLEVEL::type::Integer);} xywh {303 170 87 20} down_box BORDER_BOX selection_color 64 labelsize 11 labelcolor 64 align 2 textfont 1 textsize 11 textcolor 64 code0 {o->add("Harmonic");o->add("ShiftU");o->add("ShiftL");o->add("PowerU");o->add("PowerL");o->add("Sine");o->add("Power");o->add("Shift");} } {} Fl_Group globalfiltergroup { label { FILTER } xywh {510 221 293 265} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 code0 {if (collect_readData(synth, 0, SUBSYNTH::control::enableFilter, npart, kititem, PART::engine::subSynth)==0) o->deactivate();} } { Fl_Group filterenv { label {Yoshimi : SubSynth - Filter Envelope} xywh {516 325 280 75} box FLAT_BOX color 51 align 16 code0 {o->init(pars->GlobalFilterEnvelope.get(), npart, kititem, PART::engine::subSynth, 2);} class EnvelopeUI } {} Fl_Group filterui { label {Yoshimi : SubSynth - Filter} xywh {516 246 280 75} box FLAT_BOX color 50 align 144 code0 {o->init(pars->GlobalFilter.get(),&pars->PGlobalFilterVelocityScale,&pars->PGlobalFilterVelocityScaleFunction, npart, kititem, 1);} class FilterUI } {} Fl_Group filterlfo { label {Filter LFO} xywh {516 405 280 75} box FLAT_BOX color 51 align 144 code0 {o->init(synth, npart, kititem, PART::engine::subSynth, TOPLEVEL::insertType::filter);} class LFOUI } {} } Fl_Check_Button filtere { label On callback {// if (o->value() == 0) globalfiltergroup->deactivate(); else globalfiltergroup->activate(); o->show(); globalfiltergroup->redraw(); send_data (0, SUBSYNTH::control::enableFilter, o->value(), TOPLEVEL::type::Integer);} xywh {516 227 36 13} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 class Fl_Check_Button2 } Fl_Group {} { xywh {574 486 229 35} box THIN_UP_FRAME } { Fl_Counter filterstages { label {Filter Stages} callback {// send_data (0, SUBSYNTH::control::filterStages, o->value(), TOPLEVEL::type::Integer);} tooltip {How many times the noise is filtered} xywh {593 501 66 15} type Simple selection_color 64 labelfont 1 labelsize 10 labelcolor 64 align 1 minimum 1 maximum 5 step 1 value 1 textsize 10 textcolor 64 } Fl_Choice magtype { label {Mag.Type} callback {// send_data (0, SUBSYNTH::control::magType, o->value(), TOPLEVEL::type::Integer);} xywh {660 501 65 15} down_box BORDER_BOX selection_color 64 labelfont 1 labelsize 10 labelcolor 64 align 1 textfont 1 textsize 11 textcolor 64 code0 {o->add("Linear");o->add("-40dB");o->add("-60dB");o->add("-80dB");o->add("-100dB");} } {} Fl_Choice start { label Start callback {// send_data (0, SUBSYNTH::control::startPosition, o->value(), TOPLEVEL::type::Integer);} xywh {740 501 50 15} down_box BORDER_BOX selection_color 64 labelfont 1 labelsize 10 labelcolor 64 align 1 textfont 1 textsize 11 textcolor 64 code0 {o->add("Zero");o->add("Rnd");o->add("Max.");} } {} } Fl_Check_Button stereo { label { Stereo} callback {// send_data (0, SUBSYNTH::control::stereo, o->value(), TOPLEVEL::type::Integer);} xywh {512 495 59 15} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 class Fl_Check_Button2 } Fl_Button subClear { label Clear callback {// send_data (TOPLEVEL::action::forceUpdate, SUBSYNTH::control::clearHarmonics, o->value(), TOPLEVEL::type::Integer);} tooltip {Clear the harmonics} xywh {515 526 70 20} box PLASTIC_UP_BOX color 228 labelfont 1 labelsize 11 labelcolor 64 } Fl_Button subCopy { label C callback {// synth->getGuiMaster()->getPresetsUi()->Ucopy(npart, kititem, PART::engine::subSynth);} xywh {610 529 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button subPaste { label P callback {// synth->getGuiMaster()->getPresetsUi()->Upaste(npart, kititem, PART::engine::subSynth);} xywh {646 529 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } Fl_Button subClose { label {&Close} callback {// saveWin(synth, SUBparameters->w(), SUBparameters->h(), SUBparameters->x(), SUBparameters->y(), false, "SubSynth"); subSeen = false; SUBparameters->hide(); if ((Fl::event_button() == 3)) { if (synth->getGuiMaster()->partui->partKitOn) synth->getGuiMaster()->partui->instrumentkitlist->show(); else synth->getGuiMaster()->partui->instrumenteditwindow->show(); }} tooltip {Right click: also reopen previous} xywh {695 526 105 20} box THIN_UP_BOX color 196 labelfont 1 labelsize 11 labelcolor 64 } } } Function {refresh()} {} { code {// for (int i = 0; i < MAX_SUB_HARMONICS; ++i) h[i]->refresh(); vol->value(collect_readData(synth, 0, SUBSYNTH::control::volume, npart, kititem, PART::engine::subSynth)); vol->selection_color(setKnob(vol->value(),96)); vsns->value(collect_readData(synth, 0, SUBSYNTH::control::velocitySense, npart, kititem, PART::engine::subSynth)); vsns->selection_color(setKnob(vsns->value(),90)); pan->value(collect_readData(synth, 0, SUBSYNTH::control::panning, npart, kititem, PART::engine::subSynth)); pan->selection_color(setKnob(pan->value(),64)); randompan->value(collect_readData(synth, 0, SUBSYNTH::control::enableRandomPan, npart, kititem, PART::engine::subSynth)); if (randompan->value() == 0) panwidth->deactivate(); else panwidth->activate(); panwidth->value(collect_readData(synth, 0, SUBSYNTH::control::randomWidth, npart, kititem, PART::engine::subSynth)); panwidth->selection_color(setKnob(panwidth->value(),63)); bandwidth->value(collect_readData(synth, 0, SUBSYNTH::control::bandwidth, npart, kititem, PART::engine::subSynth)); bandwidth->selection_color(setSlider(bandwidth->value(),40)); bwidthscale->value(collect_readData(synth, 0, SUBSYNTH::control::bandwidthScale, npart, kititem, PART::engine::subSynth)); bwidthscale->selection_color(setSlider(bwidthscale->value(),0)); bwee->value(collect_readData(synth, 0, SUBSYNTH::control::enableBandwidthEnvelope, npart, kititem, PART::engine::subSynth)); if (bwee->value() == 0) bandwidthenvelopegroup->deactivate(); else bandwidthenvelopegroup->activate(); bwee->show(); bandwidthsettingsui->redraw(); bend->value(collect_readData(synth, 0, SUBSYNTH::control::pitchBendAdjustment, npart, kititem, PART::engine::subSynth)); bend->selection_color(setKnob(bend->value(),88)); offset->value(collect_readData(synth, 0, SUBSYNTH::control::pitchBendOffset, npart, kititem, PART::engine::subSynth)); offset->selection_color(setKnob(offset->value(),64)); hz440->value(collect_readData(synth, 0, SUBSYNTH::control::baseFrequencyAs440Hz, npart, kititem, PART::engine::subSynth)); if (hz440->value() == 0) fixedfreqetdial->deactivate(); else fixedfreqetdial->activate(); fixedfreqetdial->value(collect_readData(synth, 0, SUBSYNTH::control::equalTemperVariation, npart, kititem, PART::engine::subSynth)); fixedfreqetdial->selection_color(setKnob(fixedfreqetdial->value(),0)); freqee->value(collect_readData(synth, 0, SUBSYNTH::control::enableFrequencyEnvelope, npart, kititem, PART::engine::subSynth)); if (freqee->value() == 0) freqenvelopegroup->deactivate(); else freqenvelopegroup->activate(); freqee->show(); freqsettingsui->redraw(); freqlfo->value(collect_readData(synth, 0, SUBSYNTH::control::enableFrequencyLFO, npart, kititem, PART::engine::subSynth)); if (freqlfo->value() == 0) freqlfogroup->deactivate(); else freqlfogroup->activate(); freqlfo->show(); freqsettingsui->redraw(); octave->value(collect_readData(synth, 0, SUBSYNTH::control::octave, npart, kititem, PART::engine::subSynth)); int detVal = collect_readData(synth, 0, SUBSYNTH::control::detuneFrequency, npart, kititem, PART::engine::subSynth); detune->value(detVal); detune->selection_color(setSlider(detVal,0)); int detType = collect_readData(synth, 0, SUBSYNTH::control::detuneType, npart, kititem, PART::engine::subSynth); detunetype->value(detType - 1); coarsedet->value(collect_readData(synth, 0, SUBSYNTH::control::coarseDetune, npart, kititem, PART::engine::subSynth)); detunevalueoutput->value(getDetune(detType,0,detVal+8192)); spreadtype->value(collect_readData(synth, 0, SUBSYNTH::control::overtonePosition, npart, kititem, PART::engine::subSynth)); if (spreadtype->value() > 0) { spreadGroup->activate(); } else { spreadGroup->deactivate(); } spreadpar1->value(collect_readData(synth, 0, SUBSYNTH::control::overtoneParameter1, npart, kititem, PART::engine::subSynth)); spreadpar1->selection_color(setKnob(spreadpar1->value(),0)); spreadpar2->value(collect_readData(synth, 0, SUBSYNTH::control::overtoneParameter2, npart, kititem, PART::engine::subSynth)); spreadpar2->selection_color(setKnob(spreadpar1->value(),0)); spreadpar3->value(collect_readData(synth, 0, SUBSYNTH::control::overtoneForceHarmonics, npart, kititem, PART::engine::subSynth)); spreadpar3->selection_color(setKnob(spreadpar1->value(),0)); filtere->value(collect_readData(synth, 0, SUBSYNTH::control::enableFilter, npart, kititem, PART::engine::subSynth)); if (filtere->value() == 0) globalfiltergroup->deactivate(); else globalfiltergroup->activate(); filtere->show(); globalfiltergroup->redraw(); filterstages->value(collect_readData(synth, 0, SUBSYNTH::control::filterStages, npart, kititem, PART::engine::subSynth)); magtype->value(collect_readData(synth, 0, SUBSYNTH::control::magType, npart, kititem, PART::engine::subSynth)); start->value(collect_readData(synth, 0, SUBSYNTH::control::startPosition, npart, kititem, PART::engine::subSynth)); stereo->value(collect_readData(synth, 0, SUBSYNTH::control::stereo, npart, kititem, PART::engine::subSynth)); ampenv->refresh(); bandwidthenvelopegroup->refresh(); freqenvelopegroup->refresh(); filterui->refresh(); filterenv->refresh();} {} } Function {Showsub()} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "SubSynth"); if (fetchW < subDW || fetchH < subDH) { fetchW = subDW; fetchH = subDH; } checkSane(fetchX, fetchY, fetchW, fetchH, subDW, subDH); SUBparameters->resize(fetchX, fetchY, fetchW, fetchH); SUBparameters->show(); lastsubW = 0; subSeen = true;} {} } Function {subRtext()} {} { code {// ampenv->wincheck(); bandwidthenvelopegroup->wincheck(); filterenv->wincheck(); freqenvelopegroup->wincheck(); if (filterui->formantparswindow->visible()) filterui->formantRtext(); if (!SUBparameters->visible()) return; if(SUBparameters->w() == lastsubW) return; lastsubW = SUBparameters->w(); float dScale = SUBparameters->w() / float(subDW); if (dScale < 0.2f) dScale = 0.2f; amplfo->lfoRtext(dScale); ampenv->envRtext(dScale); bandwidthenvelopegroup->envRtext(dScale); filterlfo->lfoRtext(dScale); filterenv->envRtext(dScale); freqenvelopegroup->envRtext(dScale); freqlfogroup->lfoRtext(dScale); filterui->filterRtext(dScale); int size = int(10 * dScale); int size11 = int(11 * dScale); frame->scroll_to(0, 0); frame->size(int(505 * dScale), int(326 * dScale)); frame->scrollbar_size(12 * dScale); harmonics->size(int(435 * dScale), int(275 * dScale * 1.1)); for (int i=0;isize(20 * dScale, 275 * dScale * 1.1); h[i]->h_num->labelsize(int(12 * dScale)); h[i]->h_dash->size(int(10 * dScale), int(3 * dScale)); } ampLabel->labelsize(size11); vol->labelsize(size); vsns->labelsize(size); pan->labelsize(size); panwidth->labelsize(size); randompan->labelsize(size11); freqsettingsui->labelsize(size11); freqee->labelsize(size); freqlfo->labelsize(size); octavetext->labelsize(size); octave->textsize(size11); bend->labelsize(size); offset->labelsize(size); hz440->labelsize(size); fixedfreqetdial->labelsize(size); detunevalueoutput->labelsize(size); detunevalueoutput->textsize(size); detunetype->labelsize(size); detunetype->textsize(size); coarsedet->labelsize(size); coarsedet->textsize(size11); bandwidthsettingsui->labelsize(size11); bwee->labelsize(size); bandwidth->labelsize(size); bandwidth->textsize(size); bwidthscale->labelsize(size); bwidthscale->textsize(size); spreadGroup->labelsize(size11); spreadpar1->labelsize(size); spreadpar2->labelsize(size); spreadpar3->labelsize(size); spreadtype->labelsize(size11); spreadtype->textsize(size11); globalfiltergroup->labelsize(size11); filtere->labelsize(size); filterstages->labelsize(size); filterstages->textsize(size11); magtype->labelsize(size); magtype->textsize(size11); start->labelsize(size); start->textsize(size11); stereo->labelsize(size); subClear->labelsize(size11); subCopy->labelsize(size11); subPaste->labelsize(size11); subClose->labelsize(size11); SUBparameters->redraw();} {} } Function {theme()} {} { code {// if(SUBparameters->visible()) { lastsubW = 0; subRtext(); } ampenv->theme(); freqenvelopegroup->theme(); filterenv->theme(); bandwidthenvelopegroup->theme(); if (filterui->formantparswindow->visible()) filterui->theme(); ;} {} } Function {send_data(int action, int control, float value, int type)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, npart, kititem, 1);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char insert = getData->data.insert; bool val_bool = _SYS_::F2B(value); int value_int = int(value); if (insert == TOPLEVEL::insert::harmonicAmplitude) { h[control]->mag->value(value_int); int temp = 127; if (control > 0) temp = 0; h[control]->mag->selection_color(setSlider(value_int,temp)); return; } if (insert == TOPLEVEL::insert::harmonicBandwidth) { h[control]->bw->value(value_int - 64); h[control]->bw->selection_color(setSlider(value_int,64)); return; } switch(control) { case SUBSYNTH::control::volume: vol->value(value); vol->selection_color(setKnob(value,96)); break; case SUBSYNTH::control::velocitySense: vsns->value(value); vsns->selection_color(setKnob(value,90)); break; case SUBSYNTH::control::panning: pan->value(value); pan->selection_color(setKnob(value,64)); break; case SUBSYNTH::control::enableRandomPan: randompan->value(val_bool); if (val_bool) panwidth->activate(); else panwidth->deactivate(); break; case SUBSYNTH::control::randomWidth: panwidth->value(value); panwidth->selection_color(setKnob(value,63)); break; case SUBSYNTH::control::bandwidth: bandwidth->value(value); bandwidth->selection_color(setSlider(value,40)); break; case SUBSYNTH::control::bandwidthScale: bwidthscale->value(value); bwidthscale->selection_color(setSlider(value,0)); break; case SUBSYNTH::control::enableBandwidthEnvelope: bwee->value(val_bool); if (val_bool) bandwidthenvelopegroup->activate(); else bandwidthenvelopegroup->deactivate(); bwee->show(); break; case SUBSYNTH::control::detuneFrequency: detune->value(value); detune->selection_color(setSlider(value,0)); detunevalueoutput->do_callback(); break; case SUBSYNTH::control::equalTemperVariation: fixedfreqetdial->value(value); fixedfreqetdial->selection_color(setKnob(value,0)); break; case SUBSYNTH::control::baseFrequencyAs440Hz: hz440->value(_SYS_::F2B(value)); if (value == 0) fixedfreqetdial->deactivate(); else fixedfreqetdial->activate(); break; case SUBSYNTH::control::octave: octave->value(lrint(value)); break; case SUBSYNTH::control::detuneType: detunetype->value(value - 1); break; case SUBSYNTH::control::coarseDetune: coarsedet->value(value); break; case SUBSYNTH::control::pitchBendAdjustment: bend->value(value); bend->selection_color(setKnob(value,88)); break; case SUBSYNTH::control::pitchBendOffset: offset->value(value); offset->selection_color(setKnob(value,64)); break; case SUBSYNTH::control::enableFrequencyEnvelope: freqee->value(value); if (val_bool) freqenvelopegroup->activate(); else freqenvelopegroup->deactivate(); freqee->show(); break; case SUBSYNTH::control::enableFrequencyLFO: freqlfo->value(value); if (val_bool) freqlfogroup->activate(); else freqlfogroup->deactivate(); freqlfo->show(); break; case SUBSYNTH::control::overtoneParameter1: spreadpar1->value((unsigned int) value); spreadpar1->selection_color(setKnob(value,0)); break; case SUBSYNTH::control::overtoneParameter2: spreadpar2->value((unsigned int) value); spreadpar2->selection_color(setKnob(value,0)); break; case SUBSYNTH::control::overtoneForceHarmonics: spreadpar3->value((unsigned int) value); spreadpar3->selection_color(setKnob(value,0)); break; case SUBSYNTH::control::overtonePosition: spreadtype->value((int) value); if (spreadtype->value() > 0) { spreadGroup->activate(); if (spreadtype->value() < 7) spreadpar2->activate(); else spreadpar2->deactivate(); } else spreadGroup->deactivate(); break; case SUBSYNTH::control::enableFilter: filtere->value(val_bool); if (val_bool) globalfiltergroup->activate(); else globalfiltergroup->deactivate(); globalfiltergroup->redraw(); break; case SUBSYNTH::control::filterStages: filterstages->value((int) value); break; case SUBSYNTH::control::magType: magtype->value((int) value); break; case SUBSYNTH::control::startPosition: start->value((int) value); break; case SUBSYNTH::control::clearHarmonics: for (int i = 0; i < MAX_SUB_HARMONICS; i++) { if (i == 0) { h[i]->mag->value(127); h[i]->mag->selection_color(setSlider(127,127)); } else { h[i]->mag->value(0); h[i]->mag->selection_color(setSlider(0,0)); } h[i]->bw->value(0); h[i]->bw->selection_color(setSlider(64,64)); } break; case SUBSYNTH::control::stereo: stereo->value(val_bool); break; }} {} } Function {SUBnoteUI(SUBnoteParameters *parameters, int npart_, int kititem_)} {} { code {// pars = parameters; synth = & pars->getSynthEngine(); npart = npart_; kititem = kititem_; lastsubW = 0; subSeen = false; make_window(); refresh();} {} } Function {~SUBnoteUI()} {return_type virtual } { code {// if (subSeen) saveWin(synth, SUBparameters->w(), SUBparameters->h(), SUBparameters->x(), SUBparameters->y(), true, "SubSynth"); subSeen = false; SUBparameters->hide(); delete(SUBparameters);} {} } decl {SUBnoteParameters *pars;} {private local } decl {SUBnoteharmonic *h[MAX_SUB_HARMONICS];} {private local } decl {SynthEngine *synth;} {private local } decl {int npart;} {private local } decl {int kititem;} {private local } decl {float subDW;} {private local } decl {float subDH;} {private local } decl {bool subSeen;} {private local } decl {int lastsubW;} {private local } } yoshimi-2.3.5.1/src/UI/ScaleTrackedWindow.cpp000066400000000000000000000041261506652756400207110ustar00rootroot00000000000000/* ScaleTrackedWindow.cpp - extension of FL_Window that tracks dimension changes and updates tooltip text size. Copyright 2025 Jesper Lloyd This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "ScaleTrackedWindow.h" #include ScaleTrackedWindow::ScaleTrackedWindow(int x, int y, int w, int h, const char *l) : Fl_Double_Window(x,y,w,h,l) { defaultH=h; defaultW=w; _dScale = 1; } ScaleTrackedWindow::ScaleTrackedWindow(int w, int h, const char *l) : Fl_Double_Window(w,h,l) { defaultH=h; defaultW=w; _dScale = 1; } void ScaleTrackedWindow::resize(int x, int y, int w, int h) { Fl_Double_Window::resize(x, y, w, h); _dScale = (float) w / (float) defaultW; Fl_Tooltip::size(tooltipSize()); } void ScaleTrackedWindow::reset(int defaultW, int defaultH) { this->defaultW = defaultW; this->defaultH = defaultH; _dScale = (float) w() / (float) defaultW; Fl_Tooltip::size(tooltipSize()); } int ScaleTrackedWindow::handle(int ev) { int result = Fl_Double_Window::handle(ev); if (ev == FL_FOCUS || ev == FL_ENTER) { Fl_Tooltip::size(tooltipSize()); result = 1; } return result; } int ScaleTrackedWindow::tooltipSize() const { float result = _dScale * 10; if (result < 12) { result = 12; } return int(result); } float ScaleTrackedWindow::dScale() const { return _dScale; } yoshimi-2.3.5.1/src/UI/ScaleTrackedWindow.h000066400000000000000000000026651506652756400203640ustar00rootroot00000000000000/* ScaleTrackedWindow.cpp - extension of FL_Window that tracks dimension changes and updates tooltip text size. Copyright 2025 Jesper Lloyd This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ScaleTrackedWindow_h #define ScaleTrackedWindow_h #include class ScaleTrackedWindow : public Fl_Double_Window { public: ScaleTrackedWindow(int x,int y, int w, int h, const char *label=0); ScaleTrackedWindow(int w, int h, const char *label=0); float dScale() const; int tooltipSize() const; void resize(int x, int y, int w, int h) override; void reset(int defaultW, int defaultH); int handle(int ev) override; private: int defaultH; int defaultW; float _dScale; }; #endif yoshimi-2.3.5.1/src/UI/Splash.cpp000066400000000000000000000107621506652756400164310ustar00rootroot00000000000000/* Splash.cpp - show a splash image during start-up Copyright 2015-2023, Andrew Deryabin, Jesper Lloyd, Will Godfrey & others Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include "globals.h" #include "UI/Splash.h" #include #include #include #include using std::string; namespace {// Splash screen layout config and data const Fl_Color SPLASH_BG_COLOUR = fl_rgb_color(0xd7, 0xf7, 0xff); const int SPLASH_WIDTH = 480; const int SPLASH_HEIGHT = 320; const int TEXT_HEIGHT = 15; const int TEXT_Y = 10; const double SPLASH_REFRESH_sec = 0.1; const double SPLASH_DURATION_sec = 5.0; const double INDICATOR_DURATION_sec = 3.0; const uchar SPLASH_PNG_DATA[] = { #include "UI/SplashPngHex" }; SplashScreen& instance(void* self) { return * static_cast(self); } } /** Trigger display of a splash screen for SPLASH_DURATION_sec */ void SplashScreen::showPopup() { int winH{SPLASH_HEIGHT}; int winW{SPLASH_WIDTH}; splashWin = std::make_unique(winW, winH, "Yoshimi splash screen"); int LbX{0}; int LbY{winH - TEXT_Y - TEXT_HEIGHT}; int LbW{winW}; int LbH{TEXT_HEIGHT}; // note: all the following widgets are automatically added as children of splashWin... auto box = new Fl_Box{0, 0, winW,winH}; auto pix = new Fl_PNG_Image{"splash_screen_png", SPLASH_PNG_DATA, sizeof(SPLASH_PNG_DATA)}; box->image(pix); startMsg = "V " + startMsg; auto boxLb = new Fl_Box{FL_NO_BOX, LbX, LbY, LbW, LbH, startMsg.c_str()}; boxLb->align(FL_ALIGN_CENTER); boxLb->labelsize(TEXT_HEIGHT); boxLb->labeltype(FL_NORMAL_LABEL); boxLb->labelcolor(SPLASH_BG_COLOUR); boxLb->labelfont(FL_HELVETICA | FL_BOLD); splashWin->border(false); splashWin->position((Fl::w() - splashWin->w()) / 2, (Fl::h() - splashWin->h()) / 2); splashWin->end(); // close child scope of splashWin splashWin->show(); // schedule a repeated refresh callback... refreshCycles = uint(SPLASH_DURATION_sec / SPLASH_REFRESH_sec); Fl::add_timeout(SPLASH_REFRESH_sec, SplashScreen::refreshSplash, this); } /** Activate display of a tiny start-up notification for INDICATOR_DURATION_sec */ void SplashScreen::showIndicator() { int winH{36}; int winW{300}; splashWin = std::make_unique(winW, winH, "Yoshimi start-up indicator"); int LbX{2}; int LbY{2}; int LbW{winW - 4}; int LbH{winH - 4}; startMsg = "Yoshimi V " + startMsg + " is starting"; auto boxLb = new Fl_Box{FL_EMBOSSED_FRAME, LbX, LbY, LbW, LbH, startMsg.c_str()}; boxLb->align(FL_ALIGN_CENTER); boxLb->labelsize(16); boxLb->labeltype(FL_NORMAL_LABEL); boxLb->labelcolor(0x0000e100); boxLb->labelfont(FL_BOLD); splashWin->border(false); splashWin->position((Fl::w() - splashWin->w()) / 2, (Fl::h() - splashWin->h()) / 2); splashWin->end(); splashWin->show(); // schedule a single callback to remove the indicator window... Fl::add_timeout(INDICATOR_DURATION_sec, SplashScreen::disposeSplash, this); } /** @internal callback to refresh the splash screen and keep it on top */ void SplashScreen::refreshSplash(void* self) { if (not self) return; if (0 < instance(self).refreshCycles--) { instance(self).splashWin->show(); // keeps it in front Fl::repeat_timeout(SPLASH_REFRESH_sec, SplashScreen::refreshSplash, self); } else // time is up -- remove the splash screen window... Fl::add_timeout(SPLASH_REFRESH_sec, SplashScreen::disposeSplash, self); } /** @internal callback to terminate the splash screen display */ void SplashScreen::disposeSplash(void* self) { instance(self).splashWin.reset(); }// Fl_Window dtor hides window, disables events and deallocates all child widgets yoshimi-2.3.5.1/src/UI/Splash.h000066400000000000000000000030011506652756400160620ustar00rootroot00000000000000/* Splash.cpp - show a splash image during start-up Copyright 2015-2023, Andrew Deryabin, Jesper Lloyd, Will Godfrey & others Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #ifndef SPLASH_H #define SPLASH_H #include #include class Fl_Window; class SplashScreen { std::unique_ptr splashWin; std::string startMsg{YOSHIMI_VERSION}; uint refreshCycles{1}; // shall not be copied or moved... SplashScreen(SplashScreen&&) = delete; SplashScreen(SplashScreen const&) = delete; SplashScreen& operator=(SplashScreen&&) = delete; SplashScreen& operator=(SplashScreen const&) = delete; public: SplashScreen() = default; void showPopup(); void showIndicator(); private: static void refreshSplash(void*); static void disposeSplash(void*); }; #endif /*SPLASH_H*/ yoshimi-2.3.5.1/src/UI/SplashPngHex000066400000000000000000014767021506652756400167750ustar00rootroot000000000000000x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x01,0xe0,0x00,0x00,0x01,0x40,0x08,0x06,0x00,0x00,0x00,0x64,0xc8,0xaf,0x7b,0x00,0x00,0x00,0x04,0x73,0x42,0x49,0x54,0x08,0x08,0x08,0x08,0x7c,0x08,0x64,0x88,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0e,0xc4,0x00,0x00,0x0e,0xc4,0x01,0x95,0x2b,0x0e,0x1b,0x00,0x00,0x00,0x19,0x74,0x45,0x58,0x74,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x00,0x77,0x77,0x77,0x2e,0x69,0x6e,0x6b,0x73,0x63,0x61,0x70,0x65,0x2e,0x6f,0x72,0x67,0x9b,0xee,0x3c,0x1a,0x00,0x00,0x00,0x44,0x74,0x45,0x58,0x74,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x00,0x43,0x43,0x20,0x41,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x69,0x6f,0x6e,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x65,0x61,0x74,0x69,0x76,0x65,0x63,0x6f,0x6d,0x6d,0x6f,0x6e,0x73,0x2e,0x6f,0x72,0x67,0x2f,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0x73,0x2f,0x62,0x79,0x2f,0x34,0x2e,0x30,0x2f,0x69,0x10,0xd7,0x5d,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x78,0x9c,0xec,0xbd,0x79,0xb4,0x25,0xc7,0x59,0x27,0xf8,0x8b,0xb8,0x79,0xdf,0xbe,0x55,0xbd,0x57,0x55,0xaf,0xf6,0x52,0xa9,0x54,0x2a,0xed,0x96,0x6d,0x6d,0x96,0x2d,0x19,0xdb,0xd8,0xc6,0x06,0x7b,0x18,0xcc,0x32,0x80,0x0d,0x0c,0x9c,0x69,0xe8,0x66,0x3b,0xdd,0xc3,0x39,0xb8,0x61,0xa0,0x1b,0x3c,0x74,0xcf,0x34,0xf4,0x98,0x81,0xe1,0x9c,0x9e,0x69,0xf6,0x06,0x83,0x6d,0x1a,0xdb,0xd8,0xc8,0xb6,0xbc,0xc8,0xab,0x2c,0xd9,0x92,0xa5,0x92,0x4a,0x7b,0x95,0x6a,0xdf,0xab,0xde,0xab,0xb7,0x2f,0x37,0xe3,0x9b,0x3f,0x22,0x22,0x33,0x32,0x32,0x32,0x6f,0xe6,0xbd,0x79,0x97,0xf7,0x5e,0xfe,0xea,0xdc,0x7a,0xf7,0xe6,0x12,0x7b,0xc4,0x2f,0xbe,0x2f,0xbe,0xf8,0x82,0xbd,0xff,0xa1,0xc3,0xb4,0xb4,0xb8,0x0c,0x40,0x00,0x00,0x48,0xfe,0x01,0x88,0x40,0x00,0x18,0xc2,0xdf,0x26,0x48,0x44,0x7f,0xc7,0x21,0xea,0xdc,0x2f,0x51,0xa2,0x44,0x89,0x12,0x25,0xd6,0x2b,0x78,0xea,0x5d,0xc6,0x19,0x3c,0x08,0x42,0x40,0x96,0x42,0x12,0x2e,0x29,0xb2,0x65,0x44,0xf2,0x96,0x19,0x8e,0x22,0x5e,0x4d,0xcc,0x54,0x12,0x6d,0x89,0x12,0x25,0x4a,0x94,0x28,0x61,0xc1,0xcd,0x8d,0x4c,0x13,0xaa,0x20,0x78,0x5a,0x90,0x8d,0x48,0xbe,0x86,0xb4,0xcb,0x14,0xd5,0x4a,0x79,0x18,0x00,0x67,0x01,0x09,0xab,0x0b,0xf1,0x68,0xa9,0x24,0xe5,0x12,0x25,0x4a,0x94,0x28,0xb1,0xb1,0xc1,0x59,0x9c,0x1f,0x4d,0xf6,0xf4,0xb4,0x28,0xcb,0xb8,0x22,0x61,0xc6,0x42,0xe9,0x96,0x08,0xe0,0xb6,0xc4,0x0b,0x49,0xc2,0x1a,0x0e,0x55,0xb4,0x2b,0xd2,0x12,0x25,0x4a,0x94,0x28,0x51,0x62,0xc3,0xc3,0xe0,0x4f,0x4f,0xaf,0xed,0x86,0x12,0x30,0x00,0x30,0x25,0x05,0xb3,0x50,0xf2,0x05,0x20,0x84,0xb9,0x2a,0x5c,0x67,0x0d,0xb8,0x94,0x82,0x4b,0x94,0x28,0x51,0xa2,0xc4,0x46,0x45,0x92,0x20,0x1a,0x08,0xad,0x0c,0x5e,0xf8,0x15,0x51,0xd5,0x33,0x8b,0xfe,0x86,0x20,0xa5,0x6c,0x26,0xf5,0x53,0x18,0x16,0x5a,0xa8,0xcb,0xc7,0x25,0x4a,0x94,0x28,0x51,0xa2,0xc4,0x86,0x81,0x2d,0x84,0x5a,0x7c,0xc9,0x19,0x87,0x47,0x24,0x40,0x7e,0x78,0x33,0x90,0x78,0x4d,0xee,0x35,0xd5,0xcc,0xa5,0x64,0x5b,0xa2,0x44,0x89,0x12,0x25,0x4a,0x34,0x05,0x41,0x02,0x1e,0x83,0x92,0x7e,0x41,0x00,0x03,0x58,0xc0,0xbf,0xea,0x8b,0xb0,0x8c,0xa0,0xcd,0x5f,0x84,0x92,0x90,0x4b,0x94,0x28,0x51,0xa2,0x44,0x89,0x7a,0x08,0xd4,0xcd,0x21,0x87,0x7a,0xf2,0x02,0xa9,0x9b,0x14,0x3e,0xc7,0x94,0x48,0xcc,0xcd,0x35,0x60,0x58,0x62,0xb4,0xa5,0x86,0x2e,0x51,0xa2,0x44,0x89,0x12,0x25,0x4a,0xa4,0x40,0x04,0x24,0xec,0x11,0x00,0x0a,0x65,0x60,0x68,0x79,0x18,0x40,0x60,0x90,0x05,0x58,0x6a,0xe8,0xe0,0x5e,0x69,0xed,0x5c,0xa2,0x44,0x89,0x12,0x25,0x4a,0xe4,0x82,0xb2,0x67,0xf6,0x00,0x45,0xb9,0x4c,0xed,0xf9,0x25,0xed,0xf4,0xca,0xd8,0xef,0xcb,0xe3,0x54,0x2b,0x98,0xad,0x7a,0xde,0xe8,0x64,0x5c,0xaa,0xe2,0x4b,0x94,0x28,0x51,0xa2,0x3e,0x36,0x2a,0x57,0x44,0x39,0x82,0x83,0x2b,0x15,0x34,0x00,0x80,0x59,0xee,0x26,0x09,0x01,0x4d,0x0b,0x6b,0xbb,0xaf,0x53,0xed,0x5c,0x12,0x50,0x89,0x12,0x25,0x4a,0x94,0xa8,0x87,0x92,0x2b,0x00,0x59,0x0a,0x5e,0xa8,0x70,0x0e,0x09,0x37,0xe0,0x57,0xce,0x02,0x9f,0xcf,0x3c,0x28,0x34,0x0e,0x28,0x0f,0x95,0xe5,0xfa,0x6f,0x89,0x12,0x25,0x4a,0x94,0x28,0x91,0x13,0x24,0xf5,0x00,0xc1,0x3e,0x60,0x32,0xee,0x08,0x10,0xb8,0xcd,0xae,0x81,0xe5,0x96,0x24,0x62,0x0e,0x53,0x2a,0xde,0xa8,0x2a,0x85,0x12,0x25,0x4a,0x94,0x28,0x51,0x22,0x2b,0x14,0x7f,0x32,0xf9,0xdd,0x63,0xca,0xfa,0x99,0x01,0x00,0x93,0x1e,0xb0,0x38,0x37,0xd4,0xd1,0xdc,0x90,0x7c,0x01,0x40,0x84,0x64,0xcb,0x23,0x1c,0x5d,0xaa,0x15,0x4a,0xd4,0x43,0x39,0x51,0x2b,0xb1,0x9e,0x51,0x8e,0x81,0x25,0xd2,0xc0,0x61,0x8f,0x81,0x5e,0xcc,0xf2,0x59,0x19,0x62,0xe9,0x9f,0x8c,0x55,0xa2,0x1e,0xb1,0x38,0xd4,0x7e,0xa4,0xf4,0x80,0xdb,0xdd,0x14,0xcb,0xa1,0xbd,0x44,0x89,0x12,0x9d,0x45,0x39,0x0a,0x75,0x3b,0xda,0xc9,0x4b,0xee,0xd6,0x10,0x4d,0x81,0x74,0xc4,0x41,0x90,0xd2,0x2f,0x08,0x2c,0x64,0x5e,0x49,0xbc,0xa4,0x56,0x85,0xcd,0x63,0x09,0x79,0xa5,0xee,0x79,0xc0,0x65,0x53,0x2c,0x91,0x07,0xa5,0xec,0x50,0x62,0xad,0xa0,0x1c,0xdb,0xd6,0x2e,0x3a,0x5f,0x77,0x61,0x0a,0xe4,0x79,0xc0,0x88,0xf8,0xe0,0x08,0x89,0xd7,0x74,0xca,0x01,0x00,0x9c,0x59,0x7b,0x81,0x99,0xbd,0x10,0xbc,0xbe,0xb0,0x4e,0xb3,0x55,0xa2,0x44,0x89,0xe6,0x50,0x4e,0x16,0xdb,0x88,0xf5,0x68,0xe8,0xcb,0x95,0x40,0x2b,0xb4,0x0a,0x5a,0x9e,0xc4,0x20,0x6f,0x2a,0x89,0x97,0x22,0x07,0x1f,0x49,0x42,0xe6,0xdc,0x72,0xc8,0x11,0x69,0x89,0x6b,0xfd,0x64,0x06,0xdb,0xe8,0xac,0x33,0xa9,0x68,0x1d,0xd6,0x62,0x9d,0x94,0x28,0x51,0x22,0x1f,0xd6,0xdd,0xc0,0xe5,0xc0,0x5a,0x1a,0xcb,0x1c,0xbc,0x68,0x70,0xa8,0x54,0x41,0xeb,0xb3,0x80,0x8d,0x67,0x18,0x63,0xe6,0x0f,0x79,0x8b,0x08,0xbc,0xe2,0xa8,0x60,0x43,0x62,0x5e,0xbb,0x58,0xeb,0xe9,0x5f,0xa3,0x60,0x1b,0x61,0xc0,0x28,0xb1,0x2e,0x41,0xdd,0x38,0x66,0x74,0x63,0x9a,0x36,0x32,0xac,0xfa,0xb0,0xc6,0x3b,0x2f,0x70,0x40,0xc9,0x99,0x24,0xe1,0x40,0x1a,0xd6,0x2a,0x68,0x23,0x00,0xa6,0xfe,0x8b,0x35,0xbc,0xf8,0x20,0x1a,0x73,0x5d,0x99,0x02,0xce,0xcb,0x41,0x78,0xc3,0xa2,0x1c,0x2f,0x4a,0xac,0x59,0x94,0xe3,0xd6,0x46,0x44,0x56,0x6e,0x73,0xf2,0x9a,0xf5,0xaa,0xc7,0x18,0x93,0x4b,0xb9,0x50,0x5b,0x7d,0x05,0xd4,0x3a,0xb0,0x7c,0x20,0x74,0xcb,0x61,0x12,0x71,0x18,0x30,0x25,0xcc,0x02,0x4b,0x52,0x2d,0xb1,0xde,0xc0,0x4a,0x69,0xbd,0xe5,0x48,0x1a,0x4f,0x4a,0x94,0xe8,0x16,0x34,0xcb,0x6d,0xe6,0x38,0xe2,0x11,0x8c,0xa5,0x5c,0xf5,0x45,0x1f,0x4d,0x28,0x7f,0xe8,0x2f,0x2c,0xbc,0x17,0x0d,0xcd,0x1d,0x4b,0x91,0x1d,0xa9,0x1c,0xf8,0x4a,0x74,0x01,0x4a,0x6a,0x68,0x03,0xca,0xbe,0x5e,0xa2,0xd3,0x28,0x8a,0xbb,0x12,0xda,0xb2,0x19,0xba,0x07,0x18,0x86,0xd1,0x5c,0x6e,0xf1,0x0d,0xa4,0xde,0xd8,0x01,0x48,0x64,0x29,0x5d,0x8c,0xbd,0xc3,0x19,0x23,0x2f,0x01,0x6c,0x8c,0xa1,0xbc,0xac,0xff,0x12,0x25,0x24,0xd6,0x7b,0x7f,0x5f,0x67,0x7d,0xbd,0xa5,0xdc,0x15,0xe5,0x4c,0xcf,0xbc,0x25,0x00,0x63,0x6b,0x11,0x0b,0xca,0x35,0x9c,0x10,0x18,0x09,0x8b,0x98,0x49,0x97,0xc8,0x87,0xb2,0xdc,0xd6,0x15,0xca,0xc9,0x66,0x7e,0x6c,0x28,0x55,0x73,0xd9,0x3e,0x4a,0x68,0x18,0x6d,0x81,0x31,0x69,0x05,0xad,0x11,0x4a,0xc2,0xea,0x0c,0x60,0xfb,0x15,0x61,0x90,0x6e,0x92,0x78,0xdd,0xa6,0x8e,0xb5,0xae,0xd6,0xe3,0xf2,0x94,0x59,0xb7,0xe4,0x7b,0x2d,0xa6,0xb9,0x44,0xf7,0xa0,0x6c,0x13,0x25,0xba,0x00,0xad,0xe6,0xab,0x7a,0x3c,0xe5,0xb9,0x2e,0x0a,0xd3,0xeb,0x95,0x09,0x73,0xf1,0x39,0xc1,0x12,0xac,0x7d,0xfd,0x6a,0x8d,0xce,0xa0,0x9b,0xad,0x70,0xd7,0xfb,0x9c,0xb5,0xae,0xe0,0x93,0xd2,0x9b,0x2b,0x3a,0x47,0x18,0xe5,0x00,0x5c,0xa2,0x44,0x67,0xb0,0x5e,0x9d,0x27,0x35,0x80,0xd6,0x0f,0x43,0x29,0x65,0xad,0x3d,0x61,0x81,0x55,0x82,0x81,0x56,0x40,0x80,0x47,0x0f,0x3e,0x0a,0x10,0xfc,0xe4,0xb0,0x4f,0x62,0x88,0xc3,0x7c,0xb7,0xf3,0xfe,0xbf,0x3a,0x0f,0x55,0xbe,0xdb,0x87,0xfb,0xf1,0x96,0x7d,0x5b,0xe4,0xa5,0x26,0x82,0x9b,0x5d,0x5e,0xc5,0xb1,0xe9,0x05,0xbc,0x70,0x79,0x16,0x3e,0x51,0x94,0x28,0x9b,0x6d,0x55,0x16,0xe9,0x56,0x18,0xc3,0xa1,0x89,0x61,0xec,0x1f,0x1b,0xc0,0x70,0x6f,0xb5,0xe1,0x60,0x75,0xaa,0xbe,0x74,0xfc,0x12,0xce,0xcd,0x2d,0xa9,0x8b,0x39,0xda,0x51,0x89,0x12,0xed,0xc4,0x7a,0x1d,0xb7,0xca,0x1d,0x2a,0xad,0x85,0x75,0x7e,0x51,0x1a,0x24,0x01,0xab,0xf5,0x5c,0x01,0x42,0x78,0xf2,0xaf,0x00,0x78,0x34,0x8c,0xe0,0x60,0x24,0x63,0x50,0x14,0x59,0x24,0x3a,0xbf,0xfe,0x23,0xdd,0x06,0x5e,0xe4,0xd4,0xc8,0x28,0x23,0xf2,0x05,0xde,0x7b,0x70,0x47,0x61,0x41,0x5f,0x5d,0x5c,0xc1,0x67,0x5e,0x3e,0x87,0xcf,0xbd,0x72,0x01,0xb5,0x60,0x66,0x1b,0x75,0xa0,0x92,0x19,0x56,0x5d,0x7a,0x9c,0xe1,0x1d,0x07,0xb6,0xe1,0xdd,0x37,0x6c,0xc7,0xe6,0xfe,0x9e,0xe6,0x13,0xab,0xf0,0xf0,0xd1,0x0b,0x61,0x5b,0x02,0x95,0xd2,0x70,0x89,0xee,0x44,0x39,0xf9,0xeb,0x38,0x32,0xf1,0x4b,0xb7,0x22,0x81,0xf7,0x4c,0x6e,0x51,0x2a,0x68,0xe9,0xf5,0x2a,0x14,0x7c,0x43,0x0a,0x17,0x66,0x2b,0xb4,0x18,0x9d,0xd4,0x9e,0xe1,0xf5,0x08,0xbb,0xec,0x58,0xa3,0xb3,0x61,0x0a,0xb7,0x74,0x11,0x08,0xe7,0x17,0x96,0xb1,0xb0,0xea,0x63,0xa0,0x5a,0x69,0x26,0x79,0x01,0x36,0xf7,0xf7,0xe0,0xfd,0xb7,0xef,0xc5,0xdb,0xaf,0x9f,0xc4,0x7f,0x7d,0xea,0x55,0x3c,0x75,0x61,0x3a,0xbe,0x77,0xbb,0x5e,0x1d,0x85,0x9b,0xbe,0x83,0x74,0xbe,0x66,0xdb,0x18,0x7e,0xee,0x35,0xd7,0x61,0xdb,0x60,0x6f,0x21,0xe9,0xd4,0x98,0x5f,0xf5,0x71,0x71,0x61,0x19,0xc4,0xad,0x3d,0xe6,0xeb,0xb4,0x1d,0x95,0x28,0x51,0x22,0x3b,0xc8,0x9e,0xf4,0xac,0xc3,0x71,0xc1,0x47,0xc8,0x27,0x4a,0x05,0xad,0xfe,0x53,0x03,0x31,0x0f,0x5c,0x73,0xc4,0xa7,0x80,0xe6,0x95,0x86,0x49,0x69,0xa3,0xc0,0x94,0x7c,0x41,0x00,0xc9,0x83,0x2e,0x4e,0x5c,0x5b,0xc0,0x4d,0x13,0xc3,0x85,0x46,0xb5,0x6d,0xb0,0x17,0xbf,0x71,0xff,0x21,0x7c,0xe5,0xc4,0x65,0xfc,0xf9,0xe1,0xe3,0x98,0x5f,0xad,0x19,0xdb,0xc9,0x12,0x88,0xd8,0x9a,0x5d,0x12,0x08,0x43,0x55,0x0f,0x3f,0x73,0xc7,0x3e,0x3c,0xb0,0x67,0xa2,0xd0,0xf4,0x69,0x9c,0x98,0x9e,0x07,0xd3,0x27,0x6c,0x31,0x8a,0xa6,0x71,0x1d,0x76,0xb6,0x12,0x25,0xf2,0x62,0x23,0x0b,0xde,0x1b,0x8d,0x53,0x3c,0x30,0x84,0x5b,0x8f,0x22,0x82,0x53,0x58,0x12,0x62,0x43,0x37,0x89,0xe6,0xa1,0xc9,0x17,0x44,0x20,0x46,0x78,0x75,0x7a,0xae,0x70,0x02,0xd6,0x78,0x70,0xef,0x04,0xee,0xd8,0x36,0x8a,0xbf,0x38,0x7c,0x02,0xdf,0x38,0x75,0x59,0xed,0x26,0x8b,0xed,0x27,0x73,0xa4,0x0f,0x78,0xe3,0xee,0x09,0xfc,0xf4,0xed,0x7b,0x31,0xda,0xd7,0xf8,0x3a,0x6f,0x3d,0xbc,0x3a,0x3d,0x0f,0x9f,0x91,0x3c,0x02,0xd3,0x26,0xe1,0x12,0x25,0x4a,0x94,0xd8,0x40,0x90,0x87,0x31,0x18,0xdb,0x8b,0x22,0x5e,0xb0,0x00,0x80,0x84,0xa5,0x79,0xd6,0xd2,0x71,0x89,0x38,0x8c,0x92,0x52,0xeb,0xea,0x04,0x5f,0x92,0x8d,0x22,0x5f,0x26,0x04,0x4e,0x4c,0xcf,0xb7,0x34,0x15,0x63,0x7d,0x55,0xfc,0xea,0xdd,0x07,0xf0,0xce,0xfd,0xdb,0xf0,0x77,0x47,0x4e,0xe1,0xf9,0xcb,0x33,0xc9,0x56,0xcb,0x04,0xdc,0x3c,0x31,0x82,0xff,0xe9,0xd6,0xdd,0xb8,0x71,0xbc,0x35,0x93,0x02,0x13,0xc7,0xa7,0xe7,0xc1,0x85,0x00,0x38,0x57,0x24,0x8c,0x90,0x84,0x4b,0x29,0xb8,0x44,0x89,0x75,0x02,0x97,0x28,0x5b,0xf2,0x86,0x0d,0x8f,0x94,0x24,0x12,0x73,0x31,0x09,0x79,0x1d,0xcc,0x5a,0xab,0x24,0x69,0xa8,0x55,0x22,0x23,0x58,0x05,0x7a,0x8d,0x1d,0x10,0x20,0xc6,0x71,0x7c,0x6a,0xa1,0x2d,0x51,0x1f,0x9a,0x18,0xc6,0xbf,0x7b,0xf0,0x66,0x9c,0xb8,0xb6,0x80,0x47,0x4f,0x4f,0xe1,0x85,0x2b,0x73,0xb8,0x38,0xbf,0x0c,0x40,0xaa,0xac,0x0f,0x4d,0x0c,0xe1,0xde,0x9d,0x9b,0xb0,0x77,0x74,0xa0,0x2d,0xe9,0x01,0x80,0xe3,0x53,0x0b,0x20,0xe6,0xa9,0x55,0x0f,0x2e,0x09,0x97,0xd5,0xdf,0x5f,0x5e,0xa2,0x44,0x89,0x35,0x86,0x98,0xc6,0xad,0xe4,0x0d,0x1b,0x81,0x23,0x0e,0xb7,0x9a,0x92,0x8c,0xff,0xf3,0xc2,0x35,0xdb,0xd9,0x80,0x15,0x40,0x04,0x08,0x29,0xfd,0x42,0x08,0x40,0x10,0x4e,0x4e,0xcd,0xc1,0x17,0x84,0x4a,0x9b,0xb6,0x03,0xec,0x1d,0x1d,0x68,0x2b,0xc9,0x26,0xa1,0x26,0x08,0xa7,0xaf,0xcd,0x82,0x11,0x03,0xe3,0x0c,0xe0,0x00,0x23,0x66,0x3a,0x5d,0x8b,0x63,0x0d,0x1b,0x41,0x96,0x58,0xe3,0x68,0xb0,0x7b,0xae,0x65,0xc3,0xdd,0x12,0xcd,0xc0,0xe6,0xbc,0xfa,0x7c,0xe7,0x99,0x66,0x42,0x00,0x22,0x67,0xff,0x36,0x87,0x0d,0x48,0xb6,0x16,0x82,0xb5,0x5f,0xc8,0x7d,0xba,0x04,0x06,0x22,0x81,0x15,0x9f,0x70,0x66,0x66,0x01,0x7b,0xc6,0x06,0x3b,0x9d,0xc4,0xb6,0xe2,0xd4,0xb5,0x79,0xac,0xac,0x92,0x12,0x7c,0x79,0xb8,0xf4,0x21,0x98,0x54,0xcf,0x97,0x6b,0xc1,0x25,0xba,0x09,0x25,0x91,0x96,0xc8,0x85,0xfc,0x9c,0xe7,0x31,0xa6,0x2d,0xcf,0x14,0xf1,0xaa,0xbd,0xa4,0x51,0x4d,0x60,0x92,0xee,0xbe,0x1b,0x48,0xb6,0x5b,0xd7,0x15,0xf4,0x99,0xca,0x9a,0x80,0xd5,0xc6,0x26,0x26,0x00,0x2e,0x70,0x7c,0x7a,0x6e,0xc3,0x11,0xf0,0xf1,0xa9,0x79,0x30,0x4e,0x52,0xeb,0xac,0x0e,0xf6,0x60,0x0c,0xb2,0x88,0xb4,0x14,0x5c,0x72,0x70,0x89,0x12,0x1d,0x42,0xb7,0x8e,0xa5,0xad,0x40,0xa7,0xb9,0x4b,0x96,0xb5,0x92,0x80,0x99,0xda,0x85,0x44,0x71,0x2f,0x29,0x22,0x79,0xcd,0x97,0x3a,0x54,0x61,0x2c,0xea,0x1e,0xa4,0x23,0x69,0xa8,0x8f,0x90,0x80,0x65,0x39,0xf1,0xe0,0x32,0x11,0xe1,0xd8,0xd5,0x39,0x3c,0xb0,0x6f,0x5b,0x07,0xd3,0xd7,0x7e,0xbc,0x3a,0x3d,0x07,0x62,0x52,0xfa,0x95,0xee,0x33,0xa1,0x7e,0x1b,0xec,0x5b,0xae,0x01,0x97,0x28,0x51,0x0c,0x72,0xbb,0x9c,0xec,0xd6,0xb1,0xb4,0xb5,0xe8,0x04,0x8f,0x69,0x0e,0xf3,0x64,0x02,0x28,0xaa,0x6e,0x89,0x55,0x1c,0x8b,0x1a,0xf8,0x06,0xf7,0x3b,0x53,0x61,0x59,0x9b,0x15,0x6b,0x66,0x8d,0xb5,0xb0,0x3a,0x31,0x44,0xbc,0xe0,0x04,0x29,0x86,0x63,0x57,0xe6,0x8a,0x8a,0x60,0xcd,0xe0,0xe8,0xa5,0x19,0xb5,0xdd,0x4d,0x9d,0x42,0xcd,0x95,0x01,0x96,0xfe,0x00,0xa5,0x04,0x5c,0xa2,0x44,0x57,0xa2,0x43,0x1d,0xb3,0x09,0x8a,0xa1,0xcc,0x13,0x90,0xf6,0xf3,0x98,0x4e,0x99,0x07,0xe2,0xf2,0xa7,0x30,0xcf,0xfa,0x65,0xb1,0x07,0x4d,0x42,0x5a,0x33,0x6b,0x75,0x5d,0xac,0x51,0x39,0x7a,0x65,0x16,0x44,0xb4,0xbe,0x4e,0x75,0x4a,0x81,0x20,0x92,0x2a,0x68,0x35,0x01,0xd1,0xff,0x10,0xfc,0x45,0xf0,0xbb,0x44,0x89,0x12,0x9d,0x45,0xd7,0x2c,0x7f,0x37,0x31,0x86,0xaf,0x05,0x9e,0xf2,0xa4,0xf8,0x4d,0x00,0x57,0x4a,0xd3,0x08,0xd1,0x76,0x07,0xba,0xa6,0x31,0xe4,0x44,0x98,0x6e,0x26,0xcb,0x96,0x85,0xdb,0xbd,0x16,0x6b,0x3e,0xce,0xce,0x2c,0x62,0x67,0x17,0x58,0x27,0xb7,0x03,0xa7,0xaf,0x2d,0x60,0xb1,0xe6,0x83,0x55,0xe4,0x6c,0x53,0xb0,0x90,0x7e,0xa3,0x47,0x54,0x97,0x28,0x51,0xa2,0x44,0x67,0xd0,0xee,0x31,0x48,0x6e,0x43,0xd2,0x96,0xcf,0xa0,0xe8,0xb6,0xdf,0xcc,0x96,0xd0,0x11,0xcf,0x1d,0xc5,0xa4,0x2c,0x21,0xf4,0x35,0x03,0x92,0x1a,0x05,0x22,0x11,0x16,0x89,0x90,0xeb,0xc2,0x24,0x08,0x8c,0x08,0xaf,0x5c,0x9d,0xd9,0x30,0x04,0xfc,0xca,0xd5,0x59,0xd9,0xb6,0x2a,0x6a,0xfb,0x2f,0x97,0x4b,0x04,0xb2,0xfd,0x19,0x9a,0x80,0x35,0x59,0xd9,0x25,0x4a,0xac,0x13,0x94,0x7b,0xa8,0x5a,0x80,0x64,0x7e,0xf4,0x94,0x93,0xa6,0xe8,0x83,0xc2,0x21,0x93,0x38,0xd4,0xe4,0xa1,0xf3,0x8e,0xe6,0x2b,0xad,0xe5,0xea,0x82,0x76,0xab,0xa3,0x23,0x6b,0xea,0x80,0xdc,0x6e,0x23,0xbf,0x33,0xe2,0x20,0x02,0x8e,0x5e,0x99,0xc3,0x83,0xd7,0xb5,0x39,0x5d,0x1d,0xc2,0xb1,0xab,0x73,0x00,0xb8,0x34,0x3e,0x90,0xea,0x00,0xb5,0x45,0x4b,0x19,0x60,0x51,0xb8,0x23,0xbd,0x44,0x89,0x75,0x8b,0xae,0x3f,0x8b,0x77,0x8d,0xf7,0xbf,0x16,0x2e,0xe7,0xba,0x9d,0x55,0x65,0x7b,0xd3,0x86,0xe6,0x3b,0x8f,0xb9,0x02,0x76,0x9d,0x07,0xec,0x20,0xb0,0xb5,0xa0,0x63,0xef,0x08,0x38,0x33,0xca,0xdc,0x2c,0xdb,0xd0,0x18,0x8b,0x08,0x38,0x7a,0x75,0xa6,0xfd,0x69,0xeb,0x10,0x5e,0xb9,0x72,0x0d,0x6a,0x27,0x34,0xa2,0x4e,0xc7,0xbb,0x7d,0x40,0x2a,0x51,0xa2,0x40,0x6c,0x18,0x43,0x63,0x83,0x1b,0xda,0x39,0xe9,0x68,0xa1,0xa0,0xd5,0x0a,0xbe,0xf3,0x52,0xef,0x9a,0x8d,0xa5,0xeb,0x67,0x6e,0x0a,0x5d,0x71,0xd8,0xb4,0xf2,0xa7,0x1d,0x39,0x85,0x88,0x21,0x6c,0x1d,0x0c,0x8c,0x31,0xbc,0x3a,0x3d,0x07,0x9f,0x08,0x95,0x75,0x6e,0x88,0xe5,0x0b,0xc2,0x89,0x6b,0xf3,0x4a,0xcd,0x6c,0x1e,0x41,0xc8,0x11,0xba,0xe9,0x2c,0x51,0xa2,0xc4,0xfa,0x81,0xd1,0xa7,0xbb,0x61,0xd2,0xd1,0xa5,0xfc,0xe5,0x81,0x00,0x26,0x8c,0x83,0x18,0x12,0xc1,0x92,0x0b,0x32,0xef,0xac,0x23,0x6f,0x85,0xe4,0x09,0xbf,0x9b,0x2c,0x9f,0x2d,0x0d,0x3d,0xd3,0xaa,0x57,0x21,0x4d,0xe4,0x97,0x6b,0x02,0x27,0xa6,0xe6,0xb0,0x7f,0x73,0xeb,0x0f,0x41,0xe8,0x24,0x5e,0xbd,0x3a,0x8b,0xd5,0x15,0x52,0x6b,0xbe,0x1c,0x9c,0x33,0xe9,0x82,0x52,0x28,0x0b,0x68,0x7d,0x62,0x13,0x63,0x25,0x17,0x97,0x28,0x91,0x82,0xc6,0xd5,0xa0,0x1b,0x1d,0x39,0x84,0x9c,0x3c,0xfc,0xd4,0x24,0xf7,0x79,0xca,0x2c,0x28,0x7a,0x95,0x6c,0xb5,0xa9,0x82,0x7d,0x4a,0x7d,0xa3,0x28,0x2a,0x9c,0x5c,0xe8,0x40,0xc3,0x25,0xa5,0x62,0x55,0xdb,0x5c,0xe5,0xb9,0x17,0x4a,0xe2,0x53,0xd2,0xe0,0x0b,0x97,0xae,0xad,0x7b,0x02,0x7e,0xe1,0xd2,0x35,0x04,0xa7,0x0f,0x82,0x40,0xaa,0x0c,0x18,0x41,0xfa,0xc8,0x2e,0x07,0x95,0x12,0x25,0xd6,0x07,0x3a,0x6e,0xc4,0x55,0x80,0x36,0xb1,0x95,0xfc,0x64,0x85,0xed,0x31,0x46,0x0e,0xc6,0x77,0x67,0x22,0xfb,0xc6,0xe6,0xe2,0xd0,0x94,0x33,0x8d,0x68,0x48,0x05,0x85,0x93,0x03,0xa4,0xb7,0xd9,0x10,0x20,0x94,0xfa,0x55,0x59,0x42,0x73,0x92,0xce,0x18,0x9f,0xbf,0x34,0x83,0x77,0xdd,0xd8,0xfe,0xa4,0xb5,0x13,0x2f,0x5c,0x9e,0x01,0xab,0x30,0xf9,0x61,0x54,0xa0,0x05,0xf4,0xfa,0x56,0xdd,0x97,0x68,0x07,0x3a,0x4d,0x18,0xeb,0x0d,0xeb,0xa3,0x4f,0xb6,0x8b,0xeb,0x3c,0x52,0x16,0xba,0xd9,0x22,0x4c,0x2a,0xdc,0x46,0xb6,0x2b,0x65,0x03,0x75,0x93,0x4a,0x39,0x2f,0xc8,0xf8,0xa3,0x76,0x23,0x11,0x31,0x90,0x60,0x20,0x22,0x10,0x31,0x7c,0xeb,0xe4,0x45,0x9c,0xb9,0xb6,0x6f,0xdd,0x6e,0x47,0x3a,0x33,0xb3,0x80,0xc7,0xcf,0x5c,0x36,0x8e,0x65,0xe4,0x08,0x67,0x7c,0xb6,0x03,0xe8,0xf5,0xd1,0x79,0x4b,0xac,0x25,0xac,0xcd,0x36,0xd7,0x09,0x61,0x68,0x63,0x21,0x6f,0xbb,0x68,0x8c,0x03,0x95,0x2b,0x4a,0x17,0xcb,0xe5,0x49,0xc0,0xda,0x6c,0xc4,0x12,0x2d,0x6c,0xc8,0x81,0x21,0x56,0x78,0xd0,0x3c,0x23,0x21,0x0d,0xa1,0x85,0x8c,0x5b,0x08,0xc2,0x5f,0x3c,0xf1,0x32,0x7e,0xe3,0x2d,0x77,0xb4,0x2e,0x1d,0x1d,0xc4,0x5f,0x3e,0xf9,0x32,0x7c,0x5f,0x00,0x15,0x00,0x54,0x01,0xe3,0x04,0x30,0x1f,0xc4,0x94,0x07,0x36,0x6d,0x15,0xad,0x55,0xf3,0xed,0xc0,0x5a,0x9e,0xd4,0x95,0x70,0xa3,0x1b,0x0c,0x7d,0xda,0x89,0xa2,0xf3,0xbb,0xe6,0xfa,0x44,0xb7,0x71,0x4e,0x63,0xe9,0xf1,0xa4,0x1b,0x4a,0x64,0x13,0x35,0x5b,0x95,0xe7,0xf5,0x3c,0x99,0x0b,0xd6,0x81,0x19,0x18,0x91,0x72,0xcc,0x21,0xb7,0xe3,0x10,0x09,0x00,0x0c,0x4f,0x9c,0xb9,0x82,0xef,0x9e,0xb9,0x82,0x3b,0x77,0x8e,0x77,0x3a,0xb5,0x85,0xe2,0xf0,0xb9,0xab,0xf8,0xce,0xa9,0x2b,0xf2,0xf0,0x05,0xa1,0x96,0x13,0x54,0x33,0xd3,0xe7,0x00,0x97,0xc2,0x6f,0x89,0x42,0xb0,0xe6,0x08,0x64,0x8d,0x63,0x4d,0xab,0x26,0x9b,0x44,0x81,0x63,0x95,0x27,0xc5,0x31,0x80,0xb2,0x4c,0xa9,0xd6,0x33,0x51,0xb6,0x0c,0xa4,0xfe,0x37,0x24,0x3d,0x26,0xa5,0x40,0xc6,0x19,0xc8,0x97,0xba,0xe9,0x3f,0xff,0xf6,0x4b,0xb8,0x7d,0xfb,0xbd,0xa8,0x74,0xc5,0x36,0xaa,0xe6,0x41,0x44,0xf8,0xcb,0xef,0xbc,0xac,0x8f,0x3b,0x92,0x24,0x0c,0x7d,0xb2,0x96,0xb6,0x76,0x2e,0xcf,0x00,0x2e,0x51,0xa2,0x7b,0x90,0xa7,0x2f,0x56,0x22,0xbf,0x36,0x94,0x75,0x76,0x81,0x59,0x95,0x12,0x30,0xfc,0x72,0x18,0x6c,0x19,0x8c,0x3d,0x48,0xa4,0xd4,0xfd,0x0c,0x90,0x22,0xa1,0xde,0xda,0x25,0x70,0x6a,0x66,0x01,0x0f,0xbf,0x74,0x06,0xef,0x3c,0xb4,0xab,0x73,0x49,0x2d,0x10,0x0f,0xbf,0x7c,0x16,0xc7,0xa6,0xe6,0xa4,0xd4,0xcb,0xf5,0xc4,0x83,0x05,0xc7,0x10,0x02,0x88,0xaa,0xd1,0xca,0x06,0x58,0xa2,0x44,0x87,0x91,0x93,0x59,0x0c,0x29,0xb8,0xec,0xbe,0x8d,0xc1,0x23,0xb1,0xa1,0xe6,0x2e,0x1d,0x83,0xde,0x82,0x44,0x7a,0x01,0x98,0x49,0x8b,0xe8,0xd0,0x57,0x34,0xe1,0x6f,0x9f,0x3a,0x8a,0x07,0xf6,0x4f,0x62,0xa0,0x27,0xdd,0x3f,0x4a,0xb7,0x63,0x71,0xb5,0x86,0x8f,0x7c,0xf7,0x18,0x18,0x63,0xea,0xdc,0x4b,0x29,0xe9,0xca,0xdf,0xa5,0x03,0x8e,0x12,0x25,0xba,0x19,0xb4,0x91,0xd5,0xcb,0x6d,0x86,0x07,0x88,0x72,0xf6,0xd2,0x4a,0x30,0x16,0xd9,0x1b,0xc7,0x88,0xc9,0x7d,0xb0,0x0c,0x00,0x23,0x70,0xce,0x20,0x88,0x81,0x11,0x30,0xbb,0xb4,0x82,0x4f,0x3c,0x7b,0x1c,0x3f,0xfe,0xda,0x03,0x9d,0x4b,0x6f,0x01,0xf8,0xf4,0x73,0x27,0x31,0xbd,0xb8,0x04,0xc6,0xb9,0xb1,0xcd,0x48,0x40,0x8b,0xbc,0x4c,0x10,0xc0,0xd4,0x29,0x5c,0xba,0xf5,0x35,0xcb,0xc5,0xeb,0xdc,0x9b,0x58,0x89,0x12,0xed,0x42,0xd9,0x93,0xda,0x07,0x65,0x05,0x5d,0xa2,0xf5,0x60,0xd2,0xe9,0x04,0xa9,0x63,0x09,0x19,0x29,0x1b,0x60,0x29,0x19,0x42,0x5d,0xfb,0xf4,0x73,0x27,0xf1,0x03,0xb7,0xec,0xc5,0x70,0x6f,0xb5,0xd3,0x09,0x6e,0x08,0x0b,0x2b,0x35,0x7c,0xe2,0xd9,0x13,0x7a,0xe9,0x57,0x9d,0xb1,0xa0,0xf7,0xf9,0xe6,0xef,0xda,0x7d,0x5e,0x25,0xe2,0xaa,0x53,0x80,0xb0,0xb8,0xea,0xd8,0x29,0xef,0x72,0x00,0xd0,0x6e,0x52,0x6e,0xd4,0x09,0x41,0x39,0x79,0x28,0xd1,0x85,0x68,0x76,0xd3,0x69,0x89,0xfa,0xf0,0x88,0x10,0xf7,0x93,0xc9,0xf3,0xcc,0x82,0x92,0x8f,0x5a,0xea,0x68,0x45,0x75,0x9b,0x16,0xc5,0xb0,0x86,0x86,0x90,0x5e,0xa0,0x02,0x03,0x38,0xa2,0xe0,0x74,0xa0,0x85,0x95,0x1a,0x3e,0x71,0xf8,0x55,0xbc,0xff,0xae,0x83,0x1d,0x4e,0x70,0x63,0xf8,0xd4,0x91,0x13,0x98,0x5f,0xad,0x49,0xe9,0x37,0x50,0x3b,0x5b,0xea,0x67,0xa3,0x61,0x30,0x06,0xec,0x1b,0x1b,0xc0,0xf5,0x63,0x43,0xd8,0x35,0xd2,0x8f,0x9d,0xc3,0xfd,0xd8,0xd4,0xd7,0x83,0x91,0x5e,0x0f,0x23,0x29,0x93,0x90,0x65,0x5f,0x60,0x6a,0x71,0x05,0xd3,0xcb,0xab,0xb8,0x34,0xbf,0x8c,0x93,0x33,0x0b,0x38,0x7e,0x6d,0x1e,0x47,0xaf,0xce,0x63,0x41,0x13,0x34,0x59,0x11,0x15,0x89,0x22,0x3d,0xfe,0x64,0x9d,0x3c,0x14,0x11,0x67,0xd6,0x72,0x68,0x65,0x5c,0x45,0x95,0x5d,0x51,0x65,0x54,0x64,0xdb,0xa8,0x17,0xbf,0x6b,0xff,0x6e,0xa7,0xeb,0x3a,0x01,0xeb,0x82,0x68,0x3b,0xb4,0x3d,0xcd,0x5d,0xf2,0xe6,0x21,0x34,0x12,0x9e,0x10,0xe6,0x0d,0x05,0x93,0xbc,0xea,0x36,0x84,0x16,0x76,0xa6,0x75,0x07,0x2d,0x05,0x73,0x10,0x13,0xf2,0x6c,0x20,0xe6,0x83,0x78,0x45,0xae,0xbb,0x30,0xe9,0xa6,0xf1,0x9f,0x9e,0x3b,0x85,0xf7,0xdc,0xba,0x0f,0xa3,0xfd,0x3d,0x9d,0x4e,0x70,0x2e,0xcc,0xaf,0xd4,0xf0,0xa9,0x23,0x27,0x8d,0xb9,0x06,0x07,0x23,0xa6,0x0c,0xbf,0x99,0xd4,0x3a,0x03,0xe8,0x61,0x1c,0xaf,0xdb,0xb1,0x09,0x6f,0xdc,0x33,0x8e,0x5b,0xb7,0x8e,0x62,0xb0,0x5a,0x49,0x0d,0xd7,0x85,0xde,0x0a,0xc7,0xe4,0x50,0x1f,0x26,0x87,0xfa,0x70,0x68,0x3c,0x74,0xe5,0xe9,0x13,0xe1,0xa5,0x2b,0x73,0x78,0xf2,0xdc,0x14,0x1e,0x39,0x71,0x09,0xd7,0x96,0x6a,0xea,0x8e,0x79,0x30,0x46,0x83,0x70,0xf4,0x85,0xd1,0xbe,0x2a,0xf6,0x8d,0x0e,0x60,0xc7,0x70,0x1f,0xb6,0x0c,0xf6,0x62,0xa4,0xa7,0x8a,0xa1,0x1e,0x0f,0x5e,0x85,0xa1,0xb7,0xc2,0x51,0xe5,0x72,0x04,0x58,0xf1,0x05,0x56,0x84,0x80,0x10,0x84,0xc5,0x9a,0x8f,0xe5,0x9a,0xc0,0x52,0xcd,0xc7,0x42,0xcd,0xc7,0xfc,0xaa,0x8f,0xf9,0x95,0x1a,0xe6,0x57,0x7c,0x2c,0xac,0xd6,0xf0,0xec,0xc5,0x99,0x98,0x55,0x69,0x85,0x31,0xec,0x1d,0x1b,0x8c,0x26,0x27,0x43,0xdf,0xb3,0xad,0xcc,0xa7,0x16,0x57,0x30,0xb5,0xb4,0xaa,0x6e,0x5a,0x65,0xa1,0xf2,0x37,0x3e,0xd0,0x83,0x51,0x6b,0xf2,0xd3,0x48,0x5c,0xc7,0xa6,0xe6,0x63,0xcf,0x54,0x39,0xc7,0x6e,0xcb,0xe9,0x4c,0x23,0x61,0x5f,0x59,0x58,0xc1,0xb5,0xe5,0xd5,0xd8,0x73,0x93,0x43,0x7d,0x18,0xa8,0xa6,0x5b,0xe8,0xea,0xb0,0x2e,0xce,0x2f,0x63,0x6e,0xa5,0x86,0xd8,0x8c,0x30,0x2f,0xac,0x76,0xb1,0x6d,0xb0,0x17,0x83,0xca,0x8e,0x23,0x29,0x6e,0x8d,0x4b,0x0b,0xcb,0x98,0x5d,0xae,0xc1,0xc6,0x8e,0xe1,0x7e,0xf4,0x79,0x61,0x3e,0xb2,0x5a,0xea,0x98,0xe1,0x2f,0xfb,0x02,0x67,0x66,0x16,0xd5,0x8d,0x8d,0x30,0xbe,0x3a,0x50,0xa4,0x20,0xd6,0xf4,0xa4,0x28,0xfe,0xbe,0x07,0x5e,0xc7,0xab,0x4a,0xdb,0xea,0xad,0xd3,0xf3,0xad,0xf6,0x64,0x34,0x6e,0x8c,0xc5,0x01,0xa1,0x2c,0xa3,0x19,0x07,0x31,0x60,0xd1,0x17,0xf8,0xf8,0xe1,0x57,0xf1,0xb3,0xf7,0xac,0x2d,0x1f,0x95,0xff,0xf8,0xcc,0x71,0xcc,0xae,0x28,0xe9,0x97,0xe9,0x43,0x16,0x78,0x90,0xe7,0x3e,0x8f,0xe3,0x5d,0x07,0x77,0xe0,0x3d,0x37,0xee,0xc0,0x70,0x8b,0x0c,0xcd,0x2a,0x8c,0xe1,0xa6,0x89,0x61,0xdc,0x34,0x31,0x8c,0x1f,0xbb,0x65,0x37,0xbe,0x75,0xe6,0x2a,0x3e,0xfa,0xdc,0x69,0x9c,0x99,0x5d,0x94,0x83,0x13,0x35,0x48,0xc4,0x46,0xe7,0x1b,0xea,0xa9,0xe0,0xed,0xd7,0x6f,0xc3,0xfd,0xbb,0xc6,0xb1,0xa7,0x05,0x1e,0xcc,0x7e,0xe4,0x1f,0x1e,0x8b,0xf5,0xf5,0xbe,0x1e,0x8e,0xff,0xf8,0xd6,0x5b,0x9b,0x0e,0xfb,0xef,0x9f,0x3b,0x8d,0x8f,0x3f,0x77,0x46,0xfe,0x48,0x18,0x50,0xbe,0xff,0x86,0xed,0x78,0xf7,0x0d,0x93,0x4d,0xc7,0xf5,0xc3,0x1f,0xff,0x16,0xec,0x7e,0xb5,0x69,0xa0,0x5a,0x48,0x3e,0xfe,0xec,0xa9,0xe3,0x78,0xe8,0x95,0x0b,0x91,0x6b,0x04,0xc2,0x07,0xee,0xd8,0x83,0xd7,0x6f,0xdf,0x94,0x29,0x0c,0x9f,0x08,0x5f,0x3b,0x79,0x19,0x7f,0xf9,0xf4,0x09,0xcc,0xad,0x58,0x5a,0x93,0x2c,0xed,0xc3,0x2a,0xbf,0xeb,0x37,0x0f,0xe2,0xe7,0xee,0xdc,0x87,0x03,0x9b,0x86,0x32,0xc5,0x0f,0x00,0x7f,0xf2,0x9d,0x63,0xf8,0xf2,0xf1,0x4b,0xd1,0x60,0x41,0xf8,0x85,0xd7,0xef,0xc7,0x8d,0xe3,0xcd,0xf9,0x88,0x3f,0x3a,0x35,0x8f,0x5f,0xff,0xe2,0xb3,0x61,0x5a,0xd7,0x0d,0x09,0x77,0x88,0x2b,0x5a,0x50,0x7c,0x1e,0xb4,0x2d,0xcc,0x86,0x47,0x1b,0x0a,0x81,0x48,0x39,0xc7,0x12,0xe1,0xe1,0x0c,0x80,0xdc,0xa2,0xa4,0xa4,0x63,0xbd,0x64,0xfa,0xcf,0xcf,0x9f,0xc2,0x0f,0xde,0xb6,0x0f,0x9b,0x07,0x7a,0x5b,0x9f,0xae,0x02,0x30,0xbb,0xbc,0x8a,0x4f,0x1f,0x39,0x19,0xec,0x38,0x02,0xe3,0x52,0xed,0xcc,0xe4,0x9c,0xfc,0xf5,0x3b,0x36,0xe1,0x17,0xee,0xba,0x1e,0x63,0x7d,0xed,0x93,0xea,0x2b,0x9c,0xe1,0xfe,0xdd,0xe3,0xb8,0x77,0xe7,0x66,0x3c,0xf4,0xca,0x79,0xfc,0xed,0x91,0x53,0x58,0xf5,0x45,0x3e,0x22,0x36,0x06,0x59,0x02,0xe1,0x8e,0x6d,0xa3,0xf8,0xd5,0x7b,0x6e,0xc0,0x50,0x0b,0x2d,0xd5,0x19,0xb1,0x98,0x77,0x3a,0x46,0x05,0xf5,0x7e,0x0a,0xfe,0x8b,0x49,0x63,0x14,0x5c,0x2f,0x06,0xe1,0x61,0x1b,0x76,0xfc,0x05,0x84,0xed,0xb0,0xa2,0xcf,0x7b,0xae,0x47,0x85,0x31,0xbc,0x79,0xef,0x16,0xdc,0xb6,0x65,0x14,0xff,0xc7,0x37,0x5f,0xc4,0xab,0xd3,0xf3,0x61,0x99,0xa4,0x11,0x96,0x45,0xbc,0x04,0xc2,0x3b,0xae,0xdf,0x86,0x9f,0xb9,0x63,0x5f,0xee,0x7d,0xfc,0x4c,0x85,0x10,0xb9,0x56,0xd4,0x50,0xa4,0x1d,0xff,0x00,0xcd,0x4d,0x3e,0x4b,0xb4,0x0c,0x3c,0x4d,0xb5,0x21,0xfd,0x15,0xb7,0xe7,0xb3,0xa1,0xc0,0x10,0xec,0x8b,0x95,0x5f,0x39,0x18,0xb8,0x22,0x5f,0x29,0x39,0xae,0x08,0x81,0x4f,0x1d,0x39,0xd1,0xd9,0x74,0xe6,0xc0,0x43,0xcf,0x9f,0xc2,0x7c,0xad,0x26,0x0d,0xcc,0x20,0x07,0x25,0x39,0xd6,0x0b,0xfc,0xd4,0x9d,0xd7,0xe1,0x83,0x6f,0xba,0xa9,0xad,0xe4,0x6b,0xa2,0xc2,0x19,0xbe,0xff,0xe0,0x76,0x7c,0xe8,0xcd,0xb7,0x60,0x4b,0x7f,0x0f,0x04,0x89,0xb0,0xed,0x09,0xfd,0x5d,0xc4,0x3f,0xc2,0x0f,0xbe,0x0b,0xf2,0x31,0xe4,0x71,0xfc,0x9b,0xfb,0x0e,0xb6,0x94,0x7c,0x01,0xc8,0x78,0x7d,0x01,0x12,0x64,0x7c,0x0a,0xd2,0xa5,0x91,0x0a,0x4f,0xe5,0xc9,0xfc,0x90,0x50,0x71,0x16,0xd4,0x1f,0x83,0xf0,0x8c,0x0f,0x0a,0xca,0x07,0x11,0x81,0x7c,0x02,0x09,0x18,0x9f,0xc6,0xd2,0x3d,0x3e,0xd0,0x83,0xdf,0x79,0xf3,0xcd,0xb8,0x7d,0xeb,0x28,0x04,0x89,0xb0,0x7d,0x08,0x61,0xb4,0x8f,0xf8,0x6f,0xa1,0xda,0xc6,0x4f,0xde,0xb6,0x07,0x3f,0x77,0xe7,0x75,0x0d,0x39,0xd1,0x21,0x91,0x90,0x8f,0xc2,0x48,0x58,0x53,0xfc,0x06,0x1b,0x63,0x5b,0x84,0xa2,0x79,0x8f,0x47,0x6b,0x9e,0x22,0x1f,0xed,0x29,0xb0,0x1d,0x1f,0x3b,0xee,0xec,0x1f,0xb1,0x76,0x3e,0x90,0xe9,0x95,0xc6,0x48,0x3e,0x18,0xa9,0xed,0x38,0xca,0x33,0x96,0x3c,0xa7,0x40,0x95,0x3b,0x23,0x7c,0xee,0x85,0x93,0x58,0xaa,0x75,0xe4,0xec,0xc6,0x5c,0xa8,0x09,0x81,0xcf,0x3c,0x77,0x1c,0x52,0xb1,0x2e,0xf3,0xc9,0xd4,0xe7,0x17,0xef,0x3b,0x88,0xf7,0x1c,0xda,0xd9,0xe9,0x24,0x02,0x00,0xf6,0x6f,0x1a,0xc4,0x87,0xde,0x72,0x2b,0x26,0x07,0x7b,0x41,0xf0,0x41,0xf0,0x21,0x4f,0xc9,0xf0,0x81,0xc0,0x2f,0xb5,0x5e,0xc0,0x16,0xc1,0x77,0x52,0x27,0x69,0xdc,0xbc,0x65,0x04,0xfd,0x5e,0xfe,0xf5,0xea,0xbc,0x20,0xf8,0xca,0x46,0xc0,0x37,0xd2,0x59,0x4c,0x3b,0x20,0x9d,0xb7,0x20,0xab,0xba,0x1f,0xe9,0x07,0x44,0x61,0x22,0x98,0xce,0x83,0xb4,0x5d,0x37,0xf3,0x52,0x04,0x7c,0x69,0x3f,0x81,0x9a,0xfc,0x8e,0x1a,0x88,0xe9,0x7a,0xcc,0x8f,0x3e,0xaf,0x82,0x0f,0xbe,0xf1,0x10,0xde,0xb4,0x67,0x42,0x4e,0x52,0x74,0xdb,0xd0,0xed,0x83,0xc2,0xdf,0x3a,0x1f,0x15,0x06,0xfc,0xe2,0x5d,0xd7,0xe3,0xbd,0x37,0xee,0x68,0x38,0x17,0x64,0xe4,0x23,0xf8,0x34,0x91,0x8f,0x78,0x04,0x7e,0x30,0x4e,0x46,0xdb,0xbb,0x28,0xee,0xd3,0xe9,0x71,0xb5,0xa1,0x4f,0x63,0x7c,0x53,0x34,0xef,0x79,0xd1,0xc9,0x6e,0x39,0x4b,0x6a,0x0b,0x82,0xf1,0x8e,0x81,0x48,0xab,0x86,0xb8,0x1a,0xf4,0xd5,0xfa,0x30,0x80,0xb9,0x95,0x1a,0xbe,0xf0,0xd2,0x69,0x7c,0xff,0xcd,0x7b,0x3b,0x97,0xd6,0x0c,0xf8,0xea,0xd1,0x73,0xb8,0xb2,0xb0,0x2c,0xd7,0x7e,0xf5,0xfe,0x23,0x00,0xef,0xbf,0x63,0x3f,0xde,0xb2,0xbf,0xf9,0xb5,0xc4,0x22,0xb1,0xb9,0xbf,0x07,0xbf,0xf5,0xe0,0x2d,0xf8,0xe0,0x17,0x0e,0x63,0x7a,0x79,0x05,0xa4,0x9c,0x84,0x44,0xd4,0x73,0x96,0xda,0x19,0xaa,0x8e,0xda,0x25,0x45,0x08,0x41,0x32,0x09,0x86,0xd1,0x64,0x61,0xbe,0x11,0x94,0xe4,0x06,0x30,0xe5,0x8f,0x3b,0x54,0xb9,0x4a,0x03,0x41,0x6a,0x58,0x92,0x8c,0x45,0xe5,0xab,0xad,0x76,0x9a,0xd0,0x0b,0xcc,0x87,0x10,0x32,0x7c,0xb9,0x91,0xc0,0x08,0xbf,0x89,0xa4,0x7b,0x9c,0xe1,0x97,0xef,0xb9,0x01,0x3b,0x86,0xfa,0xf0,0xd1,0x23,0xa7,0x65,0x39,0xb9,0x84,0x5a,0x62,0x18,0xed,0xab,0xe2,0x5f,0xdf,0x77,0x10,0xb7,0x6e,0x1d,0x6d,0x3c,0x42,0xa8,0x71,0x5d,0xe5,0x23,0xbc,0x58,0xdc,0x48,0x2c,0x48,0x80,0x91,0xb2,0xc9,0x30,0x43,0x5d,0x57,0x6b,0xc2,0x8d,0xa0,0x3b,0xb8,0xce,0x93,0xd5,0x52,0x54,0xef,0x2e,0x51,0x17,0x72,0x11,0x38,0x58,0xeb,0x95,0x8e,0x39,0xd4,0x68,0xcb,0x20,0x07,0x7b,0xce,0x00,0x9f,0x03,0x4c,0xe0,0x33,0xcf,0x9d,0xec,0x7a,0x02,0x7e,0xe8,0xf9,0x93,0xe0,0x4c,0xee,0x5d,0x63,0x6a,0x6a,0xf7,0xc6,0xbd,0x5b,0xf1,0x43,0xb7,0xee,0xe9,0x74,0xd2,0x9c,0xd8,0x3a,0xd8,0x8b,0x5f,0xbe,0xe7,0x06,0x7c,0xe8,0x2b,0x47,0x94,0x81,0x98,0xe1,0x93,0xda,0x22,0x5f,0xa6,0xa4,0x44,0x62,0x84,0x13,0x0e,0xab,0xde,0x56,0x80,0x09,0x69,0x0d,0x1f,0xae,0xd7,0xb2,0xe6,0x98,0xc5,0x04,0x69,0x01,0x97,0x54,0xfb,0x53,0x97,0x19,0x49,0x8d,0x4c,0x91,0xe3,0x92,0x1e,0xe4,0xcd,0xd9,0x44,0x41,0xe4,0xce,0xb4,0x54,0x12,0xac,0x05,0xeb,0x78,0x9a,0x0b,0x9f,0x01,0xf8,0xe1,0x5b,0x76,0xe3,0xd6,0xad,0xa3,0xf8,0xd3,0x27,0x8f,0xe1,0xf8,0xf4,0x42,0xec,0xfe,0x9b,0xf6,0x4e,0xe0,0xfd,0x77,0xec,0xc3,0xa6,0x02,0x76,0x29,0x44,0xf3,0xa1,0x50,0x58,0x3d,0xa8,0xb0,0x99,0x22,0x61,0x55,0xe1,0x45,0xf9,0x5f,0x2f,0x79,0xa3,0x79,0x78,0xf5,0xd6,0x96,0x8a,0x2c,0xe2,0x8d,0x76,0x62,0x58,0x22,0x82,0x09,0xbb,0x50,0xd2,0x15,0x10,0xaa,0x05,0x95,0x14,0xa2,0xd4,0x46,0xa7,0xa7,0x66,0xf1,0xc2,0x85,0x29,0x1c,0xda,0x96,0xcd,0xb2,0xb3,0xdd,0x38,0x39,0x35,0x8b,0xe7,0xcf,0x5f,0x05,0xe3,0x15,0x30,0x21,0x3b,0xf8,0x58,0x7f,0x15,0x3f,0xdf,0xe5,0x16,0xdc,0x77,0x4c,0x8e,0xe1,0x1d,0x07,0x26,0xf1,0xd0,0x8b,0x67,0xe5,0xd8,0xcd,0x12,0x8c,0x92,0x88,0x81,0x94,0x3a,0xfa,0xec,0xb5,0x79,0x9c,0x9c,0x9e,0xc7,0x1e,0x6b,0x3b,0x50,0xd1,0x10,0xbe,0x1f,0x1b,0x7f,0x45,0xa5,0xa0,0x41,0x93,0x04,0x84,0xef,0x2b,0xe7,0x2f,0x90,0x44,0x0f,0x48,0x62,0x24,0x14,0x6a,0x93,0x21,0xfc,0xb8,0xba,0x59,0x88,0x62,0xd6,0xcf,0x83,0x7c,0x98,0xd7,0x80,0xc2,0x08,0xfe,0xa6,0x2d,0x23,0xf8,0x4f,0xef,0x78,0x0d,0x5e,0xbc,0x3c,0x83,0x67,0xce,0x4f,0x63,0x61,0xd5,0xc7,0x96,0xc1,0x5e,0xdc,0xb5,0x73,0x33,0xb6,0x0c,0xf6,0x15,0x12,0x07,0x00,0x90,0x48,0xc8,0x47,0x01,0x75,0x20,0xa5,0x6b,0x01,0x30,0x06,0xe2,0x24,0xfb,0x27,0x07,0x02,0xb2,0xdf,0xd0,0x12,0x70,0xf1,0x68,0x84,0x2b,0xf5,0x66,0xb5,0x44,0xac,0x4b,0xd2,0xec,0x74,0xbb,0x53,0x52,0x01,0x43,0xe8,0x1d,0x2b,0x48,0x93,0x76,0x1f,0x15,0x48,0xc1,0x84,0x87,0x5f,0x3c,0xd5,0xb5,0x04,0xfc,0xf0,0x0b,0xa7,0x95,0xb5,0xb3,0xfc,0x4d,0x8c,0xe1,0x67,0xee,0xba,0x61,0x4d,0x78,0xf2,0xfa,0xb1,0xdb,0xf6,0xe2,0xeb,0x27,0x2e,0x62,0x56,0xed,0x15,0x26,0x43,0x3a,0x30,0x55,0xcf,0x80,0x22,0x25,0x41,0xf8,0xec,0x8b,0x67,0xf0,0xbf,0xdc,0xd3,0x5a,0x27,0x29,0x44,0x14,0x6c,0xdd,0x52,0x17,0x0a,0x23,0x16,0x4d,0xb2,0x60,0x2c,0x94,0x84,0x8d,0xeb,0x14,0x48,0x64,0x05,0x40,0x90,0xb4,0x01,0x32,0xd5,0xdc,0x45,0x19,0x78,0xe9,0xf0,0xb9,0x51,0x46,0x66,0x7e,0x0a,0x00,0x03,0x70,0x68,0x62,0x04,0x87,0x26,0x46,0x0a,0x0b,0xd3,0x46,0x72,0x3e,0x8a,0x09,0x3d,0xac,0x6b,0xad,0x25,0x60,0x91,0x76,0xbe,0x2e,0xd0,0x1d,0xda,0xe4,0x86,0xb8,0xd2,0x2b,0xaa,0x5f,0xaf,0x29,0x74,0x43,0x9e,0xc9,0xfc,0xc3,0x00,0xe2,0xd2,0xe2,0x16,0x08,0x4d,0x98,0x14,0x51,0x7f,0xf5,0xd8,0x79,0xfc,0x8b,0xfb,0x6f,0x45,0x4f,0xa5,0xbb,0xa6,0x43,0x44,0x84,0x47,0x5e,0x39,0x1b,0xf8,0xb2,0x66,0x60,0xd8,0x3b,0x36,0x84,0x07,0xaf,0xeb,0xae,0x75,0xdf,0x24,0x0c,0xf5,0x78,0xf8,0xa1,0x9b,0x77,0xe3,0x4f,0x9f,0x38,0xa6,0xd6,0xc9,0x2c,0x15,0xa6,0xfa,0xa9,0x15,0x14,0x20,0xe0,0xf3,0x2f,0x9d,0xc1,0xfb,0x6e,0xdb,0xdb,0xd2,0xed,0x61,0x22,0x76,0x40,0x0a,0xc1,0x2f,0x68,0xf1,0x54,0x10,0x41,0xf8,0x04,0x26,0x04,0xc0,0xb9,0xb9,0xcc,0xac,0x0e,0x07,0x29,0x8e,0x24,0x7d,0x21,0x2c,0x29,0xab,0xc0,0xf5,0x65,0x41,0x10,0x44,0x11,0xdb,0x34,0x69,0xb1,0x5e,0x48,0xf0,0x6d,0x43,0x62,0x3e,0x0a,0x18,0xa4,0x88,0x00,0xe1,0x2b,0xab,0x12,0xc6,0xa4,0x81,0xa7,0xb2,0x8a,0x0e,0x0c,0x5f,0x4b,0x29,0xb8,0xa3,0xf0,0x9c,0xdb,0x02,0x3a,0x51,0x27,0x6b,0xac,0xe3,0x14,0x02,0xb5,0x16,0x4c,0x10,0x4a,0x7f,0x21,0xd4,0x1a,0x9d,0x61,0x0c,0x23,0x08,0x0b,0xcb,0xab,0x78,0xf2,0xd4,0x25,0xdc,0xbb,0x6f,0x5b,0x87,0x13,0x1c,0xc5,0x91,0xf3,0x53,0xb8,0x32,0xbf,0x00,0xc6,0x2a,0x81,0xb4,0xf3,0x23,0xb7,0xef,0x53,0x87,0x2f,0xac,0x0d,0xbc,0xed,0xfa,0xed,0xf8,0xc8,0xd3,0x27,0xb0,0xb8,0x2a,0x0d,0x93,0xc0,0x22,0x33,0x23,0xa9,0xa1,0x10,0x08,0xa4,0xb7,0xe5,0x9a,0xc0,0x7f,0x7b,0xe2,0x15,0xfc,0xf2,0x9b,0x6e,0x69,0x5d,0xa2,0x94,0x04,0x1c,0x0a,0x8e,0x05,0x4a,0xa5,0x76,0x3c,0xda,0x18,0xa1,0x55,0xe1,0xa3,0x45,0xf9,0x50,0xf5,0x11,0x09,0x7b,0x0d,0x42,0x6f,0x6d,0x32,0x95,0x1d,0x85,0x5a,0x61,0x91,0x0f,0x08,0x39,0x99,0x67,0x5a,0x46,0xd3,0x36,0x27,0x40,0x49,0xc0,0x79,0x51,0x70,0x71,0x79,0xa1,0xf5,0xad,0x81,0xb5,0xd6,0x96,0x59,0x77,0x49,0x86,0xd9,0x41,0xe1,0x5f,0xa5,0x7a,0x66,0xd0,0x06,0x38,0x4c,0x9e,0xa5,0x2b,0x75,0x78,0xf8,0xfa,0xb1,0x73,0x5d,0x47,0xc0,0xdf,0x38,0x76,0x1e,0x0c,0x15,0x30,0x75,0xbc,0xe0,0x68,0x5f,0x2f,0xee,0xeb,0xb2,0x34,0xd6,0x43,0x7f,0xb5,0x82,0xb7,0xec,0xdf,0x86,0x4f,0xbf,0x70,0xc6,0xb0,0x16,0x55,0x20,0x0a,0x6d,0x7c,0xa0,0xfe,0x0a,0xc2,0x17,0x5e,0x3c,0x8b,0xb7,0xdf,0xb8,0x13,0x87,0xb6,0x8e,0xb5,0x26,0x51,0x6a,0x2e,0x10,0x21,0x95,0x02,0xad,0xa0,0xa3,0x46,0x3f,0x7a,0xe4,0xd7,0x1f,0x2a,0xce,0x11,0x84,0x80,0x1c,0x5e,0xcc,0x7c,0x14,0x46,0x2c,0x08,0x55,0xdc,0x0a,0x6c,0x0d,0x92,0xb0,0xb4,0xc0,0x47,0xb0,0xf3,0x01,0x28,0x6c,0x17,0x58,0x10,0x03,0x88,0x23,0xf4,0xc1,0x6e,0x58,0x4a,0xea,0xfb,0x1b,0x0d,0xcd,0x68,0x93,0x0a,0x6e,0x62,0x5e,0x78,0x40,0xfc,0x5a,0xc6,0x1a,0xb5,0xc6,0x53,0x16,0xd1,0x00,0x40,0x4c,0x4a,0xbf,0x72,0xef,0x24,0x00,0xa6,0xd4,0x81,0x8c,0x00,0x08,0x3c,0x7e,0xf2,0x22,0x04,0x11,0x78,0x17,0xcd,0x58,0x1f,0x3b,0x71,0x3e,0x48,0x1f,0xc0,0xf0,0xe0,0x81,0x6d,0xa8,0x76,0x99,0x9a,0x3c,0x0b,0x1e,0xb8,0x6e,0x2b,0xfe,0xe9,0xf9,0x53,0xd2,0x50,0xc5,0xdc,0x9a,0x03,0xbd,0xf5,0x48,0xee,0x05,0x26,0xfd,0x97,0x08,0x7f,0xf8,0xc8,0x61,0xfc,0xdf,0x3f,0xf4,0xc6,0x96,0xe4,0x57,0xc7,0x11,0x59,0x3b,0x45,0x31,0xfb,0x8f,0xb5,0x03,0x89,0x40,0x2d,0x49,0x46,0x5e,0xa9,0x58,0x15,0xb4,0xcc,0x07,0xac,0x7c,0x14,0xc7,0xc0,0xa4,0x67,0x2a,0xfa,0x4a,0x01,0x56,0xd0,0xed,0x06,0xb5,0x38,0x1f,0x82,0x04,0xdc,0xfe,0x41,0x36,0x30,0x01,0x77,0x51,0x96,0xbd,0x35,0xd6,0x5e,0xbb,0x10,0x4d,0x92,0x3f,0x99,0xe2,0x95,0x14,0xb7,0x18,0xc9,0x4e,0x29,0x7d,0x4a,0x49,0x62,0x9e,0x5b,0x5e,0xc1,0x2b,0x97,0xae,0xe1,0x60,0xab,0xa4,0xae,0x9c,0xb8,0x38,0xbb,0x80,0xf3,0xd7,0xe6,0x00,0xce,0xa1,0x66,0x0e,0xb8,0x7b,0xcf,0x96,0x4e,0x27,0xab,0x21,0xdc,0x30,0x31,0x82,0x2d,0x83,0x3d,0xb8,0x34,0xbf,0x24,0x77,0x05,0x07,0x67,0x29,0xea,0x45,0x60,0x69,0x91,0x6e,0xfe,0x3d,0x31,0x35,0x83,0xbf,0x7e,0xfc,0x05,0xfc,0xcf,0xf7,0xdd,0x5c,0x7c,0x82,0x02,0x27,0x20,0xa6,0x61,0x4e,0x61,0x22,0x30,0xf4,0x7e,0x73,0xad,0x5d,0x09,0xaf,0x53,0x98,0xe7,0x42,0xa2,0xd2,0x69,0x36,0x8d,0xc9,0x0a,0x72,0xc4,0x41,0x14,0xaa,0x6e,0x75,0x5d,0x69,0x03,0xb3,0xb5,0x04,0x12,0xce,0x7c,0x14,0x13,0x36,0xa9,0xf0,0xa5,0x55,0x49,0xc0,0xc4,0x5a,0x12,0x86,0xf9,0xb7,0x13,0x58,0x7b,0x93,0xf5,0xa2,0xe1,0x89,0x5c,0x1d,0xa2,0x5e,0x65,0xad,0xb1,0xc6,0xdf,0x2d,0xd0,0x52,0xb0,0xda,0x8a,0xa4,0x8d,0x7e,0xa4,0x5b,0x40,0x16,0x58,0xe0,0x7e,0xf7,0xd4,0xa5,0xae,0x21,0xe0,0x27,0x4f,0x5d,0x52,0x73,0x0f,0x29,0xa9,0xf5,0x57,0x2b,0xb8,0x65,0x72,0x73,0xa7,0x93,0xd5,0x10,0x18,0x80,0x3b,0x27,0x37,0xe1,0xf3,0x2f,0x9f,0x35,0x54,0xce,0xaa,0x2d,0x2b,0xe7,0x14,0xd2,0xe9,0x0f,0x05,0xaa,0x4f,0x46,0xc0,0x3f,0x7c,0xf7,0x15,0xbc,0x76,0xf7,0x16,0xbc,0x66,0x57,0xb1,0x13,0x0f,0x26,0xa2,0xeb,0xd1,0x44,0x00,0xfc,0x82,0x08,0x58,0xa5,0xdf,0x94,0xf2,0x03,0x08,0x2a,0x96,0x00,0x7c,0x01,0xe2,0x1c,0x4c,0x3b,0xf8,0x00,0x2b,0xcc,0x9a,0x9b,0x74,0x3a,0x83,0x65,0x82,0x02,0xd3,0xdd,0x4e,0x98,0xf9,0x30,0xf7,0x33,0x17,0x94,0x17,0x21,0x04,0x18,0xab,0x28,0xb3,0x4e,0x75,0x24,0xa8,0x59,0xfd,0x1d,0x95,0x06,0xbb,0xdf,0xcb,0x5f,0x71,0x70,0x17,0xb4,0x97,0xcf,0x28,0xa2,0x73,0x2d,0x7c,0x5d,0xcf,0x95,0x34,0x01,0xab,0xef,0xc4,0x42,0x55,0x9d,0x56,0xf0,0x02,0xc0,0xb3,0x67,0x2f,0xe3,0x47,0x5f,0x77,0x43,0x27,0x52,0x18,0xc3,0xb3,0x67,0xae,0x40,0x4a,0xeb,0x72,0xc0,0xb8,0x71,0xeb,0xd8,0x9a,0x54,0x3f,0x6b,0xdc,0xb4,0x75,0x0c,0x9f,0x7b,0xf1,0x8c,0x5a,0x8a,0x0f,0xad,0x45,0x23,0x92,0xa1,0x59,0x4f,0x4a,0x65,0xfb,0x9f,0x3e,0xff,0x1d,0xfc,0xf1,0x8f,0xbd,0x05,0x9b,0x0a,0xb4,0x8a,0x26,0xb5,0xb6,0x19,0xae,0x69,0x16,0xe9,0x88,0xc3,0x90,0xa6,0x89,0x5b,0xd7,0xf5,0xbd,0x22,0xe3,0xb2,0x0c,0xaf,0x0a,0xcd,0x87,0xa1,0xa1,0x28,0x98,0xb8,0xda,0x86,0x08,0xf9,0xea,0x6b,0xc5,0x69,0x21,0x38,0xa9,0x3d,0x15,0x24,0xdb,0x53,0x57,0xf0,0x6e,0x17,0xa3,0x75,0x8b,0x99,0xee,0xfa,0xcc,0x49,0xc0,0x9d,0xc3,0x1a,0x5d,0xe5,0xcd,0x0e,0x0a,0x57,0xc7,0xc8,0x18,0xe8,0x49,0xaf,0x9b,0x11,0xf0,0xca,0xa5,0x6b,0x1d,0x4b,0x9e,0x8d,0x57,0x2e,0x4d,0xa9,0xd5,0x51,0x79,0xba,0xd0,0x75,0x4d,0x1e,0x9d,0xd6,0x69,0x1c,0xda,0x3a,0x2a,0xa5,0x05,0xae,0x8d,0xe1,0x24,0x74,0xd9,0xcb,0xef,0x7a,0x8c,0xa7,0xa0,0xbe,0xae,0xcc,0x2f,0xe3,0x3f,0x7e,0xf6,0x71,0xfc,0x87,0x1f,0x7c,0x63,0x61,0xeb,0xf3,0x82,0xf4,0xaa,0xa0,0x31,0x09,0x2b,0x70,0xff,0xac,0xd0,0x83,0xb2,0xb9,0x4d,0x88,0x8a,0x5f,0x03,0x16,0x44,0x41,0x5c,0x41,0xdc,0x85,0x84,0xac,0xc2,0x37,0xac,0x87,0x65,0x04,0x6b,0x73,0x0d,0xd8,0xcc,0x07,0x41,0x6a,0x40,0x0a,0xc9,0x85,0x51,0xfe,0x25,0x01,0x77,0x27,0xd6,0xae,0xc8,0xb2,0x0e,0xa1,0x5d,0x40,0x30,0xb5,0x36,0x17,0x6c,0xe7,0x51,0x27,0x27,0x4d,0x2f,0x2d,0x63,0x6a,0x61,0xa9,0x73,0x09,0x54,0x58,0xf5,0x05,0x4e,0x4f,0x6b,0xb7,0x8c,0x32,0x8d,0xfb,0x27,0x9a,0xf3,0x89,0xdb,0x69,0x4c,0x8e,0x0c,0xa0,0x87,0x4b,0x8b,0xd4,0x0a,0x57,0x0e,0x52,0x22,0xa3,0x94,0xa1,0xb7,0xd3,0x56,0xa4,0xca,0x9b,0xd4,0x53,0xa7,0x2f,0xe3,0xcf,0xbe,0xf1,0x6c,0x61,0x69,0x69,0xa5,0x9d,0x5d,0x96,0x0e,0xdf,0x4d,0x86,0x7e,0x25,0x4a,0xac,0x67,0x78,0x6b,0xce,0x68,0x61,0xbd,0x22,0xa2,0xde,0xd4,0x52,0x96,0x56,0x15,0x86,0xd2,0xd7,0xd1,0xcb,0x33,0x78,0xfd,0x9e,0xe2,0x5c,0xe1,0x35,0x82,0x13,0x57,0x66,0xe4,0xb9,0xba,0x5c,0xab,0x46,0x19,0x76,0x8d,0x65,0x3f,0x84,0xbc,0x1b,0xc1,0x19,0xc3,0xf6,0x91,0x7e,0x1c,0x9f,0x9a,0x87,0x57,0x61,0x20,0x41,0xa8,0x7a,0x0c,0xf7,0xec,0xd9,0x86,0xd9,0xa5,0x55,0xcc,0x2e,0xaf,0x60,0x66,0x71,0x05,0xb3,0xcb,0xcb,0x98,0x5f,0x56,0x92,0xa3,0x3e,0x34,0x01,0x84,0x8f,0x7d,0xe7,0x25,0x1c,0xd8,0x3a,0x86,0x37,0x1f,0xdc,0xdd,0x74,0x5a,0xb4,0xd4,0x6d,0x5a,0x0c,0x17,0x65,0x3d,0x7c,0xef,0x75,0xdb,0xf0,0x99,0x23,0xc7,0x31,0xbd,0x5c,0x83,0x5c,0x95,0xe5,0x80,0xa1,0x65,0xd9,0x32,0xd0,0x8b,0xd7,0xed,0xd9,0x5a,0x48,0x5c,0xa1,0xa6,0xa0,0xf8,0x7c,0x90,0xcb,0xe0,0x8a,0x8a,0x0a,0xbd,0x7d,0x70,0xe5,0xa3,0xc8,0x5c,0x48,0x6b,0x7a,0x7b,0xbd,0xbc,0xb0,0xe0,0x4b,0x34,0x89,0x35,0xa3,0x82,0xde,0x10,0xd0,0x75,0x61,0x1a,0x01,0xe9,0xeb,0x6a,0x7f,0xe6,0xa9,0xab,0x33,0x78,0x7d,0x41,0x03,0x64,0xa3,0x38,0x35,0x35,0x8b,0x60,0x56,0x00,0xd9,0xc9,0xc7,0x0b,0xf4,0x8f,0xab,0x71,0x66,0x6a,0x16,0x1f,0xfb,0xce,0x8b,0x78,0xfc,0xf8,0x39,0x5c,0x9e,0x5d,0x44,0x5f,0xd5,0xc3,0xa1,0xed,0x9b,0xf1,0xce,0x5b,0xaf,0xc3,0xf7,0xdc,0xb8,0xa7,0x70,0x87,0x1f,0xdb,0x87,0x07,0x70,0xfc,0xea,0x1c,0x84,0x2f,0x8d,0xe1,0x6a,0x35,0x81,0xff,0xf5,0xc1,0xdb,0x62,0xe7,0xbc,0x0a,0x22,0x2c,0xac,0xd4,0xb0,0xb0,0xb2,0x8a,0xa7,0x4f,0x5f,0xc6,0x1f,0x3c,0xfc,0x1d,0x08,0x00,0x7f,0xf0,0xf9,0x6f,0x63,0xd7,0xd8,0x30,0x0e,0x34,0x6b,0x28,0x17,0x5b,0xcb,0xb4,0xd6,0x51,0x9b,0xc0,0xf5,0x13,0xa3,0xf8,0xdb,0x9f,0x7e,0x7b,0x21,0x61,0xd5,0x45,0x4c,0x25,0x5c,0x5c,0x3e,0x22,0x6b,0xbf,0x66,0x7c,0x6b,0x6e,0x38,0xb3,0xf3,0x41,0xc5,0xe6,0xc3,0x5c,0x83,0x2f,0xc7,0xfa,0xae,0x83,0x57,0x94,0x6b,0xb8,0x12,0x05,0x20,0xb0,0x86,0x0e,0x7f,0x92,0xe9,0x1e,0x90,0x08,0x17,0x66,0x16,0x52,0x02,0x68,0x0f,0xce,0x4d,0xcf,0x29,0x27,0x08,0x72,0xe0,0xe0,0x9c,0x61,0xac,0xbf,0x58,0xd7,0x8c,0x9f,0x7e,0xfa,0x28,0xfe,0xe8,0x8b,0x4f,0x48,0x77,0x86,0x0a,0x0b,0xcb,0x2b,0x78,0xf2,0xf8,0x79,0x3c,0x79,0xfc,0x3c,0x1e,0x3a,0x7c,0x0c,0xbf,0xf5,0x9e,0xfb,0x31,0xdc,0xd7,0xfc,0x89,0x34,0x1a,0x63,0x7d,0x3d,0x20,0x5f,0x60,0x55,0x10,0x18,0x67,0xf0,0xc1,0x30,0xb5,0xb8,0x8c,0x09,0x6b,0x72,0xc1,0x19,0xc3,0x50,0x6f,0x15,0x43,0xbd,0x55,0x7c,0xef,0x4d,0x7b,0x70,0x7a,0x6a,0x16,0x1f,0x79,0xec,0x05,0x2c,0xad,0xf8,0xf8,0xad,0x4f,0x7e,0x1d,0x7f,0xfc,0xe3,0x6f,0xc3,0xe6,0x26,0x26,0x24,0xe4,0x3a,0x8e,0x70,0x0d,0x0e,0x9e,0xa4,0xdb,0x88,0x99,0x8f,0xc2,0x5c,0x51,0xaa,0xb0,0x4c,0x9d,0xfa,0x5a,0x1c,0xcb,0xec,0x7c,0x04,0x46,0x59,0xcd,0x83,0xa0,0xcb,0x5b,0xd7,0x81,0x51,0x17,0xe5,0x62,0x70,0x57,0x80,0x9b,0x86,0x17,0xe5,0xa7,0x0b,0x3e,0x40,0x78,0x40,0x12,0x10,0x59,0x6f,0x24,0x30,0x9c,0x9b,0x69,0xcf,0x91,0x78,0x69,0x38,0x3f,0xbb,0x68,0xa4,0x0d,0x18,0xed,0xef,0x89,0x49,0x89,0xcd,0xe0,0xcb,0x2f,0x9c,0xc4,0x87,0x1f,0xfe,0x36,0x6a,0x42,0x2a,0x49,0xa5,0x5f,0x6c,0x2e,0x3f,0xea,0xf7,0x93,0x27,0x2f,0xe0,0xb7,0x3f,0xf9,0x75,0xf8,0x05,0x0e,0xba,0xa3,0xfd,0x3d,0xc1,0x4e,0x23,0x52,0x2a,0xe0,0xd9,0xe5,0xd5,0xba,0xef,0xfd,0xf4,0x7d,0x37,0xe3,0x9e,0xeb,0xb7,0x83,0xc0,0x70,0x71,0x66,0x01,0xbf,0xfd,0xc9,0x6f,0x62,0xa5,0xd6,0xcc,0x16,0x0b,0x16,0xd4,0xff,0xda,0x33,0x2b,0x0a,0x61,0xe7,0xa1,0xe8,0xbc,0xb4,0x32,0xec,0x76,0xa1,0x13,0x65,0xd4,0xd0,0xa7,0xd3,0xe3,0xe2,0x3a,0xfd,0x70,0x35,0x95,0xec,0xde,0xcf,0x46,0x03,0x85,0x2a,0x28,0xa6,0xd7,0x81,0x29,0x54,0x49,0x5d,0xb8,0xd6,0x79,0x02,0xbe,0xa8,0x27,0x01,0x2a,0x5d,0xbd,0x95,0x62,0xbc,0x34,0x01,0xc0,0xc2,0x4a,0x0d,0x7f,0xfc,0xc5,0x27,0x40,0xca,0x08,0x4d,0xda,0x9f,0x49,0xab,0x64,0xed,0xab,0x80,0x29,0xff,0xc5,0x4f,0x9f,0xbc,0x88,0x87,0x9e,0x39,0x56,0x58,0xdc,0x43,0xbd,0x55,0x59,0xde,0xca,0x3f,0x2f,0x09,0x91,0x89,0x48,0x19,0x63,0xf8,0xb7,0xef,0xbc,0x1b,0xd7,0xa9,0x53,0x73,0x9e,0x3f,0x77,0x19,0xbf,0xff,0xb9,0x6f,0x37,0x31,0x90,0x92,0xd1,0x0e,0x8c,0xcf,0x5a,0x83,0x2b,0x0f,0x85,0xe5,0x23,0x29,0xec,0xb5,0x56,0x4e,0xad,0xcc,0x87,0x15,0x5e,0x52,0x7d,0x64,0xf9,0x6c,0x34,0xb4,0x89,0xdf,0x78,0x20,0x59,0x74,0xeb,0x07,0x19,0x66,0x67,0xeb,0xe5,0xc3,0xe2,0x92,0x0f,0x31,0xa6,0xae,0x33,0x10,0x03,0xa6,0x17,0xeb,0x4b,0x64,0xad,0xc6,0xf4,0xe2,0x4a,0x24,0x8d,0x5e,0x81,0xfb,0x7f,0xbf,0xfe,0xf2,0x69,0x4c,0x2f,0xad,0x2a,0x89,0x1f,0x90,0xba,0x39,0xa6,0xfc,0x7d,0x33,0x00,0x52,0x0a,0x06,0x18,0xc0,0x19,0x3e,0x7d,0xf8,0x68,0x61,0x71,0xf7,0x54,0x38,0x08,0xa4,0xfc,0x51,0x10,0x48,0x10,0x96,0x57,0xb3,0x49,0xb2,0xfd,0x3d,0x1e,0x7e,0xf7,0xbd,0xf7,0x63,0xb4,0xbf,0x0f,0x04,0xe0,0x8b,0x2f,0x9c,0xc0,0x5f,0x7d,0xb3,0x31,0xcb,0x68,0x3d,0xdf,0xb2,0x3f,0x6b,0x0d,0xad,0xcc,0x43,0x52,0x1f,0x5a,0x6b,0x68,0x75,0x3e,0xc8,0xf8,0x5b,0x7e,0xf2,0x8c,0xc5,0xed,0xe1,0x37,0x6f,0x43,0x4a,0x99,0xdd,0x0c,0x3d,0xdb,0x24,0xf5,0x5f,0x60,0x09,0x2d,0x25,0xe1,0x85,0x95,0xce,0x13,0xf0,0xc2,0xf2,0x32,0x40,0x3e,0xb4,0x2b,0xc3,0x9e,0x82,0x0e,0x8b,0x07,0x80,0xe7,0xce,0x5e,0x02,0x84,0x50,0x07,0xc6,0x87,0xde,0xa0,0xb4,0x26,0x9e,0x28,0xdc,0xcb,0x48,0x44,0x78,0xe5,0xc2,0x55,0xac,0xfa,0xa2,0x10,0x27,0x20,0xd5,0x0a,0x93,0x6e,0x01,0x39,0x81,0x84,0x8c,0x65,0x39,0x87,0x2a,0x79,0x72,0x74,0x10,0xbf,0xf3,0xde,0x37,0xe0,0xd7,0x3e,0xf6,0x08,0x96,0x6b,0x35,0xfc,0xf5,0x37,0x9f,0xc5,0xae,0xb1,0x61,0xbc,0xf5,0xe6,0xbd,0xf9,0x12,0x62,0x4b,0x1d,0x04,0xac,0x49,0x29,0x84,0x08,0x91,0x9d,0xbf,0x45,0xe6,0x43,0x87,0x4d,0xe6,0x62,0xa6,0x58,0x7b,0x2c,0x6c,0xe7,0xa3,0xd0,0x32,0x52,0x61,0x91,0x80,0x74,0xba,0x62,0xfa,0x9c,0x2e,0x17,0x81,0xbb,0x01,0x1b,0xf3,0x3c,0xe0,0x6e,0x86,0xe6,0x5f,0xd5,0x09,0x03,0x57,0x94,0x4a,0x32,0x5b,0x58,0xa9,0xc1,0x17,0x54,0xe8,0x9a,0x6b,0x5e,0xcc,0xad,0xf8,0x52,0x22,0x57,0x83,0x46,0x91,0xfb,0x46,0xe7,0x96,0x56,0x41,0x8c,0x07,0xfa,0x66,0xa6,0xf6,0xda,0x86,0xcd,0x54,0x49,0xc6,0x24,0x40,0x90,0x67,0x28,0xcf,0x2d,0xad,0x60,0x53,0x01,0x56,0xd8,0x9c,0xb1,0xe0,0x6c,0x56,0xc6,0x08,0x60,0x0c,0x35,0xd7,0x71,0x9d,0x29,0xb8,0x65,0xe7,0x04,0xfe,0xcd,0x3b,0xee,0xc2,0xef,0x7d,0xfa,0x51,0xf8,0x00,0xfe,0xcf,0xcf,0x3e,0x86,0x6d,0xa3,0x83,0xb8,0x75,0xe7,0x44,0xe6,0x30,0xb4,0xd7,0xcb,0x00,0xb4,0x46,0xed,0x8b,0xc8,0xe2,0xc3,0x02,0xf3,0x11,0x70,0x8b,0x71,0x8d,0xd9,0xf1,0xad,0x01,0x18,0x2b,0x4e,0xea,0x82,0xfc,0x14,0x95,0x0f,0x6d,0x83,0x05,0x42,0xb0,0x8c,0x03,0x94,0xb4,0xdb,0x2d,0x70,0x9f,0x07,0x5c,0xa2,0x73,0x88,0x48,0x3e,0xb2,0x77,0x32,0x22,0xae,0xed,0x07,0x03,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x29,0x99,0xe9,0xc5,0x7b,0x10,0x3a,0xd9,0x85,0x84,0xef,0x03,0x22,0x9c,0x4d,0xd7,0x9a,0x32,0x38,0x8a,0x62,0xf3,0x60,0xbf,0xa2,0x58,0xed,0xb7,0xd6,0x1c,0x36,0x20,0xcb,0x23,0xc8,0xbf,0x80,0x57,0xa9,0x60,0xb4,0x20,0x37,0x90,0xab,0x35,0x5f,0xfa,0x5c,0x66,0x90,0x47,0x42,0x02,0xa8,0x36,0x30,0xd1,0x79,0xeb,0x4d,0x7b,0x71,0xfa,0xea,0x0c,0xfe,0xf2,0xeb,0xcf,0x62,0x45,0xac,0xe2,0x7f,0xfb,0x87,0xaf,0xe0,0x4f,0x3e,0xf0,0x0e,0x6c,0xcf,0xba,0x57,0x5a,0x08,0xe5,0xaf,0x59,0xfd,0x26,0xac,0x51,0x06,0x16,0x81,0xb3,0x12,0x00,0xc5,0x4b,0xc0,0x82,0x8c,0xb3,0xfb,0x8c,0xc3,0x33,0xd6,0x14,0xac,0x7c,0x04,0x33,0x8b,0xa2,0xca,0x49,0x84,0x4a,0x88,0xd0,0x80,0x22,0xfe,0xb7,0x44,0x47,0xe0,0xad,0xc9,0x8e,0xbd,0x9e,0xe1,0x20,0xe0,0x60,0x8a,0x2c,0x64,0x67,0xad,0xf0,0xce,0x3a,0x30,0xf3,0x58,0xd4,0xa9,0xfe,0x6a,0x81,0x04,0xfc,0xba,0xbd,0xdb,0xf0,0x0f,0x4f,0xbc,0xa4,0xc6,0x6c,0x1e,0x0c,0xde,0x11,0xff,0x01,0xca,0xff,0x34,0x03,0xc3,0x9d,0xbb,0xb7,0x16,0x26,0x81,0xaf,0xac,0xd6,0xc0,0x84,0x9c,0xde,0xe8,0x43,0x18,0x7a,0x1a,0x54,0x6d,0x7f,0xe0,0xfe,0xdb,0x70,0xfa,0xca,0x2c,0xbe,0xf0,0xdc,0xab,0x98,0x9e,0x5f,0xc4,0xbf,0xfd,0xd8,0x23,0xf8,0xe3,0x0f,0xbc,0x03,0x83,0xbd,0xd5,0xfa,0x2f,0x0b,0x5a,0x27,0x04,0x6c,0x89,0x5d,0x45,0xe6,0x83,0xac,0x32,0xd2,0xd7,0xd6,0x5a,0x31,0xd9,0xf9,0x28,0x5a,0x05,0x1d,0x84,0x9d,0x20,0x02,0x97,0xfc,0xdb,0x51,0xf0,0x2e,0x58,0xee,0x2e,0x3f,0xe6,0x47,0x77,0x16,0x35,0x92,0xb0,0xe0,0xbc,0x5d,0xd2,0x76,0x47,0x1d,0xef,0x33,0x1e,0x8f,0x8c,0x16,0x4d,0x6e,0xb9,0x89,0xe2,0xae,0xfd,0xdb,0xb1,0x7f,0xcb,0xa8,0x52,0x3d,0x93,0x12,0xa0,0x94,0x6b,0x4e,0x30,0xe9,0x7d,0x4b,0xdb,0x63,0x81,0xf0,0x23,0x77,0x1f,0x2a,0x2c,0xee,0x15,0x5f,0x80,0xf4,0x59,0xb9,0x6a,0x10,0x6c,0x74,0x6d,0x99,0x01,0xf8,0xb5,0x77,0xdd,0x83,0x5b,0x76,0x4c,0x00,0x0c,0x38,0x7e,0x79,0x1a,0xbf,0xf3,0x89,0xaf,0x65,0xf2,0xe9,0xec,0x30,0xc5,0xc3,0xda,0x63,0x16,0x20,0xb9,0x9d,0xb7,0x32,0xfc,0xb5,0x86,0x56,0x96,0x51,0x17,0x8c,0x67,0xe5,0x27,0xf5,0xe3,0x95,0x0a,0xe8,0xee,0x84,0xd9,0x05,0x89,0x31,0xe8,0x3d,0xc2,0x23,0x05,0x3a,0x9e,0x68,0x14,0xfd,0xbd,0x55,0x88,0xb9,0xc5,0xe0,0xf7,0xd4,0xc2,0x72,0x61,0x61,0x73,0xc6,0xf0,0xc1,0x77,0xdf,0x8b,0x5f,0xfa,0xc8,0x97,0xb1,0xe4,0xfb,0x20,0x70,0x69,0x00,0xad,0x41,0xd2,0x1a,0x1c,0x1c,0xf8,0x1f,0xef,0xbc,0x11,0xaf,0xdd,0xbb,0xad,0xb0,0xb8,0xe7,0x97,0x57,0x20,0x40,0x08,0x8e,0x62,0x20,0x42,0xaf,0xd7,0xf8,0x16,0xab,0x1e,0xaf,0x82,0xdf,0x7d,0xdf,0x83,0xf8,0x85,0xbf,0xf8,0x2c,0xce,0xcd,0xcc,0xe1,0x5b,0xc7,0xce,0xe2,0xff,0xf9,0xe2,0x13,0xf8,0xa5,0xb7,0xbd,0x3e,0xf5,0x3d,0x42,0xfc,0xd0,0x82,0x22,0xa9,0xe5,0xc8,0x99,0x4b,0xb8,0xa4,0x1d,0xba,0x98,0x73,0x29,0x00,0xdb,0x37,0x0d,0xe1,0xc6,0xc9,0xf1,0x42,0xe2,0x69,0x65,0x3e,0x5c,0x61,0x37,0x33,0x31,0x5d,0xa9,0xf9,0x78,0xfe,0xec,0x65,0xec,0xdc,0x34,0x8c,0x89,0xe1,0x81,0xcc,0x69,0x38,0x76,0x71,0x0a,0xbe,0x10,0x38,0xd8,0x60,0x99,0x15,0x9d,0x0f,0x3b,0x6c,0x1d,0xbe,0xd6,0x20,0x95,0x82,0x6f,0x77,0xa1,0x54,0x41,0x77,0x23,0x22,0x96,0xd0,0xea,0xb7,0x90,0x7f,0x47,0xfb,0x32,0xa8,0x30,0x5b,0x8c,0xd1,0xbe,0x9e,0x88,0x2a,0x71,0x71,0x79,0x15,0xcb,0xab,0x3e,0x7a,0xab,0xc5,0xec,0x07,0xde,0xbf,0x65,0x0c,0x1f,0xfe,0xb1,0x37,0xe3,0x77,0x3f,0xf3,0x18,0xce,0x4e,0xcd,0x03,0x22,0xa2,0x67,0x84,0xc7,0x39,0x7e,0xf2,0xde,0x43,0xf8,0xc9,0x7b,0x6f,0x2a,0x24,0x3e,0x8d,0x2b,0x73,0x8b,0x2a,0x5f,0x42,0xc5,0x44,0x18,0x6d,0xd2,0xc3,0xd7,0xa6,0x81,0x3e,0xfc,0xde,0xfb,0xde,0x8c,0x5f,0xfc,0xab,0xcf,0x61,0x7e,0x65,0x05,0x1f,0x7f,0xfc,0x79,0xec,0x9f,0x18,0xc3,0xbb,0x5f,0x73,0x20,0xf9,0x25,0xd7,0xb9,0xbc,0x05,0xf5,0xd3,0x2f,0x3f,0x77,0x1c,0xbf,0xfd,0xdf,0xbf,0x9a,0x3a,0x00,0xff,0xc1,0x4f,0x7c,0x2f,0x5e,0x7f,0xdd,0xf6,0xe6,0x23,0xd3,0x1e,0x9e,0x5a,0x90,0x8f,0x64,0x15,0x74,0x63,0xe1,0xff,0xce,0x3f,0x7e,0x05,0x5f,0x7d,0xe1,0x24,0x38,0x63,0x78,0xe3,0x8d,0xbb,0xf1,0x2b,0xef,0xbc,0x17,0x5b,0x52,0x88,0xf8,0xb1,0xa3,0x67,0xf0,0x87,0x9f,0x7d,0x0c,0xa7,0xaf,0xce,0x00,0x00,0x7e,0xf3,0x7f,0x78,0x13,0xde,0x7e,0xdb,0xf5,0xf9,0x23,0xd6,0x16,0x77,0x66,0x3e,0x62,0xd6,0x6b,0x4d,0xc0,0x5c,0x5f,0x36,0xeb,0xa2,0x64,0xe2,0xae,0x40,0x79,0x18,0x43,0x37,0x42,0x49,0xbb,0xfa,0x3f,0xd3,0x73,0xca,0x48,0xc1,0x2e,0x1f,0x1b,0xc1,0x68,0x7f,0x8f,0xdc,0x0e,0xc4,0xb4,0x85,0x36,0x70,0x65,0x7e,0x11,0x3b,0x0a,0x3c,0x90,0xe1,0x86,0xad,0x9b,0xf0,0x67,0x3f,0xf5,0x76,0x7c,0xf5,0xa5,0x33,0xf8,0xf6,0xf1,0x0b,0xb8,0x34,0xb7,0x88,0xfe,0x6a,0x05,0x37,0x4e,0x6e,0xc2,0xdb,0x6e,0xda,0x83,0xc9,0x91,0xc1,0xc2,0xe2,0xd2,0xb8,0x3c,0xbb,0x28,0xf3,0x63,0xac,0x3b,0x17,0x61,0x5d,0xbd,0x7f,0xeb,0x18,0x7e,0xf3,0xbd,0xf7,0xe3,0x37,0x3e,0xf6,0x08,0x04,0x09,0xfc,0xe7,0xcf,0x7e,0x0b,0x7b,0x27,0x46,0x71,0xeb,0xae,0x2d,0xce,0xe7,0x09,0xa4,0x78,0x24,0x1c,0x2d,0xa9,0xa0,0x11,0xf9,0xd5,0x4b,0xd3,0x2a,0x06,0x19,0xae,0x1d,0x33,0x00,0x1c,0xbf,0x34,0x5d,0x08,0x01,0xcb,0x7c,0x98,0xab,0xf7,0xc5,0xe5,0x43,0xf7,0x07,0xeb,0x62,0xc3,0xa1,0xbf,0x78,0xf6,0x2a,0x88,0x00,0x9f,0x08,0x5f,0x79,0xfe,0x24,0x0e,0x9f,0xbc,0x88,0xff,0xf0,0xa3,0x6f,0xc5,0x2d,0x8e,0x3a,0xfa,0x8b,0xaf,0x3e,0x8d,0x3f,0x7b,0xe4,0xbb,0x91,0xb8,0x5e,0x3c,0x77,0xb5,0x21,0x02,0x26,0xd8,0xf9,0x28,0xf6,0xb4,0x04,0xbd,0x83,0x22,0x10,0x87,0x4b,0x74,0x15,0x3c,0x2a,0xad,0xa0,0xbb,0x0f,0x31,0x02,0x16,0xd2,0xaf,0xae,0x10,0xd8,0x3e,0x92,0x4d,0x3d,0xd6,0x4a,0x4c,0x8e,0x0c,0x48,0x1f,0xb3,0x4c,0x11,0x05,0x23,0x9c,0xbe,0x3a,0x53,0x28,0x01,0x03,0x80,0xc7,0x39,0xde,0x72,0x68,0x37,0xde,0x72,0xa8,0xf9,0x13,0x86,0xb2,0xe0,0xd2,0xcc,0x7c,0x90,0x2f,0x00,0xd8,0x3c,0xd4,0x57,0x98,0x81,0xd7,0x1b,0x6e,0xd8,0x85,0x9f,0x7d,0xf0,0x0e,0xfc,0xbf,0x5f,0x7a,0x12,0xab,0xc2,0xc7,0x6f,0x7d,0xfc,0x11,0xfc,0x7f,0x3f,0xf7,0xfd,0x18,0x1f,0xea,0x8f,0x3f,0xac,0x9c,0x80,0x44,0x88,0xab,0xa0,0x7e,0xaa,0x1d,0x8c,0x48,0xeb,0x57,0x87,0xf2,0xd3,0x45,0x6c,0x8d,0xc6,0x25,0x84,0xda,0xde,0x5a,0x7c,0x3e,0x40,0x32,0xfc,0x70,0x0e,0xc1,0x1a,0x96,0x7e,0x01,0xc0,0xf7,0x7d,0xf9,0xbe,0xaa,0xef,0xa9,0xf9,0x25,0xfc,0xea,0x5f,0x7f,0x0e,0xff,0xfe,0x87,0x1e,0xc4,0x1b,0xd4,0x09,0x57,0xbe,0x10,0xf8,0xf0,0x43,0x8f,0xe1,0x13,0x4f,0xbc,0x68,0xa5,0x85,0xe4,0xfb,0x8d,0xc0,0x99,0x0f,0x51,0xdc,0x44,0x25,0x38,0xf3,0xd9,0xfc,0xa0,0xb4,0x82,0xee,0x12,0x94,0xa7,0x21,0x75,0x23,0x62,0xce,0x38,0xc2,0x4f,0xd1,0x24,0xd7,0x08,0x76,0x8e,0x0d,0xc7,0xd2,0x78,0xf2,0xf2,0x0c,0xee,0xde,0xbf,0xa3,0x93,0xc9,0x6a,0x0a,0xbe,0x20,0x9c,0xbc,0x7c,0x2d,0xc8,0x17,0x11,0x30,0xe1,0x22,0xc7,0x26,0xf0,0x13,0xf7,0xdf,0x86,0x97,0xcf,0x5f,0xc5,0x97,0x8f,0x1c,0xc7,0xe5,0x99,0x05,0xfc,0xf6,0xc7,0x1f,0xc1,0x1f,0x7e,0xe0,0x9d,0xf1,0x3d,0xdd,0x2e,0x77,0x84,0x85,0xf6,0x53,0x52,0x73,0x8c,0xb8,0x04,0x5c,0xd4,0xc0,0x2f,0x83,0x33,0x0d,0x4e,0xc2,0x38,0x0a,0x0a,0x3c,0x5e,0x26,0x4d,0xa8,0xa0,0xfd,0xa0,0x3d,0x87,0x24,0xbc,0xb4,0xb2,0x8a,0x0f,0xfe,0xdd,0x17,0xf1,0xbe,0x7b,0x6e,0xc6,0x6b,0xf6,0x4e,0xe2,0xef,0x1e,0x7d,0x16,0x87,0x4f,0x5e,0x90,0xcf,0x69,0xe2,0x52,0xef,0x35,0xec,0x93,0xdc,0x95,0xe6,0xa2,0xac,0xb9,0x23,0x6e,0x28,0x51,0x4a,0xc0,0x5d,0x08,0xaf,0xac,0x93,0xee,0x84,0x3d,0x64,0x11,0x00,0x62,0xc0,0xae,0xcd,0xc3,0x1d,0x4a,0x51,0x88,0xdd,0xe3,0x23,0xe1,0xf2,0xb4,0xfa,0x7b,0xf4,0xd2,0x54,0xa7,0x92,0x53,0x08,0x4e,0x5e,0xb9,0xa6,0xbc,0x5e,0xc9,0x81,0x95,0x00,0xec,0x1e,0x1f,0x2d,0x34,0x0e,0x06,0xe0,0xd7,0x7f,0xe0,0x7e,0x1c,0xbf,0x3c,0x8d,0x63,0x17,0xa7,0xf1,0xf4,0xa9,0x8b,0xf8,0x2f,0x5f,0x7a,0x02,0xff,0xd2,0x32,0xca,0x22,0x44,0xa5,0xd3,0x42,0xc7,0x4e,0x06,0xc8,0xed,0x5d,0x86,0x9e,0x5d,0x4b,0xbe,0x80,0x6c,0x64,0x05,0x09,0x45,0x3a,0xdd,0xcc,0xfa,0xdd,0x8a,0xb0,0xf5,0xb5,0x46,0xe1,0x13,0xc9,0x2d,0x06,0xe6,0xc4,0x84,0x31,0x08,0x10,0x3e,0xfa,0xd8,0x73,0xf8,0xe8,0x63,0xcf,0xa9,0x6b,0x96,0x55,0xbc,0xfa,0x99,0xc5,0xba,0xdd,0x05,0x57,0x19,0x15,0x89,0x72,0x7c,0xef,0x6e,0x6c,0x30,0x67,0xcb,0x6b,0xff,0x73,0xd3,0xf6,0x62,0x2c,0x54,0x9b,0xc1,0xc1,0xc9,0x71,0x70,0xe5,0x9e,0x4a,0x6b,0x18,0x0f,0x9f,0xbc,0xd8,0xe9,0x64,0x35,0x85,0x97,0xce,0x5f,0x85,0xed,0x84,0xf9,0x86,0xad,0x9b,0x0a,0x8f,0xa7,0xbf,0xc7,0xc3,0x87,0xde,0xf7,0x3d,0x18,0xac,0xf6,0x80,0x11,0xc3,0xdf,0x7f,0xf3,0x39,0x7c,0xeb,0x95,0x33,0xd1,0x87,0x82,0x51,0x93,0x59,0xbf,0x0b,0x00,0x31,0xb0,0x88,0xa7,0x31,0x1e,0xb8,0xfd,0x64,0xea,0x77,0xe8,0xde,0xb1,0xd9,0xb8,0x10,0x4d,0xbb,0xfd,0xbb,0xc8,0xb0,0xe1,0xf8,0x9d,0x03,0xc2,0x87,0x2c,0x1b,0x70,0xbd,0xe1,0x4d,0xfd,0xe3,0xd6,0xc7,0xfa,0x47,0xb2,0xbc,0x1a,0x97,0x80,0xe1,0x28,0xa3,0x02,0xd5,0xc2,0x5d,0x30,0x66,0x95,0x9f,0xe4,0x4f,0xb9,0x06,0xdc,0x8d,0x48,0x58,0x03,0x1e,0xeb,0xef,0xed,0x0a,0x15,0xf4,0x60,0x6f,0x15,0x7b,0x37,0x0f,0xe3,0xd5,0xcb,0xd7,0x00,0x00,0x44,0x02,0xa7,0x2e,0x5f,0xc3,0x95,0xb9,0x45,0xf7,0x9a,0xe6,0x1a,0xc0,0x13,0xc7,0xce,0x4a,0x6f,0x63,0x80,0xf4,0x82,0x45,0x84,0x03,0xdb,0x8a,0x27,0x60,0x40,0x6a,0x10,0x7e,0xed,0x07,0xee,0xc3,0xbf,0xfb,0xf8,0x57,0x40,0x20,0xfc,0xde,0x27,0xbf,0x86,0xbf,0xfc,0xf9,0xf7,0x62,0xd3,0xa0,0x2a,0x3b,0x55,0xdf,0x7a,0x64,0x0e,0xd6,0x6d,0x8b,0x02,0xa9,0x8d,0x29,0x8c,0x0c,0x2f,0x49,0x7a,0xf2,0x51,0xdc,0x78,0x20,0xcf,0x03,0x0e,0xd7,0x37,0x65,0x3e,0x8a,0x0a,0x5c,0xf6,0x8b,0x88,0x85,0x3c,0x89,0x86,0x39,0xd8,0x17,0xea,0xd4,0xb1,0xc0,0x3a,0x38,0xea,0x7d,0x2d,0x80,0x75,0x9d,0x20,0xcb,0xad,0xe6,0x37,0x98,0x31,0x2b,0x1f,0x64,0x2f,0x3d,0x34,0x89,0x72,0x0d,0xb8,0xbb,0x51,0x3a,0xe2,0xe8,0xb6,0x0f,0x09,0xc7,0x75,0x00,0x20,0xdc,0xba,0xab,0xf3,0xd2,0xaf,0xc6,0x2d,0xbb,0x26,0xa0,0xd3,0xa7,0xbb,0xf0,0xa3,0x2f,0x9f,0xea,0x60,0x8a,0x1a,0x07,0x01,0x78,0xfc,0xd8,0xd9,0x88,0x13,0x14,0xce,0x80,0x1b,0x26,0x37,0xb7,0x2c,0xce,0xb7,0xde,0xb2,0x0f,0xef,0xbe,0xf3,0x00,0xc0,0x80,0xe9,0xf9,0x25,0xfc,0xe7,0x87,0x1e,0x8b,0xa4,0xc7,0xdd,0x3e,0x9a,0x07,0x03,0x49,0x69,0x17,0x90,0x92,0xaf,0x72,0x6c,0xa2,0x8f,0x7c,0x94,0xf7,0x8a,0x22,0x80,0xa4,0x76,0x5e,0x14,0xcc,0x30,0xcd,0x7e,0x93,0x1f,0x3e,0x09,0xe9,0xe4,0x45,0x71,0x54,0x84,0xb2,0x02,0xed,0x00,0x8b,0xd2,0x18,0x87,0xd2,0x20,0xa0,0x09,0xc3,0xb5,0xb4,0xf1,0xa0,0x08,0x74,0xc1,0x98,0x56,0x7e,0x12,0x3f,0x5e,0xa1,0x33,0xeb,0x12,0xcd,0x43,0x1b,0x01,0xa9,0xef,0x7a,0x86,0x4d,0x82,0x70,0xf3,0x8e,0xee,0x21,0xe0,0x9b,0x77,0x4d,0xe0,0x9f,0x9e,0x7c,0x59,0xfd,0x92,0x12,0xfb,0x97,0x9f,0x3d,0x8e,0xef,0xbf,0xf3,0x60,0x27,0x93,0xd5,0x10,0x9e,0x3b,0x7d,0x11,0x57,0x66,0x16,0x22,0x0b,0x71,0x87,0x76,0x4d,0x60,0xb8,0xc5,0x4e,0x4f,0x7e,0xe5,0x9d,0x77,0xe3,0xbb,0xaf,0x9e,0xc3,0xd9,0xe9,0x39,0x3c,0xf2,0xdc,0x09,0x7c,0xe5,0xf9,0x13,0x78,0xf0,0xa6,0xbd,0x80,0x25,0xf1,0x92,0xaa,0xff,0x22,0xa0,0xdb,0x95,0x60,0x5c,0x19,0x62,0x51,0xe4,0x1e,0x6b,0x62,0x2b,0x4f,0x2c,0x2e,0x41,0x11,0x57,0xde,0xf2,0xe0,0x9f,0x82,0x42,0x0f,0xac,0xb9,0xa3,0xd7,0x1a,0x4d,0xbc,0xef,0xcb,0xf0,0xb4,0x7a,0x5e,0xa8,0x80,0xe3,0x02,0x22,0x0b,0x4f,0xe4,0x22,0x95,0x0e,0x28,0x09,0xba,0x11,0xe8,0xba,0x8d,0xd8,0x74,0x35,0x9e,0x8f,0x48,0xd0,0x3a,0x6c,0x4e,0xc9,0xde,0x3e,0x4a,0x01,0xb8,0xa3,0xf0,0xe2,0x35,0x53,0xa2,0xb3,0x20,0xeb,0x3b,0xe9,0x91,0x0b,0xb7,0xe4,0x38,0x51,0xa7,0xd5,0x90,0x7b,0x58,0x75,0xdb,0x91,0xe9,0x7c,0xe2,0xd5,0xb3,0xb8,0x34,0xb3,0x80,0x2d,0x5d,0xb0,0x55,0x2a,0x0f,0x3e,0xf5,0xc4,0x8b,0x88,0x1e,0xd5,0x46,0xb8,0xe7,0x40,0xeb,0x2d,0xba,0xfb,0x7b,0xaa,0xf8,0xf5,0xf7,0xde,0x8f,0x5f,0xf9,0xab,0xcf,0x82,0x40,0xf8,0xa3,0xcf,0x3d,0x8e,0xbb,0xaf,0xdf,0xa9,0xd2,0xa2,0x54,0x87,0x44,0x8a,0x04,0x0a,0x9c,0x28,0x33,0x02,0x63,0xa6,0x6a,0x52,0x86,0x1f,0xba,0xc0,0x2c,0x0a,0x66,0x99,0x9a,0xd7,0x8a,0x00,0x39,0xc2,0x6f,0x3c,0xed,0x3e,0xf9,0x4a,0x23,0x20,0xc3,0x60,0xda,0x38,0xcd,0x11,0x6f,0x50,0x1f,0x8a,0x7c,0x19,0x01,0x7e,0xc3,0x71,0xab,0xba,0x2e,0xcc,0x9c,0xcc,0x84,0x59,0x46,0x96,0x0a,0xba,0x64,0xe0,0xae,0x40,0x29,0x01,0x77,0x1b,0x82,0x6d,0x30,0x5a,0x12,0x26,0x40,0x10,0x3c,0xc6,0x71,0x63,0x17,0x18,0x60,0x69,0xec,0x19,0x1f,0xc3,0x48,0x5f,0x0f,0xae,0x2d,0x2c,0x43,0x4b,0xc0,0x35,0xf2,0xf1,0x0f,0x8f,0x1f,0xc1,0xcf,0xbf,0xed,0xae,0x4e,0x27,0x2f,0x33,0x66,0x17,0x97,0xf1,0x85,0x67,0x8e,0xca,0xe5,0x3f,0x43,0xfa,0xbb,0xef,0xc0,0xae,0xb6,0xc4,0x7f,0xe7,0xbe,0xed,0x78,0xe7,0xed,0x07,0xf0,0xd0,0x53,0x2f,0xe3,0xc2,0xb5,0x79,0xfc,0xdd,0xa3,0x47,0x00,0x62,0x6a,0xf7,0x88,0x4a,0x4d,0x91,0x6b,0xc0,0x44,0xf2,0x90,0x22,0xae,0xb6,0x3b,0xcb,0xff,0x02,0xa1,0x8b,0x84,0x11,0x6f,0xd3,0x51,0xe9,0x7d,0xe2,0x41,0xd4,0xc5,0xed,0x31,0xd6,0xeb,0xc9,0xcc,0x08,0xcf,0x2c,0xb3,0x1c,0x10,0xaa,0x7c,0x89,0x31,0x30,0xd2,0xbe,0xc7,0xeb,0x25,0x00,0x81,0xad,0x00,0x11,0x50,0xab,0x35,0x36,0xb1,0x90,0x52,0x2a,0x82,0x7c,0xd8,0x4e,0xf0,0x9a,0x85,0x5c,0x73,0xa7,0x38,0xcf,0x96,0xfc,0xdb,0x15,0x28,0xad,0xa0,0xbb,0xf0,0x23,0x07,0x5f,0xb5,0x25,0x42,0x48,0xc7,0x08,0xaf,0xdb,0x37,0x89,0xbe,0xaa,0x97,0x56,0x97,0x6d,0x05,0x63,0xc0,0x3d,0x07,0x76,0xa9,0x34,0xb3,0x60,0x09,0xee,0x93,0x8f,0xbf,0x80,0xb9,0xa5,0x95,0x4e,0x27,0x2f,0x33,0xfe,0xe6,0xeb,0x87,0xb1,0xbc,0xa2,0x9c,0x30,0xa8,0xf2,0x3f,0xb0,0x6d,0x33,0x6e,0xdc,0xd1,0x3e,0x6d,0xc3,0xcf,0xbf,0xed,0xf5,0xe8,0xaf,0xf6,0x80,0x08,0xf8,0xfb,0x47,0x8f,0x28,0x92,0x52,0xd2,0x8a,0xd9,0x36,0x0a,0x81,0xa6,0x17,0xcd,0x8a,0xcc,0x08,0x3b,0x13,0xf5,0x64,0x47,0x52,0x1b,0x6f,0x65,0xf8,0x0d,0xc0,0x17,0x04,0x69,0x1d,0xce,0x10,0xea,0xcc,0x95,0x95,0xb3,0xb2,0x12,0x67,0x81,0xc5,0xb8,0xb4,0x84,0x86,0x22,0x6b,0xad,0xa3,0x16,0x8d,0x1a,0x61,0x15,0x98,0x8f,0x5c,0xe1,0x97,0x9f,0xae,0xf8,0x94,0x12,0x70,0xb7,0xc1,0x70,0x04,0x01,0x28,0xaf,0x44,0x44,0x78,0xc3,0xc1,0xf6,0x48,0x64,0x79,0x70,0xff,0xc1,0xdd,0xf8,0xdc,0x53,0xaf,0xc8,0x1f,0x4a,0x7a,0x9c,0x59,0x58,0xc6,0x9f,0x7f,0xe9,0x49,0xfc,0xd2,0xbb,0xee,0xed,0x68,0xda,0xb2,0xe0,0xe2,0xb5,0x79,0x7c,0xf4,0x1b,0xcf,0xc8,0xb5,0x3f,0xce,0x02,0x37,0x94,0xef,0x79,0x5d,0x7b,0xd7,0xb1,0x37,0x0f,0xf5,0xe3,0x87,0xee,0xb9,0x09,0x7f,0xfd,0xb5,0xc3,0x98,0x5b,0x5a,0x91,0x27,0x30,0x09,0xdd,0x0e,0x64,0xfd,0x17,0x76,0x42,0x9d,0x0a,0x8b,0x09,0x39,0x06,0x30,0x66,0xb5,0xb7,0x02,0xfd,0x10,0x53,0xa4,0x2d,0x47,0xaf,0x35,0x1f,0x38,0x1c,0x6b,0xc0,0x8d,0x05,0xe5,0x0b,0x21,0x5d,0x26,0x0b,0x32,0xd6,0x7c,0x39,0x08,0x64,0x4d,0x48,0xcc,0x3a,0x41,0xc4,0xc7,0x45,0xad,0xc1,0x71,0x54,0x7a,0xb8,0x8b,0xe6,0x23,0xa2,0xfd,0x68,0x06,0x41,0x19,0x51,0x60,0x58,0x16,0x84,0x5a,0x4a,0xc0,0x5d,0x01,0xaf,0x71,0xc3,0xfd,0x12,0x85,0xc3,0xe8,0x74,0xa4,0xa6,0x48,0xa4,0xae,0x77,0x23,0x01,0xdf,0x73,0xc3,0x2e,0x54,0x2a,0x0c,0xab,0xbe,0xde,0x6a,0x22,0x27,0x0c,0x1f,0xfb,0xd6,0xb3,0x78,0xd7,0x6b,0x0f,0xe2,0xfa,0x16,0x5a,0x11,0x37,0x0b,0x22,0xe0,0xf7,0xfe,0xf1,0xab,0x58,0x5c,0xad,0x45,0xa4,0x99,0xa1,0xbe,0x2a,0xde,0x7e,0x47,0xca,0x41,0x09,0x2d,0xc2,0xfb,0xee,0xbd,0x19,0x7f,0xfb,0xcd,0x67,0xb0,0x2a,0x08,0x35,0xa2,0xd0,0x56,0x29,0x10,0x82,0x8b,0xe9,0xa7,0x04,0xc8,0x13,0x9f,0x48,0x0f,0xca,0xda,0xf1,0x88,0x22,0x15,0x56,0x18,0xff,0xc2,0xe5,0x50,0xb1,0xa8,0x15,0x60,0x01,0x52,0x27,0x57,0x45,0xd1,0x48,0xda,0x85,0x20,0x10,0x23,0x80,0xc9,0x55,0x70,0x25,0xd3,0x82,0x31,0xee,0x0e,0x8f,0x85,0xf5,0xa1,0x7d,0x39,0x37,0x4c,0xc0,0x09,0xf9,0x28,0x0a,0x32,0x6c,0x8a,0xac,0xfe,0x02,0x25,0xef,0x76,0x0b,0xca,0xd3,0x90,0xba,0x09,0xd6,0xfa,0x2f,0x40,0x80,0x20,0x1c,0xdc,0xbe,0x09,0x5b,0x5b,0x70,0xf8,0x40,0xb3,0x18,0xec,0xad,0xe2,0x35,0x7b,0x26,0xf1,0xed,0xa3,0x67,0x11,0x8a,0x04,0xc0,0x6a,0xcd,0xc7,0x6f,0x7c,0xe4,0x0b,0xf8,0xf3,0x7f,0xf5,0x83,0xe8,0xef,0xe9,0xfc,0xe9,0x4d,0x2e,0x7c,0xfc,0xd1,0x67,0xf1,0xd8,0x8b,0xa7,0xc2,0xad,0x47,0x6a,0xe4,0xfd,0xc9,0xfb,0x6f,0xc7,0x60,0x6f,0xfb,0xd3,0x3c,0x3e,0xd4,0x8f,0xbb,0xf7,0xef,0xc4,0x37,0x5e,0x3a,0x05,0x61,0xf6,0x49,0xa6,0xca,0xb5,0xb0,0x35,0x60,0xa8,0xb0,0x28,0x6a,0x93,0x13,0x58,0x10,0x6b,0xfd,0x58,0x01,0x70,0xa5,0xb9,0xa8,0x7c,0xb8,0x4e,0x11,0x6a,0x30,0xe9,0xbe,0x10,0x61,0x99,0x00,0x00,0x57,0xd3,0x12,0x73,0x01,0x3b,0x12,0x89,0x92,0x26,0x05,0x01,0x24,0xf7,0x0f,0x37,0xe3,0x0b,0xda,0x99,0x8f,0xa2,0x60,0x48,0xc0,0x11,0x94,0x12,0x70,0x57,0x80,0x87,0x56,0x78,0xe5,0xa7,0x7b,0x3e,0x4a,0x4e,0x21,0xf9,0xfb,0x8d,0x07,0xdb,0x73,0x18,0x41,0x23,0x78,0xe3,0x4d,0xbb,0x41,0x3a,0xcd,0xda,0xba,0x16,0x84,0x13,0x17,0xaf,0xe2,0x77,0x3f,0xf6,0xa5,0x28,0x99,0x74,0x09,0xbe,0xfd,0xca,0x69,0xfc,0xe1,0x67,0xbe,0x01,0x30,0x5f,0xa5,0x59,0xa6,0x7d,0x7c,0xb8,0x0f,0x3f,0x7c,0xdf,0x2d,0x1d,0x4b,0xd7,0xeb,0xf6,0x6f,0x57,0x2a,0x61,0x21,0xd3,0x06,0x21,0x07,0x78,0x25,0xef,0x15,0x03,0x15,0x3e,0x44,0x18,0x57,0xec,0x53,0x14,0xc2,0xb6,0x1c,0xfd,0x5e,0x04,0x92,0xd2,0x9e,0xbf,0xbd,0xf9,0xfa,0x08,0x4a,0x32,0xcb,0x44,0xff,0xf5,0xc1,0x98,0x08,0x3e,0x91,0x78,0x19,0x05,0xbf,0x7d,0xd1,0x20,0x01,0xc7,0xf2,0xd1,0x8e,0x32,0x2a,0x3f,0xdd,0xf2,0x29,0x25,0xe0,0x6e,0x42,0xc2,0x21,0x0c,0x0f,0xdc,0xb4,0xb7,0x93,0xa9,0x4a,0xc5,0x9b,0x0e,0xed,0xc5,0x87,0x3f,0xfd,0x68,0xdc,0xef,0x3e,0x11,0xbe,0x74,0xf8,0x28,0x3e,0x54,0xf9,0x22,0x7e,0xf3,0x47,0xde,0x0a,0x6e,0x1f,0x38,0xd0,0x21,0x7c,0xf7,0xd8,0x59,0x7c,0xf0,0xaf,0x1e,0x82,0x5f,0x13,0x4a,0x02,0x14,0x90,0x1e,0x15,0x08,0xff,0xfa,0xdd,0x6f,0x40,0x7f,0x4f,0xe7,0x0c,0xdd,0xb6,0x8d,0x0e,0x22,0x38,0x0b,0x56,0x0f,0xee,0xfa,0x38,0xbf,0xe2,0x16,0x81,0x11,0x91,0xf6,0xcc,0xeb,0x41,0xbb,0x2b,0x26,0xaa,0x30,0x1e,0xb2,0xae,0x15,0x00,0x9d,0x8f,0x82,0xd6,0x80,0xc3,0xb0,0x8c,0x30,0x19,0x93,0x6b,0xc2,0x46,0xd9,0xcb,0x9f,0xba,0x9f,0xca,0xf7,0x18,0x00,0xe1,0x37,0x18,0xb9,0x53,0x02,0x2e,0x58,0x0b,0x51,0x4a,0xc0,0x5d,0x0b,0xaf,0xe4,0xdf,0x2e,0x81,0xb9,0xfe,0xab,0x3a,0x20,0x11,0xb0,0x67,0x7c,0x14,0x07,0xba,0x78,0x2d,0x75,0x72,0x6c,0x18,0x37,0xef,0xda,0x86,0x67,0x4e,0x5e,0x80,0x69,0xe6,0x41,0x90,0x5b,0x34,0x3e,0xfd,0xc4,0x4b,0x38,0x7f,0x6d,0x0e,0xff,0xfb,0x4f,0xbc,0x03,0x9b,0x3a,0xec,0xa6,0xf2,0x73,0xdf,0x7d,0x09,0x1f,0xfa,0xd8,0x97,0xb1,0x52,0xf3,0x83,0x3d,0xb0,0x4c,0x71,0xdc,0xf6,0xb1,0x11,0x7c,0xcf,0xad,0xfb,0x3b,0x9a,0xbe,0xa3,0x17,0xa6,0x14,0x3f,0x19,0x24,0x48,0x00,0x82,0x55,0xbc,0x62,0x40,0xc4,0xe4,0x99,0x0b,0x91,0xbe,0x2f,0x8d,0xd0,0x08,0xc5,0x71,0xbd,0xcb,0x9e,0xab,0x48,0xd9,0x8e,0xc0,0x60,0x1a,0x75,0xb1,0x06,0x79,0xcb,0x17,0x14,0x70,0xa0,0x2e,0x13,0xa6,0x9a,0xb2,0x73,0x27,0xb0,0x9a,0x14,0x99,0x07,0x19,0xad,0x36,0x68,0x05,0x2d,0xe7,0x3d,0xc5,0xe4,0xc3,0x15,0x76,0x90,0x2f,0x44,0xeb,0xbb,0xe4,0xdd,0xee,0x40,0x79,0x1c,0x61,0x21,0xa8,0x57,0x86,0x59,0x9a,0xbb,0x63,0xfd,0x97,0x08,0xef,0xb8,0xa3,0xb3,0xa4,0x90,0x05,0xdf,0x7b,0xfb,0x7e,0x3c,0x73,0xf2,0x9c,0xfc,0x11,0x38,0x8f,0xa0,0xe0,0x60,0x9d,0xef,0xbc,0x72,0x1a,0x3f,0xf1,0x7f,0x7d,0x04,0xff,0xea,0xfb,0xde,0x80,0x77,0xbd,0xee,0x50,0xdb,0xdd,0xcf,0x5e,0x9a,0x99,0xc7,0x87,0x3f,0xf5,0x75,0x3c,0xfc,0xd4,0xcb,0x52,0xaa,0x51,0x2e,0x07,0x99,0xda,0x03,0xcb,0x18,0xf0,0x2f,0xbe,0xf7,0xf5,0x75,0xc3,0x69,0x25,0xbe,0x73,0xf4,0x0c,0xfe,0xe6,0x6b,0x4f,0x23,0x6c,0x4b,0x86,0x5b,0xae,0x22,0xd7,0x65,0x83,0x30,0xdd,0xd7,0x59,0xea,0xfd,0x46,0xe2,0x21,0x2d,0x36,0xd6,0x89,0xbb,0x99,0xf0,0x59,0x53,0xb3,0x06,0xe9,0xc5,0x2a,0x6f,0x19,0xab,0xb5,0x60,0xe5,0x86,0xb2,0x61,0x4f,0x58,0xce,0xfa,0x6d,0x41,0x19,0x99,0x3f,0x33,0x6b,0x0d,0x8a,0x18,0xd7,0x4a,0xa4,0xa1,0x24,0xe0,0xdc,0x68,0xa4,0x51,0x52,0xfd,0x47,0x2c,0xa9,0x47,0x5b,0x41,0xbf,0xed,0xb6,0xee,0x27,0xe0,0xb7,0xde,0xb6,0x1f,0x1f,0xfe,0xe7,0x6f,0xaa,0xf5,0x5e,0x01,0x6d,0xba,0xcb,0x98,0x74,0xa5,0xc9,0x88,0xe1,0xf2,0xb5,0x79,0xfc,0xfb,0xbf,0xfb,0x3c,0xfe,0xfe,0xeb,0x4f,0xe1,0xc7,0x1f,0xb8,0x13,0x6f,0xb9,0xfd,0x00,0x7a,0xbc,0x4a,0x4b,0xd3,0x75,0xfa,0xca,0x35,0x7c,0xf4,0xeb,0x4f,0xe3,0x1f,0xbf,0x75,0x04,0xcb,0xda,0xda,0x59,0x93,0x2e,0x08,0x20,0xe9,0x76,0x90,0x08,0x18,0x1b,0xec,0x6b,0x69,0x5a,0x5c,0x20,0x02,0x9e,0x3b,0x7d,0x01,0x1f,0xfb,0xe6,0x33,0xf8,0xfc,0xd3,0x47,0x55,0xc9,0xc9,0x3d,0xa6,0x51,0xf1,0xb4,0x40,0x15,0xb4,0x1e,0x90,0x5d,0x3c,0x5f,0x30,0xd1,0x4b,0x39,0x51,0x20,0x3c,0xdd,0x47,0x14,0xcc,0x2d,0x4a,0xbd,0x1a,0xa4,0xdd,0xfc,0x9b,0x1d,0xa1,0x9d,0x82,0x22,0x55,0x00,0x0e,0x15,0x81,0x15,0xbc,0x2e,0x47,0xf9,0x69,0xd8,0x08,0x0b,0x08,0xf3,0x21,0x95,0xd9,0x8d,0x87,0xe3,0x40,0x60,0x4c,0x16,0x28,0xa7,0x58,0xf2,0x24,0x2b,0x53,0xd1,0xd5,0x9b,0x28,0x94,0xa4,0x9c,0x07,0xec,0xfe,0xdf,0xfa,0xb3,0x92,0x81,0x53,0x91,0xd6,0x21,0x78,0xca,0x3d,0x85,0xcc,0xed,0x91,0x8c,0x71,0x51,0x6e,0x6d,0xe8,0xe1,0x1c,0xf7,0xdf,0xb8,0x47,0xde,0x13,0x5a,0x2d,0x2d,0xa2,0x63,0xb1,0xbd,0x5e,0x94,0x56,0x9b,0x79,0xf6,0x6c,0x30,0xeb,0x87,0x21,0xb6,0x4a,0xed,0x2d,0x97,0x8f,0x30,0x29,0x4d,0x3e,0xfa,0xd2,0x69,0x2c,0xae,0xac,0xaa,0x24,0xa9,0x8c,0x04,0xaa,0x74,0x99,0x7e,0x22,0x11,0x10,0xde,0xa6,0xc1,0x3e,0x3c,0x70,0xcb,0x75,0x78,0xc3,0xa1,0xeb,0x70,0xd7,0x0d,0xbb,0x31,0xdc,0xdf,0x9b,0x92,0x98,0x6c,0x10,0x44,0x78,0xe9,0xcc,0x25,0x3c,0x71,0xf4,0x34,0xbe,0xfc,0xcc,0x51,0x1c,0x3e,0x71,0x0e,0x81,0x25,0xab,0x5e,0xcf,0x53,0xce,0xf3,0x83,0x33,0x71,0xd5,0x20,0x3b,0x39,0x3a,0x82,0x9f,0x78,0xd3,0xed,0xb8,0x75,0xcf,0x36,0xec,0x1a,0x1f,0x2d,0x24,0x3d,0x26,0x6a,0xbe,0xc0,0xa5,0x99,0x39,0x9c,0xba,0x34,0x8d,0xe3,0x17,0xa7,0xf0,0xdc,0xa9,0x0b,0x78,0xe2,0xe8,0x59,0x5c,0x9c,0x9d,0x0f,0xd2,0xa5,0x8f,0x07,0x04,0x10,0x23,0x46,0xaf,0xc2,0xf0,0xc0,0x8d,0xfb,0xe4,0xc4,0x2c,0x68,0x03,0x2a,0x6f,0xce,0x35,0x43,0xa5,0x7e,0x50,0x0e,0x25,0xb4,0x65,0xef,0xb1,0x8b,0xd3,0x38,0x7e,0x79,0x5a,0x5e,0x67,0x2c,0x12,0x8f,0x5e,0xfa,0xb8,0x61,0xdb,0x38,0x76,0x8f,0x0f,0xcb,0x10,0x05,0x05,0x93,0xc1,0x28,0xd1,0x99,0xf1,0x98,0x6d,0x43,0x95,0x35,0x80,0x2f,0x3d,0x7b,0x4c,0x71,0x6f,0x18,0xc9,0x40,0xb5,0x8a,0xfb,0x0e,0xee,0x56,0x41,0x91,0x71,0xfa,0x4f,0xbe,0x7c,0xbc,0x74,0xee,0x0a,0x4e,0x5d,0xbd,0x06,0xb3,0xa1,0x32,0x02,0x6e,0xdb,0xb3,0x0d,0x5b,0x46,0x06,0xd4,0x7e,0x67,0x93,0x58,0xe3,0x1d,0x51,0x26,0x95,0x63,0x61,0xa5,0x86,0x47,0x5f,0x3e,0x25,0x9d,0x6c,0x70,0x55,0x2e,0xca,0x2e,0x80,0xd9,0xea,0x1a,0xab,0x8f,0x6a,0x47,0x39,0x03,0x3d,0x15,0xdc,0x7b,0x60,0x97,0x3b,0x5f,0xe6,0xcb,0x56,0x3e,0x9e,0x3f,0x73,0x19,0x67,0xa7,0x67,0x22,0x65,0xc4,0x88,0xe1,0x75,0xfb,0xb7,0x63,0x64,0xa0,0xcf,0x08,0x4b,0xdf,0x4e,0x2a,0xa3,0x68,0x1d,0x30,0xc6,0x30,0xbb,0xb4,0x82,0x6f,0x1f,0x3b,0x2b,0xe3,0xe4,0x61,0xbb,0x8f,0x78,0x20,0xad,0x37,0x40,0x65,0x62,0x87,0x26,0xc7,0xc8,0x0d,0x0c,0x76,0xdf,0x6f,0xfe,0xd7,0x92,0x80,0x23,0xc8,0xc3,0x60,0x16,0x1a,0x6e,0x6b,0x14,0xfc,0x71,0x75,0x6e,0x22,0x01,0xa6,0x06,0x42,0x12,0xc2,0x18,0x2c,0x45,0x90,0xa6,0xc2,0x1c,0x1c,0x38,0xc0,0xf4,0x82,0x98,0x31,0x68,0xb3,0x80,0x30,0x98,0x74,0xe1,0xc7,0x58,0x44,0xaa,0xd2,0x24,0x2c,0xdd,0x3b,0x2a,0xc2,0x20,0x11,0x5c,0x93,0x32,0x7e,0xa8,0x3a,0xdc,0xb1,0x79,0x14,0x07,0x77,0x4e,0x60,0xdf,0xd6,0xcd,0x18,0x1f,0x1e,0xc4,0xc4,0xc8,0x20,0x46,0x07,0xfa,0x30,0xa4,0x88,0x70,0xa8,0xbf,0x17,0x2b,0xab,0x35,0xac,0xd4,0x7c,0x08,0x22,0x4c,0xcd,0x2d,0x60,0x7a,0x6e,0x11,0x57,0x66,0x17,0x70,0xfa,0xca,0x34,0x8e,0x9e,0xbf,0x82,0x57,0xcf,0x5f,0xc5,0xdc,0xd2,0x72,0x40,0x00,0x72,0xd6,0x6f,0x10,0x0d,0x63,0xe0,0x9c,0xc9,0x35,0x3c,0x93,0x7c,0x34,0x8c,0x45,0x3d,0x12,0x02,0x03,0x3d,0x3d,0xe8,0xf1,0x2a,0x18,0xe8,0xad,0x60,0xa0,0xaf,0x17,0x15,0x30,0x0c,0xf6,0xf5,0x80,0x73,0x06,0xaf,0xc2,0x31,0xd0,0xd3,0x83,0xb8,0x28,0x09,0x2c,0xac,0xac,0xa0,0xe6,0x0b,0xcc,0x2d,0x2d,0x63,0x61,0x69,0x15,0x33,0x0b,0x4b,0xb8,0x3a,0xb7,0xa0,0x0b,0x53,0xad,0x2f,0x6a,0x55,0xb8,0x4e,0x9f,0x1c,0xfc,0x35,0xe1,0x44,0xf6,0xe7,0x6a,0x12,0xd4,0x93,0x30,0xab,0x0d,0x04,0xeb,0xc3,0xba,0x0d,0x04,0x27,0x1a,0xd9,0x13,0x0f,0x06,0xf0,0xe8,0xf9,0xbf,0x30,0xde,0x25,0x43,0xa2,0x23,0x21,0x54,0x1d,0xea,0xba,0x8b,0xd7,0x99,0x1e,0xf4,0x65,0x5c,0x3c,0x6c,0x1b,0x9c,0x07,0x6d,0x45,0x16,0x75,0xd8,0x46,0xe5,0xae,0x2a,0x11,0x94,0x71,0xa3,0xf9,0x88,0xb4,0x3b,0x1d,0x36,0x10,0x1c,0xe3,0x18,0x3a,0x30,0x21,0x44,0x49,0x8b,0x85,0xed,0x98,0x87,0xa7,0x1c,0x81,0x73,0x88,0x54,0xa2,0xd2,0x6d,0xc4,0x90,0xb5,0xd5,0x16,0x24,0x12,0xae,0x3e,0xaa,0xdd,0x70,0xaa,0xf8,0x95,0x97,0x2d,0x1d,0xa6,0xb3,0xff,0x18,0xf9,0x90,0x75,0xae,0xca,0x5e,0x8d,0x03,0xa1,0xb4,0x1f,0xf6,0xf7,0x60,0x82,0x60,0xb6,0xf5,0x20,0x5f,0x3c,0xf8,0x6e,0x4e,0x3c,0x73,0x11,0xb0,0x0b,0x75,0x85,0xf4,0x26,0xc6,0xd0,0x0d,0x86,0xd2,0x13,0x56,0x33,0x22,0xa3,0x4d,0xb8,0x0d,0x6b,0x8f,0xea,0x11,0xb0,0x39,0x98,0xc0,0xf8,0x6d,0xa8,0xc9,0x5a,0x55,0x8d,0x4c,0x0f,0x9c,0x2c,0xe6,0xa0,0x5e,0x1b,0x30,0x31,0x6e,0xc5,0x4f,0x2c,0x70,0xf4,0x40,0x60,0x80,0xd0,0x2a,0x5f,0x65,0xe8,0xa3,0x7d,0x1d,0x1b,0x2f,0x9d,0xb9,0x72,0x0d,0xa7,0x2f,0x4f,0x37,0x9e,0xcc,0x88,0xa4,0x22,0xe3,0x60,0x8a,0x74,0xb5,0xdc,0x01,0x02,0x7c,0x3d,0x67,0x21,0x0a,0x48,0x0e,0x30,0x27,0x0c,0x92,0x66,0x88,0x80,0xb9,0xc5,0x65,0x10,0x11,0xae,0x18,0x03,0x5f,0xf0,0x6c,0x33,0x69,0x13,0x32,0x6d,0xda,0x03,0x97,0xd4,0x86,0x93,0x34,0xc8,0x56,0xcf,0x87,0x2e,0x2c,0x42,0x2f,0x58,0x01,0x11,0x12,0x8c,0xb6,0x60,0xb5,0x01,0x95,0xb7,0x20,0xff,0x90,0x75,0xa0,0xa7,0x50,0x10,0xa4,0x06,0x67,0xe9,0xfb,0xd8,0x9c,0xc4,0x69,0xd2,0x90,0x6d,0x2f,0x2c,0xc7,0xd0,0x2b,0x97,0xdd,0xde,0xc2,0xeb,0x72,0xfe,0x25,0x63,0x32,0x3d,0x3b,0x31,0xcb,0xc0,0x48,0x18,0x61,0x37,0x96,0x0f,0xdd,0xee,0xa1,0x24,0x54,0x44,0xc3,0x0e,0xca,0x28,0xec,0x2f,0x41,0xda,0x01,0x23,0x2c,0x59,0xde,0xa4,0xda,0x08,0x83,0x0a,0xcb,0xb6,0x86,0x76,0xf1,0x05,0xc9,0xb6,0xcc,0x74,0xdd,0x28,0x4b,0xe8,0x80,0xec,0x4d,0xce,0xa7,0x68,0xdc,0xba,0x2d,0x92,0xee,0x0f,0x2a,0x1f,0x88,0xe5,0x23,0xcc,0x4b,0xa8,0x51,0x82,0xd1,0x2e,0x74,0x52,0xd4,0x6f,0x61,0xd4,0x81,0xea,0x5f,0xc4,0x49,0xee,0x66,0xe3,0x0c,0x60,0x02,0xe0,0x1c,0x81,0x3a,0xba,0x68,0x1e,0x4c,0x1d,0xfb,0x28,0xe1,0x7b,0x49,0xc6,0xdd,0xe3,0x5c,0xb8,0xad,0x48,0x1a,0x40,0x73,0x36,0x88,0x62,0x97,0x6b,0xe2,0xed,0x54,0xf9,0x58,0x96,0x83,0x1a,0xa0,0xd5,0xa9,0xc1,0xa4,0x1a,0xea,0x99,0x06,0xa4,0xdf,0xcc,0x39,0x25,0x98,0xa3,0x56,0xf8,0xae,0x1e,0x24,0x81,0xa0,0x1c,0xa2,0x04,0x2d,0xd3,0xcc,0xf4,0xb0,0x1c,0xa4,0x59,0x5f,0x51,0xcf,0x52,0xe8,0xed,0x2b,0xa6,0xee,0x43,0x4a,0xde,0x02,0xa9,0xdc,0x48,0x67,0x10,0xaa,0x1e,0x61,0x28,0x28,0x23,0x46,0x4c,0x11,0x8e,0x71,0x3f,0x14,0x65,0x24,0xe9,0x05,0xe4,0xa0,0xdf,0x56,0xcf,0x06,0x4b,0x97,0x64,0xbc,0x9f,0x03,0x66,0xda,0x08,0xc1,0x8c,0x25,0x08,0x3b,0xe0,0x41,0x16,0x66,0xcb,0x2c,0xf3,0x80,0x81,0x01,0x26,0x42,0x6f,0x4d,0x9a,0xf0,0x22,0x6d,0x20,0x56,0x5f,0xca,0xa7,0xb1,0xca,0xbf,0x26,0xfc,0x40,0x03,0x10,0x89,0x87,0x05,0x13,0x13,0x52,0xbf,0x83,0x52,0x76,0xb5,0x37,0x33,0x2e,0x5d,0x2e,0xba,0xac,0x39,0x0b,0x26,0x3d,0x61,0x9b,0xa0,0x20,0x1e,0x3d,0xa7,0x09,0xf3,0xc1,0x03,0xe2,0x74,0x85,0x2d,0xd3,0xc2,0x22,0xd7,0x83,0xbc,0x07,0xf1,0x23,0x98,0x2c,0x46,0x96,0x3d,0x4d,0x7e,0x53,0x91,0x06,0x69,0x55,0x32,0x36,0x04,0x93,0xe1,0x72,0x23,0xbd,0x66,0x1b,0x37,0xa0,0xc3,0x0f,0xea,0x24,0x20,0x5c,0xa6,0x26,0x51,0x6a,0x66,0x0a,0x0a,0xca,0xb0,0x5e,0x3e,0x34,0x49,0x87,0x6d,0x51,0x85,0x2b,0x8c,0x2a,0x22,0xa3,0xed,0x99,0xfd,0x22,0xd2,0xae,0x11,0xb6,0x25,0x62,0x08,0x5c,0x3d,0x70,0x16,0x8e,0x57,0x09,0xf9,0x6a,0x1d,0x92,0x04,0x19,0xbb,0x6f,0x6f,0x3c,0x42,0xde,0x40,0x12,0x70,0x16,0xd2,0xb5,0x9e,0x69,0xdb,0xf2,0x05,0x59,0xdf,0xf4,0xba,0x1b,0x00,0x26,0xd4,0x84,0x5b,0x0f,0x8c,0x42,0xcd,0x98,0xc3,0x81,0x90,0xac,0x76,0x9b,0xa5,0x19,0xe7,0xa9,0xf5,0x20,0x3c,0xad,0x26,0x83,0x94,0xd2,0xf4,0x98,0x25,0x7f,0x13,0x88,0x71,0xeb,0x2d,0xad,0x86,0x63,0x10,0x9a,0xce,0xf4,0xc0,0xc1,0x15,0xf9,0xc6,0x08,0xc7,0xa4,0x3a,0x4a,0xc9,0x8c,0x26,0x43,0x33,0x6d,0x86,0x14,0x65,0x8e,0xa1,0x46,0x5a,0xa1,0x06,0x5c,0xc6,0xac,0x32,0x57,0xd2,0x85,0x16,0xc4,0x48,0x85,0x19,0x75,0x80,0xd1,0xc0,0x64,0x27,0x20,0x11,0x55,0x1e,0x4c,0xa5,0x40,0x4b,0xe6,0x86,0x9a,0x96,0x42,0x76,0x80,0x35,0xab,0x09,0x24,0x44,0xc1,0xd5,0x2d,0x93,0x44,0x49,0x87,0xe7,0x2a,0x93,0x90,0x5b,0xb5,0xa1,0x4f,0x20,0xfd,0xb2,0x70,0x73,0x53,0xd8,0x86,0x28,0x68,0x6f,0x32,0xbf,0x7a,0xbf,0x74,0xbc,0xbd,0x05,0x03,0x7e,0x90,0x46,0xf5,0x0a,0x33,0x1e,0x67,0x61,0x59,0x93,0x22,0x63,0x62,0x22,0x14,0xa0,0x23,0xf9,0x40,0x3c,0x1f,0x06,0x09,0xeb,0x3a,0x91,0x92,0x2f,0x0f,0xda,0x08,0x33,0xab,0x25,0xe0,0x19,0x75,0x51,0xf7,0x15,0x0b,0x41,0xfd,0xaa,0xb2,0x87,0x2a,0x93,0x50,0xc2,0x4e,0xaf,0xe7,0x80,0x2f,0xb5,0x24,0xaf,0xda,0x9e,0x60,0xfa,0x26,0x85,0xf9,0x72,0xbe,0x9f,0x90,0x0f,0x9d,0x0d,0xfd,0x9d,0x5b,0xf9,0x48,0xa9,0x83,0xb0,0xfd,0xa8,0x3a,0x26,0x06,0xc6,0x05,0x88,0xf1,0x84,0x7c,0x05,0x53,0x94,0xd6,0xa2,0x94,0x8e,0x13,0xb1,0xce,0xad,0xa0,0x5d,0x35,0x6f,0xb3,0xaa,0x39,0x93,0xcc,0xf0,0x7a,0x4b,0x40,0x91,0x3f,0x92,0x77,0xa2,0xaa,0x27,0x3d,0xbb,0x07,0x18,0x38,0xe9,0xef,0x08,0x67,0xf3,0xed,0x48,0xa2,0x9e,0x9d,0x33,0x7d,0x28,0x39,0x53,0xe3,0x0c,0x01,0x30,0xd4,0x5b,0xc6,0x3b,0x4c,0x0f,0xe2,0xa4,0xc9,0x80,0xd4,0xec,0x5c,0x1d,0x0a,0x10,0x91,0x72,0x42,0x05,0x9b,0xbd,0x47,0x35,0x9e,0x98,0xf0,0x72,0x28,0x51,0x00,0x7a,0xef,0x93,0x24,0x51,0x1e,0x3e,0x23,0x98,0x41,0x06,0x2c,0x12,0x26,0x53,0x6a,0x3e,0x3d,0xc1,0x21,0x68,0xa9,0xc6,0x50,0x53,0x1b,0x23,0x7c,0x16,0xbf,0xcc,0xe1,0x7b,0x66,0x16,0xc2,0x6b,0x32,0xa9,0xba,0x1c,0x79,0x50,0xb6,0xfa,0x81,0x70,0x68,0x24,0x25,0x65,0x89,0x88,0x54,0xc7,0xd4,0x60,0x4c,0x46,0x99,0x47,0xda,0x41,0x70,0x59,0xa9,0x39,0x55,0x3c,0x7a,0xbd,0x16,0xa0,0xd8,0xbe,0x50,0xdd,0xbe,0x98,0xaa,0x2f,0x22,0x11,0x4a,0xbd,0xc1,0x64,0xca,0xd1,0xde,0x94,0x5a,0x3b,0x54,0xf7,0x23,0x50,0x33,0x87,0x52,0xb0,0x6e,0xd3,0xfa,0x7d,0x4d,0x17,0x75,0xf2,0xa1,0xc3,0xb6,0xf2,0x21,0xcb,0x4b,0xa5,0x3c,0x78,0x95,0xc2,0x32,0x22,0x43,0x3b,0xa0,0xfb,0x92,0x2e,0x37,0xf9,0x25,0x52,0xf6,0x92,0x2c,0xb5,0xb8,0x49,0x61,0x13,0x09,0xca,0xc8,0xf8,0x61,0x96,0x9b,0x6e,0xc7,0x76,0xfd,0x18,0x93,0xb5,0x68,0xdc,0xe1,0xa4,0x29,0x6f,0x3e,0xcc,0x96,0xe7,0xaa,0x03,0x69,0xc8,0x07,0x15,0xaf,0x5a,0x17,0x22,0xbd,0x3e,0xc4,0xc2,0x36,0x66,0x2d,0xa9,0xb4,0x1d,0xa9,0x71,0x67,0x19,0xb3,0xd7,0x0f,0xbc,0xe2,0x5c,0xdc,0x75,0x0b,0xea,0x55,0xa0,0x75,0xbf,0x6b,0x26,0x5a,0x61,0xef,0x95,0xb3,0x73,0x2d,0x1e,0x84,0x64,0x2c,0x3b,0x2a,0x85,0x12,0x4d,0x3b,0x61,0xc6,0xa7,0x48,0x8c,0xa0,0xf7,0xfb,0x72,0x48,0x97,0x7d,0x51,0x89,0x08,0x30,0xa9,0x2a,0xcc,0x4f,0x24,0x0f,0x8a,0xc0,0xf5,0xe0,0x6e,0x4a,0x74,0x88,0xbc,0x9b,0x9c,0x2e,0xbd,0x9e,0xa6,0xc9,0x95,0xd4,0xb5,0x50,0xe2,0x25,0x30,0x2e,0x07,0x28,0xbb,0x6c,0xcd,0x38,0x42,0x12,0x90,0x0e,0xf2,0x25,0x91,0x07,0x34,0x68,0xe4,0xbd,0x3e,0x74,0x9a,0x82,0xd7,0xb4,0x14,0x08,0x16,0x36,0x47,0x3d,0x19,0x60,0x72,0x1d,0x56,0xa8,0xd4,0xca,0x57,0x03,0xfa,0xb4,0xa4,0x53,0x0a,0xf3,0x8c,0x94,0x76,0xc0,0xcc,0xd2,0xd7,0x0f,0x09,0x10,0x38,0x18,0x7c,0x39,0xd9,0x60,0xcc,0xa8,0x04,0x1d,0xbe,0x26,0x21,0x11,0xa6,0x17,0x4a,0x23,0x93,0x12,0x97,0x99,0x1f,0x39,0x41,0x50,0xb9,0x89,0xbd,0x43,0x30,0xc9,0x9c,0x98,0xce,0x6f,0x7a,0x3e,0x64,0x55,0x6a,0x7a,0x12,0xc1,0x44,0x30,0x5e,0x8f,0x22,0x0c,0x3b,0x98,0xc2,0x84,0x69,0x0f,0xd4,0xf6,0xca,0x80,0x21,0x0c,0x0b,0x4a,0xea,0x94,0xf5,0x11,0x0d,0x59,0xff,0xa2,0xc8,0x4f,0x52,0x33,0xb5,0xb0,0x9c,0x45,0xb0,0x3e,0x1d,0xe4,0xcb,0x2e,0xb7,0x60,0x02,0x88,0xa0,0xde,0x53,0xf3,0x01,0x15,0x96,0xce,0x07,0x5c,0xcf,0xca,0xfc,0xb0,0x20,0x2e,0x59,0x7f,0xcc,0xac,0x47,0xd2,0x07,0x40,0x5b,0xef,0x75,0x02,0x19,0xbb,0x76,0x38,0x56,0x9b,0x63,0xf6,0xfa,0x22,0x63,0x0f,0x0d,0x6f,0x20,0x5f,0x4b,0xb0,0xf2,0x68,0xd6,0x61,0x27,0x67,0x82,0x0a,0x7a,0x58,0x31,0xff,0xc8,0xd1,0x38,0xec,0xdc,0x4c,0x0f,0x26,0x7a,0x36,0xdd,0xce,0x04,0x46,0xa0,0x24,0xb2,0x20,0x01,0xaa,0xb3,0x07,0xb7,0x8d,0x99,0xbf,0xca,0x43,0x28,0x09,0x00,0xb6,0x54,0x10,0x90,0xb1,0xb9,0xf6,0x17,0x59,0x37,0x4b,0xaa,0x20,0x16,0x44,0x17,0x3e,0x17,0xca,0x1f,0x7a,0xf0,0x0b,0x0c,0xb1,0x48,0x93,0x02,0xa2,0xe4,0x9e,0x94,0x36,0x35,0x11,0x88,0xa4,0x2d,0x2d,0x39,0x4e,0x98,0x0f,0x33,0xe3,0x5a,0x68,0x98,0x24,0x39,0x50,0x4e,0x1e,0x02,0xf9,0x91,0xc2,0x41,0x96,0x8c,0x81,0xdf,0x5d,0x7e,0x70,0x37,0x06,0x0a,0xbf,0x98,0x75,0xc5,0xd4,0x82,0x76,0x18,0x45,0x44,0x9c,0xd3,0x91,0x58,0x71,0x39,0xb2,0x61,0xc5,0x15,0xb4,0x53,0x4d,0xe4,0xcc,0x24,0x01,0xe3,0xd1,0x80,0x1d,0xf3,0xe5,0x83,0xcc,0x7c,0x68,0xe9,0xd5,0x31,0x19,0x0a,0x9b,0x15,0x85,0x71,0xc5,0x82,0x34,0xd3,0x1a,0x86,0x25,0x27,0x24,0xc2,0x98,0x18,0xa9,0xe8,0x22,0x6e,0x54,0xe3,0xfd,0x94,0x45,0xfa,0xa9,0x26,0x3c,0x57,0x3f,0x75,0xf5,0x1d,0x73,0xa2,0x6d,0xb7,0x18,0x35,0xd9,0x8a,0x84,0xe5,0x6a,0x80,0x61,0x5f,0x0a,0xc2,0xd7,0xe5,0xaf,0xdb,0x13,0x13,0x31,0xfe,0x6d,0xdd,0x19,0x4c,0x0d,0x22,0x13,0x15,0xad,0x2f,0xbe,0xf2,0xd6,0x76,0x7e,0x72,0xa8,0x2b,0x52,0x84,0xe0,0x4e,0x23,0xd6,0xa5,0x48,0x5d,0x13,0xa1,0xba,0x4a,0x0e,0x14,0x80,0x39,0x78,0xb5,0x1c,0x49,0xe5,0x14,0xac,0x5f,0x86,0x97,0x48,0x17,0xb0,0xdd,0xa7,0x85,0x56,0xbb,0xa9,0x23,0xf0,0xa0,0x0d,0x64,0x58,0x98,0x2f,0x90,0x32,0x18,0xd1,0xef,0xd7,0x1b,0xf1,0xcd,0xbb,0x81,0x68,0x13,0x70,0x6f,0x18,0x96,0x52,0xbb,0x99,0x61,0xc5,0x44,0x2d,0x47,0xda,0x54,0x58,0x9a,0x9f,0x22,0xea,0xbe,0x3c,0x63,0x16,0x59,0xdf,0x99,0xce,0xb7,0x0e,0xcb,0x48,0x1f,0x01,0x70,0x96,0xa1,0x1e,0x40,0x93,0xca,0x0f,0xee,0x31,0x39,0x78,0x9d,0x05,0x19,0x71,0xc7,0x63,0x90,0x94,0xae,0x2b,0x35,0xa1,0xd2,0xed,0x2d,0x52,0x25,0x19,0xe2,0x0a,0x05,0x3a,0x1d,0x9e,0xf1,0x48,0xf0,0x7e,0x93,0xf9,0x08,0x33,0x10,0xc2,0xa8,0x6b,0x19,0x36,0x77,0x87,0x6b,0x18,0x9e,0x45,0xc2,0xd2,0xcb,0x14,0xda,0xca,0x5a,0xe5,0x81,0x92,0xfa,0x41,0xd0,0x46,0xea,0xf4,0xd3,0x88,0x69,0x44,0xb8,0x03,0xc0,0xce,0x47,0x38,0x67,0x0a,0x1a,0x48,0x18,0x56,0xe4,0x7a,0x02,0x82,0xb5,0xf8,0xd0,0xc8,0x51,0x1a,0x77,0xb1,0xe8,0xa4,0xc2,0x0c,0xb3,0x5b,0x91,0x38,0x46,0xaf,0x2f,0x15,0xf5,0x1a,0xb4,0x82,0x6e,0xb0,0x02,0xba,0x8c,0x74,0xe3,0x30,0xe6,0xbf,0x64,0xfc,0xd2,0x24,0x0c,0x84,0x06,0x4c,0xa6,0x7c,0xd8,0x4a,0x32,0x36,0x79,0xc7,0x61,0xc8,0x12,0x0e,0x64,0x3a,0x8d,0xd1,0xad,0x3d,0x3a,0x8c,0x70,0xfe,0xae,0x88,0x24,0x50,0xe5,0x19,0x83,0x70,0x44,0x12,0xd3,0x03,0x52,0x7a,0xde,0x62,0xc4,0x68,0xae,0xa1,0x06,0xea,0x70,0x1e,0x1d,0x70,0x22,0x6c,0x62,0xa4,0x3f,0x78,0xcf,0x4a,0x57,0xc8,0x44,0xf9,0x61,0x16,0x85,0xa5,0x52,0x8f,0xa4,0x4f,0xa7,0xc1,0x51,0x86,0x7a,0xcd,0x1c,0xe4,0x2e,0xbf,0xe0,0x39,0x23,0x8d,0xee,0xba,0x32,0xca,0x21,0x12,0x8f,0x11,0x46,0x60,0x78,0xa5,0x9c,0x50,0x44,0xde,0xcf,0x13,0x17,0x0b,0xe3,0x32,0x85,0xd0,0x20,0x7e,0xdd,0x22,0x1a,0xc8,0x07,0x58,0x58,0x1e,0xae,0xb0,0x81,0xd4,0xb4,0xbb,0xd3,0x6a,0xbe,0xc7,0x80,0x94,0xc7,0x23,0xfd,0x54,0x65,0x45,0x6a,0x13,0xd2,0xeb,0x27,0xcc,0xa0,0x19,0x8e,0x19,0x77,0x42,0x3e,0x12,0xd4,0x0f,0xce,0x72,0x72,0x85,0xad,0xeb,0xda,0x9a,0x54,0xac,0x5d,0xb8,0x24,0xa9,0xb5,0xab,0xa2,0xf6,0xc4,0x9a,0x51,0x41,0xbb,0x06,0x41,0xdd,0x90,0x8c,0x3c,0x74,0xb8,0xfc,0x9b,0x8f,0x3e,0x64,0x5f,0x06,0xe0,0xee,0x43,0x7b,0xb0,0x63,0xd3,0x48,0xfc,0x99,0xa4,0xb7,0x0b,0xe5,0xe3,0xa4,0x8e,0x9a,0x36,0xa0,0x39,0xae,0x25,0xa6,0xc9,0xa5,0x42,0x74,0xab,0x0d,0x93,0xe1,0xda,0xbe,0xe4,0x4a,0x4c,0x5a,0xb8,0xb1,0x91,0x3c,0x5b,0xcc,0x8e,0xc2,0x4e,0x4e,0x8b,0x0b,0x09,0xe9,0xb3,0x2f,0xdb,0xf7,0xe3,0x37,0x33,0xc6,0x51,0xe7,0x56,0x6a,0x70,0x8d,0xc6,0x65,0x97,0x6d,0xae,0x06,0x92,0x23,0xec,0x34,0xa4,0x8d,0x1d,0xd9,0x2e,0xd7,0x0f,0x3e,0xad,0x7e,0xea,0x69,0x74,0xb2,0xe4,0x43,0x4d,0x5a,0xea,0xa6,0x2f,0x7c,0x60,0x7a,0x7e,0x11,0x8f,0x3c,0x73,0x54,0x5d,0xce,0xae,0x55,0x4a,0x43,0x47,0xd9,0x22,0x31,0x72,0x33,0x6f,0xda,0x25,0xe8,0xda,0x98,0x64,0x78,0x79,0x06,0x9c,0xce,0xc0,0x2e,0xf5,0x84,0x05,0xdc,0x0e,0x11,0x6f,0x6b,0xa2,0x0d,0x75,0x63,0x3f,0x72,0xff,0xed,0x78,0xd3,0x2d,0xd7,0xb5,0x24,0x96,0x12,0x25,0x4a,0xac,0x5f,0xbc,0x74,0xe6,0x12,0x1e,0x79,0xf6,0x15,0xeb,0xaa,0xa5,0x6d,0xca,0x89,0xc2,0x7c,0x0f,0x35,0x1b,0x79,0x66,0x15,0x75,0x77,0x4b,0xc4,0x1e,0x25,0x2e,0x70,0x74,0x1a,0xb1,0x85,0x1b,0xf5,0x37,0xc1,0x8a,0xb9,0x8d,0xd9,0x30,0xe7,0x56,0xad,0x8b,0x56,0xed,0xc7,0xec,0xfa,0x09,0x52,0x89,0x12,0x25,0xba,0x15,0xbe,0x2f,0xc2,0x6d,0x4e,0x00,0x5a,0x29,0x70,0x75,0x64,0xa4,0xaa,0xab,0x5d,0xeb,0x6e,0x89,0xd8,0x6b,0xe9,0x1a,0x62,0x43,0x48,0x22,0x5e,0x8a,0x5f,0x72,0x3d,0xde,0x02,0x34,0xa2,0xf8,0xcb,0x8d,0x6e,0xab,0x86,0x12,0x25,0x4a,0xac,0x7d,0x10,0x02,0xa3,0xaf,0x08,0xda,0xc0,0x47,0x6d,0x1f,0xd2,0x9c,0x11,0xda,0xcb,0x00,0xdd,0x45,0xc4,0x1e,0xba,0xc6,0x13,0x56,0x92,0xea,0xc0,0xa1,0x66,0xee,0x00,0xe9,0x16,0x8e,0xac,0xa2,0x73,0xb7,0x54,0x4f,0x89,0x12,0x25,0xd6,0x1e,0xb2,0x8e,0xef,0x2d,0xd0,0xd4,0xb6,0x59,0x4e,0x0a,0xe1,0x1c,0x5b,0xbb,0x53,0x35,0xed,0x75,0x5e,0x00,0xce,0x50,0x30,0x6d,0x52,0x33,0xb7,0xb4,0xc1,0x64,0x0e,0x30,0x4a,0xfd,0x2b,0x35,0x5f,0x9e,0x65,0x5b,0xa2,0x44,0x89,0x12,0x39,0xb0,0xb4,0x52,0x03,0xc5,0xb6,0xdd,0x25,0x0c,0x44,0xf6,0x71,0xc6,0x2d,0x92,0x40,0xda,0x4a,0x37,0x91,0xc8,0x34,0xaf,0xd8,0x96,0xd3,0x9d,0x25,0x62,0x76,0xe7,0xbf,0xfc,0xfd,0x8e,0x53,0x70,0x22,0xda,0x54,0x36,0x2d,0x69,0x6b,0x99,0x26,0x0b,0x8d,0x65,0x90,0x78,0x33,0x33,0x91,0x02,0x0a,0xb5,0xd5,0xeb,0xed,0xdd,0x31,0x39,0x2d,0xb1,0xde,0xd0,0xf5,0xed,0xb6,0xb9,0x04,0x32,0xd1,0x68,0x02,0x32,0xc4,0xdb,0x82,0x3e,0xd9,0x36,0xe2,0xe9,0x56,0x33,0x27,0x74,0x64,0x1f,0x70,0x06,0x89,0xb7,0xcd,0x03,0x70,0x21,0x0d,0xa1,0xa1,0x4a,0xee,0x44,0xc3,0x77,0xc4,0xd9,0x6c,0x03,0x2d,0x34,0x8d,0x25,0xfb,0x96,0x68,0x11,0x38,0x50,0xe8,0x68,0x6c,0x07,0x95,0x37,0xe8,0x82,0x9b,0xba,0x73,0x62,0x5e,0x54,0x76,0xbb,0x53,0x83,0x9b,0x0d,0xb6,0xf0,0x1b,0x41,0x67,0x33,0xe6,0xb5,0x77,0x7a,0xe0,0xca,0x6c,0x0b,0x1b,0x4d,0xc7,0x91,0xa7,0x32,0x13,0x32,0x9d,0x5a,0x16,0x5d,0xd2,0x0b,0x0a,0xad,0xaf,0x75,0x53,0xf9,0x25,0x4a,0xa4,0xa3,0xb0,0xa6,0xde,0x6a,0xe6,0x5f,0xcf,0x63,0x34,0x10,0xcd,0x8c,0x40,0x3b,0xc7,0xd5,0x36,0x39,0xe2,0xc8,0xb0,0xa5,0xa8,0x85,0x79,0x2e,0x34,0xe8,0xba,0xc5,0x95,0xcd,0xe7,0xa5,0x80,0xc8,0x91,0xb0,0xa4,0x07,0x85,0xf3,0x6b,0x43,0x41,0xe5,0x7f,0xa8,0x44,0x89,0x12,0xb9,0x90,0xa1,0x93,0x16,0xda,0x8f,0x93,0x02,0x13,0xb1,0x9f,0x3c,0x73,0x9f,0xaf,0x93,0xc0,0x82,0x86,0x8e,0x96,0xb3,0x92,0x33,0x82,0xf6,0x6f,0x5d,0x6a,0x83,0x15,0xb4,0xcb,0x4d,0x98,0xc3,0xb2,0xb9,0x05,0x25,0x5e,0x18,0x8d,0xd4,0x4d,0x5b,0xfd,0x9d,0xc1,0x02,0x94,0x63,0x17,0xbb,0x5d,0xf1,0x39,0x89,0x36,0x2d,0xe3,0x99,0xd6,0x89,0xba,0x64,0x7a,0x5b,0xce,0x03,0x4a,0x14,0x81,0x2e,0x69,0xce,0xf5,0x51,0x27,0xa1,0xb6,0xa0,0xe6,0x42,0x6a,0x9f,0x49,0x1e,0xeb,0x85,0x69,0x85,0x25,0x00,0xde,0xa8,0x87,0xb1,0x82,0xbc,0x42,0xb6,0xcd,0x75,0x7f,0x5d,0xb5,0x74,0x6b,0x07,0xa1,0x36,0x5b,0x41,0x3b,0xc4,0xfb,0x16,0x96,0x6e,0x61,0x41,0x17,0x50,0x46,0xd2,0xaf,0x73,0x96,0x27,0xeb,0x34,0xfc,0x2c,0x69,0x59,0x33,0x03,0x4e,0x02,0x5a,0x38,0x29,0x2b,0xb1,0x81,0xd1,0xf5,0xed,0x29,0x61,0x49,0x4e,0xa3,0x5d,0x7d,0x9f,0x0a,0x2a,0xaa,0x82,0xca,0xbb,0xa5,0x14,0x15,0x0b,0xbc,0xbd,0x8d,0xa4,0x03,0xe7,0x01,0xeb,0x23,0xe1,0x5a,0x17,0x43,0x21,0x3e,0x5f,0x52,0x5f,0xb6,0x67,0x45,0xee,0x87,0x89,0x35,0x22,0xae,0x92,0xf3,0xab,0x13,0x89,0x65,0x98,0x56,0xb8,0x9d,0x54,0x35,0x74,0xaf,0xc1,0x7d,0x89,0x0d,0x80,0xcc,0xed,0x34,0xe3,0xe0,0xd4,0xee,0xa1,0x33,0xe9,0x2c,0x6a,0x4a,0xf8,0x1e,0xbc,0x97,0x16,0xa8,0x23,0x13,0x2c,0x1a,0x0c,0xa3,0x06,0xd5,0xd3,0xc5,0xb8,0x9f,0x76,0x06,0x57,0x18,0xea,0x92,0x45,0x6b,0x2b,0xd9,0x2b,0x3e,0x57,0x19,0xf7,0xf5,0xb6,0xa0,0x34,0x0b,0xe1,0xf4,0x4c,0xe9,0x72,0x57,0x4a,0xec,0xa0,0x91,0x3c,0x61,0xa5,0x3d,0xeb,0xcc,0x18,0x4f,0x79,0xa7,0xc9,0xc2,0x4d,0x2c,0xc8,0x46,0x0c,0xc5,0xd6,0x16,0xba,0xcb,0x4f,0xce,0xfa,0xc0,0xc6,0x9b,0x76,0x25,0x10,0x56,0xcb,0x0a,0x22,0xa1,0x03,0xba,0xce,0x82,0xd0,0xc8,0xd1,0xd0,0x23,0x42,0x1a,0x35,0xd8,0x47,0x0a,0x70,0x44,0xd5,0x72,0x67,0x9a,0xce,0x80,0x5b,0x6b,0x25,0x5d,0xb0,0x2f,0xe8,0x3a,0x56,0xce,0x2d,0x2a,0xc1,0xa6,0x83,0xcd,0x25,0xed,0x5a,0xaf,0xda,0x52,0x6e,0x2c,0xac,0x9c,0x9d,0x31,0xf3,0x61,0x31,0x0d,0xd6,0x5b,0xa3,0x87,0xc7,0xb4,0x18,0xdd,0x42,0x7c,0x1b,0x8f,0x2c,0x36,0x26,0x5a,0x5b,0xcf,0x4d,0x8c,0xa9,0xad,0x4c,0x58,0x9a,0xa4,0x9c,0x63,0xd2,0x9d,0x4f,0x3a,0x6e,0x9d,0x54,0xdc,0x3e,0x22,0x6e,0x9d,0x95,0xb4,0x87,0xc2,0xac,0xa0,0x5d,0x25,0xab,0xc2,0x6e,0x91,0x0b,0xc9,0xa6,0x07,0xed,0xc4,0xac,0xa7,0x9b,0x00,0x44,0xf6,0xdb,0x39,0xf3,0xe4,0x78,0x3f,0xab,0xd1,0x04,0xb9,0x2e,0xe6,0x44,0xac,0x60,0xea,0xa5,0xb7,0x19,0x64,0x33,0xd7,0x28,0x51,0xa2,0x9b,0xd0,0x6c,0x9b,0x0d,0xbb,0x51,0x2b,0xd5,0x3f,0xd6,0x38,0xd0,0x74,0xdf,0xcd,0xb1,0x9d,0xc8,0x39,0x04,0xb9,0xc8,0x38,0xbc,0x56,0xdf,0x11,0x48,0x42,0x64,0x0d,0x0e,0x77,0x2d,0x97,0x88,0x63,0xc9,0x35,0xad,0xa4,0x8b,0x19,0xf5,0x0a,0x50,0x41,0xd7,0x99,0x4a,0x31,0xb4,0xac,0x8d,0x36,0x94,0xf4,0xc4,0x97,0xea,0xb4,0x02,0x53,0xd2,0x75,0xe6,0xc7,0xf1,0x7e,0x16,0xd5,0x4f,0xc3,0xde,0x6b,0xec,0x28,0x8b,0x24,0xd9,0x7c,0x69,0x2a,0xa5,0xc6,0x12,0x1b,0x17,0x05,0xec,0xf5,0x6f,0xe8,0x79,0x23,0xde,0xcc,0xc1,0xba,0xd2,0x9a,0x20,0xa1,0x9a,0xae,0x29,0x83,0x31,0xab,0x8e,0x60,0x12,0x19,0x83,0x5c,0x71,0x25,0xbc,0xef,0x8c,0xab,0x4b,0x10,0x19,0xdc,0xcc,0xb5,0xd3,0x62,0x0e,0x77,0xf0,0x9a,0x3b,0xc1,0xdd,0x25,0xf5,0x92,0xf3,0x67,0xc7,0x91,0x98,0x8e,0x34,0x47,0xd3,0x54,0x27,0x1f,0x8e,0xed,0x47,0xf5,0x48,0x37,0xd6,0x30,0x33,0xf6,0x9e,0x48,0x3d,0xd7,0x91,0xaa,0xeb,0xa2,0xc1,0x99,0x6a,0xe1,0xf1,0x74,0x36,0xb8,0x12,0xeb,0x14,0x6b,0xd6,0x31,0x4c,0x9e,0xb8,0x5c,0xcf,0x1a,0x1d,0xa4,0xa1,0x71,0x37,0x81,0x8c,0xeb,0xaa,0x8d,0x5d,0x91,0xf9,0xc6,0xad,0x34,0x92,0x22,0xf7,0xcf,0xae,0x26,0x62,0xf3,0x02,0xa1,0x99,0xc4,0x7a,0xc5,0x9c,0x37,0xeb,0x90,0x7a,0x0b,0x44,0x53,0xc1,0x25,0x4e,0x30,0x92,0x99,0x35,0xe6,0xbf,0x3c,0x2d,0x35,0xae,0xf0,0x63,0xef,0x37,0x70,0x82,0x70,0x73,0x99,0x06,0xc0,0x52,0x82,0x68,0x64,0x50,0xc9,0xc1,0x7e,0xc1,0xa3,0xc5,0x0f,0x5e,0x5d,0x7b,0x7c,0x75,0x89,0xae,0x00,0xe3,0x68,0xdd,0x44,0x2d,0x73,0xdb,0x2b,0xae,0x91,0x52,0xe4,0x5b,0xbd,0x41,0xc1,0x61,0x6f,0x13,0x0f,0x28,0x3b,0x4c,0xab,0xeb,0x24,0x83,0x2e,0xc6,0xac,0xc8,0xac,0x07,0x58,0x78,0x2d,0xc9,0x88,0xdb,0xf9,0x5e,0x40,0xc4,0x8d,0x0f,0x84,0x85,0xca,0x7e,0x31,0xc3,0x61,0x97,0x34,0x9c,0x1f,0x4d,0x4a,0xc0,0x76,0x42,0xe2,0x3f,0x9b,0x45,0xc3,0xc5,0xdf,0x0c,0xf1,0xc6,0x6e,0x39,0x1a,0x98,0x1d,0x7e,0xec,0x91,0x1c,0xe6,0xd0,0x99,0x0d,0xaf,0x5c,0x0f,0x25,0x11,0x6d,0x9e,0x4a,0xa8,0x53,0xca,0x0c,0xc8,0x3a,0xa8,0x10,0x21,0x7e,0xb2,0x4a,0x17,0xa0,0xe5,0x13,0xea,0x6e,0x9b,0xb1,0xb7,0x02,0x6d,0xd0,0x66,0x35,0x1b,0x05,0xb5,0xb8,0xed,0xe5,0xe2,0x83,0xba,0x99,0xa9,0x9f,0xdb,0x68,0x74,0x94,0xf0,0xad,0xc1,0xc6,0x97,0xab,0xb0,0x13,0x08,0x52,0x8f,0x83,0xce,0x82,0x21,0xe7,0xaf,0x7c,0x44,0x9c,0x16,0x7e,0x3a,0x5a,0xb2,0xd9,0x26,0x51,0x12,0x6e,0x0c,0x9e,0x68,0x58,0xa4,0xb0,0x2c,0xab,0x0a,0x56,0x39,0x37,0x6c,0xb7,0xe5,0xcc,0x8f,0x39,0x25,0x8e,0x86,0x28,0x80,0x94,0xb4,0x5b,0x37,0x5a,0x45,0xba,0x39,0xc8,0x36,0x3e,0xb9,0xcf,0xaa,0xc3,0x48,0x68,0xc0,0xc6,0x0c,0x35,0x31,0xda,0x16,0x0e,0xbc,0x69,0xfd,0xaa,0x18,0xed,0x8c,0x0e,0x2b,0x16,0x73,0x61,0x61,0x27,0x44,0x50,0x22,0x33,0x5a,0x5b,0x78,0x89,0xba,0x20,0xca,0x1f,0x73,0x6e,0x79,0xa5,0x5e,0x33,0x4b,0x0c,0x2f,0x4f,0x44,0xf2,0x59,0x11,0xf9,0x9d,0xb3,0x7d,0x37,0x4b,0xc6,0x66,0xc1,0xc4,0x3a,0x75,0x42,0xe0,0x94,0xa6,0xac,0x48,0x50,0x87,0xb3,0xc6,0xd4,0x1b,0x85,0x2b,0xce,0x52,0x2d,0xa5,0xb3,0xa3,0x41,0x2b,0x68,0x6b,0x7b,0x11,0x77,0x25,0xa8,0x31,0x34,0xac,0x3d,0x72,0xe6,0x23,0xd9,0xa5,0x92,0x48,0xe4,0x64,0xeb,0x86,0x2b,0xdc,0xc8,0xec,0x20,0x99,0xdc,0x23,0xc8,0xad,0x12,0x92,0xe6,0xee,0xd1,0xf2,0xa8,0xf7,0x52,0x4e,0x92,0x2d,0x82,0x5c,0x99,0x9e,0x69,0x36,0x26,0x71,0x77,0xee,0x3c,0xea,0x92,0x31,0x37,0x0a,0xb2,0xb5,0xcd,0x06,0x72,0x0d,0xd6,0x0d,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x98,0xb5,0xa8,0x60,0x93,0xb8,0xd2,0xf9,0x6e,0x72,0x80,0xae,0xb1,0x42,0x04,0xff,0xe7,0x1c,0x59,0x33,0x17,0x47,0x1d,0xe3,0x54,0x9e,0x6e,0xf3,0xa2,0x7f,0xa5,0x9f,0xb0,0xea,0xf0,0xc1,0x19,0x0b,0x37,0x1d,0x2d,0x71,0xae,0x17,0x0b,0x2c,0x7f,0xe8,0x0d,0x58,0x41,0x5b,0x19,0x2f,0xd8,0xca,0x39,0x77,0x50,0x89,0x12,0x7c,0x42,0x05,0x25,0xda,0x5c,0xd9,0x26,0xff,0xd6,0x03,0x91,0x65,0xdc,0x8c,0x95,0x9f,0x91,0x9b,0xd3,0x5e,0x4e,0x2e,0x0f,0x47,0xaf,0x4d,0xd2,0x02,0x35,0xb4,0xfe,0xa3,0x5f,0xae,0xf3,0x10,0x19,0xdf,0xbb,0x16,0xdd,0x9c,0xb6,0x12,0x6e,0xb4,0x7b,0x82,0xd4,0x4c,0x1b,0xc9,0xd3,0x4f,0x72,0xbe,0xee,0xb2,0x27,0xc9,0x49,0xcc,0x6e,0x27,0xf4,0x39,0x08,0x2c,0x75,0x50,0x4e,0xb0,0x6c,0xd6,0xc9,0xf1,0xb5,0xe7,0x43,0x6e,0x3d,0xef,0x26,0x62,0x77,0x36,0x1c,0x2e,0x3a,0x63,0xe1,0x76,0x08,0x31,0xe1,0x2d,0x1f,0x83,0x79,0xf9,0xb9,0x33,0x65,0xa1,0xbf,0x41,0x34,0x5c,0x84,0xa9,0xed,0xde,0xaa,0xe0,0xc4,0xb4,0x5a,0x0d,0x22,0x8d,0x78,0xb3,0xcc,0xa3,0x32,0x67,0xc6,0x25,0xe1,0xa6,0xc1,0x9e,0xf8,0xb8,0xd4,0x40,0x99,0x03,0x83,0x60,0x22,0x25,0xee,0xac,0xa9,0x6a,0x98,0xd9,0xdb,0x8c,0x56,0x0e,0xe6,0xd1,0x65,0x0a,0x7f,0x65,0x09,0x95,0x9e,0xbe,0x16,0xc6,0xd7,0x79,0x44,0xf3,0xd8,0x22,0xb7,0x76,0x1d,0x41,0xab,0xf2,0x41,0x89,0x76,0x14,0x81,0x04,0x98,0xe4,0xd0,0xa2,0x9e,0x29,0x4b,0xe2,0x73,0xf5,0x46,0x76,0x61,0xfd,0x9f,0xd2,0xe7,0x73,0x9f,0x8c,0x20,0xe2,0xcb,0x7a,0x94,0x44,0x98,0xee,0xf1,0x96,0x67,0xad,0x0a,0x12,0x0d,0x0f,0x29,0x85,0xc8,0x8d,0x4d,0x36,0x7f,0x2f,0xbb,0x59,0xa9,0x51,0x70,0x05,0xae,0xf7,0x36,0x44,0xbe,0x75,0xd7,0x79,0x43,0x88,0xba,0x69,0x75,0x6c,0x1f,0x4a,0x5c,0x9f,0x4d,0x28,0xab,0x9c,0x46,0xce,0x61,0x4a,0x33,0x4a,0xef,0xf6,0x41,0xe2,0x19,0xab,0x4c,0x28,0xbd,0x4e,0xbc,0x64,0x78,0x9d,0x06,0x9e,0x25,0x82,0x46,0xa7,0x4d,0x05,0x0f,0x72,0x1d,0x16,0x6e,0xf5,0xde,0x47,0x12,0x3e,0xa6,0x9e,0x7b,0x0c,0x97,0x0f,0x7f,0x0d,0x7b,0xdf,0xf1,0x53,0xe8,0x1b,0xdf,0xde,0xd9,0x84,0xb5,0x08,0x62,0x75,0x19,0xc7,0x3e,0xf5,0x27,0xe8,0xdb,0xbc,0x1d,0x93,0xf7,0x7e,0x1f,0xbc,0x81,0x11,0x00,0x6a,0x9d,0xb5,0x09,0x7b,0xa0,0x86,0xd0,0x35,0xbc,0xdf,0xf8,0x50,0x1e,0x1d,0x0b,0x92,0xd4,0xb3,0x0d,0x68,0xdc,0x9c,0xc9,0x8a,0xa7,0xd3,0x8c,0x3f,0xbf,0xf6,0xb1,0x81,0xe7,0x03,0x22,0x4e,0x7f,0x34,0x9c,0x98,0xd4,0x7b,0xc2,0x48,0x47,0x4e,0x69,0x38,0xbf,0xbc,0x5a,0x07,0x59,0xb8,0xc2,0x42,0x46,0x2b,0x68,0x43,0xcf,0x5c,0xf0,0x84,0x37,0x57,0x01,0x38,0xd3,0x9a,0xa0,0x53,0x4e,0x24,0x5e,0x73,0xaf,0x5c,0xda,0x3b,0x19,0x2a,0xb3,0xc1,0x89,0x48,0xdd,0x3c,0x33,0xab,0x71,0x65,0xb1,0xec,0x74,0x35,0xe8,0xc4,0xed,0xc2,0xf5,0x52,0x50,0xf0,0x91,0x85,0xae,0xf9,0x44,0x6a,0xd0,0x5d,0xbc,0xd7,0x48,0x91,0x0c,0x11,0x81,0x29,0x2b,0x9e,0xb9,0x33,0x47,0x71,0xe1,0xc9,0x87,0xb1,0x3a,0x37,0x0d,0x00,0x38,0xf7,0xcd,0x4f,0x61,0xdf,0xf7,0xfd,0x0c,0x58,0xa7,0xd5,0x63,0x2d,0xc0,0xc5,0xef,0x7c,0x1e,0xb5,0x85,0x59,0xcc,0x2d,0xcc,0xe2,0xd8,0x27,0x4f,0x60,0xcb,0xed,0x0f,0x60,0xd3,0x0d,0xaf,0x53,0xae,0xc9,0xb9,0xb2,0xbf,0xe9,0x52,0xa9,0xb8,0xce,0xba,0xa1,0x48,0xfc,0x51,0x14,0x1a,0x0b,0xd4,0x49,0x8d,0xae,0xe2,0x75,0x8d,0x13,0xb9,0x8d,0x3d,0x1b,0x40,0xa6,0x70,0xad,0x31,0x2d,0x22,0xf0,0x24,0x8b,0xd8,0xa2,0x6e,0xf8,0xc6,0x4d,0x6d,0x02,0xdf,0xc4,0xd6,0xa5,0xa6,0x41,0x89,0x3f,0x9c,0xa8,0x23,0x01,0x3b,0x2c,0x9d,0x3b,0xd5,0xaf,0x62,0xe9,0x4c,0xb1,0x93,0x76,0xa6,0xd3,0x20,0xea,0x24,0x6b,0x66,0xb2,0x9e,0x73,0xa1,0xb0,0x06,0xed,0xd0,0x28,0xe8,0x30,0xeb,0x2e,0x29,0x39,0xca,0xa2,0xd0,0x7a,0x49,0x69,0x13,0x56,0xdb,0x0e,0x72,0x91,0x16,0x7f,0xab,0xb7,0x25,0xb5,0xb1,0xbf,0x11,0x08,0x8c,0x00,0x12,0x02,0xcb,0x73,0xd7,0x70,0xe9,0xbb,0x5f,0xc4,0xdc,0x99,0x97,0x23,0xcf,0x2c,0x4d,0x5d,0xc0,0xd4,0x0b,0xdf,0xc1,0xe6,0x9b,0xee,0x6e,0x5f,0xc2,0xda,0x80,0x85,0x8b,0xa7,0x30,0xf5,0xca,0x53,0xc1,0x6f,0xb1,0xba,0x8c,0x0b,0x4f,0x3c,0x8c,0xe9,0xa3,0x4f,0x63,0xdb,0xeb,0xdf,0x8e,0x81,0x89,0x9d,0x20,0x2e,0xf7,0x85,0xb2,0x56,0x0f,0x82,0x8d,0xb4,0x77,0x3f,0x9d,0x00,0x73,0x4d,0x97,0x58,0x8a,0xa7,0xc2,0xb6,0xc1,0xb6,0x14,0xce,0xe0,0x8d,0x2f,0xaf,0x76,0x2f,0x2f,0xea,0x96,0x01,0xc5,0xbf,0x3a,0x89,0x33,0xc1,0x68,0xd4,0x09,0x87,0xc5,0x74,0x27,0x27,0xbf,0x39,0x96,0x03,0x3c,0xca,0x2a,0x6d,0x14,0x64,0xe9,0x9c,0xbb,0x5b,0x26,0x5a,0x37,0xc7,0xaf,0x93,0x93,0x93,0xcd,0x8b,0x59,0xd6,0x77,0x13,0x32,0xa9,0x49,0x3d,0xb5,0x11,0xd4,0xf3,0x8b,0x6c,0xdc,0xad,0xeb,0xda,0x52,0xa5,0x46,0xad,0xf5,0xb2,0xe8,0x45,0x47,0xdc,0x2e,0xe4,0x6c,0x84,0xb1,0x75,0xa5,0xfa,0x33,0x6f,0x77,0xcc,0x09,0x27,0x60,0xb5,0x0a,0x2d,0x1f,0xf8,0x94,0x9d,0x37,0x11,0x20,0x08,0xc2,0x5f,0xc5,0xd5,0x17,0x1e,0xc3,0xd4,0xf3,0xdf,0x02,0xf9,0x35,0xe7,0x1b,0x97,0x0e,0x7f,0x05,0x83,0xbb,0x6f,0x44,0x75,0x70,0xb4,0xd5,0x89,0x6b,0x0b,0x48,0xf8,0x38,0xf7,0xf8,0x43,0x4e,0x2d,0xd4,0xf2,0xf4,0x45,0x9c,0xfc,0xc2,0x7f,0xc3,0xf0,0x75,0xb7,0x61,0xcb,0x1d,0x0f,0xc2,0xeb,0x1b,0x92,0xd6,0xf1,0x81,0x93,0x86,0x2e,0x94,0x86,0xeb,0xc1,0x99,0x64,0x87,0xda,0x33,0x0b,0x4c,0x32,0x68,0xa8,0x28,0xb2,0x92,0x63,0x38,0xd3,0x25,0xf5,0x5f,0x6c,0x0b,0x56,0xa6,0xa5,0xb6,0xe4,0x44,0x86,0xb6,0xd5,0x29,0x63,0x4b,0xa6,0x2a,0x77,0xad,0x13,0xeb,0x7b,0xe9,0x8b,0xce,0xc9,0xa7,0xbc,0x36,0x6f,0x2d,0x5d,0x58,0x4b,0xcd,0xa8,0x4e,0x49,0xb1,0x82,0xb6,0x24,0xb4,0x02,0x26,0x48,0xb9,0xc7,0xe0,0x44,0xa9,0xd7,0x7a,0xcc,0x29,0xb4,0xa6,0x2c,0x88,0x24,0x6e,0x23,0xb2,0x60,0x36,0x90,0x94,0x9a,0x61,0x29,0x69,0x8b,0x92,0x6e,0xfd,0xf0,0x48,0x19,0x6c,0xe8,0x47,0x59,0xba,0x5b,0x2e,0x03,0x19,0x1b,0x5a,0xa4,0xd3,0x39,0x66,0x8e,0x59,0xc2,0x6f,0x84,0x4c,0xd7,0xe0,0x18,0x1c,0x42,0x91,0x2f,0x09,0xcc,0x9d,0x7b,0x15,0x97,0xbe,0xfb,0x05,0xac,0xce,0x5e,0x4d,0x7d,0x43,0xd4,0x56,0x71,0xe1,0xf1,0x87,0xb0,0xeb,0xcd,0x3f,0xd6,0xa6,0x34,0xb6,0x16,0x57,0x8f,0x3c,0x8a,0x95,0x6b,0x97,0x53,0x9f,0x99,0x7d,0xf5,0x19,0xcc,0x9f,0x79,0x19,0xe3,0xb7,0xbe,0x09,0x9b,0xae,0x7f,0x2d,0xa8,0xc2,0x3b,0xaa,0x0d,0x2c,0x1e,0x75,0xfa,0x58,0x92,0x44,0x59,0xcf,0xce,0xa6,0x2e,0x41,0x67,0xf0,0xe1,0x2c,0x03,0x72,0x7c,0xa3,0xf0,0x7f,0x9b,0x90,0x93,0xa4,0x63,0x4a,0x64,0xe6,0xc8,0x58,0x97,0xd8,0xa5,0x83,0x35,0xd9,0xb4,0x87,0x1c,0x06,0xad,0xc2,0xfc,0x92,0x6c,0x35,0x1d,0x04,0x9f,0xb8,0xbc,0x68,0x84,0xe9,0x8b,0x5c,0xd2,0x70,0xa1,0xd3,0xc5,0xc8,0x84,0xc2,0xdd,0x06,0xbc,0xe4,0xc8,0xb2,0x2d,0x96,0x67,0x41,0xee,0xa5,0xd2,0x8c,0xaa,0x86,0x88,0xc6,0x38,0x02,0x33,0xc3,0x0e,0xe2,0x8d,0xfc,0x70,0x14,0x4c,0x4e,0x69,0x37,0xfe,0x98,0x49,0x56,0x14,0x3e,0x94,0x44,0xba,0x4c,0x58,0xd9,0xe0,0xc6,0xa3,0x69,0xeb,0xde,0x76,0x9a,0x1c,0x8f,0x10,0x59,0xd2,0xb3,0x3b,0x0d,0xc1,0x0b,0x89,0xf5,0x5d,0x90,0x94,0xbd,0xe6,0xc0,0x40,0x24,0x97,0x2d,0x66,0x4f,0xbf,0x8c,0x73,0xdf,0xf8,0xef,0x99,0xdf,0x9c,0x3f,0x77,0x0c,0x33,0x27,0x9e,0xc3,0xc8,0xde,0x9b,0x5b,0x98,0xbe,0xd6,0x63,0x65,0xe6,0x0a,0xae,0x1c,0xf9,0x46,0xa6,0x67,0xc5,0xca,0x12,0x2e,0x3d,0xf9,0x30,0x6a,0x0b,0x33,0xd8,0x72,0xc7,0xf7,0x80,0x58,0x8a,0x23,0x8c,0x35,0x8f,0x34,0x8d,0x5a,0x02,0x28,0xf6,0x05,0x2e,0xf7,0x5d,0xc1,0x5d,0x3d,0x83,0xc9,0x34,0x78,0xd6,0x79,0x88,0x89,0xc8,0x30,0x14,0x3b,0x4a,0xd0,0x25,0x1d,0x67,0x50,0x53,0x27,0x4a,0xc5,0x76,0x78,0xf5,0x0c,0x3f,0x23,0x43,0x72,0x60,0x86,0x95,0x18,0x3f,0xa9,0x30,0xeb,0x16,0x7b,0x46,0xc3,0xaf,0xd8,0x6b,0xf9,0x1e,0x8f,0x23,0x03,0x9b,0x3b,0xd6,0x80,0x2d,0x49,0xa7,0xc9,0x54,0xb4,0x5c,0xea,0xad,0xa7,0x2a,0x32,0x13,0x52,0x4f,0x2d,0x90,0xc1,0x2c,0x2e,0xcc,0x4f,0x4a,0x3a,0xf5,0xae,0xf2,0x34,0xd5,0x32,0x0f,0x49,0x37,0x7e,0xa6,0x66,0xbd,0x32,0x48,0x5a,0xc3,0x36,0x88,0x3c,0x6d,0x26,0xed,0xac,0x14,0x8a,0xfc,0x49,0x79,0xd0,0x42,0x52,0x26,0x29,0xe3,0xfb,0x75,0xd0,0x8a,0xb1,0x3b,0x6f,0x9b,0x26,0x02,0x91,0x40,0xff,0xb6,0xbd,0xe8,0x1d,0xdb,0x8a,0xe5,0xe9,0x8b,0x99,0x5f,0xbd,0xf4,0xe4,0xc3,0x18,0x9c,0xdc,0xb7,0xa6,0xb7,0x26,0x9d,0xff,0xf6,0x3f,0x83,0x44,0xf6,0x85,0x7c,0x5e,0xed,0xc5,0xc8,0xf5,0x77,0x00,0xc2,0x07,0xc0,0xb3,0x1b,0xc5,0x14,0x5d,0xd7,0x85,0x8a,0x32,0xad,0xdc,0x27,0x6c,0x3f,0x96,0xdc,0x8f,0xa5,0xd0,0xc1,0x33,0x06,0xeb,0xee,0x9b,0x61,0x4e,0x6a,0x41,0x30,0xa9,0x47,0x09,0xc6,0x64,0x95,0x68,0xb8,0xe6,0x98,0x58,0x37,0x49,0x59,0x4d,0x8f,0x8d,0xb2,0xc8,0xf2,0x68,0xb2,0x7b,0x4b,0x6b,0xd9,0xa0,0x13,0xd2,0x70,0xca,0x24,0xc6,0x23,0x61,0x4f,0x53,0xb4,0xee,0xbc,0xf9,0xd8,0x73,0x67,0x40,0xd8,0x4f,0xc7,0x75,0xdf,0x81,0xd6,0xd8,0xb9,0xce,0x8b,0xd8,0xf3,0x21,0x39,0x65,0x58,0xb3,0x48,0x19,0x63,0xea,0x4a,0xf1,0xe6,0xc2,0x44,0x42,0x38,0x64,0xa8,0x96,0x21,0xcc,0xb0,0xea,0x11,0xae,0x88,0xdf,0x16,0xb6,0xd4,0x6c,0xa6,0x8f,0xbb,0x83,0x89,0x6d,0xb9,0xaa,0xd7,0x18,0xb3,0x4a,0xdf,0xae,0xc7,0x1c,0xcf,0x35,0xe2,0xf6,0xaa,0x53,0xaa,0xeb,0x88,0xa6,0x4e,0xa9,0xa0,0x41,0xd8,0xfc,0x9a,0xb7,0xe0,0xfc,0x57,0x3e,0x2a,0xa5,0xe2,0x0c,0xa8,0x2d,0xcd,0xe3,0xd2,0x53,0x5f,0xc2,0xe4,0xdd,0xdf,0x97,0x2f,0xd2,0x96,0x20,0x7f,0x61,0x5e,0x3b,0x76,0x18,0x8b,0x17,0x4f,0xe5,0x7a,0x67,0xec,0x96,0xfb,0xc1,0x7b,0x07,0x20,0x18,0x81,0xe5,0xa9,0xf3,0x6e,0x59,0xa6,0xb0,0xdb,0x6e,0xe6,0x65,0x20,0xa0,0xb1,0x4c,0xd4,0x69,0x4b,0x31,0xe2,0x8b,0xab,0x63,0xc1,0x79,0x06,0xae,0x4a,0x7e,0x20,0xd8,0x4e,0x07,0x07,0x99,0xe9,0xf1,0x2c,0x87,0x01,0x6a,0xe2,0x6d,0x33,0xac,0x7a,0x12,0xb1,0x33,0x20,0xf7,0x58,0x4f,0xea,0xa7,0xbb,0xa6,0xcc,0x40,0x7c,0x80,0xe7,0xeb,0x67,0x85,0x34,0xcb,0x48,0xd1,0x87,0x21,0x1a,0xa7,0x21,0x59,0x25,0xd2,0xe4,0x9a,0x6f,0x3e,0xf2,0x4d,0x1a,0xe8,0xc9,0xfd,0x94,0xb0,0x9f,0x13,0xf6,0x13,0xc6,0x3a,0x6f,0x8a,0x55,0x73,0xaa,0xaa,0x59,0xce,0x7a,0xeb,0xaa,0x99,0xeb,0x32,0x73,0x9a,0xa4,0x1b,0x8f,0xd1,0x99,0x56,0x5b,0xd5,0xe2,0xdb,0xcf,0xc3,0x6a,0x79,0xb6,0x04,0x9e,0x14,0x6f,0x36,0x6d,0x43,0xf4,0x36,0xb5,0x66,0x9b,0x50,0x2c,0xea,0xe8,0x85,0xb6,0x2b,0x31,0x29,0xfe,0x9d,0x88,0xa1,0x3a,0x3c,0x81,0xe1,0xfd,0xaf,0xc1,0xcc,0xd1,0x27,0x33,0x07,0x75,0xed,0xd8,0x61,0x0c,0xef,0xb9,0x05,0x03,0xdb,0xf6,0xe4,0x88,0xb4,0xf3,0xf0,0x97,0x97,0x70,0xe9,0xe9,0x47,0x72,0xbd,0xd3,0x3b,0xbe,0x13,0xc3,0x7b,0x6e,0x91,0x3d,0xa7,0x8e,0xad,0x4e,0xab,0xe0,0x2e,0x45,0x91,0xfa,0xb3,0x10,0x68,0x83,0x9f,0x26,0x88,0x30,0xf3,0x73,0x31,0x92,0xb4,0xc8,0x28,0x65,0x00,0x4e,0xeb,0x4b,0xcc,0x88,0x37,0x32,0x99,0x77,0xc5,0x19,0xb9,0x96,0xa6,0x9e,0x76,0x68,0x10,0x32,0xad,0x13,0x1b,0x0f,0x06,0xc1,0xfb,0x48,0x9b,0x09,0x24,0xeb,0x2a,0x4c,0x6e,0x33,0x23,0xcf,0x86,0xe2,0x7b,0xa6,0x0c,0x51,0xa9,0xa0,0x2d,0x91,0xb2,0x89,0xd1,0xae,0x38,0x95,0xb3,0xb5,0x0a,0x1a,0x0b,0xb8,0x8e,0x45,0x93,0xd0,0xcf,0x24,0x14,0x1d,0x47,0x82,0xa4,0x6a,0x12,0xaf,0x4b,0x22,0xd7,0xef,0x27,0xcd,0xd0,0xe4,0x45,0x97,0x39,0x44,0xb4,0x91,0xa6,0x18,0x32,0xd8,0x84,0x9b,0x92,0x0c,0x24,0x3d,0x13,0x41,0x46,0xa2,0x65,0xc2,0x51,0x1f,0x06,0xea,0x69,0x21,0x83,0x74,0xc5,0xc3,0xaf,0xdb,0x2e,0x62,0xc5,0xe9,0xd0,0x7c,0x44,0xc0,0x9d,0x5f,0x8b,0x07,0x03,0xe9,0x36,0xc1,0x19,0x18,0xe7,0x18,0x3e,0xf8,0x7a,0x2c,0x9c,0x3f,0x86,0xda,0xfc,0x74,0xe6,0x50,0x2e,0x3e,0xf1,0x39,0xec,0x79,0xe7,0xcf,0x82,0xe5,0xb4,0xca,0xec,0x1c,0x18,0x2e,0x3e,0xf9,0x79,0xf8,0xcb,0x8b,0xd9,0xdf,0xa8,0x78,0xd8,0x74,0xfb,0xf7,0x84,0x12,0x24,0x63,0xaa,0xde,0x5a,0x60,0x09,0x9d,0xd1,0xca,0xd4,0x46,0xae,0x65,0xda,0xa4,0x08,0x93,0xb2,0x52,0x67,0x9b,0x93,0x4c,0x40,0xda,0x96,0xc1,0x26,0x66,0x05,0xf6,0xf0,0x6d,0xaf,0x28,0x31,0xc7,0x35,0x98,0xe5,0xe1,0xb0,0x36,0x06,0x00,0xf8,0xc6,0xf3,0x29,0xa5,0x97,0x20,0xe1,0x85,0xa3,0xb4,0x1e,0xa7,0x1d,0x61,0xd4,0x55,0x4b,0xdb,0x05,0xe6,0x22,0xd0,0x28,0x5f,0x64,0x52,0x49,0x03,0x99,0x55,0xd2,0x85,0xb4,0xe0,0x58,0x00,0x02,0x5e,0xd3,0xd6,0xad,0xf5,0xe2,0x48,0x7d,0x38,0x03,0x31,0x38,0xd3,0x54,0x4f,0x17,0x92,0x92,0x11,0x5d,0xd9,0x89,0x15,0xee,0xa2,0x5e,0x96,0x98,0xbc,0x28,0x34,0xf1,0xb2,0x84,0x72,0xa8,0x63,0x3d,0x88,0x94,0xce,0xd3,0x10,0x12,0xca,0x33,0x89,0x64,0x93,0x12,0x96,0x40,0xac,0x76,0xb2,0xd2,0xf2,0x45,0xe0,0x0d,0x12,0x65,0x52,0x45,0xb5,0x42,0x84,0x71,0x83,0x98,0x74,0xba,0x51,0x61,0x0c,0xfb,0x06,0x87,0x51,0xed,0x1f,0xc2,0xc1,0x07,0xde,0x87,0xe9,0x67,0xbf,0x06,0x69,0xe4,0x66,0x94,0x04,0x0b,0xfe,0xb3,0x2e,0x31,0x8c,0x5c,0x3a,0x89,0xb1,0x03,0xaf,0xb1,0x02,0x0f,0x65,0x04,0xfb,0x9a,0x71,0xc1,0xba,0x4c,0xf6,0xad,0xf0,0x19,0xc7,0x23,0xae,0xb0,0x12,0xaf,0xa8,0x1f,0x8b,0x97,0x4f,0x63,0x70,0x65,0x05,0x98,0xbc,0x3e,0x29,0x20,0x2b,0x10,0xc2,0xe0,0xbe,0xdb,0x30,0x38,0xb1,0x13,0x82,0x57,0x70,0x56,0xac,0x60,0x85,0x09,0x10,0x6b,0x01,0xf9,0x02,0x39,0xda,0x52,0xf4,0xc1,0xba,0x29,0x49,0x58,0xe7,0x34,0xc3,0x31,0x35,0xd4,0xa9,0x64,0xed,0x94,0x18,0x53,0xda,0x6d,0x22,0x39,0x67,0x21,0x76,0x3b,0x1e,0xf7,0xef,0x24,0x2a,0x8b,0x6e,0xa1,0x34,0xe3,0x8b,0x8e,0xb5,0x14,0xbb,0x16,0xbc,0x1e,0x22,0xd1,0xfd,0x60,0xc2,0x40,0x66,0xda,0x5b,0x39,0xb3,0x9a,0x14,0x9e,0x49,0xe8,0xd1,0x76,0x96,0x6c,0x23,0x64,0x45,0x42,0xf9,0xac,0xa4,0x9b,0x42,0x2c,0x4d,0x1c,0xec,0xfa,0xf7,0xfc,0x92,0x59,0x07,0xed,0x83,0x73,0xbd,0xd7,0x42,0xaa,0x5a,0xd2,0x28,0xc4,0x14,0xc9,0xab,0x39,0x64,0x9b,0x2f,0xbb,0xa5,0xdd,0x68,0x38,0x69,0x4b,0x19,0xb1,0xb7,0x12,0x55,0x77,0x2d,0xaa,0xa0,0x84,0x64,0xa7,0x0f,0x9d,0x3c,0xa5,0x78,0xda,0x43,0x8e,0xad,0x53,0x4b,0xdb,0x13,0x0d,0xc2,0x07,0xb6,0xee,0xc5,0x07,0x26,0xf7,0x63,0xbc,0xa7,0x57,0x7a,0xb8,0x62,0x2c,0xd8,0xe7,0xca,0xf4,0x77,0xf5,0x97,0x81,0x01,0x8c,0xc7,0xae,0xeb,0x67,0xe5,0x96,0x26,0x0a,0xac,0xab,0xc3,0xdf,0x52,0x4a,0x20,0x0a,0xb7,0x3d,0x45,0xee,0xc5,0xfe,0x0a,0x39,0x24,0x92,0xf9,0x8e,0x39,0xd2,0x5a,0xa3,0xae,0x49,0xec,0x26,0x53,0x47,0xd4,0xed,0x36,0xd9,0xbb,0xde,0xb3,0xc3,0x8d,0x5f,0x5b,0x12,0x35,0xfc,0xd3,0xdc,0x65,0xfc,0xd1,0xf4,0x29,0x2c,0x08,0x81,0x94,0xcd,0x9b,0x4d,0xa1,0xbd,0x4a,0xfb,0x84,0xfe,0x47,0x40,0x9a,0xc1,0x53,0x8e,0xb9,0x50,0x41,0x70,0xa4,0xa5,0x8e,0x91,0xb2,0xdb,0x74,0x26,0x29,0x81,0xe6,0xf9,0x52,0x8d,0xeb,0x14,0x1a,0x87,0x6b,0x82,0x93,0x62,0x07,0xe4,0xac,0x1a,0x2b,0x4d,0x39,0xd7,0x85,0x9b,0x82,0x91,0x1e,0x4f,0x04,0x07,0x1e,0xa3,0xe1,0x71,0x33,0x17,0x2d,0x24,0xfa,0x71,0x8e,0x16,0x88,0x88,0xa5,0x27,0x65,0xad,0x97,0xec,0xfb,0xd6,0x6b,0x29,0xf5,0xef,0x4e,0xbb,0x5e,0xdf,0x4d,0x6b,0x38,0xe1,0xb4,0xcd,0x52,0x96,0x1b,0x11,0xbb,0xae,0x5b,0xaf,0x27,0x25,0x2f,0x50,0xa1,0x27,0xbc,0x14,0xf3,0xef,0x98,0x75,0x96,0x6c,0x91,0x4b,0x82,0x06,0x1f,0xcc,0x1a,0x97,0x5d,0x09,0x6c,0xa2,0x5f,0x15,0xd1,0xdc,0x03,0x5e,0x28,0xbc,0xef,0x44,0xcb,0xf2,0xf7,0xae,0xbb,0x1d,0xdf,0x37,0xbe,0x23,0x20,0x53,0x04,0xc6,0x74,0x16,0xf9,0x42,0x92,0xac,0x24,0x5c,0x9d,0xae,0xf0,0x3a,0x63,0x4c,0x26,0x3a,0x20,0xcb,0x50,0x6e,0xd5,0x2a,0xba,0x80,0x44,0xd5,0x7d,0xc9,0xaf,0x16,0x41,0xeb,0x67,0x11,0xbd,0x9f,0x4a,0xbe,0x49,0x52,0x73,0x12,0xd1,0xba,0xae,0x39,0xc3,0x8d,0xfd,0x00,0x40,0xe8,0x63,0x15,0xfc,0xf0,0xf0,0x36,0xbc,0xa6,0x77,0x08,0x3f,0x7b,0xfe,0x08,0xe6,0x8b,0x1e,0x83,0x93,0xba,0x5a,0x93,0x41,0xa5,0x23,0xbf,0xaa,0x3b,0x4d,0x23,0x41,0xe6,0x83,0x66,0xf8,0x59,0x12,0x14,0xb3,0x5a,0x4e,0x4b,0x1b,0xd5,0x7f,0xc4,0xfd,0x46,0xea,0x95,0xd4,0xf1,0xc8,0xf9,0x6a,0x3c,0x01,0xa9,0x49,0xca,0x32,0x7b,0xc9,0xb8,0x36,0xec,0xf6,0x29,0xed,0x30,0x9c,0xcd,0x21,0x0d,0x37,0x35,0xa5,0x54,0xe9,0xf1,0x82,0xd3,0x24,0x1a,0xec,0x20,0xf9,0xc8,0x37,0xe9,0x46,0x98,0x15,0xb7,0xf6,0xc2,0x24,0x68,0xf5,0x6c,0x60,0x5b,0x95,0xe2,0xc1,0x2a,0x71,0x9d,0x57,0xc0,0x7d,0x0e,0x91,0x56,0x35,0x67,0xe9,0x08,0x69,0x8e,0x37,0x2c,0x56,0x4b,0x5a,0xb3,0xcd,0xa5,0x5e,0xb7,0x1f,0xb6,0x32,0xe6,0xd4,0x98,0x19,0xb2,0xb9,0x4b,0xb5,0x66,0xac,0x47,0x92,0x1d,0x40,0xce,0xf6,0x10,0xc6,0x14,0x2d,0x97,0x4a,0xa5,0x0a,0x56,0xa9,0x80,0x7c,0x1f,0xbe,0xbf,0x9a,0x79,0xb0,0xf4,0x7a,0xfa,0x30,0xbe,0xeb,0x00,0xae,0x5d,0x38,0x85,0xa5,0xf9,0x6b,0xe9,0x91,0xb6,0x42,0x92,0x60,0x92,0xd8,0xde,0x3b,0xbe,0x2b,0x42,0xbe,0xa9,0x24,0xcb,0x0c,0x42,0x0e,0xae,0xe9,0xc7,0x25,0xf9,0x86,0x6b,0x61,0x01,0xbb,0x4a,0x8e,0x4b,0x92,0x72,0xad,0x69,0x90,0x5b,0x12,0x36,0x78,0x32,0x89,0x24,0x63,0x65,0x64,0x93,0xaf,0xf1,0x35,0x8d,0x35,0x62,0xe1,0xba,0x88,0x3d,0xc4,0x0d,0x3d,0x83,0xf8,0xd5,0xb1,0xbd,0xf8,0xd0,0x95,0x57,0x8b,0x77,0xca,0x51,0x50,0x78,0x91,0x60,0xea,0xb6,0xa5,0x0c,0x5b,0x6d,0x32,0x04,0xc3,0xb4,0xca,0x97,0x10,0x33,0x6a,0x24,0xc0,0xea,0x46,0xe4,0x18,0xed,0xed,0x81,0x2d,0xeb,0x82,0x50,0xc2,0x4c,0x20,0x93,0x5d,0x89,0x4d,0x14,0xe9,0x1e,0xab,0x62,0x08,0x1e,0x09,0xc3,0x08,0x15,0xc2,0x09,0x6a,0xbf,0xd4,0xf5,0x61,0x97,0x14,0xe3,0x4e,0x53,0x20,0x2e,0xd5,0xab,0x98,0x1c,0xa7,0x2b,0x65,0xdd,0x51,0x95,0x1c,0x97,0x76,0xc4,0xd1,0xe0,0x00,0x96,0x4b,0x68,0xce,0xb0,0xde,0x4b,0x76,0xfd,0x06,0x70,0x5b,0x05,0x3b,0xef,0x99,0xf7,0x13,0x8c,0x86,0x64,0xba,0x1d,0xb3,0x37,0x2d,0xf1,0x26,0x64,0x8a,0x07,0x6f,0xdb,0x0f,0x71,0x75,0x45,0xd8,0x97,0x02,0xc3,0xe1,0xe0,0x15,0x33,0xdb,0xce,0x46,0x93,0x20,0xd6,0xd5,0x55,0xe1,0x59,0xcf,0x8b,0x68,0x58,0xee,0x62,0xcd,0xd3,0x7c,0x1c,0x8e,0x4b,0x9c,0x06,0x92,0xe6,0xd2,0x00,0x07,0xab,0x56,0xe5,0x96,0xa9,0x4a,0x45,0x96,0xfb,0xea,0x6a,0xdd,0x28,0x18,0x63,0xd8,0xba,0xef,0x16,0xf4,0x0e,0x0e,0xa1,0xa7,0x67,0x00,0xa7,0x5e,0xf8,0xb6,0x22,0xa3,0x34,0x14,0xab,0xe2,0x24,0x21,0xff,0xfb,0xd1,0xad,0xbb,0xd4,0x95,0x8c,0x24,0x6b,0x4a,0xbb,0xa6,0x4a,0x1a,0x9a,0x1b,0xe3,0x24,0x1a,0x48,0xbb,0xd0,0x72,0x6d,0x5c,0x22,0xd6,0x44,0x0b,0xe3,0x1d,0xfb,0xd9,0x68,0x06,0xcc,0xef,0xe9,0x24,0x69,0xde,0x88,0xaa,0x9e,0xed,0xef,0x69,0x71,0x18,0x5f,0x22,0xd1,0x11,0xde,0x3d,0x34,0x81,0xdf,0xbf,0xf2,0x2a,0x16,0xc9,0x0f,0xcb,0xab,0x69,0xa4,0x19,0x33,0x01,0x43,0x63,0x5b,0x40,0x44,0x98,0x77,0x79,0xef,0xca,0xda,0x54,0x82,0xf6,0x2d,0xa4,0xf1,0x9c,0x9e,0x2c,0xa5,0x86,0x95,0xe2,0xe0,0xc7,0x40,0x6c,0xc2,0x6b,0x23,0xd2,0x7f,0xdd,0x21,0xa4,0xfe,0x8e,0x6d,0x9d,0xaa,0x23,0xc1,0x92,0x11,0xa7,0xa1,0x8e,0x75,0xce,0xdb,0x53,0xf3,0x58,0x37,0x67,0x2a,0x29,0xf1,0xa7,0x9c,0x6f,0x66,0xde,0xb6,0x94,0x1c,0xae,0x1d,0x9c,0x5b,0xb1,0x69,0x95,0x45,0x0e,0x49,0xb8,0x99,0xf9,0x7f,0x8e,0xe3,0x08,0xa3,0xc8,0xd5,0x87,0x9c,0xe4,0x6b,0xcd,0xfa,0x62,0x05,0x9c,0xb2,0xde,0x1b,0x9f,0x22,0x46,0xef,0x27,0x64,0x29,0x39,0xcd,0xe9,0x5a,0x00,0x1e,0x49,0x4f,0x54,0x2a,0x15,0x36,0xd3,0x5b,0x42,0x74,0xf0,0x4a,0x8c,0xb7,0xcd,0xd4,0x98,0x56,0x08,0xfa,0xab,0x35,0x7b,0x88,0x09,0xc3,0xf6,0x66,0x7c,0xf5,0xc5,0x29,0x66,0x64,0x6d,0x22,0x69,0xad,0xdc,0xb1,0x19,0xb0,0x4e,0xd3,0xf1,0xaa,0x15,0x48,0x67,0x0c,0x32,0xcc,0x0a,0x63,0x20,0x4e,0x48,0xf4,0x3f,0xae,0x2e,0x8f,0x4d,0xee,0x43,0xdf,0xd0,0x30,0x00,0x01,0xaf,0xb7,0x07,0x43,0xa3,0x13,0x98,0xbd,0x7a,0xde,0x4a,0x67,0xeb,0xa0,0xd7,0x55,0x99,0x20,0xdc,0x38,0x38,0xa6,0xc8,0x14,0x4a,0xf5,0x9c,0x4e,0xb2,0x92,0x83,0xe3,0xd2,0x72,0x48,0xa4,0x50,0x12,0xab,0x45,0xb4,0x5a,0x8c,0x0d,0x84,0x63,0x87,0xb4,0xab,0x49,0x52,0xff,0x9f,0xa6,0x7a,0x0e,0x32,0xe3,0x22,0x5f,0x5b,0xfa,0x75,0x49,0x45,0xf6,0x7b,0x0e,0xa9,0x3a,0x76,0xcd,0x26,0x5f,0xf9,0x5f,0x0f,0xe3,0xb8,0xde,0xeb,0xc3,0x91,0x95,0x79,0x69,0xd0,0x96,0x6b,0x5f,0x6d,0x12,0xec,0x36,0x14,0x46,0x3c,0x30,0xb2,0x09,0x5b,0xf7,0xdd,0x08,0x80,0xe1,0xdc,0xcb,0x4f,0x63,0x71,0x76,0xaa,0xc1,0x28,0x64,0x3a,0xbd,0x6a,0x15,0xac,0x52,0x05,0x04,0xa1,0xb6,0xb2,0x14,0xd4,0x83,0x1b,0x59,0xb6,0x0a,0x34,0x31,0x64,0x27,0x1d,0x24,0x53,0x6f,0x49,0x48,0xd4,0x93,0x56,0x8d,0x97,0x05,0x05,0x63,0x56,0x8c,0x6a,0x09,0x10,0x46,0x1e,0xb9,0x23,0x3f,0x0e,0x71,0x24,0x35,0x3a,0x8d,0x54,0x85,0x96,0x1e,0x43,0x13,0xf3,0x98,0x7d,0x5d,0x98,0x90,0x85,0x84,0xdb,0x63,0x9c,0xe5,0x35,0xfa,0x62,0xe6,0x26,0xd4,0x90,0xa5,0xb3,0xa3,0xe0,0x98,0xeb,0x5e,0x96,0x84,0x85,0x62,0xa7,0x33,0xcd,0x29,0x63,0x01,0x53,0xf1,0xc5,0x1b,0x92,0xde,0x9a,0x42,0x91,0x87,0x23,0x94,0x6a,0x92,0x2e,0x83,0xfd,0xc5,0x80,0x49,0xba,0x69,0x33,0x87,0x90,0x70,0x23,0x6a,0x14,0xc6,0x72,0xca,0x7e,0x2c,0xb2,0x6a,0x1d,0x85,0x99,0xe8,0x34,0x64,0xab,0x7d,0x56,0xa9,0x00,0xc1,0x70,0x25,0xe9,0xa8,0xe2,0xf5,0xa2,0x56,0x5b,0x76,0x18,0xe1,0x49,0xf0,0x6a,0x15,0x63,0x3b,0xf6,0x05,0x69,0x25,0x30,0x0c,0x8d,0x4f,0x62,0xf6,0xea,0x05,0xd7,0xd3,0x99,0x2e,0xe5,0x82,0x66,0x0d,0x12,0xa8,0x72,0x8e,0x2a,0xe7,0x16,0x99,0x1a,0x24,0x0b,0x5b,0x25,0xad,0x89,0x57,0x6b,0xa6,0xa3,0xeb,0xbe,0x9a,0x5d,0x03,0x22,0x4d,0x22,0x5a,0x43,0x22,0x8e,0xbc,0x13,0x79,0x06,0x06,0x91,0x1b,0xe9,0x36,0xfe,0x24,0x66,0x30,0x41,0xca,0x4d,0xb7,0xb2,0xb6,0xbf,0xbb,0x48,0xdb,0xfe,0x6d,0x90,0x62,0xa5,0x22,0x2d,0xa2,0x59,0x58,0x8e,0xb9,0xe1,0x6c,0xe8,0xfa,0xa2,0x9a,0x00,0x71,0x8e,0x4d,0xbb,0x6e,0x00,0x81,0x81,0x57,0x38,0x26,0xf6,0x1d,0xc2,0xa9,0x23,0x8f,0x25,0xb6,0x37,0x37,0xd4,0xb3,0x9c,0x50,0xa9,0xf4,0x82,0x55,0xd4,0x12,0x18,0x07,0x58,0xb5,0x02,0x4a,0xd4,0xe2,0x04,0x35,0x5f,0x3f,0xec,0x94,0x9c,0xa4,0xc2,0x98,0x60,0x4b,0xed,0x1a,0x05,0xbf,0xa2,0x66,0x23,0x16,0x21,0x9b,0x63,0x8b,0x93,0x8c,0xad,0xa5,0x2f,0x7b,0x25,0x4c,0xfd,0xb6,0xad,0x8b,0xfd,0x48,0xef,0x8e,0x44,0x18,0x84,0x9f,0x3a,0xee,0xa6,0x56,0x8b,0xa5,0x32,0x4c,0x7d,0x56,0xab,0xcf,0xcc,0x7c,0x9b,0xef,0x47,0x85,0x3e,0xb7,0xb6,0xb5,0xfd,0x16,0xd2,0x0d,0x4b,0xc0,0x99,0x90,0xc1,0xb3,0x95,0xdb,0xab,0x95,0x88,0x3e,0x17,0x91,0x7a,0xf3,0x1b,0x5a,0x39,0x8d,0x05,0x52,0x1a,0x40,0xb4,0x0b,0x45,0xdf,0x25,0x3b,0x5d,0xfa,0x8f,0x0e,0xc7,0xe4,0xb0,0x20,0xcd,0x30,0x2f,0x44,0x63,0x60,0xc6,0x8c,0x39,0x96,0x4c,0x06,0x88,0x70,0x46,0x29,0xaf,0x5b,0x13,0x82,0x54,0xd5,0xac,0x24,0x5b,0x5e,0xed,0x81,0xa8,0xad,0x22,0x14,0xaf,0x00,0xa7,0x77,0x9f,0x20,0x23,0x79,0x24,0xe6,0x84,0x3b,0xdc,0x8b,0x96,0x89,0xd1,0x51,0x79,0xa5,0x0a,0x21,0x56,0x9c,0xef,0x6d,0x9a,0xdc,0x07,0xae,0xd4,0xd6,0x1a,0xfd,0x83,0x23,0xa8,0xf6,0xf4,0x61,0x75,0x65,0xc9,0x7a,0xda,0xa1,0x39,0x28,0xa0,0x39,0x33,0x22,0x08,0xa1,0x49,0x33,0x49,0xf5,0x0c,0x35,0xde,0xb2,0xa8,0xea,0x59,0x33,0x34,0x33,0x9d,0xb8,0x28,0x12,0x8d,0xa8,0x9c,0x4d,0x22,0x8d,0xab,0x93,0x43,0xc2,0x85,0xe3,0x9d,0x28,0x91,0xeb,0x58,0xcc,0x3f,0xf2,0x7b,0x82,0x14,0xeb,0xb8,0x16,0x21,0xdf,0x58,0xf5,0xdb,0xa4,0xed,0x22,0xe8,0xe8,0x4b,0x31,0x29,0xd1,0x27,0x90,0x4f,0xd2,0xec,0x80,0xb1,0xa6,0x84,0x40,0x09,0x77,0x45,0x8f,0x6e,0xdd,0x83,0xde,0xbe,0x81,0x20,0xf8,0x9e,0xbe,0x01,0x0c,0x8e,0x6d,0xc1,0xfc,0xd5,0xac,0xee,0x43,0xc3,0x84,0x55,0x2a,0x55,0x70,0xce,0x23,0x5d,0xa2,0xc2,0x3c,0x08,0xd8,0x04,0x4c,0xb1,0x77,0xdd,0xd0,0x2c,0xe6,0xba,0x45,0xb1,0x65,0x5f,0x00,0x10,0x29,0x83,0x9b,0x53,0xb4,0xf1,0x45,0xf4,0x9e,0x5e,0x03,0x8b,0x3c,0x6c,0x8c,0x39,0x29,0x07,0x2f,0xc4,0xd4,0xb2,0x14,0x55,0xb0,0xb9,0x9a,0x0c,0x73,0x8c,0xd1,0x99,0xb8,0x96,0xac,0xf8,0x5c,0x69,0xb0,0x03,0x4d,0x0c,0xd0,0x94,0x86,0xed,0x31,0x42,0x38,0x1f,0x75,0x24,0x46,0x21,0xbf,0xe7,0xac,0x3c,0xb0,0x5c,0x51,0xd6,0x47,0xf6,0xa4,0xb8,0xc8,0xd7,0x11,0x97,0xb0,0x9f,0x11,0xd1,0xce,0x9b,0xc5,0xca,0x39,0x76,0x59,0x0f,0x9c,0x36,0x54,0xe3,0x48,0xad,0xbc,0x64,0xf9,0x30,0x26,0x8d,0xdb,0xc2,0x87,0xb3,0xa5,0x39,0x48,0xc2,0xd0,0x7f,0x70,0xee,0xc1,0xab,0xf6,0x80,0x44,0x0d,0xb5,0xd5,0x55,0x15,0x16,0x29,0x5e,0xa6,0xb8,0x84,0x9b,0x65,0xdd,0xd6,0x88,0xaa,0xa7,0x6f,0x14,0xfb,0xee,0x7a,0x00,0x8b,0x57,0xae,0xe2,0xc4,0x91,0x6f,0xc9,0xc1,0x53,0xf6,0xd4,0xf8,0x7b,0xce,0x19,0x61,0x1a,0x54,0xa6,0x1d,0x8d,0xa2,0x5a,0xa9,0xc4,0x96,0xb1,0xf4,0x32,0x76,0x85,0x57,0x40,0xa8,0x80,0x28,0xaa,0xba,0xf7,0x7a,0xfa,0x30,0x36,0xb9,0x3b,0x56,0x9f,0xc4,0x38,0x06,0x37,0x4f,0xe2,0xda,0xa5,0x53,0x20,0x5f,0x38,0x12,0x5a,0xd4,0x24,0x92,0xc9,0x09,0x16,0xc9,0x2d,0x42,0x82,0xc8,0x4d,0xb2,0x11,0xd5,0xb3,0x7a,0x93,0x99,0xc4,0x6b,0xab,0x9e,0x11,0x97,0x76,0x83,0x51,0x3d,0x6c,0x44,0xc9,0x5b,0x8e,0xf4,0x23,0xc6,0x3b,0x31,0xd5,0xb3,0x85,0xa4,0x75,0xdf,0xc8,0xb3,0x36,0xf9,0xba,0x9e,0x4d,0x19,0x1f,0x12,0x48,0xdb,0x7e,0x4d,0xa6,0x58,0x80,0xc8,0x07,0xa1,0xde,0x91,0x9d,0x8d,0xc3,0xeb,0xe9,0xc3,0xe8,0xd6,0x1d,0x10,0x9a,0x28,0x54,0xf3,0x1c,0xdb,0xb2,0x27,0x4e,0xc0,0xce,0x6c,0x85,0xd3,0xeb,0x8a,0x57,0x05,0x98,0x17,0x27,0x39,0xc6,0x40,0x8c,0x1b,0xcb,0x28,0x59,0xc6,0xcf,0x0c,0xed,0x93,0xb8,0xe3,0x31,0x11,0xed,0x82,0x22,0x3a,0xcc,0x64,0x8a,0xc5,0x57,0x75,0x0c,0x84,0x85,0xe2,0x68,0x03,0xd1,0xaf,0x29,0xe9,0xd5,0x4d,0x30,0x61,0xa5,0x2b,0x7d,0x05,0xb8,0x4e,0x39,0x24,0xc4,0x1f,0xe6,0xc0,0x62,0xff,0xd4,0x71,0x3c,0x98,0xc1,0x28,0xf8,0x60,0xd9,0xa6,0x02,0xf1,0x67,0x44,0x5a,0xa9,0x27,0xbe,0x95,0x09,0x5e,0x6c,0xa6,0x9a,0x82,0xcc,0xab,0x17,0x4e,0xc9,0xd7,0xba,0x16,0x1b,0xdb,0xe5,0x33,0xb1,0xf4,0x88,0xf0,0x5e,0xec,0x7d,0x67,0x7d,0x5a,0x46,0x2f,0x66,0x64,0xc1,0x32,0xae,0x4b,0xa9,0xec,0x0a,0xd4,0xfa,0xad,0x26,0xee,0x89,0xbb,0x93,0xc8,0x8c,0xc4,0x86,0x70,0x12,0x74,0xc5,0xeb,0x51,0x83,0xb9,0x87,0x6a,0x95,0x61,0x75,0x79,0x51,0x76,0xf0,0x20,0xcc,0xa4,0xc8,0x8c,0x32,0x61,0xd6,0x75,0x23,0xc9,0x5b,0xf7,0xdf,0x0c,0xce,0x2b,0x18,0xdc,0xb2,0x05,0x13,0x3b,0xaf,0xc7,0xa5,0xd3,0x2f,0x59,0xe5,0xe6,0x4a,0xaf,0xdb,0xd0,0xca,0x0d,0x6b,0x4d,0x4f,0xf3,0x31,0x37,0x34,0x0d,0xba,0x2f,0x18,0x16,0x69,0xac,0xa7,0x02,0x7f,0x25,0x7a,0x96,0xee,0xe8,0xe4,0xbe,0xc0,0x53,0x94,0x10,0x46,0x60,0x04,0x0c,0x6d,0x9a,0xc0,0xb5,0xcb,0xa7,0xc1,0x18,0xc1,0x8f,0x4d,0x42,0x2c,0xb5,0x5c,0x33,0x08,0x74,0xbb,0x02,0x24,0xc8,0x68,0x4d,0xc9,0x24,0xab,0xd7,0x88,0x03,0xd9,0xd8,0x52,0x3d,0x87,0x12,0xab,0x8a,0x02,0x6e,0xa2,0x0d,0xf9,0xd5,0x21,0x11,0xbb,0x88,0x3c,0x28,0xce,0x34,0x22,0x36,0xbe,0x24,0x12,0xb1,0xe3,0x62,0x22,0x29,0x3b,0x5e,0xb4,0x2f,0x19,0xcf,0xe8,0xc1,0x93,0x84,0x2c,0x53,0x08,0xa6,0x0e,0x22,0x89,0x6f,0x3d,0x4c,0x83,0xcb,0x64,0xc7,0xc6,0xc8,0xc4,0x0e,0x10,0xe3,0x60,0x24,0x00,0xa8,0x53,0xac,0x58,0x05,0xbd,0x23,0x63,0xe8,0x19,0x1c,0xc6,0xd2,0xfc,0x4c,0xf8,0x70,0xca,0x78,0x5a,0xa9,0x54,0xc1,0x2b,0xee,0xd5,0x39,0x41,0x00,0x47,0x05,0xbe,0x2d,0x28,0x24,0x26,0xda,0xa1,0x7d,0x8b,0x3f,0x84,0x44,0x72,0x72,0x08,0x17,0x66,0x95,0xe6,0x82,0x79,0xa0,0x06,0x53,0x63,0x5b,0x6a,0x9b,0x49,0x49,0x50,0x42,0x33,0x60,0xb1,0x7b,0xae,0x81,0x3a,0xc9,0x92,0x5c,0x95,0x8f,0x70,0xbd,0xc3,0x82,0xb6,0xe4,0x7c,0xad,0xae,0x24,0x2b,0x4b,0x2e,0x91,0x84,0xeb,0xbe,0x4f,0x99,0x25,0xe1,0x3c,0xd5,0xe2,0xe5,0x5b,0x1b,0xc9,0x12,0xbb,0x4b,0x31,0x62,0x8a,0x41,0xea,0x6f,0xcc,0x18,0xc9,0x22,0x5f,0x1e,0xbd,0x17,0x43,0x22,0xf9,0xba,0xc8,0x5f,0x3d,0xec,0xc8,0x2b,0x73,0x26,0xca,0x52,0x83,0xf3,0x90,0x78,0x03,0x6a,0x8f,0x19,0x3b,0xe9,0x35,0x5a,0x4b,0xe2,0x75,0x69,0x78,0xd4,0x35,0xce,0x2b,0x32,0xbd,0x42,0x55,0xae,0xa8,0xc0,0x73,0xaa,0x5a,0x9d,0x89,0x0e,0xe3,0x31,0xc3,0x35,0x06,0xbf,0xc1,0x91,0xcd,0x18,0xda,0xb2,0x2d,0x78,0x7e,0x62,0xff,0x21,0x4c,0x5f,0x38,0xa9,0xc2,0xd7,0xcf,0xa9,0xfd,0x73,0xce,0xb6,0x25,0x00,0x61,0x48,0x2c,0x89,0xec,0x16,0x1d,0xb8,0x2b,0x5e,0x4f,0xb4,0xb3,0xc7,0x8a,0x5d,0xd6,0x53,0x85,0x57,0xe1,0xaf,0x4a,0xd5,0xb8,0xe7,0x79,0x18,0xdb,0xb6,0x13,0xcc,0xe4,0x09,0x42,0x50,0x05,0x5e,0x4f,0x3f,0xfa,0x06,0x46,0xb1,0x3c,0x3f,0x05,0x66,0x12,0x50,0xca,0x82,0x41,0x23,0x20,0x48,0xe2,0x0c,0xe4,0xec,0x88,0x23,0x0d,0x07,0xc9,0x46,0xac,0xa1,0x99,0xe6,0x64,0x98,0xe4,0x19,0x30,0x67,0x64,0xdb,0x90,0x4d,0xce,0xe6,0x5f,0xfd,0x9a,0x9b,0xa8,0xa3,0x03,0xb0,0x83,0x7c,0x63,0x24,0x49,0x8e,0x9f,0x64,0x3d,0x4a,0x8e,0x7a,0xb2,0x49,0xdb,0x45,0xd0,0xd6,0x20,0x17,0x23,0x5f,0x1d,0x0c,0x45,0xd6,0x28,0x9b,0x97,0x82,0xa3,0x93,0x72,0xaf,0xda,0x83,0xa1,0xcd,0x5b,0xc3,0x88,0xcd,0xa1,0x83,0x11,0x36,0x4d,0xec,0xc6,0x85,0x99,0x67,0x01,0x24,0xb5,0x11,0x79,0x95,0x57,0x2a,0xe0,0x8c,0x85,0xed,0x37,0x98,0x7d,0x85,0x8d,0x9f,0x57,0x18,0x7c,0x41,0xc9,0x79,0x48,0xb4,0x87,0xb2,0x54,0xba,0x91,0xa7,0xd2,0x54,0xc1,0xd6,0x63,0x91,0xdb,0x76,0x98,0x19,0xc0,0xe0,0x14,0x42,0xd2,0xc9,0xd8,0xb6,0xc5,0xb1,0xd5,0x54,0x21,0xb9,0x11,0xe0,0xd8,0xf6,0x18,0x65,0x49,0xfd,0x64,0x34,0xca,0xf4,0x53,0x1f,0xc2,0xac,0x67,0x21,0xcf,0x48,0xe2,0x8c,0x79,0x83,0xe5,0xb9,0xce,0xd9,0x37,0x12,0x02,0xf7,0x81,0xa2,0xd7,0x84,0xbd,0x0c,0x46,0xe3,0xd9,0x05,0xf7,0x58,0xc7,0xb7,0xf4,0xc3,0xb1,0x16,0x1b,0x92,0x33,0x19,0x64,0x67,0xdf,0xcb,0x02,0x6d,0x04,0x40,0xd6,0xd5,0x30,0x0c,0x17,0xf9,0xba,0x66,0x55,0x0c,0xa6,0x7a,0x96,0xb8,0x95,0xff,0x70,0xf3,0xa7,0x91,0x4e,0x20,0xf4,0xa9,0xad,0x83,0xb1,0xca,0x95,0xe9,0x67,0xc3,0xc3,0x19,0xbc,0xde,0xfe,0x30,0x6a,0x35,0x39,0x60,0xbc,0x02,0xee,0x55,0x21,0x6a,0xab,0xe1,0x38,0x92,0x3a,0x5a,0x25,0x75,0x40,0x8e,0x2d,0xd7,0xdd,0x1a,0x49,0x3c,0xaf,0x70,0x8c,0xef,0xbe,0x01,0xe7,0x8f,0x1d,0x4e,0x0e,0x2e,0xd6,0xbe,0x8c,0xd9,0x6a,0xe2,0x64,0x8d,0x45,0xbe,0xb1,0xd8,0xe4,0x04,0xd1,0xfe,0xa7,0xbe,0x73,0xce,0x80,0x9e,0x2a,0x48,0xd4,0xb0,0x69,0xe7,0xf5,0xe0,0x9e,0x17,0x1e,0x7b,0xa7,0x33,0xaf,0xdf,0x63,0xc0,0xe8,0xc4,0x0e,0x5c,0x9c,0x9f,0x02,0x67,0x1c,0x3e,0xf9,0xa8,0xf4,0x78,0xa8,0xf6,0xf4,0x83,0x7b,0xd2,0x42,0x95,0x84,0x8f,0xda,0xea,0x32,0x6a,0xab,0x2b,0x11,0x22,0xc8,0x07,0x83,0x34,0x21,0x9c,0xaa,0xe7,0x70,0xbe,0x22,0x89,0xd7,0xf6,0x76,0x25,0xa5,0x2f,0x07,0xd1,0x46,0x8c,0xb1,0xc2,0xf8,0x52,0x55,0xcf,0x44,0x91,0x34,0x05,0xd6,0xd2,0x89,0xc9,0x77,0x91,0xa4,0xf5,0x3d,0x46,0xbe,0xae,0x67,0x53,0x06,0xa6,0x04,0xd2,0x76,0xa6,0x8a,0x8c,0x1e,0xc6,0x28,0x54,0x1f,0x25,0x7a,0x80,0xc9,0x09,0x15,0xc4,0xc8,0xf8,0xce,0x70,0x52,0x6c,0x36,0x3f,0xf5,0x7d,0x70,0xeb,0x76,0x54,0xce,0xbd,0x82,0xd5,0xe5,0xf8,0xe4,0x96,0x33,0x86,0x8a,0x27,0x8f,0x8b,0xe4,0x95,0x2a,0x84,0x5f,0x8b,0x3d,0x03,0x32,0x58,0x95,0x71,0x30,0x46,0x10,0x49,0xbe,0x9f,0xd3,0x24,0xa5,0xc0,0xe6,0x29,0x61,0x92,0x44,0xe6,0x43,0x0e,0x63,0xa9,0xb4,0x22,0xb3,0x78,0x85,0xd4,0x7b,0xcc,0xee,0xd4,0xf6,0x70,0x47,0xaa,0x8f,0xeb,0x31,0x8a,0x1c,0x63,0x76,0x64,0x18,0x35,0x8d,0x93,0x34,0x31,0xab,0x07,0x75,0x7d,0x6b,0xa1,0xc5,0x50,0x01,0xbb,0x75,0xa8,0x2e,0x3d,0x82,0x39,0x83,0xb2,0x13,0x9c,0x40,0xc2,0xf5,0x60,0x1c,0x11,0x2b,0x43,0xaf,0xb7,0xcb,0x26,0x1e,0xa3,0xfc,0xea,0x3b,0x84,0xaf,0x38,0xb2,0xa6,0xce,0xab,0xf7,0x64,0xe6,0x99,0xaa,0x93,0x7c,0xad,0x9f,0x16,0x41,0x00,0x00,0x63,0x1c,0xc4,0xe4,0xde,0x32,0x01,0xa1,0x74,0x8f,0x79,0x66,0x19,0xae,0xb5,0x5e,0x2d,0x62,0xc2,0x8e,0xd4,0xb8,0x6b,0xbf,0xc5,0xc0,0xb9,0x87,0xa1,0xcd,0xdb,0xc0,0x18,0xc7,0xf2,0xd2,0x0c,0x96,0x66,0xa7,0xc3,0x06,0xa4,0x3b,0x55,0x10,0x9c,0x56,0x97,0xe8,0xf4,0xda,0x6a,0x6e,0x33,0x32,0xd9,0xa8,0x99,0xd1,0xb1,0x78,0xc5,0x43,0xd2,0x11,0x89,0x9e,0xd7,0x83,0x55,0xbf,0x16,0x96,0xa9,0x19,0x96,0xb3,0xbe,0xe2,0x8d,0x69,0x60,0x78,0x33,0x06,0xc7,0xc7,0x63,0xcf,0x6f,0xde,0xb9,0x0f,0x97,0x4f,0xbe,0x24,0x2d,0x91,0x5d,0xf0,0x5d,0x11,0x30,0xeb,0xaf,0x3d,0x31,0x08,0xe3,0xaf,0x54,0x2a,0xd1,0xf4,0xe8,0x3c,0x38,0xc6,0x14,0x82,0x24,0x6b,0x5e,0xed,0xc7,0xe8,0xf6,0xdd,0x01,0xcd,0xd8,0xd0,0xd7,0x7b,0x86,0x47,0x30,0xba,0x65,0x37,0x96,0x97,0x16,0xd1,0x3f,0x34,0x86,0xbe,0x81,0x61,0x39,0x3d,0x10,0x3e,0x04,0x49,0x35,0x27,0x09,0x1f,0xb5,0x95,0x45,0x5c,0x3d,0x7f,0x1c,0x42,0x0f,0x24,0x39,0xc8,0xd8,0xb4,0x2e,0x56,0x53,0xa2,0x96,0x79,0xbb,0x0a,0xf7,0xf6,0x5a,0x44,0x6d,0x3e,0x8b,0xe8,0xfd,0x68,0x9b,0xb0,0xda,0x87,0x93,0x0d,0xa3,0x24,0xe9,0x56,0x21,0xdb,0xef,0xd9,0xe1,0xc6,0x7e,0xc4,0xc2,0x25,0x2b,0x1c,0x7b,0x90,0xd4,0x73,0x09,0x0a,0x16,0x68,0x33,0x20,0xe9,0x39,0x2b,0x29,0x1e,0xaf,0x62,0x78,0x7c,0xd2,0x79,0xdb,0x6c,0xb9,0x93,0xfb,0x6e,0xc5,0xc9,0x97,0x9e,0x00,0x23,0x60,0x68,0x6c,0x2b,0x46,0xb6,0xec,0xc0,0xc0,0xe8,0x38,0xbc,0xfe,0x5e,0x15,0x9d,0x5c,0xfa,0xb9,0xf0,0xfc,0xd3,0x98,0x0b,0xce,0x7c,0x8e,0xa7,0x81,0x83,0xab,0x3e,0xba,0x1c,0x44,0x48,0x90,0x1a,0x2d,0x30,0xa6,0x34,0x5b,0x2c,0xb2,0x5d,0x81,0x84,0x40,0x6d,0x75,0xc5,0xc8,0x93,0x15,0x6e,0xa4,0x0e,0x6d,0xc2,0x74,0xa9,0xb1,0xeb,0x1b,0x27,0x31,0xf3,0x79,0x02,0x28,0x91,0x8c,0xb5,0x96,0x4b,0x6a,0xfd,0x28,0x78,0xcf,0x21,0xca,0x0b,0x2b,0x0d,0xdc,0x4e,0x0f,0x83,0x36,0xfe,0x30,0x87,0xab,0x50,0x36,0xb6,0x12,0x69,0xc8,0xcd,0x2e,0x9a,0x95,0xe1,0x45,0x67,0x01,0x7a,0xfc,0xce,0x47,0xc4,0x86,0x04,0x10,0x2b,0x0b,0x87,0x0e,0x3b,0x12,0xac,0x35,0xf0,0x52,0xfd,0x36,0x9c,0x55,0x68,0xf5,0x1a,0x97,0x14,0x0c,0x38,0xc9,0x97,0x12,0x7f,0x6a,0xc9,0x98,0x31,0x0e,0x78,0xb2,0xf2,0xb9,0x26,0x61,0x62,0x20,0xdf,0x87,0x10,0xb5,0x94,0xf7,0x35,0x38,0x58,0xac,0xe2,0x58,0x38,0xbb,0xb4,0x25,0x36,0xee,0x92,0x7a,0x99,0x7a,0x8e,0x30,0x32,0xb9,0x0b,0x03,0xa3,0xe3,0x00,0x38,0x86,0xd9,0x76,0xd4,0x56,0x96,0x31,0x75,0xe1,0x55,0xe9,0x89,0x29,0x76,0x84,0x95,0xe9,0xfa,0xcc,0xa8,0xbc,0x80,0x68,0x42,0xc9,0x98,0xa9,0x19,0x63,0x58,0x4c,0x02,0x5c,0xed,0x2b,0x8c,0xa4,0xdb,0xdc,0x91,0xe4,0xf5,0xa2,0x66,0xab,0xa2,0x13,0xab,0xca,0x56,0x0f,0x01,0xe3,0xbb,0x0f,0xd8,0xad,0x5f,0x7e,0xf5,0x2a,0xd8,0x3c,0xb9,0x0f,0x17,0x4f,0xbe,0x60,0x85,0xe1,0x28,0xe4,0x94,0x36,0x66,0x8e,0xd3,0x11,0x69,0xdf,0xeb,0x55,0x8d,0xdb,0x95,0x64,0x16,0xe4,0xd9,0xac,0xb5,0xe1,0xcd,0x5b,0xa5,0xe5,0x33,0x85,0x06,0x56,0x7a,0xf6,0x6e,0xd7,0xee,0xf0,0x96,0x1d,0x18,0x22,0x28,0xcf,0x5a,0xb5,0x60,0x8c,0x20,0x5f,0x1a,0x4e,0x41,0xc8,0xb2,0xed,0xeb,0x1f,0xc6,0xc2,0x6c,0xf6,0xd3,0x8a,0x22,0x19,0x23,0xc8,0x22,0xa5,0xd6,0x7a,0xbb,0xf2,0x6b,0xcb,0x58,0x5d,0x99,0x43,0xb5,0x67,0x58,0xf6,0x05,0x9d,0x00,0xa7,0x44,0x6c,0x74,0xb3,0x24,0x92,0x8c,0xb5,0x0f,0x9b,0x7c,0x8d,0xaf,0x2e,0xd2,0xb6,0xcb,0x21,0xfe,0x70,0x72,0x1b,0x4c,0x50,0x3d,0x47,0x92,0x6b,0x8c,0xd1,0xd9,0x66,0xf6,0xd9,0xc6,0xa6,0x81,0xf1,0x09,0x80,0x33,0x25,0xd9,0x98,0x6f,0xcb,0x48,0x19,0x2a,0x20,0x00,0xfd,0x9b,0xc6,0xb1,0xfb,0xa6,0xbb,0xe0,0xf5,0xf6,0xa3,0x67,0x60,0x40,0x55,0xab,0xb6,0xb7,0x90,0x23,0x03,0x23,0x60,0x64,0x72,0x37,0x66,0xa7,0x2f,0xa8,0xab,0xf1,0x7c,0x49,0x55,0xba,0x87,0x8a,0x47,0x10,0xc2,0x07,0xe7,0x15,0xf0,0x4a,0x45,0xe5,0x2d,0x3a,0x19,0x66,0x60,0x6a,0x37,0x4b,0x05,0xbc,0x42,0x6a,0x37,0x42,0xc2,0x80,0x66,0x73,0xb2,0x7a,0xa4,0xe2,0xf5,0x62,0xeb,0xbe,0x9b,0x21,0x56,0x56,0x70,0xe1,0xe4,0x91,0xf4,0x62,0x49,0xb9,0xa7,0x09,0x47,0x86,0x9b,0xa2,0xf9,0x64,0x00,0xa8,0x26,0xa7,0x02,0x95,0x2a,0x18,0x03,0xc4,0xca,0xaa,0x3b,0x68,0xa1,0xfb,0x6c,0x12,0xe5,0xe8,0x9e,0xac,0x9e,0x30,0x2d,0x33,0x79,0xbc,0x1c,0x08,0x64,0x25,0xcd,0x08,0x3b,0x32,0xe8,0xd8,0xa1,0xbb,0xf2,0xe0,0x4a,0x70,0xd8,0x28,0x29,0x62,0x98,0x65,0x85,0x9d,0xf6,0x2e,0x90,0x89,0x84,0x13,0x83,0x31,0xe0,0xa5,0x49,0x07,0x8d,0x49,0xbf,0x89,0x39,0x8f,0xdd,0x67,0x15,0x63,0x3e,0xa6,0x66,0x62,0x9c,0x01,0xf0,0x3c,0x54,0x88,0xc3,0xf7,0x7d,0x10,0x09,0xa9,0xb9,0xaa,0x56,0x01,0x01,0xf8,0xfe,0x8a,0x8a,0x8f,0x21,0x6a,0x1f,0xac,0xd7,0x5c,0x09,0xb1,0xf5,0x0d,0xad,0x32,0x14,0xb6,0x5a,0x9b,0x05,0xcf,0x56,0xfb,0x07,0x30,0x30,0x32,0xa1,0x2c,0x5b,0x39,0xc0,0x19,0x7a,0x06,0x86,0xb0,0x6d,0xff,0x6d,0x58,0xb8,0x76,0x19,0xf3,0x53,0x17,0xd1,0x33,0x30,0x82,0xd1,0xf1,0x5d,0x98,0x3a,0x77,0x14,0x33,0x57,0xce,0xc1,0xed,0xd7,0x4c,0xe5,0x4f,0xf8,0x96,0xa4,0x1d,0xa6,0xa9,0xe2,0x55,0x43,0xe1,0x3c,0x28,0xe4,0x68,0xc3,0xab,0x30,0x0e,0x51,0xa9,0xa8,0x0e,0x6b,0xe4,0xcf,0x14,0x25,0xed,0x0a,0x52,0x6d,0xa2,0xa7,0x6f,0x08,0x23,0x93,0x3b,0x22,0xd7,0x4d,0xb5,0xd8,0xa6,0x3d,0xd7,0xe3,0xd2,0xa9,0x17,0x42,0x4b,0x4e,0x2d,0xa5,0xdb,0x08,0xd2,0x57,0xa7,0x19,0xa9,0xe7,0x58,0xc5,0x65,0xe1,0x2a,0x82,0xba,0x75,0x36,0x70,0x06,0x8c,0x8e,0xef,0x8a,0x2c,0xb9,0x47,0xee,0xeb,0xfe,0x6d,0x12,0x23,0xcc,0x81,0x51,0x80,0xf9,0xf2,0xb4,0xa2,0x80,0xa4,0x08,0xe8,0x1f,0xdc,0x84,0x85,0x99,0xab,0x39,0x1a,0xb1,0x4a,0x4c,0x34,0x12,0x38,0x49,0xd6,0x94,0x76,0x73,0x78,0xbb,0xba,0x76,0xe5,0x28,0x2e,0x5f,0x7e,0x0a,0x33,0x53,0xcf,0x63,0x75,0xf5,0x0a,0x40,0xab,0x72,0x80,0x26,0x02,0x78,0x2f,0xaa,0xd5,0x2d,0x18,0x1d,0x3b,0x84,0x4d,0xe3,0xb7,0x62,0x70,0x60,0x5b,0x84,0xcc,0x8b,0xf4,0x76,0xb5,0xbc,0x3c,0x83,0x2b,0x53,0xcf,0x61,0x76,0xee,0x65,0xd4,0x6a,0x53,0xf0,0xfd,0x05,0x08,0xb1,0x04,0xaf,0x32,0x00,0xb0,0x3e,0xf4,0x55,0xb7,0x62,0x64,0xf8,0x20,0x36,0x8d,0xde,0x08,0xaf,0xd2,0xef,0x08,0x97,0xac,0xaa,0x74,0x44,0x68,0xaa,0x9e,0x01,0x84,0x15,0xcc,0xc2,0xf2,0xcd,0xd2,0xae,0xea,0x80,0x81,0x61,0x78,0x74,0xab,0x2a,0x63,0x3d,0xf9,0x36,0x06,0x6c,0x1f,0x40,0x25,0x0c,0x6f,0x60,0x74,0x13,0x4c,0x17,0xac,0x2e,0xbe,0xe8,0x1b,0xdb,0x04,0xce,0x2a,0x10,0xb4,0x8a,0x44,0xc3,0x29,0x92,0x4b,0x3a,0x01,0xf1,0x9a,0xf7,0x22,0x8f,0x85,0x6b,0x8e,0x9e,0x57,0xc5,0x4a,0xb0,0x1d,0x30,0x71,0xa1,0xd8,0xc8,0x1b,0x30,0xb6,0x6d,0x0f,0x26,0x0f,0xde,0x81,0x4a,0xb5,0x07,0x00,0x30,0x3b,0x7d,0x01,0x0b,0xb6,0x77,0xaf,0x08,0xa1,0x26,0x4b,0xc8,0x66,0x5d,0x30,0x70,0x23,0x09,0x71,0xbb,0x9d,0x8a,0x57,0x05,0xf7,0x7a,0xc0,0xb9,0xae,0x35,0x8e,0xda,0xca,0x32,0x62,0x89,0x0e,0x5e,0x55,0xed,0x33,0x18,0x67,0x28,0xf2,0x8c,0x29,0xf6,0x04,0xda,0x77,0x5f,0x93,0x58,0xf8,0xac,0x96,0xc4,0x1d,0x5c,0x8b,0xd0,0xde,0x25,0xba,0x96,0x6c,0xb7,0xb4,0x30,0x22,0x57,0x18,0xc6,0xb3,0x14,0xad,0x9f,0x58,0xba,0xeb,0x91,0x70,0x06,0xd4,0x63,0xc3,0x44,0x09,0xb8,0xde,0x8b,0x61,0x7a,0x52,0xc8,0xd7,0x5a,0x17,0x30,0xef,0xf3,0x4a,0x05,0xe0,0xcc,0x12,0x2c,0x85,0x51,0x14,0x0c,0xdc,0xf3,0x8c,0xe6,0xcf,0x80,0x0a,0xc0,0x78,0x2f,0xfc,0x95,0x15,0x10,0x09,0xab,0xda,0x84,0x0a,0xde,0x4a,0xb5,0xea,0x93,0x14,0xe9,0xf8,0xf1,0x75,0x8e,0xb1,0xad,0x7b,0xe4,0x79,0xaf,0x8c,0x83,0xb1,0x8a,0x9a,0x51,0xcb,0xcd,0xfc,0x43,0x9b,0xb7,0x63,0x78,0x7c,0xbb,0x9c,0xdd,0x32,0x8e,0x89,0x03,0xb7,0xc1,0xf7,0x57,0x31,0x37,0x7d,0x29,0x0c,0x43,0xcd,0xe6,0x42,0x62,0x48,0x52,0x91,0x30,0xf0,0x8a,0xec,0x4c,0x02,0x02,0xc1,0x3e,0x3c,0x07,0x51,0x70,0xaf,0x07,0xc2,0xaf,0x81,0x7c,0x1f,0x51,0x75,0x8f,0x7c,0x1b,0xc4,0x63,0x93,0x30,0x22,0x60,0xf3,0xae,0x1b,0x64,0x80,0x9c,0x85,0xd1,0x1b,0xe3,0x92,0xd7,0xd7,0x8b,0xb1,0xad,0x7b,0x30,0x75,0xfe,0xb8,0x71,0x2f,0xa1,0xc3,0x46,0xea,0xc7,0xbe,0x09,0x98,0x2a,0x2e,0xce,0xc3,0xf9,0x9c,0xfd,0x37,0x92,0x6e,0x84,0x9d,0xb0,0x77,0x70,0x18,0x3d,0xa3,0x83,0x29,0xeb,0xcb,0x6e,0x90,0xf5,0xdd,0xa6,0x27,0x5e,0xad,0xa2,0x52,0xed,0x85,0xbf,0xba,0xec,0x28,0xdb,0xa4,0x25,0x0e,0x86,0x70,0xfd,0x5f,0x4d,0x12,0x0b,0xf0,0x76,0x75,0xf5,0xca,0x8b,0x38,0xf9,0xca,0x27,0xb0,0xba,0x7c,0x0a,0xfd,0xfd,0xfd,0x18,0x19,0xec,0x85,0xe7,0x6d,0xc2,0xb2,0x10,0x58,0x5c,0xae,0x61,0xa8,0xaf,0x8a,0x0a,0x80,0xd5,0xd5,0x79,0x2c,0xcc,0x7c,0x13,0x97,0x2f,0x7c,0x01,0x5e,0xcf,0x6e,0xec,0xd9,0xf7,0x6e,0x0c,0x0d,0xed,0x0a,0x08,0x3c,0x4c,0x96,0x83,0x35,0x62,0x5f,0xc9,0x2a,0x24,0xc2,0xd2,0xf2,0x55,0x9c,0x39,0xf7,0x65,0xcc,0xcd,0x1f,0xc1,0x40,0x5f,0x2f,0xfa,0xfb,0x7a,0x51,0xf5,0xaa,0x98,0x59,0xed,0xc7,0xec,0x72,0x05,0xc3,0xfd,0xbd,0xe8,0xaf,0x70,0xac,0xae,0x9e,0xc3,0xd4,0xec,0x71,0x9c,0xbb,0xf4,0x69,0x0c,0xf6,0xdf,0x84,0x5d,0x93,0x6f,0x43,0x6f,0x75,0xc4,0x19,0xae,0x9d,0x1c,0x77,0x9b,0x57,0x97,0x18,0x43,0xb8,0x5c,0xc3,0x11,0x5a,0xdc,0x89,0xf8,0x3b,0x19,0x9b,0x43,0xdf,0xd0,0x28,0xbc,0xbe,0xfe,0xfa,0x0f,0x42,0xc7,0xa3,0x27,0x82,0xcc,0x62,0x03,0xa3,0xe7,0x32,0x8e,0xbe,0xe1,0x71,0xcc,0x4d,0x9f,0x77,0x0a,0x39,0x61,0x9b,0x8e,0xe9,0x7b,0xa3,0x51,0x69,0xc3,0x2e,0x18,0x24,0xcd,0x18,0x40,0xbe,0x3b,0x7f,0x14,0x2d,0xcf,0x6d,0x7b,0x6f,0xc2,0xc4,0x8d,0x37,0xcb,0x5b,0xaa,0x7b,0x8e,0x6f,0xbf,0x2e,0x20,0xe0,0xf0,0x59,0xb3,0xef,0xea,0x65,0x3c,0x38,0xd4,0xc3,0x46,0x54,0xc6,0x36,0x2a,0x73,0xf2,0xc8,0x79,0x05,0x95,0x6a,0x8f,0x1c,0x03,0x11,0x06,0x25,0x77,0x27,0xe8,0x89,0x20,0x8b,0xf7,0xd7,0x80,0x54,0xad,0x35,0xe1,0x48,0xe3,0xb0,0x76,0x35,0x9b,0x9d,0x56,0x5b,0x65,0x1b,0x01,0xc6,0x9b,0xba,0xd2,0x3a,0x46,0x02,0x88,0xbd,0x11,0x4d,0x53,0x2b,0x49,0xb8,0x00,0x29,0xd8,0x29,0x01,0x67,0x97,0x7c,0x6d,0x09,0x54,0x0f,0x5a,0x5c,0x0b,0x0f,0x41,0x88,0x14,0x0c,0x48,0x32,0x49,0x8c,0xf5,0x18,0x1d,0x80,0xa3,0xa2,0xc7,0x31,0x54,0xd4,0x5a,0x8c,0x00,0x89,0x5a,0x10,0x48,0xb0,0x32,0xc1,0x00,0x5e,0xed,0xc1,0xea,0xf2,0x52,0xd8,0x18,0x40,0x4e,0xf2,0x95,0x93,0x2b,0xbb,0x21,0xa8,0x0e,0x60,0x64,0xb6,0x7f,0x70,0x13,0xfa,0x06,0xc7,0x64,0x23,0xa8,0x54,0x24,0x77,0x81,0x83,0x55,0x18,0xc0,0x78,0xa0,0xba,0x61,0x15,0x0e,0xae,0xa4,0xe3,0x6d,0x07,0xee,0xc0,0xc2,0x53,0x5f,0x82,0xa8,0x29,0x42,0xd1,0x7b,0xc5,0x38,0x59,0xf1,0x29,0x08,0x06,0xc6,0xd5,0xc4,0x83,0xb1,0x70,0x8f,0xa9,0xd1,0x10,0x82,0x04,0x21,0xcc,0x92,0xe7,0xf5,0x62,0xd5,0x5f,0x50,0x61,0xa8,0x27,0xb4,0xb0,0xcf,0xc2,0x12,0xd0,0xa4,0xc2,0x2b,0x15,0x8c,0xed,0xd8,0x03,0xa7,0xb3,0x03,0x83,0x84,0xb7,0xec,0x3f,0x84,0x6b,0x17,0x4f,0x41,0x08,0x5f,0x5d,0xe6,0xe8,0x1d,0x1e,0x41,0xdf,0xc0,0x18,0xbc,0x9e,0x3e,0x78,0x5e,0x15,0x95,0x6a,0x0f,0xe6,0xae,0x5d,0xc2,0xb5,0x0b,0x27,0x53,0x5a,0x91,0xca,0x3f,0xe3,0xe0,0x1e,0x0f,0x86,0xb1,0x7a,0x2b,0x34,0xfa,0xee,0xc8,0xf8,0x8e,0x94,0x27,0x5c,0x34,0x1b,0x82,0xb3,0x50,0xa6,0x0a,0x5b,0x89,0x7e,0x46,0xa0,0xb7,0x6f,0x00,0x0b,0xab,0xcb,0x8e,0x44,0x24,0xa9,0xdf,0x58,0x34,0x1a,0x92,0xd7,0x62,0x5b,0x8e,0xc2,0x2b,0xe1,0xb5,0x88,0x81,0x95,0x1c,0xa8,0x7c,0x7f,0x05,0x2f,0x3c,0xfd,0xa7,0x58,0x98,0x7d,0x16,0x23,0xc3,0xc3,0x18,0x1f,0x9b,0x44,0x6f,0x5f,0x2f,0x5e,0xba,0x3c,0x8d,0xbf,0x79,0xfc,0x29,0x3c,0x77,0xe1,0x0a,0x04,0x11,0x2a,0x9c,0xe1,0x75,0xbb,0x26,0xf1,0xfe,0xd7,0xde,0x82,0xed,0xa3,0xa3,0x58,0x5e,0x5e,0xc2,0xec,0xfc,0x34,0x8e,0xbd,0xfc,0x5f,0xfe,0x7f,0xd6,0xde,0x24,0xf8,0xb6,0x24,0xbf,0xef,0xfa,0xe4,0x70,0x86,0x3b,0xfe,0xe7,0x37,0x56,0xbd,0x7a,0x35,0x76,0x55,0x57,0x55,0xab,0xd5,0xc2,0x52,0xab,0x65,0x09,0xdb,0x61,0x23,0x63,0x39,0x14,0xb2,0x59,0x10,0x40,0xb0,0x22,0xb0,0x09,0x36,0x6c,0x60,0xa5,0x08,0xaf,0x08,0x60,0xc1,0x06,0x8c,0x21,0x58,0xc3,0xca,0x2c,0x88,0x50,0x10,0xc8,0x72,0xc8,0x08,0x24,0x2b,0x64,0x09,0xb9,0x25,0x2c,0xb5,0x86,0x6e,0xb7,0xba,0xbb,0xaa,0x6b,0x7c,0xf5,0x86,0xff,0x78,0x87,0x73,0x4e,0x26,0x8b,0x5f,0x66,0x9e,0x3c,0xf7,0xde,0xff,0x7b,0xaf,0x4a,0xca,0x17,0xf7,0xfd,0xef,0x3d,0x43,0xce,0xf9,0xfb,0xfe,0xa6,0xfc,0x25,0x7b,0xfb,0x3f,0xc9,0x8b,0xf7,0x7e,0x36,0x94,0xd1,0xf7,0xdc,0x56,0xd7,0x6c,0xf6,0xdd,0xc6,0xfd,0x1f,0x7e,0xf8,0x6b,0x3c,0x7c,0xf4,0xcf,0x99,0xcd,0xc6,0xdc,0xba,0x79,0x83,0xba,0xaa,0xf9,0xd6,0xa7,0x8f,0xf9,0x9f,0x7f,0xe3,0x9b,0xfc,0xd1,0x67,0x8f,0xf1,0x5e,0xe8,0xf5,0xd7,0x6e,0x9f,0xf0,0x9f,0xfc,0xf8,0x3b,0xbc,0x7c,0x63,0x9f,0xc5,0x72,0xc1,0xe5,0xd5,0xf7,0xf9,0xf6,0xf7,0xff,0x47,0x6e,0x1d,0xfd,0x4d,0x4e,0x0e,0xbf,0xba,0x59,0xd0,0x60,0xcd,0xa5,0x11,0xdf,0xaa,0x62,0xd8,0xaa,0xe6,0xb4,0xcc,0x5d,0x4d,0xf4,0x65,0x1b,0x68,0x5f,0x9c,0xdb,0x01,0xc4,0xcf,0x40,0x62,0xf1,0x7c,0xce,0x26,0x76,0x1a,0xc0,0xa7,0xa9,0x44,0x77,0xac,0x8d,0xec,0x0d,0x90,0xe0,0x2f,0x57,0x4f,0x3e,0x1e,0x68,0xd9,0xdc,0xe0,0x89,0x6b,0xaa,0x39,0xc8,0x37,0x82,0x4a,0xb6,0x4a,0x8d,0xa5,0x6b,0xba,0xad,0xf2,0xe2,0xbb,0xf1,0xda,0xcd,0x97,0xbf,0xc2,0xf1,0xab,0xaf,0x8b,0x73,0x61,0x3f,0xc1,0x99,0xde,0xbc,0x83,0xfa,0xb6,0x98,0xe9,0xb6,0x78,0xe2,0xcd,0x69,0x9d,0x31,0x01,0xdb,0x15,0xcd,0xaf,0xc8,0x35,0x6b,0x0a,0x6c,0x51,0x85,0x76,0x0e,0xdf,0x53,0x28,0x8c,0xb1,0x74,0x4d,0x33,0x04,0xba,0x4d,0xfc,0x48,0xfc,0x88,0xc7,0x56,0x35,0x4a,0x6b,0x7c,0x27,0xce,0x91,0x3e,0x3c,0x3e,0xa0,0x0d,0xa9,0xdf,0xa2,0x73,0x53,0x9f,0x5f,0x64,0x0b,0x86,0x45,0x6c,0x8e,0xdf,0xf0,0x79,0x9f,0x77,0xe2,0x20,0xff,0xad,0x66,0xf7,0x2c,0xd7,0x16,0x08,0x3f,0x0f,0x33,0x98,0x39,0xc5,0x3d,0xc3,0x33,0xfa,0xba,0x99,0x08,0x3b,0xbc,0xa0,0xbf,0xb8,0xe4,0x1b,0xd4,0x1a,0x41,0x92,0xf5,0x3a,0xf8,0x25,0x6b,0x85,0x72,0x2a,0xa9,0x27,0xbb,0xae,0x15,0x47,0x9d,0x42,0x9c,0x15,0x8c,0x36,0x12,0xea,0xcd,0xe9,0x20,0x81,0x9a,0xb4,0x40,0xdb,0xd5,0x8a,0xb6,0x5d,0xa7,0x32,0x72,0x07,0x69,0x5d,0x15,0xb4,0xab,0x75,0xc6,0xc1,0xfa,0x41,0x75,0xa2,0x3c,0x3a,0xe4,0x66,0x72,0x8e,0xd5,0xc7,0xac,0xd8,0xbb,0xfd,0x32,0x18,0x23,0x5c,0x9e,0xd2,0xe1,0x6f,0x20,0xb8,0x5a,0x07,0xe9,0x56,0x87,0xf3,0xb2,0x25,0x73,0x3b,0x0a,0x1d,0x52,0xbc,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x1a,0x71,0x78,0xe7,0x0d,0x3e,0x7b,0xef,0x8f,0x01,0x89,0x71,0xbc,0x0d,0xba,0x81,0x54,0x6b,0x40,0x3b,0x7c,0x90,0xea,0xfd,0x96,0xb4,0xd9,0x4b,0x91,0xb2,0x0a,0x55,0xdf,0x2e,0x65,0xb0,0x55,0x4d,0xdb,0x2c,0x51,0x2a,0x6c,0x5d,0xd2,0x16,0xa5,0xb5,0xd8,0x0d,0x33,0xbe,0x42,0x03,0xf3,0x1b,0x2f,0x61,0x8a,0x62,0x38,0x34,0x3b,0x52,0x31,0x99,0x72,0xe7,0x4b,0x5f,0xe3,0xc1,0x07,0xdf,0xe6,0xe0,0xe6,0x7d,0xf6,0xef,0xde,0x17,0x3b,0xec,0x46,0xda,0x77,0xf7,0xb9,0x3c,0x7d,0x40,0xb3,0x5c,0x3c,0x2d,0x3b,0xb1,0x69,0xc7,0x29,0xad,0x20,0xc6,0xf5,0x79,0x9a,0x97,0xbd,0x31,0x86,0xe9,0xc9,0x6d,0x76,0x4f,0xd1,0x48,0x75,0x36,0xb9,0xdc,0xfc,0x7b,0xcf,0xb9,0xef,0xe8,0x7d,0x91,0x8c,0xce,0x3f,0xaf,0x1a,0x3a,0xcb,0x2d,0x56,0xe1,0x9a,0x40,0x1c,0x4f,0x8b,0x76,0xb5,0xb8,0xfc,0x8c,0x3f,0xfa,0xbd,0x7f,0x48,0x61,0xce,0xb8,0x71,0x7c,0xc2,0x64,0x3a,0xa6,0xaa,0x6a,0x7e,0xed,0xcf,0xde,0xe7,0xbf,0xfa,0xbf,0x7e,0x8b,0xae,0xcb,0xd8,0x47,0xe7,0xf9,0xf5,0xef,0x7f,0xc4,0xbf,0xfc,0xf0,0x01,0xff,0xcd,0xcf,0xfd,0x15,0xbe,0x7c,0xe3,0x90,0xba,0xae,0x19,0xd7,0x35,0xa7,0xa7,0xbf,0xcb,0xb7,0xff,0xe4,0x43,0x5e,0x7b,0xfd,0x3f,0xc0,0x04,0xcd,0xc9,0xb0,0x13,0x36,0xb9,0xf5,0x61,0x2f,0x74,0x5d,0xc3,0x77,0xbf,0xf7,0x8f,0xe9,0xba,0xef,0x73,0xe3,0xc6,0x21,0x93,0xc9,0x94,0x51,0x5d,0xf3,0x4f,0xbe,0xfd,0x3e,0xbf,0xf8,0x4f,0x7f,0x8b,0x36,0x27,0x70,0x0e,0x7e,0xfd,0x87,0x0f,0xf8,0x9d,0x8f,0x7e,0x9d,0xff,0xe1,0xe7,0x7f,0x86,0xbf,0x74,0xe7,0x84,0xd1,0x68,0x4c,0x5d,0x9d,0xf3,0xe0,0xc9,0x3f,0xe1,0x72,0xf9,0x11,0xf7,0x6f,0xff,0x2c,0x19,0x69,0xdc,0xdd,0x7d,0x83,0x5a,0x08,0x20,0x7b,0xed,0x65,0x0d,0x68,0x25,0x1e,0xa9,0x2a,0x12,0xbd,0x3e,0x29,0x0d,0xbe,0xdb,0xca,0xe0,0xda,0xa4,0x4d,0x41,0x3d,0x3b,0x78,0xc6,0x53,0x79,0x09,0xba,0xbf,0xa6,0xb6,0x6f,0xe7,0x3c,0x70,0x3d,0xdf,0xc7,0x7d,0x18,0x7e,0x3e,0x8d,0x82,0xa6,0x74,0xfd,0x29,0x49,0x2e,0x7f,0xd9,0x28,0x7c,0xdb,0x3f,0xaf,0xf2,0xb5,0x1f,0xe8,0xc2,0xe1,0xad,0x57,0x38,0x7e,0xf5,0xb5,0xf4,0x4e,0x24,0x05,0x5e,0x81,0x2e,0x0c,0xb3,0xbd,0x9b,0x9c,0x7e,0xf6,0xc3,0x61,0x93,0x36,0xbe,0x7b,0xc8,0xec,0xb3,0xb1,0xa1,0xd7,0x33,0x37,0xb6,0x2c,0xd1,0xba,0x0c,0xb5,0x12,0xb6,0x76,0x93,0x85,0x56,0xd6,0xe0,0xbb,0x75,0x6a,0x54,0x5c,0xeb,0xf2,0x98,0xd4,0xbd,0x9a,0xce,0x98,0x1e,0xdc,0xa6,0xac,0x26,0xe1,0xb2,0x03,0xef,0x68,0xbb,0x35,0x8f,0x3f,0xfe,0x6e,0x00,0x70,0x90,0x6d,0x4b,0x64,0xf2,0x91,0xea,0xe7,0xf2,0xa6,0x87,0xb8,0xda,0x94,0x86,0x7d,0x3f,0x28,0x3b,0xe6,0xbc,0x58,0x28,0x37,0xf3,0x00,0xe5,0xc5,0x64,0x20,0x8a,0x98,0xf0,0x7e,0xa6,0x82,0xed,0xda,0xf5,0x46,0x56,0x99,0x29,0x6a,0x17,0x93,0x9b,0xbe,0x3e,0x9f,0x67,0xf4,0x76,0x4d,0x41,0x0f,0xa8,0x97,0xef,0x19,0xf9,0xa7,0x7e,0x9c,0xdf,0xbe,0x16,0xb3,0xf2,0xe0,0x02,0xb7,0xde,0xa1,0xfa,0xbd,0x53,0x71,0xfe,0x15,0x25,0xa6,0x1e,0x63,0x4d,0x89,0xd1,0x56,0x00,0xd7,0x6b,0x94,0x36,0x10,0x9c,0x25,0x22,0x9b,0x6c,0xeb,0x09,0x4a,0x5b,0xbc,0x53,0x49,0xb3,0x12,0x3f,0x5a,0x15,0x68,0x63,0x88,0x07,0x91,0xf7,0xf5,0x88,0xed,0x50,0x59,0xfd,0x14,0xde,0x65,0xbf,0x23,0x97,0xee,0xa1,0xde,0xbb,0x49,0x39,0x9e,0x06,0xd0,0x35,0x68,0xad,0x45,0xe6,0x51,0x26,0x80,0xb1,0xd8,0x84,0xb5,0xd2,0xa0,0x05,0x9c,0x95,0xb6,0x80,0xe2,0xf0,0xc5,0xd7,0xd1,0xb6,0xc0,0xe3,0x65,0x97,0x42,0xfc,0x74,0x40,0x27,0xc4,0xba,0xbf,0xa7,0x40,0x1b,0x50,0x26,0xeb,0x6f,0x4d,0xf2,0xd7,0xf7,0x9b,0x94,0xa0,0x67,0x7b,0x95,0x2e,0x28,0xaa,0x29,0xb6,0x1a,0xa3,0x6d,0x1d,0xca,0x4f,0x62,0x30,0xd1,0x53,0xc8,0xa1,0xd8,0xbb,0x7d,0x6f,0x38,0xa4,0x9e,0xcd,0x21,0x4e,0x9f,0xf9,0x0b,0x2f,0xf1,0xea,0x4f,0xfc,0x0d,0x0e,0xef,0xbf,0xbe,0x13,0x7c,0x65,0x86,0x28,0x8e,0x6e,0xbd,0xde,0xcf,0x0f,0xe2,0x58,0x0f,0x3f,0xca,0x16,0x88,0x02,0x5e,0xe1,0xbd,0xba,0xbe,0xd0,0xec,0x33,0xdd,0xbf,0x85,0xb1,0x36,0xbb,0x98,0x7d,0xcb,0xd5,0xae,0x1b,0x33,0xb7,0xbf,0xa5,0x48,0x9e,0xe4,0xb1,0x3f,0x93,0x06,0x41,0x53,0x16,0x13,0x11,0xeb,0xbc,0xda,0xfe,0x28,0x0d,0x3e,0x78,0xa2,0xef,0xba,0x8f,0xfc,0xfd,0x22,0xd1,0xae,0x9a,0xe6,0x8a,0x6f,0xfd,0xde,0x7f,0x47,0x5d,0x5c,0x70,0x7c,0x78,0xc8,0xfe,0xc1,0x1e,0xd3,0xe9,0x8c,0xc7,0xeb,0x96,0xff,0xfa,0xd7,0x7e,0x9b,0x75,0xe7,0xb9,0xec,0x3c,0xdf,0xbb,0x70,0xfc,0xf1,0x69,0xc7,0x0f,0x2e,0x1c,0x4b,0x07,0x67,0xeb,0x96,0x7f,0xf0,0x2b,0xbf,0x09,0xc6,0x32,0x9b,0xcd,0xd8,0xdf,0xdf,0xe7,0xe8,0xe8,0x10,0xad,0x3e,0xe6,0x3b,0xdf,0xfe,0x5f,0xb6,0x99,0x99,0xeb,0xec,0xbe,0x19,0xa1,0xfa,0xee,0xf7,0xfe,0x37,0xe0,0x7d,0x8e,0x8f,0x0e,0x39,0xd8,0xdf,0x67,0x6f,0x36,0xe3,0x49,0xd3,0xf1,0x8b,0xff,0xec,0xb7,0x59,0x7a,0xcf,0xb2,0x85,0xcf,0x96,0x9e,0x8f,0x17,0x9e,0x87,0x2b,0xcf,0xaa,0x83,0xcb,0xb6,0xe3,0x3f,0xff,0xe5,0xdf,0xa2,0xb3,0x96,0xbd,0xbd,0x19,0x87,0x07,0x07,0x1c,0x1f,0x1d,0xb2,0x5c,0xfd,0x2b,0xde,0xfb,0xe8,0x57,0xfb,0x22,0xb6,0x8a,0xdf,0x41,0xe0,0xe3,0x9a,0x74,0x88,0x0f,0x86,0x53,0xe1,0xef,0x35,0x9f,0x38,0x1e,0xec,0x18,0x93,0xec,0xe3,0xbd,0x62,0xbc,0x77,0x0c,0x69,0xce,0x85,0x22,0x37,0x84,0x68,0x8f,0xcf,0xe6,0x8b,0x1b,0xd4,0xeb,0x5a,0xc4,0xf4,0x50,0xef,0xed,0xa1,0xc2,0xfa,0xf4,0xf1,0x13,0xca,0xca,0x38,0xb3,0x7e,0xce,0xe7,0xaa,0xf5,0xad,0x4f,0x5f,0x9c,0x0a,0xeb,0x3f,0xe6,0xe9,0xbc,0x60,0x40,0xb4,0x90,0x97,0x93,0x39,0x37,0xdf,0xfa,0x6a,0x96,0x6f,0xbe,0x26,0xe4,0xa1,0xe9,0xf1,0x0b,0x32,0xaf,0x75,0xa0,0xb9,0x6e,0xfb,0xd3,0x4f,0x95,0xed,0x7c,0x3c,0x2a,0xd1,0x24,0x11,0x0a,0x04,0x7c,0x07,0xf7,0x53,0xad,0x55,0x18,0xb3,0x58,0x77,0x35,0xd8,0x91,0x95,0xe6,0xbd,0xb2,0x1c,0xde,0x79,0x8d,0x93,0x17,0xdf,0xa6,0x9e,0xec,0xa3,0xb5,0x05,0x65,0xc3,0x2e,0x17,0x83,0x31,0x25,0x7b,0xc7,0xf7,0xc2,0xd8,0x49,0x19,0x2e,0xa3,0x13,0xf9,0x38,0x09,0xad,0x1e,0xd2,0xef,0x34,0x64,0xe9,0x5a,0xa0,0xfb,0xb0,0xf1,0x6c,0xec,0xa7,0x8c,0x06,0x29,0xd0,0xa6,0xc4,0x56,0xb6,0x67,0xa4,0x53,0x1f,0x19,0x22,0xcd,0x30,0xa6,0xdc,0x28,0x23,0xfb,0x6c,0x5d,0x1f,0x96,0xb9,0x13,0x13,0x77,0x7c,0x36,0x69,0xa0,0x7e,0x3e,0xc4,0xdd,0xf8,0xb8,0xfc,0x03,0xb8,0x6c,0x88,0x95,0x68,0x61,0x9d,0x07,0xed,0x7c,0x90,0xd2,0x7c,0x1a,0x29,0x53,0x14,0xa2,0xde,0x85,0x14,0x41,0x49,0x21,0xdc,0x4f,0xbf,0xcd,0xd2,0x27,0x4f,0xd3,0xb2,0x18,0xa1,0x32,0x14,0xe9,0x61,0xc9,0x61,0x6d,0x19,0xee,0xf5,0xad,0x4b,0xdb,0x0b,0xf3,0x9e,0x73,0x3e,0x6b,0xbd,0xeb,0x03,0x39,0x28,0xcd,0xc1,0xcd,0x97,0x83,0xe4,0x1e,0x40,0x56,0xc4,0x4c,0x29,0x5f,0x8b,0xfa,0x59,0x29,0x1d,0x98,0x66,0x13,0x9e,0x13,0xfa,0x6d,0xac,0xe1,0xf0,0xe6,0xcb,0xfd,0xac,0x77,0x0e,0xe5,0x7a,0xf9,0x00,0x9f,0xe4,0x22,0x3c,0x1e,0x9b,0x47,0xd7,0x49,0x13,0x20,0x7e,0xd9,0xa0,0xa0,0x5b,0xa3,0x1f,0x00,0x21,0xfb,0x27,0xaf,0xf5,0xcf,0x8d,0xc6,0x73,0xaa,0xf9,0x9c,0xad,0xb4,0x63,0xe0,0x9f,0xfa,0xd9,0x48,0xfb,0xf7,0xee,0xf7,0x5e,0xba,0x3e,0x6c,0xa9,0xca,0x3e,0x5a,0x45,0x0f,0xd2,0xf0,0x89,0x94,0x62,0xe0,0x41,0xb5,0xe9,0x65,0x05,0xf3,0x74,0xd4,0x5f,0x9f,0xd2,0xf8,0xf6,0x03,0x1d,0x6e,0x64,0x0c,0x49,0xe4,0x39,0xb6,0x2a,0x9c,0xf7,0xa3,0x43,0xe1,0x29,0x6c,0xb9,0x73,0x15,0xc8,0x38,0x45,0x35,0xd2,0xc6,0x0a,0x19,0xac,0x16,0xd5,0x4b,0xc0,0x2a,0xc9,0xc0,0xfd,0xb5,0x8d,0x77,0xbd,0xf7,0x7c,0xeb,0x9b,0xff,0x88,0xca,0x5e,0x72,0x70,0xb0,0xcf,0x74,0x36,0x63,0x34,0x1a,0x53,0x16,0x05,0xff,0xfb,0x1f,0x7e,0x87,0x55,0xdb,0xd1,0x38,0xf8,0xee,0x99,0xe3,0x74,0xed,0x59,0x76,0xf0,0x78,0xed,0xf9,0xb3,0xf3,0x0e,0xe7,0xe1,0xb3,0xab,0x05,0xbf,0xfa,0xed,0x1f,0x50,0x95,0x25,0x93,0xf1,0x98,0xf9,0x7c,0xce,0xe1,0xc1,0x01,0x8a,0x8f,0xf9,0xc1,0xf7,0xfe,0x8f,0x9d,0xe3,0x33,0xa4,0x86,0xfd,0xe5,0x1f,0xbc,0xf7,0x2b,0x74,0xdd,0xf7,0x39,0x3c,0x38,0x60,0x3e,0xdf,0x63,0x32,0x9e,0x50,0x96,0x25,0xff,0xf8,0x0f,0xbf,0xcb,0xa2,0xe9,0x68,0x1d,0x3c,0x5c,0x7b,0x56,0x4e,0xfc,0x61,0x96,0x1d,0x3c,0x5a,0x79,0x5a,0x0f,0x0f,0xae,0x96,0xfc,0xf2,0xb7,0xdf,0xa3,0x2a,0x2b,0x26,0x93,0x09,0x7b,0x7b,0x73,0x0e,0x0f,0x0f,0xb8,0x58,0x7e,0x93,0x4f,0x1f,0xfe,0x1e,0x39,0xf8,0xfb,0x8d,0xb2,0x37,0x66,0x72,0xf6,0x2d,0x8c,0x4f,0xce,0x49,0x6f,0x7e,0xb2,0xf1,0x50,0x4a,0x51,0x4d,0xe6,0x64,0x8b,0x3a,0x7d,0x14,0x9e,0xc9,0xde,0x49,0x3f,0x67,0xe2,0x5c,0xd1,0x8a,0x5c,0x1a,0x89,0xf7,0x76,0x0a,0x28,0xd7,0x4a,0x2d,0x1e,0xad,0x0d,0x55,0x55,0x21,0x62,0x44,0x9c,0xeb,0x32,0xbf,0x07,0xf5,0xd8,0x5c,0xa3,0x3b,0x53,0x6f,0xb2,0x50,0x04,0x2d,0x96,0xa7,0xa7,0x1b,0x9d,0xfc,0x55,0xda,0xf0,0xd2,0x3b,0x3f,0x25,0x5b,0x14,0xaf,0xad,0x34,0xec,0xdd,0xbe,0x1d,0x54,0xfa,0x91,0xde,0xf4,0x66,0xb2,0xcd,0x76,0xc4,0xbe,0x8a,0xac,0x83,0x2c,0xc3,0x7e,0x5d,0x1a,0x6d,0xb1,0xba,0xdc,0x7a,0x27,0x8d,0x9c,0x8b,0xe3,0x26,0x7f,0x74,0xf4,0x9f,0xc9,0x90,0x5e,0x2b,0xb8,0xf5,0xd2,0x5b,0xcc,0xf6,0x6f,0x05,0x1f,0x1a,0x1d,0x98,0x54,0x1f,0xe8,0xa5,0x42,0x6b,0x4d,0x51,0x4d,0x18,0xcf,0x8f,0x7a,0xfa,0x4c,0x04,0xd0,0xd8,0xaf,0xa1,0x5e,0x11,0x63,0x36,0xe8,0xb8,0x08,0xb5,0x9b,0xb4,0x31,0xbe,0x03,0x5b,0xeb,0xdc,0x81,0x32,0x1a,0xab,0x4b,0xe9,0x1d,0x37,0xec,0xd2,0x88,0x23,0xa9,0x71,0x38,0xac,0x8e,0x02,0x01,0x24,0xa7,0xaf,0x9c,0x1e,0xec,0xc0,0xbe,0xf4,0xf9,0x02,0x58,0xaa,0x25,0x80,0x41,0x08,0x15,0xf7,0x5c,0x9f,0x9c,0xa8,0xf6,0x03,0x96,0xec,0x0f,0xde,0x8b,0x73,0x11,0x0e,0x8f,0xc6,0x39,0x8f,0xf3,0x0e,0x87,0x47,0x59,0x83,0x52,0xb9,0x63,0x7f,0xe4,0x68,0xbd,0x48,0x12,0x2a,0x48,0x19,0x3e,0x70,0x8e,0x4e,0x53,0xd8,0x11,0xe2,0x29,0xea,0x62,0xf6,0xa1,0x4f,0x1c,0x1e,0x27,0x51,0x97,0x22,0xcb,0xe7,0xe9,0x39,0x23,0x1f,0x25,0xcf,0xc8,0x29,0xc5,0x49,0xe3,0xd3,0xd8,0x4e,0xf6,0x8f,0x29,0x46,0x63,0xb1,0x5f,0x2a,0x15,0x54,0xdf,0x5a,0x54,0xe2,0x41,0xed,0x4c,0x9c,0x4c,0x46,0x6c,0xd3,0xa2,0x26,0x0f,0x9e,0xd2,0x4a,0x71,0x70,0xef,0xb5,0x1e,0x0c,0x63,0x6f,0x78,0xf0,0xb8,0xac,0x4c,0x17,0xc0,0xdd,0x4a,0x7d,0xc2,0xd4,0xf3,0x74,0x99,0xdd,0xc6,0x6d,0x7c,0x76,0x24,0x1f,0xda,0x1d,0x3f,0x71,0x02,0x87,0xfc,0xe6,0x37,0x5f,0xbc,0xee,0xb5,0xeb,0xb0,0xf5,0xda,0x72,0xf2,0x8f,0x2d,0x4a,0xc6,0xd3,0xfd,0x90,0x81,0xdb,0x7a,0x44,0xdb,0xe2,0xfa,0x72,0xe2,0x8c,0x4f,0x52,0x8e,0x64,0x51,0x8d,0xa6,0xd4,0xf3,0xbd,0x61,0x79,0xf4,0x6b,0x6f,0x2b,0x33,0xef,0xd2,0x24,0x97,0xf6,0x67,0xef,0xb8,0xbe,0xcf,0xe4,0x52,0xaf,0x48,0x2b,0xaa,0xe9,0x8e,0x7a,0xe9,0xe1,0xef,0x6b,0x04,0x76,0xa9,0x7e,0xaf,0x61,0x78,0x5a,0xb4,0xab,0x18,0x20,0xe3,0xc3,0xf7,0xff,0x39,0xed,0xea,0x07,0xec,0xed,0xed,0x31,0x9d,0x4e,0xa9,0xeb,0x1a,0x6b,0x2d,0x5a,0x6b,0xbe,0xf5,0xf1,0x03,0x3c,0x70,0xba,0xf6,0x5b,0xdb,0xad,0x57,0x1d,0x5c,0xb4,0x92,0xdb,0x1f,0x7e,0xf2,0x19,0x5a,0x6b,0xac,0xb5,0x8c,0xea,0x11,0xb3,0xd9,0x94,0xfd,0xbd,0x3d,0xce,0xcf,0xbf,0xc9,0xf9,0xf9,0x7b,0x7d,0x47,0x6d,0x0d,0x5a,0x9f,0xae,0x2e,0x3f,0xe1,0xf4,0xf4,0xb7,0xd9,0x0f,0xf5,0x18,0xd7,0x23,0x6c,0x51,0x60,0xb4,0xe1,0x0f,0x3e,0x7e,0x84,0x0f,0x65,0x6e,0x66,0xd3,0x79,0x68,0x82,0x8f,0xd0,0x1f,0x7e,0xfc,0x08,0xa3,0x0d,0x45,0x51,0x30,0x1e,0x8d,0x45,0x2a,0xdf,0x9b,0xf3,0xc9,0xa3,0x5f,0xa5,0x6d,0x17,0x3b,0x8b,0xf7,0xf9,0x85,0x2c,0x6f,0xd1,0x70,0x6d,0xa7,0x9d,0x43,0x1d,0xc6,0x63,0x7a,0x78,0x93,0xd9,0xd1,0x2d,0xf6,0x6e,0xdc,0x93,0x31,0xca,0xe6,0xbe,0xad,0x46,0x14,0x55,0x2d,0x36,0xd2,0xc8,0x50,0x27,0xc2,0xed,0x87,0xf9,0xe7,0xf3,0xc5,0x01,0x5d,0x20,0xbe,0xd7,0x76,0xa1,0xcc,0xd9,0x2a,0xa8,0xb7,0x7d,0x56,0xa7,0xfe,0x95,0x48,0xe3,0xb2,0x35,0xeb,0xba,0x9d,0x4c,0xc5,0xe6,0xc6,0x34,0xad,0x83,0xa6,0x2f,0x07,0x4d,0x07,0x27,0x77,0xbf,0x44,0x31,0x9b,0x6d,0xcc,0x4d,0xdd,0x6b,0x10,0xc3,0x45,0x6d,0x0b,0xc6,0x07,0x27,0x43,0x3a,0x42,0xc7,0x66,0x83,0x3c,0x64,0x58,0x19,0x68,0x7c,0x4e,0x7d,0x95,0xc1,0xd8,0xb2,0xaf,0x9f,0xf3,0xbd,0xf4,0x1c,0xe9,0xfd,0x20,0x4f,0x8f,0xb1,0x76,0x48,0x57,0xbd,0xe7,0xf8,0x85,0x37,0xa8,0xf7,0x0e,0x41,0x2b,0xa1,0x73,0x41,0x68,0x11,0xc6,0x20,0x87,0x7f,0xcd,0xf4,0xf0,0x16,0xf5,0x78,0x3a,0xe4,0x71,0xb5,0x41,0x1b,0x8b,0x31,0x16,0x63,0x0d,0xa6,0xb0,0x18,0x63,0x52,0x7d,0x72,0x9a,0x9e,0x68,0xd0,0x96,0xca,0xd1,0xf7,0x7d,0x14,0x69,0xae,0xb1,0x18,0x65,0xfb,0xcb,0xc3,0xa9,0xb1,0xd1,0x32,0x2d,0x65,0x28,0x2f,0x6d,0xf0,0x2d,0x89,0x38,0x0f,0xfa,0x62,0xd7,0x8c,0x0d,0xb9,0x39,0xf7,0x5c,0x18,0xea,0xb3,0x8f,0xc5,0x28,0xe8,0x9e,0xea,0x5e,0x90,0x4d,0x92,0xbc,0xc0,0x4c,0x31,0xae,0x35,0x2a,0xf7,0xf7,0xf7,0x04,0x89,0xc9,0xa5,0x67,0x35,0x1e,0x63,0x2c,0x78,0x85,0xd6,0x5e,0xa4,0xc9,0x90,0x4b,0xd4,0xc7,0x6b,0xe5,0x13,0xb0,0xe1,0xc3,0x13,0x4a,0x51,0xd4,0x35,0xeb,0xc5,0x52,0x8a,0x53,0x6e,0xd0,0x8b,0xba,0x30,0xa8,0x26,0xa8,0x01,0x07,0x5e,0xce,0x59,0x17,0x2b,0x97,0xd9,0x51,0x7a,0x67,0xb1,0x83,0x9b,0xaf,0x04,0x49,0x37,0xd8,0x9d,0x83,0x0d,0x5b,0x79,0x85,0x32,0x81,0xe4,0x86,0x7b,0x71,0x51,0x6a,0x45,0x50,0x91,0xcb,0x1e,0xd1,0xa2,0x1e,0xb3,0x7f,0x72,0x8f,0xc7,0x9f,0x7c,0x5f,0x56,0xa9,0xca,0x22,0x39,0x85,0x16,0x7a,0x40,0xd9,0x8c,0xb3,0x0a,0x0e,0x5b,0x49,0x52,0xce,0xd4,0x45,0xb1,0xfa,0x59,0xa7,0xef,0x18,0x88,0xed,0x6d,0x14,0xda,0x14,0xcc,0x6e,0xdd,0xed,0xbb,0x46,0xf5,0x44,0x26,0x49,0x94,0x7f,0x8e,0x34,0x3d,0xba,0xc5,0xe5,0xd9,0xa3,0xf4,0xbb,0x57,0xcb,0xf6,0x5b,0x31,0x52,0x11,0x1e,0xb4,0x52,0xbc,0xf8,0xce,0xd7,0x01,0xc5,0x0f,0xff,0xf8,0x77,0xc3,0x16,0x86,0xbe,0xc2,0xf3,0xa3,0xbb,0x6c,0xb7,0x6d,0x93,0x22,0x3e,0x47,0x12,0x91,0x22,0x64,0x15,0x9d,0xeb,0xfa,0xb9,0x67,0xab,0x0d,0x0f,0x59,0x65,0x76,0x94,0xa3,0x89,0x27,0x3b,0xa7,0x76,0x65,0x05,0x3c,0x6f,0xb4,0xab,0xb6,0x5d,0xf3,0xc1,0xf7,0x7e,0x89,0xfd,0xf9,0x8c,0xc9,0x78,0x4c,0x55,0x56,0x14,0xd6,0x26,0x6d,0x4e,0xe7,0x23,0x7b,0xb0,0x3b,0xc5,0xe5,0xd5,0x3a,0x07,0xa8,0x04,0xc2,0x55,0x55,0x33,0x99,0x4e,0x98,0x2f,0x97,0x7c,0xf0,0xc1,0x2f,0xf3,0xe6,0x97,0xfe,0x5e,0xff,0xd2,0x06,0x0d,0x88,0xe9,0xbd,0x0f,0x7e,0x99,0xd9,0x7c,0xca,0x74,0x3a,0x11,0x26,0xa0,0xb0,0x18,0x9d,0xa9,0xe8,0x9f,0x23,0x79,0x00,0xa5,0x30,0xda,0x40,0x01,0xa3,0x7a,0x44,0x33,0x6d,0xb8,0x5a,0x2c,0xf8,0xe0,0xd3,0xff,0x87,0x97,0xee,0xfc,0xcd,0xb0,0xcc,0xfc,0x46,0xf1,0x7e,0x13,0x7f,0xc3,0xc2,0x71,0xc0,0x6e,0x20,0xce,0x93,0x02,0x74,0x51,0x53,0xd6,0x53,0x00,0xaa,0xd1,0x8c,0xd9,0xe1,0x6d,0xd9,0xfa,0x17,0xb2,0x9f,0xcc,0x8f,0x77,0xbf,0xac,0x49,0xf1,0xc4,0x77,0x85,0xe8,0x21,0x8d,0x72,0x20,0xa0,0x4e,0xef,0x70,0x8a,0x97,0xca,0x57,0xa3,0x3d,0x70,0x1f,0xc8,0x0a,0xde,0x8a,0x6e,0x15,0xcb,0xb8,0xde,0xf6,0xdb,0xb7,0xc7,0x81,0x83,0xd1,0x64,0x8f,0xd1,0xec,0x88,0xc7,0x1f,0x7f,0x6f,0x2b,0x22,0x57,0x51,0xd5,0x9c,0xbc,0xfa,0xe6,0x16,0x63,0x90,0x84,0xea,0xa0,0x81,0x52,0x01,0x14,0x0e,0x6e,0xdc,0xe7,0x62,0x70,0x46,0x36,0x09,0x24,0x94,0x56,0x68,0x63,0x71,0x9d,0x30,0x08,0x39,0x29,0x8c,0xed,0x53,0x28,0x8a,0xba,0xec,0xa9,0x78,0x16,0x5f,0x3d,0x23,0x21,0xd9,0x2f,0xf9,0xab,0x94,0x45,0x6b,0x95,0xc0,0x71,0x7e,0x7c,0x8b,0xe9,0xd1,0x6d,0x89,0x9b,0xae,0xc5,0x79,0xd6,0xa0,0x70,0x4e,0xa5,0x7e,0xd5,0x9d,0xc2,0x79,0x59,0x63,0x78,0xc3,0xfe,0xc9,0x7d,0x26,0x7b,0x97,0xa0,0x35,0x5a,0x59,0xf0,0x4e,0x9c,0x41,0xbd,0xc7,0xfb,0x0e,0x5c,0x87,0x77,0x8e,0xd5,0xe2,0x92,0xab,0xb3,0xc7,0xfd,0x90,0x6d,0x78,0x49,0x0f,0xaa,0x17,0x3d,0xa4,0xc3,0x23,0xb6,0x2a,0x31,0xb6,0x14,0xc7,0x3e,0xef,0xf0,0xc9,0x61,0x35,0x68,0x02,0x94,0x0e,0xc2,0xb3,0x4f,0x6d,0x8d,0x3e,0x43,0x4a,0xc9,0x4e,0x15,0xef,0x03,0xdb,0x10,0xa4,0x62,0x87,0x27,0xed,0x1f,0x75,0x84,0xdc,0xc2,0xdc,0x8f,0xcc,0xd7,0xce,0xb9,0x32,0x4c,0x19,0x72,0x46,0xaf,0x29,0xff,0xec,0x7f,0xae,0x23,0x4a,0x75,0x1e,0x97,0xae,0xc7,0xed,0x37,0x3e,0xca,0xf8,0x41,0xce,0xdf,0xdc,0xb9,0xa8,0x6d,0x05,0xca,0x04,0x66,0x2e,0x10,0x02,0xa5,0xf0,0x61,0x3d,0x0a,0x83,0xac,0xc3,0x84,0x0b,0x4b,0xc7,0x68,0x30,0x60,0xab,0x89,0x70,0x79,0xaa,0x1b,0xe4,0x2b,0x3e,0x55,0x1e,0x5b,0x56,0xf1,0x4a,0x18,0x94,0x58,0x0f,0x17,0x00,0x31,0xd4,0xb6,0xd7,0xc1,0x30,0x3b,0xb8,0x49,0x39,0x19,0x67,0xe0,0xab,0x40,0x0b,0xe0,0xca,0xf9,0x9f,0x06,0x6c,0x5c,0x9c,0x5a,0xc2,0x26,0x6a,0x85,0x57,0x81,0xa3,0x53,0x41,0x0f,0xad,0xe0,0xf8,0xd5,0x2f,0xa3,0xb4,0xc2,0x2b,0x97,0xf5,0x58,0xcf,0x23,0x13,0x40,0x6a,0x68,0x43,0xf2,0x83,0x67,0x3d,0x04,0x47,0x95,0x7c,0x42,0x75,0xc3,0x76,0xed,0x4c,0x1e,0xe8,0xd8,0x3b,0xb9,0x13,0x40,0x7e,0x78,0x27,0x99,0xcd,0x9e,0x23,0xa7,0x41,0x52,0xc3,0xcf,0xec,0xc6,0x9d,0x9e,0x76,0x67,0x92,0x88,0x36,0xba,0xe7,0xf4,0x5d,0x3f,0x3f,0xf6,0x6f,0xbd,0x4c,0x35,0xdf,0xa3,0x9a,0xce,0xb9,0xf3,0xe6,0x8f,0x0e,0xb7,0x50,0x19,0xc3,0xec,0xd6,0xed,0x24,0x59,0xa6,0x7a,0xe6,0xe5,0x66,0xf5,0xe8,0xfb,0x87,0xa1,0x96,0x2f,0x3c,0x2b,0xb8,0xe2,0xb2,0xf7,0xc2,0x77,0x2d,0xce,0x25,0xca,0xc8,0x7d,0x65,0x00,0xdd,0x89,0x13,0xd0,0xa6,0x99,0x4e,0x45,0x07,0x42,0x3d,0xa8,0xc3,0xe7,0x89,0x76,0xf5,0xc9,0x07,0xff,0x02,0xab,0x97,0x4c,0x26,0x13,0xea,0x7a,0x08,0xbe,0x00,0xaf,0x9d,0x1c,0x02,0x30,0x2f,0xb6,0xa1,0xc1,0x2a,0x98,0x16,0x72,0xf5,0x8d,0x93,0xc3,0xa0,0x81,0x14,0x89,0xa2,0x28,0x2c,0xa3,0xaa,0x66,0x32,0x99,0xd0,0x36,0x1f,0x71,0x71,0x11,0xbc,0x83,0xd2,0x60,0x0e,0xd1,0x6e,0xb9,0xf8,0x8c,0xf5,0xfa,0x07,0x4c,0xc7,0x13,0xea,0x51,0x4d,0x59,0x84,0x63,0xf5,0x02,0xd3,0xf8,0x95,0xdb,0x02,0x5e,0x95,0xd9,0xa6,0x15,0x46,0x41,0x11,0xd6,0xe4,0x57,0x6e,0x1f,0xa5,0x2d,0x57,0xda,0x68,0xca,0xb2,0xa0,0xae,0x6b,0x26,0xe3,0x09,0x67,0x57,0xff,0x8a,0xce,0xb5,0xec,0x9c,0x51,0x9b,0xe0,0x8b,0x17,0xc7,0x4b,0xbd,0x81,0x74,0xc1,0x39,0x71,0xfb,0x03,0xe3,0xf9,0x1e,0x91,0x4c,0x80,0x63,0x3c,0x3f,0x12,0x8d,0x89,0x72,0xe8,0xc2,0x30,0x3e,0x38,0xce,0xc6,0x2e,0x94,0x12,0xc6,0x69,0x30,0x8f,0xa2,0xdb,0x75,0xb8,0x1f,0xdd,0x2e,0x84,0xfe,0xec,0x02,0xdf,0x3e,0x8d,0x0f,0x0e,0x84,0x97,0xd7,0x81,0xfc,0x86,0x39,0x3e,0x90,0x6e,0x73,0xa5,0xd5,0x35,0x26,0x60,0x0f,0x98,0xb2,0xe4,0xce,0xbb,0x3f,0xc1,0xf1,0xeb,0x6f,0xf1,0xc2,0x57,0xbe,0x8e,0x2e,0x8d,0xb4,0x35,0xbc,0x7c,0xf3,0xfe,0xbb,0x28,0x6b,0x87,0x6b,0x76,0x07,0x1d,0xf7,0x5a,0xe3,0xb5,0x62,0x7e,0xfb,0x0e,0xda,0xd8,0xc1,0xba,0x8e,0x6d,0xb3,0x55,0x8d,0x29,0x4a,0x8a,0xba,0x46,0x97,0x45,0x72,0x7a,0x13,0x85,0xa3,0xd0,0x1b,0x5d,0x56,0xf4,0x00,0xd2,0x43,0x53,0x6e,0x2f,0x76,0x78,0xb4,0xad,0x98,0x1d,0xbf,0x88,0x8e,0x92,0xb2,0x76,0xe8,0xa2,0x90,0x36,0x15,0x96,0xe3,0x17,0xdf,0x4a,0x9a,0x41,0x02,0x0d,0xed,0xdb,0x1e,0x16,0xa1,0x09,0x6b,0x20,0xbb,0x6e,0xcb,0x09,0xc6,0x56,0xf4,0xce,0xae,0xa4,0x39,0x2f,0x43,0xa3,0x28,0xc7,0x13,0x8a,0xd1,0x88,0x24,0xf1,0x86,0xa4,0xb4,0x09,0x1a,0x15,0x1f,0xda,0x13,0xff,0x39,0xbc,0x16,0x4d,0xab,0xad,0x27,0x60,0x14,0xda,0x1a,0xa1,0x51,0xc2,0x65,0x04,0x1c,0x08,0xed,0xd6,0xe0,0x75,0xdf,0xde,0xd4,0x07,0x71,0xfb,0xa6,0x96,0xef,0x4e,0x21,0x7e,0x4d,0x44,0xaa,0x4d,0x2a,0x2f,0xce,0x6f,0xa5,0x55,0xa0,0x55,0x2e,0x60,0xe5,0xf3,0xfd,0xd3,0xf8,0x68,0x1b,0x78,0x8a,0x5d,0x66,0xa0,0x76,0xee,0x39,0x06,0x5b,0x94,0x58,0x63,0x45,0x2d,0xeb,0xa2,0x24,0xa0,0x88,0xb6,0x89,0xc8,0x69,0x29,0xad,0x02,0xa8,0xc9,0xeb,0x3a,0x3a,0x59,0x28,0x69,0xb2,0x56,0x91,0xff,0xf0,0x89,0xc8,0xe9,0xe0,0xc8,0x25,0xee,0xef,0xa5,0x2c,0xe0,0x81,0xde,0xc2,0x27,0xdb,0xb0,0x48,0x0a,0x65,0x78,0x5e,0x73,0x74,0xf7,0x55,0x6e,0xdc,0x7b,0x13,0x6d,0x6d,0xb0,0x49,0xea,0x64,0x9b,0x30,0xca,0xa0,0x94,0xe1,0xe0,0xf6,0x6b,0x80,0x25,0x79,0x3a,0x9b,0xf0,0x4c,0x20,0x12,0xda,0xe8,0xc4,0x41,0x6b,0xd5,0x4b,0xac,0x2a,0xd8,0x80,0x63,0xc8,0x09,0x05,0x54,0xb3,0x19,0x27,0x2f,0xbd,0x4d,0xd2,0x8f,0x6b,0x43,0x51,0x8d,0x18,0x8d,0x67,0x4c,0xe6,0x87,0xec,0x1d,0xdf,0x66,0xef,0xe0,0x2e,0xe3,0xd9,0xbe,0x70,0x81,0x1b,0x32,0x50,0xa2,0x15,0xa1,0xcf,0x92,0x2a,0x63,0x90,0x34,0x07,0xb7,0x5e,0x16,0x1b,0x4a,0x02,0xe7,0x2e,0xe5,0xb5,0x77,0xe7,0xde,0xb6,0x34,0x14,0x3e,0x31,0x04,0xef,0x26,0xb6,0x3d,0x35,0xf9,0xe1,0xa7,0x9e,0xcf,0xb1,0xd6,0x12,0x5c,0x38,0x43,0xbd,0x55,0x70,0x08,0x1b,0x26,0x6b,0x0a,0x0e,0xef,0xbd,0x9c,0x7e,0xd7,0x7b,0x07,0xdc,0x78,0xf1,0x8d,0xf4,0x7b,0xef,0xe8,0x0e,0xa6,0x2c,0xc8,0xe7,0xd3,0xee,0x0a,0x6c,0x7e,0x1f,0xfe,0x75,0x81,0xbb,0xf7,0x91,0xe2,0xe7,0x92,0x58,0xe4,0x80,0x3c,0x98,0x62,0x4c,0x0c,0x3c,0xd0,0x7f,0x36,0xe7,0xb7,0x43,0x1b,0x43,0x35,0x1a,0x51,0x8e,0x26,0x99,0xf4,0xf4,0xfc,0xd1,0xae,0x1e,0x3e,0xf8,0x7d,0x46,0xa3,0x11,0x65,0x59,0x62,0x8b,0x22,0xa8,0xe1,0xfa,0x1e,0xff,0xbb,0xef,0x7c,0x09,0xad,0x14,0x95,0x81,0x97,0x66,0x9a,0x2a,0x00,0xdd,0xc8,0x2a,0xee,0xcf,0x64,0x2b,0xde,0xb8,0x28,0xf8,0xb7,0xdf,0x7a,0xb5,0xef,0x63,0x25,0xbb,0x05,0x8a,0xa2,0xa0,0xae,0x2b,0x46,0xf5,0x88,0x87,0x8f,0xfe,0x60,0xd8,0x37,0x1b,0x5d,0xf5,0xf0,0xd1,0x1f,0x32,0x1a,0xd5,0x54,0x75,0x45,0x69,0x05,0x7c,0x85,0x11,0x90,0x47,0xfe,0xfd,0xaf,0x7e,0x89,0xba,0xb0,0x68,0x05,0xfb,0xa5,0xa2,0x34,0x02,0xbc,0x95,0x81,0xfd,0x4a,0x6a,0x7c,0x3c,0x19,0xf1,0xf3,0x5f,0x7e,0x35,0xd4,0x21,0xae,0x43,0x43,0x59,0x96,0xa1,0x8d,0x8a,0xd3,0xb3,0x7f,0xbd,0x2d,0x88,0x6c,0x8d,0xa7,0x4f,0xe3,0xd1,0x6b,0xc5,0x02,0x6b,0xba,0x09,0x60,0xe1,0x63,0x4c,0x25,0x5e,0xb4,0x6e,0xd8,0xbc,0xfd,0xe3,0x17,0x99,0x1f,0xdd,0xe1,0xe8,0xce,0xab,0x22,0x6d,0xe5,0x0c,0x48,0xe8,0xab,0xed,0x3a,0x64,0x52,0xcb,0x46,0xbd,0xae,0xd7,0x45,0x48,0x2a,0x67,0x33,0x39,0x96,0x50,0x72,0x7f,0x2a,0x58,0x03,0x32,0x8f,0x3a,0x1f,0x3e,0xa4,0x8f,0x72,0x70,0x78,0xf3,0x95,0xb4,0x3b,0x61,0xb4,0x77,0xc8,0xfd,0xb7,0xff,0x32,0x71,0xaf,0xed,0x64,0xff,0x88,0x83,0xfb,0x2f,0xf5,0x74,0x20,0xac,0xd7,0x0d,0x92,0xdb,0x57,0xdb,0x83,0x2a,0x0a,0x0e,0xef,0xbc,0x46,0xaf,0xfe,0x16,0x29,0xdb,0xe8,0x22,0xe5,0x0b,0x12,0xfc,0xa3,0x30,0x65,0x7a,0x51,0x79,0xb9,0x66,0xb7,0x4e,0x7b,0x92,0x88,0x7d,0xc9,0x40,0xe8,0x40,0x63,0xb9,0xfb,0xf6,0x8f,0x73,0xfc,0xea,0x9b,0xdc,0xfb,0xca,0x4f,0x33,0x3b,0xb8,0x0d,0xce,0xcb,0xce,0x15,0xe5,0x39,0x7e,0xe1,0x4d,0x74,0x59,0x22,0x8c,0x9d,0x98,0x17,0x95,0xd8,0x11,0xd1,0x2a,0xfa,0xd1,0x28,0x74,0xf4,0x5d,0x49,0xbe,0x14,0x12,0x4b,0x3b,0x69,0x96,0x10,0xba,0x9d,0x7c,0x5b,0x74,0x70,0x80,0xf5,0x50,0x4f,0x67,0xd2,0x29,0x4e,0xfa,0xb5,0x28,0x6b,0x8a,0xb2,0xc2,0x16,0x15,0xb6,0x1c,0xf5,0x52,0x7a,0x54,0xf1,0x2a,0x4f,0x35,0x9e,0x42,0xa4,0xfb,0x5e,0x62,0x3b,0x18,0x63,0xd0,0xca,0xa6,0xbe,0x11,0x4d,0x43,0x16,0xb7,0x21,0xa8,0xad,0x55,0x34,0x63,0xa8,0x30,0x9e,0xc9,0xbc,0x29,0x73,0x45,0x25,0x75,0x74,0x1c,0x0c,0x97,0xbe,0xaa,0x3c,0x08,0xc9,0x33,0xf0,0x54,0x85,0xbf,0x56,0xa1,0xf0,0xda,0x64,0x1b,0xb3,0xf3,0x14,0x66,0x5c,0x7e,0xb2,0x0d,0xc1,0x39,0xc9,0x96,0x41,0x22,0xd4,0x18,0x0c,0x6d,0xdb,0x08,0x01,0x0c,0x52,0x84,0x48,0xa7,0xc2,0x61,0xda,0xa2,0x44,0x11,0xe2,0xa3,0x22,0x07,0xca,0x0b,0xf3,0xe9,0x89,0x9e,0xcf,0xca,0x6b,0x3c,0x46,0x9e,0x0b,0x5e,0x4e,0x0a,0x11,0x79,0x94,0xd5,0xd8,0x6a,0x4c,0x7b,0x75,0x96,0xd5,0xa2,0xff,0xdf,0x23,0x12,0x76,0xa1,0x2d,0x87,0x77,0x5e,0xa7,0x1c,0xcf,0x30,0xca,0x70,0xbb,0x9e,0xf1,0xe8,0x87,0x7f,0xda,0xc7,0x04,0x0e,0xcf,0x4f,0x0e,0x6e,0x52,0x4e,0xe6,0x24,0xce,0x25,0x0c,0x52,0x52,0x5d,0x45,0x15,0x73,0x60,0x1e,0x22,0xb7,0xdc,0x77,0xaf,0x6c,0x49,0x12,0x5c,0x96,0x67,0x6f,0xbc,0xf1,0x23,0xcc,0x6e,0xdc,0xc5,0xd6,0x23,0xca,0xf1,0x64,0xab,0x0b,0xe3,0xc2,0x79,0xef,0x9b,0xbf,0x29,0x11,0x9a,0xa2,0xd4,0xcd,0x06,0xf1,0x72,0x19,0x4c,0xa6,0x18,0xa8,0x70,0x70,0xeb,0x1e,0x27,0x6f,0xbc,0x03,0xde,0xf3,0xf1,0x1f,0xff,0x3e,0x67,0x71,0x1b,0x02,0x9a,0x7a,0xb6,0x4f,0x39,0xdd,0xdb,0x31,0x7e,0x7d,0xd1,0x9b,0x49,0x3d,0xd7,0xcd,0x3c,0x69,0x66,0x47,0x2f,0xf2,0xf8,0x93,0xef,0x13,0xf7,0x73,0x6b,0x5b,0x04,0x6d,0xc7,0xb0,0xad,0x07,0xb7,0x5e,0x4e,0x76,0xe1,0x98,0xf6,0x5f,0xb8,0x4f,0xdb,0xac,0x58,0x9e,0x3f,0xe6,0xe8,0xa5,0x37,0xb6,0xcb,0xde,0xc4,0x58,0x14,0xd1,0x58,0xef,0x5d,0xd6,0x1f,0x91,0xc9,0xc3,0x13,0x1d,0xc2,0x44,0xa4,0xe9,0x81,0x70,0x78,0x9c,0x99,0xa2,0xae,0x26,0x5c,0xae,0xb6,0xa3,0xf8,0xe4,0xbf,0xb4,0x32,0x94,0xe5,0x44,0xf8,0x52,0xd7,0xa0,0x8b,0x1a,0xd6,0xab,0x81,0xea,0xf9,0x69,0xd1,0xae,0xbc,0xeb,0xb8,0x38,0xfd,0x53,0x6e,0x9e,0x1c,0x52,0x96,0x05,0x26,0x80,0x5e,0xde,0x97,0x6f,0xde,0x3c,0xe2,0xef,0x7f,0xe3,0x47,0xf9,0x9f,0x7e,0xf3,0x9b,0xcc,0x0a,0xc5,0x6c,0x6f,0xa8,0x8e,0xd5,0x4a,0xf1,0x8b,0x7f,0xe3,0xa7,0x38,0x9e,0x8c,0x07,0x75,0x54,0xc8,0x96,0xad,0xa2,0x28,0xa9,0xaa,0x8a,0x27,0x67,0xdf,0x01,0xff,0xb3,0xec,0x4e,0x9e,0xb3,0x8b,0x7f,0xcd,0x64,0x5c,0x51,0x14,0x05,0xc6,0x66,0x9e,0x9f,0x21,0xdd,0xdd,0x9b,0xf2,0xdf,0xfe,0xdc,0x4f,0xf3,0x9f,0xfd,0xd2,0xff,0x0d,0x78,0xf6,0xcb,0xe1,0x80,0x57,0xd6,0xf0,0x8f,0x7e,0xe1,0xaf,0x32,0xab,0x72,0xe7,0x1c,0x69,0xbf,0xb5,0x86,0xb2,0x2c,0xa4,0x1e,0x97,0xdf,0xe1,0x60,0xef,0x4b,0xc3,0xf9,0xeb,0x77,0x4c,0x29,0x0f,0xa0,0x51,0xa6,0xc0,0xb7,0x61,0x6f,0xbf,0x8f,0x0b,0x68,0x3b,0xd5,0xe3,0x7d,0x86,0xf6,0x51,0x9d,0xfc,0x33,0xa6,0xfb,0xb7,0xc9,0xc4,0x52,0x99,0x13,0x99,0x9d,0x5e,0xc6,0x46,0x45,0xc1,0x99,0x18,0x8c,0x26,0xf5,0x41,0x3a,0x5d,0x45,0x65,0xf4,0x6a,0x77,0x52,0x28,0x46,0xd3,0x03,0x2e,0x42,0x58,0x4a,0x90,0xe8,0x78,0xcd,0xe2,0x8a,0xdd,0xdb,0xeb,0x76,0x23,0xb4,0x32,0x05,0xf3,0x3b,0x2f,0x0e,0x3a,0x66,0x72,0x72,0x93,0x57,0xbe,0xfa,0x57,0x78,0xf2,0xf1,0xfb,0x9c,0xbc,0xf2,0x26,0xfe,0x99,0xe8,0x3e,0xac,0x19,0xc0,0x8d,0xd7,0xde,0xe6,0xf4,0xd3,0xef,0xb1,0x5e,0xf4,0xf6,0x78,0x53,0x14,0xc1,0xd6,0xdb,0x37,0x4c,0x99,0x92,0x52,0x59,0xda,0x4e,0x68,0xb4,0x29,0xaa,0x4c,0x8c,0x0a,0x2c,0xd2,0x46,0xbc,0x65,0xb4,0x62,0xff,0xf6,0x7d,0x8a,0x7a,0x0a,0x38,0x28,0xe0,0xe4,0xb5,0x77,0xa9,0xc7,0x87,0x3c,0xf9,0xf4,0xfb,0xcc,0x8f,0x5f,0x64,0x7e,0xfb,0x5e,0x50,0x3d,0x23,0xf8,0x11,0x24,0x5e,0x1f,0x1c,0xb7,0x24,0x04,0x68,0x27,0xb4,0x53,0x3b,0xbc,0x0b,0x63,0xee,0x3c,0x62,0x27,0x76,0x78,0x2f,0xe0,0x2d,0x21,0xc2,0xbd,0x88,0x60,0x5e,0x87,0x79,0x2f,0x27,0xa6,0x15,0xf5,0x98,0xf5,0xe5,0x05,0xb6,0xaa,0x41,0x99,0xc4,0x78,0x29,0xc4,0xb1,0xab,0x5b,0xaf,0xe9,0x54,0x83,0x72,0x8a,0xb2,0x9e,0x08,0x73,0x16,0x1d,0x7d,0x02,0x5b,0xa3,0x50,0xe1,0xcc,0x01,0x15,0x7c,0x92,0x10,0x67,0x5c,0x99,0x1c,0x3d,0x33,0x17,0xde,0x49,0x31,0x2b,0x1c,0xbd,0x26,0x62,0x6b,0xc8,0x55,0x06,0xc6,0x0a,0xef,0xe3,0x21,0x1d,0x41,0x73,0xf9,0x1c,0xc7,0x17,0x5a,0xf1,0x60,0x8e,0x31,0x4b,0xb3,0x12,0x82,0xcd,0x46,0x75,0x3e,0xcc,0x55,0xe9,0x12,0x6d,0x42,0xdc,0x53,0xb9,0x8d,0x36,0x22,0x48,0x5b,0x5b,0xd0,0xa5,0xb0,0x89,0x42,0x14,0x95,0x16,0x43,0xb8,0xca,0x6d,0xc3,0xde,0x89,0x6a,0x37,0x0c,0x8c,0x4e,0x9d,0x24,0x6a,0x0c,0x8d,0x4f,0x5c,0x4b,0xaa,0x87,0xf7,0x94,0xd5,0x84,0xe5,0xc5,0x13,0x59,0x88,0x9e,0x3e,0xcf,0xd8,0x7c,0x05,0x07,0xb7,0x5f,0xa7,0x1a,0xcd,0x83,0x23,0x80,0xa2,0x18,0xcf,0x98,0x1f,0xdf,0xe1,0xc9,0x83,0xf7,0x90,0xc5,0x21,0x75,0xdd,0xbb,0x71,0x3f,0x80,0xad,0xd8,0xda,0x94,0x56,0x89,0x7b,0x89,0x40,0x9c,0xdb,0xfd,0x92,0xbc,0x1b,0xd4,0xd1,0x69,0xdf,0x75,0xe6,0xa9,0xa8,0xf0,0xa2,0x16,0x8b,0x83,0x18,0x69,0x5e,0x1c,0x9f,0xd0,0xb5,0x27,0xaf,0xbe,0xc5,0x7b,0xbf,0xf7,0x9b,0x81,0x38,0xe4,0xec,0xed,0xae,0xc1,0x0a,0xcb,0x44,0x1b,0x8e,0x5e,0x7e,0x23,0x95,0x79,0xeb,0xad,0x1f,0xa1,0xfd,0xff,0x16,0x5c,0x3e,0x79,0x0c,0x08,0xe0,0x6d,0x93,0x3d,0xb5,0xfd,0xed,0x3a,0x61,0xf3,0x39,0xd3,0xf8,0xe0,0x88,0x8b,0xc7,0x1f,0xd1,0xb5,0x2d,0x4a,0xf9,0x30,0xb6,0x59,0x6d,0x1d,0xd8,0xb2,0xe2,0xe0,0x85,0x57,0xc8,0x1b,0x1f,0x8b,0x3d,0x7a,0x39,0x12,0xeb,0x8c,0x21,0xf2,0xf9,0x13,0x21,0x65,0xa6,0xfc,0x30,0x4d,0x76,0x9e,0x9e,0x96,0x95,0xbc,0xf1,0x3b,0x7b,0x58,0x29,0x8a,0xd1,0x04,0xce,0x1f,0x93,0x89,0x4c,0x83,0xa4,0x95,0xa1,0x1c,0x4d,0x64,0x2c,0xe3,0xa9,0x54,0x90,0xbc,0x51,0xb7,0xb7,0x1c,0xf9,0xcc,0x61,0x5a,0xbe,0x2c,0x57,0xa7,0x18,0xdd,0x51,0x14,0x36,0x6d,0x65,0xdb,0x35,0xa4,0x7f,0xff,0x27,0xbf,0xc6,0xcd,0xe9,0x84,0x7f,0xf8,0x1b,0xbf,0xcb,0xc3,0xab,0x9e,0x70,0xde,0xdb,0xdf,0xe3,0xbf,0xf8,0x6b,0x5f,0xe7,0xa7,0x5f,0x19,0x3a,0xd2,0x89,0xc0,0x1d,0xb9,0x78,0x51,0x47,0x3b,0x77,0xda,0xb7,0x7b,0xc0,0xc4,0xc8,0x8f,0xae,0x3b,0xa3,0x28,0x4a,0x8c,0x0d,0x47,0xeb,0xd1,0x4b,0xbf,0x31,0xfd,0x3b,0xef,0xbe,0xce,0xed,0xd9,0x84,0xff,0xf2,0x9f,0xfd,0x0e,0xbf,0xf7,0xe1,0xa7,0xa1,0x1f,0x14,0xdf,0xb8,0x7f,0x87,0x7f,0xf0,0xd7,0x7f,0x82,0x77,0x6f,0x0d,0x6d,0xac,0x49,0x15,0xad,0x34,0xd6,0x1a,0x8a,0xc2,0x72,0xb5,0x3a,0x1b,0x66,0xba,0x05,0xbe,0x7e,0xd0,0xe5,0xd6,0x58,0x9a,0x76,0xcd,0xd3,0xec,0xc0,0xda,0x96,0x94,0xf5,0x64,0xa3,0xef,0x72,0xdb,0x71,0x3e,0x39,0x42,0xa1,0x11,0x50,0xc3,0xff,0xbd,0x47,0xf4,0xc6,0x2b,0x59,0x48,0xca,0xfc,0x81,0xa7,0xf1,0xa0,0x93,0xfd,0x9b,0x5c,0x3c,0x7a,0x00,0x78,0xea,0xf1,0x94,0x97,0x7e,0xec,0x67,0x78,0xf4,0xfd,0xef,0xf2,0xd9,0x0f,0xff,0x74,0xf7,0xbb,0x6a,0xfb,0xe2,0xd1,0xad,0x97,0x31,0x65,0xb9,0x75,0x7d,0x7c,0x74,0xc2,0xf8,0xe8,0x64,0xa3,0x4e,0x3b,0x7f,0xee,0xb8,0xa2,0xd0,0x45,0xc1,0x6b,0x5f,0xff,0x5b,0x2c,0x4e,0x1f,0xa3,0x00,0x5b,0x15,0x59,0xe3,0x15,0xb6,0xa8,0x30,0x45,0xc5,0xa3,0xef,0x7d,0x87,0x07,0x1f,0xfc,0x29,0x56,0xe7,0xa6,0xba,0x9e,0xee,0xc4,0xb0,0x04,0x3e,0x1b,0x40,0xa3,0x0c,0x07,0x2f,0xbc,0x2c,0x34,0xca,0x29,0x94,0x13,0xfb,0xee,0xf4,0xf6,0x5d,0xa6,0xb7,0x44,0x12,0xf6,0xde,0xe1,0xe8,0x20,0x44,0x0e,0x54,0x4e,0xe3,0x95,0x0b,0x36,0xe2,0xa0,0xdd,0xc0,0x88,0x80,0xbe,0x5e,0xa3,0x54,0x60,0x9e,0xb5,0x02,0xa7,0xf0,0x2e,0xfa,0x5e,0x44,0x3a,0x11,0x71,0x22,0x00,0x98,0xf1,0xa8,0x4e,0x51,0x8f,0xa6,0xb4,0x57,0x0b,0xb4,0x32,0xdb,0x9a,0x41,0xef,0x30,0xd6,0x62,0x90,0x3a,0x14,0x45,0x85,0xf3,0xb2,0xa3,0xc6,0x27,0xfa,0x42,0xc0,0x9e,0xd8,0x6c,0x0d,0x2a,0x68,0xf2,0x9c,0xfc,0xa7,0xa0,0x07,0x5d,0x2f,0x92,0x7c,0x2a,0x29,0x27,0xd1,0x99,0xd0,0x8b,0xf6,0x19,0x61,0xd2,0xe1,0xb6,0x0a,0xc0,0x4e,0x16,0x6a,0xf3,0xfa,0x64,0xe5,0xd0,0xea,0xb8,0xd0,0x23,0x6b,0xd1,0x13,0xa2,0x68,0xe3,0x52,0x38,0x54,0x51,0xa1,0x94,0xd8,0x32,0x35,0x1e,0x8c,0x0a,0x87,0x01,0x49,0x10,0x0e,0x63,0x0b,0xba,0x75,0x13,0xb6,0x59,0x8a,0x84,0x62,0x4c,0x39,0xa8,0x84,0x8f,0x5b,0x56,0x02,0x51,0xf3,0x2a,0xc9,0x9a,0xc2,0xbf,0x2a,0x15,0x1c,0xa5,0x02,0x18,0x86,0x80,0xf8,0xa6,0xa8,0x30,0xd6,0x06,0xee,0x82,0x8c,0x03,0xd5,0x18,0x6b,0x39,0xb8,0xf5,0x0a,0xb6,0x1a,0x27,0x4e,0x58,0x0e,0x79,0x50,0x8c,0x8f,0x5e,0x64,0x71,0x71,0xc6,0xe2,0xea,0x09,0xa0,0x99,0x1d,0xdc,0xc4,0x8e,0xeb,0x00,0xb8,0x62,0x5c,0x4f,0x12,0x6f,0x0c,0xc0,0x41,0xb0,0x03,0x0c,0xea,0x15,0xf6,0xef,0x9a,0x04,0x8b,0x40,0x60,0x20,0xf4,0x70,0x8c,0x06,0x5f,0x36,0x80,0x63,0x34,0x3f,0xa4,0x9e,0xce,0x59,0x5c,0x3c,0x19,0x48,0xb8,0x7d,0x8a,0x1c,0x68,0x9f,0xc5,0xfc,0xf8,0x0e,0xa6,0xaa,0xfa,0x47,0x94,0xe6,0xee,0x3b,0x3f,0xc1,0xa7,0xdf,0xf9,0x16,0xca,0x58,0xb1,0xa7,0x66,0xf2,0xf9,0x26,0xe5,0x1f,0xc2,0xe0,0xb3,0xb9,0xb2,0x3c,0xe5,0x4f,0x4f,0x0e,0x8e,0xc0,0x2b,0x8c,0x29,0x52,0xc6,0x3e,0x7b,0xc8,0x7b,0x38,0x7a,0xe1,0x4d,0x31,0x37,0xec,0x92,0x6e,0xf3,0x4b,0xee,0x9a,0x1b,0x79,0x8a,0x84,0xc1,0x0d,0xb1,0xd3,0xfb,0xcc,0x67,0xc4,0x65,0x15,0x70,0x1a,0xe7,0x1d,0x3e,0x48,0xc4,0x4a,0xe9,0xc0,0x6c,0x6b,0x4c,0x51,0xd0,0xac,0x37,0x3c,0x77,0x91,0xc3,0xd7,0xcb,0xd1,0x84,0xc8,0x0c,0xb8,0x8c,0x20,0x28,0x13,0x24,0xa9,0xcd,0x2d,0x47,0x81,0x80,0x25,0xc2,0xe1,0x61,0x75,0xf5,0x48,0x82,0xf2,0xeb,0x7e,0x3b,0xdb,0x6e,0x27,0x20,0xf8,0x85,0x77,0xbf,0xc4,0xcf,0xbf,0xfd,0x06,0x7f,0xf4,0xe9,0x67,0x3c,0xbe,0x5a,0x72,0x63,0x3a,0x49,0x76,0xdf,0x5d,0x29,0xf2,0x79,0x5a,0x69,0x8c,0xd6,0x78,0xb7,0xa2,0x73,0x6b,0x8c,0xca,0xb4,0x0c,0x59,0xff,0xb4,0xdd,0x15,0x5a,0xd7,0x5b,0xaa,0xe7,0xcd,0xf4,0x8d,0xfb,0x77,0xf8,0x3f,0xff,0xa3,0x5f,0xe0,0xe1,0xd5,0x92,0xcf,0x2e,0x17,0xdc,0x9c,0x8d,0xd9,0xaf,0xab,0xdd,0x0f,0x43,0x42,0x37,0xa5,0x34,0x5a,0x1b,0xda,0xf6,0x62,0x28,0xfd,0x0e,0xd2,0x10,0x7c,0x7d,0xb0,0xcb,0x2b,0x6d,0x71,0x29,0x12,0x9d,0xdf,0x7a,0x73,0x3a,0x3f,0x08,0x12,0x47,0x98,0xc7,0x41,0x5d,0x26,0xdb,0x1a,0x41,0x18,0x60,0x9d,0xe5,0xcb,0x30,0xfc,0x73,0x18,0x1e,0x15,0x04,0x84,0xeb,0x04,0xcb,0x64,0x42,0xd8,0xe9,0x84,0xd5,0x67,0x3e,0xbd,0x79,0x9b,0x07,0x3f,0xf8,0x13,0xba,0xb6,0xe1,0xe0,0x85,0xd7,0xf1,0x0a,0x0e,0xef,0xbd,0xc2,0xe9,0xa7,0x3f,0x60,0xbd,0x5a,0x3e,0x75,0x0a,0x7b,0xa0,0x1c,0x4d,0xd8,0xbf,0xf7,0xf2,0xe7,0xe0,0x7d,0xaf,0x5b,0xa7,0x91,0xfa,0x0f,0x25,0x55,0x53,0x95,0x4c,0x6f,0xdc,0xdc,0xc8,0xc2,0xe5,0x8f,0x70,0xf8,0xea,0xeb,0x9c,0x3d,0xfe,0x90,0xe5,0xc5,0x06,0xc3,0x94,0x1e,0x0a,0xf9,0x66,0x95,0xdc,0x4f,0x5a,0x2c,0xd7,0x6f,0xaf,0x0f,0x9a,0x25,0xd1,0x00,0x76,0xd0,0x05,0x27,0xd5,0x28,0xa4,0x19,0x87,0x6a,0x85,0x7e,0x2b,0xa5,0xf0,0xa6,0x43,0x75,0xc2,0x3d,0xeb,0xc2,0xe0,0x9a,0x4e,0x90,0x23,0x36,0x43,0x8b,0xa9,0xcd,0xa7,0x76,0xb9,0xac,0xf9,0x01,0xa4,0x15,0xe8,0xa2,0xa2,0x9a,0xcc,0xe8,0xda,0x55,0xb8,0xbd,0x6b,0xc0,0x14,0x55,0x59,0x0b,0xdd,0x6e,0xe3,0xd8,0x46,0x29,0xb6,0xef,0x33,0xe7,0x41,0x6b,0x2f,0xda,0x65,0x90,0xc9,0x13,0x01,0xd3,0x29,0x91,0xd8,0x63,0x7f,0x07,0xe1,0x20,0x2a,0xdc,0xe4,0xec,0xf6,0xac,0x8f,0x3b,0xb2,0xd8,0x4e,0xb9,0xf0,0xaa,0x21,0x1d,0x69,0xf9,0x74,0xcd,0x86,0x8d,0x54,0x74,0x40,0x2c,0x92,0xf8,0x2d,0x99,0x6a,0x5b,0xa0,0x4c,0x35,0x98,0xe8,0x00,0xaa,0x93,0xca,0x29,0x17,0x3c,0x85,0x95,0xc2,0x14,0x96,0xae,0xed,0x50,0x5e,0x1c,0x0f,0xd2,0x22,0x32,0x9e,0x81,0xee,0xdf,0x93,0x6c,0x06,0x12,0xec,0xc2,0xcb,0xc6,0xf7,0x14,0x67,0x31,0xac,0x22,0x05,0x31,0x20,0x46,0x3d,0xd9,0xdb,0x08,0x44,0xae,0xa9,0x26,0x63,0xe6,0xc7,0xf7,0x31,0xb6,0x0c,0xfb,0x51,0x11,0xa3,0x7f,0x20,0xbc,0x4a,0xc3,0xe1,0x8b,0x6f,0xf1,0xd9,0xfb,0xdf,0xc2,0xb7,0x1d,0x07,0x77,0x5f,0x21,0xa9,0x93,0x53,0x2c,0xc3,0x30,0x91,0x94,0x80,0x3e,0x91,0x29,0x48,0x7b,0x0a,0x33,0xc7,0x9c,0x80,0x38,0x4a,0x69,0x91,0xa9,0xa3,0x43,0x47,0xde,0x35,0xf1,0xb9,0x6b,0x56,0xdd,0xec,0xf8,0x2e,0x8b,0xad,0x93,0x7a,0x7c,0xca,0x20,0x97,0x5d,0x15,0x70,0xf8,0xe2,0xeb,0xe9,0x91,0xf4,0x8c,0x35,0xdc,0x7c,0xeb,0x2b,0xc3,0xf7,0x77,0x7e,0x57,0x1b,0x7f,0xaf,0x4f,0x4f,0x95,0x94,0x15,0x14,0x93,0x19,0xa6,0xac,0xe8,0xd6,0x1b,0x47,0x19,0x86,0xe7,0x27,0xb3,0x03,0xf6,0x6f,0xdf,0xd9,0x9d,0x41,0xac,0xfb,0x33,0x80,0x79,0xf7,0x4d,0x7f,0xcd,0x5f,0x37,0xfc,0xad,0x3d,0x3a,0xa8,0x95,0xc4,0x21,0x34,0x6a,0x77,0xa0,0x1e,0xcf,0xe9,0x06,0x00,0xac,0xc2,0x56,0x16,0x39,0x93,0x39,0x6e,0xeb,0xca,0x95,0xd7,0xf2,0x58,0xbf,0x32,0x92,0xfb,0xc5,0x8e,0xfd,0x7c,0x6d,0xb7,0x0a,0x40,0xb7,0x31,0x17,0xae,0x49,0x5a,0x2b,0xde,0xb9,0x75,0xf2,0x8c,0xa7,0x86,0xc9,0x87,0xfa,0x80,0x97,0x30,0xad,0x19,0x23,0x94,0xc0,0xcc,0xc3,0x33,0xd4,0x05,0x5b,0xe9,0x68,0x5c,0x73,0x34,0xae,0x3f,0xd7,0x3b,0x92,0xb2,0xfe,0xf7,0x4f,0x1f,0xda,0xd8,0x1f,0xc6,0x1a,0x7c,0xb3,0x1d,0x46,0x51,0x24,0xb8,0x31,0xd6,0x56,0x81,0xb5,0x95,0x5c,0x94,0xf6,0x28,0x3a,0xb1,0x29,0xc6,0x28,0x5a,0x29,0x99,0x8d,0x8e,0xce,0x27,0xd9,0x10,0xa8,0x9e,0x9a,0x36,0x25,0x9c,0xec,0x15,0x6b,0x2c,0x37,0x5f,0xfd,0x32,0xab,0xb3,0x33,0xe6,0x37,0x6e,0x11,0xd7,0xe9,0xe1,0xdd,0xd7,0xf9,0xf8,0xbb,0x7f,0xb0,0x23,0xab,0x20,0x5c,0x78,0x51,0x07,0xbf,0xf0,0xd6,0xd7,0xc2,0xd1,0xa3,0xcf,0x5b,0x9b,0xcd,0x9e,0xd9,0x66,0x6c,0x9e,0xdd,0x0e,0x9d,0x71,0xa8,0x92,0x4e,0x5e,0x7a,0x8b,0xf7,0xbf,0xf5,0x2f,0xae,0xcf,0x22,0x89,0x87,0x0a,0x6b,0x4b,0x0e,0x5e,0x7c,0x6d,0x50,0x23,0xef,0x55,0xf2,0xc0,0x96,0x2c,0x54,0xa0,0x93,0xc1,0xf1,0x29,0x30,0x47,0x92,0x43,0x70,0xd6,0x72,0x0a,0xaf,0x3c,0x4e,0x83,0x72,0x0a,0xa3,0x0a,0x3a,0xb5,0x0e,0x2a,0x62,0xb1,0x59,0xc7,0xbe,0x52,0x80,0x8f,0x8e,0x2a,0xde,0x04,0x29,0x52,0xa3,0x7d,0x07,0xba,0xa0,0x9a,0x4c,0xb8,0x7a,0xb2,0x0c,0xe1,0xc3,0x83,0xc7,0x73,0x46,0xb0,0x8c,0x29,0x50,0xba,0x40,0x39,0x27,0xbb,0x1d,0x1d,0x19,0xbd,0xf1,0x7d,0x13,0x01,0xd7,0xf9,0x6c,0x7a,0xe4,0x03,0xd3,0x46,0x71,0x8b,0xe1,0x84,0xee,0xe7,0xb7,0x30,0x76,0x19,0xf7,0xbf,0x49,0x8a,0x90,0x36,0xf5,0x2a,0x6d,0x77,0x3d,0x31,0x10,0x0c,0xe9,0xb9,0x50,0x6d,0x2d,0x2e,0xfc,0xf3,0xde,0xa1,0x6d,0x08,0xcc,0x1d,0x0c,0xf6,0x62,0x76,0x51,0xa8,0xb0,0x08,0x7c,0x1c,0x1d,0xed,0xfb,0xd6,0x19,0x8b,0xa9,0x2a,0x4c,0x3d,0xea,0x55,0x94,0x26,0xf8,0xfe,0xaa,0x36,0x0d,0xb4,0xd7,0x79,0x3c,0x64,0x45,0xef,0x91,0xa8,0x44,0x55,0xa1,0x14,0x28,0x1f,0x42,0x41,0x8a,0x34,0x53,0x4f,0x0f,0xd1,0xd6,0xe0,0x55,0xd8,0xfe,0x73,0xeb,0x25,0xf6,0x6f,0xbe,0x8a,0xb6,0x26,0x0c,0xbb,0x86,0xb8,0xd5,0x22,0x6d,0x45,0xd0,0x98,0xb2,0xe4,0xe6,0xeb,0x5f,0xe3,0xf6,0xdb,0x3f,0x8e,0x2a,0x0a,0x71,0xaa,0xca,0x54,0xdc,0x2a,0xd7,0xd5,0x2b,0x9f,0x79,0xf5,0x45,0x08,0x1c,0x76,0x62,0x8c,0x75,0x1d,0xc1,0x37,0x8d,0xa5,0xa2,0xf7,0x38,0xde,0x45,0x81,0x82,0x27,0xf5,0xec,0x66,0x3c,0x3c,0x3c,0xb2,0xeb,0x3e,0xf5,0x4b,0x6e,0xde,0xf2,0xc0,0xe4,0xe0,0x36,0xe5,0x74,0xda,0xe7,0xf1,0xb9,0x93,0xbf,0xe6,0x73,0xcd,0x93,0x6a,0xf8,0xc9,0xcb,0x55,0xc0,0x64,0x76,0x48,0xef,0x31,0x93,0xb7,0x4f,0x71,0xf2,0xfa,0xbb,0xbd,0x97,0x38,0x6a,0xc3,0xb3,0x39,0x6f,0x6b,0x96,0xaf,0x62,0xbb,0x5d,0x7a,0xc7,0xdf,0xfc,0x19,0xc5,0x35,0x8c,0xa5,0x0e,0xf6,0x23,0x1d,0x16,0x8c,0xcc,0x09,0xe7,0xa1,0xa8,0x46,0x68,0x5d,0x88,0x65,0xca,0xd6,0x8c,0x66,0x07,0x94,0xf5,0x4c,0x2a,0x98,0xfb,0x18,0xc6,0xef,0xd0,0xdb,0xe3,0x93,0xea,0x39,0x02,0x5c,0x66,0xff,0x0d,0x2f,0x8e,0x46,0x07,0x74,0xce,0x89,0x7d,0x29,0x39,0x83,0x3d,0x07,0xf1,0xff,0x3c,0xc9,0x7b,0xd9,0x56,0xa1,0xec,0xf0,0x94,0xa2,0x1c,0x7c,0x01,0x6b,0xa7,0x38,0xe7,0x70,0xce,0x11,0xa3,0xc4,0xfd,0xc5,0x94,0x4f,0xc8,0x4f,0xb6,0x8d,0x18,0x33,0x63,0x17,0xf8,0x6e,0x5e,0xf0,0x51,0x72,0xf0,0x72,0x76,0x6f,0xec,0xc7,0xc1,0x56,0x4e,0x0c,0xa3,0xf1,0x5e,0x7a,0x35,0xee,0x94,0x88,0x51,0x91,0x9c,0xd7,0x29,0x22,0x9e,0x24,0xdd,0xff,0xc9,0xe7,0x42,0x3e,0x9f,0xf2,0xf9,0x73,0xdd,0x33,0xe9,0xf7,0x70,0x7e,0xe6,0x6b,0x61,0x76,0xe3,0x2e,0xc7,0xaf,0xbd,0x35,0x58,0x97,0x7b,0xb7,0xee,0x60,0xcb,0xa8,0x81,0xe8,0x3d,0xc8,0x54,0x68,0xb1,0x2d,0x6b,0x5e,0xfa,0xca,0x4f,0x52,0x4c,0xe7,0x4f,0xf5,0x6a,0x1e,0xf4,0xd9,0x73,0xae,0xd3,0x6b,0x53,0xde,0xae,0x8d,0xf8,0xc4,0x93,0x93,0x1b,0x14,0xa3,0x71,0xd6,0xc6,0x8d,0x32,0x32,0x26,0xe4,0xe0,0xce,0xeb,0xa8,0xa2,0xef,0xc4,0xa8,0xaf,0xec,0x77,0xaf,0x10,0xbc,0x9a,0xa3,0x70,0x12,0xbf,0xfb,0xe4,0xf0,0x96,0x60,0x2c,0xae,0x5d,0xad,0x50,0x36,0x3e,0x17,0x1c,0x9a,0x4c,0xc0,0x13,0xa5,0x45,0x40,0x8b,0xa0,0x6a,0x32,0x7a,0xab,0x0d,0xda,0x96,0xd8,0x72,0x22,0xd1,0xf6,0x94,0xe4,0xef,0x71,0xc9,0xfc,0x83,0x86,0x62,0x54,0x67,0xe5,0x23,0x1a,0x58,0xa2,0xb7,0xb3,0xd4,0x25,0xa1,0x96,0x92,0x35,0x11,0x19,0x0a,0x59,0xa7,0x5d,0x64,0xaf,0x77,0xf7,0x7f,0xea,0x2f,0x07,0xca,0x6d,0xdc,0x8d,0x65,0x64,0x57,0x8d,0xea,0xf7,0x0c,0xf9,0xc1,0x6e,0xf1,0x9e,0x7a,0xaa,0x74,0x18,0x83,0x27,0x4a,0x79,0x36,0x6c,0x65,0x11,0x1d,0xb8,0x12,0x9f,0x05,0xe7,0x12,0x38,0x42,0xa8,0x7c,0x00,0x51,0x15,0x54,0xd0,0x92,0x85,0x16,0x2f,0x32,0x25,0x12,0xa8,0x57,0x1d,0xc9,0x56,0xab,0x7c,0x3f,0x1a,0x4a,0x3c,0x52,0x4d,0x72,0x52,0x91,0x0e,0x55,0xbe,0x07,0x61,0x92,0x1e,0x3f,0x6c,0x8c,0x46,0x80,0x6f,0xef,0xa6,0x78,0x66,0x5a,0x5b,0x87,0xad,0x15,0x20,0x07,0x38,0x28,0x54,0x74,0xfe,0x8a,0x7d,0x16,0xa4,0x72,0xf0,0xc9,0x09,0x43,0x69,0x2d,0x2a,0x12,0x20,0xc6,0x9d,0x8e,0xaa,0x2a,0x15,0x27,0x03,0x5e,0x38,0x3e,0x0d,0xa2,0x3a,0xeb,0x6d,0x56,0x5a,0x99,0x20,0x3d,0xf7,0x9d,0x9f,0x40,0x86,0xd8,0xff,0xaa,0xff,0x1a,0x7f,0x66,0x7a,0x40,0x3b,0x1e,0x53,0x4d,0xa6,0x2c,0x2f,0xce,0x07,0xd2,0x2e,0x91,0x50,0xc5,0x97,0x35,0x1c,0xdf,0xef,0xbd,0x87,0xff,0xe2,0x52,0x5e,0xd9,0x0d,0xaa,0xe0,0x77,0xfc,0xcc,0xae,0x4d,0x0e,0x6f,0xa6,0xfd,0x98,0xb9,0x23,0xca,0xc9,0x9d,0x37,0xa9,0x66,0x93,0xde,0x83,0xf0,0x79,0xd3,0x2e,0x1a,0x13,0x19,0xcb,0xa8,0x7a,0x4e,0x2a,0xa4,0xd0,0x47,0x5e,0x25,0x47,0x8e,0x67,0x79,0xb2,0xf6,0x79,0x2a,0xa6,0xfb,0x37,0x71,0x5e,0xa4,0x2f,0xef,0x5c,0xef,0xef,0xa6,0x7b,0xf0,0x72,0xd9,0x77,0x61,0xfc,0x14,0x03,0x69,0x37,0x83,0x55,0x1f,0x90,0xc4,0x7b,0x4f,0x59,0xed,0xd3,0x34,0x8e,0xae,0x6d,0xe9,0x5c,0x27,0x4e,0x20,0xbb,0x98,0x8b,0x2f,0x92,0x3c,0x38,0xef,0xe8,0xba,0x8e,0xa6,0x6d,0xd1,0x7a,0x32,0xb8,0xb7,0x99,0xb4,0x9e,0xb2,0x6e,0x2e,0x69,0xdb,0x0e,0xe7,0x1c,0xc6,0x84,0xf9,0xfc,0xe7,0xa9,0x4b,0x00,0x5f,0xe7,0x1c,0x4d,0xdb,0xd2,0x34,0x2d,0x56,0xcf,0x76,0x54,0x61,0x37,0xe0,0xfb,0x38,0x54,0xd6,0xa0,0x4d,0x81,0x73,0xc3,0x13,0x81,0xc6,0x93,0x39,0xca,0x6c,0xfa,0x75,0xa8,0x9d,0xd3,0xa3,0x7f,0x80,0xc4,0x24,0x25,0x66,0x38,0x20,0xa7,0x47,0x80,0x5d,0x69,0xfa,0x83,0xbe,0xb6,0x6c,0xc0,0xcf,0x93,0x7c,0x26,0x49,0xe5,0xed,0xd1,0xec,0xdd,0x7c,0x89,0xcf,0xde,0xff,0x36,0x7d,0x14,0x2a,0x09,0xf8,0x51,0x4f,0xf7,0x79,0xe1,0xcb,0x3f,0x86,0xa9,0x47,0xcf,0x51,0x56,0x5c,0x83,0x3b,0x0a,0xf9,0xf3,0xa6,0xe8,0x3c,0x11,0x8a,0xd8,0xbf,0x71,0x9f,0x07,0x3f,0xf8,0xd6,0xa0,0xac,0x4d,0x26,0xb1,0x28,0x0b,0xf6,0x5f,0xba,0x2f,0xb4,0x54,0xf7,0x52,0xaa,0xc4,0xf0,0xee,0x02,0xfe,0xc4,0x31,0xce,0x38,0x73,0x1f,0x9e,0x53,0xa2,0xa2,0x4e,0xb9,0xfa,0xe8,0xc5,0x24,0x57,0xb4,0x32,0x38,0x3a,0xd9,0xc6,0x19,0x9d,0x27,0x3d,0xe1,0x7b,0x8b,0xf2,0x69,0xe7,0x32,0x1e,0x82,0x17,0xba,0xfc,0xb6,0x55,0xcd,0x2a,0xf9,0x19,0x85,0xda,0x7b,0xa8,0xaa,0x59,0x70,0xe4,0xea,0x7a,0x13,0x04,0x48,0x5d,0x82,0x43,0x98,0x4f,0x15,0x0d,0xe0,0xaf,0x7c,0xb8,0x07,0x49,0x05,0x0d,0x44,0xbf,0xa0,0xa1,0x72,0xcd,0xa7,0x7b,0x03,0xc9,0x36,0x3d,0xbf,0x3d,0x72,0x62,0x46,0xcd,0xce,0xb4,0xf7,0x7a,0x70,0x5f,0x0e,0x1c,0x4a,0x01,0x9c,0x75,0x5f,0x58,0xd8,0x6c,0x19,0xc3,0xa4,0xab,0x48,0xfc,0xbc,0x50,0x2a,0x95,0x11,0x6d,0x35,0xb0,0x61,0x8a,0xe8,0x16,0x23,0x9e,0x08,0x88,0xe6,0x2a,0xa2,0xec,0x59,0x4f,0x98,0xb4,0x5a,0xf2,0xf0,0xaa,0xff,0x1d,0x9e,0x8d,0xee,0xe2,0x1a,0x48,0x31,0x62,0xd1,0x18,0x5d,0x62,0x4d,0x25,0x40,0xe9,0x55,0x00,0x78,0x15,0xb8,0x30,0x40,0x19,0x34,0x21,0xfc,0x59,0xdc,0xdb,0x19,0x6d,0x72,0xd1,0x61,0xca,0x93,0xd9,0x91,0x22,0x57,0x96,0xfd,0xcd,0x1d,0xad,0x7a,0xa3,0x6f,0x70,0x94,0x77,0x19,0xf8,0x6e,0xf6,0xfc,0x0e,0x8a,0x9b,0x87,0xc6,0xcb,0x9e,0x9d,0xee,0xdf,0x4e,0x6d,0xed,0x19,0xae,0x9c,0x7b,0x50,0x4c,0x0f,0x6f,0x51,0xcd,0xf7,0xfb,0x77,0xbf,0x00,0x53,0xbc,0x9b,0xdd,0xdf,0xf5,0xfd,0xf9,0xd2,0xe4,0xc6,0x8d,0x50,0xe5,0x68,0x60,0xd3,0x4c,0xf7,0x6f,0x70,0xf8,0x72,0xbf,0x75,0x66,0xa0,0x0a,0x80,0xac,0x6d,0x3b,0x45,0x8f,0x6b,0x6a,0xad,0xd2,0xde,0xc0,0xed,0x03,0x37,0x7c,0xa2,0xaa,0xa6,0x2a,0x19,0x1d,0xed,0xa3,0xec,0x53,0x6c,0x2d,0x71,0x4a,0x1a,0xc2,0x31,0x98,0x5c,0x23,0x41,0x67,0x73,0x37,0xfd,0x1e,0xee,0xfc,0x1b,0xaa,0x9e,0x49,0x92,0xb0,0x56,0x96,0xd1,0xf8,0x05,0x56,0xeb,0x15,0x6d,0x13,0x40,0xf8,0x1a,0x30,0xfa,0x5c,0xc9,0x0b,0xf9,0xe8,0x3a,0xc7,0xba,0x6d,0x58,0xaf,0x56,0x4c,0x46,0x2f,0x65,0xdd,0x11,0x88,0x55,0x4f,0xf1,0x98,0x4d,0x5e,0x63,0xbd,0x5a,0xd1,0xac,0xd7,0xe1,0x4c,0xed,0x2f,0x34,0x71,0x36,0xaa,0x21,0x92,0x6f,0xd7,0xb5,0x34,0xeb,0x86,0xd5,0x6a,0xc5,0x7c,0xf6,0xfa,0x46,0xb6,0xdb,0x32,0x7f,0xef,0xd8,0xd3,0x77,0xb8,0x29,0x82,0x9d,0x39,0x8c,0x43,0x31,0x1a,0x89,0xa3,0xdc,0xc6,0x74,0x10,0xe9,0xe8,0xfa,0xf9,0x11,0x9f,0x82,0xb8,0xbb,0xbe,0x9f,0x1f,0x4a,0x89,0x12,0xec,0x3a,0x3b,0x7c,0x3f,0xd6,0xf9,0xef,0x6b,0xe6,0xad,0xdf,0x3d,0x4f,0x0f,0x5e,0xb8,0x8f,0xd2,0x86,0x3e,0x36,0x02,0x4c,0xf7,0x4f,0xb8,0xf7,0xd5,0x6f,0x08,0xf8,0x3e,0x57,0xfa,0x8b,0x5b,0x9b,0x3b,0x69,0x44,0xda,0xdf,0x0e,0x7b,0xb7,0xee,0x92,0x1c,0x56,0x02,0x80,0xa6,0xad,0x3f,0x81,0x0e,0x1d,0xdc,0xfa,0xd2,0xce,0xa8,0x65,0x0a,0x51,0x29,0x8b,0x1d,0x38,0x9a,0xe9,0x10,0xba,0x1a,0xb5,0x15,0xc1,0x3f,0x40,0xa9,0xe1,0xb1,0xb2,0x2a,0xd8,0xea,0x14,0xba,0xdf,0x8f,0x1e,0xef,0x86,0x6d,0xa0,0xe2,0xe7,0xa0,0x41,0x1b,0xc9,0xcf,0x07,0xd3,0xa7,0x32,0x89,0xa9,0xaa,0x46,0x7b,0x3d,0xcd,0x0c,0xa9,0x28,0xe4,0xe4,0xb6,0xa4,0x58,0x8b,0xa2,0x65,0xa4,0xa5,0x51,0x4a,0x8f,0xd3,0x10,0x05,0x49,0x93,0xa2,0xb3,0xdc,0x92,0xc8,0x2d,0x9d,0x13,0xa7,0x86,0x0f,0x38,0x17,0xfb,0x2c,0x57,0xfe,0x25,0xbc,0xcc,0xfa,0x3c,0xdc,0xd7,0x4e,0xa1,0x94,0xcd,0x44,0xde,0x5e,0x50,0x88,0x66,0x4e,0x79,0x2e,0x2c,0xf0,0x34,0x89,0x06,0xe1,0xb4,0x08,0xa1,0x13,0x7d,0x8a,0x34,0x15,0x17,0x94,0x04,0x27,0x0f,0x8b,0x3f,0x7a,0x92,0x79,0x9f,0xe2,0x75,0xc6,0x30,0x8c,0x29,0x94,0x58,0xaa,0x77,0x00,0xb8,0xa8,0xc6,0x1b,0xcc,0x39,0x95,0xa9,0x3d,0xbd,0x50,0x5f,0x6f,0x82,0xdd,0xd8,0xa7,0x85,0x20,0xc1,0xd7,0xe3,0xbb,0xf1,0xb9,0xf0,0xd5,0x3b,0x51,0x83,0xba,0x67,0xf1,0x21,0xfd,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x60,0xfd,0x53,0xf1,0xcc,0xdc,0xbe,0x9b,0x45,0x80,0x8a,0xef,0xc5,0xfd,0x69,0xfd,0x84,0xea,0x8d,0xbb,0xfd,0x60,0x88,0x6d,0x40,0x93,0x4f,0xe0,0xb8,0xed,0xb7,0xa7,0x05,0xf9,0x48,0x0c,0xeb,0x35,0x58,0xd4,0xc0,0xf4,0xe4,0x76,0x22,0xeb,0xd9,0x68,0x0e,0x9e,0x3d,0x79,0xf9,0x4d,0x9e,0x9a,0x9e,0x9b,0xa6,0xfa,0x8d,0xef,0x5f,0x9c,0x18,0x6b,0x53,0x30,0x39,0xb8,0x41,0x9c,0xa1,0x45,0x3d,0xe6,0xf6,0x1b,0x5f,0xcd,0x98,0x97,0x67,0x10,0x8e,0x1d,0x7d,0xb1,0xfb,0x31,0x9f,0x05,0x7d,0xef,0x01,0xb1,0x27,0xb7,0x32,0x89,0x27,0x27,0x07,0x54,0xf3,0x29,0xe3,0xc3,0xfd,0x6c,0x8e,0x6d,0x70,0xa5,0xf1,0x86,0x27,0x86,0xec,0x16,0x27,0x0c,0xdf,0x5f,0xc3,0x87,0x39,0x91,0x6e,0x10,0x3c,0x3d,0x19,0x00,0xed,0xe0,0xef,0x46,0xbf,0xee,0x1f,0x7e,0x85,0xab,0xab,0x05,0xab,0xa5,0x80,0xf0,0x9f,0x57,0x05,0xec,0x43,0xb9,0xce,0x75,0x34,0x4d,0xc3,0x6a,0xb9,0xe2,0x6a,0xb1,0xe0,0xe0,0xe0,0xdd,0x41,0x07,0xfa,0x8d,0xe1,0x3d,0x39,0xfc,0x11,0xae,0xae,0x96,0x2c,0x16,0x4b,0x56,0x39,0x08,0x7f,0xd1,0x61,0x0f,0x7d,0xd3,0x76,0x1d,0xab,0xd5,0x9a,0xc5,0x62,0xc1,0x6a,0xe5,0xd8,0x9f,0xbe,0xb6,0x9d,0xa5,0xcf,0xbf,0x66,0x3f,0x9c,0x4b,0xd1,0xfc,0x8c,0x15,0xc7,0x4c,0x91,0x50,0x0b,0xaa,0xf1,0x7e,0x1f,0xd2,0xd7,0xf7,0xd9,0x6c,0x83,0xb9,0x24,0xad,0x2d,0xa3,0xe3,0x7d,0xec,0x28,0x06,0x93,0xc8,0xe7,0x05,0xc4,0x79,0x22,0x8e,0x36,0xd7,0x35,0xda,0x0f,0xbf,0x3e,0x57,0xdf,0x0c,0xe7,0xb7,0xb6,0x05,0x87,0xb7,0x5e,0x26,0xae,0x85,0x6a,0x34,0xe5,0xce,0xdb,0x3f,0x36,0x70,0x12,0x7b,0xfe,0xb4,0x3d,0x9f,0x9e,0x0b,0x84,0x9f,0xa7,0xde,0x21,0x94,0xa5,0xad,0x47,0x4c,0xf6,0x8e,0x88,0xbd,0xd2,0x87,0x83,0x90,0x8c,0xca,0x7a,0xc4,0xde,0x8b,0x2f,0x85,0xaa,0x78,0x54,0xea,0x57,0xf0,0x68,0x51,0x36,0x98,0x58,0xa0,0x1a,0x30,0x7d,0xbd,0x9b,0x8c,0x6c,0x6b,0x95,0xcb,0xc1,0x85,0x35,0x6c,0x2b,0x12,0x59,0x4b,0xfc,0x6d,0xe2,0xdc,0x8e,0x0e,0x96,0x1e,0x0d,0x4e,0x87,0xd3,0xb0,0x94,0x08,0x52,0x4a,0xa4,0x5f,0x07,0x41,0xa2,0x54,0x94,0xf5,0x98,0xb8,0x98,0xad,0xb1,0xe2,0x40,0xe9,0x55,0x88,0x40,0xda,0x6b,0x12,0x62,0xab,0xb4,0xf3,0xa4,0x08,0x79,0x51,0x6a,0x0d,0xc1,0x37,0x24,0x90,0x8a,0x4f,0x20,0xe9,0x9c,0x0f,0xa6,0x1b,0x9f,0xad,0x5d,0x9f,0xf0,0x4b,0xe4,0xd5,0xf0,0xdd,0xbb,0x8d,0x08,0x93,0xc1,0xfc,0x84,0x4b,0xdf,0xfb,0x7e,0x0a,0x79,0x74,0x5d,0x3f,0xa6,0xa1,0xef,0xfa,0xc3,0x18,0x62,0x45,0x06,0x50,0xef,0x93,0x6e,0x3b,0x79,0x15,0x86,0xc1,0xf1,0x84,0x4d,0xdb,0x99,0xc7,0x5d,0x64,0x1e,0x95,0xcb,0x0e,0x8a,0xd3,0x91,0xba,0x39,0x31,0x15,0x47,0x36,0x25,0x97,0x8c,0x75,0xaf,0x1e,0x93,0x8d,0xdc,0x02,0xe4,0x3a,0x80,0xb9,0x94,0x1b,0x42,0x99,0x29,0x07,0xca,0x8b,0xac,0x9c,0x0e,0x73,0x60,0xe0,0x30,0xa5,0xf0,0x68,0xd3,0x1f,0x88,0x47,0xda,0x14,0xae,0xfb,0xef,0x01,0x5c,0x93,0x90,0x9c,0x49,0x3e,0xf2,0x7f,0x54,0xab,0x47,0x7e,0x2d,0x78,0x7e,0xab,0xde,0x4a,0x10,0xe7,0x76,0x7c,0x7c,0x40,0xf1,0x9f,0xa6,0xef,0xf3,0x50,0xef,0xef,0x53,0x98,0x32,0x9b,0xe2,0xf1,0x96,0xfc,0xde,0x3f,0x79,0x81,0x6a,0xb6,0xe3,0x60,0x85,0x3c,0x0d,0x85,0x80,0xeb,0x0b,0xbb,0xf6,0xc5,0x2f,0x96,0x0e,0xee,0xbc,0x02,0x40,0x51,0x8d,0x79,0xe9,0x9d,0xaf,0x4b,0xb4,0x9d,0x01,0xa7,0xf1,0x34,0xf2,0xb9,0x79,0x6d,0x83,0x10,0x6e,0x6a,0x94,0xc3,0x7c,0x93,0xef,0xc3,0x3c,0x6c,0x5d,0x62,0x4a,0x8b,0x52,0x22,0x45,0x29,0xa5,0xb6,0x64,0x9a,0xcd,0xf2,0x7b,0x19,0x37,0xd3,0xb6,0x84,0xb9,0xa3,0x93,0xd8,0x94,0x71,0xcf,0x09,0x74,0x13,0xdc,0xf5,0xe4,0x6b,0x00,0xca,0x70,0xeb,0xee,0xd7,0x59,0xad,0x1d,0x17,0x57,0x97,0x5c,0x2d,0x17,0x34,0x6d,0x8b,0xf3,0xb2,0x4e,0x3e,0x37,0x08,0x87,0x76,0x77,0xae,0xa3,0x59,0x37,0x2c,0x16,0x0b,0x2e,0x2e,0x2e,0x71,0x6e,0xc2,0xfe,0xfe,0x6b,0x5b,0x7d,0x91,0xf7,0x4f,0x55,0x1f,0x50,0x55,0xaf,0x70,0x7e,0x79,0xc1,0xe2,0xea,0x8a,0xf5,0x7a,0x4d,0xe7,0x3a,0x21,0x0a,0x9f,0xa3,0x1e,0x3d,0x03,0x20,0x92,0xef,0x6a,0xb5,0xe2,0xea,0xea,0x8a,0xf3,0x8b,0x0b,0xf6,0x26,0x5f,0xdd,0x08,0xc2,0xb2,0xd9,0x46,0x3f,0xfc,0xa3,0x43,0xbc,0x75,0x25,0x47,0xb1,0x54,0xf5,0x1c,0x6b,0x6b,0x26,0xd3,0xc3,0x2d,0x9d,0x43,0xfc,0x1b,0x5d,0x7a,0xa2,0xbc,0x24,0x61,0x91,0x35,0xa3,0xe3,0x39,0xf5,0x7c,0xc2,0xf4,0xe6,0xd1,0xd0,0x7f,0x23,0x79,0xbd,0x5e,0xc3,0x6c,0x6c,0x5d,0xdb,0x65,0xbe,0xd8,0x35,0x6f,0xaf,0x9f,0xd7,0x87,0x2f,0xbd,0x86,0x29,0x2b,0x40,0x73,0xf3,0xb5,0x1f,0x49,0xfe,0x32,0x9f,0x3f,0xed,0x5a,0x93,0xd7,0x0c,0xd6,0x80,0x00,0x3d,0x2b,0xdf,0xf0,0x70,0x00,0x9d,0xf9,0x8d,0x97,0xc2,0x6b,0xc1,0x53,0x23,0xae,0x2f,0xef,0x38,0xb9,0xff,0xb6,0x84,0x1d,0x4d,0xaf,0xfa,0xa1,0x70,0xe1,0xa3,0xe2,0x29,0xc8,0xcd,0x69,0xb0,0x74,0xdf,0xf7,0xd0,0x4b,0x7b,0x41,0x7e,0x49,0xac,0x79,0xb8,0xac,0x8c,0xec,0x14,0x90,0xad,0x7a,0xc3,0xf8,0x5b,0x22,0x2d,0x7b,0x91,0x6a,0x15,0x11,0xdb,0x89,0x5b,0x65,0xab,0xd1,0x1e,0x4a,0x59,0xb4,0xb2,0xd4,0x93,0xbd,0xc8,0x6a,0x25,0xa5,0xb7,0xe0,0x54,0x00,0xa2,0xa4,0xbd,0x05,0x71,0x59,0x0e,0xdf,0x5d,0x70,0x02,0xd4,0x04,0x81,0xd1,0x85,0x3c,0xf2,0x3e,0xf7,0xf8,0x18,0xe8,0xc8,0xf7,0x81,0x33,0x52,0x86,0x1e,0x32,0x07,0x86,0xac,0x1f,0x87,0xf3,0x44,0x19,0x93,0x34,0x33,0xca,0x04,0xff,0xa6,0xbc,0xcc,0x9e,0x17,0x12,0x5e,0x23,0x97,0xa8,0x93,0x54,0xac,0xa2,0x16,0x5d,0x2a,0xe4,0x41,0x32,0x8a,0x49,0xf9,0x64,0x5c,0x57,0x78,0xd1,0xef,0x43,0xdf,0xf3,0xa1,0x67,0x7c,0xf6,0x1d,0x10,0xed,0xae,0x8a,0x74,0x23,0xf4,0xb6,0xea,0x92,0x62,0xc0,0x07,0x8e,0x49,0xb4,0xdf,0x11,0xd4,0xe2,0x7e,0xab,0x08,0x7e,0x1b,0x33,0x30,0x48,0xbb,0x0e,0x1d,0x4c,0xce,0x91,0x73,0xe8,0xef,0xfb,0xd8,0xf9,0xd1,0x1b,0x5a,0xe9,0x60,0x1f,0x4a,0x62,0x30,0x89,0xa5,0x4b,0xaf,0xf9,0xe4,0x84,0x96,0x8a,0xc9,0xfb,0x4a,0xf5,0x0c,0x88,0x57,0xf1,0xe8,0xb2,0xa7,0x24,0xa5,0x18,0x1f,0xdf,0x8a,0xd3,0x2e,0xbb,0x21,0x8e,0x67,0x47,0xaf,0xbe,0x3d,0x5c,0xf6,0xaa,0xff,0x6c,0xd1,0x82,0xe7,0x10,0x3c,0x87,0xe9,0xa9,0x88,0x7d,0x4d,0x7d,0xfb,0x32,0xc6,0x87,0x47,0xdc,0x79,0xe3,0x47,0x79,0xe9,0x47,0xbe,0x8e,0x79,0xda,0xb6,0x95,0xeb,0xca,0xdd,0xa4,0xb6,0x79,0x19,0x39,0x82,0x46,0xca,0x1c,0x4f,0x0c,0x1b,0x68,0x47,0x1c,0xa6,0x2a,0xd2,0x18,0x28,0xad,0x30,0xa5,0xc5,0x65,0x21,0xbf,0xa2,0xde,0xc5,0x94,0x96,0xfa,0xe0,0x08,0x55,0x58,0x61,0x08,0xc3,0xd9,0xb4,0x91,0x99,0xeb,0x23,0x8a,0x39,0x18,0x04,0xb5,0xdf,0x20,0xbc,0x51,0x9a,0x0d,0xc0,0xb4,0xe9,0x8c,0x55,0x96,0x33,0x4e,0x6e,0xff,0x75,0xce,0xce,0xce,0xb8,0xb8,0xb8,0x64,0xb1,0x58,0xd0,0x36,0x0d,0x6d,0xd7,0x89,0x97,0xf5,0x73,0x48,0xc3,0x09,0xf4,0x70,0x74,0xae,0x63,0xdd,0x48,0xec,0xe5,0x8b,0xf3,0x0b,0x4e,0xcf,0x4e,0xb9,0x7b,0xe7,0xe7,0xc4,0x57,0x22,0x7b,0xbe,0xaf,0x6b,0x9f,0xee,0xbf,0xf0,0xb7,0x39,0xbf,0xb8,0xe2,0xf4,0xec,0x9c,0x8b,0xab,0x4b,0x96,0xab,0x15,0x6d,0xd7,0xd1,0x79,0xe1,0xf0,0xf1,0x5c,0x5b,0x97,0x9e,0x86,0x48,0xfb,0xda,0xae,0x65,0xb9,0x5c,0x71,0x71,0x79,0xc9,0xe9,0xd9,0x19,0x57,0x57,0x70,0xe7,0xe4,0xdf,0xcc,0xdf,0xd8,0xcd,0x6e,0x0d,0x30,0x38,0xf6,0x6f,0x0b,0xda,0x61,0x0b,0xcb,0x68,0x36,0x0b,0xe1,0x41,0xe3,0x78,0x10,0x29,0x19,0xf1,0x48,0x17,0xd9,0x4e,0x11,0x9e,0x09,0x13,0xc0,0x8e,0x4a,0x59,0x9e,0x56,0x61,0xc7,0x45,0x72,0xb2,0xd9,0x9a,0x2f,0x99,0x9f,0x06,0x30,0x98,0x6f,0x83,0xfa,0x46,0x4d,0xda,0xe7,0x5d,0x13,0x80,0x2e,0x0a,0xee,0x7d,0xe5,0x27,0x78,0xe1,0xcb,0x5f,0x63,0x74,0x70,0xf8,0x05,0xd6,0xe2,0x17,0x28,0x3b,0x2f,0xa3,0x9f,0x9a,0x3b,0xc3,0xce,0x6e,0x92,0x8a,0xd9,0x8d,0xdb,0x28,0x6d,0x7b,0xc8,0x0b,0xc8,0x38,0x9a,0xed,0x33,0xbb,0x7d,0x37,0x2b,0x23,0x52,0xe1,0x48,0xcb,0x55,0x54,0x18,0x86,0x7e,0x76,0x01,0x3c,0x25,0xf3,0x18,0xb7,0xc1,0xa1,0x64,0x1b,0x62,0xb6,0x56,0x3d,0x6a,0x60,0xf6,0x89,0x3b,0x4c,0xa2,0x99,0x29,0x6f,0x97,0x47,0xb6,0x06,0xca,0x71,0x8b,0x84,0x32,0x83,0x96,0x32,0xd0,0xc6,0xe9,0xfe,0x09,0x93,0xfd,0x23,0xfa,0xd0,0xa6,0x5e,0xd6,0x7d,0x64,0x8a,0x75,0xf4,0xcb,0xc9,0x62,0x61,0x87,0xba,0x44,0x55,0x4b,0x2f,0xf7,0x07,0xfa,0x11,0x6a,0xdf,0x77,0xaa,0x0b,0x75,0xef,0x35,0xc0,0x83,0x7f,0xda,0x87,0xfc,0xfd,0xb0,0x8c,0x1d,0x3d,0xaf,0x6c,0x81,0xb6,0x3a,0xb4,0x2f,0xd4,0x29,0xe0,0xb0,0x1e,0x4e,0xbe,0x80,0xf4,0x39,0x60,0x39,0xe8,0x8f,0x5a,0x8a,0xa3,0xef,0xe9,0x8f,0xa9,0x0a,0x3a,0x04,0x47,0xcf,0x71,0xa8,0x98,0x87,0x1f,0x62,0x5f,0x58,0x95,0x2a,0x74,0x82,0x0a,0x84,0x40,0xc7,0xb2,0x01,0xf1,0xfa,0xea,0x03,0xe6,0xcb,0x78,0x6b,0x7a,0x69,0xd7,0xa3,0x9c,0xea,0xab,0x1d,0x3b,0x2f,0xa8,0x3b,0x12,0x76,0xa6,0x03,0xed,0x7d,0xcf,0x25,0x3b,0xfa,0xd0,0x94,0x69,0xc0,0xa3,0xbd,0x5a,0xde,0x4d,0xe1,0x20,0x03,0x50,0xf4,0x92,0xb1,0x1a,0x94,0x37,0xb0,0xa9,0x3b,0xb2,0x91,0xec,0x6f,0x3c,0x6b,0x1d,0xce,0x8e,0x6f,0x07,0x7a,0xd3,0xe1,0x7d,0x97,0x26,0xc5,0xc9,0xbd,0xb7,0x83,0x7a,0x2d,0x6b,0xa4,0x27,0x53,0xf1,0xff,0x45,0xa5,0xe7,0xcc,0x2c,0x07,0xfd,0x90,0x66,0xb7,0x64,0x6f,0xb2,0xb6,0x9a,0x83,0xbb,0xfb,0x1c,0xbe,0x70,0x80,0xb1,0x4f,0x0b,0xb4,0x1f,0xfa,0xf0,0xf3,0x78,0x02,0x45,0x45,0x49,0xa6,0x5d,0xc8,0x68,0xb4,0x04,0x1e,0x70,0x8a,0x6e,0xb5,0x06,0x14,0xb6,0x2c,0x36,0x24,0x60,0x99,0x0c,0xd5,0xc1,0x31,0xc5,0x68,0x42,0x3d,0x3b,0xa4,0x3f,0x93,0x16,0xfa,0x68,0x4a,0x3a,0x51,0x2f,0xed,0x54,0xdf,0xc7,0x6e,0x1b,0x68,0x7b,0x2e,0x37,0xc2,0x4e,0x6f,0x1b,0xf6,0xde,0xf3,0xe2,0xbd,0xbf,0x0a,0xfa,0x16,0x8f,0x9f,0x3c,0xe6,0xec,0xec,0x8c,0xcb,0xab,0xab,0xa4,0x06,0x76,0x21,0x56,0xb6,0xcb,0x4e,0x92,0x19,0x9e,0xde,0x25,0xeb,0xc0,0x39,0x47,0xdb,0xb4,0xac,0xd6,0x2b,0x2e,0x2f,0x2f,0x39,0x3b,0x3b,0xe3,0xd1,0x93,0xc7,0x8c,0x27,0xef,0x72,0x78,0xf0,0xa5,0xd4,0x19,0x9b,0xaa,0xe7,0xfc,0x7b,0x55,0xed,0x71,0xe7,0xe4,0x6f,0xf1,0xe8,0xf1,0x13,0x9e,0x3c,0x39,0xe5,0xfc,0xfc,0x82,0xe5,0x62,0x41,0xd3,0x84,0xba,0xc4,0x78,0xde,0x9b,0x75,0x71,0x42,0x50,0x3a,0xd7,0xd1,0x75,0x1d,0xab,0xf5,0x9a,0xc5,0x72,0xc1,0xc5,0xc5,0x39,0x4f,0x9e,0x3c,0xe1,0xc9,0x93,0x0b,0x5e,0xba,0xf5,0x77,0xd0,0x26,0x8f,0x92,0x35,0x2c,0x7f,0x27,0x1c,0x8b,0x1e,0x51,0xfa,0xdc,0x45,0x9f,0x13,0xdd,0xd3,0x0d,0x17,0xb9,0x59,0x15,0x46,0x4e,0x6f,0xf0,0x62,0x41,0x0f,0xa5,0x95,0x84,0x74,0x0c,0xbe,0x23,0xb6,0xaa,0x52,0x18,0xf0,0x21,0x8e,0xe6,0xb4,0x67,0x7b,0xce,0x6d,0x5d,0x51,0xcf,0x39,0x3f,0x77,0x2c,0x99,0x72,0x3c,0x63,0x72,0x7c,0xbb,0xbf,0xdf,0x53,0xf4,0x67,0xa4,0x2f,0x06,0xfa,0xbb,0x52,0x5c,0x17,0xaa,0xf7,0x12,0xda,0xce,0x5b,0x2b,0x94,0xd5,0xcc,0x0e,0x6f,0x81,0xef,0xfa,0x79,0xae,0x34,0x37,0x5f,0xfb,0xd1,0xf0,0x4c,0x5e,0xf5,0x0d,0x0b,0x7a,0x32,0x0b,0xe6,0xa5,0xc6,0x3f,0xf2,0xa2,0xc8,0x61,0xd2,0x01,0xd1,0x7e,0xaf,0x55,0xb4,0x2f,0x64,0xef,0xe8,0xe0,0x1d,0x17,0x11,0x3d,0xf2,0x50,0x4a,0x49,0xc8,0x48,0x0f,0xde,0x05,0x68,0xcb,0x0f,0x38,0xf6,0x7d,0xdc,0x86,0xbe,0x9d,0xb1,0x4c,0x8f,0x52,0xae,0xd7,0x80,0x84,0xd3,0xbe,0x52,0x1b,0x7c,0x94,0x68,0xc9,0x16,0x4f,0x4e,0xbc,0xe9,0xaf,0x45,0x68,0xa3,0x23,0xee,0x15,0xee,0xcb,0xca,0x5e,0x4b,0xdc,0x8f,0xcf,0xf2,0xcc,0x9f,0x0f,0x9f,0x5d,0xc7,0x16,0x3a,0x87,0xc5,0xe7,0x3e,0x67,0xb1,0x3f,0x4d,0x42,0xeb,0xe4,0x78,0x15,0xe6,0xb3,0x72,0xe0,0x75,0x50,0x01,0xbb,0x5c,0x0a,0x75,0x08,0xeb,0x29,0x0f,0xfa,0x08,0x82,0xca,0x25,0x42,0x27,0xc1,0x39,0x62,0xb0,0xf4,0x60,0x8c,0xf7,0x1e,0xa7,0x24,0x5e,0x68,0xe2,0xa8,0x9c,0x93,0x01,0xf2,0xc8,0x3e,0xb2,0xd0,0xb1,0x4a,0x59,0xf1,0xe6,0xd4,0xbd,0x74,0xa9,0xbc,0xd8,0x22,0x54,0x72,0xad,0x8f,0xdd,0x1d,0x3c,0xb2,0xc3,0x16,0x86,0xde,0x16,0x2f,0x7b,0x91,0xbd,0x37,0xa1,0xfe,0xe1,0x3d,0x1d,0x62,0x4d,0x67,0x91,0x64,0xfa,0x01,0xcf,0x24,0xe3,0xe8,0x31,0xe7,0x49,0xcf,0x2a,0xa5,0x18,0x1f,0x8c,0x29,0xc7,0x25,0x6d,0xd3,0x71,0xf5,0x78,0x41,0xd7,0x76,0x7d,0x1d,0xd9,0x91,0x3c,0x4c,0x8f,0x6e,0x4a,0x00,0xf6,0x76,0x9d,0x2e,0xd7,0xd3,0x3d,0x0e,0xee,0xbf,0xb2,0xfd,0x30,0xe0,0x07,0x4b,0x63,0x70,0xeb,0x29,0x05,0x3d,0x2b,0x3d,0xb5,0x96,0xdb,0x65,0x6c,0xa4,0xf9,0xc9,0x0c,0x5b,0x59,0x50,0x30,0x3b,0x99,0xf2,0xe4,0x83,0xd3,0x6b,0x9e,0xf4,0x83,0x3f,0xcf,0xca,0x17,0x10,0x6e,0xf7,0xd6,0x1c,0xd7,0x3a,0xce,0x3f,0x7a,0x9c,0x78,0x40,0x1f,0x16,0xbc,0x2e,0x44,0x02,0x5e,0x5f,0x2c,0xa8,0xf7,0x8a,0xa0,0x0a,0x54,0x5b,0x79,0x98,0xb2,0x84,0xb5,0x43,0x57,0x95,0x4c,0x51,0x97,0x3d,0xb6,0xb9,0x8e,0x75,0xb6,0x8e,0x82,0x0a,0x2d,0xda,0x7b,0xb7,0x9d,0xb1,0x48,0x8b,0x39,0x01,0x34,0x9a,0x2f,0xbf,0xfb,0xf7,0xf8,0x83,0xdf,0xff,0xef,0xf9,0xec,0xe1,0x23,0xda,0xb6,0x63,0x32,0x9b,0x30,0xaa,0x6b,0x4a,0x2b,0xa1,0x21,0x75,0xe4,0xe8,0xf3,0x00,0x35,0x81,0xc3,0x76,0x9d,0xa3,0x6d,0x5b,0xd6,0x4d,0xc3,0x62,0xb1,0xe4,0xe2,0xe2,0x9c,0xc7,0xa7,0xa7,0x14,0xe6,0x25,0x5e,0x7d,0xf9,0xef,0x6c,0xa0,0x6e,0x7a,0x79,0xa3,0x4f,0xe5,0xf7,0xcd,0xe3,0x1f,0xa3,0x69,0x2f,0x79,0xf0,0xd9,0xaf,0xd1,0xb6,0x2d,0x6d,0xd3,0x32,0x1a,0xd7,0xe9,0x94,0x26,0x6d,0x8c,0x1c,0x32,0x12,0x3c,0xa4,0x7d,0x78,0x57,0x54,0xce,0x9d,0x48,0xbe,0xab,0x35,0x57,0x97,0x97,0x9c,0x9d,0x9f,0x73,0x7a,0x76,0xc6,0xdd,0xe3,0xbf,0xcb,0x6c,0x7a,0x7f,0x30,0x88,0xc3,0xe2,0x87,0xe3,0x9c,0x6e,0xe9,0xac,0xdf,0x75,0x76,0x2d,0xe3,0x6f,0x77,0x4b,0x8f,0xf9,0x85,0x30,0xe6,0x4a,0xe3,0x7c,0x87,0xd6,0x06,0x53,0x97,0x78,0x7d,0xb9,0xe3,0x69,0x31,0x39,0x69,0xab,0xf2,0xf0,0xe5,0xbb,0x53,0x4f,0x4c,0x06,0xeb,0x1a,0x04,0xf0,0x0f,0xee,0xec,0xa1,0x8d,0xe6,0xf1,0xc7,0xa7,0x74,0x4d,0xf7,0xcc,0x79,0x3b,0xc8,0xf3,0x8b,0x3f,0xf0,0xb9,0x5e,0xcd,0xa9,0xf7,0xb3,0xf2,0x3e,0x7a,0xe9,0x0d,0x4e,0x1f,0xbc,0x2f,0x27,0xf8,0x20,0x7b,0x9a,0xeb,0xfd,0x83,0xc1,0x7b,0x83,0x1c,0x14,0xfd,0x1c,0x73,0xf9,0xe2,0x70,0xf8,0x54,0x5e,0xd7,0x63,0x6c,0xbc,0x16,0xde,0x71,0xd0,0x07,0xde,0x49,0x78,0x13,0x55,0x15,0x0d,0x11,0xd1,0xbc,0x0f,0xd2,0x6f,0x58,0x0b,0xe2,0xef,0x1a,0x8e,0xfe,0xf1,0xfd,0x0a,0x8c,0xcf,0xca,0x29,0x4a,0x8a,0xe4,0x9b,0x34,0x38,0xd1,0x29,0xe3,0xda,0xbd,0x1b,0x08,0x82,0x71,0x9e,0x27,0xff,0x26,0x84,0x71,0x71,0x2e,0xf3,0x1d,0xc9,0xf7,0x3c,0xbb,0x10,0x29,0x6b,0xcb,0x62,0x91,0x99,0x74,0x52,0xdb,0x5d,0xcf,0x80,0x6d,0xf1,0x40,0x39,0xe8,0xcb,0x03,0x76,0x60,0x06,0x49,0x3a,0x06,0x7a,0xe6,0x46,0x67,0xef,0x05,0x63,0x7e,0xcf,0x39,0x41,0xda,0xde,0x10,0xb6,0x10,0x29,0xef,0x49,0x7b,0x71,0x3d,0x08,0x80,0x07,0xff,0x61,0x9f,0xdb,0xdf,0xc2,0xb6,0xa3,0x10,0x8c,0x43,0xa4,0xcd,0x64,0xed,0x09,0x05,0x8b,0xa4,0xaa,0xad,0xa1,0x08,0xa7,0x29,0xf9,0x70,0x54,0x95,0x0a,0xde,0x72,0x0a,0x45,0x51,0xd5,0xa8,0xb2,0xc0,0xad,0x1b,0xe1,0x98,0x02,0x97,0xe6,0xb5,0x0e,0xde,0x71,0x19,0x13,0x10,0x77,0x45,0xc5,0x22,0x90,0x3a,0x6a,0x2d,0xe7,0x41,0x86,0xa0,0xa4,0x99,0xfa,0x2a,0xe7,0xc3,0x37,0xc0,0xca,0x4b,0x5f,0x8e,0xf6,0x47,0x54,0x93,0x0a,0xb4,0xa2,0xb4,0x9a,0xa2,0xb2,0x3c,0xf9,0xe8,0x0c,0xf7,0xac,0x63,0x1e,0x8d,0x66,0xef,0xf8,0x45,0x1e,0x7f,0xfc,0x3d,0x3c,0xa0,0xb5,0xe6,0xf6,0x9b,0xff,0x06,0xdb,0x31,0x44,0x55,0xf6,0xff,0x35,0x29,0xbf,0xf9,0x5c,0xa0,0xfc,0xfc,0x68,0xad,0x22,0x28,0x6d,0xac,0x6b,0x5b,0x5a,0x8a,0x51,0x21,0x44,0x49,0x41,0x51,0x17,0x12,0x88,0xa5,0xd9,0x45,0xf1,0x76,0x54,0x30,0x71,0xd3,0x19,0xb5,0x8e,0x76,0x22,0x14,0xe3,0xfd,0x31,0xd5,0xa4,0xa2,0xeb,0xa0,0xde,0x5b,0xb1,0x78,0x7c,0x41,0x74,0xc6,0xf3,0xde,0xa3,0x0b,0x89,0xc2,0xd3,0x2e,0x57,0xb0,0xa7,0xd1,0x56,0x8e,0xbb,0x94,0xb1,0x96,0x0a,0xdb,0x7a,0x1c,0x34,0x33,0x1a,0xbc,0x46,0xa9,0x22,0x1c,0x1d,0x16,0x10,0x21,0x79,0x44,0x86,0xba,0x38,0x8d,0x1c,0xd1,0xd5,0x85,0xb5,0x14,0x98,0x9f,0x0d,0xa0,0xdd,0xb4,0xff,0xf6,0x0d,0xf0,0x18,0x5b,0xf3,0xf6,0xbb,0xff,0x29,0x7f,0xf2,0x27,0xff,0x2b,0x9f,0x3c,0xf8,0x2e,0xf3,0xe5,0x8c,0xe9,0x64,0x42,0x55,0xd7,0x54,0x65,0x04,0xe1,0x70,0xc2,0x56,0x58,0x88,0xde,0x79,0x3a,0x17,0xc0,0x77,0xb5,0x66,0xb9,0x5c,0x72,0x71,0x75,0xc1,0xe9,0xd9,0x05,0x7b,0xb3,0xaf,0xf1,0xf2,0xfd,0xbf,0x1d,0x54,0xcf,0x59,0x7d,0xf2,0xbe,0xdc,0xf8,0x1a,0xbf,0xbf,0x70,0xeb,0x67,0xa8,0x8a,0x7d,0xde,0xfb,0xf8,0x97,0x58,0x2e,0x96,0x4c,0x67,0x13,0x46,0xa3,0x31,0x55,0x55,0x61,0x8d,0x91,0x20,0xf5,0xc1,0x06,0x2e,0x8e,0x22,0x8e,0x36,0x6c,0x77,0x6a,0x56,0x2b,0x2e,0xaf,0x16,0x5c,0x5c,0x5e,0xb0,0x5a,0x5a,0xee,0xdf,0xfd,0x0f,0x99,0x4f,0xee,0x0d,0xc8,0xf4,0x4e,0x35,0xf6,0x00,0x7c,0xc3,0x8f,0x4e,0xf7,0x63,0x13,0x79,0xf5,0xa8,0x85,0x88,0xa6,0xa2,0xc8,0x25,0x43,0xff,0xd7,0x87,0x67,0xa2,0x84,0x15,0xb4,0x2c,0xed,0xe5,0x8a,0xb2,0x18,0x4b,0xac,0x6b,0x17,0x3c,0xe6,0x33,0xae,0xca,0x14,0x86,0xc3,0x7b,0xc7,0x78,0x05,0x4f,0xde,0x7b,0x2c,0xce,0x3d,0x39,0x7f,0x9e,0xa3,0x7d,0xc2,0xac,0xed,0x35,0x51,0x8e,0xc4,0xcf,0x00,0x60,0x76,0x34,0xe3,0xc9,0x47,0x9b,0x01,0x74,0xbe,0x68,0xda,0x2c,0xeb,0x1a,0xd0,0xdc,0x58,0xcb,0xa6,0xb4,0x14,0x85,0x61,0x79,0xb9,0x1e,0x30,0x5e,0xc3,0xd5,0xa5,0x76,0xbc,0xdc,0xa7,0x72,0x36,0x63,0x7a,0x70,0x83,0x8b,0x87,0x1f,0x53,0x8e,0x27,0x1c,0xbf,0xf6,0x65,0x7a,0xe1,0xa3,0x87,0x47,0xc9,0x21,0x1b,0xcc,0xfc,0x88,0xd9,0xa0,0x8d,0x4b,0x90,0x12,0x6c,0x63,0xca,0xe5,0xea,0xd8,0x20,0x01,0xd3,0x1f,0x14,0x9a,0x2e,0xfb,0x70,0x64,0xa2,0x6b,0x88,0x5c,0x99,0x31,0xc1,0x76,0xe0,0xdb,0x9e,0x21,0xce,0x75,0xea,0x5b,0x7d,0x63,0x80,0xb6,0xc7,0x2c,0x14,0x22,0xe5,0x66,0xbd,0x11,0xe7,0xcf,0x20,0x3a,0x58,0xb0,0xdb,0x82,0xec,0x2d,0x0f,0x82,0x61,0x50,0x72,0xa3,0x7c,0x87,0x4f,0xfb,0xe6,0x76,0x30,0x34,0x7e,0xc7,0xdf,0x4d,0x4e,0x73,0xb3,0xbe,0x91,0xc6,0x6c,0xdc,0xb0,0x83,0xb7,0x73,0x14,0x0f,0xb3,0x35,0xee,0x67,0x14,0x01,0x50,0xf6,0x78,0xc5,0x89,0x2c,0x95,0x45,0x54,0xc9,0x41,0xfa,0x74,0xe1,0x75,0x1d,0x37,0x56,0x87,0x50,0xa1,0x71,0x4f,0x9f,0xc4,0xce,0x77,0x68,0x9f,0x2c,0xbd,0xf8,0x60,0x60,0xf7,0x29,0x50,0x7a,0xcc,0xd3,0xe1,0x31,0x68,0x5d,0xa4,0xd3,0x86,0x8d,0x29,0x68,0x5d,0x93,0xe6,0x9e,0x2a,0x0d,0xaa,0xb4,0x28,0xad,0xb1,0xe3,0x9a,0xe6,0x72,0x11,0xf6,0x26,0xf7,0x42,0x6b,0x1c,0x60,0x05,0x44,0x55,0xb3,0x6c,0xc6,0x16,0xe6,0xc1,0x94,0x05,0xe3,0xc3,0x11,0xae,0x83,0xab,0x87,0xe7,0xa9,0x2f,0x92,0x4a,0x3b,0x34,0x65,0x7a,0x3c,0xc5,0x58,0xc3,0xc5,0xc3,0x0b,0xba,0x4e,0x06,0x54,0x69,0x4d,0x35,0xad,0xf0,0xde,0x73,0xfa,0xe1,0x19,0xf5,0xac,0x62,0x34,0x1f,0x31,0xde,0x1f,0x71,0xf1,0xf0,0x72,0x13,0xb2,0xb7,0xd2,0xc1,0x8b,0xaf,0xf2,0xf8,0xe3,0xef,0x01,0x70,0xeb,0xd5,0xaf,0x89,0xe3,0x55,0xce,0x41,0x29,0xd2,0x97,0xa7,0xf2,0xb5,0x7e,0x83,0xb6,0x3c,0xf5,0xe1,0x5d,0x68,0xbd,0xbb,0x86,0xf5,0xbc,0x62,0x76,0x34,0xa1,0x6b,0x1d,0xa7,0x9f,0x9c,0xd3,0xad,0xfb,0xa5,0x34,0xda,0x93,0xd3,0x48,0x16,0x67,0x4b,0x74,0xa1,0x99,0xec,0x8d,0x28,0x46,0x96,0xae,0x6d,0xd9,0xbb,0xb9,0x87,0xd2,0x8a,0xd3,0x8f,0x4e,0xf1,0x3b,0xa9,0x34,0xec,0xa6,0xde,0xb1,0x56,0x1e,0x33,0x2a,0xc2,0x01,0x27,0x9e,0xfa,0x60,0xc2,0xfa,0x7c,0x81,0x2e,0x2b,0x96,0x67,0x57,0xc4,0x73,0x88,0xdd,0xaa,0x11,0xc0,0x57,0x0e,0x65,0x4d,0xb0,0xc6,0x44,0x3b,0x0f,0x62,0x27,0x86,0x70,0x74,0x9e,0x43,0x19,0x83,0x6b,0x60,0xb8,0xdb,0x30,0xfc,0x55,0x5e,0x6c,0x91,0x51,0x55,0xa5,0xa3,0x8b,0x66,0x04,0x5b,0xa9,0xf3,0x40,0x12,0x8e,0x7f,0x33,0xfb,0x30,0xde,0x53,0x14,0x63,0xde,0x79,0xe7,0x3f,0xe6,0x83,0xf7,0x7f,0x83,0x0f,0x3f,0xf8,0xa7,0x5c,0x5c,0x5c,0x30,0x1a,0x8d,0xa8,0xaa,0x8a,0xb2,0x28,0xb0,0x01,0x84,0x83,0x52,0x05,0xe7,0x3a,0x01,0xdf,0x75,0xc3,0x72,0xb5,0x64,0xb1,0x58,0xe0,0x99,0x71,0xff,0xc5,0x7f,0x8f,0xc3,0xc3,0xb7,0x06,0x8c,0xca,0x00,0x7c,0xb7,0xba,0x70,0xe3,0x9a,0xf7,0x9c,0x1c,0xbe,0xcb,0x6c,0xfa,0x22,0xef,0xfd,0xf0,0x57,0xf8,0xe4,0x93,0x3f,0xa6,0x1e,0x95,0xd4,0x55,0xdd,0xd7,0x23,0x84,0xac,0x74,0x21,0xbe,0x6f,0xd3,0x34,0xac,0xd6,0xc2,0x04,0xac,0x56,0x8e,0xfd,0xd9,0x57,0x79,0xf5,0xb5,0xbf,0x86,0xd5,0xf5,0x2e,0x8c,0x1f,0x8c,0xd9,0x4e,0x8e,0xdf,0x43,0x0c,0x3b,0x28,0xd2,0x8a,0xc9,0xa6,0x68,0x08,0x6d,0x88,0x38,0x7a,0x9a,0xba,0xc2,0x75,0x2d,0x62,0x03,0x8e,0x4e,0x75,0x71,0xac,0x24,0x0e,0xbd,0x02,0xba,0xa6,0xc1,0x75,0x9d,0xec,0x13,0x55,0xc1,0x23,0xd7,0x05,0x06,0xdb,0x79,0xca,0x69,0x8d,0x33,0x1a,0xad,0xa1,0x9c,0x54,0xac,0xce,0x86,0xe7,0xef,0xf6,0x74,0x4f,0x0f,0xeb,0xbc,0xb1,0x0c,0xaa,0x49,0x15,0x68,0x93,0xa3,0x1c,0x59,0x6c,0x65,0x29,0xeb,0x92,0x72,0x5c,0xb0,0xbe,0x5a,0x73,0x75,0x2a,0x51,0xe1,0x26,0x07,0x23,0xea,0x59,0xcd,0xd9,0xa7,0xe7,0x34,0xcb,0xe7,0x15,0xb9,0xf3,0x02,0x9f,0xb1,0x68,0x15,0x28,0xa5,0x39,0xb8,0x2d,0xeb,0x4a,0x3f,0xbe,0xe2,0xf2,0xf1,0x15,0xf5,0xa4,0xa2,0x6d,0x3a,0xda,0xf5,0x66,0x99,0x39,0x70,0x6e,0xff,0xbc,0xf9,0xe6,0x57,0xe9,0xfe,0xe8,0x5f,0x72,0xf3,0x95,0x77,0x42,0x6c,0xff,0xa4,0x02,0xb9,0x16,0xef,0x22,0x88,0xd9,0xca,0x8a,0x6f,0xc0,0x62,0xbd,0x83,0x11,0x8c,0xd2,0x6f,0x58,0x19,0x9e,0x7e,0x5d,0xc4,0xd4,0x63,0x38,0x5a,0x59,0x3a,0xdf,0xa0,0x4d,0x0c,0xd0,0xd2,0x25,0x6b,0xc5,0x50,0xed,0x9b,0xa0,0x3e,0x99,0x49,0x92,0x24,0x1b,0x98,0x60,0x6d,0x2c,0x9d,0xf3,0xd0,0x76,0xf4,0x9a,0x4a,0x79,0x36,0xa9,0x95,0x53,0x5d,0x5d,0xef,0xab,0xe7,0x3c,0x18,0x89,0xa2,0x25,0x79,0xc9,0xf3,0x12,0x76,0xd9,0x67,0xc5,0xfb,0x40,0x5a,0xfa,0xc6,0xa4,0x65,0x99,0x8b,0xc7,0x09,0x9c,0xb2,0x76,0xfb,0x48,0x71,0x86,0xe8,0x6d,0x07,0x1c,0xbc,0xa2,0x3f,0x21,0x22,0xa8,0x96,0xe3,0xbe,0xdf,0xc8,0x38,0xc8,0x3e,0x58,0x35,0x90,0x5e,0xe4,0xec,0x65,0x0f,0x9d,0x43,0x99,0x50,0x48,0x88,0xb1,0xea,0x95,0xc4,0xdd,0x34,0x46,0x40,0xb6,0xe7,0x56,0x22,0x01,0x93,0xf8,0xa0,0x78,0x89,0x70,0xa5,0xb2,0xca,0x7b,0x44,0x2a,0x14,0x2f,0xb0,0x4e,0x62,0x95,0x14,0x15,0xa6,0x28,0xe8,0xd6,0x1d,0xaa,0x50,0x14,0x45,0x89,0x6f,0xc1,0xa9,0x0e,0x5b,0x17,0xe8,0xc2,0xe2,0x73,0x6e,0x47,0xf5,0x2a,0x6a,0x97,0xb5,0x47,0x25,0xf5,0xb9,0xa6,0x9c,0x8a,0xbd,0x55,0x1b,0x4d,0x31,0xae,0x58,0x5f,0x09,0x57,0x96,0x34,0xcf,0x5a,0x38,0x61,0x5b,0x8a,0xaa,0xb5,0x9e,0xd5,0x5c,0x3e,0xbe,0x04,0x0f,0xe5,0x44,0xbc,0x70,0x57,0x8b,0x35,0xae,0x75,0x2c,0x4e,0x97,0x8c,0xe6,0x35,0x45,0x3d,0x3c,0x0d,0xe8,0xba,0xa5,0x55,0xcc,0x66,0xdc,0x7c,0xf9,0x2b,0xb8,0xb6,0x65,0xfe,0xc2,0x8b,0x43,0x38,0xcc,0x07,0x70,0xc3,0xf8,0xab,0xb4,0xa6,0x9e,0x54,0xac,0xaf,0xd6,0x74,0x9d,0x43,0x69,0xc5,0xde,0x8d,0x19,0xae,0x73,0x9c,0x3d,0xb8,0xc8,0x98,0x8f,0x5d,0x69,0xd3,0x4a,0xb7,0x7b,0xb7,0xa4,0xd2,0x8a,0xd9,0x91,0x1c,0x52,0x60,0x0b,0xc3,0xfe,0xed,0x39,0x5d,0xd3,0xa1,0x94,0x62,0xbd,0x68,0xa8,0xa7,0x25,0xae,0xf3,0x2c,0xcf,0x97,0x14,0xa3,0x02,0xf6,0x46,0x14,0x55,0x81,0xef,0x1c,0xd5,0x58,0xda,0x5f,0x4f,0x2b,0xae,0xce,0x37,0x89,0x5f,0x6c,0xd7,0x36,0xa7,0x9e,0x4f,0x51,0x53,0x89,0x3a,0xaa,0x59,0xae,0x31,0x75,0xc1,0xec,0xfe,0x31,0xca,0x29,0x74,0x61,0x58,0x9e,0x5d,0x01,0x88,0xaa,0x3f,0x6c,0x27,0xd0,0x3b,0x6c,0xd0,0xa2,0x96,0x86,0x76,0xb1,0xc4,0xd4,0x95,0x84,0x05,0x04,0x72,0x9d,0xa8,0x0f,0x7d,0x20,0xf8,0x20,0xf3,0x4d,0xe6,0xbb,0x1a,0x00,0xee,0x80,0x51,0xdd,0x29,0x09,0xfb,0xc4,0x6c,0xc4,0x77,0xee,0xbc,0xf0,0x53,0xdc,0xba,0xfd,0xe3,0x7c,0xf4,0xe1,0x6f,0xf3,0xe0,0xc1,0xff,0xcb,0x93,0xc7,0x1f,0xa2,0xad,0x16,0x15,0x70,0xf4,0xb8,0xf6,0x72,0x82,0x4a,0xd3,0xb6,0xb4,0x4e,0x31,0xae,0xef,0x71,0xf7,0xee,0x4f,0x72,0x72,0xf4,0xce,0x56,0x1f,0x3d,0xcd,0xee,0xfb,0x34,0x02,0x5e,0x17,0xfb,0xbc,0xf1,0xf2,0xbf,0xcb,0x72,0xfd,0x98,0x8f,0x3f,0xfd,0x1d,0xce,0xce,0xff,0x8c,0x87,0xeb,0x0f,0xd1,0x86,0x74,0x74,0x9c,0xf3,0x1e,0xef,0x1c,0x9d,0x57,0x8c,0xcb,0x17,0x99,0x4f,0xbe,0xc6,0xcd,0x7b,0x7f,0x89,0xc2,0x8e,0x76,0x60,0xfd,0xf0,0xc2,0xe6,0x8c,0xda,0xa4,0xcb,0x4a,0x59,0x9c,0xd2,0x98,0xad,0x0d,0xd8,0xf1,0xb7,0xa2,0x9c,0x1d,0x52,0x8e,0xa7,0xb8,0x76,0xc5,0xea,0xec,0x34,0xbc,0xa7,0x30,0x65,0x89,0x6b,0x84,0xf1,0x8b,0x63,0xec,0xda,0x0e,0xb7,0x6e,0xb1,0x45,0x21,0x71,0x86,0xdb,0x4e,0x1c,0x63,0x10,0x69,0xb8,0x9c,0xf4,0xce,0x81,0xba,0xb2,0x3d,0x2f,0x8b,0xcc,0x6b,0xad,0x0d,0xae,0xcd,0xd4,0x85,0xbb,0xfa,0x14,0x30,0xa5,0x68,0x1d,0x16,0x67,0x4b,0xc6,0xfb,0x23,0xf6,0x6e,0xcd,0x31,0xc1,0xf9,0xa7,0xac,0x0b,0xbc,0x57,0xac,0xae,0xd6,0x8c,0xf7,0xc5,0x0b,0x7f,0x34,0xaf,0x69,0x96,0x17,0xd7,0x8c,0x42,0x2c,0x22,0x1f,0xd3,0x38,0xfb,0xae,0x49,0x11,0xcf,0x3c,0x94,0xe3,0x22,0xf9,0xb3,0x8c,0xe6,0x35,0xdd,0xba,0x63,0x7e,0x73,0x86,0xf7,0x9e,0x47,0xef,0x3d,0x4a,0x42,0xc1,0xa0,0x1d,0x6a,0xf7,0xac,0xb0,0xf5,0x98,0x7b,0x3f,0xf6,0x97,0xe5,0xd1,0x0d,0x50,0x19,0x82,0x75,0xa8,0x80,0x52,0x18,0x6b,0xa9,0xa6,0x15,0xa3,0xfd,0x31,0xce,0x79,0xae,0x1e,0x9e,0x73,0xf9,0x50,0xd4,0xff,0x4a,0x2b,0x66,0xb7,0x0f,0xd1,0x5e,0x71,0xfa,0xd1,0x43,0xba,0xd5,0x50,0x3d,0x0b,0x24,0xb9,0x2e,0x6e,0x4d,0x8d,0x36,0x4c,0x6d,0x0b,0xbc,0xef,0x44,0xa3,0xa5,0x4a,0xfc,0x72,0x81,0x0f,0x27,0x37,0xc5,0x2e,0x92,0x2c,0x24,0xd0,0x86,0x8b,0x40,0x88,0x4b,0x5b,0x15,0x4d,0x31,0x12,0x46,0xc2,0x69,0x9a,0xf6,0x32,0x60,0x6c,0xf4,0x43,0xea,0x55,0xd8,0x21,0x83,0xd4,0x6e,0xef,0x03,0xdd,0x70,0x88,0x5f,0x04,0x40,0x38,0x5a,0x51,0xb0,0x38,0xda,0xca,0x43,0x9c,0x68,0x9f,0x13,0xe5,0xd8,0x6d,0x6e,0x6b,0x7d,0xa8,0x78,0x6d,0xe7,0x1a,0x71,0xe9,0x29,0x3b,0x34,0x88,0xf5,0xaf,0xa7,0x07,0x15,0x81,0x63,0xcd,0x66,0x6a,0x34,0x4a,0x2b,0x01,0x63,0x15,0xd9,0x78,0x93,0x15,0x10,0x23,0x4f,0xc5,0x1e,0x27,0x70,0x59,0x3a,0xbe,0x6b,0xa2,0xc0,0x9f,0xf1,0x80,0xf1,0xfc,0x60,0x17,0xa4,0x6e,0x09,0xfa,0x0e,0xe0,0x3b,0x71,0x1a,0x31,0xb6,0x40,0x9b,0x02,0x6f,0x91,0x50,0x70,0x0a,0xba,0x66,0x8d,0xd7,0x50,0x50,0xa0,0x2b,0x4b,0xb7,0x8c,0x36,0x55,0xa9,0xb3,0x8e,0x2a,0xe5,0xa4,0xf2,0xcb,0x5a,0x6a,0x34,0xda,0xe8,0x74,0xac,0x96,0xad,0x0b,0xda,0x45,0xbb,0x35,0x69,0x8b,0x51,0x0f,0xa8,0xc5,0xd8,0xc2,0x29,0xd0,0xf5,0xd7,0xd7,0x8b,0x46,0xba,0xd8,0x79,0xda,0x55,0x8b,0xad,0x0a,0x8c,0x35,0x74,0x6d,0xc7,0xd3,0x92,0x02,0xf6,0x63,0x10,0x8b,0x08,0xf8,0x39,0x0a,0xed,0x5c,0x99,0x8a,0xd9,0xf1,0x94,0x7a,0x5a,0xd1,0x2c,0x1a,0x1e,0x7f,0x74,0x4a,0x3d,0x29,0xa9,0xc6,0x25,0x28,0x58,0x9c,0xaf,0x68,0x57,0xcd,0xe0,0x8d,0xcd,0xf6,0xa8,0xad,0xbb,0x3b,0xd4,0x6f,0xe3,0x02,0xa5,0x14,0x8b,0xf3,0x15,0x78,0xcf,0x68,0x5e,0x63,0xc2,0xb9,0xce,0x45,0x65,0xc1,0x7b,0xce,0x1f,0x5d,0x48,0x9b,0x03,0x07,0x6e,0xab,0x08,0x70,0x32,0x51,0x6d,0x55,0xc0,0xf9,0xb2,0xaf,0x41,0xce,0xf0,0x6f,0xcf,0xda,0xa4,0xe5,0xd2,0xa5,0xc5,0x18,0xcd,0x7a,0xb9,0x66,0xf1,0xf8,0x8a,0xe9,0xed,0x3d,0x8c,0xd6,0x38,0xe7,0xa9,0xe6,0x13,0x9a,0x85,0x8c,0xb1,0x0b,0x41,0xcf,0x5d,0xdb,0x4a,0x2c,0xd8,0x68,0xf3,0x53,0xc1,0xf8,0x51,0x14,0xb8,0xb6,0xc1,0x37,0x57,0x30,0x2a,0xe4,0x80,0xee,0xa0,0x05,0xc5,0x2b,0x74,0x35,0xc2,0x35,0xc2,0xc4,0x68,0x44,0x53,0x2a,0x67,0x9b,0x16,0xd0,0xac,0xe9,0xa5,0xdb,0xe1,0xdf,0x1e,0x93,0x77,0x48,0xc4,0xe1,0x7e,0x94,0x98,0x95,0x32,0xdc,0xb9,0xfb,0x0d,0xee,0xdc,0xf9,0x06,0x5d,0xb7,0xe4,0xc9,0x93,0xef,0xb2,0x5c,0x3e,0x61,0xbd,0x3e,0xa3,0xeb,0x96,0x14,0x76,0x4c,0x61,0xa7,0x8c,0xea,0x63,0xf6,0xf6,0x5f,0x11,0xc9,0xf8,0x3a,0xa0,0xdd,0x75,0xf1,0x5a,0x50,0xde,0x7e,0xb1,0x2e,0xf6,0xb9,0x7f,0xf7,0xdf,0x02,0x44,0x2b,0xb0,0x58,0x3e,0x64,0xdd,0x5c,0xd0,0xb5,0x4b,0x6c,0x31,0xa2,0x28,0xa6,0xd4,0xe5,0x01,0x5a,0x99,0x01,0x5b,0xb4,0x09,0xaf,0xcf,0xad,0x7a,0x8e,0xdf,0xb4,0x1c,0xa9,0x98,0xc6,0x18,0x82,0x19,0xc8,0x49,0x20,0x06,0xed,0xb1,0x75,0x29,0xbc,0x7d,0x29,0xf1,0xa0,0x0d,0x30,0xb9,0x75,0x0b,0x3b,0x2a,0x59,0x9f,0x9e,0xb3,0x3a,0xbb,0x1a,0x02,0x70,0xd7,0x83,0xb2,0x6b,0xbb,0x44,0x4b,0x94,0xd2,0xd8,0xb4,0x5e,0xe5,0x08,0xc5,0x9c,0x21,0xdd,0xbf,0xbb,0x8f,0x2d,0x2d,0x17,0x9f,0x9c,0xb1,0xbc,0x6c,0xb2,0x45,0x47,0x5f,0xb1,0xf0,0xd3,0x16,0x06,0xe7,0xe0,0xf2,0xf1,0x92,0x6a,0x5a,0x61,0xac,0xa6,0x6b,0x1d,0x17,0x0f,0x2f,0x99,0xdf,0x98,0x31,0xde,0x1f,0xa1,0xe3,0x81,0xf3,0x40,0x39,0x1a,0x32,0xde,0xbb,0x92,0xda,0xd1,0x3f,0x9b,0xdd,0x39,0x39,0x18,0x53,0xd6,0x05,0x57,0xa7,0x0b,0xd6,0x57,0x6b,0x14,0x50,0x54,0xd2,0x0e,0xe7,0x3d,0xda,0x68,0xa6,0xc7,0x93,0x50,0x5d,0x45,0x3d,0x1f,0x89,0x50,0x90,0x7e,0x0b,0x6d,0x68,0xd7,0xdd,0xa0,0xed,0x43,0x79,0x2b,0x84,0x6a,0x0c,0xf7,0x8a,0xaa,0x60,0x72,0x38,0xe1,0xe2,0xb3,0x4b,0x9a,0xd5,0x7a,0xe0,0x8c,0x38,0xbf,0x3d,0xa7,0x1c,0x4b,0xe0,0x44,0xd7,0x0a,0x50,0x55,0x07,0x63,0xae,0x1e,0x5f,0xe1,0x9d,0xa3,0x18,0x57,0x41,0x85,0xec,0x29,0xa7,0x23,0xae,0x56,0xab,0x5e,0x68,0x50,0x19,0x63,0x00,0x28,0xed,0x7b,0xbf,0xaa,0x80,0x67,0xa6,0xa8,0xa8,0xe6,0x73,0xba,0xce,0x61,0xca,0x11,0xcb,0x27,0x9f,0x06,0x98,0xea,0x1d,0xb0,0x4c,0x39,0x42,0x7b,0xcf,0x7a,0x71,0x99,0x7a,0x4d,0xc2,0x22,0x2b,0x89,0xae,0x86,0xf8,0x09,0x29,0x6d,0x05,0xc0,0x45,0xc7,0x2c,0xb4,0xbf,0xcd,0xb8,0x01,0xed,0x33,0x87,0xa6,0x28,0x14,0x3a,0x7c,0xd7,0x06,0x99,0x2d,0x72,0x3d,0x2e,0xd9,0xc9,0xfb,0x7d,0xb2,0xb9,0x7a,0x39,0x9f,0x33,0x39,0x2d,0xdb,0x32,0x16,0x5f,0x7b,0x4d,0x4e,0x43,0x4a,0xa3,0xd3,0xbb,0x75,0xa7,0x55,0xa3,0xe8,0xb9,0x8d,0xb0,0x55,0x27,0x9e,0x2a,0x25,0xdc,0x45,0xa8,0xac,0x56,0xc2,0x69,0x68,0x12,0x37,0xad,0x63,0x5e,0xca,0x89,0x23,0x94,0x26,0x9d,0x9c,0x21,0xcf,0xaa,0xcc,0xef,0xc1,0xa7,0xec,0xa2,0x74,0xda,0xef,0xd7,0x75,0x38,0xd7,0xa0,0x94,0xa5,0x6b,0x56,0x68,0x63,0x83,0x03,0x8e,0xc6,0x35,0x1d,0xae,0x69,0xc0,0xc8,0x49,0x38,0xda,0x68,0x64,0x2f,0xb7,0xc7,0xf9,0xe0,0xc3,0xac,0x35,0xe5,0xde,0x18,0xa5,0x15,0xdd,0xb2,0xa3,0x5d,0x37,0x41,0x6a,0x07,0x53,0xca,0xa4,0x69,0x96,0x0d,0x45,0x2d,0xb6,0xa3,0x58,0xff,0x84,0x15,0x4a,0x89,0xda,0xc5,0x89,0x93,0x8c,0xad,0x8c,0x80,0x6b,0xd7,0x51,0x44,0x75,0x4c,0x06,0x78,0x02,0xc0,0x16,0x5b,0xe9,0x67,0x02,0x70,0x8e,0xb3,0x03,0x73,0x62,0x96,0x8c,0xd5,0x98,0xc2,0xd0,0x2c,0x44,0x32,0x37,0xd6,0x50,0x07,0xa9,0xbd,0x18,0x15,0xd8,0xc2,0x50,0x4e,0xaa,0x24,0x04,0xd9,0xc2,0xd0,0xac,0x1a,0x8c,0xd5,0xcc,0x6f,0x88,0xd4,0x7a,0xf6,0xa0,0x0f,0x7b,0xb9,0xb9,0xe0,0xaf,0x8b,0x16,0x54,0x8e,0xc4,0xd3,0x75,0x7d,0xb5,0x66,0x75,0xb9,0x66,0x79,0xb1,0x92,0x2d,0x2c,0x08,0xa1,0x69,0x97,0x0d,0xcd,0x52,0xda,0xed,0x5a,0xf1,0xee,0xb5,0x85,0x46,0xeb,0x3e,0x7c,0x9c,0x19,0x44,0xa8,0xea,0xb5,0x26,0x83,0xc6,0x67,0x69,0x7a,0x63,0x2e,0x04,0x37,0x1c,0xd5,0xd7,0x2e,0x1b,0xd6,0x97,0x2b,0x56,0x67,0x57,0xd8,0xaa,0xc0,0xb5,0x0e,0x55,0x59,0xca,0x3d,0x39,0x33,0xd7,0x05,0x7b,0xb3,0xeb,0x3c,0x46,0x23,0x0b,0xb1,0x15,0xce,0xd7,0x8c,0x6a,0x40,0xd3,0xad,0x57,0x74,0x9d,0xc7,0xa2,0xc1,0xd8,0x64,0x60,0xd1,0xd5,0x08,0x5b,0x54,0x74,0xb6,0xa2,0xbb,0x78,0x24,0x7e,0xf8,0x4a,0xa1,0x74,0x25,0xdc,0x73,0x00,0xc2,0xcd,0xe0,0x1b,0x43,0xc0,0x8d,0x1d,0xba,0x1b,0xa8,0x87,0x6b,0xd5,0x63,0x4c,0xc5,0xd1,0xe1,0x97,0xfb,0x06,0x5f,0xe3,0x40,0xb5,0xeb,0xda,0xe7,0x55,0x3d,0x0f,0xf3,0xd8,0xce,0x5b,0x2b,0xc3,0x64,0x74,0x83,0xc9,0xe8,0x46,0x56,0xd4,0x0e,0xf8,0x1c,0xbc,0xb6,0xcb,0xc7,0x79,0xfb,0x99,0x9d,0x55,0x0a,0x8e,0x8e,0x91,0xdd,0x93,0x7b,0xe1,0x54,0x70,0x5d,0x80,0x32,0x38,0x34,0xda,0x28,0xbc,0x32,0x50,0x95,0xe1,0x10,0x7b,0x4d,0x39,0x9f,0x09,0x00,0x07,0x0d,0x86,0x73,0x01,0x80,0x35,0x22,0x39,0x65,0x4a,0x96,0x78,0x2c,0x5f,0xbb,0x6a,0x28,0x47,0x05,0xaa,0x30,0xa9,0xcc,0xa4,0xc9,0x02,0xea,0x79,0x2d,0x00,0xec,0xa1,0xe7,0x7e,0xb3,0xfe,0xb1,0xa2,0x19,0x68,0xd7,0x2d,0xde,0x75,0x9c,0x7e,0x72,0x46,0x3d,0xad,0x58,0x9c,0x2e,0xe9,0x9a,0x8e,0xf5,0xb4,0xa2,0x9a,0x54,0x8c,0xf7,0x47,0xa1,0x4e,0x02,0x8c,0xda,0xea,0x30,0x07,0xaf,0x4f,0x3e,0xeb,0x81,0x98,0x62,0xf1,0xf5,0xac,0x66,0x72,0x20,0xf3,0x7b,0x56,0x59,0x1e,0xbd,0xff,0x18,0xd7,0xca,0x76,0x3a,0x0f,0x2c,0x4e,0x97,0x01,0xf8,0x7b,0x73,0x60,0x39,0x2e,0x13,0x00,0x8f,0x0f,0xc7,0x8c,0xf6,0x46,0xb8,0xd6,0xf1,0xf0,0x07,0x8f,0x00,0x98,0xec,0x8d,0x31,0x95,0xe1,0xfc,0xc1,0x39,0x74,0x1b,0xb1,0x8c,0xc3,0x97,0xf1,0xfe,0x98,0x62,0x64,0x99,0x1c,0x4f,0x78,0xf2,0xc3,0x75,0xea,0xb3,0x62,0x54,0x50,0x8e,0x4b,0xba,0xb6,0xa5,0x59,0x34,0x5c,0x3d,0xba,0x64,0xb4,0x3f,0xc2,0x8e,0x2b,0xec,0xc8,0xd0,0x9c,0x77,0xd8,0xb1,0xd0,0x1f,0xef,0xa0,0x18,0x97,0xf0,0x20,0xce,0x94,0x48,0xff,0x82,0x59,0x28,0x9a,0x2b,0x9d,0x6c,0x6f,0xa5,0x13,0x15,0xb1,0x1d,0x4f,0xf0,0x1d,0xf8,0xb6,0x41,0x6b,0x85,0x29,0x47,0xf8,0xc5,0x99,0x2c,0x2b,0x25,0x61,0x28,0x6d,0x35,0xa2,0x75,0x2d,0xc6,0x39,0xba,0xc5,0x45,0x00,0x48,0x0f,0x65,0x81,0xa3,0x13,0xff,0x20,0x14,0x18,0x03,0x4d,0xb0,0x91,0x3b,0x90,0x1d,0x26,0x52,0x07,0x1f,0xfc,0x3a,0x7c,0xdc,0xbf,0xab,0x3c,0xa2,0x8e,0x76,0x44,0x2c,0xf4,0x2e,0x7e,0x97,0x67,0x1c,0x24,0x06,0x2b,0x3f,0x27,0x38,0x75,0x5d,0xa4,0x0b,0x7e,0xd3,0xfa,0x9e,0xd1,0x88,0xc1,0x74,0x70,0xe9,0x29,0x9d,0x3f,0x9e,0x85,0x1e,0x22,0xf5,0x66,0xda,0x96,0xe4,0x49,0xa1,0x6c,0x32,0xbb,0x58,0xaf,0x57,0x68,0x7b,0x04,0x71,0xd9,0xa6,0xe6,0x98,0xa7,0xf7,0xe0,0x86,0x60,0x34,0x8c,0x30,0x98,0xe9,0x5a,0x08,0x51,0xb5,0x74,0xd8,0xf3,0x1b,0xcf,0x8e,0x72,0x0e,0xdf,0x39,0xba,0xf5,0x12,0xdf,0xb5,0x74,0xeb,0x15,0xed,0x2a,0x9c,0xcc,0xe3,0x3d,0xbe,0x0b,0xea,0x82,0xa0,0x3e,0xd0,0x21,0xef,0x72,0x5a,0xa1,0x91,0x03,0x16,0xca,0x71,0x25,0x0b,0x36,0x24,0x1b,0x00,0xa2,0x5b,0x75,0xb4,0xcb,0x4d,0x29,0x8e,0xf4,0x5b,0x79,0x58,0xaf,0x9a,0x24,0xe9,0x19,0x6b,0x82,0x4a,0x5a,0xd1,0xae,0xda,0x81,0x09,0xa0,0x0d,0xa0,0x10,0x17,0xba,0x10,0x5e,0x35,0x90,0x20,0x53,0x1f,0xe4,0x5d,0x80,0x0c,0x74,0x51,0xf5,0x5c,0xb4,0x52,0x8a,0xc3,0x3b,0x07,0x1c,0xdc,0xde,0x63,0xbc,0x37,0x02,0x3c,0xd5,0x44,0x00,0x2e,0xaa,0xda,0x8b,0xda,0x0e,0xde,0x11,0xa6,0x02,0x26,0xfb,0x63,0xca,0xda,0x52,0x4f,0x2b,0xca,0x51,0x99,0x16,0x9d,0x4a,0x1f,0x85,0x36,0x9a,0xc3,0x17,0xf6,0x39,0xba,0x77,0x80,0x2d,0x4d,0x56,0x13,0x01,0x59,0x0f,0xac,0x03,0xc8,0x36,0xcb,0x96,0x6e,0xdd,0xd1,0xad,0x3b,0x16,0xa7,0xcb,0x04,0xbe,0xa9,0xdd,0x6b,0x51,0x4f,0x1b,0xab,0x69,0x1b,0x99,0xf4,0x43,0x00,0xde,0x20,0xdd,0x1b,0x04,0xcf,0x94,0x96,0x7a,0x5e,0x63,0xad,0xa6,0x9e,0x0b,0x01,0x6a,0x43,0x19,0x17,0x9f,0x9c,0xf1,0xe4,0x07,0x0f,0x44,0xf5,0xec,0xa0,0x1c,0xc9,0xe9,0x3d,0xdd,0x4a,0xc4,0x5d,0x17,0x62,0xc4,0x8a,0xc9,0xc2,0x31,0x3e,0x3a,0x62,0x74,0x7c,0x02,0x78,0xda,0x45,0x54,0x69,0x05,0xab,0xa2,0x03,0x9c,0xc3,0x14,0x65,0x9a,0xb3,0xca,0x58,0xf0,0x4e,0xa4,0x4f,0xd7,0x11,0x6d,0x92,0x1b,0x10,0xf2,0x14,0xd5,0x33,0x69,0x21,0xc6,0x4f,0x52,0x79,0x5d,0x97,0x76,0x82,0xe4,0x66,0x37,0x6d,0x82,0xef,0xae,0x67,0x77,0x81,0xf6,0xe6,0xf7,0x21,0x1a,0x6e,0x83,0x68,0x5f,0xc8,0x26,0xf8,0xee,0xc2,0xfa,0xfe,0xab,0xdf,0xb8,0xb5,0x0b,0x7c,0x03,0xed,0x88,0xfd,0xd3,0xd3,0x1f,0xa1,0x2f,0x0e,0xd1,0x74,0x39,0x27,0xf4,0x22,0xcc,0x4b,0x1b,0xf7,0x98,0x3b,0x19,0x17,0x5b,0x96,0x72,0x18,0x4b,0x07,0x6e,0xdd,0xe1,0x1a,0x71,0xa2,0x13,0x2d,0x59,0xaf,0x5a,0x89,0xd2,0x6f,0x73,0xb1,0x92,0x33,0xaa,0x0b,0x93,0xee,0xda,0x3a,0xc4,0xba,0x47,0x9c,0x06,0x25,0x08,0x4b,0xde,0xb0,0xbe,0xd6,0x26,0xd0,0x89,0x36,0xf8,0x3d,0xb4,0xab,0x96,0x8b,0x87,0x57,0xe2,0x74,0x08,0xac,0xae,0x44,0x0b,0x23,0x20,0xdd,0x05,0x06,0x99,0xad,0x35,0x3e,0xec,0x38,0x9f,0xca,0xcf,0x82,0x40,0xf6,0x77,0x3d,0x8c,0xe6,0xa2,0xf2,0x6f,0x16,0x02,0x46,0xa3,0x99,0xcc,0x75,0x1b,0xd6,0xf5,0xd5,0x93,0x45,0xaa,0xd3,0xf2,0x72,0x89,0x6b,0x3b,0x8a,0x52,0x8e,0xc2,0x54,0x5a,0x31,0x9e,0xd7,0xb2,0xb5,0xda,0x68,0xca,0xba,0xc0,0x18,0xcd,0xf8,0x70,0x4c,0x35,0x29,0xa9,0x23,0xa3,0xae,0x60,0x7a,0x30,0x61,0x72,0x38,0x21,0xc6,0xc9,0x2f,0x6a,0x71,0x09,0xb2,0x95,0x0d,0xb6,0x76,0x01,0xc7,0x6a,0x5a,0x81,0xf7,0x5c,0x3d,0xbc,0xe4,0xfc,0xa3,0x33,0xda,0x65,0xc3,0xea,0x4a,0x24,0xcc,0xa2,0x12,0x26,0xbd,0xaa,0xca,0x20,0xa0,0x74,0x12,0x5f,0xa1,0xd0,0xbd,0x93,0x5d,0x84,0x0d,0x3c,0xd5,0x6c,0xc2,0xf8,0xf8,0x06,0xd5,0x74,0x06,0x5e,0xf6,0xef,0x6a,0x23,0x5a,0xcd,0xae,0x6d,0x59,0x9d,0x3d,0xc1,0xe1,0xb1,0x65,0xd9,0x83,0x65,0xe7,0x30,0x55,0x85,0xf3,0x2d,0xbe,0xeb,0x30,0x45,0x81,0x0f,0x7b,0x74,0x1d,0x0e,0x8d,0x05,0x14,0x6e,0xb5,0x04,0xe7,0x50,0x3e,0xd2,0xb1,0x88,0x67,0xe1,0x7b,0x37,0x9c,0x9f,0x02,0xc0,0xd2,0xfb,0x62,0x8e,0xf0,0xa4,0x48,0x78,0xd9,0x74,0x8d,0xf4,0x02,0x17,0xb6,0x81,0x46,0x5f,0x86,0x14,0x88,0x23,0x7b,0x78,0xf3,0x9a,0xeb,0x9f,0xcf,0xa5,0xf9,0x88,0x9b,0x5a,0x9e,0x53,0xbd,0x56,0xcd,0x39,0xe1,0x44,0xd2,0xa4,0xd0,0xa9,0x0e,0x11,0x6f,0x7d,0xf4,0x4c,0xcb,0xb8,0x00,0x9f,0xdf,0x47,0xc7,0xfa,0xa6,0xeb,0x09,0xab,0x51,0xa9,0x5f,0xe2,0xfa,0x03,0x82,0x61,0xbd,0xaf,0x9b,0xe0,0xa8,0x0e,0x6d,0xef,0x88,0x96,0x79,0x0f,0x74,0x4d,0x47,0xbb,0x5e,0xd1,0x35,0x1d,0xb9,0xcf,0x9d,0x6b,0xc5,0x80,0x9f,0xdb,0x02,0x4d,0x29,0x92,0x72,0xd7,0x74,0xac,0x2f,0x44,0x15,0x5a,0x8e,0xcb,0xd8,0x10,0x54,0x61,0x70,0x29,0xcf,0x00,0xae,0x01,0x80,0x63,0x1d,0x4d,0x29,0x52,0x53,0xb7,0x6c,0xa5,0x4c,0x2f,0x5c,0x77,0xb4,0xf3,0x36,0xcb,0x66,0xb0,0x76,0x65,0x71,0xa8,0x24,0x5d,0x2b,0xad,0x99,0xdf,0xde,0x63,0x72,0x38,0x61,0xef,0xce,0xde,0x70,0xfb,0x09,0xc3,0x34,0xbb,0x31,0x65,0xff,0xee,0x1e,0xd3,0x23,0x51,0x2f,0xd5,0xd3,0x2a,0x9c,0xac,0x21,0x6a,0x29,0xad,0x15,0xd5,0xa4,0x06,0x14,0xcb,0x73,0x21,0x00,0xe5,0xb8,0x44,0x1b,0x95,0xa4,0x53,0x5b,0x58,0x14,0x8a,0x2a,0x5b,0x6c,0x75,0x70,0x26,0x89,0x8a,0xfe,0x08,0x11,0xa3,0x59,0x8d,0x2d,0x0d,0xc6,0xea,0x50,0xa6,0xd4,0xcd,0x14,0x72,0xad,0x5d,0xb5,0x21,0x3c,0xdc,0xb3,0x93,0xf4,0x9f,0x94,0xb1,0xba,0x6c,0xf0,0x9d,0x13,0x29,0x02,0x60,0x40,0x6a,0x62,0xe3,0x87,0xd7,0xaa,0x20,0xd5,0x27,0xc0,0x5f,0xb7,0xac,0xcf,0xe3,0x99,0xab,0xe2,0x4a,0xb1,0xbe,0x58,0xca,0x64,0x0a,0xaf,0x75,0xeb,0x28,0x81,0x07,0xc2,0x66,0x0b,0x94,0x29,0x29,0xc6,0x53,0x40,0x8e,0x3d,0x6b,0xaf,0x16,0xe1,0x08,0x32,0x83,0x2e,0x6c,0xd8,0xe4,0x6f,0x50,0xb6,0x12,0x29,0x57,0x2b,0x94,0x91,0xed,0x2d,0x18,0x03,0x5a,0xce,0xbc,0x46,0x19,0xb6,0xbc,0x9d,0xb3,0x09,0xbd,0x2d,0x11,0x13,0x16,0xae,0xcf,0x26,0x3d,0xa9,0xfe,0x64,0x7f,0x76,0xa3,0xe1,0x06,0xda,0xed,0x02,0xef,0xeb,0x24,0xe6,0x1d,0xa0,0x3d,0xf8,0xbd,0x75,0x69,0x00,0x8f,0x3b,0xde,0xd9,0xf5,0xda,0xa6,0xea,0xd9,0xef,0xfa,0xb3,0x9d,0x09,0x04,0xbf,0x11,0x23,0xd1,0xb3,0x82,0xef,0x85,0x98,0xa4,0x0c,0x68,0x8d,0x2a,0x4b,0xe9,0xf7,0x30,0x61,0xb5,0x2d,0xb1,0x95,0x48,0x96,0xeb,0xcb,0x05,0xa0,0xe4,0x1c,0x6f,0x6b,0xe8,0xc2,0x96,0x97,0x28,0x65,0x6a,0x9b,0xd8,0x7d,0x3c,0x5e,0x4c,0x53,0x5e,0xd6,0xa5,0x6b,0x3b,0x29,0xdb,0xc8,0x84,0x89,0xcc,0x75,0xd7,0xca,0x7c,0x28,0xaa,0x22,0xab,0xf8,0x70,0x3e,0xda,0x42,0x80,0xbd,0x6b,0x5c,0x76,0xaf,0x6f,0xe5,0xfa,0x72,0x9d,0x24,0xa2,0xe5,0xc5,0x8a,0x6e,0xa3,0x3e,0xdb,0x69,0x73,0x0d,0xf4,0xde,0x05,0xf1,0x5e,0x51,0x5b,0x8a,0xd2,0xd0,0xae,0x5b,0xce,0x1f,0x8a,0x2d,0xb3,0x9e,0x56,0xb2,0xff,0xd9,0x1a,0xba,0x56,0xf6,0x89,0x9f,0x7e,0x74,0xca,0xf9,0x67,0x17,0x5c,0x7c,0x76,0xc5,0x7a,0xd1,0x82,0x52,0x14,0x23,0x4b,0x35,0x2e,0xf1,0x4a,0xd1,0x85,0x7a,0x15,0xa3,0x82,0x72,0x52,0xa6,0x52,0x6c,0x2d,0x42,0xc3,0x68,0x6f,0xcc,0xe8,0x60,0xcc,0x78,0x6f,0x2c,0xd2,0x6c,0x69,0xc2,0x39,0xde,0x61,0xfd,0xd7,0x11,0xc4,0x94,0x68,0xd7,0xbc,0x67,0x7d,0x1e,0x85,0x1d,0xe8,0x16,0x2b,0xe8,0xc0,0x8e,0x0a,0x54,0xa5,0xf1,0x5a,0xd1,0xad,0x1a,0xda,0xe5,0x3a,0x30,0x45,0x36,0xb5,0x30,0x8e,0x8b,0x32,0x46,0x42,0x47,0x2a,0x15,0x4e,0x66,0x52,0x68,0x87,0x9c,0x75,0xee,0xa0,0x59,0x5e,0xe1,0xba,0x06,0xb7,0x5e,0xa3,0xb4,0x45,0x95,0x05,0x78,0x25,0xa7,0x98,0x79,0x4d,0xbb,0x6e,0xe8,0x9a,0x75,0xb8,0x66,0x83,0xd9,0xb0,0x00,0xa3,0xf1,0x5d,0x2b,0x38,0xd1,0xb9,0x60,0x21,0x55,0xc1,0xef,0x4a,0xd4,0xcc,0xd1,0x76,0xec,0x5d,0xf8,0xc4,0xe5,0xa9,0xc2,0x71,0x08,0xde,0xe3,0xbd,0xee,0x43,0x27,0x6f,0x2c,0xe1,0x2e,0x68,0x6e,0x5c,0xa2,0x9d,0x0c,0x9e,0x49,0xf8,0xbb,0x79,0x2d,0x6a,0x90,0x23,0xe6,0x45,0x7c,0x76,0x2a,0x68,0xc7,0x07,0xb1,0x9f,0x33,0xc8,0x0f,0x9c,0x69,0xe2,0x4a,0x7b,0xea,0x12,0x3e,0x21,0xd7,0x0e,0xe2,0x1e,0xb0,0x78,0x00,0x93,0xf2,0xd9,0xbe,0x2c,0x17,0xdf,0xcb,0xd9,0x5e,0x42,0x8d,0x24,0x0f,0xd9,0x03,0xe9,0x90,0x80,0x14,0xae,0x2f,0x0a,0x05,0x9d,0x4b,0x76,0x3e,0x3f,0x90,0xc8,0xc3,0xa0,0x12,0xdf,0xf5,0xc2,0x99,0x46,0x6e,0xda,0x4b,0x19,0xc6,0x0a,0x07,0xd6,0x2e,0x17,0x74,0xcb,0x16,0xef,0x9c,0xec,0x1f,0x0c,0xf6,0x60,0xad,0x15,0xbe,0x15,0x5d,0x7f,0x17,0xc0,0x46,0xc2,0x1b,0x46,0x23,0xba,0xc7,0x96,0x72,0xac,0xe2,0x7a,0x29,0x36,0x15,0xed,0x65,0x71,0x16,0xe3,0x1c,0x80,0x7b,0x6e,0xa4,0x6b,0xa4,0x1d,0xb6,0xb4,0x69,0x01,0x19,0x2b,0xea,0x37,0x6d,0x74,0x02,0x9a,0xcd,0x64,0x0a,0x43,0x35,0x96,0x7b,0xf5,0xbc,0x46,0x69,0x45,0x51,0x17,0xa2,0xdd,0x5f,0xb7,0x28,0xad,0x99,0xec,0x8f,0x29,0x2a,0x71,0x20,0x59,0x5e,0xc8,0x82,0x10,0x86,0x02,0xd6,0x97,0xf2,0xdb,0x94,0x3a,0x81,0xf2,0xfa,0xaa,0x11,0x89,0x71,0x5c,0xa4,0xfe,0x8a,0x47,0x6d,0x08,0x48,0xcb,0xbb,0xae,0xf3,0x94,0xa3,0x02,0x5b,0x09,0xf3,0x12,0x6d,0x59,0xeb,0x0d,0x29,0x77,0x77,0x92,0xdc,0x72,0xef,0xcf,0xd5,0xa5,0x10,0x24,0xa5,0xd4,0xf5,0x04,0x69,0x03,0x8f,0x6d,0x90,0x38,0xae,0x1e,0x5e,0xf0,0xe8,0x7b,0x0f,0x38,0xfb,0xe0,0x91,0x10,0x38,0x03,0x84,0x30,0x93,0xae,0x73,0x42,0x90,0x95,0x80,0x6f,0x9a,0x1b,0xad,0xfc,0xd5,0xd6,0xc8,0xd1,0x64,0x0a,0xda,0xcb,0x33,0x2e,0x3f,0xfe,0x18,0xef,0x45,0xa3,0xe2,0x3b,0x87,0xc2,0x48,0x30,0xac,0x18,0x51,0xcd,0x79,0x09,0xc2,0xa4,0x2d,0x3a,0x1e,0x0a,0x92,0xa4,0x35,0x32,0xf0,0xdd,0x00,0x5a,0xb9,0x39,0x04,0xe3,0x0c,0xa8,0x13,0x50,0x5d,0x07,0x92,0x5b,0x68,0xb5,0x09,0xbe,0xd9,0xd7,0x5d,0xa0,0xbd,0xf1,0xea,0x8e,0x87,0xaf,0x7f,0x7c,0x0b,0x7c,0x77,0x55,0x71,0x1b,0xc4,0x77,0xc0,0xfa,0xc6,0x7b,0xfd,0x8f,0x2d,0x50,0x8f,0xd2,0x83,0xd2,0x7d,0x48,0x42,0x2f,0xe6,0x26,0xed,0xc4,0x1b,0x16,0x07,0x7e,0xb5,0x02,0x3c,0xa6,0x28,0x28,0xcb,0x12,0xdf,0x39,0xd6,0xe7,0xe2,0xd4,0x54,0x4e,0xc6,0xc2,0x44,0xb6,0xa2,0x7a,0x76,0x2e,0xa8,0xa0,0x83,0x64,0xa8,0x94,0x62,0x72,0x32,0xa7,0x9c,0x57,0x80,0x17,0x82,0x1d,0x4c,0x40,0x31,0x48,0x8c,0xad,0x44,0xab,0xb3,0x08,0x8e,0x81,0x51,0x22,0x8e,0x49,0x29,0x18,0xef,0x8d,0x18,0xcd,0x47,0x69,0xfb,0x51,0x94,0x78,0xc3,0x13,0xc4,0x89,0xeb,0x3a,0xc7,0x93,0x8f,0xcf,0x39,0x7f,0x78,0xc9,0xd5,0xe9,0x02,0xd7,0xf5,0x00,0xac,0x8d,0x62,0xef,0xd6,0x8c,0xc9,0xe1,0x98,0xeb,0x53,0x7e,0x14,0x82,0xcc,0xad,0x6a,0x5a,0xe1,0x15,0x2c,0xcf,0x57,0xb4,0xab,0x96,0x66,0xd5,0x62,0x0a,0xc3,0x78,0x2e,0xcc,0x48,0x17,0x84,0x84,0xae,0x73,0x2c,0xce,0x96,0x72,0x3a,0xd5,0x52,0x1c,0x96,0xca,0xaa,0x10,0x0d,0x1f,0xb0,0x0e,0x5e,0xdf,0x26,0x0a,0x0a,0x81,0xb4,0xdb,0x42,0xda,0x34,0x9a,0x87,0xf3,0x9f,0xbd,0x67,0xbc,0x37,0xa6,0xa8,0xc5,0x11,0x29,0x3a,0x72,0x95,0x95,0x01,0x34,0xb6,0xb4,0x68,0xad,0x68,0x16,0xeb,0x81,0xf3,0x53,0xbb,0x14,0xc0,0xb3,0x55,0x41,0x3d,0x1b,0x0b,0xc3,0xb3,0x58,0x07,0xad,0x98,0xa7,0x28,0xc5,0x81,0x32,0x06,0x5e,0x57,0xde,0x53,0x54,0x95,0xcc,0xa2,0xb6,0x13,0xb5,0xb2,0xad,0x70,0x88,0xfd,0xd7,0xe3,0x70,0xcd,0x15,0xde,0x43,0xb7,0x5c,0x05,0x93,0x92,0xc5,0xfb,0x78,0xee,0xb5,0xc7,0x35,0x2b,0xdc,0x5a,0x6c,0xce,0xda,0x94,0xa2,0xc1,0xd3,0x56,0x34,0xa3,0x6d,0x23,0x34,0xbc,0x95,0xf2,0xa3,0x13,0x55,0x6a,0xb8,0xa7,0xc7,0x37,0x07,0xf8,0x18,0x4a,0x19,0xd9,0x71,0x43,0xd7,0x63,0x4b,0xa6,0x7e,0x8e,0x88,0x29,0xa7,0x34,0x75,0x28,0xd5,0x87,0xa7,0x94,0xf6,0x6d,0x22,0x6e,0x2c,0x32,0x94,0xd3,0x49,0x1e,0x1e,0x2f,0xe6,0xd7,0x0d,0x84,0x0e,0x91,0x9e,0x7b,0x9b,0x40,0xbf,0x70,0xa2,0xfb,0x76,0x5c,0x7a,0x02,0xcc,0x12,0x66,0x53,0x44,0xff,0x10,0xd7,0x87,0xa8,0x0c,0xe8,0x81,0x53,0x06,0x29,0xe6,0x10,0x55,0x71,0x2e,0xb2,0x02,0x59,0x88,0xaf,0xd8,0xc8,0xc8,0x99,0x44,0x07,0x05,0x11,0x8e,0x14,0x4e,0x49,0xc7,0xf8,0xe0,0x10,0x46,0xc6,0x53,0x45,0xa2,0x98,0x24,0x91,0xae,0x15,0x90,0x0e,0x6e,0xf5,0xde,0x68,0xe1,0x98,0xdb,0x2e,0x78,0x51,0x46,0x5b,0xad,0xc2,0xd6,0x55,0x52,0x31,0x75,0xeb,0x0e,0x17,0xb8,0xa4,0xae,0x69,0x50,0xda,0x87,0xc5,0x27,0x7b,0x4d,0x75,0x54,0xa9,0x3a,0x4f,0xd7,0x76,0x74,0xde,0x63,0x2a,0x8b,0x2e,0x24,0xef,0xb4,0x40,0x33,0x26,0xb9,0x6b,0xba,0x10,0xb5,0xa7,0x07,0xdc,0xcb,0x47,0xe2,0xb9,0x5b,0x8e,0x77,0x3b,0x6a,0xc4,0x45,0xe1,0x9d,0x4c,0xa0,0x6a,0x52,0x62,0x6b,0x91,0xbe,0xcf,0x1e,0x5c,0xe2,0xf0,0x54,0xfb,0x23,0x9c,0x52,0x5c,0x5d,0xac,0xd2,0x62,0x8c,0x12,0xf5,0x7a,0xd1,0xe0,0x3a,0x87,0xb1,0x86,0x6a,0x22,0x2a,0xe7,0xe5,0xc5,0x92,0xb6,0x69,0x31,0x56,0x27,0x15,0x56,0x1a,0x67,0x25,0xea,0xea,0xae,0x73,0x5c,0x9e,0x5e,0xe1,0x11,0xfb,0x13,0x40,0x35,0xed,0xed,0xbf,0xd7,0xa7,0xac,0xc1,0xca,0xb3,0xba,0x5c,0x72,0xf1,0xf8,0x92,0xf3,0xcf,0xce,0x69,0xd7,0xed,0x80,0x20,0xd9,0xca,0x30,0xbf,0x31,0x13,0xa7,0x35,0xc5,0x70,0x7b,0x75,0x48,0x91,0xe0,0xb5,0xeb,0x4e,0x6c,0xca,0xd1,0x8e,0xe6,0x62,0x85,0x25,0x5d,0x3e,0x38,0xe5,0xea,0xb3,0x53,0x2e,0x3e,0x7a,0x98,0x3f,0xf0,0x90,0x16,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0xea,0x90,0x1c,0x72,0x8a,0x02,0x13,0xa2,0x88,0xad,0x17,0x2b,0x71,0xa2,0xd0,0x2a,0x6c,0x0d,0xee,0xc0,0x28,0x7c,0x61,0xf0,0x85,0x09,0x07,0x5d,0x35,0x38,0x25,0x8e,0x40,0xde,0xc6,0x3d,0xa9,0x3e,0x31,0x07,0x03,0x7b,0xef,0x4e,0xa0,0xcd,0x17,0x5f,0xf6,0xec,0x26,0x5c,0x7d,0x4e,0x90,0x4c,0x2b,0xf1,0x3a,0xd0,0xf6,0x9b,0x17,0x76,0xdd,0x0f,0x5f,0x06,0xc5,0xed,0x28,0xf0,0x2f,0x40,0xf5,0xbc,0x0d,0xbe,0xc3,0xec,0x7d,0x58,0xd3,0x4a,0xa9,0xb4,0xad,0xd7,0x87,0x2d,0xd7,0xce,0x80,0x2a,0xe4,0x94,0xaa,0xa6,0x5d,0x22,0xd2,0xee,0x98,0x0e,0x68,0xd7,0x6b,0x71,0xb2,0xc4,0x89,0xf6,0x02,0x8d,0x6b,0xa3,0xe3,0xdd,0xd0,0x33,0xba,0x9e,0x8f,0x18,0xed,0x8b,0x4a,0x75,0x7d,0xb1,0xc2,0xb7,0x4e,0xd4,0xd4,0x44,0x50,0xd4,0xe2,0x44,0xb5,0x6e,0x69,0xc2,0xbc,0x2e,0x47,0x25,0xa3,0xbd,0x51,0x62,0x12,0xeb,0x59,0xcd,0xf4,0x78,0xc2,0xec,0x78,0xc2,0x68,0x2e,0x60,0xd8,0xac,0xd7,0xc4,0x39,0xde,0x9f,0x0b,0x0b,0xa0,0x68,0x16,0x0d,0x8b,0x53,0xd1,0xd2,0xf4,0x60,0xaf,0x19,0xcd,0x6b,0xaa,0x71,0x29,0xb6,0xda,0x81,0x84,0xbe,0xf9,0xe9,0x67,0x8b,0x02,0xaa,0x71,0x89,0x02,0x56,0x57,0x2b,0x50,0xb0,0x0c,0x8c,0xc2,0xf8,0x60,0x04,0x8a,0xad,0x2d,0x4e,0x1e,0x58,0x2d,0xc4,0xa7,0xc5,0x4e,0x4a,0x8a,0x71,0x41,0xe7,0x3c,0x97,0xe7,0xcb,0xb4,0xbe,0x8b,0x3a,0x04,0x56,0xf2,0x1e,0x5b,0x1a,0x8a,0xca,0x62,0x0a,0x43,0xbb,0x6a,0x59,0x5d,0xae,0x51,0x46,0x31,0x3e,0x10,0x8d,0xdb,0xf2,0x7c,0x89,0xc7,0x87,0xad,0x46,0x8e,0x22,0x98,0xa1,0x56,0x57,0xeb,0x70,0xb2,0x60,0xd8,0x8a,0x0a,0xac,0xcf,0x17,0x78,0xef,0x29,0x67,0x35,0x9e,0x8e,0xf5,0xc5,0x15,0xdd,0x52,0x80,0x5a,0x15,0x26,0xc5,0xbf,0x88,0x58,0x64,0x2a,0xd1,0xc8,0x35,0x8b,0x2b,0xb9,0x98,0x34,0x95,0x1a,0xd7,0x75,0xd2,0x7f,0xde,0xd1,0xb6,0xe2,0xff,0xe1,0xad,0xd0,0x30,0x8c,0x0e,0x82,0x58,0x43,0xd7,0x36,0x78,0xdf,0xa0,0x8c,0xc2,0x6b,0x2f,0x52,0x3b,0xd0,0x76,0xab,0x20,0xb9,0x36,0x12,0x7f,0x5d,0x09,0xae,0x39,0xef,0xc3,0x21,0x2b,0xb1,0xb7,0x32,0x01,0x4e,0xc9,0xf6,0x32,0x39,0x1a,0x33,0x84,0x88,0xd4,0x71,0x2d,0xf4,0xcf,0xb9,0x10,0xd2,0x32,0x61,0x77,0xe8,0xcb,0xe1,0x99,0xca,0x71,0x4e,0x04,0xc4,0xf3,0x11,0x17,0xbb,0x7e,0x84,0xf3,0x33,0x85,0xc3,0xd5,0x8c,0x0c,0x3a,0x7a,0x4a,0x17,0x81,0xb1,0x27,0x2e,0xe9,0xec,0xd7,0x74,0x8d,0x5e,0xb7,0x1d,0x5e,0x8b,0x27,0x9a,0xc8,0x29,0x13,0x51,0x8f,0x2c,0x17,0x9d,0x77,0x72,0x1a,0x84,0x0f,0xc7,0x3b,0x77,0xb1,0x53,0xba,0x04,0xd3,0x92,0x7d,0xa6,0x27,0x77,0x1d,0xbe,0x6d,0x49,0x01,0x32,0x7c,0xdc,0xfb,0xa5,0x42,0xfe,0xb1,0x6e,0x41,0xd5,0xa0,0x3c,0x6e,0x2d,0x40,0xab,0x95,0x12,0xc7,0x0e,0x82,0xa4,0x14,0x88,0x4c,0xb3,0x94,0xc5,0x64,0x4a,0x8b,0xa9,0x05,0x64,0xbb,0xa6,0x49,0x1d,0xd3,0xae,0xa4,0x8e,0x65,0x2d,0x93,0xa5,0xa8,0x45,0x9a,0x6e,0xa2,0x67,0xb5,0x0f,0x12,0xaf,0x12,0xce,0x75,0x15,0xa4,0x4e,0xa9,0xaf,0x4b,0x5f,0xdb,0x95,0x2c,0x94,0x72,0x5c,0x62,0x0b,0x43,0xd7,0x74,0x2c,0xcf,0x17,0xe0,0xfd,0xc0,0x5e,0x1b,0x93,0xd6,0x9a,0x7a,0x5a,0xe3,0xf1,0xc9,0xb5,0xbf,0x9a,0x88,0x67,0xa1,0x6b,0x3a,0x9a,0x65,0xc3,0x2a,0x48,0xbc,0x38,0xc7,0xea,0x7c,0x89,0x73,0x9e,0x36,0xe3,0xce,0x9b,0x65,0x9b,0x6c,0x43,0xf5,0xa4,0x02,0xe7,0x59,0x5f,0x36,0xac,0x97,0x4d,0x68,0x4b,0x41,0x31,0x2a,0x98,0x1e,0x4d,0x84,0x18,0x15,0x06,0xad,0x14,0xdd,0xba,0x63,0x15,0x3c,0x9d,0xeb,0x69,0x15,0x16,0x6d,0x41,0xd7,0xba,0x67,0xec,0x69,0xdc,0x24,0xb5,0x8a,0xab,0x27,0x0b,0xf1,0x9a,0x86,0x81,0xf4,0x31,0x3b,0x99,0x51,0x4f,0x2b,0x66,0x27,0xd3,0xd0,0x86,0xed,0xdc,0x4c,0x21,0x6a,0x25,0x1f,0x80,0x37,0x05,0x4a,0x89,0xd1,0x92,0x62,0xa9,0xce,0xb3,0x7c,0x72,0x91,0x98,0x2a,0x60,0xb0,0x4d,0xc5,0x56,0x02,0xc0,0xdd,0xaa,0x57,0x99,0xe1,0x09,0xa7,0x91,0x88,0x69,0x43,0xa9,0x02,0x3a,0x2d,0x5b,0xd8,0xba,0x0e,0xd0,0x58,0x5b,0x01,0xa6,0x9f,0xbb,0x83,0x60,0xdf,0xbb,0x1c,0xac,0x72,0xe0,0xea,0xaf,0xef,0x54,0x3d,0xef,0xea,0xb3,0x6b,0x40,0xf2,0xcf,0xad,0x7a,0xbe,0x16,0x7c,0x77,0x15,0xbf,0xab,0xac,0xcd,0xab,0x7e,0xa3,0xf8,0x61,0x39,0xbb,0x79,0x88,0x4d,0x06,0x22,0x0e,0x60,0x40,0xdf,0x78,0xc4,0xa8,0x07,0x7c,0x38,0x21,0xc7,0x39,0x5c,0x30,0x29,0xa8,0x70,0x2e,0x79,0xb7,0x14,0x89,0xb8,0x59,0xf4,0x5e,0x56,0xcd,0x42,0xc6,0xd5,0x87,0x53,0x9e,0x22,0x00,0x97,0x73,0x01,0xa9,0xf5,0xd5,0x8a,0xab,0x47,0x17,0x52,0x4c,0x2b,0xb1,0xe5,0x4d,0x61,0xc4,0x39,0x0b,0x59,0x9b,0xdd,0x4a,0x82,0x3d,0x14,0xa3,0x82,0xe9,0xf1,0x94,0xf9,0x0d,0x39,0xdb,0xb8,0x0c,0x1a,0x21,0xef,0x85,0x09,0x16,0x35,0xb6,0x27,0x85,0xaa,0xdc,0x4c,0xd9,0xa5,0x5e,0x25,0x6e,0x12,0xd3,0x2d,0xb6,0xe6,0xde,0xee,0x9c,0x7f,0x36,0x33,0xd0,0xc1,0xd9,0xb2,0x6d,0x84,0x01,0x55,0x1e,0x56,0xe7,0x2b,0xf9,0x1e,0x3c,0xb3,0x57,0x97,0x43,0x86,0x58,0x01,0xae,0x6d,0xf1,0x4d,0x27,0x0e,0xa4,0x5a,0xb1,0xbe,0x5c,0xd3,0xad,0x45,0x60,0x30,0x85,0x46,0x5b,0xd3,0x9b,0xd8,0xb4,0x62,0xb4,0x2f,0x36,0xe6,0xd5,0xf9,0x8a,0xc5,0x93,0x05,0xe0,0xd1,0x5a,0x9c,0x58,0x97,0x67,0x0b,0x94,0x77,0xa2,0xc6,0x77,0xc2,0xa0,0x28,0x9c,0xd8,0xb7,0xa3,0xe6,0xd3,0x09,0x1d,0x5e,0x3e,0xb9,0x14,0x26,0xdb,0xc1,0xea,0xc9,0x15,0x6d,0xd3,0xd1,0xad,0x85,0x8e,0x98,0xc2,0x02,0x9d,0xec,0xad,0x0d,0x82,0x95,0x29,0x0a,0x5c,0xd3,0xb2,0x5e,0x5c,0x41,0xe7,0x45,0x13,0x69,0xc3,0x5a,0x5d,0x5e,0x11,0xa3,0x64,0xb9,0xb6,0xc5,0xf9,0x06,0x4d,0x70,0x9e,0x33,0x46,0xf0,0xa3,0x6d,0x80,0x8e,0x6e,0xb5,0x10,0x4d,0x65,0x35,0x91,0xbd,0xba,0xcd,0x1a,0xba,0x0e,0x5c,0x17,0x34,0x62,0x1d,0x18,0x43,0x72,0xb4,0xc2,0x0b,0x13,0x64,0x44,0xa5,0xed,0x55,0x47,0xb2,0xdf,0xe2,0xe9,0xba,0x2e,0xc3,0xb2,0x5c,0xfa,0xa5,0xe7,0x20,0x22,0x06,0x39,0x27,0x1e,0xd5,0x11,0xff,0x7c,0x0f,0xa8,0x0c,0xce,0x3e,0x0e,0xe2,0x6f,0xa6,0x49,0xeb,0x99,0xf4,0x90,0x3c,0x68,0x1f,0x33,0x0d,0x2a,0x68,0x1f,0x38,0x86,0x14,0x23,0x36,0x37,0x4a,0xbb,0xa8,0x32,0x8e,0x5e,0x62,0x84,0x77,0x5c,0x08,0xe3,0x95,0x15,0xe2,0x91,0x0e,0x4d,0x60,0xec,0xe2,0xa5,0xa4,0x02,0xf3,0x74,0xd9,0x1e,0x34,0x8f,0xf7,0x5d,0x22,0x62,0x72,0xde,0x6f,0x87,0xef,0x24,0x80,0x82,0x57,0x3e,0xbd,0x97,0x36,0x65,0x47,0x22,0x18,0x55,0xdd,0x1d,0xb8,0x76,0x0d,0xce,0xa1,0xad,0xec,0x17,0xf5,0xce,0xd3,0x2d,0x57,0xd2,0x6c,0xe7,0xf0,0xad,0xa3,0x5d,0x36,0x28,0x2b,0x36,0x5a,0xdf,0x7a,0x71,0xf4,0x71,0x42,0x58,0xd6,0x8b,0x35,0x9d,0xf3,0xd8,0xda,0x62,0x0a,0x51,0xe5,0x3a,0xef,0x69,0xae,0x56,0xa9,0xf3,0x96,0xa7,0x4b,0xda,0x65,0xc3,0xe2,0x7c,0xc9,0xf2,0x62,0x35,0xe4,0x81,0x42,0xd5,0xa2,0x43,0xd7,0x28,0xa8,0x8e,0xd6,0x8b,0x06,0xef,0x15,0xcd,0x4a,0xb8,0xb7,0xde,0x41,0x4b,0xd2,0xf8,0x60,0x84,0xd2,0x8a,0xe5,0x59,0xc8,0xd3,0x05,0x5b,0xb5,0x82,0x26,0x80,0xf9,0xf9,0x83,0x0b,0x2e,0x1f,0x5e,0xf2,0xe4,0xe3,0xb3,0x04,0xbc,0xb1,0x9c,0x66,0xd5,0xd2,0xb5,0xbd,0x23,0x08,0x2a,0x48,0xc4,0xde,0x85,0x2d,0x52,0xb2,0x98,0xe6,0x27,0x33,0xc6,0x7b,0x23,0xa6,0x47,0x13,0x6c,0x29,0x13,0xbc,0x6d,0x3a,0x5c,0xe7,0x59,0x5d,0xad,0xd1,0x61,0x3f,0xb1,0x42,0xa4,0xe7,0x9d,0xd4,0x75,0x40,0x41,0x06,0xc8,0x91,0x75,0x04,0x49,0x02,0x2e,0x46,0x85,0x6c,0x5b,0x22,0x10,0xc2,0xd0,0xf6,0xf9,0xcd,0x39,0xc7,0x2f,0x1f,0x8b,0xba,0xdc,0x8a,0x03,0x49,0xdb,0xf4,0x5b,0xc0,0x92,0xd5,0x22,0x4c,0xad,0x1d,0x98,0x9d,0xca,0x75,0x61,0x0b,0x81,0x29,0x0a,0xb4,0xb5,0xc2,0xb8,0x75,0x43,0xcd,0x84,0x77,0x41,0x63,0x60,0x0c,0xca,0x2a,0x30,0x0e,0x4f,0x1b,0x42,0x81,0x3a,0x39,0x74,0x9c,0x0e,0x1f,0x17,0x4e,0x50,0x33,0x0d,0x03,0x89,0x84,0xb9,0xca,0x06,0x18,0xc7,0x69,0xbf,0x0b,0x7c,0x37,0x5f,0xdf,0xa8,0xfb,0x75,0xf7,0x77,0xaa,0x9e,0xaf,0xcb,0x6b,0x17,0x68,0x6f,0x15,0xd5,0x3f,0x93,0xc0,0x77,0xab,0x8a,0xdb,0x0c,0xc3,0xce,0xac,0x07,0xef,0xf5,0x3f,0xae,0x07,0x75,0x19,0x44,0x95,0xf6,0x99,0x39,0x62,0x10,0x67,0x91,0x62,0x14,0x2e,0xda,0xf1,0xb2,0x3d,0xef,0xed,0x52,0xa4,0xa1,0xd5,0xd9,0x79,0xc8,0xb9,0x63,0xbd,0xe8,0x19,0x2b,0xd7,0x39,0xd9,0x4a,0xa8,0x15,0x36,0x30,0x8d,0x67,0x3f,0x7c,0x2c,0x00,0xeb,0x08,0x7e,0x22,0xdb,0x00,0xec,0xbc,0x1f,0x30,0xcf,0xc5,0xa8,0xc0,0x84,0x28,0x76,0xde,0x79,0x1e,0x7f,0x78,0xca,0xe5,0x93,0x2b,0xce,0x3e,0xbd,0xd8,0x5e,0xdc,0x9b,0x9d,0x10,0xfd,0x11,0x02,0x00,0x17,0x95,0x4d,0xe6,0x14,0x60,0x6b,0xad,0x0f,0xc9,0x70,0xff,0x2d,0xdf,0xd2,0x18,0xf8,0x12,0x9c,0xf7,0x9c,0x3d,0x38,0xa7,0x59,0xb5,0x5c,0x3e,0xba,0x4a,0x0e,0x9e,0xc3,0xfc,0x14,0x57,0xe7,0xab,0x94,0xf1,0x32,0xa8,0x9f,0xbb,0x75,0x9b,0xb4,0x63,0xcd,0xb2,0x49,0x41,0x74,0xa2,0x99,0x6b,0x75,0xb9,0xa2,0x59,0x35,0x2c,0xcf,0x56,0x38,0x04,0x90,0xdb,0xa6,0xa5,0x5b,0x3b,0x31,0xf9,0x58,0x8d,0xa9,0x0c,0x6d,0xe7,0xc5,0xb6,0xeb,0x7b,0xbd,0x87,0xc7,0xd1,0xae,0x5b,0x4e,0xdf,0x7b,0xc8,0xd9,0xfb,0x0f,0x24,0x80,0x91,0x73,0xb8,0xce,0x8b,0xb9,0x4c,0xc9,0xf1,0xad,0xd2,0x6d,0x1e,0x53,0x94,0xb8,0xd6,0xd1,0xac,0x57,0xc2,0x30,0x10,0x18,0x8e,0xa8,0xf5,0x6a,0x56,0x01,0xdc,0x05,0x03,0xc4,0xb9,0xb6,0xc3,0x98,0x52,0x76,0xae,0x76,0x6b,0xc1,0x91,0xce,0xe3,0x9a,0x25,0x9d,0x5b,0x05,0x5b,0x6f,0x47,0xdb,0x5c,0x85,0x38,0xeb,0x04,0xef,0xf8,0xfe,0x38,0x40,0xe5,0x1d,0xe8,0x0a,0xa7,0x8c,0x9c,0x46,0x14,0xb6,0x32,0x7a,0xef,0xf0,0x4a,0xd3,0x39,0xa4,0xcc,0x38,0x16,0x9e,0xb0,0x1f,0x38,0x60,0x57,0x88,0x88,0x97,0x9c,0xa9,0xba,0x8d,0xf5,0xaf,0x82,0x09,0xd5,0x65,0x07,0xae,0xe4,0xa7,0x26,0xd1,0x6b,0x69,0xe5,0xf3,0xff,0x53,0xf7,0x26,0x4d,0x96,0x24,0xc9,0x99,0xd8,0x67,0xe6,0xef,0xc5,0x96,0x19,0x99,0x95,0xb5,0x57,0x75,0xa3,0xf7,0x6e,0x34,0xd6,0xe9,0xc1,0x0c,0x16,0xc1,0xc8,0x70,0x44,0x46,0x84,0xc4,0x0d,0x22,0x3c,0xf3,0x07,0xf0,0x40,0x21,0x6f,0xbc,0xf2,0x46,0xe1,0x85,0xbf,0x80,0x32,0x37,0xf2,0x38,0x27,0x92,0x32,0x27,0x82,0xc2,0xc1,0x8e,0x99,0x6e,0xa0,0xa7,0x6b,0xef,0xaa,0xac,0xcc,0xaa,0xcc,0xac,0x5c,0x22,0x63,0x8f,0xb7,0xba,0x9b,0x29,0x0f,0xaa,0x6a,0xa6,0x66,0xee,0xfe,0x22,0x22,0xab,0x0a,0x03,0x58,0xca,0xcb,0x78,0xcf,0xdd,0xf6,0x45,0x3f,0x55,0x35,0x35,0xb5,0x98,0xf0,0x92,0x28,0xc2,0x9c,0x50,0x97,0x2f,0x64,0x66,0xd4,0xc0,0x7c,0x63,0xbf,0x98,0xf9,0xc2,0x7a,0x72,0xa2,0x43,0x17,0x87,0x02,0x7c,0xa4,0x4a,0xae,0x5d,0x6a,0x90,0x67,0x9b,0x87,0x1c,0xbb,0x8a,0x42,0x0f,0xd9,0xe0,0xc2,0x81,0x2f,0x33,0x47,0xc3,0xea,0x25,0x76,0x04,0x22,0xfe,0x6f,0x88,0x37,0xd7,0x9d,0x17,0x7d,0x7e,0x03,0x38,0x55,0x29,0x72,0x62,0xf1,0x7a,0x15,0xc1,0x2e,0xee,0x58,0x45,0x3c,0x0d,0xe0,0xcb,0x9c,0x7d,0x83,0xb8,0x16,0x23,0x22,0x4f,0xc9,0x10,0xa3,0x9d,0x2d,0xe1,0x27,0x7c,0x94,0x68,0x39,0x5b,0x40,0x7d,0x4f,0x53,0x74,0x70,0x9e,0xd0,0x5d,0xac,0xd1,0xdc,0xde,0xc5,0x8d,0x97,0xf7,0xe1,0x1c,0x73,0xdc,0xb1,0x43,0x72,0x11,0x19,0x43,0xc4,0xc5,0xb3,0x0b,0xeb,0x43,0x40,0x38,0x2d,0x08,0xa1,0xf1,0xcc,0x6d,0x12,0x92,0xbb,0x41,0x05,0xc6,0x76,0x19,0x30,0xdd,0x15,0x50,0xda,0x99,0x62,0xf7,0xf6,0x0e,0x42,0x1b,0xd8,0xe2,0x38,0x12,0xe6,0xc7,0xac,0xd6,0x59,0xcf,0xd6,0xd8,0xde,0x17,0x27,0x12,0x02,0xc0,0x14,0x09,0x8b,0x13,0x56,0x2d,0x29,0xfe,0xcd,0x8e,0x66,0x20,0x62,0x47,0x01,0x00,0x1b,0x83,0xec,0xdd,0xd9,0x85,0x83,0xc3,0xec,0x78,0x0e,0x10,0xd0,0xce,0x5b,0x10,0x51,0xda,0xef,0x05,0xc4,0xb8,0x4b,0xea,0xac,0x0b,0x73,0x7e,0xb2,0xc4,0xf6,0xde,0x36,0x26,0x5b,0x0d,0x62,0xcc,0x79,0xf6,0x42,0x9a,0x17,0x9b,0x25,0x02,0x25,0x48,0x3b,0xfb,0x3b,0x00,0xf1,0x11,0x2e,0x34,0x1e,0x3b,0x37,0xb7,0x41,0x37,0xb6,0xb1,0x7d,0x93,0x9f,0xdf,0x7c,0x6d,0x1f,0x17,0xcf,0x98,0xc0,0x66,0x4f,0x5b,0xe2,0xf3,0x3b,0x90,0xf8,0xcc,0x60,0x7f,0xe1,0x51,0x27,0x13,0x22,0xac,0x3c,0xc1,0xc6,0x83,0x01,0xae,0x61,0x77,0xa5,0xdd,0xba,0x95,0x61,0x71,0x00,0xf1,0x71,0xb7,0x18,0x02,0x1a,0x78,0x4c,0xdc,0x14,0x11,0x8e,0x25,0xe0,0x00,0xe6,0x9e,0xa7,0xec,0x32,0x15,0xd4,0x98,0x35,0x20,0xe7,0x24,0xd1,0x07,0xda,0x42,0x3b,0x44,0x66,0x51,0xd6,0x9d,0x34,0x06,0x92,0x43,0x04,0xdd,0x3c,0x2b,0xc0,0x77,0x08,0xb4,0x8b,0x9f,0x43,0x00,0x5d,0xa6,0x1b,0x56,0x3d,0xd7,0xb9,0xd1,0x26,0x7e,0x20,0xe7,0x43,0xe8,0xc7,0x18,0xa8,0x66,0xc9,0x40,0xb8,0xe4,0xaa,0xdd,0x3b,0x76,0x98,0xe0,0xbc,0x87,0x23,0x8f,0xc6,0x4f,0xe1,0xe0,0x11,0xc3,0x1a,0x2e,0x46,0x84,0xd5,0x8a,0xb7,0x69,0xd6,0x1d,0x42,0xc7,0xb6,0x0f,0x61,0xd5,0x62,0xf6,0xe4,0x39,0x93,0xa8,0xae,0x93,0x4b,0xe3,0x1d,0xa8,0x0b,0xc0,0xd6,0x14,0x5b,0x37,0x77,0xe1,0x9c,0x67,0xc2,0x9d,0x84,0x6d,0xc7,0x1a,0x2d,0xb0,0x61,0xa5,0x1e,0xb7,0xd3,0xf5,0x34,0x3b,0x9c,0x81,0x88,0x01,0x7c,0xfb,0x26,0x1f,0xfd,0xf1,0x8d,0x47,0xb7,0x0e,0xe8,0x56,0x9d,0x80,0x9d,0x59,0x6c,0x43,0xf3,0xdd,0x34,0x3a,0x06,0x26,0xc0,0x6a,0xf9,0xdf,0xae,0x3a,0x06,0xe3,0xad,0x0c,0xc6,0xce,0x3b,0xec,0xdd,0xde,0x11,0x67,0x36,0x6b,0x76,0xdd,0xda,0x05,0xac,0xe7,0x2d,0xb6,0x76,0x78,0x7d,0xb2,0xb4,0x99,0xf3,0x5d,0x2f,0x5a,0xac,0x1f,0x8d,0xbb,0xc0,0x74,0x60,0xd0,0x6d,0x44,0xd2,0x5d,0xcb,0x9e,0x70,0xb7,0xee,0x92,0xd1,0x59,0xb7,0x64,0x4d,0xe2,0x8e,0x6c,0x73,0x75,0xab,0x2e,0xf9,0xb5,0x3e,0x7f,0x7a,0x0e,0x7f,0x34,0x47,0xd7,0xb6,0x70,0x20,0xac,0x57,0x2d,0x76,0x26,0x0d,0x76,0x5f,0xda,0x83,0x77,0xac,0xe2,0x56,0xa1,0x10,0x10,0x6d,0xa3,0xf2,0xa7,0x41,0xbd,0x4e,0x65,0x41,0x2d,0xac,0xd5,0x0f,0x82,0x47,0xbb,0xe0,0x88,0x7c,0x9c,0x0c,0x08,0x8b,0x25,0x3b,0x9d,0x59,0xb7,0xf0,0x7e,0x02,0x37,0x05,0x1b,0x50,0xb5,0x6b,0x36,0x4c,0x22,0x2e,0x21,0xac,0x97,0x70,0xcd,0x4d,0x34,0x5b,0x7b,0x88,0x08,0x0c,0xda,0x14,0xb2,0x17,0xac,0x8b,0x0b,0xd1,0x9a,0xb0,0x5d,0x0f,0x9f,0x62,0xe5,0x75,0x18,0x63,0xc7,0x18,0x45,0x0d,0x6f,0x47,0x82,0xd7,0x3e,0x9f,0x6c,0x70,0x68,0x5c,0x83,0x40,0x11,0x14,0x1d,0xd8,0xe2,0xd8,0x0e,0x62,0xb9,0x28,0xca,0x39,0x2d,0x82,0x9e,0x73,0x70,0x7a,0xfc,0x16,0x40,0xb6,0x91,0xd2,0x03,0xee,0x12,0xbd,0x70,0x1b,0x9e,0xe3,0xdb,0x75,0x31,0xe1,0xf3,0x58,0x0e,0xf6,0x4c,0x90,0x73,0xbe,0x5c,0x84,0x91,0xd8,0xf7,0x32,0x63,0x8b,0x71,0x13,0xa6,0x48,0xdf,0x30,0xe0,0x46,0xe6,0x9c,0x08,0xcc,0x6d,0x50,0x88,0x0c,0x7a,0x0e,0x40,0xf4,0x88,0x3e,0x0a,0xd3,0xeb,0x81,0x86,0xe4,0x52,0x05,0x71,0xac,0xde,0x39,0x60,0xe2,0x11,0x9b,0x09,0x1a,0xb0,0x5f,0x66,0x0a,0xab,0x5c,0x27,0xc8,0x19,0x2e,0x2f,0x96,0xc5,0xca,0x0c,0x38,0x30,0x60,0x7b,0xde,0x61,0x76,0x01,0xe8,0xba,0x35,0x9a,0x66,0x07,0x2e,0x74,0xe8,0x56,0xec,0x4c,0xc1,0x45,0x20,0xea,0xb5,0x65,0x21,0x60,0x71,0x7c,0x0e,0x27,0x8e,0x01,0xbc,0x17,0xc3,0x1b,0x38,0xc0,0x13,0x96,0xf3,0x15,0xdc,0x74,0x82,0xe9,0xde,0x14,0x71,0x1d,0xb0,0x3c,0x5b,0x80,0xe0,0x98,0xd1,0xf0,0xa6,0x87,0x63,0xee,0x73,0x10,0xb2,0x1b,0x6d,0x8a,0x08,0xeb,0x88,0xb0,0x0e,0x2c,0x65,0x52,0x44,0xbb,0x5c,0x01,0x60,0xf5,0xd0,0xde,0x9d,0x5d,0xdc,0xb8,0xb3,0x97,0xce,0x76,0x37,0x13,0xbe,0x96,0xf9,0xec,0xe0,0x3c,0x39,0x04,0x5f,0x9c,0x2d,0xd2,0x3e,0xac,0x55,0x3b,0x91,0x8c,0x93,0x12,0x93,0x10,0x22,0xce,0x9f,0x67,0xcf,0x3b,0xa1,0x0b,0x38,0x7e,0x78,0x02,0xc8,0xf9,0x45,0xae,0x1a,0x61,0xbd,0x68,0xd3,0xfe,0x52,0xdb,0x06,0x4c,0xa6,0x0d,0x76,0xf6,0x65,0x4f,0x66,0xd5,0xa5,0xbf,0xa7,0x4f,0xcf,0xb0,0xb5,0xb7,0xc5,0x06,0x1e,0x5d,0x39,0xfd,0x8a,0x60,0xe6,0x5f,0x11,0xcc,0x33,0x95,0xce,0x75,0x3e,0x9e,0x3d,0x3b,0xc7,0xfe,0x9b,0xb7,0xb0,0x2b,0x67,0x78,0x29,0x12,0xc2,0xaa,0x45,0xb3,0x33,0xc1,0x9e,0x9c,0x7b,0xb4,0x06,0x2f,0x85,0x04,0xdc,0x0b,0xb5,0x87,0x59,0xc7,0xea,0x46,0xdd,0x13,0x5a,0x2c,0x79,0xaf,0x51,0x5c,0xc3,0x92,0x43,0x56,0x41,0x4f,0xe4,0xd8,0x4a,0xc3,0x99,0x13,0x11,0xa8,0x5b,0x33,0x77,0x1c,0x44,0x83,0x40,0xca,0x90,0x0e,0xa8,0x9e,0x93,0x06,0x27,0xa1,0x71,0x06,0xe4,0xaa,0x0f,0x72,0x63,0x86,0x40,0xb2,0x8e,0x5b,0x2f,0xd0,0xa1,0xb8,0x9b,0xca,0x30,0x5f,0x36,0x60,0x3d,0xa1,0x7a,0x60,0xd2,0xd0,0xc0,0xb3,0xfc,0xab,0xf7,0x76,0xa0,0x2e,0x03,0x0c,0x44,0xca,0x4b,0xbe,0xe7,0x4b,0xb8,0x79,0xc9,0xa9,0x73,0x8d,0xd0,0x81,0x1c,0xf8,0x28,0x4a,0x20,0x84,0xd5,0xa2,0x28,0xaf,0x5d,0xae,0xf8,0xa8,0x4d,0x93,0x81,0x30,0xb4,0x1d,0xa6,0x00,0xb6,0xc4,0x76,0xa1,0x9b,0xb7,0x8a,0xf7,0x49,0x02,0xa6,0xc8,0xdb,0x3e,0xde,0x7b,0x71,0x94,0xc3,0x76,0x20,0xa1,0x0b,0x38,0x3f,0xb8,0x40,0xb3,0xd5,0x60,0xfb,0xe6,0x4e,0xb2,0x7f,0x50,0x8d,0x53,0xaf,0x8b,0x06,0xf0,0x37,0x3d,0x93,0x69,0x10,0xbb,0x98,0x6c,0x4b,0x16,0xa7,0x0b,0x4c,0x5e,0xdf,0x47,0x33,0xcd,0x4e,0x4d,0x5e,0x7a,0x73,0x3f,0x9d,0x9e,0xd0,0xf3,0xc3,0x00,0x30,0x3b,0x9e,0xb3,0x05,0x33,0xf1,0x5a,0x1d,0x5d,0x5f,0x03,0x81,0xc0,0xb4,0xf0,0xfc,0xf9,0x79,0x06,0x10,0x08,0xa3,0xb1,0x0f,0x40,0xa4,0x7d,0x22,0xc2,0x8d,0x8e,0xb7,0x9f,0x66,0xc7,0xf3,0x94,0x98,0x80,0x04,0xbe,0x91,0xc0,0x8e,0x88,0x6e,0x10,0xb6,0x6f,0x6d,0x23,0x10,0xd0,0x5e,0xb0,0x86,0x08,0x31,0xdb,0x31,0x25,0x6d,0xa8,0x4a,0x7b,0x81,0xd2,0x56,0x61,0xb7,0x5c,0xc2,0x4f,0x26,0x68,0xa6,0x53,0xb4,0xb3,0x25,0x88,0x00,0x3f,0xdd,0x06,0x90,0x55,0xd4,0xb1,0x5b,0x03,0x53,0xbe,0x0f,0xbd,0x6d,0x5b,0x36,0xa2,0xd2,0xb5,0x18,0x81,0x18,0x17,0x98,0xd0,0x1e,0x82,0x23,0x20,0x10,0x42,0xcb,0x5a,0x41,0x80,0x44,0xfb,0xca,0x79,0xa8,0x34,0x0b,0xa9,0x3b,0xdb,0x12,0xb5,0x68,0x9a,0x2d,0xf6,0x13,0xc1,0x0b,0x1f,0xb1,0x5b,0x33,0xb3,0xe5,0x27,0x7c,0x02,0x42,0x98,0x06,0x0a,0x6d,0x62,0xa0,0x79,0x8a,0x96,0x8c,0xb4,0x4e,0x25,0xdd,0x5e,0xe4,0xad,0x5f,0x5d,0x41,0xe6,0x8e,0x61,0x40,0xfa,0x23,0xa7,0xac,0xb7,0x6a,0x12,0xbd,0x32,0xe3,0x3a,0x51,0x89,0x2d,0xb3,0xf6,0x3e,0x6d,0x44,0x3b,0x08,0xc1,0x27,0x2f,0x87,0x9c,0x3d,0x3b,0x3e,0x6f,0xa2,0x48,0xaf,0x4e,0xea,0xcd,0x70,0x10,0xd5,0x71,0x86,0x13,0x75,0xb2,0x73,0x70,0xd1,0xc3,0x79,0x56,0x21,0x3b,0x62,0x49,0x25,0x20,0x80,0x6f,0xec,0x9d,0xc0,0xb9,0x0e,0xe8,0x18,0x1c,0x1d,0x45,0xb8,0xc9,0x16,0xa8,0x99,0x88,0x55,0x6b,0x07,0xf6,0x67,0xa4,0x16,0xaa,0x32,0x00,0x91,0x17,0xaa,0x6b,0xbc,0x00,0x23,0x00,0x27,0x8c,0x44,0x04,0xba,0xf9,0x0a,0x88,0x0e,0x21,0xa9,0xbd,0xe4,0xb6,0x97,0xd8,0xc0,0x79,0x71,0xb4,0x2d,0x3e,0x63,0xe1,0xb3,0x17,0x2c,0xf8,0x08,0x8a,0x1e,0xf0,0x84,0xc5,0xc9,0x0c,0xcb,0x53,0x70,0x7f,0x38,0x76,0x17,0x40,0x62,0xc1,0x49,0xe6,0x6e,0x52,0x65,0x4a,0xf4,0xe6,0x1c,0xdb,0xbf,0xb3,0xa3,0x19,0x6e,0xbc,0x7a,0x13,0xcb,0xb3,0x65,0xf2,0x11,0xde,0xad,0x3b,0x2c,0xcf,0x16,0xd8,0xb9,0xb5,0x8b,0x18,0x08,0xa7,0x4f,0xce,0x78,0xe8,0xba,0x98,0xc0,0x17,0x60,0x22,0x70,0xfc,0x90,0xb9,0xde,0xc2,0x0a,0x93,0x78,0x64,0x68,0x88,0x18,0x48,0xad,0xba,0xc2,0x6a,0x93,0xd3,0x2c,0x8e,0x17,0xd8,0xde,0xdd,0x42,0x88,0x11,0xe7,0xcf,0xce,0x71,0xe7,0x1b,0x2f,0xa5,0x77,0x36,0xfe,0x6a,0x2e,0x67,0xfc,0xaa,0x3c,0x7b,0x61,0x8c,0x38,0x14,0x12,0x30,0x1b,0xa8,0xf9,0x6d,0x76,0x22,0xb2,0x5e,0xb4,0xb8,0x78,0x76,0x81,0x9b,0xaf,0xdd,0x00,0x75,0x11,0xa7,0xcf,0xce,0xe1,0xe1,0x70,0xeb,0xed,0x5b,0x98,0xee,0xf0,0x51,0x89,0xce,0x5a,0x5d,0x2b,0x80,0x8a,0xc0,0xdb,0xc3,0x61,0xbb,0xa1,0xe6,0x59,0x8d,0xb5,0x25,0xc7,0x4a,0xba,0xf5,0x02,0x99,0x8a,0x71,0x04,0x35,0xd4,0x8a,0x93,0xa9,0x2c,0x28,0x36,0xc2,0x20,0x00,0xb4,0x5e,0xb0,0xa6,0x3b,0xf0,0xbe,0x32,0x73,0xf4,0xba,0x47,0x69,0x2d,0xa0,0x95,0x08,0xe8,0x82,0x45,0x01,0xca,0x2f,0x0a,0x92,0xc3,0xfd,0x79,0x05,0xd0,0x1e,0xdc,0x2f,0xae,0x7f,0x53,0xf5,0x8a,0x06,0xab,0x58,0xc3,0xeb,0x95,0x55,0xcf,0xd5,0xef,0x3a,0x9d,0xfe,0x8c,0x3a,0x82,0xde,0xc3,0xaa,0x33,0x63,0xc3,0x86,0x3e,0xbc,0xf7,0xef,0x11,0xbb,0x80,0xf5,0xd9,0x69,0x52,0x2d,0x03,0x28,0xc6,0xd9,0x8e,0xbb,0xee,0xfd,0x4f,0x77,0x99,0x99,0x5c,0xaf,0xda,0x3c,0x07,0x3d,0x57,0x66,0xbd,0x58,0x63,0xf7,0x06,0x1f,0xe5,0x59,0x5d,0xac,0x41,0xa4,0xe7,0x00,0x44,0x03,0xd4,0xf2,0xd6,0xcd,0xf6,0xae,0xaa,0xa8,0xf3,0x36,0xce,0xa5,0xa1,0x6a,0xeb,0x7a,0xd9,0x61,0x77,0xca,0x1a,0xa4,0xe5,0xbc,0xc5,0x9e,0xec,0xcd,0xfa,0x86,0xcf,0xf7,0x4f,0x77,0xa6,0x68,0x57,0x1d,0x96,0x17,0x2b,0x6c,0xed,0x4c,0x11,0xba,0x80,0x5d,0xe3,0x78,0x63,0x35,0x5b,0xa7,0xad,0x9b,0x4b,0x8a,0xea,0xbf,0xac,0x3a,0x7e,0x79,0xb6,0xc4,0x64,0x6b,0xc2,0x06,0x91,0x31,0x02,0xd1,0xe1,0xf8,0xc1,0x09,0x3b,0x24,0x6a,0x3b,0x23,0xd5,0xb2,0x80,0x13,0x21,0xf4,0x73,0xdd,0x71,0x86,0xa2,0xd5,0x5c,0xcf,0x97,0x20,0x28,0xb6,0xeb,0x1e,0x29,0xf1,0x96,0x1e,0xc0,0xaa,0x67,0x92,0x8b,0x18,0x62,0xc4,0x7a,0xbe,0xc6,0xe4,0x26,0xc1,0x6f,0x6d,0x03,0xf1,0x14,0x68,0x1a,0x38,0xef,0xd1,0xce,0x97,0x08,0xa1,0x05,0x51,0x40,0xbb,0xb8,0xc0,0xf6,0xe4,0x25,0x80,0x08,0xed,0xe2,0x5c,0x2c,0xac,0x05,0x4c,0x89,0xa5,0xda,0x6e,0x35,0x07,0xfc,0x14,0x88,0x6b,0xc4,0x56,0x8d,0xac,0x62,0x2a,0x9e,0x28,0x8a,0x6d,0x8f,0xa8,0x76,0xa3,0x6e,0x99,0x46,0x74,0x7e,0x22,0x02,0x4e,0x40,0x58,0xaf,0x41,0x9d,0xda,0x1a,0x39,0x16,0x30,0x23,0xc0,0x17,0x39,0x88,0x91,0x94,0x34,0x30,0xab,0x96,0xb5,0x5f,0x0d,0x1c,0x2b,0x08,0xeb,0x1d,0xc7,0x30,0x73,0x13,0x54,0x1d,0xd7,0x14,0x3c,0x4d,0xa4,0x35,0x9a,0xff,0x65,0xac,0x9c,0x5e,0xc6,0x40,0x11,0xf9,0x0a,0x2e,0x12,0x60,0x4a,0x5e,0x93,0x91,0x46,0x2a,0x4d,0x48,0xb1,0xa6,0x15,0x43,0x85,0x24,0x66,0x24,0x14,0x12,0x69,0x14,0x79,0xa1,0x39,0x72,0x60,0x6f,0xcc,0x5e,0x06,0xce,0x21,0xba,0x16,0x8d,0xf3,0xe0,0x0b,0x1e,0xd8,0xcf,0x26,0x75,0xeb,0x24,0xd9,0xba,0x46,0x24,0x6b,0x8a,0x59,0xe8,0x8c,0x90,0x9b,0x90,0x54,0xed,0x00,0xb9,0xad,0x47,0xae,0x1f,0x14,0x9d,0x7c,0xbb,0x5a,0xc0,0x35,0x9e,0xf7,0x9c,0x7c,0x23,0xae,0xa9,0xd9,0x11,0x3c,0xa0,0x37,0x79,0xb0,0x44,0x1e,0x1b,0x3e,0x8f,0x96,0xe5,0x4a,0x02,0x3c,0x31,0x50,0x7b,0x82,0x27,0xb6,0xdc,0xe4,0x49,0xea,0x53,0x9c,0xe4,0x41,0x4a,0x41,0xb8,0xe2,0x5a,0xd7,0x8b,0x35,0xd6,0x0f,0x8e,0xe0,0xbc,0xcf,0x6a,0x7e,0xe7,0x70,0x71,0x38,0xc7,0xe2,0x74,0x25,0x2e,0xdd,0xc6,0x97,0x55,0x0f,0x48,0xcd,0x60,0xd7,0xd4,0x61,0x94,0x56,0xc8,0x8b,0xf5,0xaa,0xc5,0xd1,0xa3,0x13,0xb1,0xe4,0x8e,0x58,0xcd,0xd6,0xd8,0xbe,0xb1,0x85,0xe5,0x4c,0x39,0xcb,0xab,0xe7,0xd5,0x0b,0x63,0x54,0xdc,0x39,0x9c,0x1f,0xce,0xb1,0x7b,0x67,0x37,0x19,0x96,0x2d,0x67,0x2b,0x56,0xfb,0x03,0x50,0xcb,0xc4,0x76,0xdd,0x61,0xba,0x35,0xe1,0x3d,0xa2,0xe5,0x1a,0xae,0xe1,0xe9,0xe0,0xe0,0x85,0x01,0xe4,0x78,0x49,0x51,0x51,0x97,0x23,0x61,0x75,0x72,0x0e,0x3f,0x9d,0x60,0x75,0x71,0xc1,0x60,0xab,0x53,0x52,0x79,0xcc,0xd0,0x25,0x89,0x2b,0x06,0x01,0xdf,0x18,0xcb,0x76,0xc9,0x14,0x66,0x25,0x4f,0x57,0x72,0xb1,0x43,0x92,0xb0,0x5d,0xa0,0x63,0xe0,0xdb,0x43,0xb2,0x21,0x84,0xaa,0xc1,0x8b,0x06,0xda,0x58,0x83,0xf6,0x10,0x40,0x57,0x30,0xba,0x01,0xa0,0x0b,0xf8,0xa4,0x32,0x42,0xbf,0xc6,0xfd,0x38,0xa3,0xd5,0xac,0xf3,0xd1,0xe9,0x2a,0x44,0x07,0xde,0xb3,0xda,0x5f,0xd6,0x8c,0x5a,0x40,0xc7,0xd0,0xe6,0x75,0xa4,0xd6,0xe8,0x85,0x0a,0xb8,0x1f,0x12,0x73,0xea,0x01,0x44,0x42,0x5c,0x0a,0x00,0x3b,0xcd,0x04,0x58,0x9e,0xce,0xb0,0x2b,0x17,0xa6,0xcc,0x8e,0x67,0x29,0x4b,0x87,0x14,0x05,0xf3,0xd3,0x05,0xb6,0x77,0xa6,0x88,0x91,0xb0,0x5a,0xe8,0x79,0xf6,0xb2,0xa9,0xbd,0x7a,0xb8,0xfe,0xb3,0xd9,0xc9,0x1c,0xcd,0xc4,0xf3,0x31,0xa7,0x48,0x68,0x97,0x1d,0x7b,0xaa,0x93,0xed,0x26,0x80,0x1d,0x69,0xac,0x66,0x6b,0xb6,0x9e,0x06,0x83,0xee,0xfe,0xab,0x37,0x41,0x44,0xb8,0x38,0x9c,0x95,0x79,0x9a,0xce,0x1d,0x79,0x9c,0x80,0xa1,0x0e,0x04,0xb0,0x76,0x8c,0x34,0x35,0x3b,0xca,0x80,0xd8,0x2e,0x66,0xa6,0x89,0xe9,0x31,0x6f,0x11,0xb2,0x04,0x1b,0xe2,0x4d,0x78,0xe7,0x11,0x56,0x1d,0x1b,0xa9,0x46,0x00,0x72,0xfc,0x46,0xed,0x76,0x58,0x0b,0x2b,0xc6,0x4c,0x31,0x0a,0x84,0x13,0xc2,0x7a,0x89,0x28,0xc7,0xa7,0x26,0x37,0x77,0xd1,0x4c,0xd8,0xc0,0xae,0x5d,0xce,0x93,0x14,0x1b,0x56,0x0b,0xb4,0xbe,0xe1,0x7b,0xa7,0x97,0x0b,0x80,0x22,0x5b,0x1b,0x47,0x51,0x35,0x13,0x61,0xbd,0x38,0xc5,0x74,0x6b,0x0f,0x61,0xb5,0x40,0x0c,0x2d,0xf2,0x99,0x1a,0xf9,0x4b,0xc2,0x38,0x24,0x03,0x5d,0x66,0x0e,0x22,0x01,0xe8,0x16,0xec,0xef,0x3b,0x44,0x50,0x5c,0xe5,0xf6,0xc7,0x4e,0xc6,0xdd,0x83,0xba,0xc0,0x00,0x2e,0x92,0x3b,0xcf,0x55,0x92,0xf9,0x61,0x6d,0x3f,0x2c,0xbd,0x25,0x21,0xe3,0xb1,0x18,0x03,0xaa,0x80,0xb6,0xff,0x5d,0x7f,0x51,0x31,0x98,0x93,0xd2,0x08,0x5e,0xee,0xfe,0x05,0xa0,0x77,0x07,0x12,0xf1,0x95,0x7f,0xa4,0x9d,0xed,0x1c,0xef,0xb5,0x39,0x9f,0x16,0x88,0x73,0xbc,0x5f,0xeb,0xa2,0x6c,0x4a,0xc7,0x35,0x4b,0x12,0x4d,0x83,0x66,0x3a,0x45,0x83,0x6d,0x96,0x82,0x49,0x80,0x0d,0xc4,0x92,0xb1,0xf3,0xec,0x09,0xc5,0x0b,0xa1,0x08,0xbc,0x4f,0xe1,0x27,0x11,0x6e,0x32,0x95,0x3c,0x1c,0x0f,0xae,0xf3,0xf0,0x5e,0xae,0x53,0x88,0x11,0xce,0x03,0x31,0x3a,0xb8,0x46,0x06,0x82,0xb8,0x7e,0x2c,0x9d,0x4e,0xa4,0xbb,0x49,0xfc,0x53,0x47,0xb8,0x90,0x11,0x9c,0x26,0x9e,0xf7,0xa9,0x3d,0x03,0x36,0xc8,0x23,0x3a,0x27,0x36,0x77,0x7c,0xfc,0xe5,0xe2,0xc9,0x23,0x00,0xc0,0xfe,0x9b,0xdf,0x00,0xc4,0x23,0x0f,0x43,0xae,0x88,0x62,0x3e,0xab,0xe9,0x9d,0xf6,0xee,0x00,0x08,0x03,0x60,0x22,0xef,0xf5,0x36,0x26,0x7e,0x59,0x1c,0x5d,0xba,0x6a,0xd8,0x10,0xb7,0x0f,0xc9,0xfd,0x07,0xf9,0xc6,0x14,0x87,0xb3,0x83,0x73,0x4c,0xcf,0xa6,0x68,0x97,0x6d,0x6f,0x61,0xf7,0x08,0xaa,0x1b,0xf8,0x39,0x18,0xb1,0x8e,0x4b,0xec,0xc6,0x72,0xb9,0xae,0x88,0x84,0xd5,0xdb,0x39,0x9c,0x3f,0x39,0xc3,0xee,0xad,0x5d,0x1c,0x3e,0x7c,0x8a,0x83,0xfb,0x9f,0x60,0x7b,0x7b,0x0f,0x77,0xbe,0xf1,0x4d,0xc0,0x97,0xc6,0x2b,0xc5,0x74,0xb6,0xfd,0xec,0x14,0x1f,0x23,0x2e,0x9e,0x3c,0xab,0x8c,0x20,0x72,0x62,0xa2,0x08,0xea,0x02,0x1f,0xf2,0x8f,0x9d,0x48,0xc4,0x04,0x7b,0x7d,0xa1,0x5e,0xf4,0x9e,0x99,0xc2,0x7a,0xff,0x57,0x1b,0x2e,0x9c,0xb7,0x70,0xcc,0xa3,0xe1,0xab,0x56,0x3d,0x6f,0xcc,0xab,0x44,0xc3,0x41,0xd8,0x4f,0xea,0xb3,0x32,0xcd,0x10,0xd6,0xe7,0xaf,0x15,0xa8,0x0f,0x82,0xef,0x00,0x03,0x51,0x24,0xd2,0x93,0x0b,0x0d,0x1c,0x26,0x20,0x0a,0xdc,0xd7,0x0d,0xe0,0xdd,0x94,0xdd,0x23,0x86,0x00,0xe7,0x9a,0xde,0x11,0xb5,0x08,0xf1,0xe3,0xe1,0x33,0x96,0xe8,0x0c,0x0a,0x5d,0xd6,0x98,0xb4,0x8b,0x35,0xbb,0xc0,0x75,0xe5,0x84,0x6d,0x97,0x1d,0x8e,0xee,0x3f,0x67,0x7a,0xa3,0x1a,0x95,0x14,0x38,0xee,0x7a,0xbe,0xc6,0xd1,0xc3,0x63,0x36,0x22,0x4a,0x4f,0x2f,0x61,0x00,0x0a,0x66,0x93,0x7f,0x86,0x2e,0xe2,0xf8,0xc9,0x59,0x7a,0xb7,0x5e,0xac,0xb1,0xb3,0xbf,0x8d,0xbd,0x3b,0xbb,0x98,0x6c,0x4d,0x78,0x8f,0xb6,0x3a,0xda,0xd7,0x2e,0x3b,0x1c,0x3d,0x3c,0xe9,0xf7,0x99,0x56,0x6f,0xc3,0x98,0x8e,0x81,0x6f,0xb1,0xc4,0x7a,0x69,0x14,0x76,0x23,0xbc,0xc0,0x99,0xbd,0x6d,0x28,0x12,0x1b,0x9a,0xee,0xdd,0xde,0xc1,0xfc,0xf8,0x42,0x6c,0x11,0x0d,0xf8,0x0a,0xd8,0x82,0xd8,0xe8,0x8a,0xcb,0xc8,0x12,0x28,0x9f,0x52,0x38,0xc2,0xce,0xfe,0xcb,0xd8,0xba,0x71,0x8b,0xb5,0xa7,0x5d,0x87,0xd5,0xfc,0x1c,0x7c,0xa1,0x42,0x04,0x51,0xc0,0xf2,0xe2,0x18,0x7a,0xc4,0x94,0x28,0x02,0xa1,0x85,0x8a,0x9e,0xba,0xdf,0xbb,0x9e,0xc9,0x3d,0xe0,0x02,0xfa,0xa4,0xf1,0x53,0x1d,0xa4,0x25,0x51,0xd7,0x2a,0xb8,0x9e,0x1d,0xa1,0x43,0xcb,0x06,0x56,0x11,0xdc,0x4a,0x73,0xdc,0x35,0x4d,0x5e,0xa7,0x52,0x37,0x77,0x16,0xaf,0x67,0xed,0x74,0x8d,0xe7,0x90,0xf7,0x79,0x25,0xaf,0x58,0x76,0x6d,0x3e,0x25,0x64,0xd6,0x87,0x51,0x47,0xe7,0xc8,0xe5,0x78,0x4d,0xec,0xd9,0xdb,0xb1,0x89,0xc6,0xd7,0x85,0xf1,0xb9,0x2b,0x9e,0x92,0xb6,0x01,0x72,0x8b,0x91,0x17,0xa9,0xb6,0x5d,0xa7,0x51,0xa7,0xd0,0xf1,0x06,0xfb,0x56,0xc0,0x74,0x7b,0x0f,0x5e,0xee,0x1c,0x55,0xdf,0x5a,0x14,0x21,0x40,0x1a,0x93,0x34,0xe8,0x7c,0x03,0x47,0x1d,0x7c,0xb7,0x46,0x33,0x99,0xb2,0xac,0xcd,0x57,0xb6,0x80,0x62,0x03,0xb8,0x98,0xee,0xa7,0x55,0x9f,0xd9,0x11,0x40,0xba,0xda,0x81,0x54,0x4c,0x92,0x7b,0x10,0x29,0x82,0x3a,0x07,0xe7,0x03,0x83,0xb8,0x08,0xf4,0xdc,0x56,0xbe,0x02,0x91,0xd5,0xc8,0x7c,0x6b,0xd3,0xfa,0xec,0x04,0x0f,0xdf,0xfd,0x73,0xb4,0xeb,0x25,0x1c,0x80,0xe6,0xd3,0x6d,0x7c,0xf3,0xd7,0xfe,0x10,0x7b,0x6f,0xbd,0xc5,0x83,0xa5,0x8c,0x8a,0xa4,0xc9,0x8a,0x2c,0x8c,0x82,0x30,0x03,0x34,0x25,0x23,0xae,0xaa,0x73,0xaf,0x0e,0xc2,0x23,0x9c,0xf8,0x60,0xf2,0xcb,0xc4,0xd8,0xc8,0xc6,0x1e,0x1b,0xa0,0x23,0xc7,0x1e,0x2a,0x77,0x80,0xd1,0xb8,0x46,0x25,0x8a,0x10,0xba,0x80,0xc7,0x1f,0xde,0xc5,0xe3,0x4f,0xdf,0x05,0x81,0x30,0x23,0x60,0x76,0x76,0x88,0xb7,0x7f,0xf4,0xdb,0x69,0x4f,0x17,0xc8,0xc2,0x2c,0x6c,0x9d,0xe4,0xfb,0x65,0xd5,0x71,0xec,0xa1,0x12,0x31,0xac,0xd1,0x4c,0xa7,0x70,0x0e,0x08,0x41,0xcf,0x51,0x43,0xb6,0x19,0xc4,0xc8,0x51,0xe2,0xf3,0xfa,0x36,0x40,0x8b,0x2c,0xd1,0xd5,0x47,0x8e,0x9a,0xef,0xbc,0x8a,0xc9,0x8f,0xdf,0xa8,0xea,0xd6,0xa7,0x9c,0xed,0xdf,0x7c,0x8a,0xf8,0x9c,0xb5,0x01,0x93,0xdf,0xfa,0x06,0x9a,0x6f,0xdd,0xe9,0xc5,0x29,0x02,0x01,0xab,0xff,0xe7,0x7d,0x90,0x18,0xe6,0x6c,0xfd,0xe1,0xf7,0xe1,0x5f,0xbd,0xb9,0x19,0xf4,0x43,0xc4,0xf2,0xff,0xfa,0x45,0x8a,0xb3,0xf3,0x47,0xbf,0x01,0x8c,0x5d,0x12,0x20,0x12,0x7c,0x3c,0x5b,0x62,0xf9,0x27,0x1f,0x70,0x1b,0x9d,0xc3,0x8d,0xff,0xfa,0x9f,0x96,0xd5,0x1a,0x60,0x18,0xba,0x2f,0x4e,0xb0,0xf8,0xab,0xbb,0xe9,0xf7,0xa0,0xea,0xd9,0xcc,0x1d,0xef,0x99,0x50,0x35,0x4d,0x03,0xbf,0x7d,0x1b,0x68,0xbc,0x1c,0x17,0x04,0xbb,0x12,0x15,0x90,0xad,0xa7,0x8d,0x7d,0xe4,0x90,0x05,0x63,0x00,0x08,0x8b,0x16,0x61,0xdd,0xc1,0xef,0x4c,0xb0,0x3a,0x5b,0xc0,0x01,0x08,0x31,0x60,0xd2,0x4c,0x60,0x8d,0x34,0xf4,0xb2,0x0d,0xf8,0x31,0x2f,0x55,0x46,0xe3,0x94,0xe2,0x5c,0x61,0xfe,0x9a,0x89,0x97,0x62,0x67,0xfe,0x04,0xab,0x39,0xab,0x94,0xd5,0x12,0x7a,0x7e,0xb2,0x28,0xfa,0xa9,0xc4,0xc9,0x91,0x59,0x3c,0x50,0x06,0x51,0x1c,0x9e,0x2f,0x43,0xdc,0xb4,0x2e,0x62,0x83,0x03,0x54,0x80,0xaf,0x3e,0x54,0x95,0x32,0x30,0x7f,0x76,0x86,0xc5,0xf1,0x39,0xe2,0x2a,0xa4,0xb2,0x6a,0xf0,0x45,0xe0,0xe7,0xcb,0x93,0x63,0x9c,0x3e,0xbb,0x8b,0xd0,0xad,0xb1,0x7b,0xf3,0x0e,0x6e,0xde,0xf9,0x06,0xda,0xb6,0x45,0x58,0x3e,0xc5,0xd6,0x1e,0x6f,0xb5,0x2d,0x2f,0x4e,0x80,0xd8,0xc9,0xa5,0x3a,0x79,0xbf,0x38,0x19,0x56,0xa9,0x7a,0x17,0x6d,0x7a,0x87,0xa0,0xea,0x61,0xd9,0x16,0x8a,0x72,0xb6,0x36,0x92,0x58,0x39,0x4b,0x5e,0x21,0xa4,0x35,0x49,0x42,0xfb,0x1d,0x45,0x84,0x10,0x11,0xc3,0x8a,0x6d,0x91,0xe0,0xe0,0x99,0xdb,0x93,0xbe,0x20,0xb1,0x0b,0xe9,0xa4,0x5f,0x1c,0x92,0x86,0x26,0x69,0x5c,0x23,0x88,0x1c,0x6b,0x56,0x29,0xef,0x01,0x6b,0x87,0xa9,0x90,0x57,0xf0,0xd8,0x3d,0x7e,0xc8,0x8e,0x53,0x66,0x72,0x34,0x4c,0xc8,0x82,0xb3,0x0c,0x5e,0x9a,0x7e,0x72,0xa5,0x20,0x54,0x75,0x9b,0x38,0x03,0xbd,0x45,0x83,0x75,0x85,0x0e,0x8d,0x08,0x0b,0xe2,0x08,0x43,0x33,0x73,0xdc,0xb0,0xb0,0x6e,0x81,0x38,0xc3,0x74,0xfb,0x26,0x5c,0x23,0x0a,0x0f,0xd9,0x5b,0x8e,0x91,0xd8,0xbd,0x18,0xd8,0x2a,0x52,0xd1,0x31,0x7a,0x80,0xd6,0x00,0x22,0xa1,0xd9,0xba,0xc1,0xcf,0x9d,0x07,0x9a,0x28,0x7d,0xa4,0x75,0x61,0xa9,0x38,0x78,0xe6,0x9e,0x1d,0x01,0x1e,0x01,0xa0,0x06,0x2e,0x06,0xb0,0x41,0x58,0xe4,0x8b,0x19,0x88,0xf7,0xa9,0xf9,0xda,0x44,0xc0,0x07,0xcf,0xc4,0xd7,0x73,0x1b,0xba,0xf5,0x0a,0x9f,0xbf,0xf3,0x67,0x08,0xad,0x9c,0x33,0x04,0x1f,0x8b,0xf9,0xec,0x9d,0x3f,0xc7,0xb7,0xfd,0xbf,0xc2,0xde,0x1b,0xaf,0x6b,0x97,0x43,0x2d,0xe1,0x74,0xbf,0xdc,0xf6,0xb7,0xab,0x40,0x38,0xb9,0xe8,0x56,0x2e,0x53,0xa5,0xe1,0x17,0x09,0xae,0xbf,0x48,0x4b,0xda,0x48,0x38,0x7b,0xf4,0x08,0x67,0x47,0x8f,0xb1,0xbb,0xf7,0x12,0x5e,0xfd,0xfe,0xf7,0x99,0x81,0x29,0x62,0x6f,0xbe,0x5b,0xb8,0xae,0x1b,0x69,0xb1,0x63,0x11,0x2f,0x03,0xe2,0x7a,0x07,0xa3,0xa8,0x09,0xef,0xb9,0x3d,0xbd,0xff,0x11,0x4f,0x64,0x29,0x68,0xb5,0x98,0xe1,0xe9,0xa7,0x1f,0xe2,0xcd,0x1f,0xfe,0xba,0xcd,0x86,0x53,0xa8,0xa3,0x0c,0x12,0x35,0x63,0xda,0x06,0x31,0x1b,0xf1,0x45,0x09,0xca,0x71,0x79,0x76,0xea,0x30,0x9d,0x22,0xc2,0x8b,0xff,0x68,0x99,0xcb,0xe4,0xd3,0xc6,0x09,0xc4,0x25,0x1d,0x5b,0x71,0x65,0xa0,0xdd,0xe4,0xed,0xaa,0x79,0xfb,0x36,0xb6,0x7e,0xff,0xbb,0x97,0x74,0x04,0xd0,0x7d,0xf0,0x18,0x50,0x00,0xfe,0xfe,0x6b,0x98,0xfe,0xf3,0x6f,0x5f,0x9a,0x66,0xfd,0xa7,0xbf,0x04,0xc9,0xbe,0xfc,0xe4,0xb7,0xde,0xc6,0xe4,0x7b,0xaf,0x6d,0x4e,0x10,0x22,0x16,0xff,0xe7,0x7f,0x4a,0x3f,0xa7,0xbf,0xff,0x5d,0xf8,0xdb,0xbb,0x1b,0x12,0x00,0xe1,0xc9,0x19,0x96,0x7f,0xf2,0xbe,0xf0,0xd4,0x1e,0x3b,0xff,0xc5,0x8f,0x2e,0xad,0xd7,0xea,0x9d,0x87,0x58,0xfc,0xd5,0x27,0x03,0x6f,0x8c,0xea,0x39,0xfd,0x76,0xec,0xec,0x26,0xb4,0x88,0x71,0x0b,0x1e,0x0d,0x5b,0x32,0x37,0x53,0x04,0x22,0xc4,0xf9,0x05,0xd8,0xd2,0x42,0x7d,0x43,0xd9,0x43,0xe0,0xfa,0x11,0x9d,0xaf,0x33,0xbe,0x9f,0x9d,0xc3,0xf9,0x17,0x87,0x68,0x26,0x13,0x2c,0x4f,0xcf,0xf1,0xf4,0xc1,0xc7,0xe8,0xda,0x05,0xf6,0x6f,0xbf,0x8e,0x57,0xbf,0xf3,0x43,0x31,0x82,0xad,0xd4,0xc9,0x6e,0x94,0x97,0xbd,0x5e,0x70,0xd5,0x5f,0x2d,0x42,0x96,0xa8,0x6a,0xc6,0x4e,0x9f,0x9c,0xe3,0xe6,0xcb,0x7b,0x58,0x2f,0xdb,0x74,0x46,0xde,0x56,0xa7,0x57,0x39,0xfb,0x9b,0xea,0xf5,0x3d,0x02,0xbc,0x75,0x3d,0x6c,0x03,0xa9,0xcc,0x87,0xb7,0x02,0x65,0x3d,0xa5,0x7d,0xcb,0x0c,0xbe,0x50,0xa0,0x5b,0xc9,0x71,0x9e,0x42,0xf2,0x65,0x30,0x52,0xc9,0x77,0x76,0xf0,0x04,0xcf,0x3e,0x7b,0x0f,0x7a,0xcc,0x6c,0x39,0xbb,0xc0,0xc5,0xc9,0x33,0xbc,0xfa,0xf6,0xaf,0xc1,0xc7,0x6d,0xb4,0xab,0x25,0xab,0x95,0x05,0x4c,0xed,0x51,0x1c,0x35,0xba,0x8a,0xb1,0x4b,0xc0,0x16,0x83,0x96,0xc7,0x47,0x83,0x48,0xbc,0x47,0x31,0xac,0x12,0xd7,0x4d,0x24,0xd8,0x98,0x40,0x9c,0xfb,0x25,0x46,0x6e,0x15,0x11,0x10,0x56,0x2d,0x42,0xb7,0x16,0xda,0x13,0x24,0x7d,0x0b,0x87,0x06,0xbe,0x61,0x8b,0x78,0x36,0xa2,0xf2,0xa9,0x2e,0x88,0x62,0x67,0xe4,0xb4,0xbf,0x78,0xd3,0xd2,0x27,0xe6,0x40,0x3b,0x2d,0x8b,0x02,0xb1,0x3f,0x88,0xbd,0x79,0x0f,0x90,0x78,0xdb,0xea,0xbd,0x16,0x23,0x2c,0xa5,0xae,0x72,0x9c,0x48,0x55,0x3e,0x48,0x96,0x2f,0x62,0x0d,0xe3,0x79,0xe6,0x92,0x77,0x70,0xb2,0x4f,0xcb,0x23,0x1c,0x40,0xde,0x8b,0x23,0x6e,0x21,0xf0,0x8e,0x8a,0x2b,0x6c,0x79,0xd3,0xff,0x02,0xd3,0xdd,0x1b,0x7c,0x67,0x70,0x6c,0x00,0x1f,0xd0,0xae,0xd4,0x89,0x3e,0x49,0x55,0x1c,0x1b,0x42,0x81,0xef,0xb8,0x8d,0x31,0x00,0xed,0x4c,0x40,0x38,0x00,0x41,0x24,0x5d,0x1f,0x13,0xa3,0x42,0x42,0x93,0x41,0x1e,0x0e,0x62,0x64,0x05,0x2f,0xb4,0x3a,0xf0,0x7e,0x62,0xe3,0xf8,0x98,0x11,0x05,0xb6,0x82,0x93,0x9b,0x9b,0x14,0xc0,0x11,0x03,0x9e,0x7c,0xf4,0x57,0x0c,0xbe,0x56,0x5a,0x95,0xc1,0x79,0xf4,0xde,0x5f,0xe0,0x7b,0x37,0xff,0x08,0xcd,0x8d,0x3d,0x19,0x64,0x21,0xce,0x3a,0x68,0xde,0xc8,0xc2,0x56,0x12,0x86,0x2c,0x00,0xb3,0x3a,0x9c,0xa8,0xa4,0x5f,0x28,0x68,0x5e,0x23,0x94,0xe3,0xe9,0x07,0xef,0xe2,0xf8,0xe9,0x3d,0x00,0x0e,0x17,0xc7,0x4f,0xb0,0x9c,0x1d,0xe1,0x9b,0xbf,0xfd,0x7b,0x1b,0xb9,0xfa,0x31,0x60,0xd4,0x97,0x83,0x45,0x29,0x77,0xfd,0x25,0x82,0xe6,0xfb,0xfc,0xfe,0x2f,0x11,0x42,0xc7,0x17,0x21,0x40,0xa6,0x9c,0x03,0x96,0xe7,0xa7,0x38,0x79,0xf2,0x10,0x2f,0xbd,0xf1,0x4d,0x00,0x66,0xda,0xa7,0xb2,0x87,0x2a,0x50,0x73,0x99,0x25,0x4b,0x1a,0x96,0x73,0xb8,0xdd,0x3d,0x10,0x88,0x2d,0x32,0x1d,0xd2,0xed,0x73,0xc9,0xae,0x5a,0x25,0x31,0xa6,0x29,0x59,0xf5,0x6c,0xd4,0xcf,0xf4,0x55,0x74,0xc0,0x8b,0x84,0xaf,0xbb,0xc8,0x17,0xcc,0x7f,0x54,0xf5,0x6c,0x9e,0x78,0x07,0x10,0x05,0x84,0xf5,0x1c,0x14,0x56,0x70,0xeb,0x09,0x9c,0x9f,0x82,0x10,0xd0,0x88,0x33,0x8e,0x72,0xfc,0x0a,0x9d,0x07,0x7a,0xba,0x69,0xc9,0x3c,0x76,0x11,0x61,0xb5,0xc0,0x93,0xfb,0x1f,0xb0,0x4a,0xda,0x01,0xe7,0xc7,0xcf,0x10,0x29,0xe2,0xad,0x1f,0xfc,0xba,0xc2,0x36,0x94,0x26,0x00,0x30,0xcf,0xfa,0x75,0xad,0x6e,0xcf,0xdb,0xd0,0x68,0x64,0x46,0xdb,0x64,0x96,0xc8,0xa2,0x34,0xa5,0x5d,0x75,0x38,0x7e,0x7c,0x56,0x94,0x59,0xb0,0x89,0x14,0xf1,0xec,0xc3,0xf7,0x70,0x7a,0xf4,0x05,0xf6,0x6e,0xbc,0x84,0x37,0x7e,0xf4,0x9b,0x98,0xee,0xed,0xa5,0xcc,0xd2,0xf6,0xda,0xd8,0xd8,0x58,0xbe,0xb3,0xcc,0x38,0x3d,0xcb,0xc3,0xc3,0xd7,0x36,0xd6,0x47,0x77,0x92,0x13,0x25,0x12,0xdf,0x0c,0x0a,0x70,0x14,0x13,0x08,0x46,0x59,0x0c,0x51,0x7e,0xb7,0x17,0xe7,0x38,0xfc,0xec,0xdd,0xbc,0x2e,0x84,0xe9,0x68,0x97,0x2b,0x3c,0x7f,0xf0,0x2e,0x5e,0xf9,0x95,0x5f,0x83,0xf7,0xbc,0x95,0xc8,0xb6,0x16,0x2c,0x30,0x11,0x05,0x01,0xe4,0xc8,0xee,0x61,0x89,0xe7,0x45,0x8c,0x9d,0x80,0x2d,0xb7,0x95,0x42,0xe4,0xfa,0x10,0x40,0xd4,0xc1,0x45,0x12,0x7f,0xf7,0x41,0x80,0x5a,0x8d,0x25,0x63,0xde,0x0f,0x0e,0x11,0xa1,0x5d,0x31,0xf8,0x52,0x06,0x5f,0x55,0xd5,0x87,0x18,0x40,0xa1,0x85,0x9f,0x6e,0x0b,0x6f,0xc2,0xfb,0xd7,0xae,0xea,0x28,0xd5,0x7c,0x31,0x5b,0x4e,0x99,0xae,0xa7,0x3e,0x26,0x33,0xfc,0x66,0xc2,0x50,0xff,0xab,0x8b,0xf9,0x3c,0x52,0x3d,0x84,0xbc,0x23,0xab,0x96,0xa0,0xe0,0x06,0xc3,0x71,0x67,0x8b,0xd7,0x4b,0x44,0x44,0x44,0x2f,0x5c,0x02,0x08,0x88,0x41,0xbe,0xa9,0x33,0x4a,0x51,0x21,0xa9,0x4a,0x00,0x01,0x80,0x39,0xdc,0x2c,0x03,0x17,0xba,0x16,0xeb,0xd5,0x85,0x1c,0x9a,0x26,0xb4,0xeb,0x25,0x1f,0xbe,0x27,0xde,0x0c,0x27,0x04,0x3e,0x9f,0x05,0x71,0x63,0x19,0x03,0x62,0x0c,0xe8,0x82,0x2c,0x5a,0xf1,0x9a,0x15,0xa9,0x93,0x3c,0xb2,0x53,0x10,0x12,0x75,0x46,0xa4,0x4e,0xe2,0xf0,0xf5,0x54,0x31,0x12,0xe0,0xe4,0x08,0x53,0xcc,0x8e,0x3e,0xd8,0xd9,0x48,0x90,0x78,0x11,0xc7,0x0f,0x3e,0xc1,0xc5,0xc9,0x21,0x0f,0x54,0x5a,0xe7,0xc2,0x0d,0x01,0x68,0xdb,0x25,0x1e,0xfc,0xe2,0xcf,0x92,0xc1,0x52,0xbe,0x92,0xd1,0x70,0x8e,0xda,0xc1,0x2e,0x37,0x1b,0xfa,0xdb,0x3c,0x48,0x13,0xc2,0x18,0x97,0x5d,0x2d,0x08,0x5a,0xb8,0x7a,0x18,0x39,0x9c,0xdc,0xff,0x14,0x47,0x4f,0xef,0x89,0xab,0x3f,0x8e,0x73,0x7e,0xf2,0x1c,0x07,0x9f,0xfe,0x72,0x63,0xae,0x05,0x94,0x48,0x11,0xa3,0xd4,0xc2,0xc4,0x43,0x1d,0x6f,0x43,0xb5,0x59,0xd2,0xac,0x22,0x3b,0x60,0x76,0x72,0x82,0xd3,0xe3,0xa7,0x00,0xc0,0x6e,0xe3,0x4c,0x9e,0xd1,0x03,0x47,0x4f,0x3e,0xc7,0x7a,0xc1,0x46,0x5b,0xd1,0xe6,0x57,0xe8,0xfb,0xec,0xa7,0x7a,0x9f,0xf2,0x63,0xea,0x10,0x29,0x62,0x75,0xf4,0x0c,0xab,0x93,0x43,0xe8,0x5d,0x9f,0x35,0x64,0xdb,0x50,0xa8,0x9e,0x91,0xa5,0x60,0x4b,0xdc,0x5e,0x08,0xb5,0x36,0xa9,0x90,0xbf,0xc2,0x70,0x9d,0x52,0x5e,0xb4,0x4a,0x35,0xf8,0xda,0x2e,0xb1,0xfb,0xc7,0x75,0xff,0xf2,0x7e,0xa1,0xdc,0xa2,0xd6,0xd3,0x33,0x0f,0x7c,0x87,0xb2,0x3e,0x26,0x27,0x79,0x7f,0xf8,0xf8,0x33,0x74,0x51,0xb7,0x54,0xf8,0xfd,0xec,0xf4,0x39,0x4e,0x9e,0x7c,0x61,0x66,0x46,0x55,0x03,0x57,0xfe,0x48,0xf3,0xf3,0xb2,0x39,0x5d,0xcf,0xfb,0x51,0x24,0x47,0x5e,0xb2,0xf2,0x7d,0x88,0x6d,0x7b,0xf2,0xc1,0x3b,0x38,0x7a,0xfa,0x19,0x42,0xdb,0xe2,0xfc,0xe4,0x00,0xf7,0xfe,0xee,0xcf,0xb1,0xbe,0xb8,0x30,0x79,0xc5,0x4c,0x57,0x6c,0x59,0xaa,0x18,0xd0,0xf2,0x8a,0x8c,0x29,0x31,0x8f,0xcc,0x3f,0x0a,0x98,0x01,0x42,0xa3,0x21,0x46,0x4f,0x6c,0xbd,0x4b,0x91,0x00,0x62,0x37,0xbb,0x89,0x02,0x8b,0x7a,0x98,0xaf,0x76,0x95,0xfd,0xd6,0xc0,0x17,0x1e,0x20,0x46,0x1c,0x3c,0x7c,0x2f,0x5d,0xfa,0x00,0x40,0xae,0xd6,0x25,0xc0,0x05,0xb4,0xdd,0x0a,0x87,0x8f,0x3f,0x44,0x8c,0x2d,0x97,0xed,0x94,0x1e,0x07,0xce,0x57,0x40,0x34,0x0a,0xad,0x66,0x29,0x98,0x51,0x87,0x02,0x97,0xad,0x5e,0x12,0x03,0x75,0x88,0x31,0xbb,0x32,0xe6,0xed,0x5e,0x03,0xbe,0x60,0x49,0x3d,0x86,0x80,0x18,0xd6,0x05,0xf8,0x72,0x4f,0xb0,0x0b,0xe5,0x08,0xae,0x5b,0x24,0x42,0xb7,0x5e,0x88,0xf3,0x1e,0xc3,0x18,0xc8,0x87,0xfb,0x40,0xff,0xf1,0x8c,0x23,0xb1,0x90,0x26,0xf0,0x0d,0x4e,0x16,0xff,0x12,0xf5,0xd1,0xbe,0x4e,0x08,0xc6,0x58,0xc9,0x7d,0x9d,0xf8,0xf9,0x14,0x87,0x28,0xc2,0xa7,0x54,0xe2,0x0d,0x2b,0x79,0xc6,0xd2,0x1c,0x35,0x49,0x84,0x31,0xf3,0xe6,0x23,0x43,0x7c,0x6f,0x62,0x00,0x45,0x06,0x5f,0xd9,0xad,0xcf,0x77,0x3a,0xe8,0xe5,0x0a,0x46,0x6c,0x89,0xeb,0x16,0xed,0x7c,0x8e,0x6e,0xbd,0x44,0x68,0xa5,0x03,0x22,0x41,0x0f,0x54,0x27,0x37,0x96,0x81,0x07,0x9f,0xad,0xd8,0x02,0xba,0xae,0x43,0x6c,0x97,0x9c,0x5f,0x88,0xbc,0xbf,0x1c,0xbb,0xa4,0x22,0x01,0x85,0x94,0x86,0xa8,0x83,0xa3,0xc0,0xef,0x62,0xe0,0xc3,0xfa,0xba,0x19,0x1f,0x78,0x22,0x68,0x39,0x2e,0x46,0xac,0xcf,0xcf,0x70,0xf0,0xe0,0x03,0xb8,0x60,0x59,0xd9,0xcc,0xd5,0xe9,0xc4,0x9e,0x9f,0x1f,0xe1,0xe8,0x93,0x0f,0xb8,0xa9,0x2e,0xb2,0x14,0x6d,0x09,0x34,0xf5,0xb0,0xb6,0x04,0xe1,0xea,0x9c,0x36,0x08,0xb2,0x8f,0x72,0x45,0xca,0x97,0x7c,0x89,0xf6,0x57,0x7c,0x3b,0x9b,0xe3,0xd9,0xe7,0xef,0xf3,0x1a,0x55,0x11,0x52,0xc2,0xe1,0x17,0x9f,0x62,0x75,0x7e,0x3e,0x9c,0x25,0xaa,0x75,0x3d,0x44,0x21,0xae,0xc2,0x24,0x6c,0x22,0x5a,0x05,0x48,0x59,0x22,0xe8,0x70,0xf8,0xe8,0x6e,0xa6,0x50,0x56,0xcf,0x9d,0x88,0x1b,0xe1,0xf0,0xe1,0x5d,0xc0,0x81,0x25,0x64,0x6f,0x22,0x78,0x4b,0x01,0xcd,0x87,0x00,0xd6,0x86,0xf0,0xdf,0x4c,0xbd,0x00,0x27,0xfb,0xf7,0x3e,0x8a,0xe6,0x43,0xec,0x1b,0x00,0xbd,0x9e,0x01,0x28,0xd4,0x9d,0x3d,0x23,0x2c,0xe5,0x8e,0xeb,0x76,0x5d,0x23,0xbc,0x28,0xf6,0x5e,0x13,0x21,0x13,0x1c,0xfe,0xfd,0x60,0x7d,0x2e,0xb3,0x02,0x64,0x0d,0x5e,0xfa,0xd4,0xf6,0xbb,0x83,0x43,0x03,0x71,0x82,0x22,0x6f,0xd9,0x71,0x8a,0x1d,0xbf,0x8c,0x34,0x9a,0x3a,0x07,0x87,0x6e,0x31,0xc7,0xfc,0xfc,0x98,0xc7,0xd6,0x7b,0x56,0x5f,0x48,0x92,0xc3,0xa7,0xf7,0xd1,0xce,0xe6,0xa9,0x06,0x92,0xc4,0x70,0x99,0x03,0x2d,0x18,0x5a,0x03,0x29,0xdd,0x15,0x3b,0x62,0x48,0xad,0x44,0x7d,0xbe,0x75,0x7e,0xf4,0x1c,0xa7,0xcf,0x1e,0x16,0xed,0x0a,0xed,0x0a,0x0f,0xde,0xfd,0x1b,0x74,0xab,0x35,0xd4,0x3f,0x41,0x51,0x74,0x0d,0xbc,0x05,0x5f,0x21,0x15,0x8f,0x66,0x9b,0x89,0x42,0x16,0xc8,0x23,0xa0,0x56,0xcb,0xfc,0x5d,0x55,0xc2,0x21,0x1d,0xdb,0x64,0xfb,0x1c,0x31,0x6a,0x8a,0x4c,0x6f,0x75,0x4f,0x56,0xbd,0x44,0xcd,0x0e,0x9f,0x61,0x79,0x7e,0x96,0xe8,0x1f,0x37,0xd9,0x54,0x26,0x02,0xed,0x7c,0x81,0x93,0xa7,0x9f,0x08,0xd8,0x12,0x0b,0x4d,0x22,0x0d,0x53,0x0c,0x70,0xec,0x07,0x36,0x49,0xbe,0xd0,0xf7,0x24,0x6e,0x25,0x29,0x22,0x44,0xa5,0xb3,0xfc,0x2e,0x06,0xf1,0x54,0xa7,0xe0,0x1b,0xc4,0xab,0x54,0x60,0x41,0x8c,0x35,0x98,0xe0,0x3c,0x48,0x99,0x3c,0x4a,0xf9,0x43,0xd4,0xd6,0x31,0x46,0x74,0xed,0x42,0xf6,0x80,0x79,0xcc,0xa3,0x4a,0xf9,0xe9,0x12,0x21,0x6e,0x37,0xdf,0xcb,0x43,0xa9,0xaf,0x92,0xe5,0x37,0x71,0x5f,0x3a,0xfd,0x2d,0x0c,0x02,0x63,0x5a,0x84,0x93,0x3d,0xf2,0xc2,0x78,0xd3,0x58,0x5d,0x83,0x08,0x9e,0x75,0xf0,0x11,0x31,0x76,0x88,0x5d,0x8b,0xd8,0xb5,0x08,0xe2,0xc6,0xcf,0xba,0xcc,0x22,0xb1,0x5e,0x8b,0x7a,0xf6,0x4a,0x74,0xef,0x31,0x10,0x42,0xa4,0xe4,0xf4,0x3a,0xa6,0x46,0x22,0x15,0x96,0xf2,0x91,0x0a,0xb6,0xeb,0x19,0x66,0xc7,0x07,0xbc,0x1f,0xa4,0x03,0x42,0x2c,0xf1,0x52,0x8c,0x22,0xf9,0x32,0x47,0x06,0x0a,0x88,0xed,0x0a,0x8b,0xf3,0x63,0x1c,0x3f,0x7d,0x88,0xd3,0x67,0x0f,0x30,0x3f,0x3f,0x40,0x8c,0x6b,0x01,0x67,0xbd,0x4c,0x39,0xf0,0x1e,0x74,0x64,0xc0,0x8f,0xd4,0xf1,0x9e,0x85,0x30,0x0a,0x51,0x07,0x8f,0x04,0x84,0x3b,0x9e,0x60,0x31,0x46,0x3c,0xb9,0xfb,0x33,0x76,0x5d,0xe8,0x90,0xa5,0xe9,0x82,0x77,0xcf,0x60,0x7c,0xf0,0xf9,0x7b,0x58,0x9d,0x9d,0xc9,0x4f,0xe1,0x32,0x0d,0xf7,0x14,0xed,0xd8,0xe8,0xd4,0xb4,0x0b,0xda,0xc3,0xe4,0xab,0xd9,0x9b,0xc9,0x71,0xa5,0xd0,0x8f,0x77,0xf0,0xe9,0xfb,0x08,0x9d,0x70,0x63,0xde,0x15,0xe5,0x53,0x8c,0x78,0x7a,0xf7,0xfd,0xab,0xe5,0x74,0x65,0x89,0x76,0x20,0xa3,0x8d,0x44,0xab,0x9f,0x68,0x7e,0x7a,0x8c,0xc5,0xec,0x74,0xb8,0x0c,0x05,0x4d,0xf2,0x58,0xcc,0xcf,0x71,0xf1,0xfc,0xb9,0xbc,0xa8,0xac,0x74,0x92,0x37,0x13,0x53,0x56,0x93,0x92,0x66,0xc6,0xc7,0xe5,0x6c,0x23,0x1b,0xc1,0xf7,0x78,0x24,0x4b,0xc7,0x32,0xf1,0xd2,0x39,0x9c,0xf8,0xd6,0x7e,0xac,0xeb,0x00,0x9c,0x45,0xa8,0x6b,0xa5,0x7b,0x41,0x14,0x7d,0x21,0xfe,0xe0,0xea,0x89,0xac,0xf4,0x5b,0xa6,0x32,0xbf,0x15,0x13,0xaa,0x2a,0xe9,0x94,0x89,0x66,0x4d,0xe8,0xb6,0x7e,0xc1,0x37,0xd9,0xb1,0x75,0x40,0x52,0x25,0x0b,0x03,0x76,0x72,0xf0,0x24,0xbd,0xcc,0x5a,0x16,0xce,0x84,0x42,0xc4,0xc1,0x67,0x1f,0xf7,0x5a,0x64,0xd8,0x66,0x94,0xb5,0xdb,0x20,0x01,0x8f,0xcd,0xf1,0xab,0x84,0x2a,0x3f,0xcd,0xea,0xf9,0xe7,0x77,0x05,0x4c,0x6d,0x6d,0x3c,0xd6,0xcb,0x25,0x1e,0xbd,0xfb,0x53,0xe8,0x35,0xad,0x04,0x57,0xdf,0xde,0x99,0x45,0xaa,0x22,0x63,0x97,0xe9,0x97,0xce,0x5d,0x00,0x7a,0xc5,0x5e,0x04,0xef,0xdf,0xf2,0xa9,0x13,0xd5,0x02,0xca,0xde,0x6c,0xc7,0xa7,0x04,0x14,0x70,0x49,0xdd,0x2e,0x06,0x62,0x29,0x35,0xa8,0xc4,0x1c,0x71,0xf2,0xe4,0xae,0x54,0x25,0x8b,0x20,0xd6,0x09,0x85,0x56,0x6c,0x79,0x71,0x86,0xd3,0x83,0xfb,0xa2,0x69,0xec,0x04,0x48,0x3b,0xc1,0x38,0xc6,0x1d,0x06,0x79,0x3e,0x7e,0x14,0x03,0x09,0x9d,0x16,0x2c,0x89,0x81,0xe5,0x50,0x11,0xae,0xf8,0x32,0x68,0xa6,0xeb,0x6c,0x64,0x25,0x0c,0x02,0x02,0xba,0xf5,0x02,0xea,0x3e,0x32,0xe1,0x08,0xa3,0x70,0x69,0xc0,0x05,0x15,0xf4,0xd8,0x01,0x49,0x17,0x02,0xeb,0x6b,0x0d,0x1d,0x66,0xab,0x6c,0x64,0xc0,0x24,0xb3,0xf6,0x95,0xe6,0x1b,0xab,0x6a,0xfb,0x49,0x8c,0x4d,0xa2,0x17,0xf2,0xa9,0x19,0x01,0x8a,0x98,0xb0,0x01,0x54,0x15,0xa2,0x43,0x74,0x1d,0x7c,0xe3,0xc5,0x73,0x48,0x3e,0xfb,0xca,0xf5,0x94,0x5b,0x91,0x88,0xa0,0xe6,0xa3,0xbc,0x10,0x65,0xdf,0x35,0x0a,0x27,0xe1,0xc4,0x25,0xa5,0x56,0x3d,0x32,0x97,0xd1,0xad,0xf8,0x60,0xf7,0xfc,0xfc,0x04,0xd3,0xad,0x1b,0x98,0x6e,0xef,0xf0,0xd2,0x91,0xfb,0x7f,0x3d,0x39,0x74,0xe2,0x35,0x65,0xb5,0xb8,0x60,0x23,0x2e,0x31,0x3e,0x72,0xde,0x61,0x6b,0xf7,0x26,0xe6,0x67,0x47,0xd8,0xfc,0x9f,0x68,0x69,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x7f,0xe5,0x2d,0x6c,0xef,0xbe,0xcc,0x7b,0x77,0x2e,0xc2,0x61,0x02,0xdf,0x28,0xf7,0xd2,0x80,0x7c,0x07,0x1f,0x27,0x88,0x0e,0x70,0x9e,0xc4,0x1d,0x21,0xd8,0xf3,0x95,0x67,0x1f,0x9f,0x27,0x8f,0xef,0x62,0x79,0x21,0x20,0x40,0x86,0xad,0x8c,0xcc,0x75,0xea,0x23,0xd5,0xfa,0xc6,0xd0,0xe1,0xd1,0xbb,0x7f,0x89,0xef,0xfe,0xc1,0x7f,0xc9,0x7b,0x56,0x04,0x71,0x91,0x89,0x74,0x56,0x98,0xe0,0xb3,0x96,0xd8,0xe5,0xdd,0x2c,0xbb,0x37,0xcc,0x2e,0x3b,0xcd,0x7c,0x75,0x10,0x6b,0x3b,0xea,0x4b,0x83,0x28,0xe3,0xd5,0xab,0x79,0x79,0x7a,0x82,0xd3,0x83,0x47,0xec,0x88,0x04,0x60,0xae,0x0d,0x2e,0xed,0xfb,0x12,0x22,0x66,0x27,0x07,0x98,0x3d,0x3f,0xc0,0x8d,0x57,0xfb,0x06,0x3c,0x34,0xf4,0xc3,0x6d,0xc0,0xe1,0x31,0xa0,0x1d,0x7b,0x37,0x92,0xfe,0xe8,0xe1,0x7d,0x28,0x2b,0xef,0xcd,0xcb,0x28,0x9d,0xe7,0x89,0x10,0xe5,0x5a,0xc8,0xa3,0xa7,0xf7,0xb1,0x73,0x6b,0x1f,0x7e,0x32,0x19,0xaf,0x80,0xa2,0x41,0xd2,0x00,0x98,0x43,0xc0,0x4c,0xea,0xf3,0xfb,0x2b,0x12,0xd2,0x62,0x01,0xf5,0x54,0xcf,0x5f,0x22,0x7c,0xd9,0xf4,0x57,0xca,0xfe,0xfa,0x85,0xa8,0xd9,0xc8,0x35,0x0a,0x29,0xcb,0x79,0x91,0xee,0x89,0x19,0x70,0xe5,0x62,0x41,0x79,0x21,0x8b,0x25,0x0d,0x61,0x7f,0x52,0x76,0x8b,0x39,0xe6,0x17,0xc7,0xd0,0xc5,0xe1,0xec,0xa2,0x92,0xb8,0xcb,0xd9,0x29,0xce,0x9f,0x3c,0xc5,0x4b,0x6f,0xbe,0x9d,0xd2,0xa9,0x2c,0x9e,0x2a,0x7b,0x55,0x2d,0xcf,0x35,0x1b,0x37,0xd4,0x45,0x1a,0x96,0x27,0x47,0x98,0x9f,0x1d,0x88,0x41,0xa9,0x64,0xee,0x29,0x59,0x04,0xcf,0xce,0x8f,0x71,0xf0,0xe9,0xc7,0x78,0xed,0x87,0x3f,0x42,0xd1,0xb1,0x43,0xe5,0xa7,0xa9,0x49,0x66,0x0c,0xf3,0xbe,0x31,0xd3,0xfb,0x90,0x22,0x53,0x54,0x27,0x16,0x51,0xee,0x0c,0xb0,0xd2,0x9d,0xf2,0x89,0x72,0x6e,0x98,0x14,0x5c,0xf8,0xfb,0xfc,0xf0,0x31,0x56,0xcb,0x99,0xe9,0x14,0x29,0xc4,0xc7,0x4c,0xd3,0x80,0xb4,0xaf,0x3c,0x3b,0x3d,0x45,0x0c,0x01,0x37,0xef,0xbc,0x2d,0xdb,0x80,0x2a,0xfc,0x84,0xb4,0xcf,0xcb,0x98,0xc4,0xe5,0xc7,0xd8,0xa1,0x5b,0x2e,0xd0,0xb5,0x2d,0x62,0x6c,0xe1,0xe0,0xe0,0x9b,0x29,0x9a,0x66,0x8a,0xe4,0x8a,0x92,0xd4,0x18,0x8b,0xbf,0xc7,0xae,0x15,0x60,0x8f,0x82,0x75,0x24,0x44,0x59,0x48,0x2a,0xc9,0xc6,0x85,0xec,0x17,0x67,0x8e,0x2f,0x22,0x44,0xbe,0x11,0xaa,0x71,0x53,0xb3,0xde,0xeb,0x35,0x14,0xb3,0x10,0x5b,0x70,0x94,0xc2,0xac,0xa4,0x74,0x32,0x96,0x1e,0xcc,0xe5,0x17,0x63,0xc4,0xa0,0x6b,0xd5,0x8d,0xf9,0xa0,0xa5,0x21,0xbc,0x1a,0x39,0x76,0x01,0x0e,0x01,0x6e,0x32,0x85,0x6f,0xe4,0x46,0x0f,0x71,0xfd,0x54,0x70,0x3b,0x51,0x17,0x46,0x4c,0xaa,0xa4,0x3c,0x29,0x24,0x43,0xc7,0x12,0x72,0x58,0x2f,0xf3,0xa4,0x08,0x11,0xeb,0xc5,0x0c,0xed,0x72,0x06,0xd7,0x4c,0xc4,0x25,0x1d,0x89,0x5a,0x41,0xdd,0xc1,0xf9,0x3c,0xc6,0x0e,0xa0,0x48,0x68,0xe7,0x33,0xb8,0xbd,0x9b,0x38,0x7b,0xfa,0x00,0x37,0x5e,0x69,0xb1,0xb7,0xff,0x06,0x1b,0x78,0x34,0x1d,0x22,0x1f,0x3f,0x06,0x1f,0xaf,0x9a,0xc8,0x39,0xe3,0x98,0x0c,0xbb,0x14,0xc8,0x09,0x0d,0x96,0xe7,0x87,0x38,0xfe,0xe2,0x53,0xa9,0xac,0x51,0x4f,0x91,0x28,0x84,0x9c,0x4b,0x8f,0x2c,0x51,0x58,0x5e,0x9c,0xe2,0xe0,0xc3,0x77,0xf0,0xfa,0x8f,0x7f,0x8b,0x2d,0x8c,0x23,0x83,0x9c,0xed,0x46,0x08,0x43,0xe2,0x88,0x0f,0x71,0x31,0x90,0xbb,0x6c,0xe0,0xa1,0xf8,0x00,0x54,0x46,0x1f,0x2a,0x9a,0x49,0x4e,0x05,0x10,0x0f,0x53,0x89,0xa7,0x9f,0xbc,0x87,0xe4,0xf3,0x58,0x25,0x04,0x1f,0xcd,0x78,0x30,0x59,0x7b,0x76,0xff,0x23,0x7c,0xf7,0xd5,0x57,0x60,0xe1,0xae,0x0e,0x23,0xc2,0x6a,0x3f,0xd2,0x97,0x04,0x90,0xc5,0xe9,0x29,0x2e,0x4e,0x9e,0xb3,0x1b,0xce,0xba,0x3e,0x22,0xfa,0xa8,0xd7,0x70,0x80,0x8f,0x91,0x1c,0x3e,0xba,0x8f,0xd7,0xbe,0xfd,0x23,0x64,0x04,0x35,0x96,0x52,0x00,0xc4,0xa4,0x9d,0xf7,0xbf,0x83,0x99,0xd0,0xe4,0x84,0xf8,0x68,0x7e,0xfa,0xae,0x01,0x10,0xd8,0xa7,0x6c,0x60,0xcf,0x6c,0xd9,0x13,0x75,0x03,0x19,0xd8,0xa4,0x42,0xba,0xb2,0xb7,0xab,0x2b,0x84,0x6b,0x25,0x7b,0x21,0xe9,0x97,0x5e,0x7c,0x8c,0x5e,0x20,0x9d,0xed,0x92,0x1a,0x90,0x49,0xc6,0xca,0xcb,0x5c,0x74,0x49,0xa4,0xcd,0xa2,0xad,0x43,0xad,0x72,0x36,0x93,0x50,0xfc,0xa9,0xc3,0xb9,0x72,0x0b,0x02,0xc0,0xd9,0xc9,0x21,0x4a,0xdb,0x82,0xc6,0xd2,0x37,0x00,0x3c,0x43,0x0e,0x1f,0x7f,0x8a,0xfd,0xd7,0x5f,0x4b,0x37,0xa4,0xd5,0x71,0xbe,0xae,0xe0,0xcc,0x97,0x7a,0x18,0x8f,0x1f,0x3f,0x04,0xc0,0x3e,0xcf,0x05,0x1d,0xd8,0x50,0x14,0xd9,0x18,0xed,0xf9,0x17,0x9f,0xe0,0xc6,0x9d,0x97,0xb1,0xf7,0xca,0xab,0x75,0x27,0x73,0xb0,0x58,0xa2,0x2b,0x46,0x24,0xb4,0x02,0x13,0xa2,0xdc,0x69,0xab,0x2a,0x58,0x9d,0xdb,0x41,0x40,0x01,0x48,0x5b,0x80,0xc9,0x30,0x37,0x69,0xa4,0x49,0xf6,0xea,0x01,0x0a,0x01,0xa7,0x47,0x8f,0xc0,0xa6,0xa7,0xa6,0x2e,0x11,0xc2,0xf0,0x47,0x73,0x42,0x85,0x1b,0xee,0x01,0x2c,0x2e,0xce,0x11,0xba,0xcf,0x70,0xe3,0xf6,0xeb,0x70,0xf0,0xc6,0x1e,0x87,0xb5,0x86,0xa0,0x0e,0x21,0x44,0x74,0xab,0x0b,0xac,0x16,0x73,0x29,0x2f,0x53,0xde,0xd8,0x76,0xe8,0xb0,0x80,0x9f,0x4c,0xd8,0x97,0xb8,0xf6,0xa7,0x48,0xf8,0xa1,0x6b,0x13,0xf8,0x92,0x9a,0xa1,0x07,0x6d,0xbe,0x6e,0x11,0xd6,0xe0,0x6b,0xba,0xb1,0x23,0x04,0xd7,0xf2,0x5d,0xf2,0x43,0x44,0x50,0xfc,0xda,0xe6,0x5d,0x59,0xdd,0x8e,0xcd,0xc4,0x9b,0x6c,0xc6,0x22,0x04,0x70,0x56,0x2a,0xa1,0xc6,0xaa,0x5c,0x87,0x49,0x31,0x9c,0x03,0xb3,0x92,0x00,0xa0,0x93,0xfb,0x38,0xbd,0x1c,0x45,0x4a,0x88,0xa1,0x56,0x85,0xd9,0xe2,0x99,0xec,0x3b,0xcb,0xae,0x89,0x83,0x7c,0x23,0x0f,0x4a,0x99,0xa2,0x36,0x0d,0xeb,0x7c,0xa6,0x3c,0xdd,0xf4,0x90,0x01,0x1f,0x2e,0xa4,0x7c,0x23,0x45,0xac,0x96,0x73,0x6c,0xed,0xee,0xe1,0xe2,0xf0,0x09,0xa8,0x5b,0xe3,0xc6,0x9d,0x6f,0xc8,0x9d,0x0c,0x1d,0x42,0x00,0x9f,0x31,0x8c,0x1d,0x9c,0x8f,0x88,0xe9,0xe2,0xd1,0x08,0xb8,0x16,0x04,0x8f,0x75,0x3b,0xc7,0xd3,0xbb,0x3f,0x97,0x2c,0x5d,0xaa,0x8b,0xee,0x1d,0xb2,0x2a,0x2c,0x19,0x91,0x6b,0x65,0xd2,0x9f,0xe7,0x5f,0x7c,0x84,0x9d,0xdb,0x2f,0x63,0xff,0x6d,0xb6,0xd0,0x75,0xce,0xa7,0xfe,0x65,0xc9,0x59,0x26,0x57,0xdb,0xe2,0xf8,0xc1,0x3d,0x9c,0x3c,0xb9,0x8b,0x6e,0xbd,0xc4,0xde,0xed,0xd7,0xf0,0xd6,0x8f,0x7f,0x07,0x5b,0x37,0xf9,0xfa,0x33,0x34,0x5c,0x35,0x2d,0xde,0x58,0x77,0x49,0x1f,0x98,0x11,0xf2,0xc5,0x20,0x01,0x00,0xe6,0x07,0x07,0x98,0x9d,0x1e,0x26,0x9c,0x56,0x7e,0x45,0xfb,0x58,0x27,0x20,0xe0,0xb0,0x9c,0x9f,0xe2,0xec,0x8b,0x2f,0x70,0x4b,0xea,0x5c,0x04,0x23,0x0c,0xf4,0x4a,0x71,0x03,0x2f,0x2e,0x03,0xe1,0x8d,0xd2,0x82,0xc3,0xf3,0x2f,0xee,0x21,0x90,0x9c,0xd5,0xb6,0xda,0x00,0x93,0xd6,0x53,0xf9,0x78,0x7e,0x7e,0x8a,0xf3,0xa3,0x43,0xdc,0x7c,0xe9,0xe5,0xc1,0x3c,0xf5,0x74,0x92,0xce,0x94,0x6e,0xbd,0xc6,0xec,0xf4,0x18,0xdd,0x6a,0x01,0x38,0xa0,0x69,0x26,0xd8,0xbe,0xb1,0x8f,0xc9,0x84,0x8d,0xff,0xa3,0x9c,0x0d,0xb6,0x58,0xee,0x1b,0xd9,0x76,0x93,0x7d,0xb6,0x17,0xf7,0x76,0x35,0x1e,0x6a,0xa3,0xa5,0xab,0x27,0xbc,0x7e,0xdc,0xeb,0x25,0x79,0x11,0xd0,0xa6,0xa2,0x4b,0x2c,0x19,0x2a,0x71,0x98,0xaf,0x7d,0x6b,0xf8,0x9e,0x77,0x00,0xbc,0xcc,0x9d,0x28,0x6a,0x74,0xce,0x3a,0xe7,0x8c,0x16,0x38,0xd3,0x09,0x0f,0x71,0xd4,0x9f,0x8e,0x46,0x02,0x08,0xc0,0xe2,0xec,0x64,0x9c,0x5f,0x4c,0x0b,0x99,0xd0,0x85,0x16,0xcf,0x3f,0xbf,0x87,0x37,0xbe,0xf7,0xa3,0x54,0xb5,0x92,0xb1,0x1e,0x68,0xf8,0x55,0x24,0xde,0xba,0xf0,0x81,0xb8,0x86,0xde,0x72,0x90,0x9b,0xe6,0xce,0x4f,0x9e,0xe4,0x77,0xba,0xb6,0x63,0x29,0x77,0x01,0xc0,0xa3,0x8f,0xff,0x13,0xbe,0x77,0xf3,0x5f,0xa2,0xd9,0xce,0x97,0xa9,0x28,0xbe,0x02,0x3c,0x47,0x0b,0xd6,0x52,0x01,0x15,0x7c,0x15,0x6b,0x68,0x97,0x98,0x6c,0xef,0xa4,0xb8,0xc9,0x91,0x84,0x1e,0xbf,0x21,0x31,0xb8,0x0a,0x9c,0x71,0x8c,0x91,0x6d,0x53,0xf8,0xe0,0xb6,0xa8,0x87,0x01,0xc4,0x88,0xd5,0xec,0x04,0xab,0xc5,0x79,0xaf,0x73,0xc8,0x89,0xf4,0x2b,0x74,0x53,0xd5,0xb0,0xac,0x29,0x65,0x4b,0xe7,0xf5,0x72,0x8e,0xf5,0xfa,0x01,0x76,0x76,0xf6,0xb1,0xb5,0xb3,0x03,0x07,0x8f,0x88,0x0e,0xdd,0x7a,0x85,0x76,0xb9,0x40,0xbb,0x5a,0xb1,0x74,0x5c,0x20,0xa4,0xcb,0xc2,0x0d,0x45,0xbe,0x6e,0x96,0xc0,0xb7,0xa7,0x89,0x0b,0xd3,0xd8,0xb5,0x7c,0xa6,0x5f,0x19,0x0f,0x97,0xc1,0x57,0xeb,0x00,0x39,0xda,0xd4,0x1b,0x3b,0x3b,0x47,0x29,0x70,0x3e,0xce,0xcb,0x95,0xa5,0x7a,0x7c,0x33,0x26,0x66,0x41,0xb7,0x4b,0x47,0x46,0xb8,0x64,0x4a,0x0c,0xf0,0xe7,0xb9,0x56,0xa6,0x9d,0xa4,0x0d,0xcb,0x14,0x2a,0x69,0x44,0xb5,0x9a,0x5d,0x07,0xb8,0x00,0x3f,0xd9,0xca,0xaa,0x9b,0x04,0xa6,0xd9,0x4a,0xcf,0x45,0x5d,0x4d,0x11,0xea,0xba,0x26,0x86,0x96,0x1d,0x74,0xa4,0xac,0x0d,0x48,0x5b,0xc2,0xae,0xab,0x42,0xb9,0x8a,0xa4,0x12,0xb6,0x64,0x98,0xf3,0xa5,0x10,0xd0,0x2e,0x66,0x98,0xee,0xec,0x61,0x76,0x7a,0x04,0x82,0xc3,0xcd,0x3b,0x6f,0xf2,0x0d,0x18,0x1e,0x70,0x61,0x82,0xa8,0x2a,0x11,0x51,0x5d,0x79,0xe7,0xe1,0x7c,0x83,0xf9,0xe2,0x14,0x4f,0x3e,0x7d,0x07,0xb1,0x5d,0xc3,0x4d,0x26,0x98,0xee,0xdc,0x80,0xf3,0xdc,0x0f,0x79,0x3d,0x91,0xdc,0x78,0x01,0xb1,0x28,0x76,0xf9,0x3d,0x71,0xbb,0x1f,0x7d,0xf4,0xd7,0xf8,0xa6,0xff,0x43,0xdc,0x7c,0xf3,0x2d,0x56,0x9f,0x38,0xc8,0x45,0x16,0x11,0x61,0xd5,0xe2,0xf9,0x27,0xbf,0xc0,0xb3,0xcf,0x3e,0x94,0xa3,0x11,0x4c,0x38,0xe6,0xb3,0x33,0x9c,0x3c,0x79,0x80,0xef,0xff,0xee,0xbf,0xc6,0x8d,0x37,0xde,0x86,0x13,0x8f,0x89,0x48,0x84,0xc9,0x65,0x40,0xaa,0x17,0xb7,0x5a,0xb7,0xe9,0x91,0xa2,0x18,0x71,0x70,0xef,0xbd,0xdc,0x75,0x89,0x90,0x45,0x33,0x74,0x3e,0x33,0x18,0xd1,0xe1,0xe0,0xfe,0xc7,0xd8,0x7f,0xe3,0x4d,0xb8,0xa6,0xf4,0x32,0xa5,0x8c,0x45,0x1d,0xda,0xe5,0x02,0xc7,0x8f,0x1e,0x60,0xb5,0xbc,0xc0,0x74,0x6b,0x07,0x2f,0xbf,0xf9,0x2d,0x6c,0xed,0xdf,0x4c,0x9a,0x84,0xd1,0x30,0xf6,0xca,0x01,0xed,0x6a,0x89,0xb3,0xc3,0xa7,0xb2,0xef,0xd4,0xa2,0x99,0x18,0xc2,0xe2,0x5d,0x66,0xc4,0xbc,0x07,0x1c,0x21,0x1f,0xb5,0x8e,0x38,0x79,0xfa,0x19,0xb6,0xb7,0xb6,0x31,0xd9,0xdd,0x81,0x36,0x2f,0x4d,0x19,0x41,0x60,0x6a,0x23,0xce,0x4f,0x9e,0x63,0x35,0x3f,0xcb,0xed,0x6a,0x80,0x18,0x5b,0x2c,0x66,0xc7,0xd8,0xd9,0xb9,0x89,0xc9,0xd6,0x2e,0x73,0xc6,0x42,0x64,0x5c,0x04,0xa8,0x11,0x54,0xd6,0x79,0x93,0xb4,0x25,0xb4,0x19,0x60,0x89,0x40,0x67,0x4b,0x84,0xcf,0x8f,0xc6,0xe3,0x68,0xd4,0x45,0xf6,0xdc,0x14,0x0f,0x67,0x08,0x9f,0xd9,0x34,0xc3,0x65,0x50,0x97,0xd7,0x68,0x7c,0x72,0x8a,0xd0,0xf8,0xc1,0x78,0x29,0x87,0xae,0xb4,0xee,0x0e,0x0f,0x0e,0x11,0x8f,0x77,0x36,0xd6,0x2b,0x1c,0x66,0xab,0x5b,0x8a,0x84,0xf6,0xde,0xf3,0x81,0x58,0x65,0xfd,0xba,0xa7,0xfd,0xfd,0xfb,0x3e,0x69,0xe2,0x27,0x21,0xb4,0xe8,0xba,0x25,0x28,0x06,0x34,0xdb,0xbb,0xd8,0xde,0xbd,0x91,0xe7,0x6b,0x16,0x5e,0x65,0x9d,0x0a,0x00,0x5b,0x41,0x58,0xe3,0x8a,0x8d,0x15,0x3c,0x30,0x3f,0x3b,0x61,0x5b,0x0f,0x8d,0x66,0xb6,0x5c,0x34,0x81,0x17,0xc3,0xca,0x08,0xe0,0xec,0xe8,0x29,0x6e,0xbd,0xfe,0x16,0x76,0x6f,0xed,0x97,0x4b,0xcb,0x1a,0x34,0x5d,0xd6,0xa0,0x5e,0x90,0x75,0x30,0xc8,0xb9,0x22,0xd3,0x8c,0xea,0x1c,0xe8,0xc5,0xf3,0x67,0x88,0xad,0x31,0x8e,0x02,0xf2,0xd6,0x89,0x97,0x2d,0x24,0x51,0xb1,0x76,0xeb,0x05,0x1e,0xbe,0xfb,0x1f,0xf1,0x2b,0x3f,0xf9,0x7d,0x78,0x97,0x2f,0x76,0xc8,0xc0,0x2b,0x4a,0x67,0xeb,0x4b,0x7e,0x39,0xc7,0xd3,0x5f,0xfe,0x02,0x17,0xa7,0x87,0x68,0x97,0x73,0x34,0x93,0x29,0xde,0xf8,0xce,0xaf,0xe1,0xf6,0x5b,0xdf,0xe6,0xea,0x46,0x71,0x6e,0x11,0x08,0xba,0xaf,0x8a,0x48,0x6c,0x88,0xa5,0x47,0x7c,0xba,0x35,0x6b,0x87,0xd4,0x40,0x2a,0x12,0xce,0x0e,0x1f,0x8a,0x6a,0x95,0x52,0xa5,0x93,0x54,0xc8,0x95,0x62,0xd0,0xa3,0x88,0xd0,0x2e,0x11,0x3b,0x71,0xa6,0x11,0x99,0x36,0xfa,0xad,0x06,0x8b,0x2e,0x60,0x71,0x01,0x58,0xec,0x21,0x62,0x37,0x96,0x96,0x06,0x67,0xc3,0x27,0x29,0x80,0x14,0xec,0xf9,0x22,0x0d,0xb4,0x1d,0xdf,0x56,0xb7,0x5e,0x21,0xa9,0x82,0xc9,0x32,0x92,0x62,0x00,0x6c,0x55,0x8c,0x54,0xfd,0xcd,0x1d,0x9f,0x1f,0x06,0x75,0xab,0x69,0xaf,0x7e,0x54,0xc6,0xc8,0x32,0xa9,0xa3,0xac,0x5f,0xaf,0xbc,0xcc,0x56,0x19,0x01,0xd4,0x01,0x6e,0xe7,0x5b,0xff,0x8c,0xca,0xc9,0x53,0x65,0x5a,0xcd,0x54,0xef,0xc0,0xd7,0x48,0xf9,0x89,0xcc,0x71,0x49,0x6c,0xa8,0xb7,0xda,0xec,0xc5,0x18,0xd9,0xbf,0xab,0x6c,0x80,0x97,0x96,0x87,0xae,0xc2,0x7a,0xdf,0x07,0x00,0x16,0x25,0xfb,0xed,0x94,0xd5,0xa9,0x5c,0x45,0xb3,0xbd,0x85,0x89,0x9f,0x60,0x67,0xff,0x0e,0x6e,0xbd,0xfa,0x16,0x9c,0x9b,0x30,0x21,0xa6,0xc8,0x9e,0xb5,0xa4,0xbe,0x14,0x3a,0x9c,0x1d,0x3c,0xc4,0xd9,0xf3,0x47,0x42,0x18,0x9c,0x70,0x3b,0xc0,0xd6,0xee,0x4d,0xb9,0x65,0xc5,0x41,0xed,0x35,0x05,0x51,0x13,0x00,0x67,0x5b,0x44,0xf5,0x81,0xcd,0x77,0xd8,0xbe,0xf2,0xcd,0x1f,0xe3,0xf6,0x37,0xbe,0x8b,0x49,0xe3,0xb1,0x3c,0x3f,0xc7,0xc9,0xd3,0xcf,0x70,0x7a,0xf0,0x39,0x56,0xf3,0x59,0xea,0x52,0x52,0xa9,0xde,0xf3,0xad,0x4a,0xcd,0xd6,0x14,0xbf,0xfa,0x87,0x7f,0x8c,0x9d,0x97,0x5e,0xaa,0xbb,0x8f,0x55,0x52,0x1a,0x36,0x10,0x80,0xf3,0xa7,0x8f,0xf1,0xe0,0x83,0x9f,0xa6,0x3b,0x3f,0x13,0x31,0xf0,0x10,0x23,0x04,0x16,0xe5,0x7c,0xe3,0xe1,0x9b,0x06,0xea,0xbd,0xfa,0xf5,0x6f,0xfe,0x08,0xaf,0x7c,0xef,0x07,0xfd,0x3e,0x2d,0x02,0xe1,0xe8,0xb3,0xfb,0x38,0x78,0xf4,0xa9,0x70,0xa5,0x1a,0xcd,0xe1,0xed,0x1f,0xfc,0x26,0x6e,0xbd,0xf9,0x56,0x41,0x54,0x50,0xf3,0x4a,0x86,0x47,0x23,0xa0,0xe0,0x1a,0x9f,0xfe,0xf2,0x7d,0x1c,0x3c,0xfe,0x2c,0xc5,0x69,0x26,0x53,0x34,0xda,0x06,0x9f,0xd8,0x39,0x78,0x6a,0x78,0x3f,0x58,0x25,0x52,0x51,0xa9,0x7b,0x37,0xc1,0xcb,0x6f,0x7e,0x0b,0xdb,0x37,0x6f,0xb2,0x0b,0x43,0x35,0x14,0x0c,0x84,0xf9,0xc5,0x29,0xce,0x4f,0x9e,0x25,0x2f,0x57,0x76,0x7a,0xe6,0x3a,0x38,0xec,0xdd,0xb8,0x05,0x3f,0x9d,0x26,0x95,0x54,0x94,0xdb,0x5d,0x82,0x18,0x84,0xc4,0x6e,0x85,0x69,0xd7,0xe1,0x67,0x3f,0xf9,0x57,0x97,0xa8,0x9e,0x69,0x60,0x51,0x57,0x92,0xa4,0x69,0x7b,0xfa,0x6a,0x01,0x7d,0x30,0xdf,0x91,0x38,0xd5,0x7c,0xb0,0xfd,0x9a,0x16,0x79,0x2f,0x2b,0xaa,0xf8,0x87,0x81,0xdf,0xbd,0x2a,0xe4,0x1f,0xf6,0xf7,0xa6,0x74,0x05,0xff,0x4f,0xc5,0x2f,0xfc,0x77,0xcf,0x3e,0xc6,0x7f,0x6c,0x67,0xf0,0x7e,0x0a,0x38,0x8f,0x66,0x32,0xc5,0xee,0xcd,0x5b,0xf0,0xce,0xc1,0x3b,0x51,0xbb,0x36,0x9e,0xed,0x33,0x9c,0x4b,0xcc,0x32,0x4b,0xc9,0x1e,0x8d,0x6f,0x00,0xb9,0x65,0x8d,0x6d,0x38,0x3c,0x9e,0x3f,0xbc,0x8b,0xe5,0x62,0x86,0xa4,0x62,0xf4,0xde,0x80,0x90,0x00,0xb0,0x54,0x38,0x3a,0xde,0x0a,0x9a,0x6e,0xed,0xe2,0x5b,0xbf,0xf5,0xbb,0xf0,0x4d,0x23,0xb4,0x4b,0x89,0xa1,0xa1,0x5f,0xce,0x25,0xb0,0x2f,0x3a,0x72,0x48,0x1e,0xf0,0x1e,0xbd,0x41,0xd1,0x7e,0xaa,0x99,0x36,0xf3,0xf3,0xf1,0x47,0xef,0xe0,0xf4,0xd9,0x03,0x79,0x94,0x61,0x14,0xf2,0x2d,0x97,0xa1,0x44,0x9b,0xb0,0x7f,0xe7,0x2d,0x7c,0xe3,0x37,0x7e,0xa7,0x3f,0xcd,0xc4,0x8f,0xbe,0xf6,0xf8,0xc5,0xd3,0xa7,0x78,0x7c,0xf7,0xe7,0x88,0x2d,0xfb,0x40,0x5e,0x2d,0x67,0x72,0xc1,0x43,0xc4,0xad,0xd7,0xde,0xc2,0x5b,0xdf,0xff,0x1d,0xb6,0xa5,0x10,0x89,0x4e,0x01,0x93,0x0d,0xb3,0x78,0x2d,0x21,0x8a,0x24,0x1c,0xa3,0x48,0xaa,0x84,0xd8,0xae,0xf0,0xc5,0x27,0x3f,0x05,0x48,0xa5,0xd2,0x42,0x0c,0x07,0x02,0x4b,0x0e,0x6d,0x58,0xb3,0x35,0x32,0x21,0x09,0x0d,0x5c,0x4f,0x5e,0xd9,0xbe,0xf1,0x68,0x26,0x5b,0x4c,0x93,0x42,0xde,0x42,0x4a,0x5a,0x54,0x48,0x1a,0x1d,0x4b,0xfb,0xdc,0xaa,0x90,0xc1,0x47,0x5b,0xbb,0xae,0x45,0x5f,0x90,0x94,0x74,0xae,0x7a,0x9e,0x92,0x9b,0x41,0x8c,0x76,0x70,0xb8,0x0c,0xbd,0xfa,0xa7,0x1e,0xbc,0x41,0x72,0x5c,0x2f,0x53,0x0c,0x00,0x7e,0xbf,0x02,0x80,0x03,0x26,0x65,0x83,0x2a,0xa9,0xa6,0xf7,0x53,0xbc,0x8c,0xc4,0x35,0x9c,0xe3,0x7b,0x7a,0xf9,0xe2,0x65,0x08,0x08,0x38,0xa8,0x4e,0x2f,0x9a,0x46,0xa5,0xa9,0x5d,0x4f,0xc8,0xb4,0x56,0x44,0xe4,0x2b,0x5e,0xfb,0xaa,0x03,0x75,0x0f,0x57,0x8e,0x23,0x50,0x5e,0x68,0x61,0xb5,0x46,0xc0,0x0a,0xab,0xc5,0x1c,0xe7,0x87,0x8f,0xb1,0xbd,0xb7,0x8f,0xe9,0xee,0x0d,0xd9,0xb8,0x9f,0x20,0x86,0x0e,0xeb,0xc5,0x05,0x56,0xf3,0x33,0x99,0x0f,0x64,0xd8,0x2c,0x9e,0x14,0xed,0x62,0x86,0xad,0xbd,0x9b,0x82,0xb9,0x56,0x4d,0x1e,0x93,0x41,0x56,0x06,0x01,0x97,0xea,0x46,0xe4,0xf1,0xfc,0xc1,0x07,0x78,0xfe,0xe0,0x43,0xae,0x97,0xf7,0xa0,0xc8,0x7b,0xdb,0x09,0x7c,0x53,0x7c,0xe5,0xd4,0x1d,0xc2,0x3a,0xe0,0xb3,0x9f,0xff,0x7f,0xf8,0xd5,0x7f,0xf5,0xc7,0x70,0xd2,0xd6,0xc4,0x6b,0x10,0x32,0xe8,0x58,0x60,0xac,0x26,0xd2,0xb3,0xcf,0x3f,0xca,0x82,0xa8,0xe3,0x76,0x85,0xd0,0xf1,0xd5,0x5b,0x66,0x0c,0x43,0xe7,0xe0,0xfd,0x94,0xd5,0x50,0xce,0xe1,0xf9,0xe3,0x4f,0xb1,0xff,0xe6,0x9b,0xdc,0x5e,0x54,0x65,0x00,0x08,0xab,0x15,0xbe,0xf8,0xe8,0x17,0x98,0x9f,0x1f,0x9b,0xb9,0x22,0x7d,0x42,0x01,0x8f,0x3f,0x79,0x0f,0x93,0xed,0x5d,0xec,0xdd,0xbe,0x8d,0xe1,0xe0,0x4a,0x50,0x31,0x21,0x76,0x2d,0x8e,0x9f,0x3f,0x28,0xfa,0x98,0x62,0x0b,0x4c,0xa6,0x80,0x6b,0x84,0xfd,0xc9,0xf3,0x26,0x69,0xdd,0xcd,0x5a,0x8c,0xe8,0x70,0xf0,0xe8,0x2e,0x76,0x76,0xf7,0xb1,0x7b,0xf3,0x36,0xdf,0x03,0xbb,0x5e,0x61,0x76,0x7e,0x88,0x6e,0xbd,0x46,0xd2,0x6d,0xda,0xb6,0x89,0x51,0x84,0x8e,0xea,0x72,0x7e,0x8e,0xdd,0x9b,0xb7,0x93,0xd4,0x24,0x17,0xbf,0xa4,0x5d,0xe5,0xd4,0xcd,0x05,0xb8,0x0e,0x81,0x64,0xdd,0xc2,0x1a,0x7c,0x07,0xf2,0x1a,0xe3,0xaa,0x36,0x82,0xef,0x40,0xf4,0x1e,0xf8,0x0e,0x55,0xb1,0x06,0xed,0xbe,0x8d,0xf3,0x55,0xc1,0xb7,0x4e,0xb5,0x19,0x7c,0xfb,0x85,0xd8,0xa3,0x36,0x14,0x02,0x56,0xb3,0x73,0xdc,0xb8,0x79,0x3b,0xad,0xe9,0xb4,0x4c,0xc8,0xb1,0xb3,0x1f,0x00,0x63,0xf6,0x0a,0x61,0xb5,0xc2,0x6a,0x25,0xc7,0x8b,0x8c,0x5d,0x4b,0x9f,0x57,0xb7,0x28,0xea,0xd0,0xae,0x17,0x38,0x7c,0x70,0x0f,0xaf,0x7d,0xc7,0x30,0xa0,0x23,0x12,0x70,0xec,0x02,0x9e,0x7f,0x76,0x8f,0xb5,0x35,0x20,0xdc,0xba,0xf3,0x1a,0x5e,0xfb,0xfe,0xaf,0x0e,0x78,0x94,0xcd,0x32,0x9b,0x32,0xa5,0x3d,0x41,0xb8,0x1a,0x83,0xf9,0xc9,0x73,0x29,0x4e,0xb6,0xbc,0x40,0xbd,0xa5,0x9e,0x21,0x80,0x2b,0x78,0x7e,0xfc,0x04,0x4f,0x3e,0xf8,0x05,0x5e,0xff,0xd5,0xdf,0x4c,0xeb,0x5d,0x4b,0x52,0xd0,0x3a,0xbe,0x7f,0x0f,0xcf,0x1e,0x7c,0x98,0xf6,0x51,0x62,0x68,0xd9,0xd9,0x85,0x4c,0xec,0xb3,0x83,0x2f,0xb0,0x38,0x3b,0xc6,0x37,0x7f,0xf8,0x7b,0xd8,0xbe,0xb5,0xcf,0x63,0xd5,0x45,0x90,0x13,0x15,0xb4,0x9e,0x28,0xe9,0x42,0xda,0x13,0x0e,0xc4,0xeb,0xe3,0xe2,0xe4,0x0b,0xe5,0x2c,0x52,0x25,0xd3,0xc9,0x48,0x10,0x02,0x02,0xba,0xf5,0x0a,0x31,0xc8,0x6d,0x4a,0x4a,0x98,0x28,0x63,0x87,0x73,0xe0,0x9b,0xdf,0xba,0x39,0x9a,0x66,0x82,0xc9,0x74,0xcb,0x00,0x12,0x83,0x5f,0xbe,0x1c,0x86,0x17,0x65,0x92,0x3a,0x53,0x27,0xb2,0x7a,0x90,0x42,0x44,0xe8,0x5a,0x3e,0x12,0x9b,0xd6,0x69,0xd6,0xca,0xc2,0x54,0xb5,0x5c,0xd5,0xfa,0xc8,0x4e,0xfa,0x62,0xa1,0xa3,0x37,0x19,0x72,0x8d,0x40,0x05,0x56,0xa9,0x16,0x37,0x9a,0xf7,0x55,0xda,0x6a,0xec,0xed,0xef,0x49,0x6a,0xec,0x25,0x1a,0xc5,0x3a,0x02,0x21,0x1a,0x43,0x17,0xa5,0x77,0x96,0xda,0xa1,0x98,0x97,0x06,0x85,0x91,0xf6,0x54,0xf5,0x79,0xe4,0xc5,0x69,0xdd,0x3a,0x66,0x82,0xaf,0x4f,0x64,0x95,0x49,0x07,0x5b,0x80,0xc9,0xe7,0xcf,0x3c,0x62,0x88,0x58,0x9c,0x9f,0x62,0x71,0x7e,0x86,0xe4,0xf7,0x53,0x17,0xbe,0x18,0x73,0x38,0xf5,0x74,0x25,0x68,0x47,0xe4,0xd2,0xe1,0xec,0xc9,0xce,0x2e,0x6f,0xe2,0x2b,0x12,0xda,0xc9,0x01,0x82,0x4b,0x65,0xdb,0xc9,0xa5,0xef,0xd9,0xbd,0xd9,0xba,0x5d,0xf6,0xfa,0x1c,0x8e,0x39,0x49,0x52,0x0b,0x65,0x10,0x66,0x67,0xc7,0x38,0xbc,0x77,0x17,0xaf,0x7c,0xf7,0x87,0x70,0x88,0x49,0x7d,0x5f,0x14,0x69,0xbb,0x5f,0x3f,0x11,0x38,0x7d,0xfc,0x10,0xab,0xd9,0xb9,0x0a,0xf1,0x08,0xa1,0x45,0x28,0xae,0x51,0xa3,0xac,0x71,0x20,0xde,0x06,0x68,0x97,0x11,0x5b,0x3b,0x7b,0xa0,0xd0,0xe1,0xd1,0x07,0x3f,0xc7,0xb7,0x7f,0xf2,0xfb,0xf0,0xcd,0x34,0x15,0xe8,0x88,0x70,0xfa,0xec,0x09,0x0e,0x3e,0xfb,0x08,0x6d,0xb7,0xe2,0x7a,0x46,0xe9,0x6f,0x6f,0x89,0x64,0xc4,0xe3,0xbb,0xef,0xe3,0xfb,0x3f,0xf9,0x03,0x94,0x67,0x71,0xed,0x38,0x9b,0xb6,0x9b,0xe7,0xcf,0x3f,0xbf,0x87,0xae,0x2b,0x8d,0xf5,0xf8,0x38,0x40,0x07,0x3f,0x69,0x04,0x0f,0xd5,0x96,0x1c,0x88,0x1a,0x2f,0xf1,0x43,0x72,0x36,0x1c,0x11,0xb3,0x8b,0x63,0xcc,0x2e,0x8e,0xfb,0x44,0x57,0x19,0x36,0x3b,0x65,0x65,0xfa,0x44,0x33,0x17,0x17,0x17,0xe7,0xd8,0xdd,0xbf,0x65,0x3a,0x56,0xa5,0x19,0x8f,0x4c,0xfe,0x36,0x2c,0x26,0x43,0x55,0xdd,0xf6,0x14,0x6e,0x8f,0xaf,0x54,0x1c,0x8a,0xa3,0x3c,0x5f,0x3c,0x5f,0x02,0x72,0x29,0x86,0xbb,0xb1,0x0d,0xb7,0x6d,0xac,0xba,0x47,0xc0,0x3e,0x1e,0xcf,0xa1,0x67,0xf3,0xdd,0xad,0x5d,0xb8,0x69,0xc3,0xab,0xa8,0xc6,0x68,0x2d,0x0b,0x04,0x3a,0x9c,0xa5,0xba,0xb8,0x3b,0x37,0xcc,0x1d,0xba,0x65,0xfd,0x94,0x58,0x50,0x1b,0x11,0x4f,0xe6,0xd0,0x09,0xdd,0xbc,0x7c,0xb3,0x04,0xf1,0xb2,0xb9,0x00,0x80,0xb8,0xee,0x10,0x4f,0x17,0x65,0xb7,0x0c,0x30,0x19,0x94,0xda,0x93,0x27,0x31,0x01,0xe8,0xba,0x16,0xcb,0xd5,0x1c,0x3b,0x3b,0x52,0x56,0x14,0x06,0xdb,0x33,0x90,0x91,0x5c,0x51,0x9a,0x00,0xda,0xe4,0x3c,0x3b,0x3b,0x4e,0x84,0x3a,0xcd,0x4d,0xbd,0x20,0x25,0x02,0x28,0x67,0x4f,0x11,0x4e,0x9e,0x3d,0xc2,0xee,0xde,0x2d,0xec,0xbf,0x5e,0x9d,0x08,0x30,0x53,0x79,0x7e,0x7a,0x8a,0x07,0xef,0xff,0x0c,0xcb,0xe5,0x3c,0xbd,0x9e,0x5f,0x9c,0xe0,0xec,0xf8,0x19,0xbe,0xf7,0x4f,0xff,0x00,0xcd,0xc4,0xf8,0xd6,0x1e,0xbb,0x10,0xc1,0xf4,0x82,0x6d,0xc2,0xe2,0xf4,0x1c,0xb3,0xf3,0x23,0xe9,0x97,0x08,0xe7,0x3c,0x26,0xd3,0x2d,0x78,0xb9,0x7c,0x24,0x1b,0xca,0xaa,0x54,0x2c,0x5b,0x23,0xf0,0x38,0x3e,0x78,0x88,0xd5,0xf2,0x1c,0x6f,0xfd,0xf0,0xb7,0x31,0xd9,0xdb,0x4b,0x36,0x0a,0xa1,0xed,0xf0,0xec,0xee,0x7b,0x38,0x7b,0xfe,0x45,0xde,0xaa,0x02,0xd0,0x75,0x72,0x27,0xb8,0xa9,0xe3,0x7a,0xb1,0xc0,0xfd,0xf7,0xfe,0x0c,0x6f,0x7c,0xeb,0xd7,0xb1,0xff,0xfa,0x37,0xc4,0xba,0x19,0xd0,0x5b,0x88,0xd0,0xb1,0x73,0x0c,0x04,0x3d,0xb2,0x13,0x10,0x63,0xc4,0xc9,0xb3,0x07,0x20,0xf0,0xa5,0x35,0xaa,0x98,0x22,0xa1,0x6d,0xed,0xba,0x45,0xec,0xf2,0xcd,0x6a,0xe5,0x91,0x24,0xfe,0x63,0xef,0x38,0x20,0x88,0xe1,0x54,0xd7,0xf1,0x85,0x3d,0xbe,0x11,0x3c,0xcc,0x11,0x92,0x96,0xb2,0xb8,0x02,0x4d,0xac,0xb5,0xa3,0x43,0x10,0x27,0x4a,0xb9,0xb3,0x63,0xf9,0x37,0x0f,0x50,0x09,0x8a,0x51,0xfb,0xb5,0x5c,0x0b,0xae,0x9a,0xb3,0x64,0x96,0x8c,0xe6,0xa3,0x0f,0xf2,0x5a,0xd0,0x0b,0xc7,0x7b,0xab,0x05,0xd5,0x03,0x14,0x0f,0xa4,0xf8,0xc9,0x28,0xe8,0x6e,0x04,0x64,0xd7,0xff,0x39,0x72,0x41,0xad,0xc1,0xdd,0xb2,0x2e,0xa9,0x71,0x6a,0x29,0x46,0x86,0x49,0x71,0xc3,0x8c,0x2f,0x01,0xf9,0x4a,0x14,0x8e,0xe6,0x74,0xc5,0x39,0x9f,0xeb,0x90,0xd4,0x9f,0x02,0xbe,0xc9,0xc0,0x41,0x15,0x0b,0x2e,0x45,0x62,0x38,0xe4,0xc2,0xba,0xb6,0x43,0xd3,0xf0,0x4d,0x4c,0x99,0x69,0xc8,0x5c,0xbb,0x2f,0x3a,0x45,0x2e,0x72,0x40,0x8e,0x07,0xb0,0x5f,0x63,0xbe,0xd7,0x34,0xb7,0x8f,0x99,0x04,0x2f,0x1c,0xa0,0xe4,0x26,0xcc,0xc0,0xe3,0x4f,0x7e,0x8e,0x97,0xbf,0xfd,0x1d,0xa8,0xbf,0x66,0x4f,0xba,0xf9,0xcb,0xc0,0x99,0x24,0x01,0xd3,0xe6,0xd8,0x75,0x78,0x76,0xef,0x3d,0x38,0xe7,0x10,0x43,0x87,0x56,0x7c,0x9e,0x96,0x63,0xe6,0x53,0x1b,0x9c,0x6e,0x9c,0x51,0x44,0xbb,0x5e,0x60,0x6b,0xfb,0x06,0x56,0xb3,0x73,0xdc,0xff,0xdb,0xbf,0xc6,0xeb,0xdf,0xfa,0x21,0xa6,0xbb,0xbb,0x58,0xcd,0xe6,0x38,0x7a,0xfa,0x39,0x56,0x17,0x7c,0x07,0x71,0x56,0x83,0xab,0xd1,0x8b,0x1a,0xc6,0x71,0x9b,0xdb,0xe5,0x02,0x4f,0x3e,0xbd,0x8b,0x37,0x7f,0xf0,0xc3,0x3e,0xe8,0xda,0x90,0xc6,0x02,0xa0,0xb6,0xc3,0xd1,0x93,0xcf,0xab,0xe8,0x3e,0x55,0x35,0xc6,0x8e,0x55,0x94,0x26,0xa1,0x35,0x1b,0x08,0x81,0xf2,0x5e,0x7b,0xa1,0x1e,0xb0,0x8c,0x9b,0xfc,0x75,0x72,0xf9,0xb6,0xd1,0x48,0x02,0x28,0x7c,0xb2,0x02,0x84,0xd5,0x62,0x86,0xed,0xdd,0x1b,0x1b,0x1a,0xa0,0xd9,0xd7,0x8b,0xa1,0x5c,0x60,0xd3,0xdf,0xfd,0x36,0xb6,0xff,0xab,0x5f,0xc7,0x65,0x61,0xfe,0x6f,0xfe,0x1c,0xdd,0xdd,0x03,0x00,0xc0,0xce,0x1f,0xfd,0x3a,0xa6,0xbf,0xfb,0x9d,0x4b,0xd3,0x5c,0xfc,0xcf,0xff,0x8e,0x41,0x18,0xc0,0xee,0x7f,0xf3,0x7b,0x98,0x7c,0xff,0x72,0x5f,0xd0,0xc7,0xff,0xe3,0xbf,0x4d,0xeb,0xfc,0xf6,0xff,0xf0,0xaf,0xe1,0x5f,0xda,0xdb,0x9c,0xe4,0xc9,0x29,0x8e,0xfe,0x97,0x7f,0x07,0x00,0x70,0x93,0x06,0x2f,0xff,0x4f,0x7f,0x7c,0x69,0xbd,0x56,0xbf,0x78,0x80,0xe3,0xff,0xed,0xdf,0xa3,0xe6,0xf8,0x69,0x90,0xf8,0x94,0xa3,0xae,0xab,0xaa,0x5d,0x2c,0x31,0x99,0xee,0x60,0x32,0x99,0xc2,0xc9,0x36,0x94,0x83,0xaa,0xa5,0x25,0x7d,0x45,0x5b,0x08,0x84,0xd9,0xf9,0xa9,0x40,0x81,0xee,0x97,0x6a,0xbe,0x3c,0xd0,0xfc,0xd3,0x12,0x11,0xcd,0xa3,0x41,0x04,0xf0,0xf0,0xee,0xbb,0xf8,0xa6,0xfb,0x6d,0xec,0xbf,0x96,0xfb,0x52,0x41,0xe5,0xf8,0xe1,0x43,0x7c,0x71,0xff,0x1d,0xc4,0xc0,0x47,0x23,0xa1,0x39,0x12,0x30,0xbf,0x38,0xc5,0xbd,0x9f,0xff,0x07,0x7c,0xef,0x77,0xfe,0x05,0xfc,0xc4,0x21,0x73,0x74,0x03,0xc4,0xd2,0x95,0xad,0x56,0x5c,0x38,0x3f,0x78,0x0a,0xb6,0x6f,0x11,0xe6,0x96,0x80,0x76,0xbd,0x86,0x6f,0x5a,0x4c,0x27,0x3b,0xec,0x4c,0x24,0x52,0x6e,0x1b,0x1a,0x16,0x4e,0xc4,0x85,0xed,0xfc,0xfc,0x1c,0x77,0xff,0xee,0x2f,0x70,0xe3,0xf6,0x1d,0xec,0xde,0xb8,0x8d,0xd0,0xb6,0x38,0x3b,0x7a,0x8c,0x2e,0x1d,0x29,0xcd,0x8b,0x8e,0xe4,0x22,0x72,0xb5,0xac,0x4e,0x7e,0xa0,0x43,0xc4,0xe3,0x7b,0xef,0xe2,0xe2,0xe4,0x29,0x5e,0xfb,0xe6,0x8f,0xe1,0xfd,0x04,0xea,0xaf,0xc1,0x19,0xff,0x0f,0x10,0x6b,0xe5,0x8b,0xe3,0x27,0x68,0x97,0x4b,0xb0,0xfe,0x69,0x22,0xe4,0x4b,0xfc,0x28,0x87,0x4e,0x9c,0x69,0x68,0xd9,0xa2,0xc2,0xd5,0x75,0x23,0x0c,0xb1,0x53,0x8f,0x5e,0x32,0x4e,0x6a,0x00,0xd6,0xad,0xd7,0x7c,0x51,0x4e,0x33,0x81,0x6b,0x9a,0xbc,0xde,0x62,0x1e,0x49,0x40,0xcf,0x25,0x03,0x6a,0x6d,0x1d,0xdb,0x72,0x9b,0x49,0xf6,0xde,0xca,0x31,0x48,0x02,0xb1,0x1d,0x23,0x2a,0xea,0x6a,0x1f,0xd9,0xf1,0x32,0x37,0xa1,0xf6,0x07,0xb6,0xc7,0x68,0x5f,0x22,0xc1,0x8e,0x90,0x8f,0x49,0xca,0x6f,0x30,0xd6,0xa6,0x3c,0x4a,0xa2,0x57,0xfe,0x8a,0x69,0xf2,0x91,0xea,0x1d,0x00,0x24,0x95,0xe3,0xa0,0x2b,0xc5,0x4c,0x4c,0x19,0x63,0x25,0x1f,0x93,0x8e,0x63,0x95,0xcf,0x92,0xd5,0x75,0x52,0x3d,0x70,0x2c,0xe5,0x20,0xd9,0xd9,0xa6,0xe5,0x27,0x15,0xdc,0xc9,0xc4,0xcb,0x44,0xbd,0x5d,0x2e,0x31,0xbd,0xe1,0xc5,0x2f,0xad,0x80,0xb4,0x48,0x99,0x11,0x39,0x1d,0xd7,0x20,0xc8,0x64,0xe0,0x1e,0x08,0x31,0xb0,0x1b,0x34,0xdb,0x1e,0xc7,0xed,0x27,0x08,0xf8,0x7a,0x3b,0xcc,0x84,0x76,0x39,0xc3,0xe1,0xfd,0x7b,0x78,0xe5,0x7b,0xdf,0x07,0x10,0xf3,0x76,0x84,0x48,0xf6,0x6a,0x08,0x96,0xd4,0xd3,0x11,0x78,0xf2,0xf1,0xbb,0x58,0x2e,0xce,0xd1,0x85,0x60,0xaa,0x23,0xb2,0x79,0xad,0x7a,0x75,0x3e,0xf9,0xbc,0x06,0x98,0x51,0x6b,0xe3,0x1a,0xd3,0x66,0x1b,0xeb,0xe5,0x0c,0x0f,0x3f,0xfe,0x79,0x66,0x31,0xbc,0x43,0x4f,0xbf,0xa6,0x2a,0x5a,0x3b,0x4c,0x0e,0x08,0xed,0x1a,0x07,0x8f,0x7e,0x89,0x3b,0x6f,0xbf,0x85,0xed,0x1b,0x37,0xb1,0x39,0x30,0xa7,0x74,0xf0,0xf0,0x3e,0xba,0xd8,0x56,0xcc,0x15,0x8f,0x1b,0xf7,0x60,0x44,0xd7,0xad,0xe0,0xfc,0x16,0x5c,0xe3,0xd2,0x31,0x3a,0xbe,0xe4,0x83,0xca,0x76,0x41,0x3b,0xaa,0x0c,0x69,0x89,0x45,0xc0,0xa1,0x03,0x04,0x84,0x95,0x47,0xb2,0x47,0xbd,0x01,0xb0,0xba,0x6c,0xb5,0xc0,0x74,0x67,0x07,0x7c,0xfe,0x5d,0xae,0x22,0x84,0x33,0xcc,0x5e,0xcd,0x3d,0x0e,0x16,0x7d,0xbd,0xf0,0x65,0xd3,0x7f,0x2d,0x05,0x0c,0xb4,0xf3,0x3a,0xe5,0x50,0x3f,0x69,0x96,0x06,0x5c,0xc6,0x52,0x5d,0x7f,0xc4,0x12,0xd6,0x7c,0x76,0x82,0x5b,0xb7,0x5f,0x2b,0xd2,0xa6,0xd5,0x2c,0x28,0x1c,0x88,0xa0,0xb6,0x67,0xeb,0xc5,0x05,0x22,0x55,0xf3,0xc8,0x27,0xa1,0xa2,0x0c,0x16,0x40,0xb5,0xd8,0x10,0x10,0x62,0xc0,0xe7,0x1f,0xff,0x1d,0x5e,0x3e,0xfe,0x06,0x5e,0x7a,0xeb,0x57,0x30,0xdd,0xdb,0xc3,0xea,0xec,0x0c,0x87,0x5f,0xdc,0xc7,0xd9,0xc9,0xb3,0x42,0x63,0xa9,0xdb,0x5d,0xbc,0x86,0x3d,0xe6,0x17,0xa7,0x78,0xf4,0xe1,0xdf,0xe1,0x57,0x7e,0xf3,0x77,0x52,0xfd,0x52,0x84,0x5a,0x70,0xb0,0xf9,0xc8,0xdc,0x9d,0x9d,0x1d,0x0e,0xf6,0x53,0x08,0x04,0x8a,0x6c,0xb1,0xec,0xf4,0xe8,0x55,0x3a,0x63,0x0a,0x91,0xf0,0x73,0x3b,0x2e,0x4e,0x0e,0x71,0x71,0xf2,0x1c,0x59,0x2d,0xec,0xb8,0x90,0x86,0x99,0x85,0xd8,0xc9,0x59,0x5f,0xa5,0x39,0x9a,0x54,0x6f,0x71,0x8b,0xec,0x33,0x7b,0x71,0x7e,0x8c,0x3b,0x6f,0x7d,0x07,0x37,0x5e,0x7a,0x43,0xf0,0x2b,0x42,0x2f,0xd6,0xe1,0x23,0xa1,0x6b,0x9c,0x1f,0x7e,0x91,0xea,0x09,0x74,0xe8,0xf4,0x1a,0xc2,0x02,0xf0,0xf2,0x38,0xab,0x25,0x34,0xa9,0xa3,0x7e,0xd9,0xa3,0xe5,0x9b,0xc7,0x22,0xb2,0x41,0x15,0xe7,0x13,0x42,0x87,0x10,0x3a,0x38,0xdf,0x60,0x32,0x69,0x64,0xdc,0x34,0x3f,0x6e,0x07,0xd3,0x08,0x02,0x22,0x21,0x74,0x6b,0x10,0xac,0x55,0x73,0xec,0x8f,0x3d,0x62,0x1e,0x0f,0xaf,0xaa,0xed,0x4c,0x7b,0xf3,0xdc,0x44,0x12,0xe6,0xc8,0x0e,0x9a,0x60,0x57,0x89,0xad,0x54,0xa5,0xcf,0xed,0xbe,0x16,0x81,0x90,0xe8,0x93,0x72,0xef,0x75,0xdc,0xba,0x32,0x47,0xd2,0x9a,0x5e,0x63,0x95,0xa6,0xbd,0x0a,0x0b,0x92,0x30,0x93,0xb7,0x14,0xe1,0xf5,0x2e,0xe2,0x14,0x29,0xf9,0x67,0xb6,0xd2,0x6f,0xcc,0xd4,0x34,0xf5,0x29,0x4b,0xc2,0xce,0x74,0x52,0x5d,0x24,0x3f,0x73,0x59,0xdb,0xa8,0x52,0xae,0x98,0xe7,0x93,0x63,0x75,0xad,0x87,0xe7,0xfb,0x82,0x01,0x2e,0x47,0x91,0xd1,0x2b,0xf8,0x96,0x83,0x19,0x03,0xa1,0x5b,0x5b,0x97,0x77,0xa6,0xbf,0x12,0x2e,0x9a,0xfa,0xc4,0x2c,0x65,0x1e,0x3e,0xf8,0x10,0xaf,0x7c,0xe7,0xfb,0x00,0x48,0xbc,0xdd,0x10,0x40,0x72,0x53,0x93,0x32,0x0a,0xc2,0xfd,0x9e,0x1f,0x3c,0xc3,0xb3,0xfb,0x1f,0xe6,0x21,0x53,0xf0,0xd5,0xf1,0x2f,0x58,0x38,0xed,0x4f,0xae,0x53,0x3a,0xdd,0xd5,0xb6,0x20,0xbf,0x25,0xf7,0xa6,0x2a,0xf8,0xa2,0x17,0x5c,0xf5,0xd0,0x69,0xbc,0x08,0x04,0xb9,0x4b,0xf7,0xc9,0xc7,0xef,0xe3,0xdb,0x3f,0xf9,0xbd,0x7e,0xe2,0x22,0x30,0x97,0x7b,0xf8,0xf8,0x7e,0x2d,0xd7,0x4a,0xc6,0x95,0x8a,0x31,0x76,0x7d,0x2d,0x52,0xd1,0xa0,0x32,0xef,0xde,0x73,0x9f,0xdf,0x78,0xa0,0xb0,0xe3,0x2b,0x18,0x09,0xe9,0xc4,0xd0,0xad,0x81,0x35,0x61,0x3a,0xdd,0x85,0x77,0xa2,0xed,0x73,0x79,0x6c,0xed,0x1f,0xfe,0x5e,0x82,0xce,0xd7,0x8e,0xa6,0x2f,0x88,0xa5,0x2f,0x54,0xab,0x6b,0xa6,0xeb,0xd1,0x25,0x4b,0x96,0x8a,0xbe,0x89,0xe2,0x5f,0xc6,0xd2,0x0e,0x21,0xaa,0x21,0xf0,0x9e,0xfc,0xfe,0xed,0xc4,0xe0,0x21,0x01,0x75,0x66,0x0a,0x75,0xa4,0x2f,0x4e,0x8e,0x4d,0x0d,0x14,0xa8,0x20,0x56,0xd5,0x65,0xed,0x95,0xb1,0xe3,0xa0,0x13,0x21,0x24,0xdb,0x89,0xa3,0x83,0x47,0x38,0x3a,0x78,0x04,0x3d,0x9a,0x93,0x82,0x99,0x92,0xe9,0x9c,0xba,0x51,0x77,0x1e,0x3f,0x7d,0x84,0x1b,0xfb,0xaf,0xe0,0xe5,0x6f,0x7f,0x1b,0x05,0xb3,0xcd,0x4d,0x1d,0x0f,0x11,0x58,0x9c,0x1d,0xa7,0x75,0xa0,0x75,0x4b,0x4b,0x95,0x08,0xdd,0x72,0x89,0xc9,0xce,0x4e,0x5a,0x6f,0x2e,0x2a,0xf4,0x44,0xb9,0x06,0x55,0xd2,0x45,0x52,0xae,0x40,0x2b,0x5a,0x00,0x62,0x88,0x6d,0x92,0x47,0xad,0xc1,0xa4,0xba,0x56,0xd4,0x3d,0xf9,0x6e,0xbd,0xc6,0xc1,0x83,0x5f,0xe2,0xf8,0xf1,0x3d,0xec,0xed,0xdf,0xc1,0xf6,0xce,0x3e,0xfc,0x64,0x8a,0x18,0x3a,0xac,0x16,0x67,0xb8,0x38,0x3a,0x10,0xc1,0x22,0x26,0x93,0x9c,0x12,0x93,0x28,0x73,0xb8,0x3a,0xa6,0x42,0x2f,0x59,0x08,0xcb,0x9b,0xf4,0x6a,0xed,0xac,0x66,0x4e,0xe5,0x1c,0xe1,0xf3,0xc6,0xeb,0x75,0xc7,0xa3,0xea,0x79,0x12,0xa8,0xd6,0x30,0x92,0xba,0xaa,0xe4,0x63,0x53,0x99,0xe3,0x12,0x70,0x4f,0x39,0x45,0x43,0xf7,0x75,0x4c,0x74,0x62,0x0f,0x80,0x24,0xd9,0x9f,0xb1,0x7a,0x57,0xaf,0x7f,0x13,0xb9,0xc7,0x45,0x6d,0x58,0x39,0xbd,0x57,0x5c,0xce,0x84,0x8a,0xce,0x8b,0x23,0x09,0xec,0xf5,0x79,0x55,0x4e,0x09,0x3b,0xcb,0x61,0x49,0xdf,0xac,0x79,0x2f,0x01,0xa5,0x55,0x9a,0x9e,0xb9,0x35,0x93,0x03,0xc2,0x35,0xd9,0x0d,0x72,0xc7,0x54,0x91,0x05,0x12,0x91,0x98,0x06,0xf2,0xd2,0x91,0xd7,0x05,0x93,0x8a,0x96,0xc9,0x40,0xca,0x55,0x0a,0x08,0x3b,0x08,0x86,0xdb,0x0b,0x46,0x11,0x11,0xd6,0x2b,0x34,0x37,0xa6,0x22,0x54,0x7b,0x33,0x51,0xf2,0x04,0xd3,0x93,0x5d,0x1e,0xcc,0xb9,0x76,0xeb,0x79,0x29,0x84,0x8b,0xc5,0x6e,0xe2,0x2f,0x10,0x01,0x3d,0x60,0xaf,0x1a,0x73,0xc9,0x6b,0x7e,0x76,0x84,0xf9,0xb3,0x67,0xd8,0x7b,0xfd,0x75,0xd3,0x1e,0xbe,0x18,0xdb,0x79,0x0f,0x22,0x82,0x77,0x40,0xb7,0x5a,0xe1,0xf3,0x77,0xfe,0x32,0x4f,0x68,0x3d,0xa7,0xa1,0x3c,0x45,0x2d,0xfd,0x26,0x1e,0xc0,0x17,0xbc,0x0b,0x08,0xe8,0xda,0x35,0xa6,0x5b,0xdb,0x25,0xa3,0x83,0x12,0x74,0x7b,0xf3,0x4b,0xfa,0xb2,0x6d,0x97,0xe9,0xed,0xe9,0xf1,0x01,0xce,0x0f,0x0e,0xfa,0xfb,0x69,0x29,0x70,0xbe,0xcf,0xee,0x7d,0xc8,0xfb,0x4a,0xc9,0x88,0xce,0x66,0x2c,0x1d,0xe7,0xfa,0xe9,0x2e,0x0d,0x97,0x18,0xeb,0x20,0x12,0xbc,0x77,0x50,0x67,0x24,0x32,0xc1,0x60,0xe7,0xba,0x03,0xef,0x67,0x76,0x71,0x89,0xc6,0x6f,0xc1,0xc5,0xaa,0x7e,0x36,0x8c,0x19,0x47,0x5d,0x1b,0xb5,0xae,0x0f,0x8f,0x2f,0x04,0x8c,0x5f,0x57,0x01,0x03,0xd1,0x87,0x55,0xcf,0xfa,0x93,0xe7,0x29,0x3b,0xed,0x71,0x72,0x5c,0x2f,0x47,0x5a,0x2d,0x57,0xd8,0xda,0xee,0x58,0xfa,0x83,0xee,0xc2,0xab,0xbf,0x68,0x40,0x3d,0x75,0xaf,0x57,0x4b,0x2c,0x97,0xb3,0xac,0xb5,0xd1,0x50,0xcd,0xe3,0x7a,0xfe,0xa4,0x0d,0x0b,0x62,0x06,0xaf,0xb7,0x44,0x9c,0x97,0x29,0x92,0x69,0x8a,0x59,0x8a,0xe8,0xa1,0xaa,0xf3,0x78,0x7c,0xef,0x03,0xec,0xdd,0xb9,0x83,0x9d,0xfd,0x5b,0x9b,0x89,0x6f,0xcc,0x7f,0xda,0xf5,0x02,0xeb,0x76,0x95,0x0c,0x3a,0x87,0x48,0x6e,0x04,0xa1,0x5d,0xae,0x30,0xd9,0xda,0x86,0x2b,0xde,0xe8,0x3a,0xb6,0x9a,0x2f,0x6d,0x94,0xe4,0xa7,0x84,0x37,0x82,0x25,0x3e,0x27,0xf7,0xd9,0xc2,0x3a,0xce,0x70,0x29,0x5f,0x02,0xc0,0x77,0xad,0x13,0xda,0xf5,0x1a,0xa7,0x87,0x4f,0x01,0x7a,0x2c,0xe0,0x46,0x50,0xe0,0xaf,0x38,0x92,0x01,0xec,0x31,0x4f,0x74,0x1f,0xd8,0x5a,0x26,0x1b,0x70,0x23,0xad,0x8b,0xd6,0x33,0x45,0x50,0xda,0x2c,0x3b,0xb4,0x31,0x22,0x39,0xbf,0xe0,0x81,0x33,0xc0,0x62,0xc6,0xa9,0x18,0x28,0x9f,0x9d,0x2e,0x05,0xca,0x0b,0x99,0x4c,0x7b,0xb5,0x17,0x12,0x26,0x47,0x13,0x85,0x2a,0xcc,0xea,0x1b,0x1b,0x96,0x0d,0x1f,0xee,0x94,0xc4,0x08,0x8c,0x06,0x8e,0x2f,0xb7,0x21,0x01,0x7a,0x49,0x32,0x89,0xd5,0x99,0xfd,0xc7,0x53,0xc2,0xdc,0xfc,0x40,0xb1,0xf8,0x24,0x4e,0x44,0x0c,0x02,0x00,0xcd,0x0b,0xf9,0xaf,0x1c,0x60,0x2e,0xca,0xd0,0x3d,0x01,0x49,0xaf,0x06,0xd9,0x64,0xd3,0xeb,0x77,0xf0,0x41,0x6a,0x2e,0x2e,0xe6,0xe2,0x00,0x90,0xde,0xe9,0x68,0x79,0x00,0x53,0x4e,0x2a,0x20,0x19,0x27,0xe4,0x69,0xad,0x13,0x21,0xb5,0x96,0x04,0x50,0x57,0xac,0x4a,0x76,0xec,0xa6,0x25,0xf7,0x5b,0x20,0xd8,0x26,0x77,0x5d,0x87,0x76,0x31,0x17,0xc3,0x20,0xa4,0xfa,0xf5,0x87,0xca,0xe7,0x0a,0x6b,0xb9,0xd0,0xc9,0xe8,0xf0,0xf8,0xfe,0x3b,0x72,0x66,0x2e,0xc2,0x16,0x40,0x88,0x72,0xf1,0x05,0xe1,0xfe,0xcf,0xfe,0x14,0xeb,0xe5,0x9c,0xf3,0x4a,0x88,0x4a,0xfa,0x8b,0x05,0x01,0x16,0x06,0xe4,0x56,0x21,0xa3,0xb7,0x8e,0x79,0x3e,0x10,0xc4,0x68,0x2b,0x15,0x35,0xca,0x5e,0xa5,0x76,0xa6,0xe6,0x77,0x2d,0x62,0x34,0xbd,0x4a,0xc0,0xc3,0x8f,0xdf,0xcd,0x97,0x99,0x17,0x81,0xf3,0x3d,0x7f,0xfa,0x04,0xc7,0x07,0x8f,0x61,0xb9,0x73,0xbe,0x39,0xc5,0x9b,0x8f,0x99,0x46,0x00,0xc8,0x53,0x56,0x17,0xd7,0xfd,0x68,0x3f,0xda,0x06,0xf5,0xe2,0x13,0xb5,0xa1,0xfc,0xd1,0x79,0x2b,0x8e,0x5d,0x91,0x56,0xfd,0x40,0x55,0x43,0xe8,0xb0,0x6a,0x17,0xe8,0xe2,0x4a,0x7c,0x88,0xd7,0x7b,0x4c,0x55,0xc7,0xe8,0x97,0x17,0x45,0xc6,0xeb,0xa2,0xe4,0x75,0xb4,0x4e,0x2f,0x58,0x08,0x99,0xff,0xaf,0x93,0xa8,0xbf,0x0f,0x3c,0x9c,0x8f,0x1d,0xe7,0x32,0x44,0xcc,0x2e,0x0e,0x61,0x8f,0xbc,0xf1,0x38,0x19,0x58,0x22,0xe0,0xec,0xe8,0x19,0x5f,0xc0,0x9e,0xde,0x24,0x51,0xb9,0xca,0x4d,0x52,0xeb,0x9a,0x70,0xfc,0x3d,0xb8,0x50,0xcc,0xbb,0x24,0x6d,0x6b,0x86,0x34,0x50,0x3f,0x39,0xf6,0x44,0xa2,0xf7,0xd2,0x79,0xdf,0x85,0x16,0x9f,0xbd,0xfb,0x33,0x74,0xa1,0x2b,0x89,0xb6,0x54,0x20,0x4d,0x49,0xc7,0xf7,0xfa,0x10,0x22,0xe6,0xc7,0xc7,0x52,0x14,0x5f,0xbb,0x6a,0xe7,0xbc,0xad,0x38,0xc5,0x8e,0xbd,0x06,0xa6,0xfe,0x22,0x90,0xcc,0xe1,0xc4,0x24,0x17,0x95,0x74,0x48,0x5e,0xc4,0x54,0x29,0x10,0xf4,0x7a,0x3f,0x43,0x6f,0xa2,0xe6,0xa5,0x7e,0xb3,0xcd,0xd8,0x15,0x15,0x29,0x47,0x90,0xe9,0x6f,0x49,0x33,0x93,0xdb,0xca,0x24,0x80,0x5b,0x04,0xaa,0xac,0xba,0x13,0x7d,0x27,0xa4,0xfb,0xb4,0x0d,0x15,0x4c,0x65,0xe6,0x9b,0x7c,0x4c,0x5c,0x4a,0x64,0x9b,0x7f,0xf2,0xe9,0x13,0x1d,0x87,0x5c,0x3f,0x62,0x8c,0x40,0x34,0x18,0x03,0x83,0x69,0xc8,0xda,0xfa,0x84,0x1d,0x31,0x95,0x53,0x62,0x15,0xd2,0xef,0x94,0x28,0x03,0x94,0xfc,0x2c,0x71,0x90,0xb4,0x1e,0x89,0xf6,0x54,0xff,0xa8,0x2a,0x87,0x67,0x14,0x61,0xf3,0x07,0xe5,0xf7,0xb4,0x28,0xf8,0xa3,0x77,0x55,0x16,0xa8,0x94,0x06,0x72,0x73,0xbe,0xec,0xfb,0x98,0xd3,0x92,0x7a,0x0b,0x29,0x26,0x55,0x1e,0x18,0x67,0xd2,0x3a,0xcb,0x91,0x6a,0xf9,0x00,0xef,0xd5,0x44,0xfd,0x6d,0xdf,0xd7,0x54,0x2f,0xb7,0xc1,0x45,0x32,0xea,0x09,0x0e,0x0e,0x7c,0x23,0x49,0x7a,0x28,0x20,0xcc,0x1d,0xeb,0x52,0x16,0x14,0x5a,0x74,0x8b,0x39,0x33,0x21,0xa6,0xba,0x83,0x3c,0x78,0xb5,0x57,0x52,0xba,0x9f,0x24,0x9c,0x3d,0x7f,0x8c,0xe5,0xe9,0xa1,0x9c,0x6b,0x95,0x49,0x00,0xbe,0xad,0x29,0x82,0xf0,0xd9,0xdf,0xfd,0x05,0x2e,0x4e,0x9e,0x49,0xfc,0x98,0xf2,0xf3,0x86,0x7a,0xf0,0xdc,0x75,0xf0,0x68,0xb2,0x29,0x0a,0x71,0x2c,0x98,0x3f,0x1a,0x62,0xb7,0x2e,0xd4,0x76,0x0e,0xbe,0xa8,0x73,0x92,0x44,0x14,0xeb,0x42,0x90,0x33,0x77,0x1a,0x43,0x0c,0xb2,0x56,0x73,0x3c,0xfe,0xe8,0x3d,0x0c,0x85,0xd5,0x7c,0x8e,0x87,0x9f,0xbe,0xcf,0x19,0xb8,0x9a,0x50,0x96,0x40,0xc8,0x74,0x43,0xfe,0x45,0xe3,0xb6,0xd3,0xe7,0xe4,0xce,0x47,0xf9,0x2b,0x9f,0xc6,0xa7,0x0f,0xf4,0x93,0x3c,0xd9,0xf0,0x07,0xc4,0x97,0xbf,0x3b,0xe7,0xc4,0xd3,0x52,0x63,0xea,0xe3,0x33,0xe1,0x92,0xad,0x86,0xd8,0xb2,0xd7,0xb6,0xd8,0x85,0x72,0x3e,0xf6,0x00,0xf0,0x45,0x00,0x51,0xd2,0x5d,0x17,0xe3,0x5e,0x10,0x7c,0x5f,0x94,0x37,0xf8,0x32,0x89,0x4a,0xb5,0x62,0x19,0x45,0xbd,0x95,0xf5,0x3e,0x0e,0xa0,0x48,0x58,0x5e,0x9c,0xca,0x18,0xc9,0xd8,0xf8,0xfc,0xb7,0x6d,0x17,0x58,0xad,0x66,0x48,0x7e,0xe1,0xe1,0x44,0x32,0x8e,0x79,0xde,0x4a,0x86,0xca,0xa2,0x39,0x62,0xe9,0x59,0x25,0x68,0x3e,0x0f,0xab,0xa1,0x96,0x6a,0xc1,0x73,0x07,0x13,0x59,0x0b,0x72,0x4b,0x93,0xdc,0x8e,0x53,0xd7,0x17,0xf0,0x58,0x2e,0xe6,0x78,0xf4,0xfe,0x2f,0x12,0x0d,0x49,0x64,0x4a,0x88,0x99,0x12,0x5e,0x85,0xba,0xf9,0xe9,0xb1,0x14,0xa5,0xcf,0xaa,0x35,0x91,0x6c,0x14,0xf8,0x7e,0xf5,0xb0,0x9e,0x0b,0x21,0xf1,0x00,0xd4,0x09,0x47,0x34,0x75,0xd0,0x0e,0x56,0xba,0xc6,0x75,0x8d,0xa1,0x4d,0xdb,0x5e,0x2e,0x69,0x80,0x4d,0x3f,0x99,0x51,0x71,0xd1,0xfc,0xae,0x40,0xb8,0x47,0xcb,0x6a,0x52,0x6a,0xee,0x7d,0x77,0x91,0x25,0xe9,0xa4,0x61,0xa2,0x31,0x7d,0x04,0xc0,0xb7,0x0c,0xd9,0xc2,0x8a,0x82,0x0d,0xde,0x00,0x89,0xde,0x45,0xe4,0xe3,0xa7,0x49,0xba,0xce,0x6d,0x56,0x5a,0xef,0xa8,0xce,0x37,0x7f,0x65,0x05,0x58,0xe2,0xda,0x05,0x57,0xb4,0xbc,0x81,0x4f,0x42,0x6a,0xfb,0xd1,0xb4,0xa8,0x5e,0xc4,0x2a,0xaf,0x0d,0xf9,0xca,0x67,0xd3,0xa6,0x6f,0xd1,0xcf,0x97,0x7f,0x06,0xb8,0xb9,0xa2,0xeb,0x5d,0x6f,0x34,0xc8,0x39,0x13,0x5f,0xd4,0x06,0x83,0xe5,0x3a,0x24,0xae,0xad,0x96,0x94,0xec,0xc7,0x99,0xe3,0x49,0x56,0x95,0xea,0x9c,0xe4,0x21,0x53,0xca,0x38,0x3f,0x27,0xf0,0x99,0x43,0x72,0x94,0xea,0x41,0x8e,0xd7,0x5c,0xbb,0x5c,0x9b,0xb6,0x65,0x6b,0x69,0x00,0x08,0xdd,0x12,0xed,0x62,0xc9,0xf9,0x39,0xd3,0x3e,0x9f,0xdb,0x43,0xb6,0x8d,0xe6,0xac,0x23,0xb4,0x4c,0x03,0x7d,0x70,0xc0,0x83,0x0f,0x7f,0xca,0x37,0x51,0xc5,0xc0,0x83,0x1c,0x58,0x15,0xf5,0xd9,0x4f,0xff,0x3d,0x8e,0x0f,0x1e,0x82,0xac,0x1a,0x55,0xce,0xba,0x32,0x77,0xef,0x10,0xe1,0x01,0x27,0xc7,0x78,0xd2,0xfe,0xf8,0x24,0xa9,0x9f,0x73,0xd5,0x85,0xb0,0x78,0x9f,0x6e,0x38,0x71,0x68,0x52,0xdb,0x9c,0xc9,0x3e,0x19,0xb6,0x44,0xf6,0x4e,0xd5,0x76,0x1d,0x83,0x97,0x5e,0xf9,0x26,0x52,0x05,0x01,0x38,0x7e,0xfe,0x08,0xcf,0xef,0xdf,0x87,0x5d,0x6a,0xcb,0xf3,0x0b,0xdc,0x7f,0xe7,0x6f,0xd0,0x75,0x2b,0xd3,0x8f,0x5e,0xda,0xa1,0x1f,0x97,0x8c,0xbf,0xc8,0x8b,0xcf,0x6c,0x6f,0xc0,0xb4,0xc9,0xd2,0x6e,0x4e,0x3f,0x38,0x49,0x8a,0xc9,0x57,0x3e,0x62,0xa7,0x24,0x69,0x4d,0x5b,0x2a,0xea,0x1c,0xd0,0xd8,0xf2,0x1d,0xa8,0xe1,0x67,0x64,0x19,0x86,0xaf,0x42,0xf5,0xfc,0x62,0x09,0x5e,0x18,0xe6,0xaf,0x93,0x78,0x18,0x2e,0xaf,0x9a,0xb6,0xee,0x1b,0x1a,0xf8,0xc9,0xfd,0x49,0x5e,0x3e,0xaa,0xf5,0x30,0x73,0x88,0x00,0x2c,0x97,0x73,0x2c,0xe6,0x67,0xbd,0x32,0x42,0x24,0x9c,0x1c,0x3c,0x4d,0x84,0x96,0x2f,0x85,0xd7,0x35,0xcc,0xf3,0xc2,0x39,0x33,0xd1,0x1d,0xb2,0x51,0xa1,0x8c,0x73,0x10,0x2a,0x92,0x7c,0x4b,0xcb,0x1c,0x24,0x34,0x66,0x6e,0x79,0x90,0x8b,0x45,0xdd,0xd0,0xf8,0x24,0x05,0xeb,0x51,0x27,0x3b,0x8f,0x4e,0x9e,0x3f,0xc6,0xc1,0x83,0xcf,0x19,0x0a,0x88,0xf2,0xed,0x42,0xc8,0x57,0xd5,0xb1,0x45,0x31,0x61,0x71,0x71,0x92,0xdd,0x1c,0x36,0x4e,0x18,0xc9,0x62,0x81,0x2a,0xd6,0x02,0xce,0x23,0x76,0x0e,0x61,0xb9,0x62,0xa0,0x93,0x97,0x84,0x26,0xf5,0x5f,0xee,0xe8,0xac,0x75,0x23,0xc7,0xfd,0x45,0x60,0x1a,0x41,0x96,0x26,0x79,0xee,0x97,0x82,0xb6,0x26,0x5f,0xdb,0x10,0xf9,0xc2,0x0b,0xad,0x75,0x39,0x9d,0xd6,0x2b,0xd1,0x3a,0xdd,0x47,0x33,0xf4,0x4f,0x77,0x01,0xc5,0x90,0x31,0xad,0xf9,0x3c,0x54,0x52,0x3f,0x4a,0xf4,0x2f,0x0d,0x56,0x2c,0x69,0x74,0x69,0xf8,0x6e,0xb0,0xc5,0x95,0x38,0x63,0xe9,0x01,0xcf,0x23,0x83,0x15,0xc5,0x4c,0xd4,0x10,0xab,0xfc,0x5c,0x9e,0x2f,0xe9,0x6f,0x9f,0x6d,0xd8,0x84,0x75,0x63,0x9f,0xab,0x84,0x49,0xce,0xde,0x84,0x2b,0xa6,0x76,0xc5,0x46,0x99,0xd9,0x53,0x4b,0xa3,0x55,0x65,0x96,0xbe,0xba,0x81,0x42,0x24,0xbd,0xde,0x60,0x61,0xf6,0x04,0x0b,0xa3,0x2a,0xb5,0xaa,0x8b,0x0e,0x7c,0xe1,0x00,0x03,0xb7,0x53,0xb3,0x7e,0x6b,0x2e,0x9c,0x8a,0x30,0xfb,0x8b,0xc5,0x76,0x86,0x3c,0xb4,0x46,0x5f,0x52,0xbe,0x73,0x1e,0x31,0xac,0xd1,0x2e,0x03,0x9a,0xc9,0x36,0x7c,0xe3,0x45,0xb8,0x8e,0x08,0x41,0xa4,0x40,0xe7,0x72,0x39,0xba,0x1f,0x1b,0x75,0x41,0x45,0x91,0xb4,0x08,0x80,0x33,0x7b,0xd6,0x03,0x7b,0x9d,0x62,0xa5,0xb8,0x38,0x3b,0xc1,0xfd,0xbf,0xfd,0x53,0xbc,0xf5,0x83,0x7f,0x02,0x37,0x99,0x62,0x76,0xf4,0x14,0x07,0x0f,0x3e,0x42,0xdb,0xca,0x99,0x5c,0x65,0xc3,0x6d,0x7b,0xd4,0xcd,0x26,0x00,0x76,0x80,0xea,0x12,0x38,0xe6,0xfe,0xe1,0x34,0xca,0x05,0x03,0x7a,0x07,0x2e,0xd0,0xad,0x5b,0xf8,0xdd,0x69,0xc1,0x89,0x91,0xed,0x27,0xcf,0x6e,0x3f,0xbb,0x76,0x9d,0x87,0x8d,0x0c,0xf7,0x2d,0xfb,0x52,0x00,0xf0,0xc5,0xfd,0xf7,0x70,0x71,0x76,0x88,0xfd,0x97,0x5f,0xc7,0x7a,0x7e,0x81,0xa3,0x27,0x0f,0x10,0xc8,0xa8,0xcc,0x8a,0x12,0x5c,0xd1,0x8c,0x9e,0x24,0x40,0xe6,0x5d,0x8f,0x7d,0xb6,0xc1,0xa3,0x52,0x27,0x94,0xef,0x34,0x3b,0x75,0xef,0xe7,0x5d,0x39,0xfb,0x4c,0xd2,0x64,0x78,0x19,0xb8,0x02,0x19,0x7f,0x87,0xe6,0x30,0x55,0x53,0xf8,0x1a,0xc0,0x75,0x5d,0x8c,0x7b,0x51,0xe9,0xf7,0x05,0x99,0x83,0xeb,0xa4,0x1b,0x56,0x3d,0x9b,0xef,0xfa,0x9f,0x17,0xe9,0x57,0x96,0x89,0x4a,0x90,0xbd,0xa2,0x22,0x30,0xbf,0x38,0x07,0x30,0xc1,0xde,0xad,0x5b,0x3c,0x56,0x31,0xe0,0xf4,0xf8,0x00,0x5d,0x58,0x16,0x64,0x25,0x52,0xc7,0x5e,0xf9,0x8a,0x4b,0x53,0x80,0x74,0x7f,0xb0,0x66,0xee,0xa2,0xe4,0x03,0x99,0x8b,0x31,0xbf,0x8e,0x96,0xbe,0x68,0xd0,0x7a,0xd9,0xc9,0x91,0xe9,0x09,0x1f,0x13,0xca,0xef,0x89,0x80,0xc7,0xf7,0xde,0xc3,0xde,0xad,0x5b,0xd8,0xbd,0x7d,0x9b,0x01,0x20,0xda,0xbe,0x14,0x95,0x69,0xec,0xb0,0xbc,0x10,0xe6,0xc2,0xf8,0x07,0x56,0x5b,0x10,0x6e,0x96,0x11,0x44,0x3c,0xa7,0x8d,0x11,0xc0,0x72,0x25,0xbe,0xa0,0x29,0xb7,0xd4,0x4a,0xae,0xaa,0x15,0x90,0x6a,0x26,0x67,0x18,0xe4,0x4c,0xde,0xea,0xc7,0x20,0xea,0xa9,0x44,0x14,0x23,0x26,0x75,0xd5,0x23,0x93,0xb9,0x43,0xd5,0x87,0x41,0xcc,0x11,0x73,0xe7,0xc9,0x5a,0xcd,0x0a,0xe5,0x72,0x02,0x45,0x71,0x72,0x53,0x6a,0x09,0x0b,0x2f,0x7a,0x20,0x64,0xc7,0xef,0x96,0x83,0x36,0x98,0x62,0xfa,0xb2,0x24,0x50,0x31,0xa7,0x2b,0x98,0xbf,0x0c,0x83,0x44,0x40,0x3a,0x3d,0x93,0xf2,0xb5,0xed,0x1e,0xa8,0x77,0x55,0x3d,0x87,0xda,0xca,0x9a,0xa4,0x5e,0x84,0x74,0xe1,0x50,0xaf,0x0e,0xf5,0xf7,0x7e,0x98,0xa8,0x95,0xed,0x58,0xc8,0x93,0xd3,0x99,0x02,0x00,0x38,0x2d,0xb8,0x2c,0x40,0xee,0x2b,0x40,0x4f,0xfd,0x99,0x33,0x04,0x48,0x5c,0x39,0x92,0xc9,0xdb,0x45,0xd3,0x10,0x49,0xaf,0xab,0x16,0x48,0x13,0xc2,0x99,0xef,0x2c,0xc9,0xc6,0x0a,0xeb,0x55,0xfa,0xab,0x98,0x19,0xd3,0x4e,0x36,0x96,0x26,0x03,0xc6,0x2e,0x7d,0x4f,0xf6,0x79,0x12,0x3d,0x84,0x80,0x10,0xe6,0xcc,0x5d,0xbb,0x7c,0xa6,0x38,0x93,0x71,0x01,0x3c,0x29,0xc2,0x29,0xf8,0xeb,0x9e,0x2f,0x9c,0xf4,0x49,0xac,0x6d,0xbd,0x92,0x95,0x9e,0x3e,0x26,0x44,0x5c,0x9c,0x3c,0xc7,0xc7,0x3f,0xfd,0x7f,0x91,0x80,0xd9,0x71,0x59,0xe4,0xf4,0x4c,0xa0,0x05,0xdf,0x9c,0x5f,0x04,0xe0,0x49,0x6f,0xf2,0x90,0xcc,0xad,0xe3,0x7a,0xc8,0x35,0x89,0x72,0xdb,0x00,0x89,0x33,0x12,0x47,0x01,0xb1,0x5b,0xc1,0x4d,0xb6,0x4d,0xdf,0xe7,0xfe,0x0b,0x81,0xbd,0xdb,0x10,0x98,0x7a,0x56,0x27,0xca,0x6c,0x43,0x00,0x78,0x9c,0x1d,0x3d,0xc7,0xf9,0xd1,0x33,0xc3,0x3c,0x95,0xf9,0x15,0x73,0x2d,0xe6,0xb9,0xd1,0xd3,0x4e,0x57,0x51,0x8b,0xba,0xf5,0x9e,0x9b,0x7c,0x86,0x92,0xc0,0xa7,0x69,0xe1,0x13,0x2b,0xee,0xfa,0x69,0x62,0x06,0xad,0xe2,0x0a,0xf4,0xde,0x1a,0xa2,0xeb,0xac,0xb1,0x5e,0xd2,0x17,0x4b,0xf8,0x25,0x8a,0xf9,0x7b,0x0a,0xb5,0xea,0xd9,0xd6,0x24,0xf5,0x66,0x04,0xd2,0xfe,0x81,0x01,0x9e,0x32,0x44,0x2c,0x2e,0x8e,0xb1,0x5e,0x9c,0x63,0x32,0xdd,0x41,0xdb,0x2d,0xd8,0xf7,0xaf,0xa5,0x25,0x3a,0xef,0x63,0xe4,0xf3,0xa3,0xca,0xa0,0x9a,0x77,0x5c,0x7c,0x56,0xbb,0x3a,0x71,0xc6,0x4f,0xd1,0xce,0xc7,0x08,0xbb,0xa0,0x32,0x08,0xca,0xe4,0x78,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x45,0x32,0xe0,0xab,0x02,0x41,0x01,0x8e,0x31,0x93,0x28,0x00,0x88,0x84,0xcf,0x3f,0xf8,0x5b,0x7c,0xf7,0xb7,0xfe,0x00,0x93,0xdd,0xed,0x4c,0xb0,0x65,0x8d,0x52,0x8c,0x38,0x7f,0x7a,0xc0,0xcc,0x3b,0xb8,0x0f,0x48,0x81,0x40,0xb1,0x21,0x01,0xbb,0xed,0x0a,0x2e,0x33,0x52,0x0b,0xac,0x80,0x66,0xba,0x25,0x60,0xa5,0xf4,0xd5,0xb4,0x5b,0xe8,0x04,0xdf,0x34,0xa4,0x80,0x21,0xc2,0x4a,0x6a,0x4a,0x96,0x94,0x53,0x67,0xc5,0xba,0xad,0x0a,0x9a,0xfa,0xd0,0x9b,0xf2,0xa0,0x04,0xb4,0x00,0x32,0x0b,0x7b,0x80,0x01,0x5c,0x43,0x8f,0x53,0xef,0xa6,0xe2,0x08,0xea,0x70,0xa5,0x6c,0x77,0x09,0x84,0x94,0xfe,0xe6,0x3a,0x30,0xa9,0xb7,0x0c,0x81,0xd6,0x83,0x12,0x1d,0x4e,0xfd,0x4f,0xc6,0x11,0x47,0xca,0xac,0xc4,0xae,0xd2,0xdd,0xac,0x0d,0xb9,0x8c,0x72,0x7a,0x97,0x4c,0x46,0xdf,0x0f,0x06,0xf5,0x62,0xf5,0x03,0xc1,0x4d,0x5e,0xff,0x8d,0xd1,0x38,0xe3,0x96,0x86,0xfd,0x98,0xe9,0x5b,0x52,0x51,0xd8,0xe7,0x66,0xe2,0xca,0xd9,0xca,0xd2,0x66,0x41,0x58,0x62,0x7b,0x89,0xae,0xe4,0xa1,0x07,0xe1,0x89,0x20,0x7b,0x43,0x03,0x71,0x14,0x44,0x55,0xca,0x73,0x00,0x3b,0x8c,0x88,0x59,0x1a,0x74,0x00,0x5f,0xdc,0x6b,0xda,0x56,0x78,0x71,0x92,0xef,0xe2,0x5e,0x33,0xd5,0x5b,0x9b,0x02,0x7b,0x53,0x8b,0xcb,0xc0,0xad,0x11,0x44,0x1d,0x93,0x4e,0xf6,0xa4,0xf3,0xb3,0x4e,0x84,0x54,0x03,0xd4,0xda,0x5e,0x0b,0xe6,0xde,0x00,0x6c,0xaa,0x8b,0x1c,0xa9,0x72,0xa6,0x4e,0x95,0x2a,0x9b,0xdb,0xea,0x2a,0x0b,0x68,0x9f,0xff,0x16,0xaa,0x67,0xd3,0xac,0xc2,0xd2,0xaf,0xc1,0x64,0x7b,0x0b,0x8d,0x5e,0x39,0x09,0xb6,0x50,0x0d,0x5d,0x87,0x2e,0x74,0xb9,0x1f,0x4d,0xfa,0xfa,0x47,0x21,0x11,0xa7,0x56,0x0e,0x70,0x0a,0xc5,0xb7,0xdc,0x4f,0x45,0x18,0xe7,0x07,0x0b,0x40,0xef,0xc7,0xf7,0xc3,0x8f,0x8b,0xf2,0x20,0x1a,0x0a,0x13,0x12,0x01,0xa4,0xe4,0x9c,0x3e,0x76,0x2d,0xa6,0x31,0xe2,0xe7,0xbf,0xfd,0x2f,0x73,0x3c,0xbb,0xf8,0x0a,0x00,0x26,0xb8,0x9b,0xdb,0x70,0xfb,0xbb,0xc5,0xb3,0x32,0x08,0x5b,0xfa,0xec,0x02,0xb4,0x66,0xa7,0x05,0xfe,0xa5,0x5d,0xb8,0x1b,0x5b,0xa3,0xf9,0xea,0xd7,0xf0,0xf8,0x94,0x6d,0x03,0x00,0xf8,0x57,0x6f,0xc0,0x6d,0x4f,0x2d,0xe9,0xe8,0xad,0x72,0x22,0x42,0xf7,0x30,0x1f,0xd5,0xf1,0x6f,0xdd,0xe2,0x3d,0xf2,0x01,0x1a,0x93,0xbe,0xaf,0x3b,0x74,0x4f,0x4f,0x13,0xe3,0x39,0xfd,0xe6,0x9d,0xfc,0x3e,0xa5,0x2b,0x33,0x08,0x8b,0x35,0xc2,0xf3,0x73,0xd3,0xdc,0xa2,0x56,0x45,0xe2,0xff,0xfe,0xf0,0x1e,0x7e,0x16,0x56,0x7c,0xad,0xa9,0xee,0xcd,0xd7,0x15,0xaf,0xc0,0xa7,0x4f,0x98,0xe2,0xd8,0x0b,0xb8,0xa6,0xa9,0x8e,0xb0,0x97,0xf3,0x35,0x76,0xe2,0x97,0xbe,0xc8,0x2e,0x17,0xd8,0xcf,0x92,0x3b,0xa2,0x94,0xf0,0xb3,0xc4,0x3b,0x58,0xe9,0x08,0xec,0xec,0xed,0xe3,0xdb,0xbf,0xf1,0xcf,0xd1,0x6c,0x89,0x72,0x31,0x19,0x2c,0x46,0x3c,0xfa,0xf0,0x17,0x38,0x7b,0xfe,0x94,0xf3,0x2e,0x8e,0xe6,0x94,0xc0,0x44,0x55,0x9e,0xd6,0xa6,0xc5,0xa1,0xc1,0x64,0x6b,0x07,0x56,0xfa,0xe4,0xff,0x72,0xdf,0xb4,0x6d,0xf6,0xc5,0x4c,0x52,0x87,0xdc,0x26,0x01,0x23,0xeb,0x0d,0x2a,0x95,0xa1,0xd1,0x38,0x0e,0x5b,0x09,0x0b,0xe3,0x93,0xae,0xfa,0x03,0xe0,0xec,0x11,0x20,0xfe,0x92,0x3c,0x2a,0x92,0xb6,0xc7,0x30,0x20,0xa9,0xdf,0xa8,0xaa,0x8b,0xb6,0xbb,0x96,0x9e,0x63,0x7e,0xad,0xa7,0x5a,0x92,0x66,0x54,0xf2,0x8b,0x16,0x10,0x73,0x5e,0x44,0xcc,0x39,0xa4,0x93,0x59,0x69,0xaf,0xd8,0x94,0x47,0xca,0x5d,0x58,0x00,0x86,0xf4,0xa7,0xf6,0x83,0xc1,0x2c,0xc3,0x05,0x94,0x63,0x3f,0x02,0x9d,0xb1,0x8e,0x31,0x0e,0xc3,0x93,0xde,0xac,0x2f,0xb2,0xb7,0x84,0xca,0x55,0xea,0x3a,0x4b,0x54,0x87,0x1a,0x52,0xd5,0x28,0x99,0x83,0x8b,0x3a,0xc8,0x98,0xb8,0xba,0x21,0x97,0x23,0x02,0x2c,0x54,0x00,0x37,0xe5,0x77,0x50,0x6e,0xc7,0x65,0x0e,0x4f,0x55,0xae,0x04,0x64,0x67,0x86,0xb9,0x8a,0xc9,0x0b,0x96,0x13,0xa5,0x8f,0x39,0x98,0xed,0x7c,0x2e,0x9f,0xdb,0x20,0xcf,0x29,0x82,0x5c,0x3e,0x93,0xeb,0xc8,0xc9,0xb1,0xa9,0xdc,0x76,0xf6,0x0d,0xcd,0x20,0x95,0x78,0xfa,0xc8,0x17,0x41,0x68,0x9a,0x8c,0x06,0xfa,0x9d,0xf3,0x70,0x29,0x8f,0x32,0x38,0x9f,0x95,0x3a,0x4e,0xdb,0x0a,0x61,0xeb,0x9c,0x61,0x8d,0x24,0xef,0x98,0xea,0xc4,0x9c,0xba,0xef,0xb3,0xd2,0x60,0x09,0x58,0x4a,0xb4,0x2a,0x05,0x47,0x68,0xdb,0x35,0x22,0x45,0xbe,0x6b,0x93,0xf8,0x50,0xbc,0xba,0xe4,0x4c,0x93,0x5e,0xfb,0xd3,0x72,0xfe,0xd0,0x76,0x33,0x70,0xdb,0x01,0xca,0xac,0x52,0x66,0x28,0xf8,0x79,0x91,0xc1,0x60,0x28,0xf8,0x2c,0x4e,0x5c,0xe4,0x09,0xd4,0x4c,0x9c,0x56,0x6c,0x38,0x6e,0x19,0x25,0x02,0x60,0xa3,0xac,0x6c,0xdc,0x44,0xa0,0x4e,0xf7,0x9e,0x5c,0x7f,0x44,0x36,0x80,0x2f,0x00,0xd0,0xc5,0x0a,0xf1,0x7c,0x55,0x3c,0xcb,0xe9,0x06,0x90,0x0f,0xc4,0xae,0x1f,0x8f,0xe7,0x39,0x62,0x2f,0x59,0x05,0x68,0x20,0xc4,0x83,0x8b,0xaa,0x3a,0x7d,0x25,0x70,0x59,0x3c,0x31,0x80,0x17,0x55,0x30,0xc4,0xd2,0x3e,0x4d,0x5d,0x41,0x68,0x1f,0x1c,0x0d,0x83,0x6f,0x4a,0x57,0x57,0x76,0xa8,0xc9,0x39,0x77,0x8a,0x8e,0x3f,0xba,0xef,0x5e,0x9f,0xb3,0xde,0x18,0xaa,0xb9,0x9c,0xd6,0xbf,0xa9,0x5f,0xe0,0x8b,0xc0,0xbd,0x33,0x84,0x53,0xc8,0x03,0x02,0x10,0x63,0xdb,0x17,0x52,0xd4,0xb3,0x47,0x4d,0x74,0xa3,0x5d,0x91,0x56,0x3a,0xd6,0xad,0x25,0x2d,0x37,0x5a,0x7c,0x01,0x00,0x2c,0xe6,0xe7,0xb8,0xf7,0xee,0x7f,0xc0,0xb7,0x7e,0xfc,0x13,0x4c,0x76,0x76,0x24,0x2f,0x42,0x3b,0x9b,0xe1,0xfc,0xe8,0xa9,0xac,0x27,0x97,0xcb,0x32,0x5a,0xc0,0x61,0x93,0xb9,0x28,0x4e,0x9c,0x26,0x52,0x50,0x40,0x6c,0x67,0x98,0x4c,0xb6,0xc1,0xf7,0x2b,0xeb,0x7e,0xa7,0x5c,0xb7,0x0a,0xbe,0x02,0xb5,0xc8,0xcf,0x97,0x52,0xae,0x4b,0xa9,0xcc,0x08,0x95,0x22,0xaf,0x80,0x2f,0x01,0x85,0xea,0x39,0xbd,0x48,0x3d,0x62,0x83,0x32,0x61,0x2a,0x5c,0x92,0x3d,0x97,0x69,0xcd,0x8f,0xe1,0x2a,0x57,0x95,0xf2,0x11,0x63,0x80,0x32,0x57,0xee,0xa7,0x24,0xa0,0xe6,0x3b,0x6b,0xa1,0xb7,0x24,0x39,0x93,0x95,0x23,0xb5,0x76,0xb6,0xcc,0x1a,0x95,0x80,0x3b,0x08,0xa6,0x11,0x05,0x13,0x59,0xa8,0xa9,0x2d,0x73,0x30,0x14,0x08,0x14,0xeb,0xc9,0x65,0xe3,0x8e,0x63,0xec,0x64,0xf4,0x4d,0x11,0xaa,0xcc,0x0b,0xf0,0xbd,0x42,0xda,0xde,0xa1,0xca,0x21,0x51,0xba,0x47,0x71,0xfb,0x92,0xcd,0x40,0x91,0x99,0xd4,0xf7,0xe4,0x75,0x58,0xd0,0x70,0x62,0x90,0x50,0x48,0xe6,0xba,0x9e,0xd4,0x8b,0x85,0x35,0x46,0xc8,0x2f,0xfb,0xe0,0xe9,0x73,0x1e,0xa5,0x64,0x9a,0x81,0xd6,0x79,0x55,0xb1,0x29,0xc1,0xa9,0xda,0xe0,0xb3,0x6b,0x7a,0x7e,0xa5,0x77,0x4f,0xba,0x64,0x24,0x91,0xf2,0x4f,0xd2,0x2e,0x97,0xe1,0x14,0x6c,0x8b,0xf6,0x18,0xe0,0x75,0xb1,0x92,0x2c,0xbd,0x91,0xda,0x6d,0x5a,0x5f,0xf4,0x5b,0xec,0x02,0x93,0x14,0x65,0x10,0x3c,0xa5,0x7c,0xb5,0xbf,0x5c,0xf1,0xc5,0x5a,0x4d,0x97,0xbd,0x9f,0xf6,0xc1,0x73,0x03,0x8b,0xfa,0xc0,0xac,0x87,0x21,0xe9,0x79,0x40,0xdb,0x88,0xe1,0x79,0x53,0x95,0xdd,0x8b,0xd2,0x9f,0x15,0x04,0x20,0xdd,0x71,0xa8,0x6d,0x25,0xe4,0x2d,0x7b,0x52,0x6b,0xe9,0x81,0x45,0x45,0x75,0x46,0xf2,0x95,0x86,0x1e,0x0e,0xc7,0xbd,0xd2,0x26,0xeb,0x00,0xf8,0xf6,0x71,0xbc,0xce,0x67,0x64,0xdf,0xf7,0x0a,0xe0,0x3b,0x98,0x64,0xa4,0x4d,0xfd,0x52,0xfb,0x71,0xea,0xa7,0x7a,0xed,0xb3,0x13,0xbb,0x3b,0x97,0x80,0xc8,0x8d,0x55,0xc1,0xa4,0x96,0xb5,0x51,0xa9,0x29,0xed,0x52,0x06,0x00,0x8a,0x01,0xd1,0x93,0x58,0xbc,0xeb,0xba,0x8f,0x08,0x2d,0x4b,0x71,0xca,0x30,0x96,0x6d,0x03,0x4a,0x66,0xd0,0xb3,0xa2,0xcc,0x1e,0x99,0x8b,0x9c,0x93,0x33,0x75,0x61,0x26,0x5c,0xb4,0x6c,0x0d,0x47,0x52,0x30,0x5e,0x2d,0x66,0xb8,0xf7,0xce,0x5f,0xe3,0x95,0xb7,0x7f,0x80,0xfd,0x57,0x5f,0x45,0x58,0x2e,0xf1,0xc5,0xa7,0x1f,0xa4,0x2d,0x36,0xd5,0x6a,0x91,0xfa,0x05,0x10,0x89,0x4f,0x35,0x79,0xe9,0x1c,0x2b,0x00,0x78,0x2f,0x5b,0xc1,0x51,0x84,0x47,0x71,0x5d,0xd9,0xae,0xd0,0xf8,0x06,0x7e,0x32,0x95,0x5e,0x8c,0x20,0x0f,0x74,0x8b,0xb5,0xf1,0xc8,0x9b,0x19,0x4c,0xf2,0x5e,0xac,0x8e,0x39,0x6f,0xe7,0x49,0x84,0x70,0x31,0x7c,0x8c,0x94,0x19,0x0b,0x65,0x62,0xb4,0xa3,0xf4,0x96,0x29,0x11,0x8a,0x54,0xfd,0x5c,0x30,0xb0,0x2a,0xa4,0x92,0x38,0xd8,0x70,0x4c,0x73,0x13,0x10,0x6a,0x5a,0x29,0xcb,0xc9,0xd9,0x63,0xfe,0xed,0x72,0x9c,0xde,0x7c,0x28,0xc1,0x6b,0x70,0xef,0xba,0x88,0xa0,0x83,0x56,0x33,0x4b,0xa9,0x12,0x23,0x69,0xad,0xc4,0x0b,0xe4,0x7b,0xd9,0xaf,0xc2,0x20,0x3a,0xd9,0x16,0xb8,0x2a,0x26,0xe6,0xb0,0x01,0x80,0x47,0xf5,0xcd,0x97,0x57,0xa6,0xf8,0x3b,0xf4,0xae,0x7e,0x54,0x81,0x74,0x71,0x6d,0x61,0x95,0x32,0x49,0x28,0x9a,0xce,0xc6,0xb3,0x7b,0x3b,0x56,0xf5,0x6c,0x33,0xa0,0x14,0x2f,0x5b,0x43,0xd7,0xe0,0xaf,0x0b,0x45,0xf2,0x23,0xab,0x8a,0x36,0xef,0x2d,0xf8,0x16,0xd5,0xa8,0x54,0xcd,0xd7,0x04,0xdf,0xdc,0x0d,0x25,0xf8,0x3a,0x7b,0xf5,0xd1,0x10,0xf8,0xf6,0x80,0x97,0xfb,0x21,0x31,0x18,0x23,0xc0,0x9b,0xf2,0x70,0x00,0xd2,0x2d,0x45,0x46,0x43,0xe1,0x91,0xdf,0xa7,0x3e,0xae,0x01,0x77,0xe8,0x87,0xef,0xcf,0x77,0x59,0x98,0x63,0xd3,0xa4,0x6f,0xb0,0x65,0x98,0xa5,0xfa,0x59,0x42,0x70,0xf4,0x42,0x7e,0x44,0x83,0x4f,0x07,0xa8,0x70,0x15,0xcf,0x10,0x82,0xa1,0xb8,0x16,0x64,0x2c,0x50,0xf5,0xb2,0xac,0xd3,0x0d,0x01,0x74,0x99,0x6e,0x50,0x12,0x1a,0x02,0xdf,0x71,0x7e,0x20,0xe7,0x43,0xe8,0xc7,0x18,0x02,0x51,0x53,0x97,0xf2,0x1d,0x15,0xd5,0xec,0xd5,0xa2,0xea,0x9b,0xc1,0x1e,0x25,0x0c,0x1e,0xa3,0x72,0xbd,0x2f,0xfd,0x1c,0x8a,0x5f,0x8d,0x7d,0x31,0x44,0x5f,0xf8,0x98,0x0e,0x5f,0x78,0x12,0xe1,0x1c,0x19,0x00,0x50,0x02,0x6b,0xb7,0xa9,0x6c,0x19,0xb1,0x2a,0x2c,0xaf,0x59,0x27,0x00,0x9b,0x8a,0x8e,0x76,0xfe,0xb3,0x96,0x8b,0x8f,0x2f,0x65,0x30,0xee,0x62,0xc0,0xd3,0xcf,0x3f,0xc2,0xd3,0xcf,0x3f,0x92,0x78,0x31,0xaf,0x1f,0x3d,0x36,0x39,0x08,0xc4,0x94,0x68,0x02,0xc9,0x7d,0xc0,0x5c,0x1d,0x2f,0xdb,0xce,0x79,0x4f,0x35,0xc4,0x80,0xb0,0xee,0xd2,0x9a,0xe1,0x33,0xb0,0xc8,0x28,0xe5,0xd4,0x9e,0x45,0xa4,0x5d,0xaf,0x47,0xfb,0xc6,0x40,0x18,0x48,0x12,0xae,0xb4,0x27,0xa7,0x35,0x20,0xac,0xfd,0x93,0xfc,0xd6,0xa7,0x9e,0x81,0xca,0xdd,0x8e,0xc4,0xd8,0x2b,0xf5,0xaf,0xa1,0x41,0x89,0x28,0x38,0x64,0xc3,0x2b,0xa7,0x15,0x40,0xf2,0x13,0x9d,0xfa,0x4b,0x18,0x8c,0x34,0x2e,0xd2,0x7f,0xce,0xc9,0xc9,0x06,0x15,0x74,0x48,0xe2,0xd6,0xb3,0x48,0x68,0xa5,0xd5,0xa0,0x52,0x8e,0x7f,0x79,0xa8,0xeb,0x7e,0x9d,0x34,0x65,0x9d,0xeb,0x70,0x45,0x09,0xf8,0xab,0x0b,0xf5,0xb2,0x19,0xe5,0x19,0xec,0x40,0xdb,0xf6,0x8f,0x45,0xef,0xf1,0x0b,0x95,0xf4,0x9b,0x10,0xd4,0x10,0xf4,0xe8,0x2a,0xe9,0x17,0x02,0xe8,0x76,0xff,0xd8,0x82,0x29,0xb2,0x94,0x9c,0x82,0xaa,0x58,0x5c,0x9a,0x30,0x09,0x5b,0x7a,0xe0,0xeb,0x06,0xc0,0xd7,0x20,0xd1,0x28,0xf8,0x36,0xa5,0x94,0xe8,0x72,0x3d,0x75,0x70,0xfb,0xe0,0x9b,0xd5,0xcd,0x90,0x85,0x2e,0x9b,0xbf,0x03,0xc0,0x1b,0xfb,0xc0,0xab,0x18,0x69,0xc0,0x74,0x1c,0x74,0xcd,0x18,0xc1,0xfc,0x75,0xda,0x6d,0x43,0x1a,0x0c,0x5f,0x3d,0x72,0x46,0x42,0x37,0x6f,0x06,0xc7,0x5c,0x97,0xf4,0xa6,0x09,0xb1,0xe1,0x5d,0x2f,0x6e,0x9d,0x35,0x2f,0xcc,0x65,0x88,0x58,0xc6,0x88,0x1d,0x63,0x64,0x57,0xd7,0x61,0xa0,0x5a,0x65,0x3e,0x23,0x51,0xc7,0xc1,0x17,0xfd,0xdf,0x43,0x32,0x67,0x8f,0x76,0x6c,0x06,0xf1,0x01,0xec,0xcc,0xb9,0x0f,0xbd,0x1c,0xa9,0xfa,0x75,0x55,0xcf,0xfa,0xe6,0x14,0x11,0xd9,0xd7,0x78,0xcd,0x38,0xdb,0x50,0xcd,0xb1,0x31,0x46,0xc9,0x8d,0x30,0x2a,0xa9,0x96,0xaa,0x0d,0x70,0x80,0xfa,0x3e,0x86,0x87,0x75,0xca,0x9f,0x25,0x45,0xb3,0x25,0x52,0x74,0xa3,0x05,0x65,0xc3,0x90,0x1a,0x40,0x26,0x64,0x7f,0xed,0x3d,0x30,0xf6,0x40,0x76,0x71,0x39,0xb0,0xe5,0x42,0x0d,0x00,0x71,0xcd,0xe8,0x1c,0xd0,0x03,0x62,0x55,0x2d,0xcb,0x33,0xcf,0x3a,0xae,0x24,0x0d,0x13,0xaf,0x5d,0x6b,0x9c,0xe4,0x74,0x7b,0x4d,0x01,0xf2,0x32,0x10,0x56,0xc0,0x1c,0x03,0x61,0xd2,0x43,0x3d,0x40,0x52,0xc1,0x27,0xc9,0xd0,0xc3,0xb9,0x68,0xfa,0x59,0xd2,0x53,0x1a,0xb8,0x5c,0x0f,0x78,0xa4,0xbd,0x63,0xef,0x06,0xa4,0x60,0xc9,0x43,0x69,0x5e,0x31,0xb4,0x43,0x52,0xf0,0x86,0xf5,0x9d,0xb0,0x72,0x48,0x0a,0x36,0xf9,0x54,0x8f,0xf9,0xf7,0x75,0x40,0xf6,0xcb,0x87,0xaf,0x1e,0x80,0x5d,0xf5,0xe3,0xba,0xea,0xe7,0xb1,0x85,0x59,0x0b,0x2f,0xd0,0xa8,0x25,0x32,0xa7,0x85,0x56,0xe3,0x64,0x4a,0x69,0xa5,0x5f,0x9b,0xde,0x46,0xb6,0xe0,0xcd,0xff,0x27,0xbc,0x4b,0x65,0x5b,0x80,0x70,0x29,0xb9,0x02,0x7a,0x36,0xa8,0xd2,0x62,0x1c,0x9f,0xfb,0xeb,0x81,0xaf,0x30,0x07,0x83,0xe0,0xdb,0x30,0x60,0x66,0x44,0x37,0x7f,0x8d,0xd4,0xcb,0x2b,0x53,0x82,0x2f,0xea,0x01,0x5d,0xd8,0x97,0x02,0x6f,0x4e,0x9e,0x81,0x77,0x40,0xda,0xad,0x81,0x79,0x08,0x74,0xad,0x94,0x61,0x13,0xda,0x47,0xa9,0xc8,0x1a,0x68,0xfb,0x2c,0x5a,0x39,0xa5,0x36,0x81,0xee,0xd0,0xc3,0x81,0xf9,0xb6,0x31,0x1e,0x21,0xf9,0xa2,0x74,0x01,0x3f,0xbb,0x38,0xc5,0xbf,0xd8,0x7f,0x69,0x00,0x5c,0xe5,0xeb,0x06,0xf0,0xea,0x7f,0xbf,0x04,0xb4,0xab,0x38,0x09,0xc6,0x06,0xc0,0xb0,0x86,0xd7,0x2b,0xab,0x9e,0xab,0xdf,0x75,0xba,0x12,0xef,0xca,0x36,0x0d,0x83,0xfa,0x30,0xf7,0x60,0xb3,0x38,0x8f,0x1d,0xee,0x76,0x1d,0x30,0xe5,0x3b,0x9f,0x0b,0xad,0x50,0xbf,0x31,0x12,0x8c,0xea,0x52,0x07,0xac,0x8a,0xd7,0x63,0xc0,0xa8,0x2a,0x7b,0x80,0x3e,0xb0,0x14,0xcd,0x04,0xbe,0xb8,0x6f,0x37,0xaa,0xb1,0x8f,0x02,0xb2,0x3c,0x77,0xb6,0x8f,0x8c,0x71,0x90,0xce,0x67,0x07,0xc0,0xab,0xfa,0x99,0x52,0x9d,0x88,0xf5,0xd8,0xcc,0x7c,0x36,0x31,0x4b,0xe2,0x11,0xa6,0xed,0xba,0x4f,0x69,0x5c,0x43,0x5a,0x42,0x23,0x7e,0x93,0xd9,0x55,0x64,0xa5,0x96,0x56,0x69,0x18,0xb2,0x37,0xec,0x6c,0x5e,0x26,0x9f,0xcb,0x40,0xd8,0xc7,0x64,0x18,0xe5,0x14,0x8e,0xad,0xea,0xd5,0xb9,0xb4,0x1f,0xcc,0x80,0x29,0xdd,0x69,0x24,0xc8,0x71,0x55,0xb4,0x4a,0xc1,0xea,0xf3,0x5a,0xf3,0xad,0x68,0x6f,0xa1,0x52,0x56,0x76,0x60,0x93,0x14,0x8c,0x14,0x57,0xb7,0xae,0x8b,0x51,0xde,0xc4,0xdb,0xd9,0x3b,0x11,0x7b,0xe1,0x12,0x35,0xf4,0xd7,0x80,0xcd,0xd7,0x07,0x60,0x9f,0x27,0xd9,0x78,0x18,0x7e,0xdf,0x23,0xad,0x09,0xbc,0xea,0x56,0xb9,0xe2,0x6b,0xb2,0x2f,0x2a,0xa8,0x7a,0x06,0xcd,0xa4,0x22,0x4d,0xa1,0x02,0xd0,0xc1,0xbd,0x5f,0x2b,0xfd,0xda,0x0a,0xa9,0xf4,0x0b,0xb3,0x8f,0x64,0xeb,0x95,0x41,0xb4,0x56,0x2d,0xf7,0xf7,0x7d,0xed,0xcb,0x4c,0x30,0xec,0x05,0x87,0x97,0x83,0xaf,0x34,0xfe,0x4a,0x2a,0x67,0xab,0x6e,0xd6,0x76,0x5b,0x75,0xf3,0x65,0xc0,0x6b,0xd5,0xcc,0x66,0x94,0x8b,0x31,0xaf,0x80,0xd7,0xe5,0x67,0x25,0x36,0x6a,0xdf,0xd9,0x3a,0xd6,0x60,0x0b,0x0c,0x3d,0x70,0x43,0x20,0xbb,0x09,0x34,0x07,0xca,0x7d,0x91,0xe0,0xaa,0xef,0xce,0x3b,0xfc,0x9b,0x67,0xf7,0xf1,0x87,0xfb,0xff,0x24,0xb7,0xdf,0x82,0x8c,0x45,0x99,0xde,0xc2,0xac,0x9e,0x8d,0xa9,0x9e,0x8b,0x28,0xe3,0x00,0x5d,0xc0,0x27,0x95,0x11,0x7a,0x18,0x3e,0x10,0x67,0xb4,0x9a,0x75,0x3e,0x54,0xfd,0xee,0x57,0x53,0xea,0xda,0xab,0x55,0xf5,0x3f,0x52,0x5f,0xfd,0x1f,0x17,0x07,0x08,0x20,0x34,0x69,0xfe,0xc9,0xbc,0xd7,0x70,0x25,0xc6,0x29,0x96,0xf1,0x2c,0x28,0xa6,0x7c,0x14,0x58,0x6d,0x10,0x68,0x2b,0xfa,0x96,0xcc,0x5a,0x92,0xd0,0x34,0x46,0xda,0xf6,0x82,0xb5,0xa2,0xb2,0x36,0x2e,0xd9,0x72,0x2e,0x25,0x18,0xe7,0x65,0xc0,0x20,0xe1,0xc4,0xc0,0x93,0x24,0x9d,0x13,0x15,0x38,0xf9,0x4b,0x80,0x58,0x96,0x3b,0xa5,0x0c,0xb3,0x5a,0xba,0x27,0x0d,0x47,0x5f,0xa8,0xa4,0x79,0x4d,0x0b,0x80,0x11,0xe5,0x3c,0x46,0x41,0x98,0xdb,0xea,0x7c,0xcc,0xfb,0xaa,0x22,0x9d,0x66,0xf5,0x80,0xd6,0x41,0xdf,0x1b,0x55,0x34,0xc9,0xfb,0xa4,0x9e,0xb7,0xc0,0x8a,0x81,0xf4,0x09,0x9d,0x53,0xd3,0xc6,0xf7,0x82,0xcb,0x6c,0x4a,0x29,0x58,0xeb,0x5c,0x4f,0x08,0xc3,0x14,0x54,0xd8,0xd9,0xcb,0x54,0xc0,0x98,0xb7,0x29,0x70,0x85,0xb0,0x19,0x7d,0x59,0x83,0x40,0xd7,0xde,0x07,0x1e,0xa1,0x56,0xf6,0xf1,0x75,0x32,0xdc,0x14,0xf7,0x1a,0xa0,0x5d,0x8b,0x49,0xa3,0xf4,0x98,0x06,0x9e,0x01,0x05,0x77,0x6d,0x25,0x1b,0x8d,0x51,0x74,0x52,0x06,0x72,0x79,0x89,0xcb,0x0c,0xaf,0x2c,0xe8,0x64,0x50,0xb7,0xaa,0x6a,0x87,0x02,0x9c,0x1d,0x50,0x1c,0x79,0x32,0x0c,0x03,0x5d,0x17,0x7c,0x65,0xb1,0x6d,0x04,0x5f,0x2d,0xdf,0x35,0xcc,0x2e,0x90,0xd6,0x4b,0xc1,0xb7,0x52,0x35,0x7b,0x21,0x10,0xce,0x03,0x90,0x34,0xc2,0x98,0xf0,0xf1,0x67,0x71,0xdd,0x58,0xa8,0x00,0xb8,0x9f,0x9d,0x58,0x88,0x3b,0xd3,0x27,0xce,0x7b,0xd1,0xde,0x3b,0xa0,0x51,0x89,0xc7,0x99,0xae,0x76,0xe9,0xe3,0x64,0x6f,0x3b,0x7d,0xbc,0x89,0xa7,0x75,0x4a,0x9e,0xb7,0x3c,0xe0,0x26,0xe6,0x33,0xa0,0xd6,0x43,0xcc,0x1f,0xad,0xb2,0x4d,0x8e,0xf1,0x0f,0xc7,0x95,0x76,0xcb,0x7e,0xe3,0x5f,0x5e,0x9c,0xe0,0x7f,0x7d,0xf0,0xb1,0x81,0xa3,0x01,0xc9,0xb1,0xf7,0x7d,0x48,0xac,0xac,0xbf,0x97,0x68,0xd8,0x07,0xd1,0x5c,0x48,0x0d,0xbe,0x43,0x58,0x9f,0xbf,0xd6,0x32,0xc2,0x50,0x71,0x03,0x0c,0xc4,0x78,0x96,0xfd,0x7c,0x87,0xc0,0x77,0x90,0x36,0x11,0xfe,0x64,0x76,0x82,0xff,0xfd,0xe2,0xb9,0x8c,0x2d,0xc6,0x5d,0x51,0xc2,0x8e,0x01,0x12,0x98,0xe5,0x4f,0x15,0x52,0xa2,0x6a,0x3e,0xf8,0x7a,0xbe,0x40,0xa6,0xbe,0x99,0x63,0xe9,0x5d,0x51,0xb2,0x7c,0x95,0xb9,0xda,0x38,0x36,0xe6,0x92,0xf5,0x91,0x8a,0xd5,0xb3,0xf0,0xae,0x2a,0x23,0x05,0xf5,0x34,0xd7,0xc8,0xbc,0x53,0x53,0x33,0x26,0x22,0xce,0x4d,0xb8,0x7c,0xbb,0x9c,0xec,0xc4,0x94,0xeb,0x4d,0x79,0xe9,0xe7,0x75,0x2c,0x24,0x1e,0x7a,0x43,0x90,0x14,0x05,0xef,0x55,0x0b,0x06,0xa6,0x0d,0x46,0x4b,0xe6,0x94,0x76,0x19,0x03,0x51,0xeb,0xb4,0x24,0xd3,0x1e,0xbd,0x29,0x4d,0x8f,0x44,0x6a,0x3a,0x05,0x2b,0x8f,0xd2,0xd9,0x49,0x45,0xfb,0x90,0xdf,0x2b,0x7d,0x53,0xe1,0x2a,0x3f,0xad,0xa4,0xcb,0x82,0xee,0xba,0x8a,0x26,0x67,0x29,0x38,0x47,0x1f,0x63,0xac,0x47,0xce,0x92,0x5f,0x01,0x43,0xc6,0x93,0x7d,0x19,0x1c,0x1b,0x8b,0x3b,0x5c,0x7f,0x37,0x79,0xfd,0xd7,0x06,0x96,0xce,0x38,0x00,0xbb,0x8d,0x16,0xd0,0x06,0x28,0xd2,0xef,0x2c,0x2a,0xf5,0xae,0xb7,0x2b,0xb0,0x2f,0x51,0xf1,0xfc,0x17,0xc6,0xf1,0x83,0xe4,0x4b,0x9a,0x97,0x91,0x92,0x5c,0x3a,0x73,0x2b,0x75,0xb7,0x6b,0xca,0x99,0x49,0xa9,0xe0,0x17,0x5d,0x92,0x56,0xcb,0x3d,0xa9,0xbc,0xf7,0xab,0xd2,0xa0,0xd3,0xfa,0x78,0x57,0x96,0xdb,0xb3,0x7a,0xe6,0xfd,0x1b,0x9e,0xc0,0xc6,0x65,0xa4,0x4c,0xe8,0xac,0x7a,0xb6,0x0b,0x28,0x57,0x74,0x74,0xcf,0xb7,0x06,0x5f,0xad,0x8a,0x05,0x5f,0xaf,0xfb,0xb3,0x06,0x7c,0x73,0x89,0xc8,0x52,0x2f,0x60,0x17,0x6f,0xea,0x9f,0x42,0xe2,0x25,0x8c,0xde,0x30,0xa4,0xe9,0x73,0xb3,0x7b,0x63,0x30,0xf8,0xd2,0x12,0x38,0xb3,0x28,0x6b,0xc2,0x55,0x2e,0x9a,0x61,0xa3,0x85,0x2c,0x79,0xf7,0x27,0x74,0xbd,0xe6,0xfa,0xc1,0x6f,0xf8,0xa5,0xd9,0x13,0x10,0x09,0xb1,0xeb,0x10,0xc2,0x0a,0x71,0xbd,0x44,0x58,0xaf,0xf1,0x07,0x37,0x6f,0xe3,0xbf,0x7d,0xe3,0xbb,0xf8,0x67,0xfb,0x77,0xb0,0xe3,0x7d,0x71,0x64,0xa7,0xac,0x5b,0x4f,0x64,0x1d,0x8e,0x53,0x63,0xf4,0x15,0xad,0x9e,0xeb,0x73,0x88,0xbd,0xdf,0xbd,0x2a,0xd4,0xd2,0xef,0x00,0x03,0x71,0x89,0xf4,0x3b,0x76,0xdc,0xc4,0x36,0xc7,0xfe,0xee,0x08,0xf8,0x78,0x75,0x8e,0x7f,0x7b,0x7e,0x80,0xff,0x7b,0x7e,0x0c,0xbf,0xb5,0x8d,0x66,0xba,0x03,0x3f,0xd9,0x82,0x6f,0x9a,0x34,0x57,0x62,0x6f,0xa2,0x8c,0x8c,0xb9,0xbc,0x1a,0x96,0x3f,0xaa,0x17,0x97,0xd1,0x47,0xaa,0xca,0xa9,0xfb,0x78,0x94,0xb3,0xca,0xef,0xf4,0xce,0xdc,0x22,0x56,0x8a,0xda,0xaf,0x28,0xe9,0xc6,0x68,0x54,0xb8,0xa0,0x14,0xb7,0x50,0x4d,0xdb,0xf4,0xa9,0x5e,0xfa,0x45,0x24,0x5f,0x39,0x3e,0x58,0x18,0x68,0x01,0x66,0x5f,0x18,0x48,0x52,0xa6,0xa4,0x4b,0xcc,0x9c,0x1e,0xad,0x21,0x3b,0xdf,0x08,0xf9,0x6c,0x6e,0x40,0x3e,0xbd,0xa3,0xcf,0x65,0xe2,0x50,0x94,0xbc,0xb4,0xfc,0x50,0x36,0x3e,0x5d,0xac,0x43,0x29,0xcf,0x64,0x81,0x4d,0xb6,0xad,0x59,0xaa,0xcf,0x65,0x3b,0x3e,0x5e,0xd4,0xf3,0x86,0x65,0x8c,0xe8,0x52,0x9f,0x64,0x35,0xb4,0x3d,0x1e,0x55,0x1c,0x49,0xb2,0x6b,0xc9,0x8e,0x37,0x91,0x79,0x67,0xd6,0x45,0x31,0x5e,0xc6,0x81,0x09,0x80,0x52,0x8c,0xa6,0xdc,0xde,0xc1,0x70,0xfd,0xe3,0x48,0x97,0x00,0x70,0x7f,0x36,0x6f,0x04,0xe0,0x02,0x2d,0x2d,0xf8,0xf2,0xb3,0x3e,0x00,0x97,0x00,0x9d,0x10,0x39,0x65,0xe3,0x7b,0xea,0xe7,0x1a,0x80,0xad,0xfa,0x39,0x13,0x76,0x05,0x09,0x6f,0x00,0xcc,0xd4,0x0b,0xaa,0x7e,0x06,0x4a,0xe3,0x2b,0x05,0x6c,0xe5,0xd8,0x74,0xef,0xd7,0x02,0x65,0x63,0xba,0x48,0xeb,0xa0,0xe5,0x3b,0x03,0x80,0xda,0x26,0xf3,0xde,0x03,0xc9,0x94,0x73,0x14,0x7c,0x0d,0x37,0x79,0x29,0xf8,0x7a,0x01,0x4b,0x4a,0x69,0x13,0xc8,0x91,0x4d,0x0f,0x14,0x80,0xe5,0xc7,0x81,0x97,0x53,0x5f,0x11,0x78,0xbd,0x1a,0x9c,0xd5,0x2f,0x2e,0x03,0x5c,0xad,0x67,0xa5,0x06,0xaf,0x67,0xa2,0x65,0x18,0x4c,0xd2,0x22,0x2b,0x0c,0xc4,0xd9,0xf8,0xb4,0x4e,0x6c,0x7f,0x48,0x05,0x22,0x21,0xc6,0x80,0xd8,0xad,0x11,0xd6,0x2b,0x84,0x6e,0x8d,0xd8,0xad,0x11,0x23,0x3b,0x28,0xb8,0xe5,0x27,0xac,0x74,0xbc,0x92,0xee,0xea,0x2a,0x71,0xae,0x18,0xfe,0x61,0x66,0xd5,0xcb,0xf9,0x9c,0x22,0x08,0x0e,0xbe,0x69,0xe0,0x27,0x5b,0x68,0xa6,0x5b,0x68,0xa6,0xdb,0xf0,0x93,0x29,0x7c,0xa3,0x97,0xad,0x1b,0x0b,0xda,0x81,0xca,0x6c,0x80,0xe2,0xde,0xdb,0x1a,0x53,0x8b,0x78,0x43,0x0d,0x75,0xe6,0x3d,0x80,0x6c,0x7d,0x24,0x3f,0x4b,0xee,0xc3,0x96,0x02,0x1b,0x89,0xcb,0xd5,0x74,0xc6,0xef,0x80,0x56,0xe8,0x4a,0x40,0xac,0xc0,0x15,0xcb,0x36,0x14,0xc0,0xa3,0xea,0x64,0x4a,0x40,0x98,0xa3,0x5c,0x02,0xc2,0x02,0x18,0xc3,0x20,0x6c,0xf6,0x65,0x13,0xa0,0x53,0x2e,0x3a,0x79,0xbf,0x52,0x30,0x8a,0x09,0xe8,0x52,0xdb,0x13,0x00,0x4b,0x1f,0xa4,0xce,0x8b,0x19,0x67,0xc1,0x7e,0xb1,0xb3,0x5a,0xdf,0x74,0x72,0xe4,0x3a,0x90,0xb9,0x05,0xa9,0xe0,0x8a,0x48,0xd2,0x2a,0x13,0x50,0x8c,0x44,0xcc,0x75,0x2d,0xce,0x04,0x53,0xca,0x86,0xb4,0x2e,0x29,0xa1,0x22,0x6e,0x06,0xd8,0x7a,0xeb,0x27,0x8d,0x53,0x7a,0xa0,0x63,0x65,0x99,0xa1,0xa1,0x70,0x7d,0x00,0x1e,0xd8,0x03,0x1e,0x25,0x5b,0x48,0x67,0x27,0x07,0x83,0xab,0xfe,0x0e,0xbd,0x33,0x4f,0xc6,0x38,0xd5,0x5a,0x8c,0x19,0x88,0x77,0x65,0xe3,0x2b,0xfb,0x3d,0x49,0xbf,0xd8,0x6c,0xf9,0x0c,0x0c,0x1c,0x3b,0xd2,0x68,0x4e,0x33,0x80,0xb5,0x7a,0x2e,0x2a,0x96,0x54,0xcf,0x0a,0xce,0x0a,0x51,0x26,0x37,0x73,0x2f,0xb1,0x33,0xa0,0x09,0x2b,0xad,0xbf,0x10,0xf8,0x1a,0xa9,0x37,0xf3,0x1a,0xb9,0x8e,0xc2,0xac,0x64,0x75,0x71,0x56,0x35,0x0f,0x31,0x48,0x56,0xbd,0x96,0x6b,0xef,0xa5,0x9b,0x37,0x83,0xae,0xe9,0x02,0x24,0x09,0x5c,0xbf,0xa7,0xb9,0x5c,0xa9,0x98,0x6c,0x7e,0xf6,0x55,0xfd,0xa0,0x0a,0x86,0x17,0x2a,0xeb,0x52,0x87,0x21,0x40,0x2f,0x02,0xf1,0x82,0x74,0x51,0xb4,0xf1,0x13,0xb8,0x09,0xc1,0xcb,0x9a,0xf5,0x2e,0x80,0x28,0xe0,0x22,0x11,0x85,0xab,0xc2,0xd8,0xd8,0x64,0xff,0x87,0x18,0xbe,0x04,0x34,0xab,0xda,0xd3,0x37,0x68,0x5c,0xc3,0xde,0xa9,0x26,0x53,0xb8,0xc9,0x94,0xfb,0xd2,0x37,0x20,0xd9,0x16,0x29,0x18,0xc2,0xc4,0x8c,0xe5,0xe2,0xfb,0xa3,0x64,0xc8,0x6e,0x75,0x4f,0x65,0x7f,0x58,0xed,0x91,0x15,0x0c,0xd0,0xbd,0xd8,0x9f,0x7f,0x66,0x8e,0x5a,0xaa,0x42,0xe6,0x7b,0x21,0x3d,0xe9,0x5a,0x13,0x67,0x3b,0x80,0x97,0xab,0x4b,0x61,0xf6,0x6f,0x6d,0x59,0xcc,0xd8,0x72,0xb1,0x51,0xf6,0x5f,0x01,0xde,0x19,0x27,0x59,0xe6,0xf5,0xfe,0x70,0xde,0x5b,0xe5,0x3d,0x5d,0x97,0x9f,0xa7,0x7d,0x61,0x9f,0x99,0x00,0xef,0xe1,0x63,0x14,0x21,0x52,0xdb,0xc3,0x73,0x9a,0x0d,0x98,0x24,0xbd,0xec,0x09,0x43,0xee,0x5d,0xa7,0x42,0xe3,0xa5,0x65,0x0a,0x7d,0x54,0x67,0x45,0x44,0xe8,0x1d,0x4d,0xd2,0xce,0x1a,0x34,0xc8,0x4a,0x31,0x24,0x3b,0xa9,0x8f,0xf6,0x7b,0xda,0x0b,0x76,0x62,0x11,0x9d,0x79,0x0e,0x4e,0x2b,0xcc,0x81,0x66,0xa3,0x7d,0x3a,0xc8,0x6d,0x65,0x63,0xac,0x22,0xe8,0x40,0x5e,0x66,0x0d,0x3d,0xc8,0x4b,0x0f,0x45,0xb6,0x95,0x19,0x59,0x27,0xbd,0x7d,0x60,0x1b,0xb7,0xaf,0xd9,0xbb,0x96,0x11,0x96,0x33,0xff,0x8f,0xbc,0xbc,0x24,0x6d,0x1d,0x8c,0xf4,0xbb,0x29,0x03,0x21,0xea,0x54,0xc7,0x35,0xd2,0x6f,0x3f,0xf8,0x81,0x3c,0xeb,0x72,0xec,0x77,0x91,0xc6,0x2c,0x60,0x3b,0x54,0xd4,0xbd,0x87,0x0a,0x66,0xab,0xd7,0xf5,0xde,0x65,0xa0,0x75,0x45,0x5d,0xb3,0x49,0x93,0xe5,0x14,0x0c,0x20,0x5a,0x0d,0xc4,0x8b,0x80,0x6f,0x52,0x39,0x6f,0x92,0x7a,0x05,0x05,0xfd,0x10,0xf0,0xe6,0x86,0xa5,0x23,0x1a,0x85,0x94,0x5f,0x45,0x1e,0x04,0x5d,0xd3,0x3c,0x02,0x8a,0xcb,0x7d,0x6b,0x8a,0xd9,0x2b,0x7e,0x60,0x4c,0xed,0x90,0xd7,0xe3,0x7a,0x29,0xb0,0x02,0x79,0xe2,0x0f,0x89,0x4a,0x56,0x63,0x21,0xc4,0x95,0x3c,0x3c,0x4d,0x80,0x29,0x81,0x1c,0xa1,0xf1,0x0e,0x14,0x3b,0xc4,0xa0,0xf7,0x0a,0x03,0x34,0x78,0x16,0xf5,0x4b,0xc2,0xed,0x57,0x8d,0xd5,0x5f,0x52,0xd4,0x1d,0x4f,0xde,0x7f,0x93,0x0f,0x06,0xc8,0xfe,0xe9,0xa4,0x81,0xf7,0x5b,0xf0,0xcd,0x44,0x2e,0x4d,0xd0,0xf5,0x15,0x70,0x39,0x1d,0x19,0x1b,0xcf,0x08,0x6b,0x67,0x98,0x9f,0x1a,0xa9,0x09,0xe5,0xb5,0x9a,0x89,0x6e,0x5b,0xeb,0xe6,0x62,0x1a,0xc4,0xfe,0x1c,0x05,0x00,0xc7,0x3e,0x91,0x93,0xda,0x57,0x8c,0xbc,0x0a,0x30,0x76,0xc6,0xf2,0x59,0xd7,0x48,0x02,0x62,0xab,0xe1,0xe1,0x32,0x14,0xe8,0x48,0x6c,0x14,0x9c,0xba,0x54,0x04,0xdb,0x53,0xf0,0x73,0x95,0x86,0x2d,0xe3,0x9a,0x36,0x99,0x90,0x3c,0xc6,0x88,0x95,0x34,0xf9,0x06,0x50,0x95,0xb0,0x1a,0x49,0x01,0x7d,0x10,0x4e,0xfe,0xfb,0x19,0x08,0x5c,0x26,0x2f,0x83,0x46,0x59,0xf9,0x68,0xd2,0x08,0x10,0x59,0x83,0x2c,0xad,0xaf,0x61,0x1a,0xe0,0x29,0x5b,0x44,0x8b,0xb1,0x53,0xb6,0x88,0xae,0xf2,0x4a,0x0b,0x9c,0x24,0x0b,0x05,0xdf,0xfe,0x3c,0xc9,0xc3,0x5f,0x69,0x52,0xc0,0xb2,0xb6,0x3d,0x13,0x3c,0x1e,0x34,0x97,0x81,0x79,0x3c,0xf8,0xf4,0x2a,0xe1,0xfa,0x29,0xbf,0xa6,0x73,0xc0,0x43,0x15,0xf1,0xc5,0xdb,0xf2,0x8b,0x7e,0x2f,0x3b,0xbb,0xf0,0xf8,0x38,0x52,0x4a,0x99,0x2a,0x4f,0x78,0x3b,0x24,0x7d,0x4e,0xd8,0x4a,0xbf,0x5a,0xb7,0x28,0x63,0x5e,0xa7,0x57,0x60,0x91,0x59,0x56,0x58,0x70,0x0e,0x49,0xbf,0x2e,0xcd,0xa7,0xbc,0xef,0x4b,0xb0,0xaa,0xe7,0x54,0xef,0x24,0xe5,0x0a,0x80,0x26,0xa3,0x2b,0xc9,0x0f,0xd7,0x00,0x5f,0xd2,0x3a,0xc0,0xd4,0x33,0x57,0xb1,0x07,0xbe,0xde,0x49,0x93,0x07,0x80,0xd1,0x59,0xe0,0x9d,0x98,0xf6,0x97,0x7d,0x62,0x28,0x6e,0x39,0xa6,0x4a,0xc8,0xec,0x14,0xa8,0x98,0x01,0xfb,0xa3,0x37,0xc4,0x26,0x33,0xdf,0x7b,0x36,0x16,0x6a,0x60,0xad,0x35,0x28,0x35,0x41,0x1f,0x03,0x79,0x6b,0x2d,0xea,0xd0,0x88,0xd1,0x0e,0xf9,0x09,0x62,0x0c,0x68,0x62,0xc8,0x7b,0x5b,0x97,0x55,0xa9,0x97,0xf7,0x57,0x1e,0xf5,0xd2,0x70,0xe5,0x3a,0x7e,0x49,0xa0,0x06,0xec,0xb0,0x79,0xa0,0xf1,0xf0,0xae,0x81,0x6b,0x26,0xf0,0xbe,0x81,0xf3,0x93,0xe4,0x1d,0xa9,0x5c,0x43,0x1b,0x94,0xcd,0x83,0xd2,0x4e,0x5d,0x18,0x07,0xaf,0x34,0x47,0x88,0x76,0xb5,0x43,0x5b,0xdc,0xd0,0x96,0xbf,0x5e,0x07,0x90,0x63,0xd2,0xbc,0x25,0x0f,0x5e,0x45,0x11,0x94,0xd6,0x08,0xa9,0x3d,0x88,0xe2,0xe0,0x10,0x10,0x1b,0xb7,0xac,0x7a,0x31,0x8c,0x5e,0x79,0xca,0x18,0x69,0x41,0xd8,0xa4,0x93,0xb9,0x99,0xe8,0xc3,0x00,0x08,0x7b,0xef,0x11,0xa3,0x69,0x5b,0xaa,0x08,0x90,0xce,0x09,0x93,0x07,0x5c,0x30,0x73,0x1d,0x46,0xe2,0x1d,0x0a,0xda,0xbf,0xb5,0x14,0xac,0xb4,0x53,0xde,0x6f,0x92,0x82,0x7b,0x16,0xd1,0x7a,0xdf,0xb6,0x89,0x17,0x6d,0x1a,0xce,0xa3,0x04,0xed,0x72,0x3e,0x94,0x92,0xf3,0x40,0xad,0x87,0x70,0xd8,0x8a,0xbc,0x83,0x98,0x59,0x4b,0xaa,0x55,0x84,0x0d,0x38,0x7b,0x5d,0x08,0xfe,0xfa,0x1c,0x71,0x6c,0xa2,0x22,0x09,0x6c,0x07,0x1a,0x06,0x20,0x4d,0xba,0x21,0x75,0x01,0x80,0x82,0x63,0x4a,0x41,0xd2,0x58,0x54,0xb6,0xa0,0xae,0xf3,0xa4,0xc7,0x3e,0x0b,0x48,0xda,0xfd,0x1b,0x05,0xb2,0x9e,0x6e,0xb3,0x54,0x93,0x96,0xd2,0xaf,0xfe,0x90,0xba,0x15,0x17,0x3d,0x68,0x72,0xad,0x54,0xad,0x7a,0xae,0x2d,0x9e,0x73,0x7e,0x7d,0x83,0xab,0x11,0xc9,0x77,0x68,0xbf,0xd7,0x03,0xc9,0xa0,0x2c,0xd5,0xd4,0x48,0xbd,0x46,0xf0,0xb3,0x0b,0xdd,0x6d,0x02,0x5e,0xdb,0xa7,0x0e,0x50,0x6f,0x3e,0x69,0x51,0x51,0x95,0xa7,0xf9,0x63,0x7f,0x14,0xa3,0x67,0xe6,0x83,0x2f,0x7e,0x5f,0x12,0x06,0x2d,0x23,0xfb,0x5a,0x8a,0x8d,0x59,0xf4,0x92,0xc9,0xf8,0xc0,0xb1,0x44,0x43,0x0e,0x3e,0x3a,0x50,0xe3,0xe1,0x68,0x02,0x44,0xbd,0x59,0x25,0x37,0xb4,0x5f,0xcc,0x65,0xd2,0xf8,0x3f,0xa6,0x30,0xb0,0xdf,0x3a,0x18,0x94,0xf8,0xea,0x98,0x8b,0x85,0x7c,0xa3,0x16,0xf6,0x62,0xb7,0x51,0x1c,0xcf,0x01,0x2e,0xef,0x2b,0x03,0x5c,0x03,0x45,0xf6,0x2d,0x6b,0xf9,0x4f,0xc9,0xee,0xf7,0x65,0x2e,0x4e,0x7f,0x15,0x40,0x8e,0xbd,0xb9,0xad,0xc7,0x14,0xa9,0xa6,0x43,0x09,0x88,0x39,0xd6,0x46,0x20,0x56,0x6f,0x58,0xbe,0x96,0x86,0x65,0x6d,0x3a,0x8c,0xaa,0xa4,0xd3,0x79,0xdd,0x1a,0x84,0x0d,0x70,0x24,0x10,0xb6,0x60,0x07,0x15,0x0e,0x54,0x5b,0xe0,0x32,0xbd,0x92,0x7d,0x7b,0x27,0xed,0xcf,0x52,0x30,0x4a,0x29,0x38,0xf5,0x81,0xd4,0xc1,0x0a,0xa1,0xa9,0x23,0x87,0xa4,0xe0,0x0c,0x86,0x99,0x02,0xcb,0x37,0x43,0x9b,0x37,0x1e,0x49,0x52,0x9a,0x42,0x3c,0x06,0xe5,0x5c,0xdc,0x00,0x7b,0x05,0xc9,0x1f,0x02,0x96,0x4b,0x8e,0x23,0x09,0x53,0xf7,0x95,0x70,0xa9,0x55,0xb8,0x3a,0x00,0xf7,0xc0,0x68,0x28,0x0c,0xbd,0xbf,0xec,0xd4,0xf0,0xf0,0xdb,0x9a,0x06,0xa7,0x01,0x73,0x36,0xcf,0xe1,0xc5,0x9b,0x3c,0x5f,0xd9,0x90,0xdc,0x4e,0x6a,0xc6,0xf6,0xbd,0x48,0x8c,0xd5,0x98,0x27,0x70,0x36,0x92,0xde,0xf8,0xde,0xaf,0x44,0xe8,0x49,0xbf,0x39,0xee,0xa0,0xea,0x59,0x8f,0x35,0x24,0xf0,0xd5,0x4c,0x85,0x73,0xed,0x59,0x3b,0x6f,0x90,0x7c,0x6b,0xd0,0x4b,0xe0,0xab,0xc0,0x4b,0x40,0xac,0xcd,0xfb,0xb5,0x92,0x02,0xbc,0xa2,0x6e,0x2e,0x55,0xcd,0xda,0x7e,0xfd,0x6b,0xcf,0x05,0x37,0xc3,0x92,0xee,0x26,0xd0,0xb5,0x0c,0x98,0xb3,0x32,0xf0,0xc8,0x4c,0xe9,0x01,0x6d,0x2d,0xdd,0x8e,0x84,0x2b,0x46,0x1b,0x9a,0x47,0x4e,0x98,0x24,0x02,0xf1,0x4d,0x42,0x6e,0x02,0x10,0x81,0x1a,0x4a,0x84,0x76,0xd0,0x90,0xe1,0x0a,0xa0,0xff,0x8f,0x2e,0x0c,0xd2,0x9d,0x81,0x87,0x2a,0xcd,0x38,0x5e,0x33,0x64,0x18,0xca,0xe4,0x46,0xd5,0xeb,0x5c,0xbb,0x62,0x51,0x09,0x08,0x47,0x34,0x16,0x95,0x01,0x55,0xce,0xa8,0x84,0x5c,0x5f,0x15,0x68,0xc9,0xb7,0x93,0x82,0x8b,0xcb,0x5b,0xfc,0x25,0x60,0x0c,0x01,0x62,0x40,0xfc,0x42,0x6b,0x4e,0x0e,0x6a,0xe4,0x93,0x81,0x58,0xe2,0xab,0x11,0x52,0x5a,0xa7,0x2a,0xd5,0xe6,0xfb,0x87,0xf3,0x15,0x0a,0xde,0xf0,0xb5,0x31,0x83,0xb0,0xa0,0xa2,0xa3,0x01,0x49,0xd8,0x53,0xe1,0xb0,0xa3,0x04,0xe1,0x0c,0xb6,0xf9,0x8c,0xac,0x37,0x65,0xba,0xd4,0x9d,0xea,0xa4,0xc3,0xf9,0x90,0x55,0xd1,0xd0,0x44,0xc8,0xcc,0x40,0x2d,0x05,0x6b,0x19,0x83,0x52,0xb0,0x96,0x8f,0x54,0x5f,0x3b,0x3e,0x05,0xe7,0x3e,0xa8,0xf2,0x1e,0x0b,0xb9,0x6c,0x05,0xd1,0x82,0x2d,0x72,0x55,0xbc,0x2b,0xe2,0xa8,0xb2,0xe1,0x43,0x60,0xbd,0x39,0x03,0xd7,0x17,0xa0,0x37,0x84,0x0d,0x00,0x5c,0x37,0x7a,0x48,0xea,0x1c,0x8b,0x7b,0x95,0x70,0x45,0x6e,0xa2,0x27,0x0d,0xc9,0xf7,0xde,0x7a,0x8c,0x03,0x0f,0x69,0xf8,0x59,0x65,0x7c,0x95,0x38,0x4b,0xdd,0x10,0x71,0x03,0xc9,0x2a,0x6a,0x7e,0x15,0xe9,0xb7,0x36,0xbc,0x4a,0x30,0x63,0x55,0xcf,0x69,0x40,0x8d,0x38,0x4a,0x1e,0xf0,0x11,0xbe,0xa8,0x84,0xb5,0x38,0xf6,0x06,0x0c,0xaf,0x0a,0xbe,0x4e,0xf8,0x0c,0xdb,0x8e,0x5a,0xea,0xf5,0xb9,0x7e,0x45,0x63,0x6b,0xe0,0xad,0x3a,0xa8,0x2e,0xbb,0xfc,0x22,0xc9,0xcd,0xf8,0xb8,0x41,0x39,0x58,0xde,0x0d,0x80,0xed,0xd8,0xf4,0x1a,0xa1,0xc9,0x1b,0x23,0x14,0x71,0x7b,0x1c,0x57,0x95,0x13,0x25,0x89,0x4e,0x89,0xac,0xa3,0x7c,0xd5,0xd9,0x20,0xcb,0xfc,0xa5,0x01,0xf8,0xab,0x46,0xf0,0xaf,0x80,0x6b,0xbf,0x6a,0x16,0xaa,0x82,0x15,0xa6,0xd0,0xc1,0xce,0x25,0x33,0xc7,0x49,0x2e,0x34,0x18,0xc8,0xb8,0x6c,0x7d,0xcc,0x49,0xc6,0xca,0x4c,0x7b,0x8f,0x75,0xa8,0xa8,0x60,0x25,0x2d,0x7b,0xc3,0x60,0x2a,0x18,0xbb,0x9c,0x21,0xec,0x6d,0x6d,0x7d,0x30,0xbe,0x2e,0x10,0x8b,0xc4,0xef,0xfd,0x80,0x34,0x9c,0xf7,0x86,0xd5,0xdf,0xb2,0xfa,0x68,0x86,0x18,0x68,0x15,0x2a,0x69,0x0b,0xc2,0xb0,0x92,0x30,0x72,0x17,0x5b,0x10,0x86,0x71,0xd6,0x91,0x1c,0x75,0x00,0xc9,0x5b,0x56,0xa5,0x8a,0xce,0x00,0x62,0xe9,0xbd,0xd2,0x0f,0xd1,0xfc,0x8c,0x49,0xc1,0x63,0x7d,0x2f,0x02,0x38,0x0b,0xdf,0x56,0x9d,0x2c,0x75,0x22,0x9b,0xbf,0xf6,0x9f,0x7e,0x17,0xa6,0xe1,0x4a,0x6a,0x68,0x57,0xa4,0x19,0xf7,0x0d,0x9d,0x52,0xca,0x9b,0x17,0x59,0x23,0x9b,0x80,0xb8,0xc6,0xca,0xf1,0xb8,0x15,0x00,0xbf,0xa0,0xea,0xec,0x52,0x9a,0x51,0xe7,0x6b,0xb9,0x21,0xa0,0x3a,0x10,0x5c,0x30,0x4d,0xfd,0x62,0xca,0x17,0x4e,0xf3,0xb7,0x59,0xa4,0xef,0x06,0xac,0xad,0xe7,0xab,0x22,0x08,0xf8,0xf4,0x58,0xa6,0x81,0x3a,0xa5,0xdf,0x57,0x93,0x7e,0x51,0x4b,0xbf,0x1a,0x2f,0xfd,0x1d,0xd8,0xf7,0x55,0xa3,0xab,0xa2,0x18,0xeb,0x64,0x23,0x83,0x6f,0x3e,0x68,0x6f,0x22,0x8f,0x81,0x2f,0x7c,0xc6,0xb6,0x04,0xbe,0xa5,0xd4,0x8b,0x54,0xc7,0x5c,0x3f,0xfe,0xaa,0xe6,0xfd,0x23,0xc0,0x3b,0x26,0xed,0x5a,0x95,0x9b,0xec,0xfb,0xf5,0x67,0x58,0x0d,0xb0,0x03,0x80,0x3b,0x32,0x2d,0xdd,0xa6,0x97,0x86,0xc0,0x3a,0x60,0x18,0x2c,0xaf,0xb4,0xf0,0x84,0x60,0xf5,0xce,0xa8,0xa3,0x5f,0xcf,0x4b,0xc2,0x65,0xba,0xa0,0xff,0x5c,0x81,0xcc,0xff,0x83,0xe1,0xba,0xed,0x74,0x10,0x9d,0x23,0x50,0xa8,0x23,0xab,0x32,0xc6,0xb2,0xa5,0x94,0x49,0x93,0xc6,0x6d,0x28,0x2e,0x19,0x80,0x2e,0x42,0xb2,0xcb,0xd9,0x40,0xcf,0x0c,0x20,0x2b,0x18,0xeb,0xaf,0x5c,0x9e,0x1e,0x11,0xaa,0xc1,0xd8,0x48,0xc5,0xe6,0xca,0xbd,0x61,0x20,0x86,0x80,0x00,0x03,0xa5,0x55,0x4b,0x97,0xae,0x16,0xe3,0x00,0x08,0x1b,0xf0,0x19,0x02,0x61,0x58,0x10,0x16,0x69,0x96,0xd8,0xaa,0x39,0x81,0xb0,0xc5,0x42,0x01,0xdb,0x4c,0xab,0xa4,0x9e,0xd6,0x8a,0x19,0xaa,0xa9,0x63,0x34,0x1f,0x96,0x82,0x73,0x79,0x59,0x0a,0x96,0xe6,0xf6,0x2e,0x39,0xd0,0xf8,0x75,0x39,0xb5,0x31,0x96,0xc4,0xbe,0xb2,0x1a,0x3a,0x0e,0xcc,0xa8,0x91,0x39,0x6c,0x05,0x71,0xcd,0x50,0xe7,0xa8,0xad,0x77,0x91,0xfe,0x12,0x31,0x76,0x13,0xfe,0x5e,0x23,0x7c,0x0d,0x7b,0xc0,0x15,0xb8,0x0e,0xbc,0xde,0x1c,0x36,0x2c,0x9a,0x9a,0x50,0x5f,0xb9,0x90,0x9a,0x1b,0xb1,0x40,0x6a,0x55,0x42,0x03,0x29,0x07,0xd4,0x8c,0xc3,0x96,0xcf,0xa5,0xf4,0x5b,0xe4,0xa4,0xd2,0x6f,0x62,0x56,0x2d,0x90,0x39,0x03,0xe2,0x5e,0x00,0xd6,0xaa,0x9e,0x3d,0x92,0xd9,0xa7,0x51,0x51,0x97,0xc4,0xfc,0x0a,0xe0,0x5b,0x74,0x45,0x0d,0xbe,0x28,0xa5,0xde,0xc4,0x20,0x28,0xf1,0xbb,0x0c,0x78,0xad,0xb4,0x6b,0xb9,0xdb,0x11,0xd0,0xad,0x3d,0x95,0x5d,0x19,0x70,0xcd,0x8b,0xa8,0x46,0x62,0x75,0x1c,0x0d,0x34,0xf2,0xe2,0x2a,0x68,0x72,0x79,0x9c,0xd1,0x18,0xff,0x30,0x31,0x76,0x63,0x70,0xe6,0xff,0xc1,0xb0,0x81,0xae,0x8d,0x67,0xea,0xc6,0x63,0x0d,0x16,0x55,0xa9,0x84,0x41,0x45,0xd2,0xa1,0xb2,0x9c,0xa5,0x8f,0x3e,0xab,0x71,0x47,0x41,0x79,0x23,0x20,0xc7,0x12,0x46,0x65,0x8e,0xa7,0x2d,0xd2,0x4a,0xea,0x4d,0x52,0x71,0xf4,0x29,0xbd,0x05,0x62,0x52,0x80,0x13,0x6d,0x80,0x20,0xb9,0x7c,0x75,0x49,0x1a,0x66,0x10,0xce,0xd2,0xb0,0xa3,0x6b,0x80,0xb0,0x02,0x20,0xa1,0x38,0xa2,0x94,0x41,0x58,0xbb,0x46,0x8d,0xb2,0x94,0xde,0x49,0x9e,0x64,0x2e,0x6e,0x40,0x48,0x6a,0x63,0x6e,0xba,0xdb,0x20,0x05,0xa3,0x0f,0xb0,0xd6,0xfa,0x5a,0xdf,0x8c,0x1a,0x63,0xe5,0x2c,0xcb,0x87,0x43,0x12,0x70,0x9d,0x48,0x83,0x05,0xc8,0xfc,0x7d,0xf8,0x48,0xd1,0x15,0xc3,0x26,0x50,0xbd,0xd6,0xf5,0x84,0x9b,0x42,0x09,0xec,0x57,0x04,0xe0,0x2f,0xd3,0xa2,0xcb,0x9e,0x8c,0xbc,0x30,0x04,0x33,0xf3,0xc0,0x42,0x2a,0x7a,0xeb,0xc8,0x4e,0x7e,0x7d,0x69,0x26,0x8f,0x62,0x6c,0x4f,0xfd,0x9c,0x8b,0x29,0x1c,0x7e,0x78,0xfb,0xa6,0x06,0x1e,0x5b,0x47,0x97,0x2b,0x23,0x7b,0xc3,0xa3,0x7b,0xbf,0x09,0xd4,0x72,0xda,0x24,0xfd,0x6a,0xe6,0x04,0x56,0x3d,0x17,0xfb,0xbe,0x48,0xdc,0x33,0x14,0x58,0x09,0x19,0xa8,0x07,0x0d,0xae,0x36,0x80,0xaf,0xdd,0xef,0xbd,0x4c,0xea,0xad,0xf7,0xbb,0xed,0xf7,0x02,0x7c,0x55,0x25,0xe6,0xb5,0xc2,0xe8,0x01,0xef,0x26,0xd0,0x1d,0xa4,0x8b,0x32,0x9e,0xe6,0x8c,0x63,0xf9,0x5a,0xde,0xf7,0x26,0xd4,0x26,0x04,0xbc,0x04,0x1d,0xdd,0xe0,0xd7,0x6b,0x84,0x0d,0x73,0xe5,0x4b,0xe5,0xfb,0xf5,0x86,0xd1,0xd5,0x5d,0x08,0x72,0x03,0xd2,0xca,0x95,0xf2,0x75,0x43,0x0f,0x07,0xc2,0x00,0x71,0x2b,0xc6,0xa3,0x92,0x75,0x08,0xbd,0x39,0xc1,0xd5,0xe4,0xf9,0x98,0x62,0xfb,0xea,0xaf,0x06,0x0b,0xc8,0x95,0xb6,0xcd,0x1b,0xdf,0xc6,0x59,0x08,0xd3,0xb5,0x1c,0x51,0x64,0x5e,0x00,0x71,0x06,0x69,0xdd,0x76,0x61,0xe9,0xd4,0x14,0x20,0xd2,0x30,0x39,0x0b,0xc2,0xe0,0xb5,0x2c,0x6a,0xe2,0x61,0x10,0xe6,0x3a,0x70,0xf6,0x0a,0xc2,0xa6,0x93,0xec,0x7e,0x30,0x06,0x8c,0xb2,0x06,0x55,0xd1,0x2e,0xd7,0xad,0x92,0x5c,0x87,0xa4,0xe0,0x34,0x46,0x46,0x0a,0x76,0x14,0x24,0xa7,0x68,0xa4,0x60,0xa4,0x7a,0xe4,0x4e,0x85,0x31,0xc6,0xaa,0xd5,0xd0,0xe5,0x2d,0x49,0xdc,0x9f,0x76,0x3e,0x18,0x26,0x64,0x44,0x0d,0x5d,0x48,0xcc,0x00,0xcc,0xae,0xb6,0x19,0x5b,0x23,0x70,0x8d,0xf0,0x85,0xfd,0xc7,0x2f,0x0a,0xba,0xd5,0xa4,0x1a,0x09,0x5f,0xa1,0x04,0xfc,0x22,0xa4,0x65,0x38,0xcd,0xb5,0x84,0x95,0xd1,0x78,0x82,0xa6,0x3a,0x0f,0x06,0xd5,0xcf,0x40,0x09,0x06,0xae,0xf8,0xcb,0x03,0xa8,0x20,0x57,0x03,0xf2,0x00,0xb5,0xbe,0x8e,0xf4,0x9b,0x00,0xd9,0x80,0x9c,0xab,0xe9,0x84,0x3d,0xa2,0xe3,0x51,0x1a,0x5d,0xc5,0xb2,0x4a,0x5f,0x15,0xf8,0x5a,0xa9,0xb7,0x70,0x96,0x30,0x06,0xbc,0x2a,0x49,0x23,0xa1,0xe1,0x30,0xf0,0x5e,0x02,0xba,0x66,0x3d,0x59,0x9c,0x2f,0x88,0xac,0x2b,0xb3,0x18,0x1e,0xf8,0x81,0x67,0x1b,0xe6,0x51,0xf9,0xca,0x0f,0x3d,0xdc,0x18,0x4a,0x36,0xee,0x1f,0x67,0xb8,0x1a,0x53,0xac,0x97,0xf1,0x8e,0x5f,0x02,0xb8,0x31,0xb9,0xbd,0x98,0x1d,0x63,0x24,0x6d,0xd3,0xcb,0x72,0xfd,0xe6,0x79,0x4b,0x65,0x12,0x61,0x7c,0x6d,0xd9,0x14,0xfb,0xcc,0x43,0x31,0xff,0x46,0xc1,0x38,0xe6,0x63,0xa9,0x50,0x06,0xdb,0x02,0xb1,0x01,0x91,0x42,0x35,0x6d,0x81,0xb8,0x96,0x86,0x81,0xe2,0xc6,0x22,0xf1,0x26,0xc7,0x4e,0xa9,0x36,0x81,0xf0,0x50,0x37,0x28,0x98,0xca,0xaa,0x4f,0x20,0x2c,0x71,0x3c,0x86,0x55,0xd1,0x9a,0x8f,0x30,0xf3,0x94,0x3a,0x24,0x18,0xa9,0x15,0x3d,0x29,0x98,0x8f,0x3b,0x39,0x20,0x58,0x69,0xd6,0x95,0x9a,0x81,0xca,0x18,0xcb,0x14,0x96,0x3b,0xb7,0x50,0x43,0xf7,0x1a,0x55,0xd5,0xf5,0x6a,0x00,0x38,0x1a,0xcb,0x60,0xf0,0xf8,0x9c,0xa3,0x2b,0x95,0x71,0x85,0xd2,0xae,0x1d,0xae,0x01,0xc0,0x63,0xcb,0xf4,0x05,0x88,0x4f,0x6f,0xff,0xb7,0x0a,0xa3,0xcc,0x43,0xf9,0xa2,0x20,0xf7,0x16,0xfb,0x36,0x4a,0x45,0xf6,0xbb,0x82,0xab,0xef,0xbd,0xc9,0x0f,0xca,0xfc,0x9d,0xfd,0x59,0x6e,0xaa,0x62,0xe8,0xdc,0x6f,0xb2,0x17,0x2e,0x8e,0x09,0x99,0xa3,0x44,0x45,0xe6,0xb8,0x54,0xf5,0x3c,0x68,0x74,0x55,0xd4,0x3d,0x4b,0xf9,0x2f,0x04,0xbe,0x04,0x51,0x47,0x57,0x52,0x6f,0x01,0xbc,0x10,0xe0,0x95,0xdf,0xb2,0x98,0x07,0x81,0xb7,0x56,0x57,0xd8,0x75,0x5a,0x05,0x57,0x4b,0xb9,0xce,0xfe,0xb9,0x04,0x6c,0x2f,0x9b,0x86,0x6e,0xe0,0xbc,0xf1,0xa6,0xfc,0xae,0x98,0xed,0x46,0xb5,0xe6,0x8b,0x84,0xaf,0x38,0xbb,0xab,0x5a,0x63,0x5e,0x27,0xb8,0x2b,0x64,0xda,0x23,0x4f,0xea,0x3c,0x22,0xe5,0x31,0x92,0x86,0xe2,0x86,0x4e,0x77,0xa3,0x74,0xcf,0x15,0x51,0x4c,0x24,0x2a,0xe7,0x55,0x02,0xe3,0xba,0x09,0xc5,0xbc,0x2c,0xc1,0xd8,0x4b,0xbd,0x36,0x03,0xb1,0x05,0x3a,0x59,0x13,0xf2,0x9c,0x31,0x2a,0x1b,0x40,0x29,0x68,0x65,0x43,0x28,0xe2,0xe3,0x48,0x57,0x00,0xe1,0xc1,0x73,0xc2,0x49,0xfd,0x3a,0xb6,0x1f,0x2c,0x4d,0xf4,0x1e,0x31,0xf4,0x0d,0xb2,0xc6,0xf7,0x82,0x33,0x8d,0xcd,0x52,0xb0,0xe9,0x6c,0x65,0x32,0x10,0x06,0x85,0xde,0x54,0xa7,0x4d,0xc6,0x8a,0x03,0xd6,0xd0,0x4a,0x1d,0x7b,0x4e,0x39,0xcc,0x98,0x00,0xbe,0x4a,0x0b,0x13,0xe1,0x8a,0x8f,0x2f,0x3d,0x0f,0x7c,0x59,0x18,0x4b,0x74,0xf5,0xcc,0xae,0x06,0xc0,0x95,0xf0,0x72,0x9d,0xd0,0xdf,0x01,0x1c,0xaa,0x9c,0xdb,0xfc,0x1a,0xc3,0x38,0x3d,0x56,0x62,0x11,0x7a,0xf7,0xfe,0x22,0x0d,0x60,0x76,0x3d,0x69,0x92,0x15,0xea,0xe7,0x7e,0x76,0xfd,0x0a,0x09,0x51,0x68,0x5c,0x3f,0x81,0xb5,0x7c,0x4e,0xff,0x8f,0x48,0xbf,0xe8,0xd3,0xde,0x0c,0xd2,0x56,0xf5,0x9c,0x32,0xcf,0x7f,0x2c,0x13,0xa1,0x82,0xa9,0xb5,0x76,0xbe,0x32,0xf8,0xea,0xf3,0x4d,0xe0,0x6b,0xd4,0xcd,0x2e,0x45,0xca,0x51,0x86,0x80,0xd7,0x12,0xb7,0x7a,0x81,0x8e,0x82,0x6e,0xdd,0xf1,0x57,0x04,0xdb,0xe4,0xc1,0x6b,0xf0,0xe5,0x78,0xb2,0xa2,0xa2,0x55,0xf8,0xaa,0x41,0xf1,0xef,0x33,0x7c,0x2d,0x75,0xdf,0x90,0x69,0x29,0xe8,0x56,0x2f,0x6a,0x45,0x72,0x19,0x4a,0xa6,0x96,0x43,0x11,0x7f,0x10,0x9c,0x5d,0x2f,0xa2,0x8d,0x42,0x96,0xd9,0x37,0x60,0x4c,0x5a,0xa7,0x21,0x8d,0xa6,0x02,0x49,0xda,0x5e,0x62,0x46,0x7d,0x10,0x88,0xc9,0x8b,0x45,0xb3,0xd9,0x23,0x1e,0x50,0x4b,0x33,0x70,0x26,0x1d,0x2c,0x94,0x6e,0x5c,0x0b,0x84,0xa1,0x27,0x8f,0xc7,0xf7,0x83,0xa1,0x1a,0xb2,0xd4,0x08,0x42,0x81,0x8c,0x96,0x7e,0x88,0x41,0xd6,0xb0,0x14,0x1c,0x4d,0xe4,0x24,0xba,0xa3,0x7f,0x24,0x49,0xdb,0x52,0x1b,0x63,0xd9,0x8e,0x2c,0x8b,0x64,0x46,0xcb,0xbe,0xb3,0x2f,0xf2,0xe8,0x94,0x6a,0xe8,0xa2,0xf2,0x29,0x5d,0xff,0x3c,0xf0,0x06,0xf8,0x2b,0x5e,0x8c,0xe1,0x90,0x65,0x12,0x87,0x0d,0xc5,0x2e,0x0b,0xd7,0xc1,0xf2,0xaf,0xc1,0x08,0x6b,0xbc,0xe8,0x2b,0x4b,0x13,0x26,0x62,0x99,0x9b,0x2b,0xe3,0xf5,0xf2,0xd7,0xe7,0x43,0x92,0xb2,0x4d,0x56,0xd5,0x24,0x01,0x62,0x7e,0xe7,0xfa,0x11,0x52,0x06,0x83,0xc6,0x57,0x29,0xa6,0x95,0x7e,0xcd,0x9b,0x84,0xc4,0xd7,0x95,0x7e,0x81,0xa4,0xe6,0x29,0xa4,0x5f,0x54,0xaa,0x67,0x79,0x1c,0x5d,0xce,0x27,0x81,0xa9,0x1a,0x2c,0x5d,0x07,0x7c,0xad,0xca,0x39,0xab,0x9b,0x39,0x95,0x4f,0x0c,0xc8,0xa5,0xc0,0x3b,0x00,0xba,0xf9,0x12,0x87,0xaa,0x6f,0x7a,0xb0,0xeb,0xaa,0xf7,0x55,0xa8,0x88,0xf5,0xd0,0xc8,0x55,0x05,0x17,0x31,0x92,0xa3,0x03,0x18,0x82,0x7c,0xd5,0xd0,0x9b,0x82,0x5f,0x2f,0x4a,0x5f,0x97,0x01,0xfe,0x6a,0x14,0x64,0x75,0x88,0x1b,0x7f,0x02,0xb8,0x5e,0x37,0xa4,0xf4,0x95,0xfa,0xd2,0x84,0xfc,0x8b,0x40,0x3d,0xe3,0x0f,0xb3,0x1f,0x5b,0x4f,0x28,0x2a,0x1f,0x27,0x60,0x50,0xa5,0xa7,0x00,0x44,0x32,0x70,0xb6,0x6a,0xea,0xba,0x5d,0x3d,0x20,0x8e,0xe6,0xc4,0x8c,0xec,0x4d,0x12,0x04,0x38,0x4b,0xc0,0x61,0x69,0xf8,0x1a,0x20,0x0c,0x80,0x54,0xb5,0x9c,0xce,0xe9,0x66,0x10,0xce,0x0d,0xb6,0x12,0xb7,0xb6,0x4d,0x76,0x3d,0x93,0x05,0xba,0x2c,0xed,0x41,0x29,0x18,0xb2,0x86,0x07,0xa4,0x60,0xa1,0x4f,0x05,0xf9,0xb0,0x21,0xdd,0x19,0x5c,0x83,0xa3,0x05,0x7b,0xa5,0x2b,0xd5,0x7b,0xc7,0x65,0x64,0x66,0x22,0x8d,0x48,0x2a,0x77,0x78,0xf6,0x6a,0x9d,0xc6,0x40,0xb1,0x62,0x32,0x36,0xc8,0x78,0x9b,0xc2,0x66,0xf0,0xbc,0xc6,0xaa,0x1a,0xea,0xb7,0x81,0x30,0x02,0xc0,0xd7,0x58,0xee,0x3d,0x4a,0xba,0xa1,0x92,0xa3,0x84,0xf4,0xb2,0x04,0x06,0x75,0x7a,0x0b,0x3c,0x0e,0x3d,0xe4,0xf8,0x09,0x7b,0x86,0xea,0x25,0xe9,0x46,0xeb,0xd4,0x7f,0x51,0xac,0xff,0x11,0xf5,0x73,0xb9,0x0f,0x2c,0x5c,0xa3,0xdd,0x07,0xd5,0x77,0xd7,0x92,0x7e,0x91,0xcf,0x0e,0xbb,0x32,0x76,0x06,0x1d,0x55,0x3d,0xd7,0xfb,0xc6,0xa2,0x06,0x53,0x29,0xfa,0xaa,0xe0,0x3b,0x20,0xf5,0xaa,0x3a,0x4d,0x4b,0xf5,0x45,0x3f,0x98,0xbe,0xbc,0x0a,0xf0,0x56,0xf3,0xa6,0xc7,0x2e,0x0d,0x8d,0x4b,0x8f,0x00,0xf7,0xe5,0xe4,0x9e,0x77,0xa2,0x62,0x88,0xa3,0xc4,0x19,0x08,0x7e,0xf4,0xc7,0x97,0x0a,0xd7,0x05,0xce,0x7f,0x08,0xe5,0x8e,0xaf,0x60,0xbf,0xf1,0xe7,0x78,0x18,0x01,0x37,0x3f,0xf4,0xd0,0x94,0x1f,0x7b,0x4f,0xd2,0x88,0x27,0x89,0xad,0x68,0xe8,0x10,0x20,0xbb,0x44,0xf7,0x95,0x88,0x5b,0x30,0x56,0x4c,0x56,0x67,0x19,0xb5,0x25,0x6f,0x11,0x12,0x10,0x2b,0x49,0xc9,0xd2,0x30,0x3b,0x81,0xc8,0x60,0x5b,0xb4,0x71,0x0c,0x84,0x75,0x7b,0xc9,0x82,0xb0,0xb5,0x26,0x36,0x2e,0x24,0x6d,0x73,0x93,0x87,0xaa,0xc2,0x0f,0xa3,0x95,0x78,0xb5,0x81,0x97,0x49,0xc1,0xfa,0xdd,0x5a,0x44,0xe7,0x67,0xd9,0x3b,0x16,0xa7,0x2f,0xd4,0xd0,0x45,0x60,0xc9,0xb9,0xa8,0x86,0x2d,0x62,0xc8,0x1a,0x3a,0x73,0xc1,0x65,0x82,0xa4,0xc1,0xb3,0xbc,0xcc,0x18,0xae,0x54,0x05,0x79,0x14,0x1a,0xcf,0x8a,0x12,0x54,0x05,0x8c,0x64,0x79,0x09,0x84,0xf5,0xda,0x70,0x65,0x4c,0x1e,0x8e,0xfc,0xd5,0x4b,0xc0,0xc3,0x14,0xf6,0x2b,0x4b,0xee,0x7a,0xf1,0x7c,0xf9,0xd0,0x15,0x6f,0x37,0x7c,0xd7,0x9f,0x9b,0x54,0x96,0x23,0x00,0x7d,0x25,0xf5,0xb3,0x05,0x47,0xf9,0xeb,0x80,0x52,0x62,0x76,0x79,0x6d,0x5c,0x2a,0xfd,0x9a,0x8c,0xf5,0x4f,0x52,0x3d,0x93,0x51,0x3d,0x9b,0xaa,0xd8,0xdb,0x5d,0x3c,0xca,0xce,0xfd,0x2a,0xc1,0xb7,0x06,0xc6,0x01,0xe0,0x4d,0x29,0xab,0x01,0x2e,0xfa,0xa8,0xee,0xeb,0x8a,0xd9,0xc8,0x0f,0x75,0x22,0xeb,0x6e,0x9f,0x65,0xce,0x36,0x9c,0xb6,0xf5,0xbd,0x2f,0x5f,0x3a,0xfc,0xe7,0x02,0xd8,0xaf,0x33,0x5c,0xa5,0x4d,0xd7,0x93,0xb0,0xfd,0xe0,0xd7,0x1c,0x4a,0x80,0xb6,0x53,0xbd,0x18,0x5f,0x58,0xa2,0x9c,0x6b,0x90,0x21,0x67,0x04,0x90,0x07,0xc0,0xb8,0x20,0xcf,0xee,0x05,0x80,0x58,0x92,0x67,0x69,0xf8,0xff,0x6f,0xef,0xcd,0xc3,0xf5,0xba,0xae,0xfa,0xe0,0xdf,0x3e,0xf7,0xea,0x4a,0xd6,0x64,0x59,0xb2,0x6c,0xd9,0x92,0x6d,0x59,0x92,0xed,0xcc,0x71,0xe6,0xc9,0x10,0x32,0x41,0x12,0x86,0x0c,0x04,0x42,0x68,0x99,0xbe,0xb6,0x61,0x0a,0x04,0xc2,0x43,0xfb,0xb5,0x14,0x68,0x03,0xa5,0x40,0xdb,0x00,0x5f,0x99,0x4a,0x49,0x0a,0x64,0xfc,0x12,0xe2,0x86,0x21,0x0e,0xc4,0x98,0x4c,0x72,0x1c,0x3b,0xb6,0x63,0x3b,0x9e,0x25,0xdb,0x1a,0x6c,0x6b,0x96,0xac,0xe1,0xea,0x8e,0xef,0xde,0xfd,0x63,0x4f,0x6b,0xed,0xbd,0xf6,0x3e,0xe7,0xbc,0xf7,0xbd,0x92,0xdc,0x87,0xe5,0xc7,0xba,0xef,0x39,0x7b,0x5a,0x7b,0xfc,0xad,0xb5,0xf6,0xda,0xfb,0xc4,0x79,0x14,0x3f,0xb9,0x47,0xea,0xdc,0x43,0x13,0x0e,0xa6,0x68,0xd2,0x18,0x56,0x99,0xe4,0x5a,0x70,0x6e,0x8a,0x76,0x7c,0xa0,0x45,0x0b,0x46,0xc5,0x23,0x3a,0xb9,0x1d,0xcb,0x26,0x50,0xc4,0x19,0x8b,0x98,0xa1,0xfd,0x5c,0x74,0x4b,0x9b,0x2d,0xb2,0xc5,0x1b,0x3a,0x6b,0x4b,0x14,0x06,0x93,0x57,0x2a,0x7c,0x72,0x95,0xc7,0x4d,0x9e,0xf9,0xa3,0x7f,0xf2,0xf5,0x2a,0xb3,0xd0,0x4e,0x64,0x3d,0x1e,0xb1,0x69,0xa9,0x13,0x00,0xb7,0x4f,0x48,0x39,0x46,0x3d,0x9d,0x92,0x63,0xc8,0x62,0x4b,0x81,0xda,0x16,0xd2,0x12,0xf8,0xc6,0x41,0x51,0x3d,0x7e,0x65,0x05,0x88,0x40,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x64,0xc5,0xcc,0x84,0x1f,0xfa,0x60,0x40,0x35,0xe5,0x56,0xf3,0x33,0x88,0xf9,0x59,0xc0,0x6c,0x9e,0x4f,0x60,0x28,0xd1,0x7e,0x63,0x1d,0xe2,0x95,0x9b,0xa6,0x68,0x7a,0x0e,0xfb,0xbe,0x8a,0x5c,0x83,0xc9,0x1c,0xae,0x80,0x36,0xf0,0x15,0xf7,0x7b,0x4b,0xe0,0xcb,0x58,0x1c,0x16,0x78,0x63,0x9e,0x86,0x58,0x38,0x94,0x7b,0xc3,0x01,0x57,0xc8,0x62,0xc4,0x40,0xbb,0x38,0x20,0xbb,0xb8,0x26,0xeb,0x76,0xea,0xbf,0xb7,0x45,0xa9,0xd4,0x26,0xc3,0xad,0x4f,0x25,0x80,0x76,0x8e,0x7e,0x84,0xd5,0x78,0x27,0x86,0xf2,0x51,0xc8,0xb8,0xa0,0xe5,0xbb,0xf9,0x4d,0xcd,0xc7,0x24,0x99,0x32,0x3e,0x55,0x0e,0xc4,0xec,0x88,0x93,0x04,0xc4,0x21,0x49,0x13,0xb4,0x61,0x4d,0x3c,0x94,0x94,0xa2,0x26,0x69,0x52,0xaf,0xaa,0x26,0x4c,0x99,0x4f,0x40,0x38,0xcc,0x65,0x2b,0x20,0xa8,0x70,0x1f,0x79,0x4a,0x25,0x2d,0xd8,0x7f,0xc1,0xcb,0x85,0x17,0x30,0xd1,0x2f,0x77,0x12,0xa8,0x65,0xfd,0x1d,0xcc,0xd0,0x69,0xcc,0x16,0xc0,0x6d,0x50,0xde,0x07,0x0e,0x5f,0xc9,0xa2,0xfc,0x27,0xf5,0xa4,0x0c,0x19,0xbf,0x2e,0xe4,0xfb,0xc0,0x22,0x15,0x23,0x95,0x91,0x75,0x11,0x30,0x97,0xd1,0xe2,0x7d,0x8c,0xa1,0x48,0xfd,0xab,0x93,0x2d,0xbc,0x2d,0x31,0x03,0x31,0x69,0xd9,0x4f,0x32,0x25,0xc4,0x94,0x9e,0x12,0xd3,0x36,0x05,0x93,0x24,0x19,0x95,0xd8,0x79,0x60,0xc9,0xfc,0xec,0xd9,0xb2,0xc0,0xc6,0xae,0x9c,0xac,0x6a,0xbf,0x24,0xab,0xf0,0xce,0x84,0x33,0xc7,0x8a,0x46,0xf0,0x87,0xfb,0xfd,0xbe,0x2f,0x2b,0xdb,0x4d,0x9c,0xcc,0xdb,0x99,0x16,0x10,0x35,0x5f,0x19,0x7c,0x0b,0xd6,0x81,0x90,0x85,0x17,0x1e,0xd2,0x36,0x89,0xdc,0xe4,0xf2,0x91,0xd7,0x1e,0x28,0xe8,0x92,0x76,0x13,0x30,0x8b,0xca,0x0f,0xa3,0x00,0xb5,0x6e,0x60,0xdb,0xa1,0x9c,0xb3,0x8d,0xaf,0xad,0xd4,0x81,0xc1,0x4e,0x18,0xcd,0x23,0x49,0xed,0x37,0xfc,0x02,0xd6,0xb0,0x3f,0x01,0x90,0x91,0x58,0x5e,0x49,0xc9,0xd6,0xe8,0xe3,0xcf,0xc0,0xfa,0xb2,0x89,0x26,0xe9,0x5f,0x86,0x67,0xe5,0xa6,0x43,0x7c,0xa9,0xdc,0x7e,0x68,0x04,0x62,0xcd,0xab,0xc9,0xc6,0xad,0xb5,0x95,0x36,0xaa,0x61,0x20,0x1c,0xb4,0xc9,0x2a,0x08,0x23,0xec,0xfd,0x46,0x6e,0x4c,0x3c,0x66,0xeb,0xf9,0x4f,0x4d,0xd1,0x8c,0x95,0x2e,0x5a,0xb0,0x37,0x31,0x0b,0xc4,0x6e,0xc7,0x62,0x0d,0x63,0xff,0x19,0xe8,0xb8,0x26,0xa1,0x01,0x9a,0x41,0xde,0x16,0x45,0x10,0x8e,0x82,0x3e,0x0b,0x4f,0xeb,0x97,0xe5,0x45,0x42,0x5a,0x1d,0xb1,0xc4,0x4a,0x75,0x88,0x23,0x55,0x60,0xd8,0x74,0x7d,0x43,0x23,0x11,0x00,0x2e,0x4c,0xc8,0x66,0xc4,0xf8,0x9f,0x2d,0xba,0x8a,0x3f,0x4b,0xc5,0x75,0x68,0x73,0xf1,0x1b,0xb2,0x94,0xb2,0x60,0x09,0x78,0x38,0x48,0x17,0x59,0x48,0xf6,0x7f,0xb3,0xbf,0x0d,0x01,0x3c,0xff,0x57,0x01,0x99,0xf9,0xd9,0xff,0x61,0x00,0x42,0x67,0x6b,0x5a,0xf5,0x58,0x09,0x76,0xe6,0x57,0x13,0x70,0x52,0x3c,0x6b,0x21,0x13,0xf7,0x8e,0x7c,0x94,0xc1,0xa3,0x58,0xe3,0xcb,0x68,0x33,0x3b,0x37,0xb1,0xaf,0x24,0xe1,0x20,0x68,0xee,0x29,0x03,0xfe,0x48,0x16,0xe5,0x23,0xd5,0x5a,0x68,0x1d,0x7d,0x7b,0x0a,0xec,0x37,0x85,0x80,0x21,0x28,0x6f,0x9e,0xa6,0xfa,0x28,0xd3,0x39,0x8f,0xb8,0xfd,0x29,0xab,0x52,0x07,0xaf,0x2b,0x51,0xb3,0x2a,0xec,0xf1,0x2e,0x80,0x21,0xdb,0xff,0x6e,0x4f,0x3f,0xdb,0x57,0x76,0x00,0xa4,0x7d,0x69,0x3e,0x1d,0x31,0x8f,0xc2,0x04,0x2d,0xd8,0xe2,0x84,0xf7,0xd0,0x26,0xa6,0xd6,0x80,0x8d,0x6e,0x6e,0x94,0xcc,0xd2,0x02,0x08,0x2b,0x28,0xeb,0x81,0x9d,0x56,0xd6,0x83,0x30,0xd1,0x6c,0x63,0x3e,0x40,0x7a,0x46,0x18,0x54,0x0b,0x26,0x5e,0xd1,0xfd,0xb4,0xe0,0x24,0x08,0x88,0xce,0x58,0xb1,0x60,0xdf,0x10,0x4e,0xb3,0x1c,0xd8,0xb7,0xcc,0xa7,0x25,0x9a,0x9f,0x73,0x37,0xaa,0xfa,0x71,0xa4,0xd8,0x98,0x69,0x59,0x74,0xd9,0x77,0xbf,0x5a,0x94,0xe8,0x0e,0x11,0x44,0xca,0xe1,0x25,0x11,0x10,0xba,0xa2,0x66,0x67,0x2a,0x29,0x8d,0x91,0xff,0x05,0x6a,0xc0,0x6d,0xc8,0x38,0xda,0x45,0x89,0xc0,0x80,0x23,0xc9,0x01,0xcb,0x20,0x9f,0xa8,0x29,0xb5,0x38,0x60,0xe5,0x85,0x92,0x67,0x32,0x20,0x0d,0xe4,0xfd,0x5f,0x31,0x7d,0x38,0xdd,0x56,0xce,0xdb,0xbf,0x2a,0x9e,0xfb,0x85,0xd3,0x7e,0x7d,0xa5,0x8c,0x20,0x47,0x90,0xc9,0x9d,0x69,0xbf,0x7c,0xd0,0x83,0xa6,0x21,0x5a,0xc6,0xf0,0xe0,0x4b,0xda,0x3d,0x01,0x5f,0xfe,0x75,0x25,0x24,0xc0,0x1b,0x4a,0x88,0x71,0xa5,0x7e,0x6b,0x20,0x8c,0x81,0xe1,0x28,0xcb,0xa7,0x9a,0x65,0x8f,0xf2,0xba,0x8c,0xa9,0xa7,0x1b,0x85,0x8e,0xea,0xaa,0xf9,0x67,0x4e,0x00,0xf1,0x27,0xdd,0xe3,0xed,0x6a,0x3a,0xac,0x17,0xe6,0xb6,0x64,0x75,0xc8,0xdf,0x93,0x72,0x60,0x2c,0x01,0x31,0xa0,0xdc,0x49,0x9a,0x78,0xe3,0x9b,0xd5,0x1a,0xf9,0xe0,0xb6,0xdf,0xcf,0xf5,0xc9,0x9b,0x82,0x49,0x3a,0x7a,0x0d,0xe5,0x20,0xec,0xe6,0x63,0x5a,0xd1,0xa0,0x05,0x52,0x53,0x74,0x7c,0xcf,0xaa,0x48,0xb4,0x66,0x89,0xaa,0x5a,0x30,0xd3,0x48,0x13,0x13,0xb1,0x4a,0x1a,0x8c,0xf1,0xc6,0x61,0xb1,0x88,0x79,0x35,0xf0,0x22,0xef,0xea,0xd8,0xd6,0x05,0x50,0x15,0x24,0x2f,0xf9,0xdc,0xab,0x8f,0xd4,0x6d,0x24,0x60,0xda,0xc6,0x5b,0xa5,0xa0,0x0e,0xd5,0xea,0x08,0xc0,0xa3,0x5a,0x55,0x6a,0xad,0x92,0x6b,0xa4,0x99,0xb4,0x32,0xd4,0xba,0x5b,0x28,0xb3,0xb5,0x4a,0x6d,0x00,0x6d,0x20,0x69,0xca,0x2c,0x73,0x29,0xbc,0xe6,0xfd,0xcc,0xbc,0xb5,0x55,0x02,0x72,0x69,0xe5,0x5d,0xdc,0x74,0xef,0xb7,0xaa,0xfd,0x16,0x4c,0xcf,0x92,0x86,0x99,0xaa,0xaa,0x2a,0xe9,0x9f,0x56,0xf0,0x8d,0x11,0x52,0xf0,0x35,0x2c,0x6d,0x57,0xe0,0x5d,0x28,0xe8,0x36,0xe5,0xa6,0x2c,0xbf,0xf4,0x8c,0x8d,0x8c,0xce,0x45,0x3d,0xb9,0x55,0x97,0xe8,0x53,0xff,0xa0,0x02,0x15,0xa8,0xe1,0x0b,0x26,0xc5,0x80,0x60,0x2e,0x1e,0x82,0xc2,0xc5,0x18,0xcd,0x90,0x40,0x6c,0xac,0x56,0x67,0x15,0x35,0x5f,0x61,0x3b,0x01,0xa9,0x59,0x58,0x04,0x61,0xea,0x0f,0x41,0xc0,0x18,0x21,0x75,0xdd,0x14,0xed,0x6b,0x40,0xe7,0x7e,0x70,0xc8,0x12,0xbf,0x1e,0x64,0xf9,0x28,0x6b,0xc1,0x84,0xa8,0x55,0x59,0x50,0xc8,0x99,0xc5,0xcb,0x44,0xfd,0x36,0x65,0x89,0xcb,0xdb,0x5e,0x53,0x55,0xc2,0xad,0x58,0xd2,0x47,0xfc,0x2a,0x48,0x44,0x9b,0x3a,0x0d,0x8a,0xcd,0xd8,0x93,0xa2,0x7e,0xce,0xf8,0x0e,0x65,0x0d,0xa7,0x41,0x2f,0x06,0x09,0x00,0xbc,0x90,0xd5,0x66,0x08,0x91,0xa3,0x58,0x1c,0x5d,0xe9,0x3b,0xf2,0x44,0x17,0xfe,0x06,0xa0,0x77,0x83,0x4a,0x79,0xb0,0xf3,0xb3,0x05,0x7c,0xe3,0x81,0x8a,0x87,0xd3,0xe8,0xec,0xf6,0x2b,0x40,0x81,0x7e,0x33,0x57,0x30,0x59,0xfb,0xbc,0xa9,0xf7,0x73,0x20,0xc9,0xfc,0x1c,0xc3,0x94,0x33,0x55,0xe7,0xe1,0x3d,0xb5,0x5f,0xa9,0xe2,0xe1,0x1d,0xd1,0xa9,0xd9,0x02,0x23,0x30,0x46,0x04,0x80,0x50,0x5e,0xc8,0xae,0x23,0xf8,0xa6,0x1f,0x6c,0x75,0xc1,0x0b,0x03,0xde,0xa6,0x60,0x01,0x29,0xe4,0x39,0x72,0xa0,0x7d,0x7a,0xa8,0xc3,0x72,0x6b,0x0c,0x09,0x87,0xb5,0x2a,0x97,0xc0,0xb9,0xf1,0x60,0x65,0xc3,0x0d,0x2b,0xb8,0x1f,0x07,0x6d,0x40,0x6c,0xa0,0x10,0x0f,0xf1,0x52,0x8d,0xc9,0x7f,0x88,0x20,0x1e,0xd5,0x33,0xec,0x4c,0x6c,0x0b,0x08,0x03,0x01,0x7c,0x9b,0x70,0x3c,0x29,0x30,0x45,0x2d,0xdb,0xa4,0x68,0x5b,0x7e,0xd4,0x82,0x93,0xf8,0x59,0xe5,0xc8,0xde,0x71,0xb5,0x15,0x6a,0x66,0x68,0x55,0xf0,0x86,0x1e,0x24,0x19,0x5b,0x33,0x34,0x94,0xca,0xf7,0x81,0xfd,0x91,0xa3,0x1a,0xaf,0xad,0x24,0xf4,0x41,0x46,0x1e,0xe8,0x7d,0x14,0x45,0xdf,0xca,0x29,0x18,0x68,0xb7,0x30,0x37,0x14,0xef,0x5d,0x13,0xb4,0x98,0x04,0x1c,0x9d,0x39,0x81,0xbc,0xcf,0x5a,0xd4,0x35,0x6e,0x7a,0x04,0xa9,0x13,0x49,0xea,0x5e,0xa9,0x60,0x55,0x79,0x2a,0xbd,0x4b,0x19,0x72,0x00,0x94,0x7e,0x21,0x4a,0x90,0x2b,0x54,0x8a,0x6e,0xa2,0xf9,0x99,0x24,0x68,0x80,0xec,0x52,0x8b,0x22,0x73,0x82,0xf6,0xcb,0x4c,0xcf,0x31,0x53,0xa6,0xb8,0x87,0x6a,0xe4,0x16,0x8a,0xc0,0x83,0x54,0x1c,0x38,0xf8,0x1a,0xbf,0x80,0x65,0x09,0x55,0x0e,0xbe,0xc1,0xd2,0x3d,0xcc,0xf0,0xb4,0xc2,0x87,0x6a,0x52,0xf0,0x6d,0xc8,0xff,0x88,0xed,0x4a,0xff,0xef,0x45,0x31,0x61,0x23,0xfc,0xff,0x74,0x01,0xdf,0x32,0xc9,0x75,0x5b,0x40,0x83,0x55,0xda,0x9b,0xf7,0x8d,0x02,0xe2,0x09,0xbb,0x26,0xe9,0xb7,0xce,0x45,0xb9,0x34,0x49,0x52,0x2b,0x5f,0xa6,0x93,0xca,0x8f,0x09,0xbb,0x6f,0x1b,0xb4,0x4a,0x2a,0xd0,0x23,0xf1,0x5f,0x48,0x6f,0x70,0x0b,0x79,0xb9,0x5f,0x64,0xf0,0x65,0x5f,0x13,0xe3,0x8c,0x16,0x1e,0x54,0xe0,0x49,0x35,0xb4,0x12,0xa5,0x76,0x68,0xc0,0x4e,0x31,0x30,0x66,0x69,0x3a,0x62,0x01,0x60,0x59,0xd1,0xf5,0xca,0xf0,0xb7,0xa9,0x8c,0x2e,0x29,0x2b,0xd9,0x03,0x61,0x44,0xf9,0x72,0xdd,0x73,0x13,0x55,0x03,0x99,0x2a,0x8a,0x53,0xe7,0x61,0x57,0x57,0xbe,0xaa,0xe9,0xce,0xe0,0xd4,0x3d,0x0b,0x5e,0xd0,0x65,0xea,0x8c,0xbb,0xc3,0xe6,0xcc,0xff,0x94,0xf7,0xc8,0x53,0xca,0x16,0x72,0x9a,0x4b,0xf2,0xb7,0x60,0xb9,0xce,0xdf,0x15,0x24,0xbf,0x3e,0x6b,0x5b,0xe6,0x7c,0x45,0x35,0x09,0xb9,0xf0,0x6a,0xd6,0x82,0x20,0xc2,0x3c,0xb4,0xc5,0xf6,0x4a,0x81,0x39,0x11,0x3c,0xe0,0xf6,0xa1,0x18,0xaa,0x53,0xf0,0x95,0xb2,0xeb,0x72,0x6f,0xb3,0xc0,0x47,0x26,0x23,0x48,0xda,0x7d,0x81,0x8a,0xb6,0xae,0x7c,0xc1,0x73,0x3a,0x56,0x0f,0xde,0x2a,0x05,0x67,0x02,0xcd,0x22,0xcf,0x7e,0x76,0x74,0x44,0xa2,0x76,0xdd,0x8a,0x65,0x27,0x17,0xd2,0xce,0x87,0x2a,0x4c,0x14,0x43,0x81,0x4b,0xf3,0x57,0x3a,0xfc,0x68,0xcf,0x1f,0x5e,0xdf,0xf0,0x60,0x13,0x3d,0x99,0x95,0xcf,0x93,0x79,0xd8,0xfa,0xf9,0x68,0x01,0xc8,0x6b,0xc3,0xcc,0x39,0xc8,0xff,0xa5,0xca,0x60,0xe6,0x11,0x4c,0x4c,0xd0,0x34,0x7b,0x5f,0x68,0x66,0x8a,0xf6,0xc1,0x89,0x16,0x0c,0x9e,0x3c,0xad,0x58,0x74,0xc6,0x1a,0x50,0xce,0xf2,0x78,0xf0,0xf7,0x43,0x03,0xd9,0x19,0x23,0x5f,0x48,0xa1,0x0c,0x24,0xfb,0xe1,0x59,0x3b,0x94,0x39,0x2c,0x65,0x98,0x3f,0xb2,0xe4,0x89,0x76,0xdd,0x96,0x95,0x97,0x0e,0xba,0xd8,0xa9,0xfb,0xb0,0x7a,0x06,0xa9,0x15,0x80,0xbb,0x2f,0x07,0x67,0xba,0x86,0x6d,0x12,0x71,0x5f,0x38,0x57,0xee,0xdf,0x96,0x74,0x3e,0xb8,0x2b,0x78,0x87,0x44,0x69,0x02,0x9d,0xe0,0x7a,0x32,0x5b,0x8b,0xfb,0xbf,0x5e,0x0d,0xae,0xec,0xa5,0xa7,0xe6,0xe7,0x30,0x63,0x89,0x24,0x5e,0xe0,0x9d,0xe2,0x64,0x74,0x80,0x2c,0x69,0xbf,0x25,0xd3,0x33,0x31,0xe3,0x55,0xc0,0x57,0xb0,0xba,0xa3,0x3f,0xf8,0xb6,0x00,0x2f,0xcd,0xac,0xd3,0x86,0x92,0x3c,0xae,0xea,0xa3,0xad,0xab,0x84,0xd3,0x81,0xf4,0x19,0x98,0x43,0xdd,0xa4,0xb0,0x48,0xa6,0xf8,0xc0,0xda,0x45,0x8b,0x6f,0xf3,0x50,0x9b,0x4d,0xa5,0x2f,0xfc,0x56,0x47,0xd0,0x88,0x75,0x62,0xbd,0x6e,0x88,0x77,0x70,0x9d,0xe2,0x4c,0x69,0x00,0x62,0x96,0x96,0x41,0x98,0xa4,0xf2,0x20,0xac,0x14,0xbb,0x71,0x91,0xc7,0x96,0x84,0xe8,0xa8,0xa9,0xda,0xd0,0x16,0xaf,0x68,0x29,0x0f,0xba,0xc6,0x64,0x15,0x4a,0x9d,0xb1,0x4a,0x6b,0x01,0xc9,0xd7,0xaf,0x25,0x7e,0x19,0x10,0x62,0xb7,0x51,0xd0,0x84,0x53,0xa7,0x6d,0x80,0x00,0x75,0x8b,0x27,0x74,0x21,0xdf,0x85,0x8f,0xf8,0x8e,0x85,0x8d,0x8c,0x46,0x87,0x75,0x8b,0x66,0x82,0x3e,0x83,0x5a,0xbc,0x4c,0xa1,0x3f,0x68,0x43,0x75,0xe0,0x4a,0x88,0x52,0x4c,0x25,0x7d,0x7e,0xb0,0x96,0x30,0x68,0xb7,0xed,0xcd,0x6e,0x93,0xe6,0x9d,0xec,0xdf,0xe7,0x25,0xd7,0xb4,0x3d,0x23,0x08,0x0c,0x89,0xf9,0x39,0xf0,0x25,0x81,0xa5,0xc8,0x4a,0x52,0x54,0x49,0xf3,0x4d,0xca,0xf4,0x71,0x44,0x05,0xa8,0x0f,0xf8,0x3a,0x41,0x83,0x81,0xaf,0x60,0x62,0x0e,0xfc,0xd7,0x26,0x68,0xd9,0xcc,0x99,0xbf,0xf5,0x2b,0x19,0xfd,0x5f,0x28,0x6f,0x68,0x52,0x23,0xfe,0x7f,0xd4,0x2c,0x91,0x7a,0x27,0x65,0xd4,0x0d,0xc5,0x3d,0x4c,0xc9,0x5e,0x7b,0x24,0x02,0xa8,0x4a,0xc7,0x46,0x13,0xfe,0xe9,0xc4,0x3e,0x49,0xc4,0xc7,0x4c,0x43,0x63,0x64,0x13,0x82,0x8c,0x61,0x22,0x5c,0xb2,0x24,0xc2,0xbc,0xa3,0x1f,0x8d,0xe8,0xd2,0x05,0x2a,0x79,0x30,0x49,0x40,0x66,0x86,0xee,0x43,0xd2,0x3e,0x70,0x9d,0x8f,0xa1,0x47,0x4d,0x5b,0x42,0x95,0xfe,0x50,0xe5,0x20,0x0a,0x72,0xba,0x9d,0xa3,0xae,0x3c,0x9f,0x49,0x5c,0xea,0x52,0xd6,0x22,0x99,0xa0,0xf3,0xa2,0x55,0x4b,0x78,0xf7,0x9c,0x16,0x1e,0x73,0x68,0x52,0x3d,0x66,0x55,0x27,0x76,0xea,0xfb,0x48,0xd9,0xa4,0x91,0xbe,0x30,0xb4,0xd8,0xd4,0x41,0xfb,0xcd,0x92,0xb0,0x1f,0xd2,0xe2,0x26,0xe1,0x72,0x9f,0x0a,0x71,0xe1,0x21,0x82,0xaf,0xa7,0xf2,0x91,0x8d,0x2c,0x9f,0x4e,0x21,0x6a,0x04,0xc3,0xeb,0x6c,0x89,0xa4,0x7d,0xca,0xed,0x29,0xd5,0xe7,0xab,0xa6,0xf3,0x99,0x69,0x73,0xe0,0xea,0x60,0x4a,0x4e,0x05,0x26,0x0d,0x84,0x6f,0xe7,0x46,0x2f,0x22,0x72,0xa6,0xb6,0x9d,0xd5,0xa0,0x09,0xa7,0xf1,0xd9,0x2b,0x66,0x17,0xee,0xe8,0xf4,0x94,0x52,0x6a,0xda,0x49,0x8e,0xca,0xf4,0x30,0x43,0x97,0xf3,0x97,0xea,0xdc,0x55,0x13,0x94,0xc6,0x84,0x37,0xff,0xfa,0xda,0x12,0x34,0x2e,0xd9,0xc1,0x7b,0xb6,0x4a,0xf4,0x4d,0x5e,0x28,0x9d,0x75,0xf5,0x6e,0x64,0xb4,0x30,0x00,0x7e,0xba,0xb4,0x43,0xb6,0xce,0xd6,0xcd,0xb0,0x0b,0xa1,0x38,0x74,0x53,0xe0,0x51,0x58,0xb5,0x62,0x39,0xde,0xfb,0xe3,0x3f,0x10,0x63,0xd0,0x05,0x4c,0x01,0xff,0xe3,0xc3,0x7f,0x8d,0x23,0x4f,0x9d,0x8a,0x99,0x55,0x95,0x18,0x05,0x56,0x8f,0x92,0xf4,0x2a,0xa5,0x2f,0xe5,0x49,0xf1,0x7e,0x81,0x6d,0x53,0x9e,0x68,0xaa,0x60,0x7a,0xee,0xda,0x1d,0x8d,0xdc,0x9f,0x5a,0xf7,0xc0,0xf0,0x7a,0x44,0x6f,0xf8,0x5c,0x3c,0x55,0xa0,0x58,0xe8,0xe2,0xd2,0x50,0xe7,0x8d,0x86,0x01,0x65,0x27,0x12,0x99,0xb6,0x93,0xbe,0x3d,0xf6,0x74,0x1b,0x70,0xcf,0xe3,0x86,0xbe,0x1f,0xc2,0x04,0xe9,0x92,0x44,0x18,0x91,0x00,0xc5,0xbe,0x0b,0xdb,0x28,0x6c,0x4f,0xb4,0x65,0x2f,0x98,0x16,0x12,0x5e,0x97,0x00,0xa8,0xcc,0x7f,0x27,0x98,0xa3,0xc9,0x55,0xc3,0xf6,0xbb,0x65,0xa2,0x46,0x74,0xef,0x09,0x8d,0xb8,0x8e,0x14,0x0a,0x94,0x5d,0x40,0x14,0x3f,0x8a,0xd4,0x87,0xef,0x73,0x8a,0xea,0x23,0x61,0xb1,0x6a,0x74,0x4e,0x39,0x61,0xf5,0xdb,0x57,0x8d,0x34,0xd4,0x3a,0xd9,0xcb,0x34,0x24,0x34,0x7e,0x15,0x18,0x65,0xda,0xb6,0x65,0x13,0x5e,0xfd,0x8a,0x17,0x14,0xc3,0xbf,0x74,0xcb,0xdd,0xb8,0xf9,0xf6,0xfb,0x5c,0x36,0x2d,0x0c,0xba,0xd3,0x46,0xfc,0x85,0xc4,0x8b,0x82,0x7c,0xf9,0x46,0x4a,0xa9,0xf9,0x37,0x31,0x3f,0x17,0x12,0x73,0x61,0x43,0x25,0x6c,0x0b,0xda,0x6f,0xc1,0xf4,0xdc,0x99,0x52,0x8b,0x5f,0xc7,0xbd,0xc0,0xae,0x65,0x59,0x8b,0xe4,0x30,0x23,0xaa,0x43,0x9a,0x33,0x65,0xb5,0xe8,0x5b,0x7e,0xb5,0xf9,0x68,0xbd,0xfa,0x83,0x71,0x63,0xba,0xdc,0xd4,0xdb,0x11,0x40,0x29,0x68,0xfa,0x7e,0xf7,0xdb,0x10,0x1d,0x40,0x78,0x21,0x5a,0x70,0x6f,0xfe,0xc3,0x91,0xa4,0x24,0xa4,0xcf,0x3a,0x5e,0x8c,0xcb,0x05,0x11,0xa5,0x99,0x58,0x90,0xa4,0xa7,0x6f,0xbd,0x96,0x5b,0xe0,0x79,0x14,0xd4,0x17,0xa7,0x64,0xa6,0x17,0x6f,0x5b,0xf7,0x1c,0x93,0x0a,0xf8,0xa6,0xc8,0x3f,0x51,0x47,0xe2,0xbd,0xd8,0x75,0xb9,0xde,0x76,0xe5,0x65,0xd5,0xf0,0xad,0x9b,0x2f,0x1d,0x92,0x9f,0x94,0x4a,0x6a,0x6f,0xa1,0x9f,0x9f,0x2e,0x96,0x8c,0x8c,0xff,0xbe,0x26,0xf9,0xb6,0x48,0x55,0x93,0xc3,0x70,0x69,0x7a,0x6c,0x7d,0x9e,0x35,0xea,0xcc,0xe3,0x10,0xed,0xa3,0x80,0xa6,0x93,0x40,0xd3,0xb1,0x81,0x4a,0xd1,0x86,0x69,0xdf,0x1e,0x69,0xce,0xb9,0x29,0xc2,0xb4,0xec,0x33,0x55,0xd6,0xc8,0x23,0x13,0x1a,0x7d,0x3d,0xce,0x48,0x9f,0x2d,0xb0,0x90,0x73,0x4b,0x03,0x2e,0xd2,0x90,0xaa,0xf1,0xd0,0xb4,0xf0,0xd9,0x2c,0x71,0xbb,0xed,0xca,0x4d,0xd5,0x1c,0xb6,0x6d,0xde,0x38,0x44,0xb9,0x75,0x3e,0x2e,0x5e,0x77,0xbe,0xdd,0xc6,0x35,0x2a,0x7c,0x18,0x62,0x5e,0x0f,0x70,0xe2,0xe4,0x0c,0x66,0xf5,0x7c,0x6b,0x6e,0x57,0x5c,0xb2,0x0e,0x17,0xad,0x5d,0x8d,0x25,0x4b,0xc6,0x30,0x33,0x33,0x87,0xc7,0x9e,0x3c,0x8c,0xa3,0x27,0x27,0x6d,0x20,0xa9,0xe4,0xfa,0x35,0x2b,0xed,0xd9,0x5b,0xf7,0x4e,0x1b,0x83,0x43,0xc4,0x9c,0x3e,0x31,0x3e,0x8e,0x0b,0x56,0x2f,0x67,0x1a,0xf0,0xbc,0xd6,0x38,0x72,0x62,0x12,0xe3,0xe3,0x0d,0x2e,0x5c,0xbd,0x82,0x95,0x3b,0xd0,0x06,0x87,0x9f,0x3a,0x85,0xf3,0x96,0x4e,0x60,0xf5,0x8a,0xa5,0xb1,0x6e,0xae,0x7a,0xd3,0xb3,0x73,0x38,0x71,0x72,0x5a,0xe4,0x79,0xed,0xea,0xe5,0x18,0x1f,0xe3,0xed,0x30,0x39,0x3d,0x87,0xc9,0xa9,0x39,0x00,0xc0,0x45,0x17,0xac,0xcc,0xd2,0x9c,0x9c,0x9c,0xc1,0xcc,0xec,0x3c,0xab,0xd3,0x92,0xf1,0x31,0x6c,0xb9,0x74,0x2d,0xd6,0xac,0x5a,0x0e,0xa5,0x14,0x4e,0x4c,0x4e,0xe1,0xd1,0x27,0x8e,0x62,0x7a,0x76,0x0e,0xb4,0x01,0x96,0x8c,0x8f,0x61,0xed,0xaa,0xf3,0x78,0x86,0x0d,0x70,0x7a,0x66,0x16,0x27,0x4f,0xcf,0x62,0xfd,0x9a,0x95,0xcc,0xa4,0x3f,0x3b,0x3f,0xc0,0xb1,0x93,0x53,0x58,0x36,0xb1,0x84,0xd4,0xcd,0xd5,0x7b,0xa0,0x71,0xe4,0xc4,0xe9,0x8c,0xbf,0x0d,0xeb,0x56,0x63,0xd3,0xfa,0xf3,0x31,0x3e,0x66,0xbf,0xb4,0x73,0xf0,0xd8,0x29,0xec,0xda,0x7f,0x84,0x7f,0x13,0x7d,0x14,0xe4,0x9a,0x6d,0x62,0x7c,0x1c,0x9b,0x2f,0x5e,0x83,0xa5,0x13,0x4b,0x58,0xf0,0xf1,0x53,0xd3,0xd8,0x73,0xe0,0x18,0x52,0x21,0x74,0xf5,0xca,0x65,0xd8,0xbc,0x61,0x2d,0x96,0x2f,0x9b,0xc0,0x60,0xa0,0x71,0xf8,0xf8,0x24,0x76,0xef,0x3b,0x0a,0x4d,0x3e,0x34,0x00,0x18,0xac,0x58,0x36,0x81,0x95,0xcb,0x79,0x9d,0x23,0x71,0x95,0xe7,0xd8,0x89,0xd3,0x98,0x1f,0x68,0xac,0x5e,0xb1,0x2c,0x8b,0xc6,0x76,0x99,0xc3,0x97,0x8b,0xec,0x3f,0xda,0x18,0x9c,0x98,0x94,0xc7,0x46,0x9d,0xca,0xea,0xdb,0xfa,0x0b,0x56,0x61,0xc3,0xba,0xd5,0xe4,0x8d,0x8d,0xf7,0xd0,0xae,0x03,0x98,0x9e,0x9d,0xc3,0x05,0xab,0x96,0x63,0x62,0x82,0x2c,0xa7,0xc6,0xe0,0xc4,0xe4,0x0c,0xa6,0xa6,0xa7,0x71,0xfe,0xaa,0xf3,0x70,0xde,0xc4,0x84,0x4b,0x65,0x00,0xa3,0x71,0x72,0x72,0x06,0x93,0x53,0xd3,0xb8,0x70,0xcd,0x2a,0x8c,0x37,0x0d,0x7c,0x47,0x1a,0x68,0x68,0xad,0x71,0xf0,0xc8,0x71,0xac,0x5e,0x79,0x1e,0x96,0x2f,0x9d,0x70,0x9e,0xc6,0x06,0xc6,0x68,0x1c,0x3a,0xfa,0x14,0x8c,0x06,0xce,0x5f,0xb9,0x3c,0xf6,0xbd,0x3b,0x8a,0x14,0x1b,0xc7,0x37,0x90,0x35,0x45,0x1b,0x63,0x30,0x6f,0x34,0x4e,0x9c,0x98,0xc4,0xb2,0xa5,0x13,0x38,0x7f,0xf5,0x4a,0x16,0xae,0x8d,0xc1,0xfe,0x03,0x47,0x00,0x00,0x2b,0x57,0x2c,0xc7,0xca,0xe5,0x4b,0xdd,0x25,0x24,0x56,0x5b,0x1e,0xcc,0xcf,0xe3,0xe0,0xa1,0x63,0x43,0xb4,0x67,0xb5,0x49,0xff,0x89,0xf0,0xb4,0x01,0xe0,0x33,0x4d,0x99,0x7d,0x77,0x24,0x69,0xce,0x0c,0x00,0x6b,0xf8,0x1b,0xb9,0x00,0xe0,0x0f,0x7e,0xe5,0x5f,0x62,0x62,0x49,0xde,0xcd,0x83,0x81,0xc6,0xbd,0x3b,0xf7,0xe2,0xe3,0x9f,0xbb,0x05,0x0f,0x3c,0xf6,0x44,0x16,0x7e,0xe5,0xa5,0xeb,0xf1,0x33,0x3f,0xf8,0x7a,0x6c,0xde,0xb8,0x9e,0xbd,0x37,0x06,0xb8,0xe5,0xee,0x1d,0xf8,0xa3,0x4f,0x7f,0x19,0x93,0xd3,0x33,0xe1,0xfd,0x7f,0xf9,0xb9,0xef,0xc7,0x2a,0x02,0x26,0x33,0x73,0xf3,0xf8,0xc1,0x7f,0xff,0xa7,0xe1,0x79,0xd9,0xb2,0x71,0xfc,0xfe,0x2f,0x7e,0x3f,0x1a,0xe2,0x35,0x3a,0x3b,0x3f,0x8f,0x1f,0xfd,0xb5,0x0f,0xe3,0xc5,0xcf,0xda,0x8c,0xf7,0xbd,0xf3,0x35,0xac,0x9c,0xbb,0x77,0x3c,0x8e,0x5f,0xff,0xb3,0xbf,0xc7,0x75,0xcf,0xbf,0x12,0xef,0x7e,0xcb,0x75,0x62,0x4d,0x9f,0x3a,0x35,0x8d,0xed,0x77,0xed,0xc4,0x5f,0x7e,0xe1,0x6e,0x9c,0x9e,0x9d,0x0d,0xef,0x7f,0xe5,0xc7,0xde,0x88,0x4b,0x2f,0x3c,0x9f,0xc5,0xfd,0xcc,0x97,0xef,0xc1,0xc7,0x6e,0xfc,0x06,0x00,0xe0,0xf7,0xdf,0xf7,0xbd,0x59,0x5e,0xff,0xf3,0xaf,0xbf,0x86,0x9b,0xbe,0xfe,0x70,0x78,0xfe,0xd6,0x6b,0xb7,0xe0,0x87,0xde,0xf8,0x12,0xac,0x4a,0xc0,0x62,0x66,0x6e,0x1e,0xd7,0x7f,0xf1,0x1e,0xfc,0xf5,0xf6,0x7b,0xc3,0x02,0xb8,0x79,0xc3,0x05,0xf8,0xb5,0x77,0xbf,0x29,0xcb,0xf3,0x6b,0xf7,0xee,0xc2,0xef,0xfe,0xe5,0x57,0xf0,0x3b,0x3f,0xf3,0x16,0x26,0x10,0xdc,0xbf,0xeb,0x00,0xde,0xff,0x67,0x9f,0xc7,0xcb,0x9f,0x75,0x39,0x7e,0xe2,0xad,0xaf,0x64,0x69,0x0e,0x1f,0x9f,0xc4,0x7b,0x7e,0xe7,0xfa,0xf0,0xbc,0x7a,0xc5,0x32,0xfc,0xf8,0x5b,0x5e,0x81,0x17,0x5d,0x9d,0x8f,0x9d,0x5d,0xfb,0x8e,0xe2,0xf7,0xaf,0xbf,0x19,0x8f,0x1f,0x7a,0x2a,0x0b,0x1b,0x96,0x9a,0x46,0xe1,0x7b,0x5e,0xf5,0x1c,0xbc,0xe5,0x5b,0x9e,0x8d,0xf3,0x12,0xf0,0xb5,0x75,0xda,0x8d,0xdf,0xfd,0xe4,0x97,0xc3,0xf3,0xc4,0xf8,0x38,0x7e,0xf8,0xcd,0x2f,0xc1,0x6b,0x5f,0xb8,0x0d,0x4d,0xe2,0x38,0xb0,0xff,0xc8,0x49,0xfc,0xf1,0x67,0x6e,0xc6,0x83,0xbb,0x0f,0x06,0x8b,0xe2,0x77,0xbc,0xec,0x19,0xf8,0x81,0xd7,0x97,0xb7,0x61,0x28,0xfd,0xf2,0x9f,0x7c,0x16,0x87,0x8f,0x9f,0xc2,0x1f,0xfd,0xe2,0x3b,0x7b,0xd5,0xe1,0xf0,0xf1,0x49,0xfc,0xe4,0x6f,0x7f,0xa2,0x57,0x9a,0x12,0x6d,0xba,0xe8,0x02,0xfc,0xc4,0xdb,0x5f,0x8d,0x67,0x5e,0x79,0x89,0x18,0xfe,0x0b,0x1f,0xf8,0x24,0x1e,0x7b,0xf2,0x30,0xbe,0xf3,0xd5,0xcf,0xc7,0xdb,0x5f,0xfb,0x22,0x16,0x76,0xfd,0x4d,0x77,0xe0,0x23,0x7f,0x7b,0x33,0x7e,0xe5,0xdd,0x6f,0xc5,0xd6,0xcb,0x2e,0x66,0x61,0xbf,0xf2,0x07,0x9f,0xc2,0xdd,0x0f,0xed,0xc1,0xaf,0xbf,0xe7,0xfb,0x70,0xc9,0x45,0x17,0xb0,0x30,0x6d,0x0c,0xde,0xf9,0xf3,0x1f,0xc0,0x8f,0xbe,0xf5,0x35,0x78,0xfd,0x2b,0x9f,0xc7,0xc2,0x7e,0xec,0xdf,0xfe,0x1e,0x94,0x51,0xf8,0xd0,0x6f,0xfe,0x6c,0xaf,0x7a,0xec,0x3b,0x78,0x14,0x3f,0xf6,0xbe,0xdf,0xc2,0xcb,0x5f,0xf8,0x6c,0xfc,0xbf,0xef,0xf9,0x67,0x59,0xf8,0x9b,0xde,0xf5,0x0b,0x98,0x1f,0x0c,0xf0,0xbd,0xdf,0xf5,0x6d,0xf8,0xe7,0xef,0xe0,0x63,0xf9,0xe8,0x53,0x27,0xf0,0x7d,0x3f,0xfa,0x8b,0xbd,0xca,0xfb,0x27,0xea,0x46,0x54,0x74,0x3c,0x87,0xe9,0x5c,0x33,0x00,0xb5,0xf3,0x93,0x0a,0x7d,0x4b,0x27,0x26,0xb0,0xe9,0x92,0x8b,0xaa,0x69,0xd6,0xae,0x59,0x8d,0x0b,0xce,0xcf,0xb5,0xb3,0xc5,0xa0,0xb1,0xb1,0x06,0xcf,0xbf,0xe6,0x0a,0xfc,0xc6,0xcf,0xbe,0x13,0x6f,0xbe,0xee,0x5a,0x16,0x76,0xd9,0xc5,0x6b,0xf1,0xfe,0xf7,0xbc,0x3d,0x03,0x5f,0xc0,0x6e,0x8f,0xbe,0xf2,0xda,0xab,0xf0,0xab,0xef,0xfe,0x6e,0x4c,0x8c,0x75,0x97,0xdf,0x4e,0x9c,0x9a,0xc6,0xdd,0x3b,0x39,0xd0,0x4f,0x8c,0x8f,0xe3,0xd9,0x57,0x6e,0xc0,0x0b,0xaf,0xca,0x4d,0xf3,0xdb,0xef,0x79,0xa4,0x35,0xcf,0x35,0x2b,0x97,0xe1,0xbb,0xae,0x7b,0x0e,0x7e,0xf3,0xa7,0xbf,0x07,0x17,0x9e,0xbf,0xa2,0x35,0x7e,0x27,0x32,0xc0,0xeb,0x5f,0x7c,0x15,0x7e,0xea,0xed,0xd7,0x65,0xe0,0x0b,0x00,0x4b,0x97,0x8c,0xe3,0x5d,0x6f,0x78,0xa1,0x03,0x91,0xba,0x68,0xbf,0xf1,0xa2,0x35,0x58,0x3a,0x36,0x9e,0x69,0xe3,0x5d,0x69,0xf9,0xd2,0x09,0xbc,0xff,0x5f,0xbc,0x51,0x04,0x5f,0x00,0xd8,0x7c,0xc9,0x5a,0xfc,0xea,0x8f,0x7d,0x87,0xa8,0xd1,0x0f,0x4b,0x3f,0xf5,0xd6,0x57,0xe2,0x07,0x5e,0x77,0xad,0x08,0xbe,0x91,0xdc,0x4e,0xaa,0x52,0x78,0xdf,0xbb,0x5e,0x8d,0xd7,0xbf,0xf8,0xaa,0x0c,0x7c,0x01,0x60,0xc3,0xba,0x55,0xf8,0x77,0x3f,0xfc,0x06,0x5c,0x73,0xf9,0x45,0x61,0x1f,0x58,0x0d,0xb5,0xbf,0x7e,0xa6,0x88,0xf7,0xe7,0xe6,0x4b,0xd6,0xe1,0x3f,0xff,0xf4,0xdb,0x8a,0xe0,0x4b,0x69,0xfb,0x1d,0x3b,0xb2,0x77,0x2f,0x7a,0xd6,0x66,0x9c,0xbf,0xea,0x3c,0x5c,0xb9,0x89,0xcf,0xfb,0x63,0x27,0x4f,0xe3,0x9b,0x3b,0xf6,0x16,0xf3,0x6a,0x94,0xc2,0xc6,0x8b,0xd7,0x62,0x45,0xd1,0x52,0x70,0x2e,0x52,0xa1,0x5f,0x3b,0x6b,0xbf,0xe7,0x3a,0x06,0x2d,0x0e,0x9d,0x5b,0x3b,0x53,0x67,0x72,0x6e,0x2e,0xd4,0x2c,0x62,0xc4,0x9f,0x45,0xda,0x72,0xc5,0xa5,0x4c,0xfb,0xab,0xc5,0x1b,0x8e,0x68,0xde,0x26,0xf9,0x5b,0x49,0xd5,0x28,0xfc,0xab,0x77,0xbc,0x16,0x57,0x6f,0x8e,0x8b,0xc4,0x4f,0xbf,0xeb,0x0d,0x58,0x71,0x5e,0x7d,0xf2,0x6f,0xbb,0xec,0x22,0xbc,0xed,0xb5,0xdd,0x34,0x19,0x3f,0xb9,0xb6,0x7f,0x63,0x67,0x16,0xf2,0xc2,0x6b,0x2e,0xc7,0xb5,0x57,0x71,0xcd,0x7f,0x76,0x6e,0x80,0xdb,0xee,0xdf,0xd3,0x31,0x6f,0x60,0xc3,0xda,0x55,0xf8,0xb9,0x77,0xbe,0xa6,0x83,0xef,0x54,0x7d,0x92,0x6b,0x18,0xac,0x5d,0x7d,0x1e,0x7e,0xf8,0x4d,0x2f,0x6d,0x2d,0xf3,0x7b,0xae,0x7b,0x2e,0xb6,0x6e,0xba,0x10,0xc8,0xaf,0xf3,0x09,0x74,0xe9,0xba,0xd5,0xb9,0xf9,0xb4,0x07,0xfd,0xc0,0xeb,0xaf,0xc5,0x86,0xb5,0xab,0xaa,0x71,0x56,0x2d,0x9f,0xc0,0xbf,0xf8,0xce,0x97,0x0d,0x5d,0x06,0x74,0xfc,0xff,0x25,0xd7,0x5c,0x86,0xeb,0x9e,0xb7,0xa5,0x25,0x41,0xac,0xeb,0x6b,0x5f,0xb4,0x2d,0xeb,0xbb,0x94,0x26,0x96,0x8c,0xe1,0x27,0xdf,0xfe,0xaa,0x30,0xf6,0xbb,0xed,0x07,0x9f,0x21,0x6a,0x59,0xf3,0x7f,0xea,0x1d,0xdf,0x86,0xe5,0xcb,0xba,0x80,0xa0,0xc6,0xae,0x7d,0x87,0xb1,0x67,0xff,0x11,0xf6,0xf6,0x8a,0x4b,0xd6,0xe1,0xdb,0x5f,0xf1,0xdc,0xac,0xce,0x5f,0xb9,0xe3,0x01,0xe8,0x96,0x0b,0x57,0x2e,0xdf,0xb0,0x0e,0x2b,0xce,0x2b,0x8d,0x9d,0x73,0xa8,0x0d,0x03,0x75,0x5f,0x73,0x3a,0xd1,0x08,0xf0,0xb8,0x78,0x7a,0x6a,0x94,0xb4,0xc0,0xea,0x2e,0x0c,0x80,0xcf,0x11,0xdb,0x7e,0x2b,0x1b,0xc3,0x76,0xa6,0xc9,0x7e,0xb4,0x92,0xca,0x06,0xa2,0x2d,0xbc,0xcd,0xfc,0xec,0x69,0xeb,0x15,0x6e,0x41,0x6b,0xdb,0xdc,0x4b,0xbf,0xd3,0xbc,0x80,0xbe,0x68,0x94,0xc2,0x77,0x7e,0xeb,0x0b,0x60,0x00,0x6c,0xd9,0x74,0x11,0x9e,0xb1,0xb9,0x5d,0xe2,0x07,0x80,0x37,0xbe,0xf2,0x39,0x6e,0x40,0x97,0x0a,0xe7,0xef,0x6f,0xbd,0x6f,0x37,0x66,0xe7,0xf9,0xbe,0xf3,0x6b,0x5e,0x74,0x35,0xd6,0x24,0xfb,0xa7,0x77,0x3e,0xb4,0x07,0xa7,0xa7,0x67,0xd1,0x87,0xae,0xbe,0x6c,0x3d,0xb6,0x6e,0xbc,0xb8,0x3d,0x62,0xcb,0x60,0xf8,0xb6,0x17,0x5e,0x85,0x89,0x25,0x63,0xd5,0x38,0x80,0xb5,0x04,0xbc,0xe1,0xc5,0xd7,0x54,0xe3,0x8c,0x8d,0x35,0xd8,0xb2,0x71,0x5d,0x99,0x8d,0x4a,0x9f,0x4d,0x2c,0x19,0xc7,0xb7,0x3c,0xbf,0x0d,0x0c,0x2d,0x3d,0x7f,0xdb,0xa5,0x58,0xbf,0xa6,0xa0,0x05,0xeb,0x96,0xff,0x09,0xbd,0xfc,0x39,0x57,0x74,0x2a,0xcf,0xd3,0x1b,0x5e,0x5a,0xaf,0xbf,0xa7,0x0d,0x6b,0x57,0xe1,0xda,0x6d,0x4e,0xb0,0x4c,0xef,0x44,0x3f,0x83,0xc4,0xf6,0x49,0x53,0xd2,0xfc,0xe1,0xe2,0xb5,0xab,0xb1,0x75,0x53,0x6e,0x01,0xaa,0xd1,0x57,0xee,0xcc,0xb5,0xe0,0xb7,0xbd,0xee,0x85,0x79,0xbc,0x6f,0x3c,0xd8,0x9a,0xd7,0x65,0x97,0x5e,0xd8,0x2a,0x04,0xf7,0xa7,0x85,0xa1,0x5a,0x27,0xec,0xea,0xdb,0xbd,0x59,0xfc,0xb3,0x35,0x3e,0xda,0xca,0x5d,0x1c,0xbe,0xce,0x98,0x06,0x6c,0x2a,0x4f,0x67,0x9e,0xc8,0x15,0x6d,0x7d,0xa8,0x8f,0xc7,0x4b,0x12,0x75,0xab,0xe0,0x01,0xfd,0xf5,0xbb,0x1e,0xc8,0xde,0x6d,0xbb,0x82,0x80,0x5f,0x59,0xb9,0xb2,0xa4,0xf3,0x7a,0xd4,0xa2,0xcf,0xcf,0x0f,0xf0,0xf7,0xdb,0xef,0xc6,0xae,0x27,0x0e,0x65,0x61,0x57,0x6c,0xb8,0x10,0x30,0xc0,0xd5,0x57,0x6c,0xa8,0xe4,0xc0,0xe9,0xfc,0x95,0xe7,0x61,0xc3,0xba,0xf3,0xcb,0x11,0x18,0x33,0x1a,0x53,0x33,0xb3,0xb8,0xfd,0xbe,0xdd,0x2c,0xca,0x32,0xc1,0xd4,0xb9,0xfd,0x9e,0x47,0x8b,0x59,0x3e,0xfa,0xe4,0x61,0x7c,0xf1,0xce,0x9d,0x19,0x90,0x03,0xc0,0x65,0x17,0x9d,0x8f,0x85,0x0e,0xe9,0x6d,0x97,0x5d,0xd8,0x39,0xee,0x55,0x97,0xb7,0xc7,0xbd,0x6a,0x53,0x01,0x80,0x6b,0xa4,0x81,0x4d,0xeb,0xce,0x6f,0x31,0x03,0x73,0xda,0xb6,0xf1,0xc2,0x56,0x80,0xad,0x93,0xc1,0xf9,0x3d,0xb4,0xf5,0x89,0x25,0xe3,0xb8,0xfc,0xe2,0xb5,0x9d,0xe3,0xfb,0xb6,0xea,0xa5,0x01,0x2b,0x85,0xc2,0xe7,0xac,0x16,0x40,0x9a,0xfd,0x89,0x43,0x94,0xcf,0x9c,0x35,0x2b,0x13,0xa7,0xba,0x0e,0x59,0x7e,0xf9,0x8e,0x87,0xb2,0x25,0x62,0x99,0x73,0xbe,0xf2,0xb4,0xef,0xf0,0x71,0xec,0xd8,0xbd,0xbf,0x35,0xcb,0xcb,0x36,0x5c,0x88,0x15,0xcb,0x87,0xb7,0x9e,0xf4,0x26,0xd5,0x77,0x4d,0x74,0x11,0x0b,0x9a,0xfc,0xe2,0xae,0xf0,0x4f,0xe7,0xdc,0x39,0x2d,0x92,0x13,0x96,0xfd,0xa6,0xe4,0x28,0xb4,0xfd,0xee,0xfe,0xcf,0x49,0xcc,0x70,0x8e,0x6c,0x01,0xe7,0x18,0xdb,0xca,0xd2,0x06,0xf1,0x0e,0x67,0x81,0x4b,0xf2,0x7a,0xdb,0x16,0xae,0x01,0xcf,0xcc,0xce,0xe2,0x57,0x7f,0xfb,0x7f,0xe2,0x2f,0x7e,0xff,0x57,0x71,0xe1,0xda,0x08,0x62,0x45,0x47,0x2c,0x0d,0x7b,0xc0,0x5e,0x35,0xb1,0xec,0x9e,0x34,0x33,0x37,0x87,0x3f,0xfc,0xf8,0xe7,0x71,0xc1,0xea,0x15,0xf8,0xb3,0xff,0xfc,0x53,0x2c,0x6c,0x89,0x73,0xd4,0x5a,0xd5,0x73,0xd2,0x97,0x3d,0x5a,0xe9,0xc5,0x03,0xb1,0x6d,0xb6,0xdf,0xfd,0x08,0x5e,0xf9,0xfc,0xad,0xc5,0x34,0x53,0x33,0xb3,0xf8,0xc6,0x43,0x8f,0x17,0xc3,0xef,0x7c,0x70,0x2f,0xfe,0xff,0x9b,0xee,0xc4,0x53,0xa7,0x26,0xf1,0xd6,0x6f,0x7d,0x3e,0x0b,0x9b,0x18,0x6f,0xd7,0x5c,0xdb,0x68,0x65,0x0f,0xad,0x63,0x55,0xd1,0x44,0x18,0xe9,0xea,0xcb,0x4b,0xfb,0xfe,0x35,0xe9,0x4a,0x06,0x43,0xad,0x35,0xfe,0xf0,0xfa,0xaf,0x62,0x6e,0xa0,0xf1,0xde,0xef,0xbb,0x8e,0x6d,0x69,0xac,0x5c,0x36,0x91,0xc4,0xee,0x3f,0x3e,0x4e,0x4f,0xcf,0x89,0xef,0x4f,0x9e,0x9e,0xc1,0xa7,0xfe,0xf1,0x2e,0x9c,0x38,0x3d,0x83,0xa3,0xc7,0x27,0x43,0x79,0x7d,0xb0,0x74,0xb5,0x1b,0x57,0xd2,0x1e,0xf0,0x8e,0xbd,0x87,0xf1,0xff,0xfd,0xe5,0x17,0xd9,0xbb,0x99,0x39,0x8d,0x13,0xa7,0x67,0x30,0xae,0x14,0xfe,0xeb,0xc7,0xbe,0xe0,0xde,0x1a,0x6c,0x5c,0xbf,0x06,0xef,0x7a,0x43,0xae,0x55,0xfe,0xd7,0x8f,0xdd,0x04,0xe3,0xd0,0x6f,0x66,0x2e,0x17,0xce,0x12,0x59,0x90,0x13,0x9b,0x4b,0x36,0x90,0x3a,0x18,0xa6,0x74,0xcb,0x3d,0x8f,0xe0,0x96,0x7b,0x1e,0x85,0x36,0x06,0x07,0x8f,0x1d,0x0f,0xef,0x0f,0x1d,0x3b,0x89,0x87,0xf7,0xec,0xc7,0x35,0x15,0x21,0xf6,0x2b,0x77,0xdc,0xdf,0xe9,0x4a,0xf2,0xcb,0x37,0x94,0x35,0xe0,0xe3,0x27,0x4f,0xe1,0x3f,0xfd,0xc1,0x27,0x9d,0x77,0xb4,0xc6,0x15,0x1b,0x2f,0xc6,0x0f,0xbd,0xed,0x35,0x59,0xbc,0x5f,0xfb,0xbd,0x8f,0x00,0xc6,0x7a,0x41,0x4f,0xcf,0x96,0xeb,0x13,0xc8,0x84,0x7f,0x86,0xa3,0x96,0xa4,0x26,0x48,0x27,0x79,0x44,0xf9,0xcd,0x22,0x9f,0x09,0x5e,0x64,0xea,0xd2,0x92,0xad,0x00,0x7c,0xa6,0x0f,0x00,0x9d,0x3d,0x72,0x35,0x35,0x26,0xbb,0x88,0x81,0xb5,0x81,0x7f,0xe8,0xd1,0x28,0x63,0x63,0x0a,0x57,0x5e,0xc6,0xf7,0x76,0x77,0xee,0x7a,0x12,0x83,0x81,0xc6,0x8e,0xc7,0xf6,0x32,0x00,0xbe,0xe4,0xe2,0x75,0x58,0xb1,0x7c,0x29,0x26,0x27,0x67,0x0a,0xf7,0x12,0x69,0x28,0x8c,0xb1,0x83,0xf7,0x36,0x5e,0x7a,0x11,0x40,0x89,0x47,0x8d,0x65,0xd9,0x62,0x1d,0xc3,0xa4,0x05,0xf2,0xb6,0x7b,0x1f,0xc5,0xc7,0x6e,0xb8,0x15,0xbf,0xfc,0xe3,0xdf,0x8d,0x75,0x89,0x93,0x58,0x43,0x8c,0xee,0x12,0x29,0xa3,0xc8,0x67,0x08,0x35,0xee,0x78,0x68,0x2f,0x4e,0x9d,0x9e,0xc6,0xca,0x02,0xd0,0xdf,0x72,0xef,0x2e,0x51,0xbb,0x4d,0x69,0xe9,0x12,0x49,0x3b,0x34,0x28,0xcd,0xd4,0x57,0xbf,0xe0,0x2a,0x3c,0x67,0x4b,0xcd,0xb4,0x6e,0x55,0x46,0x49,0x6c,0xfc,0xf3,0x1b,0x6e,0xc3,0xe1,0xe3,0x93,0xf8,0x85,0x77,0xf1,0x45,0x4e,0x29,0xd8,0xf1,0x52,0xb1,0x8c,0x5c,0x79,0x49,0x77,0x2d,0x91,0xe5,0x2d,0x28,0x7e,0x0f,0xee,0x39,0x84,0xed,0xf7,0x3e,0x06,0x00,0xf8,0xe0,0x0d,0x13,0xb8,0x68,0xcd,0xca,0x00,0x9a,0x3b,0x9f,0x3c,0x92,0x28,0xff,0xa4,0x1e,0x1d,0x85,0xb5,0x07,0x76,0x1f,0xc0,0x4b,0x9f,0x75,0x79,0xf6,0xfe,0xaf,0xbe,0x72,0x2f,0x3e,0x7f,0xeb,0x43,0xa0,0x4b,0x8a,0x04,0xbe,0x53,0xb3,0x73,0x78,0xff,0x87,0x3e,0x8f,0xd7,0xbd,0xe8,0x2a,0xbc,0xfe,0x25,0x57,0xf3,0xfa,0x58,0x46,0xc4,0x1b,0xd6,0xe6,0xb5,0xc6,0x81,0x63,0x93,0xf1,0x05,0x61,0x77,0x16,0xc0,0x6d,0x0f,0xec,0x0a,0xaf,0x9f,0x35,0x25,0x1f,0x2f,0xfa,0xfa,0x03,0x7b,0xa0,0xa5,0x6f,0xf4,0x3a,0x6a,0x9a,0x06,0xab,0x96,0x8f,0x63,0xd9,0x78,0x1c,0x37,0x06,0xc0,0xec,0xf4,0x3c,0x4e,0x4c,0x4d,0x63,0x30,0xe0,0x26,0x83,0x27,0x0f,0x3e,0x85,0xe3,0xa7,0xa6,0x70,0x7e,0xa2,0x09,0x4f,0xcd,0xcc,0xe2,0x03,0x1f,0xbb,0x11,0x83,0x79,0xaf,0x49,0xf3,0x32,0xbf,0x72,0xc7,0xc3,0x75,0x00,0xbe,0xf3,0xe1,0x62,0x18,0xa5,0x0d,0xeb,0x2f,0x20,0x80,0xc5,0x69,0x66,0x76,0x0e,0xb7,0x7c,0xe3,0x41,0x77,0x92,0x48,0x63,0xb2,0xd0,0x26,0x5f,0xbd,0xe3,0xbe,0x00,0xc0,0x6d,0x5f,0x61,0xf8,0xbd,0xf7,0xff,0x1c,0x8c,0x31,0x58,0xb7,0xee,0x02,0x31,0xdc,0x20,0x2a,0xc9,0x19,0x85,0xa3,0x46,0x7d,0x51,0x52,0x60,0x48,0xe4,0xb1,0x6d,0xfc,0xb6,0x5f,0xf5,0xd2,0x35,0xa7,0x33,0x99,0x0b,0x30,0x52,0x0d,0x78,0xe1,0x4c,0x75,0x05,0x7b,0x1b,0xaf,0xed,0xd8,0x0f,0xcd,0xcd,0x83,0x2b,0xfb,0x43,0xf6,0x2f,0x95,0x98,0x2a,0x10,0x2b,0xaa,0xa5,0x5c,0x21,0xf8,0x8a,0x4d,0x97,0x60,0x22,0x31,0x27,0x3e,0xfc,0xc8,0x1e,0x68,0x00,0x8f,0xec,0x7a,0x02,0xaf,0x78,0xd1,0x73,0xc2,0x7b,0xa5,0x14,0xae,0xbc,0x6c,0x03,0xee,0x7d,0x88,0x9a,0x6a,0xd3,0x4c,0x5d,0x5b,0x8b,0x57,0x6c,0xea,0x70,0x6f,0xae,0x49,0x6a,0x72,0xde,0xd2,0xa5,0xf8,0x6f,0xff,0xe6,0x47,0x70,0xf9,0x25,0xb9,0xe9,0xf4,0xa4,0x3b,0x37,0x29,0xf5,0xe2,0x97,0x6e,0x7f,0x10,0x7b,0xf6,0x1f,0xc1,0x1d,0xf7,0xed,0xc6,0xb7,0xbf,0xf2,0xd9,0x79,0x84,0x96,0xae,0x0f,0x1f,0x62,0x02,0x30,0x3f,0x3f,0x87,0x5b,0xef,0xdb,0x8d,0xd7,0xbd,0x44,0xde,0x3f,0xdc,0x7e,0xcf,0x4e,0x27,0x64,0xc8,0x6d,0xfc,0xfa,0x97,0x3c,0x03,0xaf,0x7a,0xde,0x16,0x5c,0x72,0x61,0x6e,0xfa,0x3e,0x71,0x7a,0xa6,0xc8,0xca,0x05,0xab,0xce,0xc3,0x05,0xe9,0x59,0x5d,0xc6,0x64,0x03,0xe9,0x13,0x79,0xc6,0x00,0x37,0xde,0xbe,0x03,0xb3,0xf3,0x03,0x1c,0x39,0x71,0x1a,0xeb,0x56,0x2f,0x4f,0xd2,0xa9,0xea,0xcd,0x59,0x4b,0x8a,0x5a,0x79,0x45,0x8a,0x6b,0xe4,0x3c,0x8f,0x1c,0x8f,0xe7,0x83,0x6f,0xba,0x3d,0xdf,0x6f,0x14,0x29,0xb3,0x02,0x95,0xc8,0xe0,0x1f,0x6f,0xdf,0x81,0xef,0x78,0xe9,0x33,0xb0,0x61,0x1d,0x77,0xfc,0x5a,0x79,0xde,0x04,0x9d,0x30,0x96,0x84,0x2c,0x1f,0x78,0xec,0x00,0x1e,0x79,0xf2,0x30,0x9a,0x06,0x19,0x00,0xdb,0x1b,0xd9,0x1a,0xb1,0x5e,0xab,0x96,0x4f,0x60,0xdb,0xc6,0xf5,0xd0,0x5a,0x63,0x76,0x6e,0x1e,0xc7,0x4e,0x4d,0x63,0x72,0x6a,0x06,0x74,0x41,0x0f,0xeb,0xfb,0x10,0x96,0x9f,0xef,0x7d,0xcd,0xb5,0xf8,0xfe,0xd7,0xbe,0x50,0xf4,0xd4,0x06,0xec,0xb1,0x9f,0xcf,0xdd,0x7c,0x2f,0x3e,0xf4,0x37,0x37,0xbb,0xc2,0xac,0x05,0xef,0x63,0x7f,0x77,0x2b,0x7e,0xf2,0x1d,0xdf,0xc6,0xe2,0x8e,0x8f,0x8d,0x61,0xd9,0x92,0x25,0x98,0x9c,0xe7,0xfc,0x79,0xda,0x7e,0xd7,0xc3,0xf8,0x7f,0xde,0x7a,0x9d,0xe8,0x70,0xf9,0xe8,0xe3,0x07,0xb1,0x67,0xdf,0x61,0x52,0x70,0x99,0xe7,0xa6,0x29,0x8c,0x0f,0xd3,0x90,0xf9,0xa6,0x73,0x5f,0x90,0x3c,0x41,0xa7,0xb3,0xb8,0x57,0x6f,0xeb,0xb2,0xff,0xcf,0x35,0x58,0x93,0x3c,0xb3,0x5f,0x1d,0xb1,0x98,0x7f,0x21,0x71,0x08,0x35,0xb7,0xd3,0x17,0xce,0x30,0x4a,0xcc,0x1c,0x29,0x9d,0x5b,0x5e,0xd0,0x9e,0x3a,0x8b,0x33,0x3a,0x1d,0x13,0x1d,0x48,0xe8,0xb0,0x2c,0x6d,0x97,0x66,0x29,0x0d,0x42,0x13,0x42,0xfc,0xb3,0xe4,0x80,0xf5,0xf0,0x4e,0xeb,0xe5,0xbb,0x53,0x38,0x83,0xcb,0x1c,0xb1,0xaa,0x7b,0xc0,0x86,0xef,0x03,0x1b,0xce,0x49,0x4a,0x4d,0xa3,0xb0,0xed,0xf2,0x0d,0xe2,0xb9,0xe0,0x5b,0xef,0xd9,0x59,0x34,0x41,0x4d,0xcd,0xcc,0x01,0x06,0x38,0x3d,0x23,0x98,0xb1,0x6a,0x0b,0x22,0x09,0xa2,0xbe,0x37,0xdb,0xef,0x92,0xb5,0x80,0x63,0xa7,0xa6,0x70,0xef,0xce,0x27,0x5d,0x52,0x79,0x62,0xad,0x59,0x75,0x9e,0x08,0xbe,0x53,0x33,0x73,0xf8,0xe6,0xce,0xc7,0x5b,0x9d,0x9b,0xfa,0x92,0xd6,0xda,0x69,0xe4,0x06,0x53,0xb3,0xb2,0x89,0x76,0x38,0xaa,0x98,0xa0,0xb5,0xac,0x55,0x0f,0x06,0xda,0xf5,0x79,0x8f,0xff,0xd1,0xf5,0x7f,0x6b,0xba,0xfd,0xed,0x8f,0xde,0x94,0x5d,0x04,0xf2,0xa6,0x57,0x3c,0x13,0xd7,0x5c,0x9e,0x9c,0x07,0x17,0xd8,0x9e,0x72,0x67,0xb1,0xa7,0x66,0xcb,0x16,0x8c,0x31,0x01,0x98,0x36,0xad,0x5f,0x83,0xdf,0xf8,0xf1,0x37,0xe3,0x37,0x7f,0xf2,0xbb,0xf0,0x81,0x9f,0x7d,0x2b,0xde,0xfc,0x8a,0x6b,0xe0,0xe7,0xa9,0x71,0xf7,0x4a,0xd8,0x71,0xde,0x6f,0x81,0xb6,0x35,0xd3,0x78,0xf9,0xb3,0x37,0x17,0xc1,0x17,0xb0,0xfb,0xd2,0xaf,0x7a,0xfe,0x36,0x97,0x28,0x6e,0x9e,0xdd,0x74,0xeb,0x83,0xb8,0xfe,0x1f,0xef,0x64,0x71,0x97,0x8c,0x8f,0xe1,0x3d,0xef,0x7c,0x2d,0xc6,0xc7,0x55,0xce,0x8e,0xb1,0xc7,0xed,0xee,0x79,0x58,0x3e,0x62,0xf4,0xe5,0x3b,0xdb,0x9d,0xaf,0xda,0x49,0xfb,0xa2,0xc2,0x9d,0x1b,0x45,0x32,0x26,0x19,0x46,0x23,0xd2,0xff,0x3a,0x75,0x83,0x8f,0x94,0xae,0x61,0xa6,0xc3,0x1c,0x35,0x85,0xdf,0xe0,0xd3,0xa6,0x73,0x75,0xfa,0xd4,0xbb,0x65,0xcd,0x1d,0x31,0x09,0x48,0xb3,0x90,0xd2,0x2b,0x92,0x76,0x29,0xdb,0x62,0x71,0x95,0x4e,0xe8,0x5c,0x46,0x3d,0x0f,0xf6,0x46,0xd3,0x37,0xfe,0x72,0x55,0x43,0x03,0xc1,0x2e,0x52,0xcf,0xb2,0x4b,0xeb,0x1e,0x9f,0xb7,0x0a,0x00,0xfc,0x33,0xff,0xea,0x1d,0xb8,0xfe,0x43,0xbf,0x81,0x7f,0xfd,0xd3,0x3f,0x98,0x85,0x6d,0x4d,0x8f,0x22,0x51,0x36,0xc2,0xe8,0x57,0x59,0x70,0x1c,0xf4,0xda,0x2e,0x58,0x1d,0x9b,0xed,0x9e,0x87,0xf7,0xe0,0x6f,0xbe,0x74,0x67,0x4b,0xac,0xda,0xac,0x93,0xc3,0x4c,0x32,0x98,0x95,0x13,0xc6,0x1f,0xd8,0x25,0x3b,0xa1,0xec,0xd8,0x73,0xc0,0x1e,0xcf,0x70,0x6b,0xad,0xe9,0x88,0xa6,0x5a,0x1b,0xfc,0xf1,0x67,0xb6,0xe3,0xe4,0x69,0x59,0x2b,0xe9,0x44,0x1c,0x8b,0x3a,0x93,0x86,0xe9,0x61,0x00,0x3b,0xf7,0xe9,0xc9,0xc3,0xc7,0xf1,0x1f,0x3f,0xf8,0x39,0x1c,0x3d,0x19,0x41,0x78,0xe9,0x92,0x71,0xfc,0xd2,0x8f,0x7c,0x3b,0x5e,0xf2,0xec,0xcb,0x17,0x56,0x5f,0xd3,0xdd,0x93,0xd6,0x02,0xef,0x50,0xde,0x64,0x2e,0x0b,0x97,0x4e,0xa3,0xf5,0xc8,0x0f,0x00,0x8c,0x8f,0x29,0x37,0x3e,0x55,0xe4,0x01,0x06,0x1f,0xfd,0xdc,0xad,0xf8,0xd4,0x8d,0xb7,0xb3,0xb8,0x2f,0x7b,0xce,0x95,0xf8,0x0f,0xef,0x7e,0x0b,0xce,0xa3,0x5b,0x39,0xde,0x74,0x66,0x34,0x1e,0x78,0x6c,0x9f,0x58,0xc6,0x83,0x8f,0x10,0x61,0x5b,0x87,0x7f,0x16,0x91,0x68,0x6b,0xe7,0xeb,0x46,0x3f,0xa2,0x8b,0x50,0x6a,0x26,0x2a,0x3e,0x74,0x38,0x1e,0xdc,0xa1,0x0d,0x42,0x94,0x9e,0x40,0xda,0x16,0x7f,0xa8,0x61,0xdc,0xb5,0xfd,0xa4,0xcc,0xf3,0x77,0x1d,0x35,0xe0,0x51,0x2d,0x30,0x55,0x75,0x2e,0x7b,0xa3,0xd2,0x34,0x9d,0xc6,0xab,0xe9,0x11,0x97,0x48,0x93,0x95,0xac,0x28,0x37,0xec,0x99,0xe2,0x31,0x99,0x50,0x7e,0x57,0xd4,0xef,0xe1,0x5c,0xb5,0x25,0xdf,0x57,0x5b,0xbe,0x6c,0x19,0x56,0xad,0x58,0x8e,0xe5,0x82,0x23,0xcf,0xb6,0xcd,0x97,0x02,0x30,0x64,0xef,0x34,0x65,0xcb,0x02,0x93,0x01,0xf2,0x1e,0x34,0xd2,0x79,0x60,0x99,0x4e,0x9d,0x9e,0xc6,0x27,0x6e,0xb8,0x19,0xef,0xff,0xc3,0xeb,0x31,0x3f,0x3f,0xb0,0x99,0x09,0x49,0xc6,0x1c,0x1f,0xc5,0x0b,0x25,0x98,0xf0,0x92,0xf2,0x9a,0x48,0x94,0x95,0x79,0x61,0x3c,0xf8,0x92,0x7c,0xdb,0xa4,0xed,0x9d,0x7b,0x0f,0xe1,0x3f,0x7c,0xf0,0xb3,0xf8,0x6a,0xc5,0x73,0xba,0x1b,0xc9,0x05,0xa9,0xc6,0x7d,0x89,0xd6,0x00,0xe3,0x23,0xf5,0xc8,0xad,0x2d,0x10,0x72,0x98,0x2d,0xbe,0x8f,0x56,0xdb,0xff,0x7f,0x0d,0x60,0xff,0xb1,0x53,0xf8,0xf8,0x8d,0x5c,0x20,0x9b,0x58,0x32,0x86,0xf7,0xbe,0xe3,0x5b,0x71,0xd5,0xa6,0xb2,0xe7,0xf7,0x58,0x63,0xc7,0xcf,0xb8,0x78,0xde,0xdd,0xc0,0xfa,0x18,0x14,0x93,0x67,0x71,0x87,0x23,0x2b,0x22,0x50,0xdc,0x3e,0x3e,0x39,0xd5,0x9a,0xea,0xa9,0x53,0x24,0x8e,0xe1,0xc2,0xf6,0x27,0x3e,0x7f,0x1b,0xf6,0x1d,0x3a,0xce,0xe2,0x3f,0x6b,0xcb,0xa5,0x78,0xdf,0x0f,0x7d,0x87,0xf3,0x03,0x00,0x37,0xf3,0x16,0xf6,0x6e,0xb3,0x3d,0xdd,0x61,0x96,0x55,0x3f,0x9d,0x74,0x17,0xf3,0x33,0xf2,0x63,0x82,0x43,0xde,0x5d,0x5a,0xec,0x36,0x43,0x43,0x85,0xbc,0xbd,0xaa,0x5e,0xa3,0x12,0x4b,0x43,0x78,0x58,0x9b,0x64,0x2d,0x62,0x7c,0x87,0xd7,0xe7,0x8e,0x47,0xd7,0x02,0xf7,0x80,0xfd,0xc8,0x1b,0x21,0x15,0xb3,0x94,0x3c,0xab,0x4b,0x0b,0x22,0xcd,0x44,0xea,0x2e,0x02,0x34,0x45,0xf6,0x75,0x8c,0x47,0x07,0xb1,0x31,0xe4,0xb9,0xdd,0x13,0x5a,0x41,0x61,0x6b,0xcf,0x2b,0x26,0x2f,0xbf,0xf4,0x62,0x4c,0x8c,0x2f,0xb1,0xa6,0xcf,0x90,0x6d,0x61,0xef,0x59,0xbb,0xc5,0xaa,0x69,0x18,0x0b,0x06,0xb2,0xd3,0xc4,0xa1,0xa3,0x27,0xf0,0xdf,0x3f,0x72,0x03,0x4e,0x9c,0x9a,0xc2,0xee,0xfd,0x47,0xa1,0x07,0xce,0xb3,0xba,0xf1,0x65,0xe4,0x75,0xd8,0x7a,0xf9,0xc5,0xb8,0xe3,0xfe,0xc7,0xb0,0xed,0xb2,0x2e,0xe7,0x6c,0x29,0x59,0x86,0x0c,0x0c,0x94,0x97,0x26,0x5a,0x86,0x8b,0x81,0x71,0x7c,0xab,0x62,0xf7,0xde,0xf0,0xd5,0xfb,0x70,0xeb,0x7d,0xbb,0xb0,0xff,0xe8,0x09,0x1c,0x15,0xee,0x4d,0x1e,0x8a,0x0c,0x32,0x87,0x1a,0xc0,0x9a,0x27,0x37,0x5f,0x72,0x01,0x8e,0x9c,0x38,0x8d,0xf5,0x6b,0x84,0xdb,0xb6,0x2a,0x38,0x3a,0x37,0x3f,0x28,0xee,0x01,0x0f,0xa3,0xd7,0xd1,0x7b,0xa3,0xaf,0xbe,0x6c,0x3d,0x96,0x92,0xbb,0x87,0x9f,0x38,0x74,0xbc,0x53,0x5b,0x74,0x2d,0x53,0x3a,0x86,0x33,0x3e,0xd6,0xe0,0x47,0xdf,0xfc,0x32,0xfc,0xd2,0xff,0xf8,0xac,0x58,0xe7,0xcd,0x1b,0xd6,0xa1,0x69,0x80,0xad,0x1b,0x05,0xc7,0x33,0x3f,0x4c,0x17,0xed,0x22,0x0e,0xed,0x34,0xe6,0xec,0x35,0x3e,0xf4,0x57,0x37,0xe3,0x15,0xcf,0xdd,0x8a,0x35,0xc9,0x1d,0xe1,0x7e,0x1a,0x4f,0xcf,0xcd,0x61,0xfb,0x5d,0x3b,0xe3,0x14,0x8f,0x48,0x0a,0xc0,0x3a,0xfc,0x2d,0x5b,0x9a,0x2f,0x95,0x2f,0x7a,0xe6,0x15,0x78,0xe1,0x33,0x36,0xe3,0x0e,0xe7,0x24,0xe6,0x7b,0xb5,0x0c,0x10,0xfc,0xce,0xea,0x12,0xcd,0xcd,0xcd,0x87,0x53,0x09,0x35,0x32,0x6e,0x9e,0x94,0x15,0x08,0x13,0x05,0x03,0x33,0x9a,0x2f,0xf1,0xba,0x8c,0xed,0x1f,0xcd,0xdb,0x29,0xf9,0xd3,0x4d,0xc0,0x08,0x71,0x72,0x57,0x67,0x53,0x79,0x8a,0x44,0xd3,0x11,0x9f,0x81,0x9a,0x6c,0xdb,0x8b,0xda,0x66,0xcc,0xc2,0x5a,0x95,0xf4,0x72,0x69,0x81,0x97,0x5f,0x77,0xa3,0x2e,0x89,0x3b,0x80,0x38,0x8b,0x52,0xca,0x53,0xc3,0xde,0x81,0x9c,0x78,0x30,0xfb,0x93,0x3b,0x25,0xde,0x3a,0xca,0x10,0x2c,0x9a,0x7f,0x28,0xa5,0x23,0x2c,0x5e,0x72,0xf1,0x85,0x58,0xb1,0xbc,0xc7,0x99,0x42,0x00,0xe3,0xe3,0x63,0xb8,0x7c,0xe3,0x7a,0xec,0xdc,0xbd,0xcf,0x16,0x46,0xc1,0x4b,0x03,0x68,0x34,0x8c,0x42,0x74,0x54,0x62,0xd5,0xd0,0x56,0x0b,0x2e,0xb8,0x2c,0x4e,0xcf,0xce,0xe2,0xae,0x87,0x76,0x01,0xc6,0x1f,0x09,0x69,0x6c,0x23,0x69,0x0a,0xc2,0x9c,0xbe,0xef,0x0d,0x2f,0xc5,0xab,0x5e,0x70,0x35,0x2e,0x93,0xce,0x7d,0xb6,0x8e,0x0d,0x02,0xc2,0x80,0xad,0x4b,0x8b,0xc9,0xc1,0xa7,0x28,0x59,0xa0,0x1f,0x3f,0x78,0x0c,0xf7,0x3f,0xfa,0x24,0x29,0xbb,0x7d,0x80,0x7e,0xe9,0x1b,0x3b,0x71,0xe3,0xad,0xf6,0xdc,0xf5,0xaf,0xff,0xc4,0x77,0x17,0xca,0x96,0x0b,0xfc,0xa5,0x1f,0xfe,0x76,0xcc,0xeb,0x01,0xc6,0x44,0x0b,0x40,0xd9,0x4c,0xfe,0xc4,0xa1,0xe3,0xd8,0x5c,0xf2,0x82,0xae,0x00,0x37,0xdd,0xda,0xa7,0xf4,0xcc,0x2b,0x2e,0xc6,0xc5,0xeb,0x56,0x63,0x6e,0x6e,0x80,0x7f,0xfb,0x23,0x6f,0x60,0xe7,0x84,0x3f,0xf8,0x37,0x5f,0xc3,0xdf,0xdf,0xf6,0x90,0x9c,0x61,0x47,0xfa,0x4f,0xef,0xfe,0x4e,0x8c,0x8d,0x29,0x2c,0x19,0x6f,0xb0,0x71,0xfd,0x1a,0x31,0xce,0xb6,0x8d,0x17,0x62,0xcd,0xca,0xa5,0x90,0xc6,0xc9,0x86,0x75,0xab,0xf0,0xbb,0x3f,0xfb,0x36,0xac,0x4d,0x1d,0xd5,0x00,0xd4,0x34,0xe0,0x7d,0x47,0x4e,0xe0,0xb7,0xfe,0xe2,0x46,0xcc,0xeb,0x01,0x66,0xe7,0x06,0x98,0x9c,0xea,0x77,0x09,0x0b,0x20,0x58,0x4a,0x9c,0x26,0x64,0x00,0x3c,0x79,0xf8,0x04,0x3e,0xfd,0x85,0x3b,0x42,0x90,0xf2,0x63,0x3e,0x61,0x8f,0x42,0xd4,0x6b,0x5e,0x7c,0x35,0xde,0xf4,0xaa,0xe7,0x02,0x00,0xd6,0xaf,0x59,0x8d,0xd5,0x2b,0x65,0xaf,0xfd,0x97,0x3d,0x77,0x0b,0xee,0xb8,0x7f,0x17,0x3c,0xf8,0xd6,0xad,0xdd,0x3a,0x82,0x6f,0x0a,0x56,0x84,0x1e,0x3f,0x70,0x04,0x57,0x6e,0x6a,0x11,0x76,0xc3,0x77,0x0e,0xcb,0x03,0x29,0xce,0x26,0x6a,0x7e,0x96,0xe3,0xfe,0xfc,0x2f,0xff,0x0e,0xf4,0x40,0xe3,0x4d,0xaf,0x7b,0x25,0xde,0xf8,0xba,0x57,0x08,0xac,0x73,0xb0,0x0d,0x6d,0xe5,0xbd,0xab,0x4d,0x7d,0x63,0x42,0x3c,0x82,0xc4,0x34,0xd2,0x26,0xbe,0x28,0x62,0x9e,0x1f,0x3c,0xc3,0x69,0xb0,0x39,0x7f,0x23,0xb0,0x48,0xd4,0x48,0xd7,0x00,0xc2,0x52,0x07,0x0d,0xb8,0x83,0x0b,0x5d,0x1f,0x32,0x2a,0xee,0xad,0xa6,0xe0,0x57,0x28,0xc6,0x46,0xab,0xa3,0xa4,0x88,0xa3,0xf4,0x2c,0x70,0x00,0x45,0xa9,0x10,0x6a,0x43,0x52,0x30,0xc6,0xe4,0xc7,0x71,0x18,0xee,0xd3,0x01,0xe3,0xc1,0x85,0xd9,0xa0,0xc2,0x9b,0x6d,0x5b,0xea,0x9f,0x20,0x2c,0xd1,0xd6,0xcd,0x97,0x62,0xe7,0xee,0x27,0x61,0x14,0xad,0x79,0x2e,0x7c,0x58,0x4d,0x37,0xd5,0x82,0x6d,0x3c,0xd1,0x91,0xc9,0x20,0xf4,0x01,0x6f,0x33,0x0b,0xc2,0xd3,0x33,0xb9,0xa3,0xd1,0xd8,0x58,0x23,0x83,0x2f,0x80,0xc9,0xd3,0xb3,0x22,0xfe,0x8d,0x37,0x0d,0xde,0xf6,0x1a,0x7e,0x5e,0x73,0xef,0x81,0x63,0x6e,0xb1,0x2a,0x8d,0xa7,0xb4,0x97,0xcb,0x7d,0xce,0x35,0x7c,0xdd,0x0a,0xc6,0x47,0x4f,0x4c,0xe2,0xa1,0xbd,0x07,0x8b,0xf9,0x79,0x9a,0x16,0x1c,0xad,0x56,0xad,0x90,0xcf,0x63,0x4e,0xcd,0xcc,0x55,0x1d,0x4a,0x76,0xef,0x3b,0x5a,0x00,0xe0,0x32,0xd8,0x5b,0xd2,0x98,0x9e,0xcd,0x41,0x68,0xd9,0xc4,0x12,0xfc,0xde,0x7b,0xdf,0x26,0xa6,0x38,0x3d,0x33,0x8b,0x05,0x99,0xd6,0x34,0xb0,0xe5,0xd2,0xb5,0x05,0x21,0x23,0x92,0x52,0xd6,0x69,0xea,0xb1,0x27,0x0e,0x8b,0xe1,0xfc,0x8b,0x41,0x9c,0x3f,0x03,0x88,0xc7,0xdc,0x06,0x03,0x8d,0x27,0x0e,0xb7,0x7d,0x50,0xc2,0xd5,0xad,0xb6,0x27,0x41,0xcc,0x8f,0xb9,0x81,0xcb,0x2d,0x06,0xa9,0x49,0xb4,0xa0,0xf5,0xae,0x59,0xb5,0x02,0x5b,0x37,0xd5,0xef,0x6e,0x07,0x80,0xcb,0x36,0xac,0x45,0x37,0xf0,0x25,0xd4,0x62,0x0a,0x7d,0xf4,0xf1,0x83,0xd8,0xbc,0xf1,0xa2,0xf2,0xbd,0xd9,0x3a,0x01,0xbb,0xf2,0x74,0xe2,0xf8,0x5c,0x61,0xf0,0xc1,0x1d,0xbb,0x31,0x3f,0x3f,0x87,0x17,0xbf,0xe0,0x99,0xc5,0x38,0xd6,0xca,0x90,0xbc,0x92,0x18,0xe9,0xa4,0x34,0x4a,0x3e,0xd4,0x34,0x82,0x63,0x3e,0xfb,0xa0,0x72,0x97,0x46,0xee,0x81,0x59,0x4c,0x55,0x1e,0x31,0xd6,0x75,0xa0,0x11,0x1d,0x43,0xea,0xa8,0x46,0x66,0x69,0x90,0xa7,0xeb,0x95,0x4d,0x0a,0x48,0x12,0xa2,0x4b,0x47,0x91,0x74,0x0c,0x09,0xc1,0x74,0xb4,0x52,0x3b,0xae,0x7f,0xf6,0xa0,0x46,0x0c,0xe1,0xc9,0x26,0xad,0xd1,0x0a,0xaa,0xb1,0xf1,0x94,0xcb,0x67,0xeb,0xe6,0xdc,0x01,0x4b,0x1b,0x83,0x5f,0xfa,0x8d,0x3f,0x72,0x9f,0x6a,0x53,0x78,0xff,0xbf,0xfe,0x97,0x58,0x9a,0xdc,0x98,0xb3,0xf5,0x8a,0x4b,0xc9,0x38,0x34,0xb0,0xda,0xbd,0x66,0x5a,0xb0,0x65,0xa3,0xb1,0xd1,0x04,0x6b,0x79,0x75,0xe3,0x26,0xd4,0x8d,0x5a,0x02,0x34,0xf6,0x26,0xf7,0xd9,0xd6,0x68,0x76,0x6e,0x1e,0x07,0x8f,0x9e,0x10,0x27,0xdc,0xd8,0x58,0x83,0x7f,0xfe,0xe6,0x97,0xb3,0x77,0xdb,0xef,0xda,0x81,0xdb,0xef,0x7f,0xac,0x6e,0x32,0x33,0xb1,0x5e,0x75,0x15,0xd1,0x85,0xfa,0x93,0x43,0x14,0x8c,0x87,0x98,0x44,0xbe,0xe7,0x1f,0x3f,0xf8,0x14,0x9e,0xbb,0xb5,0xdb,0x7d,0xdc,0x8f,0x1f,0x3c,0x8a,0x9a,0x31,0x79,0xf7,0x81,0x23,0x00,0xb6,0xc9,0x85,0x69,0x2d,0xdb,0xc9,0x5c,0x97,0xec,0xdd,0x7f,0x0c,0xda,0x98,0xce,0x26,0xdb,0xbd,0xfb,0x8e,0xb5,0x2c,0x7c,0xa3,0xdb,0xf7,0xd2,0x83,0x01,0x26,0xa7,0x67,0x70,0xf4,0xc4,0xe9,0x82,0xb6,0x9b,0xd3,0xe3,0x07,0x2d,0xc0,0x4a,0xa0,0x22,0xd7,0x51,0xb3,0x3f,0xed,0x4c,0xd1,0xb9,0x9b,0x1e,0xc0,0xd3,0xf9,0x90,0x30,0xf1,0x07,0x87,0x6c,0xf4,0x1a,0x3e,0x83,0x81,0x75,0x54,0x20,0xc6,0x4f,0xb9,0x5f,0x7d,0xbe,0x01,0xc1,0x74,0x31,0xda,0xe9,0xa9,0x69,0x1c,0x3a,0x7a,0x02,0x17,0x89,0xb7,0xcc,0x69,0x06,0x4a,0xa6,0x32,0xfe,0x42,0xfc,0x60,0x7f,0xaa,0xea,0xa8,0x1d,0xab,0x4d,0xf2,0x31,0xc9,0x33,0x2b,0xd3,0x5d,0x93,0xdf,0x7d,0x00,0x00,0x20,0x00,0x49,0x44,0x41,0x54,0x45,0x48,0x01,0x9a,0x76,0x45,0x7a,0x04,0x29,0x63,0xa0,0xc2,0x51,0x8b,0x10,0x23,0x52,0xb1,0x09,0xca,0xe5,0x0c,0x13,0xd2,0x1e,0x1a,0xa9,0x93,0x71,0xb9,0xd7,0x72,0x96,0x0d,0xec,0x7e,0x64,0xb2,0x1f,0x6d,0x09,0x48,0xc7,0x51,0x69,0x2f,0xcf,0x31,0x0f,0x34,0x7e,0x00,0x3b,0x6e,0xb3,0xbe,0x2c,0x74,0x6e,0x6a,0x4e,0x49,0xf7,0x42,0x48,0xd2,0xab,0xb6,0x5e,0x9e,0x25,0xdf,0x7f,0xe0,0x08,0x6e,0xbf,0xeb,0x01,0xdc,0x79,0xcf,0x43,0xb8,0xf3,0x9e,0x87,0xb1,0xf7,0x89,0x5c,0x33,0xdb,0xb6,0x79,0x13,0xc2,0xe4,0x61,0x08,0xc3,0xa6,0xba,0x23,0x25,0xd8,0x2d,0x2b,0xe6,0x7f,0x3f,0x71,0x8c,0xef,0xa5,0x30,0x9b,0x71,0xef,0xc3,0xbb,0x71,0xec,0xc4,0xa4,0x9c,0x2e,0xa1,0xdb,0xee,0x7d,0x04,0xb3,0xb3,0xb3,0xfd,0x06,0x88,0xe1,0x9c,0x17,0xe3,0xc4,0xf3,0x27,0x42,0x04,0x15,0x76,0x00,0x94,0x06,0x8c,0x36,0x31,0x7a,0x31,0x4f,0xd7,0x3e,0x95,0xcb,0x1a,0x00,0xe0,0xe6,0x0e,0x5f,0x61,0x0a,0x71,0xef,0x7e,0xb4,0x1a,0xbe,0x7b,0xdf,0xd1,0x21,0x7d,0x5e,0x34,0x4e,0x9e,0x9e,0xc2,0x37,0x77,0xe6,0x47,0xd4,0x24,0xda,0x7b,0xe0,0x18,0x76,0x1f,0x38,0x8c,0x28,0x0c,0x48,0xff,0x8f,0x86,0x66,0xe6,0xe6,0xb0,0x7b,0xbf,0xfd,0x36,0x6c,0x57,0xc7,0xb7,0x99,0xb9,0x39,0xdc,0xfe,0xa0,0x3d,0x76,0x27,0x59,0xb2,0x54,0xa3,0x62,0xdf,0x84,0xff,0x39,0xdb,0xbe,0x7f,0xdb,0x8f,0xc0,0x04,0x75,0x8f,0x24,0x22,0x41,0x06,0x6e,0xfe,0x9a,0xf0,0x1f,0x05,0x94,0x70,0xf2,0xaf,0x63,0xc7,0x3d,0xf8,0xd8,0x13,0x09,0xf8,0x56,0x56,0x3e,0x92,0xa7,0x9d,0x82,0x72,0x3c,0x63,0x80,0x5d,0x4f,0x1c,0x90,0xf3,0x08,0x6d,0xe0,0x95,0x00,0x09,0xb8,0x58,0x29,0x2e,0x1d,0x99,0xe7,0xc5,0xe8,0xb5,0xed,0xa1,0x24,0xcf,0x6c,0xff,0x37,0x5f,0x5b,0x03,0xc3,0x45,0xea,0x03,0xba,0x26,0x5f,0xdf,0x8d,0x5f,0xbb,0xeb,0x29,0x17,0xae,0xd4,0x1a,0xf6,0x67,0x94,0x54,0x5b,0xa1,0x87,0xa0,0x21,0xd3,0xb5,0xb6,0x1c,0x19,0xb8,0x3a,0x7d,0x53,0x49,0xa7,0x93,0x67,0x46,0x4d,0x97,0x8c,0x58,0x1c,0x2e,0xcc,0xb9,0xcc,0x55,0xca,0x63,0xfc,0x6b,0x00,0x6c,0x13,0x3c,0xa0,0xf7,0x3e,0xb1,0x9f,0x00,0x91,0xc6,0x1e,0x61,0xb2,0x6d,0xb9,0xfc,0x12,0x34,0x5e,0xad,0x05,0xe2,0xca,0x40,0xd6,0x97,0x08,0x50,0xde,0x23,0xda,0x44,0x47,0x14,0x26,0x6d,0x0b,0x15,0x32,0x5e,0x5b,0xe0,0x20,0x3c,0x37,0x37,0xc0,0xff,0xba,0xfe,0x8b,0x85,0x74,0x91,0xa6,0xa6,0x67,0xf0,0xd1,0xbf,0xfd,0x6a,0x05,0x24,0x85,0x52,0x4d,0x87,0x81,0x9c,0xd6,0x53,0x8e,0x44,0x16,0x4e,0x6b,0x91,0x08,0x5b,0xf2,0x05,0x56,0x6c,0x9c,0x8a,0xbc,0xe9,0x00,0xfa,0xa1,0x5d,0xfb,0xb1,0xfd,0x9e,0xfc,0xab,0x4d,0x29,0x3d,0xb4,0xe7,0x00,0xb6,0x7f,0xf3,0xd1,0x2a,0x9b,0xa7,0xa6,0x66,0x71,0xa4,0xa3,0x30,0x23,0xd1,0x9f,0xdf,0x70,0x1b,0x66,0x85,0x6b,0x15,0x29,0x69,0x63,0xf0,0xbf,0x3e,0x7b,0xcb,0xb0,0xce,0xad,0xbd,0xe9,0xa3,0x7f,0x7f,0x3b,0x4e,0x4d,0xdb,0x0b,0x4f,0xae,0xff,0xf2,0x5d,0x38,0x76,0xb2,0xdd,0xf1,0xeb,0x93,0xff,0x70,0x27,0x4e,0x9e,0x9a,0x02,0xb4,0x7c,0x13,0xd6,0x18,0xd1,0x80,0x15,0x1a,0x28,0xdd,0x58,0x9f,0x04,0xdd,0x04,0x20,0x0e,0x02,0x57,0xad,0x20,0xd3,0x0e,0xba,0x08,0x23,0xc7,0x3d,0xc7,0xd7,0x76,0xee,0x74,0x10,0xd2,0x3c,0x1d,0x3a,0x76,0x12,0xd7,0xff,0xa3,0xdf,0x5b,0xf6,0xe0,0xdb,0x9e,0x36,0x1c,0xaf,0x2b,0xf4,0x99,0xd6,0x1a,0x8f,0x3d,0x5e,0x00,0x60,0x92,0x4b,0x6b,0x59,0xae,0xde,0xa9,0x3d,0xa0,0x1c,0x99,0xfe,0x95,0x18,0x33,0xa1,0x64,0x00,0x64,0x2b,0x51,0x57,0x53,0x97,0x6e,0xf4,0x8a,0x91,0xf3,0x79,0x69,0x3c,0xc0,0x6b,0x16,0xb1,0x4e,0x6c,0xbd,0x6f,0xa9,0xcf,0xd0,0xf3,0x65,0xb4,0xd8,0xb8,0xf0,0x73,0x15,0xbd,0xb5,0x9f,0x1a,0xe5,0xe8,0x1a,0x87,0x4e,0x69,0x55,0x96,0xaa,0xc0,0x6d,0x0d,0xc4,0xea,0x53,0x29,0x8f,0x77,0x98,0x1d,0x34,0x4d,0x21,0x3a,0xe1,0x23,0xc5,0x14,0xad,0x42,0xc4,0x75,0x17,0xac,0xc6,0xda,0x35,0xf9,0x9e,0xd8,0xee,0xc7,0xbd,0x73,0x95,0x7d,0xde,0x23,0x4c,0xb6,0x65,0x4b,0x27,0xb0,0xf1,0xe2,0x75,0xe0,0x5a,0x70,0xc2,0x88,0x06,0x0c,0x3d,0x17,0x4c,0xac,0xc9,0x9c,0x29,0x89,0xbc,0xb8,0x9f,0x83,0xf0,0x97,0xbe,0x7e,0x3f,0x3e,0x74,0xfd,0x17,0xdc,0xf5,0x7c,0x39,0x9d,0x38,0x35,0x85,0x5f,0xfb,0x93,0xbf,0xc2,0xbe,0x23,0xee,0x68,0x46,0xd7,0xdb,0x68,0x60,0x17,0x39,0xd1,0x5b,0x35,0xe5,0x8d,0xa9,0x23,0x12,0xef,0x1a,0x26,0x4c,0x7c,0x93,0xfc,0x2f,0xa4,0x70,0x00,0xab,0xb4,0x3c,0xe4,0x3d,0x40,0x2b,0x34,0xf8,0xe3,0x4f,0xdd,0x8c,0xaf,0xdf,0xbf,0xbb,0xc8,0xdd,0x8e,0xbd,0x87,0xf0,0xdb,0x7f,0x71,0x23,0xcc,0xbc,0xf3,0xd8,0x2e,0x1a,0x4a,0x0c,0xf6,0x1c,0x38,0x5a,0xcc,0xa7,0x8d,0x1e,0x3f,0x78,0x0c,0xbf,0xf5,0xe1,0x1b,0x71,0x72,0x52,0xbe,0xc7,0x77,0x66,0x6e,0x0e,0xff,0xfd,0x93,0x5f,0xc2,0xbd,0x8f,0xc8,0xe7,0x4e,0x47,0x49,0xc7,0x4f,0x4d,0xe3,0x8f,0x3e,0xfd,0x15,0xfc,0xdd,0xcd,0xf7,0x43,0x69,0x6b,0x79,0x38,0x75,0x72,0x06,0xbf,0xfe,0xc1,0xbf,0xc3,0xe1,0xa7,0x64,0x21,0xc3,0x18,0xe0,0x33,0x5f,0xba,0x07,0x7f,0xfb,0x95,0x7b,0x43,0xdb,0x4a,0x37,0x44,0x35,0x4d,0x04,0x5a,0xa3,0xdd,0x31,0x22,0xa6,0x02,0xb7,0xf7,0x2f,0x93,0xcc,0x05,0xd0,0xb5,0x41,0x44,0x70,0x23,0x59,0x89,0x63,0xb2,0x05,0xb3,0xee,0x78,0x60,0x17,0xfe,0xcd,0xef,0x7c,0x02,0xa7,0x4e,0x4f,0x5b,0x90,0x73,0xe3,0xd1,0xe6,0x59,0x76,0xbe,0x69,0x03,0x5f,0xcb,0x90,0xc1,0xae,0xc2,0x1e,0x7b,0x5c,0xa5,0x9c,0xa0,0xd1,0x65,0xdb,0x81,0x6a,0xbf,0xa5,0x23,0x52,0x95,0x30,0x9f,0x17,0x03,0xf2,0xac,0x2b,0x3c,0x60,0x6a,0xfe,0x5c,0xfa,0x4c,0x6a,0x58,0x37,0x93,0xf8,0xc5,0xfa,0xf8,0x75,0x8a,0x46,0xa0,0x79,0xe7,0x66,0xef,0x61,0x8e,0x20,0xd5,0x05,0xd9,0xa4,0x5f,0xeb,0xcd,0xd5,0x89,0xba,0xed,0x01,0x6b,0x58,0xc7,0xda,0x4e,0x91,0x53,0x43,0x7b,0x34,0x85,0x5a,0x9d,0x4b,0x94,0x91,0x30,0x0a,0x4f,0xe8,0x78,0x85,0x21,0xc9,0x8b,0x7d,0x94,0xc1,0x65,0xe2,0xdc,0xf3,0x7d,0x96,0xd6,0xa3,0x98,0xb2,0xed,0x43,0x7c,0xc5,0xc9,0x33,0xc6,0x90,0x8d,0x3e,0x03,0xf8,0xe3,0x48,0x74,0x8f,0x78,0x0c,0x0d,0xfe,0xf4,0xc3,0xff,0x3b,0xc6,0x73,0x7b,0x9b,0x77,0xde,0xf3,0x10,0x29,0xc3,0xe0,0xe6,0xaf,0xdf,0x8d,0x81,0x36,0x50,0xd0,0xc4,0x65,0x5b,0x61,0x40,0xf7,0x09,0xc3,0x5e,0x70,0x7e,0x9c,0xc7,0xd7,0xdb,0x40,0x59,0x87,0xac,0x26,0xb6,0xcf,0x87,0x3f,0xf3,0x05,0x8c,0x8d,0x8d,0x85,0x24,0xc7,0x4f,0x4d,0x11,0x27,0x33,0x3f,0x58,0x95,0x6b,0x0f,0xc7,0x03,0x1a,0xfc,0xd5,0x4d,0xb7,0xe3,0x8e,0x7b,0x1f,0xc5,0x75,0x2f,0x7e,0x16,0x2e,0x59,0xbf,0x06,0x4b,0xc6,0x1b,0x9c,0x9e,0x9e,0xc3,0x63,0x4f,0x1c,0xc2,0x97,0x6f,0x7f,0x00,0xa7,0xa6,0xa6,0x00,0x34,0xd0,0x4e,0x7b,0xf9,0xf8,0xe7,0xbe,0x8a,0xa5,0x13,0x4b,0x08,0x63,0x8a,0x77,0xa9,0x02,0x1e,0x3f,0x70,0x0c,0x68,0x00,0x3d,0xd0,0xf8,0xe3,0x4f,0x7d,0x21,0x56,0xc3,0xe5,0x71,0xe0,0xe8,0x49,0x77,0x6f,0xad,0x4f,0xaa,0xb0,0x63,0xcf,0x41,0x7c,0xf4,0x86,0xaf,0xd1,0x06,0xc4,0xc3,0xbb,0x0f,0x92,0xe6,0xcb,0xbd,0x2f,0x3f,0xf3,0xc5,0xbb,0xb0,0x6a,0x05,0xf7,0x3c,0x7f,0x78,0xf7,0x81,0x20,0x64,0x7c,0xf8,0x86,0x5b,0x91,0xd2,0x8e,0x5d,0x07,0xc2,0xe2,0x31,0x3b,0x3b,0x8f,0xff,0xf2,0xe7,0xff,0x80,0xe7,0x5d,0xbd,0x11,0xd7,0x5e,0xbd,0x09,0x17,0xac,0x3e,0x0f,0x0d,0x14,0x8e,0x4f,0x4e,0xe3,0xfe,0x47,0xf7,0xe3,0xb6,0x07,0x76,0xb1,0xcb,0x1d,0x0e,0x3f,0x35,0x89,0x8f,0xfd,0xdd,0xd7,0xb3,0x3c,0x8f,0x1d,0x9f,0xc4,0x0d,0xdb,0xef,0xc3,0x83,0x8f,0xf2,0x8b,0x47,0x0e,0x3f,0x35,0x09,0x68,0x60,0xe7,0x9e,0xc3,0xf8,0xf0,0xe7,0x6e,0x63,0x61,0x53,0xd3,0xb3,0x6c,0xf2,0x7e,0x73,0xc7,0x93,0x78,0xef,0x07,0x3e,0x85,0x57,0x3d,0x6f,0x0b,0x36,0xae,0x5f,0x83,0xf1,0xf1,0x31,0xcc,0x6b,0x8d,0x83,0x47,0x4f,0xe0,0xe6,0xbb,0x1e,0xed,0xa4,0x81,0x76,0xa5,0x8f,0x7f,0xfe,0x8e,0x4c,0x43,0x9d,0x9d,0x1f,0xe0,0x89,0x43,0xc7,0xf1,0xc0,0xa3,0xfb,0xc5,0x3b,0xba,0xf7,0xee,0x3b,0x86,0x9f,0xff,0x6f,0x9f,0xc6,0xb7,0xbc,0x60,0x0b,0xb6,0x5c,0x7a,0x21,0x56,0x2c,0x5f,0x8a,0xf9,0xc1,0x00,0x87,0x9f,0x3a,0x85,0xaf,0xdd,0xb3,0x0b,0x8f,0x3d,0xc9,0xbf,0xbc,0x75,0xeb,0xdd,0x8f,0x60,0xdf,0xc1,0x63,0xac,0xcf,0xa6,0x66,0xe6,0x50,0x5b,0xcd,0x0c,0x11,0xf0,0xf6,0x1f,0x39,0x8e,0xbf,0xf8,0xec,0x2d,0x79,0x9c,0xd2,0x9e,0xba,0x17,0x97,0xd3,0xa0,0xd4,0x91,0x09,0x88,0x4b,0x8a,0x06,0xbe,0xb9,0xe3,0x71,0x7c,0xe4,0xb3,0xb7,0x64,0xc2,0xf9,0x53,0x27,0x26,0x71,0xdf,0x63,0x4f,0x62,0xdf,0xa1,0xa7,0xe0,0xe7,0x8f,0xa1,0x0e,0x09,0xd0,0xb8,0xfd,0xbe,0x47,0x70,0xfc,0xe4,0x24,0xe2,0xfc,0xb2,0x99,0xee,0x3b,0xec,0xd3,0xc4,0xb9,0xf7,0x99,0x7f,0xf8,0x9a,0x3d,0x25,0xe1,0xee,0x14,0x37,0x30,0x78,0x78,0xd7,0x3e,0xec,0x7d,0xf2,0x30,0xfe,0xec,0xd3,0x37,0xb1,0x7a,0xc0,0x18,0x0b,0xf8,0x49,0x7d,0x9e,0xdc,0x7f,0x08,0x7f,0xfa,0x89,0xcf,0x31,0x5e,0xad,0x30,0x90,0xef,0xfd,0xee,0x78,0xec,0x71,0xfc,0xc9,0x47,0xfe,0x3a,0xe4,0xe7,0x33,0xd3,0xf3,0x76,0x6e,0xdc,0xfe,0x8d,0xfb,0x70,0x7a,0x6a,0x1a,0xd0,0xc6,0x3a,0x80,0x1a,0x83,0xa9,0xa9,0xe9,0x98,0x2f,0x80,0xcc,0x99,0xab,0xaa,0xe1,0x12,0x60,0xd4,0x91,0x95,0xec,0x0a,0xca,0x6c,0xed,0x35,0x43,0x3a,0x60,0x75,0xa5,0x12,0x0e,0x51,0x1a,0x6e,0xeb,0xa6,0x0f,0x97,0x6a,0xfc,0xa2,0x67,0x92,0xf8,0x14,0xd4,0x12,0x67,0xa6,0xa6,0xe2,0x87,0xac,0xa8,0x71,0x88,0x78,0x39,0x87,0x65,0xb4,0xe1,0x51,0x43,0x90,0x8a,0x2f,0x43,0x40,0x93,0xc5,0x31,0xee,0xc1,0x3b,0x70,0x58,0x8c,0x6a,0x22,0x3f,0xe4,0x0e,0x5f,0xc5,0xee,0x9b,0x55,0x6e,0x4e,0x34,0x76,0x9f,0xc9,0xd5,0xc3,0xf2,0xa8,0x62,0x1e,0x8d,0xe7,0x51,0xb9,0xd7,0x8a,0x95,0x17,0xbe,0x40,0xa4,0x00,0xe5,0x24,0x78,0xe5,0xf3,0x08,0x65,0x2b,0x57,0x86,0x33,0x88,0x7a,0x49,0x9f,0xdc,0xe9,0xaa,0x54,0x4c,0xa3,0x7c,0xfd,0xfd,0x3b,0x27,0xe1,0x34,0xe1,0x4c,0x2e,0x80,0xa6,0x89,0x00,0xe5,0x78,0xb0,0xb2,0xc0,0x98,0x55,0x41,0x3c,0x58,0x37,0xae,0xde,0xbe,0x0e,0xa1,0xbf,0x1a,0xd2,0x8e,0x0d,0x01,0xb6,0xc6,0xa5,0xa1,0x7d,0xe6,0xeb,0x4a,0x4f,0x5b,0x27,0xe9,0x13,0x4f,0x63,0xe5,0xbc,0xad,0x7d,0xfd,0x99,0x48,0x44,0xcf,0x7e,0xd1,0xdf,0x85,0x93,0x3c,0xa1,0x2f,0x13,0x0d,0x89,0xfb,0xe7,0x48,0x23,0x50,0x55,0x1f,0xf3,0x57,0xed,0x92,0xe4,0xc2,0xbe,0xe3,0x75,0x6e,0xde,0xee,0xba,0x30,0x5a,0xc8,0x1e,0x72,0x07,0x5f,0x10,0xb6,0x50,0x17,0x16,0xb0,0x4e,0x2f,0x0d,0xff,0x25,0x80,0x2e,0x7b,0x9d,0x76,0x15,0xad,0x26,0xe5,0x89,0x08,0x00,0x21,0x07,0x17,0x6e,0x02,0xf0,0x92,0xf8,0x9a,0xa7,0xb1,0xf1,0x4c,0x94,0xf6,0x83,0x66,0x4e,0x34,0xcf,0xa0,0xf9,0x3b,0x13,0x16,0xdb,0xdf,0xd4,0x16,0x10,0x1d,0x30,0x65,0xda,0xaf,0xd7,0xbc,0x8d,0xb3,0x94,0x79,0x67,0x46,0x18,0x76,0x41,0x10,0xb4,0x26,0xbe,0x6a,0x9a,0x81,0x7e,0x28,0xd3,0x18,0x7e,0x64,0xc8,0x69,0xcf,0xfe,0x82,0x0b,0x13,0xde,0xc5,0x34,0x26,0xec,0xa9,0xbb,0x36,0xf6,0x8d,0xef,0xeb,0xe0,0xeb,0xab,0xfd,0xd5,0x98,0xae,0x0e,0x9a,0xd4,0x8f,0xc4,0x01,0x94,0x15,0xa8,0xd8,0x51,0x2b,0xb8,0x36,0xd0,0xc8,0xdb,0x07,0x84,0xc7,0x58,0x9e,0xd7,0x99,0x03,0xe8,0xb3,0x3e,0xe5,0x02,0x08,0x8f,0xe3,0xdf,0x26,0xda,0x39,0x93,0x1a,0x0c,0x4a,0x82,0x47,0xf4,0x27,0x4a,0x30,0x94,0xf0,0xea,0xa9,0x87,0x17,0x34,0xd1,0xbe,0x16,0x4c,0xa9,0x96,0x3c,0x1c,0x05,0x8e,0x0c,0x01,0x82,0x80,0xfd,0x2e,0xb4,0x75,0x0f,0xc1,0x69,0xb9,0x9e,0x2d,0x92,0xb3,0x74,0x1c,0xc9,0x9f,0x2b,0x96,0xbc,0xa1,0x89,0xec,0x16,0x34,0xc9,0x5c,0x59,0xf7,0x52,0xb3,0x82,0x52,0x24,0x85,0xd2,0x00,0xc6,0xa1,0xa1,0xd1,0xd0,0x03,0xfb,0x8d,0x9f,0xb0,0xb6,0x60,0x7b,0x2c,0x89,0xda,0xd4,0x1b,0x57,0x05,0x7f,0xc6,0xd2,0x09,0x0b,0x6e,0xb0,0x2a,0x7a,0x34,0xc9,0x34,0x4e,0xdb,0x77,0x83,0xbf,0x69,0xb8,0x26,0xec,0x16,0x88,0x60,0x11,0x60,0x36,0x6d,0x0d,0x7e,0x56,0xb8,0x81,0x31,0x5e,0x18,0xb1,0xcf,0x9a,0x02,0xb1,0x68,0x96,0x6e,0xf8,0x22,0xd7,0xc4,0xbf,0x5c,0x64,0x83,0x9d,0xc8,0x4d,0xc3,0xc6,0x78,0xb0,0x9e,0xd4,0x86,0xa1,0xc9,0x23,0x84,0x2c,0x94,0xe5,0xbd,0xed,0x9b,0xf0,0x06,0xe9,0x78,0xa0,0x3c,0xb4,0xd1,0xa0,0x53,0xac,0xa7,0x0f,0xb5,0xcf,0xd3,0x3a,0x36,0xb6,0x98,0xfc,0x3a,0x15,0x55,0x0a,0x60,0xab,0xa5,0x1c,0xcb,0x83,0x6e,0xd3,0x14,0x85,0x3f,0x9e,0x1d,0x79,0x51,0x03,0x5e,0x9b,0x29,0xcf,0xc4,0x83,0x1d,0x63,0x44,0xdb,0x05,0x59,0xa9,0x00,0x92,0x01,0x7c,0x3d,0x50,0xd5,0xc0,0x57,0x3b,0x20,0x6d,0x03,0x5f,0xf8,0x65,0xc8,0xad,0x15,0x21,0xcd,0x20,0xaf,0x6a,0x00,0x5f,0x5f,0x27,0x05,0x98,0x01,0x22,0xe3,0x6e,0x75,0x93,0xb4,0x4f,0xed,0xd3,0x25,0x60,0x14,0x78,0x25,0xcf,0x00,0xf2,0xf3,0xbf,0xb4,0xa3,0x0a,0x96,0xcc,0x6c,0xff,0xd7,0xa0,0x78,0x2d,0x60,0x1b,0x19,0xf6,0xa7,0x1c,0x61,0x44,0x98,0xd4,0x97,0x3a,0x02,0x70,0x17,0xe6,0x24,0x80,0xce,0xdf,0xf1,0x37,0xe4,0x29,0xfd,0x49,0x80,0x34,0x7e,0x57,0xd6,0x85,0x6b,0x95,0x5c,0xae,0x51,0xdb,0x07,0x76,0xe0,0xe8,0x15,0xc6,0xd0,0xe7,0x26,0x8f,0x0e,0xe3,0x26,0x95,0x81,0xcc,0x90,0x02,0x1b,0x34,0xf4,0x56,0x2c,0xa5,0x9c,0x19,0x3a,0xe5,0x83,0xf0,0xe0,0x2f,0x7a,0xf7,0x9a,0x23,0x3c,0xb8,0xaa,0x00,0x0e,0x76,0xfe,0x68,0xa7,0x09,0x6a,0x18,0xaf,0xbd,0x33,0x84,0x22,0x03,0xd2,0xe7,0x45,0x40,0xd8,0xa0,0x71,0x5a,0xb8,0x75,0xca,0x0a,0x20,0xec,0x81,0x33,0x14,0xa7,0x73,0x10,0x76,0x85,0xd8,0x38,0x06,0xbc,0xbe,0x7e,0xe2,0x37,0xce,0xcc,0x6d,0x7f,0x1b,0xe3,0xad,0x11,0x02,0x10,0xfb,0x74,0xb4,0x4b,0x5c,0x3a,0x09,0x8c,0x83,0xd4,0x29,0x28,0xaa,0x76,0xde,0xdb,0x36,0xe3,0x63,0x08,0x49,0xe4,0x82,0xb0,0x18,0x26,0xa3,0x3c,0x99,0xe3,0x5b,0x5d,0x1c,0xf2,0x5d,0xa6,0x68,0xcc,0xa7,0x83,0x36,0x7c,0x36,0xb0,0xba,0xd3,0x3a,0x93,0x6a,0x18,0x0b,0x2b,0xab,0x9e,0x4f,0x2d,0xd4,0xf4,0x79,0x4c,0xc2,0x74,0x72,0x76,0x3f,0xff,0x69,0x23,0xca,0xa0,0x1b,0xa3,0x12,0xe0,0x35,0x80,0xa8,0xf1,0x66,0x69,0xb5,0x9b,0xa6,0x64,0xae,0x2e,0x10,0x7c,0x21,0x81,0x6f,0xa8,0xab,0x89,0xef,0xfc,0x9a,0x42,0x4d,0xc5,0xec,0x6e,0x78,0x0e,0xb4,0xb4,0x93,0x8c,0x4b,0xab,0xc2,0x1a,0xa8,0x21,0x3a,0x5f,0xf9,0x60,0x63,0x58,0x8e,0x29,0x26,0x87,0x07,0xc1,0xfc,0x1c,0xd3,0x50,0xc0,0x95,0x26,0x9e,0x9f,0x24,0xe9,0x82,0x41,0xea,0xcf,0x14,0x2d,0xa2,0xfd,0xfa,0x3f,0x25,0x65,0xb4,0xf5,0xb5,0xf4,0xb6,0xdf,0x2a,0x50,0xa3,0x11,0x7e,0x8e,0xd0,0x93,0x29,0xae,0x7f,0x3e,0xb8,0xce,0x9b,0x2c,0x15,0xe5,0x69,0x0b,0xd2,0x93,0xb8,0x0f,0x6c,0x60,0x51,0x81,0x80,0xb2,0x01,0xe8,0x79,0xe0,0xb8,0x8f,0x6a,0x22,0x3e,0xa6,0x3c,0xf9,0xa4,0x1e,0xcc,0x01,0x10,0x95,0x38,0x66,0x0b,0x2f,0x24,0xf8,0x8c,0x3c,0xc8,0x7a,0x9e,0x4c,0x6c,0xa6,0x30,0x41,0x4d,0x00,0x53,0x5e,0xbc,0x76,0x80,0xea,0xca,0x42,0x13,0xf6,0x66,0x42,0x1d,0x09,0xc3,0xc6,0x10,0x10,0x0e,0x66,0x23,0xf2,0x79,0xbf,0x90,0x47,0xa2,0x09,0x07,0x21,0x20,0x4a,0xb8,0xc6,0xbd,0x8b,0x1a,0x37,0xd5,0x86,0xdd,0x73,0xe3,0x17,0x8c,0x06,0x30,0x64,0x5b,0x00,0x03,0x68,0x87,0xa2,0xe1,0x2d,0x5d,0xa0,0x6a,0x60,0x1c,0x8a,0xd2,0x2c,0xba,0xcd,0x23,0xfa,0x13,0xc4,0xc0,0x16,0xa3,0xb1,0x37,0xcb,0x05,0x92,0x07,0x61,0xba,0x66,0xd0,0x92,0xfb,0xe0,0x64,0xcc,0x47,0xd0,0xfe,0x44,0xa9,0xa2,0x3b,0x2d,0x30,0x79,0x4e,0x23,0x14,0xfa,0x8d,0xf0,0x6b,0x28,0x06,0xec,0xc4,0x70,0x0f,0x89,0x00,0x1f,0xc6,0x8d,0x54,0x86,0xb0,0xaf,0x2b,0x29,0xe0,0x26,0x09,0x10,0xac,0x35,0x9a,0x21,0x84,0xb3,0x1e,0x75,0x05,0x5e,0x38,0xb0,0x52,0x0a,0xd1,0xe4,0x1c,0x79,0xb6,0x0e,0x81,0xbe,0x14,0xbf,0xb6,0x10,0x4d,0x36,0xe4,0x43,0xcf,0x28,0x3b,0x27,0x2f,0xcd,0xcb,0x09,0x20,0x18,0x4c,0xcf,0x9e,0x25,0x03,0xca,0x27,0x37,0x3d,0x23,0x0a,0x03,0xc6,0x2d,0x68,0x44,0x90,0x35,0x7e,0x29,0x62,0x5c,0xd3,0x87,0x28,0x10,0xd0,0x26,0x4a,0x5b,0x30,0x25,0x79,0x5e,0x50,0xad,0x39,0xae,0xc6,0xd2,0xfe,0x6f,0x79,0x54,0x95,0x98,0x6d,0xe7,0xa9,0xc0,0x60,0x21,0x6c,0x84,0x93,0xc5,0x51,0x02,0xc0,0x15,0xf0,0xab,0x51,0xb6,0x9e,0xa5,0x52,0x4c,0x9a,0xaf,0x20,0xc6,0x2a,0x92,0x49,0xb5,0x9e,0xd2,0x52,0xc8,0x01,0x32,0xa4,0x67,0x82,0x13,0x65,0x92,0xfe,0x6e,0x02,0x28,0xf1,0xec,0x6d,0x1c,0x6b,0x86,0x76,0xf7,0xf9,0x26,0xce,0x58,0xf6,0x8e,0x63,0x9f,0x86,0x48,0x9d,0x4d,0x52,0x7f,0xaf,0x19,0x07,0xd9,0x24,0xd1,0x82,0x53,0xc6,0x4d,0x43,0xb4,0x60,0x5f,0x3d,0x22,0x05,0x8b,0x20,0x4c,0x9a,0xc1,0x00,0x4a,0x79,0xe0,0xb6,0x3c,0x99,0x46,0x02,0xe1,0x86,0x69,0xc2,0x76,0xcd,0x10,0xb4,0x61,0xf8,0xf5,0xb0,0x0b,0x10,0xc3,0x01,0x31,0x15,0x21,0x6c,0x48,0xa3,0x48,0x03,0x57,0x3d,0xa7,0x73,0x40,0x36,0xee,0xb5,0x0f,0x48,0x15,0x5e,0x23,0x8c,0x5b,0x0e,0x9d,0x3d,0x20,0x34,0xd3,0xa6,0xfd,0xbf,0xed,0x79,0x2c,0x4c,0xa1,0x6d,0x9f,0x7b,0xc3,0x2f,0x01,0x85,0xf6,0xee,0xc0,0x70,0xf7,0x32,0x2b,0x31,0x8b,0x41,0x05,0x06,0x4c,0x6d,0xc9,0xa5,0x9a,0x5f,0x31,0x28,0x29,0x3b,0x5d,0xa4,0x0b,0xa0,0x9b,0x66,0xca,0xc6,0x56,0x3b,0xf0,0x5a,0xae,0x1d,0xf0,0x02,0xa0,0x5a,0xaf,0x7d,0x34,0x60,0x7b,0xd1,0xc6,0x69,0x72,0x29,0xf8,0x6a,0xae,0xf9,0x66,0xe0,0xeb,0xb3,0x95,0xf6,0x7d,0x93,0x86,0xd0,0x7e,0x61,0x50,0xf3,0x09,0x2f,0x44,0x38,0x30,0x08,0xe6,0xe2,0xa2,0xf6,0xab,0x09,0xd0,0x67,0x75,0xf3,0x56,0xae,0x08,0x9c,0x55,0xf3,0x73,0x58,0x73,0x79,0x3f,0x70,0xf3,0xb3,0x4f,0xa3,0x58,0x16,0xf9,0xfe,0xaf,0x27,0x6e,0x29,0xe5,0x19,0x27,0x0f,0x59,0xb4,0xf4,0x45,0x3a,0x3e,0x92,0x35,0x7d,0xe8,0x89,0xc8,0xf3,0xad,0x68,0xc0,0x29,0xaa,0x8e,0xd8,0x56,0x46,0xaf,0xa4,0x94,0x34,0x92,0x82,0x05,0x51,0xd2,0x00,0x54,0x29,0x30,0x49,0x65,0xb4,0x71,0x87,0xfe,0xe1,0x00,0xd1,0x30,0xad,0x95,0x99,0x77,0x35,0xac,0x14,0xe6,0x91,0x2d,0x22,0x80,0x4b,0x43,0x0c,0x99,0x41,0x0b,0x36,0x80,0x8a,0x9e,0xd0,0x4c,0x0b,0xa6,0x78,0xeb,0xf9,0x32,0x1a,0x06,0x63,0x4e,0x0b,0x76,0x19,0x3b,0xd1,0x53,0x9b,0x06,0x8d,0x68,0x8a,0x76,0x13,0x43,0x51,0x10,0x1e,0x0b,0xef,0x6c,0x39,0xda,0xb3,0xd2,0x02,0xc2,0x6e,0x71,0x51,0x80,0x22,0x7b,0x65,0x56,0x40,0x20,0x2b,0x82,0x72,0x93,0xd5,0x2b,0xc9,0xc1,0x44,0x2b,0x00,0x31,0x5c,0xf9,0xf6,0x87,0xcb,0x86,0x2f,0x09,0x0d,0x0c,0x6d,0x70,0xd0,0x05,0x48,0x26,0x22,0x88,0xc4,0xd6,0x63,0xc1,0x2a,0x9b,0x30,0x24,0x0e,0xf9,0x42,0x94,0x3c,0x8a,0xbb,0x8e,0xed,0xf6,0x59,0xd7,0x1a,0xa3,0x5a,0xd4,0xa0,0x16,0xb8,0x38,0x34,0x7a,0xa1,0xbe,0xa5,0x8c,0xbc,0xc0,0xfc,0x4d,0x59,0x38,0x2b,0x60,0x67,0x3d,0x42,0x35,0x91,0x71,0x18,0xa3,0xe8,0x2b,0x59,0x5b,0x73,0x5a,0x6b,0xc6,0xb0,0xdb,0x53,0x6d,0x05,0x5e,0x00,0xfe,0xbb,0xc6,0x86,0x0a,0xb1,0xa3,0x00,0xdf,0xa0,0x31,0x2b,0xc1,0xf4,0xdc,0x84,0x70,0x9f,0x8e,0x03,0xa7,0x3f,0x9e,0xe5,0xa6,0x3b,0x49,0x9f,0x77,0x9d,0x67,0x56,0x38,0xfb,0x1b,0x7e,0x68,0x9e,0x48,0x13,0xcc,0x4e,0xe5,0xfb,0xaa,0xf9,0xb9,0xb4,0xa8,0xe7,0xc0,0x5d,0x23,0x93,0x66,0xcb,0x99,0x2d,0x45,0x58,0x00,0x75,0xb7,0x53,0x75,0x37,0x41,0x33,0x40,0x4a,0xa9,0x88,0x7e,0x1d,0x48,0x4e,0xcb,0x81,0xb5,0xcb,0x3e,0x30,0x4d,0xab,0xa1,0x90,0x7c,0x85,0x26,0x98,0xa1,0xd3,0x32,0xa3,0xf6,0x6c,0x94,0x37,0x43,0xa7,0x4a,0x90,0x41,0xe2,0x8e,0xeb,0x34,0xd4,0x31,0x0e,0xc4,0x21,0xcc,0x90,0x6d,0x22,0xc5,0xf7,0x9c,0x0d,0x39,0xaa,0xa4,0x4c,0x98,0xb8,0xb9,0x29,0xda,0x65,0x13,0x94,0x73,0x19,0x84,0x2d,0xca,0x0e,0x90,0x81,0x30,0x90,0xef,0x09,0x67,0x20,0x0c,0x70,0xe7,0x2c,0x5b,0x2f,0x83,0xc6,0x39,0x5d,0xa7,0xb3,0x05,0xa0,0x3e,0xd2,0x22,0x10,0x03,0x80,0x4e,0x81,0x18,0xa0,0x60,0x4c,0xf5,0x97,0x60,0x9e,0x66,0x8d,0x98,0x2e,0x72,0x25,0xcb,0x4c,0x23,0x47,0x47,0x92,0x65,0x43,0x4b,0x2c,0x53,0x94,0x8d,0x16,0xe2,0xc9,0xdc,0x32,0x0f,0x28,0x03,0x23,0x96,0x69,0x3b,0x53,0xef,0xb5,0x66,0xa1,0x8b,0x53,0x49,0x63,0xa9,0x46,0x2f,0xc7,0xcf,0xc6,0x46,0x1a,0xd6,0x82,0xd0,0x26,0x11,0xd7,0x08,0xb0,0x70,0x51,0x91,0xfe,0x14,0xc6,0xa4,0x03,0x3f,0xab,0x49,0x52,0xe0,0x25,0x4c,0x1a,0x0b,0x6f,0x35,0xad,0x17,0x00,0xf3,0xfa,0xed,0x05,0xbe,0x2e,0x1e,0xdf,0xf7,0xf5,0xf3,0xd0,0xdf,0x4f,0xad,0x49,0x5a,0x9b,0x41,0xd4,0x7e,0x4d,0xcc,0x13,0x5e,0xfb,0x75,0x69,0x42,0x3f,0x18,0xa7,0xfd,0x92,0xb5,0x20,0x80,0xb8,0x02,0xb4,0x17,0x1c,0x05,0x81,0x23,0xed,0xc5,0x60,0x6a,0xa7,0x20,0x4a,0xf2,0x82,0x29,0x98,0x9f,0x4b,0x7d,0x1a,0x3d,0xb4,0x7d,0x3f,0x2a,0x90,0xe7,0x74,0x31,0x6f,0x11,0x06,0xdb,0xa9,0x50,0x2f,0x1a,0x5e,0xfc,0x08,0x43,0x4e,0x23,0xde,0x03,0x96,0xc0,0x54,0xf8,0x8c,0x60,0x2b,0x8e,0x47,0x50,0x4c,0xe3,0x59,0x2c,0x4c,0xc0,0x33,0xfb,0x8d,0x38,0x20,0x8b,0xde,0xd0,0x69,0xe6,0x4e,0x52,0xa4,0x5a,0x70,0x98,0x94,0x8a,0x09,0x03,0xd9,0xc1,0x61,0x3f,0xc8,0xa5,0xbd,0x60,0xc4,0xb3,0xb5,0xd1,0x3c,0x4d,0xf9,0xa3,0xaa,0x31,0x19,0x84,0x2e,0x8d,0x36,0xc4,0x2b,0x5a,0x00,0x61,0xa3,0x9c,0x13,0x95,0xf1,0xde,0xb7,0x6e,0x61,0x10,0x1c,0xb3,0x00,0xe5,0xf0,0x76,0xe0,0x6a,0xc4,0x81,0x33,0x68,0xc3,0x7e,0x50,0xd3,0x63,0x50,0x04,0x88,0x6d,0xd3,0x08,0x40,0x0c,0x38,0x30,0x76,0x93,0x65,0x00,0x44,0x29,0x49,0x13,0x67,0xf3,0xe8,0xf6,0xcc,0x21,0x1a,0xb1,0x4f,0x54,0x7c,0xc3,0x16,0x10,0x46,0xe5,0x71,0xe2,0xf4,0x6c,0xc2,0x47,0x0c,0x29,0x4d,0x8f,0x98,0xbd,0x16,0xf1,0x7e,0x34,0x78,0x49,0xc7,0xe8,0x48,0x32,0x1c,0x01,0x75,0xd7,0x26,0x4a,0x24,0x56,0xa5,0x63,0xb6,0xf5,0x35,0x51,0xc8,0xa4,0x15,0x64,0x3d,0x71,0xa0,0x8b,0x26,0x66,0x5e,0x48,0x77,0xd0,0x05,0xc2,0x1e,0xaa,0x4b,0x68,0x0a,0x1a,0x6f,0x0a,0xbc,0xa1,0x1c,0xcf,0x3b,0x8b,0xea,0xb4,0x53,0x1d,0xbe,0x24,0x8e,0xfc,0xa2,0x8d,0x02,0xf8,0x12,0xa7,0xab,0xfa,0xbe,0x6f,0x04,0xa8,0x08,0xbe,0xda,0xd5,0x81,0x54,0x88,0x69,0xbf,0xbe,0xe1,0x7c,0x5a,0x15,0xca,0x34,0x69,0x9c,0xf0,0x22,0xd7,0x7e,0xf3,0xf6,0x96,0x05,0xea,0x4e,0xe6,0x67,0x1e,0x21,0xc9,0xb7,0x40,0x5d,0xc6,0x4b,0x2a,0x27,0xd0,0x97,0x8b,0x38,0x4f,0x17,0xc1,0x09,0x0b,0x08,0x0d,0xc7,0xce,0x7b,0xc4,0x46,0x77,0xc3,0x25,0x4b,0x92,0xed,0x03,0x77,0x5c,0xf1,0x42,0x54,0x9f,0x25,0x4b,0x47,0x80,0xcd,0x61,0x43,0x6e,0x86,0x96,0x9c,0xb1,0xc0,0x9d,0xb1,0x82,0x67,0x42,0x1c,0x38,0xd6,0xc3,0x38,0xd5,0x82,0x3d,0xe0,0x1b,0x17,0xd5,0x97,0xc5,0x41,0x38,0x1e,0xf5,0xf1,0x03,0x7a,0xcc,0xe1,0x1c,0x15,0x1c,0x34,0x80,0x71,0xb0,0xfd,0xe0,0x2a,0x08,0x93,0x46,0x13,0xbc,0xa3,0x2d,0x28,0x29,0x28,0xed,0xac,0x09,0x8d,0xb6,0xe7,0x87,0xc3,0xda,0x61,0xd3,0x44,0x6d,0xd8,0x4d,0x96,0x12,0x10,0xbb,0xf6,0xcd,0xba,0x89,0xb6,0x13,0x9d,0x90,0xda,0xf7,0x7f,0x04,0x38,0x9b,0xb6,0x09,0x73,0x95,0x66,0xde,0x28,0x2f,0x59,0xa7,0xe8,0x29,0xa0,0x63,0x36,0x49,0xfc,0xa5,0x11,0x54,0xdb,0x2f,0x44,0x25,0xf9,0x85,0x92,0x84,0xa2,0x87,0x9d,0x87,0xbc,0x7d,0x16,0x0e,0x76,0x8b,0x49,0x23,0x59,0x6b,0xc4,0xc5,0x8c,0x52,0xa1,0x0d,0x4c,0x2d,0x4e,0xda,0xe7,0xe9,0x73,0x0a,0x96,0x06,0x1a,0x83,0x62,0x85,0x98,0x46,0xc5,0x30,0x23,0x29,0x37,0x4e,0x84,0xc8,0x63,0x98,0x02,0x11,0xd4,0x48,0xc6,0x00,0xf8,0xf9,0xdb,0x12,0xf0,0x06,0x91,0x20,0x33,0x39,0xbb,0xb8,0x0b,0x02,0x5f,0xf7,0x5b,0x69,0x70,0xe6,0xa9,0x80,0x6f,0x42,0x1d,0xb9,0xe3,0x15,0x39,0x53,0x1b,0xe2,0x18,0xc6,0x43,0x5c,0xe7,0x6a,0xda,0xaf,0x0f,0xf1,0xaa,0x08,0x6d,0x5b,0xcf,0x3b,0xe0,0xcf,0xfe,0xda,0x49,0xef,0xab,0x11,0x27,0x6c,0xd2,0xad,0xec,0x5d,0x0c,0x2b,0x98,0x91,0xb3,0xd7,0x86,0x3f,0xfb,0xfe,0x62,0x89,0xd2,0xb1,0x97,0x64,0x32,0x42,0x40,0xee,0x05,0xc0,0x55,0x4c,0x6c,0x01,0x4c,0x31,0x38,0x80,0xb4,0x88,0x9c,0x1c,0x58,0x8b,0x66,0xe8,0x82,0x34,0x05,0xc1,0x1b,0x9a,0x71,0x91,0x96,0x99,0x3a,0x63,0xd1,0xc1,0x6a,0x07,0x51,0x2f,0x2d,0x18,0x08,0x7b,0xce,0x39,0x40,0xdb,0xba,0x97,0x4d,0xd1,0x8e,0x2f,0x07,0xc2,0x7c,0x3f,0xd8,0x96,0x53,0x04,0x61,0x2f,0xfc,0xa0,0xc9,0x41,0xd8,0x65,0x1b,0x4d,0xd2,0xe0,0xda,0xb0,0x65,0xda,0x71,0x69,0xd3,0x53,0x20,0x56,0xa1,0x7c,0x22,0x5c,0x19,0x5a,0x3b,0xe1,0x8c,0x32,0xb5,0x68,0xd0,0x05,0xc8,0x69,0xc7,0x26,0xc4,0x25,0xd1,0xdd,0x43,0x14,0xc6,0x8d,0x0f,0x76,0xed,0x2f,0xa0,0x63,0x78,0xf4,0x3c,0x76,0x01,0x69,0x4f,0x89,0x96,0x22,0x69,0xa9,0x52,0x51,0x1d,0x69,0x11,0x05,0xe8,0xb3,0x4a,0x59,0xbd,0x3a,0xb4,0x6f,0x77,0x6a,0x03,0xd8,0xa4,0x50,0x53,0x2b,0x85,0x00,0x61,0x16,0x29,0xc9,0x57,0xd1,0xf7,0xc4,0x9a,0x43,0xd7,0x6d,0xc9,0xbc,0x1a,0x80,0xb7,0x5d,0xe3,0xb5,0xaf,0x75,0x00,0x9e,0xb2,0xc9,0x19,0x71,0x4d,0xf2,0x0e,0x56,0x41,0x48,0xaf,0x80,0x6f,0x98,0x6f,0xf3,0x91,0xf1,0x60,0x7a,0x46,0xc8,0x0b,0x26,0x82,0x25,0x73,0xbc,0xa2,0x75,0xcb,0xce,0xfd,0xea,0xb0,0x06,0x07,0x8d,0x35,0x34,0x47,0xa2,0xfd,0x52,0x01,0x85,0xc5,0x49,0xcd,0xcf,0x49,0x9a,0xa4,0xa5,0xca,0x3d,0xeb,0xdb,0x2a,0xf6,0x07,0x33,0x3f,0x0b,0xb9,0xe5,0xe5,0xe4,0xc0,0xbd,0x90,0xf9,0xda,0x37,0xad,0x00,0xc0,0x32,0xa0,0x59,0xa2,0x66,0x52,0xa9,0xe8,0xd1,0x18,0xe9,0x18,0x1f,0x52,0xb6,0x06,0x10,0xbf,0xec,0xed,0x27,0x0d,0xc0,0xdb,0x35,0x35,0x43,0xd3,0x31,0x40,0xf6,0x67,0x43,0x51,0xfe,0x7b,0xba,0x06,0x82,0x16,0x9c,0xb0,0x42,0xb5,0x60,0x5a,0x9e,0x43,0xbb,0xe8,0x90,0x05,0xe2,0x90,0xe5,0x81,0x19,0xfc,0x6c,0xb0,0x69,0x04,0x10,0xb6,0x83,0xaf,0x2b,0x08,0xc3,0x89,0x29,0x6c,0xa0,0xbb,0x7d,0x61,0xaf,0x79,0x46,0x93,0x34,0x9c,0x36,0x0c,0xab,0x0d,0x03,0x44,0x80,0x70,0xe6,0x29,0x15,0x81,0xd8,0x2e,0x2e,0xee,0x53,0x8b,0x5e,0xbb,0x0f,0xd2,0x78,0xec,0x1a,0xc0,0xeb,0xc5,0x89,0xc4,0x1b,0x10,0xd6,0x37,0x3e,0x09,0xf7,0x6b,0x4a,0xe2,0x71,0x4a,0xf7,0xf9,0xed,0x9b,0x86,0x8c,0xf2,0xc4,0xf7,0xd9,0x00,0xc0,0x80,0xf4,0x51,0x65,0x3c,0x96,0x34,0x69,0x52,0x12,0xa3,0x6c,0x01,0x5d,0x38,0xc9,0xdc,0x2d,0x64,0xff,0x59,0xa2,0x9e,0xe6,0xba,0x33,0x49,0xad,0x77,0x88,0x97,0xb5,0x0e,0x39,0x65,0x02,0x7e,0x35,0xb0,0xa5,0x8d,0x4f,0x65,0x72,0x9a,0x90,0x7a,0xdb,0xd6,0x40,0x17,0x70,0xa6,0xe6,0x86,0xbe,0xe6,0xe5,0xb9,0x72,0x8c,0x07,0x3f,0x77,0x2c,0xd2,0xc4,0x81,0x0f,0x13,0x00,0x85,0xa4,0x25,0x0e,0x54,0x91,0x8f,0x16,0xf0,0x2d,0x38,0x5d,0x19,0x7a,0xe1,0x06,0x01,0x5f,0xcb,0x4f,0x64,0xd4,0x03,0x6b,0x54,0x76,0xfc,0xe4,0x26,0x5a,0xab,0x2f,0x90,0xb5,0x49,0x03,0x63,0x06,0x2c,0x38,0xe4,0xa0,0x74,0x60,0x87,0x6b,0xbf,0xbc,0xcc,0x08,0xa8,0x06,0x7d,0xbc,0x9f,0xc5,0x5b,0xa9,0xc2,0x82,0x1e,0x85,0xa8,0xee,0x54,0x8b,0x5c,0x0a,0xf3,0xfd,0x5a,0x8a,0x9b,0x8f,0xda,0x16,0x0d,0x38,0x41,0xbf,0x1a,0x36,0x87,0xe8,0x45,0xc4,0xe4,0x6f,0x4c,0x01,0x43,0x69,0x40,0x01,0xd3,0xbb,0x95,0x40,0x89,0x9a,0xa1,0x8d,0xd5,0x9c,0x29,0x42,0x1b,0x0f,0x74,0x4d,0x18,0x24,0x16,0x8c,0x0c,0x49,0x0b,0x07,0xa5,0x6e,0x54,0xa9,0x06,0x5e,0x0b,0xb6,0x9a,0xae,0xe7,0x22,0x11,0x1c,0x0a,0xa6,0x68,0x93,0xed,0x07,0x23,0x80,0x70,0xd0,0x30,0xc3,0x62,0xd1,0x1d,0x84,0xad,0x09,0x39,0x05,0x61,0x20,0xd7,0x86,0xb5,0xd3,0x40,0x89,0x36,0x0c,0x2f,0x24,0xf8,0xfa,0x01,0xde,0x69,0xc2,0x38,0xc0,0x52,0xca,0x9b,0xcd,0x1a,0x00,0x83,0x82,0x56,0xec,0x27,0xaf,0x9d,0x40,0x7c,0xcf,0xde,0xff,0x65,0x36,0x68,0xd0,0xbd,0x62,0x4a,0x76,0xce,0x51,0x13,0x31,0x09,0x6f,0xd2,0xd8,0x36,0x5e,0x43,0x00,0xba,0x48,0x1e,0xac,0x29,0x0f,0x0b,0x16,0x20,0x9b,0x5e,0x59,0xc8,0xdc,0x0d,0xa3,0x2d,0x2e,0x32,0xc9,0x68,0x36,0x4c,0x26,0xd9,0xcf,0x2e,0xa4,0x85,0x5f,0xe9,0x2b,0x93,0xbe,0x2c,0x2d,0x08,0xe1,0x36,0x1e,0x9a,0x28,0xcf,0x24,0x5c,0xcf,0x98,0x07,0x84,0xe7,0xf4,0x03,0x0e,0xf1,0x4e,0x68,0x41,0xab,0xf6,0x57,0x36,0x32,0xe0,0xb5,0x71,0xab,0x5a,0xaf,0x19,0xf8,0x69,0x04,0x7a,0xd4,0xa8,0x0e,0xbe,0x92,0xe6,0xab,0xc2,0x6f,0x0a,0xbe,0x06,0x20,0x5e,0xcf,0x89,0xe9,0x39,0x6c,0x22,0x27,0xed,0xe2,0x59,0xa4,0x4d,0x33,0xb4,0xf6,0x4b,0xd6,0x58,0xe6,0x7c,0x25,0x99,0xad,0x69,0x5a,0x4e,0xe2,0x90,0x6a,0x33,0x3f,0xfb,0x1a,0x75,0x1e,0x8f,0x52,0xfa,0x85,0xd1,0x22,0xed,0x01,0x03,0x61,0xd5,0x2e,0xec,0x03,0x8b,0x71,0x8a,0xa8,0x8c,0x00,0xee,0x43,0x99,0xa1,0xe3,0x86,0x6b,0x62,0xb2,0xa0,0x2c,0x19,0xf6,0x22,0x78,0x44,0x1b,0x49,0x0b,0x96,0xce,0x05,0xbb,0x7d,0x63,0xea,0xa1,0x1c,0x04,0x47,0x62,0x8a,0xd6,0x8a,0xba,0x36,0x03,0x48,0xf6,0x83,0xa1,0xdd,0xcd,0x52,0xc3,0x80,0x30,0xe5,0xdf,0xdf,0x66,0x33,0x40,0x30,0x49,0x33,0x6d,0x18,0x41,0xeb,0x0d,0xe0,0xea,0x34,0x75,0x40,0x02,0x62,0x57,0x16,0x5c,0x5c,0xc7,0x4f,0xae,0x15,0xdb,0x3a,0x51,0xf3,0xbc,0xbf,0x5d,0x27,0x36,0x19,0xd1,0x8e,0x99,0x94,0x9a,0x80,0xb2,0xd8,0xa7,0x9e,0x34,0x51,0xaa,0x39,0x78,0xb3,0x29,0x9a,0xec,0x38,0xf0,0x1c,0x1b,0x16,0xb6,0xf0,0xd9,0x55,0xde,0x73,0xcc,0xa8,0x08,0xd4,0xa3,0xb4,0x22,0x01,0xed,0x42,0xc8,0xd9,0xa4,0x2a,0xb4,0x16,0xc9,0x0e,0xc5,0x34,0x45,0xc3,0x7f,0x53,0x53,0x72,0x48,0x04,0x44,0xdf,0x00,0xf0,0xfa,0x1b,0xb6,0xaa,0x08,0x05,0xba,0x77,0xee,0x94,0x00,0x0b,0x16,0x41,0x08,0xad,0xc0,0x1b,0x9c,0x99,0x6a,0x5a,0x6f,0xb0,0x30,0x11,0xad,0x17,0x0a,0x10,0xf7,0x7c,0xdb,0xc0,0x57,0x33,0xf0,0x05,0x38,0xf8,0x32,0xed,0x53,0x70,0xbc,0xe2,0xb7,0x5e,0x11,0x10,0x0d,0xcb,0x37,0x5f,0x57,0x43,0xb3,0xb4,0x68,0xbf,0x01,0xe8,0x43,0x3b,0x38,0x5c,0xa8,0x8e,0x4f,0xe2,0xfd,0xec,0xd2,0x74,0x37,0x3f,0x07,0xc6,0x84,0x58,0x49,0x1f,0x8e,0xfc,0x88,0x12,0xa7,0x02,0x00,0x97,0x55,0xdd,0xb8,0x94,0x8e,0x9a,0x48,0xce,0x64,0x51,0x36,0x68,0x2a,0x4a,0xb5,0xca,0x5f,0x45,0x74,0x61,0x8a,0x2f,0xcb,0x98,0x3a,0x63,0x85,0xde,0xb2,0x5a,0x70,0x28,0x0f,0x88,0x20,0x12,0xae,0xa7,0xb4,0xdd,0xcc,0xca,0x70,0xf1,0x3a,0x9b,0xa2,0x41,0xf6,0x83,0xc3,0x05,0x1d,0x0a,0x46,0x19,0xa8,0x20,0x8c,0x74,0x04,0x61,0x34,0x8e,0x05,0x02,0xc2,0x00,0xbc,0x47,0xb4,0x01,0xd9,0x17,0x66,0xe6,0x79,0xa2,0x0d,0x43,0x87,0x6f,0x4d,0x04,0x70,0x2d,0x01,0xb1,0x6f,0x42,0xe8,0xe8,0x2b,0xe6,0xf6,0x8a,0xe3,0x42,0xe2,0xc0,0xd8,0x59,0x1b,0x42,0x03,0x29,0x32,0x79,0xc3,0x75,0x77,0x88,0xe1,0x08,0x19,0x24,0xa0,0xcc,0xdb,0x39,0x52,0x13,0x92,0xd4,0xa6,0x47,0x9a,0x84,0x4f,0xaf,0x7c,0xd9,0xcf,0x46,0x7d,0xef,0xc1,0x3e,0x6a,0x13,0xf2,0x42,0xa9,0x62,0x12,0xeb,0x5c,0xb7,0x9e,0xda,0x6f,0xd2,0x21,0xbd,0x52,0x77,0xb6,0x16,0xd2,0x76,0xd6,0xc8,0x07,0x02,0x29,0x55,0xca,0xac,0x15,0x70,0xdd,0x8f,0x8a,0x86,0x6d,0xc8,0xef,0x40,0x61,0x49,0xd1,0x30,0x03,0x3f,0x90,0xdb,0x80,0x17,0xe0,0x7b,0xbd,0x83,0x58,0x66,0xcd,0xe4,0x0c,0x20,0x1e,0x35,0x02,0xda,0xc1,0xd7,0x80,0xab,0x7b,0x5e,0xb2,0x76,0x60,0x1f,0x58,0xf1,0x95,0xf3,0x6b,0xa3,0x76,0xed,0xe5,0xea,0xe3,0x1d,0xaf,0x42,0x56,0x89,0xf6,0xab,0x1d,0x80,0xd2,0xc6,0xab,0x68,0xbf,0xd6,0x21,0xd4,0xb7,0x35,0x5d,0xb0,0xd3,0xf4,0x52,0x57,0xaa,0xcc,0xe9,0x2b,0x44,0x2c,0x9a,0x9f,0x17,0x07,0x50,0xeb,0xb9,0xca,0xb3,0xa0,0x83,0x06,0x9c,0xa0,0x9f,0x06,0xda,0xcf,0x03,0xcb,0x88,0xd9,0xf9,0x38,0x92,0x08,0xc6,0x15,0xae,0x32,0x79,0xa1,0x21,0xf1,0x4a,0xce,0x58,0x52,0x3a,0x32,0x49,0xd0,0xa0,0x74,0x3d,0x65,0xf8,0x48,0x83,0x01,0x98,0x43,0x96,0x03,0x54,0x76,0xf4,0xc8,0xc7,0x71,0xf8,0xe7,0xcd,0xbd,0xdc,0x2b,0x1a,0x08,0x1f,0x41,0xf0,0xf1,0x8b,0x20,0x3c,0x80,0x35,0x36,0x8d,0xdb,0x6e,0x60,0x97,0x75,0x38,0x40,0x24,0xda,0xb0,0x71,0x9b,0xbe,0x56,0x33,0x77,0xda,0xb0,0x3f,0x6e,0xe5,0xf7,0xba,0xb5,0x8d,0x1b,0x30,0x56,0xd2,0x88,0xa1,0x89,0xd2,0x1e,0xc1,0x38,0x98,0xdd,0x3c,0x18,0x43,0xc7,0x7b,0xd3,0xb5,0x3f,0xe5,0x1b,0x05,0x9f,0x18,0x99,0x2c,0x80,0xc1,0x11,0x84,0xf4,0x11,0x13,0xb0,0x92,0x49,0xc4,0xc0,0x19,0xbc,0x13,0x13,0xc4,0x2d,0xad,0xc9,0x59,0x54,0x39,0x4a,0x9d,0x9a,0xac,0xf4,0xbe,0x39,0x3c,0xed,0x48,0x67,0x3f,0x86,0xa3,0x6e,0x4b,0x60,0x0d,0x44,0x53,0x4d,0xa5,0x54,0x50,0x0a,0xb3,0x85,0xc5,0x9a,0x0e,0x2e,0x4d,0x63,0x72,0x1e,0x8a,0xa0,0x0b,0x20,0x6c,0xd7,0x10,0x33,0x6a,0x77,0xe0,0xf5,0x01,0xe4,0x4a,0x0c,0x43,0xcb,0x29,0x81,0x2f,0xf5,0xa7,0x68,0x01,0x5f,0x18,0xa2,0xd0,0x19,0x44,0xe4,0x36,0x60,0xa6,0x67,0x80,0xaf,0x39,0x94,0x2b,0xe6,0x78,0x15,0xe3,0xa4,0xe7,0x7e,0x63,0x2d,0x28,0x70,0xe6,0xda,0xaf,0x91,0xb4,0xdf,0x60,0x7e,0xa6,0xc4,0xcd,0xcf,0x5c,0xfb,0xcd,0x29,0x57,0x5c,0x0b,0x71,0x45,0xd9,0x4b,0x8a,0x6b,0x92,0xbf,0x42,0x78,0x36,0x27,0xda,0x47,0xf9,0x10,0x26,0xe8,0xd4,0xab,0x57,0x28,0x93,0x6a,0x9c,0x45,0x90,0x8d,0xf2,0x0f,0x8b,0x23,0x98,0xa1,0x43,0xb0,0x03,0xa7,0x60,0x86,0x76,0x01,0x41,0x2b,0xa5,0xa6,0x48,0x03,0x30,0x2d,0x18,0x24,0x13,0x4d,0xb4,0x60,0x3f,0xe1,0x1c,0x08,0x46,0x2d,0x58,0xc7,0xf4,0x70,0x20,0x4b,0xf7,0x73,0x59,0x93,0xf8,0x9a,0xd0,0x4b,0x2e,0xdc,0xc0,0x27,0x7b,0xc5,0x11,0xa0,0xdd,0x97,0x46,0x32,0x10,0x86,0xbb,0xdd,0xca,0xe7,0x49,0x41,0xd8,0xe7,0xe9,0x01,0x79,0x1e,0x1a,0x0d,0x9a,0xe4,0xda,0x4a,0xeb,0xc8,0xd1,0xa6,0x0d,0x53,0xb3,0x34,0x3a,0x00,0xb1,0xe5,0xd9,0x0f,0x30,0xe5,0xb4,0xee,0x74,0xcf,0x93,0x7e,0xb7,0x35,0x03,0x63,0x00,0xca,0x5f,0xd0,0xc1,0x00,0x39,0xa6,0xb0,0xf7,0xe7,0x92,0x57,0x86,0x8e,0xb3,0x04,0x9c,0x81,0x1c,0xa0,0x69,0x58,0xa8,0x57,0x4a,0x54,0x38,0x63,0xc5,0x17,0xe3,0x89,0xc1,0xa4,0xd8,0xff,0xbb,0x21,0xb7,0x3b,0xe5,0xcb,0x8d,0xd0,0x32,0xc5,0x35,0xa9,0xd0,0x8a,0x6d,0x6b,0x98,0xb8,0x81,0x57,0xb8,0x90,0x50,0x7a,0x99,0x2c,0xe4,0x86,0xde,0x46,0x16,0xb0,0x46,0x00,0xdc,0x22,0xe8,0x52,0x0e,0x02,0xca,0x54,0x80,0x97,0x38,0x4c,0xf9,0x7f,0x13,0xad,0x37,0x02,0x64,0x57,0xf0,0x85,0x00,0xbe,0x54,0xce,0xa0,0xe0,0x2b,0xed,0xfb,0x92,0x26,0x09,0x9f,0x1b,0x64,0x0d,0xc6,0x01,0x9a,0x39,0x73,0xb1,0x82,0x1c,0x4f,0x65,0xed,0x17,0x30,0xb9,0xf6,0x6b,0x40,0xf2,0xf6,0xe9,0x29,0x11,0x20,0x76,0x65,0x31,0xf3,0x73,0x09,0x73,0xe8,0x59,0x6d,0x23,0x81,0x7c,0xda,0x89,0x09,0x8a,0x57,0xc6,0xa2,0x0d,0xea,0x6f,0x1b,0x5e,0xc4,0x3d,0x60,0x4f,0xbc,0x12,0x0c,0xa4,0xb2,0x38,0xa4,0xe5,0xc2,0x4f,0xaa,0x49,0xf2,0x54,0xf6,0x55,0x01,0xac,0xfb,0x6a,0xc1,0xfe,0x6f,0xed,0x5c,0x30,0x49,0x67,0xe5,0x04,0x02,0xf4,0xae,0x1a,0xb9,0x29,0x9a,0x83,0xb0,0x77,0xd8,0x32,0x00,0xdf,0x0f,0xf6,0xef,0xbb,0x82,0x30,0x2c,0x9f,0x76,0xdc,0x4a,0x26,0x69,0x49,0x1b,0x06,0xa0,0x5c,0x5e,0x30,0x88,0x97,0x77,0xd4,0x80,0xd8,0x7b,0x57,0x23,0xb4,0xa1,0x77,0x3e,0xb1,0x5a,0x31,0x11,0x7a,0x14,0x6f,0x73,0xdf,0xa5,0xf1,0x0c,0x72,0x50,0xa7,0x63,0x71,0xa0,0xa0,0xec,0x02,0xc9,0xf0,0x60,0xa2,0x9e,0x4f,0x17,0xc5,0x6e,0x64,0x81,0x94,0x0c,0x09,0x63,0xe6,0x12,0x81,0xb2,0xc9,0xa5,0x45,0xcc,0x97,0xa9,0x9b,0xd9,0xb9,0xff,0xf4,0x3c,0x33,0xd4,0x2e,0xa7,0xa7,0xd4,0x41,0xe4,0xe8,0x9f,0x69,0x92,0xae,0x96,0x81,0x29,0x3c,0xf9,0xb1,0xae,0xf2,0x78,0xa2,0xc6,0x94,0x7c,0xbc,0xc1,0x90,0xf7,0x45,0xc0,0x45,0x04,0x14,0x9d,0x7e,0xfc,0x81,0xdc,0xc3,0xec,0xe7,0x5c,0xda,0x54,0xbd,0x80,0x57,0xd6,0x7a,0x2d,0xce,0x11,0xf0,0x35,0x7c,0x3e,0x18,0x93,0xe4,0x65,0x4a,0x9a,0x6f,0x3b,0xf8,0x52,0xd0,0x0a,0x4e,0x67,0x34,0x9c,0xd5,0x80,0x03,0xbd,0x5f,0x03,0x62,0x9b,0x90,0x35,0x17,0x10,0xb4,0x5f,0xda,0x8e,0xa9,0x85,0x4b,0xb8,0xfa,0x32,0xc1,0x96,0x24,0x0b,0x52,0x90,0x1c,0x45,0x4c,0x72,0x86,0x69,0x71,0xbe,0x86,0x54,0x5c,0x6a,0xf2,0x30,0x0b,0x64,0x46,0x08,0x92,0xc0,0xd8,0xff,0xee,0xe2,0x8c,0x95,0x00,0x37,0x59,0xdf,0x6d,0xa7,0x27,0x5a,0x30,0x8f,0x80,0xb8,0x1f,0x93,0x6a,0xc1,0xb1,0x88,0x92,0x29,0x9a,0x39,0x5d,0x85,0x6c,0xd3,0xf0,0x1c,0x84,0x0d,0xd3,0x84,0x61,0xf7,0x84,0x1d,0xd0,0x1a,0xe7,0x1d,0xcd,0x2e,0xeb,0x70,0x61,0xa1,0xb6,0x06,0xb2,0x36,0x0c,0x44,0x20,0x36,0x0e,0x50,0x15,0xa9,0xb7,0x19,0x58,0x94,0xd4,0x44,0xa3,0x55,0x61,0x7e,0xc1,0x9b,0x9f,0x8d,0x03,0x59,0x2f,0x40,0xd9,0x31,0xee,0xc1,0xd8,0x71,0xd1,0x10,0x30,0x22,0xdd,0xe7,0x27,0x43,0x38,0xf6,0xad,0x00,0x43,0xa5,0xe2,0x0c,0x23,0x53,0x60,0x8e,0x19,0xf2,0x9b,0x22,0xf9,0x78,0x92,0x7d,0xf8,0x0c,0xe4,0xd9,0x25,0x8a,0xc9,0xe2,0xcf,0xe2,0x98,0x0e,0x42,0x62,0x3b,0x75,0x9f,0xe0,0x8b,0xb5,0x8f,0x3c,0x22,0x5d,0xbd,0x58,0x91,0x2e,0x35,0x4c,0xdb,0xb1,0x5b,0xab,0x98,0xf0,0x0f,0xcd,0x43,0x02,0x58,0x29,0x3f,0xcd,0x63,0x9b,0x24,0xcc,0x08,0x59,0x4b,0x80,0x0b,0x4d,0xac,0xcf,0x51,0x9b,0x4b,0x41,0x17,0x40,0x02,0xbc,0x3a,0x0e,0x5a,0x3b,0xe9,0x19,0x13,0x86,0x38,0x48,0x85,0xc2,0x75,0x0a,0x42,0x48,0xb4,0xde,0x74,0xbf,0xd7,0xe7,0x05,0xd0,0xa3,0x46,0xed,0xe0,0x6b,0xf8,0xfb,0x80,0x9e,0x16,0x30,0xfd,0xbe,0xaf,0x61,0xfb,0xbe,0x26,0x82,0x6f,0xa2,0xfd,0x7a,0x8d,0x34,0xde,0xf9,0xdc,0x47,0xfb,0x25,0xc1,0xe1,0xb7,0xa0,0xfd,0xfa,0xf8,0xae,0x2c,0xa6,0xfd,0x02,0xb2,0xf9,0x99,0x4a,0x54,0x9e,0x47,0x71,0xe8,0x49,0x2f,0x73,0xe8,0x1f,0x15,0x55,0x00,0x98,0x82,0x59,0x82,0x8e,0x5a,0x55,0xf6,0x81,0x3d,0x91,0x46,0x6e,0xf5,0x86,0x46,0x8c,0xeb,0x1b,0x92,0xad,0xa4,0x65,0x67,0x2c,0x0b,0xe0,0x05,0x2d,0x98,0x61,0xb8,0xa0,0x05,0xfb,0xbd,0x1e,0x8d,0xc2,0xed,0x58,0x8d,0xb3,0xb4,0x38,0x2d,0x58,0x19,0x28,0x43,0x4c,0xc6,0x70,0x66,0x1e,0xcf,0x7a,0x00,0xd9,0xa4,0xed,0xfc,0x5d,0xcd,0xe4,0xdb,0xa0,0x45,0xcf,0xe8,0xcc,0x31,0xcb,0x37,0x8f,0x5f,0x28,0xbc,0x29,0x59,0x87,0xbc,0xa0,0xac,0x49,0x39,0x6a,0xc3,0x2e,0x8d,0xd7,0x60,0x01,0x6b,0xfe,0x0d,0x66,0x69,0x97,0x17,0x05,0x62,0xbf,0x47,0x1c,0xb4,0x08,0xa2,0xd5,0xfb,0x2e,0x83,0x05,0x63,0x43,0x1c,0xb3,0xbc,0xb5,0xc1,0xf8,0xc8,0x5a,0xf3,0x2e,0x4a,0x00,0x99,0x7f,0x57,0x9b,0x80,0x37,0xc3,0xc8,0x86,0x87,0xa5,0xc3,0xac,0x08,0xd0,0x71,0x3a,0xb2,0xac,0x08,0x03,0xf9,0x48,0x49,0xa8,0x38,0xa4,0x0b,0x93,0xaf,0xf3,0x9c,0xec,0xa3,0xff,0x8e,0x08,0x28,0x7b,0xd3,0xe8,0x17,0x98,0x3c,0x6b,0xb9,0x0c,0x23,0x85,0x09,0x9a,0x91,0x4c,0x79,0x7b,0xe5,0x8b,0xab,0x4e,0xd6,0x03,0x42,0x82,0x61,0x2c,0xa4,0x09,0x4a,0x94,0xce,0x22,0xb0,0x63,0x47,0x10,0xb0,0x22,0xac,0xdb,0x6e,0x3c,0x27,0x03,0x3d,0x07,0x5e,0x38,0xe0,0x4d,0xea,0xe4,0x3e,0xa8,0xc0,0xb4,0x5e,0x06,0xbe,0x76,0x5d,0x31,0x01,0x18,0x09,0xf8,0x06,0x3e,0x38,0xf8,0x52,0x81,0x25,0x3a,0x5d,0x79,0xfe,0x28,0xf8,0xa2,0xb0,0xef,0xdb,0xb8,0x75,0xcd,0xe7,0x9d,0x86,0x6b,0x30,0xc1,0x25,0xb9,0xf5,0x6a,0x58,0xed,0x37,0x52,0xe1,0xcb,0x47,0xa1,0x8f,0x25,0xed,0x37,0x2c,0xa6,0x69,0x00,0x32,0x46,0x7a,0x79,0x3f,0x1b,0xf4,0x3d,0xff,0xeb,0x69,0x71,0x4c,0xd0,0x6d,0xd8,0xdc,0x35,0x7e,0xcb,0x99,0x60,0xdb,0x44,0x64,0x42,0xf4,0xd5,0x82,0xe1,0x04,0x09,0xf6,0x91,0x06,0xb0,0xc8,0x11,0x7c,0x89,0x43,0x16,0x89,0x1b,0xf7,0x9f,0x61,0xcb,0xf2,0xfb,0xc1,0xda,0xde,0x1c,0xe5,0x9e,0x22,0x2f,0xbe,0x5c,0x03,0x12,0x47,0x06,0x61,0x65,0x9c,0x3f,0x71,0x38,0x27,0x0c,0xd8,0xfd,0xa4,0xb2,0x49,0x1a,0xf0,0xc9,0xdd,0xde,0xb0,0x33,0x4b,0xfb,0x43,0xfe,0xc1,0x2c,0x6d,0x1b,0x2c,0xc8,0x47,0xf0,0xc0,0x1e,0xcc,0x59,0x6e,0xc1,0x48,0xb5,0x62,0xd7,0xac,0x5e,0xe3,0x35,0x64,0x3f,0x38,0x9a,0x9a,0x49,0x0f,0xa5,0x80,0x0c,0x70,0x50,0x46,0x0a,0xca,0x36,0x3f,0xd6,0x23,0xac,0xdf,0xbc,0x39,0x3c,0x59,0xb8,0x4a,0xe3,0x2d,0x01,0xeb,0xfa,0x94,0x52,0xc2,0x2f,0x42,0x9d,0x14,0xd3,0x9a,0xf5,0xe7,0xe9,0x4c,0x1d,0xf8,0x4f,0xd7,0xb0,0x61,0xf2,0x90,0x32,0x6a,0xc9,0x22,0x8e,0x1f,0x2d,0x87,0xfb,0x1f,0x45,0xa0,0xf5,0xc9,0xb5,0x10,0xcc,0x17,0x52,0x3b,0x1e,0x49,0x3c,0x89,0x55,0x43,0x02,0x15,0x79,0x61,0xdc,0x08,0x0c,0x00,0x45,0x16,0x35,0x11,0x78,0xed,0x3f,0xf2,0x5e,0x2f,0xcd,0x57,0x45,0x30,0x77,0xe1,0xf1,0x86,0x2b,0x57,0x66,0x41,0xf3,0xcd,0xc1,0x17,0x1c,0x7c,0x29,0x4f,0x8a,0xf0,0x1e,0xc2,0x0c,0xfb,0x65,0xd9,0x49,0xac,0x0a,0x31,0x84,0x37,0x52,0x47,0xed,0x37,0xa6,0xca,0x8f,0x1e,0x65,0x45,0x48,0xda,0xaf,0x44,0x7d,0xa7,0xe3,0x22,0x4d,0xdf,0xa1,0x01,0xb8,0x8e,0xb1,0x14,0xf1,0x72,0xc9,0x20,0xf5,0x86,0x0e,0x20,0x45,0xa3,0x97,0x9c,0xb1,0x42,0x43,0x93,0xc8,0x06,0x72,0xdc,0x84,0x51,0x7e,0x2e,0xd8,0x05,0xb8,0x0e,0x8d,0x5a,0xb0,0x89,0xe6,0xda,0x70,0x39,0x47,0xc9,0x14,0xed,0x38,0x0f,0xa6,0x68,0x02,0xfe,0x0a,0x1c,0x84,0xa9,0x53,0x16,0x5c,0xdd,0x02,0x08,0x3b,0xa0,0x4d,0x40,0xd8,0x7b,0x4d,0xf3,0xba,0x98,0x02,0x08,0xfb,0x76,0xb1,0x5a,0xac,0x1d,0xba,0x4d,0xc1,0x2c,0x9d,0x02,0xb1,0xff,0x33,0x40,0x04,0x52,0xff,0x9e,0x7c,0xc9,0x80,0x80,0x71,0xf4,0x74,0xf6,0xd5,0x75,0x8b,0x13,0x51,0xbf,0xa3,0xec,0x14,0x91,0x4b,0x39,0x50,0xce,0x28,0x05,0xe5,0x98,0x20,0xa6,0xcd,0x26,0xbf,0x94,0x80,0x6a,0xcd,0x54,0x10,0xab,0x90,0x00,0xac,0xed,0xf3,0xad,0x84,0xc6,0x4c,0xfc,0x78,0x5a,0x52,0xf7,0xb5,0x26,0x69,0xd7,0xae,0x96,0xf3,0xce,0x0a,0x7e,0xba,0x90,0x17,0xc8,0xb0,0x3f,0xd9,0xfb,0x3c,0x5b,0x41,0x63,0x16,0x13,0x91,0x7b,0x99,0x09,0x4b,0x59,0xd6,0x09,0xae,0x84,0x8f,0x1f,0x50,0xde,0xa8,0x60,0x1b,0x48,0x55,0x81,0xd7,0x6a,0xbd,0xfe,0x05,0xcd,0xd3,0x23,0x95,0x03,0x5e,0x06,0xe8,0x09,0x16,0xb1,0xcb,0x34,0x74,0xd4,0x66,0x4b,0xe0,0x8b,0x01,0x17,0x53,0xc3,0xbe,0x2f,0xe7,0xbf,0x68,0x7a,0xf6,0x0c,0x30,0xed,0xd7,0xc7,0x73,0x3c,0x97,0x3e,0xba,0x80,0xae,0x17,0x6f,0x28,0x26,0x60,0x30,0x01,0xa7,0xa4,0xc8,0x91,0xa2,0x80,0x5c,0x10,0xe7,0x2d,0x97,0x87,0xd4,0x46,0xe1,0x42,0xb0,0x79,0x01,0x1a,0x70,0x09,0x60,0x25,0x32,0xe8,0x6d,0x86,0x66,0xe0,0xea,0xe2,0x9b,0x26,0x2b,0xce,0x77,0x5b,0xc0,0x0c,0x49,0x0b,0xb6,0xc8,0x90,0xb0,0x4c,0x1e,0xd2,0xcf,0x5f,0x05,0x10,0x36,0xb9,0x29,0x5a,0x39,0x8d,0xb5,0x06,0xc2,0xcc,0xe9,0x8a,0x68,0xb9,0x7e,0xa2,0x78,0x6f,0x2b,0x3f,0x7c,0xd8,0x9e,0x30,0x65,0xdd,0xed,0xc0,0x34,0x6e,0xc0,0x79,0xe7,0x2c,0x18,0x40,0x0d,0xac,0xa7,0x63,0x0a,0xc4,0xbe,0x9d,0xd5,0x00,0x30,0x1a,0xf6,0x5b,0x4a,0x8d,0xc3,0xd1,0x02,0x10,0x03,0x16,0x38,0x1d,0x7f,0xc6,0x34,0x80,0x1a,0xd8,0x30,0xaa,0x15,0x7b,0xef,0x69,0x05,0xa4,0x9f,0xec,0xa3,0x80,0x1c,0xb4,0x63,0xf8,0xba,0x78,0x8d,0xb6,0x21,0x13,0xa4,0x03,0x28,0x53,0x6a,0x9a,0xe2,0x40,0x4f,0xf7,0x7d,0xc3,0x22,0x50,0x58,0xe9,0x3d,0x2f,0x81,0xda,0x3e,0xc3,0xcb,0xc0,0xbc,0x3b,0x2d,0x92,0xd0,0x7c,0x0e,0x91,0xd4,0x26,0xb2,0x16,0x5a,0xa2,0xf2,0x67,0xe6,0x6a,0x69,0x50,0x2f,0xa3,0x6d,0x2c,0x21,0x5d,0x82,0x23,0xaa,0x32,0x30,0xd4,0x34,0xbe,0xc4,0x04,0xc8,0xa4,0x45,0x06,0xba,0x80,0x89,0x00,0x6e,0x12,0x30,0x11,0xf7,0x78,0x63,0x5c,0x1d,0xcc,0xa8,0xdd,0xb5,0xde,0x74,0xbf,0xd7,0x50,0x93,0x33,0x90,0x83,0x2f,0xad,0x4c,0x98,0xfb,0x44,0x14,0x29,0x39,0x5d,0x55,0xbd,0x9e,0xad,0xe9,0x39,0xf8,0x77,0x94,0x2e,0xdd,0x90,0xce,0xfd,0xd2,0x36,0x15,0xf6,0x7e,0xe5,0x8b,0x37,0x08,0x85,0xba,0x9f,0x6d,0xf3,0x73,0x25,0xef,0x84,0x5a,0x00,0x98,0xa2,0x41,0x02,0xb6,0x12,0x7e,0x26,0x7c,0xd5,0xb0,0x39,0x0d,0x0e,0xce,0x58,0x48,0x5f,0x82,0xc5,0x0c,0xe9,0x0c,0xba,0x6b,0xc1,0xa9,0x47,0x74,0xb8,0xee,0xd1,0xc5,0xa2,0x0e,0x59,0xf4,0x72,0x0e,0xc9,0x14,0x6d,0xda,0xf6,0x83,0x55,0xe4,0xad,0x0d,0x84,0x41,0xe3,0x78,0x10,0x56,0x50,0x7a,0x10,0xb5,0x53,0xe7,0x9c,0xe5,0x6f,0xba,0xb2,0xd5,0xa4,0x65,0x24,0xda,0x70,0x98,0x4c,0x8e,0x77,0x35,0x08,0xb7,0xe4,0x44,0x20,0x0e,0x59,0x87,0x45,0x20,0x78,0x24,0x37,0x0a,0x51,0xf3,0x88,0x42,0x8f,0xed,0x06,0x45,0xf2,0xf7,0xd7,0x38,0xfa,0xf6,0x8f,0x02,0x4e,0x28,0xde,0x57,0x35,0xb4,0xa2,0x0e,0xe5,0x32,0x50,0x66,0x5d,0xec,0x4d,0xcc,0x9e,0xbc,0xf6,0x5d,0x1e,0xc8,0x7c,0xd4,0x34,0xe2,0xb8,0xcc,0xad,0x8f,0x3a,0x0f,0xa8,0x14,0xa0,0x5a,0x26,0xd2,0x70,0xb4,0x58,0xce,0x56,0x6d,0xb4,0x18,0x75,0xe9,0x29,0x70,0x14,0x22,0x17,0xf3,0xd0,0xe1,0x9f,0xde,0x05,0xc4,0x5f,0xe9,0xc2,0xac,0xe9,0xcf,0x32,0x1f,0x19,0x53,0x34,0x1f,0x93,0x45,0x96,0x41,0x57,0x07,0x33,0xb0,0x0c,0xbc,0x20,0x6b,0xb9,0x06,0xdf,0xcb,0x25,0x4c,0x18,0x27,0x3c,0x04,0xa0,0x31,0x34,0xc8,0x29,0x0a,0x06,0xe9,0x7e,0x2f,0xbd,0xd7,0x59,0xde,0xd3,0xf5,0x65,0xba,0x20,0x9d,0xd6,0x51,0x02,0x5f,0xc3,0xf8,0xc9,0xbc,0x9e,0x39,0xa2,0xc2,0xda,0x39,0x53,0xf0,0xf5,0xc1,0x3d,0xf6,0x7e,0xd3,0xcb,0x44,0x5c,0xf6,0xb9,0xf6,0x6b,0xc0,0xb4,0x5f,0x5f,0xff,0x14,0x66,0xc8,0xbf,0x22,0xf5,0x1a,0xd8,0xfd,0x12,0x2c,0x68,0x0f,0xb8,0x8e,0xb1,0x3e,0x94,0xfe,0xed,0x90,0x92,0x7d,0x21,0xa9,0x9b,0x16,0x6c,0xa3,0xf4,0xd0,0x82,0xa1,0x61,0x3f,0x60,0x4f,0x88,0x9a,0x45,0x82,0x29,0xda,0xf3,0x43,0x4c,0xd1,0xaa,0x65,0x3f,0x58,0x74,0xca,0x2a,0x80,0xb0,0xdf,0x33,0x16,0x40,0x18,0xda,0x19,0xea,0x13,0x0f,0x69,0xc5,0xb4,0x6d,0x57,0xb6,0xd7,0x86,0x8d,0xdb,0xc7,0x65,0x66,0xe9,0x02,0x10,0x7b,0x16,0x5c,0xb3,0xf8,0x49,0xc3,0x8e,0x06,0x31,0x30,0x86,0x6b,0x7b,0x67,0xc6,0xf7,0x82,0x11,0xd3,0x8e,0x91,0x03,0x32,0x22,0x9b,0xfe,0x39,0x28,0x0c,0x82,0x89,0xd8,0xdf,0xbc,0x65,0x3c,0x63,0x00,0xeb,0xef,0xfc,0x08,0x5b,0x0c,0x09,0x79,0x09,0xeb,0x74,0x9f,0x39,0x94,0x95,0xd1,0xf4,0x4b,0xdf,0x9d,0x48,0xbd,0x17,0x25,0x7f,0x4e,0x8b,0x53,0x07,0x81,0x32,0xcd,0x71,0x94,0x80,0x2f,0xd7,0x82,0x95,0xc3,0xa2,0x50,0x50,0x49,0x53,0x45,0x80,0x0c,0x49,0xe8,0xb4,0x09,0xcf,0x09,0x18,0x65,0x85,0x53,0x4f,0xe8,0x14,0x74,0x7d,0x1a,0x01,0x4c,0xc8,0x07,0x1c,0xc2,0xe7,0x03,0x4b,0xc0,0xeb,0x7e,0xd6,0xb4,0x5e,0xc9,0xe4,0x4c,0xc1,0x37,0x3f,0x6a,0xe4,0x27,0xf6,0xa0,0xa2,0xf9,0x12,0x01,0x43,0x04,0x5f,0xf7,0x26,0x1c,0xc9,0x6c,0x33,0x3d,0x1b,0x61,0x38,0x10,0xf0,0x35,0xbe,0x0d,0x68,0xcd,0x47,0xa4,0xfd,0x76,0xba,0x7a,0x92,0x97,0x23,0x64,0x96,0x47,0x5f,0x00,0x75,0x00,0xe0,0x8a,0xaa,0xdb,0xc9,0x1b,0x9a,0x50,0x9b,0x19,0x5a,0xca,0xca,0x03,0x59,0xaa,0x05,0x87,0x89,0xe2,0x8f,0x24,0x81,0x7b,0x44,0x7b,0xcc,0x0c,0x29,0x9b,0x24,0xbd,0x0b,0x89,0xea,0x34,0xec,0x87,0x1a,0x48,0x49,0x9e,0x3d,0x66,0x8a,0xf6,0xc0,0x69,0xd3,0x19,0xe3,0x2f,0xd5,0xa0,0x20,0xec,0xcd,0xcc,0xa8,0x80,0xb0,0x9f,0x31,0x32,0x08,0x7b,0x69,0x51,0x39,0xed,0xdc,0xf2,0x63,0x9d,0x23,0x44,0x6d,0x18,0x8e,0x47,0x83,0x1e,0x40,0x0c,0xcb,0x27,0x71,0x27,0x93,0x68,0x00,0x00,0x0b,0x0f,0x49,0x44,0x41,0x54,0xd1,0x8a,0xa3,0x53,0x15,0x2a,0x60,0xec,0x17,0x1a,0x13,0x2f,0xf7,0x28,0x01,0x72,0x68,0xe3,0x90,0x39,0x77,0x9a,0x21,0xdc,0x01,0x74,0x91,0xe4,0x63,0x2e,0xae,0x87,0x3a,0x68,0xd0,0x91,0x1a,0x1e,0x8f,0x8d,0xa1,0xae,0x5a,0x26,0x1d,0x5f,0x05,0x0d,0x65,0x08,0xea,0x0a,0xac,0x67,0x0c,0x1c,0x5b,0x68,0xf1,0xf9,0xe8,0x5a,0x02,0x6f,0x74,0xd1,0xab,0x99,0x3d,0xfa,0xad,0x95,0x8e,0x1c,0x18,0x44,0x49,0x90,0x25,0xd4,0xe4,0x8f,0x94,0x5b,0x44,0x9d,0xb8,0x56,0x53,0x5e,0xda,0x40,0x97,0x94,0xa7,0x1a,0x37,0x17,0xc9,0xcb,0xae,0xc0,0x4b,0xb3,0x31,0x16,0xc2,0x52,0x93,0xb3,0x0c,0xbe,0x14,0x35,0x35,0xa8,0xc3,0x95,0x7d,0x55,0x06,0x5f,0x13,0x02,0xe2,0xaf,0x00,0x9e,0x0e,0x38,0x4b,0xa6,0x67,0x23,0x9a,0x9e,0x59,0x76,0xa4,0x5e,0xdc,0x5c,0xcf,0x6e,0x16,0x5b,0x90,0xf6,0x4b,0xcb,0x28,0x51,0x02,0xd2,0xd5,0xf8,0x66,0x41,0xe6,0x67,0xa0,0xb7,0x06,0x9c,0x23,0x64,0x15,0x7e,0x83,0x23,0x95,0x8c,0xac,0x65,0x67,0x2c,0xaa,0x05,0xc3,0xa6,0x0d,0x59,0x48,0x5a,0x70,0xfd,0x76,0x2c,0xfb,0xca,0x83,0x86,0x0f,0xef,0x69,0x8a,0x2e,0xec,0x07,0x87,0xde,0x67,0x20,0x0c,0x64,0x57,0x51,0x66,0x20,0x0c,0x07,0xe6,0x5e,0x10,0x88,0xd2,0x82,0x97,0xf6,0xa2,0x73,0x56,0x6e,0x92,0x06,0x10,0xf6,0x86,0x55,0xc2,0xaa,0xdd,0xcb,0xf1,0x9a,0x5c,0x02,0xc4,0x64,0x8f,0x58,0x87,0xc2,0xea,0x5a,0x31,0x90,0x80,0x71,0xd0,0xcc,0xc9,0x18,0x37,0xee,0x0e,0xe8,0x80,0x80,0x26,0xf6,0x51,0x18,0xc4,0xf4,0x2c,0x21,0x01,0x66,0xea,0x39,0x4d,0xc0,0x99,0x5a,0xa5,0xd9,0x3c,0x60,0xe3,0xba,0x41,0x3a,0x86,0x38,0xe9,0x90,0x47,0x56,0x04,0xc9,0xa3,0x75,0x66,0x56,0x91,0xb4,0x6e,0x07,0xfa,0xbf,0x8f,0x2a,0xb5,0xea,0x54,0x61,0xb2,0xb8,0x96,0x83,0x5a,0x8a,0x48,0x1d,0x74,0x34,0x97,0xb5,0xb4,0x90,0x77,0x3a,0x88,0x24,0xb0,0xcb,0xd2,0xc4,0x89,0xc5,0x4d,0xbf,0x29,0xdf,0x11,0xfc,0xea,0xa0,0x0b,0x58,0xdf,0x0c,0x44,0x64,0x61,0x7b,0xc7,0x1d,0x81,0x37,0x38,0x21,0x99,0x44,0x3b,0xac,0x98,0x9c,0x87,0x06,0xdf,0x01,0x07,0xdf,0x80,0xaf,0x14,0x44,0x05,0xf0,0x0d,0x0d,0xec,0x84,0xf7,0x2e,0xa6,0x67,0xd7,0xbe,0x91,0xab,0x44,0x38,0x41,0x7e,0xee,0xb7,0x8f,0xf6,0x9b,0xf6,0x8d,0xc9,0x12,0xa4,0xd2,0x40,0x79,0x6c,0xc8,0x21,0x3d,0x66,0xbc,0x01,0xc6,0xeb,0x08,0x3a,0x6a,0xa2,0xe0,0xea,0xa9,0xa2,0x61,0x87,0x64,0x74,0x61,0x0f,0x39,0x25,0x1f,0x4d,0x20,0xef,0x7d,0x17,0x69,0xb4,0x98,0xa2,0x05,0xca,0xce,0x06,0x9b,0xb8,0xc7,0x0b,0x3b,0x19,0x6c,0xd9,0x0d,0xca,0x4e,0x59,0x9e,0xe5,0x36,0x4d,0xd8,0xe6,0xc9,0x9d,0xb3,0x62,0x9d,0x64,0x93,0x74,0xac,0x69,0xdc,0x1b,0x26,0x9e,0xd2,0xda,0xb5,0x95,0x02,0xfc,0xd5,0x90,0xca,0x38,0x67,0x2a,0x2f,0x68,0xf8,0x2f,0x8d,0xf8,0x06,0x94,0xb4,0x62,0x62,0x49,0x02,0xc0,0x35,0xe3,0xf0,0x93,0x03,0x72,0xba,0x7e,0x28,0xff,0x11,0x0b,0xda,0x77,0xf4,0x13,0x8f,0x29,0x30,0x87,0xf4,0x2a,0xc8,0x5c,0x36,0x38,0x19,0x1f,0x14,0xbb,0xa5,0x05,0xaf,0xd3,0x1e,0x30,0x8d,0xd8,0x79,0xd5,0x5f,0xf8,0x54,0x39,0x63,0x73,0xad,0x23,0x8d,0x40,0x42,0x18,0x3e,0x8b,0x44,0xcb,0x05,0xca,0x4b,0x41,0xa1,0x8b,0x0c,0xfd,0x11,0x86,0x51,0xcd,0xac,0x58,0x22,0x13,0xc7,0x9e,0x7b,0x8e,0x0a,0x54,0x1d,0x70,0xc5,0xdc,0xd3,0x24,0x06,0xd0,0x6c,0x9f,0x95,0x02,0x5c,0x3e,0x27,0x18,0xf0,0xfa,0x02,0x52,0x73,0x33,0xea,0x5a,0x2f,0x03,0x5f,0x86,0x31,0x14,0x7c,0x5d,0x4e,0x43,0x82,0xaf,0xf1,0x47,0x19,0x03,0x0f,0x04,0xb8,0x8a,0x5e,0xcf,0xb1,0x51,0x24,0xd3,0x73,0x24,0xcd,0xb5,0x5f,0xa9,0x0f,0xdd,0x72,0x96,0xbf,0xcc,0xe3,0xe6,0x7b,0xbf,0xe9,0x38,0x91,0x4c,0xd4,0x8b,0x4b,0x6a,0x7c,0xfd,0x33,0x2b,0x17,0x3b,0x53,0xa2,0x33,0x83,0x27,0x50,0x55,0x33,0xb4,0xe2,0x0b,0x30,0x52,0x00,0x56,0x48,0xf7,0xdc,0x94,0x4a,0xe3,0x29,0xf7,0x92,0x6b,0x4d,0xcc,0xe7,0xca,0xa5,0x09,0x00,0xec,0x02,0xad,0x39,0x97,0x3a,0xf6,0x34,0x01,0xa0,0xec,0x3b,0x0a,0x4e,0x2e,0x56,0x03,0xc0,0x7f,0x33,0xd8,0x6b,0xc2,0x8d,0x2f,0x5f,0xc1,0x23,0x93,0xdf,0x0b,0x55,0xe1,0xaa,0x46,0x97,0x4f,0x00,0x6c,0x97,0x87,0xbf,0xa2,0x31,0xd4,0x8b,0x94,0xed,0xf2,0x0f,0x3c,0x2b,0x02,0x6a,0x3e,0x5e,0x13,0x19,0x0e,0xff,0x92,0x7a,0xd1,0x38,0x06,0xe0,0x17,0x93,0xb0,0xb6,0x6f,0x62,0x18,0xd5,0x54,0x69,0xbb,0xaa,0x18,0x37,0x80,0x71,0x4a,0x45,0x6d,0x32,0x19,0x23,0x22,0x10,0xa6,0x89,0x93,0x71,0xc3,0xcf,0x40,0x55,0x28,0xad,0x63,0xce,0x47,0xf6,0xba,0x27,0xf8,0x89,0xd1,0xcf,0x96,0xdf,0xd4,0xb9,0x4c,0x02,0x3e,0x0d,0xbd,0x8c,0x19,0xe9,0x67,0x5b,0x01,0x5d,0x4a,0x53,0xc2,0xa2,0x6c,0x92,0x3f,0x05,0x94,0x67,0x1e,0xc3,0x05,0xed,0x5d,0x4a,0xea,0x35,0xdd,0x4c,0x8b,0xf3,0x89,0xd3,0xca,0x12,0x07,0x2e,0x26,0xa0,0x3a,0x50,0x25,0xc0,0x9b,0xf1,0x54,0xd5,0x7a,0x29,0xb8,0x73,0xf0,0x65,0x57,0x5d,0x32,0xf0,0xf5,0xf1,0x7c,0x40,0x0d,0x7c,0x73,0x2d,0x35,0xdb,0xf7,0xe5,0x15,0x8f,0x02,0x05,0x35,0x55,0xb8,0x72,0x69,0xbf,0x47,0x79,0xc5,0x6d,0xbf,0x25,0xed,0x68,0x48,0x3a,0x5e,0x07,0x52,0xa6,0xd7,0x7e,0x45,0x00,0xa6,0x8d,0x4c,0x01,0xd8,0xd0,0xcc,0x05,0x32,0x30,0x43,0x5e,0xbe,0x41,0xa3,0x9f,0x81,0xbb,0xa0,0x89,0x74,0x17,0xa4,0xbc,0x11,0x6b,0xc1,0x49,0x3b,0xb8,0xae,0xb7,0xbf,0x89,0x43,0x96,0x7d,0xdf,0xd5,0x14,0x4d,0xf7,0x83,0xbd,0x26,0xec,0x26,0x71,0x38,0x2b,0xe4,0xf2,0x35,0x15,0x4d,0x18,0x80,0x32,0x03,0x40,0x8d,0x65,0x0c,0x1b,0xe8,0x70,0x43,0x15,0x77,0xce,0x42,0xd4,0x86,0x55,0x1c,0xc4,0xd6,0x24,0xed,0x00,0x3b,0x9c,0x19,0x06,0xb8,0x59,0x1a,0x61,0xec,0xb0,0xfd,0x61,0x00,0xfc,0xe8,0x12,0x42,0x1b,0x64,0x93,0x54,0x01,0xc0,0xc0,0x6e,0x6f,0xb8,0x19,0x10,0x4c,0xd4,0x5e,0x3b,0xb6,0x2f,0xd9,0xd1,0x67,0x66,0x36,0x0e,0x55,0xe1,0xfd,0x1a,0x6e,0xd1,0xa2,0x6c,0x85,0x17,0x0d,0x5f,0x24,0x25,0x80,0x06,0x90,0x7a,0xbb,0xe7,0x73,0x44,0xd2,0x4a,0xe8,0x82,0x26,0x23,0x71,0x3d,0x5b,0x57,0x8f,0xb6,0x23,0x4b,0x3d,0xa8,0x97,0x3c,0xd0,0x16,0xb9,0x27,0xe2,0x2d,0x8e,0x9c,0x5f,0x5f,0x74,0xe4,0xab,0xff,0x00,0x99,0x9b,0x9e,0xd2,0x92,0x98,0x37,0xed,0x73,0xff,0x43,0xf2,0xac,0xf5,0x41,0x69,0x88,0xa0,0xa1,0xa7,0x41,0xa9,0x25,0xbc,0x37,0xe8,0x02,0xdc,0x0c,0x5b,0x06,0x5e,0x0e,0xac,0xae,0x0c,0x1d,0x62,0xc5,0x14,0x99,0xd6,0x6b,0xe0,0xb5,0x5e,0x06,0xd3,0x9a,0x0e,0x66,0x9f,0x26,0x9a,0xc5,0x53,0xf0,0xa5,0xfc,0x73,0xf0,0x95,0x9d,0xae,0xe4,0x23,0x47,0x3e,0xcb,0x76,0xd3,0x33,0x35,0xad,0x97,0xba,0x37,0x1f,0x26,0x1e,0x7c,0x85,0xb8,0x8c,0x6a,0xda,0x6f,0xfa,0xb7,0x43,0x76,0x7d,0xc9,0x65,0x30,0x1e,0x1e,0x16,0x60,0x1a,0x8b,0x6e,0x50,0x85,0x4c,0xaa,0xf9,0x0b,0x7b,0xc1,0x06,0xee,0x7e,0x68,0x0f,0xd4,0x24,0x83,0xf0,0xd3,0x01,0x29,0x55,0x98,0xc8,0x1d,0xd1,0xc6,0xa8,0xcc,0x21,0x2b,0x12,0x37,0x45,0xe7,0x17,0x74,0x80,0x80,0xb0,0x8a,0x4a,0xa0,0x78,0x3e,0xd8,0x9a,0x8e,0xeb,0x20,0xac,0x1c,0x08,0x2b,0x56,0xae,0xbd,0x6e,0x52,0x3b,0xeb,0x33,0xdd,0x17,0x56,0x88,0x26,0x69,0x57,0x61,0xe5,0x9d,0xb2,0x8c,0x03,0x6c,0x27,0x07,0x20,0x05,0x62,0xa7,0x7b,0xd3,0x6d,0x4d,0x0f,0x64,0x7e,0x82,0x04,0x20,0x86,0x33,0x4f,0xd3,0x78,0x1e,0x8c,0x63,0x9b,0xda,0xe6,0xf0,0xd7,0x54,0xea,0x08,0xc6,0x03,0xe4,0x80,0xec,0xdb,0x9b,0x54,0x93,0x0d,0x76,0x36,0xee,0x53,0xc7,0x19,0xbe,0x8f,0x97,0x9e,0x4a,0x0b,0x64,0x04,0x61,0xad,0x04,0xd6,0x52,0xc4,0xd2,0x30,0xad,0xce,0xaa,0x0e,0x12,0xad,0xc4,0x52,0x85,0x7a,0x4d,0xe2,0xc5,0x41,0xcc,0xb3,0x5d,0x94,0xa3,0x8a,0x76,0x2a,0xbd,0x13,0x19,0xcc,0xfb,0x47,0x5e,0x73,0xa5,0xc4,0x2d,0x69,0x4b,0x60,0x0b,0x00,0x03,0x0f,0xb7,0x32,0x80,0x66,0x02,0x00,0x79,0x66,0xda,0xae,0x0f,0xf3,0xeb,0x5b,0x72,0xd1,0x44,0x06,0xbc,0x00,0xe2,0x25,0x1e,0x42,0x1c,0x0a,0xf6,0x6d,0x26,0x67,0x7f,0xc3,0x55,0x0b,0xf8,0x86,0xb7,0x41,0x2d,0xa5,0xe0,0x6b,0xe2,0x2b,0xcf,0x4f,0x06,0xbe,0x7e,0x6d,0xe9,0x69,0x7a,0x76,0x82,0x43,0xa6,0xfd,0x06,0xcc,0xa4,0xda,0x2f,0x6b,0x00,0x74,0xdf,0xfb,0x15,0x23,0x94,0x03,0xab,0xce,0x57,0xdd,0x29,0x6a,0xc0,0xad,0x20,0x4c,0x51,0x2c,0x89,0xdc,0xaa,0xc0,0xc6,0x8e,0xef,0xac,0x05,0x4b,0xfc,0x64,0x5a,0xb0,0x7c,0x47,0x74,0x68,0x72,0x03,0x07,0x5c,0x4e,0xf3,0x0d,0x5a,0x30,0x62,0x59,0x29,0x6b,0x59,0xbd,0xc8,0x2d,0x59,0x7e,0x30,0x0e,0x0d,0xc2,0xc6,0x81,0xb0,0xaf,0xab,0x6f,0x07,0x94,0xf7,0x85,0x81,0x08,0xc4,0x03,0xe5,0xbe,0x73,0xed,0x62,0x79,0xa5,0x34,0x00,0x71,0x6c,0x13,0x3f,0xe8,0xfd,0x1e,0x71,0x18,0x51,0x89,0x56,0x6c,0x94,0xff,0x34,0xa1,0x04,0xc6,0xe0,0x60,0x0c,0xdb,0xfe,0x1a,0x03,0x02,0xea,0xda,0xb5,0x64,0x13,0xb5,0x43,0x2f,0xb1,0x68,0x2b,0xdc,0xa4,0x63,0x83,0xb5,0x7f,0x68,0xe8,0xfc,0xa7,0x11,0x07,0x95,0x13,0x4e,0x72,0x3f,0xbc,0x0e,0x44,0xcc,0x03,0x6d,0xa4,0xb2,0x1f,0xbd,0xe9,0xcc,0x03,0xd9,0xb9,0x42,0x35,0xa0,0xac,0x51,0x3f,0x21,0x27,0x64,0xaf,0xb3,0x37,0x1d,0xf3,0x4c,0x04,0xc0,0x74,0x1d,0x2b,0x80,0xad,0x0d,0x6a,0x03,0x5c,0xf2,0x20,0x82,0xae,0x90,0xd6,0xc6,0x20,0xcb,0x62,0x09,0x78,0x29,0xa4,0xb4,0x03,0xaf,0xcf,0xd7,0x6b,0xa5,0x0c,0xfc,0x3c,0x0f,0xd2,0x39,0xdf,0x12,0xf8,0xba,0x3a,0xe4,0x1e,0xcf,0x51,0x82,0x08,0x1f,0x96,0xa1,0xe0,0x4b,0x95,0x28,0xd6,0x2e,0x0d,0x8a,0x96,0x09,0x06,0xbe,0xac,0xa1,0xa2,0x22,0x46,0x5f,0x9e,0x35,0xed,0x57,0xe8,0xa7,0x0e,0x19,0x8c,0xcc,0x04,0xdd,0x8a,0xdf,0xd5,0x08,0x5d,0x3d,0xa2,0x7d,0x07,0x9a,0x68,0x2f,0x4c,0xb1,0x9c,0x99,0x78,0xd1,0x6e,0x8a,0x0e,0xd9,0x08,0xa6,0xe8,0x60,0x7a,0x46,0x07,0xcf,0xe8,0xbe,0x20,0x2c,0xf0,0xab,0x9d,0x26,0x1e,0xfc,0xb6,0x12,0x6d,0x98,0x02,0xb6,0x9b,0x1c,0xcc,0x6f,0x4b,0x3b,0x2d,0x95,0x38,0x9e,0x05,0xf3,0x35,0x54,0x14,0x1c,0xe0,0x8b,0xe4,0xe0,0x5c,0x04,0xe3,0x10,0x1f,0x09,0x20,0x5b,0xfe,0xed,0x70,0x8b,0xa0,0xdc,0x04,0xf1,0x35,0xd1,0x94,0x41,0x93,0x96,0x80,0xd9,0x53,0x49,0xa2,0x8b,0x92,0x76,0x7e,0x70,0x5f,0xa6,0x98,0x6f,0x32,0x31,0x6a,0x42,0xe3,0x39,0x8b,0x9e,0x35,0xa6,0xfb,0x6b,0xe9,0x67,0x95,0x44,0x76,0x45,0x57,0x9b,0x96,0x84,0xb5,0x36,0x89,0x6a,0x6b,0x9e,0xaf,0xce,0xb3,0xd2,0x80,0xa4,0x91,0x45,0x8c,0x4f,0x11,0x53,0x5a,0xbc,0xe9,0x2b,0x3f,0xf7,0xcb,0xa0,0x4b,0xf3,0x54,0x6e,0x5e,0xe7,0xad,0x90,0x9a,0x9b,0x93,0x78,0x0c,0x78,0x5d,0xfc,0x60,0x72,0xf6,0xeb,0x4b,0xba,0x7f,0xc2,0x79,0xc9,0x2e,0xd9,0x08,0xac,0x71,0xf0,0xe5,0x66,0xe7,0x12,0xf8,0xc6,0x3c,0x7c,0xcd,0x2c,0x0e,0x2f,0xc4,0xf4,0xec,0x85,0x05,0xe4,0xfe,0x52,0xe9,0xf1,0x24,0x00,0x8b,0xa3,0xfd,0x8e,0x96,0xac,0x13,0x56,0x78,0x6a,0x8b,0x9e,0x0e,0xf4,0x24,0x41,0x93,0xc2,0x68,0x1a,0x3d,0x55,0xaf,0x18,0x72,0x0a,0x9a,0x11,0x82,0xef,0x15,0x4b,0xd7,0xc3,0x21,0x0b,0x50,0xcc,0x29,0xc9,0x3b,0x65,0xc5,0x37,0x1d,0x9c,0xb2,0xc2,0x5f,0x15,0x41,0xb8,0xa1,0x89,0x94,0xcb,0xd3,0x03,0x25,0x12,0xc7,0xac,0x3c,0x8d,0x0a,0xce,0x5c,0x88,0xe5,0x9b,0x58,0xae,0x6a,0x1a,0xff,0x32,0xb6,0x69,0xc1,0x49,0xcb,0xc6,0x8f,0x7c,0x2a,0x1f,0x9e,0x38,0x6a,0x85,0xd0,0xe0,0x24,0x16,0x8b,0x0d,0x4c,0x28,0x20,0xb5,0x34,0x28,0xca,0x67,0x6c,0x28,0x96,0x2b,0xfb,0x1b,0x04,0x18,0xff,0x3a,0x75,0xb3,0x4b,0xc7,0x51,0xaa,0xce,0xe6,0x51,0xeb,0x43,0x73,0x71,0x3c,0xa3,0xaa,0x63,0x79,0x51,0x69,0x54,0xf5,0x39,0x7b,0x80,0xdc,0xba,0xc8,0x2d,0x88,0xca,0xf5,0x62,0x25,0x96,0xa2,0x19,0x29,0x50,0x27,0xbf,0x52,0xa0,0xe4,0x96,0x23,0x56,0x9a,0x00,0x04,0xd9,0xd7,0x93,0x0c,0xc0,0xae,0x75,0x95,0x6e,0x68,0xca,0xb4,0xdd,0x06,0xf6,0xb2,0x0e,0x6e,0x6a,0xce,0x00,0x9a,0xdd,0x75,0x4c,0x81,0xd7,0xf1,0x2d,0x69,0xbd,0x3e,0x6e,0xa8,0x6a,0x02,0xbe,0xfe,0xeb,0x4a,0x5d,0xc0,0x37,0x00,0x76,0x47,0xa7,0x2b,0xd0,0x28,0x54,0x38,0xe2,0xdf,0x4f,0x2e,0x9a,0x9e,0xc1,0xd3,0x86,0x17,0x94,0x9f,0x52,0x33,0x07,0xb0,0xe7,0x20,0xcd,0x79,0x2d,0x8f,0x5b,0xab,0xf8,0xa4,0xeb,0x82,0x20,0x2c,0xd5,0x88,0x44,0xef,0xa9,0x01,0xb7,0xd8,0x9a,0x5b,0x4d,0xd1,0x35,0xca,0xb5,0xe0,0x18,0x24,0x68,0xc1,0xec,0xb7,0x7b,0xe2,0xaf,0x32,0x53,0x34,0x2f,0xcd,0x47,0xf5,0x26,0x15,0x69,0x3f,0x98,0xc4,0xf4,0x7b,0x19,0xde,0x04,0x9d,0x5d,0x41,0xc9,0x2f,0xea,0xe0,0x47,0x94,0x5c,0x3c,0x92,0xc6,0x18,0x03,0x05,0xbf,0x2f,0x9c,0x9b,0xf6,0x8d,0xff,0x8a,0x10,0xfd,0xa2,0x12,0x1d,0x74,0x41,0xf5,0x75,0x1a,0xb1,0x77,0xc2,0x02,0x12,0xd3,0xb4,0xd7,0x8a,0xbd,0xb9,0xcd,0x44,0xf3,0x34,0x94,0xbb,0x4f,0xc3,0x03,0xbd,0x71,0xd2,0xa5,0x8a,0xac,0x18,0x03,0xe3,0xb5,0x5b,0x43,0xfa,0x27,0x14,0x42,0x06,0xb0,0x17,0xa6,0x3c,0x5f,0xa4,0xb1,0x35,0x7b,0x65,0x25,0xf1,0x20,0x33,0x84,0x3e,0xf0,0x44,0x06,0x51,0x38,0x3a,0x5c,0x43,0x62,0xcd,0x83,0x16,0x8c,0x5f,0xa4,0xad,0xce,0x0a,0x71,0x4d,0xa5,0x8f,0x18,0x70,0xb6,0x38,0x2e,0xd3,0x88,0x84,0x80,0x74,0x88,0x48,0x14,0x22,0x48,0x65,0xe6,0xef,0xb4,0x04,0xb2,0x2c,0x1f,0x9a,0xb1,0xe1,0x8f,0xfe,0x07,0x29,0x93,0x2f,0xec,0x3e,0xcb,0x08,0xba,0x4a,0xa7,0x66,0x56,0x93,0xec,0xe3,0x12,0x5e,0xdd,0xdc,0x35,0xb5,0xb8,0x29,0x98,0xa6,0xe6,0x66,0x98,0x56,0xad,0xb7,0xbe,0xdf,0xdb,0x01,0x7c,0x53,0xcd,0xb7,0x33,0xf8,0xc6,0xfe,0x10,0xfb,0xb5,0xd5,0xf4,0x5c,0xaa,0x53,0x68,0x78,0x31,0x67,0xd6,0x47,0x62,0xb9,0xe5,0x20,0x00,0x1d,0x86,0x73,0xbf,0xf1,0xce,0x35,0x60,0xa0,0xa7,0x16,0x9c,0x47,0xae,0x1f,0x49,0x42,0x6f,0x2d,0x58,0xd1,0x7f,0x5a,0x8e,0x25,0x85,0x28,0x2a,0xa6,0xf1,0xb0,0x14,0xf1,0x57,0xa1,0x78,0x34,0x09,0x24,0x4b,0x45,0xcd,0xd1,0x2e,0xa0,0x01,0x8a,0xc7,0x93,0x42,0xdd,0xb8,0x87,0xb1,0x52,0xb4,0x2e,0x2e,0xbf,0xa0,0x81,0xba,0xfa,0xb6,0x69,0xc3,0xe1,0xb8,0x92,0xaf,0x91,0xaf,0xbf,0xe7,0x93,0x32,0xee,0xaa,0xe3,0x05,0x05,0x26,0xd4,0xb8,0x5f,0xc9,0x97,0x87,0xb8,0xc6,0xac,0x68,0x4c,0x0b,0xc6,0x21,0xa2,0x5f,0xa0,0x0c,0xe1,0x8d,0x14,0x9a,0xc6,0x4b,0x8a,0x15,0x1e,0x40,0x32,0x62,0xc4,0x38,0x94,0x5c,0xdd,0xcb,0xb1,0xdb,0xc3,0xe5,0x22,0x17,0x46,0x8b,0xa3,0x84,0x9f,0x5b,0x34,0x42,0x85,0x5a,0xc4,0xb8,0x5e,0x05,0xd5,0xe2,0xf8,0x05,0x59,0xc9,0x31,0xb3,0xc5,0xba,0xf0,0x9c,0xa2,0x5d,0x02,0xf0,0x19,0xe0,0xd2,0xf9,0xe1,0xfe,0x72,0x18,0x88,0xc2,0xaf,0xb8,0xce,0x3b,0x6d,0x17,0x59,0x1a,0xc3,0x6f,0xb8,0xcc,0x34,0x5e,0x9f,0xc2,0x9b,0x9b,0x0d,0xdf,0xa2,0xf1,0xda,0x49,0x00,0x3e,0xb7,0xe7,0xda,0xb2,0xdf,0x6b,0xe3,0x24,0x55,0x1f,0x19,0xf8,0xa6,0xfb,0xbe,0x89,0xe9,0x39,0x71,0x42,0xf3,0x59,0xcb,0x8e,0x57,0x26,0x00,0xb6,0x7d,0xe7,0x84,0x8f,0xac,0x3b,0x53,0xab,0x44,0x3f,0xed,0xd7,0x0a,0x34,0xd2,0xaa,0x41,0xd3,0x74,0xd7,0x7e,0x01,0x40,0x8d,0xaf,0xbf,0xc6,0xf0,0xc5,0xb3,0x9e,0xde,0x52,0x05,0x84,0xdb,0xcc,0xd0,0x11,0xe1,0xc8,0xb3,0x61,0xe1,0x19,0x08,0x4b,0x00,0xec,0x03,0xd8,0x62,0xdf,0xc5,0x14,0x6d,0x07,0xcc,0x62,0x83,0x30,0x29,0x3e,0x7c,0x27,0x37,0xd4,0x2e,0x60,0x56,0x4c,0x27,0x03,0x71,0x02,0x9d,0xc1,0x2c,0xdd,0x02,0xc4,0x3e,0xaf,0xc6,0x10,0x20,0x0e,0xa5,0xf3,0x78,0x22,0x18,0x93,0xba,0xa6,0xbd,0xa9,0xa8,0x5c,0x4a,0xdb,0x06,0x88,0x21,0xbc,0x4f,0x62,0x5a,0x61,0x5c,0x64,0xaf,0xa4,0xb1,0x93,0x03,0x7a,0x27,0xbc,0x23,0xed,0xde,0x8f,0x86,0x47,0xd3,0x91,0x82,0xfa,0x39,0x44,0x6d,0x8a,0x41,0x9d,0x86,0x41,0xee,0x2e,0x2a,0x6f,0xc9,0xff,0xaa,0x94,0xb0,0x06,0xb0,0xfe,0x9d,0xbc,0x98,0x06,0x58,0xa4,0x40,0x9b,0xc4,0x57,0xe4,0x77,0x3f,0xd0,0x65,0x25,0x84,0x34,0x31,0x85,0xe2,0x00,0x03,0x14,0x80,0x17,0xb9,0xb9,0x59,0x39,0x1e,0xa9,0xf0,0x60,0x52,0x93,0x76,0x04,0xcb,0xa8,0x0f,0xeb,0x00,0x96,0xc1,0xd9,0x8a,0xd6,0xb7,0x2b,0xf8,0xc2,0x44,0xaf,0x69,0x16,0x5c,0x03,0x5f,0xfb,0x9b,0x81,0xaf,0x4f,0x5a,0x04,0x5f,0x5a,0x6e,0x7a,0x65,0x25,0x2d,0x8f,0x66,0x96,0x00,0xb0,0x49,0xc2,0x13,0x6a,0x37,0x3f,0x77,0x18,0xe7,0x2c,0x7b,0x8d,0xff,0x03,0x39,0x73,0xd1,0xba,0x31,0xe5,0xe4,0xd1,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,yoshimi-2.3.5.1/src/UI/Themes.h000066400000000000000000000304371506652756400160720ustar00rootroot00000000000000/* Themes.h - FLTK theme colours Copyright 2023-2024 Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef THEMES_H #define THEMES_H #include #include "Misc/FileMgrFuncs.h" #include "Misc/FormatFuncs.h" /* The following are ordered by value for easy number tracking. Where possible they are fairly close to FLTK defaults. Fluid's colour chooser doesn't recognise our named colour numbers so most of these are written in numerically. Designing layouts without Fluid is seriously hard work so we have to go with it :( */ /* Reserved(*) / spare colours Ideally there should be no reserved colours, as that means we are not managing them! 56 58 - 61 68 - 79 75 - 77 83 - 87 98 - 100 102 - 102 106 - 114 116 - 123 124* filer icon fake lines 125 - 127 138 - 141 148 - 154 160 - 161 164 - 166 170 - 172 174* filer icon background 180 183* filer dir icon 184 - 186 193 - 195 200 - 201 203 - 205 210 - 213 233 - 235 240 - 243 248 - 250 */ const int gen_text_back = 7; // we shouldn't really use this one - it's complicated! const int reserved_0 = 56; const int graph_back = 57; const int slider_track = 62; const int graph_line = 63; const int gen_text = 64; const int keyb_slider_back = 65; const int tooltip_text = 66; const int tooltip_faint_text = 67; const int slider_peg_default = 70; const int spectrum_line = 71; const int reserved_1 = 72; const int bank_export = 78; const int midi_active = 79; const int slider_peg_changed = 80; const int env_line_sel = 81; const int pad_apply = 82; const int bank_delete = 88; const int warning_button = 89; const int pending_button = 90; const int warning_background = 91; const int env_sus = 92; const int bank_import = 93; const int EQ_line_off = 94; const int EQ_line = 95; const int EQ_back = 96; const int EQ_back_off = 97; const int bank_text = 101; const int bank_select = 103; const int reserved_4 = 104; const int tooltip_major_grid = 105; const int pad_built = 115; const int pad_harmonic_line = 128; const int warning_text = 129; const int midi_ignored = 130; const int reson_graph_line = 131; const int formant_graph_line = 132; const int formant_ghost_marker = 133; const int formant_marker = 134; const int VU_rms = 135; const int pad_prof_line = 136; const int pad_prof_inactive = 137; const int midi_solo_release = 139; const int reserved_5 = 142; const int knob_point_change = 143; const int knob_ring = 144; const int knob_point = 145; const int tooltip_grid = 146; const int EQ_grid = 147; const int EQ_major_grid = 155; const int reserved_6 = 156; const int ext_voice = 157; const int pad_back = 158; const int pad_equiv_back = 159; const int pad_grid_centre = 162; const int pad_grid = 163; const int pad_fading = 167; const int VU_over = 168; const int voice_off = 169; const int bank_add_save = 173; const int gen_opp_text = 175; const int bank_swap = 176; const int tooltip_curve = 177; const int VU_bar_1dB = 178; const int CP_background = 179; const int dynfilter_button = 181; const int instr_info_back = 182; const int pad_pending = 187; const int eff_preset = 188; const int eff_preset_changed = 189; const int VU_bar_10dB = 190; const int query_back = 191; const int reserved_7 = 192; const int close_button = 196; const int CP_text = 197; const int links = 198; const int knob_lit = 199; const int pad_building = 202; const int filer_text_back = 206; const int knob_high = 207; const int bank_rename = 208; const int bank_back_used = 209; const int add_back = 214; const int tooltip_back = 215; const int graph_Harmonics_grid = 216; const int graph_grid = 217; const int query_text = 218; const int yoshi_ins_typ = 219; const int solo_select = 220; const int alt_links = 221; const int VU_bar_5dB = 222; const int panels = 223; const int contrib = 224; const int name_derived = 225; const int learnable_text = 226; const int pad_prof_band = 227; const int actions = 228; const int VU_level = 229; const int keyb_mod_bar = 230; const int pad_prof_fill = 231; const int alt_warn_tex = 232; const int sub_back = 236; const int bank_swap_back = 237; const int ext_osc = 238; const int env_ctl_sel = 239; const int knob_low = 244; const int graph_resonance_grid = 245; const int env_line = 246; const int midi_text_back = 247; const int bank_back = 251; const int bank_highlight = 252; const int env_ctl = 253; const int graph_pad_back = 254; const int VU_text = 255; /* The following are ordered as they are in theme lists. They are grouped mainly by function. All new definitions must be placed at the end of the list table so that new work doesn't mess up existing themes. Ideally, use colours as close as possible to the deault colour table. */ const int COLOURLIST = 114; const unsigned char colourNumbers [COLOURLIST] = { panels, reserved_0, knob_low, knob_high, knob_ring, knob_lit, knob_point, knob_point_change, slider_track, slider_peg_default, slider_peg_changed, keyb_slider_back, keyb_mod_bar, reserved_1, links, alt_links, actions, close_button, warning_button, warning_background, warning_text, alt_warn_tex, gen_text_back, gen_text, gen_opp_text, contrib, midi_active, midi_text_back, learnable_text, solo_select, midi_solo_release, midi_ignored, CP_background, CP_text, query_back, query_text, tooltip_back, tooltip_grid, tooltip_major_grid, tooltip_curve, tooltip_text, tooltip_faint_text, bank_text, VU_bar_1dB, VU_bar_5dB, VU_bar_10dB, VU_level, VU_rms, VU_text, VU_over, filer_text_back, reserved_4, bank_select, // light bank_rename, // light bank_add_save, // light bank_delete, // light bank_swap, // light bank_import, // light bank_export, // light bank_highlight, bank_swap_back, name_derived, reserved_5, graph_back, graph_grid, graph_resonance_grid, graph_Harmonics_grid, graph_line, spectrum_line, formant_graph_line, reson_graph_line, yoshi_ins_typ, instr_info_back, reserved_6, voice_off, add_back, ext_voice, ext_osc, sub_back, pad_back, graph_pad_back, pad_equiv_back, pad_grid, pad_grid_centre, pad_prof_band, reserved_7, pad_prof_fill, pad_prof_line, pad_prof_inactive, pad_harmonic_line, pad_apply, pad_building, pad_pending, pad_fading, pad_built, pending_button, bank_back_used, formant_marker, formant_ghost_marker, dynfilter_button, EQ_back, EQ_back_off, EQ_grid, EQ_major_grid, EQ_line, EQ_line_off, eff_preset, eff_preset_changed, bank_back, env_ctl, env_ctl_sel, env_sus, env_line, env_line_sel, }; static std::string colourPreamble [] = { "Do not edit this. It may be overwritten.", "Instead, copy as template for other named themes.", "Don't add or remove lines between and including dashes.", "This would corrupt the colour map.", "------------------ data start marker", "END" }; // Do not change the previous text lines! static std::string colourData [] = { "0,255, Grey scale min-max (can be reversed) optional + R,G,B, (tint)", "0,255,255, Panels (R,G,B or #rrggbb)", "0,0,0, RESERVED", "186,198,211, Knob shadow (#bac6d3)", "231,235,239, Knob highlight (#e7ebef)", "51,51,51, Knob ring", "0,197,255, Knob ring lit", "61,61,61, Knob pointer default", "225,75,75, Knob pointer changed", "0,0,0, Slider track", "0,170,0, Slider peg default", "255,80,80, Slider peg changed", "127,127,127, Keyboard slider backgrounds", "63,127,255, Keyboard mod wheel fill", "0,0,0, RESERVED", "120,190,185, Link buttons", "180,180,200, Inverse link buttons", "63,145,255, Action buttons", "160,160,140, Close button", "220,0,0, Warning type button", "250,150,90, Warning background patch", "255,0,0, Warning text", "0,0,255, Inverse warning text", "255,255,255, General text background", "0,0,0, General text", "255,255,255, Inverse text", "0,0,255, About window heading text", "0,255,0, Midilearn activity indicator", "191,255,255, Midilearn text background", "0,0,255, Learnable text", "0,0,255, Solo selected", "0,180,180, Midi/Solo release", "255,0,0, Midi ignored", "0,109,191, Copy/Paste background", "255,255,255, Copy/Paste text", "255,255,255, Alert/Query background", "0,0,255, Alert/Query mark (!?)", "255,255,210, Tooltip background", "180,180,180, Tooltip grid", "50,50,50, Tooltip major grid", "0,0,255, Tooltip curve", "0,0,0, Tooltip text", "150,150,150, Tooltip faint text", "0,0,0, Bank/Instrument text", "0,145,255, VU 1dB marker", "63,218,255, VU 5dB marker", "140,180,220, VU 10dB marker", "63,182,255, VU level", "255,255,0, VU rms", "255,254,254, VU_text", "255,0,0,VU overload", "240,250,230, Filer favourites background", "0,0,0, RESERVED", "0,255,0, Bank/Instrument select lit", "255,0,255, Bank/Instrument rename lit", "255,255,0, Bank/Instrument add/save lit", "255,0,0, Bank/Instrument delete lit", "0,0,255, Bank/Instrument swap lit", "255,180,0, Bank import lit", "180,240,255, Bank export lit", "255,100,255, Current bank highlight", "160,140,250, Instrument being swapped", "0,0,255, Instrument original name", "0,0,0, RESERVED", "0,0,0, General graph background", "40,120,190, Waveform graph grid", "180,180,180, Resonance graph grid", "30,70,255, Harmonics graph grid", "0,255,0, Waveform graph line", "0,255,0, Waveform spectrum harmonic", "255,0,0, Formant graph line", "255,0,0, Resonance graph line", "0,0,225, Yoshimi instrument type", "240,250,230, Instrument info background", "253,246,230, RESERVED", "127,127,127, AddVoice tab off", "223,175,191, AddSynth background", "159,223,143, External voice", "143,191,223, External oscillator", "175,207,223, SubSynth background", "205,221,173, PadSynth background", "245,245,245, Padsynth harmonics background", "225,225,225, PadSynth profile equivalent background", "180,180,180, Padsynth profile grid", "90,90,90, Padsynth profile centre mark", "90,120,250, PadSynth profile equivalent markers", "0,0,0, RESERVED", "180,210,240, PadSynth profile fill", "0,0,120, PadSynth profile line", "150,150,150, PadSynth profile line disabled", "200,0,0, PadSynth spectrum harmonic", "255,0,0, PadSynth apply changes", "191,72,191, PadSynth building", "0,160,160, PadSynth pending", "255,255,0, PadSynth fading", "150,150,150, PadSynth built", "255,120,0, Pending button", "225,225,205, Occupied bank tile", "255,255,0, Formant filter marker", "150,150,0, Formant filter ghost marker", "0,182,191, Dynfilter filter insert", "0,70,150, EQ graph background", "80,120,160, EQ background disabled", "200,200,200, EQ graph grid", "255,255,255, EQ graph major grid", "255,255,0, EQ graph line", "200,200,80, EQ graph line disabled", "0,0,0, Effect preset", "0,0,255, Effect preset changed", "120,120,120, Unused bank tile", "255,255,255, Envelope control point", "0,255,255, Envelope control point selected", "255,255,0, Envelope sustain line", "255,255,255, Envelope line", "255,0,0, Envelope line selected", "=================== data end marker", "Add your own notes here:", "Copyright © 2020 A. N. Other", "The default theme", "END" }; // Do not change the previous five text lines! #endif yoshimi-2.3.5.1/src/UI/VectorUI.fl000066400000000000000000000776501506652756400165270ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment { Copyright (C) 2016-2024, Will Godfrey This file is part of yoshimi, which 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. yoshimi 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 yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. } {selected in_source in_header } decl {\#include "MasterUI.h"} {private global } decl {\#include "Misc/SynthEngine.h"} {public global } decl {\#include "UI/MiscGui.h"} {public local } decl {\#include "UI/WidgetSpinner.h"} {public local } decl {\#include "UI/ScaleTrackedWindow.h"} {public local } decl {\#include "BankUI.h"} {public local } decl {\#include "ParametersUI.h"} {public local } decl {\#include "Misc/FileMgrFuncs.h" using file::findLeafName; using file::setExtension; using file::isRegularFile;} {private local } decl {\#include "Misc/NumericFuncs.h" using func::bitClear; using func::bitTest; using func::bitSet;} {private local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include \#include using std::vector; using std::to_string;} {private global } class VectorUI {} { Function {make_window()} {} { Fl_Window vectorwindow { label {Yoshimi : Vectors} callback {// Closevector->do_callback();} open xywh {382 256 375 295} type Double labelfont 13 labelsize 12 align 0 hide resizable code0 {vecDW = o->w();vecDH = o->h();} code1 {o->size_range(vecDW, vecDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Spinner setbasechan { label {Base Channel} callback {// BaseChan = o->value() - 1; updateAll(false);} tooltip {The channel number for this vector} xywh {121 12 38 20} labelfont 1 labelsize 12 labelcolor 64 maximum 16 textsize 12 textcolor 64 code0 {o->value(BaseChan + 1);} class WidgetSpinner } Fl_Menu_Button options { label {&Options} callback {int res = o->value(); switch (res) { case 0: loadVector(""); break; case 1: { bool ok = true; int count; int size; string name; if (Xcc == 0) { alert(synth, "Nothing to save!"); ok = false; } else { count = 0; if (Ycc > 0) size = NUM_MIDI_CHANNELS * 4; else size = NUM_MIDI_CHANNELS * 2; for (int i = 0; i < size; i += NUM_MIDI_CHANNELS) { string partName = ""; if (textMsgBuffer.fetch(collect_readData(synth, 0, PART::instrumentName, BaseChan + i)) != DEFAULT_NAME) count += NUM_MIDI_CHANNELS; } if (count != size) { if (count == 0) name = "No instruments set!"; else name = "Only " + to_string(count/NUM_MIDI_CHANNELS) + " of " + to_string(size/NUM_MIDI_CHANNELS) + " instruments set!"; alert(synth, name); ok = false; } } if (ok) saveVector(); break; } case 2: paramsui->Recent->position(vectorwindow->x() + vectorwindow->w() - paramsui->Recent->w(),vectorwindow->y()+20); paramsui->Show(TOPLEVEL::XML::Vector); break; case 3: send_data(TOPLEVEL::action::forceUpdate, VECTOR::control::erase, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, BaseChan); break; case 4: send_data(TOPLEVEL::action::forceUpdate, VECTOR::control::erase, 0, TOPLEVEL::type::Integer); break; }} xywh {275 12 74 20} labelsize 12 labelcolor 64 textsize 12 textcolor 64 code0 {o->add("Load");o->add("Save");o->add("Recent");o->add("Clear Ch");o->add("Clear All");} code1 {vector const& history{synth->getHistory(TOPLEVEL::XML::Vector)};} code2 {setRecent(not history.empty());} } {} Fl_Group Xgroup { label X xywh {8 42 360 104} box PLASTIC_THIN_UP_BOX color 223 labelfont 1 labelsize 16 labelcolor 64 align 0 deactivate } { Fl_Box AddBackL { xywh {21 53 53 19} box FLAT_BOX color 50 } Fl_Box SubBackL { xywh {74 53 53 19} box FLAT_BOX color 50 } Fl_Box PadBackL { xywh {127 53 53 19} box FLAT_BOX color 50 } Fl_Text_Display XinstL { xywh {20 69 160 1} box NO_BOX labelsize 12 labelcolor 64 align 97 textsize 12 textcolor 64 } Fl_Button XL { callback {// (void) o; // suppress warning synth->getGuiMaster()->partSwitch(BaseChan); bankui->Show();} tooltip {Part corresponding to joystick 'left' position} xywh {20 53 160 20} box ENGRAVED_FRAME color 51 labelsize 12 align 64 } Fl_Box AddBackR { xywh {21 115 53 19} box FLAT_BOX color 50 } Fl_Box SubBackR { xywh {74 115 53 19} box FLAT_BOX color 50 } Fl_Box PadBackR { xywh {127 115 53 19} box FLAT_BOX color 50 } Fl_Text_Display XinstR { xywh {20 131 160 1} box NO_BOX labelsize 12 labelcolor 64 align 97 textsize 12 textcolor 64 } Fl_Button XR { callback {// (void) o; // suppress warning synth->getGuiMaster()->partSwitch(BaseChan + NUM_MIDI_CHANNELS); bankui->Show();} tooltip {Part corresponding to joystick 'right' position} xywh {20 115 160 20} box ENGRAVED_FRAME color 51 labelsize 12 labelcolor 64 align 64 } Fl_Text_Display Xfeat { label Features xywh {233 101 97 14} box NO_BOX labelfont 1 labelcolor 64 textsize 12 textcolor 64 } Fl_Choice Xfeat1 { label 1 callback {// if (o->value() == 0) bitClear(Xf, 0); else bitSet(Xf, 0); send_data(0, VECTOR::control::Xfeature0, o->value(), TOPLEVEL::type::Integer);} xywh {208 53 58 20} down_box BORDER_BOX labelsize 12 labelcolor 64 align 8 textsize 12 textcolor 64 code0 {o->add("off");o->add("vol");} } {} Fl_Choice Xfeat2 { label 2 callback {// bitClear(Xf, 1); bitClear(Xf, 4); if (o->value() >= 1) { bitSet(Xf, 1); if (o->value() == 2) bitSet(Xf, 4); } send_data(0, VECTOR::control::Xfeature1, o->value(), TOPLEVEL::type::Integer);} xywh {302 53 58 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textsize 12 textcolor 64 code0 {o->add("off");o->add("pan");o->add("panR");} } {} Fl_Choice Xfeat3 { label 3 callback {// bitClear(Xf, 2); bitClear(Xf, 5); if (o->value() >= 1) { bitSet(Xf, 2); if (o->value() == 2) bitSet(Xf, 5); } send_data(0, VECTOR::control::Xfeature2, o->value(), TOPLEVEL::type::Integer);} xywh {208 115 58 20} down_box BORDER_BOX labelsize 12 labelcolor 64 align 8 textsize 12 textcolor 64 code0 {o->add("off");o->add("filt");o->add("filtR");} } {} Fl_Choice Xfeat4 { label 4 callback {// bitClear(Xf, 3); bitClear(Xf, 6); if (o->value() >= 1) { bitSet(Xf, 3); if (o->value() == 2) bitSet(Xf, 6); } send_data(0, VECTOR::control::Xfeature3, o->value(), TOPLEVEL::type::Integer);} xywh {302 115 58 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textsize 12 textcolor 64 code0 {o->add("off");o->add("mod");o->add("modR");} } {} } Fl_Spinner Xcontrol { label Controller callback {// int tmp = o->value(); if (tmp == 0) { Xcc = 0; Xgroup->deactivate(); Ycc = 0; Ycontrol->value(0); Ycontrol->deactivate(); Ygroup->deactivate(); send_data(TOPLEVEL::action::forceUpdate, VECTOR::control::erase, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, BaseChan); return; } if (tmp > 119) { o->value(0); Xcc = 0; Xgroup->deactivate(); Ycc = 0; Ycontrol->value(0); Ycontrol->deactivate(); Ygroup->deactivate(); errorlabel("CC must be less than 120"); return; } string name = textMsgBuffer.fetch(collect_readData(synth, tmp, MAIN::knownCCtest, TOPLEVEL::main)); if (name != "") { errorlabel("CC " + to_string(tmp) +" in use for " + name); Xcc = 0; o->value(0); Xgroup->deactivate(); Ycc = 0; Ycontrol->value(0); Ycontrol->deactivate(); Ygroup->deactivate(); return; } Ycontrol->activate(); Xcc = tmp; Xgroup->activate(); send_data(TOPLEVEL::action::forceUpdate, VECTOR::control::Xcontroller, tmp, TOPLEVEL::type::Integer);} tooltip {The MIDI CC this axis reponds to} xywh {110 85 50 20} labelfont 1 labelsize 12 labelcolor 64 minimum 0 maximum 127 value 0 textsize 12 textcolor 64 code0 {// o->value(Xcc);} class WidgetSpinner } Fl_Button Closevector { label {&Close} callback {// saveWin(synth, vectorwindow->w(), vectorwindow->h(), vectorwindow->x(), vectorwindow->y(), false, "Vector"); vectorwindow->hide(); setVisible(synth, false, "Vector"); vectorSeen = false;} xywh {308 264 58 22} color 196 labelfont 13 labelsize 12 labelcolor 64 } Fl_Group Ygroup { label Y xywh {8 152 360 104} box PLASTIC_THIN_UP_BOX color 223 labelfont 1 labelsize 16 labelcolor 64 align 0 deactivate } { Fl_Box AddBackU { xywh {21 163 53 19} box FLAT_BOX color 50 } Fl_Box SubBackU { xywh {74 163 53 19} box FLAT_BOX color 50 } Fl_Box PadBackU { xywh {127 163 53 19} box FLAT_BOX color 50 } Fl_Text_Display YinstU { private xywh {20 179 160 1} box NO_BOX labelsize 12 labelcolor 64 align 97 textsize 12 textcolor 64 } Fl_Button YU { callback {// (void) o; // suppress warning synth->getGuiMaster()->partSwitch(BaseChan + (NUM_MIDI_CHANNELS * 2)); bankui->Show();} tooltip {Part corresponding to joystick 'up' position} xywh {20 163 160 20} box ENGRAVED_FRAME color 51 labelsize 12 labelcolor 64 align 64 } Fl_Box AddBackD { xywh {21 225 53 19} box FLAT_BOX color 50 } Fl_Box SubBackD { xywh {74 225 53 19} box FLAT_BOX color 50 } Fl_Box PadBackD { xywh {127 225 53 19} box FLAT_BOX color 50 } Fl_Text_Display YinstD { private xywh {20 241 160 1} box NO_BOX labelsize 12 labelcolor 64 align 97 textsize 12 textcolor 64 } Fl_Button YD { callback {// (void) o; // suppress warning synth->getGuiMaster()->partSwitch(BaseChan + (NUM_MIDI_CHANNELS * 3)); bankui->Show();} tooltip {Part corresponding to joystick 'down'position} xywh {20 225 160 20} box ENGRAVED_FRAME color 51 labelsize 12 labelcolor 64 align 64 } Fl_Text_Display Yfeat { label Features xywh {233 211 97 14} box NO_BOX labelfont 1 labelcolor 64 textsize 12 textcolor 64 } Fl_Choice Yfeat1 { label 1 callback {// if (o->value() == 0) bitClear(Yf, 0); else bitSet(Yf, 0); send_data(0, VECTOR::control::Yfeature0, o->value(), TOPLEVEL::type::Integer);} xywh {208 163 58 20} down_box BORDER_BOX labelsize 12 labelcolor 64 align 8 textsize 12 textcolor 64 code0 {o->add("off");o->add("vol");} } {} Fl_Choice Yfeat2 { label 2 callback {// bitClear(Yf, 1); bitClear(Yf, 4); if (o->value() >= 1) { bitSet(Yf, 1); if (o->value() == 2) bitSet(Yf, 4); } send_data(0, VECTOR::control::Yfeature1, o->value(), TOPLEVEL::type::Integer);} xywh {302 163 58 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textsize 12 textcolor 64 code0 {o->add("off");o->add("pan");o->add("panR");} } {} Fl_Choice Yfeat3 { label 3 callback {// bitClear(Yf, 2); bitClear(Yf, 5); if (o->value() >= 1) { bitSet(Yf, 2); if (o->value() == 2) bitSet(Yf, 5); } send_data(0, VECTOR::control::Yfeature2, o->value(), TOPLEVEL::type::Integer);} xywh {208 225 58 20} down_box BORDER_BOX labelsize 12 labelcolor 64 align 8 textsize 12 textcolor 64 code0 {o->add("off");o->add("filt");o->add("filtR");} } {} Fl_Choice Yfeat4 { label 4 callback {// bitClear(Yf, 3); bitClear(Yf, 6); if (o->value() >= 1) { bitSet(Yf, 3); if (o->value() == 2) bitSet(Yf, 6); } send_data(0, VECTOR::control::Yfeature3, o->value(), TOPLEVEL::type::Integer);} xywh {302 225 58 20} down_box BORDER_BOX labelsize 12 labelcolor 64 textsize 12 textcolor 64 code0 {o->add("off");o->add("mod");o->add("modR");} } {} } Fl_Spinner Ycontrol { label Controller callback {// int tmp = o->value(); if (tmp < 1) { Ycc = 0; Ygroup->deactivate(); send_data(0, VECTOR::control::Ycontroller, 0xff, TOPLEVEL::type::Integer); return; } if (tmp > 119) { Ygroup->deactivate(); errorlabel("CC must be less than 120"); Ycc = 0; o->value(0); return; } string name = textMsgBuffer.fetch(collect_readData(synth, tmp, MAIN::knownCCtest, TOPLEVEL::main)); if (name != "") { errorlabel("CC " + to_string(tmp) +" in use for " + name); Ycc = 0; Ygroup->deactivate(); o->value(0); return; } Ycc = tmp; send_data(TOPLEVEL::action::forceUpdate, VECTOR::control::Ycontroller, tmp, TOPLEVEL::type::Integer);} tooltip {The MIDI CC this axis reponds to} xywh {110 195 50 20} labelfont 1 labelsize 12 labelcolor 64 minimum 0 maximum 127 value 0 textsize 12 textcolor 64 deactivate code0 {o->value(Ycc);} class WidgetSpinner } Fl_Button Loaded { label {No Name} callback {// (void) o; // suppress warning string tmp = input_text(synth, "Vector name:", loadlabel[BaseChan]); if (tmp != loadlabel[BaseChan]) send_data(TOPLEVEL::action::lowPrio | TOPLEVEL::action::forceUpdate, VECTOR::control::name, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, BaseChan, textMsgBuffer.push(tmp));} tooltip {Last saved or loaded vector file - click to change the name} xywh {45 264 198 22} box DOWN_BOX color 7 labelfont 1 labelsize 12 labelcolor 64 } } } Function {send_data(int action, int control, float value, int type, int part = TOPLEVEL::section::vector, int kit = UNUSED, int engine = UNUSED, int insert = UNUSED, int parameter = UNUSED, int miscmsg = UNUSED)} {} { code {// if (control != MAIN::control::partNumber && control != MAIN::loadNamedVector && control != MAIN::saveNamedVector && control != VECTOR::control::erase) { parameter = BaseChan; } type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, part, kit, engine, insert, parameter, UNUSED, miscmsg);} {} } Function {returns_update(CommandBlock *getData)} {} { code {// float value = getData->data.value; unsigned char control = getData->data.control; unsigned char parameter = getData->data.parameter; unsigned char miscmsg = getData->data.miscmsg; int value_int = lrint(value); string msg; switch (control) { case VECTOR::control::name: msg = textMsgBuffer.fetch(miscmsg); loadlabel[parameter] = msg; Loaded->copy_label(msg.c_str()); break; case VECTOR::control::Xcontroller: if (value_int > 119) { Xcc = 0; Ycc = 0; Xgroup->deactivate(); Xcontrol->value(0); Ycontrol->value(0); Ygroup->deactivate(); Ycontrol->deactivate(); errorlabel("CC must be less than 120"); } else { Xgroup->activate(); Xcontrol->value(value_int); Ycontrol->activate(); if (synth->getGuiMaster()->partmax < NUM_MIDI_CHANNELS * 2) { synth->getGuiMaster()->maxparts->value(NUM_MIDI_CHANNELS * 2); synth->getGuiMaster()->maxparts->do_callback(); synth->getGuiMaster()->Panelsmallgroups->show(); } } break; case VECTOR::control::Xfeature0: Xfeat1->value(value_int); break; case VECTOR::control::Xfeature1: Xfeat2->value(value_int); break; case VECTOR::control::Xfeature2: Xfeat3->value(value_int); break; case VECTOR::control::Xfeature3: Xfeat4->value(value_int); break; case VECTOR::control::Ycontroller: if (value_int > 119) { Ygroup->deactivate(); Ycontrol->value(0); Ycc = 0; Ygroup->deactivate(); errorlabel("CC must be less than 120"); } else { Ygroup->activate(); Ycontrol->value(value_int); if (synth->getGuiMaster()->partmax < NUM_MIDI_CHANNELS * 4) { synth->getGuiMaster()->maxparts->value(NUM_MIDI_CHANNELS * 4); synth->getGuiMaster()->maxparts->do_callback(); synth->getGuiMaster()->Panelsmallgroups->hide(); synth->getGuiMaster()->Panelgroups->show(); } } break; case VECTOR::control::Yfeature0: Yfeat1->value(value_int); break; case VECTOR::control::Yfeature1: Yfeat2->value(value_int); break; case VECTOR::control::Yfeature2: Yfeat3->value(value_int); break; case VECTOR::control::Yfeature3: Yfeat4->value(value_int); break; case VECTOR::control::erase: if (parameter >= NUM_MIDI_PARTS) { for (int i = NUM_MIDI_CHANNELS - 1; i >= 0; --i) clearVector(i); BaseChan = 0; setbasechan->value(1); } else clearVector(parameter); break; }; vectorwindow->redraw();} {} } Function {setRecent(bool active)} {} { code {// Fl_Menu_Item *m = (Fl_Menu_Item*)options->find_item("Recent"); if (active) m->activate(); else m->deactivate();} {} } Function {VectorUI(SynthEngine *_synth, BankUI *_bankui, ParametersUI *_paramsui)} {} { code {// synth = _synth; bankui = _bankui; paramsui = _paramsui; BaseChan = 0; Xcc = 0; Xf = 0; Ycc = 0; Yf = 0; make_window(); vectorwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Vectors"), UNUSED, TOPLEVEL::windowTitle)).c_str()); updateAll(); vectorSeen = false; lastvectorW = 0;} {} } Function {~VectorUI()} {} { code {// if (vectorSeen) saveWin(synth, vectorwindow->w(), vectorwindow->h(), vectorwindow->x(), vectorwindow->y(), true, "Vector"); vectorwindow->hide(); delete vectorwindow;} {} } Function {updateAll(bool everything = true)} {} { code {// if (everything) { BaseChan = 0; setbasechan->value(BaseChan + 1); for (int i = 0; i < NUM_MIDI_CHANNELS; ++i) loadlabel[i] = "No Name " + to_string(i + 1); } setInstrumentLabel(BaseChan); setInstrumentLabel(BaseChan + NUM_MIDI_CHANNELS); setInstrumentLabel(BaseChan + NUM_MIDI_CHANNELS * 2); setInstrumentLabel(BaseChan + NUM_MIDI_CHANNELS * 3); Loaded->copy_label(loadlabel[BaseChan].c_str()); setbuttons(); if (Xcontrol->value() > 0) Ycontrol->activate(); else Ycontrol->deactivate();} {} } Function {RefreshChans()} {} { code {// for (int i = NUM_MIDI_CHANNELS; i > 0; --i) { BaseChan = i - 1; setInstrumentLabel(BaseChan); setInstrumentLabel(BaseChan + NUM_MIDI_CHANNELS); setInstrumentLabel(BaseChan + NUM_MIDI_CHANNELS * 2); setInstrumentLabel(BaseChan + NUM_MIDI_CHANNELS * 3); setbuttons(); } Loaded->copy_label(loadlabel[0].c_str()); setbasechan->value(1);} {} } Function {setbuttons()} {} { code {// Xcc = collect_readData(synth, 0, VECTOR::control::Xcontroller, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, BaseChan); if (Xcc == 0 || Xcc > 119) { Xcc = 0; Xf = 0; Xgroup->deactivate(); Ycc = 0; Yf = 0; Ygroup->deactivate(); } else { Xf = collect_readData(synth, 0, VECTOR::control::Xfeature0, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, BaseChan); Xgroup->activate(); Ycc = collect_readData(synth, 0, VECTOR::control::Ycontroller, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, BaseChan); if (Ycc > 119) { Ycc = 0; Ygroup->deactivate(); } else { Yf = collect_readData(synth, 0, VECTOR::control::Yfeature0, TOPLEVEL::section::vector, UNUSED, UNUSED, UNUSED, BaseChan); Ygroup->activate(); } } Xcontrol->value(Xcc); if (bitTest(Xf,0)) Xfeat1->value(1); else Xfeat1->value(0); if (bitTest(Xf,4)) Xfeat2->value(2); else if (bitTest(Xf,1)) Xfeat2->value(1); else Xfeat2->value(0); if (bitTest(Xf,5)) Xfeat3->value(2); else if (bitTest(Xf,2)) Xfeat3->value(1); else Xfeat3->value(0); if (bitTest(Xf,6)) Xfeat4->value(2); else if (bitTest(Xf,3)) Xfeat4->value(1); else Xfeat4->value(0); Ycontrol->value(Ycc); if (bitTest(Yf,0)) Yfeat1->value(1); else Yfeat1->value(0); if (bitTest(Yf,4)) Yfeat2->value(2); else if (bitTest(Yf,1)) Yfeat2->value(1); else Yfeat2->value(0); if (bitTest(Yf,5)) Yfeat3->value(2); else if (bitTest(Yf,2)) Yfeat3->value(1); else Yfeat3->value(0); if (bitTest(Yf,6)) Yfeat4->value(2); else if (bitTest(Yf,3)) Yfeat4->value(1); else Yfeat4->value(0);} {} } Function {Show(SynthEngine *synth)} {} { code {// int fetchW, fetchH, fetchX, fetchY, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Vector"); vectorwindow->show(); if (fetchW < vecDW || fetchH < vecDH) { fetchW = vecDW; fetchH = vecDH; } checkSane(fetchX, fetchY, fetchW, fetchH, vecDW, vecDH, true); vectorwindow->resize(fetchX, fetchY, fetchW, fetchH); vectorSeen = true; lastvectorW = 0;} {} } Function {vectorRtext()} {} { code {// if (lastvectorW == vectorwindow->w()) return; lastvectorW = vectorwindow->w(); float dW = vectorwindow->w() / vecDW; float dH = vectorwindow->h() / vecDH; float dScale; if (dW < dH) dScale = dW; else dScale = dH; if (dScale < 0.2f) dScale = 0.2f; int size12 = int(dScale * 12); int size16 = int(dScale * 16); setbasechan->labelsize(size12); setbasechan->textsize(size12); options->labelsize(size12); options->textsize(size12); Xgroup->labelsize(size16); Xcontrol->labelsize(size12); Xcontrol->textsize(size12); XinstL->labelsize(size12); XinstR->labelsize(size12); Xfeat->labelsize(size12); Xfeat1->labelsize(size12); Xfeat1->textsize(size12); Xfeat2->labelsize(size12); Xfeat2->textsize(size12); Xfeat3->labelsize(size12); Xfeat3->textsize(size12); Xfeat4->labelsize(size12); Xfeat4->textsize(size12); Ygroup->labelsize(size16); Ycontrol->labelsize(size12); Ycontrol->textsize(size12); YinstU->labelsize(size12); YinstD->labelsize(size12); Yfeat->labelsize(size12); Yfeat1->labelsize(size12); Yfeat1->textsize(size12); Yfeat2->labelsize(size12); Yfeat2->textsize(size12); Yfeat3->labelsize(size12); Yfeat3->textsize(size12); Yfeat4->labelsize(size12); Yfeat4->textsize(size12); Loaded->labelsize(size12); Closevector->labelsize(size12); vectorwindow->redraw();} {} } Function {setInstrumentLabel(int vecPart)} {} { code {// if ((vecPart & 0xf) != BaseChan) return; int engines = findengines(vecPart); int addcol = setcolors(engines & 1); int subcol = setcolors(engines & 2); int padcol = setcolors(engines & 4); if (vecPart == BaseChan) { AddBackL->color(addcol); SubBackL->color(subcol); PadBackL->color(padcol); XinstL->copy_label(findnames(vecPart).c_str()); } else if (vecPart == BaseChan + NUM_MIDI_CHANNELS) { AddBackR->color(addcol); SubBackR->color(subcol); PadBackR->color(padcol); XinstR->copy_label(findnames(vecPart).c_str()); } else if (vecPart == BaseChan + NUM_MIDI_CHANNELS * 2) { AddBackU->color(addcol); SubBackU->color(subcol); PadBackU->color(padcol); YinstU->copy_label(findnames(vecPart).c_str()); } else if (vecPart == BaseChan + NUM_MIDI_CHANNELS * 3) { AddBackD->color(addcol); SubBackD->color(subcol); PadBackD->color(padcol); YinstD->copy_label(findnames(vecPart).c_str()); } vectorwindow->redraw(); Loaded->copy_label(loadlabel[BaseChan].c_str());} {} } Function {setLoadLabelRemote(int chan, string name)} {} { code {// loadlabel[chan] = name; BaseChan = chan; setbasechan->value(BaseChan + 1); updateAll(false);} {} } Function {findnames(int vecPart)} {return_type string } { code {// return textMsgBuffer.fetch(collect_readData(synth, 0, PART::control::instrumentName, vecPart, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, TOPLEVEL::action::lowPrio)); ;} {} } Function {findengines(int vecPart)} {return_type {unsigned int} } { code {// return collect_readData(synth, 0, PART::control::instrumentEngines, vecPart); ;} {} } Function {setcolors(int engine)} {return_type int } { code {// int col; switch(engine) { case 1: col = add_back; break; case 2: col = sub_back; break; case 4: col = pad_back; break; default: col = bank_back_used; break; } return col;} {} } Function {loadVector(string fname)} {} { code {// if (fname.empty()) { fname = setfiler(synth,"", "", false, TOPLEVEL::XML::Vector); if (fname.empty()) return; } string replyMsg = ""; int count = 0; for (int i = BaseChan; i < (BaseChan + NUM_MIDI_PARTS); i += NUM_MIDI_CHANNELS) { if (collect_readData(synth, 0, MAIN::control::partsChanged, TOPLEVEL::section::main, i)) { replyMsg = (replyMsg + " " + to_string(i + 1)); ++ count; } } if (count) { if (count > 1) replyMsg = "Instruments in parts " + replyMsg + " have been edited"; else replyMsg = "Instrument in part " + replyMsg + " has been edited"; replyMsg += ". Overwrite?"; if (synth->getGuiMaster()->query("", "Yes", "No", replyMsg) < 2) return; } send_data(TOPLEVEL::action::muteAndLoop | TOPLEVEL::action::forceUpdate, MAIN::loadNamedVector, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, BaseChan, UNUSED, textMsgBuffer.push(fname));} {} } Function {saveVector()} {} { code {// string filename = setfiler(synth,"", "", true, TOPLEVEL::XML::Vector); if (filename.empty()) return; int pos = loadlabel[BaseChan].find("No Name"); if (pos >=0 && pos < 2) Loaded->copy_label(findLeafName(filename).c_str()); send_data(TOPLEVEL::action::lowPrio, MAIN::saveNamedVector, 0, TOPLEVEL::type::Integer, TOPLEVEL::section::main, UNUSED, UNUSED, BaseChan, UNUSED, textMsgBuffer.push(filename));} {} } Function {clearVector(int BaseC)} {} { code {// int min = 0; int max = NUM_MIDI_CHANNELS; if (BaseC < NUM_MIDI_CHANNELS) { min = BaseC; max = BaseC + 1; } for (int i = min; i < max; ++i) { loadlabel[i] = "No Name " + to_string(i + 1); Loaded->copy_label(loadlabel[i].c_str()); } if (BaseC >= NUM_MIDI_CHANNELS) { BaseChan = 0; setInstrumentLabel(0); setInstrumentLabel(NUM_MIDI_CHANNELS); setInstrumentLabel(NUM_MIDI_CHANNELS * 2); setInstrumentLabel(NUM_MIDI_CHANNELS * 3); } Xcc = 0; Xf = 0; Xgroup->deactivate(); Xcontrol->value(0); Ycc = 0; Yf = 0; Ygroup->deactivate(); Ycontrol->deactivate(); Ycontrol->value(0);} {} } Function {checkParts(int nval)} {} { code {// for (int i = 0; i < NUM_MIDI_CHANNELS; ++i) { if (nval > NUM_MIDI_CHANNELS * 3) Ygroup->activate(); else Ygroup->deactivate(); if (nval > NUM_MIDI_CHANNELS) Xgroup->activate(); else Xgroup->deactivate(); }} {} } Function {errorlabel(string msg)} {} { code {// synth->getGuiMaster()->words->copy_label(msg.c_str()); synth->getGuiMaster()->message->show(); synth->getGuiMaster()->message->position(Fl::event_x_root() + 16, Fl::event_y_root());} {} } decl {SynthEngine *synth;} {private local } decl {BankUI *bankui;} {private local } decl {ParametersUI *paramsui;} {private local } decl {int BaseChan;} {private local } decl {int Xcc;} {private local } decl {unsigned int Xf;} {private local } decl {int Ycc;} {private local } decl {unsigned int Yf;} {private local } decl {float vecDW;} {private local } decl {float vecDH;} {private local } decl {string loadlabel [NUM_MIDI_CHANNELS];} {private local } decl {bool vectorSeen;} {private local } decl {int lastvectorW;} {public local } } yoshimi-2.3.5.1/src/UI/VirKeyboardUI.fl000066400000000000000000000542571506652756400175040ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} comment {VirKeyboard.h} {not_in_source in_header } comment {VirKeyboard.cc} {in_source not_in_header } comment { Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2014-2024, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of original ZynAddSubFX code } {selected in_source in_header } decl {\#include } {public local } decl {\#include } {public local } decl {\#include } {public local } decl {\#include "Misc/Config.h"} {public local } decl {\#include "Misc/SynthEngine.h"} {public local } decl {\#include "Misc/TextMsgBuffer.h" namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); }} {private local } decl {\#include "UI/WidgetPDial.h"} {public local } decl {\#include "UI/WidgetSpinner.h"} {public local } decl {\#include "UI/WidgetMWSlider.h"} {public local } decl {\#include "UI/ScaleTrackedWindow.h"} {public local } decl {const int keyspos[12]={0,-1,1,-2,2,3,-4,4,-5,5,-6,6};} {private local } decl {\#define WHITE_KEY_COLOUR 0xFAF0E600} {public local } decl {\#define WHITE_KEY_PRESSED 0xBEB4AA00} {public local } decl {\#define BLACK_KEY_COLOUR 0x01010100} {public local } decl {\#define BLACK_KEY_PRESSED 0x70807000} {public local } decl {const int keysoct1qwerty[]={'q','2','w','3','e','r','5','t','6','y','7','u','i','9','o','0','p','[','=',']','\\\\',FL_Enter,0};} {private local } decl {const int keysoct2qwerty[]={'z','s','x','d','c','v','g','b','h','n','j','m',',','l','.',';','/',0};} {private local } decl {const int keysoct1dw[]={'\\'','2',',','3','.','p','5','y','6','f','7','g','c','9','r','0','l','/',']','=','\\\\',FL_Enter,0};} {private local } decl {const int keysoct2dw[]={';','o','q','e','j','k','i','x','d','b','h','m','w','n','v','s','z',0};} {private local } decl {const int keysoct1qwertz[]={'q','2','w','3','e','r','5','t','6','z','7','u','i','9','o','0','p',252,'\\'','+','\\\\',FL_Enter,0};} {private local } decl {const int keysoct2qwertz[]={'y','s','x','d','c','v','g','b','h','n','j','m',',','l','.',246,'-',0};} {private local } decl {const int keysoct1azerty[]={'a',233,'z','\\"','e','r','(','t','-','y',232,'u','i',231,'o',224,'p',65106,'=','$',0};} {private local } decl {const int keysoct2azerty[]={'w','s','x','d','c','v','g','b','h','n','j',',',';','l',':','m','!',0};} {private local } decl {const int SIZE_WHITE = 14;} {private local } decl {const int SIZE_BLACK = 8;} {private local } class VirKeys {: {public Fl_Box} } { decl {static const int N_OCT = 6;} {private local } Function {VirKeys(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {} {} } Function {init(SynthEngine *_synth, float &scaledWhite, float &scaledBlack)} {} { code {// synth = _synth; keyWhite = &scaledWhite; keyBlack = &scaledBlack; for (int i = 0; i < N_OCT * 12 + 1; ++i) pressed[i] = 0; pitchWh = 0; midich = 0; midivel = 100; midioct = 2; keyoct1 = 3; keyoct2 = 2; rndvelocity = 0;} {} } Function {draw()} {} { code {// int ox = x(); int oy = y(); int lx = w(); int ly = h() - 1; int i; if (damage() != 1) { fl_color(WHITE_KEY_COLOUR); fl_rectf(ox, oy, lx, ly); fl_color(BLACK_KEY_COLOUR); fl_line(ox, oy, ox + lx, oy); fl_line(ox, oy + ly, ox + lx, oy + ly); for (i = 0; i < N_OCT * 7 + 1; ++i) { fl_line(ox + i * (*keyWhite), oy, ox + i * (*keyWhite), oy + ly); int ik = i % 7; if (ik == 1 || ik == 2 || ik == 4 || ik == 5 || ik == 6) fl_rectf(ox + i * (*keyWhite) - (*keyBlack) / 2, oy, (*keyBlack) + 1, ly * 3 / 5); } } for (i = 0; i < N_OCT * 12; ++i) { int noct = i / 12; int kv = keyspos[i % 12]; if (kv >= 0) { // white keys if (pressed[i] == 0) fl_color(WHITE_KEY_COLOUR); else fl_color(WHITE_KEY_PRESSED); fl_rectf(ox + (kv + 7 * noct) * (*keyWhite) + 3, oy + ly * 3 / 5 + 2, (*keyWhite) - 4, ly * 2 / 5 - 3); } else { // black keys kv = keyspos[(i + 1) % 12]; if (pressed[i] == 0) fl_color(BLACK_KEY_COLOUR); else fl_color(BLACK_KEY_PRESSED); fl_rectf(ox + 1 + (kv + 7 * noct) * (*keyWhite) - (*keyBlack) / 2, oy + 2, (*keyBlack) - 3, ly * 3 / 5 - 5); } }} {} } Function {send_data(int action, int control, float value, int type, int kititem = UNUSED, int engine = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, TOPLEVEL::section::midiIn, kititem, engine);} {} } Function {handle(int event)} {return_type int } { code {// int i; int ly = h(); int x_ = Fl::event_x() - x(); int y_ = Fl::event_y() - y(); if (Fl::event_alt()) { auto key = Fl::event_key(); if (key == 'c') return 0; } if (x_ < 0 && x_ > w() && y_ < 0 && y_>h()) return 0; if (event == FL_PUSH || event == FL_DRAG || event == FL_RELEASE) { int kpos = -1; if (y_ > ly * 3 / 5) { // white keys int pos = x_ / (*keyWhite); if (pos < 0) return 1; for (i = 0; i < 12; ++i) { if (pos % 7 == keyspos[i]) { kpos = pos / 7 * 12 + i; break; } } } else { // black keys int pos = (x_ + (*keyWhite) / 2) / (*keyWhite); if (pos < 0) return 1; for (i = 1; i < 12; ++i) { if (pos % 7 == -keyspos[i]) { kpos = pos / 7 * 12 + i; break; } } } if (Fl::event_shift() == 0 && (event == FL_PUSH || event==FL_DRAG)) presskey(kpos, 1, 1); if (event == FL_PUSH && Fl::event_shift() != 0) { if (pressed[kpos] == 0) presskey(kpos, 0, 1); else releasekey(kpos, 1); } if (event == FL_RELEASE && Fl::event_shift() == 0) relaseallkeys(1); take_focus(); } const int *keysoct1 = keysoct1qwerty; const int *keysoct2 = keysoct2qwerty; if (synth->getRuntime().virKeybLayout == 1) { keysoct1 = keysoct1dw; keysoct2 = keysoct2dw; } else if (synth->getRuntime().virKeybLayout == 2) { keysoct1 = keysoct1qwertz; keysoct2 = keysoct2qwertz; } else if (synth->getRuntime().virKeybLayout == 3) { keysoct1 = keysoct1azerty; keysoct2 = keysoct2azerty; } if (event == FL_KEYDOWN || event == FL_KEYUP) { int key = Fl::event_key(); int kpos = -1; for (i = 0; keysoct1[i] != 0; ++i) if (key == keysoct1[i]) kpos = i + 12 * keyoct1; for (i = 0; keysoct2[i] != 0; ++i) if (key == keysoct2[i]) kpos = i + 12 * keyoct2; if (kpos == -1) return 0; if (event == FL_KEYUP && Fl::event_key(key) == 0 && Fl::get_key(key) != 0) return 0; if (event == FL_KEYDOWN) presskey(kpos, 0, 2); else releasekey(kpos, 2); } return 1;} {} } Function {presskey(int nk,int exclusive,int type)} {} { code {// Exclusive means that multiple keys can be pressed at once // when the user uses the shift key if (nk >= N_OCT * 12) return; if (nk < 0 && exclusive == 0) { relaseallkeys(type); return; } if (nk < 0) return; if (pressed[nk] != 0) return; // the key is already pressed if (exclusive != 0) relaseallkeys(type); pressed[nk] = type; damage(1); float vel = midivel; if (rndvelocity != 0) { vel = midivel * (127.0 - rndvelocity) / 127.0 + synth->numRandom() * rndvelocity; } send_data(0, 0, vel, TOPLEVEL::type::Integer, midich, nk + midioct * 12);} {} } Function {releasekey(int nk,int type)} {} { code {// if (nk < 0 || nk >= N_OCT * 12) return; if (pressed[nk] == 0) return; // the key is not pressed if (type != 0 && pressed[nk] != type) return; pressed[nk] = 0; damage(1); send_data(0, 1, 0, TOPLEVEL::type::Integer, midich, nk + midioct * 12);} {} } Function {relaseallkeys(int type)} {} { code {// for (int i = 0; i < N_OCT * 12; ++i) releasekey(i, type);} {} } decl {int pressed[N_OCT * 12 + 1];} {private local } decl {int pitchWh;} {public local } decl {unsigned char midich;} {public local } decl {unsigned char midivel;} {public local } decl {char midioct, keyoct1, keyoct2;} {public local } decl {unsigned char rndvelocity;} {public local } decl {SynthEngine *synth;} {private local } decl {float *keyWhite;} {private local } decl {float *keyBlack;} {private local } } class VirKeyboard {} { Function {make_window()} {} { Fl_Window virkeyboardwindow { label {Yoshimi Virtual Keyboard} callback {// virtClose->do_callback();} tooltip {+ Shift to hold or release keys} xywh {1092 64 650 130} type Double hide resizable code0 {virtDW = o->w(); virtDH = o->h();} code1 {o->size_range(virtDW, virtDH, 0, 0, 0, 0, 1);} class ScaleTrackedWindow } { Fl_Box virkeys { label Keyboard xywh {32 10 587 80} box FLAT_BOX code0 {o->init(synth, scaledWhite, scaledBlack);} class VirKeys } Fl_Counter key { label {Key } callback {// relaseallkeys(); if (Fl::event_button() == 3) o->value(3); virkeys->keyoct1 = (int)o->value(); virkeys->take_focus();} tooltip {. 2 3 5 6 7 ... q w e r t y u ...} xywh {365 95 45 15} type Simple labelsize 10 align 4 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 10 code0 {o->value(virkeys->keyoct1);} } Fl_Text_Display oct1 { label Oct xywh {407 108 30 0} labelsize 10 textsize 10 } Fl_Counter maps { label {Maps } callback {// relaseallkeys(); if (Fl::event_button() == 3) o->value(2); virkeys->keyoct2=(int) o->value(); virkeys->take_focus();} tooltip {. s d g h j ... z x c v b n m ...} xywh {365 110 45 15} type Simple labelsize 10 align 4 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 10 code0 {o->value(virkeys->keyoct2);} } Fl_Text_Display oct2 { label Oct xywh {407 122 30 0} labelsize 10 textsize 10 } Fl_Value_Slider velocity { label Velocity callback {// if (Fl::event_button() == 3) o->value(100); virkeys->midivel=int(o->value()); o->selection_color(setSlider(o->value(), 100)); virkeys->take_focus();} tooltip Velocity xywh {96 106 110 16} type {Horz Knob} box FLAT_BOX labelsize 10 align 1 minimum 1 maximum 127 step 1 code0 {o->value(virkeys->midivel);} code1 {o->selection_color(setSlider(o->value(), 100));} code3 {o->setValueType(VC_plainValue);o->useCustomTip(true);} class mwheel_slider_rev } Fl_Counter octave { label Octave callback {// relaseallkeys(); if (Fl::event_button() == 3) o->value(2); virkeys->midioct=(int) o->value(); virkeys->take_focus();} tooltip {Midi Octave} xywh {257 106 56 18} type Simple labelsize 10 align 1 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 10 code0 {o->value(virkeys->midioct);} } Fl_Button virtClose { label {&Close} callback {// relaseallkeys(); virkeyboardwindow->hide(); saveWin(synth, virkeyboardwindow->w(), virkeyboardwindow->h(), virkeyboardwindow->x(), virkeyboardwindow->y(), false, "Midi-virtualkeyboard"); virtSeen = false; lastvirtW = 0;} xywh {452 101 55 20} box THIN_UP_BOX color 196 labelsize 12 } Fl_Slider controlslider { callback {// oldcontrol = 127 - o->value(); int ctl = findcontroller(controller->value()); if (Fl::event_button() == 3) { oldcontrol = int(collect_readData(synth, 0, ctl, TOPLEVEL::section::midiIn, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, TOPLEVEL::type::Default)); o->value(127 - oldcontrol); o->damage(); } virkeys->take_focus(); send_data(TOPLEVEL::action::fromMIDI, 2, oldcontrol, TOPLEVEL::type::Integer, virkeys->midich, midictl);} tooltip {Controller value} xywh {628 10 18 112} type {Vert Fill} box ENGRAVED_BOX color 230 selection_color 65 labelsize 8 align 5 maximum 127 step 1 value 64 code0 {o->value(127 - oldcontrol);} code1 {o->setValueType(VC_plainReverse); o->useCustomTip(true);} class mwheel_slider } Fl_Choice controller { label Controller callback {// setpoint2midictl(o->value()); if (midictl != MIDI::CC::null) { int ctl = findcontroller(o->value()); if (ctl != UNUSED) { int value = collect_readData(synth, 0, ctl, virkeys->midich); controlslider->value(127 - value); } } virkeys->take_focus();} xywh {524 105 100 15} down_box BORDER_BOX labelsize 10 align 1 when 6 textfont 1 textsize 10 code0 {o->add("01: Mod. Wheel");o->add("07: Volume");o->add("10: Panning");o->add("11: Expression");o->add("64: Sustain");o->add("65: Portamento");o->add("71: Filter Q");o->add("74: Filter Freq");o->add("75: Bandwidth");o->add("76: FM Gain");o->add("77: Res. c. freq");o->add("78: Res. bw.");} code1 {midictl = MIDI::CC::filterCutoff;o->value(7);} } {} Fl_Dial random { label Vrnd callback {// if (Fl::event_button() == 3) o->value(0); o->selection_color(setKnob(o->value(),0)); virkeys->rndvelocity=(int) o->value();} tooltip {Velocity Randomness} xywh {221 106 20 21} box ROUND_UP_BOX labelsize 10 align 129 maximum 127 step 1 code0 {o->value(virkeys->rndvelocity);} code1 {o->setValueType(VC_percent127);} code2 {o->selection_color(setKnob(o->value(),0));} class WidgetPDial } Fl_Spinner midichannel { label {MIDI Channel} callback {// relaseallkeys(); if (Fl::event_button() == 3) o->value(1); virkeys->midich = lrint(o->value()) - 1; controller->do_callback(); virkeys->take_focus();} xywh {45 106 36 17} labelsize 10 align 1 maximum 16 textsize 10 code0 {o->value(virkeys->midich + 1);} class WidgetSpinner } Fl_Slider pitchwheel { callback {// int old = o->value(); if (Fl::event_button() == 3) { old = 0; o->value(old); o->damage(); } o->selection_color(setSlider(o->value(),0)); virkeys->take_focus(); send_data(0, MIDI::control::controller, -old, TOPLEVEL::type::Integer, virkeys->midich, MIDI::CC::pitchWheelAdjusted);} tooltip {Pitch Wheel} xywh {6 10 18 112} color 65 selection_color 64 labelsize 8 labelcolor 64 align 1 minimum -8192 maximum 8191 step 1 code0 {o->value(virkeys->pitchWh);} code1 {o->setValueType(VC_pitchWheel); o->useCustomTip(true);} code2 {o->selection_color(setSlider(o->value(),0));} class mwheel_slider } } } Function {setpoint2midictl(int setpoint)} {} { code {// switch(setpoint) { case 0: midictl = MIDI::CC::modulation; break; case 1: midictl = MIDI::CC::volume; break; case 2: midictl = MIDI::CC::panning; break; case 3: midictl = MIDI::CC::expression; break; case 4: midictl = MIDI::CC::sustain; break; case 5: midictl = MIDI::CC::portamento; break; case 6: midictl = MIDI::CC::filterQ; break; case 7: midictl = MIDI::CC::filterCutoff; break; case 8: midictl = MIDI::CC::bandwidth; break; case 9: midictl = MIDI::CC::fmamp; break; case 10: midictl = MIDI::CC::resonanceCenter; break; case 11: midictl = MIDI::CC::resonanceBandwidth; break; default: midictl = MIDI::CC::null; break; }} {} } Function {findcontroller(int setpoint)} {return_type int } { code {// int ctl = UNUSED; switch(setpoint) { case 0: ctl = PART::control::midiModWheel; break; case 1: ctl = PART::control::volume; break; case 2: ctl = PART::control::panning; break; case 3: ctl = PART::control::midiExpression; break; case 4: ctl = PART::control::midiSustain; break; case 5: ctl = PART::control::midiPortamento; break; case 6: ctl = PART::control::midiFilterQ; break; case 7: ctl = PART::control::midiFilterCutoff; break; case 8: ctl = PART::control::midiBandwidth; break; case 9: ctl = PART::control::midiFMamp; break; case 10: ctl = PART::control::midiResonanceCenter; break; case 11: ctl = PART::control::midiResonanceBandwidth; break; default: break; } return ctl;} {} } Function {VirKeyboard(SynthEngine *_synth)} {} { code {// synth = _synth; midictl = 75; oldcontrol = 64; make_window(); virkeyboardwindow->copy_label(textMsgBuffer.fetch(collect_readData(synth, textMsgBuffer.push("Virtual Keyboard"), UNUSED, TOPLEVEL::windowTitle)).c_str()); virtSeen = false; lastvirtW = 0;} {} } Function {~VirKeyboard()} {} { code {// if (virtSeen) saveWin(synth, virkeyboardwindow->w(), virkeyboardwindow->h(), virkeyboardwindow->x(), virkeyboardwindow->y(), true, "Midi-virtualkeyboard"); virkeyboardwindow->hide(); delete virkeyboardwindow;} {} } Function {send_data(int action, int control, float value, int type, int kititem = UNUSED, int engine = UNUSED)} {} { code {// type |= TOPLEVEL::type::Write; collect_writeData(synth, value, action, type, control, TOPLEVEL::section::midiIn, kititem, engine);} {} } Function {ShowKbd()} {} { code {// int fetchX, fetchY, fetchW, fetchH, fetchO; loadWin(synth, fetchW, fetchH, fetchX, fetchY, fetchO, "Midi-virtualkeyboard"); if (fetchW < virtDW || fetchH < virtDH) { fetchW = virtDW; fetchH = virtDH; } checkSane(fetchX, fetchY, fetchW, fetchH, virtDW, virtDH); virkeyboardwindow->resize(fetchX, fetchY, fetchW, fetchH); virkeyboardwindow->show(); virtSeen = true; lastvirtW = 0;} {} } Function {Hide()} {open } { code {// virkeyboardwindow->hide();} {} } Function {relaseallkeys()} {} { code {virkeys->relaseallkeys(0);} {} } Function {virtRtext()} {} { code {// if (lastvirtW == virkeyboardwindow->w()) return; lastvirtW = virkeyboardwindow->w(); float dScale = virkeyboardwindow->w() / float(virtDW); scaledWhite = SIZE_WHITE * dScale; scaledBlack = SIZE_BLACK * dScale; int size = int(10 * dScale); int size12 = int(12 * dScale); key->labelsize(size); key->textsize(size); key->damage(); oct1->labelsize(size); maps->labelsize(size); maps->textsize(size); oct2->labelsize(size); velocity->labelsize(size); velocity->textsize(size); octave->labelsize(size); octave->textsize(size); controller->labelsize(size); controller->textsize(size); random->labelsize(size); midichannel->labelsize(size); midichannel->textsize(size); virtClose->labelsize(size12); virkeyboardwindow->redraw();} {} } decl {int midictl;} {private local } decl {int oldcontrol;} {private local } decl {SynthEngine *synth;} {private local } decl {std::string keyboardlabel;} {private local } decl {int virtDW;} {private local } decl {int virtDH;} {private local } decl {int lastvirtW;} {public local } decl {bool virtSeen;} {private local } decl {float scaledWhite;} {private local } decl {float scaledBlack;} {private local } } yoshimi-2.3.5.1/src/UI/WidgetCheckButton.cpp000066400000000000000000000136561506652756400205610ustar00rootroot00000000000000/* Custom Checkbox Copyright 2021-2024 Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derived from (GPL2) fltk 1.3.5 source code. */ #include #include #include "UI/WidgetCheckButton.h" void Fl_Light_Button2::draw() { if (box()) draw_box(this==Fl::pushed() ? fl_down(box()) : box(), color()); Fl_Color col = value() ? (active_r() ? selection_color() : fl_inactive(selection_color())) : color(); int W = labelsize(); int bx = Fl::box_dx(box()); // box frame width int dx = bx + 2; // relative position of check mark etc. int dy = (h() - W) / 2; // neg. offset o.k. for vertical centering int lx = 0; // relative label position (STR #3237) if (down_box()) { // draw other down_box() styles: switch (down_box()) { case FL_DOWN_BOX : case FL_UP_BOX : case _FL_PLASTIC_DOWN_BOX : case _FL_PLASTIC_UP_BOX : // Check box... draw_box(down_box(), x()+dx, y()+dy, W, W, FL_BACKGROUND2_COLOR); if (value()) { if (Fl::is_scheme("gtk+")) { fl_color(FL_SELECTION_COLOR); } else { fl_color(col); } /* The only difference to the fltk original is the checkmark line width calculations, line points, and the fl_begin_line/fl_end_line calls */ int lw = (int)((float)W / 8); lw = lw ? lw : 1; int tx = x() + dx + 3 + (lw / 2); int tw = W - 6 - lw; int d1 = tw/3; int d2 = tw-d1; int ty = y() + dy + (W+d2)/2-d1-2; fl_line_style(FL_JOIN_ROUND | FL_CAP_ROUND, lw); fl_begin_line(); for (int n = 0; n < 3; n++, ty++) { fl_line(tx, ty, tx+d1, ty+d1); fl_line(tx+d1, ty+d1, tx+tw-1, ty+d1-d2+1); } fl_end_line(); fl_line_style(0); } break; case _FL_ROUND_DOWN_BOX : case _FL_ROUND_UP_BOX : // Radio button... draw_box(down_box(), x()+dx, y()+dy, W, W, FL_BACKGROUND2_COLOR); if (value()) { int tW = (W - Fl::box_dw(down_box())) / 2 + 1; if ((W - tW) & 1) tW++; // Make sure difference is even to center int tdx = dx + (W - tW) / 2; int tdy = dy + (W - tW) / 2; if (Fl::is_scheme("gtk+")) { fl_color(FL_SELECTION_COLOR); tW --; fl_pie(x() + tdx - 1, y() + tdy - 1, tW + 3, tW + 3, 0.0, 360.0); fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.2f)); } else fl_color(col); switch (tW) { // Larger circles draw fine... default : fl_pie(x() + tdx, y() + tdy, tW, tW, 0.0, 360.0); break; // Small circles don't draw well on many systems... case 6 : fl_rectf(x() + tdx + 2, y() + tdy, tW - 4, tW); fl_rectf(x() + tdx + 1, y() + tdy + 1, tW - 2, tW - 2); fl_rectf(x() + tdx, y() + tdy + 2, tW, tW - 4); break; case 5 : case 4 : case 3 : fl_rectf(x() + tdx + 1, y() + tdy, tW - 2, tW); fl_rectf(x() + tdx, y() + tdy + 1, tW, tW - 2); break; case 2 : case 1 : fl_rectf(x() + tdx, y() + tdy, tW, tW); break; } if (Fl::is_scheme("gtk+")) { fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.5)); fl_arc(x() + tdx, y() + tdy, tW + 1, tW + 1, 60.0, 180.0); } } break; default : draw_box(down_box(), x()+dx, y()+dy, W, W, col); break; } lx = dx + W + 2; } else { // if down_box() is zero, draw light button style: int hh = h()-2*dy - 2; int ww = W/2+1; int xx = dx; if (w()The destructor deletes the check button. */ Fl_Light_Button2::Fl_Light_Button2(int X, int Y, int W, int H, const char* l) : Fl_Button(X, Y, W, H, l) { type(FL_TOGGLE_BUTTON); selection_color(FL_YELLOW); align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); } Fl_Check_Button2::Fl_Check_Button2(int X, int Y, int W, int H, const char *L) : Fl_Light_Button2(X, Y, W, H, L) { box(FL_NO_BOX); down_box(FL_DOWN_BOX); selection_color(FL_FOREGROUND_COLOR); } yoshimi-2.3.5.1/src/UI/WidgetCheckButton.h000066400000000000000000000026001506652756400202110ustar00rootroot00000000000000/* Custom Checkbox Original ZynAddSubFX author Nasca Octavian Paul Copyright 2021 William Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derived from (GPL2) fltk 1.3.5 source code. */ #ifndef Fl_Light_Button2_H #define Fl_Light_Button2_H #include /** Custom checkbutton, w. dynamically resized check mark */ class Fl_Light_Button2 : public Fl_Button { protected: virtual void draw(); public: virtual int handle(int); Fl_Light_Button2(int x,int y,int w,int h,const char *l = 0); }; class Fl_Check_Button2 : public Fl_Light_Button2 { public: Fl_Check_Button2(int X, int Y, int W, int H, const char *L = 0); }; #endif yoshimi-2.3.5.1/src/UI/WidgetMWSlider.cpp000066400000000000000000000112751506652756400200310ustar00rootroot00000000000000/* WidgetMWSlider.cpp - Mousewheel controllable Fl_Slider widgets Idea developed from ZynAddSubFX Pdial Copyright 2016 Rob Couto & Will Godfrey Copyright 2017 Jesper Lloyd Copyright 2019-2024 Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original */ #include "WidgetMWSlider.h" #include /* Fl_Value_Slider supplying additional mousewheel control with variable precision. */ mwheel_val_slider::mwheel_val_slider(int x, int y, int w, int h, const char *l) : Fl_Value_Slider (x,y,w,h,l) { Fl_Group *save = Fl_Group::current(); dyntip = new DynTooltip(); Fl_Group::current(save); customTip = false; tipText.clear(); reverse = 1; } mwheel_val_slider::~mwheel_val_slider() { delete dyntip; } /* Support for the dynamic tooltip interface */ void mwheel_val_slider::setValueType(ValueType vt) { dyntip->setValueType(vt); } void mwheel_val_slider::setGraphicsType(ValueType vt) { dyntip->setGraphicsType(vt); } void mwheel_val_slider::useCustomTip(bool enabled) { if (!enabled) { dyntip->hide(); } customTip = enabled; if (!tipText.empty()) tooltip(tipText.c_str()); } int mwheel_val_slider::value(double val) { dyntip->setValue(val); dyntip->setOnlyValue(true); return Fl_Valuator::value(val); } double mwheel_val_slider::value() { return Fl_Valuator::value(); } void mwheel_val_slider::tooltip(const char* tip) { if (tip) { tipText = string(tip); dyntip->setTooltipText(tipText); } /* Call base class with empty string to prevent potential parent group tooltip from showing */ if (customTip) { Fl_Widget::tooltip(""); } else { Fl_Widget::tooltip(tip); } } /* Helper function for quick reimplementations under different super class calls */ int mwheel_val_slider::_handle(int res, int event) { switch(event) { case FL_MOUSEWHEEL: { if (!Fl::event_inside(this)) { return 1; } double range = std::abs(maximum() - minimum()); int step_size = (reverse * Fl::event_dy() > 0) ? 1 : -1; if (Fl::event_state(FL_CTRL) != 0) { step_size *= step(); if (range > 2560) // Scale stepping for large ranges step_size *= 10; } else { step_size *= range / 20; } value(clamp(increment(value(), step_size))); do_callback(); res = 1; break; } case FL_PUSH: Fl::belowmouse(this); if (Fl::event_button() == 3) do_callback(); // this causes two calls with other buttons res = 1; break; } if (customTip) { dyntip->setValue(value()); dyntip->tipHandle(event); } return res; } int mwheel_val_slider::handle(int event) { return _handle(Fl_Value_Slider::handle(event), event); } mwheel_val_slider_rev::mwheel_val_slider_rev(int x, int y, int w, int h, const char *l) : mwheel_val_slider (x,y,w,h,l) { reverse = -1; } /* Derived classes - uses standard Fl_Slider drawing and handling */ mwheel_slider::mwheel_slider(int x, int y, int w, int h, const char *l) : mwheel_val_slider (x,y,w,h,l) { reverse = 1; } void mwheel_slider::draw() { /* * Colour control here is a pretty nasty hack but I can't * find any better way to do it :( * Will G. */ /* // Slider peg colour - don't need to hack this bit! // Found it easy enough to do it in the main code. */ unsigned char r,g,b; Fl::get_color(slider_track, r, g, b); Fl::set_color(0, r, g, b); Fl_Slider::draw(); Fl::get_color(gen_text, r, g, b); Fl::set_color(0, r, g, b); } int mwheel_slider::handle(int event) { return _handle(Fl_Slider::handle(event), event); } mwheel_slider_rev::mwheel_slider_rev(int x, int y, int w, int h, const char *l) : mwheel_slider (x,y,w,h,l) { reverse = -1; } yoshimi-2.3.5.1/src/UI/WidgetMWSlider.h000066400000000000000000000043371506652756400174770ustar00rootroot00000000000000/* WidgetMWSlider.h - Mousewheel controllable Fl_Slider widgets Idea developed from ZynAddSubFX Pdial Copyright 2016 Rob Couto & Will Godfrey Copyright 2017 Jesper Lloyd This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original */ #ifndef WidgetMWSlider_h #define WidgetMWSlider_h #include #include "UI/DynamicTooltip.h" class mwheel_val_slider : public Fl_Value_Slider { public: mwheel_val_slider(int x, int y, int w, int h, const char *l=0) ; ~mwheel_val_slider(); void useCustomTip(bool); /* DynTipped methods */ void setValueType(ValueType vt); void setGraphicsType(ValueType vt); /* Overridden widget methods */ int handle(int ev); void tooltip(const char* tip); int value(double); double value(); protected: /* Shared handle behaviour */ int _handle(int result, int event); int reverse; bool customTip; DynTooltip *dyntip; private: string tipText; }; class mwheel_val_slider_rev : public mwheel_val_slider { public: mwheel_val_slider_rev(int x, int y, int w, int h, const char *l=0); }; /* The intuitive inheritance is reversed for convenience, since only the drawing and handling calls differ in the base class. */ class mwheel_slider : public mwheel_val_slider { public: mwheel_slider(int x, int y, int w, int h, const char *l=0); void draw(); int handle(int); }; class mwheel_slider_rev : public mwheel_slider { public: mwheel_slider_rev(int x, int y, int w, int h, const char *l=0); }; #endif yoshimi-2.3.5.1/src/UI/WidgetPDial.cpp000066400000000000000000000204361506652756400173330ustar00rootroot00000000000000/* WidgetPDial.cpp Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2016 Will Godfrey Copyright 2017 Jesper Lloyd Copyright 2020-2025, Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. */ #include "WidgetPDial.h" #include "Misc/NumericFuncs.h" #include #include #include #include #include #include using func::limit; // Prior to fltk 1.4, there was no built in support for handling screen scales. // This may not be the correct way to handle the scale factor. inline float get_scale_factor(Fl_Widget *widget) { #if FL_API_VERSION > 10400 Fl_Window* window = widget->window(); return Fl::screen_scale(window ? window->screen_num() : 0); #else return 1.0f; #endif } WidgetPDial::WidgetPDial(int x,int y, int w, int h, const char *label) : Fl_Dial(x,y,w,h,label) { Fl_Group *save = Fl_Group::current(); dyntip = new DynTooltip(); Fl_Group::current(save); oldvalue = 0.0; } WidgetPDial::~WidgetPDial() { delete dyntip; } void WidgetPDial::setValueType(ValueType type_) { dyntip->setValueType(type_); } void WidgetPDial::setGraphicsType(ValueType type_) { dyntip->setGraphicsType(type_); } void WidgetPDial::tooltip(const char * tip) { if (tip) dyntip->setTooltipText(tip); } /* Override these Fl_Valuator methods to update the tooltip value when the widget value is changed. */ void WidgetPDial::value(double val) { Fl_Valuator::value(val); dyntip->setValue(val); dyntip->setOnlyValue(true); } double WidgetPDial::value() { return Fl_Valuator::value(); } int WidgetPDial::handle(int event) { double dragsize, v, min = minimum(), max = maximum(); int my, mx; int res = 0; switch (event) { case FL_PUSH: case FL_DRAG: // done this way to suppress warnings if (event == FL_PUSH) { Fl::belowmouse(this); /* Ensures other widgets receive FL_RELEASE */ do_callback(); oldvalue = value(); } my = -((Fl::event_y() - y()) * 2 - h()); mx = ((Fl::event_x() - x()) * 2 - w()); my = (my + mx); dragsize = 200.0; if (Fl::event_state(FL_CTRL) != 0) dragsize *= 10; else if (Fl::event_button() == 2) dragsize *= 3; if (Fl::event_button() != 3) { v = oldvalue + my / dragsize * (max - min); v = clamp(v); value(v); value_damage(); if (this->when() != 0) do_callback(); } res = 1; break; case FL_MOUSEWHEEL: if (!Fl::event_inside(this)) { return 1; } my = - Fl::event_dy(); dragsize = 25.0f; if (Fl::event_state(FL_CTRL) != 0) dragsize *= 5; // halved this for better fine resolution value(limit(value() + my / dragsize * (max - min), min, max)); value_damage(); if (this->when() != 0) do_callback(); res = 1; break; case FL_ENTER: res = 1; break; case FL_HIDE: case FL_UNFOCUS: break; case FL_LEAVE: res = 1; break; case FL_RELEASE: if (this->when() == 0) do_callback(); res = 1; break; } dyntip->setValue(value()); dyntip->tipHandle(event); return res; } void WidgetPDial::drawgradient(int cx,int cy,int sx,double m1,double m2) { for (int i = (int)(m1 * sx); i < (int)(m2 * sx); ++i) { double tmp = 1.0 - powf(i * 1.0 / sx, 2.0); pdialcolor(140 + (int) (tmp * 90), 140 + (int)(tmp * 90), 140 + (int)(tmp * 100)); fl_arc(cx + sx / 2 - i / 2, cy + sx / 2 - i / 2, i, i, 0, 360); } } void WidgetPDial::draw() { float scale = get_scale_factor(this); int cx = x() * scale, cy = y() * scale, sx = w() * scale, sy = h() * scale; double d = (sx>sy)?sy:sx; // d = the smallest side -2 double dh = d/2; /* * doing away with the fixed outer band. It's out of place now! * fl_color(170,170,170); * fl_pie(cx - 2, cy - 2, d + 4, d + 4, 0, 360); */ double val = (value() - minimum()) / (maximum() - minimum()); cairo_t *cr; cairo_surface_t* Xsurface = cairo_xlib_surface_create (fl_display, fl_window, fl_visual->visual,Fl_Window::current()->w() * scale, Fl_Window::current()->h() * scale); cr = cairo_create (Xsurface); cairo_translate(cr,cx+dh,cy+dh); //relative lengths of the various parts: double rCint = 10.5/35; double rCout = 13.0/35; double rHand = 8.0/35; double rGear = 15.0/35; unsigned char r,g,b; //drawing base dark circle Fl::get_color(knob_ring, r, g, b); // 51,51,51 if (active_r()) { /* * cairo_pattern_create_rgb(r/255.0,g/255.0,b/255.0); * The above line seems to be wrong and draws black * regardless of the selection. * The line below works. * Will G. */ cairo_set_source_rgb(cr,r/255.0,g/255.0,b/255.0); } else { cairo_set_source_rgb(cr,0.4,0.4,0.4); } cairo_arc(cr,0,0,dh,0,2*PI); cairo_fill(cr); cairo_pattern_t* pat; Fl::get_color(knob_low, r, g, b); float R1 = r/255.0; // 186 float G1 = g/255.0; // 198 float B1 = b/255.0; // 211 Fl::get_color(knob_high, r, g, b); float R2 = r/255.0; // 231 float G2 = g/255.0; // 235 float B2 = b/255.0; // 239 //drawing the inner circle: pat = cairo_pattern_create_linear(0.5*dh,0.5*dh,0,-0.5*dh); cairo_pattern_add_color_stop_rgba (pat, 0, 0.8*R1, 0.8*G1, 0.8*B1, 1); cairo_pattern_add_color_stop_rgba (pat, 1, R2, G2, B2, 1); cairo_set_source (cr, pat); cairo_arc(cr,0,0,d*rCout,0,2*PI); cairo_fill(cr); //drawing the outer circle: pat = cairo_pattern_create_radial(2.0/35*d,6.0/35*d,2.0/35*d,0,0,d*rCint); cairo_pattern_add_color_stop_rgba (pat, 0, R2, G2, B2, 1); cairo_pattern_add_color_stop_rgba (pat, 1, R1, G1, B1, 1); cairo_set_source (cr, pat); cairo_arc(cr,0,0,d*rCint,0,2*PI); cairo_fill(cr); //drawing the "light" circle: int linewidth = int(2.0f * sx / 30); if (linewidth < 2) linewidth = 2; if (active_r()) { Fl::get_color(knob_lit, r, g, b); // 0, 197, 255 cairo_set_source_rgb(cr,r/255.0,g/255.0, b/255.0); //light blue } else { cairo_set_source_rgb(cr,0.6,0.7,0.8); } cairo_set_line_width (cr, linewidth); cairo_new_sub_path(cr); cairo_arc(cr,0,0,d*rGear,0.75*PI,+val*1.5*PI+0.75*PI); cairo_stroke(cr); //drawing the hand: if (active_r()) { if (selection_color() == 8) selection_color(knob_point); Fl::get_color(selection_color(), r, g, b); // 61, 61, 61 cairo_set_source_rgb(cr,r/255.0,g/255.0,b/255.0); } else { cairo_set_source_rgb(cr,111.0/255,111.0/255,111.0/255); } cairo_rotate(cr,val*3/2*PI+0.25*PI); cairo_set_line_width (cr, linewidth); cairo_move_to(cr,0,0); cairo_line_to(cr,0,d*rHand); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); cairo_stroke (cr); //freeing the resources cairo_pattern_destroy(pat); cairo_surface_destroy(Xsurface); cairo_destroy(cr); } inline void WidgetPDial::pdialcolor(int r,int g,int b) { if (active_r()) fl_color(r, g, b); else fl_color(160 - (160 - r) / 3, 160 - (160 - b) / 3, 160 - (160 - b) / 3); } yoshimi-2.3.5.1/src/UI/WidgetPDial.h000066400000000000000000000035211506652756400167740ustar00rootroot00000000000000/* WidgetPDial.h Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2005 Nasca Octavian Paul Copyright 2009-2010, Alan Calvert Copyright 2016 Will Godfrey Copyright 2017 Jesper Lloyd Copyright 2018 Will Godfrey & others This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is a derivative of the ZynAddSubFX original. */ #ifndef WidgetPDial_h #define WidgetPDial_h #include #include #include #include "UI/MiscGui.h" #include "UI/DynamicTooltip.h" /* Dial widget with custom drawing and input handling. Supports dynamic tooltips and adjustable default values. */ class WidgetPDial : public Fl_Dial { public: WidgetPDial(int x,int y, int w, int h, const char *label=0); ~WidgetPDial(); void setValueType(ValueType type_); void setGraphicsType(ValueType type_); void tooltip(const char * c); void value(double v); double value(); int handle(int event); void draw(); private: void drawgradient(int cx,int cy,int sx,double m1,double m2); void pdialcolor(int r,int g,int b); double oldvalue; DynTooltip *dyntip; }; #endif yoshimi-2.3.5.1/src/UI/WidgetSpinner.cpp000066400000000000000000000025321506652756400177550ustar00rootroot00000000000000/* Custom Spinner Copyright 2021 Will Godfrey, Jesper Lloyd Copyright 2024 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derived from (GPL2) fltk 1.3.5 source code. */ #include #include #include "WidgetSpinner.h" WidgetSpinner::WidgetSpinner(int X, int Y, int W, int H, const char *L) : Fl_Spinner(X, Y, W, H, L) { this->up_button_ = (Fl_Repeat_Button*) this->child(1); this->up_button_->label("@+42<"); this->up_button_->labelcolor(64); this->down_button_ = (Fl_Repeat_Button*) this->child(2); this->down_button_->label("@+42>"); this->down_button_->labelcolor(64); } yoshimi-2.3.5.1/src/UI/WidgetSpinner.h000066400000000000000000000033311506652756400174200ustar00rootroot00000000000000/* Custom Checkbox Original ZynAddSubFX author Nasca Octavian Paul Copyright 2021 Will Godfrey, Jesper Lloyd Copyright 2024 Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is derived from (GPL2) fltk 1.3.5 source code. */ #ifndef WidgetSpinner_H #define WidgetSpinner_H #include /** Custom spinner with dynamically sized button labels */ class WidgetSpinner : public Fl_Spinner { protected: Fl_Repeat_Button *up_button_, // Up button *down_button_; // Down button public: WidgetSpinner(int x,int y,int w,int h,const char *l = 0); void labelsize(int size) { float sizeMod = size * 0.7f - 6; // scaling only works if all similar size Fl_Spinner::labelsize(size); this->up_button_->labelsize(sizeMod); this->down_button_->labelsize(sizeMod); // TODO: find out where to move this, putting it in // the constructor does not work. this->box(FL_FLAT_BOX); this->color(FL_BACKGROUND2_COLOR); } }; #endif yoshimi-2.3.5.1/src/globals.h000066400000000000000000000764511506652756400157610ustar00rootroot00000000000000/* globals.h - general static definitions Copyright 2018-2023, Will Godfrey & others Copyright 2024 Kristian Amlie This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. yoshimi 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 (version 2 or later for more details. You should have received a copy of the GNU General Public License along with yoshimi; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef GLOBALS_H #define GLOBALS_H #include #include #include #include using uint = unsigned int; using uchar = unsigned char; using ushort = unsigned short; /* * For test purposes where you want guaranteed identical results, enable the * #define below. * Be aware this does strange things to both subSynth and padSynth as they * actually *require* randomness to produce normal sounds. */ //#define NORANDOM ON // math #define PI 3.1415926536f #define TWOPI 6.28318530718f #define HALFPI 1.57079632679f #define LOG_2 0.693147181f /* * we only use 23 bits as with 24 there is risk of * an overflow when making float/int conversions */ #define Fmul2I 1073741823 #define Cshift2I 23 // many of the following are for convenience and consistency // changing them is likely to have unpredictable consequences // sizes #define COMMAND_SIZE 252 #define MAX_HISTORY 25 #define MAX_PRESETS 128 #define MAX_PRESET_DIRS 128 #define MAX_BANK_ROOT_DIRS 128 #define MAX_BANKS_IN_ROOT 128 #define MAX_INSTRUMENTS_IN_BANK 160 #define MAX_AD_HARMONICS 128 #define MAX_SUB_HARMONICS 64 #define NUM_MIDI_PARTS 64 #define PART_NORMAL 0 #define PART_MONO 1 #define PART_LEGATO 2 #define MIDI_NOT_LEGATO 3 #define MIDI_LEGATO 4 #define NUM_MIDI_CHANNELS 16 #define MIDI_LEARN_BLOCK 400 #define MAX_ENVELOPE_POINTS 40 #define MIN_ENVELOPE_DB -60 #define MAX_RESONANCE_POINTS 256 #define MAX_KEY_SHIFT 36 #define MIN_KEY_SHIFT -36 #define MAX_OCTAVE_SIZE 128 #define A_MIN 30.0f #define A_DEF 440.0f #define A_MAX 1100.0f // There is nothing which technically prevents these from being lower or higher, // but we need to set the limits for the UI somewhere. #define BPM_FALLBACK_MIN 32.0f #define BPM_FALLBACK_MAX 480.0f // The number of discrete steps we use for the LFO BPM frequency. Make sure to // update LFO_BPM_LCM as well, if this is updated. #define LFO_BPM_STEPS 33 // The Least Common Multiple of all the possible LFO fractions. #define LFO_BPM_LCM 720720 #define MIN_OSCIL_SIZE 256 // MAX_AD_HARMONICS * 2 #define MAX_OSCIL_SIZE 16384 #define MIN_BUFFER_SIZE 16 #define MAX_BUFFER_SIZE 8192 #define NO_MSG 255 // these two may become different #define UNUSED 255 // these were previously (pointlessly) user configurable #define NUM_VOICES 8 // Maximum in the UI is 50, but 64 unison size can happen for PWM // modulation. See ADnote.cpp for details. #define MAX_UNISON 64 #define POLYPHONY 60 // per part! #define PART_DEFAULT_LIMIT 20 #define NUM_SYS_EFX 4 #define NUM_INS_EFX 8 #define NUM_PART_EFX 3 #define NUM_KIT_ITEMS 16 #define FADEIN_ADJUSTMENT_SCALE 20 #define MAX_EQ_BANDS 8 // MAX_EQ_BANDS must be less than 20 #define MAX_FILTER_STAGES 5 #define FF_MAX_VOWELS 6 #define FF_MAX_FORMANTS 12 #define FF_MAX_SEQUENCE 8 #define DEFAULT_NAME "Simple Sound" #define UNTITLED "No Title" #define DEFAULT_AUDIO jack_audio #define DEFAULT_MIDI alsa_midi #define FORCED_EXIT 16 namespace _SYS_ { // float to bool done this way to ensure consistency // we are always using positive values inline bool F2B(float value) {return value > 0.5f;} enum mute {Idle, Pending, Fading, Active, Complete, Request, Immediate}; // session types and stages enum type {Normal, Default, JackFirst, JackSecond, StartupFirst, StartupSecond, InProgram, RestoreConf}; // Log types const char LogNormal = 0; const char LogError = 1; const char LogNotSerious = 2; } /* * For many of the following, where they are in groups the * group order must not change, but the actual values can * and new entries can be added between the group ends */ namespace TOPLEVEL // usage TOPLEVEL::section::vector { enum section : uchar { part1 = 0, // nothing must come part64 = 63, // between these two undoMark = 68, // 44 display = 100, // visibility and themes vector = 192, // CO midiLearn = 216, // D8 midiIn, scales = 232, // E8 main = 240, // F0 systemEffects, insertEffects, bank = 244, // F4 config = 248, // F8 guideLocation = 249, message = 250, // FA windowTitle = 252, /* The above is read-only and uses 'value' as the location of the * text ID for TextMsgBuffer. * Control is used as the part number (if it is at part level * Kit is used to identify kit level and/or effect * Engine is used to identify engine or voice if at that level */ instanceID = 254 // This is read-only and has no other parameters }; namespace type { enum { // bits 0, 1 as values Adjust = 0, // return value adjusted within limits Minimum, // 1 return this value Maximum, // 2 return this value Default, // 3 return this value // remaining used bit-wise Limits, // 4 read limits shown above Error = 8, LearnRequest = 16, Learnable = 32, Write = 64, Integer = 128 // false = float }; // copy/paste preset types const int List = Adjust; // fetch all entries of this group, alternatively group type const int Copy = LearnRequest; // from section to file const int Paste = Learnable; // from file to section, alternatively delete entry } namespace action { enum { // bits 0 to 3 toAll = 0, // except MIDI fromMIDI, fromCLI, fromGUI, // space for any other sources noAction = 15, // internal use (also a mask for the above) // remaining used bit-wise forceUpdate = 32, // currently only used by the GUI loop = 64, // internal use lowPrio = 128, muteAndLoop = 192 }; } enum control : uchar { // insert any new entries here /* * the following values must never appear in any other sections * they are all callable from any section */ dataExchange = 250,//FA copyPaste = 251, // FB partBusy, // internally generated - read only unrecognised, textMessage, forceExit }; enum msgResponse : uchar { refreshBankDefaults, cancelBankDefaults, cancelMidiLearn // any other value = no response // but there may still be a message }; // inserts are here as they are split between many // sections but must remain distinct. enum insert : uchar { LFOgroup = 0, filterGroup, envelopeGroup, envelopePointAdd, envelopePointDelete, envelopePointChange, oscillatorGroup, harmonicAmplitude, harmonicPhase, harmonicBandwidth, resonanceGroup, resonanceGraphInsert, systemEffectSend, partEffectSelect, kitGroup, envelopePointChangeDt, envelopePointChangeVal, }; enum insertType : uchar { amplitude = 0, frequency, filter, bandwidth }; enum filter : uchar { Low1 = 0, High1, Low2, High2, Band2, Notch2, Peak2, LowShelf2, HighShelf2 // NOTE: also used to limit valid filter type codes. See AnalogFilter }; enum XML : uchar { // file and history types Instrument = 0, // individual externally sourced Instruments Patch, // full instrument Patch Sets Scale, // complete Microtonal settings State, // entire system State Vector, // per channel Vector settings MLearn, // learned MIDI CC lists Presets, // parts of instruments or effects // not XML but there for consistency PadSample, ScalaTune, ScalaMap, Dir, // for filer, any directory request // only file types from here onwards Config, MasterConfig, Bank, History, PresetDirs, Themes }; } namespace CONFIG // usage CONFIG::control::oscillatorSize { enum control : uchar { enableGUI = 0, showSplash, enableCLI, exposeStatus, // CLI only enableSinglePath, enableAutoInstance, handlePadSynthBuild, // how to build PADSynth wavetable; // 0=legacy/muted, 1=background thread, 2=autoApply enablePartReports, banksChecked, XMLcompressionLevel, // this must be the last entry for base config. defaultStateStart = 16, // must be first entry for state/session data bufferSize, oscillatorSize, reportsDestination, logTextSize, padSynthInterpolation, virtualKeyboardLayout, savedInstrumentFormat, hideNonFatalErrors, logInstrumentLoadTimes, logXMLheaders, saveAllXMLdata, enableHighlight, // start of engine controls jackMidiSource, jackPreferredMidi, jackServer, jackPreferredAudio, jackAutoConnectAudio, alsaMidiSource, alsaPreferredMidi, alsaMidiType, alsaAudioDevice, alsaPreferredAudio, alsaSampleRate, readAudio, readMIDI, // end of engine controls addPresetRootDir, removePresetRootDir, currentPresetRoot, bankRootCC, bankCC, enableProgramChange, extendedProgramChangeCC, ignoreResetAllCCs, logIncomingCCs, showLearnEditor, enableOmni, enableNRPNs, saveCurrentConfig, changeRoot, // dummy command - always save current root changeBank, // dummy command - always save current bank historyLock // these are stored in local/share/Yoshimi/recent // as the first entry of each section }; } namespace BANK // usage BANK::control:: { enum control : uchar { // instrument selection done in 'part' // actual control should probably be here readInstrumentName = 0, // in bank, by ID findInstrumentName, // next in list or '*' if at end renameInstrument, // in bank saveInstrument, // to bank deleteInstrument, // from bank selectFirstInstrumentToSwap, selectSecondInstrumentAndSwap, lastSeenInBank, selectBank = 16, // in root, by ID or read ID + name renameBank, // or read just the name createBank, deleteBank, // not yet (currently done in main) findBankSize, selectFirstBankToSwap, selectSecondBankAndSwap, importBank, // not yet (currently done in main) exportBank, // not yet (currently done in main) selectRoot = 32, // by ID - also reads the current one changeRootId, // change ID of current root addNamedRoot, // link or create if not already there deselectRoot, // remove reference, but don't touch contents isOccupiedRoot, installBanks, refreshDefaults }; } namespace VECTOR // usage VECTOR::control::name { enum control : uchar { undefined = 0, name = 8, Xcontroller = 16, XleftInstrument, XrightInstrument, Xfeature0, // volume Xfeature1, // default panning Xfeature2, // default filter cutoff Xfeature3, // default modulation Ycontroller = 32, YupInstrument, YdownInstrument, Yfeature0, // volume Yfeature1, // default panning Yfeature2, // default filter cutoff Yfeature3, // default modulation erase = 96 }; } namespace MIDILEARN // usage MIDILEARN::control::block { enum control : uchar { block = 0, limit, mute, nrpn, // auto sevenBit, minimum, maximum, ignoreMove, deleteLine, nrpnDetected, showGUI = 14, hideGUI, CCorChannel = 16, // should probably split these findSize = 20, // not used yet sendLearnMessage, // currently GUI only sendRefreshRequest, // currently GUI only reportActivity = 24, clearAll = 96, loadList = 128, loadFromRecent, saveList, cancelLearn, learned }; } namespace MIDI // usage MIDI::control::noteOn { enum control : uchar { noteOn = 0, noteOff, controller, instrument = 7, bankChange = 8 }; // the following are actual MIDI numbers // not to be confused with part controls! enum CC : ushort { bankSelectMSB = 0, modulation, breath, dataMSB = 6, volume, panning = 10, expression, bankSelectLSB = 32, dataLSB = 38, sustain = 64, portamento, legato = 68, filterQ = 71, filterCutoff = 74, bandwidth, fmamp, resonanceCenter, resonanceBandwidth, dataINC = 96, dataDEC, nrpnLSB, nrpnMSB, allSoundOff = 120, resetAllControllers, allNotesOff = 123, omniOff = 124, omniOn = 125, pitchWheelAdjusted = 128, channelPressureAdjusted, keyPressureAdjusted, soloType, // also in MAIN section soloCC, // the following are generated internally for MIDI-learn and // are deliberately well outside the range of normal MIDI pitchWheel = 640, // seen as 128 channelPressure, // 129 keyPressure, // 130 programchange = 999, maxNRPN = 0x7fff, identNRPN = 0x8000, null }; enum SoloType : uchar { Disabled = 0, Row, Column, Loop, TwoWay, Channel }; } namespace SCALES // usage SCALES::control::refFrequency { enum control : uchar { enableMicrotonal = 0, refFrequency, refNote, invertScale, invertedScaleCenter, scaleShift, enableKeyboardMap = 16, lowKey, middleKey, highKey, tuning = 32, clearAll, keyboardMap, keymapSize, importScl = 48, importKbm, exportScl, exportKbm, name = 64, comment }; enum errors : int { outOfRange = -12, badNoteNumber, badMapSize, badOctaveSize, missingEntry, badFile, emptyFile, noFile, badNumbers, badChars, valueTooBig, valueTooSmall, emptyEntry // 0 }; } namespace MAIN // usage MAIN::control::volume { enum control : uchar { mono = 0, volume, partNumber = 14, availableParts, partsChanged, panLawType, detune = 32, keyShift = 35, bpmFallback, reseed = 40, soloType = 48, soloCC, // also in CC section knownCCtest, // not just one number! exportBank = 60, // some of these should be in 'bank' importBank, deleteBank, loadInstrumentFromBank = 76, refreshInstrumentUI, loadInstrumentByName, saveNamedInstrument, loadNamedPatchset, saveNamedPatchset, loadNamedVector = 84, saveNamedVector, loadNamedScale = 88, saveNamedScale, loadNamedState = 90, saveNamedState, readLastSeen, loadFileFromList, defaultPart, defaultInstrument, exportPadSynthSamples, masterReset, masterResetAndMlearn, openManual = 100, startInstance = 104, stopInstance, undo, redo, stopSound = 128, readPartPeak = 200, // now does L/R readMainLRpeak, readMainLRrms, setTestInstrument }; enum panningType : uchar { cut = 0, normal, boost }; } namespace PART // usage PART::control::volume { enum control : uchar { enable = 0, enableAdd, enableSub, enablePad, enableKitLine, kitItemMute, volume = 10, // . | velocitySense, // . | panning, // . | velocityOffset, // . | midiChannel, // . | omni, // . | keyMode, // . | channelATset, // . | keyATset, // . | minNote, // . | maxNote, // . > 20 not stored in instruments. minToLastKey, // . | maxToLastKey, // . | resetMinMaxKey, // . | maxNotes, // . | keyShift, // . | partToSystemEffect1, // . | partToSystemEffect2, // . | partToSystemEffect3, // . | partToSystemEffect4, // . | effectNumber = 40, // portamento, humanise = 50, humanvelocity, drumMode = 57, kitMode, kitEffectNum = 64, effectType, effectDestination, effectBypass, audioDestination = 120, // // start of controllers volumeRange = 128, // start marker (must be first) volumeEnable, panningWidth, modWheelDepth, exponentialModWheel, bandwidthDepth, exponentialBandwidth, expressionEnable, FMamplitudeEnable, sustainPedalEnable, pitchWheelRange, filterQdepth, filterCutoffDepth, breathControlEnable, resonanceCenterFrequencyDepth, resonanceBandwidthDepth, portamentoTime, portamentoTimeStretch, portamentoThreshold, portamentoThresholdType, enableProportionalPortamento, proportionalPortamentoRate, proportionalPortamentoDepth, receivePortamento, // 151 resetAllControllers, // end marker (must be last) // end of controllers // start of midi controls midiModWheel = 192, midiBreath, midiExpression, midiSustain, midiPortamento, midiFilterQ, midiFilterCutoff, midiBandwidth, midiFMamp, midiResonanceCenter, midiResonanceBandwidth, // end of midi controls instrumentEngines = 219, instrumentCopyright, instrumentComments, instrumentName, instrumentType, defaultInstrumentCopyright, // this needs to be split into two for load/save }; enum kitType : uchar { Off = 0, Multi, Single, CrossFade }; enum engine : uchar { addSynth = 0, subSynth, padSynth, // addVoice and addMod must be consecutive addVoice1 = NUM_VOICES, addMod1 = addVoice1 + NUM_VOICES, addVoiceModEnd = addMod1 + NUM_VOICES }; namespace aftertouchType { enum { // all powers of 2 handled bit-wise off = 0, filterCutoff, filterCutoffDown, filterQ = 4, filterQdown = 8, pitchBend = 16, pitchBendDown = 32, volume = 64, modulation = 128 // this MUST be the highest bit }; } namespace envelope { enum groupmode : int { amplitudeLin = 1, amplitudeLog, frequency, filter, bandwidth }; } } namespace ADDSYNTH // usage ADDSYNTH::control::volume { enum control : uchar { volume = 0, velocitySense, panning, enableRandomPan, randomWidth, detuneFrequency = 32, octave = 35, detuneType, // L35 cents, L10 cents, E100 cents, E1200 cents coarseDetune, relativeBandwidth = 39, bandwidthMultiplier, stereo = 112, randomGroup, dePop = 120, punchStrength, punchDuration, punchStretch, punchVelocity }; } namespace ADDVOICE // usage ADDVOICE::control::volume { enum control : uchar { enableVoice = 0, volume, velocitySense, panning, enableRandomPan, randomWidth, invertPhase, enableAmplitudeEnvelope, enableAmplitudeLFO, modulatorType = 16, // Off, Morph, Ring, PM, FM, PWM externalModulator, // -1 local, 'n' voice detuneFrequency = 32, equalTemperVariation, baseFrequencyAs440Hz, octave, detuneType, // Default, L35 cents, L10 cents, E100 cents, E1200 cents coarseDetune, pitchBendAdjustment, pitchBendOffset, enableFrequencyEnvelope = 40, enableFrequencyLFO, unisonFrequencySpread = 48, unisonSpreadCents, unisonPhaseRandomise, unisonStereoSpread, unisonVibratoDepth, unisonVibratoSpeed, unisonSize, unisonPhaseInvert, // None, Random, 50%, 33%, 25%, 20% enableUnison, bypassGlobalFilter = 64, // TODO not seen on return? enableFilter = 68, enableFilterEnvelope = 72, enableFilterLFO, modulatorAmplitude = 80, modulatorVelocitySense, modulatorHFdamping, enableModulatorAmplitudeEnvelope = 88, modulatorDetuneFrequency = 96, modulatorDetuneFromBaseOsc, modulatorFrequencyAs440Hz, modulatorOctave, modulatorDetuneType, // Default, L35 cents, L10 cents, E100 cents, E1200 cents modulatorCoarseDetune, enableModulatorFrequencyEnvelope = 104, modulatorOscillatorPhase = 112, modulatorOscillatorSource, // -1 internal, 'n' external modulator delay = 128, enableResonance = 130, // for this voice voiceOscillatorPhase = 132, externalOscillator, // -1 local, 'n' voice voiceOscillatorSource, // - 1 internal, 'n' external voice soundType // Oscillator, White noise, Pink noise, Spot noise }; } namespace SUBSYNTH // usage SUBSYNTH::control::volume { enum control : uchar { volume = 0, velocitySense, panning, enableRandomPan, randomWidth, bandwidth = 16, bandwidthScale, enableBandwidthEnvelope, enableFrequencyLFO, detuneFrequency = 32, equalTemperVariation, baseFrequencyAs440Hz, octave, detuneType, // L35 cents, L10 cents, E100 cents, E1200 cents coarseDetune, pitchBendAdjustment, pitchBendOffset, enableFrequencyEnvelope = 40, overtoneParameter1 = 48, overtoneParameter2, overtoneForceHarmonics, overtonePosition, // Harmonic, ShiftU, ShiftL, PowerU, PowerL, Sine, Power, Shift enableFilter = 64, filterStages = 80, magType, // Linear, -40dB, -60dB, -80dB, -100dB startPosition, // Zero, Random, Maximum clearHarmonics = 96, stereo = 112 }; } namespace PADSYNTH // usage PADSYNTH::control::volume { enum control : uchar { volume = 0, velocitySense, panning, enableRandomPan, randomWidth, detuneFrequency = 32, equalTemperVariation, baseFrequencyAs440Hz, octave, detuneType, // L35 cents, L10 cents, E100 cents, E1200 cents coarseDetune, pitchBendAdjustment, pitchBendOffset, bandwidth, bandwidthScale, // Normal, Equal Hz, ¼ , ½ , ¾ , 1½ , Double, Inverse ½ spectrumMode, // Bandwidth, Discrete, Continuous xFadeUpdate, // in millisec overtoneParameter1 = 48, overtoneParameter2, overtoneForceHarmonics, overtonePosition, // Harmonic, ShiftU, ShiftL, PowerU, PowerL, Sine, Power, Shift baseWidth = 64, frequencyMultiplier, modulatorStretch, modulatorFrequency, size, baseType, // Gauss, Square, Double Exponential harmonicSidebands, // Full, Upper half, Lower half spectralWidth, spectralAmplitude, amplitudeMultiplier, // Off, Gauss, Sine, Flat amplitudeMode, // Sum, Multiply, Divide 1, Divide 2 autoscale, harmonicBase = 80, // C-2, G-2, C-3, G-3, C-4, G-4, C-5, G-5, G-6 samplesPerOctave, // 0.5, 1, 2, 3, 4, 6, 12 numberOfOctaves, // 1 - 8 sampleSize, // 16k, 32k, 64k, 128k, 256k, 512k, 1M rebuildTrigger = 90, randWalkDetune, // random walk spread, 0 off, 96 is factor 2 randWalkBandwidth, // -> bandwidth randWalkFilterFreq, // -> centerFrequency randWalkProfileWidth, // -> baseWidth randWalkProfileStretch, // -> modulatorStretch applyChanges = 104, stereo = 112, dePop = 120, punchStrength, punchDuration, punchStretch, punchVelocity }; } namespace OSCILLATOR // usage OSCILLATOR::control::phaseRandomness { enum control : uchar { phaseRandomness = 0, magType, // Linear, -40dB, -60dB, -80dB, -100dB harmonicAmplitudeRandomness, harmonicRandomnessType, // None, Power, Sine baseFunctionParameter = 16, baseFunctionType, // Sine, Triangle, Pulse, Saw, Power, Gauss, Diode, AbsSine, // PulseSine, StrchSine, Chirp, AbsStrSine, Chebyshev, Sqr, Spike, Circle baseModulationParameter1 = 18, baseModulationParameter2, baseModulationParameter3, baseModulationType, // None, Rev, Sine, Pow autoClear = 32, // not used useAsBaseFunction, // if 'value' is 1 assume autoclear set waveshapeParameter, waveshapeType, // None, Atan, Asym1, Pow, Sine Qnts, Zigzag, Lmt, LmtU, LmtL, Ilmt, Clip, Asym2, Pow2, Sgm filterParameter1, filterParameter2, filterBeforeWaveshape, filterType, // None, LP, HP1a, HP1b, BP1, BS1, LP2, HP2, BP2, BS2, Cos, Sin, Lsh, Sgm modulationParameter1, modulationParameter2, modulationParameter3, modulationType, // None, Rev, Sine, Pow spectrumAdjustParameter, spectrumAdjustType, // None, Pow, ThrsD, ThrsU harmonicShift = 64, clearHarmonicShift, shiftBeforeWaveshapeAndFilter, adaptiveHarmonicsParameter, adaptiveHarmonicsBase, adaptiveHarmonicsPower, adaptiveHarmonicsType, // Off, On, Square, 2xSub, 2xAdd, 3xSub, 3xAdd, 4xSub, 4xAdd clearHarmonics = 96, convertToSine }; enum wave : uchar { sine = 0, triangle, pulse, saw, power, gauss, diode, absSine, pulseSine, stretchSine, chirp, absStretchSine, chebyshev, square, spike, circle, hyperSec, user = 127 }; } namespace RESONANCE // usage RESONANCE::control::maxDb { enum control : uchar { enableResonance = 0, maxDb, centerFrequency, octaves, randomType = 10, // coarse, medium, fine interpolatePeaks = 20, // smooth, linear protectFundamental, clearGraph = 96, smoothGraph, graphPoint }; } namespace LFOINSERT // usage LFOINSERT::control::speed { enum control : uchar { speed = 0, depth, delay, start, amplitudeRandomness, type, // Sine, Tri, Sqr, R.up, R.dn, E1dn, E2dn continuous, bpm, frequencyRandomness, stretch }; } namespace FILTERINSERT // usage FILTERINSERT::control::centerFrequency { enum control : uchar { centerFrequency = 0, Q, frequencyTracking, velocitySensitivity, velocityCurve, gain, stages, // x1, x2, x3, x4, x5 baseType, // analog, formant, state variable analogType, // LPF1, HPF1, LPF2, HPF2, BPF2, NF2, PkF2, LSh2, HSh2 stateVariableType, // LPF, HPF, BPF, NF frequencyTrackingRange, formantSlowness = 16, formantClearness, formantFrequency, formantQ, formantAmplitude, formantStretch, formantCenter, formantOctave, numberOfFormants = 32, vowelNumber, // local to GUI formantNumber, // local to GUI sequenceSize, sequencePosition, // local to GUI vowelPositionInSequence, negateInput, // bypass LFOs, envelopes etc. }; } namespace ENVELOPEINSERT // usage ENVELOPEINSERT::control::attackLevel { enum control : uchar { attackLevel = 0, attackTime, decayLevel, decayTime, sustainLevel, releaseTime, releaseLevel, stretch, forcedRelease = 16, linearEnvelope, edit = 24, // local to GUI enableFreeMode = 32, points = 34, // local to GUI sustainPoint }; } namespace EFFECT // usage EFFECT::control::level { enum control : uchar { level = 0, // volume, wet/dry, gain for EQ panning, // band for EQ frequency, // time reverb, delay echo, L/R-mix dist, Not EQ sepLRDelay = 7, // Echo preset = 16, // not EQ bpm, bpmStart, changed = 129 // not EQ }; enum sysIns : uchar { toEffect1 = 1, // system only toEffect2, // system only toEffect3, // system only effectNumber, effectType, effectDestination, // insert only effectEnable // system only }; enum type : uchar { // sits above part kits none = NUM_KIT_ITEMS, // must not be moved reverb, echo, chorus, phaser, alienWah, distortion, eq, dynFilter, // any new effects should go here count, // this must be the last type! }; } namespace DISPLAY // usage DISPLAY::control::hide { enum control : char { hide = 0, // current window show, xposition, yposition, width, // if either of these two are set, height, // the other will be scaled accordingly Select, // theme controls from here on Copy, Rename, Delete, Import, Export }; } /* * it is ESSENTIAL that the size is a power of 2 */ union CommandBlock{ struct{ float value; uchar type; uchar source; uchar control; uchar part; uchar kit; uchar engine; uchar insert; uchar parameter; uchar offset; uchar miscmsg; uchar spare1; uchar spare0; } data; char bytes [sizeof(data)]; }; #endif yoshimi-2.3.5.1/src/main.cpp000066400000000000000000000223751506652756400156110ustar00rootroot00000000000000/* main.cpp Copyright 2009-2011, Alan Calvert Copyright 2014-2024, Will Godfrey & others Copyright 2024, Ichthyostega This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. yoshimi 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 yoshimi. If not, see . */ #include #include #include #include #include #include #include #include #include #include "Misc/CmdOptions.h" #include "Misc/SynthEngine.h" #include "MusicIO/MusicClient.h" #include "CLI/CmdInterface.h" #include "Misc/FileMgrFuncs.h" #include "Misc/TestInvoker.h" #ifdef GUI_FLTK #include "MasterUI.h" #include "UI/MiscGui.h" #include "UI/Splash.h" #endif using std::cout; using std::endl; using std::string; using std::this_thread::sleep_for; using std::chrono_literals::operator ""us; using std::chrono_literals::operator ""ms; namespace { // private global implementation state of Yoshimi main bool showSplash = false; bool isSingleMaster = false; //Andrew Deryabin: signal handling moved to main from Config Runtime //It's only suitable for single instance app support static struct sigaction yoshimiSigAction; } void yoshimiSigHandler(int sig) { switch (sig) { case SIGINT: case SIGHUP: case SIGTERM: case SIGQUIT: Config::primary().setInterruptActive(); break; case SIGUSR1: Config::primary().setLadi1Active(); sigaction(SIGUSR1, &yoshimiSigAction, NULL); break; case SIGUSR2: // start next instance if (isSingleMaster) Config::instances().handleNewInstanceSignal(); sigaction(SIGUSR2, &yoshimiSigAction, NULL); break; default: break; } } void setupSignalHandler() { memset(&yoshimiSigAction, 0, sizeof(yoshimiSigAction)); yoshimiSigAction.sa_handler = yoshimiSigHandler; if (sigaction(SIGUSR1, &yoshimiSigAction, NULL)) Config::primary().Log("Setting SIGUSR1 handler failed",_SYS_::LogError); if (sigaction(SIGUSR2, &yoshimiSigAction, NULL)) Config::primary().Log("Setting SIGUSR2 handler failed",_SYS_::LogError); if (sigaction(SIGINT, &yoshimiSigAction, NULL)) Config::primary().Log("Setting SIGINT handler failed",_SYS_::LogError); if (sigaction(SIGHUP, &yoshimiSigAction, NULL)) Config::primary().Log("Setting SIGHUP handler failed",_SYS_::LogError); if (sigaction(SIGTERM, &yoshimiSigAction, NULL)) Config::primary().Log("Setting SIGTERM handler failed",_SYS_::LogError); if (sigaction(SIGQUIT, &yoshimiSigAction, NULL)) Config::primary().Log("Setting SIGQUIT handler failed",_SYS_::LogError); } static void* mainThread(void*) { bool showGUI = Config::primary().showGui; InstanceManager& instanceManager{Config::instances()}; #ifndef GUI_FLTK assert (not showGUI); #else SplashScreen splash; if (showGUI) { if (showSplash) splash.showPopup(); else splash.showIndicator(); Fl::wait(10); // allow to draw the splash } #endif /*GUI_FLTK*/ instanceManager.triggerRestoreInstances(); instanceManager.performWhileActive( [&](SynthEngine& synth) {// Duty-cycle : Event-handling #ifdef GUI_FLTK if (showGUI) {// where all the action is ... MasterUI *guiMaster = synth.getGuiMaster(); assert(guiMaster); if (guiMaster->masterwindow) guiMaster->checkBuffer(); Fl::wait(33333); // process GUI events } else #endif/*GUI_FLTK*/ sleep_for(33333us); });//(End) Duty-cycle : Event-handling if (test::TestInvoker::access().activated) // After launching an automated test, // get out of the way and leave main thread without persisting state... // Test runs single threaded and we do not want to persist test state. return NULL; instanceManager.performShutdownActions(); return NULL; } void* commandThread(void*) { CmdInterface cli; cli.cmdIfaceCommandLoop(); return 0; } string runShellCommand(string command) { string returnLine = ""; file::cmd2string(command, returnLine); return returnLine; } /******************************//** * Run the Yoshimi Application */ int main(int argc, char *argv[]) { /* * The following is a way to quickly identify and read key config startup values * before the synth engine has started, or any of the normal functions have been * identified. The base config file is quite small and is always uncompressed * (regardless of settings) as it is useful to be able to read and/or manually * change settings under fault conditions. */ string Home = getenv("HOME"); string baseConfig = file::loadText(Home + "/.config/yoshimi/yoshimi.config"); if (baseConfig.empty()) { cout << "Missing application start-up configuration." << endl; #ifdef GUI_FLTK showSplash = true; #endif } else { int count = 0; int found = 0; while (!baseConfig.empty() && count < 16 && found < 2) { // no need to count beyond 16 lines! string line = func::nextLine(baseConfig); ++ count; if (line.find("enable_splash") != string::npos) { ++ found; if (line.find("yes") != string::npos) showSplash = true; } if (line.find("enable_single_master") != string::npos) { ++ found; if (line.find("yes") != string::npos) isSingleMaster = true; } } } if (isSingleMaster) { string firstText = runShellCommand("pgrep -o -x yoshimi"); int firstpid = std::stoi(firstText); int firstTime = std::stoi(runShellCommand("ps -o etimes= -p " + firstText)); int secondTime = std::stoi(runShellCommand("ps -o etimes= -p " + std::to_string(getpid()))); if ((firstTime - secondTime) > 0) { kill(firstpid, SIGUSR2); // send message to 1st instance return 0; // exit quietly } } cout << YOSHIMI<< " " << YOSHIMI_VERSION << " is starting...\n" << endl; // guaranteed start message struct termios oldTerm; tcgetattr(0, &oldTerm); bool bExitSuccess = false; bool mainThreadStarted = false; if (not Config::instances().bootPrimary(argc,argv)) { goto bail_out; } if (not Config::is_compatible(Config::primary().loadedConfigVer)) cout << "\nExisting config differs from v" << Config::VER_YOSHI_CURR.maj << "." << Config::VER_YOSHI_CURR.min << "\nCheck settings.\n"<< endl; pthread_t threadMainLoop; pthread_attr_t pthreadAttr; if (pthread_attr_init(&pthreadAttr) == 0) { if (pthread_create(&threadMainLoop, &pthreadAttr, mainThread, nullptr) == 0) mainThreadStarted = true; pthread_attr_destroy(&pthreadAttr); } if (!mainThreadStarted) { cout << "Yoshimi can't start main loop!" << endl; goto bail_out; } setupSignalHandler(); //create command line processing thread pthread_t threadCmd; if (Config::primary().showCli) { if (pthread_attr_init(&pthreadAttr) == 0) { if (pthread_create(&threadCmd, &pthreadAttr, commandThread, nullptr) == 0) { ; } pthread_attr_destroy(&pthreadAttr); } } //Config::primary().Log("test normal msg"); //Config::primary().Log("test not serious",_SYS_::LogNotSerious); //Config::primary().Log("test error msg",_SYS_::LogError); //Config::primary().Log("test not serious error",_SYS_::LogNotSerious | _SYS_::LogError); void *res; pthread_join(threadMainLoop, &res); if (res == (void *)1) { goto bail_out; } Config::instances().disconnectAll(); if (Config::instances().requestedSoundTest()) { pthread_join(threadCmd, &res); Config::instances().launchSoundTest(); } bExitSuccess = true; bail_out: if (Config::primary().showCli) tcsetattr(0, TCSANOW, &oldTerm); if (bExitSuccess) { int exitType = Config::primary().exitType; if (exitType == FORCED_EXIT) cout << "\nExit was forced :(" << endl; else cout << "\nGoodbye - Play again soon?" << endl; exit(exitType); } else { Config::primary().Log("Those evil-natured robots are programmed to destroy us...", _SYS_::LogError); exit(EXIT_FAILURE); } }

peq$.?$adH?NbOX١Y<2dU2Ҹ |oNBwO@LʰDyݹ@h);WAu@T455ǁ]utnUB3XJstYaG;[Z +%x8&͡k Q9%zCZjt #_H~y$_ j~͓||dowR%cc d-aZޏC̎k̤4"2Iv4 'g/E@ Kz|6"Hl|/Mhc@]J5<@ G:i݇NswPS!`BF="ɪ!@/ǟ7f1 ݦ=lb,EɠmPo " [rA?{ 51C%r(|==_JWn𯜇-n=ad$h`H`IxraʰW@Hv>"N0fJ%,|[m(k6۟eR~2m2mߜ'JGG ``%N!g@[C6 z]5OqW,,s[2gQ=z ]IT720YxaćX:.qHaI&r( `y}6۫,yN. !kʹcTȏZwߌj;b : WC5DˋQ"<`!i񰤇dc$/4AZX|cݛ(P4nMX|*; P6jv,?$I~.̂GYRqgwn49|c}:1>:}Zlog~"$wjQ޷ai4IbaŕE?HĒ؛M 3z$F7PG+Xx?Q*IPs䏃6D%-_6NͽD~zD>YJm{{JZVVdasRf~*>zvbowd=1'Ū{>Ҍ(r/+cQGw^@5f,] SU4}2L;t@h17g:7Ha?, 4[Z*-SN:r2I; ldX\*.ZrSwRB1ZYׅG.bF.2͘ʏkX*bzmJB4_rs"Pxc6tEA];Tak:oYqNL*XMe^ujUu%J]5ԕjs 3\ u4j(bî&A}E쾢HBɋ >‡lT)B$Kzv..~ sBzއ7# ԜuGpӎSIzb?k) q\Dqݼ˜v`Z( Eّ jaޣ8XGeaa36]6E%f#D^Yt5b=O˹tDm@ Xy(5{,Z2i"&Jx^yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0082-Sharp and Warm.xiz000066400000000000000000000053451506652756400250410ustar00rootroot00000000000000v6=_ջ+9qzT[nu֖]KN}Ef#*I9~/ .@$#;qOMf?]-[O4?mw_[ԟ?f{?{٧Q?u?\'v7÷r vͿx~e~Ϲ'/ߖ;18i]cs֍Yaj8_OZ_F;+z^9_s=V,7{Nʀx1]EdMCQnVԏ #DbA1l5 xށѳ?Syj.oFXAc^"KT1:6Qx2B9uIHԉ £()&. LC DՓss@=$ qHNwqi{=A?0D `dwU+s{Ws$Mgc| rVoTtNɻC{s۹ :'ȋ>zA^Wġ3l9Ds6]dv-aH&Ԓ<]& MlnGpr Sp1g걺! "DNKIg0iЉcVc@j*PȩG0yբ0s};kLhi~XmKlF2(@g [8[cP K.2HA8!{r _OƗґ[D+aKuqY@J!I83X(2,$6ӫH&Y ,~qIZ9KV:2{)zҶ^Ҷ/%ѣ#v0De@[XơlfJA!.D)d^V͓D8qܿ EUhH'<&׶Y/ԦAFނ L^!8:@J8ntI1,TP=t7,ﻻOz2>Keؿ3ϋ5j]zaU=3ctV7>BڎCB[jRJ*$eI̒n @oXy(Q4wSiRRȉUh1 Bu4$J4 @N>Lr7l+ƍnsHOz8۸iEqOFݸiufW]v{r8܋-"wu=knPoŐ^~3IZXCPݛR$Պ&i$xU$&w|j&#rwY'KUSqW* ^ ^GeRqVij ur`%bx>b,?@3o(aNM<#5,M<4E,3"P)bIͦ%wz"!GxH@J7J@'>>}N_8nִȫ{b.OϡbYyQ2veSؙ< w+c?6M.Ua_i"'PIMmե,ԺT4gKU7#49"Vץ*<=ԺTz3㸚RuPTE[)[y+>rx_*?F?ljyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0083-Sharp and Deep.xiz000066400000000000000000000053451506652756400250110ustar00rootroot00000000000000][w8~=9Mxgg';hjKIN Ix)K&3zj+  D?|ji= t}iѲ7׻?mM/[?_g/7Cq&;7Qooen?qIs/n^KbnovlsۺGk{֍Yॣ`:[m/ɐ nWvOv`yV7r( <2W7"nDW!YӀ^-Xй,= vًȣ)_/cƢ'ۻx$ Ac9>M`mٞcSNITtZpKWYï7gk#U,^J_:D֓=X8XKc#˨kLlߣx|X+Cs/0PSB7MW뜶c\gϖɧTD#xy"&xd4WH =Ru*C"_`qs22Vd6P.\Fh6xֽ=78DH܍ ?I07 qԻ^'t+찀Y4RfY2=wN0a0$Yc?/oX;H־H1M #T6DT̩Cvu WG4a4 ?оϷt@Ϸ>~XA[e3c l_\:Dwl3Q߁"~wrə# lK7h7vu :st.\B)u^aφ[@YS9 Pvp|84x vRPvz4;<ݹ@h ;Gu@t45=A]u Ca)A{]G?wX[@vKȈLCB$9~POuQ;C@G/˽!Y(_ {1<پ.Zv,=%QKqyhٶrvM.;ӂ0I239ٟ'Lh|c>_ΆSusC@{BMMX_d z?mЗv;GNM>#J5,M>4E,2fiXx)baAOSjy_M>no7JNz=d}kzHqGa>7E5V7EMQ}곞:BQh.˭\:]3#\!?.8=hǔ_ŵ7v~IC˥ܚRʛmN4iiO+[>=T}fOwִx˧sbOar\L2"ɠrhge7uhyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0084-Sharp Reed.xiz000066400000000000000000000070361506652756400242700ustar00rootroot00000000000000]MsFWpuٓCbJTkKZIHBB\T C 0@Rr\9š랞ƛ:4ݎN/Iv>ݞ=vzyrjs|7 ܗ5Rս%TS_ ??_]s)ޕ?Hgo//f~%ɤi< iȟ8pf]_ݎoM4 "O~ʳUMzߣ܋py084s˞3y}85!i.b?/``9oOI4ͩ:qtq[G-D)gX7~:]acfrW4~I4|~ՇK'ba=A>M =~hjYZ# y8/X&A)1)oG{Qng waM4"?KS2PMyHhDby5%ո4 8AJY^h"PүVoB?:SU(y):xөUҟkCg~ oW%EuS8IQ3Qt6Ǐ,_?^#gƊT㪮}C,{6$B;Mh~$82!M3}pew ]|}<ۥ_?y$*Y-1L6r?W/ sm4I:/ 'UX!(ed5ḎT5xyhu \cOH^јS[~JW?~8,W^Ԯڐe[{tB!^N^)cLie2>O^7V#?M|ުK.2[( MNj99N\y%+9ڊ̘??.Nج qCȠ8,%\>މ# 4}^ŕa)mʣ}M諺3&::eU)ѺՏ]4p84kL7QCKC10p[9TGӊL5:0L(KlfiHRQk`q-ڗZ9 Nu{yn(YFZ+R|/m4R|i>נzFSwͷ&me;ZKC`-&V\^_XѺ'[!TPMj*)\aV/VR4Y@+qOed,x6X^) 2W5gD)@͡͡͡{C7l=z9Tξ-%*4vX*X+:ϥΕx!6^v(<0 xEW xU<>^Q,(bJ_uW xEW xEW*je3Qm}bXnJEl^Q,^)וC@,`@-`@.X'L|Vvq0~ ȹae0f{ȱ>Ƭ=0 F c{c`03#b1ØG cs1!XEr)XzSmΊetX`tZd: (9!(1)0 F c 1Ø[cp%c9]17= h4EqzS?&']1r@%9kTy<:k,(l@g\vm-4-#F[F'#K[=6|y~2Z?%y]KRDDKT=7Si9^*[3cbjhe)Κ驖+o-)xg~f&W-7k,gCDiSdUŻqўV>Y%4 KZ¹dKԫ7aC-9 3'FO[9J5ͬR u^9zI?$i=xfz1sͼ2Kf%ɊUЀP*ZefI "&HoFi|Y*ƛ&%")!itUlj"d$[ pW)3 {QU3 \z m,-EHFZq+ů//O\ߋm6CЮfC^6׽jE_dHiIg7e)Iv{+ԵlYVмyhOX^JrZ*mSy݌DUEut Ω%mZa %+NI> մaoٲLw4cߥuG!~ozF_֝dnX%G,;qgƝx]lfݷF?kI(g2tʵ\8uqF{٤3kH:T_:-oi kC%ZO+ܚVX6 i -mAKG>$n9?:Rܛ(\•C%mWLuu3|,7o,g#+7]VZz׫z-~WZ]x^kq~Ut8W BիtQ+k%r52)_k|Latv6:-<ƏUyY>ǙD5ny bYU8i!;Vo c%N="ڜd6\#̠Vy*pշ6ظnQJ-6-X+`mkk(w,oS+v3hw 5rߦ 2|G4'x}Eo~MmPsyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0085-Far Reed.xiz000066400000000000000000000072051506652756400237220ustar00rootroot00000000000000]r}W(zRDZ{K]UlIMDB$m}$`E9dK鞾7?}>-8M{?E$OwoήN>_L󿿝y(5?RӽKt$N6щUT||fpj_0ٻW}եo.4%98nf+'߃y<(Ϫf&s8EowЬnk^h< aak<컦v\_]\N)6ݒ-JҌ僴ƞ= .fah *2M^k1 \&WٷF0p1]`ƕ:| ˣYp*e8܋GR읫n^ߜ79egapQyX_=?W۠@);>bmp'}1O= l.[S2fxƤb {Fgr7oL&0I%FPA|jWNԨzK5]jBI:g̵;FPcq$:A1:)wIe\sTQ2m{L=ɣ9EʼnQ2n Ɖ81B=3B3C0#0Jry(č0f$&f*)Aate0JFwaWr30ļRt\b1 w©̆5\ihr֘vhCnF| _%(R%ugg9PzݛE(|M$,ہUFkצCU!*Hx@TOe86 9k6@Qɹ3tQ-*pbCF&!jȪQ˂MxPz%r:G%|Sw3i0mKm* *8P7)#$HAl $W|TIhAzq* 4;-ҝȉ5[eV@@Q)A'H:9z@rlm0އ9XpՑo>g"h 0):E-9V:_>=(*nڂqTIEtrtvw.gqj>ek 1G;T&7 dO|f>gRjh3;ҊHڦEA& isQP HGe.k!Ek?'~I8T ["AgOC98xYMb"%:KF!{kj'|8-&P#"6QvCvS36'o8Ss7\cnE':C2[mff?J"^Ҿ:iiSK4VojQ R^=\m.x5*AAԦ`o f:Mٶe麓䩣Gho2 &kQTlr/$WzBr罐\9/$WV低 W]svzu'sAVXjLζz+ n7Vnꭰ[zvSG'unjSWe1ǪD#5*}N4~B`|~>>+|J: d8j$m!I:=%zSmBgU5zbQu7z/̗F}@+^ڤ]{mR-?4#??qtWXl>1Z^ˇ_=^*~z@TTk ;Pzl cK^9WD Ȃ6_5@H_/toh+:SaSiΊlyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0086-Clarinet.xiz000066400000000000000000000071241506652756400241140ustar00rootroot00000000000000]]WH}ϯ%cI23Y0,f_t-@[X2 ~KX-{m I4jUߺ]wM[" [gDxFww>^ͻ^L&W˛/{;2NI>y >x'cu>NЏZr#󟌎/OGsQ2 & OxՖ?zxy-hf$4)frV3U~ S/LY̓FIX΂(%bc"B^p{g6=B& 1omO&+=8(7mdtu}l8D#-@5m·é/Qp:mOn?.N[Zn+^~,lx9(&} 4 O/&bf;(D<3SUhH6&Y&F cODNrx1&"~Rb@iBRrmhsS9&%v1R۫́'/h#lݸ凧/_m \zd3IȎ/Ro~o mUмg6鲑]Fg//qL} UDj9T:6+Pҙ =$z*43N8\Iu8$w&7R$WK`d$qG^D'JBlsvi+a슬g/dsʺ@67Xl:edٜ?{`Lv=>ekYbCcvvUd]*~|sa]0.^ܣ1Wل$4 c*2a LYƅTd.Ӷ(Ū0u(ٟ e&)A}Ra.@># L s L9vaala*M`2B.0ƞsq}2:#Had0ԽHXt`wrȜ;$l 9\gN8֕nCeB'3 P Smܱ:,i|GP"-;RmosX. c4(EV0 doRBw>wcF]nTaaLX˾lQYXy{q#}aG?6@Xq=cSQHɞ|uc̖wè0Bg FH Bm!8wM *0 @a[,Ω=:%(J%4I4sԵ+ PTI +ҳB-xsƢY٩tU,g3%"<̂8{Ġth}ghq` J[ [@NL 㠚ջP."M,KܿdQ m\5Ga@o ySKK2~ ԾQ Al7SNE5a-l\CҰ@FR]. k1!2 p+AzoE_)mQ9 @E5w (Z 4ƥQKF>4QJEQ[V,pQ@`l(ƥeqO'ͻY54inlـM-dݫޚxd{6Z鬝*i-nWo~b6k*_Z^1is*ڮ;FZaeYDzyqYbpXioΊlك֚*O̟ refbԕ[YR\:\.VU@xɽ_igN3wWQ(gʎ*̧쏪kj`ύ"XR"4d}}hS_YF#i^<6}^ Mۦ:T{")E.ğDi gfiVjt q̗hRg磓ì))TMJ2{6ss[X|T&Wjwgc@SX\쵮|s2ӎFQSgivɸj( JvҮUFu}[Ϋ?q+KK{nse0R5JQnv۲9hXFYNy?˪M:V-$zA^>A]dZe嬆esD3!WKS TuŮ ;ƨ⇟.~0٢F8?*M?+Z6Bqyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0087-Bassoon.xiz000066400000000000000000000071171506652756400237620ustar00rootroot00000000000000]]SH}ϯ%cL1`fnE%lؒǒI{RK>ƐIi2ou}ݯfCH8zi8o;~xGן/>F?o'~?LS~FOB2>oS!օ'˳_x7q74ٟͧal|ً,kSBuD(gYAuH?9ptLth;ÆƱH6U{#5hl޽\S4Q&h>ٿ suPy^,uham.?\9:_94ύPc8 ;\#@kz<ۜ=n[hTu}ϤQs ɷtЊ=.^FT_9z)ZK2wZxcc6.p >ڮv񢹚_^eڈ we\&Ӟ*>VoD|=6'-ioZYj25s|t0:lWh53)5$$S0Y*H,>_ĩ䀼e4I'_j# #?U 8?]W2]J@"ً&ٜf. *έvA~@k\Ta]zGc7c IhT9@v + a*ba*Kj2@Xi[bU:O2 ƾόHD)Va0 l 9R00]0&?!PqcOA8> $]}2@aE$a E,a컋|0ڻ[9adNW[Qq3HTyLa\2! } E[ (~X6X̴Gwtوʨ9,{aQTv1"]{gda) F]nTaaLX˾lQYXy{q#}aG?6@Xq=cSQHɞ|ua̖wè0Bg FH Bm!8wM *0 @a[,Ω=:%(J%4I4sԵ+ PTI +ҳB-xsƢY٩tIb#q$"<̂8{Ġth}ghq` J lN:pbJp)Q;(Ҥqxb?KfE&Us=E_9JriԠ K,٘a@o ySKK2~ ԾQ Al7SNE5a-l\CҰ@FQq\TAbZCI]LUe}@F稂@iU֐F)h_*&Fux.R\Fi6*!8Gn%[}EI4FWŷ?7gi䧹M;f6׷ԋqXvzkv13:ij5Jv4 7_4]yKBdϯON+SvmߑNV7 +0=-$ͫTcշ˥VJ{åtVL_Ef\uTybLN&#/S.0 _.jxlfՑrH¯KJ=sB}rF9+ WvTa>UeT]S{n Ɨ2̥E'ӟ)uDʺ004HŰy5( lZor65:ػ I)bv'< %JN7[7KsT[cDp8<;f=qտNZl"dV3j2Wk;[Z'fu /v$5Mj=KKMgWäEqOT?[vb7 &Zt^\YzXt+AMGI 4ڍ0ji¢2e7\6 dd|ӭœ^EI^> |wxX LP &7S<(,sܤO1X՟fDJ,GAOlO&7`^p'E,H*2 EJ7ۻ$w_Q0C@D l#17Uz0yYpј+X tf'ۏUd*pgǂdV>d&Ž-%D6X*MhK"x"`qLp4Aڷ?п1!p9$X&O#Vm$WqB B UtF.H9t 8 ヿ#$bKSX>+x}Tczfz˛"F Ex;B:(!˙ 4$m)HOVFTHXAbYԺUs \f%/?@O%@: (f u0d2B}O!;gg4s>9&P=[85p v0Y>܇9{PG;*V1*8$EOiƑ3vN-v!# j'$]_VM8bvH&Õ-%$,iK 4hnZ;tzAvQP)4frAɥ]\ú,tVSG(H'ƟM/)g]jzr:ًٵz]Ҷ^]ҶGf$QEa#pKr.eRʶa z:7˃%>-i*1`Bywmkmǔ2|d2ly3*;O殗.L~Kˢ]&>DIAŲ$8Cqڈ C>᯽h8H?Ɉg{yZ6m j39ĈiE%xsgG0vf M|kc&_C[Hr}iZEs߃'Ecg+͓JRޔЊժ7ũ/3\||ѻ\'N.!^2@Im+INPRkESY%im Yk!}?/Zn`]#QLe@V|5eN4_ˀ'؜uwUQ (<2ϫ*Î{%E!mq,gw~4㧩Qoy=muo2\1A˥}jCWYUW`+Е[mJ6t%WJ8U円k5/֌ζ[ F!&Alvo@iw} :_q>=ao d%@l`lϯ v[;tO /+Ͱ{:8W2򏅙bf6_iT=Yi6n.rGeVͺ~lcU-ݤ]dhf;EތpGb]vZ.\j]vZn[*\쯩XתpI挕J4 a2=yoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0089-Daooww.xiz000066400000000000000000000042031506652756400236110ustar00rootroot00000000000000\Qs6~_AyO 0s 4ȵb;mƖ%yeɤyY+Om׹' sLײNjUr/]XxpבE qsG hU<'YYx@}Vf@lTj^ptۙkI=Czk',xV+5v=run{hY - YؖMQ'Ȓ*O#j@_DtL +( oec@:yjYߞ\dbvU0o{I{0 HK]s-)-z=WcO_n**U4`^.B'KIB&X/@< 6'0 qeYbULMmŶ.'!zSxe}KH]ߦq:Ky,UAQ!?:񆘑vY7(c#KcU dβ7 A ٜs{wӟw3ɝC&zzRK8lECq5oיi,l f/QB?>uXե"fMSx ^@39FxKr&.s;Xi x\$p"+89c؜NA4|@wV"V\zW߳Hł#2(Lz>#)IנHFu<eٶ/FGW=uCgȑݱv#xpx$iOMfpQ\6pi9 ͤ,=PF7YE#M4p$ɿy«M򏮗SI*䜢rB;"@ˣњ&G͟9LMx[q@mz:뎌̏8І@~w%4)oD Ż}<bȯI:1ɯ2m 8߭io9U_m=uͻ/t?L@~i\ցZ~ۢ ^=p߰Ǻ}8G>&m9O799ƍשNu]k[^aX=l]jI |oesf7NihzMҎKaPs&!Yt)3] L|9ӭ2TtLñ[Z;x|40!7H SCN…MAAw5 Oma$4իRXa|429r^1>A!kćjaqcxz&O{Z=7pZ=%J/+jy(kZ=^c4zM~+VP^@t#!kJECP\ fX؋n,U\~w'+# iw_ui:G;O/'? ~fGLuSʽwVT i- ڰAyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0090-Yaooww.xiz000066400000000000000000000042171506652756400236330ustar00rootroot00000000000000[ms8_=ya/%\9B{}(nI¿5,+In:]K>]o?<{~k:o wOo9;^mln/z4[0w6?ȞJt,c1qzӠqM7&/&ӫl4ÿ4"alt56Hd3^DxF [!LWpzYV|'(sKqfI'O*&k?hbAG-ƠD|\=+( ?-k@]%r\+ ;K\i1Df|b4Z^ X(ܬ n?/'CcH\f ?ܓu+b6ě8~ OI:#y$bKFc:l\C-2 d.ԹsN<̘jϷ}wQe |xa⸅s;h4k @jhK?yӝ"nde[Rt@*WI ́8)ZV\L|Ͼ.K6DG)4)H:G]Ax[SO_U2&@K}6{(lF&y!kW%%a |8umTp`"Oqp]>A+)# {rI󴈄td<b+alXu/ASTa@ܻ:=&$]_ jB<su%eݮid[x{1Óѥv n!shYBEjr0=Bݠ. ̵Tei64eά'"}^̾뒶꒶>{F=ĺ?>b,B i!;BD(lY`qS*^X9RRT?.H@K[ԌҞWbo7^s9w1|ta2XI:$BO(%YơA,`P L&Yz#!;>Aǵrdi՚ɹ%,!Z7SRQJr.L\mܳyblnZ6N tTZ|0z Ź/309q7w  R.=8V4xVSL{pFd4i1:Γj"Sg騿5 &;:7ZgdVڼE /vM8C6*_V}­d~<穟Qo=rsԣgMݨɂzSMF ӕpVt% V3] LWn5ӕp]t%W3}Z%ia]Ft||t^1!WHSyO )óYژʄ }R1RJ73? BS=>ehVrxsBezKyĨ'KDUO\nQQQАAQ|`c;*ĴRQR$Z&8+dk%U9@߭}QV:5]4$cAߦ'{^ϦgI,ݎu/;q,d= ځnX6J59w朴־TjmYXhg; ;;mf8vƱcիpҮXDìb]vz[׫!i=z5X׫P7jW_inhݹM(Y oI$. =XѡC-ъ v:ߎ sc!6Vnɇ*y ӵOv7{BԋO(HI|7V.~/&~|;YNyl[~i ߂ RM Lx%!HL,yICV+ } T]SPX"? gc@*zs!?EGΘwddꆿ``L0Tם_Bwu>~ 6_ݯw7goEqSW5-q;!;+RbmH+FVF;]4 ɻ/Q-{;a@ꆾ Rom=z6A2'9 sfu 9O8gj@@ɼ8J+V6(3-8 |H>lT^е,4T! p tpE/l I#+cw*g P,Ζ!YdۻU%#24ѤVQ߉Ɇ 7ѪUzVyCIlc )JyxVԨ;ܽyWg&NPSـkӰqѷ{ďϮ|zݷs,0ꥩ\h٭E=mV#H:G&H9@M'xX3Fl\d/)D{GnTPsQE^Oi2Z\$݇ܧ ^ qJH^@3P5UUPX*Jx:Ó. %Z*QlXB;g%,٭ ls09G@xeTXfޥy{bHEFZʆKقA= {[ƮMAHPfjhQbg#O6+{Kl4D;n0IYb1b4:nK:[t=2f:>E{$hshchz\#mXl^um[ն&hk}K `XƧoͱq3!:6fg:6'aFmn[za4>jWDӫ%W[s!m tml5"}.2ޢYBgpq,BE(!􅱀VR{Ѫ椃hcXChsj!9!ms-B۽VXљ ?όA.6whcdz:6A1!ة66Wژ1"hsGuL$iULTtB7T EѣVFQ:{&hcά?6U:Tfu 3޲{ՁtpWJ]ƶ5atyFAgi' ً8Y)[=_ R ,|JH/T$yKk؁tWl+ S{ćC-#>lSdćɺO d"iN>%D|BkSW뫄lH WCˊk*"`[NoR2`r>^8 n>U硉vQ^V%|Ev2k8f b>ò[_x(|O/' +- rX)A<#:8yS YI"GȟMS^D TPQsiڪ]Ul  h0ŕϩ%^N4m-YƦ^)vMRFwBЊr/;WH{#S|q9x[jy $P".mT@jg\2Np$G*`5v_LA3-0"c (k<`)8ƊWcwYq+"q}w`$E;^ƁS{7$P"m|;M/3ſZV-5w *S[lm)>[=:J) J_TNBebZY%> NRt6RUKiYy~tzH#g?Mx94kS?Bފ?VkMA8h>+(qET*7/l^lu_ټ8!{e`͋W6/5XO߹%z-)ޯѰndgX7fg3֍lFv݌u#oƺ:ʝ. >d m!R3qC9]n'ᙱb‡rIcoDҡҺ*NKq8GYe(V1kY4zQg ÈkWݮt +vPJ7tbnFٮt#'+ƔJ7pb"UEٮ Tɳt/;iZq)^QDGTyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0092-Eeoow.xiz000066400000000000000000000054461506652756400234330ustar00rootroot00000000000000\sH_񞀰1vU-ƻ˔[!B35XT)ztok m}2p\caqӧ^-܏Z̷7s؆ʏrvALONA6~NOhi~qmuoo6Onb<_;dA|{?Ώ6Ld{[xQ:gûb42Nk 3VyI%̍:b2׏p~|`X`_JsX\f3g}I^, Iꐣk-*RʫYloG$Zm+Tn SJi1dpLM9U4wmW=J -rV-K2j0R73dS_?3sdCx>W~ Liw-L3v^KI0\ 6$‘1c Up9&1X"I$j쌐]9ܳ-TcVktJf6a4RUZ@ճ)a\d@xa]"{\vD_I=LUĆ.t4V1a*5~V,`R0c~߲.}96@LY֝ $rԺХ1hDes**OA(0<+p\I : k+᧟0gbb`wm9FS, x cK~K(CH b>O݊bdT3rQi8|l.PyRާz SMUqzЬĬ} 63bSc SF1QSP{E9iS^Z=c{IMkb,wESv X(mL ԙw ύeLe H66+MGSZL9`oLJ7MIiR l=J ؘI\.,55+}Y)нo$i icILBh9ԹR+MJ!4 hjV /͡F[=cKY{8όEW {`3c)gƂ- -0عR3&a /D~D H{,Bxd"a9RmBe? X͒ hsY6W#0\),t{BtW{#: =07Q(}j ZYZ1$Aj4m,uhwdL`ulDFEe^!dO +5Jm6emȓ[Śۆs]CIyǺ<< S{'yO)F|Fti#0ɂΡP|Jdf}O kW ڎ=AH4]u-vFypo;nS{?ZOc}+h?ȭtO )FpBGw?h:e 2$m{̲K\&Yf$.hoy @t~J:|B'r>XmuXN܏`Vsoku-`gX #4yi^ܓ { >1}ȊĴ=]/44"l>g)s} 2fGc@-=5oY2ߨvp4MoYy0Hb `2\s>6_faUsm>ԾԚ5ǭYgnVcY~Ebq "02?}!isISȂ(" lq&Mm4'~Se6}noS8S8W]@il;#w@kq1 #;–Wql-9~~C(vy2H(con48dbܰ #621f9o L-5:[@/\|SYE$4 :b.sgh .ԉKmYȣW ?$ nw`X΃ސcʃ&xkϧR>HYqufYz b2m ".Od2}b$Ԏv%E?Oğ[0OG0'ove/4{&J/x6~@]b𼭹C$:GSL+JN&3FY4w I*Rwl:ɁX}-DD(ד,b0mC);IYj-Ax/%=U^3C 1|k䁓p$22qzixq@I;[x v:YܑfꎘvqsUbzD8ʃJ-F5]YEٸ ANyL(oz %{i' J%OyQVLE׌(bYOwhw_M?TlXқXmBeU<Ǧ޻DB=t34c6eٮB%ZAw]ڄ?CGCzX%'yx<HM]ǂ-AA-{*d@m;BFVEA4,ibkLv@vQ"2sIlF/[Wa[P=MWmD3}Ȩ dUބyR0ؓ0rP7(>m-A-9qWX*xelr~0!\UvF6&s&C 6MxsG- 3U&ZyǺv<^_#wՎzmRTj=‚jqTLTXO,Pf4P̀?^+` L -y |2iP܈by7oF]A@bwA _+_, WoO ƴ26oc ۬r` ~Q*kO:}&+ wS=_8:xol^R/oPc-_;&Ծ͞j)\ 7>95?}Y˚=y]CR+oNw ,K&ZKrL]$=JTܺqH%|Vvu] պj]wS{5.L`kp/bJj{I92(<\_.g 09DI5Mt+8Ua 0g;y.>)/$j:blxa+:mlDZh׍lj];:lc8ɨF7c6TщJw~ӌ"cLqi=.>$`e '_{U(Wu.|,бI||ZX5s=ӱzٺcy~z}ԩxᷫ]dpϑA} Mт~u\`ZOZL;ly'v+4Hڤv펮: Gt0_KDZj6]]-5Q+\_'aoxHYh}>y{F2+ yMm]D,{f6hfB-H<v!dGB͒z8JNd Ix4HM.cA 9A۲SU,(&{L uDY=iX~*xggk!gZ˔y)fT*mtN9Ha4? TP-$% %5BQij h RČR1B͙"zLKR5҇4$iIhqzM[Y^wߎD iQ8&UKEGci#5,,+HNω !b-sTm^N9.pQD:"ʖ*-MtnT*((/fF]'(CK)+vD3S\NB]S68.褒ilCvum|l.#iա6災!}#":4r =R>I~X>aw0gN}RHyU'':F!G1̫pYUXUZEElLbZuvfZG.Pm\_ҪiUU*yGjMs'JUZ͛9Q*ڞYUՑRtSGznW'JO?QO#4ZˉR(+DC_Rw es7v|$zݒ'y3Ye"z/i|wɑɺ9sR Xn9֥p]u)̗cK;re,kxS^W4H-R{E`$=]h__/Al!tYB%,B6%Hࣛy4B#(N_΀bVtWُCI,_Qg;:dTbb#1oVl5J~Od\CJ N`hvG~sM6'Ph߁U[?v) 3FI%yn^,, p vlӜݱVc'=+x7wj;ˀ?r :tHHD K ۉqpxiI 9,vwP8w;y_n=flQ~Jt(qD"yV}׽ZDcs4tYHx![` a+Z뫀}/lf+c@`Kq@bk偖<^}K\m=(l!#I묇9( =|w=Po{y(dzqVLV1y`wgg͘=04l5@-:yܑ!H;R8L6dO~P@#Ѿ<t#@˓RU(o𓚡uvnBSZw| Z4|YJUS!1^xU/sWӋEɖgK)y 1|0Wz%[I:lr5_(B3't's5p4?%o) P{8>߹"Y^ Hjr](Pr]V^ԳuOُ \ԔV%-_]cP+$'\&ҏ q g-<{j_޴_ӧr1FEu/5[*,4ضS#d䍈'W4.-'z"*k2eoK.Y鎑jMY7a#p\eRh"(g^ʎ:@{Yi ҈A6B~CdTlgJ ݥ.Ln!EQO89ȢX$:)Vn6\[3OiZo mk37wƸۢY[.og59U=aSZCjי[k?Ϭى7rwOhjB4Z.nț[]rj$@xm54qfI?X,u⡏wp Vdwj+J`Y ީ}הV:/R<Jॕ@I^65@Rm*\ 5+*lΦhJGRgM%2yxZU)TwM @Ah*Jw'TpJ;sbMzM )h ^}K`?Gvg!Z^-0~Ŗ@B!0; ?{ xN ?Ǫ;&7*Ue煪T/T] R Tn=յp]Ou-S=NTN5\R(B`[oiaHZGI^W<܌yPMv tp*6Ya*|X/?[Wy"Չoy>79{d4p3 ֯qa``4 gP 6$cTrXPU`69CX]^%mz 2GƫUx\ܽ1GOv`W@wxq}+-/MsV-ci/jqFyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0096-Power Guitar 1.xiz000066400000000000000000000041501506652756400250010ustar00rootroot00000000000000\Ys6~ϯ`'GQ-)Qk &! E<w!@c)  o>||XƆ{-A<˷u>^Kor:lmϓG61V;Zo~B[_ވL8WG6&V7)N٨N]krٚv{֋W( a72@ܖyhڝuGE6O1Ak֎ G$4$~wbd8LċEY.%^7%a VQK=To߱_/VU5Q`6?`(L ƧĉAvJRMM޺q]o/C}izc|1 ?4\TQGBgClck޼_#C 1$3_v֊r6josV _2]擲l4\Gc_Q_/x7+ZQHq.$Ćюm "!6DStž 5RŹUv{=4:^|VV1xpq+ B挝y9ũo?I y#H]+&gZmǛ]Τ 6f0ߞ_\+16qW0y`%ZIsw#)+׉mgO I&M\\\꣄GA^u-XD*gײ*&qqw?7/ |F(}JW{Ic .3eܡKR DѩNfuP7MjdC2GcM5EE]KR`x-QY(HM5j<Ɣk {?HRW\(UߑԽ6{RFq;Xdlʅ2-?{{rV{jIT.,9/ %dNҶ3fTY9m֟OU)y%| ASU+Iq!|{ka,yYoԒhd;1{+ ĕRе+I LF/ezx#4y{Z;=:i Ǖ7+ 9")e#Q>>6;QvCreʪʔU37E+,AD| eD{LƩ~ Rt-?Ӽu-']w뉮DzS=/'^hȘ1_0 H#|~ɶŅ7‡`п^л]G~8%鶡R=ꥡTk'\c0MK< j2wӌwnuh2W D3?-]eNwT:-im-yɽgѣr8,wf*FK1=)UCyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0097-Power Guitar 2.xiz000066400000000000000000000041621506652756400250060ustar00rootroot00000000000000\Ks6WʴcٞQ-)Qk=*i &!D$X )ѶZg$v?9zi4$Ͻn4 Z׍YO˸kq۶=zۘb-)w_6ǍL8 yC #ⵃ]cedОGCyK+r;ƥ Ć20@ܔymOhܞYw2%V A$K 99B9nHhE\-܄|N,aw!@( (XE!, OПmz[{EzMUUt6t&% 3Hf}'1r(}3&&o,GϞdsq|g|6N /0VLaCgMlcx+M)1~#7!vdJLҵl~ٜ"&q/mp.IY6Ϻñ'sM\z,F(^^8UD5!xod)H <(Fb!CTqnpNM gE@L>LG?[B=L%Ǻ]7#i)&KrBBHtRL1atųn).F%T\DڙLtc}թ09 Z{EB4˹,Mpg9k4f/SW,w&(\` P'WI˻ēwS-8  AE) }@4mܥY\OP2n1cfd>Ke.qLNr6) (YGQJSpT{4͓dO`4߲S}Lp pgf*mH4qSJp֌QY8q5Hh iK}7 Z*, Rț RˢI) t#mUӢuPԝ: +jC[Wy;q<7g.T#Y Vtw=Jx)q۾CS^i]4Jf]DWj+u5ѕ|*TMD/:3<`@H! ދm s^{;cqL$5uC孺w[CMI eҩ{r۳K\/QI—;,֡K]I×>n/| w:yQv&(^]o K~y&uɭo[zCTZGsACyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0098-Wet Brass.xiz000066400000000000000000000042211506652756400241430ustar00rootroot00000000000000\s8_LMHr@z{[`s$l\;?%W+݇墶aoEx{<טc<\'Gg߼jx9r׫u5^O>h@]QhIEYOl?iDsylct9& ̀nlzQI;;{ۛFcx^͡KvQ_G-nJOV#zɜ`aa39Z))eGk@3,,sqm y# `<H4X j=4Yh3 'ךylMsYsڂlKg^ + {n}.͹t-18Q"#tIһE{!#sa.,s˵ϙh9&f,@b/JrY!6R'9L`4;ic=r4 Wymh$SL~GQ)h: Daۻ*372A.P! a ״-}cIWkǜ"syCVBSjTe8F[m:t]dQBýB8 s6dY $p7 M5-=PFNVH'6*3$TlIJGFoڧKE'˃q;q$-g} Xu,h 9x;\T*L2 )uRl%pW3F+jd(˨RQkFNdnʑJvU$Irl%ˍz; 4L*/yaWgPY;! 4QRh?fCȈ厈|cO=RcOQk&2mOהZ.<GnQ%-0f,$۱)"!, `(&g!tYa =:p|ٿQ6/C#3h'c6LWxTlH*-tܓ#'Q_8ZAΏƝbdYMUʼy+N7su$aJ)|49rUqP0fh`uޫWh(2B4ʠw yW+3![ߙA_ܞNrQ|1jU`DA*Ŵ$ 9?1X VNwGAĿd#j'jѳtɹs=yF7 ~1S,_eKdpH !J%m[;y-LPKv?J 7͖fDV f3\cò*JNkZiC hګe_ywu.Ic 5 'N* G+T88R/*_` Tg T8@Q JS+3;N`qZNK+M2*Pʎ*T0nh.V0:Q~p.F O*4_{_OQn=3]wk惞59 l'{@V>Hj=o󆷟7=ZO=^QYrw9_sD ȺSH),Ǻc]ʯ˱.X r_5l_>ѱr~4^0" I1@_SKz׽ Å !WnkF!*wT1u+ ]F.K7oknqqьKi1 ;3 βK%Ρwڋ(*o*w +urWDyoshimi-2.3.5.1/banks/Will_Godfrey_Collection/0099-Wet Brass 2.xiz000066400000000000000000000043741506652756400242770ustar00rootroot00000000000000\s8_rO9!_3M:4!S]E"q 6g ˖䕍MȵYVkyi6-8{Vo?טky>W{'wor9^-ڳiHތ~z.8.ҮslD5t>r> ,ZX!]:ԭŴWMgk ΨKn;Mwɜ5Y}F̱VC x<_8!d|A/f 7 V "l2a2G40e~F'b dw@m;X#Yz~U?n,r{A&V?Oksw5f\A= ]"%F||oߴ՜%McxSߘu7MG\z?evW gbpΎUE0ر/lL)xJl-)`MBOa}H;d?\Ue3D`2ї|UD=uj#DdSr*q1[#-2!||M:ʎF"",$#?"U =R湎E|eA@|o1W7'#^n؜'>cf%{wXh#&X!u܄-~MIϷM|6eFr &+A;S2#]:T=@20qi N<42h,^'h AH=n2aNm!? &>xD H)| c,NX@~FMi2=T a熐,Ć?@_?OYi…D)ˣ~H3]:uc+.V\2S@6G|FP-a~hϊ݆ QèfH8z=u7!DIRJ9$ܲRO #r;ҹiJD?E RaȤw>ސ^Sj5ȋs= ,Gb=dlf#]&fQ0qTH&j fO[`tѻ u L (0kd*LP`[LYF>hV[nlG;@HHM)֫S+]2eP2F1ͼ "4̓6qPX.PىR9zT.W)7 &T+uҢ7u^L2]O'jp`:1a9tug2GeE&&:.WiǸ/ [8^yh $̈CZ fD7|w# el26BaPNcQFy NW28+sR8Ǚ9 5 T;5\l`@X  pI|/6T0@}eCy5  T3*^6G0@iS m@xݽei N:P@Y`#3.ʼ'T]XUn{p{vQ즍/tT $^v?_s]{- :=G=?8H3Z Evt4a[[7yÏ(&hۜ"B[.r%"fK֥쳜Kn9֥R6_Iw*X-&{9/r~Al'/ʃUb̻CFXD!]A ^aRJQ ׁ :bN6+ZiHjIK)8H%F ]VRa:ź`*bZŶܷ^ $9ߤ:L{Sd?~D̏lNk|/p>M%6?n Pܚ)U*?6WvΣ3d;Z|" P`D%Y-4<>nfhHW%Њ~~8C$:?8F'%7#McɜǗ7V?ʾ-; p8v҅'W x<0^= P`GGgz/qB*2Q/EͩDԧ$f&Pَ*}/?AoD2r\[ Vo_90q15~+X7J=()o>Ƛ0[.<]6z@Q3g\^Vzx\t"kN1') y$@lTlG5ߌx?~#C.Mx yH:RI$wQHw!=CrlCE*@C}2tpPkuO8DC/څkCfq8qD(>qq Sn:@U-@ SsH#Cٖ4P=0Ӧ$GCgh?N}%U7<0AoAK'r"_jARy%j$JH2wߝ) .5!v:MNVazq:}B(xK"q`[ K$N=0Ƥ,Ųf9x^ %n;rkXTQnP2B OoO/.tyY+}TXob_N, 5֑eH;JCy{];@[6saeF/ԍW,gH1CbXwC CnP+p((3&9+PJєRiޤNs}X cSj* ?Spo =bagE18%#)1Ae|šGEeqvtrqnBvDB,\𨱹[=uKlʡR&+[IPZi,x;5ZfP#@~`[\xe!̼л|Bd&zD4sT2b;`ŒQ@;,nfЁwx=y6%_o=3gC~1z!O X/b}_3^G~G(ojK~d]:ɗ.D~O}r`} %I"!)R cB@,l{jNE.Ne{Û=-o*rbqBͱs )JzG Fn6% {Ue/~w/Y,)tp 'TC% !jgI)˒.MfN,@=KXK§#[p "i޺.m}gQC9\KS]Cm؇K1RSH!)}^/ȇ."d)Nmux^#CanWUs=DlW=zD˦^"g%lCMev[TmH+Vo"c\5M'PZGhmkZ1SηE#tޚ4hUCc !7֭OmG:mc{pVRKe Dq|d<%uX8#irܽ-"24tfZMQ6۬Hy㷅3C^ 6/',TbA8cM!jT VS։< !b-ܰ=)ufOF󈢯dSN]_OM֑ Qƴ XD[6gh%h0~jz ^hNYsӄ(@ ^ Q0LKczۻ*7ؖ\ij(inQ➶-{- y7ͶE]P鿧n6ؼ'6cߓxk8L:P}6Z[Jw;LMo`9)v'D9zd1R SbzWc)!KQ Q-U5 F(PĪ8=QA׸.z&ί?7w#@y}G9בN4Hb.q"uwodYAUdxwQ$O4uiIQZb׸ƵQ׆vZ"v`VkʐëI3~Z1,]8Pl>$C˿[lMμsc)'&iD$UJ0BAUo6|'b|m(MŽvԡj}95x)`OJ[2ʆ= U; n`:njRV[#݂-D;*yFPrnDF n}8ZTJvVH]̣$jl*.D)m@8YQO+b7DwwDjcU.2VRVx)$x:7W?7%g7a`˜< 7fb~On>}K $NWmaf~#*{lX Ay>.YԴ; $hrqRToFzQ𶿓ڑk cvU?+10W\lIu~Hbj4qqekZ<(OO7?j S"$斫7O1ʬ6' FCDry $ʞ<*=И8_Ɠ&.;rY$lTM*RЃ%q4~$8LS~, A0~I/[1@22( i_"[x".YL[Ok Ti,i4pIp jQS]mZݽ&ڎ=x5|}O߯ߝW Ɖ?_̜c&5ȿv|d@t/2o ϐ>])\ce6F(Ki'$u1>B+8N8#fY,rv572ĝs$i5Jj,~W4zKSHNL]ӭ e&u$7ۺElHb@2kJ=p7 }Zqmޞ6W/bC2h2z`gޱɌSǃUݨMEV,$"^n5VoEK̽dh+Oˊ`. PS;]VԤG+IrHhS"AWTLjt}1>tÄQ%0bh$#/wrę?]ѩn{,4x6)wtU+./7ǡ{eBA@2LuJolJn@;܀vwڽ hmH*N;/iwЊ 2T:*@KX;vbrۉv9f;]C!V4)y +(xb0c 9i]aN v!cs+HXy \vxar Zr2l r2[϶ Nm vp"uU3g0na 9bzfyEF\{%I#.B2@m0Vdg"q #?en"ϛz5Ola5j{a™h'hC`F[C n7{HMέ*և'"kgrXY=<9I*&z kى9f!3PhrB anagW9Hxb0v*.Ɉ08bwMffng^N:uk=VհRT5u - P*CۧQS*K_\Wd^un3n)Xa翴gSy;A,%w\RyC4e&Br?ɳ6LҬ.4 灨74bkL[jХf>k*K"?*e> y kY}ib>I$ҷ~Y,銾LvQ&op3ͪ\DM.o_jN/HS2X%."Q M2Nd~^7&mUgSMKGqEVi7[XNnCRc}[-)痵+t"hzqbzO>E,vA'qtHp-)tƅjJdk\D&NMd ^ӡ'4i4ʏ 2Vs4rC~a3W}`^B%ՖaNə